DSH Math Notes Assistant

by 枫叶
5
4
3
2
1
Score: 53/100

Description

面向数学笔记的 DeepSeek Harness 助手,驻留在 Obsidian 右侧栏。可直接读写数学笔记,维护分层长期记忆(画像、主题、类型化记录、原始证据),按 Rethlas 风格证明工作流工作,内置个人定理索引与问题模板库,并能把关键想法捕捉到备忘录、主动提醒打磨。

Reviews

No reviews yet.

Stats

7
stars
197
downloads
1
forks
50
days
7
days
7
days
0
total PRs
0
open PRs
0
closed PRs
0
merged PRs
7
total issues
0
open issues
7
closed issues
313
commits

Latest Version

7 days ago

Changelog

[0.8.0] - 2026-09-27

本版主要包含三个方面:离线安装也装成真正的包(所以它出现在 dsh 的插件管理页里,并有了自己的名字与图标),安装器不再动你自己的配置(install --force 此前会整份覆盖 profile 的 patch 层与 package.json,实测吃掉过真实的模型配置),以及一批"静默失效"的修复(侧栏新建对话、会话记忆读旧格式日志、面板客户端半个装不上、回复里的记忆卡点不开、重载插件卡死端口)。另修掉一个会让插件完全起不来的配置损坏。⚠️ 拖拽引用仍不可用,详见下方说明。

⚠️ 拖拽引用在本版仍不可用,不要把它当成这个版本的新功能。下面 Added 里那一条只描述已经修好的那一半(客户端半个从未被加载),而"松手后草稿为空"这最后一环尚未判定。证据与下一步见 docs/drag-to-mention-progress-2026-09-25.md。

Added

  • 离线安装也装成真正的包,所以在 dsh 的插件管理页里可见了——此前只有 dsh plugin add 装的才在那一页里,从 Obsidian 侧栏或 install --direct 装的用平铺形态,看不到它。设置页的「安装时优先把本插件装成 dsh 的包」与命令行 --flat 可关掉;缺 dsh 或 pnpm 时自动回落到平铺并打印原因。
  • dsh 插件管理页里认得这个插件了:有自己的名字(中/英)和图标——此前那张卡片只显示包名、也没有图标,因为插件没声明 dsh 用来画卡片的那三样东西。
  • (半个修复,整体仍不可用)拖拽引用:客户端半个此前从未被加载,现在会加载了——此前连接收端都不在页面里,那一行被写进了一份插件每次起服务都会重写的文件。
    • ⚠️ 功能本身仍然不可用:接收端修好后实测页面确实收到了路径,但松手后草稿里依然是空的 ⇒ 断点在"收到之后那一步",尚未判定。本版加了自述诊断,下一次拖拽就能拿到答案。不要据本条宣称"拖拽能用了"。
    • 范围说明:目前只处理单篇笔记。多选拖拽、编辑器里选中文字拖进来都还没做;载荷认不出来时什么都不做,不会往草稿里塞奇怪的东西。
    • 这个问题在 dsh 升级到 0.1.7 之前就已存在,不是升级引入的回归。

