multimodemind 0.0.1 → 0.1.1
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 +73 -4
- package/dist/cli/config.d.ts +14 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +31 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/dashboard.d.ts +14 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +277 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/embeddings/base.d.ts +19 -0
- package/dist/embeddings/base.d.ts.map +1 -0
- package/dist/embeddings/base.js +6 -0
- package/dist/embeddings/base.js.map +1 -0
- package/dist/embeddings/index.d.ts +11 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +18 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/local.d.ts +19 -0
- package/dist/embeddings/local.d.ts.map +1 -0
- package/dist/embeddings/local.js +40 -0
- package/dist/embeddings/local.js.map +1 -0
- package/dist/embeddings/openai.d.ts +15 -0
- package/dist/embeddings/openai.d.ts.map +1 -0
- package/dist/embeddings/openai.js +33 -0
- package/dist/embeddings/openai.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/router/index.d.ts +25 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +82 -0
- package/dist/router/index.js.map +1 -0
- package/dist/stores/base.d.ts +40 -0
- package/dist/stores/base.d.ts.map +1 -0
- package/dist/stores/base.js +6 -0
- package/dist/stores/base.js.map +1 -0
- package/dist/stores/files.d.ts +23 -0
- package/dist/stores/files.d.ts.map +1 -0
- package/dist/stores/files.js +144 -0
- package/dist/stores/files.js.map +1 -0
- package/dist/stores/index.d.ts +7 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +6 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/stores/leveldb.d.ts +21 -0
- package/dist/stores/leveldb.d.ts.map +1 -0
- package/dist/stores/leveldb.js +99 -0
- package/dist/stores/leveldb.js.map +1 -0
- package/dist/stores/markdown.d.ts +25 -0
- package/dist/stores/markdown.d.ts.map +1 -0
- package/dist/stores/markdown.js +133 -0
- package/dist/stores/markdown.js.map +1 -0
- package/dist/stores/sqlite.d.ts +22 -0
- package/dist/stores/sqlite.d.ts.map +1 -0
- package/dist/stores/sqlite.js +125 -0
- package/dist/stores/sqlite.js.map +1 -0
- package/dist/stores/utils.d.ts +17 -0
- package/dist/stores/utils.d.ts.map +1 -0
- package/dist/stores/utils.js +40 -0
- package/dist/stores/utils.js.map +1 -0
- package/dist/stores/vector.d.ts +26 -0
- package/dist/stores/vector.d.ts.map +1 -0
- package/dist/stores/vector.js +106 -0
- package/dist/stores/vector.js.map +1 -0
- package/dist/tools/retrieve.d.ts +9 -0
- package/dist/tools/retrieve.d.ts.map +1 -0
- package/dist/tools/retrieve.js +41 -0
- package/dist/tools/retrieve.js.map +1 -0
- package/dist/tools/sources.d.ts +9 -0
- package/dist/tools/sources.d.ts.map +1 -0
- package/dist/tools/sources.js +34 -0
- package/dist/tools/sources.js.map +1 -0
- package/dist/tools/store.d.ts +10 -0
- package/dist/tools/store.d.ts.map +1 -0
- package/dist/tools/store.js +51 -0
- package/dist/tools/store.js.map +1 -0
- package/dist/types.d.ts +59 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +55 -13
- package/index.js +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Old Cart Technology LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,9 +1,78 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Multimode Mind
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A multi-store memory layer for AI agents, exposed over the [Model Context Protocol](https://modelcontextprotocol.io) (MCP).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
> Agent memory is an architecture problem, not a storage problem. The differentiator is the router, not the stores.
|
|
6
|
+
|
|
7
|
+
Most agent-memory tools ask you to pick a store — a vector database, a key-value cache, a pile of Markdown notes — and then bend your workflow to fit it. Multimode Mind takes the opposite position: your knowledge already lives in several places, and it should stay there. Multimode Mind wraps the stores you already have behind a single `retrieve()` router that returns one ranked context bundle with full provenance.
|
|
8
|
+
|
|
9
|
+
## Design
|
|
10
|
+
|
|
11
|
+
Multimode Mind is a TypeScript MCP server that sits in front of up to five stores:
|
|
12
|
+
|
|
13
|
+
| Store | Backend | Role |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| **markdown** | Plain `.md` files (Obsidian-compatible, vault-agnostic) | Existing notes, read non-destructively |
|
|
16
|
+
| **sqlite** | `better-sqlite3` | Structured, queryable memory |
|
|
17
|
+
| **leveldb** | `level` | Fast key-value session state |
|
|
18
|
+
| **files** | Flat files + JSON metadata index | Arbitrary document memory |
|
|
19
|
+
| **vector** | `vectra` (pure-TS local index) | Semantic search |
|
|
20
|
+
|
|
21
|
+
A single router fans out to every available store in parallel, scores each candidate with a blend of vector similarity and keyword relevance, de-duplicates across stores by content fingerprint, and returns a ranked bundle. Every result carries its source, so an agent always knows where a memory came from.
|
|
22
|
+
|
|
23
|
+
**Wrap, don't migrate.** Point Multimode Mind at your existing Markdown vault and it reads it in place — no import step, no lock-in.
|
|
24
|
+
|
|
25
|
+
## Tools
|
|
26
|
+
|
|
27
|
+
The server exposes three MCP tools:
|
|
28
|
+
|
|
29
|
+
- **`retrieve`** — search all stores and return a ranked context bundle with provenance
|
|
30
|
+
- **`store`** — persist content (with an auto-generated embedding) to a target store
|
|
31
|
+
- **`sources`** — report the health and entry counts of every configured store
|
|
32
|
+
|
|
33
|
+
## Install
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm install -g multimodemind
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Usage
|
|
40
|
+
|
|
41
|
+
Run as an MCP server over stdio. Pass your Markdown vault as the first argument:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
mmind "/path/to/your/vault"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Store data is written to `~/.mmind` by default, so `mmind` works from any
|
|
48
|
+
directory. Everything can also be configured via environment variables (which
|
|
49
|
+
take precedence over the positional argument):
|
|
50
|
+
|
|
51
|
+
| Variable | Default | Purpose |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| `MMIND_VAULT_PATH` | *(first CLI arg, else disabled)* | Markdown vault directory |
|
|
54
|
+
| `MMIND_SQLITE_PATH` | `~/.mmind/memory.db` | SQLite database file |
|
|
55
|
+
| `MMIND_LEVELDB_PATH` | `~/.mmind/leveldb` | LevelDB directory |
|
|
56
|
+
| `MMIND_FILES_PATH` | `~/.mmind/files` | Files directory |
|
|
57
|
+
| `MMIND_VECTOR_PATH` | `~/.mmind/vector-index` | Vector index directory |
|
|
58
|
+
| `OPENAI_API_KEY` | *(unset)* | Enables OpenAI embeddings; falls back to a local model when absent |
|
|
59
|
+
|
|
60
|
+
### Embeddings
|
|
61
|
+
|
|
62
|
+
Embeddings are pluggable. With `OPENAI_API_KEY` set, Multimode Mind uses `text-embedding-3-small`. Without it, it falls back to a local `@huggingface/transformers` model (downloaded once, ~23 MB) so retrieval works fully offline.
|
|
63
|
+
|
|
64
|
+
### Terminal dashboard
|
|
65
|
+
|
|
66
|
+
A built-in terminal dashboard shows store status and lets you reconfigure paths interactively:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npm run dashboard
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Roadmap
|
|
73
|
+
|
|
74
|
+
`v1` ships the three tools, five stores, and the router. The `conflicts` field is defined in the retrieval contract and reserved for `v2`, which will add conflict detection and memory decay.
|
|
6
75
|
|
|
7
76
|
## License
|
|
8
77
|
|
|
9
|
-
MIT
|
|
78
|
+
MIT © Old Cart Technology LLC
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard config — persisted to .mmind/config.json
|
|
3
|
+
* Copyright Old Cart Technology LLC — MIT License
|
|
4
|
+
*/
|
|
5
|
+
export interface DashboardConfig {
|
|
6
|
+
sqlitePath: string;
|
|
7
|
+
leveldbPath: string;
|
|
8
|
+
filesPath: string;
|
|
9
|
+
vectorIndexPath: string;
|
|
10
|
+
vaultPath: string | null;
|
|
11
|
+
}
|
|
12
|
+
export declare function loadConfig(): DashboardConfig;
|
|
13
|
+
export declare function saveConfig(cfg: DashboardConfig): void;
|
|
14
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAUD,wBAAgB,UAAU,IAAI,eAAe,CAO5C;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAGrD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard config — persisted to .mmind/config.json
|
|
3
|
+
* Copyright Old Cart Technology LLC — MIT License
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { homedir } from 'os';
|
|
8
|
+
const CONFIG_DIR = join(homedir(), '.mmind');
|
|
9
|
+
const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
10
|
+
const DEFAULTS = {
|
|
11
|
+
sqlitePath: join(CONFIG_DIR, 'memory.db'),
|
|
12
|
+
leveldbPath: join(CONFIG_DIR, 'leveldb'),
|
|
13
|
+
filesPath: join(CONFIG_DIR, 'files'),
|
|
14
|
+
vectorIndexPath: join(CONFIG_DIR, 'vector-index'),
|
|
15
|
+
vaultPath: null,
|
|
16
|
+
};
|
|
17
|
+
export function loadConfig() {
|
|
18
|
+
if (!existsSync(CONFIG_FILE))
|
|
19
|
+
return { ...DEFAULTS };
|
|
20
|
+
try {
|
|
21
|
+
return { ...DEFAULTS, ...JSON.parse(readFileSync(CONFIG_FILE, 'utf-8')) };
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return { ...DEFAULTS };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function saveConfig(cfg) {
|
|
28
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
29
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(cfg, null, 2), 'utf-8');
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAUpD,MAAM,QAAQ,GAAoB;IAChC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC;IACzC,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;IACxC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;IACpC,eAAe,EAAE,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC;IACjD,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;IACrD,IAAI,CAAC;QACH,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EAAqB,CAAC;IAC/F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAoB;IAC7C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Multimode Mind — Terminal Dashboard
|
|
4
|
+
* Store status panel + interactive configuration.
|
|
5
|
+
* Zero new dependencies — pure Node.js readline + ANSI.
|
|
6
|
+
* Matrix-green phosphor theme (truecolor).
|
|
7
|
+
* Copyright Old Cart Technology LLC — MIT License
|
|
8
|
+
*
|
|
9
|
+
* Usage: npm run dashboard
|
|
10
|
+
*/
|
|
11
|
+
import { type DashboardConfig } from './config.js';
|
|
12
|
+
import type { SourceInfo } from '../types.js';
|
|
13
|
+
export declare function buildDashboardLines(infos: SourceInfo[], cfg: DashboardConfig, message?: string): string[];
|
|
14
|
+
//# sourceMappingURL=dashboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/cli/dashboard.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAGH,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAO3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAmH9C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,SAAK,GAAG,MAAM,EAAE,CAErG"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Multimode Mind — Terminal Dashboard
|
|
4
|
+
* Store status panel + interactive configuration.
|
|
5
|
+
* Zero new dependencies — pure Node.js readline + ANSI.
|
|
6
|
+
* Matrix-green phosphor theme (truecolor).
|
|
7
|
+
* Copyright Old Cart Technology LLC — MIT License
|
|
8
|
+
*
|
|
9
|
+
* Usage: npm run dashboard
|
|
10
|
+
*/
|
|
11
|
+
import * as readline from 'readline';
|
|
12
|
+
import { loadConfig, saveConfig } from './config.js';
|
|
13
|
+
import { SqliteStore } from '../stores/sqlite.js';
|
|
14
|
+
import { LevelDbStore } from '../stores/leveldb.js';
|
|
15
|
+
import { FilesStore } from '../stores/files.js';
|
|
16
|
+
import { VectorStore } from '../stores/vector.js';
|
|
17
|
+
import { MarkdownStore } from '../stores/markdown.js';
|
|
18
|
+
// ─── Matrix-green palette (truecolor ANSI) ─────────────────────────────────────
|
|
19
|
+
const G = {
|
|
20
|
+
bright: '\x1b[38;2;0;255;65m', // #00FF41 — lead / highlights
|
|
21
|
+
mid: '\x1b[38;2;0;204;51m', // #00CC33 — primary text
|
|
22
|
+
green: '\x1b[38;2;0;153;38m', // #009926 — labels
|
|
23
|
+
dim: '\x1b[38;2;0;102;25m', // #006619 — borders / secondary
|
|
24
|
+
dark: '\x1b[38;2;0;59;0m', // #003B00 — deepest
|
|
25
|
+
down: '\x1b[38;2;255;70;70m', // alert red — DOWN state only
|
|
26
|
+
reset: '\x1b[0m',
|
|
27
|
+
bold: '\x1b[1m',
|
|
28
|
+
clear: '\x1bc',
|
|
29
|
+
hideCur: '\x1b[?25l',
|
|
30
|
+
showCur: '\x1b[?25h',
|
|
31
|
+
};
|
|
32
|
+
// ─── Layout constants ─────────────────────────────────────────────────────────
|
|
33
|
+
const WIDTH = 74; // total box width incl. borders
|
|
34
|
+
const INNER = WIDTH - 2; // fill width for header/dividers
|
|
35
|
+
const COL_FULL = WIDTH - 4; // usable content width per line (70)
|
|
36
|
+
// Status-table column widths — must sum to COL_FULL - 2*(cols-1)
|
|
37
|
+
const C_STORE = 9, C_STATUS = 8, C_ENTRIES = 8, C_SIZE = 7, C_PATH = 30;
|
|
38
|
+
// 9+8+8+7+30 = 62 ; + 4 gaps*2 = 8 ; = 70 = COL_FULL ✓
|
|
39
|
+
// ─── Text helpers ─────────────────────────────────────────────────────────────
|
|
40
|
+
function stripAnsi(s) {
|
|
41
|
+
return s.replace(/\x1b\[[0-9;]*m/g, '');
|
|
42
|
+
}
|
|
43
|
+
/** Truncate plain text (with ellipsis) and right-pad to exactly `width`. */
|
|
44
|
+
function fit(s, width) {
|
|
45
|
+
if (s.length > width) {
|
|
46
|
+
return width <= 1 ? s.slice(0, width) : s.slice(0, width - 1) + '…';
|
|
47
|
+
}
|
|
48
|
+
return s + ' '.repeat(width - s.length);
|
|
49
|
+
}
|
|
50
|
+
/** Left side + right side borders, dim green. */
|
|
51
|
+
const SIDE = G.dim + '║' + G.reset;
|
|
52
|
+
/** A full-width content line: SIDE + space + <content COL_FULL wide> + space + SIDE */
|
|
53
|
+
function line(content) {
|
|
54
|
+
return SIDE + ' ' + content + ' ' + SIDE;
|
|
55
|
+
}
|
|
56
|
+
function top() { return G.dim + '╔' + '═'.repeat(INNER) + '╗' + G.reset; }
|
|
57
|
+
function bottom() { return G.dim + '╚' + '═'.repeat(INNER) + '╝' + G.reset; }
|
|
58
|
+
function rule(ch = '═') {
|
|
59
|
+
const l = ch === '═' ? '╠' : '╟';
|
|
60
|
+
const r = ch === '═' ? '╣' : '╢';
|
|
61
|
+
return G.dim + l + ch.repeat(INNER) + r + G.reset;
|
|
62
|
+
}
|
|
63
|
+
function header(title) {
|
|
64
|
+
const left = Math.floor((INNER - title.length) / 2);
|
|
65
|
+
const right = INNER - title.length - left;
|
|
66
|
+
return G.dim + '║' + G.reset +
|
|
67
|
+
' '.repeat(left) + G.bold + G.bright + title + G.reset +
|
|
68
|
+
' '.repeat(right) + G.dim + '║' + G.reset;
|
|
69
|
+
}
|
|
70
|
+
/** Assemble a status-table row from pre-colored cells of fixed visible width. */
|
|
71
|
+
function cols(cells) {
|
|
72
|
+
const parts = cells.map(c => c.color + fit(c.text, c.width) + G.reset);
|
|
73
|
+
return line(parts.join(' '));
|
|
74
|
+
}
|
|
75
|
+
// ─── Store status formatting ──────────────────────────────────────────────────
|
|
76
|
+
function fmtStatus(info) {
|
|
77
|
+
return info.available ? '✓ UP' : '✗ DOWN';
|
|
78
|
+
}
|
|
79
|
+
function fmtSize(info) {
|
|
80
|
+
if (info.sizeBytes === undefined)
|
|
81
|
+
return '—';
|
|
82
|
+
const b = info.sizeBytes;
|
|
83
|
+
if (b > 1024 * 1024)
|
|
84
|
+
return (b / 1024 / 1024).toFixed(1) + 'MB';
|
|
85
|
+
if (b > 1024)
|
|
86
|
+
return (b / 1024).toFixed(0) + 'KB';
|
|
87
|
+
return b + 'B';
|
|
88
|
+
}
|
|
89
|
+
// ─── Store factory ────────────────────────────────────────────────────────────
|
|
90
|
+
function buildStores(cfg) {
|
|
91
|
+
const stores = [
|
|
92
|
+
new SqliteStore(cfg.sqlitePath),
|
|
93
|
+
new LevelDbStore(cfg.leveldbPath),
|
|
94
|
+
new FilesStore(cfg.filesPath),
|
|
95
|
+
new VectorStore(cfg.vectorIndexPath),
|
|
96
|
+
];
|
|
97
|
+
if (cfg.vaultPath)
|
|
98
|
+
stores.push(new MarkdownStore(cfg.vaultPath));
|
|
99
|
+
return stores;
|
|
100
|
+
}
|
|
101
|
+
async function fetchStatus(stores) {
|
|
102
|
+
const results = await Promise.allSettled(stores.map(s => s.sources()));
|
|
103
|
+
return results.map((r, i) => r.status === 'fulfilled'
|
|
104
|
+
? r.value
|
|
105
|
+
: {
|
|
106
|
+
type: stores[i].type,
|
|
107
|
+
name: stores[i].name,
|
|
108
|
+
available: false,
|
|
109
|
+
error: String(r.reason),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// ─── Render ───────────────────────────────────────────────────────────────────
|
|
113
|
+
export function buildDashboardLines(infos, cfg, message = '') {
|
|
114
|
+
return renderLines(infos, cfg, message);
|
|
115
|
+
}
|
|
116
|
+
function renderDashboard(infos, cfg, message = '') {
|
|
117
|
+
process.stdout.write(G.clear + renderLines(infos, cfg, message).join('\n'));
|
|
118
|
+
}
|
|
119
|
+
function renderLines(infos, cfg, message = '') {
|
|
120
|
+
const out = [];
|
|
121
|
+
out.push(top());
|
|
122
|
+
out.push(header('MULTIMODE MIND · STORE DASHBOARD'));
|
|
123
|
+
out.push(rule());
|
|
124
|
+
// Column headers
|
|
125
|
+
out.push(cols([
|
|
126
|
+
{ text: 'STORE', width: C_STORE, color: G.bold + G.green },
|
|
127
|
+
{ text: 'STATUS', width: C_STATUS, color: G.bold + G.green },
|
|
128
|
+
{ text: 'ENTRIES', width: C_ENTRIES, color: G.bold + G.green },
|
|
129
|
+
{ text: 'SIZE', width: C_SIZE, color: G.bold + G.green },
|
|
130
|
+
{ text: 'PATH', width: C_PATH, color: G.bold + G.green },
|
|
131
|
+
]));
|
|
132
|
+
out.push(rule('─'));
|
|
133
|
+
// Store rows
|
|
134
|
+
for (const info of infos) {
|
|
135
|
+
out.push(cols([
|
|
136
|
+
{ text: info.type, width: C_STORE, color: G.mid },
|
|
137
|
+
{ text: fmtStatus(info), width: C_STATUS, color: info.available ? G.bright : G.down },
|
|
138
|
+
{ text: info.entryCount?.toString() ?? '—', width: C_ENTRIES, color: G.mid },
|
|
139
|
+
{ text: fmtSize(info), width: C_SIZE, color: G.mid },
|
|
140
|
+
{ text: info.path ?? '(unset)', width: C_PATH, color: G.dim },
|
|
141
|
+
]));
|
|
142
|
+
}
|
|
143
|
+
out.push(rule('─'));
|
|
144
|
+
// Vault line (full width, truncated)
|
|
145
|
+
const vaultVal = cfg.vaultPath ?? '(not set)';
|
|
146
|
+
const vaultContent = G.green + 'vault: ' + G.reset +
|
|
147
|
+
(cfg.vaultPath ? G.mid : G.dim) + fit(vaultVal, COL_FULL - 7) + G.reset;
|
|
148
|
+
out.push(line(vaultContent));
|
|
149
|
+
// Config menu
|
|
150
|
+
out.push(rule());
|
|
151
|
+
out.push(header('CONFIGURATION'));
|
|
152
|
+
out.push(rule('─'));
|
|
153
|
+
const menu = [
|
|
154
|
+
['1', 'SQLite path', cfg.sqlitePath],
|
|
155
|
+
['2', 'LevelDB path', cfg.leveldbPath],
|
|
156
|
+
['3', 'Files path', cfg.filesPath],
|
|
157
|
+
['4', 'Vector index path', cfg.vectorIndexPath],
|
|
158
|
+
['5', 'Vault path', cfg.vaultPath ?? '(not set)'],
|
|
159
|
+
];
|
|
160
|
+
const LABEL_W = 20;
|
|
161
|
+
const VAL_W = COL_FULL - 4 - LABEL_W; // 4 = "[n] "
|
|
162
|
+
for (const [key, label, val] of menu) {
|
|
163
|
+
const content = G.bright + `[${key}] ` + G.reset +
|
|
164
|
+
G.green + fit(label, LABEL_W) + G.reset +
|
|
165
|
+
G.dim + fit(val, VAL_W) + G.reset;
|
|
166
|
+
out.push(line(content));
|
|
167
|
+
}
|
|
168
|
+
out.push(rule('─'));
|
|
169
|
+
const footer = G.bright + '[r]' + G.reset + G.green + ' Refresh ' + G.reset +
|
|
170
|
+
G.bright + '[q]' + G.reset + G.green + ' Quit' + G.reset;
|
|
171
|
+
out.push(line(footer + ' '.repeat(Math.max(0, COL_FULL - stripAnsi(footer).length))));
|
|
172
|
+
out.push(bottom());
|
|
173
|
+
if (message) {
|
|
174
|
+
out.push('');
|
|
175
|
+
out.push(' ' + G.bright + '▸ ' + G.reset + G.mid + message + G.reset);
|
|
176
|
+
}
|
|
177
|
+
out.push('');
|
|
178
|
+
out.push(' ' + G.green + 'Choice:' + G.reset + ' ');
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
// ─── Input ────────────────────────────────────────────────────────────────────
|
|
182
|
+
function readKey() {
|
|
183
|
+
return new Promise(resolve => {
|
|
184
|
+
const { stdin } = process;
|
|
185
|
+
const wasRaw = stdin.isRaw;
|
|
186
|
+
stdin.setRawMode(true);
|
|
187
|
+
stdin.resume();
|
|
188
|
+
stdin.setEncoding('utf8');
|
|
189
|
+
stdin.once('data', (key) => {
|
|
190
|
+
stdin.setRawMode(wasRaw ?? false);
|
|
191
|
+
stdin.pause();
|
|
192
|
+
resolve(key);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
async function prompt(question) {
|
|
197
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
198
|
+
return new Promise(resolve => {
|
|
199
|
+
rl.question('\n ' + G.bright + question + G.reset + ' ', answer => {
|
|
200
|
+
rl.close();
|
|
201
|
+
resolve(answer.trim());
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// ─── Main loop ────────────────────────────────────────────────────────────────
|
|
206
|
+
async function main() {
|
|
207
|
+
process.stdout.write(G.hideCur);
|
|
208
|
+
const cleanup = () => {
|
|
209
|
+
process.stdout.write(G.showCur + G.reset + '\n');
|
|
210
|
+
process.exit(0);
|
|
211
|
+
};
|
|
212
|
+
process.on('SIGINT', cleanup);
|
|
213
|
+
process.on('SIGTERM', cleanup);
|
|
214
|
+
let cfg = loadConfig();
|
|
215
|
+
let stores = buildStores(cfg);
|
|
216
|
+
let message = '';
|
|
217
|
+
process.stdout.write(G.clear + '\n ' + G.mid + 'Loading store status…' + G.reset + '\n');
|
|
218
|
+
let infos = await fetchStatus(stores);
|
|
219
|
+
const fields = {
|
|
220
|
+
'1': 'sqlitePath',
|
|
221
|
+
'2': 'leveldbPath',
|
|
222
|
+
'3': 'filesPath',
|
|
223
|
+
'4': 'vectorIndexPath',
|
|
224
|
+
'5': 'vaultPath',
|
|
225
|
+
};
|
|
226
|
+
const labels = {
|
|
227
|
+
sqlitePath: 'SQLite database path',
|
|
228
|
+
leveldbPath: 'LevelDB directory',
|
|
229
|
+
filesPath: 'Files directory',
|
|
230
|
+
vectorIndexPath: 'Vector index directory',
|
|
231
|
+
vaultPath: 'Vault path (type - to disable)',
|
|
232
|
+
};
|
|
233
|
+
while (true) {
|
|
234
|
+
renderDashboard(infos, cfg, message);
|
|
235
|
+
message = '';
|
|
236
|
+
const key = await readKey();
|
|
237
|
+
if (key === 'q' || key === '\x03') {
|
|
238
|
+
cleanup();
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (key === 'r') {
|
|
242
|
+
await Promise.allSettled(stores.map(s => s.close()));
|
|
243
|
+
stores = buildStores(cfg);
|
|
244
|
+
infos = await fetchStatus(stores);
|
|
245
|
+
message = 'Status refreshed.';
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
const field = fields[key];
|
|
249
|
+
if (field) {
|
|
250
|
+
const current = cfg[field] ?? '';
|
|
251
|
+
const val = await prompt(`${labels[field]} [${current}]:`);
|
|
252
|
+
if (val !== '') {
|
|
253
|
+
cfg[field] =
|
|
254
|
+
val === '-' || val.toLowerCase() === 'none' ? null : val;
|
|
255
|
+
saveConfig(cfg);
|
|
256
|
+
await Promise.allSettled(stores.map(s => s.close()));
|
|
257
|
+
stores = buildStores(cfg);
|
|
258
|
+
infos = await fetchStatus(stores);
|
|
259
|
+
message = `Saved ${field}.`;
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
message = 'No change.';
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Only launch the interactive loop when run directly, not when imported for tests
|
|
268
|
+
const invokedDirectly = process.argv[1] !== undefined &&
|
|
269
|
+
import.meta.url === new URL(`file://${process.argv[1]}`).href;
|
|
270
|
+
if (invokedDirectly) {
|
|
271
|
+
main().catch(err => {
|
|
272
|
+
process.stdout.write(G.showCur + G.reset + '\n');
|
|
273
|
+
console.error(err);
|
|
274
|
+
process.exit(1);
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/cli/dashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmbeddingProvider — swappable embedding interface.
|
|
3
|
+
* Copyright Old Cart Technology LLC — MIT License
|
|
4
|
+
*/
|
|
5
|
+
export interface EmbeddingProvider {
|
|
6
|
+
readonly name: string;
|
|
7
|
+
/** Dimensionality of vectors this provider produces */
|
|
8
|
+
readonly dimensions: number;
|
|
9
|
+
/**
|
|
10
|
+
* Embed a single string. Returns a float32 vector.
|
|
11
|
+
*/
|
|
12
|
+
embed(text: string): Promise<number[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Embed multiple strings in one call (batched for efficiency).
|
|
15
|
+
* Default implementations may just loop over embed().
|
|
16
|
+
*/
|
|
17
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/embeddings/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEvC;;;OAGG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CAClD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/embeddings/base.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding provider factory.
|
|
3
|
+
* Tries OpenAI first; falls back to local if no API key is found.
|
|
4
|
+
* Copyright Old Cart Technology LLC — MIT License
|
|
5
|
+
*/
|
|
6
|
+
export type { EmbeddingProvider } from './base.js';
|
|
7
|
+
export { OpenAIEmbeddingProvider } from './openai.js';
|
|
8
|
+
export { LocalEmbeddingProvider } from './local.js';
|
|
9
|
+
import type { EmbeddingProvider } from './base.js';
|
|
10
|
+
export declare function createEmbeddingProvider(apiKey?: string): EmbeddingProvider;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAInD,wBAAgB,uBAAuB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAS1E"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding provider factory.
|
|
3
|
+
* Tries OpenAI first; falls back to local if no API key is found.
|
|
4
|
+
* Copyright Old Cart Technology LLC — MIT License
|
|
5
|
+
*/
|
|
6
|
+
export { OpenAIEmbeddingProvider } from './openai.js';
|
|
7
|
+
export { LocalEmbeddingProvider } from './local.js';
|
|
8
|
+
import { OpenAIEmbeddingProvider } from './openai.js';
|
|
9
|
+
import { LocalEmbeddingProvider } from './local.js';
|
|
10
|
+
export function createEmbeddingProvider(apiKey) {
|
|
11
|
+
const key = apiKey ?? process.env['OPENAI_API_KEY'];
|
|
12
|
+
if (key) {
|
|
13
|
+
return new OpenAIEmbeddingProvider(key);
|
|
14
|
+
}
|
|
15
|
+
console.warn('[mmind] OPENAI_API_KEY not set — using local embedding model (first run downloads ~23MB)');
|
|
16
|
+
return new LocalEmbeddingProvider();
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,UAAU,uBAAuB,CAAC,MAAe;IACrD,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACpD,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,IAAI,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,CAAC,IAAI,CACV,0FAA0F,CAC3F,CAAC;IACF,OAAO,IAAI,sBAAsB,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local embedding provider — @huggingface/transformers fallback.
|
|
3
|
+
* Model: Xenova/all-MiniLM-L6-v2 — 384 dimensions, Apache-2.0.
|
|
4
|
+
*
|
|
5
|
+
* Downloads ~23MB model on first use. Subsequent calls use the cache.
|
|
6
|
+
* Activated automatically when OPENAI_API_KEY is not set.
|
|
7
|
+
*
|
|
8
|
+
* Copyright Old Cart Technology LLC — MIT License
|
|
9
|
+
*/
|
|
10
|
+
import type { EmbeddingProvider } from './base.js';
|
|
11
|
+
export declare class LocalEmbeddingProvider implements EmbeddingProvider {
|
|
12
|
+
readonly name = "local";
|
|
13
|
+
readonly dimensions = 384;
|
|
14
|
+
private pipeline;
|
|
15
|
+
private getPipeline;
|
|
16
|
+
embed(text: string): Promise<number[]>;
|
|
17
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/embeddings/local.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAKnD,qBAAa,sBAAuB,YAAW,iBAAiB;IAC9D,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,UAAU,OAAc;IAGjC,OAAO,CAAC,QAAQ,CAAiB;YAEnB,WAAW;IAgBnB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAK3C;IAEK,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAErD;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local embedding provider — @huggingface/transformers fallback.
|
|
3
|
+
* Model: Xenova/all-MiniLM-L6-v2 — 384 dimensions, Apache-2.0.
|
|
4
|
+
*
|
|
5
|
+
* Downloads ~23MB model on first use. Subsequent calls use the cache.
|
|
6
|
+
* Activated automatically when OPENAI_API_KEY is not set.
|
|
7
|
+
*
|
|
8
|
+
* Copyright Old Cart Technology LLC — MIT License
|
|
9
|
+
*/
|
|
10
|
+
const MODEL_ID = 'Xenova/all-MiniLM-L6-v2';
|
|
11
|
+
const DIMENSIONS = 384;
|
|
12
|
+
export class LocalEmbeddingProvider {
|
|
13
|
+
name = 'local';
|
|
14
|
+
dimensions = DIMENSIONS;
|
|
15
|
+
// Lazily loaded to avoid import-time cost
|
|
16
|
+
pipeline = null;
|
|
17
|
+
async getPipeline() {
|
|
18
|
+
if (this.pipeline)
|
|
19
|
+
return this.pipeline;
|
|
20
|
+
// Dynamic import keeps the heavy transformer bundle out of the main path
|
|
21
|
+
const { pipeline, env } = await import('@huggingface/transformers');
|
|
22
|
+
// Use WASM backend — avoids onnxruntime-node native binary requirement
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
|
+
env.backends.onnx.wasm = { proxy: false };
|
|
25
|
+
this.pipeline = await pipeline('feature-extraction', MODEL_ID, {
|
|
26
|
+
dtype: 'fp32',
|
|
27
|
+
});
|
|
28
|
+
return this.pipeline;
|
|
29
|
+
}
|
|
30
|
+
async embed(text) {
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
|
+
const extractor = (await this.getPipeline());
|
|
33
|
+
const output = await extractor(text, { pooling: 'mean', normalize: true });
|
|
34
|
+
return Array.from(output.data);
|
|
35
|
+
}
|
|
36
|
+
async embedBatch(texts) {
|
|
37
|
+
return Promise.all(texts.map((t) => this.embed(t)));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/embeddings/local.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,QAAQ,GAAG,yBAAyB,CAAC;AAC3C,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,MAAM,OAAO,sBAAsB;IACxB,IAAI,GAAG,OAAO,CAAC;IACf,UAAU,GAAG,UAAU,CAAC;IAEjC,0CAA0C;IAClC,QAAQ,GAAY,IAAI,CAAC;IAEzB,KAAK,CAAC,WAAW;QACvB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;QAExC,yEAAyE;QACzE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAEpE,uEAAuE;QACvE,8DAA8D;QAC7D,GAAG,CAAC,QAAQ,CAAC,IAAY,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAEnD,IAAI,CAAC,QAAQ,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,QAAQ,EAAE;YAC7D,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,8DAA8D;QAC9D,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAQ,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAoB,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI embedding provider (default).
|
|
3
|
+
* Model: text-embedding-3-small — 1536 dimensions, MIT-compatible API.
|
|
4
|
+
* Copyright Old Cart Technology LLC — MIT License
|
|
5
|
+
*/
|
|
6
|
+
import type { EmbeddingProvider } from './base.js';
|
|
7
|
+
export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
|
|
8
|
+
readonly name = "openai";
|
|
9
|
+
readonly dimensions = 1536;
|
|
10
|
+
private client;
|
|
11
|
+
constructor(apiKey?: string);
|
|
12
|
+
embed(text: string): Promise<number[]>;
|
|
13
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAKnD,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,UAAU,QAAc;IAEjC,OAAO,CAAC,MAAM,CAAS;IAEvB,YAAY,MAAM,CAAC,EAAE,MAAM,EAI1B;IAEK,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAM3C;IAEK,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAMrD;CACF"}
|