@namzu/cli 26.3.0 → 27.0.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 (321) hide show
  1. package/CHANGELOG.md +214 -0
  2. package/README.md +49 -34
  3. package/dist/bin.js +7 -0
  4. package/dist/bin.js.map +1 -1
  5. package/dist/checkpoints/store.d.ts +17 -4
  6. package/dist/checkpoints/store.d.ts.map +1 -1
  7. package/dist/checkpoints/store.js +20 -5
  8. package/dist/checkpoints/store.js.map +1 -1
  9. package/dist/cli.js +2 -2
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/acp.d.ts +23 -1
  12. package/dist/commands/acp.d.ts.map +1 -1
  13. package/dist/commands/acp.js +41 -2
  14. package/dist/commands/acp.js.map +1 -1
  15. package/dist/commands/drain.d.ts +69 -2
  16. package/dist/commands/drain.d.ts.map +1 -1
  17. package/dist/commands/drain.js +214 -134
  18. package/dist/commands/drain.js.map +1 -1
  19. package/dist/commands/eval.js +1 -1
  20. package/dist/commands/eval.js.map +1 -1
  21. package/dist/commands/provider-wait.d.ts +5 -5
  22. package/dist/commands/provider-wait.d.ts.map +1 -1
  23. package/dist/commands/provider-wait.js +2 -2
  24. package/dist/commands/resident.d.ts.map +1 -1
  25. package/dist/commands/resident.js +2 -1
  26. package/dist/commands/resident.js.map +1 -1
  27. package/dist/commands/run-flags.d.ts +7 -7
  28. package/dist/commands/run-flags.js +4 -4
  29. package/dist/commands/run-stream.d.ts +16 -12
  30. package/dist/commands/run-stream.d.ts.map +1 -1
  31. package/dist/commands/run-stream.js +142 -98
  32. package/dist/commands/run-stream.js.map +1 -1
  33. package/dist/commands/run.d.ts +6 -4
  34. package/dist/commands/run.d.ts.map +1 -1
  35. package/dist/commands/run.js +129 -45
  36. package/dist/commands/run.js.map +1 -1
  37. package/dist/commands/serve.js +2 -2
  38. package/dist/commands/serve.js.map +1 -1
  39. package/dist/commands/state.js +8 -8
  40. package/dist/commands/state.js.map +1 -1
  41. package/dist/config/load.d.ts +1 -1
  42. package/dist/config/load.d.ts.map +1 -1
  43. package/dist/config/load.js +17 -5
  44. package/dist/config/load.js.map +1 -1
  45. package/dist/config/run-limits.d.ts +20 -8
  46. package/dist/config/run-limits.d.ts.map +1 -1
  47. package/dist/config/run-limits.js +28 -46
  48. package/dist/config/run-limits.js.map +1 -1
  49. package/dist/config/schema.d.ts +44 -19
  50. package/dist/config/schema.d.ts.map +1 -1
  51. package/dist/config/schema.js.map +1 -1
  52. package/dist/config/tool-result-screens.js +1 -1
  53. package/dist/context/directories.d.ts +37 -0
  54. package/dist/context/directories.d.ts.map +1 -0
  55. package/dist/context/directories.js +69 -0
  56. package/dist/context/directories.js.map +1 -0
  57. package/dist/context/environment.d.ts +55 -0
  58. package/dist/context/environment.d.ts.map +1 -1
  59. package/dist/context/environment.js +96 -0
  60. package/dist/context/environment.js.map +1 -1
  61. package/dist/context/project-tracker.d.ts +3 -3
  62. package/dist/context/project-tracker.d.ts.map +1 -1
  63. package/dist/context/project-tracker.js +3 -3
  64. package/dist/context/project-tracker.js.map +1 -1
  65. package/dist/context/project.d.ts +1 -1
  66. package/dist/context/project.js +1 -1
  67. package/dist/context/sandbox.d.ts +22 -3
  68. package/dist/context/sandbox.d.ts.map +1 -1
  69. package/dist/context/sandbox.js +42 -4
  70. package/dist/context/sandbox.js.map +1 -1
  71. package/dist/doctor/checks/chain.d.ts +1 -1
  72. package/dist/doctor/checks/chain.js +5 -5
  73. package/dist/doctor/checks/chain.js.map +1 -1
  74. package/dist/doctor/checks/invariants.d.ts +2 -2
  75. package/dist/doctor/checks/invariants.js +5 -5
  76. package/dist/doctor/checks/invariants.js.map +1 -1
  77. package/dist/doctor/checks/logging.js +1 -1
  78. package/dist/doctor/checks/logging.js.map +1 -1
  79. package/dist/doctor/checks/sandbox.js +1 -1
  80. package/dist/doctor/checks/sandbox.js.map +1 -1
  81. package/dist/doctor/checks/session-export.d.ts +1 -1
  82. package/dist/doctor/checks/session-export.js +2 -2
  83. package/dist/doctor/checks/session-export.js.map +1 -1
  84. package/dist/doctor/checks/telemetry.d.ts +1 -1
  85. package/dist/doctor/checks/telemetry.js +1 -1
  86. package/dist/doctor/registry.js +2 -2
  87. package/dist/doctor/registry.js.map +1 -1
  88. package/dist/exit-codes.d.ts +2 -2
  89. package/dist/exit-codes.js +2 -2
  90. package/dist/integrations/mcp/servers.d.ts +1 -1
  91. package/dist/integrations/providers/chain-capabilities.d.ts +6 -6
  92. package/dist/integrations/providers/chain-capabilities.js +8 -8
  93. package/dist/integrations/providers/chain-capabilities.js.map +1 -1
  94. package/dist/integrations/providers/register.d.ts +1 -1
  95. package/dist/integrations/providers/register.js +1 -1
  96. package/dist/integrations/providers/registry.d.ts +1 -1
  97. package/dist/integrations/resident/inspection.d.ts +4 -1
  98. package/dist/integrations/resident/inspection.d.ts.map +1 -1
  99. package/dist/integrations/resident/inspection.js +53 -34
  100. package/dist/integrations/resident/inspection.js.map +1 -1
  101. package/dist/integrations/resident/learning-storage.d.ts +7 -2
  102. package/dist/integrations/resident/learning-storage.d.ts.map +1 -1
  103. package/dist/integrations/resident/learning-storage.js +12 -8
  104. package/dist/integrations/resident/learning-storage.js.map +1 -1
  105. package/dist/integrations/resident/runner-store.d.ts +1 -1
  106. package/dist/integrations/resident/runner-store.d.ts.map +1 -1
  107. package/dist/integrations/resident/runner-store.js +5 -2
  108. package/dist/integrations/resident/runner-store.js.map +1 -1
  109. package/dist/integrations/resident/runner-worker.js +1 -0
  110. package/dist/integrations/resident/runner-worker.js.map +1 -1
  111. package/dist/integrations/resident/session-log-reads.d.ts +37 -0
  112. package/dist/integrations/resident/session-log-reads.d.ts.map +1 -0
  113. package/dist/integrations/resident/session-log-reads.js +125 -0
  114. package/dist/integrations/resident/session-log-reads.js.map +1 -0
  115. package/dist/integrations/resident/session-step.d.ts +2 -0
  116. package/dist/integrations/resident/session-step.d.ts.map +1 -1
  117. package/dist/integrations/resident/session-step.js +15 -13
  118. package/dist/integrations/resident/session-step.js.map +1 -1
  119. package/dist/integrations/resident/storage.d.ts +23 -1
  120. package/dist/integrations/resident/storage.d.ts.map +1 -1
  121. package/dist/integrations/resident/storage.js +60 -17
  122. package/dist/integrations/resident/storage.js.map +1 -1
  123. package/dist/integrations/resident/tool-evidence.d.ts +4 -2
  124. package/dist/integrations/resident/tool-evidence.d.ts.map +1 -1
  125. package/dist/integrations/resident/tool-evidence.js +36 -30
  126. package/dist/integrations/resident/tool-evidence.js.map +1 -1
  127. package/dist/integrations/resident/verification.d.ts +2 -2
  128. package/dist/integrations/resident/verification.d.ts.map +1 -1
  129. package/dist/integrations/resident/verification.js +4 -4
  130. package/dist/integrations/resident/verification.js.map +1 -1
  131. package/dist/integrations/sessions/checkpoint-view.d.ts +13 -0
  132. package/dist/integrations/sessions/checkpoint-view.d.ts.map +1 -0
  133. package/dist/integrations/sessions/checkpoint-view.js +48 -0
  134. package/dist/integrations/sessions/checkpoint-view.js.map +1 -0
  135. package/dist/integrations/sessions/context-inventory.js +1 -1
  136. package/dist/integrations/sessions/context-inventory.js.map +1 -1
  137. package/dist/integrations/sessions/conversation-search.d.ts +16 -20
  138. package/dist/integrations/sessions/conversation-search.d.ts.map +1 -1
  139. package/dist/integrations/sessions/conversation-search.js +305 -731
  140. package/dist/integrations/sessions/conversation-search.js.map +1 -1
  141. package/dist/integrations/sessions/evidence-page-validation.d.ts +4 -4
  142. package/dist/integrations/sessions/evidence-page-validation.d.ts.map +1 -1
  143. package/dist/integrations/sessions/evidence-page-validation.js +1 -1
  144. package/dist/integrations/sessions/evidence-page-validation.js.map +1 -1
  145. package/dist/integrations/sessions/evidence-recall.d.ts +40 -2
  146. package/dist/integrations/sessions/evidence-recall.d.ts.map +1 -1
  147. package/dist/integrations/sessions/evidence-recall.js +41 -97
  148. package/dist/integrations/sessions/evidence-recall.js.map +1 -1
  149. package/dist/integrations/sessions/store.d.ts +153 -85
  150. package/dist/integrations/sessions/store.d.ts.map +1 -1
  151. package/dist/integrations/sessions/store.js +414 -484
  152. package/dist/integrations/sessions/store.js.map +1 -1
  153. package/dist/integrations/sessions/task-context.d.ts +15 -2
  154. package/dist/integrations/sessions/task-context.d.ts.map +1 -1
  155. package/dist/integrations/sessions/task-context.js +34 -11
  156. package/dist/integrations/sessions/task-context.js.map +1 -1
  157. package/dist/integrations/sessions/transcript-export.d.ts +13 -6
  158. package/dist/integrations/sessions/transcript-export.d.ts.map +1 -1
  159. package/dist/integrations/sessions/transcript-export.js +148 -263
  160. package/dist/integrations/sessions/transcript-export.js.map +1 -1
  161. package/dist/integrations/state/home.d.ts +4 -16
  162. package/dist/integrations/state/home.d.ts.map +1 -1
  163. package/dist/integrations/state/home.js +6 -42
  164. package/dist/integrations/state/home.js.map +1 -1
  165. package/dist/integrations/state/project.d.ts +6 -7
  166. package/dist/integrations/state/project.d.ts.map +1 -1
  167. package/dist/integrations/state/project.js +7 -9
  168. package/dist/integrations/state/project.js.map +1 -1
  169. package/dist/integrations/state/report.d.ts +27 -41
  170. package/dist/integrations/state/report.d.ts.map +1 -1
  171. package/dist/integrations/state/report.js +172 -464
  172. package/dist/integrations/state/report.js.map +1 -1
  173. package/dist/integrations/state/retention.d.ts +18 -0
  174. package/dist/integrations/state/retention.d.ts.map +1 -0
  175. package/dist/integrations/state/retention.js +18 -0
  176. package/dist/integrations/state/retention.js.map +1 -0
  177. package/dist/integrations/subagents/activity.d.ts +36 -31
  178. package/dist/integrations/subagents/activity.d.ts.map +1 -1
  179. package/dist/integrations/subagents/activity.js +27 -23
  180. package/dist/integrations/subagents/activity.js.map +1 -1
  181. package/dist/integrations/subagents/batches.d.ts +91 -0
  182. package/dist/integrations/subagents/batches.d.ts.map +1 -0
  183. package/dist/integrations/subagents/batches.js +172 -0
  184. package/dist/integrations/subagents/batches.js.map +1 -0
  185. package/dist/integrations/subagents/parent.d.ts +26 -11
  186. package/dist/integrations/subagents/parent.d.ts.map +1 -1
  187. package/dist/integrations/subagents/parent.js +13 -28
  188. package/dist/integrations/subagents/parent.js.map +1 -1
  189. package/dist/integrations/subagents/policy.d.ts +2 -2
  190. package/dist/integrations/subagents/policy.d.ts.map +1 -1
  191. package/dist/integrations/subagents/policy.js +2 -2
  192. package/dist/integrations/subagents/policy.js.map +1 -1
  193. package/dist/integrations/subagents/replay.d.ts +91 -26
  194. package/dist/integrations/subagents/replay.d.ts.map +1 -1
  195. package/dist/integrations/subagents/replay.js +216 -114
  196. package/dist/integrations/subagents/replay.js.map +1 -1
  197. package/dist/integrations/subagents/runtime.d.ts +50 -26
  198. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  199. package/dist/integrations/subagents/runtime.js +132 -126
  200. package/dist/integrations/subagents/runtime.js.map +1 -1
  201. package/dist/integrations/subagents/saved-agents.d.ts +57 -0
  202. package/dist/integrations/subagents/saved-agents.d.ts.map +1 -0
  203. package/dist/integrations/subagents/saved-agents.js +102 -0
  204. package/dist/integrations/subagents/saved-agents.js.map +1 -0
  205. package/dist/integrations/subagents/slash.d.ts +55 -0
  206. package/dist/integrations/subagents/slash.d.ts.map +1 -0
  207. package/dist/integrations/subagents/slash.js +45 -0
  208. package/dist/integrations/subagents/slash.js.map +1 -0
  209. package/dist/integrations/telemetry/session-export.d.ts +6 -6
  210. package/dist/integrations/telemetry/session-export.d.ts.map +1 -1
  211. package/dist/integrations/telemetry/session-export.js +2 -2
  212. package/dist/memory/presentation.d.ts +11 -0
  213. package/dist/memory/presentation.d.ts.map +1 -1
  214. package/dist/memory/presentation.js +25 -0
  215. package/dist/memory/presentation.js.map +1 -1
  216. package/dist/memory/store.d.ts +13 -7
  217. package/dist/memory/store.d.ts.map +1 -1
  218. package/dist/memory/store.js +37 -11
  219. package/dist/memory/store.js.map +1 -1
  220. package/dist/memory/typed.d.ts +116 -0
  221. package/dist/memory/typed.d.ts.map +1 -0
  222. package/dist/memory/typed.js +336 -0
  223. package/dist/memory/typed.js.map +1 -0
  224. package/dist/permissions/checks.d.ts +1 -1
  225. package/dist/permissions/checks.js +1 -1
  226. package/dist/permissions/headless-trust.d.ts +2 -2
  227. package/dist/permissions/headless-trust.d.ts.map +1 -1
  228. package/dist/permissions/headless-trust.js +3 -3
  229. package/dist/permissions/headless-trust.js.map +1 -1
  230. package/dist/permissions/mode.d.ts +4 -4
  231. package/dist/permissions/mode.js +1 -1
  232. package/dist/permissions/rules.d.ts +1 -1
  233. package/dist/permissions/rules.js +1 -1
  234. package/dist/termination.d.ts +75 -0
  235. package/dist/termination.d.ts.map +1 -0
  236. package/dist/termination.js +143 -0
  237. package/dist/termination.js.map +1 -0
  238. package/dist/tui/AgentExplorer.d.ts +2 -2
  239. package/dist/tui/AgentExplorer.js +4 -4
  240. package/dist/tui/AgentExplorer.js.map +1 -1
  241. package/dist/tui/App.d.ts +9 -1
  242. package/dist/tui/App.d.ts.map +1 -1
  243. package/dist/tui/App.js +452 -303
  244. package/dist/tui/App.js.map +1 -1
  245. package/dist/tui/LiveActivity.d.ts +1 -1
  246. package/dist/tui/LiveActivity.d.ts.map +1 -1
  247. package/dist/tui/PermissionOverlay.d.ts +8 -0
  248. package/dist/tui/PermissionOverlay.d.ts.map +1 -1
  249. package/dist/tui/PermissionOverlay.js +25 -2
  250. package/dist/tui/PermissionOverlay.js.map +1 -1
  251. package/dist/tui/Picker.js +1 -1
  252. package/dist/tui/agent.d.ts +208 -132
  253. package/dist/tui/agent.d.ts.map +1 -1
  254. package/dist/tui/agent.js +523 -313
  255. package/dist/tui/agent.js.map +1 -1
  256. package/dist/tui/conversation-evidence-view.js +3 -3
  257. package/dist/tui/conversation-evidence-view.js.map +1 -1
  258. package/dist/tui/conversation-history.d.ts +4 -21
  259. package/dist/tui/conversation-history.d.ts.map +1 -1
  260. package/dist/tui/conversation-history.js +4 -28
  261. package/dist/tui/conversation-history.js.map +1 -1
  262. package/dist/tui/index.d.ts.map +1 -1
  263. package/dist/tui/index.js +27 -1
  264. package/dist/tui/index.js.map +1 -1
  265. package/dist/tui/log-pane.js +1 -1
  266. package/dist/tui/markdownParser.d.ts +1 -1
  267. package/dist/tui/markdownParser.js +1 -1
  268. package/dist/tui/permission-review.d.ts +16 -0
  269. package/dist/tui/permission-review.d.ts.map +1 -1
  270. package/dist/tui/permission-review.js +25 -2
  271. package/dist/tui/permission-review.js.map +1 -1
  272. package/dist/tui/slashCommands.d.ts +29 -40
  273. package/dist/tui/slashCommands.d.ts.map +1 -1
  274. package/dist/tui/slashCommands.js +70 -61
  275. package/dist/tui/slashCommands.js.map +1 -1
  276. package/dist/tui/{run-interruption.d.ts → turn-interruption.d.ts} +4 -4
  277. package/dist/tui/turn-interruption.d.ts.map +1 -0
  278. package/dist/tui/{run-interruption.js → turn-interruption.js} +20 -20
  279. package/dist/tui/turn-interruption.js.map +1 -0
  280. package/dist/tui/turn-limits-settings.d.ts +39 -0
  281. package/dist/tui/turn-limits-settings.d.ts.map +1 -0
  282. package/dist/tui/{run-limits-settings.js → turn-limits-settings.js} +18 -18
  283. package/dist/tui/turn-limits-settings.js.map +1 -0
  284. package/dist/tui/types.d.ts +3 -3
  285. package/dist/tui/types.d.ts.map +1 -1
  286. package/dist/user-commands/store.d.ts +1 -1
  287. package/dist/user-commands/store.js +1 -1
  288. package/package.json +7 -7
  289. package/dist/integrations/sessions/compaction-evidence.d.ts +0 -5
  290. package/dist/integrations/sessions/compaction-evidence.d.ts.map +0 -1
  291. package/dist/integrations/sessions/compaction-evidence.js +0 -59
  292. package/dist/integrations/sessions/compaction-evidence.js.map +0 -1
  293. package/dist/integrations/sessions/database.d.ts +0 -5
  294. package/dist/integrations/sessions/database.d.ts.map +0 -1
  295. package/dist/integrations/sessions/database.js +0 -34
  296. package/dist/integrations/sessions/database.js.map +0 -1
  297. package/dist/integrations/sessions/paths.d.ts +0 -7
  298. package/dist/integrations/sessions/paths.d.ts.map +0 -1
  299. package/dist/integrations/sessions/paths.js +0 -14
  300. package/dist/integrations/sessions/paths.js.map +0 -1
  301. package/dist/integrations/sessions/run-discovery.d.ts +0 -24
  302. package/dist/integrations/sessions/run-discovery.d.ts.map +0 -1
  303. package/dist/integrations/sessions/run-discovery.js +0 -142
  304. package/dist/integrations/sessions/run-discovery.js.map +0 -1
  305. package/dist/integrations/sessions/turn-evidence.d.ts +0 -129
  306. package/dist/integrations/sessions/turn-evidence.d.ts.map +0 -1
  307. package/dist/integrations/sessions/turn-evidence.js +0 -517
  308. package/dist/integrations/sessions/turn-evidence.js.map +0 -1
  309. package/dist/integrations/subagents/history.d.ts +0 -26
  310. package/dist/integrations/subagents/history.d.ts.map +0 -1
  311. package/dist/integrations/subagents/history.js +0 -76
  312. package/dist/integrations/subagents/history.js.map +0 -1
  313. package/dist/integrations/subagents/runs.d.ts +0 -72
  314. package/dist/integrations/subagents/runs.d.ts.map +0 -1
  315. package/dist/integrations/subagents/runs.js +0 -155
  316. package/dist/integrations/subagents/runs.js.map +0 -1
  317. package/dist/tui/run-interruption.d.ts.map +0 -1
  318. package/dist/tui/run-interruption.js.map +0 -1
  319. package/dist/tui/run-limits-settings.d.ts +0 -39
  320. package/dist/tui/run-limits-settings.d.ts.map +0 -1
  321. package/dist/tui/run-limits-settings.js.map +0 -1
