agent-recall-core 3.3.10 → 3.3.11

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 (54) hide show
  1. package/README.md +2 -2
  2. package/dist/helpers/alignment-patterns.d.ts +19 -0
  3. package/dist/helpers/alignment-patterns.d.ts.map +1 -0
  4. package/dist/helpers/alignment-patterns.js +47 -0
  5. package/dist/helpers/alignment-patterns.js.map +1 -0
  6. package/dist/helpers/auto-name.d.ts +42 -0
  7. package/dist/helpers/auto-name.d.ts.map +1 -0
  8. package/dist/helpers/auto-name.js +210 -0
  9. package/dist/helpers/auto-name.js.map +1 -0
  10. package/dist/index.d.ts +10 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +12 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/palace/awareness.d.ts +4 -0
  15. package/dist/palace/awareness.d.ts.map +1 -1
  16. package/dist/palace/awareness.js +102 -17
  17. package/dist/palace/awareness.js.map +1 -1
  18. package/dist/palace/fan-out.d.ts.map +1 -1
  19. package/dist/palace/fan-out.js +30 -1
  20. package/dist/palace/fan-out.js.map +1 -1
  21. package/dist/tools-logic/check.d.ts +33 -0
  22. package/dist/tools-logic/check.d.ts.map +1 -0
  23. package/dist/tools-logic/check.js +85 -0
  24. package/dist/tools-logic/check.js.map +1 -0
  25. package/dist/tools-logic/journal-capture.d.ts +1 -0
  26. package/dist/tools-logic/journal-capture.d.ts.map +1 -1
  27. package/dist/tools-logic/journal-capture.js +11 -1
  28. package/dist/tools-logic/journal-capture.js.map +1 -1
  29. package/dist/tools-logic/knowledge-write.d.ts.map +1 -1
  30. package/dist/tools-logic/knowledge-write.js +7 -1
  31. package/dist/tools-logic/knowledge-write.js.map +1 -1
  32. package/dist/tools-logic/palace-write.d.ts +2 -0
  33. package/dist/tools-logic/palace-write.d.ts.map +1 -1
  34. package/dist/tools-logic/palace-write.js +13 -1
  35. package/dist/tools-logic/palace-write.js.map +1 -1
  36. package/dist/tools-logic/session-end.d.ts +26 -0
  37. package/dist/tools-logic/session-end.d.ts.map +1 -0
  38. package/dist/tools-logic/session-end.js +68 -0
  39. package/dist/tools-logic/session-end.js.map +1 -0
  40. package/dist/tools-logic/session-start.d.ts +38 -0
  41. package/dist/tools-logic/session-start.d.ts.map +1 -0
  42. package/dist/tools-logic/session-start.js +91 -0
  43. package/dist/tools-logic/session-start.js.map +1 -0
  44. package/dist/tools-logic/smart-recall.d.ts +35 -0
  45. package/dist/tools-logic/smart-recall.d.ts.map +1 -0
  46. package/dist/tools-logic/smart-recall.js +199 -0
  47. package/dist/tools-logic/smart-recall.js.map +1 -0
  48. package/dist/tools-logic/smart-remember.d.ts +20 -0
  49. package/dist/tools-logic/smart-remember.d.ts.map +1 -0
  50. package/dist/tools-logic/smart-remember.js +136 -0
  51. package/dist/tools-logic/smart-remember.js.map +1 -0
  52. package/dist/types.d.ts +1 -1
  53. package/dist/types.js +1 -1
  54. package/package.json +1 -1