Fixed

  • 同一个 --force 也不再吃掉 profile 的 package.json——那份清单里的 dsh.profile.bundles 正是你加 bundle 的地方,另外还有你的 dependencies / scripts。此前 install --force 会把它整份换成安装器的模板(实测你加的 bundle、依赖、scripts 与自定义字段全丢)。现在只在不存在时创建,已存在就原样保留并打一行 [keep],安装器只追加自己那一条依赖。顺带修掉:新建 profile 时清单里的 name 此前写死成 dsh-profile-notes-assistant(装进 web 也自称是那个 profile),现按 profile 目录命名。
  • 安装器改写你的 cordis.patch.yml 时不再把行尾弄乱——此前它按固定 \n 写回,遇到 Windows 的 CRLF 文件会写成混用行尾(实测一个文件从 9849 变成 9726 字符、79 处 CRLF + 123 处 LF)。现在按该文件自己的行尾写,LF 与 CRLF 都逐字节保持原样。
  • 安装插件不再吃掉你在 profile 里写的配置——install --force 此前会整份覆盖 profile 自己的 patch 层(<profile>/cordis.patch.yml,也就是你放自定义模型/provider 的地方),而 --force 本该只管"接管另一个通道装的 profile"。实测丢过一次真实的模型配置。现在那一层只在不存在时创建,已存在就原样保留(并在安装日志里说一行 [keep]);通道需要的声明增删仍照旧精确进行,不会碰你自己加的行。
  • 离线通道的两处收尾:卸载不再留下整份插件副本(造包用的暂存目录此前不跟着卸载走),安装结束的提示也会说清实际生效的通道(包化 / 回落平铺 + 原因),不再固定打印 Done (direct)。
  • 升级后 preset 的声明会跟着更新(此前不会)——上一版把它做成"只增不改",已装用户的声明永远停在旧文本。现在只替换生成的那一块,你自己加的行不受影响。
  • 适配 dsh 0.1.7:侧栏里的「新建对话」此前会直接失败——dsh 不再读取 .agent-presets/ 目录,preset 改为在组合包里声明,而上一版仍按旧机制装,于是每一次新建会话都失败(agent-preset/not-found,界面上表现为"点了没反应")。现按新机制声明,带漂移门禁。
  • 另外三条装法此前也是坏的:装进不叫 notes-assistant 的 profile、install --direct(此前根本不铺那些文件)、冷启动的第一次(刚 dsh plugin add 完必定失败,重启一次才好)。三条现在都有门禁。
  • 通道归属的判断不再依赖一个"看起来可以删掉"的目录——此前只认 ~/.dsh/.agent-presets/ 里的归属标记,而 dsh 0.1.7 起没有任何代码读它:谁把它当垃圾清掉,两条通道就会默默互相覆盖。现在归属从 profile 自己的安装清单读,旧标记只作兼容回退,uninstall 会清掉它。
  • 记忆面板的客户端半个此前装不上——缺了它自己需要的好几个文件,整包无法加载(ERR_MODULE_NOT_FOUND),而安装程序打印的是"包已就位"。现在按入口的依赖闭包整体安装。
  • 适配 dsh 0.1.7:会话记忆此前会一直读旧格式的日志——判据只认 .v3. 文件名,于是 V3/V4 并存时一直选旧的 V3:对话索引落后,而且新轮次不会再被保存进记忆。现在按世代号取最新(V4 > V3 > V2)。
  • 同一个 config.md 由两个界面创建时,内容现在一致了——两侧给的脚手架不同(面板写 autoArchive: false 并漏了 captureSubagents),而 autoArchive 是"体检自动归档低效用卡"的开关,所以这是行为差异:同一个 vault 的默认值取决于你先点了哪个界面。
  • "新建会话失败 / 每轮回复失败"的一个根被拔掉了:预设声明原本放在一份插件每次启动都会重写的文件里,插件一旧声明就被无声擦掉。
  • "AI 归纳"不再冒充你的立场:注入段里没有你确认过的痕迹时,标题会写明"其中含 AI 归纳,未经你逐条确认";体检的单源卡提示提到最前面(原本排最后,库一大就被截断吃掉,而它正是唯一防"误信"的一类)。
  • 记忆注入里现在能看到"证据分级":索引每行尾带 ✅(你确认过)/ ⚖️(与他处互证)/ ❓(单次来源),并写明 ❓ 不得当已核实事实引用。此前这套分级只在面板上显示,而实测里单源 AI 卡会排在你自己确认过的卡前面。
  • 记忆面板的报错不再误导——此前把"路由没挂"(404 + 空响应)显示成 SyntaxError: Unexpected end of JSON input;现在会报是哪一步失败,并带上服务端自己的错误文案。
  • 侧栏记忆面板不再报 forbidden: bad or missing token,且「笔记 vault」恢复成下拉选择。现在由插件代理在转发时带上 token,密钥不进 URL、不进页面 JS。
  • 修复「侧栏里每一轮回复都失败」——dsh 的插件清单请求扩展会解析每一行的归属清单,而我们的相对路径行落到 profile 自己的 package.json,那个文件有 name 却没 version,dsh 直接抛错。现在脚手架、安装器与插件引导都会补齐 version,已装的 profile 自动修复。
  • 面板客户端半个现在会被"声明"进 profile(此前只被拷进 node_modules)——dsh 的运行时解析图只认 profile package.json 里声明的依赖,缺声明会让它变成"激活但不在图里"的行。
  • 「重载插件」不再把 dsh 端口卡死——此前清理挂在"dsh 子进程还在跑"这个条件上,子进程失败或被结束后清理整段跳过,监听留在进程里再也绑不上(每秒重试 EADDRINUSE,只能退出 Obsidian)。现在卸载时无条件释放。
  • 皮肤中心不会再被挂载两遍——那个按钮会把皮肤包登记成 profile 的 bundle,而两个包自带挂载声明,插件此前还会再插一次。现在登记过就什么都不插。连带的:用过按钮之后,上面那个「挂载皮肤中心 UI」开关不再控制它。
  • 侧栏里的「皮肤中心」现在需要你点一次安装——此前插件每次启动都用目录链接把 web profile 的包镜像过来(本机 18 条)。皮肤中心 0.4.x 起不再需要镜像,而目录链接是这台机器那次 harness home 全损的疑似载体,全局守卫此后禁止建链接。现在设置页有一个按钮跑一次 dsh plugin add 真装进笔记 profile(需 pnpm/网络),失败会明确提示。
  • 插件现在会声明自己适配的 dsh 版本(>=0.1.7-rc.2)——dsh 的兼容性检查读的是 peerDependencies,而此前什么都没声明,等于"不检查"。
  • 一个会让插件完全起不来的配置损坏已修复——发布件里的 cordis.patch.yml 第一行被并进了注释,dsh 因此拒绝启动 notes-assistant。并新增门禁真的解析所有随包发出的配置文件。
  • 记忆:回复里引用的记忆卡现在真的能点开了——.deepseek/ 不在 vault 索引里,链接跳转交给编辑器 API 必然失败,而且是静默失败;提示词也从没给过"打开这张卡"的写法。现在改用插件内预览,并让卡标题写成可点击链接。
  • 拖拽引用此前在侧栏里从来没有生效过(提示条出现了,松手什么都不发生)——客户端半个的 loader 行被写进了插件每次起服务都会重写的文件,于是下次启动就被覆盖。
    • 同族的两个"假通过"也一起修了:安装器用"文件里出现过包名"这种子串检查判定成功;探针起实例时没传 --patch,那条断言长期为红(长期为红的断言等于没有断言)。现在判据是结构性的:loader 行在所有 patch 层里必须恰好出现一次(零次=静默失效,两次=整个 profile 起不来)。
  • ⚠️ (与开头那条 Added 是同一件事,这里只补证据) 修好接收端后实测确认它确实被加载了:页面里 window.__dshMentionInsert 存在,直接调用就能把 @路径 写进草稿;但松手后草稿仍然为空,断点在"收到之后那一步"。本版给落笔路径加了自述诊断(每次落笔记 step/命中元素/可编辑元素个数)。结论尚未取得,该功能仍属未完成。
    • 这个问题在 dsh 升级到 0.1.7 之前就存在,不是升级引入的回归。

