agent-recall-core 3.4.31 → 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.
- package/README.md +121 -441
- package/dist/digest/store.d.ts.map +1 -1
- package/dist/digest/store.js +4 -3
- package/dist/digest/store.js.map +1 -1
- package/dist/display/board-render.d.ts +61 -0
- package/dist/display/board-render.d.ts.map +1 -0
- package/dist/display/board-render.js +223 -0
- package/dist/display/board-render.js.map +1 -0
- package/dist/helpers/alignment-patterns.d.ts +10 -0
- package/dist/helpers/alignment-patterns.d.ts.map +1 -1
- package/dist/helpers/alignment-patterns.js +5 -1
- package/dist/helpers/alignment-patterns.js.map +1 -1
- package/dist/helpers/blind-spots.d.ts +86 -0
- package/dist/helpers/blind-spots.d.ts.map +1 -0
- package/dist/helpers/blind-spots.js +205 -0
- package/dist/helpers/blind-spots.js.map +1 -0
- package/dist/helpers/conflict-scan.d.ts +10 -0
- package/dist/helpers/conflict-scan.d.ts.map +1 -1
- package/dist/helpers/conflict-scan.js +3 -3
- package/dist/helpers/conflict-scan.js.map +1 -1
- package/dist/helpers/semantic-match.d.ts +82 -0
- package/dist/helpers/semantic-match.d.ts.map +1 -0
- package/dist/helpers/semantic-match.js +229 -0
- package/dist/helpers/semantic-match.js.map +1 -0
- package/dist/index.d.ts +52 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +48 -9
- package/dist/index.js.map +1 -1
- package/dist/palace/awareness.d.ts +30 -0
- package/dist/palace/awareness.d.ts.map +1 -1
- package/dist/palace/awareness.js +65 -2
- package/dist/palace/awareness.js.map +1 -1
- package/dist/palace/consolidate.d.ts.map +1 -1
- package/dist/palace/consolidate.js +17 -0
- package/dist/palace/consolidate.js.map +1 -1
- package/dist/palace/decay-pass.d.ts +46 -0
- package/dist/palace/decay-pass.d.ts.map +1 -0
- package/dist/palace/decay-pass.js +87 -0
- package/dist/palace/decay-pass.js.map +1 -0
- package/dist/palace/insights-index.d.ts.map +1 -1
- package/dist/palace/insights-index.js +4 -2
- package/dist/palace/insights-index.js.map +1 -1
- package/dist/palace/skills.d.ts +41 -2
- package/dist/palace/skills.d.ts.map +1 -1
- package/dist/palace/skills.js +106 -4
- package/dist/palace/skills.js.map +1 -1
- package/dist/prompts/consolidation-prompt.d.ts +25 -0
- package/dist/prompts/consolidation-prompt.d.ts.map +1 -0
- package/dist/prompts/consolidation-prompt.js +91 -0
- package/dist/prompts/consolidation-prompt.js.map +1 -0
- package/dist/storage/archive-prune.d.ts +56 -0
- package/dist/storage/archive-prune.d.ts.map +1 -0
- package/dist/storage/archive-prune.js +118 -0
- package/dist/storage/archive-prune.js.map +1 -0
- package/dist/storage/archive-write.d.ts +38 -0
- package/dist/storage/archive-write.d.ts.map +1 -0
- package/dist/storage/archive-write.js +98 -0
- package/dist/storage/archive-write.js.map +1 -0
- package/dist/storage/blind-spots-store.d.ts +30 -0
- package/dist/storage/blind-spots-store.d.ts.map +1 -0
- package/dist/storage/blind-spots-store.js +91 -0
- package/dist/storage/blind-spots-store.js.map +1 -0
- package/dist/storage/capture-router.d.ts +60 -0
- package/dist/storage/capture-router.d.ts.map +1 -0
- package/dist/storage/capture-router.js +133 -0
- package/dist/storage/capture-router.js.map +1 -0
- package/dist/storage/classification.d.ts +32 -0
- package/dist/storage/classification.d.ts.map +1 -0
- package/dist/storage/classification.js +74 -0
- package/dist/storage/classification.js.map +1 -0
- package/dist/storage/consolidation-queue.d.ts +39 -0
- package/dist/storage/consolidation-queue.d.ts.map +1 -0
- package/dist/storage/consolidation-queue.js +120 -0
- package/dist/storage/consolidation-queue.js.map +1 -0
- package/dist/storage/content-guard.d.ts +74 -0
- package/dist/storage/content-guard.d.ts.map +1 -0
- package/dist/storage/content-guard.js +179 -0
- package/dist/storage/content-guard.js.map +1 -0
- package/dist/storage/corrections.d.ts +246 -21
- package/dist/storage/corrections.d.ts.map +1 -1
- package/dist/storage/corrections.js +605 -56
- package/dist/storage/corrections.js.map +1 -1
- package/dist/storage/durable-intent.d.ts +49 -0
- package/dist/storage/durable-intent.d.ts.map +1 -0
- package/dist/storage/durable-intent.js +124 -0
- package/dist/storage/durable-intent.js.map +1 -0
- package/dist/storage/filelock.d.ts +6 -0
- package/dist/storage/filelock.d.ts.map +1 -1
- package/dist/storage/filelock.js +6 -1
- package/dist/storage/filelock.js.map +1 -1
- package/dist/storage/memory-protocol.d.ts +19 -0
- package/dist/storage/memory-protocol.d.ts.map +1 -0
- package/dist/storage/memory-protocol.js +101 -0
- package/dist/storage/memory-protocol.js.map +1 -0
- package/dist/storage/paths.d.ts +23 -0
- package/dist/storage/paths.d.ts.map +1 -1
- package/dist/storage/paths.js +39 -0
- package/dist/storage/paths.js.map +1 -1
- package/dist/storage/retention.d.ts +23 -0
- package/dist/storage/retention.d.ts.map +1 -0
- package/dist/storage/retention.js +48 -0
- package/dist/storage/retention.js.map +1 -0
- package/dist/storage/session.d.ts +2 -2
- package/dist/storage/session.d.ts.map +1 -1
- package/dist/storage/session.js +11 -1
- package/dist/storage/session.js.map +1 -1
- package/dist/supabase/config.d.ts +8 -0
- package/dist/supabase/config.d.ts.map +1 -1
- package/dist/supabase/config.js +5 -0
- package/dist/supabase/config.js.map +1 -1
- package/dist/supabase/recall-backend.d.ts +1 -0
- package/dist/supabase/recall-backend.d.ts.map +1 -1
- package/dist/supabase/recall-backend.js +13 -13
- package/dist/supabase/recall-backend.js.map +1 -1
- package/dist/supabase/sync.d.ts.map +1 -1
- package/dist/supabase/sync.js +30 -3
- package/dist/supabase/sync.js.map +1 -1
- package/dist/tools-logic/bootstrap.d.ts +15 -0
- package/dist/tools-logic/bootstrap.d.ts.map +1 -1
- package/dist/tools-logic/bootstrap.js +238 -47
- package/dist/tools-logic/bootstrap.js.map +1 -1
- package/dist/tools-logic/brief.d.ts +84 -0
- package/dist/tools-logic/brief.d.ts.map +1 -0
- package/dist/tools-logic/brief.js +193 -0
- package/dist/tools-logic/brief.js.map +1 -0
- package/dist/tools-logic/check-action.d.ts +9 -0
- package/dist/tools-logic/check-action.d.ts.map +1 -1
- package/dist/tools-logic/check-action.js +31 -2
- package/dist/tools-logic/check-action.js.map +1 -1
- package/dist/tools-logic/check.d.ts +7 -0
- package/dist/tools-logic/check.d.ts.map +1 -1
- package/dist/tools-logic/check.js +24 -2
- package/dist/tools-logic/check.js.map +1 -1
- package/dist/tools-logic/confidence.d.ts +50 -0
- package/dist/tools-logic/confidence.d.ts.map +1 -0
- package/dist/tools-logic/confidence.js +70 -0
- package/dist/tools-logic/confidence.js.map +1 -0
- package/dist/tools-logic/drill-down.d.ts +37 -0
- package/dist/tools-logic/drill-down.d.ts.map +1 -0
- package/dist/tools-logic/drill-down.js +63 -0
- package/dist/tools-logic/drill-down.js.map +1 -0
- package/dist/tools-logic/export-corrections.d.ts +63 -0
- package/dist/tools-logic/export-corrections.d.ts.map +1 -0
- package/dist/tools-logic/export-corrections.js +124 -0
- package/dist/tools-logic/export-corrections.js.map +1 -0
- package/dist/tools-logic/journal-capture.d.ts.map +1 -1
- package/dist/tools-logic/journal-capture.js +4 -1
- package/dist/tools-logic/journal-capture.js.map +1 -1
- package/dist/tools-logic/journal-write.d.ts.map +1 -1
- package/dist/tools-logic/journal-write.js +3 -2
- package/dist/tools-logic/journal-write.js.map +1 -1
- package/dist/tools-logic/memory-query.d.ts +10 -3
- package/dist/tools-logic/memory-query.d.ts.map +1 -1
- package/dist/tools-logic/memory-query.js +31 -7
- package/dist/tools-logic/memory-query.js.map +1 -1
- package/dist/tools-logic/mirror-builder.d.ts +115 -0
- package/dist/tools-logic/mirror-builder.d.ts.map +1 -0
- package/dist/tools-logic/mirror-builder.js +348 -0
- package/dist/tools-logic/mirror-builder.js.map +1 -0
- package/dist/tools-logic/palace-write.d.ts.map +1 -1
- package/dist/tools-logic/palace-write.js +3 -2
- package/dist/tools-logic/palace-write.js.map +1 -1
- package/dist/tools-logic/pipeline-close.d.ts.map +1 -1
- package/dist/tools-logic/pipeline-close.js +2 -1
- package/dist/tools-logic/pipeline-close.js.map +1 -1
- package/dist/tools-logic/pipeline-open.d.ts.map +1 -1
- package/dist/tools-logic/pipeline-open.js +2 -1
- package/dist/tools-logic/pipeline-open.js.map +1 -1
- package/dist/tools-logic/predict-correction.d.ts +47 -0
- package/dist/tools-logic/predict-correction.d.ts.map +1 -0
- package/dist/tools-logic/predict-correction.js +137 -0
- package/dist/tools-logic/predict-correction.js.map +1 -0
- package/dist/tools-logic/prior-builder.d.ts +27 -0
- package/dist/tools-logic/prior-builder.d.ts.map +1 -0
- package/dist/tools-logic/prior-builder.js +57 -0
- package/dist/tools-logic/prior-builder.js.map +1 -0
- package/dist/tools-logic/recognition-builder.d.ts +116 -0
- package/dist/tools-logic/recognition-builder.d.ts.map +1 -0
- package/dist/tools-logic/recognition-builder.js +289 -0
- package/dist/tools-logic/recognition-builder.js.map +1 -0
- package/dist/tools-logic/safety-consolidation.d.ts +104 -0
- package/dist/tools-logic/safety-consolidation.d.ts.map +1 -0
- package/dist/tools-logic/safety-consolidation.js +256 -0
- package/dist/tools-logic/safety-consolidation.js.map +1 -0
- package/dist/tools-logic/session-end-reflect.d.ts +18 -0
- package/dist/tools-logic/session-end-reflect.d.ts.map +1 -1
- package/dist/tools-logic/session-end-reflect.js +68 -29
- package/dist/tools-logic/session-end-reflect.js.map +1 -1
- package/dist/tools-logic/session-end.d.ts +9 -0
- package/dist/tools-logic/session-end.d.ts.map +1 -1
- package/dist/tools-logic/session-end.js +111 -13
- package/dist/tools-logic/session-end.js.map +1 -1
- package/dist/tools-logic/session-start-lite.d.ts +2 -0
- package/dist/tools-logic/session-start-lite.d.ts.map +1 -1
- package/dist/tools-logic/session-start-lite.js +10 -0
- package/dist/tools-logic/session-start-lite.js.map +1 -1
- package/dist/tools-logic/session-start.d.ts +46 -0
- package/dist/tools-logic/session-start.d.ts.map +1 -1
- package/dist/tools-logic/session-start.js +96 -3
- package/dist/tools-logic/session-start.js.map +1 -1
- package/dist/tools-logic/skill-propose.d.ts +27 -0
- package/dist/tools-logic/skill-propose.d.ts.map +1 -0
- package/dist/tools-logic/skill-propose.js +66 -0
- package/dist/tools-logic/skill-propose.js.map +1 -0
- package/dist/tools-logic/skill-recall.d.ts +5 -0
- package/dist/tools-logic/skill-recall.d.ts.map +1 -1
- package/dist/tools-logic/skill-recall.js +14 -1
- package/dist/tools-logic/skill-recall.js.map +1 -1
- package/dist/tools-logic/smart-recall.d.ts +17 -0
- package/dist/tools-logic/smart-recall.d.ts.map +1 -1
- package/dist/tools-logic/smart-recall.js +51 -16
- package/dist/tools-logic/smart-recall.js.map +1 -1
- package/dist/tools-logic/store-doctor.d.ts +71 -0
- package/dist/tools-logic/store-doctor.d.ts.map +1 -0
- package/dist/tools-logic/store-doctor.js +387 -0
- package/dist/tools-logic/store-doctor.js.map +1 -0
- package/dist/tools-logic/store-repair.d.ts +64 -0
- package/dist/tools-logic/store-repair.d.ts.map +1 -0
- package/dist/tools-logic/store-repair.js +243 -0
- package/dist/tools-logic/store-repair.js.map +1 -0
- package/dist/tools-logic/supersession.d.ts +34 -0
- package/dist/tools-logic/supersession.d.ts.map +1 -0
- package/dist/tools-logic/supersession.js +103 -0
- package/dist/tools-logic/supersession.js.map +1 -0
- package/dist/types.d.ts +7 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/vector/local-vector-backend.d.ts.map +1 -1
- package/dist/vector/local-vector-backend.js +14 -17
- package/dist/vector/local-vector-backend.js.map +1 -1
- package/package.json +1 -1
- package/dist/relevance/injector.d.ts +0 -51
- package/dist/relevance/injector.d.ts.map +0 -1
- package/dist/relevance/injector.js +0 -121
- package/dist/relevance/injector.js.map +0 -1
- package/dist/relevance/precision.d.ts +0 -109
- package/dist/relevance/precision.d.ts.map +0 -1
- package/dist/relevance/precision.js +0 -279
- package/dist/relevance/precision.js.map +0 -1
- package/dist/relevance/promoter.d.ts +0 -60
- package/dist/relevance/promoter.d.ts.map +0 -1
- package/dist/relevance/promoter.js +0 -336
- package/dist/relevance/promoter.js.map +0 -1
- package/dist/relevance/stager.d.ts +0 -61
- package/dist/relevance/stager.d.ts.map +0 -1
- package/dist/relevance/stager.js +0 -251
- package/dist/relevance/stager.js.map +0 -1
- package/dist/relevance/surfacer.d.ts +0 -34
- package/dist/relevance/surfacer.d.ts.map +0 -1
- package/dist/relevance/surfacer.js +0 -333
- package/dist/relevance/surfacer.js.map +0 -1
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* store-repair.ts — WRITE-side remediation, the deliberate sibling to the
|
|
3
|
+
* read-only store-doctor.ts.
|
|
4
|
+
*
|
|
5
|
+
* store-doctor = DIAGNOSE. Strictly read-only, lock-free, never throws.
|
|
6
|
+
* store-repair = REMEDIATE. Re-derives the same conditions the doctor
|
|
7
|
+
* detects and applies the minimal, idempotent fix each
|
|
8
|
+
* `fix_hint` prescribes.
|
|
9
|
+
*
|
|
10
|
+
* SAFETY INVARIANTS:
|
|
11
|
+
* 1. DRY-RUN BY DEFAULT. `opts.apply` must be EXPLICITLY true to mutate. A
|
|
12
|
+
* dry-run computes the full plan (what WOULD change) and writes nothing.
|
|
13
|
+
* 2. PER-STEP ISOLATION. Each step runs in its own try/catch (mirrors
|
|
14
|
+
* safety-consolidation.ts) — one failing step never aborts the others.
|
|
15
|
+
* 3. IDEMPOTENT. A re-run on an already-clean store is a no-op: drift is
|
|
16
|
+
* recomputed from disk truth, locks are re-scanned, and the consume marker
|
|
17
|
+
* the drain advances is monotonic.
|
|
18
|
+
* 4. LOCK SAFETY. Only `.lock-*` dirs older than LOCK_RED_MS (the doctor's RED
|
|
19
|
+
* threshold) are removed. The locker's acquire timeout is 5s and it
|
|
20
|
+
* force-breaks stale locks at 30s, so a dir older than 5min cannot belong
|
|
21
|
+
* to a live writer — removal is safe WITHOUT scanning for processes.
|
|
22
|
+
*
|
|
23
|
+
* NOT on any hot path. Invoked manually via `ar repair [--apply]`.
|
|
24
|
+
*/
|
|
25
|
+
import * as fs from "node:fs";
|
|
26
|
+
import * as path from "node:path";
|
|
27
|
+
import { getRoot } from "../types.js";
|
|
28
|
+
import { readJsonSafe } from "../storage/fs-utils.js";
|
|
29
|
+
import { listAllProjects } from "../storage/project.js";
|
|
30
|
+
import { palaceDir, archiveRawDir } from "../storage/paths.js";
|
|
31
|
+
import { countRoomEntries } from "../palace/rooms.js";
|
|
32
|
+
import { updatePalaceIndex } from "../palace/index-manager.js";
|
|
33
|
+
import { runSafetyConsolidation } from "./safety-consolidation.js";
|
|
34
|
+
import { runStoreDoctor, INDEX_DRIFT_TOLERANCE, LOCK_RED_MS, DREAM_NULL_MARKER_WARN_DAYS, } from "./store-doctor.js";
|
|
35
|
+
import { resolveRetentionDays } from "../storage/retention.js";
|
|
36
|
+
function snapshot(r) {
|
|
37
|
+
return {
|
|
38
|
+
status: r.status,
|
|
39
|
+
red: r.checks.filter((c) => c.level === "red").map((c) => c.name),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Re-derive which projects have at least one room drifting beyond tolerance.
|
|
44
|
+
* Disk (`### ` block count) is the source of truth; the index is the cache.
|
|
45
|
+
* Computed independently of the doctor's string output so repair never parses
|
|
46
|
+
* a human-readable detail line.
|
|
47
|
+
*/
|
|
48
|
+
function findDriftedProjects() {
|
|
49
|
+
const drifted = new Set();
|
|
50
|
+
for (const proj of listAllProjects()) {
|
|
51
|
+
const index = readJsonSafe(path.join(palaceDir(proj.slug), "palace-index.json"));
|
|
52
|
+
if (!index || !index.rooms)
|
|
53
|
+
continue;
|
|
54
|
+
for (const [slug, room] of Object.entries(index.rooms)) {
|
|
55
|
+
const indexed = room?.memory_count ?? 0;
|
|
56
|
+
const live = countRoomEntries(proj.slug, slug);
|
|
57
|
+
if (Math.abs(indexed - live) > INDEX_DRIFT_TOLERANCE) {
|
|
58
|
+
drifted.add(proj.slug);
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return [...drifted];
|
|
64
|
+
}
|
|
65
|
+
/** Find `.lock-*` dirs older than the RED threshold (definitely dead writers). */
|
|
66
|
+
function findDeadLocks() {
|
|
67
|
+
const root = getRoot();
|
|
68
|
+
const now = Date.now();
|
|
69
|
+
const dead = [];
|
|
70
|
+
let entries = [];
|
|
71
|
+
try {
|
|
72
|
+
entries = fs.existsSync(root) ? fs.readdirSync(root) : [];
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
for (const entry of entries) {
|
|
78
|
+
if (!entry.startsWith(".lock-"))
|
|
79
|
+
continue;
|
|
80
|
+
try {
|
|
81
|
+
const ageMs = now - fs.statSync(path.join(root, entry)).mtimeMs;
|
|
82
|
+
if (ageMs > LOCK_RED_MS)
|
|
83
|
+
dead.push(entry);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// raced with a release — already gone, nothing to remove
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return dead;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Projects the drain should target — EXACTLY the ones the doctor flags as
|
|
93
|
+
* dreaming_stale, no more. Mirroring the doctor's RED+WARN conditions keeps
|
|
94
|
+
* repair and diagnosis in lockstep and makes the drain idempotent: a RECENT raw
|
|
95
|
+
* segment (the healthy backup buffer the doctor calls OK) is NOT selected, so we
|
|
96
|
+
* don't perpetually "drain" a project whose marker simply can't advance past
|
|
97
|
+
* within-retention segments.
|
|
98
|
+
*
|
|
99
|
+
* RED — a raw segment older than the (config-resolved) retention window is
|
|
100
|
+
* still unconsumed (mtime newer than the marker).
|
|
101
|
+
* WARN — the marker never advanced (null/absent) while raw older than the warn
|
|
102
|
+
* floor exists.
|
|
103
|
+
*/
|
|
104
|
+
function findProjectsNeedingDrain() {
|
|
105
|
+
const now = Date.now();
|
|
106
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
107
|
+
const retentionMs = resolveRetentionDays() * DAY_MS;
|
|
108
|
+
const warnMs = DREAM_NULL_MARKER_WARN_DAYS * DAY_MS;
|
|
109
|
+
const need = [];
|
|
110
|
+
for (const proj of listAllProjects()) {
|
|
111
|
+
const dir = archiveRawDir(proj.slug);
|
|
112
|
+
let rawFiles = [];
|
|
113
|
+
try {
|
|
114
|
+
rawFiles = fs.existsSync(dir)
|
|
115
|
+
? fs.readdirSync(dir).filter((f) => f.endsWith(".md") && f !== "index.md")
|
|
116
|
+
: [];
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (rawFiles.length === 0)
|
|
122
|
+
continue;
|
|
123
|
+
const marker = readJsonSafe(path.join(dir, ".consumed.json"));
|
|
124
|
+
const lastConsumed = marker?.lastConsumedAt ?? null;
|
|
125
|
+
const markerNeverAdvanced = lastConsumed === null;
|
|
126
|
+
const lastMs = lastConsumed ? new Date(lastConsumed).getTime() : 0;
|
|
127
|
+
let flagged = false;
|
|
128
|
+
for (const f of rawFiles) {
|
|
129
|
+
let mtime;
|
|
130
|
+
try {
|
|
131
|
+
mtime = fs.statSync(path.join(dir, f)).mtimeMs;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const age = now - mtime;
|
|
137
|
+
const unconsumed = mtime > lastMs;
|
|
138
|
+
if (age > retentionMs && unconsumed) {
|
|
139
|
+
flagged = true; // RED
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
if (markerNeverAdvanced && age > warnMs) {
|
|
143
|
+
flagged = true; // WARN
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (flagged)
|
|
147
|
+
need.push(proj.slug);
|
|
148
|
+
}
|
|
149
|
+
return need;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Run all repairs. DRY-RUN unless `opts.apply === true`. Each step is isolated;
|
|
153
|
+
* the result reports exactly what was (or would be) changed, plus the doctor
|
|
154
|
+
* status before and (when applied) after.
|
|
155
|
+
*/
|
|
156
|
+
export async function runStoreRepair(opts = {}) {
|
|
157
|
+
const apply = opts.apply === true;
|
|
158
|
+
const before = snapshot(runStoreDoctor());
|
|
159
|
+
const reindexed = { projects: [] };
|
|
160
|
+
const locksRemoved = { names: [] };
|
|
161
|
+
const drained = { projects: [] };
|
|
162
|
+
// ── (1) vector_index_drift → rebuild palace-index.json from .md truth ──────
|
|
163
|
+
// updatePalaceIndex re-counts `### ` blocks and writes atomically under lock.
|
|
164
|
+
try {
|
|
165
|
+
reindexed.projects = findDriftedProjects();
|
|
166
|
+
if (apply) {
|
|
167
|
+
for (const slug of reindexed.projects)
|
|
168
|
+
updatePalaceIndex(slug);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
reindexed.error = err instanceof Error ? err.message : String(err);
|
|
173
|
+
}
|
|
174
|
+
// ── (2) stale_lock → remove .lock-* dirs older than the RED threshold ──────
|
|
175
|
+
// Use rmdirSync (NOT rmSync recursive): a lock dir is always empty (the locker
|
|
176
|
+
// creates it via mkdirSync as a pure mutex), so rmdirSync suffices and FAILS
|
|
177
|
+
// LOUD if a dir unexpectedly has content — we never blind-recursively delete.
|
|
178
|
+
// In apply mode, names lists only locks ACTUALLY removed (honest reporting); in
|
|
179
|
+
// dry-run it lists the candidates that WOULD be removed.
|
|
180
|
+
try {
|
|
181
|
+
const candidates = findDeadLocks();
|
|
182
|
+
if (apply) {
|
|
183
|
+
const root = getRoot();
|
|
184
|
+
const removed = [];
|
|
185
|
+
for (const name of candidates) {
|
|
186
|
+
try {
|
|
187
|
+
fs.rmdirSync(path.join(root, name));
|
|
188
|
+
removed.push(name);
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// non-empty (unexpected — leave it) or raced with a release — don't
|
|
192
|
+
// claim a removal that didn't happen
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
locksRemoved.names = removed;
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
locksRemoved.names = candidates;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
locksRemoved.error = err instanceof Error ? err.message : String(err);
|
|
203
|
+
}
|
|
204
|
+
// ── (3) dreaming_stale → login-free, LLM-free consolidation drain ──────────
|
|
205
|
+
// Advances the consume marker + prunes aged raw. consolidateJournalToPalace
|
|
206
|
+
// (inside the drain) self-updates the palace index, so this never re-introduces
|
|
207
|
+
// the drift fixed in step (1).
|
|
208
|
+
try {
|
|
209
|
+
drained.projects = findProjectsNeedingDrain();
|
|
210
|
+
if (apply) {
|
|
211
|
+
// Per-project isolation: one project's drain throwing must not skip the
|
|
212
|
+
// rest. Collect failures into the step error rather than aborting.
|
|
213
|
+
const failed = [];
|
|
214
|
+
for (const slug of drained.projects) {
|
|
215
|
+
try {
|
|
216
|
+
await runSafetyConsolidation(slug, { dryRun: false });
|
|
217
|
+
}
|
|
218
|
+
catch (e) {
|
|
219
|
+
failed.push(`${slug} (${e instanceof Error ? e.message : String(e)})`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (failed.length > 0)
|
|
223
|
+
drained.error = `drain failed for: ${failed.join("; ")}`;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
drained.error = err instanceof Error ? err.message : String(err);
|
|
228
|
+
}
|
|
229
|
+
const after = apply ? snapshot(runStoreDoctor()) : null;
|
|
230
|
+
return { apply, before, reindexed, locksRemoved, drained, after };
|
|
231
|
+
}
|
|
232
|
+
/** One-line summary for CLI / logs. */
|
|
233
|
+
export function storeRepairSummary(r) {
|
|
234
|
+
const verb = r.apply ? "repaired" : "would repair (dry-run)";
|
|
235
|
+
const parts = [
|
|
236
|
+
`${r.reindexed.projects.length} reindex`,
|
|
237
|
+
`${r.locksRemoved.names.length} lock`,
|
|
238
|
+
`${r.drained.projects.length} drain`,
|
|
239
|
+
];
|
|
240
|
+
const tail = r.after ? ` · doctor ${r.before.status}→${r.after.status}` : "";
|
|
241
|
+
return `store-repair ${verb}: ${parts.join(", ")}${tail}`;
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=store-repair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-repair.js","sourceRoot":"","sources":["../../src/tools-logic/store-repair.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface SupersessionMatch {
|
|
2
|
+
existingId: string;
|
|
3
|
+
existingRule: string;
|
|
4
|
+
conflictingValues: Array<{
|
|
5
|
+
existing: string;
|
|
6
|
+
incoming: string;
|
|
7
|
+
}>;
|
|
8
|
+
}
|
|
9
|
+
export interface SupersessionReview {
|
|
10
|
+
/** Older active corrections the new one contradicts — proposed for supersession. */
|
|
11
|
+
suggestions: SupersessionMatch[];
|
|
12
|
+
/** ids actually retracted (superseded_by set) — non-empty ONLY in auto mode. */
|
|
13
|
+
superseded: string[];
|
|
14
|
+
auto: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** Find active corrections that contradict the candidate on a version/status/kv fact. */
|
|
17
|
+
export declare function detectCorrectionConflicts(project: string, candidate: {
|
|
18
|
+
id?: string;
|
|
19
|
+
rule: string;
|
|
20
|
+
context?: string;
|
|
21
|
+
}): SupersessionMatch[];
|
|
22
|
+
/**
|
|
23
|
+
* Review (and, under auto, apply) supersessions for a newly-written correction.
|
|
24
|
+
* SUGGEST-ONLY by default. With auto (or AR_CONSOLIDATE_AUTO=1) the contradicted
|
|
25
|
+
* older corrections are retracted with superseded_by = the new correction's id.
|
|
26
|
+
*/
|
|
27
|
+
export declare function reviewSupersessions(project: string, newCorrection: {
|
|
28
|
+
id: string;
|
|
29
|
+
rule: string;
|
|
30
|
+
context?: string;
|
|
31
|
+
}, opts?: {
|
|
32
|
+
auto?: boolean;
|
|
33
|
+
}): SupersessionReview;
|
|
34
|
+
//# sourceMappingURL=supersession.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supersession.d.ts","sourceRoot":"","sources":["../../src/tools-logic/supersession.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,kBAAkB;IACjC,oFAAoF;IACpF,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,gFAAgF;IAChF,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;CACf;AAsDD,yFAAyF;AACzF,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACzD,iBAAiB,EAAE,CAgBrB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7D,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GACxB,kBAAkB,CAgBpB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* supersession.ts — P2: detect when a NEW correction CONTRADICTS an existing
|
|
3
|
+
* active one on a versioned / status / key-value fact, and (suggest-default)
|
|
4
|
+
* supersede the stale one.
|
|
5
|
+
*
|
|
6
|
+
* Reuses AgentRecall's existing conflict-token grammar (helpers/conflict-scan.ts)
|
|
7
|
+
* — pure, NO LLM, NO network, NO key. SCOPE LIMIT (honest): this catches
|
|
8
|
+
* contradictions expressed as a version bump ("X is 1.2.3" → "X is 1.3.0"), a
|
|
9
|
+
* status flip ("status: blocked" → "status: done"), or a key-value change
|
|
10
|
+
* ("env = prod" → "env = staging"). It does NOT catch arbitrary semantic
|
|
11
|
+
* substitutions ("use middleware.ts" → "use proxy.ts") with no key — that needs
|
|
12
|
+
* the optional semantic/LLM path and is intentionally out of scope here.
|
|
13
|
+
*
|
|
14
|
+
* Mutation policy: SUGGEST-ONLY by default. Set AR_CONSOLIDATE_AUTO=1 (or pass
|
|
15
|
+
* { auto: true }) to actually retract the contradicted records (with
|
|
16
|
+
* superseded_by set to the new correction's id). The default mutates NOTHING.
|
|
17
|
+
*/
|
|
18
|
+
import { extractVersionTokens, extractStatusTokens, extractKVTokens, } from "../helpers/conflict-scan.js";
|
|
19
|
+
import { readActiveCorrections, retractCorrection } from "../storage/corrections.js";
|
|
20
|
+
/**
|
|
21
|
+
* Pairwise contradiction check over version + status + key-value tokens. Mirrors
|
|
22
|
+
* the comparison in conflict-scan.ts::scanForConflicts so both agree on what a
|
|
23
|
+
* "conflict" is (no fork of the grammar).
|
|
24
|
+
*/
|
|
25
|
+
function compareForConflicts(newText, existingText) {
|
|
26
|
+
const out = [];
|
|
27
|
+
// 1. Version token conflicts (same key, different semver).
|
|
28
|
+
const newV = extractVersionTokens(newText);
|
|
29
|
+
if (newV.size > 0) {
|
|
30
|
+
const exV = extractVersionTokens(existingText);
|
|
31
|
+
for (const [k, nv] of newV) {
|
|
32
|
+
const ev = exV.get(k);
|
|
33
|
+
if (ev && ev !== nv)
|
|
34
|
+
out.push({ existing: `${k} is ${ev}`, incoming: `${k} is ${nv}` });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// 2. Status category conflicts (existing has a category the new text lacks).
|
|
38
|
+
const newS = extractStatusTokens(newText);
|
|
39
|
+
if (newS.size > 0) {
|
|
40
|
+
const exS = extractStatusTokens(existingText);
|
|
41
|
+
const newCats = new Set(newS.values());
|
|
42
|
+
const exCats = new Set(exS.values());
|
|
43
|
+
for (const cat of exCats) {
|
|
44
|
+
if (!newCats.has(cat)) {
|
|
45
|
+
const exWord = [...exS.entries()].find(([, c]) => c === cat)?.[0] ?? cat;
|
|
46
|
+
const newCat = [...newCats][0];
|
|
47
|
+
if (newCat) {
|
|
48
|
+
const newWord = [...newS.entries()].find(([, c]) => c === newCat)?.[0] ?? newCat;
|
|
49
|
+
out.push({ existing: `status is ${exWord}`, incoming: `status is ${newWord}` });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// 3. Key-value conflicts (same key, different value).
|
|
55
|
+
const newKV = extractKVTokens(newText);
|
|
56
|
+
if (newKV.size > 0) {
|
|
57
|
+
const exKV = extractKVTokens(existingText);
|
|
58
|
+
for (const [k, nv] of newKV) {
|
|
59
|
+
const ev = exKV.get(k);
|
|
60
|
+
if (ev && ev !== nv)
|
|
61
|
+
out.push({ existing: `${k} is ${ev}`, incoming: `${k} is ${nv}` });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
/** Find active corrections that contradict the candidate on a version/status/kv fact. */
|
|
67
|
+
export function detectCorrectionConflicts(project, candidate) {
|
|
68
|
+
const newText = `${candidate.rule} ${candidate.context ?? ""}`.trim();
|
|
69
|
+
const matches = [];
|
|
70
|
+
for (const existing of readActiveCorrections(project)) {
|
|
71
|
+
if (candidate.id && existing.id === candidate.id)
|
|
72
|
+
continue;
|
|
73
|
+
const existingText = `${existing.rule} ${existing.context ?? ""}`.trim();
|
|
74
|
+
const conflicts = compareForConflicts(newText, existingText);
|
|
75
|
+
if (conflicts.length > 0) {
|
|
76
|
+
matches.push({
|
|
77
|
+
existingId: existing.id,
|
|
78
|
+
existingRule: existing.rule,
|
|
79
|
+
conflictingValues: conflicts,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return matches;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Review (and, under auto, apply) supersessions for a newly-written correction.
|
|
87
|
+
* SUGGEST-ONLY by default. With auto (or AR_CONSOLIDATE_AUTO=1) the contradicted
|
|
88
|
+
* older corrections are retracted with superseded_by = the new correction's id.
|
|
89
|
+
*/
|
|
90
|
+
export function reviewSupersessions(project, newCorrection, opts) {
|
|
91
|
+
const auto = opts?.auto ?? process.env.AR_CONSOLIDATE_AUTO === "1";
|
|
92
|
+
const suggestions = detectCorrectionConflicts(project, newCorrection);
|
|
93
|
+
const superseded = [];
|
|
94
|
+
if (auto) {
|
|
95
|
+
for (const m of suggestions) {
|
|
96
|
+
const res = retractCorrection(project, m.existingId, `superseded by ${newCorrection.id}`, newCorrection.id);
|
|
97
|
+
if (res.success)
|
|
98
|
+
superseded.push(m.existingId);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return { suggestions, superseded, auto };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=supersession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supersession.js","sourceRoot":"","sources":["../../src/tools-logic/supersession.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared types, interfaces, and constants for agent-recall-mcp.
|
|
3
3
|
*/
|
|
4
|
-
export declare const VERSION = "3.4.
|
|
4
|
+
export declare const VERSION = "3.4.35";
|
|
5
5
|
/**
|
|
6
6
|
* Set the storage root directory. This is process-global state —
|
|
7
7
|
* only one root is active at a time. Call before any other operations.
|
|
@@ -106,6 +106,12 @@ export interface RoomMeta {
|
|
|
106
106
|
* access frequency. Set by markKeystones() during consolidation.
|
|
107
107
|
*/
|
|
108
108
|
keystone?: boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Wave 3: non-destructive archive flag. Set by the decay pass when a room's
|
|
111
|
+
* salience falls at/below the archive threshold. The room dir is NEVER
|
|
112
|
+
* deleted — the flag is advisory and lets readers down-rank/hide it.
|
|
113
|
+
*/
|
|
114
|
+
archived?: boolean;
|
|
109
115
|
}
|
|
110
116
|
export interface PalaceIndex {
|
|
111
117
|
version: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -6,7 +6,7 @@ import * as os from "node:os";
|
|
|
6
6
|
// ---------------------------------------------------------------------------
|
|
7
7
|
// Constants
|
|
8
8
|
// ---------------------------------------------------------------------------
|
|
9
|
-
export const VERSION = "3.4.
|
|
9
|
+
export const VERSION = "3.4.35";
|
|
10
10
|
// ---------------------------------------------------------------------------
|
|
11
11
|
// Root directory (configurable at runtime for SDK usage)
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-vector-backend.d.ts","sourceRoot":"","sources":["../../src/vector/local-vector-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"local-vector-backend.d.ts","sourceRoot":"","sources":["../../src/vector/local-vector-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAG5E,qBAAa,wBAAwB;IACnC,SAAS,IAAI,OAAO;IAId,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,EAAE,CAAC;CAyBpC"}
|
|
@@ -8,15 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { embed } from "./embedding.js";
|
|
10
10
|
import { queryVector } from "./local-vector-store.js";
|
|
11
|
-
|
|
12
|
-
if (score >= 0.80)
|
|
13
|
-
return "high";
|
|
14
|
-
if (score >= 0.65)
|
|
15
|
-
return "medium";
|
|
16
|
-
if (score >= 0.50)
|
|
17
|
-
return "low";
|
|
18
|
-
return "weak";
|
|
19
|
-
}
|
|
11
|
+
import { calibratedConfidence } from "../tools-logic/confidence.js";
|
|
20
12
|
export class LocalVectorRecallBackend {
|
|
21
13
|
available() {
|
|
22
14
|
return !!process.env.OPENAI_API_KEY;
|
|
@@ -30,14 +22,19 @@ export class LocalVectorRecallBackend {
|
|
|
30
22
|
return [];
|
|
31
23
|
}
|
|
32
24
|
const hits = await queryVector(project, embedding, limit);
|
|
33
|
-
return hits.map((h) =>
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
25
|
+
return hits.map((h) => {
|
|
26
|
+
// local-vector scores are cosine similarity — already 0..1.
|
|
27
|
+
const c = calibratedConfidence(h.score, "cosine");
|
|
28
|
+
return {
|
|
29
|
+
id: h.id,
|
|
30
|
+
source: h.source,
|
|
31
|
+
title: h.title,
|
|
32
|
+
excerpt: h.excerpt,
|
|
33
|
+
score: h.score,
|
|
34
|
+
confidence: c.label,
|
|
35
|
+
calibrated: c.calibrated,
|
|
36
|
+
};
|
|
37
|
+
});
|
|
41
38
|
}
|
|
42
39
|
}
|
|
43
40
|
//# sourceMappingURL=local-vector-backend.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-vector-backend.js","sourceRoot":"","sources":["../../src/vector/local-vector-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"local-vector-backend.js","sourceRoot":"","sources":["../../src/vector/local-vector-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,OAAO,wBAAwB;IACnC,SAAS;QACP,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,MAAM,CACV,KAAa,EACb,OAA2B,EAC3B,KAAa;QAEb,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAExB,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,iFAAiF;YACjF,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAE1D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACpB,4DAA4D;YAC5D,MAAM,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAClD,OAAO;gBACL,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,UAAU,EAAE,CAAC,CAAC,KAAK;gBACnB,UAAU,EAAE,CAAC,CAAC,UAAU;aACzB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Injector — formats Surfacer Candidates as an "added context" block the host
|
|
3
|
-
* hook can echo into the agent's context (v3.5.0 P-B, spec §4 "Judge" + §5).
|
|
4
|
-
*
|
|
5
|
-
* Contract:
|
|
6
|
-
* • Pure function. Zero fs, zero network — Surfacer already did the I/O.
|
|
7
|
-
* • Empty candidates → returns "" (silence is precision; the hook MUST emit
|
|
8
|
-
* nothing in this case so the agent's context stays clean — see spec §6).
|
|
9
|
-
* • One bullet per candidate, capped at ~140 chars total per line so the
|
|
10
|
-
* injected block never blows past a few hundred tokens even at K=3.
|
|
11
|
-
* • Title-render uses [source] (palace shows palace/<room>) and includes
|
|
12
|
-
* the Surfacer's `why` clause so the model knows WHY this surfaced and
|
|
13
|
-
* can decide whether to act on it.
|
|
14
|
-
*
|
|
15
|
-
* Output shape (verbatim — host hook copy-pastes this into stdout):
|
|
16
|
-
*
|
|
17
|
-
* <agent-recall-context>
|
|
18
|
-
* Possibly relevant prior memory (use if it helps, ignore otherwise):
|
|
19
|
-
* • [palace/goals] Rate limiting in Stripe — must use idempotency keys (why: matches palace/goals)
|
|
20
|
-
* • [journal] 2026-06-12 — Stripe webhook signature verification gotcha (why: matched recent journal 2026-06-12)
|
|
21
|
-
* </agent-recall-context>
|
|
22
|
-
*
|
|
23
|
-
* Worker done-definition self-check:
|
|
24
|
-
* (1) Error path: candidates is null/undefined → coerce to [] before any
|
|
25
|
-
* work. Each candidate field is `?? ""` so undefined never throws.
|
|
26
|
-
* (2) No global binaries — pure node, no shell-outs, no deps.
|
|
27
|
-
* (3) Threshold/ternary ordering — only branch is `length === 0 ? '' : block`,
|
|
28
|
-
* short-circuit-on-empty first.
|
|
29
|
-
* (4) No time-of-day logic; nothing TZ-sensitive.
|
|
30
|
-
*/
|
|
31
|
-
import type { Candidate } from "./surfacer.js";
|
|
32
|
-
/**
|
|
33
|
-
* Render one Candidate as a single bullet line, capped to LINE_MAX_CHARS.
|
|
34
|
-
*
|
|
35
|
-
* Format: `• [<tag>] <title> (why: <why>)`
|
|
36
|
-
*
|
|
37
|
-
* If the assembled line exceeds LINE_MAX_CHARS we re-trim the title (the
|
|
38
|
-
* most variable field) until the whole line fits. The `[tag]` prefix and
|
|
39
|
-
* the `why:` clause are short and information-dense, so they survive
|
|
40
|
-
* intact at the expense of the title's tail.
|
|
41
|
-
*/
|
|
42
|
-
export declare function formatCandidate(c: Candidate): string;
|
|
43
|
-
/**
|
|
44
|
-
* Format a list of Candidates for the host hook to inject.
|
|
45
|
-
*
|
|
46
|
-
* Empty input → empty string. This is load-bearing — the hook in the host
|
|
47
|
-
* is wired to echo our stdout verbatim, so an empty string keeps the
|
|
48
|
-
* agent's context clean (silence is precision, spec §6).
|
|
49
|
-
*/
|
|
50
|
-
export declare function formatForHook(candidates: Candidate[] | null | undefined): string;
|
|
51
|
-
//# sourceMappingURL=injector.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"injector.d.ts","sourceRoot":"","sources":["../../src/relevance/injector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AA+B/C;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CA0BpD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAqBhF"}
|