@oh-my-pi/pi-coding-agent 15.5.13 → 15.6.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 (192) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/dist/types/cli/classify-install-target.d.ts +0 -10
  3. package/dist/types/cli/initial-message.d.ts +1 -1
  4. package/dist/types/cli/tiny-models-cli.d.ts +9 -0
  5. package/dist/types/commands/tiny-models.d.ts +22 -0
  6. package/dist/types/commit/analysis/conventional.d.ts +1 -1
  7. package/dist/types/commit/analysis/summary.d.ts +1 -1
  8. package/dist/types/commit/changelog/generate.d.ts +1 -1
  9. package/dist/types/commit/changelog/index.d.ts +2 -2
  10. package/dist/types/commit/map-reduce/map-phase.d.ts +1 -1
  11. package/dist/types/commit/map-reduce/reduce-phase.d.ts +1 -1
  12. package/dist/types/config/model-id-affixes.d.ts +10 -0
  13. package/dist/types/config/model-registry.d.ts +1 -1
  14. package/dist/types/config/models-config-schema.d.ts +2 -0
  15. package/dist/types/config/settings-schema.d.ts +233 -17
  16. package/dist/types/discovery/helpers.d.ts +1 -1
  17. package/dist/types/discovery/substitute-plugin-root.d.ts +0 -4
  18. package/dist/types/eval/__tests__/llm-bridge.test.d.ts +1 -0
  19. package/dist/types/eval/js/shared/rewrite-imports.d.ts +16 -1
  20. package/dist/types/eval/llm-bridge.d.ts +25 -0
  21. package/dist/types/export/html/template.generated.d.ts +1 -1
  22. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +15 -0
  23. package/dist/types/internal-urls/agent-protocol.d.ts +2 -1
  24. package/dist/types/internal-urls/artifact-protocol.d.ts +2 -1
  25. package/dist/types/internal-urls/local-protocol.d.ts +2 -1
  26. package/dist/types/internal-urls/memory-protocol.d.ts +2 -1
  27. package/dist/types/internal-urls/omp-protocol.d.ts +2 -1
  28. package/dist/types/internal-urls/router.d.ts +8 -1
  29. package/dist/types/internal-urls/rule-protocol.d.ts +2 -1
  30. package/dist/types/internal-urls/skill-protocol.d.ts +2 -1
  31. package/dist/types/internal-urls/types.d.ts +26 -0
  32. package/dist/types/memory-backend/index.d.ts +1 -0
  33. package/dist/types/memory-backend/resolve.d.ts +2 -1
  34. package/dist/types/memory-backend/types.d.ts +7 -1
  35. package/dist/types/mnemosyne/backend.d.ts +4 -0
  36. package/dist/types/mnemosyne/config.d.ts +29 -0
  37. package/dist/types/mnemosyne/index.d.ts +3 -0
  38. package/dist/types/mnemosyne/state.d.ts +72 -0
  39. package/dist/types/modes/components/custom-editor.d.ts +2 -3
  40. package/dist/types/modes/components/hook-selector.d.ts +27 -0
  41. package/dist/types/modes/components/index.d.ts +1 -0
  42. package/dist/types/modes/components/status-line/context-thresholds.d.ts +6 -0
  43. package/dist/types/modes/components/tiny-title-download-progress.d.ts +11 -0
  44. package/dist/types/modes/components/welcome.d.ts +1 -0
  45. package/dist/types/modes/controllers/extension-ui-controller.d.ts +4 -1
  46. package/dist/types/modes/gradient-highlight.d.ts +23 -0
  47. package/dist/types/modes/interactive-mode.d.ts +4 -2
  48. package/dist/types/modes/internal-url-autocomplete.d.ts +43 -0
  49. package/dist/types/modes/orchestrate.d.ts +10 -0
  50. package/dist/types/modes/theme/defaults/index.d.ts +8406 -8406
  51. package/dist/types/modes/theme/theme.d.ts +2 -1
  52. package/dist/types/modes/ultrathink.d.ts +3 -3
  53. package/dist/types/modes/utils/keybinding-matchers.d.ts +5 -0
  54. package/dist/types/sdk.d.ts +3 -0
  55. package/dist/types/session/agent-session.d.ts +35 -0
  56. package/dist/types/system-prompt.d.ts +2 -0
  57. package/dist/types/task/executor.d.ts +2 -0
  58. package/dist/types/task/render.d.ts +5 -1
  59. package/dist/types/tiny/models.d.ts +185 -0
  60. package/dist/types/tiny/text.d.ts +4 -0
  61. package/dist/types/tiny/title-client.d.ts +24 -0
  62. package/dist/types/tiny/title-protocol.d.ts +74 -0
  63. package/dist/types/tiny/worker.d.ts +2 -0
  64. package/dist/types/tools/bash.d.ts +3 -1
  65. package/dist/types/tools/index.d.ts +7 -4
  66. package/dist/types/tools/memory-edit.d.ts +40 -0
  67. package/dist/types/tools/{hindsight-recall.d.ts → memory-recall.d.ts} +6 -6
  68. package/dist/types/tools/{hindsight-reflect.d.ts → memory-reflect.d.ts} +6 -6
  69. package/dist/types/tools/memory-render.d.ts +60 -0
  70. package/dist/types/tools/{hindsight-retain.d.ts → memory-retain.d.ts} +6 -6
  71. package/dist/types/tools/todo-write.d.ts +8 -0
  72. package/dist/types/tools/tool-result.d.ts +2 -0
  73. package/dist/types/utils/title-generator.d.ts +3 -0
  74. package/package.json +18 -14
  75. package/scripts/build-binary.ts +1 -0
  76. package/src/cli/tiny-models-cli.ts +127 -0
  77. package/src/cli-commands.ts +1 -0
  78. package/src/cli.ts +8 -8
  79. package/src/commands/tiny-models.ts +36 -0
  80. package/src/config/model-equivalence.ts +43 -2
  81. package/src/config/model-id-affixes.ts +64 -0
  82. package/src/config/model-registry.ts +166 -8
  83. package/src/config/models-config-schema.ts +1 -1
  84. package/src/config/settings-schema.ts +206 -14
  85. package/src/edit/hashline/diff.ts +5 -7
  86. package/src/eval/__tests__/llm-bridge.test.ts +297 -0
  87. package/src/eval/__tests__/shared-executors.test.ts +36 -0
  88. package/src/eval/js/shared/local-module-loader.ts +13 -1
  89. package/src/eval/js/shared/prelude.txt +8 -0
  90. package/src/eval/js/shared/rewrite-imports.ts +31 -26
  91. package/src/eval/js/tool-bridge.ts +4 -0
  92. package/src/eval/llm-bridge.ts +181 -0
  93. package/src/eval/py/prelude.py +52 -31
  94. package/src/export/html/template.generated.ts +1 -1
  95. package/src/export/html/template.js +0 -13
  96. package/src/extensibility/plugins/legacy-pi-compat.ts +60 -23
  97. package/src/internal-urls/agent-protocol.ts +18 -1
  98. package/src/internal-urls/artifact-protocol.ts +19 -1
  99. package/src/internal-urls/docs-index.generated.ts +5 -4
  100. package/src/internal-urls/local-protocol.ts +14 -1
  101. package/src/internal-urls/memory-protocol.ts +6 -1
  102. package/src/internal-urls/omp-protocol.ts +5 -1
  103. package/src/internal-urls/router.ts +20 -1
  104. package/src/internal-urls/rule-protocol.ts +8 -1
  105. package/src/internal-urls/skill-protocol.ts +8 -1
  106. package/src/internal-urls/types.ts +27 -0
  107. package/src/lsp/render.ts +1 -1
  108. package/src/main.ts +4 -0
  109. package/src/mcp/oauth-flow.ts +2 -2
  110. package/src/memory-backend/index.ts +1 -0
  111. package/src/memory-backend/resolve.ts +4 -1
  112. package/src/memory-backend/types.ts +8 -1
  113. package/src/mnemosyne/backend.ts +374 -0
  114. package/src/mnemosyne/config.ts +160 -0
  115. package/src/mnemosyne/index.ts +3 -0
  116. package/src/mnemosyne/state.ts +548 -0
  117. package/src/modes/acp/acp-agent.ts +11 -6
  118. package/src/modes/components/agent-dashboard.ts +4 -4
  119. package/src/modes/components/custom-editor.ts +3 -2
  120. package/src/modes/components/diff.ts +2 -2
  121. package/src/modes/components/extensions/extension-list.ts +3 -2
  122. package/src/modes/components/footer.ts +5 -6
  123. package/src/modes/components/history-search.ts +3 -3
  124. package/src/modes/components/hook-selector.ts +94 -8
  125. package/src/modes/components/index.ts +1 -0
  126. package/src/modes/components/mcp-add-wizard.ts +3 -3
  127. package/src/modes/components/model-selector.ts +124 -26
  128. package/src/modes/components/oauth-selector.ts +3 -3
  129. package/src/modes/components/session-observer-overlay.ts +19 -13
  130. package/src/modes/components/session-selector.ts +3 -3
  131. package/src/modes/components/settings-defs.ts +7 -0
  132. package/src/modes/components/status-line/context-thresholds.ts +11 -0
  133. package/src/modes/components/status-line/presets.ts +1 -0
  134. package/src/modes/components/status-line/segments.ts +25 -2
  135. package/src/modes/components/tiny-title-download-progress.ts +90 -0
  136. package/src/modes/components/tips.txt +12 -0
  137. package/src/modes/components/tool-execution.ts +67 -3
  138. package/src/modes/components/tree-selector.ts +3 -3
  139. package/src/modes/components/user-message-selector.ts +3 -3
  140. package/src/modes/components/welcome.ts +55 -1
  141. package/src/modes/controllers/command-controller.ts +16 -1
  142. package/src/modes/controllers/extension-ui-controller.ts +3 -1
  143. package/src/modes/controllers/input-controller.ts +57 -0
  144. package/src/modes/gradient-highlight.ts +70 -0
  145. package/src/modes/interactive-mode.ts +80 -196
  146. package/src/modes/internal-url-autocomplete.ts +143 -0
  147. package/src/modes/orchestrate.ts +36 -0
  148. package/src/modes/prompt-action-autocomplete.ts +12 -0
  149. package/src/modes/theme/theme.ts +7 -0
  150. package/src/modes/ultrathink.ts +9 -53
  151. package/src/modes/utils/keybinding-matchers.ts +11 -0
  152. package/src/prompts/system/memory-consolidation-system.md +8 -0
  153. package/src/prompts/system/memory-extraction-system.md +26 -0
  154. package/src/prompts/{commands/orchestrate.md → system/orchestrate-notice.md} +5 -16
  155. package/src/prompts/system/system-prompt.md +2 -0
  156. package/src/prompts/system/tiny-title-system.md +8 -0
  157. package/src/prompts/tools/eval.md +2 -0
  158. package/src/prompts/tools/memory-edit.md +8 -0
  159. package/src/prompts/tools/task.md +4 -7
  160. package/src/sdk.ts +8 -6
  161. package/src/session/agent-session.ts +147 -44
  162. package/src/session/session-manager.ts +47 -0
  163. package/src/slash-commands/builtin-registry.ts +10 -1
  164. package/src/system-prompt.ts +4 -0
  165. package/src/task/commands.ts +1 -5
  166. package/src/task/executor.ts +8 -0
  167. package/src/task/index.ts +2 -0
  168. package/src/task/render.ts +69 -26
  169. package/src/tiny/models.ts +217 -0
  170. package/src/tiny/text.ts +19 -0
  171. package/src/tiny/title-client.ts +340 -0
  172. package/src/tiny/title-protocol.ts +51 -0
  173. package/src/tiny/worker.ts +523 -0
  174. package/src/tools/bash.ts +58 -16
  175. package/src/tools/browser/tab-worker.ts +1 -1
  176. package/src/tools/eval.ts +24 -48
  177. package/src/tools/index.ts +17 -15
  178. package/src/tools/memory-edit.ts +59 -0
  179. package/src/tools/memory-recall.ts +100 -0
  180. package/src/tools/memory-reflect.ts +88 -0
  181. package/src/tools/memory-render.ts +185 -0
  182. package/src/tools/memory-retain.ts +91 -0
  183. package/src/tools/renderers.ts +4 -2
  184. package/src/tools/todo-write.ts +128 -29
  185. package/src/tools/tool-result.ts +8 -0
  186. package/src/utils/title-generator.ts +115 -13
  187. package/dist/types/tools/calculator.d.ts +0 -77
  188. package/src/prompts/tools/calculator.md +0 -10
  189. package/src/tools/calculator.ts +0 -541
  190. package/src/tools/hindsight-recall.ts +0 -69
  191. package/src/tools/hindsight-reflect.ts +0 -58
  192. package/src/tools/hindsight-retain.ts +0 -57