@@ -4,20 +4,24 @@
4
4
  * Two scopes, three files:
5
5
  * - `~/.namzu/USER.md` — who the operator is. User scope.
6
6
  * - `~/.namzu/MEMORY.md` — facts that hold in every project. User scope.
7
- * - `<project>/.namzu/MEMORY.md` — facts about this repository. Project scope,
8
- * and the default target of `#note` and `/memory <text>`: a note typed while
9
- * working in a repository is almost always about that repository, and a
10
- * memory that follows the operator into every other project is the rarer
11
- * thing, asked for with `--user`.
7
+ * - `<project>/.namzu/MEMORY.md` — facts about this repository, written by the
8
+ * operator. Project scope. It used to be where `#note` appended; those
9
+ * bullets stay. `/memory import-notes` copies them into stored memory
10
+ * (`importCuratedNotes`) without changing the file, and a launch only
11
+ * offers it (`migrateMemoryOnce`).
12
12
  *
13
13
  * Each section is capped before injection. A memory file grows for months;
14
14
  * an uncapped one would spend the context every turn on the part nobody
15
15
  * curated. The cap keeps the head, says how much it left out, and the fix is
16
16
  * to edit the file — which is the whole point of a curated memory.
17
17
  *
18
- * Separate from the kernel's memory store (`save_memory` / `search_memory`),
19
- * which holds structured records retrieved by tools or bounded automatic recall.
18
+ * Separate from stored memory (`memory/typed.ts`): typed Markdown files the
19
+ * kernel's memory tools search and update, whose generated index the prompt
20
+ * carries under its own heading. `#note` and `/memory add` write there now;
21
+ * `/memory --user add` still appends to the user file here, because stored
22
+ * memory belongs to one project.
20
23
  */
