agent-recall-core 3.4.30 → 3.4.35

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 (251) hide show
  1. package/README.md +121 -441
  2. package/dist/digest/store.d.ts.map +1 -1
  3. package/dist/digest/store.js +4 -3
  4. package/dist/digest/store.js.map +1 -1
  5. package/dist/display/board-render.d.ts +61 -0
  6. package/dist/display/board-render.d.ts.map +1 -0
  7. package/dist/display/board-render.js +223 -0
  8. package/dist/display/board-render.js.map +1 -0
  9. package/dist/helpers/alignment-patterns.d.ts +10 -0
  10. package/dist/helpers/alignment-patterns.d.ts.map +1 -1
  11. package/dist/helpers/alignment-patterns.js +5 -1
  12. package/dist/helpers/alignment-patterns.js.map +1 -1
  13. package/dist/helpers/blind-spots.d.ts +86 -0
  14. package/dist/helpers/blind-spots.d.ts.map +1 -0
  15. package/dist/helpers/blind-spots.js +205 -0
  16. package/dist/helpers/blind-spots.js.map +1 -0
  17. package/dist/helpers/conflict-scan.d.ts +10 -0
  18. package/dist/helpers/conflict-scan.d.ts.map +1 -1
  19. package/dist/helpers/conflict-scan.js +3 -3
  20. package/dist/helpers/conflict-scan.js.map +1 -1
  21. package/dist/helpers/semantic-match.d.ts +82 -0
  22. package/dist/helpers/semantic-match.d.ts.map +1 -0
  23. package/dist/helpers/semantic-match.js +229 -0
  24. package/dist/helpers/semantic-match.js.map +1 -0
  25. package/dist/index.d.ts +52 -11
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +48 -9
  28. package/dist/index.js.map +1 -1
  29. package/dist/palace/awareness.d.ts +30 -0
  30. package/dist/palace/awareness.d.ts.map +1 -1
  31. package/dist/palace/awareness.js +65 -2
  32. package/dist/palace/awareness.js.map +1 -1
  33. package/dist/palace/consolidate.d.ts.map +1 -1
  34. package/dist/palace/consolidate.js +17 -0
  35. package/dist/palace/consolidate.js.map +1 -1
  36. package/dist/palace/decay-pass.d.ts +46 -0
  37. package/dist/palace/decay-pass.d.ts.map +1 -0
  38. package/dist/palace/decay-pass.js +87 -0
  39. package/dist/palace/decay-pass.js.map +1 -0
  40. package/dist/palace/insights-index.d.ts.map +1 -1
  41. package/dist/palace/insights-index.js +4 -2
  42. package/dist/palace/insights-index.js.map +1 -1
  43. package/dist/palace/skills.d.ts +41 -2
  44. package/dist/palace/skills.d.ts.map +1 -1
  45. package/dist/palace/skills.js +106 -4
  46. package/dist/palace/skills.js.map +1 -1
  47. package/dist/prompts/consolidation-prompt.d.ts +25 -0
  48. package/dist/prompts/consolidation-prompt.d.ts.map +1 -0
  49. package/dist/prompts/consolidation-prompt.js +91 -0
  50. package/dist/prompts/consolidation-prompt.js.map +1 -0
  51. package/dist/storage/archive-prune.d.ts +56 -0
  52. package/dist/storage/archive-prune.d.ts.map +1 -0
  53. package/dist/storage/archive-prune.js +118 -0
  54. package/dist/storage/archive-prune.js.map +1 -0
  55. package/dist/storage/archive-write.d.ts +38 -0
  56. package/dist/storage/archive-write.d.ts.map +1 -0
  57. package/dist/storage/archive-write.js +98 -0
  58. package/dist/storage/archive-write.js.map +1 -0
  59. package/dist/storage/blind-spots-store.d.ts +30 -0
  60. package/dist/storage/blind-spots-store.d.ts.map +1 -0
  61. package/dist/storage/blind-spots-store.js +91 -0
  62. package/dist/storage/blind-spots-store.js.map +1 -0
  63. package/dist/storage/capture-router.d.ts +60 -0
  64. package/dist/storage/capture-router.d.ts.map +1 -0
  65. package/dist/storage/capture-router.js +133 -0
  66. package/dist/storage/capture-router.js.map +1 -0
  67. package/dist/storage/classification.d.ts +32 -0
  68. package/dist/storage/classification.d.ts.map +1 -0
  69. package/dist/storage/classification.js +74 -0
  70. package/dist/storage/classification.js.map +1 -0
  71. package/dist/storage/consolidation-queue.d.ts +39 -0
  72. package/dist/storage/consolidation-queue.d.ts.map +1 -0
  73. package/dist/storage/consolidation-queue.js +120 -0
  74. package/dist/storage/consolidation-queue.js.map +1 -0
  75. package/dist/storage/content-guard.d.ts +74 -0
  76. package/dist/storage/content-guard.d.ts.map +1 -0
  77. package/dist/storage/content-guard.js +179 -0
  78. package/dist/storage/content-guard.js.map +1 -0
  79. package/dist/storage/corrections.d.ts +246 -21
  80. package/dist/storage/corrections.d.ts.map +1 -1
  81. package/dist/storage/corrections.js +605 -56
  82. package/dist/storage/corrections.js.map +1 -1
  83. package/dist/storage/durable-intent.d.ts +49 -0
  84. package/dist/storage/durable-intent.d.ts.map +1 -0
  85. package/dist/storage/durable-intent.js +124 -0
  86. package/dist/storage/durable-intent.js.map +1 -0
  87. package/dist/storage/filelock.d.ts +6 -0
  88. package/dist/storage/filelock.d.ts.map +1 -1
  89. package/dist/storage/filelock.js +6 -1
  90. package/dist/storage/filelock.js.map +1 -1
  91. package/dist/storage/memory-protocol.d.ts +19 -0
  92. package/dist/storage/memory-protocol.d.ts.map +1 -0
  93. package/dist/storage/memory-protocol.js +101 -0
  94. package/dist/storage/memory-protocol.js.map +1 -0
  95. package/dist/storage/paths.d.ts +23 -0
  96. package/dist/storage/paths.d.ts.map +1 -1
  97. package/dist/storage/paths.js +39 -0
  98. package/dist/storage/paths.js.map +1 -1
  99. package/dist/storage/retention.d.ts +23 -0
  100. package/dist/storage/retention.d.ts.map +1 -0
  101. package/dist/storage/retention.js +48 -0
  102. package/dist/storage/retention.js.map +1 -0
  103. package/dist/storage/session.d.ts +2 -2
  104. package/dist/storage/session.d.ts.map +1 -1
  105. package/dist/storage/session.js +11 -1
  106. package/dist/storage/session.js.map +1 -1
  107. package/dist/supabase/config.d.ts +8 -0
  108. package/dist/supabase/config.d.ts.map +1 -1
  109. package/dist/supabase/config.js +5 -0
  110. package/dist/supabase/config.js.map +1 -1
  111. package/dist/supabase/recall-backend.d.ts +1 -0
  112. package/dist/supabase/recall-backend.d.ts.map +1 -1
  113. package/dist/supabase/recall-backend.js +13 -13
  114. package/dist/supabase/recall-backend.js.map +1 -1
  115. package/dist/supabase/sync.d.ts.map +1 -1
  116. package/dist/supabase/sync.js +30 -3
  117. package/dist/supabase/sync.js.map +1 -1
  118. package/dist/tools-logic/bootstrap.d.ts +15 -0
  119. package/dist/tools-logic/bootstrap.d.ts.map +1 -1
  120. package/dist/tools-logic/bootstrap.js +238 -47
  121. package/dist/tools-logic/bootstrap.js.map +1 -1
  122. package/dist/tools-logic/brief.d.ts +84 -0
  123. package/dist/tools-logic/brief.d.ts.map +1 -0
  124. package/dist/tools-logic/brief.js +193 -0
  125. package/dist/tools-logic/brief.js.map +1 -0
  126. package/dist/tools-logic/check-action.d.ts +9 -0
  127. package/dist/tools-logic/check-action.d.ts.map +1 -1
  128. package/dist/tools-logic/check-action.js +31 -2
  129. package/dist/tools-logic/check-action.js.map +1 -1
  130. package/dist/tools-logic/check.d.ts +7 -0
  131. package/dist/tools-logic/check.d.ts.map +1 -1
  132. package/dist/tools-logic/check.js +24 -2
  133. package/dist/tools-logic/check.js.map +1 -1
  134. package/dist/tools-logic/confidence.d.ts +50 -0
  135. package/dist/tools-logic/confidence.d.ts.map +1 -0
  136. package/dist/tools-logic/confidence.js +70 -0
  137. package/dist/tools-logic/confidence.js.map +1 -0
  138. package/dist/tools-logic/drill-down.d.ts +37 -0
  139. package/dist/tools-logic/drill-down.d.ts.map +1 -0
  140. package/dist/tools-logic/drill-down.js +63 -0
  141. package/dist/tools-logic/drill-down.js.map +1 -0
  142. package/dist/tools-logic/export-corrections.d.ts +63 -0
  143. package/dist/tools-logic/export-corrections.d.ts.map +1 -0
  144. package/dist/tools-logic/export-corrections.js +124 -0
  145. package/dist/tools-logic/export-corrections.js.map +1 -0
  146. package/dist/tools-logic/journal-capture.d.ts.map +1 -1
  147. package/dist/tools-logic/journal-capture.js +4 -1
  148. package/dist/tools-logic/journal-capture.js.map +1 -1
  149. package/dist/tools-logic/journal-write.d.ts.map +1 -1
  150. package/dist/tools-logic/journal-write.js +3 -2
  151. package/dist/tools-logic/journal-write.js.map +1 -1
  152. package/dist/tools-logic/memory-query.d.ts +10 -3
  153. package/dist/tools-logic/memory-query.d.ts.map +1 -1
  154. package/dist/tools-logic/memory-query.js +31 -7
  155. package/dist/tools-logic/memory-query.js.map +1 -1
  156. package/dist/tools-logic/mirror-builder.d.ts +115 -0
  157. package/dist/tools-logic/mirror-builder.d.ts.map +1 -0
  158. package/dist/tools-logic/mirror-builder.js +348 -0
  159. package/dist/tools-logic/mirror-builder.js.map +1 -0
  160. package/dist/tools-logic/palace-write.d.ts.map +1 -1
  161. package/dist/tools-logic/palace-write.js +3 -2
  162. package/dist/tools-logic/palace-write.js.map +1 -1
  163. package/dist/tools-logic/pipeline-close.d.ts.map +1 -1
  164. package/dist/tools-logic/pipeline-close.js +2 -1
  165. package/dist/tools-logic/pipeline-close.js.map +1 -1
  166. package/dist/tools-logic/pipeline-open.d.ts.map +1 -1
  167. package/dist/tools-logic/pipeline-open.js +2 -1
  168. package/dist/tools-logic/pipeline-open.js.map +1 -1
  169. package/dist/tools-logic/predict-correction.d.ts +47 -0
  170. package/dist/tools-logic/predict-correction.d.ts.map +1 -0
  171. package/dist/tools-logic/predict-correction.js +137 -0
  172. package/dist/tools-logic/predict-correction.js.map +1 -0
  173. package/dist/tools-logic/prior-builder.d.ts +27 -0
  174. package/dist/tools-logic/prior-builder.d.ts.map +1 -0
  175. package/dist/tools-logic/prior-builder.js +57 -0
  176. package/dist/tools-logic/prior-builder.js.map +1 -0
  177. package/dist/tools-logic/recognition-builder.d.ts +116 -0
  178. package/dist/tools-logic/recognition-builder.d.ts.map +1 -0
  179. package/dist/tools-logic/recognition-builder.js +289 -0
  180. package/dist/tools-logic/recognition-builder.js.map +1 -0
  181. package/dist/tools-logic/safety-consolidation.d.ts +104 -0
  182. package/dist/tools-logic/safety-consolidation.d.ts.map +1 -0
  183. package/dist/tools-logic/safety-consolidation.js +256 -0
  184. package/dist/tools-logic/safety-consolidation.js.map +1 -0
  185. package/dist/tools-logic/session-end-reflect.d.ts +18 -0
  186. package/dist/tools-logic/session-end-reflect.d.ts.map +1 -1
  187. package/dist/tools-logic/session-end-reflect.js +68 -29
  188. package/dist/tools-logic/session-end-reflect.js.map +1 -1
  189. package/dist/tools-logic/session-end.d.ts +9 -0
  190. package/dist/tools-logic/session-end.d.ts.map +1 -1
  191. package/dist/tools-logic/session-end.js +111 -13
  192. package/dist/tools-logic/session-end.js.map +1 -1
  193. package/dist/tools-logic/session-start-lite.d.ts +2 -0
  194. package/dist/tools-logic/session-start-lite.d.ts.map +1 -1
  195. package/dist/tools-logic/session-start-lite.js +10 -0
  196. package/dist/tools-logic/session-start-lite.js.map +1 -1
  197. package/dist/tools-logic/session-start.d.ts +46 -0
  198. package/dist/tools-logic/session-start.d.ts.map +1 -1
  199. package/dist/tools-logic/session-start.js +96 -3
  200. package/dist/tools-logic/session-start.js.map +1 -1
  201. package/dist/tools-logic/skill-propose.d.ts +27 -0
  202. package/dist/tools-logic/skill-propose.d.ts.map +1 -0
  203. package/dist/tools-logic/skill-propose.js +66 -0
  204. package/dist/tools-logic/skill-propose.js.map +1 -0
  205. package/dist/tools-logic/skill-recall.d.ts +5 -0
  206. package/dist/tools-logic/skill-recall.d.ts.map +1 -1
  207. package/dist/tools-logic/skill-recall.js +14 -1
  208. package/dist/tools-logic/skill-recall.js.map +1 -1
  209. package/dist/tools-logic/smart-recall.d.ts +17 -0
  210. package/dist/tools-logic/smart-recall.d.ts.map +1 -1
  211. package/dist/tools-logic/smart-recall.js +51 -16
  212. package/dist/tools-logic/smart-recall.js.map +1 -1
  213. package/dist/tools-logic/store-doctor.d.ts +71 -0
  214. package/dist/tools-logic/store-doctor.d.ts.map +1 -0
  215. package/dist/tools-logic/store-doctor.js +387 -0
  216. package/dist/tools-logic/store-doctor.js.map +1 -0
  217. package/dist/tools-logic/store-repair.d.ts +64 -0
  218. package/dist/tools-logic/store-repair.d.ts.map +1 -0
  219. package/dist/tools-logic/store-repair.js +243 -0
  220. package/dist/tools-logic/store-repair.js.map +1 -0
  221. package/dist/tools-logic/supersession.d.ts +34 -0
  222. package/dist/tools-logic/supersession.d.ts.map +1 -0
  223. package/dist/tools-logic/supersession.js +103 -0
  224. package/dist/tools-logic/supersession.js.map +1 -0
  225. package/dist/types.d.ts +7 -1
  226. package/dist/types.d.ts.map +1 -1
  227. package/dist/types.js +1 -1
  228. package/dist/vector/local-vector-backend.d.ts.map +1 -1
  229. package/dist/vector/local-vector-backend.js +14 -17
  230. package/dist/vector/local-vector-backend.js.map +1 -1
  231. package/package.json +9 -1
  232. package/dist/relevance/injector.d.ts +0 -51
  233. package/dist/relevance/injector.d.ts.map +0 -1
  234. package/dist/relevance/injector.js +0 -121
  235. package/dist/relevance/injector.js.map +0 -1
  236. package/dist/relevance/precision.d.ts +0 -109
  237. package/dist/relevance/precision.d.ts.map +0 -1
  238. package/dist/relevance/precision.js +0 -279
  239. package/dist/relevance/precision.js.map +0 -1
  240. package/dist/relevance/promoter.d.ts +0 -60
  241. package/dist/relevance/promoter.d.ts.map +0 -1
  242. package/dist/relevance/promoter.js +0 -336
  243. package/dist/relevance/promoter.js.map +0 -1
  244. package/dist/relevance/stager.d.ts +0 -61
  245. package/dist/relevance/stager.d.ts.map +0 -1
  246. package/dist/relevance/stager.js +0 -251
  247. package/dist/relevance/stager.js.map +0 -1
  248. package/dist/relevance/surfacer.d.ts +0 -34
  249. package/dist/relevance/surfacer.d.ts.map +0 -1
  250. package/dist/relevance/surfacer.js +0 -333
  251. package/dist/relevance/surfacer.js.map +0 -1