package/CHANGELOG.md CHANGED
@@ -2,6 +2,83 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [15.6.0] - 2026-05-30
6
+ ### Added
7
+
8
+ - Added prompt-mode autocomplete for supported internal URL schemes (`skill://`, `rule://`, `agent://`, `artifact://`, `local://`, `memory://`, and `omp://`) so typing those tokens now suggests existing resources as completion candidates
9
+ - Added fuzzy matching and ranked suggestion ordering for internal URL completion, including rule and skill descriptions, with accepted completion replacing just the typed token and inserting the chosen URL followed by a space
10
+ - Changed internal URL completions now include nested `local://` path suggestions from the configured local workspace
11
+ - Added Mnemosyne memory inference model selection with an online mode or local transformers.js options (`qwen3-1.7b`, `gemma-3-1b`, `qwen2.5-1.5b`, `lfm2-1.2b`) so memory extraction and consolidation can run via the shared tiny-model worker
12
+ - Changed memory tiny-model handling to route local memory prompts through the same queueed tiny-model worker pipeline with bounded completion output
13
+ - Added a Providers → Tiny Model setting for session titles, defaulting to the online `pi/smol` path with five optional local CPU transformers.js models. A local model — and the one-time `@huggingface/transformers` runtime install in compiled binaries — is downloaded and loaded only when explicitly selected (or via `omp tiny-models download`); the default online path never spawns the title worker for inference. Selecting a local model adds a delayed `pi/smol` fallback so titles never block, plus in-chat download progress.
14
+ - Added a persistent live agent roster pinned below the editor (focus it with `Ctrl+S` or `Alt+Down`), including view-as switching into delegated agent sessions with human-readable delegate names and UI pinning to suppress idle reaping while viewed. The roster stays hidden until at least one delegated agent exists and releases focus back to the editor once the last one is gone.
15
+ - Recorded the originating session ID alongside each prompt in `history.db` (new `session_id` column, surfaced as `HistoryEntry.sessionId`), so recalled prompts can be traced back to the session they came from. Existing history databases gain the column automatically on next launch.
16
+ - Added compact inline TUI renderers for the `retain`, `recall`, and `reflect` memory tools. `retain` now shows one themed bullet line per stored item (truncated to width) under a status header with the stored/queued count, and `recall`/`reflect` collapse to a single query header (recall reports the match count and hides recalled memories until expanded) instead of dumping the raw JSON argument tree.
17
+ - Added a randomly picked tip beneath the welcome screen, sourced from an embedded `tips.txt` (one tip per line). The line is italicized with a purple `Tip:` label and a dimmed light-blue body, and the tip is chosen once per welcome instance so intro-animation and LSP re-renders don't shuffle it.
18
+ - Added a Mnemosyne-only `memory_edit` agent tool for updating, forgetting, or invalidating recalled memories by id, and added `/memory stats` plus `/memory diagnose` slash commands for backend maintenance visibility.
19
+ - Added an `orchestrate` magic keyword that mirrors `ultrathink`: dropping the standalone word in a message paints it with a cool teal→violet gradient in the editor and appends a hidden system notice that switches the model into the multi-phase, parallel-subagent orchestration contract. Matching is word-bounded and case-insensitive, so `orchestrated`/`orchestrating` never trigger it.
20
+ - Added a model-tier slider to the plan-approval prompt ("Plan mode - next step"). Left/right arrows move it from any list position to pick which configured role model (`cycleOrder`, e.g. `smol › default › slow`) executes the approved plan, with each tier colored by its role and the resolved model name shown beneath the track. The chosen tier is applied before dispatch and carries through the fresh/compacted execution session; the slider is hidden when fewer than two role models resolve.
21
+
22
+ ### Changed
23
+
24
+ - Changed `irc` to treat the attached human as a first-class `User` peer, merging human prompts into `irc call User` with optional structured question payloads and adding `/dm <agent> <message>` for user-to-agent routing without switching views.
25
+ - Changed the `--resume` session picker (and the in-session resume selector) to also rank sessions by prompt-history matches from `history.db`, not just the session-list metadata. Because the session list only indexes the first 4KB of each file, this surfaces sessions by prompts typed deep into long conversations. Sessions matched by both signals lead, then metadata-only matches, then history-only matches — no metadata match is dropped.
26
+ - Changed the `task` tool's streaming call preview to list each dispatched agent's `id` and UI description as a tree instead of a bare `N agents` count, so the individual agents are visible while the tool-call arguments are still streaming. The collapsed view caps at 12 entries (`… N more agents`); the expanded view shows all.
27
+ - Changed Mnemosyne `recall` tool output to include memory ids for explicit recall results so agents can target `memory_edit`; auto-injected memory context and `reflect` remain id-free.
28
+ - Changed the system prompt to advertise `memory://root` only when the local memory backend is active.
29
+ - Changed `todo_write` result rendering to animate completed items in place: the checkbox flips checked first, then the strikethrough reveals across the task text.
30
+
31
+ ### Removed
32
+
33
+ - Removed the standalone `ask`, `task`, and `yield` tools along with their obsolete prompts, docs, and tests; delegation now routes through persistent `delegate` agents plus IRC coordination.
34
+ - Removed the `/orchestrate` slash command; orchestration is now triggered by the `orchestrate` keyword (see Added) so the contract rides alongside the user's own prompt instead of replacing it.
35
+ - Removed the sticky Todos panel all-done drop/collapse animation; completed todo state now stays visible until the next explicit todo update changes it.
36
+
37
+ ### Fixed
38
+
39
+ - Fixed Mnemosyne session shutdown to flush queued memory extractions before exit so the last turn’s facts are not lost
40
+ - Fixed a native crash (`malloc: pointer being freed was not allocated` / `NAPI FATAL ERROR`) when quitting after the local transformers.js title model had run. The tiny-title worker no longer calls `pipeline.dispose()` on shutdown — disposing the onnxruntime session freed native memory that Bun's worker/NAPI teardown then freed again. The worker is torn down immediately after, so the OS reclaims the model memory regardless.
41
+ - Fixed the tiny-title download progress bar flashing on every first message even when the local model was already downloaded. A cached model emits the same `download`/`progress` events as a real download, so the bar is now revealed only when in-flight progress events keep arriving past a short grace window — cache hits finish (or fall silent during onnxruntime init) before then and never show the bar.
42
+ - Fixed the Mnemosyne memory backend lifecycle so auto-retain counts the full session transcript, delegated agents inherit the parent Mnemosyne state, `/memory clear` removes scoped project-bank databases, session disposal closes Mnemosyne SQLite handles, session switches rekey/reset Mnemosyne tracking, and project bank names include an absolute-root hash with safe bank-name sanitization.
43
+ - Fixed the streaming edit preview showing no diff for single-line hashline edits. The preview-diff coalescing keyed only on the arg text, so the final (args-complete) pass — which computes an untrimmed diff — was skipped because the payload was byte-identical to the last streamed chunk whose trailing line had been trimmed. The dedup key now pairs the streaming state with a content hash.
44
+ - Fixed `Esc` in a delegated agent view returning to the main session instead of aborting the delegated agent's active turn.
45
+ - Fixed the subagent stats line to separate the cost with the theme dot separator (was a stray literal `.`) and to render context usage as `<pct>%/<window>` (e.g. `21.3%/272K`) matching the status line gauge, via a shared `formatContextUsage` helper now used by the footer, status-line segment, session observer overlay, and `task` renderer.
46
+ - Fixed the agent roster staying pinned under the editor when all delegated agents are idle or dormant; it now reappears when explicitly focused with `Alt+Down` / session observe.
47
+ - Fixed selector-style UI components to honor `tui.select.up` and `tui.select.down` keybindings instead of hard-coding raw Up/Down arrow bytes ([#1535](https://github.com/can1357/oh-my-pi/issues/1535)).
48
+ - Fixed the bash (and `recipe`) tool result footer not rendering for failed commands. A non-zero exit threw a `ToolError`, which dropped the result details, so the styled `⟨Wall … | Timeout …⟩` footer was replaced by the raw `Wall time: … seconds` / `Command exited with code N` lines. Non-zero exits now resolve as a non-throwing error result that keeps `wallTimeMs`/`timeoutSeconds`/`exitCode`, and the footer shows `⟨Wall … | Timeout … | Exit: N⟩` with the textual notices folded out of the output pane. Aborts, timeouts, and missing-exit-status still throw as before.
49
+ - Fixed selector-style UI components to honor `tui.select.up` and `tui.select.down` keybindings instead of hard-coding raw Up/Down arrow bytes ([#1535](https://github.com/can1357/oh-my-pi/issues/1535)).
50
+
51
+ ## [15.5.15] - 2026-05-30
52
+ ### Changed
53
+
54
+ - Enabled the agent loop's tool-call batch cap for Anthropic Claude sessions, cutting oversized streamed tool-use bursts into runnable batches before continuing the conversation.
55
+
56
+ ### Removed
57
+
58
+ - Removed the `calc` tool (deterministic arithmetic evaluator) and its `calc.enabled` setting. The model can compute via `eval` instead.
59
+
60
+ ### Fixed
61
+
62
+ - Fixed Anthropic Claude tool-call batching to clear and reapply the Claude-specific batch cap whenever the session model changes
63
+
64
+ ## [15.5.14] - 2026-05-29
65
+ ### Added
66
+
67
+ - Added progress status output for `llm()` calls in `eval`, including the resolved model, tier, and returned character count
68
+ - Added an `llm(prompt, opts)` helper to both `eval` runtimes (JavaScript and Python) for oneshot, stateless LLM calls. `opts.model` selects a tier — `"smol"` (`pi/smol`), `"default"` (the session's active model, falling back to `pi/default`), or `"slow"` (`pi/slow`, with high reasoning effort on reasoning-capable models). Pass `system` for a system prompt and a plain JSON-Schema `schema` to force a structured response (the helper returns the parsed object instead of the completion string). Calls carry no conversation history and expose no agent-visible tools; they route host-side through the existing tool bridge under the reserved name `__llm__` (`packages/coding-agent/src/eval/llm-bridge.ts`).
69
+
70
+ ### Fixed
71
+
72
+ - Fixed a rewind/restore loop (and a follow-on handoff failure) caused by assistant turns whose tool results are off the resolved conversation path — e.g. selecting such a turn in `/tree`, restoring a session whose head is a mid-batch turn, or branching a new message in right after a turn whose tool calls hadn't resolved on that branch. `buildSessionContext` walks the leaf→root path, so any turn whose `tool_result` children live on a sibling branch (or below the leaf) ends up with **dangling** `tool_use` blocks. `transformMessages` then fabricated one synthetic `"aborted"`/`"No result provided"` result per dangling call plus a `<turn-aborted>` developer note, which both rendered as phantom failed calls on a turn that "hadn't run anything yet" and re-injected the failed batch into the model's context, prompting it to re-issue the batch (the spiral). `buildSessionContext` now rewrites **every** assistant turn on the resolved path that has dangling `tool_use`: it drops the unpaired `tool_use` blocks, drops `redacted_thinking` blocks, and clears `thinking` signatures (the provider encoder then emits them as plain text), dropping a turn entirely if no content remains. Turns whose tool calls *are* paired on the path are left untouched. Stripping the calls alone was insufficient — a *modified* assistant turn that still carried signed `thinking`/`redacted_thinking` was rejected by Anthropic with `messages.N.content.M: 'thinking' or 'redacted_thinking' blocks in the latest assistant message cannot be modified`, which surfaced as `Handoff generation failed: 400` on navigation. Live turns are unaffected — their results persist on the same path before any context rebuild.
73
+
74
+ - Fixed external extension loading on Windows compiled binaries: bare `@oh-my-pi/pi-*` value imports (e.g. `import { AssistantMessageEventStream } from "@oh-my-pi/pi-ai"`) failed with `Cannot find package '\$bunfs\root\packages\…'` because `legacy-pi-compat.ts` built shim override paths from a hardcoded POSIX `/$bunfs/root/packages` literal. Win32 normalised the leading slash to a backslash and the resulting path never resolved against the real bunfs mount (`<drive>:\~BUN\root\…`). The bunfs package root is now derived from `import.meta.dir`, so override paths stay platform-native on Windows, Linux, and macOS ([#1514](https://github.com/can1357/oh-my-pi/issues/1514)).
75
+ - Fixed the interactive prompt showing no cursor in Ghostty. A prior change wired the editor's cursor mode to a new `getUseTerminalCursorMarker()` (which always reported the *requested* preference) instead of the resolved hardware-cursor visibility, so when Ghostty force-hid the hardware cursor the editor stayed in terminal-cursor (marker-only) mode and drew no glyph — leaving no visible caret with either `showHardwareCursor`/`PI_HARDWARE_CURSOR` value. The editor now follows `ui.getShowHardwareCursor()`: a hidden hardware cursor falls back to the steady software-cursor glyph (which still emits `CURSOR_MARKER` for IME positioning).
76
+
77
+ ### Changed
78
+
79
+ - Changed the `eval` tool's `display()` JSON tree in the transcript to use the shared `renderJsonTreeLines` renderer (the same one behind tool args, MCP results, and subagent output) instead of its own format. This drops the redundant `Object(N)` / `Array(N)` type labels and the per-output `JSON output N` header in favor of type icons plus bare keys; the `display[N]` header is now shown only when a cell emits more than one `display()` value.
80
+ - Reverted the sticky `Todos` panel task glyphs to the pre-15.5.12 checkbox icons: completed tasks render `theme.checkbox.checked` (not `theme.status.success`) and in-progress tasks render `theme.checkbox.unchecked` (not the running glyph). Removed the animated spinner entirely — in-progress tasks and pending tasks with a matching in-flight subagent still highlight via the `accent` colour, but the panel now paints once per state change instead of on an 80 ms timer. Subagent auto-checkmarking, the advancing window (`selectStickyTodoWindow`), `todoMatchesAnyDescription` highlighting, and the all-done close animation are unchanged.
81
+
5
82
  ## [15.5.13] - 2026-05-29
6
83
  ### Breaking Changes
7
84
 
@@ -1,13 +1,3 @@
1
- /**
2
- * Classify an install spec as a marketplace plugin reference or a plain npm package.
3
- *
4
- * Rules (applied in order):
5
- * 1. Starts with `@` (scoped npm) -> always npm.
6
- * 2. Contains `@` after the first character -> split on the LAST `@`.
7
- * If the right-hand side is a known marketplace name, it's a marketplace ref.
8
- * Otherwise it's an npm spec (e.g. `pkg@1.2.3`).
9
- * 3. No `@` -> npm.
10
- */
11
1
  export declare function classifyInstallTarget(spec: string, knownMarketplaces: Set<string>): {
12
2
  type: "marketplace";
13
3
  name: string;
@@ -14,4 +14,4 @@ export interface InitialMessageResult {
14
14
  * Combine stdin content, @file text, and the first CLI message into a single
15
15
  * initial prompt for non-interactive mode.
16
16
  */
17
- export declare function buildInitialMessage({ parsed, fileText, fileImages, stdinContent }: InitialMessageInput): InitialMessageResult;
17
+ export declare function buildInitialMessage({ parsed, fileText, fileImages, stdinContent, }: InitialMessageInput): InitialMessageResult;
@@ -0,0 +1,9 @@
1
+ export type TinyModelsAction = "download" | "list";
2
+ export interface TinyModelsCommandArgs {
3
+ action: TinyModelsAction;
4
+ model?: string;
5
+ flags: {
6
+ json?: boolean;
7
+ };
8
+ }
9
+ export declare function runTinyModelsCommand(command: TinyModelsCommandArgs): Promise<void>;
@@ -0,0 +1,22 @@
1
+ import { Command } from "@oh-my-pi/pi-utils/cli";
2
+ import { type TinyModelsAction } from "../cli/tiny-models-cli";
3
+ export default class TinyModels extends Command {
4
+ static description: string;
5
+ static args: {
6
+ action: import("@oh-my-pi/pi-utils/cli").ArgDescriptor & {
7
+ description: string;
8
+ required: false;
9
+ options: TinyModelsAction[];
10
+ };
11
+ model: import("@oh-my-pi/pi-utils/cli").ArgDescriptor & {
12
+ description: string;
13
+ required: false;
14
+ };
15
+ };
16
+ static flags: {
17
+ json: import("@oh-my-pi/pi-utils/cli").FlagDescriptor<"boolean"> & {
18
+ description: string;
19
+ };
20
+ };
21
+ run(): Promise<void>;
22
+ }
@@ -19,4 +19,4 @@ export interface ConventionalAnalysisInput {
19
19
  /**
20
20
  * Generate conventional analysis data from a diff and metadata.
21
21
  */
22
- export declare function generateConventionalAnalysis({ model, apiKey, thinkingLevel, contextFiles, userContext, typesDescription, recentCommits, scopeCandidates, stat, diff }: ConventionalAnalysisInput): Promise<ConventionalAnalysis>;
22
+ export declare function generateConventionalAnalysis({ model, apiKey, thinkingLevel, contextFiles, userContext, typesDescription, recentCommits, scopeCandidates, stat, diff, }: ConventionalAnalysisInput): Promise<ConventionalAnalysis>;
@@ -15,5 +15,5 @@ export interface SummaryInput {
15
15
  /**
16
16
  * Generate a commit summary line for the conventional commit header.
17
17
  */
18
- export declare function generateSummary({ model, apiKey, thinkingLevel, commitType, scope, details, stat, maxChars, userContext }: SummaryInput): Promise<CommitSummary>;
18
+ export declare function generateSummary({ model, apiKey, thinkingLevel, commitType, scope, details, stat, maxChars, userContext, }: SummaryInput): Promise<CommitSummary>;
19
19
  export declare function stripTypePrefix(summary: string, commitType: string, scope: string | null): string;
@@ -27,4 +27,4 @@ export interface ChangelogPromptInput {
27
27
  stat: string;
28
28
  diff: string;
29
29
  }
30
- export declare function generateChangelogEntries({ model, apiKey, thinkingLevel, changelogPath, isPackageChangelog, existingEntries, stat, diff }: ChangelogPromptInput): Promise<ChangelogGenerationResult>;
30
+ export declare function generateChangelogEntries({ model, apiKey, thinkingLevel, changelogPath, isPackageChangelog, existingEntries, stat, diff, }: ChangelogPromptInput): Promise<ChangelogGenerationResult>;
@@ -23,8 +23,8 @@ export interface ChangelogProposalInput {
23
23
  /**
24
24
  * Update CHANGELOG.md entries for staged changes.
25
25
  */
26
- export declare function runChangelogFlow({ cwd, model, apiKey, thinkingLevel, stagedFiles, dryRun, maxDiffChars, onProgress }: ChangelogFlowInput): Promise<string[]>;
26
+ export declare function runChangelogFlow({ cwd, model, apiKey, thinkingLevel, stagedFiles, dryRun, maxDiffChars, onProgress, }: ChangelogFlowInput): Promise<string[]>;
27
27
  /**
28
28
  * Apply changelog entries provided by the commit agent.
29
29
  */
30
- export declare function applyChangelogProposals({ cwd, proposals, dryRun, onProgress }: ChangelogProposalInput): Promise<string[]>;
30
+ export declare function applyChangelogProposals({ cwd, proposals, dryRun, onProgress, }: ChangelogProposalInput): Promise<string[]>;
@@ -14,4 +14,4 @@ export interface MapPhaseInput {
14
14
  retryBackoffMs?: number;
15
15
  };
16
16
  }
17
- export declare function runMapPhase({ model, apiKey, thinkingLevel, files, config }: MapPhaseInput): Promise<FileObservation[]>;
17
+ export declare function runMapPhase({ model, apiKey, thinkingLevel, files, config, }: MapPhaseInput): Promise<FileObservation[]>;
@@ -10,4 +10,4 @@ export interface ReducePhaseInput {
10
10
  scopeCandidates: string;
11
11
  typesDescription?: string;
12
12
  }
13
- export declare function runReducePhase({ model, apiKey, thinkingLevel, observations, stat, scopeCandidates, typesDescription }: ReducePhaseInput): Promise<ConventionalAnalysis>;
13
+ export declare function runReducePhase({ model, apiKey, thinkingLevel, observations, stat, scopeCandidates, typesDescription, }: ReducePhaseInput): Promise<ConventionalAnalysis>;
@@ -0,0 +1,10 @@
1
+ export declare function getModelLikeIdSegments(modelId: string): string[];
2
+ export declare function getLongestModelLikeIdSegment(modelId: string): string | undefined;
3
+ /**
4
+ * Strip reseller / wrapper tags that are injected as bracketed affixes around an
5
+ * upstream model id, e.g.
6
+ * "[Kiro] claude-opus-4-8" -> "claude-opus-4-8"
7
+ * "[gcli转] gemini-3.1-pro-preview [假流]" -> "gemini-3.1-pro-preview"
8
+ */
9
+ export declare function getBracketStrippedModelIdCandidates(modelId: string): string[];
10
+ export declare function stripBracketedModelIdAffixes(modelId: string): string | undefined;
@@ -78,7 +78,7 @@ export declare const ModelsConfigFile: ConfigFile<{
78
78
  authHeader?: boolean | undefined;
79
79
  auth?: "apiKey" | "none" | "oauth" | undefined;
80
80
  discovery?: {
81
- type: "llama.cpp" | "lm-studio" | "ollama" | "openai-models-list";
81
+ type: "llama.cpp" | "lm-studio" | "ollama" | "openai-models-list" | "proxy";
82
82
  } | undefined;
83
83
  models?: {
84
84
  id: string;
@@ -170,6 +170,7 @@ export declare const ProviderDiscoverySchema: z.ZodObject<{
170
170
  "lm-studio": "lm-studio";
171
171
  ollama: "ollama";
172
172
  "openai-models-list": "openai-models-list";
173
+ proxy: "proxy";
173
174
  }>;
174
175
  }, z.core.$strip>;
175
176
  export declare const ProviderAuthSchema: z.ZodEnum<{
@@ -259,6 +260,7 @@ export declare const ModelsConfigSchema: z.ZodObject<{
259
260
  "lm-studio": "lm-studio";
260
261
  ollama: "ollama";
261
262
  "openai-models-list": "openai-models-list";
263
+ proxy: "proxy";
262
264
  }>;
263
265
  }, z.core.$strip>>;
264
266
  models: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -23,7 +23,7 @@ export declare const TAB_METADATA: Record<SettingTab, {
23
23
  icon: `tab.${string}`;
24
24
  }>;
25
25
  /** Status line segment identifiers */
26
- export type StatusLineSegmentId = "pi" | "model" | "mode" | "path" | "git" | "pr" | "subagents" | "token_in" | "token_out" | "token_total" | "token_rate" | "cost" | "context_pct" | "context_total" | "time_spent" | "time" | "session" | "hostname" | "cache_read" | "cache_write" | "session_name" | "usage";
26
+ export type StatusLineSegmentId = "pi" | "model" | "mode" | "path" | "git" | "pr" | "subagents" | "token_in" | "token_out" | "token_total" | "token_rate" | "cost" | "context_pct" | "context_total" | "time_spent" | "time" | "session" | "hostname" | "cache_read" | "cache_write" | "cache_hit" | "session_name" | "usage";
27
27
  /** Submenu choice metadata. */
28
28
  export type SubmenuOption<V extends string = string> = {
29
29
  value: V;
@@ -462,7 +462,7 @@ export declare const SETTINGS_SCHEMA: {
462
462
  readonly ui: {
463
463
  readonly tab: "tools";
464
464
  readonly label: "Artifact head size (KB)";
465
- readonly description: "Amount of head content kept inline alongside the tail when output spills to artifact (middle elision). 0 disables \u2014 keep tail only.";
465
+ readonly description: "Amount of head content kept inline alongside the tail when output spills to artifact (middle elision). 0 disables keep tail only.";
466
466
  readonly options: readonly [{
467
467
  readonly value: "0";
468
468
  readonly label: "0 KB";
@@ -1597,12 +1597,12 @@ export declare const SETTINGS_SCHEMA: {
1597
1597
  };
1598
1598
  readonly "memory.backend": {
1599
1599
  readonly type: "enum";
1600
- readonly values: readonly ["off", "local", "hindsight"];
1600
+ readonly values: readonly ["off", "local", "hindsight", "mnemosyne"];
1601
1601
  readonly default: "off";
1602
1602
  readonly ui: {
1603
1603
  readonly tab: "memory";
1604
1604
  readonly label: "Memory Backend";
1605
- readonly description: "Off, local memory pipeline, or Hindsight remote memory";
1605
+ readonly description: "Off, local summary pipeline, Mnemosyne SQLite, or Hindsight remote memory";
1606
1606
  readonly options: readonly [{
1607
1607
  readonly value: "off";
1608
1608
  readonly label: "Off";
@@ -1615,9 +1615,195 @@ export declare const SETTINGS_SCHEMA: {
1615
1615
  readonly value: "hindsight";
1616
1616
  readonly label: "Hindsight";
1617
1617
  readonly description: "Vectorize Hindsight remote memory service";
1618
+ }, {
1619
+ readonly value: "mnemosyne";
1620
+ readonly label: "Mnemosyne";
1621
+ readonly description: "Local SQLite recall/retain backend with optional embeddings";
1622
+ }];
1623
+ };
1624
+ };
1625
+ readonly "mnemosyne.dbPath": {
1626
+ readonly type: "string";
1627
+ readonly default: undefined;
1628
+ readonly ui: {
1629
+ readonly tab: "memory";
1630
+ readonly label: "Mnemosyne DB Path";
1631
+ readonly description: "Optional SQLite DB path. Defaults to the agent memories directory.";
1632
+ readonly condition: "mnemosyneActive";
1633
+ };
1634
+ };
1635
+ readonly "mnemosyne.bank": {
1636
+ readonly type: "string";
1637
+ readonly default: undefined;
1638
+ readonly ui: {
1639
+ readonly tab: "memory";
1640
+ readonly label: "Mnemosyne Bank";
1641
+ readonly description: "Optional shared bank base name. Per-project modes derive project-local banks from it.";
1642
+ readonly condition: "mnemosyneActive";
1643
+ };
1644
+ };
1645
+ readonly "mnemosyne.scoping": {
1646
+ readonly type: "enum";
1647
+ readonly values: readonly ["global", "per-project", "per-project-tagged"];
1648
+ readonly default: "per-project";
1649
+ readonly ui: {
1650
+ readonly tab: "memory";
1651
+ readonly label: "Mnemosyne Scoping";
1652
+ readonly description: "global = one shared bank; per-project = isolated bank per cwd; per-project-tagged = project-local writes plus global recall visibility";
1653
+ readonly options: readonly [{
1654
+ readonly value: "global";
1655
+ readonly label: "Global";
1656
+ readonly description: "One shared Mnemosyne bank for every project";
1657
+ }, {
1658
+ readonly value: "per-project";
1659
+ readonly label: "Per project";
1660
+ readonly description: "Project-local Mnemosyne bank per cwd basename";
1661
+ }, {
1662
+ readonly value: "per-project-tagged";
1663
+ readonly label: "Per project (tagged)";
1664
+ readonly description: "Write to a project-local bank but merge project + shared recall results";
1665
+ }];
1666
+ readonly condition: "mnemosyneActive";
1667
+ };
1668
+ };
1669
+ readonly "mnemosyne.autoRecall": {
1670
+ readonly type: "boolean";
1671
+ readonly default: true;
1672
+ readonly ui: {
1673
+ readonly tab: "memory";
1674
+ readonly label: "Mnemosyne Auto Recall";
1675
+ readonly description: "Recall local memories into the first turn of each session";
1676
+ readonly condition: "mnemosyneActive";
1677
+ };
1678
+ };
1679
+ readonly "mnemosyne.autoRetain": {
1680
+ readonly type: "boolean";
1681
+ readonly default: true;
1682
+ readonly ui: {
1683
+ readonly tab: "memory";
1684
+ readonly label: "Mnemosyne Auto Retain";
1685
+ readonly description: "Retain completed conversation turns into local Mnemosyne memory";
1686
+ readonly condition: "mnemosyneActive";
1687
+ };
1688
+ };
1689
+ readonly "mnemosyne.noEmbeddings": {
1690
+ readonly type: "boolean";
1691
+ readonly default: false;
1692
+ readonly ui: {
1693
+ readonly tab: "memory";
1694
+ readonly label: "Mnemosyne Disable Embeddings";
1695
+ readonly description: "Force deterministic FTS-only recall instead of vector embeddings";
1696
+ readonly condition: "mnemosyneActive";
1697
+ };
1698
+ };
1699
+ readonly "mnemosyne.embeddingModel": {
1700
+ readonly type: "string";
1701
+ readonly default: undefined;
1702
+ readonly ui: {
1703
+ readonly tab: "memory";
1704
+ readonly label: "Mnemosyne Embedding Model";
1705
+ readonly description: "Optional embedding model override passed to Mnemosyne";
1706
+ readonly condition: "mnemosyneActive";
1707
+ };
1708
+ };
1709
+ readonly "mnemosyne.embeddingApiUrl": {
1710
+ readonly type: "string";
1711
+ readonly default: undefined;
1712
+ readonly ui: {
1713
+ readonly tab: "memory";
1714
+ readonly label: "Mnemosyne Embedding API URL";
1715
+ readonly description: "Optional OpenAI-compatible embedding endpoint passed to Mnemosyne";
1716
+ readonly condition: "mnemosyneActive";
1717
+ };
1718
+ };
1719
+ readonly "mnemosyne.embeddingApiKey": {
1720
+ readonly type: "string";
1721
+ readonly default: undefined;
1722
+ readonly ui: {
1723
+ readonly tab: "memory";
1724
+ readonly label: "Mnemosyne Embedding API Key";
1725
+ readonly description: "Optional embedding API key passed to Mnemosyne";
1726
+ readonly condition: "mnemosyneActive";
1727
+ };
1728
+ };
1729
+ readonly "mnemosyne.llmMode": {
1730
+ readonly type: "enum";
1731
+ readonly values: readonly ["none", "smol", "remote"];
1732
+ readonly default: "smol";
1733
+ readonly ui: {
1734
+ readonly tab: "memory";
1735
+ readonly label: "Mnemosyne LLM Mode";
1736
+ readonly description: "Use no LLM, the configured smol model, or a remote OpenAI-compatible endpoint";
1737
+ readonly condition: "mnemosyneActive";
1738
+ readonly options: readonly [{
1739
+ readonly value: "none";
1740
+ readonly label: "None";
1741
+ readonly description: "Disable Mnemosyne LLM-backed extraction";
1742
+ }, {
1743
+ readonly value: "smol";
1744
+ readonly label: "Smol";
1745
+ readonly description: "Use the configured pi-ai smol model";
1746
+ }, {
1747
+ readonly value: "remote";
1748
+ readonly label: "Remote";
1749
+ readonly description: "Use the Mnemosyne remote LLM settings below";
1618
1750
  }];
1619
1751
  };
1620
1752
  };
1753
+ readonly "mnemosyne.llmBaseUrl": {
1754
+ readonly type: "string";
1755
+ readonly default: undefined;
1756
+ readonly ui: {
1757
+ readonly tab: "memory";
1758
+ readonly label: "Mnemosyne LLM Base URL";
1759
+ readonly description: "Optional OpenAI-compatible LLM endpoint for Mnemosyne remote mode";
1760
+ readonly condition: "mnemosyneActive";
1761
+ };
1762
+ };
1763
+ readonly "mnemosyne.llmApiKey": {
1764
+ readonly type: "string";
1765
+ readonly default: undefined;
1766
+ readonly ui: {
1767
+ readonly tab: "memory";
1768
+ readonly label: "Mnemosyne LLM API Key";
1769
+ readonly description: "Optional LLM API key for Mnemosyne remote mode";
1770
+ readonly condition: "mnemosyneActive";
1771
+ };
1772
+ };
1773
+ readonly "mnemosyne.llmModel": {
1774
+ readonly type: "string";
1775
+ readonly default: undefined;
1776
+ readonly ui: {
1777
+ readonly tab: "memory";
1778
+ readonly label: "Mnemosyne LLM Model";
1779
+ readonly description: "Optional LLM model name for Mnemosyne remote mode";
1780
+ readonly condition: "mnemosyneActive";
1781
+ };
1782
+ };
1783
+ readonly "mnemosyne.retainEveryNTurns": {
1784
+ readonly type: "number";
1785
+ readonly default: 4;
1786
+ };
1787
+ readonly "mnemosyne.recallLimit": {
1788
+ readonly type: "number";
1789
+ readonly default: 8;
1790
+ };
1791
+ readonly "mnemosyne.recallContextTurns": {
1792
+ readonly type: "number";
1793
+ readonly default: 3;
1794
+ };
1795
+ readonly "mnemosyne.recallMaxQueryChars": {
1796
+ readonly type: "number";
1797
+ readonly default: 4000;
1798
+ };
1799
+ readonly "mnemosyne.injectionTokenLimit": {
1800
+ readonly type: "number";
1801
+ readonly default: 5000;
1802
+ };
1803
+ readonly "mnemosyne.debug": {
1804
+ readonly type: "boolean";
1805
+ readonly default: false;
1806
+ };
1621
1807
  readonly "hindsight.apiUrl": {
1622
1808
  readonly type: "string";
1623
1809
  readonly default: "http://localhost:8888";
@@ -1657,11 +1843,11 @@ export declare const SETTINGS_SCHEMA: {
1657
1843
  readonly options: readonly [{
1658
1844
  readonly value: "global";
1659
1845
  readonly label: "Global";
1660
- readonly description: "One shared bank \u2014 every project sees the same memories";
1846
+ readonly description: "One shared bank every project sees the same memories";
1661
1847
  }, {
1662
1848
  readonly value: "per-project";
1663
1849
  readonly label: "Per project";
1664
- readonly description: "Isolated bank per cwd basename \u2014 projects cannot see each other's memories";
1850
+ readonly description: "Isolated bank per cwd basename projects cannot see each other's memories";
1665
1851
  }, {
1666
1852
  readonly value: "per-project-tagged";
1667
1853
  readonly label: "Per project (tagged)";
@@ -1761,7 +1947,7 @@ export declare const SETTINGS_SCHEMA: {
1761
1947
  readonly ui: {
1762
1948
  readonly tab: "memory";
1763
1949
  readonly label: "Hindsight Mental Models";
1764
- readonly description: "Read curated reflect summaries (mental models) into developer instructions at boot. Loads existing models on the bank \u2014 does not write. Pair with hindsight.mentalModelAutoSeed to also auto-create the built-in seed set.";
1950
+ readonly description: "Read curated reflect summaries (mental models) into developer instructions at boot. Loads existing models on the bank does not write. Pair with hindsight.mentalModelAutoSeed to also auto-create the built-in seed set.";
1765
1951
  readonly condition: "hindsightActive";
1766
1952
  };
1767
1953
  };
@@ -1942,7 +2128,7 @@ export declare const SETTINGS_SCHEMA: {
1942
2128
  readonly ui: {
1943
2129
  readonly tab: "editing";
1944
2130
  readonly label: "Hash Lines";
1945
- readonly description: "Include snapshot-tag headers and line numbers in read output for hashline edit mode (\u00B6PATH#tag plus LINE:content)";
2131
+ readonly description: "Include snapshot-tag headers and line numbers in read output for hashline edit mode (¶PATH#tag plus LINE:content)";
1946
2132
  };
1947
2133
  };
1948
2134
  readonly "read.defaultLimit": {
@@ -2375,15 +2561,6 @@ export declare const SETTINGS_SCHEMA: {
2375
2561
  readonly description: "Enable the debug tool for DAP-based debugging";
2376
2562
  };
2377
2563
  };
2378
- readonly "calc.enabled": {
2379
- readonly type: "boolean";
2380
- readonly default: false;
2381
- readonly ui: {
2382
- readonly tab: "tools";
2383
- readonly label: "Calculator";
2384
- readonly description: "Enable the calculator tool for basic calculations";
2385
- };
2386
- };
2387
2564
  readonly "tts.enabled": {
2388
2565
  readonly type: "boolean";
2389
2566
  readonly default: false;
@@ -3160,6 +3337,45 @@ export declare const SETTINGS_SCHEMA: {
3160
3337
  }];
3161
3338
  };
3162
3339
  };
3340
+ readonly "providers.tinyModel": {
3341
+ readonly type: "enum";
3342
+ readonly values: readonly ["online", "lfm2-350m", "qwen3-0.6b", "gemma-270m", "qwen2.5-0.5b", "lfm2-700m"];
3343
+ readonly default: "online";
3344
+ readonly ui: {
3345
+ readonly tab: "providers";
3346
+ readonly label: "Tiny Model";
3347
+ readonly description: "Session-title model: online pi/smol by default, or a local on-device model";
3348
+ readonly options: ({
3349
+ value: "online";
3350
+ label: string;
3351
+ description: string;
3352
+ } | {
3353
+ value: "gemma-270m" | "lfm2-350m" | "lfm2-700m" | "qwen2.5-0.5b" | "qwen3-0.6b";
3354
+ label: "Gemma 270M" | "LFM2 350M" | "LFM2 700M" | "Qwen2.5 0.5B" | "Qwen3 0.6B";
3355
+ description: "Balanced local fallback; moderate quality and cache footprint." | "Highest-quality local option; larger and slower than LFM2 350M." | "Most robust local option; slower first load, about 500 MB cached." | "Recommended local model; best speed/quality balance, about 212 MB cached." | "Smallest viable local option; lower quality, lowest cache footprint.";
3356
+ })[];
3357
+ };
3358
+ };
3359
+ readonly "providers.memoryModel": {
3360
+ readonly type: "enum";
3361
+ readonly values: readonly ["online", "qwen3-1.7b", "gemma-3-1b", "qwen2.5-1.5b", "lfm2-1.2b"];
3362
+ readonly default: "online";
3363
+ readonly ui: {
3364
+ readonly tab: "memory";
3365
+ readonly label: "Memory Model";
3366
+ readonly description: "Mnemosyne LLM for fact extraction + consolidation: online (smol/remote) by default, or a local on-device model";
3367
+ readonly condition: "mnemosyneActive";
3368
+ readonly options: ({
3369
+ value: "online";
3370
+ label: string;
3371
+ description: string;
3372
+ } | {
3373
+ value: "gemma-3-1b" | "lfm2-1.2b" | "qwen2.5-1.5b" | "qwen3-1.7b";
3374
+ label: "Gemma 3 1B" | "LFM2 1.2B" | "Qwen2.5 1.5B" | "Qwen3 1.7B";
3375
+ description: "Best consolidation/dedup; lighter footprint, but leaks small talk during extraction." | "Best extraction granularity (atomic facts); weaker consolidation." | "Fastest load; solid all-rounder, slightly noisier extraction labels." | "Recommended; most disciplined extraction (ignores chit-chat), good consolidation, about 1.1 GB cached.";
3376
+ })[];
3377
+ };
3378
+ };
3163
3379
  readonly "providers.kimiApiFormat": {
3164
3380
  readonly type: "enum";
3165
3381
  readonly values: readonly ["openai", "anthropic"];
@@ -10,7 +10,7 @@ export declare const SOURCE_PATHS: {
10
10
  readonly native: {
11
11
  readonly userBase: string;
12
12
  readonly userAgent: string;
13
- projectDir: string;
13
+ readonly projectDir: string;
14
14
  };
15
15
  readonly claude: {
16
16
  readonly userBase: ".claude";
@@ -1,5 +1 @@
1
- /**
2
- * Recursively substitute ${CLAUDE_PLUGIN_ROOT} and ${OMP_PLUGIN_ROOT}
3
- * with the actual plugin root path in strings, arrays, and plain objects.
4
- */
5
1
  export declare function substitutePluginRoot<T>(value: T, rootPath: string): T;
@@ -0,0 +1 @@
1
+ export {};
@@ -2,9 +2,24 @@ export declare function rewriteImports(code: string): string;
2
2
  export declare function collectModuleSourceSpecifiers(code: string): string[];
3
3
  export declare function rewriteModuleSourceSpecifiers(code: string, replacer: (source: string) => string): string;
4
4
  export declare function rewriteDynamicImports(code: string, callee?: string): string;
5
- export declare function stripTypeScriptSyntax(code: string): string;
5
+ /**
6
+ * Strip TypeScript syntax (type annotations, type-only imports/exports, `interface`, `as`,
7
+ * `satisfies`, generics in call expressions, etc.) before the import/lexical rewriters parse
8
+ * the code. Bun's native transpiler preserves `import`/`export` declarations, so downstream
9
+ * Babel rewrites still control module resolution.
10
+ *
11
+ * Eval cells use a cheap "looks like TS" heuristic to avoid transpiling ordinary JS. Known
12
+ * TypeScript modules pass `force` because a file can contain TS-only module syntax such as
13
+ * `import type` without any value-level type annotations.
14
+ */
15
+ type TypeScriptStripLoader = "ts" | "tsx";
16
+ export declare function stripTypeScriptSyntax(code: string, options?: {
17
+ force?: boolean;
18
+ loader?: TypeScriptStripLoader;
19
+ }): string;
6
20
  export declare function wrapCode(code: string): {
7
21
  source: string;
8
22
  asyncWrapped: boolean;
9
23
  finalExpressionReturned: boolean;
10
24
  };
25
+ export {};
@@ -0,0 +1,25 @@
1
+ import type { ToolSession } from "../tools";
2
+ import type { JsStatusEvent } from "./js/shared/types";
3
+ /** Synthetic bridge name reserved for the `llm()` helper across both runtimes. */
4
+ export declare const EVAL_LLM_BRIDGE_NAME = "__llm__";
5
+ type LlmTier = "smol" | "default" | "slow";
6
+ export interface EvalLlmBridgeOptions {
7
+ session: ToolSession;
8
+ signal?: AbortSignal;
9
+ emitStatus?: (event: JsStatusEvent) => void;
10
+ }
11
+ export interface EvalLlmResult {
12
+ text: string;
13
+ details: {
14
+ model: string;
15
+ tier: LlmTier;
16
+ structured: boolean;
17
+ };
18
+ }
19
+ /**
20
+ * Run a single stateless completion on behalf of an eval cell's `llm()` call.
21
+ * Returns a `{ text, details }` value shaped like a {@link callSessionTool}
22
+ * result so the existing bridge transport carries it to either runtime.
23
+ */
24
+ export declare function runEvalLlm(args: unknown, options: EvalLlmBridgeOptions): Promise<EvalLlmResult>;
25
+ export {};