@openweave/weave-graph 0.2.0
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/LICENSE +21 -0
- package/README.md +290 -0
- package/dist/compression.d.ts +94 -0
- package/dist/compression.d.ts.map +1 -0
- package/dist/compression.js +210 -0
- package/dist/compression.js.map +1 -0
- package/dist/edge.d.ts +43 -0
- package/dist/edge.d.ts.map +1 -0
- package/dist/edge.js +79 -0
- package/dist/edge.js.map +1 -0
- package/dist/index.d.ts +159 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +339 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +43 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +79 -0
- package/dist/node.js.map +1 -0
- package/dist/persistence.d.ts +58 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/persistence.js +188 -0
- package/dist/persistence.js.map +1 -0
- package/dist/types.d.ts +74 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +27 -0
- package/dist/types.js.map +1 -0
- package/package.json +42 -0
package/dist/node.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { NodeType } from "./types";
|
|
2
|
+
import { randomUUID } from "crypto";
|
|
3
|
+
/**
|
|
4
|
+
* NodeBuilder utility for creating and managing graph nodes
|
|
5
|
+
*/
|
|
6
|
+
export class NodeBuilder {
|
|
7
|
+
/**
|
|
8
|
+
* Create a new node with the given type and label
|
|
9
|
+
*/
|
|
10
|
+
static create(type, label, description, metadata) {
|
|
11
|
+
return {
|
|
12
|
+
id: randomUUID(),
|
|
13
|
+
type,
|
|
14
|
+
label,
|
|
15
|
+
description,
|
|
16
|
+
metadata: metadata ?? {},
|
|
17
|
+
createdAt: new Date(),
|
|
18
|
+
updatedAt: new Date(),
|
|
19
|
+
frequency: 1,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a CONCEPT node
|
|
24
|
+
*/
|
|
25
|
+
static concept(label, description) {
|
|
26
|
+
return this.create(NodeType.CONCEPT, label, description);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a DECISION node
|
|
30
|
+
*/
|
|
31
|
+
static decision(label, description) {
|
|
32
|
+
return this.create(NodeType.DECISION, label, description);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a MILESTONE node
|
|
36
|
+
*/
|
|
37
|
+
static milestone(label, description) {
|
|
38
|
+
return this.create(NodeType.MILESTONE, label, description);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create an ERROR node
|
|
42
|
+
*/
|
|
43
|
+
static error(label, description) {
|
|
44
|
+
return this.create(NodeType.ERROR, label, description);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Create a CORRECTION node
|
|
48
|
+
*/
|
|
49
|
+
static correction(label, description) {
|
|
50
|
+
return this.create(NodeType.CORRECTION, label, description);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create a CODE_ENTITY node
|
|
54
|
+
*/
|
|
55
|
+
static codeEntity(label, description) {
|
|
56
|
+
return this.create(NodeType.CODE_ENTITY, label, description);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Clone a node with updated values
|
|
60
|
+
*/
|
|
61
|
+
static clone(node, updates) {
|
|
62
|
+
return {
|
|
63
|
+
...node,
|
|
64
|
+
updatedAt: new Date(),
|
|
65
|
+
...updates,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Increment frequency counter for a node
|
|
70
|
+
*/
|
|
71
|
+
static incrementFrequency(node) {
|
|
72
|
+
return {
|
|
73
|
+
...node,
|
|
74
|
+
frequency: (node.frequency ?? 1) + 1,
|
|
75
|
+
updatedAt: new Date(),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;GAEG;AACH,MAAM,OAAO,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,MAAM,CACX,IAAc,EACd,KAAa,EACb,WAAoB,EACpB,QAAkC;QAElC,OAAO;YACL,EAAE,EAAE,UAAU,EAAE;YAChB,IAAI;YACJ,KAAK;YACL,WAAW;YACX,QAAQ,EAAE,QAAQ,IAAI,EAAE;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAa,EAAE,WAAoB;QAChD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAa,EAAE,WAAoB;QACjD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,KAAa,EAAE,WAAoB;QAClD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,KAAa,EAAE,WAAoB;QAC9C,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAa,EAAE,WAAoB;QACnD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAa,EAAE,WAAoB;QACnD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CACV,IAAU,EACV,OAAuB;QAEvB,OAAO;YACL,GAAG,IAAI;YACP,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,GAAG,OAAO;SACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,IAAU;QAClC,OAAO;YACL,GAAG,IAAI;YACP,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC;YACpC,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ContextGraphManager } from "./index";
|
|
2
|
+
import { GraphSnapshot } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* PersistenceManager
|
|
5
|
+
* Handles saving and loading graph snapshots to/from disk
|
|
6
|
+
* Organizes files by chat_id in a configurable data directory
|
|
7
|
+
*/
|
|
8
|
+
export declare class PersistenceManager {
|
|
9
|
+
private dataDir;
|
|
10
|
+
constructor(dataDir?: string);
|
|
11
|
+
/**
|
|
12
|
+
* Get the file path for a given chat_id
|
|
13
|
+
*/
|
|
14
|
+
private getFilePath;
|
|
15
|
+
/**
|
|
16
|
+
* Ensure the data directory exists
|
|
17
|
+
*/
|
|
18
|
+
ensureDataDir(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Save a graph snapshot to disk
|
|
21
|
+
*/
|
|
22
|
+
saveGraph(snapshot: GraphSnapshot): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Load a graph snapshot from disk
|
|
25
|
+
*/
|
|
26
|
+
loadGraph(chatId: string): Promise<GraphSnapshot | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Load or create a graph manager for a chat session
|
|
29
|
+
*/
|
|
30
|
+
loadOrCreateGraph(chatId: string, compressionThreshold?: number): Promise<ContextGraphManager>;
|
|
31
|
+
/**
|
|
32
|
+
* Check if a graph exists on disk
|
|
33
|
+
*/
|
|
34
|
+
graphExists(chatId: string): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Delete a graph from disk
|
|
37
|
+
*/
|
|
38
|
+
deleteGraph(chatId: string): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* List all saved chat sessions
|
|
41
|
+
*/
|
|
42
|
+
listSessions(): Promise<Array<{
|
|
43
|
+
chatId: string;
|
|
44
|
+
createdAt: Date;
|
|
45
|
+
updatedAt: Date;
|
|
46
|
+
nodeCount: number;
|
|
47
|
+
edgeCount: number;
|
|
48
|
+
}>>;
|
|
49
|
+
/**
|
|
50
|
+
* Change the data directory
|
|
51
|
+
*/
|
|
52
|
+
setDataDir(newDataDir: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* Get the current data directory
|
|
55
|
+
*/
|
|
56
|
+
getDataDir(): string;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC;;;;GAIG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAuB;IAI5C;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAUpC;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCvD;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA4C9D;;OAEG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO,CAAC,mBAAmB,CAAC;IAU/B;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUnD;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYhD;;OAEG;IACG,YAAY,IAAI,OAAO,CAC3B,KAAK,CAAC;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,IAAI,CAAC;QAChB,SAAS,EAAE,IAAI,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CACH;IAmCD;;OAEG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,UAAU,IAAI,MAAM;CAGrB"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { promises as fs } from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { ContextGraphManager } from "./index";
|
|
4
|
+
/**
|
|
5
|
+
* PersistenceManager
|
|
6
|
+
* Handles saving and loading graph snapshots to/from disk
|
|
7
|
+
* Organizes files by chat_id in a configurable data directory
|
|
8
|
+
*/
|
|
9
|
+
export class PersistenceManager {
|
|
10
|
+
dataDir;
|
|
11
|
+
constructor(dataDir = "./weave-data") {
|
|
12
|
+
this.dataDir = dataDir;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get the file path for a given chat_id
|
|
16
|
+
*/
|
|
17
|
+
getFilePath(chatId) {
|
|
18
|
+
const sanitizedId = chatId.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
19
|
+
return path.join(this.dataDir, `${sanitizedId}.json`);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Ensure the data directory exists
|
|
23
|
+
*/
|
|
24
|
+
async ensureDataDir() {
|
|
25
|
+
try {
|
|
26
|
+
await fs.mkdir(this.dataDir, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (error.code !== "EEXIST") {
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Save a graph snapshot to disk
|
|
36
|
+
*/
|
|
37
|
+
async saveGraph(snapshot) {
|
|
38
|
+
await this.ensureDataDir();
|
|
39
|
+
const filePath = this.getFilePath(snapshot.metadata.chatId);
|
|
40
|
+
const serialized = {
|
|
41
|
+
...snapshot,
|
|
42
|
+
metadata: {
|
|
43
|
+
...snapshot.metadata,
|
|
44
|
+
createdAt: snapshot.metadata.createdAt.toISOString(),
|
|
45
|
+
updatedAt: snapshot.metadata.updatedAt.toISOString(),
|
|
46
|
+
},
|
|
47
|
+
nodes: Object.fromEntries(Object.entries(snapshot.nodes).map(([id, node]) => [
|
|
48
|
+
id,
|
|
49
|
+
{
|
|
50
|
+
...node,
|
|
51
|
+
createdAt: node.createdAt.toISOString(),
|
|
52
|
+
updatedAt: node.updatedAt.toISOString(),
|
|
53
|
+
},
|
|
54
|
+
])),
|
|
55
|
+
edges: Object.fromEntries(Object.entries(snapshot.edges).map(([id, edge]) => [
|
|
56
|
+
id,
|
|
57
|
+
{
|
|
58
|
+
...edge,
|
|
59
|
+
createdAt: edge.createdAt.toISOString(),
|
|
60
|
+
updatedAt: edge.updatedAt.toISOString(),
|
|
61
|
+
},
|
|
62
|
+
])),
|
|
63
|
+
};
|
|
64
|
+
await fs.writeFile(filePath, JSON.stringify(serialized, null, 2), "utf-8");
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Load a graph snapshot from disk
|
|
68
|
+
*/
|
|
69
|
+
async loadGraph(chatId) {
|
|
70
|
+
const filePath = this.getFilePath(chatId);
|
|
71
|
+
try {
|
|
72
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
73
|
+
const parsed = JSON.parse(content);
|
|
74
|
+
// Deserialize dates
|
|
75
|
+
return {
|
|
76
|
+
...parsed,
|
|
77
|
+
metadata: {
|
|
78
|
+
...parsed.metadata,
|
|
79
|
+
createdAt: new Date(parsed.metadata.createdAt),
|
|
80
|
+
updatedAt: new Date(parsed.metadata.updatedAt),
|
|
81
|
+
},
|
|
82
|
+
nodes: Object.fromEntries(Object.entries(parsed.nodes).map(([id, node]) => [
|
|
83
|
+
id,
|
|
84
|
+
{
|
|
85
|
+
...node,
|
|
86
|
+
createdAt: new Date(node.createdAt),
|
|
87
|
+
updatedAt: new Date(node.updatedAt),
|
|
88
|
+
},
|
|
89
|
+
])),
|
|
90
|
+
edges: Object.fromEntries(Object.entries(parsed.edges).map(([id, edge]) => [
|
|
91
|
+
id,
|
|
92
|
+
{
|
|
93
|
+
...edge,
|
|
94
|
+
createdAt: new Date(edge.createdAt),
|
|
95
|
+
updatedAt: new Date(edge.updatedAt),
|
|
96
|
+
},
|
|
97
|
+
])),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
if (error.code === "ENOENT") {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Load or create a graph manager for a chat session
|
|
109
|
+
*/
|
|
110
|
+
async loadOrCreateGraph(chatId, compressionThreshold) {
|
|
111
|
+
const snapshot = await this.loadGraph(chatId);
|
|
112
|
+
if (snapshot) {
|
|
113
|
+
return ContextGraphManager.fromSnapshot(snapshot);
|
|
114
|
+
}
|
|
115
|
+
return new ContextGraphManager(chatId, compressionThreshold);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Check if a graph exists on disk
|
|
119
|
+
*/
|
|
120
|
+
async graphExists(chatId) {
|
|
121
|
+
const filePath = this.getFilePath(chatId);
|
|
122
|
+
try {
|
|
123
|
+
await fs.access(filePath);
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Delete a graph from disk
|
|
132
|
+
*/
|
|
133
|
+
async deleteGraph(chatId) {
|
|
134
|
+
const filePath = this.getFilePath(chatId);
|
|
135
|
+
try {
|
|
136
|
+
await fs.unlink(filePath);
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
if (error.code !== "ENOENT") {
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* List all saved chat sessions
|
|
146
|
+
*/
|
|
147
|
+
async listSessions() {
|
|
148
|
+
await this.ensureDataDir();
|
|
149
|
+
try {
|
|
150
|
+
const files = await fs.readdir(this.dataDir);
|
|
151
|
+
const jsonFiles = files.filter((f) => f.endsWith(".json"));
|
|
152
|
+
const sessions = await Promise.all(jsonFiles.map(async (file) => {
|
|
153
|
+
const chatId = file.replace(".json", "");
|
|
154
|
+
const snapshot = await this.loadGraph(chatId);
|
|
155
|
+
if (!snapshot) {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
chatId,
|
|
160
|
+
createdAt: snapshot.metadata.createdAt,
|
|
161
|
+
updatedAt: snapshot.metadata.updatedAt,
|
|
162
|
+
nodeCount: Object.keys(snapshot.nodes).length,
|
|
163
|
+
edgeCount: Object.keys(snapshot.edges).length,
|
|
164
|
+
};
|
|
165
|
+
}));
|
|
166
|
+
return sessions.filter((s) => s !== null);
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
if (error.code === "ENOENT") {
|
|
170
|
+
return [];
|
|
171
|
+
}
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Change the data directory
|
|
177
|
+
*/
|
|
178
|
+
setDataDir(newDataDir) {
|
|
179
|
+
this.dataDir = newDataDir;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get the current data directory
|
|
183
|
+
*/
|
|
184
|
+
getDataDir() {
|
|
185
|
+
return this.dataDir;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node Types for WeaveGraph
|
|
3
|
+
* Represents different kinds of concepts in the knowledge graph
|
|
4
|
+
*/
|
|
5
|
+
export declare enum NodeType {
|
|
6
|
+
CONCEPT = "CONCEPT",
|
|
7
|
+
DECISION = "DECISION",
|
|
8
|
+
MILESTONE = "MILESTONE",
|
|
9
|
+
ERROR = "ERROR",
|
|
10
|
+
CORRECTION = "CORRECTION",
|
|
11
|
+
CODE_ENTITY = "CODE_ENTITY"
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Edge Types for WeaveGraph
|
|
15
|
+
* Represents different semantic relationships between nodes
|
|
16
|
+
*/
|
|
17
|
+
export declare enum EdgeType {
|
|
18
|
+
RELATES = "RELATES",
|
|
19
|
+
CAUSES = "CAUSES",
|
|
20
|
+
CORRECTS = "CORRECTS",
|
|
21
|
+
IMPLEMENTS = "IMPLEMENTS",
|
|
22
|
+
DEPENDS_ON = "DEPENDS_ON",
|
|
23
|
+
BLOCKS = "BLOCKS"
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Node in the WeaveGraph
|
|
27
|
+
* Base representation of a concept, decision, error, etc.
|
|
28
|
+
*/
|
|
29
|
+
export interface Node {
|
|
30
|
+
id: string;
|
|
31
|
+
type: NodeType;
|
|
32
|
+
label: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
metadata?: Record<string, unknown>;
|
|
35
|
+
createdAt: Date;
|
|
36
|
+
updatedAt: Date;
|
|
37
|
+
frequency?: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Edge in the WeaveGraph
|
|
41
|
+
* Represents a semantic relationship between two nodes
|
|
42
|
+
*/
|
|
43
|
+
export interface Edge {
|
|
44
|
+
id: string;
|
|
45
|
+
sourceId: string;
|
|
46
|
+
targetId: string;
|
|
47
|
+
type: EdgeType;
|
|
48
|
+
weight?: number;
|
|
49
|
+
metadata?: Record<string, unknown>;
|
|
50
|
+
createdAt: Date;
|
|
51
|
+
updatedAt: Date;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Query result from keyword-based search
|
|
55
|
+
*/
|
|
56
|
+
export interface QueryResult {
|
|
57
|
+
nodes: Node[];
|
|
58
|
+
edges: Edge[];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Serialized graph for persistence
|
|
62
|
+
*/
|
|
63
|
+
export interface GraphSnapshot {
|
|
64
|
+
nodes: Record<string, Node>;
|
|
65
|
+
edges: Record<string, Edge>;
|
|
66
|
+
metadata: {
|
|
67
|
+
chatId: string;
|
|
68
|
+
version: string;
|
|
69
|
+
createdAt: Date;
|
|
70
|
+
updatedAt: Date;
|
|
71
|
+
compressionThreshold: number;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,oBAAY,QAAQ;IAClB,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,KAAK,UAAU;IACf,UAAU,eAAe;IACzB,WAAW,gBAAgB;CAC5B;AAED;;;GAGG;AACH,oBAAY,QAAQ;IAClB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,UAAU,eAAe;IACzB,UAAU,eAAe;IACzB,MAAM,WAAW;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,IAAI,CAAC;QAChB,SAAS,EAAE,IAAI,CAAC;QAChB,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node Types for WeaveGraph
|
|
3
|
+
* Represents different kinds of concepts in the knowledge graph
|
|
4
|
+
*/
|
|
5
|
+
export var NodeType;
|
|
6
|
+
(function (NodeType) {
|
|
7
|
+
NodeType["CONCEPT"] = "CONCEPT";
|
|
8
|
+
NodeType["DECISION"] = "DECISION";
|
|
9
|
+
NodeType["MILESTONE"] = "MILESTONE";
|
|
10
|
+
NodeType["ERROR"] = "ERROR";
|
|
11
|
+
NodeType["CORRECTION"] = "CORRECTION";
|
|
12
|
+
NodeType["CODE_ENTITY"] = "CODE_ENTITY";
|
|
13
|
+
})(NodeType || (NodeType = {}));
|
|
14
|
+
/**
|
|
15
|
+
* Edge Types for WeaveGraph
|
|
16
|
+
* Represents different semantic relationships between nodes
|
|
17
|
+
*/
|
|
18
|
+
export var EdgeType;
|
|
19
|
+
(function (EdgeType) {
|
|
20
|
+
EdgeType["RELATES"] = "RELATES";
|
|
21
|
+
EdgeType["CAUSES"] = "CAUSES";
|
|
22
|
+
EdgeType["CORRECTS"] = "CORRECTS";
|
|
23
|
+
EdgeType["IMPLEMENTS"] = "IMPLEMENTS";
|
|
24
|
+
EdgeType["DEPENDS_ON"] = "DEPENDS_ON";
|
|
25
|
+
EdgeType["BLOCKS"] = "BLOCKS";
|
|
26
|
+
})(EdgeType || (EdgeType = {}));
|
|
27
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAN,IAAY,QAOX;AAPD,WAAY,QAAQ;IAClB,+BAAmB,CAAA;IACnB,iCAAqB,CAAA;IACrB,mCAAuB,CAAA;IACvB,2BAAe,CAAA;IACf,qCAAyB,CAAA;IACzB,uCAA2B,CAAA;AAC7B,CAAC,EAPW,QAAQ,KAAR,QAAQ,QAOnB;AAED;;;GAGG;AACH,MAAM,CAAN,IAAY,QAOX;AAPD,WAAY,QAAQ;IAClB,+BAAmB,CAAA;IACnB,6BAAiB,CAAA;IACjB,iCAAqB,CAAA;IACrB,qCAAyB,CAAA;IACzB,qCAAyB,CAAA;IACzB,6BAAiB,CAAA;AACnB,CAAC,EAPW,QAAQ,KAAR,QAAQ,QAOnB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@openweave/weave-graph",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "WeaveGraph — Persistent node & edge data model for AI agent context",
|
|
5
|
+
"private": false,
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"import": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"weave",
|
|
22
|
+
"graph",
|
|
23
|
+
"context",
|
|
24
|
+
"ai-agent",
|
|
25
|
+
"semantic-memory"
|
|
26
|
+
],
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "22.10.2",
|
|
29
|
+
"typescript": "5.7.2",
|
|
30
|
+
"vitest": "3.0.0"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@openweave/weave-provider": "0.8.0"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc",
|
|
37
|
+
"dev": "tsc --watch",
|
|
38
|
+
"test": "vitest",
|
|
39
|
+
"lint": "eslint src --max-warnings 0",
|
|
40
|
+
"clean": "rm -rf dist"
|
|
41
|
+
}
|
|
42
|
+
}
|