ziiagentmemory 0.1.0 → 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ziiagentmemory",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Persistent memory for AI coding agents — CJK-aware dedup, memory_update versioning, standalone MCP server",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -1,78 +0,0 @@
1
- import { createHash } from "node:crypto";
2
- //#region src/state/schema.ts
3
- const KV = {
4
- sessions: "mem:sessions",
5
- observations: (sessionId) => `mem:obs:${sessionId}`,
6
- memories: "mem:memories",
7
- summaries: "mem:summaries",
8
- config: "mem:config",
9
- metrics: "mem:metrics",
10
- health: "mem:health",
11
- embeddings: (obsId) => `mem:emb:${obsId}`,
12
- bm25Index: "mem:index:bm25",
13
- relations: "mem:relations",
14
- profiles: "mem:profiles",
15
- claudeBridge: "mem:claude-bridge",
16
- graphNodes: "mem:graph:nodes",
17
- graphEdges: "mem:graph:edges",
18
- graphSnapshot: "mem:graph:snapshot",
19
- graphNameIndex: "mem:graph:name-index",
20
- graphEdgeKey: "mem:graph:edge-key",
21
- graphNodeDegree: "mem:graph:node-degree",
22
- semantic: "mem:semantic",
23
- procedural: "mem:procedural",
24
- teamShared: (teamId) => `mem:team:${teamId}:shared`,
25
- teamUsers: (teamId, userId) => `mem:team:${teamId}:users:${userId}`,
26
- teamProfile: (teamId) => `mem:team:${teamId}:profile`,
27
- audit: "mem:audit",
28
- actions: "mem:actions",
29
- actionEdges: "mem:action-edges",
30
- leases: "mem:leases",
31
- routines: "mem:routines",
32
- routineRuns: "mem:routine-runs",
33
- signals: "mem:signals",
34
- checkpoints: "mem:checkpoints",
35
- mesh: "mem:mesh",
36
- sketches: "mem:sketches",
37
- facets: "mem:facets",
38
- sentinels: "mem:sentinels",
39
- crystals: "mem:crystals",
40
- lessons: "mem:lessons",
41
- insights: "mem:insights",
42
- graphEdgeHistory: "mem:graph:edge-history",
43
- enrichedChunks: (sessionId) => `mem:enriched:${sessionId}`,
44
- latentEmbeddings: (obsId) => `mem:latent:${obsId}`,
45
- retentionScores: "mem:retention",
46
- accessLog: "mem:access",
47
- imageRefs: "mem:image-refs",
48
- imageEmbeddings: "mem:image-embeddings",
49
- slots: "mem:slots",
50
- globalSlots: "mem:slots:global",
51
- state: "mem:state",
52
- commits: "mem:commits",
53
- recentSearches: "mem:recent-searches"
54
- };
55
- const STREAM = {
56
- name: "mem-live",
57
- group: (sessionId) => sessionId,
58
- viewerGroup: "viewer"
59
- };
60
- function generateId(prefix) {
61
- return `${prefix}_${Date.now().toString(36)}_${crypto.randomUUID().replace(/-/g, "").slice(0, 12)}`;
62
- }
63
- function fingerprintId(prefix, content) {
64
- return `${prefix}_${createHash("sha256").update(content).digest("hex").slice(0, 16)}`;
65
- }
66
- function jaccardSimilarity(a, b) {
67
- const setA = new Set(a.split(/\s+/).filter((t) => t.length > 2));
68
- const setB = new Set(b.split(/\s+/).filter((t) => t.length > 2));
69
- if (setA.size === 0 && setB.size === 0) return 1;
70
- if (setA.size === 0 || setB.size === 0) return 0;
71
- let intersection = 0;
72
- for (const word of setA) if (setB.has(word)) intersection++;
73
- return intersection / (setA.size + setB.size - intersection);
74
- }
75
- //#endregion
76
- export { jaccardSimilarity as a, generateId as i, STREAM as n, fingerprintId as r, KV as t };
77
-
78
- //# sourceMappingURL=schema-CNiCWzV9.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema-CNiCWzV9.mjs","names":[],"sources":["../src/state/schema.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\r\n\r\nexport const KV = {\r\n sessions: \"mem:sessions\",\r\n observations: (sessionId: string) => `mem:obs:${sessionId}`,\r\n memories: \"mem:memories\",\r\n summaries: \"mem:summaries\",\r\n config: \"mem:config\",\r\n metrics: \"mem:metrics\",\r\n health: \"mem:health\",\r\n embeddings: (obsId: string) => `mem:emb:${obsId}`,\r\n bm25Index: \"mem:index:bm25\",\r\n relations: \"mem:relations\",\r\n profiles: \"mem:profiles\",\r\n claudeBridge: \"mem:claude-bridge\",\r\n graphNodes: \"mem:graph:nodes\",\r\n graphEdges: \"mem:graph:edges\",\r\n // #814: precomputed snapshot of the top-degree subgraph and aggregate\r\n // type counts. Saves /graph/query and /graph/stats from a full\r\n // kv.list enumeration over 75K+ node corpora, which exceeds the iii\r\n // invocation timeout and surfaces as \"Invocation stopped\" 500s.\r\n // Single fixed key (\"current\") so writes are read-modify-write under\r\n // the same keyed mutex as graph-extract.\r\n graphSnapshot: \"mem:graph:snapshot\",\r\n // #814 v2: targeted-lookup indexes so graph-extract never enumerates\r\n // the full nodes/edges scope. Each entry is a single small kv.get,\r\n // bounded payload — works at 75K+ nodes where kv.list would block\r\n // the worker event loop (37MB WS frame parse blocks heartbeat,\r\n // worker is declared dead before any Promise.race timer can fire).\r\n // - graphNameIndex: key `${type}|${name}` -> nodeId. Replaces the\r\n // existingNodes.find() O(n) dedup scan inside mem::graph-extract.\r\n // - graphEdgeKey: key `${src}|${tgt}|${type}` -> edgeId. Same for\r\n // edge dedup.\r\n // - graphNodeDegree: key nodeId -> incident-edge count. Read /\r\n // incremented on edge writes to maintain the snapshot top-N\r\n // ranking without scanning all edges.\r\n graphNameIndex: \"mem:graph:name-index\",\r\n graphEdgeKey: \"mem:graph:edge-key\",\r\n graphNodeDegree: \"mem:graph:node-degree\",\r\n semantic: \"mem:semantic\",\r\n procedural: \"mem:procedural\",\r\n teamShared: (teamId: string) => `mem:team:${teamId}:shared`,\r\n teamUsers: (teamId: string, userId: string) =>\r\n `mem:team:${teamId}:users:${userId}`,\r\n teamProfile: (teamId: string) => `mem:team:${teamId}:profile`,\r\n audit: \"mem:audit\",\r\n actions: \"mem:actions\",\r\n actionEdges: \"mem:action-edges\",\r\n leases: \"mem:leases\",\r\n routines: \"mem:routines\",\r\n routineRuns: \"mem:routine-runs\",\r\n signals: \"mem:signals\",\r\n checkpoints: \"mem:checkpoints\",\r\n mesh: \"mem:mesh\",\r\n sketches: \"mem:sketches\",\r\n facets: \"mem:facets\",\r\n sentinels: \"mem:sentinels\",\r\n crystals: \"mem:crystals\",\r\n lessons: \"mem:lessons\",\r\n insights: \"mem:insights\",\r\n graphEdgeHistory: \"mem:graph:edge-history\",\r\n enrichedChunks: (sessionId: string) => `mem:enriched:${sessionId}`,\r\n latentEmbeddings: (obsId: string) => `mem:latent:${obsId}`,\r\n retentionScores: \"mem:retention\",\r\n accessLog: \"mem:access\",\r\n imageRefs: \"mem:image-refs\",\r\n imageEmbeddings: \"mem:image-embeddings\",\r\n slots: \"mem:slots\",\r\n globalSlots: \"mem:slots:global\",\r\n state: \"mem:state\",\r\n commits: \"mem:commits\",\r\n // #771: tracks the most recent smart-search call per session, used by\r\n // the followup-rate diagnostic. Key = sessionId. TTL-swept hourly.\r\n recentSearches: \"mem:recent-searches\",\r\n} as const;\r\n\r\nexport const STREAM = {\r\n name: \"mem-live\",\r\n group: (sessionId: string) => sessionId,\r\n viewerGroup: \"viewer\",\r\n} as const;\r\n\r\nexport function generateId(prefix: string): string {\r\n const ts = Date.now().toString(36);\r\n const rand = crypto.randomUUID().replace(/-/g, \"\").slice(0, 12);\r\n return `${prefix}_${ts}_${rand}`;\r\n}\r\n\r\nexport function fingerprintId(prefix: string, content: string): string {\r\n const hash = createHash(\"sha256\").update(content).digest(\"hex\");\r\n return `${prefix}_${hash.slice(0, 16)}`;\r\n}\r\n\r\nexport function jaccardSimilarity(a: string, b: string): number {\r\n const setA = new Set(a.split(/\\s+/).filter((t) => t.length > 2));\r\n const setB = new Set(b.split(/\\s+/).filter((t) => t.length > 2));\r\n if (setA.size === 0 && setB.size === 0) return 1;\r\n if (setA.size === 0 || setB.size === 0) return 0;\r\n let intersection = 0;\r\n for (const word of setA) {\r\n if (setB.has(word)) intersection++;\r\n }\r\n return intersection / (setA.size + setB.size - intersection);\r\n}\r\n"],"mappings":";;AAEA,MAAa,KAAK;CAChB,UAAU;CACV,eAAe,cAAsB,WAAW;CAChD,UAAU;CACV,WAAW;CACX,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,aAAa,UAAkB,WAAW;CAC1C,WAAW;CACX,WAAW;CACX,UAAU;CACV,cAAc;CACd,YAAY;CACZ,YAAY;CAOZ,eAAe;CAaf,gBAAgB;CAChB,cAAc;CACd,iBAAiB;CACjB,UAAU;CACV,YAAY;CACZ,aAAa,WAAmB,YAAY,OAAO;CACnD,YAAY,QAAgB,WAC1B,YAAY,OAAO,SAAS;CAC9B,cAAc,WAAmB,YAAY,OAAO;CACpD,OAAO;CACP,SAAS;CACT,aAAa;CACb,QAAQ;CACR,UAAU;CACV,aAAa;CACb,SAAS;CACT,aAAa;CACb,MAAM;CACN,UAAU;CACV,QAAQ;CACR,WAAW;CACX,UAAU;CACV,SAAS;CACT,UAAU;CACV,kBAAkB;CAClB,iBAAiB,cAAsB,gBAAgB;CACvD,mBAAmB,UAAkB,cAAc;CACnD,iBAAiB;CACjB,WAAW;CACX,WAAW;CACX,iBAAiB;CACjB,OAAO;CACP,aAAa;CACb,OAAO;CACP,SAAS;CAGT,gBAAgB;CACjB;AAED,MAAa,SAAS;CACpB,MAAM;CACN,QAAQ,cAAsB;CAC9B,aAAa;CACd;AAED,SAAgB,WAAW,QAAwB;AAGjD,QAAO,GAAG,OAAO,GAFN,KAAK,KAAK,CAAC,SAAS,GAET,CAAC,GADV,OAAO,YAAY,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,GAAG,GAC9B;;AAGhC,SAAgB,cAAc,QAAgB,SAAyB;AAErE,QAAO,GAAG,OAAO,GADJ,WAAW,SAAS,CAAC,OAAO,QAAQ,CAAC,OAAO,MACjC,CAAC,MAAM,GAAG,GAAG;;AAGvC,SAAgB,kBAAkB,GAAW,GAAmB;CAC9D,MAAM,OAAO,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC,QAAQ,MAAM,EAAE,SAAS,EAAE,CAAC;CAChE,MAAM,OAAO,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC,QAAQ,MAAM,EAAE,SAAS,EAAE,CAAC;AAChE,KAAI,KAAK,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;AAC/C,KAAI,KAAK,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;CAC/C,IAAI,eAAe;AACnB,MAAK,MAAM,QAAQ,KACjB,KAAI,KAAK,IAAI,KAAK,CAAE;AAEtB,QAAO,gBAAgB,KAAK,OAAO,KAAK,OAAO"}