@@ -0,0 +1,256 @@
1
+ /**
2
+ * safety-consolidation.ts — the LOGIN-FREE, LLM-FREE background safety pass.
3
+ *
4
+ * The operator's #1 priority: the three maintenance steps that keep memory
5
+ * healthy (FSRS/salience decay, raw-archive retention, candidate graduation)
6
+ * must run AUTOMATICALLY and WITHOUT a Claude login or any OPENAI_API_KEY.
7
+ *
8
+ * Before this module those steps only fired when the un-cron'd overnight
9
+ * dreaming agent drained the async queue (`ar consolidate-async`), which fails
10
+ * often — so decay rarely ran, pruneRawArchive had ZERO callers (the archive
11
+ * grew unbounded), and crystallization candidates never graduated.
12
+ *
13
+ * This pass wires the EXISTING, already-headless primitives together:
14
+ * (a) decay → consolidateJournalToPalace (runs runDecayPass + markKeystones
15
+ * internally; pure regex/fs, no LLM)
16
+ * (b) prune → pruneRawArchive (the dead retention pass), gated by the
17
+ * `.consumed.json` marker which this pass advances by the
18
+ * deterministic "older than the retention window ⇒ distilled"
19
+ * rule (monotonic ⇒ idempotent)
20
+ * (c) graduate → findCrystallizationCandidates + a DETERMINISTIC threshold
21
+ * rule that re-titles the strongest member `CRYSTALLIZED: …`.
22
+ * No LLM-authored summary — that stays the optional dreaming
23
+ * path. Idempotent because findCrystallizationCandidates
24
+ * excludes already-CRYSTALLIZED titles.
25
+ * NOTE (sync side effect): when a candidate actually graduates,
26
+ * this step persists the mutated awareness state and calls
27
+ * renderAwareness, which (via writeAwareness) fires a GATED,
28
+ * non-blocking Supabase sync of the awareness markdown. The
29
+ * sync is a no-op unless Supabase is configured AND sync_enabled
30
+ * (readSupabaseConfig returns null otherwise), so it never
31
+ * requires a network round-trip or a login to complete the pass
32
+ * — it does NOT violate the login-free contract below. dryRun
33
+ * and "nothing graduated" paths perform NO write and NO sync.
34
+ *
35
+ * HARD contract:
36
+ * - NONE of the three steps may require an LLM / OPENAI_API_KEY / Claude login.
37
+ * - EACH step is wrapped in its own try/catch so one throwing does NOT abort
38
+ * the others (best-effort, per-step isolation).
39
+ * - dryRun computes counts but writes NOTHING.
40
+ */
41
+ import * as fs from "node:fs";
42
+ import * as path from "node:path";
43
+ import { consolidateJournalToPalace } from "../palace/consolidate.js";
44
+ import { runDecayPass } from "../palace/decay-pass.js";
45
+ import { pruneRawArchive, } from "../storage/archive-prune.js";
46
+ import { findCrystallizationCandidates, readAwarenessState, writeAwarenessState, renderAwareness, } from "../palace/awareness.js";
47
+ import { archiveRawDir } from "../storage/paths.js";
48
+ import { readJsonSafe, writeJsonAtomic } from "../storage/fs-utils.js";
49
+ import { readSupabaseConfig } from "../supabase/config.js";
50
+ import { DEFAULT_ARCHIVE_RETENTION_DAYS, resolveRetentionDays, } from "../storage/retention.js";
51
+ const DAY_MS = 86_400_000;
52
+ // The raw-archive retention window now lives in storage/retention.ts (single
53
+ // source of truth shared with store-doctor.ts, so the pruner and the integrity
54
+ // check can never disagree on the threshold). Re-exported here for barrel /
55
+ // back-compat consumers that import it from this module.
56
+ export { DEFAULT_ARCHIVE_RETENTION_DAYS };
57
+ /** Deterministic graduation floor: a crystallization candidate graduates when
58
+ * its members together carry at least this many confirmations. Layered on top
59
+ * of findCrystallizationCandidates' own minCluster/minTotalConfirm gates so the
60
+ * rule is purely numeric — NO LLM judgement. Overridable via the runSafety
61
+ * opt, the AGENT_RECALL_GRADUATION_MIN_CONFIRMATIONS env var, or config.json
62
+ * `graduation_min_confirmations` (resolved in that order by
63
+ * resolveGraduationMinConfirmations). */
64
+ export const DEFAULT_GRADUATION_MIN_CONFIRMATIONS = 8;
65
+ /**
66
+ * Resolve the graduation confirmation floor: explicit opt >
67
+ * AGENT_RECALL_GRADUATION_MIN_CONFIRMATIONS env > config.json
68
+ * `graduation_min_confirmations` > DEFAULT_GRADUATION_MIN_CONFIRMATIONS.
69
+ *
70
+ * Mirrors resolveRetentionDays so the two numeric knobs resolve identically.
71
+ */
72
+ function resolveGraduationMinConfirmations(explicit) {
73
+ if (typeof explicit === "number" && Number.isFinite(explicit) && explicit > 0) {
74
+ return explicit;
75
+ }
76
+ const env = process.env.AGENT_RECALL_GRADUATION_MIN_CONFIRMATIONS;
77
+ if (env) {
78
+ const n = Number(env);
79
+ if (Number.isFinite(n) && n > 0)
80
+ return n;
81
+ }
82
+ try {
83
+ const cfg = readSupabaseConfig();
84
+ if (cfg &&
85
+ typeof cfg.graduation_min_confirmations === "number" &&
86
+ cfg.graduation_min_confirmations > 0) {
87
+ return cfg.graduation_min_confirmations;
88
+ }
89
+ }
90
+ catch {
91
+ // config read is best-effort — fall through to default
92
+ }
93
+ return DEFAULT_GRADUATION_MIN_CONFIRMATIONS;
94
+ }
95
+ /**
96
+ * Advance the raw-archive `.consumed.json` marker to "now − olderThanDays".
97
+ *
98
+ * Definition of "consumed" (single agreed definition, shared verbatim with
99
+ * archive-prune.ts): a raw segment whose content has been folded into the palace
100
+ * by the (regex, login-free) journal→palace consolidation. Segments older than
101
+ * the retention window have necessarily already been consolidated, so they count
102
+ * as consumed. Advancing the marker to the age cutoff lets pruneRawArchive
103
+ * actually fire on those aged segments while still PROTECTING anything newer than
104
+ * the window (the consumed gate stays meaningful). This is the writer for the
105
+ * exact `mtime <= lastConsumedAt` contract pruneRawArchive reads.
106
+ *
107
+ * MONOTONIC: never moves the marker backward. This is what makes the whole pass
108
+ * idempotent — a re-run with no newly-aged segments advances nothing and prunes
109
+ * nothing. Reuses the EXISTING checkpoint file; invents no new one.
110
+ *
111
+ * Returns the lastConsumedAt the marker is (or would be, in dryRun) set to.
112
+ */
113
+ function advanceConsumeMarker(slug, olderThanDays, dryRun) {
114
+ const dir = archiveRawDir(slug);
115
+ if (!fs.existsSync(dir))
116
+ return null;
117
+ const markerPath = path.join(dir, ".consumed.json");
118
+ const existing = readJsonSafe(markerPath);
119
+ const prevMs = existing?.lastConsumedAt
120
+ ? new Date(existing.lastConsumedAt).getTime()
121
+ : 0;
122
+ const cutoffMs = Date.now() - olderThanDays * DAY_MS;
123
+ // Monotonic: only advance forward. If the marker already covers the cutoff,
124
+ // there is nothing to do — re-runs become no-ops here.
125
+ if (!(cutoffMs > prevMs)) {
126
+ return existing?.lastConsumedAt ?? null;
127
+ }
128
+ const next = new Date(cutoffMs).toISOString();
129
+ if (!dryRun) {
130
+ writeJsonAtomic(markerPath, {
131
+ lastConsumedOffset: existing?.lastConsumedOffset ?? 0,
132
+ lastConsumedAt: next,
133
+ });
134
+ }
135
+ return next;
136
+ }
137
+ /**
138
+ * Step (c): graduate above-threshold crystallization candidates by re-titling
139
+ * the strongest member insight `CRYSTALLIZED: <title>`. Deterministic threshold
140
+ * ONLY — no LLM-authored summary. Idempotent: findCrystallizationCandidates
141
+ * excludes already-CRYSTALLIZED titles, so a graduated insight never re-graduates.
142
+ */
143
+ function graduateCandidates(candidates, minConfirmations, dryRun) {
144
+ const eligible = candidates.filter((c) => c.total_confirmations >= minConfirmations);
145
+ if (eligible.length === 0)
146
+ return { graduated: 0, titles: [] };
147
+ const state = readAwarenessState();
148
+ if (!state)
149
+ return { graduated: 0, titles: [] };
150
+ const titles = [];
151
+ let mutated = false;
152
+ for (const cand of eligible) {
153
+ // Pick the strongest member (most confirmations) that is still un-graduated.
154
+ const members = state.topInsights
155
+ .filter((i) => cand.insight_ids.includes(i.id))
156
+ .filter((i) => !/^\s*(crystallized|critical)\b/i.test(i.title ?? ""));
157
+ if (members.length === 0)
158
+ continue; // already graduated → idempotent skip
159
+ members.sort((a, b) => b.confirmations - a.confirmations);
160
+ const lead = members[0];
161
+ const newTitle = `CRYSTALLIZED: ${lead.title}`;
162
+ titles.push(newTitle);
163
+ if (!dryRun) {
164
+ lead.title = newTitle;
165
+ mutated = true;
166
+ }
167
+ }
168
+ if (mutated && !dryRun) {
169
+ writeAwarenessState(state);
170
+ renderAwareness(state);
171
+ }
172
+ return { graduated: titles.length, titles };
173
+ }
174
+ /**
175
+ * Run the three best-effort, LOGIN-FREE, LLM-FREE safety-consolidation steps
176
+ * for a project. Each step is isolated in its own try/catch: one throwing never
177
+ * aborts the others. dryRun computes counts but writes nothing.
178
+ */
179
+ export async function runSafetyConsolidation(project, opts = {}) {
180
+ const dryRun = opts.dryRun === true;
181
+ const olderThanDays = resolveRetentionDays(opts.olderThanDays);
182
+ const minConfirmations = resolveGraduationMinConfirmations(opts.minConfirmations);
183
+ const decay = { ran: false, scanned: 0, archived: 0 };
184
+ const pruned = {
185
+ ran: false,
186
+ scanned: 0,
187
+ gzipped: 0,
188
+ removed: 0,
189
+ eligible: 0,
190
+ consumedThrough: null,
191
+ };
192
+ const graduated = {
193
+ ran: false,
194
+ candidates: 0,
195
+ graduated: 0,
196
+ graduatedTitles: [],
197
+ };
198
+ // ── (a) decay + keystones ──────────────────────────────────────────────
199
+ // consolidateJournalToPalace runs runDecayPass + markKeystones internally and
200
+ // is pure regex/fs (no LLM). In dryRun we MUST NOT write, so call runDecayPass
201
+ // directly with dryRun:true instead of the full (always-writing) consolidate.
202
+ //
203
+ // Counting note: runDecayPass skips already-archived objects, so a post-write
204
+ // re-count would under-report. Capture the candidate count from a dryRun pass
205
+ // FIRST (pre-write), then run the real consolidate to apply the flags.
206
+ try {
207
+ const report = runDecayPass(project, { dryRun: true });
208
+ decay.scanned = report.scanned;
209
+ decay.archived = report.archived_candidates.length;
210
+ if (!dryRun) {
211
+ // Distill journal → palace (regex), which internally applies the decay
212
+ // flags. Counts already captured above (pre-write) so they stay honest.
213
+ consolidateJournalToPalace(project);
214
+ }
215
+ decay.ran = true;
216
+ }
217
+ catch (err) {
218
+ decay.error = err instanceof Error ? err.message : String(err);
219
+ }
220
+ // ── (b) prune raw archive (retention) ──────────────────────────────────
221
+ try {
222
+ // Advance the consume marker so aged, already-distilled segments become
223
+ // prunable (the marker is the load-bearing safety guard). Monotonic.
224
+ const consumedThrough = advanceConsumeMarker(project, olderThanDays, dryRun);
225
+ pruned.consumedThrough = consumedThrough;
226
+ const res = pruneRawArchive(project, {
227
+ olderThanDays,
228
+ dryRun,
229
+ });
230
+ pruned.scanned = res.scanned;
231
+ pruned.gzipped = res.gzipped;
232
+ pruned.removed = res.removed;
233
+ pruned.eligible = res.eligible;
234
+ // pruneRawArchive recomputes consumedThrough from the marker we just wrote;
235
+ // prefer its value when present (they agree in non-dryRun).
236
+ pruned.consumedThrough = res.consumedThrough ?? consumedThrough;
237
+ pruned.ran = true;
238
+ }
239
+ catch (err) {
240
+ pruned.error = err instanceof Error ? err.message : String(err);
241
+ }
242
+ // ── (c) graduate crystallization candidates (deterministic threshold) ───
243
+ try {
244
+ const candidates = findCrystallizationCandidates();
245
+ graduated.candidates = candidates.length;
246
+ const g = graduateCandidates(candidates, minConfirmations, dryRun);
247
+ graduated.graduated = g.graduated;
248
+ graduated.graduatedTitles = g.titles;
249
+ graduated.ran = true;
250
+ }
251
+ catch (err) {
252
+ graduated.error = err instanceof Error ? err.message : String(err);
253
+ }
254
+ return { project, dryRun, decay, pruned, graduated };
255
+ }
256
+ //# sourceMappingURL=safety-consolidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety-consolidation.js","sourceRoot":"","sources":["../../src/tools-logic/safety-consolidation.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@
18
18
  * already in the conversation writes its own reflection, we just give it