Changed

  • 「数学笔记助手」这个 preset 的描述变短了——原来一整句把全部功能与实现细节都塞进去,在 preset 选择器里读起来很累。现在是一句:面向数学类笔记的最小 agent + 三件事。
  • 在 Obsidian 插件设置里改记忆开关,现在走服务端并会说清成功或失败——此前设置页进程内直写 vault 文件(无 token/来源校验,失败可能没声响),而面板走受守卫的路由:同一个动作两条路、两个信任边界。现在写入统一走路由,读取仍留在插件内。代价:改这些设置要求 dsh 服务在运行,服务没起来时会点名路由与原因。
  • npm test 的汇总现在区分「跳过」和「通过」——此前只按退出码统计,于是"全绿"里可能含着一条一条断言都没跑的门禁。现在逐个列出被跳过的门禁名与原因。
  • 记忆:notation(记号体系)也归「注入预算」档位管——此前写死 800 字符,档位旋钮对它无效。默认值仍是 800,不选档位的行为一字不变。
  • 笔记助手:找内容只用 note_recall,grep 退为"核对工具"——此前协议多处把 grep 写成可选的检索路径,于是模型在 note_recall 命中后仍改用全库 grep,绕开了 BM25 排序、hook 加权、验证等级与适用边界这些只有它才有的信号。现在写死分工:内容发现 = note_recall,grep 只用于核对已知道是哪个文件的原文,glob 只用于按路径找文件。
  • 整批 coverage 偏弱时会说清原因——此前一律标成"弱信号",容易让助手放弃检索改用 grep。现在整批都弱时提示"先读排第一的那篇全文核实"。
  • note_search 退役,按 tag 枚举并入 note_recall——它的三种用法里两种是重复的(tag 过滤与 note_recall 同一套实现;文本查找与 grep 重叠且更不精确)。笔记工具从 5 个变 4 个。

