agent-recall-mcp 3.2.3 → 3.3.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/README.md +276 -218
- package/dist/helpers/journal-files.d.ts +30 -0
- package/dist/helpers/journal-files.d.ts.map +1 -0
- package/dist/helpers/journal-files.js +96 -0
- package/dist/helpers/journal-files.js.map +1 -0
- package/dist/helpers/sections.d.ts +12 -0
- package/dist/helpers/sections.d.ts.map +1 -0
- package/dist/helpers/sections.js +84 -0
- package/dist/helpers/sections.js.map +1 -0
- package/dist/index.js +59 -1199
- package/dist/index.js.map +1 -1
- package/dist/palace/awareness.d.ts +67 -0
- package/dist/palace/awareness.d.ts.map +1 -0
- package/dist/palace/awareness.js +231 -0
- package/dist/palace/awareness.js.map +1 -0
- package/dist/palace/consolidate.d.ts +28 -0
- package/dist/palace/consolidate.d.ts.map +1 -0
- package/dist/palace/consolidate.js +129 -0
- package/dist/palace/consolidate.js.map +1 -0
- package/dist/palace/fan-out.d.ts +15 -0
- package/dist/palace/fan-out.d.ts.map +1 -0
- package/dist/palace/fan-out.js +78 -0
- package/dist/palace/fan-out.js.map +1 -0
- package/dist/palace/graph.d.ts +11 -0
- package/dist/palace/graph.d.ts.map +1 -0
- package/dist/palace/graph.js +59 -0
- package/dist/palace/graph.js.map +1 -0
- package/dist/palace/identity.d.ts +6 -0
- package/dist/palace/identity.d.ts.map +1 -0
- package/dist/palace/identity.js +18 -0
- package/dist/palace/identity.js.map +1 -0
- package/dist/palace/index-manager.d.ts +7 -0
- package/dist/palace/index-manager.d.ts.map +1 -0
- package/dist/palace/index-manager.js +46 -0
- package/dist/palace/index-manager.js.map +1 -0
- package/dist/palace/insights-index.d.ts +39 -0
- package/dist/palace/insights-index.d.ts.map +1 -0
- package/dist/palace/insights-index.js +101 -0
- package/dist/palace/insights-index.js.map +1 -0
- package/dist/palace/log.d.ts +9 -0
- package/dist/palace/log.d.ts.map +1 -0
- package/dist/palace/log.js +28 -0
- package/dist/palace/log.js.map +1 -0
- package/dist/palace/obsidian.d.ts +12 -0
- package/dist/palace/obsidian.d.ts.map +1 -0
- package/dist/palace/obsidian.js +76 -0
- package/dist/palace/obsidian.js.map +1 -0
- package/dist/palace/rooms.d.ts +14 -0
- package/dist/palace/rooms.d.ts.map +1 -0
- package/dist/palace/rooms.js +117 -0
- package/dist/palace/rooms.js.map +1 -0
- package/dist/palace/salience.d.ts +15 -0
- package/dist/palace/salience.d.ts.map +1 -0
- package/dist/palace/salience.js +33 -0
- package/dist/palace/salience.js.map +1 -0
- package/dist/resources/journal-resources.d.ts +3 -0
- package/dist/resources/journal-resources.d.ts.map +1 -0
- package/dist/resources/journal-resources.js +72 -0
- package/dist/resources/journal-resources.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +7 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/fs-utils.d.ts +8 -0
- package/dist/storage/fs-utils.d.ts.map +1 -0
- package/dist/storage/fs-utils.js +28 -0
- package/dist/storage/fs-utils.js.map +1 -0
- package/dist/storage/paths.d.ts +21 -0
- package/dist/storage/paths.d.ts.map +1 -0
- package/dist/storage/paths.js +59 -0
- package/dist/storage/paths.js.map +1 -0
- package/dist/storage/project.d.ts +17 -0
- package/dist/storage/project.d.ts.map +1 -0
- package/dist/storage/project.js +130 -0
- package/dist/storage/project.js.map +1 -0
- package/dist/tools/alignment-check.d.ts +3 -0
- package/dist/tools/alignment-check.d.ts.map +1 -0
- package/dist/tools/alignment-check.js +73 -0
- package/dist/tools/alignment-check.js.map +1 -0
- package/dist/tools/awareness-update.d.ts +9 -0
- package/dist/tools/awareness-update.d.ts.map +1 -0
- package/dist/tools/awareness-update.js +90 -0
- package/dist/tools/awareness-update.js.map +1 -0
- package/dist/tools/context-synthesize.d.ts +3 -0
- package/dist/tools/context-synthesize.d.ts.map +1 -0
- package/dist/tools/context-synthesize.js +204 -0
- package/dist/tools/context-synthesize.js.map +1 -0
- package/dist/tools/journal-archive.d.ts +3 -0
- package/dist/tools/journal-archive.d.ts.map +1 -0
- package/dist/tools/journal-archive.js +62 -0
- package/dist/tools/journal-archive.js.map +1 -0
- package/dist/tools/journal-capture.d.ts +3 -0
- package/dist/tools/journal-capture.d.ts.map +1 -0
- package/dist/tools/journal-capture.js +87 -0
- package/dist/tools/journal-capture.js.map +1 -0
- package/dist/tools/journal-cold-start.d.ts +3 -0
- package/dist/tools/journal-cold-start.d.ts.map +1 -0
- package/dist/tools/journal-cold-start.js +70 -0
- package/dist/tools/journal-cold-start.js.map +1 -0
- package/dist/tools/journal-list.d.ts +3 -0
- package/dist/tools/journal-list.d.ts.map +1 -0
- package/dist/tools/journal-list.js +43 -0
- package/dist/tools/journal-list.js.map +1 -0
- package/dist/tools/journal-projects.d.ts +3 -0
- package/dist/tools/journal-projects.d.ts.map +1 -0
- package/dist/tools/journal-projects.js +25 -0
- package/dist/tools/journal-projects.js.map +1 -0
- package/dist/tools/journal-read.d.ts +3 -0
- package/dist/tools/journal-read.d.ts.map +1 -0
- package/dist/tools/journal-read.js +72 -0
- package/dist/tools/journal-read.js.map +1 -0
- package/dist/tools/journal-search.d.ts +3 -0
- package/dist/tools/journal-search.d.ts.map +1 -0
- package/dist/tools/journal-search.js +113 -0
- package/dist/tools/journal-search.js.map +1 -0
- package/dist/tools/journal-state.d.ts +6 -0
- package/dist/tools/journal-state.d.ts.map +1 -0
- package/dist/tools/journal-state.js +111 -0
- package/dist/tools/journal-state.js.map +1 -0
- package/dist/tools/journal-write.d.ts +3 -0
- package/dist/tools/journal-write.d.ts.map +1 -0
- package/dist/tools/journal-write.js +88 -0
- package/dist/tools/journal-write.js.map +1 -0
- package/dist/tools/knowledge-read.d.ts +3 -0
- package/dist/tools/knowledge-read.d.ts.map +1 -0
- package/dist/tools/knowledge-read.js +118 -0
- package/dist/tools/knowledge-read.js.map +1 -0
- package/dist/tools/knowledge-write.d.ts +3 -0
- package/dist/tools/knowledge-write.d.ts.map +1 -0
- package/dist/tools/knowledge-write.js +89 -0
- package/dist/tools/knowledge-write.js.map +1 -0
- package/dist/tools/nudge.d.ts +3 -0
- package/dist/tools/nudge.d.ts.map +1 -0
- package/dist/tools/nudge.js +41 -0
- package/dist/tools/nudge.js.map +1 -0
- package/dist/tools/palace-lint.d.ts +7 -0
- package/dist/tools/palace-lint.d.ts.map +1 -0
- package/dist/tools/palace-lint.js +149 -0
- package/dist/tools/palace-lint.js.map +1 -0
- package/dist/tools/palace-read.d.ts +6 -0
- package/dist/tools/palace-read.d.ts.map +1 -0
- package/dist/tools/palace-read.js +78 -0
- package/dist/tools/palace-read.js.map +1 -0
- package/dist/tools/palace-search.d.ts +6 -0
- package/dist/tools/palace-search.d.ts.map +1 -0
- package/dist/tools/palace-search.js +81 -0
- package/dist/tools/palace-search.js.map +1 -0
- package/dist/tools/palace-walk.d.ts +12 -0
- package/dist/tools/palace-walk.d.ts.map +1 -0
- package/dist/tools/palace-walk.js +167 -0
- package/dist/tools/palace-walk.js.map +1 -0
- package/dist/tools/palace-write.d.ts +6 -0
- package/dist/tools/palace-write.d.ts.map +1 -0
- package/dist/tools/palace-write.js +108 -0
- package/dist/tools/palace-write.js.map +1 -0
- package/dist/tools/recall-insight.d.ts +9 -0
- package/dist/tools/recall-insight.d.ts.map +1 -0
- package/dist/tools/recall-insight.js +51 -0
- package/dist/tools/recall-insight.js.map +1 -0
- package/dist/types.d.ts +112 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +31 -0
- package/dist/types.js.map +1 -0
- package/package.json +8 -4
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fan-out write logic.
|
|
3
|
+
* When content is written to a room, this module:
|
|
4
|
+
* 1. Parses [[wikilinks]] from the content
|
|
5
|
+
* 2. Adds back-references in referenced rooms
|
|
6
|
+
* 3. Updates graph.json with new edges
|
|
7
|
+
* 4. Recalculates salience for affected rooms
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from "node:fs";
|
|
10
|
+
import * as path from "node:path";
|
|
11
|
+
import { palaceDir } from "../storage/paths.js";
|
|
12
|
+
import { extractWikilinks, addBackReference } from "./obsidian.js";
|
|
13
|
+
import { addEdge, getConnectionCount } from "./graph.js";
|
|
14
|
+
import { getRoomMeta, updateRoomMeta } from "./rooms.js";
|
|
15
|
+
import { computeSalience } from "./salience.js";
|
|
16
|
+
export function fanOut(project, sourceRoom, sourceTopic, content, explicitConnections = [], importance = "medium") {
|
|
17
|
+
const pd = palaceDir(project);
|
|
18
|
+
const result = { updatedRooms: [], newEdges: 0 };
|
|
19
|
+
// Collect all targets: from wikilinks + explicit connections
|
|
20
|
+
const wikiTargets = extractWikilinks(content);
|
|
21
|
+
const allTargets = new Set([...wikiTargets, ...explicitConnections]);
|
|
22
|
+
for (const target of allTargets) {
|
|
23
|
+
// Target could be "roomSlug" or "roomSlug/topic"
|
|
24
|
+
const targetRoom = target.split("/")[0];
|
|
25
|
+
if (targetRoom === sourceRoom)
|
|
26
|
+
continue; // skip self-references
|
|
27
|
+
// Add back-reference in target room's README.md
|
|
28
|
+
const targetReadme = path.join(pd, "rooms", targetRoom, "README.md");
|
|
29
|
+
if (fs.existsSync(targetReadme)) {
|
|
30
|
+
const readmeContent = fs.readFileSync(targetReadme, "utf-8");
|
|
31
|
+
const updated = addBackReference(readmeContent, sourceRoom, sourceTopic);
|
|
32
|
+
if (updated !== readmeContent) {
|
|
33
|
+
fs.writeFileSync(targetReadme, updated, "utf-8");
|
|
34
|
+
result.updatedRooms.push(targetRoom);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Add edge to graph
|
|
38
|
+
addEdge(pd, `${sourceRoom}/${sourceTopic}`, target, "references");
|
|
39
|
+
result.newEdges++;
|
|
40
|
+
// Update target room's connections list
|
|
41
|
+
const targetMeta = getRoomMeta(project, targetRoom);
|
|
42
|
+
if (targetMeta && !targetMeta.connections.includes(sourceRoom)) {
|
|
43
|
+
updateRoomMeta(project, targetRoom, {
|
|
44
|
+
connections: [...targetMeta.connections, sourceRoom],
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Update source room's connections list
|
|
49
|
+
const sourceMeta = getRoomMeta(project, sourceRoom);
|
|
50
|
+
if (sourceMeta) {
|
|
51
|
+
const newConns = new Set(sourceMeta.connections);
|
|
52
|
+
for (const target of allTargets) {
|
|
53
|
+
const targetRoom = target.split("/")[0];
|
|
54
|
+
if (targetRoom !== sourceRoom)
|
|
55
|
+
newConns.add(targetRoom);
|
|
56
|
+
}
|
|
57
|
+
updateRoomMeta(project, sourceRoom, {
|
|
58
|
+
connections: Array.from(newConns),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// Recalculate salience for all affected rooms
|
|
62
|
+
const affectedRooms = new Set([sourceRoom, ...result.updatedRooms]);
|
|
63
|
+
for (const room of affectedRooms) {
|
|
64
|
+
const meta = getRoomMeta(project, room);
|
|
65
|
+
if (!meta)
|
|
66
|
+
continue;
|
|
67
|
+
const connCount = getConnectionCount(pd, room);
|
|
68
|
+
const newSalience = computeSalience({
|
|
69
|
+
importance,
|
|
70
|
+
lastUpdated: meta.updated,
|
|
71
|
+
accessCount: meta.access_count,
|
|
72
|
+
connectionCount: connCount,
|
|
73
|
+
});
|
|
74
|
+
updateRoomMeta(project, room, { salience: newSalience });
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=fan-out.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fan-out.js","sourceRoot":"","sources":["../../src/palace/fan-out.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Palace graph management — cross-reference edges between rooms and memories.
|
|
3
|
+
*/
|
|
4
|
+
import type { PalaceGraph } from "../types.js";
|
|
5
|
+
export declare function readGraph(palaceDir: string): PalaceGraph;
|
|
6
|
+
export declare function writeGraph(palaceDir: string, graph: PalaceGraph): void;
|
|
7
|
+
export declare function addEdge(palaceDir: string, from: string, to: string, type?: string, weight?: number): void;
|
|
8
|
+
export declare function removeEdgesFor(palaceDir: string, target: string): void;
|
|
9
|
+
export declare function getConnectionCount(palaceDir: string, roomSlug: string): number;
|
|
10
|
+
export declare function getConnectedRooms(palaceDir: string, roomSlug: string): string[];
|
|
11
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/palace/graph.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,aAAa,CAAC;AAO1D,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAExD;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAEtE;AAED,wBAAgB,OAAO,CACrB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,MAAqB,EAC3B,MAAM,GAAE,MAAY,GACnB,IAAI,CAkBN;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAMtE;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS9E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB/E"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Palace graph management — cross-reference edges between rooms and memories.
|
|
3
|
+
*/
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { readJsonSafe, writeJsonAtomic } from "../storage/fs-utils.js";
|
|
6
|
+
function graphPath(palaceDir) {
|
|
7
|
+
return path.join(palaceDir, "graph.json");
|
|
8
|
+
}
|
|
9
|
+
export function readGraph(palaceDir) {
|
|
10
|
+
return readJsonSafe(graphPath(palaceDir)) ?? { edges: [] };
|
|
11
|
+
}
|
|
12
|
+
export function writeGraph(palaceDir, graph) {
|
|
13
|
+
writeJsonAtomic(graphPath(palaceDir), graph);
|
|
14
|
+
}
|
|
15
|
+
export function addEdge(palaceDir, from, to, type = "references", weight = 0.5) {
|
|
16
|
+
const graph = readGraph(palaceDir);
|
|
17
|
+
// Don't duplicate
|
|
18
|
+
const exists = graph.edges.some((e) => e.from === from && e.to === to && e.type === type);
|
|
19
|
+
if (exists)
|
|
20
|
+
return;
|
|
21
|
+
graph.edges.push({
|
|
22
|
+
from,
|
|
23
|
+
to,
|
|
24
|
+
type,
|
|
25
|
+
weight,
|
|
26
|
+
created: new Date().toISOString(),
|
|
27
|
+
});
|
|
28
|
+
writeGraph(palaceDir, graph);
|
|
29
|
+
}
|
|
30
|
+
export function removeEdgesFor(palaceDir, target) {
|
|
31
|
+
const graph = readGraph(palaceDir);
|
|
32
|
+
graph.edges = graph.edges.filter((e) => e.from !== target && e.to !== target);
|
|
33
|
+
writeGraph(palaceDir, graph);
|
|
34
|
+
}
|
|
35
|
+
export function getConnectionCount(palaceDir, roomSlug) {
|
|
36
|
+
const graph = readGraph(palaceDir);
|
|
37
|
+
return graph.edges.filter((e) => e.from.startsWith(roomSlug + "/") ||
|
|
38
|
+
e.to.startsWith(roomSlug + "/") ||
|
|
39
|
+
e.from === roomSlug ||
|
|
40
|
+
e.to === roomSlug).length;
|
|
41
|
+
}
|
|
42
|
+
export function getConnectedRooms(palaceDir, roomSlug) {
|
|
43
|
+
const graph = readGraph(palaceDir);
|
|
44
|
+
const connected = new Set();
|
|
45
|
+
for (const edge of graph.edges) {
|
|
46
|
+
if (edge.from.startsWith(roomSlug + "/") || edge.from === roomSlug) {
|
|
47
|
+
const target = edge.to.split("/")[0];
|
|
48
|
+
if (target !== roomSlug)
|
|
49
|
+
connected.add(target);
|
|
50
|
+
}
|
|
51
|
+
if (edge.to.startsWith(roomSlug + "/") || edge.to === roomSlug) {
|
|
52
|
+
const source = edge.from.split("/")[0];
|
|
53
|
+
if (source !== roomSlug)
|
|
54
|
+
connected.add(source);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return Array.from(connected);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/palace/graph.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEvE,SAAS,SAAS,CAAC,SAAiB;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,OAAO,YAAY,CAAc,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,KAAkB;IAC9D,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,SAAiB,EACjB,IAAY,EACZ,EAAU,EACV,OAAe,YAAY,EAC3B,SAAiB,GAAG;IAEpB,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAEnC,kBAAkB;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CACzD,CAAC;IACF,IAAI,MAAM;QAAE,OAAO;IAEnB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QACf,IAAI;QACJ,EAAE;QACF,IAAI;QACJ,MAAM;QACN,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAClC,CAAC,CAAC;IAEH,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,MAAc;IAC9D,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,CAC5C,CAAC;IACF,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,QAAgB;IACpE,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CACvB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC;QACjC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC;QAC/B,CAAC,CAAC,IAAI,KAAK,QAAQ;QACnB,CAAC,CAAC,EAAE,KAAK,QAAQ,CACpB,CAAC,MAAM,CAAC;AACX,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,QAAgB;IACnE,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnE,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,QAAQ;gBAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,MAAM,KAAK,QAAQ;gBAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/palace/identity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGpE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Palace identity card — ~50 token project summary.
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from "node:fs";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
import { palaceDir } from "../storage/paths.js";
|
|
7
|
+
export function readIdentity(project) {
|
|
8
|
+
const idPath = path.join(palaceDir(project), "identity.md");
|
|
9
|
+
if (!fs.existsSync(idPath)) {
|
|
10
|
+
return `# ${project}\n\n> No identity card yet. Use palace_write to add one.`;
|
|
11
|
+
}
|
|
12
|
+
return fs.readFileSync(idPath, "utf-8");
|
|
13
|
+
}
|
|
14
|
+
export function writeIdentity(project, content) {
|
|
15
|
+
const idPath = path.join(palaceDir(project), "identity.md");
|
|
16
|
+
fs.writeFileSync(idPath, content, "utf-8");
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/palace/identity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;IAC5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,OAAO,0DAA0D,CAAC;IAChF,CAAC;IACD,OAAO,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,OAAe;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;IAC5D,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Palace index management — maintains palace-index.json.
|
|
3
|
+
*/
|
|
4
|
+
import type { PalaceIndex } from "../types.js";
|
|
5
|
+
export declare function readPalaceIndex(project: string): PalaceIndex | null;
|
|
6
|
+
export declare function updatePalaceIndex(project: string): PalaceIndex;
|
|
7
|
+
//# sourceMappingURL=index-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-manager.d.ts","sourceRoot":"","sources":["../../src/palace/index-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAU/C,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAEnE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAoC9D"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Palace index management — maintains palace-index.json.
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from "node:fs";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
import { VERSION } from "../types.js";
|
|
7
|
+
import { palaceDir } from "../storage/paths.js";
|
|
8
|
+
import { readJsonSafe, writeJsonAtomic } from "../storage/fs-utils.js";
|
|
9
|
+
import { listRooms } from "./rooms.js";
|
|
10
|
+
function indexPath(project) {
|
|
11
|
+
return path.join(palaceDir(project), "palace-index.json");
|
|
12
|
+
}
|
|
13
|
+
export function readPalaceIndex(project) {
|
|
14
|
+
return readJsonSafe(indexPath(project));
|
|
15
|
+
}
|
|
16
|
+
export function updatePalaceIndex(project) {
|
|
17
|
+
const rooms = listRooms(project);
|
|
18
|
+
const pd = palaceDir(project);
|
|
19
|
+
const existing = readPalaceIndex(project);
|
|
20
|
+
const roomsMap = {};
|
|
21
|
+
for (const room of rooms) {
|
|
22
|
+
// Count memory files in this room (everything except _room.json and README.md)
|
|
23
|
+
const roomPath = path.join(pd, "rooms", room.slug);
|
|
24
|
+
let memoryCount = 0;
|
|
25
|
+
if (fs.existsSync(roomPath)) {
|
|
26
|
+
const files = fs.readdirSync(roomPath);
|
|
27
|
+
memoryCount = files.filter((f) => f.endsWith(".md") && f !== "README.md").length;
|
|
28
|
+
}
|
|
29
|
+
roomsMap[room.slug] = {
|
|
30
|
+
salience: room.salience,
|
|
31
|
+
memory_count: memoryCount,
|
|
32
|
+
last_updated: room.updated,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const index = {
|
|
36
|
+
version: VERSION,
|
|
37
|
+
project,
|
|
38
|
+
created: existing?.created ?? new Date().toISOString(),
|
|
39
|
+
rooms: roomsMap,
|
|
40
|
+
identity_hash: existing?.identity_hash ?? "",
|
|
41
|
+
last_lint: existing?.last_lint ?? "",
|
|
42
|
+
};
|
|
43
|
+
writeJsonAtomic(indexPath(project), index);
|
|
44
|
+
return index;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=index-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-manager.js","sourceRoot":"","sources":["../../src/palace/index-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,SAAS,SAAS,CAAC,OAAe;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,YAAY,CAAc,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAE9B,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,+EAA+E;QAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACvC,WAAW,GAAG,KAAK,CAAC,MAAM,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,CAC9C,CAAC,MAAM,CAAC;QACX,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,WAAW;YACzB,YAAY,EAAE,IAAI,CAAC,OAAO;SAC3B,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAgB;QACzB,OAAO,EAAE,OAAO;QAChB,OAAO;QACP,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACtD,KAAK,EAAE,QAAQ;QACf,aAAa,EAAE,QAAQ,EAAE,aAAa,IAAI,EAAE;QAC5C,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,EAAE;KACrC,CAAC;IAEF,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-project insights index.
|
|
3
|
+
*
|
|
4
|
+
* A single JSON file mapping insights to situations.
|
|
5
|
+
* When an agent starts a task, it can query: "what insights apply here?"
|
|
6
|
+
* The system matches the current context against `applies_when` keywords.
|
|
7
|
+
*
|
|
8
|
+
* Global scope: ~/.agent-recall/insights-index.json
|
|
9
|
+
*/
|
|
10
|
+
export interface IndexedInsight {
|
|
11
|
+
id: string;
|
|
12
|
+
title: string;
|
|
13
|
+
source: string;
|
|
14
|
+
applies_when: string[];
|
|
15
|
+
file?: string;
|
|
16
|
+
severity: "critical" | "important" | "minor";
|
|
17
|
+
confirmed_count: number;
|
|
18
|
+
last_confirmed: string;
|
|
19
|
+
}
|
|
20
|
+
export interface InsightsIndex {
|
|
21
|
+
version: string;
|
|
22
|
+
updated: string;
|
|
23
|
+
insights: IndexedInsight[];
|
|
24
|
+
}
|
|
25
|
+
export declare function readInsightsIndex(): InsightsIndex;
|
|
26
|
+
export declare function writeInsightsIndex(index: InsightsIndex): void;
|
|
27
|
+
/**
|
|
28
|
+
* Add or update an insight in the index.
|
|
29
|
+
*/
|
|
30
|
+
export declare function addIndexedInsight(insight: Omit<IndexedInsight, "id" | "confirmed_count" | "last_confirmed">): IndexedInsight;
|
|
31
|
+
/**
|
|
32
|
+
* Recall insights relevant to a given context.
|
|
33
|
+
* Matches context words against applies_when keywords.
|
|
34
|
+
* Returns top N matches sorted by relevance (keyword match count × severity weight × confirmation count).
|
|
35
|
+
*/
|
|
36
|
+
export declare function recallInsights(context: string, limit?: number): Array<IndexedInsight & {
|
|
37
|
+
relevance: number;
|
|
38
|
+
}>;
|
|
39
|
+
//# sourceMappingURL=insights-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insights-index.d.ts","sourceRoot":"","sources":["../../src/palace/insights-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC;IAC7C,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAMD,wBAAgB,iBAAiB,IAAI,aAAa,CAUjD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAK7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,iBAAiB,GAAG,gBAAgB,CAAC,GAAG,cAAc,CAmC5H;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,KAAK,CAAC,cAAc,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CA8BhH"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-project insights index.
|
|
3
|
+
*
|
|
4
|
+
* A single JSON file mapping insights to situations.
|
|
5
|
+
* When an agent starts a task, it can query: "what insights apply here?"
|
|
6
|
+
* The system matches the current context against `applies_when` keywords.
|
|
7
|
+
*
|
|
8
|
+
* Global scope: ~/.agent-recall/insights-index.json
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from "node:fs";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import { JOURNAL_ROOT } from "../types.js";
|
|
13
|
+
import { ensureDir } from "../storage/fs-utils.js";
|
|
14
|
+
function indexPath() {
|
|
15
|
+
return path.join(JOURNAL_ROOT, "insights-index.json");
|
|
16
|
+
}
|
|
17
|
+
export function readInsightsIndex() {
|
|
18
|
+
const p = indexPath();
|
|
19
|
+
if (!fs.existsSync(p)) {
|
|
20
|
+
return { version: "1.0.0", updated: new Date().toISOString(), insights: [] };
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(fs.readFileSync(p, "utf-8"));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return { version: "1.0.0", updated: new Date().toISOString(), insights: [] };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function writeInsightsIndex(index) {
|
|
30
|
+
const p = indexPath();
|
|
31
|
+
ensureDir(path.dirname(p));
|
|
32
|
+
index.updated = new Date().toISOString();
|
|
33
|
+
fs.writeFileSync(p, JSON.stringify(index, null, 2), "utf-8");
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Add or update an insight in the index.
|
|
37
|
+
*/
|
|
38
|
+
export function addIndexedInsight(insight) {
|
|
39
|
+
const index = readInsightsIndex();
|
|
40
|
+
const now = new Date().toISOString();
|
|
41
|
+
// Check for existing by title similarity
|
|
42
|
+
const existing = index.insights.find((i) => {
|
|
43
|
+
const existingWords = i.title.toLowerCase().split(/\s+/);
|
|
44
|
+
const newWords = insight.title.toLowerCase().split(/\s+/);
|
|
45
|
+
const overlap = newWords.filter((w) => existingWords.includes(w) && w.length > 3).length;
|
|
46
|
+
return overlap / Math.max(existingWords.length, newWords.length) > 0.5;
|
|
47
|
+
});
|
|
48
|
+
if (existing) {
|
|
49
|
+
existing.confirmed_count++;
|
|
50
|
+
existing.last_confirmed = now;
|
|
51
|
+
// Merge applies_when
|
|
52
|
+
for (const aw of insight.applies_when) {
|
|
53
|
+
if (!existing.applies_when.includes(aw)) {
|
|
54
|
+
existing.applies_when.push(aw);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
writeInsightsIndex(index);
|
|
58
|
+
return existing;
|
|
59
|
+
}
|
|
60
|
+
const newInsight = {
|
|
61
|
+
id: `idx-${Date.now()}`,
|
|
62
|
+
...insight,
|
|
63
|
+
confirmed_count: 1,
|
|
64
|
+
last_confirmed: now,
|
|
65
|
+
};
|
|
66
|
+
index.insights.push(newInsight);
|
|
67
|
+
writeInsightsIndex(index);
|
|
68
|
+
return newInsight;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Recall insights relevant to a given context.
|
|
72
|
+
* Matches context words against applies_when keywords.
|
|
73
|
+
* Returns top N matches sorted by relevance (keyword match count × severity weight × confirmation count).
|
|
74
|
+
*/
|
|
75
|
+
export function recallInsights(context, limit = 5) {
|
|
76
|
+
const index = readInsightsIndex();
|
|
77
|
+
if (index.insights.length === 0)
|
|
78
|
+
return [];
|
|
79
|
+
const contextWords = context.toLowerCase().split(/\s+/).filter((w) => w.length > 2);
|
|
80
|
+
const severityWeight = { critical: 3, important: 2, minor: 1 };
|
|
81
|
+
const scored = index.insights.map((insight) => {
|
|
82
|
+
let matchCount = 0;
|
|
83
|
+
for (const keyword of insight.applies_when) {
|
|
84
|
+
const kwWords = keyword.toLowerCase().split(/\s+/);
|
|
85
|
+
for (const kw of kwWords) {
|
|
86
|
+
if (contextWords.some((cw) => cw.includes(kw) || kw.includes(cw))) {
|
|
87
|
+
matchCount++;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const relevance = matchCount *
|
|
92
|
+
(severityWeight[insight.severity] || 1) *
|
|
93
|
+
Math.log2(insight.confirmed_count + 1);
|
|
94
|
+
return { ...insight, relevance };
|
|
95
|
+
});
|
|
96
|
+
return scored
|
|
97
|
+
.filter((s) => s.relevance > 0)
|
|
98
|
+
.sort((a, b) => b.relevance - a.relevance)
|
|
99
|
+
.slice(0, limit);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=insights-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insights-index.js","sourceRoot":"","sources":["../../src/palace/insights-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Palace operation log — parseable audit trail.
|
|
3
|
+
* Inspired by llm_wiki's wiki/log.md pattern.
|
|
4
|
+
*
|
|
5
|
+
* Every palace operation (write, consolidate, lint, archive) is logged
|
|
6
|
+
* in a structured, grep-friendly format.
|
|
7
|
+
*/
|
|
8
|
+
export declare function appendToLog(project: string, operation: string, details: Record<string, unknown>): void;
|
|
9
|
+
//# sourceMappingURL=log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/palace/log.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,IAAI,CAiBN"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Palace operation log — parseable audit trail.
|
|
3
|
+
* Inspired by llm_wiki's wiki/log.md pattern.
|
|
4
|
+
*
|
|
5
|
+
* Every palace operation (write, consolidate, lint, archive) is logged
|
|
6
|
+
* in a structured, grep-friendly format.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from "node:fs";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
import { palaceDir } from "../storage/paths.js";
|
|
11
|
+
import { ensureDir } from "../storage/fs-utils.js";
|
|
12
|
+
export function appendToLog(project, operation, details) {
|
|
13
|
+
const pd = palaceDir(project);
|
|
14
|
+
ensureDir(pd);
|
|
15
|
+
const logPath = path.join(pd, "log.md");
|
|
16
|
+
const timestamp = new Date().toISOString();
|
|
17
|
+
const detailStr = Object.entries(details)
|
|
18
|
+
.map(([k, v]) => `${k}=${JSON.stringify(v)}`)
|
|
19
|
+
.join(" ");
|
|
20
|
+
const line = `[${timestamp}] ${operation}: ${detailStr}\n`;
|
|
21
|
+
if (!fs.existsSync(logPath)) {
|
|
22
|
+
fs.writeFileSync(logPath, `# Palace Operation Log\n\n${line}`, "utf-8");
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
fs.appendFileSync(logPath, line, "utf-8");
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/palace/log.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,UAAU,WAAW,CACzB,OAAe,EACf,SAAiB,EACjB,OAAgC;IAEhC,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,CAAC,CAAC;IACd,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAExC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SACtC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5C,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,MAAM,IAAI,GAAG,IAAI,SAAS,KAAK,SAAS,KAAK,SAAS,IAAI,CAAC;IAE3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,6BAA6B,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Obsidian-compatible markdown formatting.
|
|
3
|
+
* Generates YAML frontmatter and [[wikilinks]] for every palace file.
|
|
4
|
+
*/
|
|
5
|
+
import type { RoomMeta } from "../types.js";
|
|
6
|
+
export declare function generateFrontmatter(meta: Record<string, unknown>): string;
|
|
7
|
+
export declare function roomReadmeContent(meta: RoomMeta): string;
|
|
8
|
+
/** Extract [[wikilinks]] from markdown content. */
|
|
9
|
+
export declare function extractWikilinks(content: string): string[];
|
|
10
|
+
/** Insert a back-reference section into a README if not already present. */
|
|
11
|
+
export declare function addBackReference(content: string, fromRoom: string, fromTopic: string): string;
|
|
12
|
+
//# sourceMappingURL=obsidian.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obsidian.d.ts","sourceRoot":"","sources":["../../src/palace/obsidian.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAczE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CA0BxD;AAED,mDAAmD;AACnD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAU1D;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,MAAM,CAmBR"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Obsidian-compatible markdown formatting.
|
|
3
|
+
* Generates YAML frontmatter and [[wikilinks]] for every palace file.
|
|
4
|
+
*/
|
|
5
|
+
export function generateFrontmatter(meta) {
|
|
6
|
+
const lines = ["---"];
|
|
7
|
+
for (const [key, value] of Object.entries(meta)) {
|
|
8
|
+
if (value === undefined || value === null)
|
|
9
|
+
continue;
|
|
10
|
+
if (Array.isArray(value)) {
|
|
11
|
+
lines.push(`${key}: [${value.map((v) => JSON.stringify(v)).join(", ")}]`);
|
|
12
|
+
}
|
|
13
|
+
else if (typeof value === "object") {
|
|
14
|
+
lines.push(`${key}: ${JSON.stringify(value)}`);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
lines.push(`${key}: ${value}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
lines.push("---", "");
|
|
21
|
+
return lines.join("\n");
|
|
22
|
+
}
|
|
23
|
+
export function roomReadmeContent(meta) {
|
|
24
|
+
const fm = generateFrontmatter({
|
|
25
|
+
aliases: [meta.slug],
|
|
26
|
+
tags: meta.tags,
|
|
27
|
+
salience: meta.salience,
|
|
28
|
+
created: meta.created,
|
|
29
|
+
updated: meta.updated,
|
|
30
|
+
connections: meta.connections,
|
|
31
|
+
});
|
|
32
|
+
let md = fm;
|
|
33
|
+
md += `# ${meta.name}\n\n`;
|
|
34
|
+
md += `> ${meta.description}\n\n`;
|
|
35
|
+
if (meta.connections.length > 0) {
|
|
36
|
+
md += `## Connected Rooms\n\n`;
|
|
37
|
+
for (const conn of meta.connections) {
|
|
38
|
+
md += `- [[${conn}/README|${conn}]]\n`;
|
|
39
|
+
}
|
|
40
|
+
md += "\n";
|
|
41
|
+
}
|
|
42
|
+
md += `## Memories\n\n`;
|
|
43
|
+
md += `_(entries will appear below as the agent writes to this room)_\n`;
|
|
44
|
+
return md;
|
|
45
|
+
}
|
|
46
|
+
/** Extract [[wikilinks]] from markdown content. */
|
|
47
|
+
export function extractWikilinks(content) {
|
|
48
|
+
const matches = content.matchAll(/\[\[([^\]|]+?)(?:\|[^\]]*?)?\]\]/g);
|
|
49
|
+
const links = [];
|
|
50
|
+
for (const m of matches) {
|
|
51
|
+
const target = m[1].replace(/\/README$/, "").trim();
|
|
52
|
+
if (target && !links.includes(target)) {
|
|
53
|
+
links.push(target);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return links;
|
|
57
|
+
}
|
|
58
|
+
/** Insert a back-reference section into a README if not already present. */
|
|
59
|
+
export function addBackReference(content, fromRoom, fromTopic) {
|
|
60
|
+
const refLine = `- [[${fromRoom}/${fromTopic}|${fromRoom}/${fromTopic}]]`;
|
|
61
|
+
// Check if section exists
|
|
62
|
+
const sectionHeader = "## Referenced By";
|
|
63
|
+
if (content.includes(sectionHeader)) {
|
|
64
|
+
if (content.includes(refLine))
|
|
65
|
+
return content; // already referenced
|
|
66
|
+
const idx = content.indexOf(sectionHeader);
|
|
67
|
+
const insertPos = idx + sectionHeader.length;
|
|
68
|
+
return (content.slice(0, insertPos) +
|
|
69
|
+
"\n\n" +
|
|
70
|
+
refLine +
|
|
71
|
+
content.slice(insertPos));
|
|
72
|
+
}
|
|
73
|
+
// Add section at end
|
|
74
|
+
return content.trimEnd() + `\n\n${sectionHeader}\n\n${refLine}\n`;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=obsidian.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../src/palace/obsidian.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Palace room management — create, list, read, update rooms.
|
|
3
|
+
*/
|
|
4
|
+
import type { RoomMeta } from "../types.js";
|
|
5
|
+
export declare function createRoom(project: string, slug: string, name: string, description: string, tags?: string[], connections?: string[]): RoomMeta;
|
|
6
|
+
export declare function getRoomMeta(project: string, roomSlug: string): RoomMeta | null;
|
|
7
|
+
export declare function updateRoomMeta(project: string, roomSlug: string, updates: Partial<RoomMeta>): RoomMeta | null;
|
|
8
|
+
export declare function listRooms(project: string): RoomMeta[];
|
|
9
|
+
export declare function roomExists(project: string, roomSlug: string): boolean;
|
|
10
|
+
/** Initialize default palace rooms if palace doesn't exist yet. */
|
|
11
|
+
export declare function ensurePalaceInitialized(project: string): void;
|
|
12
|
+
/** Record an access (bump access_count and last_accessed). */
|
|
13
|
+
export declare function recordAccess(project: string, roomSlug: string): void;
|
|
14
|
+
//# sourceMappingURL=rooms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rooms.d.ts","sourceRoot":"","sources":["../../src/palace/rooms.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAW5C,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,MAAM,EAAO,EACnB,WAAW,GAAE,MAAM,EAAO,GACzB,QAAQ,CA4BV;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAG9E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,IAAI,CAS7G;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAiBrD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGrE;AAED,mEAAmE;AACnE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAyC7D;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOpE"}
|