19
19
  * the inputs.
20
20
  */
21
+ import { type CrystallizationCandidate } from "../palace/awareness.js";
21
22
  export interface ReflectInput {
22
23
  project?: string;
23
24
  /** Look back this many days of journal entries. Default 7. */
@@ -43,6 +44,23 @@ export interface ReflectInputBundle {
43
44
  phase: string;
44
45
  synthesis: string;
45
46
  }>;
47
+ /**
48
+ * Wave 2: lossless raw archive segments not yet consumed by compression
49
+ * (files newer than the `.consumed.json` marker). The in-loop LLM is asked to
50
+ * distill these upward and advance the marker. Core stays deterministic — it
51
+ * only surfaces the raw material; it makes NO LLM call itself.
52
+ */
53
+ raw_unconsumed?: Array<{
54
+ file: string;
55
+ excerpt: string;
56
+ bytes: number;
57
+ }>;
58
+ /**
59
+ * Wave 3: clusters of related awareness insights that are candidates for
60
+ * crystallization into a single principle. Raw material ONLY — core does NOT
61
+ * synthesize the principle (the in-loop LLM does, per Decision #3).
62
+ */
63
+ crystallization_candidates?: CrystallizationCandidate[];
46
64
  }
47
65
  export interface ReflectResult {
48
66
  success: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"session-end-reflect.d.ts","sourceRoot":"","sources":["../../src/tools-logic/session-end-reflect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AASH,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,0DAA0D;IAC1D,kBAAkB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACpG,0DAA0D;IAC1D,aAAa,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAID,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CA0DnF"}
1
+ {"version":3,"file":"session-end-reflect.d.ts","sourceRoot":"","sources":["../../src/tools-logic/session-end-reflect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,OAAO,EAAiC,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAOtG,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,0DAA0D;IAC1D,kBAAkB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACpG,0DAA0D;IAC1D,aAAa,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E;;;;;OAKG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,wBAAwB,EAAE,CAAC;CACzD;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAID,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAwEnF"}
@@ -22,6 +22,10 @@ import { resolveProject } from "../storage/project.js";
22
22
  import { readCorrections } from "../storage/corrections.js";
23
23
  import { listJournalFiles } from "../helpers/journal-files.js";
24
24
  import { listMilestones } from "../palace/pipeline.js";
25
+ import { findCrystallizationCandidates } from "../palace/awareness.js";
26
+ import { archiveRawDir } from "../storage/paths.js";
27
+ import { readJsonSafe } from "../storage/fs-utils.js";
28
+ import { buildConsolidationPrompt } from "../prompts/consolidation-prompt.js";
25
29
  import * as fs from "node:fs";
26
30
  import * as path from "node:path";
27
31
  const EXCERPT_CHARS = 800;
@@ -68,10 +72,23 @@ export async function sessionEndReflect(input) {
68
72
  phase: p.meta.phase,
69
73
  synthesis: p.sections.synthesis,
70
74
  }));
