v0.36.0

arkohut/pensievev0.36.0May 15, 2026by arkohut

AI Summary

Introduces HitViewerModal for browsing search results and makes the entity context page strictly temporal, with a full i18n pass.

Key Highlights

  • HitViewerModal allows browsing search results without leaving the page
  • Entity context page is now a pure time-strip view
  • Full i18n pass for modal labels, context pages, and keyboard shortcuts
  • Fix for `update_entity` overwriting plugin-written metadata

New Features

  • HitViewerModal for step-through search results
  • Temporal entity context page
  • Full internationalization support
  • Fix for plugin metadata persistence on entity updates
  • ContextNavigationBar timestamps now match toolbar local time

Full Release Notes

## Features

- HitViewerModal: browse search results in a modal instead of routing away by @arkohut
  - Clicking a search hit on the home page now opens it in a full-screen modal layered over the search results, so the underlying query, scroll position, and filters stay intact when you close it
  - ←/→ step through the hit list in list order (not by timestamp); the bottom floating cluster shows the kbd hints alongside an "Explore context" button that jumps to the full per-entity context page when you want temporal browsing
  - State is driven by a transient `open` search-param so links into a specific hit are shareable and the back button does the right thing
- Entity context page is now strictly temporal by @arkohut
  - Dropped the hit-list mixing inside `/entities/$id`; the context page is now a pure time-strip view, and hit-list navigation lives in HitViewerModal
  - Makes the two surfaces have one clear job each: modal for "next/previous result in this search", context page for "what was on screen around this moment"
- Full i18n pass on entity viewer and context strip by @arkohut
  - Modal labels, context-page labels, keyboard-shortcut hints, frames count, and the not-found state are all translated
  - "Explore context" button label and tooltip translated in both English and Chinese locales

## Bug Fixes

- `update_entity` no longer wipes plugin-written metadata by @arkohut
  - `update_entity` used to delete every metadata row and re-insert only what the payload carried, which meant any follow-up scan PUT would erase OCR, VLM, and structured-VLM outputs that plugins had written asynchronously
  - Switched to per-key upsert (mirroring `update_entity_metadata_entries`); plugin-status reset behaviour is unchanged
- ContextNavigationBar timestamps now match the toolbar's local time by @arkohut
  - API timestamps were being interpreted as local time, so the time-strip drifted from the toolbar's displayed time when the server was in UTC
  - Treat the timestamps as UTC and convert to local, so both surfaces agree

**Full Changelog**: https://github.com/arkohut/pensieve/compare/v0.35.1...v0.36.0

---

## 新特性

- HitViewerModal:在弹层中浏览搜索结果,不再跳转走 by @arkohut
  - 在首页点击搜索结果现在会在搜索页之上打开一个全屏弹层,关闭时下方的查询、滚动位置和筛选条件都保持原样
  - ←/→ 按搜索结果列表顺序(而非时间顺序)翻页;底部浮动控件区同时展示快捷键提示和"Explore context"按钮,点它会跳到 entity 上下文页用时间轴方式继续浏览
  - 用一个临时的 `open` search-param 驱动弹层状态,所以单条 hit 的链接可分享,浏览器的后退按钮也能正常工作
- Entity 上下文页改回纯时间轴 by @arkohut
  - 从 `/entities/$id` 中移除了 hit 列表混排,上下文页现在是纯粹的时间条视图,hit 列表导航全部交给 HitViewerModal
  - 两个界面职责清晰:弹层负责"上一条/下一条搜索结果",上下文页负责"这一时刻前后屏幕上是什么"
- entity viewer 和上下文条整体国际化 by @arkohut
  - 弹层标签、上下文页标签、快捷键提示、frames 数量、未找到状态都加上了翻译
  - "Explore context" 按钮文案和 tooltip 也补齐了中英文

## Bug 修复

- `update_entity` 不再覆盖插件写入的 metadata by @arkohut
  - 旧实现一遇到带 metadata 的 payload 就先删光所有 metadata 行再写回,这会导致后续一次 scan PUT 把 OCR、VLM、structured_vlm 等插件异步写入的元数据全部抹掉
  - 改为按 key upsert(与 `update_entity_metadata_entries` 行为一致);插件状态强制重置的逻辑保持不变
- ContextNavigationBar 的时间条和工具栏时间对齐 by @arkohut
  - 之前把 API 返回的时间当作本地时间解析,导致在 UTC 服务器上时间条会与工具栏显示时间错开
  - 现在统一按 UTC 解析再转本地,两边时间一致

**完整更新日志**: https://github.com/arkohut/pensieve/compare/v0.35.1...v0.36.0