@noopolis/mneme 0.1.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.
Files changed (77) hide show
  1. package/README.md +83 -0
  2. package/dist/cli/index.d.ts +3 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +46 -0
  5. package/dist/contract/index.d.ts +3 -0
  6. package/dist/contract/index.d.ts.map +1 -0
  7. package/dist/contract/index.js +2 -0
  8. package/dist/contract/toolDescriptors.d.ts +14 -0
  9. package/dist/contract/toolDescriptors.d.ts.map +1 -0
  10. package/dist/contract/toolDescriptors.js +98 -0
  11. package/dist/contract/types.d.ts +262 -0
  12. package/dist/contract/types.d.ts.map +1 -0
  13. package/dist/contract/types.js +1 -0
  14. package/dist/identity/ids.d.ts +9 -0
  15. package/dist/identity/ids.d.ts.map +1 -0
  16. package/dist/identity/ids.js +25 -0
  17. package/dist/identity/index.d.ts +3 -0
  18. package/dist/identity/index.d.ts.map +1 -0
  19. package/dist/identity/index.js +2 -0
  20. package/dist/identity/scope.d.ts +24 -0
  21. package/dist/identity/scope.d.ts.map +1 -0
  22. package/dist/identity/scope.js +123 -0
  23. package/dist/index.d.ts +9 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +8 -0
  26. package/dist/kernel/index.d.ts +3 -0
  27. package/dist/kernel/index.d.ts.map +1 -0
  28. package/dist/kernel/index.js +2 -0
  29. package/dist/kernel/kernel.d.ts +19 -0
  30. package/dist/kernel/kernel.d.ts.map +1 -0
  31. package/dist/kernel/kernel.js +318 -0
  32. package/dist/kernel/support.d.ts +66 -0
  33. package/dist/kernel/support.d.ts.map +1 -0
  34. package/dist/kernel/support.js +207 -0
  35. package/dist/mcp/config.d.ts +23 -0
  36. package/dist/mcp/config.d.ts.map +1 -0
  37. package/dist/mcp/config.js +76 -0
  38. package/dist/mcp/index.d.ts +4 -0
  39. package/dist/mcp/index.d.ts.map +1 -0
  40. package/dist/mcp/index.js +3 -0
  41. package/dist/mcp/schemas.d.ts +150 -0
  42. package/dist/mcp/schemas.d.ts.map +1 -0
  43. package/dist/mcp/schemas.js +54 -0
  44. package/dist/mcp/server.d.ts +5 -0
  45. package/dist/mcp/server.d.ts.map +1 -0
  46. package/dist/mcp/server.js +45 -0
  47. package/dist/policy/index.d.ts +2 -0
  48. package/dist/policy/index.d.ts.map +1 -0
  49. package/dist/policy/index.js +1 -0
  50. package/dist/policy/policy.d.ts +9 -0
  51. package/dist/policy/policy.d.ts.map +1 -0
  52. package/dist/policy/policy.js +123 -0
  53. package/dist/recall/index.d.ts +2 -0
  54. package/dist/recall/index.d.ts.map +1 -0
  55. package/dist/recall/index.js +1 -0
  56. package/dist/recall/recall.d.ts +28 -0
  57. package/dist/recall/recall.d.ts.map +1 -0
  58. package/dist/recall/recall.js +178 -0
  59. package/dist/runtime/index.d.ts +3 -0
  60. package/dist/runtime/index.d.ts.map +1 -0
  61. package/dist/runtime/index.js +2 -0
  62. package/dist/runtime/runtime.d.ts +19 -0
  63. package/dist/runtime/runtime.d.ts.map +1 -0
  64. package/dist/runtime/runtime.js +129 -0
  65. package/dist/runtime/support.d.ts +52 -0
  66. package/dist/runtime/support.d.ts.map +1 -0
  67. package/dist/runtime/support.js +229 -0
  68. package/dist/store/index.d.ts +3 -0
  69. package/dist/store/index.d.ts.map +1 -0
  70. package/dist/store/index.js +2 -0
  71. package/dist/store/sqliteIndex.d.ts +38 -0
  72. package/dist/store/sqliteIndex.d.ts.map +1 -0
  73. package/dist/store/sqliteIndex.js +270 -0
  74. package/dist/store/store.d.ts +27 -0
  75. package/dist/store/store.d.ts.map +1 -0
  76. package/dist/store/store.js +114 -0
  77. package/package.json +53 -0