@@ -0,0 +1,26 @@
1
+ /**
2
+ * session_end — combined session save in one call.
3
+ *
4
+ * Replaces: awareness_update + journal_write + palace consolidation
5
+ */
6
+ export interface SessionEndInput {
7
+ summary: string;
8
+ insights?: Array<{
9
+ title: string;
10
+ evidence: string;
11
+ applies_when: string[];
12
+ source?: string;
13
+ severity?: "critical" | "important" | "minor";
14
+ }>;
15
+ trajectory?: string;
16
+ project?: string;
17
+ }
18
+ export interface SessionEndResult {
19
+ success: boolean;
20
+ journal_written: boolean;
21
+ insights_processed: number;
22
+ awareness_updated: boolean;
23
+ palace_consolidated: boolean;
24
+ }
25
+ export declare function sessionEnd(input: SessionEndInput): Promise<SessionEndResult>;
26
+ //# sourceMappingURL=session-end.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-end.d.ts","sourceRoot":"","sources":["../../src/tools-logic/session-end.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,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;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0DlF"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * session_end — combined session save in one call.
3
+ *
4
+ * Replaces: awareness_update + journal_write + palace consolidation
5
+ */
6
+ import { journalWrite } from "./journal-write.js";
7
+ import { awarenessUpdate } from "./awareness-update.js";
8
+ import { consolidateJournalToPalace } from "../palace/consolidate.js";
9
+ import { resolveProject } from "../storage/project.js";
10
+ import { ensurePalaceInitialized } from "../palace/rooms.js";
11
+ export async function sessionEnd(input) {
12
+ const slug = await resolveProject(input.project);
13
+ let journalWritten = false;
14
+ let insightsProcessed = 0;
15
+ let awarenessUpdated = false;
16
+ let palaceConsolidated = false;
17
+ // 1. Write journal summary
18
+ try {
19
+ const journalContent = [
20
+ "## Brief",
21
+ input.summary,
22
+ "",
23
+ input.trajectory ? `## Next\n${input.trajectory}` : "",
24
+ ].filter(Boolean).join("\n");
25
+ await journalWrite({ content: journalContent, project: slug });
26
+ journalWritten = true;
27
+ }
28
+ catch {
29
+ // Journal write is best-effort
30
+ }
31
+ // 2. Update awareness with insights
32
+ if (input.insights && input.insights.length > 0) {
33
+ try {
34
+ const result = await awarenessUpdate({
35
+ insights: input.insights.map((i) => ({
36
+ title: i.title,
37
+ evidence: i.evidence,
38
+ applies_when: i.applies_when,
39
+ source: i.source ?? `session_end ${new Date().toISOString().slice(0, 10)}`,
40
+ severity: i.severity,
41
+ })),
42
+ trajectory: input.trajectory,
43
+ });
44
+ insightsProcessed = result.insights_processed?.length ?? input.insights.length;
45
+ awarenessUpdated = true;
46
+ }
47
+ catch {
48
+ // Awareness update is best-effort
49
+ }
50
+ }
51
+ // 3. Consolidate journal to palace
52
+ try {
53
+ ensurePalaceInitialized(slug);
54
+ consolidateJournalToPalace(slug);
55
+ palaceConsolidated = true;
56
+ }
57
+ catch {
58
+ // Consolidation is best-effort
59
+ }
60
+ return {
61
+ success: journalWritten || awarenessUpdated,
62
+ journal_written: journalWritten,
63
+ insights_processed: insightsProcessed,
64
+ awareness_updated: awarenessUpdated,
65
+ palace_consolidated: palaceConsolidated,
66
+ };
67
+ }
68
+ //# sourceMappingURL=session-end.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-end.js","sourceRoot":"","sources":["../../src/tools-logic/session-end.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAuB7D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB;IACrD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,2BAA2B;IAC3B,IAAI,CAAC;QACH,MAAM,cAAc,GAAG;YACrB,UAAU;YACV,KAAK,CAAC,OAAO;YACb,EAAE;YACF,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;SACvD,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IAED,oCAAoC;IACpC,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;gBACnC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnC,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,YAAY,EAAE,CAAC,CAAC,YAAY;oBAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;oBAC1E,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB,CAAC,CAAC;gBACH,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC,CAAC;YACH,iBAAiB,GAAG,MAAM,CAAC,kBAAkB,EAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC/E,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,IAAI,CAAC;QACH,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAC9B,0BAA0B,CAAC,IAAI,CAAC,CAAC;QACjC,kBAAkB,GAAG,IAAI,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,cAAc,IAAI,gBAAgB;QAC3C,eAAe,EAAE,cAAc;QAC/B,kBAAkB,EAAE,iBAAiB;QACrC,iBAAiB,EAAE,gBAAgB;QACnC,mBAAmB,EAAE,kBAAkB;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * session_start — combined cold-start in one call.
3
+ *
4
+ * Replaces: journal_cold_start + palace_walk + recall_insight
5
+ * Target: <400 tokens output. No awareness duplication.
6
+ */
7
+ import { type WatchForPattern } from "../helpers/alignment-patterns.js";
8
+ export interface SessionStartInput {
9
+ project?: string;
10
+ context?: string;
11
+ }
12
+ export interface SessionStartResult {
13
+ project: string;
14
+ identity: string;
15
+ insights: Array<{
16
+ title: string;
17
+ confirmed: number;
18
+ severity: string;
19
+ }>;
20
+ active_rooms: Array<{
21
+ name: string;
22
+ salience: number;
23
+ one_liner: string;
24
+ }>;
25
+ cross_project: Array<{
26
+ title: string;
27
+ from_project: string;
28
+ relevance: number;
29
+ }>;
30
+ recent: {
31
+ today: string | null;
32
+ yesterday: string | null;
33
+ older_count: number;
34
+ };
35
+ watch_for: WatchForPattern[];
36
+ }
37
+ export declare function sessionStart(input: SessionStartInput): Promise<SessionStartResult>;
38
+ //# sourceMappingURL=session-start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../src/tools-logic/session-start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAIhH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3E,aAAa,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjF,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6ExF"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * session_start — combined cold-start in one call.
3
+ *
4
+ * Replaces: journal_cold_start + palace_walk + recall_insight
5
+ * Target: <400 tokens output. No awareness duplication.
6
+ */
7
+ import { resolveProject } from "../storage/project.js";
8
+ import { ensurePalaceInitialized, listRooms } from "../palace/rooms.js";
9
+ import { readIdentity } from "../palace/identity.js";
10
+ import { readAwarenessState } from "../palace/awareness.js";
11
+ import { recallInsights } from "../palace/insights-index.js";
12
+ import { journalDirs } from "../storage/paths.js";
13
+ import { extractSection } from "../helpers/sections.js";
14
+ import { todayISO } from "../storage/fs-utils.js";
15
+ import { readAlignmentLog, extractWatchPatterns } from "../helpers/alignment-patterns.js";
16
+ import * as fs from "node:fs";
17
+ import * as path from "node:path";
18
+ export async function sessionStart(input) {
19
+ const slug = await resolveProject(input.project);
20
+ ensurePalaceInitialized(slug);
21
+ // 1. Identity — first 2 lines only
22
+ const rawIdentity = readIdentity(slug);
23
+ const identityLines = rawIdentity.split("\n").filter((l) => l.trim() && !l.startsWith("---") && !l.startsWith(">"));
24
+ const identity = identityLines.slice(0, 2).join(" ").trim() || slug;
25
+ // 2. Top insights from awareness state (compact, no full markdown dump)
26
+ const state = readAwarenessState();
27
+ const insights = (state?.topInsights ?? []).slice(0, 5).map((i) => ({
28
+ title: i.title.slice(0, 80),
29
+ confirmed: i.confirmations ?? 1,
30
+ severity: "important",
31
+ }));
32
+ // 3. Active rooms — top 3 by salience
33
+ const rooms = listRooms(slug).slice(0, 3);
34
+ const active_rooms = rooms.map((r) => ({
35
+ name: r.name,
36
+ salience: r.salience,
37
+ one_liner: r.description.slice(0, 80),
38
+ }));
39
+ // 4. Cross-project insights matching current context
40
+ const context = input.context ?? slug;
41
+ const matched = recallInsights(context, 3);
42
+ const cross_project = matched.map((i) => ({
43
+ title: i.title.slice(0, 80),
44
+ from_project: (i.source ?? "unknown").slice(0, 30),
45
+ relevance: Math.round((i.relevance ?? 0) * 100) / 100,
46
+ }));
47
+ // 5. Recent journal briefs — today + yesterday only
48
+ const dirs = journalDirs(slug);
49
+ const today = todayISO();
50
+ const yesterday = new Date(Date.now() - 86400000).toISOString().slice(0, 10);
51
+ let todayBrief = null;
52
+ let yesterdayBrief = null;
53
+ let olderCount = 0;
54
+ for (const dir of dirs) {
55
+ if (!fs.existsSync(dir))
56
+ continue;
57
+ const files = fs.readdirSync(dir).filter((f) => f.endsWith(".md")).sort().reverse();
58
+ for (const file of files) {
59
+ const dateMatch = file.match(/^(\d{4}-\d{2}-\d{2})/);
60
+ if (!dateMatch)
61
+ continue;
62
+ const d = dateMatch[1];
63
+ if (d === today && !todayBrief) {
64
+ const content = fs.readFileSync(path.join(dir, file), "utf-8");
65
+ const brief = extractSection(content, "brief");
66
+ todayBrief = brief ? brief.slice(0, 200) : content.split("\n").slice(0, 3).join(" ").slice(0, 200);
67
+ }
68
+ else if (d === yesterday && !yesterdayBrief) {
69
+ const content = fs.readFileSync(path.join(dir, file), "utf-8");
70
+ const brief = extractSection(content, "brief");
71
+ yesterdayBrief = brief ? brief.slice(0, 200) : content.split("\n").slice(0, 3).join(" ").slice(0, 200);
72
+ }
73
+ else if (d < yesterday) {
74
+ olderCount++;
75
+ }
76
+ }
77
+ }
78
+ // 6. Watch for — predictive warnings from past corrections
79
+ const alignLog = readAlignmentLog(slug);
80
+ const watch_for = extractWatchPatterns(alignLog, 2);
81
+ return {
82
+ project: slug,
83
+ identity,
84
+ insights,
85
+ active_rooms,
86
+ cross_project,
87
+ recent: { today: todayBrief, yesterday: yesterdayBrief, older_count: olderCount },
88
+ watch_for,
89
+ };
90
+ }
91
+ //# sourceMappingURL=session-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/tools-logic/session-start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * smart_recall — unified cross-store search.
3
+ *
4
+ * Searches palace, journal, and insights in one call.
5
+ * Returns ranked results with source attribution.
6
+ */
7
+ export interface RecallFeedback {
8
+ id?: string;
9
+ title?: string;
10
+ useful: boolean;
11
+ }
12
+ export interface SmartRecallInput {
13
+ query: string;
14
+ project?: string;
15
+ limit?: number;
16
+ feedback?: RecallFeedback[];
17
+ }
18
+ export interface SmartRecallResultItem {
19
+ id: string;
20
+ source: "palace" | "journal" | "insight";
21
+ title: string;
22
+ excerpt: string;
23
+ score: number;
24
+ room?: string;
25
+ date?: string;
26
+ severity?: string;
27
+ }
28
+ export interface SmartRecallResult {
29
+ query: string;
30
+ results: SmartRecallResultItem[];
31
+ total_searched: number;
32
+ sources_queried: string[];
33
+ }
34
+ export declare function smartRecall(input: SmartRecallInput): Promise<SmartRecallResult>;
35
+ //# sourceMappingURL=smart-recall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-recall.d.ts","sourceRoot":"","sources":["../../src/tools-logic/smart-recall.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,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,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAoDD,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+IrF"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * smart_recall — unified cross-store search.
3
+ *
4
+ * Searches palace, journal, and insights in one call.
5
+ * Returns ranked results with source attribution.
6
+ */
7
+ import * as fs from "node:fs";
8
+ import * as path from "node:path";
9
+ import { palaceSearch } from "./palace-search.js";
10
+ import { journalSearch } from "./journal-search.js";
11
+ import { recallInsight } from "./recall-insight.js";
12
+ import { getRoot } from "../types.js";
13
+ import { ensureDir } from "../storage/fs-utils.js";
14
+ /** Simple stable hash for feedback matching. */
15
+ function stableId(source, title) {
16
+ let hash = 0;
17
+ const str = `${source}:${title}`;
18
+ for (let i = 0; i < str.length; i++) {
19
+ const char = str.charCodeAt(i);
20
+ hash = ((hash << 5) - hash) + char;
21
+ hash |= 0;
22
+ }
23
+ return Math.abs(hash).toString(36).slice(0, 8);
24
+ }
25
+ // ---------------------------------------------------------------------------
26
+ // Helpers
27
+ // ---------------------------------------------------------------------------
28
+ /** Calculate keyword overlap between query and text. */
29
+ function keywordExactness(query, text) {
30
+ const queryWords = query.toLowerCase().split(/\s+/).filter((w) => w.length > 2);
31
+ if (queryWords.length === 0)
32
+ return 0;
33
+ const textLower = text.toLowerCase();
34
+ const matches = queryWords.filter((w) => textLower.includes(w));
35
+ return matches.length / queryWords.length;
36
+ }
37
+ /** Days between a date string and now. */
38
+ function daysSince(dateStr) {
39
+ const d = new Date(dateStr);
40
+ if (isNaN(d.getTime()))
41
+ return 365; // fallback: old
42
+ return Math.max(0, (Date.now() - d.getTime()) / (1000 * 60 * 60 * 24));
43
+ }
44
+ function feedbackLogPath() {
45
+ return path.join(getRoot(), "feedback-log.json");
46
+ }
47
+ function readFeedbackLog() {
48
+ const p = feedbackLogPath();
49
+ if (!fs.existsSync(p))
50
+ return [];
51
+ try {
52
+ return JSON.parse(fs.readFileSync(p, "utf-8"));
53
+ }
54
+ catch {
55
+ return [];
56
+ }
57
+ }
58
+ /** Process relevance feedback — store and adjust salience signals. */
59
+ function processFeedback(feedback, query) {
60
+ ensureDir(path.dirname(feedbackLogPath()));
61
+ const log = readFeedbackLog();
62
+ const date = new Date().toISOString().slice(0, 10);
63
+ for (const f of feedback) {
64
+ log.push({ query, id: f.id, title: f.title ?? "", useful: f.useful, date });
65
+ }
66
+ // Keep last 200 entries
67
+ fs.writeFileSync(feedbackLogPath(), JSON.stringify(log.slice(-200), null, 2), "utf-8");
68
+ }
69
+ export async function smartRecall(input) {
70
+ // Process relevance feedback if provided
71
+ if (input.feedback && input.feedback.length > 0) {
72
+ processFeedback(input.feedback, input.query);
73
+ }
74
+ const limit = input.limit ?? 10;
75
+ const allResults = [];
76
+ let totalSearched = 0;
77
+ const sourcesQueried = [];
78
+ // 1. Palace search
79
+ try {
80
+ const palaceResults = await palaceSearch({ query: input.query, project: input.project });
81
+ sourcesQueried.push("palace");
82
+ totalSearched += palaceResults.total_matches;
83
+ for (const r of palaceResults.results) {
84
+ const title = `${r.room}/${r.file}`;
85
+ allResults.push({
86
+ id: stableId("palace", title),
87
+ source: "palace",
88
+ title,
89
+ excerpt: r.excerpt,
90
+ score: 0, // computed below
91
+ room: r.room,
92
+ });
93
+ // Compute score: salience as relevance, keyword match, recency unknown (use salience as proxy)
94
+ const relevance = r.salience;
95
+ const exactness = keywordExactness(input.query, r.excerpt);
96
+ const recency = r.salience; // palace salience already incorporates recency
97
+ allResults[allResults.length - 1].score =
98
+ relevance * 0.50 + exactness * 0.30 + recency * 0.20;
99
+ }
100
+ }
101
+ catch {
102
+ // Palace may not be initialized
103
+ }
104
+ // 2. Journal search
105
+ try {
106
+ const journalResults = await journalSearch({
107
+ query: input.query,
108
+ project: input.project,
109
+ include_palace: false,
110
+ });
111
+ sourcesQueried.push("journal");
112
+ totalSearched += journalResults.results.length;
113
+ for (const r of journalResults.results) {
114
+ const days = daysSince(r.date);
115
+ const recency = Math.pow(0.95, days);
116
+ const exactness = keywordExactness(input.query, r.excerpt);
117
+ const title = `${r.date} / ${r.section}`;
118
+ allResults.push({
119
+ id: stableId("journal", title),
120
+ source: "journal",
121
+ title,
122
+ excerpt: r.excerpt,
123
+ score: recency * 0.50 + exactness * 0.30 + recency * 0.20,
124
+ date: r.date,
125
+ });
126
+ }
127
+ }
128
+ catch {
129
+ // Journal may not exist
130
+ }
131
+ // 3. Insight recall
132
+ try {
133
+ const insightResults = await recallInsight({
134
+ context: input.query,
135
+ limit: limit,
136
+ include_awareness: false,
137
+ });
138
+ sourcesQueried.push("insight");
139
+ totalSearched += insightResults.total_in_index;
140
+ // Normalize relevance scores
141
+ const maxRelevance = Math.max(1, ...insightResults.matching_insights.map((i) => i.relevance));
142
+ for (const i of insightResults.matching_insights) {
143
+ const relevance = i.relevance / maxRelevance;
144
+ const exactness = keywordExactness(input.query, i.title);
145
+ // Insights don't have dates, use confirmation count as a recency proxy
146
+ const recency = Math.min(1.0, Math.log2(i.confirmed + 1) / 3);
147
+ allResults.push({
148
+ id: stableId("insight", i.title),
149
+ source: "insight",
150
+ title: i.title,
151
+ excerpt: `[${i.severity}] ${i.applies_when.join(", ")}`,
152
+ score: relevance * 0.50 + exactness * 0.30 + recency * 0.20,
153
+ severity: i.severity,
154
+ });
155
+ }
156
+ }
157
+ catch {
158
+ // Insights may be empty
159
+ }
160
+ // 4.5 Apply feedback adjustments — query-aware, ID-first matching
161
+ const feedbackLog = readFeedbackLog();
162
+ if (feedbackLog.length > 0) {
163
+ // Pre-filter: only feedback from similar queries
164
+ const queryWords = input.query.toLowerCase().split(/\s+/).filter((w) => w.length > 2);
165
+ const relevantFeedback = feedbackLog.filter((f) => {
166
+ if (!f.query)
167
+ return true; // legacy entries without query always apply
168
+ const fWords = f.query.toLowerCase().split(/\s+/).filter((w) => w.length > 2);
169
+ const overlap = queryWords.filter((w) => fWords.includes(w)).length;
170
+ return overlap > 0;
171
+ });
172
+ for (const r of allResults) {
173
+ const match = (f) => (f.id && f.id === r.id) || (f.title && f.title === r.title);
174
+ const positives = relevantFeedback.filter((f) => match(f) && f.useful).length;
175
+ const negatives = relevantFeedback.filter((f) => match(f) && !f.useful).length;
176
+ r.score += (positives * 0.03) - (negatives * 0.05);
177
+ r.score = Math.max(0, Math.min(1, r.score));
178
+ }
179
+ }
180
+ // 5. Deduplicate: if same excerpt appears in palace and journal, keep palace
181
+ const seen = new Set();
182
+ const deduped = [];
183
+ for (const r of allResults) {
184
+ const key = r.excerpt.toLowerCase().replace(/\s+/g, " ").trim();
185
+ if (seen.has(key))
186
+ continue;
187
+ seen.add(key);
188
+ deduped.push(r);
189
+ }
190
+ // 5. Sort by score descending, return top N
191
+ deduped.sort((a, b) => b.score - a.score);
192
+ return {
193
+ query: input.query,
194
+ results: deduped.slice(0, limit),
195
+ total_searched: totalSearched,
196
+ sources_queried: sourcesQueried,
197
+ };
198
+ }
199
+ //# sourceMappingURL=smart-recall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-recall.js","sourceRoot":"","sources":["../../src/tools-logic/smart-recall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * smart_remember — classify content and route to the right memory store.
3
+ *
4
+ * Agents call one tool; the system figures out where it belongs.
5
+ * Pure keyword scoring, no LLM calls.
6
+ */
7
+ export interface SmartRememberInput {
8
+ content: string;
9
+ context?: string;
10
+ project?: string;
11
+ }
12
+ export interface SmartRememberResult {
13
+ success: boolean;
14
+ routed_to: string;
15
+ classification: string;
16
+ auto_name: string;
17
+ result: unknown;
18
+ }
19
+ export declare function smartRemember(input: SmartRememberInput): Promise<SmartRememberResult>;
20
+ //# sourceMappingURL=smart-remember.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-remember.d.ts","sourceRoot":"","sources":["../../src/tools-logic/smart-remember.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAwED,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiE3F"}