mor 0.0.2 → 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.
Files changed (64) hide show
  1. package/LICENSE +22 -21
  2. package/README.md +163 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +609 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config.d.ts +3 -0
  7. package/dist/config.js +50 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/db.d.ts +38 -0
  10. package/dist/db.js +134 -0
  11. package/dist/db.js.map +1 -0
  12. package/dist/embeddings/azure-openai.d.ts +12 -0
  13. package/dist/embeddings/azure-openai.js +41 -0
  14. package/dist/embeddings/azure-openai.js.map +1 -0
  15. package/dist/embeddings/none.d.ts +6 -0
  16. package/dist/embeddings/none.js +8 -0
  17. package/dist/embeddings/none.js.map +1 -0
  18. package/dist/embeddings/ollama.d.ts +9 -0
  19. package/dist/embeddings/ollama.js +28 -0
  20. package/dist/embeddings/ollama.js.map +1 -0
  21. package/dist/embeddings/openai.d.ts +10 -0
  22. package/dist/embeddings/openai.js +33 -0
  23. package/dist/embeddings/openai.js.map +1 -0
  24. package/dist/embeddings/provider.d.ts +7 -0
  25. package/dist/embeddings/provider.js +18 -0
  26. package/dist/embeddings/provider.js.map +1 -0
  27. package/dist/filter.d.ts +11 -0
  28. package/dist/filter.js +47 -0
  29. package/dist/filter.js.map +1 -0
  30. package/dist/index.d.ts +10 -0
  31. package/dist/index.js +165 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/mcp.d.ts +4 -0
  34. package/dist/mcp.js +269 -0
  35. package/dist/mcp.js.map +1 -0
  36. package/dist/memory.d.ts +22 -0
  37. package/dist/memory.js +129 -0
  38. package/dist/memory.js.map +1 -0
  39. package/dist/operations.d.ts +65 -0
  40. package/dist/operations.js +127 -0
  41. package/dist/operations.js.map +1 -0
  42. package/dist/query.d.ts +3 -0
  43. package/dist/query.js +44 -0
  44. package/dist/query.js.map +1 -0
  45. package/dist/remote.d.ts +37 -0
  46. package/dist/remote.js +77 -0
  47. package/dist/remote.js.map +1 -0
  48. package/dist/server.d.ts +8 -0
  49. package/dist/server.js +341 -0
  50. package/dist/server.js.map +1 -0
  51. package/dist/types.d.ts +55 -0
  52. package/dist/types.js +10 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +54 -18
  55. package/.dir-locals.el +0 -6
  56. package/.editorconfig +0 -15
  57. package/.eslintrc +0 -26
  58. package/.npmignore +0 -32
  59. package/alg/dfs.js +0 -36
  60. package/alg/revDfs.js +0 -36
  61. package/cli.js +0 -106
  62. package/mor-core.js +0 -60
  63. package/mor-link.js +0 -23
  64. package/mor-outdated.js +0 -26