24
+ import { type MemoryLocation } from './io.js';
21
25
  export { MEMORY_FILE_MAX_BYTES } from './io.js';
22
26
  /** Characters of one section injected before the rest is left to the file. */
23
27
  export declare const MEMORY_SECTION_MAX_CHARS = 8000;
@@ -38,6 +42,8 @@ export interface MemoryContent {
38
42
  readonly project: string | null;
39
43
  readonly diagnostics?: readonly MemoryDiagnostic[];
40
44
  }
45
+ /** The project's curated file and the root it must resolve within. */
46
+ export declare function projectMemoryLocation(cwd: string): MemoryLocation;
41
47
  /** Read bounded, valid UTF-8 files; distinguish missing/empty files from refused content. */
42
48
  export declare function readMemory(home?: string, cwd?: string): MemoryContent;
43
49
  export declare function composeMemoryPrompt(content: MemoryContent): string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAUH,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAE/C,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,OAAQ,CAAA;AAE7C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,CAAA;AAE5C,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYzD;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAClD;AAOD,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,aAAa,CA8BrE;AAaD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAezE;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,sCAAsC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,kBAAkB,GAAG,MAAM,CAEvF;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAA;CAClC;AAED,wBAAgB,sBAAsB,CACrC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GAAG,kBAAkB,GAClC,kBAAkB,CAqBpB"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAQH,OAAO,EAAE,KAAK,cAAc,EAAuD,MAAM,SAAS,CAAA;AAElG,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAE/C,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,OAAQ,CAAA;AAE7C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,CAAA;AAE5C,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYzD;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAClD;AAED,sEAAsE;AACtE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAEjE;AAOD,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,aAAa,CAkCrE;AAyBD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAsBzE;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,sCAAsC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,kBAAkB,GAAG,MAAM,CAEvF;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAA;CAClC;AAED,wBAAgB,sBAAsB,CACrC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GAAG,kBAAkB,GAClC,kBAAkB,CAqBpB"}
