城南有一家老医馆,坐堂的是位看了四十年病的老先生。
医馆后头有一间卷宗房,一排排木柜,每个病人、每桩旧事都立着一份自己的卷宗——这家人三代的体质、那位主顾忌讳什么药、某种怪症当年是怎么治好的,一桩一卷,各归各位,从不混写在一处。柜子门口挂着一本薄薄的《目录册》,每份卷宗在册上只占一行:写明卷名,再缀一句话点出里头讲的是什么。老先生进门头一件事,就是把这本目录册顺手揣进袖中——它太薄,随身带着不碍事,要紧的是一眼能扫到底。
来了病人,坐下说症状。老先生一边搭脉问诊,手上不停;真正跑腿的,是他身边那个话不多的学徒。学徒听着病人的诉说,转身钻进卷宗房,先翻那本目录册,照着病人嘴里的几个字眼,把"一看就对得上"的几份卷宗挑出来——拿不准的、似是而非的,一律不碰,宁缺毋滥,至多挑五份。挑出来也不整本搬,只把每份卷宗的头一页誊抄一份;誊到一页满了就停笔,末尾添一句"后文还长,要细看请取原卷"。誊好的纸页上,但凡是几个月前写下的旧案,学徒都要再贴一张小笺:"此案记于四十七日前,人事已迁,未必如今仍准,请对照当下脉象核过再用。"
最见功夫的是分寸。学徒誊抄从不让老先生干等——抄好了,就趁老先生问诊的空隙轻轻搁到案头;若一时还没抄完,老先生便照常看他的病,绝不停下来催,学徒下一个空当再补上就是。已经搁在案头的卷宗,他不会再誊第二遍;案头纸页堆到一定厚度,他索性就不再往后房跑了——该上手的旧案都已在眼前。还有一条:老先生此刻正用着的那具脉枕,它的"使用说明"那一卷,学徒是断不会去取的——人家手里正使着呢,递说明书纯属添乱;可若那卷里记的是"此枕有暗伤、某种脉象会读偏",学徒立马取来,正在用,才正是要紧的时候。
卷宗房还有一条铁规:卷宗只能存在这间屋里。谁要往里塞一份,管事的先顺着纸去摸——若这"卷宗"其实是一根纸捻子,顺着一抽竟通到隔壁别家的屋子里去,哪怕那头还是空的、连张纸都没有,也当场扣下不收。屋里的东西,只准是屋里的东西。
让这家医馆四十年口碑不坠的,从来不是老先生记性多好,而是后头这套"把过往一桩桩写成卷宗、来人时由学徒照目录挑出最相关几页、誊抄截断、贴上时效小笺、悄悄搁到案头而从不让人空等"的章法。
先猜揭晓前,先押一个猜测 · 你觉得这讲的是?
谜底 · The Concept
File-based memory and relevance recall — the always-present index plus a per-turn Sonnet ranker
Context Management · 上下文管理
中文速览 · Quick read
File-based memory in Claude Code is a persistent store of Markdown files living under a project-scoped directory — ~/.claude/projects/<sanitized-git-root>/memory/, resolved by getAutoMemPath() (claude-code/src/memdir/paths.ts:223), overridable via an env var or settings. Each memory is its own .md file with frontmatter, classified into a four-type taxonomy — user / feedback / project / reference (claude-code/src/memdir/memoryTypes.ts:14) — capturing only context not derivable from the current project state. A single MEMORY.md at the directory root is not a memory but an index: one line per topic file (claude-code/src/memdir/memdir.ts:227).
There are two distinct reading paths. At system-prompt build time, loadMemoryPrompt() (claude-code/src/memdir/memdir.ts:419) injects the behavioral instructions (via buildMemoryLines, claude-code/src/memdir/memdir.ts:199) and — for the agent-memory builder — the MEMORY.md index itself, read synchronously and truncated (claude-code/src/memdir/memdir.ts:272). That index is the袖中目录册: always present, deliberately small. The second path is relevance recall: on each user turn, a secondary Claude model reads the directory's file headers and selects the handful most relevant to what the user just asked, and those files are injected as system-reminder attachments. This page reads that second path.
On each user turn, startRelevantMemoryPrefetch (claude-code/src/utils/attachments.ts:2361) kicks off the recall as a non-blocking async prefetch — but only if auto-memory is enabled and the tengu_moth_copse flag is on (claude-code/src/utils/attachments.ts:2367), the prompt contains more than one word (claude-code/src/utils/attachments.ts:2379), and the session hasn't already blown its cumulative byte budget (claude-code/src/utils/attachments.ts:2384). The work happens inside findRelevantMemories (claude-code/src/memdir/findRelevantMemories.ts:39): it calls scanMemoryFiles (claude-code/src/memdir/memoryScan.ts:35), which reads every .md recursively (claude-code/src/memdir/memoryScan.ts:40) except MEMORY.md (claude-code/src/memdir/memoryScan.ts:42), extracts each file's frontmatter from the first 30 lines (claude-code/src/memdir/memoryScan.ts:51), sorts newest-first by mtime (claude-code/src/memdir/memoryScan.ts:72), and caps at 200 files (claude-code/src/memdir/memoryScan.ts:73). The result is a MemoryHeader[] (claude-code/src/memdir/memoryScan.ts:13).
These headers become a text manifest (claude-code/src/memdir/memoryScan.ts:84) handed to selectRelevantMemories (claude-code/src/memdir/findRelevantMemories.ts:77) — the 学徒. It issues a sideQuery to a Sonnet model (claude-code/src/memdir/findRelevantMemories.ts:98) with max_tokens: 256 and a JSON-schema output (claude-code/src/memdir/findRelevantMemories.ts:108), under a system prompt instructing it to pick at most five files it is certain will help, and to skip reference/API docs for tools the model is already using successfully (claude-code/src/memdir/findRelevantMemories.ts:18, claude-code/src/memdir/findRelevantMemories.ts:23). Crucially, the returned filenames are filtered against the set actually present in the manifest (claude-code/src/memdir/findRelevantMemories.ts:83, claude-code/src/memdir/findRelevantMemories.ts:130) — a hallucinated or malformed selection silently collapses to empty rather than reaching for a nonexistent file.
The selected paths flow to getRelevantMemoryAttachments (claude-code/src/utils/attachments.ts:2196), which drops anything the model already read via FileReadTool or surfaced on a prior turn (claude-code/src/utils/attachments.ts:2233) and slices to the final five (claude-code/src/utils/attachments.ts:2234). Then readMemoriesForSurfacing (claude-code/src/utils/attachments.ts:2279) reads each file through readFileInRange capped at 200 lines and 4096 bytes with truncateOnByteLimit (claude-code/src/utils/attachments.ts:2294; constants at claude-code/src/utils/attachments.ts:269 and claude-code/src/utils/attachments.ts:277), appending a "this file was truncated — use FileReadTool to see the rest" note when cut (claude-code/src/utils/attachments.ts:2305) — the誊抄截断与"取原卷"小笺. Each gets a header: for memories older than a day, memoryHeader prepends a staleness caveat (claude-code/src/utils/attachments.ts:2327) built by memoryFreshnessText (claude-code/src/memdir/memoryAge.ts:33), whose age is floor-rounded and clamped at zero (claude-code/src/memdir/memoryAge.ts:7) because models reason about "47 days ago" but not raw timestamps (claude-code/src/memdir/memoryAge.ts:15).
The prefetch is bound in query.ts with the using keyword (claude-code/src/query.ts:301). At the post-tools collect point, the loop consumes the result only if it has already settled — otherwise it skips with zero wait and retries next iteration (claude-code/src/query.ts:1599); settledAt is stamped by a .finally() (claude-code/src/utils/attachments.ts:2420), and [Symbol.dispose] aborts any in-flight request on every generator exit path (claude-code/src/utils/attachments.ts:2410). When consumed, the relevant_memories attachment (claude-code/src/utils/attachments.ts:500) is rendered by wrapping each memory in a <system-reminder> (claude-code/src/utils/messages.ts:3708, via claude-code/src/utils/messages.ts:3101) — the quiet placing of copied pages on the desk.
Two design tensions are resolved here. First, capacity vs. relevance: you cannot load an entire growing memory directory into every prompt, but you also cannot guess in advance which memory a given turn needs. The split — a tiny always-present index in the system prompt plus a per-turn LLM ranker over file headers — lets the store grow without inflating the prompt, spending a cheap Sonnet call to pick the few files worth their tokens. Bytes are bounded at three levels: 5 files × 4 KB per turn (claude-code/src/utils/attachments.ts:277), a 200-line/4096-byte per-file cap (claude-code/src/utils/attachments.ts:269), and a 60 KB session-total budget that gates off prefetching once exceeded (claude-code/src/utils/attachments.ts:288) — naturally reset by compaction, since collectSurfacedMemories recomputes from the live transcript (claude-code/src/utils/attachments.ts:2251).
Second, latency vs. correctness. Recall must never make the user wait, so it runs as a prefetch chained to the turn's abort controller (claude-code/src/utils/attachments.ts:2390) and is consumed only when ready (claude-code/src/query.ts:1599) — the 学徒 slips pages onto the desk in the master's pauses, never freezing the consultation. And because a memory is a point-in-time observation, not live state, every stale file carries a freshness caveat (claude-code/src/memdir/memoryAge.ts:33), reinforced by the drift guidance baked into the system prompt (claude-code/src/memdir/memoryTypes.ts:201) — the medical record's "verify against the current pulse before prescribing." The recentTools suppression (claude-code/src/memdir/findRelevantMemories.ts:23, fed by claude-code/src/utils/attachments.ts:2465) is the same instinct: don't hand the doctor the manual for the instrument already in his hand — but do hand over its known defects. Finally, because memory is files on disk that the model can be told to write, the team-memory write path resolves symlinks on the deepest existing ancestor and rejects any path escaping the directory (claude-code/src/memdir/teamMemPaths.ts:228, claude-code/src/memdir/teamMemPaths.ts:241, claude-code/src/memdir/teamMemPaths.ts:249), even rejecting dangling symlinks via lstat (claude-code/src/memdir/teamMemPaths.ts:136) — the rule that a filed record may not secretly be a paper-chain leading out of the room. The read-time path has its own traversal guard in isAutoMemPath (claude-code/src/memdir/paths.ts:274).
- The two-stage shape: index load at
loadMemoryPrompt(claude-code/src/memdir/memdir.ts:419) andbuildMemoryPrompt(claude-code/src/memdir/memdir.ts:272); recall atfindRelevantMemories(claude-code/src/memdir/findRelevantMemories.ts:39). - The ranker:
scanMemoryFiles(claude-code/src/memdir/memoryScan.ts:35) →selectRelevantMemoriescalling Sonnet (claude-code/src/memdir/findRelevantMemories.ts:77, claude-code/src/memdir/findRelevantMemories.ts:98) → validity filter (claude-code/src/memdir/findRelevantMemories.ts:130). - Surfacing: dedup + slice (claude-code/src/utils/attachments.ts:2196), truncation (claude-code/src/utils/attachments.ts:2279), staleness header (claude-code/src/utils/attachments.ts:2327, claude-code/src/memdir/memoryAge.ts:33), and
system-reminderinjection (claude-code/src/utils/messages.ts:3708). - The non-blocking machinery: prefetch start (claude-code/src/utils/attachments.ts:2361),
using-bound handle (claude-code/src/query.ts:301), settle-or-skip collect (claude-code/src/query.ts:1599). - The guardrails: byte budgets (claude-code/src/utils/attachments.ts:269, claude-code/src/utils/attachments.ts:277, claude-code/src/utils/attachments.ts:288) and symlink-escape rejection (claude-code/src/memdir/teamMemPaths.ts:228, claude-code/src/memdir/teamMemPaths.ts:136).
classDiagram
class startRelevantMemoryPrefetch {
<<non-blocking, using-bound>>
+start()
+settledAt
}
class findRelevantMemories {
+scan()
+select()
}
class scanMemoryFiles {
+readMdRecursive()
+skipMEMORYmd()
+sortMtime cap200
}
class MemoryHeader {
+path
+frontmatter
+mtime
}
class selectRelevantMemories {
<<Sonnet sideQuery>>
+max5 jsonSchema
+filterToRealFiles()
}
class getRelevantMemoryAttachments {
+dedupAlreadyRead()
+truncate200lines4096B()
+freshnessHeader()
}
startRelevantMemoryPrefetch ..> findRelevantMemories : prefetch
findRelevantMemories ..> scanMemoryFiles : index
scanMemoryFiles ..> MemoryHeader : produces
findRelevantMemories ..> selectRelevantMemories : rank
findRelevantMemories ..> getRelevantMemoryAttachments : surface 读法:每轮 startRelevantMemoryPrefetch 非阻塞预取(attachments.ts:2361),
using 绑定、settle-or-skip(query.ts:301,1599)。scanMemoryFiles 递归读 .md、
跳过 MEMORY.md、按 mtime 排序封顶 200(memoryScan.ts:35-73)。
selectRelevantMemories 用 Sonnet sideQuery 选至多 5 个并校验真实存在
(findRelevantMemories.ts:77,130)。surfacing 去重、截断 200 行/4096B、加陈旧度抬头
并裹进 <system-reminder>(attachments.ts:2196-2327,messages.ts:3708)。
八份记忆常年存在磁盘上;开机时只有一本薄薄的 MEMORY.md 目录册被钉进上下文。 选一句这一轮的提问,再跑一轮召回——看 Sonnet 学徒照册挑出最相关的几份(至多 5), 誊抄截断、贴上时效小笺,悄悄搁进右侧上下文。换一句问题,同一面书架会召回另一批:存得全,取得少。
先选一句提问。也可以先点几张你猜会被召回的卡(打★),跑完再对照 Sonnet 的排名。
选一句提问,再「跑一轮召回」。
这正是基于文件的记忆 + 相关性召回:记忆全量留在磁盘,只有目录册常驻系统提示;
每一轮由 Sonnet 选择器照册挑出至多 5 份最相关的,誊抄截断(200 行 / 4096 B)、给隔夜旧案贴上
时效小笺、与已在上下文者去重,再裹进 system-reminder 搁上案头。
会话字节超过 60KB,预取整个关闭;压缩之后预算自磁盘上的实情重新算起。
What it is
File-based memory in Claude Code is a persistent store of Markdown files living under a project-scoped directory — ~/.claude/projects/<sanitized-git-root>/memory/, resolved by getAutoMemPath() (claude-code/src/memdir/paths.ts:223), overridable via an env var or settings. Each memory is its own .md file with frontmatter, classified into a four-type taxonomy — user / feedback / project / reference (claude-code/src/memdir/memoryTypes.ts:14) — capturing only context not derivable from the current project state. A single MEMORY.md at the directory root is not a memory but an index: one line per topic file (claude-code/src/memdir/memdir.ts:227).
There are two distinct reading paths. At system-prompt build time, loadMemoryPrompt() (claude-code/src/memdir/memdir.ts:419) injects the behavioral instructions (via buildMemoryLines, claude-code/src/memdir/memdir.ts:199) and — for the agent-memory builder — the MEMORY.md index itself, read synchronously and truncated (claude-code/src/memdir/memdir.ts:272). That index is the袖中目录册: always present, deliberately small. The second path is relevance recall: on each user turn, a secondary Claude model reads the directory's file headers and selects the handful most relevant to what the user just asked, and those files are injected as system-reminder attachments. This page reads that second path.
How it works
On each user turn, startRelevantMemoryPrefetch (claude-code/src/utils/attachments.ts:2361) kicks off the recall as a non-blocking async prefetch — but only if auto-memory is enabled and the tengu_moth_copse flag is on (claude-code/src/utils/attachments.ts:2367), the prompt contains more than one word (claude-code/src/utils/attachments.ts:2379), and the session hasn't already blown its cumulative byte budget (claude-code/src/utils/attachments.ts:2384). The work happens inside findRelevantMemories (claude-code/src/memdir/findRelevantMemories.ts:39): it calls scanMemoryFiles (claude-code/src/memdir/memoryScan.ts:35), which reads every .md recursively (claude-code/src/memdir/memoryScan.ts:40) except MEMORY.md (claude-code/src/memdir/memoryScan.ts:42), extracts each file's frontmatter from the first 30 lines (claude-code/src/memdir/memoryScan.ts:51), sorts newest-first by mtime (claude-code/src/memdir/memoryScan.ts:72), and caps at 200 files (claude-code/src/memdir/memoryScan.ts:73). The result is a MemoryHeader[] (claude-code/src/memdir/memoryScan.ts:13).
These headers become a text manifest (claude-code/src/memdir/memoryScan.ts:84) handed to selectRelevantMemories (claude-code/src/memdir/findRelevantMemories.ts:77) — the 学徒. It issues a sideQuery to a Sonnet model (claude-code/src/memdir/findRelevantMemories.ts:98) with max_tokens: 256 and a JSON-schema output (claude-code/src/memdir/findRelevantMemories.ts:108), under a system prompt instructing it to pick at most five files it is certain will help, and to skip reference/API docs for tools the model is already using successfully (claude-code/src/memdir/findRelevantMemories.ts:18, claude-code/src/memdir/findRelevantMemories.ts:23). Crucially, the returned filenames are filtered against the set actually present in the manifest (claude-code/src/memdir/findRelevantMemories.ts:83, claude-code/src/memdir/findRelevantMemories.ts:130) — a hallucinated or malformed selection silently collapses to empty rather than reaching for a nonexistent file.
The selected paths flow to getRelevantMemoryAttachments (claude-code/src/utils/attachments.ts:2196), which drops anything the model already read via FileReadTool or surfaced on a prior turn (claude-code/src/utils/attachments.ts:2233) and slices to the final five (claude-code/src/utils/attachments.ts:2234). Then readMemoriesForSurfacing (claude-code/src/utils/attachments.ts:2279) reads each file through readFileInRange capped at 200 lines and 4096 bytes with truncateOnByteLimit (claude-code/src/utils/attachments.ts:2294; constants at claude-code/src/utils/attachments.ts:269 and claude-code/src/utils/attachments.ts:277), appending a "this file was truncated — use FileReadTool to see the rest" note when cut (claude-code/src/utils/attachments.ts:2305) — the誊抄截断与"取原卷"小笺. Each gets a header: for memories older than a day, memoryHeader prepends a staleness caveat (claude-code/src/utils/attachments.ts:2327) built by memoryFreshnessText (claude-code/src/memdir/memoryAge.ts:33), whose age is floor-rounded and clamped at zero (claude-code/src/memdir/memoryAge.ts:7) because models reason about "47 days ago" but not raw timestamps (claude-code/src/memdir/memoryAge.ts:15).
The prefetch is bound in query.ts with the using keyword (claude-code/src/query.ts:301). At the post-tools collect point, the loop consumes the result only if it has already settled — otherwise it skips with zero wait and retries next iteration (claude-code/src/query.ts:1599); settledAt is stamped by a .finally() (claude-code/src/utils/attachments.ts:2420), and [Symbol.dispose] aborts any in-flight request on every generator exit path (claude-code/src/utils/attachments.ts:2410). When consumed, the relevant_memories attachment (claude-code/src/utils/attachments.ts:500) is rendered by wrapping each memory in a <system-reminder> (claude-code/src/utils/messages.ts:3708, via claude-code/src/utils/messages.ts:3101) — the quiet placing of copied pages on the desk.
Why it matters
Two design tensions are resolved here. First, capacity vs. relevance: you cannot load an entire growing memory directory into every prompt, but you also cannot guess in advance which memory a given turn needs. The split — a tiny always-present index in the system prompt plus a per-turn LLM ranker over file headers — lets the store grow without inflating the prompt, spending a cheap Sonnet call to pick the few files worth their tokens. Bytes are bounded at three levels: 5 files × 4 KB per turn (claude-code/src/utils/attachments.ts:277), a 200-line/4096-byte per-file cap (claude-code/src/utils/attachments.ts:269), and a 60 KB session-total budget that gates off prefetching once exceeded (claude-code/src/utils/attachments.ts:288) — naturally reset by compaction, since collectSurfacedMemories recomputes from the live transcript (claude-code/src/utils/attachments.ts:2251).
Second, latency vs. correctness. Recall must never make the user wait, so it runs as a prefetch chained to the turn's abort controller (claude-code/src/utils/attachments.ts:2390) and is consumed only when ready (claude-code/src/query.ts:1599) — the 学徒 slips pages onto the desk in the master's pauses, never freezing the consultation. And because a memory is a point-in-time observation, not live state, every stale file carries a freshness caveat (claude-code/src/memdir/memoryAge.ts:33), reinforced by the drift guidance baked into the system prompt (claude-code/src/memdir/memoryTypes.ts:201) — the medical record's "verify against the current pulse before prescribing." The recentTools suppression (claude-code/src/memdir/findRelevantMemories.ts:23, fed by claude-code/src/utils/attachments.ts:2465) is the same instinct: don't hand the doctor the manual for the instrument already in his hand — but do hand over its known defects. Finally, because memory is files on disk that the model can be told to write, the team-memory write path resolves symlinks on the deepest existing ancestor and rejects any path escaping the directory (claude-code/src/memdir/teamMemPaths.ts:228, claude-code/src/memdir/teamMemPaths.ts:241, claude-code/src/memdir/teamMemPaths.ts:249), even rejecting dangling symlinks via lstat (claude-code/src/memdir/teamMemPaths.ts:136) — the rule that a filed record may not secretly be a paper-chain leading out of the room. The read-time path has its own traversal guard in isAutoMemPath (claude-code/src/memdir/paths.ts:274).
Read the source
- The two-stage shape: index load at
loadMemoryPrompt(claude-code/src/memdir/memdir.ts:419) andbuildMemoryPrompt(claude-code/src/memdir/memdir.ts:272); recall atfindRelevantMemories(claude-code/src/memdir/findRelevantMemories.ts:39). - The ranker:
scanMemoryFiles(claude-code/src/memdir/memoryScan.ts:35) →selectRelevantMemoriescalling Sonnet (claude-code/src/memdir/findRelevantMemories.ts:77, claude-code/src/memdir/findRelevantMemories.ts:98) → validity filter (claude-code/src/memdir/findRelevantMemories.ts:130). - Surfacing: dedup + slice (claude-code/src/utils/attachments.ts:2196), truncation (claude-code/src/utils/attachments.ts:2279), staleness header (claude-code/src/utils/attachments.ts:2327, claude-code/src/memdir/memoryAge.ts:33), and
system-reminderinjection (claude-code/src/utils/messages.ts:3708). - The non-blocking machinery: prefetch start (claude-code/src/utils/attachments.ts:2361),
using-bound handle (claude-code/src/query.ts:301), settle-or-skip collect (claude-code/src/query.ts:1599). - The guardrails: byte budgets (claude-code/src/utils/attachments.ts:269, claude-code/src/utils/attachments.ts:277, claude-code/src/utils/attachments.ts:288) and symlink-escape rejection (claude-code/src/memdir/teamMemPaths.ts:228, claude-code/src/memdir/teamMemPaths.ts:136).
来源 · Source citations
- [1]
claude-code/src/memdir/paths.ts:223 - [2]
claude-code/src/memdir/paths.ts:274 - [3]
claude-code/src/memdir/memoryTypes.ts:14 - [4]
claude-code/src/memdir/memoryTypes.ts:201 - [5]
claude-code/src/memdir/memdir.ts:227 - [6]
claude-code/src/memdir/memdir.ts:419 - [7]
claude-code/src/memdir/memdir.ts:199 - [8]
claude-code/src/memdir/memdir.ts:272 - [9]
claude-code/src/utils/attachments.ts:2361 - [10]
claude-code/src/utils/attachments.ts:2367 - [11]
claude-code/src/utils/attachments.ts:2379 - [12]
claude-code/src/utils/attachments.ts:2384 - [13]
claude-code/src/utils/attachments.ts:2390 - [14]
claude-code/src/utils/attachments.ts:2410 - [15]
claude-code/src/utils/attachments.ts:2420 - [16]
claude-code/src/utils/attachments.ts:2196 - [17]
claude-code/src/utils/attachments.ts:2233 - [18]
claude-code/src/utils/attachments.ts:2234 - [19]
claude-code/src/utils/attachments.ts:2279 - [20]
claude-code/src/utils/attachments.ts:2294 - [21]
claude-code/src/utils/attachments.ts:2305 - [22]
claude-code/src/utils/attachments.ts:2327 - [23]
claude-code/src/utils/attachments.ts:2251 - [24]
claude-code/src/utils/attachments.ts:269 - [25]
claude-code/src/utils/attachments.ts:277 - [26]
claude-code/src/utils/attachments.ts:288 - [27]
claude-code/src/utils/attachments.ts:500 - [28]
claude-code/src/utils/attachments.ts:2465 - [29]
claude-code/src/memdir/findRelevantMemories.ts:39 - [30]
claude-code/src/memdir/findRelevantMemories.ts:77 - [31]
claude-code/src/memdir/findRelevantMemories.ts:98 - [32]
claude-code/src/memdir/findRelevantMemories.ts:108 - [33]
claude-code/src/memdir/findRelevantMemories.ts:18 - [34]
claude-code/src/memdir/findRelevantMemories.ts:23 - [35]
claude-code/src/memdir/findRelevantMemories.ts:83 - [36]
claude-code/src/memdir/findRelevantMemories.ts:130 - [37]
claude-code/src/memdir/memoryScan.ts:35 - [38]
claude-code/src/memdir/memoryScan.ts:40 - [39]
claude-code/src/memdir/memoryScan.ts:42 - [40]
claude-code/src/memdir/memoryScan.ts:51 - [41]
claude-code/src/memdir/memoryScan.ts:72 - [42]
claude-code/src/memdir/memoryScan.ts:73 - [43]
claude-code/src/memdir/memoryScan.ts:13 - [44]
claude-code/src/memdir/memoryScan.ts:84 - [45]
claude-code/src/memdir/memoryAge.ts:7 - [46]
claude-code/src/memdir/memoryAge.ts:15 - [47]
claude-code/src/memdir/memoryAge.ts:33 - [48]
claude-code/src/query.ts:301 - [49]
claude-code/src/query.ts:1599 - [50]
claude-code/src/utils/messages.ts:3101 - [51]
claude-code/src/utils/messages.ts:3708 - [52]
claude-code/src/memdir/teamMemPaths.ts:228 - [53]
claude-code/src/memdir/teamMemPaths.ts:241 - [54]
claude-code/src/memdir/teamMemPaths.ts:249 - [55]
claude-code/src/memdir/teamMemPaths.ts:136