agent-recall-core 3.4.31 → 3.4.36
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 +57 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +60 -14
- 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/ab-experiment.d.ts +184 -0
- package/dist/storage/ab-experiment.d.ts.map +1 -0
- package/dist/storage/ab-experiment.js +294 -0
- package/dist/storage/ab-experiment.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 +36 -0
- package/dist/storage/classification.d.ts.map +1 -0
- package/dist/storage/classification.js +78 -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 +329 -22
- package/dist/storage/corrections.d.ts.map +1 -1
- package/dist/storage/corrections.js +788 -58
- 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 +26 -0
- package/dist/supabase/config.d.ts.map +1 -1
- package/dist/supabase/config.js +11 -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 +1 -1
- package/dist/supabase/sync.d.ts.map +1 -1
- package/dist/supabase/sync.js +85 -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 +61 -3
- 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/local-archive-backend.d.ts +33 -0
- package/dist/tools-logic/local-archive-backend.d.ts.map +1 -0
- package/dist/tools-logic/local-archive-backend.js +124 -0
- package/dist/tools-logic/local-archive-backend.js.map +1 -0
- package/dist/tools-logic/memory-backend.d.ts +74 -0
- package/dist/tools-logic/memory-backend.d.ts.map +1 -0
- package/dist/tools-logic/memory-backend.js +172 -0
- package/dist/tools-logic/memory-backend.js.map +1 -0
- 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 +90 -0
- package/dist/tools-logic/prior-builder.js.map +1 -0
- package/dist/tools-logic/recognition-builder.d.ts +122 -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 +69 -30
- package/dist/tools-logic/session-end-reflect.js.map +1 -1
- package/dist/tools-logic/session-end.d.ts +18 -0
- package/dist/tools-logic/session-end.d.ts.map +1 -1
- package/dist/tools-logic/session-end.js +189 -34
- 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 +11 -2
- package/dist/tools-logic/session-start-lite.js.map +1 -1
- package/dist/tools-logic/session-start.d.ts +81 -2
- package/dist/tools-logic/session-start.d.ts.map +1 -1
- package/dist/tools-logic/session-start.js +357 -40
- 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/smart-remember.js +8 -9
- package/dist/tools-logic/smart-remember.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/embedding.d.ts +8 -0
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +9 -1
- package/dist/vector/embedding.js.map +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 +2 -2
- 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,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* retention.ts — single source of truth for the raw-archive retention window.
|
|
3
|
+
*
|
|
4
|
+
* Both the PRUNE pass (safety-consolidation.ts) and the integrity CHECK
|
|
5
|
+
* (store-doctor.ts) must agree on "how old is too old" for a raw segment.
|
|
6
|
+
* Each used to hard-code 90; that let the doctor flag a stall at a DIFFERENT
|
|
7
|
+
* threshold than the pruner actually used once an operator set a config
|
|
8
|
+
* override — the config-divergence the round-table caught. Lifting the knob
|
|
9
|
+
* here keeps them in lockstep.
|
|
10
|
+
*
|
|
11
|
+
* Resolution order: explicit arg > AGENT_RECALL_ARCHIVE_RETENTION_DAYS env >
|
|
12
|
+
* config.json `archive_retention_days` > DEFAULT_ARCHIVE_RETENTION_DAYS.
|
|
13
|
+
*
|
|
14
|
+
* Defensive by contract: a config read failure falls back to the default. The
|
|
15
|
+
* store-doctor calls this on the read-only session_start hot path and must
|
|
16
|
+
* never throw, so this function never throws either.
|
|
17
|
+
*/
|
|
18
|
+
import { readSupabaseConfig } from "../supabase/config.js";
|
|
19
|
+
/** Default raw-archive retention window (days): segments older than this AND
|
|
20
|
+
* distilled are pruned/gzipped, and the doctor flags them if still unconsumed. */
|
|
21
|
+
export const DEFAULT_ARCHIVE_RETENTION_DAYS = 90;
|
|
22
|
+
/** Resolve the effective retention window. See file header for the order. */
|
|
23
|
+
export function resolveRetentionDays(explicit) {
|
|
24
|
+
if (typeof explicit === "number" && Number.isFinite(explicit) && explicit > 0) {
|
|
25
|
+
return explicit;
|
|
26
|
+
}
|
|
27
|
+
const env = process.env.AGENT_RECALL_ARCHIVE_RETENTION_DAYS;
|
|
28
|
+
if (env) {
|
|
29
|
+
const n = Number(env);
|
|
30
|
+
if (Number.isFinite(n) && n > 0)
|
|
31
|
+
return n;
|
|
32
|
+
}
|
|
33
|
+
// config.json may carry an optional archive_retention_days (not part of the
|
|
34
|
+
// typed SupabaseConfig, so read the raw shape defensively).
|
|
35
|
+
try {
|
|
36
|
+
const cfg = readSupabaseConfig();
|
|
37
|
+
if (cfg &&
|
|
38
|
+
typeof cfg.archive_retention_days === "number" &&
|
|
39
|
+
cfg.archive_retention_days > 0) {
|
|
40
|
+
return cfg.archive_retention_days;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// best-effort — fall through to default (never throw on the hot path)
|
|
45
|
+
}
|
|
46
|
+
return DEFAULT_ARCHIVE_RETENTION_DAYS;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=retention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention.js","sourceRoot":"","sources":["../../src/storage/retention.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D;mFACmF;AACnF,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAEjD,6EAA6E;AAC7E,MAAM,UAAU,oBAAoB,CAAC,QAAiB;IACpD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC9E,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC;IAC5D,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,4EAA4E;IAC5E,4DAA4D;IAC5D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,kBAAkB,EAEtB,CAAC;QACT,IACE,GAAG;YACH,OAAO,GAAG,CAAC,sBAAsB,KAAK,QAAQ;YAC9C,GAAG,CAAC,sBAAsB,GAAG,CAAC,EAC9B,CAAC;YACD,OAAO,GAAG,CAAC,sBAAsB,CAAC;QACpC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;IACxE,CAAC;IACD,OAAO,8BAA8B,CAAC;AACxC,CAAC"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Example: 2026-05-04--arsave--shipped--version-bump--v341-release.md
|
|
8
8
|
*
|
|
9
|
-
* - save-type: arsave / arsaveall / hook-end / hook-correction / capture
|
|
9
|
+
* - save-type: arsave / arsaveall / hook-end / hook-correction / capture / hook-archive
|
|
10
10
|
* - sig: significance tag (SignificanceTag) — why this session matters
|
|
11
11
|
* - theme: recurring theme tag (ThemeTag) — cross-session pattern
|
|
12
12
|
* - topic-slug: semantic keywords from generateSlug(), max 35 chars
|
|
@@ -17,7 +17,7 @@ import type { SignificanceTag, ThemeTag } from "../helpers/journal-sig-theme.js"
|
|
|
17
17
|
/** Get the current process session ID. */
|
|
18
18
|
export declare function getSessionId(): string;
|
|
19
19
|
/** Save type for intelligent naming. */
|
|
20
|
-
export type SaveType = "arsave" | "arsaveall" | "hook-end" | "hook-correction" | "capture";
|
|
20
|
+
export type SaveType = "arsave" | "arsaveall" | "hook-end" | "hook-correction" | "capture" | "hook-archive";
|
|
21
21
|
export interface SmartNameOpts {
|
|
22
22
|
saveType: SaveType;
|
|
23
23
|
content: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/storage/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAQjF,0CAA0C;AAC1C,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wCAAwC;AACxC,MAAM,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/storage/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAQjF,0CAA0C;AAC1C,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wCAAwC;AACxC,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,WAAW,GACX,UAAU,GACV,iBAAiB,GACjB,SAAS,GACT,cAAc,CAAC;AAEnB,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,eAAe,CAAC;IACtB,KAAK,CAAC,EAAE,QAAQ,CAAC;CAClB;AAED,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAUjF;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CA+D7G;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CA8BhH;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
package/dist/storage/session.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Example: 2026-05-04--arsave--shipped--version-bump--v341-release.md
|
|
8
8
|
*
|
|
9
|
-
* - save-type: arsave / arsaveall / hook-end / hook-correction / capture
|
|
9
|
+
* - save-type: arsave / arsaveall / hook-end / hook-correction / capture / hook-archive
|
|
10
10
|
* - sig: significance tag (SignificanceTag) — why this session matters
|
|
11
11
|
* - theme: recurring theme tag (ThemeTag) — cross-session pattern
|
|
12
12
|
* - topic-slug: semantic keywords from generateSlug(), max 35 chars
|
|
@@ -107,6 +107,16 @@ export function journalFileName(date, baseExists, opts, dir) {
|
|
|
107
107
|
*/
|
|
108
108
|
export function captureLogFileName(date, baseExists, opts, dir) {
|
|
109
109
|
if (opts?.saveType && opts?.content) {
|
|
110
|
+
// SAME-DAY RULE: if any capture file for today already exists, reuse it so
|
|
111
|
+
// entry numbers accumulate within one file per day per project.
|
|
112
|
+
if (dir && fs.existsSync(dir)) {
|
|
113
|
+
const existingCapture = fs.readdirSync(dir)
|
|
114
|
+
.filter(f => f.startsWith(date) && f.endsWith(".md") &&
|
|
115
|
+
(f.includes("-log.md") || f.includes("--capture--")))
|
|
116
|
+
.sort()[0];
|
|
117
|
+
if (existingCapture)
|
|
118
|
+
return existingCapture;
|
|
119
|
+
}
|
|
110
120
|
const slug = topicSlug(opts.content);
|
|
111
121
|
const sigTag = opts.sig ?? "none";
|
|
112
122
|
const themeTag = opts.theme ?? "none";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/storage/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,mEAAmE;AACnE,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAEzD,yDAAyD;AACzD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;AAErC,0CAA0C;AAC1C,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC;AACpB,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/storage/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,32 @@ export interface SupabaseConfig {
|
|
|
4
4
|
embedding_provider: "openai" | "voyage";
|
|
5
5
|
embedding_api_key: string;
|
|
6
6
|
sync_enabled: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Whether personal-tier data (corrections-derived awareness / Blind Spots,
|
|
9
|
+
* `_global` palace) is allowed to leave the machine via Supabase. Defaults to
|
|
10
|
+
* `false` — the privacy boundary (Decision #6). Flipping this to `true`
|
|
11
|
+
* re-feeds the war-room dashboard's `ar_awareness` reads.
|
|
12
|
+
* Env override: AGENT_RECALL_SYNC_PERSONAL=true|false.
|
|
13
|
+
*/
|
|
14
|
+
sync_personal: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* DOUBLE OPT-IN guard for corrections sync.
|
|
17
|
+
*
|
|
18
|
+
* /corrections/ is a PERSONAL_PATH_MARKER (classification.ts) — a deliberate
|
|
19
|
+
* privacy-tier decision, not an oversight. Corrections carry the raw behavioral
|
|
20
|
+
* layer (rules, context, tags) and are gated by default.
|
|
21
|
+
*
|
|
22
|
+
* To sync corrections to Supabase you must set BOTH:
|
|
23
|
+
* 1. sync_personal=true (existing cloud opt-in, Decision #6)
|
|
24
|
+
* 2. sync_corrections=true (this flag / AR_SYNC_CORRECTIONS=1)
|
|
25
|
+
*
|
|
26
|
+
* The synced payload is NEVER raw CorrectionRecord — it is always the
|
|
27
|
+
* scrubbed CorrectionExport projection (exportCorrections) routed through
|
|
28
|
+
* the existing doSync egress chokepoint. No new egress path is created.
|
|
29
|
+
*
|
|
30
|
+
* Env override: AR_SYNC_CORRECTIONS=1|true.
|
|
31
|
+
*/
|
|
32
|
+
sync_corrections: boolean;
|
|
7
33
|
}
|
|
8
34
|
export declare function readSupabaseConfig(): SupabaseConfig | null;
|
|
9
35
|
export declare function writeSupabaseConfig(config: SupabaseConfig): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/supabase/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACxC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/supabase/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACxC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB;;;;;;OAMG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB;;;;;;;;;;;;;;;;OAgBG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAMD,wBAAgB,kBAAkB,IAAI,cAAc,GAAG,IAAI,CAuC1D;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAIhE"}
|
package/dist/supabase/config.js
CHANGED
|
@@ -25,6 +25,15 @@ export function readSupabaseConfig() {
|
|
|
25
25
|
config.embedding_provider = process.env.AGENT_RECALL_EMBEDDING_PROVIDER;
|
|
26
26
|
if (process.env.AGENT_RECALL_EMBEDDING_KEY)
|
|
27
27
|
config.embedding_api_key = process.env.AGENT_RECALL_EMBEDDING_KEY;
|
|
28
|
+
// Personal-data egress flag (default false). Present-but-any-value env wins over file.
|
|
29
|
+
if (process.env.AGENT_RECALL_SYNC_PERSONAL !== undefined) {
|
|
30
|
+
config.sync_personal = process.env.AGENT_RECALL_SYNC_PERSONAL === "true";
|
|
31
|
+
}
|
|
32
|
+
// Corrections sync second opt-in (AR_SYNC_CORRECTIONS=1|true). Independent of
|
|
33
|
+
// sync_personal — both must be true before corrections leave the machine.
|
|
34
|
+
if (process.env.AR_SYNC_CORRECTIONS !== undefined) {
|
|
35
|
+
config.sync_corrections = process.env.AR_SYNC_CORRECTIONS === "1" || process.env.AR_SYNC_CORRECTIONS === "true";
|
|
36
|
+
}
|
|
28
37
|
if (!config.supabase_url || !config.supabase_anon_key)
|
|
29
38
|
return null;
|
|
30
39
|
if (config.sync_enabled === false)
|
|
@@ -35,6 +44,8 @@ export function readSupabaseConfig() {
|
|
|
35
44
|
embedding_provider: config.embedding_provider ?? "openai",
|
|
36
45
|
embedding_api_key: config.embedding_api_key ?? "",
|
|
37
46
|
sync_enabled: config.sync_enabled ?? true,
|
|
47
|
+
sync_personal: config.sync_personal ?? false,
|
|
48
|
+
sync_corrections: config.sync_corrections ?? false,
|
|
38
49
|
};
|
|
39
50
|
}
|
|
40
51
|
export function writeSupabaseConfig(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/supabase/config.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/supabase/config.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAoCtC,SAAS,UAAU;IACjB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,IAAI,MAAM,GAA4B,EAAE,CAAC;IAEzC,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;IACvB,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB;QAAE,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACvG,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB;QAAE,MAAM,CAAC,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IAC5G,IAAI,OAAO,CAAC,GAAG,CAAC,+BAA+B;QAAE,MAAM,CAAC,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,+BAAsD,CAAC;IAChJ,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B;QAAE,MAAM,CAAC,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IAC9G,uFAAuF;IACvF,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,SAAS,EAAE,CAAC;QACzD,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,MAAM,CAAC;IAC3E,CAAC;IACD,8EAA8E;IAC9E,0EAA0E;IAC1E,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAClD,MAAM,CAAC,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,MAAM,CAAC;IAClH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,iBAAiB;QAAE,OAAO,IAAI,CAAC;IACnE,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAE/C,OAAO;QACL,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,QAAQ;QACzD,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE;QACjD,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI;QACzC,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,KAAK;QAC5C,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,KAAK;KACnD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAsB;IACxD,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;IACvB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall-backend.d.ts","sourceRoot":"","sources":["../../src/supabase/recall-backend.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"recall-backend.d.ts","sourceRoot":"","sources":["../../src/supabase/recall-backend.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgBlD,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAA2B;gBAEhC,MAAM,EAAE,cAAc;IAOlC,SAAS,IAAI,OAAO;IAId,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,gBAAgB,EAAE,CAAC;CAiH/B"}
|
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
// packages/core/src/supabase/recall-backend.ts
|
|
2
2
|
import { getSupabaseClient } from "./client.js";
|
|
3
3
|
import { createEmbeddingProvider } from "./embedding.js";
|
|
4
|
+
import { calibratedConfidence } from "../tools-logic/confidence.js";
|
|
4
5
|
// Import the interface type — we can't import directly from recall-backend.ts
|
|
5
6
|
// because it would create a circular dependency (it dynamically imports us).
|
|
6
7
|
// Instead, we define the same shape and the getRecallBackend() factory casts.
|
|
7
8
|
/** RRF constant (same as local backend). */
|
|
8
9
|
const RRF_K = 60;
|
|
9
|
-
|
|
10
|
-
function
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
if (score >= 0.025)
|
|
14
|
-
return "medium"; // top of ~1.5 lists
|
|
15
|
-
if (score >= 0.015)
|
|
16
|
-
return "low"; // top of 1 list
|
|
17
|
-
return "weak";
|
|
10
|
+
/** Compute the human label + stored calibrated value for a score (Wave 4). */
|
|
11
|
+
function label(score, scale) {
|
|
12
|
+
const c = calibratedConfidence(score, scale);
|
|
13
|
+
return { confidence: c.label, calibrated: c.calibrated };
|
|
18
14
|
}
|
|
19
15
|
export class SupabaseRecallBackend {
|
|
20
16
|
config;
|
|
@@ -72,7 +68,8 @@ export class SupabaseRecallBackend {
|
|
|
72
68
|
title: (r.title ?? r.slug),
|
|
73
69
|
excerpt: (r.body ?? "").slice(0, 300),
|
|
74
70
|
score: r.similarity ?? 0,
|
|
75
|
-
|
|
71
|
+
// cosine similarity is already 0..1.
|
|
72
|
+
...label(r.similarity ?? 0, "cosine"),
|
|
76
73
|
room: r.room ?? undefined,
|
|
77
74
|
}));
|
|
78
75
|
const insightItemsList = (insightResults.data ?? []).map((r) => ({
|
|
@@ -81,7 +78,8 @@ export class SupabaseRecallBackend {
|
|
|
81
78
|
title: r.title,
|
|
82
79
|
excerpt: `[${r.severity}] confirmed ${r.confirmed}x`,
|
|
83
80
|
score: r.similarity ?? 0,
|
|
84
|
-
|
|
81
|
+
// cosine similarity is already 0..1.
|
|
82
|
+
...label(r.similarity ?? 0, "cosine"),
|
|
85
83
|
severity: r.severity,
|
|
86
84
|
}));
|
|
87
85
|
const ftsItems = (ftsResults.data ?? []).map((r, idx) => ({
|
|
@@ -90,7 +88,8 @@ export class SupabaseRecallBackend {
|
|
|
90
88
|
title: (r.title ?? r.slug),
|
|
91
89
|
excerpt: (r.body ?? "").slice(0, 300),
|
|
92
90
|
score: 1 / (idx + 1),
|
|
93
|
-
|
|
91
|
+
// reciprocal-rank 1/(idx+1) is already 0..1.
|
|
92
|
+
...label(1 / (idx + 1), "cosine"),
|
|
94
93
|
room: r.room ?? undefined,
|
|
95
94
|
}));
|
|
96
95
|
// RRF merge across all three
|
|
@@ -119,7 +118,8 @@ export class SupabaseRecallBackend {
|
|
|
119
118
|
if (seen.has(key))
|
|
120
119
|
continue;
|
|
121
120
|
seen.add(key);
|
|
122
|
-
|
|
121
|
+
// Final RRF score → rrf-supabase scale.
|
|
122
|
+
deduped.push({ ...item, score, ...label(score, "rrf-supabase") });
|
|
123
123
|
}
|
|
124
124
|
deduped.sort((a, b) => b.score - a.score);
|
|
125
125
|
return deduped.slice(0, limit);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall-backend.js","sourceRoot":"","sources":["../../src/supabase/recall-backend.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAA0B,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"recall-backend.js","sourceRoot":"","sources":["../../src/supabase/recall-backend.ts"],"names":[],"mappings":"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"}
|
package/dist/supabase/sync.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export interface ParsedMemoryFile {
|
|
|
8
8
|
export declare function parseMemoryFile(content: string): ParsedMemoryFile;
|
|
9
9
|
export declare function deriveSlug(filePath: string): string;
|
|
10
10
|
export declare function logSyncError(message: string): void;
|
|
11
|
-
export declare function syncToSupabase(filePath: string, content: string, project: string, store: "journal" | "palace" | "awareness" | "digest", room?: string): void;
|
|
11
|
+
export declare function syncToSupabase(filePath: string, content: string, project: string, store: "journal" | "palace" | "awareness" | "digest" | "corrections", room?: string): void;
|
|
12
12
|
export declare function backfill(project: string, files: Array<{
|
|
13
13
|
path: string;
|
|
14
14
|
content: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/supabase/sync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/supabase/sync.ts"],"names":[],"mappings":"AAgBA,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CA8BjE;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAanD;AAMD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAelD;AAgBD,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,aAAa,EACpE,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI,CAuCN;AA8GD,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACnH,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAsC9D"}
|
package/dist/supabase/sync.js
CHANGED
|
@@ -6,6 +6,9 @@ import * as path from "node:path";
|
|
|
6
6
|
import { getSupabaseClient } from "./client.js";
|
|
7
7
|
import { readSupabaseConfig } from "./config.js";
|
|
8
8
|
import { createEmbeddingProvider } from "./embedding.js";
|
|
9
|
+
import { classifyStore } from "../storage/classification.js";
|
|
10
|
+
import { scrubForCloud } from "../storage/content-guard.js";
|
|
11
|
+
import { exportCorrections } from "../tools-logic/export-corrections.js";
|
|
9
12
|
// ---------------------------------------------------------------------------
|
|
10
13
|
// Utilities (exported for testing)
|
|
11
14
|
// ---------------------------------------------------------------------------
|
|
@@ -91,6 +94,41 @@ function getEmbeddingProvider() {
|
|
|
91
94
|
return _embeddingProvider;
|
|
92
95
|
}
|
|
93
96
|
export function syncToSupabase(filePath, content, project, store, room) {
|
|
97
|
+
// PRIVACY GATE (Wave 1, Decision #6): personal-tier data (awareness behavioral
|
|
98
|
+
// layer, _global palace) does not leave the machine unless sync_personal=true.
|
|
99
|
+
// Silent skip preserves the fire-and-forget contract.
|
|
100
|
+
// NOTE: flipping config.sync_personal=true re-feeds the war-room dashboard's
|
|
101
|
+
// ar_awareness reads.
|
|
102
|
+
if (classifyStore(store, { project }) === "personal" && readSupabaseConfig()?.sync_personal !== true) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// DOUBLE OPT-IN GATE for corrections (privacy-tier decision, classification.ts).
|
|
106
|
+
// /corrections/ is a PERSONAL_PATH_MARKER — NOT an oversight. Corrections carry
|
|
107
|
+
// the raw behavioral layer (rules, context, tags) and must not leave the machine
|
|
108
|
+
// unless the user has explicitly opted into BOTH:
|
|
109
|
+
// 1. sync_personal=true (the existing cloud opt-in, Decision #6)
|
|
110
|
+
// 2. sync_corrections=true (the second opt-in for the corrections tier)
|
|
111
|
+
// Both missing, or only one set → silent skip. This preserves the fire-and-forget
|
|
112
|
+
// contract and does not produce a visible error — same as the sync_personal gate.
|
|
113
|
+
if (store === "corrections") {
|
|
114
|
+
const config = readSupabaseConfig();
|
|
115
|
+
if (!config?.sync_personal || !config?.sync_corrections) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// Corrections sync: emit the scrubbed CorrectionExport projection via the
|
|
119
|
+
// EXISTING egress chokepoint (doSync). The raw CorrectionRecord is NEVER
|
|
120
|
+
// written directly — exportCorrections() applies the fail-closed scrubForExport
|
|
121
|
+
// to every free-text field before we touch the network.
|
|
122
|
+
//
|
|
123
|
+
// The `content` parameter is the correction id (used as the slug discriminator
|
|
124
|
+
// and to scope the single-record export). We re-derive the scrubbed payload from
|
|
125
|
+
// exportCorrections so the doSync path always receives pre-scrubbed JSON.
|
|
126
|
+
const correctionId = content; // caller convention: content = correction id
|
|
127
|
+
setImmediate(() => {
|
|
128
|
+
void syncCorrectionRecord(filePath, correctionId, project);
|
|
129
|
+
});
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
94
132
|
setImmediate(() => {
|
|
95
133
|
void doSync(filePath, content, project, store, room);
|
|
96
134
|
});
|
|
@@ -100,7 +138,15 @@ async function doSync(filePath, content, project, store, room) {
|
|
|
100
138
|
const client = getSupabaseClient();
|
|
101
139
|
if (!client)
|
|
102
140
|
return;
|
|
103
|
-
|
|
141
|
+
// EGRESS CHOKEPOINT — authoritative scrub for ALL upload paths
|
|
142
|
+
// (syncToSupabase + backfill). Scrub happens BEFORE hashing so the stored
|
|
143
|
+
// hash always matches the hash computed by backfill's skip-dedup check.
|
|
144
|
+
// Call-site scrubs (the 9 syncToSupabase callers that pre-wrap content in
|
|
145
|
+
// scrubForCloud) are redundant defense-in-depth — scrubForCloud is idempotent,
|
|
146
|
+
// so double-scrub is safe and the call-site wraps are intentionally kept as a
|
|
147
|
+
// privacy boundary safeguard.
|
|
148
|
+
const scrubbedContent = scrubForCloud(content);
|
|
149
|
+
const hash = contentHash(scrubbedContent);
|
|
104
150
|
const { data: existing } = await client
|
|
105
151
|
.from("ar_sync_state")
|
|
106
152
|
.select("file_hash")
|
|
@@ -108,7 +154,7 @@ async function doSync(filePath, content, project, store, room) {
|
|
|
108
154
|
.single();
|
|
109
155
|
if (existing?.file_hash === hash)
|
|
110
156
|
return;
|
|
111
|
-
const parsed = parseMemoryFile(
|
|
157
|
+
const parsed = parseMemoryFile(scrubbedContent);
|
|
112
158
|
const slug = deriveSlug(filePath);
|
|
113
159
|
const { data: entry, error: upsertErr } = await client
|
|
114
160
|
.from("ar_entries")
|
|
@@ -150,6 +196,33 @@ async function doSync(filePath, content, project, store, room) {
|
|
|
150
196
|
logSyncError(`doSync failed for ${filePath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
151
197
|
}
|
|
152
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* Sync a single CorrectionRecord (by id) for a project through the existing
|
|
201
|
+
* doSync egress chokepoint. The raw record is never emitted — exportCorrections()
|
|
202
|
+
* applies the fail-closed scrubForExport to every free-text field. If the record
|
|
203
|
+
* does not exist (retracted or unknown id) we silently return without error.
|
|
204
|
+
*
|
|
205
|
+
* Called only from the syncToSupabase "corrections" store branch, which has
|
|
206
|
+
* already verified the double opt-in.
|
|
207
|
+
*/
|
|
208
|
+
async function syncCorrectionRecord(filePath, correctionId, project) {
|
|
209
|
+
try {
|
|
210
|
+
// Export the single correction (project + no retracted). If the id doesn't
|
|
211
|
+
// exist in the active set (already retracted or bad id) → empty → skip.
|
|
212
|
+
const rows = exportCorrections({ project, includeRetracted: true });
|
|
213
|
+
const row = rows.find((r) => r.id === correctionId);
|
|
214
|
+
if (!row)
|
|
215
|
+
return; // retracted or not found — nothing to sync
|
|
216
|
+
// Serialize the CorrectionExport projection as the "content" for doSync.
|
|
217
|
+
// scrubForExport (inside exportCorrections) already redacted every free-text
|
|
218
|
+
// field, so doSync's internal scrubForCloud re-scrub is a no-op (idempotent).
|
|
219
|
+
const scrubbedJson = JSON.stringify(row);
|
|
220
|
+
await doSync(filePath, scrubbedJson, project, "corrections");
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
logSyncError(`syncCorrectionRecord failed for ${filePath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
153
226
|
export async function backfill(project, files) {
|
|
154
227
|
const client = getSupabaseClient();
|
|
155
228
|
if (!client)
|
|
@@ -157,7 +230,16 @@ export async function backfill(project, files) {
|
|
|
157
230
|
let synced = 0, skipped = 0, failed = 0;
|
|
158
231
|
for (const file of files) {
|
|
159
232
|
try {
|
|
160
|
-
|
|
233
|
+
// PRIVACY GATE (Wave 1): backfill() calls doSync() directly, bypassing
|
|
234
|
+
// syncToSupabase()'s gate — so re-apply it here. Count as skipped.
|
|
235
|
+
if (classifyStore(file.store, { project }) === "personal" && readSupabaseConfig()?.sync_personal !== true) {
|
|
236
|
+
skipped++;
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
// Skip-dedup hash must match what doSync stores: hash of SCRUBBED content.
|
|
240
|
+
// Using raw content here would cause raw_hash != scrubbed_hash for any file
|
|
241
|
+
// containing a secret pattern, making the skip never fire → re-uploads every run.
|
|
242
|
+
const hash = contentHash(scrubForCloud(file.content));
|
|
161
243
|
const { data: existing } = await client
|
|
162
244
|
.from("ar_sync_state")
|
|
163
245
|
.select("file_hash")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/supabase/sync.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAA0B,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/supabase/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,21 @@ export interface BootstrapScanResult {
|
|
|
37
37
|
total_already_in_ar: number;
|
|
38
38
|
scan_duration_ms: number;
|
|
39
39
|
};
|
|
40
|
+
/**
|
|
41
|
+
* SECURITY: Session nonce — a GUID generated at scan time, embedded in the
|
|
42
|
+
* result, and required by bootstrapImport(). This gates the import: only
|
|
43
|
+
* scan results from THIS process's session can be imported, preventing
|
|
44
|
+
* cross-session replay and attacker fabrication of scan_result objects.
|
|
45
|
+
*
|
|
46
|
+
* The nonce is an opaque string — importers must pass it through unchanged.
|
|
47
|
+
*/
|
|
48
|
+
_session_nonce: string;
|
|
49
|
+
/**
|
|
50
|
+
* The resolved (realpath) scan roots used during this scan. bootstrapImport()
|
|
51
|
+
* re-validates every source_path against this list to prevent symlink-escaped
|
|
52
|
+
* paths injected via a fabricated scan_result.
|
|
53
|
+
*/
|
|
54
|
+
_scan_roots: string[];
|
|
40
55
|
}
|
|
41
56
|
export interface ImportSelection {
|
|
42
57
|
project_slugs?: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/tools-logic/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/tools-logic/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiHH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,KAAK,GAAG,eAAe,GAAG,UAAU,GAAG,cAAc,CAAC;QAC5D,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,cAAc,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,CAAC;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,KAAK,EAAE;QACL,cAAc,EAAE,MAAM,CAAC;QACvB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,mBAAmB,EAAE,MAAM,CAAC;QAC5B,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF;;;;;;;OAOG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,WAAW,EAAE,MAAM,CAAC;CACrB;AA+TD,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE;IAC5C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgS/B;AAMD,wBAAsB,eAAe,CACnC,IAAI,EAAE,mBAAmB,EACzB,SAAS,CAAC,EAAE,eAAe,GAC1B,OAAO,CAAC,YAAY,CAAC,CAgVvB"}
|