@@ -4,19 +4,22 @@
4
4
  * Two scopes, three files:
5
5
  * - `~/.namzu/USER.md` — who the operator is. User scope.
6
6
  * - `~/.namzu/MEMORY.md` — facts that hold in every project. User scope.
7
- * - `<project>/.namzu/MEMORY.md` — facts about this repository. Project scope,
8
- * and the default target of `#note` and `/memory <text>`: a note typed while
9
- * working in a repository is almost always about that repository, and a
10
- * memory that follows the operator into every other project is the rarer
11
- * thing, asked for with `--user`.
7
+ * - `<project>/.namzu/MEMORY.md` — facts about this repository, written by the
8
+ * operator. Project scope. It used to be where `#note` appended; those
9
+ * bullets stay. `/memory import-notes` copies them into stored memory
10
+ * (`importCuratedNotes`) without changing the file, and a launch only
11
+ * offers it (`migrateMemoryOnce`).
12
12
  *
13
13
  * Each section is capped before injection. A memory file grows for months;
14
14
  * an uncapped one would spend the context every turn on the part nobody
15
15
  * curated. The cap keeps the head, says how much it left out, and the fix is
16
16
  * to edit the file — which is the whole point of a curated memory.
17
17
  *
18
- * Separate from the kernel's memory store (`save_memory` / `search_memory`),
19
- * which holds structured records retrieved by tools or bounded automatic recall.
18
+ * Separate from stored memory (`memory/typed.ts`): typed Markdown files the
19
+ * kernel's memory tools search and update, whose generated index the prompt
20
+ * carries under its own heading. `#note` and `/memory add` write there now;
21
+ * `/memory --user add` still appends to the user file here, because stored
22
+ * memory belongs to one project.
20
23
  */
