@pencil-agent/nano-mem 0.0.2 → 1.0.2
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/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -1
- package/dist/config.js.map +1 -1
- package/dist/consolidation.d.ts.map +1 -1
- package/dist/consolidation.js +25 -8
- package/dist/consolidation.js.map +1 -1
- package/dist/engine.d.ts +7 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +181 -65
- package/dist/engine.js.map +1 -1
- package/dist/extension.d.ts.map +1 -1
- package/dist/extension.js +70 -1
- package/dist/extension.js.map +1 -1
- package/dist/extraction.d.ts.map +1 -1
- package/dist/extraction.js +19 -2
- package/dist/extraction.js.map +1 -1
- package/dist/full-insights.d.ts.map +1 -1
- package/dist/full-insights.js +6 -5
- package/dist/full-insights.js.map +1 -1
- package/dist/i18n.d.ts +3 -0
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +56 -24
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/insights-html.js +1 -1
- package/dist/insights-html.js.map +1 -1
- package/dist/linking.js +1 -1
- package/dist/linking.js.map +1 -1
- package/dist/scoring.d.ts +10 -1
- package/dist/scoring.d.ts.map +1 -1
- package/dist/scoring.js +33 -0
- package/dist/scoring.js.map +1 -1
- package/dist/store.d.ts +5 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +40 -2
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +22 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +22 -10
- package/dist/update.js.map +1 -1
- package/package.json +3 -4
- package/src/cli.ts +1 -1
- package/src/config.ts +27 -1
- package/src/consolidation.ts +33 -9
- package/src/engine.ts +218 -118
- package/src/extension.ts +77 -1
- package/src/extraction.ts +19 -2
- package/src/full-insights.ts +6 -5
- package/src/i18n.ts +62 -24
- package/src/index.ts +4 -1
- package/src/insights-html.ts +1 -1
- package/src/linking.ts +1 -1
- package/src/scoring.ts +48 -1
- package/src/store.ts +41 -2
- package/src/types.ts +25 -2
- package/src/update.ts +22 -10
package/dist/cli.js
CHANGED
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;AAEnC,KAAK,UAAU,IAAI;IAClB,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;CAUb,CAAC,CAAC;QACD,OAAO;IACR,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvC,OAAO;IACR,CAAC;IAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO;QACR,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -4,6 +4,20 @@
|
|
|
4
4
|
* [POS]: Shared by engine and adapters; host products configure via this
|
|
5
5
|
*/
|
|
6
6
|
import type { MemoryScope } from "./types.js";
|
|
7
|
+
export interface ProgressiveRecallConfig {
|
|
8
|
+
/** Score threshold for Active tier — inject full detail */
|
|
9
|
+
thresholdActive: number;
|
|
10
|
+
/** Score threshold for Cue tier — inject name + summary + id */
|
|
11
|
+
thresholdCue: number;
|
|
12
|
+
/** Budget ratio for Active tier (default 0.15 = 15%) */
|
|
13
|
+
budgetActive: number;
|
|
14
|
+
/** Budget ratio for Cue tier (default 0.70 = 70%) */
|
|
15
|
+
budgetCue: number;
|
|
16
|
+
/** Force entries created within this many hours to Active tier */
|
|
17
|
+
forceRecentHours: number;
|
|
18
|
+
/** Force entries with importance >= this value to Active tier */
|
|
19
|
+
forceImportanceMin: number;
|
|
20
|
+
}
|
|
7
21
|
export interface NanomemConfig {
|
|
8
22
|
memoryDir: string;
|
|
9
23
|
tokenBudget: number;
|
|
@@ -41,6 +55,8 @@ export interface NanomemConfig {
|
|
|
41
55
|
locale: "en" | "zh";
|
|
42
56
|
/** Strength growth factor on each successful recall (spaced repetition) */
|
|
43
57
|
strengthGrowthFactor: number;
|
|
58
|
+
/** Progressive recall injection configuration */
|
|
59
|
+
progressiveRecall: ProgressiveRecallConfig;
|
|
44
60
|
}
|
|
45
61
|
export declare function getConfig(overrides?: Partial<NanomemConfig>): NanomemConfig;
|
|
46
62
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtG,sBAAsB,EAAE,MAAM,CAAC;IAC/B,+CAA+C;IAC/C,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,iEAAiE;IACjE,eAAe,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,uCAAuC;IACvC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,qDAAqD;IACrD,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,2EAA2E;IAC3E,oBAAoB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,uBAAuB;IACvC,2DAA2D;IAC3D,eAAe,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,gBAAgB,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,kBAAkB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtG,sBAAsB,EAAE,MAAM,CAAC;IAC/B,+CAA+C;IAC/C,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,iEAAiE;IACjE,eAAe,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,uCAAuC;IACvC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,qDAAqD;IACrD,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,2EAA2E;IAC3E,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iDAAiD;IACjD,iBAAiB,EAAE,uBAAuB,CAAC;CAC3C;AAmCD,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAkB3E"}
|
package/dist/config.js
CHANGED
|
@@ -24,9 +24,17 @@ const DEFAULT_HALF_LIFE = {
|
|
|
24
24
|
pattern: 180,
|
|
25
25
|
struggle: 120,
|
|
26
26
|
};
|
|
27
|
-
const DEFAULT_MAX_ENTRIES = { knowledge:
|
|
27
|
+
const DEFAULT_MAX_ENTRIES = { knowledge: 1000, lessons: 500, preferences: 200, work: 400, facets: 400 };
|
|
28
28
|
const DEFAULT_SCORE_WEIGHTS = { recency: 1, importance: 1, relevance: 1 };
|
|
29
29
|
const DEFAULT_EVICTION_WEIGHTS = { accessFrequency: 0.4, baseImpact: 0.6 };
|
|
30
|
+
const DEFAULT_PROGRESSIVE_RECALL = {
|
|
31
|
+
thresholdActive: 0.7,
|
|
32
|
+
thresholdCue: 0.35,
|
|
33
|
+
budgetActive: 0.15,
|
|
34
|
+
budgetCue: 0.70,
|
|
35
|
+
forceRecentHours: 24,
|
|
36
|
+
forceImportanceMin: 9,
|
|
37
|
+
};
|
|
30
38
|
export function getConfig(overrides) {
|
|
31
39
|
const tokenBudget = Number(process.env.NANOMEM_TOKEN_BUDGET) || 6000;
|
|
32
40
|
const memoryDir = process.env.NANOMEM_MEMORY_DIR || overrides?.memoryDir || join(homedir(), ".nanomem", "memory");
|
|
@@ -43,6 +51,7 @@ export function getConfig(overrides) {
|
|
|
43
51
|
defaultScope: overrides?.defaultScope,
|
|
44
52
|
locale,
|
|
45
53
|
strengthGrowthFactor: overrides?.strengthGrowthFactor ?? 1.5,
|
|
54
|
+
progressiveRecall: overrides?.progressiveRecall ?? { ...DEFAULT_PROGRESSIVE_RECALL },
|
|
46
55
|
};
|
|
47
56
|
}
|
|
48
57
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAuCjC,MAAM,cAAc,GAAG;IACtB,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,GAAG;IACd,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,GAAG;IAChB,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,IAAI;CACH,CAAC;AAEX,MAAM,iBAAiB,GAA2B;IACjD,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,GAAG;IACf,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;CACb,CAAC;AAEF,MAAM,mBAAmB,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACxG,MAAM,qBAAqB,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAC1E,MAAM,wBAAwB,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AAC3E,MAAM,0BAA0B,GAA4B;IAC3D,eAAe,EAAE,GAAG;IACpB,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,IAAI;IACf,gBAAgB,EAAE,EAAE;IACpB,kBAAkB,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,SAAkC;IAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC;IACrE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAClH,MAAM,MAAM,GAAI,OAAO,CAAC,GAAG,CAAC,cAA8B,IAAI,SAAS,EAAE,MAAM,IAAI,IAAI,CAAC;IACxF,OAAO;QACN,SAAS;QACT,WAAW,EAAE,SAAS,EAAE,WAAW,IAAI,WAAW;QAClD,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,EAAE,GAAG,cAAc,EAAE;QAClD,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI,EAAE,GAAG,iBAAiB,EAAE;QACzD,UAAU,EAAE,SAAS,EAAE,UAAU,IAAI,EAAE,GAAG,mBAAmB,EAAE;QAC/D,sBAAsB,EAAE,SAAS,EAAE,sBAAsB,IAAI,EAAE;QAC/D,YAAY,EAAE,SAAS,EAAE,YAAY,IAAI,EAAE,GAAG,qBAAqB,EAAE;QACrE,eAAe,EAAE,SAAS,EAAE,eAAe,IAAI,EAAE,GAAG,wBAAwB,EAAE;QAC9E,YAAY,EAAE,SAAS,EAAE,YAAY;QACrC,MAAM;QACN,oBAAoB,EAAE,SAAS,EAAE,oBAAoB,IAAI,GAAG;QAC5D,iBAAiB,EAAE,SAAS,EAAE,iBAAiB,IAAI,EAAE,GAAG,0BAA0B,EAAE;KACpF,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consolidation.d.ts","sourceRoot":"","sources":["../src/consolidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"consolidation.d.ts","sourceRoot":"","sources":["../src/consolidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM9D,wBAAsB,mBAAmB,CACxC,QAAQ,EAAE,OAAO,EAAE,EACnB,GAAG,EAAE,aAAa,EAClB,KAAK,CAAC,EAAE,KAAK,GACX,OAAO,CAAC,WAAW,EAAE,CAAC,CAaxB"}
|
package/dist/consolidation.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { PROMPTS } from "./i18n.js";
|
|
11
11
|
import { extractTags } from "./scoring.js";
|
|
12
|
+
import { deriveNameFromContent, deriveSummaryFromContent } from "./store.js";
|
|
12
13
|
function makeId() {
|
|
13
14
|
return `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
14
15
|
}
|
|
@@ -38,11 +39,17 @@ async function llmConsolidation(episodes, cfg, llmFn) {
|
|
|
38
39
|
const now = new Date().toISOString();
|
|
39
40
|
return items.map((item) => {
|
|
40
41
|
const type = item.type === "lesson" ? "lesson" : "fact";
|
|
42
|
+
const detail = item.detail || item.content || "";
|
|
43
|
+
const name = item.name || deriveNameFromContent(detail);
|
|
44
|
+
const summary = item.summary || deriveSummaryFromContent(detail);
|
|
41
45
|
return {
|
|
42
46
|
id: makeId(),
|
|
43
47
|
type,
|
|
44
|
-
|
|
45
|
-
|
|
48
|
+
name,
|
|
49
|
+
summary,
|
|
50
|
+
detail,
|
|
51
|
+
content: detail,
|
|
52
|
+
tags: extractTags(`${name} ${summary} ${detail}`),
|
|
46
53
|
project: episodes[0]?.project ?? "unknown",
|
|
47
54
|
importance: item.importance ?? 6,
|
|
48
55
|
strength: cfg.halfLife[type] ?? 30,
|
|
@@ -71,12 +78,17 @@ function heuristicConsolidation(episodes, cfg) {
|
|
|
71
78
|
.sort((a, b) => b[1] - a[1])
|
|
72
79
|
.slice(0, 5);
|
|
73
80
|
if (hotFiles.length) {
|
|
74
|
-
const
|
|
81
|
+
const detail = `Frequently modified files: ${hotFiles.map(([f, c]) => `${f} (${c}x)`).join(", ")}`;
|
|
82
|
+
const name = deriveNameFromContent(detail);
|
|
83
|
+
const summary = deriveSummaryFromContent(detail);
|
|
75
84
|
result.push({
|
|
76
85
|
id: makeId(),
|
|
77
86
|
type: "fact",
|
|
78
|
-
|
|
79
|
-
|
|
87
|
+
name,
|
|
88
|
+
summary,
|
|
89
|
+
detail,
|
|
90
|
+
content: detail,
|
|
91
|
+
tags: extractTags(detail),
|
|
80
92
|
project: episodes[0]?.project ?? "unknown",
|
|
81
93
|
importance: 5,
|
|
82
94
|
strength: cfg.halfLife.fact ?? 60,
|
|
@@ -90,12 +102,17 @@ function heuristicConsolidation(episodes, cfg) {
|
|
|
90
102
|
const allErrors = episodes.flatMap((ep) => ep.errors).filter(Boolean);
|
|
91
103
|
if (allErrors.length) {
|
|
92
104
|
const errorSet = [...new Set(allErrors)].slice(0, 5);
|
|
93
|
-
const
|
|
105
|
+
const detail = `Recurring issues: ${errorSet.join("; ")}`;
|
|
106
|
+
const name = deriveNameFromContent(detail);
|
|
107
|
+
const summary = deriveSummaryFromContent(detail);
|
|
94
108
|
result.push({
|
|
95
109
|
id: makeId(),
|
|
96
110
|
type: "lesson",
|
|
97
|
-
|
|
98
|
-
|
|
111
|
+
name,
|
|
112
|
+
summary,
|
|
113
|
+
detail,
|
|
114
|
+
content: detail,
|
|
115
|
+
tags: extractTags(detail),
|
|
99
116
|
project: episodes[0]?.project ?? "unknown",
|
|
100
117
|
importance: 7,
|
|
101
118
|
strength: cfg.halfLife.lesson ?? 90,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consolidation.js","sourceRoot":"","sources":["../src/consolidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"consolidation.js","sourceRoot":"","sources":["../src/consolidation.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.d.ts
CHANGED
|
@@ -25,6 +25,12 @@ export declare class NanoMemEngine {
|
|
|
25
25
|
saveEpisode(ep: Episode): Promise<void>;
|
|
26
26
|
consolidate(): Promise<MemoryEntry[]>;
|
|
27
27
|
getMemoryInjection(project: string, contextTags: string[], scope?: MemoryScope): Promise<string>;
|
|
28
|
+
/** Retrieve a single entry by ID (for recall_memory tool) */
|
|
29
|
+
getEntryById(id: string): Promise<MemoryEntry | null>;
|
|
30
|
+
/** Reinforce a single entry by ID (bump accessCount, lastAccessed, strength) */
|
|
31
|
+
reinforceEntryById(id: string): Promise<boolean>;
|
|
32
|
+
/** Full-text search across ALL entries including dormant (for search_all_memories tool) */
|
|
33
|
+
searchAllEntries(query: string, limit?: number): Promise<MemoryEntry[]>;
|
|
28
34
|
getStats(): Promise<{
|
|
29
35
|
knowledge: number;
|
|
30
36
|
lessons: number;
|
|
@@ -62,6 +68,6 @@ export declare class NanoMemEngine {
|
|
|
62
68
|
private reinforceEntries;
|
|
63
69
|
private reinforceWork;
|
|
64
70
|
private reconsolidateIfNeeded;
|
|
65
|
-
private
|
|
71
|
+
private buildProgressiveInjectionText;
|
|
66
72
|
}
|
|
67
73
|
//# sourceMappingURL=engine.d.ts.map
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.js
CHANGED
|
@@ -14,7 +14,7 @@ import { extractMemories, extractWork } from "./extraction.js";
|
|
|
14
14
|
import { PROMPTS } from "./i18n.js";
|
|
15
15
|
import { getRelatedSummaries, linkNewEntry } from "./linking.js";
|
|
16
16
|
import { evictExpiredEntries, evictExpiredWork, filterByScope, filterPII } from "./privacy.js";
|
|
17
|
-
import { extractTags, pickTop, scoreEntry, scoreEpisode, scoreWorkEntry, tagOverlap } from "./scoring.js";
|
|
17
|
+
import { extractTags, pickTop, scoreEntry, scoreEpisode, scoreWorkEntry, tagOverlap, tierEntries } from "./scoring.js";
|
|
18
18
|
import { loadEntries, loadEpisodes, loadMeta, loadWork, saveEpisode as persistEpisode, saveEntries, saveWork, writeJson, } from "./store.js";
|
|
19
19
|
import { buildFullInsightsReport } from "./full-insights.js";
|
|
20
20
|
import { applyExtraction } from "./update.js";
|
|
@@ -81,6 +81,7 @@ export class NanoMemEngine {
|
|
|
81
81
|
id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
82
82
|
goal: sessionGoal || extracted.goal,
|
|
83
83
|
summary: filterPII(extracted.summary),
|
|
84
|
+
detail: extracted.detail ? filterPII(extracted.detail) : undefined,
|
|
84
85
|
project,
|
|
85
86
|
tags: extractTags(`${extracted.goal} ${extracted.summary}`),
|
|
86
87
|
importance: 6,
|
|
@@ -130,7 +131,7 @@ export class NanoMemEngine {
|
|
|
130
131
|
await writeJson(this.metaPath, meta);
|
|
131
132
|
return newEntries;
|
|
132
133
|
}
|
|
133
|
-
// ─── Retrieval & Injection
|
|
134
|
+
// ─── Retrieval & Injection (Progressive Recall) ────────────
|
|
134
135
|
async getMemoryInjection(project, contextTags, scope) {
|
|
135
136
|
const [allKnowledge, allLessons, allPrefs, allFacets, allEpisodes, allWork] = await Promise.all([
|
|
136
137
|
loadEntries(this.knowledgePath),
|
|
@@ -146,28 +147,124 @@ export class NanoMemEngine {
|
|
|
146
147
|
const facets = this.filterAndCleanEntries(allFacets, scope);
|
|
147
148
|
const work = this.filterAndCleanWork(allWork, scope);
|
|
148
149
|
const episodes = filterByScope(allEpisodes, scope);
|
|
149
|
-
const totalBudget = this.cfg.tokenBudget;
|
|
150
|
-
const b = this.cfg.budget;
|
|
151
150
|
const hl = this.cfg.halfLife;
|
|
152
151
|
const sw = this.cfg.scoreWeights;
|
|
152
|
+
const pr = this.cfg.progressiveRecall;
|
|
153
153
|
const p = PROMPTS[this.cfg.locale] ?? PROMPTS.en;
|
|
154
|
-
|
|
155
|
-
const
|
|
156
|
-
const
|
|
157
|
-
const
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
const
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
154
|
+
// Tier all MemoryEntry categories
|
|
155
|
+
const tieredKnowledge = tierEntries(knowledge, project, contextTags, hl, sw, pr);
|
|
156
|
+
const tieredLessons = tierEntries(lessons, project, contextTags, hl, sw, pr);
|
|
157
|
+
const tieredPrefs = tierEntries(prefs, project, contextTags, hl, sw, pr);
|
|
158
|
+
const tieredFacets = tierEntries(facets, project, contextTags, hl, sw, pr);
|
|
159
|
+
// Budget calculation
|
|
160
|
+
const totalChars = this.cfg.tokenBudget * 4;
|
|
161
|
+
const activeChars = Math.floor(totalChars * pr.budgetActive);
|
|
162
|
+
const cueChars = Math.floor(totalChars * pr.budgetCue);
|
|
163
|
+
// Entry length helpers
|
|
164
|
+
const activeLen = (e) => (e.name?.length || 0) + (e.summary?.length || 0) + (e.detail?.length || 0) + 30;
|
|
165
|
+
const cueLen = (e) => (e.name?.length || 0) + (e.summary?.length || 0) + 30;
|
|
166
|
+
const scoreFn = (e) => scoreEntry(e, project, contextTags, hl, sw);
|
|
167
|
+
// Active tier: pick top entries with full detail, split budget across categories
|
|
168
|
+
const activeBudgetPer = Math.floor(activeChars / 4);
|
|
169
|
+
const activeKnowledge = pickTop(tieredKnowledge.active, scoreFn, activeLen, activeBudgetPer);
|
|
170
|
+
const activeLessons = pickTop(tieredLessons.active, scoreFn, activeLen, activeBudgetPer);
|
|
171
|
+
const activePrefs = pickTop(tieredPrefs.active, scoreFn, activeLen, activeBudgetPer);
|
|
172
|
+
const activeFacets = pickTop(tieredFacets.active, scoreFn, activeLen, activeBudgetPer);
|
|
173
|
+
// Cue tier: pick top entries with name + summary + id, split budget across categories
|
|
174
|
+
const cueBudgetPer = Math.floor(cueChars / 6); // 6 = knowledge + lessons + prefs + facets + episodes + work
|
|
175
|
+
const cueKnowledge = pickTop(tieredKnowledge.cue, scoreFn, cueLen, cueBudgetPer);
|
|
176
|
+
const cueLessons = pickTop(tieredLessons.cue, scoreFn, cueLen, cueBudgetPer);
|
|
177
|
+
const cuePrefs = pickTop(tieredPrefs.cue, scoreFn, cueLen, cueBudgetPer);
|
|
178
|
+
const cueFacets = pickTop(tieredFacets.cue, scoreFn, cueLen, cueBudgetPer);
|
|
179
|
+
// Episodes and Work use their existing scoring for cue layer
|
|
180
|
+
const topEpisodes = pickTop(episodes, (ep) => scoreEpisode(ep, project, contextTags, hl, sw), (ep) => ep.summary.length + 30, cueBudgetPer);
|
|
181
|
+
const topWork = pickTop(work, (w) => scoreWorkEntry(w, project, contextTags, hl, sw), (w) => w.goal.length + w.summary.length + 30, cueBudgetPer);
|
|
182
|
+
// Reinforce all recalled entries (Active + Cue) via spaced repetition
|
|
183
|
+
const allRecalledKnowledge = [...activeKnowledge, ...cueKnowledge];
|
|
184
|
+
const allRecalledLessons = [...activeLessons, ...cueLessons];
|
|
185
|
+
const allRecalledPrefs = [...activePrefs, ...cuePrefs];
|
|
186
|
+
const allRecalledFacets = [...activeFacets, ...cueFacets];
|
|
187
|
+
await this.reinforceEntries(allRecalledKnowledge, allKnowledge, this.knowledgePath);
|
|
188
|
+
await this.reinforceEntries(allRecalledLessons, allLessons, this.lessonsPath);
|
|
189
|
+
await this.reinforceEntries(allRecalledPrefs, allPrefs, this.preferencesPath);
|
|
190
|
+
await this.reinforceEntries(allRecalledFacets, allFacets, this.facetsPath);
|
|
165
191
|
await this.reinforceWork(topWork, allWork);
|
|
192
|
+
// Optional reconsolidation for low-relevance recalled entries
|
|
166
193
|
if (this.llmFn) {
|
|
167
|
-
await this.reconsolidateIfNeeded(
|
|
168
|
-
await this.reconsolidateIfNeeded(
|
|
194
|
+
await this.reconsolidateIfNeeded(allRecalledKnowledge, contextTags, allKnowledge);
|
|
195
|
+
await this.reconsolidateIfNeeded(allRecalledLessons, contextTags, allLessons);
|
|
169
196
|
}
|
|
170
|
-
return this.
|
|
197
|
+
return this.buildProgressiveInjectionText({
|
|
198
|
+
knowledge: activeKnowledge,
|
|
199
|
+
lessons: activeLessons,
|
|
200
|
+
preferences: activePrefs,
|
|
201
|
+
facets: activeFacets,
|
|
202
|
+
}, {
|
|
203
|
+
knowledge: cueKnowledge,
|
|
204
|
+
lessons: cueLessons,
|
|
205
|
+
preferences: cuePrefs,
|
|
206
|
+
facets: cueFacets,
|
|
207
|
+
episodes: topEpisodes,
|
|
208
|
+
work: topWork,
|
|
209
|
+
}, allKnowledge, p);
|
|
210
|
+
}
|
|
211
|
+
// ─── Progressive Recall Tools ───────────────────────────────
|
|
212
|
+
/** Retrieve a single entry by ID (for recall_memory tool) */
|
|
213
|
+
async getEntryById(id) {
|
|
214
|
+
const paths = [this.knowledgePath, this.lessonsPath, this.preferencesPath, this.facetsPath];
|
|
215
|
+
for (const path of paths) {
|
|
216
|
+
const entries = await loadEntries(path);
|
|
217
|
+
const entry = entries.find((e) => e.id === id);
|
|
218
|
+
if (entry)
|
|
219
|
+
return entry;
|
|
220
|
+
}
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
/** Reinforce a single entry by ID (bump accessCount, lastAccessed, strength) */
|
|
224
|
+
async reinforceEntryById(id) {
|
|
225
|
+
const pathConfigs = [
|
|
226
|
+
{ path: this.knowledgePath, max: this.cfg.maxEntries.knowledge },
|
|
227
|
+
{ path: this.lessonsPath, max: this.cfg.maxEntries.lessons },
|
|
228
|
+
{ path: this.preferencesPath, max: this.cfg.maxEntries.preferences },
|
|
229
|
+
{ path: this.facetsPath, max: this.cfg.maxEntries.facets },
|
|
230
|
+
];
|
|
231
|
+
const hl = this.cfg.halfLife;
|
|
232
|
+
const ew = this.cfg.evictionWeights;
|
|
233
|
+
for (const { path, max } of pathConfigs) {
|
|
234
|
+
const entries = await loadEntries(path);
|
|
235
|
+
const entry = entries.find((e) => e.id === id);
|
|
236
|
+
if (entry) {
|
|
237
|
+
entry.accessCount = (entry.accessCount ?? 0) + 1;
|
|
238
|
+
entry.lastAccessed = new Date().toISOString();
|
|
239
|
+
entry.strength = (entry.strength || 30) * this.cfg.strengthGrowthFactor;
|
|
240
|
+
await saveEntries(path, entries, max, (e) => utilityEntry(e, hl, ew));
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
/** Full-text search across ALL entries including dormant (for search_all_memories tool) */
|
|
247
|
+
async searchAllEntries(query, limit = 10) {
|
|
248
|
+
const tags = extractTags(query);
|
|
249
|
+
const queryLower = query.toLowerCase();
|
|
250
|
+
const [knowledge, lessons, prefs, facets] = await Promise.all([
|
|
251
|
+
loadEntries(this.knowledgePath),
|
|
252
|
+
loadEntries(this.lessonsPath),
|
|
253
|
+
loadEntries(this.preferencesPath),
|
|
254
|
+
loadEntries(this.facetsPath),
|
|
255
|
+
]);
|
|
256
|
+
const all = [...knowledge, ...lessons, ...prefs, ...facets];
|
|
257
|
+
return all
|
|
258
|
+
.map((e) => {
|
|
259
|
+
const nameMatch = (e.name || "").toLowerCase().includes(queryLower) ? 2 : 0;
|
|
260
|
+
const summaryMatch = (e.summary || "").toLowerCase().includes(queryLower) ? 1 : 0;
|
|
261
|
+
const tagMatch = tagOverlap(e.tags, tags);
|
|
262
|
+
return { entry: e, score: nameMatch + summaryMatch + tagMatch };
|
|
263
|
+
})
|
|
264
|
+
.filter((x) => x.score > 0)
|
|
265
|
+
.sort((a, b) => b.score - a.score)
|
|
266
|
+
.slice(0, limit)
|
|
267
|
+
.map((x) => x.entry);
|
|
171
268
|
}
|
|
172
269
|
// ─── Stats ───────────────────────────────────────────────────
|
|
173
270
|
async getStats() {
|
|
@@ -272,8 +369,8 @@ export class NanoMemEngine {
|
|
|
272
369
|
.map((e) => ({
|
|
273
370
|
entry: e,
|
|
274
371
|
weight: calcWeight(e),
|
|
275
|
-
trigger: e.facetData?.kind === "pattern" ? e.facetData.trigger : e.
|
|
276
|
-
behavior: e.facetData?.kind === "pattern" ? e.facetData.behavior : e.
|
|
372
|
+
trigger: e.facetData?.kind === "pattern" ? e.facetData.trigger : (e.summary || e.detail || "").slice(0, 50),
|
|
373
|
+
behavior: e.facetData?.kind === "pattern" ? e.facetData.behavior : (e.summary || e.detail || ""),
|
|
277
374
|
}))
|
|
278
375
|
.sort((a, b) => b.weight - a.weight);
|
|
279
376
|
// Build StruggleInsight[]
|
|
@@ -283,7 +380,7 @@ export class NanoMemEngine {
|
|
|
283
380
|
return {
|
|
284
381
|
entry: e,
|
|
285
382
|
weight: calcWeight(e, !isResolved),
|
|
286
|
-
problem: e.facetData?.kind === "struggle" ? e.facetData.problem : e.
|
|
383
|
+
problem: e.facetData?.kind === "struggle" ? e.facetData.problem : (e.summary || e.detail || ""),
|
|
287
384
|
attempts: e.facetData?.kind === "struggle" ? e.facetData.attempts : [],
|
|
288
385
|
solution: e.facetData?.kind === "struggle" ? e.facetData.solution : "",
|
|
289
386
|
resolved: isResolved,
|
|
@@ -320,7 +417,7 @@ export class NanoMemEngine {
|
|
|
320
417
|
const input = JSON.stringify({
|
|
321
418
|
patterns: patterns.slice(0, 5).map((pa) => ({ trigger: pa.trigger, behavior: pa.behavior })),
|
|
322
419
|
struggles: struggles.slice(0, 5).map((s) => ({ problem: s.problem, resolved: s.resolved })),
|
|
323
|
-
lessons: lessons.slice(0, 5).map((l) => l.content),
|
|
420
|
+
lessons: lessons.slice(0, 5).map((l) => l.summary || l.detail || l.content || ""),
|
|
324
421
|
});
|
|
325
422
|
const raw = await this.llmFn(p.insightsRecommendationSystem, input);
|
|
326
423
|
const cleaned = raw
|
|
@@ -428,10 +525,14 @@ export class NanoMemEngine {
|
|
|
428
525
|
if (overlap >= 0.3)
|
|
429
526
|
continue;
|
|
430
527
|
try {
|
|
431
|
-
const
|
|
528
|
+
const memText = entry.detail || entry.summary || entry.content || "";
|
|
529
|
+
const updated = await this.llmFn(p.reconsolidationSystem, `Original memory: ${memText}\n\nCurrent context tags: ${contextTags.join(", ")}`);
|
|
432
530
|
if (updated && updated.length > 10) {
|
|
433
|
-
|
|
434
|
-
entry.
|
|
531
|
+
const trimmed = updated.trim();
|
|
532
|
+
entry.detail = trimmed;
|
|
533
|
+
entry.content = trimmed;
|
|
534
|
+
entry.summary = trimmed.length <= 150 ? trimmed : `${trimmed.slice(0, 147)}...`;
|
|
535
|
+
entry.tags = extractTags(trimmed);
|
|
435
536
|
}
|
|
436
537
|
}
|
|
437
538
|
catch {
|
|
@@ -439,50 +540,65 @@ export class NanoMemEngine {
|
|
|
439
540
|
}
|
|
440
541
|
}
|
|
441
542
|
}
|
|
442
|
-
|
|
543
|
+
buildProgressiveInjectionText(active, cue, allKnowledge, p) {
|
|
443
544
|
const sections = [];
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
const
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
545
|
+
// ── Active tier: full detail ──
|
|
546
|
+
const activeLines = [];
|
|
547
|
+
const formatActiveEntry = (e) => {
|
|
548
|
+
const related = getRelatedSummaries(e, allKnowledge, 2);
|
|
549
|
+
const suffix = related.length ? ` [→ ${related.join("; ")}]` : "";
|
|
550
|
+
return `- [ID: ${e.id}] **${e.name || "—"}**: ${e.summary || ""}\n ${e.detail || ""}${suffix}`;
|
|
551
|
+
};
|
|
552
|
+
const formatActiveFacet = (e) => {
|
|
553
|
+
if (e.facetData?.kind === "pattern") {
|
|
554
|
+
return `- [ID: ${e.id}] **${e.name || "—"}**: When ${e.facetData.trigger} → ${e.facetData.behavior}\n ${e.detail || ""}`;
|
|
555
|
+
}
|
|
556
|
+
if (e.facetData?.kind === "struggle") {
|
|
557
|
+
return `- [ID: ${e.id}] **${e.name || "—"}**: ${e.facetData.problem}\n Tried: ${e.facetData.attempts.join(", ")} | Solved: ${e.facetData.solution}\n ${e.detail || ""}`;
|
|
558
|
+
}
|
|
559
|
+
return formatActiveEntry(e);
|
|
560
|
+
};
|
|
561
|
+
for (const e of active.lessons)
|
|
562
|
+
activeLines.push(formatActiveEntry(e));
|
|
563
|
+
for (const e of active.knowledge)
|
|
564
|
+
activeLines.push(formatActiveEntry(e));
|
|
565
|
+
for (const e of active.preferences)
|
|
566
|
+
activeLines.push(formatActiveEntry(e));
|
|
567
|
+
for (const e of active.facets)
|
|
568
|
+
activeLines.push(formatActiveFacet(e));
|
|
569
|
+
if (activeLines.length) {
|
|
570
|
+
sections.push(`### ${p.sectionActiveMemories}\n${activeLines.join("\n")}`);
|
|
461
571
|
}
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
572
|
+
// ── Cue tier: name + summary + id ──
|
|
573
|
+
const cueLines = [];
|
|
574
|
+
const formatCueEntry = (e) => `- [ID: ${e.id}] [${e.type}] **${e.name || "—"}**: ${e.summary || ""}`;
|
|
575
|
+
const formatCueFacet = (e) => {
|
|
576
|
+
if (e.facetData?.kind === "pattern") {
|
|
577
|
+
return `- [ID: ${e.id}] [pattern] **${e.name || "—"}**: When ${e.facetData.trigger} → ${e.facetData.behavior}`;
|
|
578
|
+
}
|
|
579
|
+
if (e.facetData?.kind === "struggle") {
|
|
580
|
+
return `- [ID: ${e.id}] [struggle] **${e.name || "—"}**: ${e.facetData.problem}`;
|
|
581
|
+
}
|
|
582
|
+
return formatCueEntry(e);
|
|
583
|
+
};
|
|
584
|
+
for (const e of cue.lessons)
|
|
585
|
+
cueLines.push(formatCueEntry(e));
|
|
586
|
+
for (const e of cue.knowledge)
|
|
587
|
+
cueLines.push(formatCueEntry(e));
|
|
588
|
+
for (const e of cue.preferences)
|
|
589
|
+
cueLines.push(formatCueEntry(e));
|
|
590
|
+
for (const e of cue.facets)
|
|
591
|
+
cueLines.push(formatCueFacet(e));
|
|
592
|
+
// Episodes in cue layer (no ID-based recall)
|
|
593
|
+
for (const ep of cue.episodes) {
|
|
594
|
+
cueLines.push(`- [${ep.date}] ${ep.project}: ${ep.summary}${ep.userGoal ? ` (Goal: ${ep.userGoal})` : ""}`);
|
|
465
595
|
}
|
|
466
|
-
//
|
|
467
|
-
const
|
|
468
|
-
|
|
469
|
-
if (patterns.length) {
|
|
470
|
-
const lines = patterns.map((e) => {
|
|
471
|
-
if (e.facetData?.kind === "pattern") {
|
|
472
|
-
return `- When ${e.facetData.trigger} → ${e.facetData.behavior}`;
|
|
473
|
-
}
|
|
474
|
-
return `- ${e.content}`;
|
|
475
|
-
});
|
|
476
|
-
sections.push(`### ${p.sectionPatterns}\n${lines.join("\n")}`);
|
|
596
|
+
// Work in cue layer
|
|
597
|
+
for (const w of cue.work) {
|
|
598
|
+
cueLines.push(`- [${w.created.slice(0, 10)}] ${w.goal}: ${w.summary}`);
|
|
477
599
|
}
|
|
478
|
-
if (
|
|
479
|
-
|
|
480
|
-
if (e.facetData?.kind === "struggle") {
|
|
481
|
-
return `- Problem: ${e.facetData.problem} | Tried: ${e.facetData.attempts.join(", ")} | Solved: ${e.facetData.solution}`;
|
|
482
|
-
}
|
|
483
|
-
return `- ${e.content}`;
|
|
484
|
-
});
|
|
485
|
-
sections.push(`### ${p.sectionStruggles}\n${lines.join("\n")}`);
|
|
600
|
+
if (cueLines.length) {
|
|
601
|
+
sections.push(`### ${p.sectionMemoryCues}\n*${p.memoryCueHint}*\n${cueLines.join("\n")}`);
|
|
486
602
|
}
|
|
487
603
|
if (!sections.length)
|
|
488
604
|
return "";
|