README file from

Github

DSH Math Notes Assistant (dsh-math-memory)

English · 简体中文

A long-term math-memory agent for DeepSeek Harness that lives inside Obsidian as a right-sidebar chat panel.

A two-component repository:

  1. Obsidian community plugin (id dsh-math-assistant, repo-root manifest.json + main.js): embeds dsh web in the right sidebar, detects and starts the dsh service, bootstraps the dsh-side configuration and vault templates on first run, and hosts the memory panel, capture-policy settings, and deterministic maintenance.
  2. dsh plugin (npm package dsh-math-memory, dsh/): installs the same notes-assistant agent preset / profile and vault templates into $DSH_HOME.

The three install paths (native bundle / --direct offline copy / Obsidian's embedded bootstrap) produce equivalent configuration, kept conflict-free by owner markers. Installing the Obsidian plugin alone is enough; the CLI dsh-math-memory install (and uninstall) covers headless use.

Why

Mathematics learning is long-horizon accumulation: notation habits, theoretical preferences, half-finished proofs, techniques, counterexamples, and ideas all need continuous collection and polishing into a connected system. Generic chat AI treats every conversation as isolated Q&A. This plugin gives the agent cross-session layered memory (five layers + a notation ledger + memo lifecycle), unified retrieval (notes + memory in one search), and a standing protocol (AGENTS.md) so each new session starts where the last one ended.

How far this project actually gets (and what 1.0 means)

Being explicit about the boundary matters more than listing features:

  • Solved: "the agent cannot remember what you asked." Raw evidence (episodes) is captured deterministically, typed atomic records carry source links, five indexed layers, unified retrieval (note_recall) in one pass, on-demand layer injection instead of dumping everything into context, plus a daily audit and a user feedback loop for deterministic upkeep. The cross-session remember / find / correct line works end to end.
  • Still far off: "helping you polish a body of mathematical understanding, and building a system for invoking that understanding and your techniques." What is stored today is what you asked and what was concluded, not where your understanding stands, where it stalls, and what to practice next. The technique layer has storage and retrieval but no invocation system (when to use which card, how to judge its applicability boundary, what to switch to after a failure, how several techniques compose), and there is no active teaching loop (diagnose → hint → check → review as a long-term record) or review scheduling.
  • Therefore: 1.0 is the release that actually delivers the second line. Today's 0.7.x is a prototype: the memory substrate is usable and the control surface is visible and correctable, but the "learning partner" goal is still a design generation away — see docs/handoff.md §7 and docs/memory/assessment.md for the gap list and ordering.

Features

Retrieval (v3: unified entry, coarse-filter + careful-read)

  • note_recall unified search: one BM25-ranked pass over user notes AND all memory layers (hook-weighted cards, memos, topics, theorem/episode indexes); unicode-dash normalization and CJK char containment bridge word-form gaps; hits carry a coverage indicator (query-token coverage; <0.35 marks a lexical-coincidence weak signal).
  • Read-verify protocol: distilled query (challenge + candidate techniques) → read the top 2-3 hits in full and judge each → on empty/weak results reformulate once → then admit "not in the vault" instead of fabricating; bounded at 2 recalls and 3 full reads per turn.
  • Navigation-only injection: the system prompt carries only the navigation layers (profile/notation/topics/records/templates/episodes); content is pulled on demand; the injected section has a hard total cap (≤18000 chars; per-layer budgets in docs/memory/design.md §3).
  • Supporting tools: note_strategy (method layer for proof/construction problems), note_links (backlinks / link-following), note_create (refuses to overwrite). Tag enumeration lives in note_recall (pass tag, omit query): notes carrying that tag, newest first, no relevance score. note_search was retired — one content-discovery entry, not three.

Memory (five layers + maintenance loop)

  • Five layers: profile (semantic) / topics (navigation) / records (typed atomic cards with retrieval hook: blocks and verification levels ✅⚖️❓) / episodes (raw evidence, append-only) / inbox (idea memos, inbox→polishing→done).
  • Notation system: memory/notation.md with adopted/candidates/rejected tables and a revision history — collect → unify → maintain; the agent proposes unifications when your notation drifts (observes first when you have no stable habit yet).
  • Daily audit: deterministic scan for strong/weak/unused/duplicate-candidate/unverified cards plus structural checks (missing source / broken links / missing index rows); recall hits sync back into uses/success_rate.
  • Memo reminders: stale (inbox>7d, polishing>3d) or currently-relevant memos surface for polishing, ranked by relevance × recency.
  • Capture policy tiers: idea/fact/preference/structure × auto/ask/off — one gate per memory layer (ideas → inbox, facts → records, preferences → profile/notation, structure → topics/theorem index/templates/strategy). Pick them in the plugin settings or by clicking the 「捕获策略」 line in either memory panel (both write back to capture-policy.md); auto-tier writes are announced in the closing line, ask-tier proposals state what/why/where.
  • Cross-session context: past dsh sessions (zstd JSONL) distilled into bounded Q&A cues, vault-filtered and excluding the live session.

Control surface (Obsidian side)

  • Memory panel: a one-line status strip (profile/records/templates/topics/theorems/strategy/memos/episodes + last audit); a ⚠️ needs-you block that puts the audit's re-review / archive suggestions next to the working archive button; all five card layers in one searchable list (title/topic/type/operator); per-card ✅ confirm / ❌ wrong / stale / archive (archive asks twice) with a plain-language receipt; an episode timeline with human titles + topics (8 rows, expandable); a Chinese audit summary with the model-facing checklist folded away; edit-and-save in the panel (mtime conflict guard).
  • Feedback loop: 依据的记忆:<card title> — [✅ 这条对] [❌ 这张卡有错] links in replies deterministically rewrite cards through the loopback /feedback endpoint (CSRF-token protected); note references are clickable and jump into Obsidian (/open).
  • Reply-quality protocol: intuition before formalism, anchoring new material to your existing notes, difficulty adaptation, Socratic correction, low-frequency check questions.
  • No @linxin666 UI plugins mounted by default (independence): the profile bundles dsh-web-app for the embedded chat UI, but mounts none of the UI plugin family that the dsh-web-all aggregate brings in (skin center / task board / SSH / aionui panel / git-graph / pet / live-stats, etc.) by default — so it has no @linxin666 UI packages to resolve and boots cleanly with or without a web profile. The skin center (skin picker + background transparency) can be optionally enabled from the plugin settings, and that now needs those two packages to be really installed into the notebook profile: one explicit button in the settings runs dsh plugin add for them (pnpm/network; ~1.9 MB with their runtime dependencies). Until then the toggle stays inert — a row naming a package that cannot resolve would not boot this profile. The plugin therefore creates no directory links any more: the junction mirror that used to make this implicit was retired on 2026-09-26, and skin bodies no longer depend on a global cordis.patch.yml insert at all (skin center 0.4.x stopped rewriting that file). Note what that install action implies: dsh plugin add registers the two packages as profile bundles, and each ships its own mount declaration — so once installed they stay mounted and the skin-center toggle no longer controls them (the plugin detects that and inserts nothing, instead of duplicating the rows). If the machine's web profile carries the @linxin666/dsh-web-all aggregate, the toggle is functionally redundant — the aggregate already ships its own skin-center row.

Safety (fail-closed)

  • Tool surface: file read/write/search + four note tools (note_recall / note_strategy / note_create / note_links) + ask_user; no shell, no web, no subagents, no delete tools. No @linxin666 UI plugins are mounted — the profile keeps the minimal agent tool surface.
  • Writes confined to the vault (workspace-write); interactive escalation prompts disabled (approval: never); DSH_PERMISSION_MODE=danger-full-access only re-enables escalation prompts, the sandbox itself stays workspace-write.
  • All memory lives as markdown inside the vault; archiving instead of deleting; the model may not edit policy or statistics fields.

Requirements

  • Obsidian desktop; Node.js ≥ 22.5; DeepSeek Harness (npm global @deepseek-ai/dsh, requires ≥ 0.1.7-rc.2 — this release adapts to 0.1.7's preset-declaration mechanism, see docs/dsh-0.1.7-adaptation.md; the session-format-V3 adaptation is in docs/dsh-0.1.5-adaptation.md); a configured DeepSeek model.
  • Default port 3180 (coexists with the regular dsh web on 3080; configurable in settings).

Install

A (recommended): install it from the community plugin browser — "Settings → Community plugins → Browse" and search DSH Math Notes Assistant — or download main.js / manifest.json / styles.css from the latest release into <vault>/.obsidian/plugins/dsh-math-assistant/. First run auto-detects dsh, initializes preset/profile/templates, and starts the service.

On the store: the listing is live at community.obsidian.md/plugins/dsh-math-assistant. Updates follow the store and the plugin manager once a release exists whose tag equals the manifest.json version; no manual file replacement is needed. docs/release.md owns the release procedure.

B (CLI):

npm install -g dsh-math-memory
dsh-math-memory install --vault "<path-to-your-vault>"
dsh --profile notes-assistant --port 3180                  # start (native: the bundle provides panel/workspace, no --patch needed)

Plugin settings: port, dsh install dir, DSH_HOME, auto-start, auto-init, auto-archive (>90-day episodes), ribbon button, keep-alive on close, the skin-center toggle (advanced; the aggregate bundle already carries a skin center), sidebar performance mode (default on: the loopback proxy drops the skin's expensive effects and slows the two hot loops in the skin's client hook script — the measured cause of the sidebar stutter), sidebar skin decorations (default on; turn it off to skip the skin's client script entirely — smoothest, at the cost of the hero scene / status character), and the capture-policy dropdowns. Measurements and the full cause list: docs/memory/sidebar-performance.md.

Full guide — installation model, conflict resolution (owner markers / --force takeover), and uninstall (three-tier deletion, --purge-data confirm phrase) — in docs/installation.md.

Vault layout

vault/
  AGENTS.md                       working protocol (auto-loaded)
  .deepseek/
    memory/profile.md             semantic layer (profile)
    memory/notation.md            notation ledger (collect → unify → maintain)
    memory/topics/                navigation layer
    memory/records/               typed atomic cards (+ hook blocks)
    memory/theorems/              personal theorem index (Matlas-style)
    memory/templates/             problem-template ↔ theorem graph
    memory/episodes/              raw evidence (append-only + archive/)
    inbox/                        idea memos
    capture-policy.md             capture policy (user-maintained)
    cache/                        machine-generated caches (do not edit)

Development & quality

npm test          # syntax + 427 zero-token regression checks + 62 route-level checks + 8 real-dsh handshake checks + 32 loopback-proxy checks + installer e2e (drift detection)
npm run qa        # engine probe: 12 ground-truth recall assertions + reachability layering / pooling A/B on the real vault (zero tokens)
npm run qa:e2e    # real-session end-to-end acceptance (spends real tokens; reports API-level usage)
node scripts/build-obsidian.mjs   # rebuild main.js (required after shared-file changes)
node scripts/deploy-local.mjs     # one-shot local deployment
  • Repository structure: ARCHITECTURE.md — directory responsibilities, the two-component data flow, the memory↔retrieval boundary, and the feature checklist.
  • Memory knowledge base: docs/memory/ — design (implementation spec), retrieval-v3 (retrieval proposal + §7 GraphMemix intake decisions and A/B measurements), testing (QA methodology), assessment, references (paper notes), sidebar-performance (why the Obsidian panel was janky and what was measured), changelog, handoff.
  • Host-version adaptation: docs/dsh-0.1.5-adaptation.md — evidence, fix list, and the reasons for what was deliberately left alone under dsh 0.1.5-rc.1 / session format V3 / [email protected].
  • Acceptance record: both probes call the SHIPPED ranking pipeline (buildRecallDoc / rankRecallDocuments / rankStrategyCards) instead of re-deriving it — seed probe 8/8 on the synthetic vault, engine probe 12/12 on the real vault (navigation indices are demoted, so the "library has no answer → weak signal" control holds). The engine probe additionally prints GraphMemix-style reachability layering (Direct / Recoverable / No access) and a signed net-recovery Δ for the bag-vs-multi-view A/B, plus target ranks — the measurement that kept multi-view max-pooling out of the default path (docs/memory/retrieval-v3.md §7.2). The real-session E2E suite covers 5 cases (including the no-answer honesty and reformulate-retry behaviors).
  • Version: 0.8.0 (prototype stage; the memory architecture has no long-term field testing yet and will keep evolving).

Privacy & safety

Everything runs locally: the service binds 127.0.0.1, memory is markdown inside the vault, and the past-session index never leaves the machine.

License

MIT