21
24
  import { realpathSync } from 'node:fs';
22
25
  import { join, resolve } from 'node:path';
@@ -52,6 +55,10 @@ export function projectMemoryFilePath(cwd) {
52
55
  return local;
53
56
  return join(root, '.namzu', 'MEMORY.md');
54
57
  }
58
+ /** The project's curated file and the root it must resolve within. */
59
+ export function projectMemoryLocation(cwd) {
60
+ return projectLocation(cwd);
61
+ }
55
62
  function projectLocation(cwd) {
56
63
  const directory = realpathSync(resolve(cwd));
57
64
  return { path: projectMemoryFilePath(directory), root: cliProjectRoot(directory) };
@@ -84,11 +91,26 @@ export function readMemory(home, cwd) {
84
91
  root: userRoot,
85
92
  path: join(userRoot, 'MEMORY.md'),
86
93
  }));
87
- const project = cwd
94
+ // Started in the home directory, the project's `.namzu/MEMORY.md` IS the
95
+ // user's `MEMORY.md` — same file, read twice, injected under two headings
96
+ // into every prompt. It is the user's file; it is read once, as that.
97
+ const project = cwd && !isUserMemoryFile(join(resolve(cwd), '.namzu', 'MEMORY.md'), userRoot)
88
98
  ? read(join(resolve(cwd), '.namzu', 'MEMORY.md'), () => projectLocation(cwd))
89
99
  : null;
90
100
  return { user, memory, project, ...(diagnostics.length > 0 ? { diagnostics } : {}) };
91
101
  }
