multimodemind 0.1.1 → 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/dist/cli/config.d.ts +3 -0
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +11 -3
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/dashboard.d.ts.map +1 -1
- package/dist/cli/dashboard.js +165 -31
- package/dist/cli/dashboard.js.map +1 -1
- package/dist/index.js +42 -10
- package/dist/index.js.map +1 -1
- package/dist/router/index.d.ts +3 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +7 -1
- package/dist/router/index.js.map +1 -1
- package/dist/stores/audit.d.ts +41 -0
- package/dist/stores/audit.d.ts.map +1 -0
- package/dist/stores/audit.js +99 -0
- package/dist/stores/audit.js.map +1 -0
- package/dist/stores/base.d.ts +3 -1
- package/dist/stores/base.d.ts.map +1 -1
- package/dist/stores/files.d.ts +3 -2
- package/dist/stores/files.d.ts.map +1 -1
- package/dist/stores/files.js +6 -2
- package/dist/stores/files.js.map +1 -1
- package/dist/stores/index.d.ts +1 -0
- package/dist/stores/index.d.ts.map +1 -1
- package/dist/stores/index.js +1 -0
- package/dist/stores/index.js.map +1 -1
- package/dist/stores/leveldb.d.ts +3 -2
- package/dist/stores/leveldb.d.ts.map +1 -1
- package/dist/stores/leveldb.js +40 -5
- package/dist/stores/leveldb.js.map +1 -1
- package/dist/stores/markdown.d.ts +5 -2
- package/dist/stores/markdown.d.ts.map +1 -1
- package/dist/stores/markdown.js +26 -4
- package/dist/stores/markdown.js.map +1 -1
- package/dist/stores/sqlite.d.ts +3 -2
- package/dist/stores/sqlite.d.ts.map +1 -1
- package/dist/stores/sqlite.js +6 -2
- package/dist/stores/sqlite.js.map +1 -1
- package/dist/stores/utils.d.ts +6 -0
- package/dist/stores/utils.d.ts.map +1 -1
- package/dist/stores/utils.js +9 -0
- package/dist/stores/utils.js.map +1 -1
- package/dist/stores/vector.d.ts +3 -2
- package/dist/stores/vector.d.ts.map +1 -1
- package/dist/stores/vector.js +6 -2
- package/dist/stores/vector.js.map +1 -1
- package/dist/tools/sources.d.ts.map +1 -1
- package/dist/tools/sources.js +4 -1
- package/dist/tools/sources.js.map +1 -1
- package/dist/tools/store.d.ts +2 -1
- package/dist/tools/store.d.ts.map +1 -1
- package/dist/tools/store.js +13 -1
- package/dist/tools/store.js.map +1 -1
- package/dist/types.d.ts +18 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +14 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit store — an append-only log of every query, read, and write.
|
|
3
|
+
*
|
|
4
|
+
* This is the accountability layer: nothing the agent does with your data goes
|
|
5
|
+
* unrecorded. It is system-managed and read-only to the agent — the agent can
|
|
6
|
+
* never write to it or retrieve from it. You own the log.
|
|
7
|
+
*
|
|
8
|
+
* Copyright Old Cart Technology LLC — MIT License
|
|
9
|
+
*/
|
|
10
|
+
import type { AccessMode, MemoryEntry, RankedEntry, SourceInfo, StoreType } from '../types.js';
|
|
11
|
+
import type { MemoryStore } from './base.js';
|
|
12
|
+
export type AuditOp = 'query' | 'read' | 'write';
|
|
13
|
+
export interface AuditEvent {
|
|
14
|
+
ts: string;
|
|
15
|
+
op: AuditOp;
|
|
16
|
+
store?: StoreType;
|
|
17
|
+
query?: string;
|
|
18
|
+
count?: number;
|
|
19
|
+
id?: string;
|
|
20
|
+
preview?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare class AuditStore implements MemoryStore {
|
|
23
|
+
readonly type: 'audit';
|
|
24
|
+
readonly name: string;
|
|
25
|
+
readonly access: AccessMode;
|
|
26
|
+
private readonly logPath;
|
|
27
|
+
constructor(logPath?: string);
|
|
28
|
+
private append;
|
|
29
|
+
logQuery(query: string, stores: StoreType[], count: number): void;
|
|
30
|
+
logRead(store: StoreType, query: string, count: number): void;
|
|
31
|
+
logWrite(store: StoreType, id: string, preview: string): void;
|
|
32
|
+
/** Most recent N events, oldest→newest. For the dashboard / `audit` inspection. */
|
|
33
|
+
recent(n?: number): AuditEvent[];
|
|
34
|
+
isAvailable(): Promise<boolean>;
|
|
35
|
+
search(): Promise<RankedEntry[]>;
|
|
36
|
+
store(): Promise<string>;
|
|
37
|
+
get(): Promise<MemoryEntry | null>;
|
|
38
|
+
sources(): Promise<SourceInfo>;
|
|
39
|
+
close(): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/stores/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAK7C,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,UAAW,YAAW,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAGtB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAU;IAErC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,YAAY,OAAO,SAAe,EAGjC;IAED,OAAO,CAAC,MAAM;IASd,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGhE;IAED,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE5D;IAED,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE5D;IAED,mFAAmF;IACnF,MAAM,CAAC,CAAC,SAAK,GAAG,UAAU,EAAE,CAO3B;IAIK,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAEpC;IAEK,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAErC;IAEK,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAE7B;IAEK,GAAG,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAEvC;IAEK,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CAqBnC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;CACF"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit store — an append-only log of every query, read, and write.
|
|
3
|
+
*
|
|
4
|
+
* This is the accountability layer: nothing the agent does with your data goes
|
|
5
|
+
* unrecorded. It is system-managed and read-only to the agent — the agent can
|
|
6
|
+
* never write to it or retrieve from it. You own the log.
|
|
7
|
+
*
|
|
8
|
+
* Copyright Old Cart Technology LLC — MIT License
|
|
9
|
+
*/
|
|
10
|
+
import { appendFileSync, existsSync, mkdirSync, statSync, readFileSync } from 'fs';
|
|
11
|
+
import { dirname, join } from 'path';
|
|
12
|
+
import { homedir } from 'os';
|
|
13
|
+
import { nowIso } from './utils.js';
|
|
14
|
+
const DEFAULT_PATH = join(homedir(), '.mmind', 'audit.log');
|
|
15
|
+
export class AuditStore {
|
|
16
|
+
type = 'audit';
|
|
17
|
+
name;
|
|
18
|
+
// Append-only and system-managed. From the agent's perspective it is read-only;
|
|
19
|
+
// in practice the agent can neither write to nor retrieve from it.
|
|
20
|
+
access = 'read';
|
|
21
|
+
logPath;
|
|
22
|
+
constructor(logPath = DEFAULT_PATH) {
|
|
23
|
+
this.logPath = logPath;
|
|
24
|
+
this.name = `audit:${logPath}`;
|
|
25
|
+
}
|
|
26
|
+
append(ev) {
|
|
27
|
+
try {
|
|
28
|
+
mkdirSync(dirname(this.logPath), { recursive: true });
|
|
29
|
+
appendFileSync(this.logPath, JSON.stringify(ev) + '\n', 'utf-8');
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Auditing must never break the primary operation it is recording.
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
logQuery(query, stores, count) {
|
|
36
|
+
this.append({ ts: nowIso(), op: 'query', query: clip(query), count, store: undefined });
|
|
37
|
+
void stores; // per-store detail is captured by logRead()
|
|
38
|
+
}
|
|
39
|
+
logRead(store, query, count) {
|
|
40
|
+
this.append({ ts: nowIso(), op: 'read', store, query: clip(query), count });
|
|
41
|
+
}
|
|
42
|
+
logWrite(store, id, preview) {
|
|
43
|
+
this.append({ ts: nowIso(), op: 'write', store, id, preview: clip(preview) });
|
|
44
|
+
}
|
|
45
|
+
/** Most recent N events, oldest→newest. For the dashboard / `audit` inspection. */
|
|
46
|
+
recent(n = 20) {
|
|
47
|
+
try {
|
|
48
|
+
const lines = readFileSync(this.logPath, 'utf-8').trim().split('\n').filter(Boolean);
|
|
49
|
+
return lines.slice(-n).map((l) => JSON.parse(l));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// ─── MemoryStore interface — audit is neither retrievable nor agent-writable ──
|
|
56
|
+
async isAvailable() {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
async search() {
|
|
60
|
+
return []; // the audit log is not a memory source the agent can search
|
|
61
|
+
}
|
|
62
|
+
async store() {
|
|
63
|
+
throw new Error('The audit log is append-only and system-managed; it cannot be written to directly.');
|
|
64
|
+
}
|
|
65
|
+
async get() {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
async sources() {
|
|
69
|
+
let entryCount = 0;
|
|
70
|
+
let sizeBytes;
|
|
71
|
+
try {
|
|
72
|
+
if (existsSync(this.logPath)) {
|
|
73
|
+
const raw = readFileSync(this.logPath, 'utf-8');
|
|
74
|
+
entryCount = raw ? raw.trimEnd().split('\n').filter(Boolean).length : 0;
|
|
75
|
+
sizeBytes = statSync(this.logPath).size;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
/* ok */
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
type: this.type,
|
|
83
|
+
name: this.name,
|
|
84
|
+
available: true,
|
|
85
|
+
access: this.access,
|
|
86
|
+
path: this.logPath,
|
|
87
|
+
entryCount,
|
|
88
|
+
sizeBytes,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async close() {
|
|
92
|
+
// Nothing to close — appends are flushed per write.
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function clip(s) {
|
|
96
|
+
const one = s.replace(/\s+/g, ' ').trim();
|
|
97
|
+
return one.length > 120 ? one.slice(0, 117) + '…' : one;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/stores/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/stores/base.d.ts
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
* MemoryStore — the contract every store adapter must implement.
|
|
3
3
|
* Copyright Old Cart Technology LLC — MIT License
|
|
4
4
|
*/
|
|
5
|
-
import type { MemoryEntry, RankedEntry, SourceInfo, StoreType } from '../types.js';
|
|
5
|
+
import type { AccessMode, MemoryEntry, RankedEntry, SourceInfo, StoreType } from '../types.js';
|
|
6
6
|
export interface MemoryStore {
|
|
7
7
|
readonly type: StoreType;
|
|
8
8
|
readonly name: string;
|
|
9
|
+
/** Whether the agent may write to this store ('readwrite') or only read ('read'). */
|
|
10
|
+
readonly access: AccessMode;
|
|
9
11
|
/**
|
|
10
12
|
* Returns true if the store is reachable and ready.
|
|
11
13
|
* Called at startup and by the `sources` tool.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/stores/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/stores/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE/F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qFAAqF;IACrF,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAE5B;;;OAGG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC;;;;;;OAMG;IACH,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAE1B;;;OAGG;IACH,KAAK,CACH,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GACzD,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAE7C;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAE/B;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
|
package/dist/stores/files.d.ts
CHANGED
|
@@ -3,14 +3,15 @@
|
|
|
3
3
|
* Stores arbitrary content as flat files; maintains a sidecar index for fast lookup.
|
|
4
4
|
* Copyright Old Cart Technology LLC — MIT License
|
|
5
5
|
*/
|
|
6
|
-
import type { MemoryEntry, RankedEntry, SourceInfo } from '../types.js';
|
|
6
|
+
import type { AccessMode, MemoryEntry, RankedEntry, SourceInfo } from '../types.js';
|
|
7
7
|
import type { MemoryStore } from './base.js';
|
|
8
8
|
export declare class FilesStore implements MemoryStore {
|
|
9
9
|
readonly type: 'files';
|
|
10
10
|
readonly name: string;
|
|
11
11
|
private readonly filesPath;
|
|
12
12
|
private readonly indexPath;
|
|
13
|
-
|
|
13
|
+
readonly access: AccessMode;
|
|
14
|
+
constructor(filesPath: string, access?: AccessMode);
|
|
14
15
|
private readIndex;
|
|
15
16
|
private writeIndex;
|
|
16
17
|
isAvailable(): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/stores/files.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/stores/files.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAe7C,qBAAa,UAAW,YAAW,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAE5B,YAAY,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,UAAwB,EAK9D;IAED,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,UAAU;IAKZ,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAOpC;IAEK,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAoCtF;IAEK,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBvF;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAmBjD;IAEK,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CAiBnC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;CACF"}
|
package/dist/stores/files.js
CHANGED
|
@@ -5,15 +5,17 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { readFileSync, writeFileSync, mkdirSync, statSync, existsSync, } from 'fs';
|
|
7
7
|
import { join } from 'path';
|
|
8
|
-
import { newId, nowIso, keywordScore, cosineSimilarity } from './utils.js';
|
|
8
|
+
import { newId, nowIso, keywordScore, cosineSimilarity, assertWritable } from './utils.js';
|
|
9
9
|
const INDEX_FILENAME = '.mmind-index.json';
|
|
10
10
|
export class FilesStore {
|
|
11
11
|
type = 'files';
|
|
12
12
|
name;
|
|
13
13
|
filesPath;
|
|
14
14
|
indexPath;
|
|
15
|
-
|
|
15
|
+
access;
|
|
16
|
+
constructor(filesPath, access = 'readwrite') {
|
|
16
17
|
this.filesPath = filesPath;
|
|
18
|
+
this.access = access;
|
|
17
19
|
this.indexPath = join(filesPath, INDEX_FILENAME);
|
|
18
20
|
this.name = `files:${filesPath}`;
|
|
19
21
|
}
|
|
@@ -75,6 +77,7 @@ export class FilesStore {
|
|
|
75
77
|
return results.sort((a, b) => b.score - a.score).slice(0, limit);
|
|
76
78
|
}
|
|
77
79
|
async store(entry) {
|
|
80
|
+
assertWritable(this.type, this.access);
|
|
78
81
|
mkdirSync(this.filesPath, { recursive: true });
|
|
79
82
|
const id = newId();
|
|
80
83
|
const now = nowIso();
|
|
@@ -128,6 +131,7 @@ export class FilesStore {
|
|
|
128
131
|
type: this.type,
|
|
129
132
|
name: this.name,
|
|
130
133
|
available: true,
|
|
134
|
+
access: this.access,
|
|
131
135
|
path: this.filesPath,
|
|
132
136
|
entryCount: Object.keys(index).length,
|
|
133
137
|
sizeBytes,
|
package/dist/stores/files.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/stores/files.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,SAAS,EACT,QAAQ,EACR,UAAU,GACX,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,IAAI,EAAY,MAAM,MAAM,CAAC;AAItC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/stores/files.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,SAAS,EACT,QAAQ,EACR,UAAU,GACX,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,IAAI,EAAY,MAAM,MAAM,CAAC;AAItC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3F,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAY3C,MAAM,OAAO,UAAU;IACZ,IAAI,GAAG,OAAgB,CAAC;IACxB,IAAI,CAAS;IAEL,SAAS,CAAS;IAClB,SAAS,CAAS;IAC1B,MAAM,CAAa;IAE5B,YAAY,SAAiB,EAAE,MAAM,GAAe,WAAW;QAC7D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,SAAS,SAAS,EAAE,CAAC;IACnC,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAA+B,CAAC;QACzF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,KAAiC;QAClD,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,SAAmB,EAAE,KAAa;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS;gBACrD,CAAC,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;gBAC7C,CAAC,CAAC,CAAC,CAAC;YACN,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;gBAChC,CAAC,CAAC,QAAQ,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG;gBAChC,CAAC,CAAC,OAAO,CAAC;YAEZ,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,MAAM,KAAK,GAAgB;oBACzB,EAAE;oBACF,OAAO;oBACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,SAAS,EAAE,IAAI,CAAC,IAAI;oBACpB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;iBAC1B,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAA0D;QACpE,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,GAAG,EAAE,MAAM,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEhD,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEhD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,KAAK,CAAC,EAAE,CAAC,GAAG;YACV,EAAE;YACF,QAAQ;YACR,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChD,OAAO;gBACL,EAAE;gBACF,OAAO;gBACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,CAAC;gBAAC,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;YACrE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI,CAAC,SAAS;gBACpB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM;gBACrC,SAAS;aACV,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACpF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,kBAAkB;IACpB,CAAC;CACF"}
|
package/dist/stores/index.d.ts
CHANGED
|
@@ -4,4 +4,5 @@ export { LevelDbStore } from './leveldb.js';
|
|
|
4
4
|
export { MarkdownStore } from './markdown.js';
|
|
5
5
|
export { FilesStore } from './files.js';
|
|
6
6
|
export { VectorStore } from './vector.js';
|
|
7
|
+
export { AuditStore, type AuditEvent, type AuditOp } from './audit.js';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/stores/index.js
CHANGED
package/dist/stores/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAiC,MAAM,YAAY,CAAC"}
|
package/dist/stores/leveldb.d.ts
CHANGED
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
* LevelDB store adapter — fast key-value memory for agent session state.
|
|
3
3
|
* Copyright Old Cart Technology LLC — MIT License
|
|
4
4
|
*/
|
|
5
|
-
import type { MemoryEntry, RankedEntry, SourceInfo } from '../types.js';
|
|
5
|
+
import type { AccessMode, MemoryEntry, RankedEntry, SourceInfo } from '../types.js';
|
|
6
6
|
import type { MemoryStore } from './base.js';
|
|
7
7
|
export declare class LevelDbStore implements MemoryStore {
|
|
8
8
|
readonly type: 'leveldb';
|
|
9
9
|
readonly name: string;
|
|
10
10
|
private db;
|
|
11
11
|
private readonly dbPath;
|
|
12
|
-
|
|
12
|
+
readonly access: AccessMode;
|
|
13
|
+
constructor(dbPath?: string, access?: AccessMode);
|
|
13
14
|
private getDb;
|
|
14
15
|
isAvailable(): Promise<boolean>;
|
|
15
16
|
search(query: string, embedding: number[], limit: number): Promise<RankedEntry[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leveldb.d.ts","sourceRoot":"","sources":["../../src/stores/leveldb.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"leveldb.d.ts","sourceRoot":"","sources":["../../src/stores/leveldb.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAe7C,qBAAa,YAAa,YAAW,WAAW;IAC9C,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,EAAE,CAAsC;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAE5B,YAAY,MAAM,SAAe,EAAE,MAAM,GAAE,UAAwB,EAIlE;YAEa,KAAK;IAgBb,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAOpC;IAEK,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAoBtF;IAEK,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAQvF;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAQjD;IAEK,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CA+BnC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAG3B;CACF"}
|
package/dist/stores/leveldb.js
CHANGED
|
@@ -3,22 +3,43 @@
|
|
|
3
3
|
* Copyright Old Cart Technology LLC — MIT License
|
|
4
4
|
*/
|
|
5
5
|
import { Level } from 'level';
|
|
6
|
-
import { statSync } from 'fs';
|
|
7
|
-
import {
|
|
6
|
+
import { statSync, existsSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { newId, nowIso, cosineSimilarity, keywordScore, assertWritable } from './utils.js';
|
|
8
9
|
const DEFAULT_PATH = '.mmind/leveldb';
|
|
10
|
+
/**
|
|
11
|
+
* Distinguish "held by another process" from "genuinely broken".
|
|
12
|
+
* An initialized LevelDB always has a CURRENT manifest pointer; if that exists
|
|
13
|
+
* but we still can't open the DB, another process (e.g. the live MCP server)
|
|
14
|
+
* holds the single-writer lock — a healthy state, not a failure.
|
|
15
|
+
*/
|
|
16
|
+
function looksInitialized(dbPath) {
|
|
17
|
+
return existsSync(join(dbPath, 'CURRENT'));
|
|
18
|
+
}
|
|
9
19
|
export class LevelDbStore {
|
|
10
20
|
type = 'leveldb';
|
|
11
21
|
name;
|
|
12
22
|
db = null;
|
|
13
23
|
dbPath;
|
|
14
|
-
|
|
24
|
+
access;
|
|
25
|
+
constructor(dbPath = DEFAULT_PATH, access = 'readwrite') {
|
|
15
26
|
this.dbPath = dbPath;
|
|
27
|
+
this.access = access;
|
|
16
28
|
this.name = `leveldb:${dbPath}`;
|
|
17
29
|
}
|
|
18
30
|
async getDb() {
|
|
19
31
|
if (!this.db) {
|
|
20
|
-
|
|
21
|
-
|
|
32
|
+
const db = new Level(this.dbPath, { valueEncoding: 'utf8' });
|
|
33
|
+
try {
|
|
34
|
+
await db.open();
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
// Don't cache a handle that failed to open (e.g. lock contention) —
|
|
38
|
+
// otherwise a later call after the lock frees would never retry.
|
|
39
|
+
this.db = null;
|
|
40
|
+
throw err;
|
|
41
|
+
}
|
|
42
|
+
this.db = db;
|
|
22
43
|
}
|
|
23
44
|
return this.db;
|
|
24
45
|
}
|
|
@@ -50,6 +71,7 @@ export class LevelDbStore {
|
|
|
50
71
|
return results.sort((a, b) => b.score - a.score).slice(0, limit);
|
|
51
72
|
}
|
|
52
73
|
async store(entry) {
|
|
74
|
+
assertWritable(this.type, this.access);
|
|
53
75
|
const db = await this.getDb();
|
|
54
76
|
const id = newId();
|
|
55
77
|
const now = nowIso();
|
|
@@ -82,12 +104,25 @@ export class LevelDbStore {
|
|
|
82
104
|
type: this.type,
|
|
83
105
|
name: this.name,
|
|
84
106
|
available: true,
|
|
107
|
+
access: this.access,
|
|
85
108
|
path: this.dbPath,
|
|
86
109
|
entryCount: count,
|
|
87
110
|
sizeBytes,
|
|
88
111
|
};
|
|
89
112
|
}
|
|
90
113
|
catch (err) {
|
|
114
|
+
// Can't open — but if the DB is initialized on disk, it's locked by
|
|
115
|
+
// another process (the live server), not broken. Report that distinctly.
|
|
116
|
+
if (looksInitialized(this.dbPath)) {
|
|
117
|
+
return {
|
|
118
|
+
type: this.type,
|
|
119
|
+
name: this.name,
|
|
120
|
+
available: true,
|
|
121
|
+
locked: true,
|
|
122
|
+
access: this.access,
|
|
123
|
+
path: this.dbPath,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
91
126
|
return { type: this.type, name: this.name, available: false, error: String(err) };
|
|
92
127
|
}
|
|
93
128
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leveldb.js","sourceRoot":"","sources":["../../src/stores/leveldb.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"leveldb.js","sourceRoot":"","sources":["../../src/stores/leveldb.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3F,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAEtC;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,MAAc;IACtC,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,SAAkB,CAAC;IAC1B,IAAI,CAAS;IAEd,EAAE,GAAiC,IAAI,CAAC;IAC/B,MAAM,CAAS;IACvB,MAAM,CAAa;IAE5B,YAAY,MAAM,GAAG,YAAY,EAAE,MAAM,GAAe,WAAW;QACjE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,WAAW,MAAM,EAAE,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,EAAE,GAAG,IAAI,KAAK,CAAiB,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;YAClB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,oEAAoE;gBACpE,iEAAiE;gBACjE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;gBACf,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,SAAmB,EAAE,KAAa;QAC5D,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAgB,CAAC;YAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS;gBACtD,CAAC,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC;gBAC9C,CAAC,CAAC,CAAC,CAAC;YACN,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;gBAChC,CAAC,CAAC,QAAQ,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG;gBAChC,CAAC,CAAC,OAAO,CAAC;YAEZ,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAA0D;QACpE,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,GAAgB,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;QAC3E,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE;gBAAE,KAAK,EAAE,CAAC;YACzC,IAAI,SAA6B,CAAC;YAClC,IAAI,CAAC;gBAAC,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;YAC7E,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,UAAU,EAAE,KAAK;gBACjB,SAAS;aACV,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,oEAAoE;YACpE,yEAAyE;YACzE,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClC,OAAO;oBACL,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,SAAS,EAAE,IAAI;oBACf,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,IAAI,EAAE,IAAI,CAAC,MAAM;iBAClB,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACpF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -4,13 +4,16 @@
|
|
|
4
4
|
* Vault-agnostic — Obsidian is the reference case but any folder works.
|
|
5
5
|
* Copyright Old Cart Technology LLC — MIT License
|
|
6
6
|
*/
|
|
7
|
-
import type { MemoryEntry, RankedEntry, SourceInfo } from '../types.js';
|
|
7
|
+
import type { AccessMode, MemoryEntry, RankedEntry, SourceInfo } from '../types.js';
|
|
8
8
|
import type { MemoryStore } from './base.js';
|
|
9
9
|
export declare class MarkdownStore implements MemoryStore {
|
|
10
10
|
readonly type: 'markdown';
|
|
11
11
|
readonly name: string;
|
|
12
12
|
private readonly vaultPath;
|
|
13
|
-
|
|
13
|
+
readonly access: AccessMode;
|
|
14
|
+
constructor(vaultPath: string | null, access?: AccessMode);
|
|
15
|
+
/** True once a vault path has actually been set. */
|
|
16
|
+
private get configured();
|
|
14
17
|
isAvailable(): Promise<boolean>;
|
|
15
18
|
search(query: string, embedding: number[], limit: number): Promise<RankedEntry[]>;
|
|
16
19
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/stores/markdown.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/stores/markdown.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,qBAAa,aAAc,YAAW,WAAW;IAC/C,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAE5B,YAAY,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,GAAE,UAAmB,EAIhE;IAED,oDAAoD;IACpD,OAAO,KAAK,UAAU,GAErB;IAEK,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAQpC;IAEK,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA0CtF;IAED;;;OAGG;IACG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBvF;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAoBjD;IAEK,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CAsBnC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;CACF"}
|
package/dist/stores/markdown.js
CHANGED
|
@@ -8,16 +8,24 @@ import { readFileSync, statSync } from 'fs';
|
|
|
8
8
|
import { join, relative } from 'path';
|
|
9
9
|
import matter from 'gray-matter';
|
|
10
10
|
import fg from 'fast-glob';
|
|
11
|
-
import { keywordScore } from './utils.js';
|
|
11
|
+
import { keywordScore, assertWritable } from './utils.js';
|
|
12
12
|
export class MarkdownStore {
|
|
13
13
|
type = 'markdown';
|
|
14
14
|
name;
|
|
15
15
|
vaultPath;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
this.
|
|
16
|
+
access;
|
|
17
|
+
constructor(vaultPath, access = 'read') {
|
|
18
|
+
this.vaultPath = vaultPath ?? '';
|
|
19
|
+
this.access = access;
|
|
20
|
+
this.name = this.vaultPath ? `markdown:${this.vaultPath}` : 'markdown:(no vault)';
|
|
21
|
+
}
|
|
22
|
+
/** True once a vault path has actually been set. */
|
|
23
|
+
get configured() {
|
|
24
|
+
return this.vaultPath !== '';
|
|
19
25
|
}
|
|
20
26
|
async isAvailable() {
|
|
27
|
+
if (!this.configured)
|
|
28
|
+
return false;
|
|
21
29
|
try {
|
|
22
30
|
statSync(this.vaultPath);
|
|
23
31
|
return true;
|
|
@@ -27,6 +35,8 @@ export class MarkdownStore {
|
|
|
27
35
|
}
|
|
28
36
|
}
|
|
29
37
|
async search(query, embedding, limit) {
|
|
38
|
+
if (!this.configured)
|
|
39
|
+
return [];
|
|
30
40
|
const files = await fg('**/*.md', {
|
|
31
41
|
cwd: this.vaultPath,
|
|
32
42
|
ignore: ['.obsidian/**', '.trash/**', 'node_modules/**'],
|
|
@@ -69,6 +79,10 @@ export class MarkdownStore {
|
|
|
69
79
|
* Never modifies existing files.
|
|
70
80
|
*/
|
|
71
81
|
async store(entry) {
|
|
82
|
+
assertWritable(this.type, this.access);
|
|
83
|
+
if (!this.configured) {
|
|
84
|
+
throw new Error('Markdown store has no vault configured — set a vault path first.');
|
|
85
|
+
}
|
|
72
86
|
const { writeFileSync, mkdirSync } = await import('fs');
|
|
73
87
|
const now = new Date();
|
|
74
88
|
const slug = now.toISOString().replace(/[:.]/g, '-');
|
|
@@ -88,6 +102,8 @@ export class MarkdownStore {
|
|
|
88
102
|
return `md:${filename}`;
|
|
89
103
|
}
|
|
90
104
|
async get(id) {
|
|
105
|
+
if (!this.configured)
|
|
106
|
+
return null;
|
|
91
107
|
// id format: "md:<relPath>"
|
|
92
108
|
const relPath = id.startsWith('md:') ? id.slice(3) : id;
|
|
93
109
|
const filePath = join(this.vaultPath, relPath);
|
|
@@ -109,6 +125,11 @@ export class MarkdownStore {
|
|
|
109
125
|
}
|
|
110
126
|
}
|
|
111
127
|
async sources() {
|
|
128
|
+
if (!this.configured) {
|
|
129
|
+
// First-class but not yet pointed at a vault — a neutral, actionable state,
|
|
130
|
+
// not a failure. This is the store that embodies "wrap what you already have."
|
|
131
|
+
return { type: this.type, name: this.name, available: false, unconfigured: true, access: this.access };
|
|
132
|
+
}
|
|
112
133
|
try {
|
|
113
134
|
const files = await fg('**/*.md', {
|
|
114
135
|
cwd: this.vaultPath,
|
|
@@ -118,6 +139,7 @@ export class MarkdownStore {
|
|
|
118
139
|
type: this.type,
|
|
119
140
|
name: this.name,
|
|
120
141
|
available: true,
|
|
142
|
+
access: this.access,
|
|
121
143
|
path: this.vaultPath,
|
|
122
144
|
entryCount: files.length,
|
|
123
145
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/stores/markdown.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAe,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,WAAW,CAAC;AAG3B,OAAO,EAAE,YAAY,EAAoB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/stores/markdown.ts"],"names":[],"mappings":"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"}
|
package/dist/stores/sqlite.d.ts
CHANGED
|
@@ -3,14 +3,15 @@
|
|
|
3
3
|
* Uses better-sqlite3 (synchronous) for simplicity and reliability.
|
|
4
4
|
* Copyright Old Cart Technology LLC — MIT License
|
|
5
5
|
*/
|
|
6
|
-
import type { MemoryEntry, RankedEntry, SourceInfo } from '../types.js';
|
|
6
|
+
import type { AccessMode, MemoryEntry, RankedEntry, SourceInfo } from '../types.js';
|
|
7
7
|
import type { MemoryStore } from './base.js';
|
|
8
8
|
export declare class SqliteStore implements MemoryStore {
|
|
9
9
|
readonly type: 'sqlite';
|
|
10
10
|
readonly name: string;
|
|
11
11
|
private db;
|
|
12
12
|
private readonly dbPath;
|
|
13
|
-
|
|
13
|
+
readonly access: AccessMode;
|
|
14
|
+
constructor(dbPath?: string, access?: AccessMode);
|
|
14
15
|
private getDb;
|
|
15
16
|
isAvailable(): Promise<boolean>;
|
|
16
17
|
search(query: string, embedding: number[], limit: number): Promise<RankedEntry[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/stores/sqlite.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/stores/sqlite.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAkB7C,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAE5B,YAAY,MAAM,SAAe,EAAE,MAAM,GAAE,UAAwB,EAIlE;IAED,OAAO,CAAC,KAAK;IAUP,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAOpC;IAEK,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAqBtF;IAEK,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBvF;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAIjD;IAEK,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CAkBnC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAG3B;CACF"}
|
package/dist/stores/sqlite.js
CHANGED
|
@@ -7,7 +7,7 @@ import Database from 'better-sqlite3';
|
|
|
7
7
|
import { join } from 'path';
|
|
8
8
|
import { statSync, mkdirSync } from 'fs';
|
|
9
9
|
import { dirname } from 'path';
|
|
10
|
-
import { newId, nowIso, cosineSimilarity, keywordScore } from './utils.js';
|
|
10
|
+
import { newId, nowIso, cosineSimilarity, keywordScore, assertWritable } from './utils.js';
|
|
11
11
|
const DEFAULT_PATH = join(process.cwd(), '.mmind', 'memory.db');
|
|
12
12
|
const SCHEMA = `
|
|
13
13
|
CREATE TABLE IF NOT EXISTS entries (
|
|
@@ -26,8 +26,10 @@ export class SqliteStore {
|
|
|
26
26
|
name;
|
|
27
27
|
db = null;
|
|
28
28
|
dbPath;
|
|
29
|
-
|
|
29
|
+
access;
|
|
30
|
+
constructor(dbPath = DEFAULT_PATH, access = 'readwrite') {
|
|
30
31
|
this.dbPath = dbPath;
|
|
32
|
+
this.access = access;
|
|
31
33
|
this.name = `sqlite:${dbPath}`;
|
|
32
34
|
}
|
|
33
35
|
getDb() {
|
|
@@ -70,6 +72,7 @@ export class SqliteStore {
|
|
|
70
72
|
.slice(0, limit);
|
|
71
73
|
}
|
|
72
74
|
async store(entry) {
|
|
75
|
+
assertWritable(this.type, this.access);
|
|
73
76
|
const id = newId();
|
|
74
77
|
const now = nowIso();
|
|
75
78
|
const db = this.getDb();
|
|
@@ -97,6 +100,7 @@ export class SqliteStore {
|
|
|
97
100
|
type: this.type,
|
|
98
101
|
name: this.name,
|
|
99
102
|
available: true,
|
|
103
|
+
access: this.access,
|
|
100
104
|
path: this.dbPath,
|
|
101
105
|
entryCount: count,
|
|
102
106
|
sizeBytes,
|