Files
云服务部-叶林立 312bb2ba5a feat(pi-hermes-memory): 导入上游 v0.9.10 源码快照
从官方 Git 仓库导入 chandra447/pi-hermes-memory 在 tag v0.9.10
(df624056a2e8c68bc89ba0a81e1c120856ec9665,2026-10-02)的源码快照。
本次仅导入源码,尚未接入组合包:package.json、加载顺序、依赖与权限策略
均未改动。

- 原样导入 src/、tests/、docs/、scripts/、README、CHANGELOG、PLAN、
  AGENTS 与 LICENSE;该快照共 156 个上游文件。
- 剔除嵌套 .git、上游 .github 工作流、.ralph/、.claude/、node_modules、
  覆盖率与构建产物。
- 新增中文 UPSTREAM.md,记录来源,以及启用前必须完成的待决事项:
  在 pi-compaction 之前注册加载顺序、better-sqlite3 版本与根 allowScripts
  对齐、strip-ansi 解析确认。
- 说明选择 tag 而非 main 的原因:导入时上游 main 已领先至
  24fcd8ad26fc27badb8d7dbaf8034645de07b893(2026-10-11),选 tag 是为
  对应一个已发布、可复现的版本。

尚未接线。启用前还需反转 tests/extension-load.test.ts 中"不得加载
Hermes"的断言,并同步 pi-tool-search 分组、权限策略与文档。

验证:快照 156 个上游文件全部导入,目录内仅多出 UPSTREAM.md 一份;
已确认与上游 main 内容存在差异,证明取的是 tag 而非 main。
2026-10-13 23:19:35 -07:00

111 lines
5.3 KiB
Markdown

# v0.7 Tasks: Token-Aware Graph-Based Memory Retrieval
## Status Legend
- `[ ]` Not started
- `[~]` In progress
- `[x]` Done
## Epic 1: Stop Prompt Bloat
Done when full Markdown memory is no longer injected by default.
- [x] `src/types.ts` — add `memoryMode: "policy-only" | "legacy-inject"`
- [x] `src/config.ts` — parse `memoryMode` with `policy-only` default
- [x] `src/constants.ts` — add expanded `MEMORY_POLICY_PROMPT` with accepted targets/categories
- [x] `src/index.ts` — replace full memory block injection with memory policy by default
- [x] Legacy compatibility — support `memoryMode: "legacy-inject"` for old behavior
- [x] `/memory-preview-context` — show policy-only prompt in default mode and full blocks in legacy mode
- [x] Tests — system prompt contains policy only in retrieval mode
- [x] Tests — legacy mode still injects current blocks
## Epic 2: Memory Router
Future phase. Do not start until policy-only mode is shipped and measured.
- [ ] `src/handlers/memory-router.ts` — inspect user message, recent context, project, repo/tool/error signals
- [ ] Router rules — retrieve for prior-context phrases, repo tasks, failures, preferences, conventions
- [ ] Router rules — skip generic explanation and one-off examples
- [ ] Query builder — produce compact search query from message + signals
- [ ] Debug record — persist last router decision in memory for `/memory-debug-last`
- [ ] Tests — retrieve/skip decisions for representative coding and generic prompts
## Epic 3: Memory Ranking + Packing
Future phase. Depends on a working runtime injection hook and router.
- [ ] `src/store/memory-ranker.ts` — score candidates by FTS relevance, project match, category, recency, confidence
- [ ] `src/store/memory-eligibility.ts` — exclude wrong-scope, stale, superseded, low-confidence, and irrelevant memories
- [ ] `src/store/memory-pack.ts` — build `<retrieved-memory security="untrusted-context">` block
- [ ] Read-time scanner — run `scanContent()` or equivalent before injection
- [ ] Token estimate helper — approximate budget with chars/4 and hard cap
- [ ] Tests — ranking favors project corrections/failures/conventions
- [ ] Tests — packer respects `maxRetrievedTokens`
## Epic 4: Runtime Injection
Future phase. Do not start until the policy-only default proves insufficient.
- [ ] Identify Pi hook/API for per-turn context injection or closest supported equivalent
- [ ] `src/index.ts` — wire router/search/ranker/packer into the selected hook
- [ ] No-memory path — inject nothing when router skips retrieval
- [ ] Retrieved-memory path — inject small block when router finds eligible memories
- [ ] Tests — no retrieved block for generic prompt
- [ ] Tests — retrieved block appears for project/debugging prompt
## Epic 5: SQLite Graph Tables
Done when graph relationships exist in SQLite and can boost retrieval.
- [ ] `src/store/schema.ts` — add `memory_nodes`, `memory_edges`, `memory_node_links`
- [ ] `src/store/memory-graph-store.ts` — CRUD for nodes, edges, memory links
- [ ] `src/store/memory-graph-extractor.ts` — extract project/file/tool/error/decision/failure entities from memory text
- [ ] Sync path — link new/updated memories to graph nodes
- [ ] Graph lookup — retrieve 1-2 hop related memory IDs for current turn signals
- [ ] Ranking integration — add `graph_distance_score`
- [ ] Tests — graph tables migrate cleanly
- [ ] Tests — graph-linked memory outranks unrelated FTS match
## Epic 6: Conflict + Staleness
Done when stale or conflicting memory is not blindly injected.
- [ ] Schema migration — add `confidence`, `status`, `supersedes_id`, `valid_from`, `valid_to`, `last_accessed_at`, `access_count`
- [ ] `src/store/memory-conflict-detector.ts` — mark superseded/conflicting memories where deterministic
- [ ] Update write path — support status/confidence updates
- [ ] Update search path — exclude `superseded` and expired rows by default
- [ ] Tests — superseded memory is not injected
- [ ] Tests — current project evidence wins over memory conflict
## Epic 7: Debug Commands
Done when users can see what memory did and why.
- [ ] `/memory-status` — mode, config, DB counts, prompt injection mode
- [ ] `/memory-debug-last` — router decision, query, candidates, injected count, skipped reasons, token estimate
- [ ] `/memory-graph-status` — graph backend, nodes, edges, links, traversal depth
- [ ] `/memory-doctor` — stale schema, FTS consistency, orphan graph links, oversized prompt warnings
- [ ] Tests — commands render useful output with empty and populated DBs
## Epic 8: Documentation + Release
- [ ] README — document policy-only mode and legacy mode
- [ ] README — add memory policy and retrieved-memory examples
- [ ] ROADMAP — mark frozen full injection as legacy, not the future default
- [ ] Migration notes — explain how Markdown remains readable/syncable
- [ ] `npm run check`
- [ ] `npm test`
- [ ] Version bump
- [ ] Tag release
## Implementation Order
1. Epic 1 — remove token tax first.
2. Epic 2 — route retrieval cheaply.
3. Epic 3 — rank/filter/pack safely.
4. Epic 4 — wire runtime injection.
5. Epic 7 — expose behavior for debugging.
6. Epic 5 — add graph booster after baseline retrieval works.
7. Epic 6 — harden conflict/staleness.
8. Epic 8 — docs and release.