102
+ /** Whether a project memory path names the user's own `MEMORY.md`, symlinks resolved. */
103
+ function isUserMemoryFile(projectPath, userRoot) {
104
+ const canonical = (path) => {
105
+ try {
106
+ return realpathSync(path);
107
+ }
108
+ catch {
109
+ return resolve(path);
110
+ }
111
+ };
112
+ return canonical(projectPath) === canonical(join(userRoot, 'MEMORY.md'));
113
+ }
92
114
  function capped(text, file) {
93
115
  if (text.length <= MEMORY_SECTION_MAX_CHARS)
94
116
  return text;
@@ -105,10 +127,14 @@ export function composeMemoryPrompt(content) {
105
127
  const sections = [];
106
128
  if (content.user)
107
129
  sections.push(`## About the user\n\n${capped(content.user, 'USER.md')}`);
108
- if (content.memory)
109
- sections.push(`## Durable memory\n\n${capped(content.memory, 'MEMORY.md')}`);
130
+ // "Curated", never "durable" or bare "memory": the stored-memory index sits
131
+ // beside these sections under its own heading, and the model must be able
132
+ // to tell operator-written text from records it can search and update.
133
+ if (content.memory) {
134
+ sections.push(`## Curated memory (all projects)\n\n${capped(content.memory, 'MEMORY.md')}`);
135
+ }
110
136
  if (content.project) {
111
- sections.push(`## Project memory\n\n${capped(content.project, '.namzu/MEMORY.md')}`);
137
+ sections.push(`## Curated memory (this project)\n\n${capped(content.project, '.namzu/MEMORY.md')}`);
112
138
  }
113
139
  if (sections.length === 0)
114
140
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Stored memory: the typed, one-file-per-memory store the kernel's memory
3
+ * tools read and write, as the CLI uses it.
4
+ *
5
+ * Four jobs live here. `saveTypedNote` is what `#note` and `/memory add`
6
+ * write through. `composeStoredMemoryPrompt` turns the store's generated index
7
+ * into the prompt section the model sees every turn. `migrateMemoryOnce`
8
+ * moves the JSON store into typed files, once, and offers the project's
9
+ * curated bullets; `importCuratedNotes` copies those when the operator asks,
10
+ * never editing the curated file.
11
+ *
12
+ * The CURATED files (`USER.md`, `MEMORY.md` in the application home and the
13
+ * project) stay what they were: operator-authored text read into every turn.
14
+ * The two are never given the same heading in the prompt.
15
+ */
16
+ import { type MarkdownMemoryStore, type MemoryType, type RenderedMemoryIndex } from '@namzu/sdk';
17
+ export interface TypedNoteResult {
18
+ /** False when the note was empty or an identical memory already exists. */
19
+ readonly saved: boolean;
20
+ readonly name?: string;
21
+ readonly type: MemoryType;
22
+ /** The memory file, or the existing duplicate's file. */
23
+ readonly path?: string;
24
+ /** Set when an active memory with this exact text already existed. */
25
+ readonly duplicate?: boolean;
26
+ }
27
+ /**
28
+ * Save an operator note as a typed memory, default type `project`. A note
29
+ * whose exact text an active memory already holds is not saved twice; the
30
+ * result names the one that holds it.
31
+ */
32
+ export declare function saveTypedNote(store: MarkdownMemoryStore, text: string, type?: MemoryType): Promise<TypedNoteResult>;
33
+ /**
34
+ * The prompt section for the stored-memory index, or null when the store
35
+ * holds no active memory. Named so it can never be mistaken for the curated
36
+ * sections beside it.
37
+ */
38
+ export declare function composeStoredMemoryPrompt(index: RenderedMemoryIndex): string | null;
39
+ /** What one launch's migration did, for the operator notice. */
40
+ export interface MemoryMigrationReport {
41
+ readonly importedRecords: number;
42
+ /** JSON records the Markdown store refused (too large, a NUL byte); kept in the retired files. */
43
+ readonly skippedRecords: readonly string[];
44
+ /**
45
+ * The project's curated file holds top-level bullets, offered once per
46
+ * file: nothing is copied until the operator runs `/memory import-notes`,
47
+ * and the file itself is never changed.
48
+ */
49
+ readonly notesOffer?: {
50
+ readonly path: string;
51
+ readonly count: number;
52
+ };
53
+ /** Things that did not happen and why; the migration is retried next launch. */
54
+ readonly problems: readonly string[];
55
+ }
56
+ /** What `/memory import-notes` did. The curated file is never changed. */
57
+ export interface CuratedNotesImport {
58
+ readonly path: string;
59
+ /** Top-level bullets the file holds, each counted once. */
60
+ readonly found: number;
61
+ /** Memories created by this turn. */
62
+ readonly copied: number;
63
+ /** Bullets already in stored memory, by an earlier import, a `#note`, or by hand. */
64
+ readonly alreadyStored: number;
65
+ }
66
+ /**
67
+ * The text of every top-level bullet (`- text`) in a curated file, each once,
68
+ * in order. No bullet is judged to be a note or not: the file is never
69
+ * changed, so copying one the operator wrote costs a memory they can archive,
70
+ * never a line of their file. A nested bullet belongs to its parent and is not
71
+ * taken; only a bullet's first line is.
72
+ */
73
+ export declare function curatedBullets(text: string): string[];
74
+ /**
75
+ * Move what the JSON store held into typed files, once and safely again, and
76
+ * say once per curated file whether it holds notes that could move.
77
+ *
78
+ * 1. A JSON store (`index.json` + `content/`) in `directory` is imported
79
+ * record by record with its ids, timestamps and status, then moved aside
80
+ * to `index.json.migrated` and `content.migrated`. A record the Markdown
81
+ * store refuses to write — over its size limit, or holding a NUL byte —
82
+ * is reported and stays in the retired files; stopping on it would leave
83
+ * `index.json` in place and the store refusing every operation for good.
84
+ * Any other failure leaves the JSON store where it is, to retry next launch.
85
+ * 2. The project's curated `MEMORY.md` is never changed. When it holds
86
+ * top-level bullets — some may be notes `#note` used to append — the
87
+ * report offers them once per file, since the checkout's file and a
88
+ * subdirectory's own `.namzu/MEMORY.md` are different files, and
89
+ * `/memory import-notes` copies them into typed memories when the
90
+ * operator asks. They stay curated, read into every turn as before, until
91
+ * the operator deletes them from the file.
92
+ */
93
+ export declare function migrateMemoryOnce(options: {
94
+ readonly store: MarkdownMemoryStore;
95
+ /** The store's directory, where a JSON store would have lived. */
96
+ readonly directory: string;
97
+ readonly cwd: string;
98
+ }): Promise<MemoryMigrationReport>;
99
+ /**
100
+ * Copy the project's curated bullets into typed memory files, because the
101
+ * operator asked (`/memory import-notes`). The curated file is read, never
102
+ * written: deleting a bullet from it is the operator's call. Idempotent: a
103
+ * bullet already stored — by an earlier or concurrent import, as a `#note`
104
+ * with the same text, or under its name with the same text — is not copied
105
+ * again.
106
+ */
107
+ export declare function importCuratedNotes(options: {
108
+ readonly store: MarkdownMemoryStore;
109
+ readonly directory: string;
110
+ readonly cwd: string;
111
+ }): Promise<CuratedNotesImport>;
112
+ /** Operator notices for a migration; empty when nothing moved, nothing is offered and nothing failed. */
113
+ export declare function describeMemoryMigration(report: MemoryMigrationReport, directory: string): string[];
114
+ /** The operator's report for `/memory import-notes`. */
115
+ export declare function describeCuratedNotesImport(result: CuratedNotesImport, directory: string): string;
116
+ //# sourceMappingURL=typed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed.d.ts","sourceRoot":"","sources":["../../src/memory/typed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,EAEN,KAAK,mBAAmB,EAGxB,KAAK,UAAU,EACf,KAAK,mBAAmB,EAExB,MAAM,YAAY,CAAA;AAKnB,MAAM,WAAW,eAAe;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,yDAAyD;IACzD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,sEAAsE;IACtE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC5B;AAcD;;;;GAIG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,UAAsB,GAC1B,OAAO,CAAC,eAAe,CAAC,CA8B1B;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,GAAG,IAAI,CASnF;AAED,gEAAgE;AAChE,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,kGAAkG;IAClG,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IACvE,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,qFAAqF;IACrF,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC9B;AA8DD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAQrD;AA2CD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAChD,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAA;IACnC,kEAAkE;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAsEjC;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IACjD,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAA;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA8B9B;AAED,yGAAyG;AACzG,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,qBAAqB,EAC7B,SAAS,EAAE,MAAM,GACf,MAAM,EAAE,CAgBV;AAED,wDAAwD;AACxD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAUhG"}
@@ -0,0 +1,336 @@
1
+ /**
2
+ * Stored memory: the typed, one-file-per-memory store the kernel's memory
3
+ * tools read and write, as the CLI uses it.
4
+ *
5
+ * Four jobs live here. `saveTypedNote` is what `#note` and `/memory add`
6
+ * write through. `composeStoredMemoryPrompt` turns the store's generated index
7
+ * into the prompt section the model sees every turn. `migrateMemoryOnce`
8
+ * moves the JSON store into typed files, once, and offers the project's
9
+ * curated bullets; `importCuratedNotes` copies those when the operator asks,
10
+ * never editing the curated file.
11
+ *
12
+ * The CURATED files (`USER.md`, `MEMORY.md` in the application home and the
13
+ * project) stay what they were: operator-authored text read into every turn.
14
+ * The two are never given the same heading in the prompt.
15
+ */
16
+ import { createHash } from 'node:crypto';
17
+ import { access, readFile, rename, writeFile } from 'node:fs/promises';
18
+ import { join } from 'node:path';
19
+ import { DiskMemoryStore, MemoryContentRejectedError, MemoryNameConflictError, slugifyMemoryName, } from '@namzu/sdk';
20
+ import { readMemoryFile } from './io.js';
21
+ import { projectMemoryLocation } from './store.js';
22
+ function firstLine(text, limit) {
23
+ const line = (text.split(/\r?\n/).find((part) => part.trim()) ?? '').replace(/\s+/g, ' ').trim();
24
+ if (line.length <= limit)
25
+ return line;
26
+ let head = line.slice(0, limit - 1);
27
+ if (/[\uD800-\uDBFF]$/.test(head))
28
+ head = head.slice(0, -1);
29
+ return `${head.trimEnd()}…`;
30
+ }
31
+ function digest(text) {
32
+ return createHash('sha256').update(text).digest('hex');
33
+ }
34
+ /**
35
+ * Save an operator note as a typed memory, default type `project`. A note
36
+ * whose exact text an active memory already holds is not saved twice; the
37
+ * result names the one that holds it.
38
+ */
39
+ export async function saveTypedNote(store, text, type = 'project') {
40
+ const note = text.trim();
41
+ if (!note)
42
+ return { saved: false, type };
43
+ const candidates = await store.list({ query: note, status: 'active', limit: 20 });
44
+ for (const entry of candidates.entries) {
45
+ const record = await store.getRecord(entry.id);
46
+ if (record?.entry.status === 'active' && record.content.content.trim() === note) {
47
+ return {
48
+ saved: false,
49
+ duplicate: true,
50
+ type: record.entry.type ?? type,
51
+ ...(record.entry.name
52
+ ? { name: record.entry.name, path: join(store.path, `${record.entry.name}.md`) }
53
+ : {}),
54
+ };
55
+ }
56
+ }
57
+ const { entry } = await store.create({
58
+ title: firstLine(note, 72),
59
+ summary: firstLine(note, 300),
60
+ description: firstLine(note, 150),
61
+ content: note,
62
+ type,
63
+ metadata: { source: 'operator-note', noteDigest: digest(note) },
64
+ });
65
+ return {
66
+ saved: true,
67
+ type,
68
+ ...(entry.name ? { name: entry.name, path: join(store.path, `${entry.name}.md`) } : {}),
69
+ };
70
+ }
71
+ /**
72
+ * The prompt section for the stored-memory index, or null when the store
73
+ * holds no active memory. Named so it can never be mistaken for the curated
74
+ * sections beside it.
75
+ */
76
+ export function composeStoredMemoryPrompt(index) {
77
+ if (!index.text)
78
+ return null;
79
+ return [
80
+ '## Stored memories (index)',
81
+ '',
82
+ 'Memories saved in earlier sessions, one line each: `- [name](name.md) — description`. Read one with read_memory (by name) when it bears on the task. Correct or archive a wrong one with update_memory rather than saving a second copy. Memories are point-in-time: verify a file, function or flag a memory names against the current code before relying on it. What earlier turns recorded on their own is not listed here; search_memory finds it.',
83
+ '',
84
+ index.text,
85
+ ].join('\n');
86
+ }
87
+ /** Records per curated file when it was offered and imported, so a launch offers it once. */
88
+ const MARKER = 'migration.json';
89
+ async function readMarker(directory) {
90
+ try {
91
+ const parsed = JSON.parse(await readFile(join(directory, MARKER), 'utf8'));
92
+ return parsed !== null && typeof parsed === 'object' ? parsed : {};
93
+ }
94
+ catch (error) {
95
+ if (error.code === 'ENOENT')
96
+ return {};
97
+ throw error;
98
+ }
99
+ }
100
+ /** Merge `state` into the marker's record for `path`, re-reading it first. */
101
+ async function markCuratedFile(directory, path, state) {
102
+ const marker = await readMarker(directory).catch(() => ({}));
103
+ const files = { ...(marker.curatedFiles ?? {}) };
104
+ files[path] = { ...(files[path] ?? {}), ...state };
105
+ await writeFile(join(directory, MARKER), `${JSON.stringify({ ...marker, curatedFiles: files }, null, 2)}\n`, { mode: 0o600 });
106
+ }
107
+ async function exists(path) {
108
+ try {
109
+ await access(path);
110
+ return true;
111
+ }
112
+ catch {
113
+ return false;
114
+ }
115
+ }
116
+ /** Move `path` aside to `path.migrated`, or a numbered name when that is taken. */
117
+ async function retire(path) {
118
+ let target = `${path}.migrated`;
119
+ for (let n = 2; await exists(target); n++)
120
+ target = `${path}.migrated-${n}`;
121
+ try {
122
+ await rename(path, target);
123
+ }
124
+ catch (error) {
125
+ // Another process retired it first.
126
+ if (error.code !== 'ENOENT')
127
+ throw error;
128
+ }
129
+ return target;
130
+ }
131
+ /**
132
+ * The text of every top-level bullet (`- text`) in a curated file, each once,
133
+ * in order. No bullet is judged to be a note or not: the file is never
134
+ * changed, so copying one the operator wrote costs a memory they can archive,
135
+ * never a line of their file. A nested bullet belongs to its parent and is not
136
+ * taken; only a bullet's first line is.
137
+ */
138
+ export function curatedBullets(text) {
139
+ const bullets = new Set();
140
+ for (const line of text.split('\n')) {
141
+ const match = /^- (\S.*)$/.exec(line.replace(/\r$/, ''));
142
+ const bullet = match?.[1]?.trim();
143
+ if (bullet)
144
+ bullets.add(bullet);
145
+ }
146
+ return [...bullets];
147
+ }
148
+ /**
149
+ * Create the memory for one curated bullet, false when it is already stored.
150
+ *
151
+ * Under the name its text slugs to, first: the store refuses a taken name
152
+ * inside its lock, so two turns copying the same bullet at once write it once,
153
+ * the second finding the first's record by its source digest. A name held by
154
+ * a memory with the same text is that bullet already stored; one held by an
155
+ * unrelated memory falls back to a suffixed name.
156
+ */
157
+ async function copyBullet(store, bullet, sourceDigest, importedFrom) {
158
+ const params = {
159
+ title: firstLine(bullet, 72),
160
+ summary: firstLine(bullet, 300),
161
+ description: firstLine(bullet, 150),
162
+ content: bullet,
163
+ type: 'project',
164
+ metadata: { source: 'curated-bullet', sourceDigest, importedFrom },
165
+ };
166
+ const name = slugifyMemoryName(bullet);
167
+ try {
168
+ await store.create({ ...params, name });
169
+ return true;
170
+ }
171
+ catch (error) {
172
+ if (!(error instanceof MemoryNameConflictError))
173
+ throw error;
174
+ }
175
+ const holder = await store.getByName(name);
176
+ if (holder?.content.metadata?.sourceDigest === sourceDigest ||
177
+ holder?.content.content.trim() === bullet) {
178
+ return false;
179
+ }
180
+ await store.create(params);
181
+ return true;
182
+ }
183
+ /**
184
+ * Move what the JSON store held into typed files, once and safely again, and
185
+ * say once per curated file whether it holds notes that could move.
186
+ *
187
+ * 1. A JSON store (`index.json` + `content/`) in `directory` is imported
188
+ * record by record with its ids, timestamps and status, then moved aside
189
+ * to `index.json.migrated` and `content.migrated`. A record the Markdown
190
+ * store refuses to write — over its size limit, or holding a NUL byte —
191
+ * is reported and stays in the retired files; stopping on it would leave
192
+ * `index.json` in place and the store refusing every operation for good.
193
+ * Any other failure leaves the JSON store where it is, to retry next launch.
194
+ * 2. The project's curated `MEMORY.md` is never changed. When it holds
195
+ * top-level bullets — some may be notes `#note` used to append — the
196
+ * report offers them once per file, since the checkout's file and a
197
+ * subdirectory's own `.namzu/MEMORY.md` are different files, and
198
+ * `/memory import-notes` copies them into typed memories when the
199
+ * operator asks. They stay curated, read into every turn as before, until
200
+ * the operator deletes them from the file.
201
+ */
202
+ export async function migrateMemoryOnce(options) {
203
+ const { store, directory, cwd } = options;
204
+ const problems = [];
205
+ const skippedRecords = [];
206
+ let importedRecords = 0;
207
+ let notesOffer;
208
+ const indexPath = join(directory, 'index.json');
209
+ if (await exists(indexPath)) {
210
+ try {
211
+ const disk = new DiskMemoryStore({ baseDir: directory, directory });
212
+ const { entries } = await disk.list();
213
+ const refused = [];
214
+ for (const entry of entries) {
215
+ const record = await disk.getRecord(entry.id);
216
+ if (!record)
217
+ continue;
218
+ try {
219
+ if ((await store.importRecord(record, { type: 'project' })) === 'imported') {
220
+ importedRecords++;
221
+ }
222
+ }
223
+ catch (error) {
224
+ if (!(error instanceof MemoryContentRejectedError))
225
+ throw error;
226
+ refused.push({
227
+ id: entry.id,
228
+ title: entry.title,
229
+ reason: error.message,
230
+ });
231
+ }
232
+ }
233
+ await retire(indexPath);
234
+ const content = join(directory, 'content');
235
+ const retiredContent = (await exists(content)) ? await retire(content) : content;
236
+ for (const record of refused) {
237
+ skippedRecords.push(`"${record.title}" (${record.id}) was not moved: ${record.reason} It is kept in ${join(retiredContent, `${record.id}.json`)}.`);
238
+ }
239
+ }
240
+ catch (error) {
241
+ problems.push(`The JSON memory store in ${directory} was not migrated: ${error instanceof Error ? error.message : String(error)}`);
242
+ }
243
+ }
244
+ try {
245
+ const location = projectMemoryLocation(cwd);
246
+ const marker = await readMarker(directory);
247
+ const state = marker.curatedFiles?.[location.path];
248
+ if (!state?.offeredAt && !state?.importedAt) {
249
+ const text = readMemoryFile(location);
250
+ const bullets = text === null ? [] : curatedBullets(text);
251
+ if (bullets.length > 0) {
252
+ notesOffer = { path: location.path, count: bullets.length };
253
+ await markCuratedFile(directory, location.path, {
254
+ offeredAt: new Date().toISOString(),
255
+ });
256
+ }
257
+ }
258
+ }
259
+ catch (error) {
260
+ problems.push(`Could not check the project's curated memory for notes: ${error instanceof Error ? error.message : String(error)}`);
261
+ }
262
+ return {
263
+ importedRecords,
264
+ skippedRecords,
265
+ ...(notesOffer ? { notesOffer } : {}),
266
+ problems,
267
+ };
268
+ }
269
+ /**
270
+ * Copy the project's curated bullets into typed memory files, because the
271
+ * operator asked (`/memory import-notes`). The curated file is read, never
272
+ * written: deleting a bullet from it is the operator's call. Idempotent: a
273
+ * bullet already stored — by an earlier or concurrent import, as a `#note`
274
+ * with the same text, or under its name with the same text — is not copied
275
+ * again.
276
+ */
277
+ export async function importCuratedNotes(options) {
278
+ const { store, directory, cwd } = options;
279
+ const location = projectMemoryLocation(cwd);
280
+ const text = readMemoryFile(location);
281
+ const bullets = text === null ? [] : curatedBullets(text);
282
+ if (bullets.length === 0) {
283
+ return { path: location.path, found: 0, copied: 0, alreadyStored: 0 };
284
+ }
285
+ // Digests of what is stored already, archived memories included: a copy
286
+ // the operator archived stays archived rather than coming back.
287
+ const stored = new Set();
288
+ for (const entry of (await store.list({})).entries) {
289
+ const metadata = (await store.get(entry.id))?.metadata;
290
+ stored.add(metadata?.sourceDigest);
291
+ stored.add(metadata?.noteDigest);
292
+ }
293
+ let copied = 0;
294
+ for (const bullet of bullets) {
295
+ const sourceDigest = digest(bullet);
296
+ if (stored.has(sourceDigest))
297
+ continue;
298
+ if (await copyBullet(store, bullet, sourceDigest, location.path))
299
+ copied++;
300
+ stored.add(sourceDigest);
301
+ }
302
+ await markCuratedFile(directory, location.path, { importedAt: new Date().toISOString() });
303
+ return {
304
+ path: location.path,
305
+ found: bullets.length,
306
+ copied,
307
+ alreadyStored: bullets.length - copied,
308
+ };
309
+ }
310
+ /** Operator notices for a migration; empty when nothing moved, nothing is offered and nothing failed. */
311
+ export function describeMemoryMigration(report, directory) {
312
+ const notices = [];
313
+ if (report.importedRecords > 0) {
314
+ notices.push(`Stored memory: moved ${report.importedRecords} record${report.importedRecords === 1 ? '' : 's'} from the JSON store into Markdown files in ${directory}.`);
315
+ }
316
+ for (const skipped of report.skippedRecords)
317
+ notices.push(`Stored memory: ${skipped}`);
318
+ if (report.notesOffer) {
319
+ const { path, count } = report.notesOffer;
320
+ notices.push(`Stored memory: ${path} has ${count} top-level bullet${count === 1 ? '' : 's'}, some perhaps notes #note saved before notes became typed memory files. They stay curated and still reach every turn. Run /memory import-notes to copy them into ${directory} as typed memories; the curated file is never changed. New #note and /memory add notes are saved there already.`);
321
+ }
322
+ notices.push(...report.problems);
323
+ return notices;
324
+ }
325
+ /** The operator's report for `/memory import-notes`. */
326
+ export function describeCuratedNotesImport(result, directory) {
327
+ if (result.found === 0) {
328
+ return `No top-level bullets to copy in ${result.path}; it is unchanged.`;
329
+ }
330
+ const plural = (n) => (n === 1 ? '' : 's');
331
+ const already = result.alreadyStored > 0
332
+ ? ` ${result.alreadyStored} ${result.alreadyStored === 1 ? 'was' : 'were'} already stored and not copied again.`
333
+ : '';
334
+ return `Copied ${result.copied} of ${result.found} bullet${plural(result.found)} from ${result.path} into typed memory files in ${directory}.${already} ${result.path} is unchanged: its bullets are still curated text in every turn. Delete the ones you no longer want there yourself.`;
335
+ }
336
+ //# sourceMappingURL=typed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed.js","sourceRoot":"","sources":["../../src/memory/typed.ts"],"names":[],"mappings":"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"}