@@ -0,0 +1,65 @@
1
+ import type { Config, Memory, MemoryType, SearchResult } from './types.js';
2
+ export interface Operations {
3
+ search(query: string, limit?: number): Promise<SearchResult[]>;
4
+ read(query: string): Promise<Memory | undefined>;
5
+ add(opts: {
6
+ title: string;
7
+ description?: string;
8
+ content: string;
9
+ tags?: string[];
10
+ type?: MemoryType;
11
+ repository?: string;
12
+ }): Promise<Memory>;
13
+ update(query: string, updates: {
14
+ title?: string;
15
+ description?: string;
16
+ content?: string;
17
+ tags?: string[];
18
+ type?: MemoryType;
19
+ }): Promise<Memory>;
20
+ remove(query: string): Promise<{
21
+ title: string;
22
+ id: string;
23
+ }>;
24
+ grep(pattern: string, limit?: number, ignoreCase?: boolean): Promise<Memory[]>;
25
+ list(): Promise<Memory[]>;
26
+ push(): Promise<{
27
+ pushed: boolean;
28
+ message: string;
29
+ }>;
30
+ close(): void;
31
+ }
32
+ export declare class LocalOperations implements Operations {
33
+ private config;
34
+ private db;
35
+ private provider;
36
+ constructor(config: Config);
37
+ search(query: string, limit?: number): Promise<SearchResult[]>;
38
+ read(query: string): Promise<Memory | undefined>;
39
+ add(opts: {
40
+ title: string;
41
+ description?: string;
42
+ content: string;
43
+ tags?: string[];
44
+ type?: MemoryType;
45
+ repository?: string;
46
+ }): Promise<Memory>;
47
+ update(query: string, updates: {
48
+ title?: string;
49
+ description?: string;
50
+ content?: string;
51
+ tags?: string[];
52
+ type?: MemoryType;
53
+ }): Promise<Memory>;
54
+ remove(query: string): Promise<{
55
+ title: string;
56
+ id: string;
57
+ }>;
58
+ grep(pattern: string, limit?: number, ignoreCase?: boolean): Promise<Memory[]>;
59
+ list(): Promise<Memory[]>;
60
+ push(): Promise<{
61
+ pushed: boolean;
62
+ message: string;
63
+ }>;
64
+ close(): void;
65
+ }
@@ -0,0 +1,127 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import { deleteMemoryFromDb, grepMemories, openDb, upsertMemoryChecked, } from './db.js';
4
+ import { createProvider, } from './embeddings/provider.js';
5
+ import { computeAndStoreEmbedding, hashContent, searchAsync, syncIndex, } from './index.js';
6
+ import { createMemory, deleteMemory, listMemoryFiles, readMemory, updateMemory, } from './memory.js';
7
+ import { resolveQuery } from './query.js';
8
+ export class LocalOperations {
9
+ config;
10
+ db;
11
+ provider;
12
+ constructor(config) {
13
+ this.config = config;
14
+ this.db = openDb(config);
15
+ this.provider = createProvider(config.embedding);
16
+ }
17
+ async search(query, limit = 20) {
18
+ return searchAsync(this.config, this.db, query, limit, this.provider);
19
+ }
20
+ async read(query) {
21
+ return resolveQuery(this.config, this.db, query);
22
+ }
23
+ async add(opts) {
24
+ const mem = createMemory(this.config, opts);
25
+ const raw = fs.readFileSync(mem.filePath, 'utf-8');
26
+ upsertMemoryChecked(this.db, {
27
+ id: mem.id,
28
+ title: mem.title,
29
+ tags: mem.tags,
30
+ type: mem.type,
31
+ repository: mem.repository,
32
+ created: mem.created,
33
+ updated: mem.updated,
34
+ content: mem.content,
35
+ filePath: mem.filePath,
36
+ contentHash: hashContent(raw),
37
+ });
38
+ await computeAndStoreEmbedding(this.db, this.provider, mem);
39
+ return mem;
40
+ }
41
+ async update(query, updates) {
42
+ const mem = resolveQuery(this.config, this.db, query);
43
+ if (!mem)
44
+ throw new Error(`Memory not found: ${query}`);
45
+ const updated = updateMemory(mem.filePath, updates);
46
+ const raw = fs.readFileSync(updated.filePath, 'utf-8');
47
+ upsertMemoryChecked(this.db, {
48
+ id: updated.id,
49
+ title: updated.title,
50
+ tags: updated.tags,
51
+ type: updated.type,
52
+ repository: updated.repository,
53
+ created: updated.created,
54
+ updated: updated.updated,
55
+ content: updated.content,
56
+ filePath: updated.filePath,
57
+ contentHash: hashContent(raw),
58
+ });
59
+ await computeAndStoreEmbedding(this.db, this.provider, updated);
60
+ return updated;
61
+ }
62
+ async remove(query) {
63
+ const mem = resolveQuery(this.config, this.db, query);
64
+ if (!mem)
65
+ throw new Error(`Memory not found: ${query}`);
66
+ deleteMemory(mem.filePath);
67
+ deleteMemoryFromDb(this.db, mem.id);
68
+ return { title: mem.title, id: mem.id };
69
+ }
70
+ async grep(pattern, limit = 20, ignoreCase = false) {
71
+ syncIndex(this.config, this.db);
72
+ const rows = grepMemories(this.db, pattern, limit, ignoreCase);
73
+ const memories = [];
74
+ for (const row of rows) {
75
+ try {
76
+ memories.push(readMemory(row.file_path));
77
+ }
78
+ catch (e) {
79
+ process.stderr.write(`Warning: skipping unreadable memory ${row.file_path}: ${e instanceof Error ? e.message : e}\n`);
80
+ }
81
+ }
82
+ return memories;
83
+ }
84
+ async list() {
85
+ syncIndex(this.config, this.db);
86
+ const files = listMemoryFiles(this.config);
87
+ const memories = [];
88
+ for (const filePath of files) {
89
+ try {
90
+ memories.push(readMemory(filePath));
91
+ }
92
+ catch (e) {
93
+ process.stderr.write(`Warning: skipping unreadable memory ${filePath}: ${e instanceof Error ? e.message : e}\n`);
94
+ }
95
+ }
96
+ return memories;
97
+ }
98
+ async push() {
99
+ const dir = this.config.memoryDir;
100
+ const git = (args) => spawnSync('git', args, {
101
+ cwd: dir,
102
+ stdio: 'pipe',
103
+ encoding: 'utf-8',
104
+ });
105
+ const status = git(['status', '--porcelain']);
106
+ if (status.status !== 0) {
107
+ throw new Error('Memory folder is not a git repository');
108
+ }
109
+ if (!status.stdout.trim()) {
110
+ return { pushed: false, message: 'Nothing to push' };
111
+ }
112
+ const add = git(['add', '-A']);
113
+ if (add.status !== 0)
114
+ throw new Error(`git add failed: ${add.stderr.trim()}`);
115
+ const commit = git(['commit', '-m', 'update memory']);
116
+ if (commit.status !== 0)
117
+ throw new Error(`git commit failed: ${commit.stderr.trim()}`);
118
+ const push = git(['push']);
119
+ if (push.status !== 0)
120
+ throw new Error(`git push failed: ${push.stderr.trim()}`);
121
+ return { pushed: true, message: 'Pushed memory changes' };
122
+ }
123
+ close() {
124
+ this.db.close();
125
+ }
126
+ }
127
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type DB } from './db.js';
2
+ import type { Config, Memory } from './types.js';
3
+ export declare function resolveQuery(config: Config, db: DB, query: string): Memory | undefined;
package/dist/query.js ADDED
@@ -0,0 +1,44 @@
1
+ import { getMemoryByFilename, getMemoryById, getMemoryByPrefix, searchFts, } from './db.js';
2
+ import { syncIndexIfNeeded } from './index.js';
3
+ import { readMemory } from './memory.js';
4
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
5
+ const UUID_PREFIX_RE = /^[0-9a-f]{4,}$/i;
6
+ export function resolveQuery(config, db, query) {
7
+ syncIndexIfNeeded(config, db);
8
+ // 1. Full UUID match
9
+ if (UUID_RE.test(query)) {
10
+ const row = getMemoryById(db, query);
11
+ if (row)
12
+ return readMemory(row.file_path);
13
+ }
14
+ // 2. UUID prefix match
15
+ if (UUID_PREFIX_RE.test(query) && query.length >= 4) {
16
+ const row = getMemoryByPrefix(db, query);
17
+ if (row)
18
+ return readMemory(row.file_path);
19
+ }
20
+ // 3. Exact filename match
21
+ const byFilename = getMemoryByFilename(db, query);
22
+ if (byFilename)
23
+ return readMemory(byFilename.file_path);
24
+ // Also try with .md extension
25
+ if (!query.endsWith('.md')) {
26
+ const byFilenameMd = getMemoryByFilename(db, query + '.md');
27
+ if (byFilenameMd)
28
+ return readMemory(byFilenameMd.file_path);
29
+ }
30
+ // 4. FTS search - return top result
31
+ try {
32
+ const results = searchFts(db, query, 1);
33
+ if (results.length > 0) {
34
+ const row = getMemoryById(db, results[0].id);
35
+ if (row)
36
+ return readMemory(row.file_path);
37
+ }
38
+ }
39
+ catch {
40
+ // FTS query syntax error - ignore
41
+ }
42
+ return undefined;
43
+ }
44
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,SAAS,GAEV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,OAAO,GACX,iEAAiE,CAAC;AACpE,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAEzC,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,EAAM,EACN,KAAa;IAEb,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE9B,qBAAqB;IACrB,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,GAAG;YAAE,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,uBAAuB;IACvB,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,GAAG;YAAE,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,0BAA0B;IAC1B,MAAM,UAAU,GAAG,mBAAmB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAClD,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAExD,8BAA8B;IAC9B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,mBAAmB,CAAC,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC;QAC5D,IAAI,YAAY;YAAE,OAAO,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,oCAAoC;IACpC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACxC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7C,IAAI,GAAG;gBAAE,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { Operations } from './operations.js';
2
+ import type { Config, Memory, SearchResult } from './types.js';
3
+ export declare class RemoteOperations implements Operations {
4
+ private baseUrl;
5
+ private token?;
6
+ constructor(config: Config);
7
+ private headers;
8
+ private request;
9
+ search(query: string, limit?: number): Promise<SearchResult[]>;
10
+ read(query: string): Promise<Memory | undefined>;
11
+ add(opts: {
12
+ title: string;
13
+ description?: string;
14
+ content: string;
15
+ tags?: string[];
16
+ type?: string;
17
+ repository?: string;
18
+ }): Promise<Memory>;
19
+ update(query: string, updates: {
20
+ title?: string;
21
+ description?: string;
22
+ content?: string;
23
+ tags?: string[];
24
+ type?: string;
25
+ }): Promise<Memory>;
26
+ remove(query: string): Promise<{
27
+ title: string;
28
+ id: string;
29
+ }>;
30
+ grep(pattern: string, limit?: number, ignoreCase?: boolean): Promise<Memory[]>;
31
+ list(): Promise<Memory[]>;
32
+ push(): Promise<{
33
+ pushed: boolean;
34
+ message: string;
35
+ }>;
36
+ close(): void;
37
+ }
package/dist/remote.js ADDED
@@ -0,0 +1,77 @@
1
+ class HttpError extends Error {
2
+ status;
3
+ constructor(status, message) {
4
+ super(message);
5
+ this.status = status;
6
+ }
7
+ }
8
+ export class RemoteOperations {
9
+ baseUrl;
10
+ token;
11
+ constructor(config) {
12
+ if (!config.server?.url)
13
+ throw new Error('No server URL configured');
14
+ this.baseUrl = config.server.url.replace(/\/+$/, '');
15
+ this.token = config.server.token;
16
+ }
17
+ headers() {
18
+ const h = { 'Content-Type': 'application/json' };
19
+ if (this.token)
20
+ h['Authorization'] = `Bearer ${this.token}`;
21
+ return h;
22
+ }
23
+ async request(method, path, body) {
24
+ const url = `${this.baseUrl}${path}`;
25
+ const res = await fetch(url, {
26
+ method,
27
+ headers: this.headers(),
28
+ ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
29
+ });
30
+ const json = (await res.json());
31
+ if (!res.ok) {
32
+ throw new HttpError(res.status, json.error ?? `HTTP ${res.status}`);
33
+ }
34
+ return json.data;
35
+ }
36
+ async search(query, limit = 20) {
37
+ const params = new URLSearchParams({ q: query, limit: String(limit) });
38
+ return this.request('GET', `/memories/search?${params}`);
39
+ }
40
+ async read(query) {
41
+ try {
42
+ return await this.request('GET', `/memories/${encodeURIComponent(query)}`);
43
+ }
44
+ catch (e) {
45
+ if (e instanceof HttpError && e.status === 404)
46
+ return undefined;
47
+ throw e;
48
+ }
49
+ }
50
+ async add(opts) {
51
+ return this.request('POST', '/memories', opts);
52
+ }
53
+ async update(query, updates) {
54
+ return this.request('PUT', `/memories/${encodeURIComponent(query)}`, updates);
55
+ }
56
+ async remove(query) {
57
+ return this.request('DELETE', `/memories/${encodeURIComponent(query)}`);
58
+ }
59
+ async grep(pattern, limit = 20, ignoreCase = false) {
60
+ const params = new URLSearchParams({
61
+ q: pattern,
62
+ limit: String(limit),
63
+ ...(ignoreCase ? { ignoreCase: '1' } : {}),
64
+ });
65
+ return this.request('GET', `/memories/grep?${params}`);
66
+ }
67
+ async list() {
68
+ return this.request('GET', '/memories');
69
+ }
70
+ async push() {
71
+ return this.request('POST', '/push');
72
+ }
73
+ close() {
74
+ // no-op for remote
75
+ }
76
+ }
77
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import http from 'node:http';
2
+ import type { Config } from './types.js';
3
+ export declare function startServer(config: Config, opts: {
4
+ port: number;
5
+ host: string;
6
+ token?: string;
7
+ mcp?: boolean;
8
+ }): http.Server;