75
+ const rawUnconsumed = collectRawUnconsumed(slug);
76
+ // Wave 3: surface crystallization candidates (best-effort; never throws).
77
+ let crystallizationCandidates = [];
78
+ try {
79
+ crystallizationCandidates = findCrystallizationCandidates();
80
+ }
81
+ catch {
82
+ crystallizationCandidates = [];
83
+ }
71
84
  const bundle = {
72
85
  recent_journals: recentJournals,
73
86
  active_corrections: corrections,
74
87
  recent_phases: recentPhases,
88
+ ...(rawUnconsumed.length > 0 ? { raw_unconsumed: rawUnconsumed } : {}),
89
+ ...(crystallizationCandidates.length > 0
90
+ ? { crystallization_candidates: crystallizationCandidates }
91
+ : {}),
75
92
  };
76
93
  const prompt = buildPrompt(slug, bundle, lookback);
77
94
  const nextActions = [
@@ -81,37 +98,59 @@ export async function sessionEndReflect(input) {
81
98
  ];
82
99
  return { success: true, project: slug, bundle, prompt, next_actions: nextActions };
83
100
  }
101
+ // Wave 5: the prompt body is now generated by the SINGLE versioned source
102
+ // (prompts/consolidation-prompt.ts), so `ar consolidate` and `session_end_reflect`
103
+ // render identically. This wrapper exists only to keep the call signature stable.
84
104
  function buildPrompt(slug, bundle, lookback) {
85
- const lines = [];
86
- lines.push(`# Reflect on ${slug} — last ${lookback} days`);
87
- lines.push("");
88
- lines.push("You are the agent reviewing your own recent work. Look at the inputs below and produce:");
89
- lines.push("");
90
- lines.push("1. **Three high-level questions** this period raised (Park 2023 style).");
91
- lines.push("2. **Procedural skills** that crystallized — anything repeated ≥2x is a candidate (call skill_write).");
92
- lines.push("3. **Cross-session patterns** that aren't yet in awareness — distilled insights worth promoting.");
93
- lines.push("4. **Noise to archive** — corrections with low precision that should be retired.");
94
- lines.push("");
95
- lines.push("Be terse. One bullet per finding. Cite journal dates / phase orders / correction ids as evidence.");
96
- lines.push("");
97
- lines.push("---");
98
- lines.push("");
99
- lines.push(`## Journals (${bundle.recent_journals.length})`);
100
- for (const j of bundle.recent_journals) {
101
- lines.push(`### ${j.date} — ${j.file}`);
102
- lines.push(j.excerpt);
103
- lines.push("");
104
- }
105
- lines.push(`## Active corrections (${bundle.active_corrections.length})`);
106
- for (const c of bundle.active_corrections) {
107
- const p = c.precision !== null ? ` p=${c.precision}` : "";
108
- lines.push(`- [${c.id}] (${c.severity}${p}) ${c.rule}`);
105
+ return buildConsolidationPrompt(slug, bundle, lookback);
106
+ }
107
+ /**
108
+ * Wave 2: collect lossless raw-archive files newer than the `.consumed.json`
109
+ * marker so the reflect bundle can hand them to the LLM for distillation.
110
+ * Deterministic and best-effort never throws.
111
+ */
112
+ function collectRawUnconsumed(slug) {
113
+ const out = [];
114
+ try {
115
+ const rawDir = archiveRawDir(slug);
116
+ if (!fs.existsSync(rawDir))
117
+ return out;
118
+ const marker = readJsonSafe(path.join(rawDir, ".consumed.json"));
119
+ const cutoffMs = marker?.lastConsumedAt
120
+ ? new Date(marker.lastConsumedAt).getTime()
121
+ : 0;
122
+ const files = fs
123
+ .readdirSync(rawDir)
124
+ .filter((f) => f.endsWith(".md"))
125
+ .sort()
126
+ .reverse();
127
+ for (const file of files) {
128
+ const full = path.join(rawDir, file);
129
+ let stat;
130
+ try {
131
+ stat = fs.statSync(full);
132
+ }
133
+ catch {
134
+ continue;
135
+ }
136
+ if (Number.isFinite(cutoffMs) && cutoffMs > 0 && stat.mtimeMs <= cutoffMs) {
137
+ continue; // already consumed
138
+ }
139
+ let excerpt = "";
140
+ try {
141
+ excerpt = fs.readFileSync(full, "utf-8").slice(0, EXCERPT_CHARS);
142
+ }
143
+ catch {
144
+ continue;
145
+ }
146
+ out.push({ file, excerpt, bytes: stat.size });
147
+ if (out.length >= 5)
148
+ break; // cap — bound the bundle size
149
+ }
109
150
  }
110
- lines.push("");
111
- lines.push(`## Recent closed phases (${bundle.recent_phases.length})`);
112
- for (const ph of bundle.recent_phases) {
113
- lines.push(`- Phase ${ph.order} — ${ph.phase}: ${ph.synthesis}`);
151
+ catch {
152
+ // best-effort
114
153
  }
115
- return lines.join("\n");
154
+ return out;
116
155
  }
117
156
  //# sourceMappingURL=session-end-reflect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-end-reflect.js","sourceRoot":"","sources":["../../src/tools-logic/session-end-reflect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-end-reflect.js","sourceRoot":"","sources":["../../src/tools-logic/session-end-reflect.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,15 @@ export interface SessionEndInput {
39
39
  phase_name: string;
40
40
  goal: string;
41
41
  };
42
+ /**
43
+ * Wave 2: defer the inline journal→palace consolidation to the async
44
+ * dreaming queue instead of running it in this turn. ONLY the harness-driven
45
+ * Stop hook (`hook-end`) passes this true — it enqueues a consolidation job
46
+ * and skips the synchronous palace pass. Default false ⇒ ZERO behavior
47
+ * change for /arsave, /arsaveall, and the MCP session_end (they still
48
+ * consolidate inline). Decision #3: consolidation is async dreaming.
49
+ */
50
+ deferConsolidation?: boolean;
42
51
  }
43
52
  export interface MergeSuggestion {
44
53
  file: string;
@@ -1 +1 @@
1
- {"version":3,"file":"session-end.d.ts","sourceRoot":"","sources":["../../src/tools-logic/session-end.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAKjF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC;KAC/C,CAAC,CAAC;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,GAAG,CAAC,EAAE,eAAe,CAAC;IACtB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE;QACZ,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;QAC5C,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IACF;;;OAGG;IACH,UAAU,CAAC,EAAE;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,8DAA8D;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,eAAe,EAAE,CAAC;IACtC,gBAAgB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAC3C,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,GACpC,qBAAqB,EAAE,CA6CzB;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsWlF"}
1
+ {"version":3,"file":"session-end.d.ts","sourceRoot":"","sources":["../../src/tools-logic/session-end.ts"],"names":[],"mappings":"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"}