@@ -0,0 +1,114 @@
1
+ import { appendFile, mkdir, readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { canonicalScopeKey, makeChecksum, makeEventId } from "../identity/ids.js";
4
+ export class JsonlMemoryStore {
5
+ eventsPath;
6
+ dirPath;
7
+ constructor(runtimeHomePath) {
8
+ this.dirPath = path.join(runtimeHomePath, "memory");
9
+ this.eventsPath = path.join(this.dirPath, "events.jsonl");
10
+ }
11
+ async appendOne(input) {
12
+ const createdAt = new Date().toISOString();
13
+ const event = {
14
+ id: makeEventId(),
15
+ type: input.type,
16
+ createdAt,
17
+ principal: input.principal,
18
+ scope: canonicalScopeKey(input.scope),
19
+ visibility: input.visibility,
20
+ source: input.source,
21
+ content: input.content,
22
+ tags: (input.tags ?? []).map((tag) => tag.toLowerCase()),
23
+ entities: (input.entities ?? []).map((entity) => entity.toLowerCase()),
24
+ sensitivity: input.sensitivity ?? "normal",
25
+ ttl: input.ttl,
26
+ parentEventIds: input.parentEventIds ?? [],
27
+ checksum: makeChecksum({
28
+ ...input,
29
+ id: "__temporary__",
30
+ createdAt,
31
+ checksum: ""
32
+ })
33
+ };
34
+ await appendFile(this.eventsPath, `${JSON.stringify(event)}\n`, { encoding: "utf8" });
35
+ return event;
36
+ }
37
+ async append(input) {
38
+ return this.appendBatch([input]).then((events) => events[0]);
39
+ }
40
+ async appendBatch(inputs) {
41
+ await mkdir(this.dirPath, { recursive: true });
42
+ if (inputs.length === 0) {
43
+ return [];
44
+ }
45
+ const events = [];
46
+ for (const input of inputs) {
47
+ events.push(await this.appendOne(input));
48
+ }
49
+ return events;
50
+ }
51
+ async clear() {
52
+ await appendFile(this.eventsPath, "", { encoding: "utf8", flag: "w" }).catch(() => Promise.resolve());
53
+ }
54
+ async read(query = {}) {
55
+ let payload = "";
56
+ try {
57
+ payload = await readFile(this.eventsPath, "utf8");
58
+ }
59
+ catch (error) {
60
+ if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") {
61
+ return [];
62
+ }
63
+ throw error;
64
+ }
65
+ const queryText = (query.search ?? "").toLowerCase();
66
+ const searchTokens = queryText
67
+ .split(/\W+/u)
68
+ .map((value) => value.trim().toLowerCase())
69
+ .filter(Boolean);
70
+ const result = [];
71
+ const wantedTags = (query.tags ?? []).map((tag) => tag.toLowerCase());
72
+ const wantedTypes = query.types;
73
+ for (const line of payload.split("\n")) {
74
+ const trimmed = line.trim();
75
+ if (!trimmed) {
76
+ continue;
77
+ }
78
+ let event;
79
+ try {
80
+ event = JSON.parse(trimmed);
81
+ }
82
+ catch {
83
+ continue;
84
+ }
85
+ if (query.scope && event.scope !== canonicalScopeKey(query.scope)) {
86
+ continue;
87
+ }
88
+ if (query.principalAgentId && event.principal.agentId !== query.principalAgentId) {
89
+ continue;
90
+ }
91
+ if (query.principalScope && event.principal.scope !== query.principalScope) {
92
+ continue;
93
+ }
94
+ if (query.principalQualifier && event.principal.qualifier !== query.principalQualifier) {
95
+ continue;
96
+ }
97
+ if (wantedTypes && wantedTypes.length > 0 && !wantedTypes.includes(event.type)) {
98
+ continue;
99
+ }
100
+ if (wantedTags.length > 0 && !wantedTags.some((tag) => event.tags.includes(tag))) {
101
+ continue;
102
+ }
103
+ if (searchTokens.length > 0) {
104
+ const eventText = JSON.stringify(event.content).toLowerCase();
105
+ const matched = searchTokens.every((token) => eventText.includes(token));
106
+ if (!matched) {
107
+ continue;
108
+ }
109
+ }
110
+ result.push(event);
111
+ }
112
+ return result.sort((left, right) => new Date(right.createdAt).getTime() - new Date(left.createdAt).getTime());
113
+ }
114
+ }
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@noopolis/mneme",
3
+ "version": "0.1.0",
4
+ "description": "Noopolis scoped memory runtime and MCP tools for agentic systems.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "bin": {
10
+ "mneme": "dist/cli/index.js"
11
+ },
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js"
16
+ },
17
+ "./mcp": {
18
+ "types": "./dist/mcp/index.d.ts",
19
+ "import": "./dist/mcp/index.js"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "README.md"
25
+ ],
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+ssh://git@github.com/noopolis/mneme.git"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "scripts": {
34
+ "build": "rm -rf dist && tsc --project tsconfig.build.json && chmod +x dist/cli/index.js",
35
+ "clean": "rm -rf dist",
36
+ "prepack": "npm run build",
37
+ "prepublishOnly": "npm run typecheck && npm test",
38
+ "typecheck": "tsc --project tsconfig.json --noEmit",
39
+ "test": "node --import tsx --test \"src/**/*.test.ts\""
40
+ },
41
+ "engines": {
42
+ "node": ">=22.19.0"
43
+ },
44
+ "dependencies": {
45
+ "@modelcontextprotocol/sdk": "^1.29.0",
46
+ "zod": "^4.1.12"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^24.12.4",
50
+ "tsx": "^4.21.0",
51
+ "typescript": "^5.9.3"
52
+ }
53
+ }