@bubstack/moe-memory 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.mcp.json +18 -0
- package/README.md +47 -0
- package/agents/search-conversations.md +171 -0
- package/dist/LICENSE +25 -0
- package/dist/cli.d.ts +25 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +125 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-hook-trust.d.ts +4 -0
- package/dist/codex-hook-trust.d.ts.map +1 -0
- package/dist/codex-hook-trust.js +114 -0
- package/dist/codex-hook-trust.js.map +1 -0
- package/dist/codex-support.d.ts +6 -0
- package/dist/codex-support.d.ts.map +1 -0
- package/dist/codex-support.js +29 -0
- package/dist/codex-support.js.map +1 -0
- package/dist/constants.d.ts +14 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +14 -0
- package/dist/constants.js.map +1 -0
- package/dist/db.d.ts +103 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +430 -0
- package/dist/db.js.map +1 -0
- package/dist/doctor-cli.d.ts +3 -0
- package/dist/doctor-cli.d.ts.map +1 -0
- package/dist/doctor-cli.js +43 -0
- package/dist/doctor-cli.js.map +1 -0
- package/dist/doctor.d.ts +17 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +98 -0
- package/dist/doctor.js.map +1 -0
- package/dist/embedding-migration.d.ts +73 -0
- package/dist/embedding-migration.d.ts.map +1 -0
- package/dist/embedding-migration.js +120 -0
- package/dist/embedding-migration.js.map +1 -0
- package/dist/embeddings.d.ts +78 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +180 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/file-lock.d.ts +39 -0
- package/dist/file-lock.d.ts.map +1 -0
- package/dist/file-lock.js +91 -0
- package/dist/file-lock.js.map +1 -0
- package/dist/index-cli.d.ts +10 -0
- package/dist/index-cli.d.ts.map +1 -0
- package/dist/index-cli.js +195 -0
- package/dist/index-cli.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +4 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +318 -0
- package/dist/indexer.js.map +1 -0
- package/dist/install-check.d.ts +48 -0
- package/dist/install-check.d.ts.map +1 -0
- package/dist/install-check.js +82 -0
- package/dist/install-check.js.map +1 -0
- package/dist/journal/index.d.ts +5 -0
- package/dist/journal/index.d.ts.map +1 -0
- package/dist/journal/index.js +5 -0
- package/dist/journal/index.js.map +1 -0
- package/dist/journal/legacy-sidecars.d.ts +74 -0
- package/dist/journal/legacy-sidecars.d.ts.map +1 -0
- package/dist/journal/legacy-sidecars.js +151 -0
- package/dist/journal/legacy-sidecars.js.map +1 -0
- package/dist/journal/markdown.d.ts +91 -0
- package/dist/journal/markdown.d.ts.map +1 -0
- package/dist/journal/markdown.js +234 -0
- package/dist/journal/markdown.js.map +1 -0
- package/dist/journal/search.d.ts +91 -0
- package/dist/journal/search.d.ts.map +1 -0
- package/dist/journal/search.js +203 -0
- package/dist/journal/search.js.map +1 -0
- package/dist/journal/store.d.ts +96 -0
- package/dist/journal/store.d.ts.map +1 -0
- package/dist/journal/store.js +270 -0
- package/dist/journal/store.js.map +1 -0
- package/dist/journal-cli.d.ts +19 -0
- package/dist/journal-cli.d.ts.map +1 -0
- package/dist/journal-cli.js +153 -0
- package/dist/journal-cli.js.map +1 -0
- package/dist/logging.d.ts +6 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +20 -0
- package/dist/logging.js.map +1 -0
- package/dist/mcp-server.d.ts +34 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +607 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/parser.d.ts +11 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +445 -0
- package/dist/parser.js.map +1 -0
- package/dist/paths.d.ts +103 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +258 -0
- package/dist/paths.js.map +1 -0
- package/dist/search-cli.d.ts +3 -0
- package/dist/search-cli.d.ts.map +1 -0
- package/dist/search-cli.js +138 -0
- package/dist/search-cli.js.map +1 -0
- package/dist/search.d.ts +36 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +371 -0
- package/dist/search.js.map +1 -0
- package/dist/show-cli.d.ts +3 -0
- package/dist/show-cli.d.ts.map +1 -0
- package/dist/show-cli.js +60 -0
- package/dist/show-cli.js.map +1 -0
- package/dist/show.d.ts +3 -0
- package/dist/show.d.ts.map +1 -0
- package/dist/show.js +984 -0
- package/dist/show.js.map +1 -0
- package/dist/stats-cli.d.ts +3 -0
- package/dist/stats-cli.d.ts.map +1 -0
- package/dist/stats-cli.js +51 -0
- package/dist/stats-cli.js.map +1 -0
- package/dist/stats.d.ts +19 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +116 -0
- package/dist/stats.js.map +1 -0
- package/dist/summarizer.d.ts +83 -0
- package/dist/summarizer.d.ts.map +1 -0
- package/dist/summarizer.js +526 -0
- package/dist/summarizer.js.map +1 -0
- package/dist/summary-sentinel.d.ts +31 -0
- package/dist/summary-sentinel.d.ts.map +1 -0
- package/dist/summary-sentinel.js +80 -0
- package/dist/summary-sentinel.js.map +1 -0
- package/dist/sync-cli.d.ts +15 -0
- package/dist/sync-cli.d.ts.map +1 -0
- package/dist/sync-cli.js +202 -0
- package/dist/sync-cli.js.map +1 -0
- package/dist/sync.d.ts +35 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +204 -0
- package/dist/sync.js.map +1 -0
- package/dist/types.d.ts +125 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +32 -0
- package/dist/types.js.map +1 -0
- package/dist/verify.d.ts +30 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +174 -0
- package/dist/verify.js.map +1 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +13 -0
- package/dist/version.js.map +1 -0
- package/hooks/hooks.json +15 -0
- package/package.json +71 -0
- package/prompts/search-agent.md +160 -0
- package/skills/remembering-conversations/MCP-TOOLS.md +147 -0
- package/skills/remembering-conversations/SKILL.md +97 -0
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one store.
|
|
3
|
+
*
|
|
4
|
+
* Two record types, two table families, one SQLite file:
|
|
5
|
+
*
|
|
6
|
+
* exchanges + tool_calls + vec_exchanges harvested transcript turns
|
|
7
|
+
* journal_entries + vec_journal_entries deliberately written entries
|
|
8
|
+
*
|
|
9
|
+
* They are deliberately NOT one undifferentiated table. A journal entry and a
|
|
10
|
+
* transcript turn have different write paths, different privacy properties and
|
|
11
|
+
* different query surfaces; sharing an encoder and a database file is the whole
|
|
12
|
+
* of what they share. Both vector tables are `FLOAT[384]` and both carry an
|
|
13
|
+
* `embedding_version`, so the migration in embedding-migration.ts covers either.
|
|
14
|
+
*
|
|
15
|
+
*/
|
|
16
|
+
import Database from "better-sqlite3";
|
|
17
|
+
import type { ConversationExchange, JournalEntry, JournalScope } from "./types.js";
|
|
18
|
+
export declare function migrateSchema(db: Database.Database): void;
|
|
19
|
+
/**
|
|
20
|
+
* Add `journal_entries.root` and discard the journal index once.
|
|
21
|
+
*
|
|
22
|
+
* Every project on the machine shares one database, and until this column
|
|
23
|
+
* existed nothing recorded which journal root a row came from. Three defects
|
|
24
|
+
* followed, all of them data loss or leakage:
|
|
25
|
+
*
|
|
26
|
+
* - `indexJournal` pruned every row it had not just walked, and it walks only
|
|
27
|
+
* the current project's roots — so indexing in one repo deleted every other
|
|
28
|
+
* repo's `project`-scoped rows. `mcp-server.ts` runs it on every start.
|
|
29
|
+
* - Retrieval filtered on scope and timestamp only, so one repo's project
|
|
30
|
+
* notes surfaced in another.
|
|
31
|
+
* - `journalEntryId` hashed `scope:<relative path>`, so two repos whose entries
|
|
32
|
+
* shared a relative path — a date directory and a timestamp — collided on the
|
|
33
|
+
* primary key and overwrote each other.
|
|
34
|
+
*
|
|
35
|
+
* The fix changes the id, so old rows are unreachable by their new ids and
|
|
36
|
+
* cannot be backfilled reliably: `path` is absolute, but nothing in it marks
|
|
37
|
+
* where the root stopped and the entry began. The index is a derived cache —
|
|
38
|
+
* `mcp-server.ts` says so ("the markdown files are the source of truth, and a
|
|
39
|
+
* failed index is retried on the next start") — so it is dropped and rebuilt.
|
|
40
|
+
* Each project restores its own rows the next time it indexes, which is what
|
|
41
|
+
* makes this recoverable rather than the deletion it replaces.
|
|
42
|
+
*/
|
|
43
|
+
export declare function migrateJournalRoot(db: Database.Database): void;
|
|
44
|
+
/**
|
|
45
|
+
* Earlier versions created `tool_calls` with a plain
|
|
46
|
+
* `FOREIGN KEY (exchange_id) REFERENCES exchanges(id)`.
|
|
47
|
+
* Without ON DELETE CASCADE, deleting an exchange that had tool calls
|
|
48
|
+
* raised SQLITE_CONSTRAINT_FOREIGNKEY (#81), and orphans accumulated.
|
|
49
|
+
*
|
|
50
|
+
* This migration:
|
|
51
|
+
* 1. Detects the legacy schema by inspecting sqlite_master.sql.
|
|
52
|
+
* 2. Drops orphaned tool_calls rows.
|
|
53
|
+
* 3. Recreates the table with ON DELETE CASCADE and copies surviving rows.
|
|
54
|
+
*/
|
|
55
|
+
export declare function migrateToolCallsCascade(db: Database.Database): void;
|
|
56
|
+
export declare function initDatabase(): Database.Database;
|
|
57
|
+
export declare function insertExchange(db: Database.Database, exchange: ConversationExchange, embedding: number[], _toolNames?: string[]): void;
|
|
58
|
+
export declare function getAllExchanges(db: Database.Database): Array<{
|
|
59
|
+
id: string;
|
|
60
|
+
archivePath: string;
|
|
61
|
+
}>;
|
|
62
|
+
export declare function getFileLastIndexed(db: Database.Database, archivePath: string): number | null;
|
|
63
|
+
export declare function deleteExchange(db: Database.Database, id: string): void;
|
|
64
|
+
interface JournalRow {
|
|
65
|
+
id: string;
|
|
66
|
+
path: string;
|
|
67
|
+
root: string;
|
|
68
|
+
scope: string;
|
|
69
|
+
timestamp: number;
|
|
70
|
+
text: string;
|
|
71
|
+
sections: string;
|
|
72
|
+
}
|
|
73
|
+
export declare function journalEntryFromRow(row: JournalRow): JournalEntry;
|
|
74
|
+
export declare const JOURNAL_SELECT_COLUMNS = "\n j.id,\n j.path,\n j.root,\n j.scope,\n j.timestamp,\n j.text,\n j.sections";
|
|
75
|
+
/**
|
|
76
|
+
* Insert or replace one journal entry and its vector.
|
|
77
|
+
*
|
|
78
|
+
* Same shape as insertExchange: the vec0 virtual table rejects REPLACE, so the
|
|
79
|
+
* vector row is deleted then inserted.
|
|
80
|
+
*/
|
|
81
|
+
export declare function upsertJournalEntry(db: Database.Database, entry: JournalEntry, sourceMtimeMs: number, embedding: number[]): void;
|
|
82
|
+
export declare function deleteJournalEntry(db: Database.Database, id: string): void;
|
|
83
|
+
export interface JournalIndexState {
|
|
84
|
+
id: string;
|
|
85
|
+
path: string;
|
|
86
|
+
/** The journal root the row was indexed under. `''` for pre-migration rows. */
|
|
87
|
+
root: string;
|
|
88
|
+
sourceMtimeMs: number;
|
|
89
|
+
embeddingVersion: number;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Everything the incremental journal scan needs to decide whether a file on
|
|
93
|
+
* disk is already indexed at the current embedding version.
|
|
94
|
+
*
|
|
95
|
+
* private-journal-mcp's equivalent keyed purely on the ABSENCE of a `.embedding`
|
|
96
|
+
* sidecar, so it would never re-embed a stale one and never notice an edited
|
|
97
|
+
* entry. Carrying mtime and version means a changed file and a bumped
|
|
98
|
+
* EMBEDDING_VERSION both re-index.
|
|
99
|
+
*/
|
|
100
|
+
export declare function getJournalIndexState(db: Database.Database, scope?: JournalScope): Map<string, JournalIndexState>;
|
|
101
|
+
export declare function countJournalEntries(db: Database.Database, scope?: JournalScope): number;
|
|
102
|
+
export {};
|
|
103
|
+
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAKtC,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnF,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAmDzD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAkB9D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAmDnE;AAED,wBAAgB,YAAY,IAAI,QAAQ,CAAC,QAAQ,CA0IhD;AAED,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,EAAE,MAAM,EAAE,EAGnB,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,IAAI,CAoEN;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAGjG;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ5F;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAMtE;AAMD,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,GAAG,YAAY,CAiBjE;AAED,eAAO,MAAM,sBAAsB,mIAOhB,CAAC;AAEpB;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,YAAY,EACnB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EAAE,GAClB,IAAI,CAuBN;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAG1E;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,CAAC,EAAE,YAAY,GACnB,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CA8BhC;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,MAAM,CAOvF"}
|
package/dist/db.js
ADDED
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one store.
|
|
3
|
+
*
|
|
4
|
+
* Two record types, two table families, one SQLite file:
|
|
5
|
+
*
|
|
6
|
+
* exchanges + tool_calls + vec_exchanges harvested transcript turns
|
|
7
|
+
* journal_entries + vec_journal_entries deliberately written entries
|
|
8
|
+
*
|
|
9
|
+
* They are deliberately NOT one undifferentiated table. A journal entry and a
|
|
10
|
+
* transcript turn have different write paths, different privacy properties and
|
|
11
|
+
* different query surfaces; sharing an encoder and a database file is the whole
|
|
12
|
+
* of what they share. Both vector tables are `FLOAT[384]` and both carry an
|
|
13
|
+
* `embedding_version`, so the migration in embedding-migration.ts covers either.
|
|
14
|
+
*
|
|
15
|
+
*/
|
|
16
|
+
import fs from "node:fs";
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
import Database from "better-sqlite3";
|
|
19
|
+
import * as sqliteVec from "sqlite-vec";
|
|
20
|
+
import { EMBEDDING_DIMENSIONS } from "./constants.js";
|
|
21
|
+
import { EMBEDDING_VERSION } from "./embedding-migration.js";
|
|
22
|
+
import { getDbPath } from "./paths.js";
|
|
23
|
+
export function migrateSchema(db) {
|
|
24
|
+
const columns = db.prepare(`SELECT name FROM pragma_table_info('exchanges')`).all();
|
|
25
|
+
const columnNames = new Set(columns.map((c) => c.name));
|
|
26
|
+
const migrations = [
|
|
27
|
+
{ name: "last_indexed", sql: "ALTER TABLE exchanges ADD COLUMN last_indexed INTEGER" },
|
|
28
|
+
{ name: "parent_uuid", sql: "ALTER TABLE exchanges ADD COLUMN parent_uuid TEXT" },
|
|
29
|
+
{
|
|
30
|
+
name: "is_sidechain",
|
|
31
|
+
sql: "ALTER TABLE exchanges ADD COLUMN is_sidechain BOOLEAN DEFAULT 0",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: "harness",
|
|
35
|
+
sql: "ALTER TABLE exchanges ADD COLUMN harness TEXT NOT NULL DEFAULT 'claude'",
|
|
36
|
+
},
|
|
37
|
+
{ name: "session_id", sql: "ALTER TABLE exchanges ADD COLUMN session_id TEXT" },
|
|
38
|
+
{ name: "cwd", sql: "ALTER TABLE exchanges ADD COLUMN cwd TEXT" },
|
|
39
|
+
{ name: "git_branch", sql: "ALTER TABLE exchanges ADD COLUMN git_branch TEXT" },
|
|
40
|
+
{ name: "claude_version", sql: "ALTER TABLE exchanges ADD COLUMN claude_version TEXT" },
|
|
41
|
+
{ name: "agent_version", sql: "ALTER TABLE exchanges ADD COLUMN agent_version TEXT" },
|
|
42
|
+
{ name: "model", sql: "ALTER TABLE exchanges ADD COLUMN model TEXT" },
|
|
43
|
+
{ name: "model_provider", sql: "ALTER TABLE exchanges ADD COLUMN model_provider TEXT" },
|
|
44
|
+
{ name: "thinking_level", sql: "ALTER TABLE exchanges ADD COLUMN thinking_level TEXT" },
|
|
45
|
+
{
|
|
46
|
+
name: "thinking_disabled",
|
|
47
|
+
sql: "ALTER TABLE exchanges ADD COLUMN thinking_disabled BOOLEAN",
|
|
48
|
+
},
|
|
49
|
+
{ name: "thinking_triggers", sql: "ALTER TABLE exchanges ADD COLUMN thinking_triggers TEXT" },
|
|
50
|
+
{
|
|
51
|
+
name: "embedding_version",
|
|
52
|
+
sql: "ALTER TABLE exchanges ADD COLUMN embedding_version INTEGER NOT NULL DEFAULT 0",
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
let migrated = false;
|
|
56
|
+
for (const migration of migrations) {
|
|
57
|
+
if (!columnNames.has(migration.name)) {
|
|
58
|
+
console.log(`Migrating schema: adding ${migration.name} column...`);
|
|
59
|
+
db.prepare(migration.sql).run();
|
|
60
|
+
migrated = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (migrated) {
|
|
64
|
+
console.log("Migration complete.");
|
|
65
|
+
}
|
|
66
|
+
migrateToolCallsCascade(db);
|
|
67
|
+
migrateJournalRoot(db);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Add `journal_entries.root` and discard the journal index once.
|
|
71
|
+
*
|
|
72
|
+
* Every project on the machine shares one database, and until this column
|
|
73
|
+
* existed nothing recorded which journal root a row came from. Three defects
|
|
74
|
+
* followed, all of them data loss or leakage:
|
|
75
|
+
*
|
|
76
|
+
* - `indexJournal` pruned every row it had not just walked, and it walks only
|
|
77
|
+
* the current project's roots — so indexing in one repo deleted every other
|
|
78
|
+
* repo's `project`-scoped rows. `mcp-server.ts` runs it on every start.
|
|
79
|
+
* - Retrieval filtered on scope and timestamp only, so one repo's project
|
|
80
|
+
* notes surfaced in another.
|
|
81
|
+
* - `journalEntryId` hashed `scope:<relative path>`, so two repos whose entries
|
|
82
|
+
* shared a relative path — a date directory and a timestamp — collided on the
|
|
83
|
+
* primary key and overwrote each other.
|
|
84
|
+
*
|
|
85
|
+
* The fix changes the id, so old rows are unreachable by their new ids and
|
|
86
|
+
* cannot be backfilled reliably: `path` is absolute, but nothing in it marks
|
|
87
|
+
* where the root stopped and the entry began. The index is a derived cache —
|
|
88
|
+
* `mcp-server.ts` says so ("the markdown files are the source of truth, and a
|
|
89
|
+
* failed index is retried on the next start") — so it is dropped and rebuilt.
|
|
90
|
+
* Each project restores its own rows the next time it indexes, which is what
|
|
91
|
+
* makes this recoverable rather than the deletion it replaces.
|
|
92
|
+
*/
|
|
93
|
+
export function migrateJournalRoot(db) {
|
|
94
|
+
const table = db
|
|
95
|
+
.prepare(`SELECT sql FROM sqlite_master WHERE type='table' AND name='journal_entries'`)
|
|
96
|
+
.get();
|
|
97
|
+
if (!table)
|
|
98
|
+
return; // caller creates it with the column already present
|
|
99
|
+
const columns = db
|
|
100
|
+
.prepare(`SELECT name FROM pragma_table_info('journal_entries')`)
|
|
101
|
+
.all();
|
|
102
|
+
if (columns.some((c) => c.name === "root"))
|
|
103
|
+
return;
|
|
104
|
+
console.log("Migrating journal_entries: adding root column and rebuilding the index...");
|
|
105
|
+
db.prepare("ALTER TABLE journal_entries ADD COLUMN root TEXT NOT NULL DEFAULT ''").run();
|
|
106
|
+
// vec0 rows are keyed by the same ids, so they go too or they orphan.
|
|
107
|
+
db.prepare("DELETE FROM vec_journal_entries").run();
|
|
108
|
+
db.prepare("DELETE FROM journal_entries").run();
|
|
109
|
+
console.log(" journal index cleared; it rebuilds per project on next index.");
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Earlier versions created `tool_calls` with a plain
|
|
113
|
+
* `FOREIGN KEY (exchange_id) REFERENCES exchanges(id)`.
|
|
114
|
+
* Without ON DELETE CASCADE, deleting an exchange that had tool calls
|
|
115
|
+
* raised SQLITE_CONSTRAINT_FOREIGNKEY (#81), and orphans accumulated.
|
|
116
|
+
*
|
|
117
|
+
* This migration:
|
|
118
|
+
* 1. Detects the legacy schema by inspecting sqlite_master.sql.
|
|
119
|
+
* 2. Drops orphaned tool_calls rows.
|
|
120
|
+
* 3. Recreates the table with ON DELETE CASCADE and copies surviving rows.
|
|
121
|
+
*/
|
|
122
|
+
export function migrateToolCallsCascade(db) {
|
|
123
|
+
const row = db
|
|
124
|
+
.prepare(`SELECT sql FROM sqlite_master WHERE type='table' AND name='tool_calls'`)
|
|
125
|
+
.get();
|
|
126
|
+
if (!row)
|
|
127
|
+
return; // table doesn't exist yet (caller will create it)
|
|
128
|
+
if (row.sql.toUpperCase().includes("ON DELETE CASCADE"))
|
|
129
|
+
return; // already migrated
|
|
130
|
+
console.log("Migrating tool_calls to ON DELETE CASCADE schema...");
|
|
131
|
+
const orphanCount = db
|
|
132
|
+
.prepare(`SELECT COUNT(*) AS c FROM tool_calls
|
|
133
|
+
WHERE exchange_id NOT IN (SELECT id FROM exchanges)`)
|
|
134
|
+
.get().c;
|
|
135
|
+
if (orphanCount > 0) {
|
|
136
|
+
console.log(` Removing ${orphanCount} orphaned tool_calls row(s)`);
|
|
137
|
+
}
|
|
138
|
+
// FK is enforced by default in better-sqlite3, but ALTER ... RENAME of a
|
|
139
|
+
// table that other objects reference can trip checks during the rebuild.
|
|
140
|
+
// Disable temporarily; the post-migration FK_check verifies integrity.
|
|
141
|
+
db.pragma("foreign_keys = OFF");
|
|
142
|
+
const tx = db.transaction(() => {
|
|
143
|
+
db.exec(`
|
|
144
|
+
CREATE TABLE tool_calls_new (
|
|
145
|
+
id TEXT PRIMARY KEY,
|
|
146
|
+
exchange_id TEXT NOT NULL,
|
|
147
|
+
tool_name TEXT NOT NULL,
|
|
148
|
+
tool_input TEXT,
|
|
149
|
+
tool_result TEXT,
|
|
150
|
+
is_error BOOLEAN DEFAULT 0,
|
|
151
|
+
timestamp TEXT NOT NULL,
|
|
152
|
+
FOREIGN KEY (exchange_id) REFERENCES exchanges(id) ON DELETE CASCADE
|
|
153
|
+
)
|
|
154
|
+
`);
|
|
155
|
+
db.exec(`
|
|
156
|
+
INSERT INTO tool_calls_new
|
|
157
|
+
SELECT id, exchange_id, tool_name, tool_input, tool_result, is_error, timestamp
|
|
158
|
+
FROM tool_calls
|
|
159
|
+
WHERE exchange_id IN (SELECT id FROM exchanges)
|
|
160
|
+
`);
|
|
161
|
+
db.exec(`DROP TABLE tool_calls`);
|
|
162
|
+
db.exec(`ALTER TABLE tool_calls_new RENAME TO tool_calls`);
|
|
163
|
+
});
|
|
164
|
+
tx();
|
|
165
|
+
db.pragma("foreign_keys = ON");
|
|
166
|
+
console.log(" tool_calls migration complete.");
|
|
167
|
+
}
|
|
168
|
+
export function initDatabase() {
|
|
169
|
+
const dbPath = getDbPath();
|
|
170
|
+
// Ensure directory exists
|
|
171
|
+
const dbDir = path.dirname(dbPath);
|
|
172
|
+
if (!fs.existsSync(dbDir)) {
|
|
173
|
+
fs.mkdirSync(dbDir, { recursive: true });
|
|
174
|
+
}
|
|
175
|
+
const db = new Database(dbPath);
|
|
176
|
+
// Load sqlite-vec extension
|
|
177
|
+
sqliteVec.load(db);
|
|
178
|
+
// Enable WAL mode for better concurrency
|
|
179
|
+
db.pragma("journal_mode = WAL");
|
|
180
|
+
// Create exchanges table
|
|
181
|
+
db.exec(`
|
|
182
|
+
CREATE TABLE IF NOT EXISTS exchanges (
|
|
183
|
+
id TEXT PRIMARY KEY,
|
|
184
|
+
project TEXT NOT NULL,
|
|
185
|
+
timestamp TEXT NOT NULL,
|
|
186
|
+
user_message TEXT NOT NULL,
|
|
187
|
+
assistant_message TEXT NOT NULL,
|
|
188
|
+
archive_path TEXT NOT NULL,
|
|
189
|
+
line_start INTEGER NOT NULL,
|
|
190
|
+
line_end INTEGER NOT NULL,
|
|
191
|
+
embedding BLOB,
|
|
192
|
+
last_indexed INTEGER,
|
|
193
|
+
parent_uuid TEXT,
|
|
194
|
+
is_sidechain BOOLEAN DEFAULT 0,
|
|
195
|
+
harness TEXT NOT NULL DEFAULT 'claude',
|
|
196
|
+
session_id TEXT,
|
|
197
|
+
cwd TEXT,
|
|
198
|
+
git_branch TEXT,
|
|
199
|
+
claude_version TEXT,
|
|
200
|
+
agent_version TEXT,
|
|
201
|
+
model TEXT,
|
|
202
|
+
model_provider TEXT,
|
|
203
|
+
thinking_level TEXT,
|
|
204
|
+
thinking_disabled BOOLEAN,
|
|
205
|
+
thinking_triggers TEXT,
|
|
206
|
+
embedding_version INTEGER NOT NULL DEFAULT 0
|
|
207
|
+
)
|
|
208
|
+
`);
|
|
209
|
+
// Create tool_calls table.
|
|
210
|
+
// ON DELETE CASCADE keeps the table consistent when exchanges go away
|
|
211
|
+
// (search reindex, repair, etc.) without callers having to remember to
|
|
212
|
+
// delete dependents first.
|
|
213
|
+
db.exec(`
|
|
214
|
+
CREATE TABLE IF NOT EXISTS tool_calls (
|
|
215
|
+
id TEXT PRIMARY KEY,
|
|
216
|
+
exchange_id TEXT NOT NULL,
|
|
217
|
+
tool_name TEXT NOT NULL,
|
|
218
|
+
tool_input TEXT,
|
|
219
|
+
tool_result TEXT,
|
|
220
|
+
is_error BOOLEAN DEFAULT 0,
|
|
221
|
+
timestamp TEXT NOT NULL,
|
|
222
|
+
FOREIGN KEY (exchange_id) REFERENCES exchanges(id) ON DELETE CASCADE
|
|
223
|
+
)
|
|
224
|
+
`);
|
|
225
|
+
// Create vector search index
|
|
226
|
+
db.exec(`
|
|
227
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS vec_exchanges USING vec0(
|
|
228
|
+
id TEXT PRIMARY KEY,
|
|
229
|
+
embedding FLOAT[${EMBEDDING_DIMENSIONS}]
|
|
230
|
+
)
|
|
231
|
+
`);
|
|
232
|
+
// Journal entries. The markdown file on disk stays the source of truth — this
|
|
233
|
+
// is an index, and `moe-memory journal index` rebuilds it from the files.
|
|
234
|
+
// `path` is refreshed from the walk on every index run, which is the fix for
|
|
235
|
+
// an upstream defect: the sidecar format baked an ABSOLUTE path into its JSON,
|
|
236
|
+
// search returned that stale path, and read_journal_entry then refused it with
|
|
237
|
+
// a security-flavoured error.
|
|
238
|
+
db.exec(`
|
|
239
|
+
CREATE TABLE IF NOT EXISTS journal_entries (
|
|
240
|
+
id TEXT PRIMARY KEY,
|
|
241
|
+
path TEXT NOT NULL,
|
|
242
|
+
root TEXT NOT NULL DEFAULT '',
|
|
243
|
+
scope TEXT NOT NULL,
|
|
244
|
+
timestamp INTEGER NOT NULL,
|
|
245
|
+
text TEXT NOT NULL,
|
|
246
|
+
sections TEXT NOT NULL,
|
|
247
|
+
source_mtime_ms INTEGER NOT NULL,
|
|
248
|
+
last_indexed INTEGER,
|
|
249
|
+
embedding_version INTEGER NOT NULL DEFAULT 0
|
|
250
|
+
)
|
|
251
|
+
`);
|
|
252
|
+
db.exec(`
|
|
253
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS vec_journal_entries USING vec0(
|
|
254
|
+
id TEXT PRIMARY KEY,
|
|
255
|
+
embedding FLOAT[${EMBEDDING_DIMENSIONS}]
|
|
256
|
+
)
|
|
257
|
+
`);
|
|
258
|
+
// Run migrations first
|
|
259
|
+
migrateSchema(db);
|
|
260
|
+
// Create indexes (after migrations ensure columns exist)
|
|
261
|
+
db.exec(`
|
|
262
|
+
CREATE INDEX IF NOT EXISTS idx_timestamp ON exchanges(timestamp DESC)
|
|
263
|
+
`);
|
|
264
|
+
db.exec(`
|
|
265
|
+
CREATE INDEX IF NOT EXISTS idx_session_id ON exchanges(session_id)
|
|
266
|
+
`);
|
|
267
|
+
db.exec(`
|
|
268
|
+
CREATE INDEX IF NOT EXISTS idx_project ON exchanges(project)
|
|
269
|
+
`);
|
|
270
|
+
db.exec(`
|
|
271
|
+
CREATE INDEX IF NOT EXISTS idx_harness ON exchanges(harness)
|
|
272
|
+
`);
|
|
273
|
+
db.exec(`
|
|
274
|
+
CREATE INDEX IF NOT EXISTS idx_sidechain ON exchanges(is_sidechain)
|
|
275
|
+
`);
|
|
276
|
+
db.exec(`
|
|
277
|
+
CREATE INDEX IF NOT EXISTS idx_git_branch ON exchanges(git_branch)
|
|
278
|
+
`);
|
|
279
|
+
db.exec(`
|
|
280
|
+
CREATE INDEX IF NOT EXISTS idx_tool_name ON tool_calls(tool_name)
|
|
281
|
+
`);
|
|
282
|
+
db.exec(`
|
|
283
|
+
CREATE INDEX IF NOT EXISTS idx_tool_exchange ON tool_calls(exchange_id)
|
|
284
|
+
`);
|
|
285
|
+
db.exec(`
|
|
286
|
+
CREATE INDEX IF NOT EXISTS idx_journal_scope ON journal_entries(scope)
|
|
287
|
+
`);
|
|
288
|
+
db.exec(`
|
|
289
|
+
CREATE INDEX IF NOT EXISTS idx_journal_timestamp ON journal_entries(timestamp DESC)
|
|
290
|
+
`);
|
|
291
|
+
db.exec(`
|
|
292
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_journal_path ON journal_entries(path)
|
|
293
|
+
`);
|
|
294
|
+
return db;
|
|
295
|
+
}
|
|
296
|
+
export function insertExchange(db, exchange, embedding,
|
|
297
|
+
// Never read: the tool names actually written come off `exchange.toolCalls`
|
|
298
|
+
// below. Retained so the seven existing call sites keep compiling.
|
|
299
|
+
_toolNames) {
|
|
300
|
+
const now = Date.now();
|
|
301
|
+
const stmt = db.prepare(`
|
|
302
|
+
INSERT OR REPLACE INTO exchanges
|
|
303
|
+
(id, project, timestamp, user_message, assistant_message, archive_path, line_start, line_end, last_indexed,
|
|
304
|
+
parent_uuid, is_sidechain, harness, session_id, cwd, git_branch, claude_version, agent_version, model, model_provider,
|
|
305
|
+
thinking_level, thinking_disabled, thinking_triggers, embedding_version)
|
|
306
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
307
|
+
`);
|
|
308
|
+
stmt.run(exchange.id, exchange.project, exchange.timestamp, exchange.userMessage, exchange.assistantMessage, exchange.archivePath, exchange.lineStart, exchange.lineEnd, now, exchange.parentUuid || null, exchange.isSidechain ? 1 : 0, exchange.harness || "claude", exchange.sessionId || null, exchange.cwd || null, exchange.gitBranch || null, exchange.claudeVersion || null, exchange.agentVersion || exchange.claudeVersion || null, exchange.model || null, exchange.modelProvider || null, exchange.thinkingLevel || null, exchange.thinkingDisabled ? 1 : 0, exchange.thinkingTriggers || null, EMBEDDING_VERSION);
|
|
309
|
+
// Insert into vector table (delete first since virtual tables don't support REPLACE)
|
|
310
|
+
const delStmt = db.prepare(`DELETE FROM vec_exchanges WHERE id = ?`);
|
|
311
|
+
delStmt.run(exchange.id);
|
|
312
|
+
const vecStmt = db.prepare(`
|
|
313
|
+
INSERT INTO vec_exchanges (id, embedding)
|
|
314
|
+
VALUES (?, ?)
|
|
315
|
+
`);
|
|
316
|
+
vecStmt.run(exchange.id, Buffer.from(new Float32Array(embedding).buffer));
|
|
317
|
+
// Insert tool calls if present
|
|
318
|
+
if (exchange.toolCalls && exchange.toolCalls.length > 0) {
|
|
319
|
+
const toolStmt = db.prepare(`
|
|
320
|
+
INSERT OR REPLACE INTO tool_calls
|
|
321
|
+
(id, exchange_id, tool_name, tool_input, tool_result, is_error, timestamp)
|
|
322
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
323
|
+
`);
|
|
324
|
+
for (const toolCall of exchange.toolCalls) {
|
|
325
|
+
toolStmt.run(toolCall.id, toolCall.exchangeId, toolCall.toolName, toolCall.toolInput ? JSON.stringify(toolCall.toolInput) : null, toolCall.toolResult || null, toolCall.isError ? 1 : 0, toolCall.timestamp);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
export function getAllExchanges(db) {
|
|
330
|
+
const stmt = db.prepare(`SELECT id, archive_path as archivePath FROM exchanges`);
|
|
331
|
+
return stmt.all();
|
|
332
|
+
}
|
|
333
|
+
export function getFileLastIndexed(db, archivePath) {
|
|
334
|
+
const stmt = db.prepare(`
|
|
335
|
+
SELECT MAX(last_indexed) as lastIndexed
|
|
336
|
+
FROM exchanges
|
|
337
|
+
WHERE archive_path = ?
|
|
338
|
+
`);
|
|
339
|
+
const row = stmt.get(archivePath);
|
|
340
|
+
return row.lastIndexed;
|
|
341
|
+
}
|
|
342
|
+
export function deleteExchange(db, id) {
|
|
343
|
+
// Delete from vector table
|
|
344
|
+
db.prepare(`DELETE FROM vec_exchanges WHERE id = ?`).run(id);
|
|
345
|
+
// Delete from main table
|
|
346
|
+
db.prepare(`DELETE FROM exchanges WHERE id = ?`).run(id);
|
|
347
|
+
}
|
|
348
|
+
export function journalEntryFromRow(row) {
|
|
349
|
+
let sections = [];
|
|
350
|
+
try {
|
|
351
|
+
const parsed = JSON.parse(row.sections);
|
|
352
|
+
if (Array.isArray(parsed))
|
|
353
|
+
sections = parsed.filter((s) => typeof s === "string");
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
// A hand-edited row should not take the whole query down.
|
|
357
|
+
}
|
|
358
|
+
return {
|
|
359
|
+
id: row.id,
|
|
360
|
+
path: row.path,
|
|
361
|
+
root: row.root ?? "",
|
|
362
|
+
scope: row.scope === "project" ? "project" : "user",
|
|
363
|
+
timestamp: row.timestamp,
|
|
364
|
+
text: row.text,
|
|
365
|
+
sections,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
export const JOURNAL_SELECT_COLUMNS = `
|
|
369
|
+
j.id,
|
|
370
|
+
j.path,
|
|
371
|
+
j.root,
|
|
372
|
+
j.scope,
|
|
373
|
+
j.timestamp,
|
|
374
|
+
j.text,
|
|
375
|
+
j.sections`;
|
|
376
|
+
/**
|
|
377
|
+
* Insert or replace one journal entry and its vector.
|
|
378
|
+
*
|
|
379
|
+
* Same shape as insertExchange: the vec0 virtual table rejects REPLACE, so the
|
|
380
|
+
* vector row is deleted then inserted.
|
|
381
|
+
*/
|
|
382
|
+
export function upsertJournalEntry(db, entry, sourceMtimeMs, embedding) {
|
|
383
|
+
db.prepare(`
|
|
384
|
+
INSERT OR REPLACE INTO journal_entries
|
|
385
|
+
(id, path, root, scope, timestamp, text, sections, source_mtime_ms, last_indexed, embedding_version)
|
|
386
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
387
|
+
`).run(entry.id, entry.path, entry.root, entry.scope, entry.timestamp, entry.text, JSON.stringify(entry.sections), sourceMtimeMs, Date.now(), EMBEDDING_VERSION);
|
|
388
|
+
db.prepare("DELETE FROM vec_journal_entries WHERE id = ?").run(entry.id);
|
|
389
|
+
db.prepare("INSERT INTO vec_journal_entries (id, embedding) VALUES (?, ?)").run(entry.id, Buffer.from(new Float32Array(embedding).buffer));
|
|
390
|
+
}
|
|
391
|
+
export function deleteJournalEntry(db, id) {
|
|
392
|
+
db.prepare("DELETE FROM vec_journal_entries WHERE id = ?").run(id);
|
|
393
|
+
db.prepare("DELETE FROM journal_entries WHERE id = ?").run(id);
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Everything the incremental journal scan needs to decide whether a file on
|
|
397
|
+
* disk is already indexed at the current embedding version.
|
|
398
|
+
*
|
|
399
|
+
* private-journal-mcp's equivalent keyed purely on the ABSENCE of a `.embedding`
|
|
400
|
+
* sidecar, so it would never re-embed a stale one and never notice an edited
|
|
401
|
+
* entry. Carrying mtime and version means a changed file and a bumped
|
|
402
|
+
* EMBEDDING_VERSION both re-index.
|
|
403
|
+
*/
|
|
404
|
+
export function getJournalIndexState(db, scope) {
|
|
405
|
+
const rows = (scope
|
|
406
|
+
? db
|
|
407
|
+
.prepare("SELECT id, path, root, source_mtime_ms, embedding_version FROM journal_entries WHERE scope = ?")
|
|
408
|
+
.all(scope)
|
|
409
|
+
: db
|
|
410
|
+
.prepare("SELECT id, path, root, source_mtime_ms, embedding_version FROM journal_entries")
|
|
411
|
+
.all());
|
|
412
|
+
const state = new Map();
|
|
413
|
+
for (const row of rows) {
|
|
414
|
+
state.set(row.id, {
|
|
415
|
+
id: row.id,
|
|
416
|
+
path: row.path,
|
|
417
|
+
root: row.root ?? "",
|
|
418
|
+
sourceMtimeMs: row.source_mtime_ms,
|
|
419
|
+
embeddingVersion: row.embedding_version,
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
return state;
|
|
423
|
+
}
|
|
424
|
+
export function countJournalEntries(db, scope) {
|
|
425
|
+
const row = (scope
|
|
426
|
+
? db.prepare("SELECT COUNT(*) AS c FROM journal_entries WHERE scope = ?").get(scope)
|
|
427
|
+
: db.prepare("SELECT COUNT(*) AS c FROM journal_entries").get());
|
|
428
|
+
return row.c;
|
|
429
|
+
}
|
|
430
|
+
//# sourceMappingURL=db.js.map
|
package/dist/db.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-cli.d.ts","sourceRoot":"","sources":["../src/doctor-cli.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAwBlF,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB/D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** `moe-memory doctor codex` — diagnose the local Codex plugin/hook/MCP setup. */
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { detectCodexHookTrustState } from "./codex-hook-trust.js";
|
|
6
|
+
import { buildCodexDoctorReport } from "./doctor.js";
|
|
7
|
+
import { getSyncLogPath } from "./logging.js";
|
|
8
|
+
import { getCodexDir, getDbPath, getMemoryDataDir } from "./paths.js";
|
|
9
|
+
function capture(command, args) {
|
|
10
|
+
const result = spawnSync(command, args, {
|
|
11
|
+
encoding: "utf-8",
|
|
12
|
+
timeout: 10000,
|
|
13
|
+
});
|
|
14
|
+
return `${result.stdout || ""}${result.stderr || ""}`.trim();
|
|
15
|
+
}
|
|
16
|
+
function showHelp() {
|
|
17
|
+
console.log(`Usage: moe-memory doctor codex
|
|
18
|
+
|
|
19
|
+
Diagnose the local Codex plugin, hook, MCP, archive, and index setup.`);
|
|
20
|
+
}
|
|
21
|
+
export async function runDoctor(args) {
|
|
22
|
+
const target = args[0];
|
|
23
|
+
if (target !== "codex") {
|
|
24
|
+
showHelp();
|
|
25
|
+
return target ? 1 : 0;
|
|
26
|
+
}
|
|
27
|
+
const codexHome = getCodexDir();
|
|
28
|
+
const hookTrustState = await detectCodexHookTrustState(codexHome, process.cwd());
|
|
29
|
+
const report = buildCodexDoctorReport({
|
|
30
|
+
codexVersionOutput: capture("codex", ["--version"]),
|
|
31
|
+
featuresOutput: capture("codex", ["features", "list"]),
|
|
32
|
+
mcpListOutput: capture("codex", ["mcp", "list"]),
|
|
33
|
+
codexHome,
|
|
34
|
+
sessionsDirExists: fs.existsSync(path.join(codexHome, "sessions")),
|
|
35
|
+
logPath: getSyncLogPath(),
|
|
36
|
+
dbPath: getDbPath(),
|
|
37
|
+
hookTrustState,
|
|
38
|
+
});
|
|
39
|
+
process.stdout.write(report.text);
|
|
40
|
+
process.stdout.write(`Data directory: ${getMemoryDataDir()}\n`);
|
|
41
|
+
return report.ok ? 0 : 1;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=doctor-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-cli.js","sourceRoot":"","sources":["../src/doctor-cli.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtE,SAAS,OAAO,CAAC,OAAe,EAAE,IAAc;IAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;QACtC,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IACH,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;;sEAEwD,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,QAAQ,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;IAChC,MAAM,cAAc,GAAG,MAAM,yBAAyB,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,sBAAsB,CAAC;QACpC,kBAAkB,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC;QACnD,cAAc,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACtD,aAAa,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAChD,SAAS;QACT,iBAAiB,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAClE,OAAO,EAAE,cAAc,EAAE;QACzB,MAAM,EAAE,SAAS,EAAE;QACnB,cAAc;KACf,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAEhE,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC"}
|
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CodexHookTrustState } from "./codex-hook-trust.js";
|
|
2
|
+
export interface CodexDoctorInputs {
|
|
3
|
+
codexVersionOutput: string;
|
|
4
|
+
featuresOutput: string;
|
|
5
|
+
mcpListOutput: string;
|
|
6
|
+
codexHome: string;
|
|
7
|
+
sessionsDirExists: boolean;
|
|
8
|
+
logPath: string;
|
|
9
|
+
dbPath: string;
|
|
10
|
+
hookTrustState: CodexHookTrustState;
|
|
11
|
+
}
|
|
12
|
+
export interface DoctorReport {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
text: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function buildCodexDoctorReport(inputs: CodexDoctorInputs): DoctorReport;
|
|
17
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGjE,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,mBAAmB,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AA0CD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,YAAY,CA8D9E"}
|