ori-memory 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/LICENSE +201 -0
- package/README.md +217 -0
- package/adapters/claude-code/hooks/capture.mjs +58 -0
- package/adapters/claude-code/hooks/orient.mjs +114 -0
- package/adapters/claude-code/hooks/validate.mjs +56 -0
- package/dist/agents/lock.d.ts +3 -0
- package/dist/agents/lock.d.ts.map +1 -0
- package/dist/agents/lock.js +11 -0
- package/dist/agents/lock.js.map +1 -0
- package/dist/agents/protocol.d.ts +6 -0
- package/dist/agents/protocol.d.ts.map +1 -0
- package/dist/agents/protocol.js +10 -0
- package/dist/agents/protocol.js.map +1 -0
- package/dist/cli/add.d.ts +12 -0
- package/dist/cli/add.d.ts.map +1 -0
- package/dist/cli/add.js +88 -0
- package/dist/cli/add.js.map +1 -0
- package/dist/cli/archive.d.ts +25 -0
- package/dist/cli/archive.d.ts.map +1 -0
- package/dist/cli/archive.js +69 -0
- package/dist/cli/archive.js.map +1 -0
- package/dist/cli/bridge.d.ts +19 -0
- package/dist/cli/bridge.d.ts.map +1 -0
- package/dist/cli/bridge.js +180 -0
- package/dist/cli/bridge.js.map +1 -0
- package/dist/cli/health.d.ts +7 -0
- package/dist/cli/health.d.ts.map +1 -0
- package/dist/cli/health.js +66 -0
- package/dist/cli/health.js.map +1 -0
- package/dist/cli/init.d.ts +9 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +44 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/promote.d.ts +35 -0
- package/dist/cli/promote.d.ts.map +1 -0
- package/dist/cli/promote.js +182 -0
- package/dist/cli/promote.js.map +1 -0
- package/dist/cli/query.d.ts +10 -0
- package/dist/cli/query.d.ts.map +1 -0
- package/dist/cli/query.js +74 -0
- package/dist/cli/query.js.map +1 -0
- package/dist/cli/serve.d.ts +27 -0
- package/dist/cli/serve.d.ts.map +1 -0
- package/dist/cli/serve.js +254 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/cli/status.d.ts +7 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +34 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/validate.d.ts +9 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +37 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/core/classify.d.ts +13 -0
- package/dist/core/classify.d.ts.map +1 -0
- package/dist/core/classify.js +126 -0
- package/dist/core/classify.js.map +1 -0
- package/dist/core/config.d.ts +82 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +183 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/frontmatter.d.ts +11 -0
- package/dist/core/frontmatter.d.ts.map +1 -0
- package/dist/core/frontmatter.js +61 -0
- package/dist/core/frontmatter.js.map +1 -0
- package/dist/core/graph.d.ts +9 -0
- package/dist/core/graph.d.ts.map +1 -0
- package/dist/core/graph.js +56 -0
- package/dist/core/graph.js.map +1 -0
- package/dist/core/importance.d.ts +49 -0
- package/dist/core/importance.d.ts.map +1 -0
- package/dist/core/importance.js +230 -0
- package/dist/core/importance.js.map +1 -0
- package/dist/core/intent.d.ts +36 -0
- package/dist/core/intent.d.ts.map +1 -0
- package/dist/core/intent.js +108 -0
- package/dist/core/intent.js.map +1 -0
- package/dist/core/linkdetect.d.ts +34 -0
- package/dist/core/linkdetect.d.ts.map +1 -0
- package/dist/core/linkdetect.js +181 -0
- package/dist/core/linkdetect.js.map +1 -0
- package/dist/core/llm.d.ts +41 -0
- package/dist/core/llm.d.ts.map +1 -0
- package/dist/core/llm.js +36 -0
- package/dist/core/llm.js.map +1 -0
- package/dist/core/promote.d.ts +40 -0
- package/dist/core/promote.d.ts.map +1 -0
- package/dist/core/promote.js +246 -0
- package/dist/core/promote.js.map +1 -0
- package/dist/core/ranking.d.ts +33 -0
- package/dist/core/ranking.d.ts.map +1 -0
- package/dist/core/ranking.js +45 -0
- package/dist/core/ranking.js.map +1 -0
- package/dist/core/schema.d.ts +16 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +76 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/vault.d.ts +16 -0
- package/dist/core/vault.d.ts.map +1 -0
- package/dist/core/vault.js +52 -0
- package/dist/core/vault.js.map +1 -0
- package/dist/core/vitality.d.ts +55 -0
- package/dist/core/vitality.d.ts.map +1 -0
- package/dist/core/vitality.js +95 -0
- package/dist/core/vitality.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +139 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/anthropic.d.ts +12 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +90 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/package.json +60 -0
- package/scaffold/.ori +1 -0
- package/scaffold/inbox/.gitkeep +1 -0
- package/scaffold/notes/index.md +19 -0
- package/scaffold/ops/observations/.gitkeep +1 -0
- package/scaffold/ops/reminders.md +3 -0
- package/scaffold/ops/sessions/.gitkeep +1 -0
- package/scaffold/ori.config.yaml +79 -0
- package/scaffold/templates/map.md +36 -0
- package/scaffold/templates/note.md +61 -0
- package/scaffold/templates/observation.md +38 -0
- package/scaffold/templates/source.md +45 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import { findVaultRoot, getVaultPaths, listNoteTitles } from "../core/vault.js";
|
|
4
|
+
import { loadConfig, resolveTemplatePath } from "../core/config.js";
|
|
5
|
+
import { readFrontmatterFile, writeFrontmatterFile } from "../core/frontmatter.js";
|
|
6
|
+
import { buildGraph } from "../core/graph.js";
|
|
7
|
+
import { validateNoteAgainstSchema } from "../core/schema.js";
|
|
8
|
+
import { computePromotion } from "../core/promote.js";
|
|
9
|
+
function getPromoteConfig(config) {
|
|
10
|
+
return {
|
|
11
|
+
projectConfig: {
|
|
12
|
+
known_projects: Object.keys(config.promote.project_keywords),
|
|
13
|
+
keywords: config.promote.project_keywords,
|
|
14
|
+
},
|
|
15
|
+
mapRouting: config.promote.project_map_routing,
|
|
16
|
+
defaultArea: config.promote.default_area,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
async function buildVaultIndex(notesDir) {
|
|
20
|
+
const titles = await listNoteTitles(notesDir);
|
|
21
|
+
const graph = await buildGraph(notesDir);
|
|
22
|
+
const frontmatter = new Map();
|
|
23
|
+
for (const title of titles) {
|
|
24
|
+
const filePath = path.join(notesDir, `${title}.md`);
|
|
25
|
+
try {
|
|
26
|
+
const parsed = await readFrontmatterFile(filePath);
|
|
27
|
+
if (parsed.data) {
|
|
28
|
+
frontmatter.set(title, parsed.data);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Skip unreadable files
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { titles, frontmatter, graph };
|
|
36
|
+
}
|
|
37
|
+
async function listInboxNotes(inboxDir) {
|
|
38
|
+
try {
|
|
39
|
+
const entries = await fs.readdir(inboxDir, { withFileTypes: true });
|
|
40
|
+
return entries
|
|
41
|
+
.filter((e) => e.isFile() && e.name.endsWith(".md"))
|
|
42
|
+
.map((e) => e.name);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function appendPromoteLog(opsDir, entry) {
|
|
49
|
+
const logPath = path.join(opsDir, "promote.log");
|
|
50
|
+
const timestamp = new Date().toISOString();
|
|
51
|
+
const line = `${timestamp} | ${entry.file} | type=${entry.classification} (${entry.confidence}) | ${entry.changes.join("; ")}\n`;
|
|
52
|
+
await fs.appendFile(logPath, line, "utf8");
|
|
53
|
+
}
|
|
54
|
+
export async function runPromote(options) {
|
|
55
|
+
const vaultRoot = await findVaultRoot(options.startDir);
|
|
56
|
+
const paths = getVaultPaths(vaultRoot);
|
|
57
|
+
const config = await loadConfig(paths.config);
|
|
58
|
+
const { projectConfig, mapRouting, defaultArea } = getPromoteConfig(config);
|
|
59
|
+
const vaultIndex = await buildVaultIndex(paths.notes);
|
|
60
|
+
// Resolve target inbox notes
|
|
61
|
+
const allInbox = await listInboxNotes(paths.inbox);
|
|
62
|
+
let targets;
|
|
63
|
+
if (options.all) {
|
|
64
|
+
targets = allInbox;
|
|
65
|
+
}
|
|
66
|
+
else if (options.noteName) {
|
|
67
|
+
// Accept with or without .md extension
|
|
68
|
+
const name = options.noteName.endsWith(".md")
|
|
69
|
+
? options.noteName
|
|
70
|
+
: `${options.noteName}.md`;
|
|
71
|
+
if (!allInbox.includes(name)) {
|
|
72
|
+
return {
|
|
73
|
+
success: false,
|
|
74
|
+
data: { promoted: [], skipped: [] },
|
|
75
|
+
warnings: [`Inbox note not found: ${name}`],
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
targets = [name];
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
return {
|
|
82
|
+
success: false,
|
|
83
|
+
data: { promoted: [], skipped: [] },
|
|
84
|
+
warnings: ["Specify a note name or use --all"],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const promoted = [];
|
|
88
|
+
const skipped = [];
|
|
89
|
+
for (const filename of targets) {
|
|
90
|
+
const inboxPath = path.join(paths.inbox, filename);
|
|
91
|
+
const parsed = await readFrontmatterFile(inboxPath);
|
|
92
|
+
if (!parsed.data) {
|
|
93
|
+
skipped.push({ path: inboxPath, reason: "No frontmatter found" });
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (parsed.data.status !== "inbox") {
|
|
97
|
+
skipped.push({
|
|
98
|
+
path: inboxPath,
|
|
99
|
+
reason: `Status is "${parsed.data.status}", not "inbox"`,
|
|
100
|
+
});
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
// Compute promotion
|
|
104
|
+
const result = computePromotion({
|
|
105
|
+
inboxPath,
|
|
106
|
+
frontmatter: parsed.data,
|
|
107
|
+
body: parsed.body,
|
|
108
|
+
existingTitles: vaultIndex.titles,
|
|
109
|
+
vaultIndex,
|
|
110
|
+
overrides: {
|
|
111
|
+
type: options.type,
|
|
112
|
+
description: options.description,
|
|
113
|
+
links: options.links,
|
|
114
|
+
project: options.project,
|
|
115
|
+
},
|
|
116
|
+
projectConfig,
|
|
117
|
+
mapRouting,
|
|
118
|
+
defaultArea,
|
|
119
|
+
});
|
|
120
|
+
const destPath = path.join(paths.notes, result.destinationFilename);
|
|
121
|
+
// Collision check
|
|
122
|
+
try {
|
|
123
|
+
await fs.access(destPath);
|
|
124
|
+
skipped.push({
|
|
125
|
+
path: inboxPath,
|
|
126
|
+
reason: `Note already exists at ${destPath}. Rename the inbox note or remove the existing one.`,
|
|
127
|
+
});
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// File doesn't exist — good
|
|
132
|
+
}
|
|
133
|
+
if (options.dryRun) {
|
|
134
|
+
promoted.push({
|
|
135
|
+
from: inboxPath,
|
|
136
|
+
to: destPath,
|
|
137
|
+
changes: result.changes,
|
|
138
|
+
warnings: result.warnings,
|
|
139
|
+
validation: { valid: true, errors: [], warnings: [] },
|
|
140
|
+
});
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
// Write promoted note to notes/
|
|
144
|
+
await writeFrontmatterFile(destPath, result.updatedFrontmatter, result.updatedBody);
|
|
145
|
+
// Delete from inbox
|
|
146
|
+
await fs.unlink(inboxPath);
|
|
147
|
+
// Validate against schema
|
|
148
|
+
const templatePath = resolveTemplatePath(config, vaultRoot, result.classification.type);
|
|
149
|
+
let validation = { valid: true, errors: [], warnings: [] };
|
|
150
|
+
try {
|
|
151
|
+
validation = await validateNoteAgainstSchema(destPath, templatePath);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// Template might not exist for this type
|
|
155
|
+
}
|
|
156
|
+
// Log promotion
|
|
157
|
+
try {
|
|
158
|
+
await appendPromoteLog(paths.ops, {
|
|
159
|
+
file: filename,
|
|
160
|
+
classification: result.classification.type,
|
|
161
|
+
confidence: result.classification.confidence,
|
|
162
|
+
changes: result.changes,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Don't fail promotion if log write fails
|
|
167
|
+
}
|
|
168
|
+
promoted.push({
|
|
169
|
+
from: inboxPath,
|
|
170
|
+
to: destPath,
|
|
171
|
+
changes: result.changes,
|
|
172
|
+
warnings: result.warnings,
|
|
173
|
+
validation,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
success: true,
|
|
178
|
+
data: { promoted, skipped },
|
|
179
|
+
warnings: [],
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=promote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/cli/promote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type QueryResult = {
|
|
2
|
+
success: boolean;
|
|
3
|
+
data: Record<string, unknown>;
|
|
4
|
+
warnings: string[];
|
|
5
|
+
};
|
|
6
|
+
export declare function runQueryOrphans(startDir: string): Promise<QueryResult>;
|
|
7
|
+
export declare function runQueryDangling(startDir: string): Promise<QueryResult>;
|
|
8
|
+
export declare function runQueryBacklinks(startDir: string, note: string): Promise<QueryResult>;
|
|
9
|
+
export declare function runQueryCrossProject(startDir: string): Promise<QueryResult>;
|
|
10
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/cli/query.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAY5E;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAY7E;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,WAAW,CAAC,CAWtB;AAED,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA+BjF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import { findVaultRoot, getVaultPaths, listNoteTitles } from "../core/vault.js";
|
|
4
|
+
import { buildGraph, findBacklinks, findDanglingLinks, findOrphans } from "../core/graph.js";
|
|
5
|
+
import { parseFrontmatter } from "../core/frontmatter.js";
|
|
6
|
+
export async function runQueryOrphans(startDir) {
|
|
7
|
+
const vaultRoot = await findVaultRoot(startDir);
|
|
8
|
+
const { notes } = getVaultPaths(vaultRoot);
|
|
9
|
+
const allNotes = await listNoteTitles(notes);
|
|
10
|
+
const graph = await buildGraph(notes);
|
|
11
|
+
const orphans = findOrphans(graph, allNotes);
|
|
12
|
+
return {
|
|
13
|
+
success: true,
|
|
14
|
+
data: { orphans },
|
|
15
|
+
warnings: [],
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export async function runQueryDangling(startDir) {
|
|
19
|
+
const vaultRoot = await findVaultRoot(startDir);
|
|
20
|
+
const { notes } = getVaultPaths(vaultRoot);
|
|
21
|
+
const allNotes = await listNoteTitles(notes);
|
|
22
|
+
const graph = await buildGraph(notes);
|
|
23
|
+
const dangling = findDanglingLinks(graph, allNotes);
|
|
24
|
+
return {
|
|
25
|
+
success: true,
|
|
26
|
+
data: { dangling },
|
|
27
|
+
warnings: [],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export async function runQueryBacklinks(startDir, note) {
|
|
31
|
+
const vaultRoot = await findVaultRoot(startDir);
|
|
32
|
+
const { notes } = getVaultPaths(vaultRoot);
|
|
33
|
+
const graph = await buildGraph(notes);
|
|
34
|
+
const backlinks = findBacklinks(graph, note);
|
|
35
|
+
return {
|
|
36
|
+
success: true,
|
|
37
|
+
data: { backlinks },
|
|
38
|
+
warnings: [],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export async function runQueryCrossProject(startDir) {
|
|
42
|
+
const vaultRoot = await findVaultRoot(startDir);
|
|
43
|
+
const { notes } = getVaultPaths(vaultRoot);
|
|
44
|
+
let entries;
|
|
45
|
+
try {
|
|
46
|
+
entries = await fs.readdir(notes, { withFileTypes: true });
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
if (err.code === "ENOENT") {
|
|
50
|
+
return { success: true, data: { notes: [] }, warnings: [] };
|
|
51
|
+
}
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
54
|
+
const results = [];
|
|
55
|
+
for (const entry of entries) {
|
|
56
|
+
if (!entry.isFile() || !entry.name.endsWith(".md"))
|
|
57
|
+
continue;
|
|
58
|
+
const filePath = path.join(notes, entry.name);
|
|
59
|
+
const content = await fs.readFile(filePath, "utf8");
|
|
60
|
+
const parsed = parseFrontmatter(content);
|
|
61
|
+
if (!parsed.data)
|
|
62
|
+
continue;
|
|
63
|
+
const project = parsed.data["project"];
|
|
64
|
+
if (Array.isArray(project) && project.length >= 2) {
|
|
65
|
+
results.push(entry.name.replace(/\.md$/, ""));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
success: true,
|
|
70
|
+
data: { notes: results },
|
|
71
|
+
warnings: [],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/cli/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
type JsonRpcRequest = {
|
|
2
|
+
id?: string | number | null;
|
|
3
|
+
method?: unknown;
|
|
4
|
+
params?: Record<string, unknown>;
|
|
5
|
+
};
|
|
6
|
+
type JsonRpcError = {
|
|
7
|
+
code: number;
|
|
8
|
+
message: string;
|
|
9
|
+
data?: unknown;
|
|
10
|
+
};
|
|
11
|
+
type JsonRpcResponse = {
|
|
12
|
+
jsonrpc: "2.0";
|
|
13
|
+
id: JsonRpcRequest["id"];
|
|
14
|
+
result: unknown;
|
|
15
|
+
} | {
|
|
16
|
+
jsonrpc: "2.0";
|
|
17
|
+
id: JsonRpcRequest["id"];
|
|
18
|
+
error: JsonRpcError;
|
|
19
|
+
};
|
|
20
|
+
export declare function handleJsonRpcRequest(request: JsonRpcRequest): Promise<JsonRpcResponse | null>;
|
|
21
|
+
export declare function processMcpChunk(buffer: Buffer<ArrayBufferLike>, incoming: Buffer<ArrayBufferLike>): Promise<{
|
|
22
|
+
buffer: Buffer<ArrayBufferLike>;
|
|
23
|
+
responses: JsonRpcResponse[];
|
|
24
|
+
}>;
|
|
25
|
+
export declare function runServeMcp(_startDir: string): Promise<void>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=serve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAoGA,KAAK,cAAc,GAAG;IACpB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,eAAe,GAChB;IACE,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;CACjB,GACD;IACE,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,EAAE,YAAY,CAAC;CACrB,CAAC;AAgFN,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAwCjC;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,EAC/B,QAAQ,EAAE,MAAM,CAAC,eAAe,CAAC,GAChC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IAAC,SAAS,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,CAsD5E;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,iBA0BlD"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { runStatus } from "./status.js";
|
|
2
|
+
import { runQueryOrphans, runQueryDangling, runQueryBacklinks, runQueryCrossProject, } from "./query.js";
|
|
3
|
+
import { runAdd } from "./add.js";
|
|
4
|
+
import { runValidate } from "./validate.js";
|
|
5
|
+
import { runHealth } from "./health.js";
|
|
6
|
+
import { runPromote } from "./promote.js";
|
|
7
|
+
const TOOL_LIST = [
|
|
8
|
+
{
|
|
9
|
+
name: "ori_status",
|
|
10
|
+
description: "Vault overview",
|
|
11
|
+
inputSchema: { type: "object", properties: {}, required: [] },
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: "ori_query",
|
|
15
|
+
description: "Query the vault (orphans, dangling, backlinks, cross-project)",
|
|
16
|
+
inputSchema: {
|
|
17
|
+
type: "object",
|
|
18
|
+
properties: {
|
|
19
|
+
kind: { type: "string" },
|
|
20
|
+
note: { type: "string" },
|
|
21
|
+
},
|
|
22
|
+
required: ["kind"],
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: "ori_add",
|
|
27
|
+
description: "Create a note in inbox",
|
|
28
|
+
inputSchema: {
|
|
29
|
+
type: "object",
|
|
30
|
+
properties: {
|
|
31
|
+
title: { type: "string" },
|
|
32
|
+
type: { type: "string" },
|
|
33
|
+
},
|
|
34
|
+
required: ["title"],
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: "ori_validate",
|
|
39
|
+
description: "Validate a note against schema",
|
|
40
|
+
inputSchema: {
|
|
41
|
+
type: "object",
|
|
42
|
+
properties: {
|
|
43
|
+
path: { type: "string" },
|
|
44
|
+
},
|
|
45
|
+
required: ["path"],
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "ori_health",
|
|
50
|
+
description: "Full diagnostic",
|
|
51
|
+
inputSchema: { type: "object", properties: {}, required: [] },
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: "ori_promote",
|
|
55
|
+
description: "Promote an inbox note to notes/ with classification, linking, and area assignment. " +
|
|
56
|
+
"YOU are the intelligence layer — read the note, decide its type, write a description, " +
|
|
57
|
+
"identify links to existing notes, and pass your decisions as overrides. " +
|
|
58
|
+
"Heuristics run as fallback for anything you don't specify.",
|
|
59
|
+
inputSchema: {
|
|
60
|
+
type: "object",
|
|
61
|
+
properties: {
|
|
62
|
+
path: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "inbox note filename or path",
|
|
65
|
+
},
|
|
66
|
+
type: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "Your classification: idea | decision | learning | insight | blocker | opportunity",
|
|
69
|
+
},
|
|
70
|
+
description: {
|
|
71
|
+
type: "string",
|
|
72
|
+
description: "One sentence adding context beyond the title (max 200 chars)",
|
|
73
|
+
},
|
|
74
|
+
links: {
|
|
75
|
+
type: "array",
|
|
76
|
+
items: { type: "string" },
|
|
77
|
+
description: "Existing note titles this note should link to (use ori_status or ori_query to discover)",
|
|
78
|
+
},
|
|
79
|
+
project: {
|
|
80
|
+
type: "array",
|
|
81
|
+
items: { type: "string" },
|
|
82
|
+
description: "Project tags that apply to this note",
|
|
83
|
+
},
|
|
84
|
+
dry_run: { type: "boolean", description: "Preview changes without writing" },
|
|
85
|
+
},
|
|
86
|
+
required: ["path"],
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
function encodeResponse(response) {
|
|
91
|
+
const body = JSON.stringify(response);
|
|
92
|
+
return `Content-Length: ${Buffer.byteLength(body, "utf8")}\r\n\r\n${body}`;
|
|
93
|
+
}
|
|
94
|
+
function jsonRpcResult(id, result) {
|
|
95
|
+
return { jsonrpc: "2.0", id, result };
|
|
96
|
+
}
|
|
97
|
+
function jsonRpcError(id, code, message, data) {
|
|
98
|
+
return { jsonrpc: "2.0", id, error: { code, message, data } };
|
|
99
|
+
}
|
|
100
|
+
async function handleToolsCall(params) {
|
|
101
|
+
const name = params?.name;
|
|
102
|
+
const input = params?.arguments ?? {};
|
|
103
|
+
switch (name) {
|
|
104
|
+
case "ori_status":
|
|
105
|
+
return runStatus(process.cwd());
|
|
106
|
+
case "ori_query":
|
|
107
|
+
switch (input.kind) {
|
|
108
|
+
case "orphans":
|
|
109
|
+
return runQueryOrphans(process.cwd());
|
|
110
|
+
case "dangling":
|
|
111
|
+
return runQueryDangling(process.cwd());
|
|
112
|
+
case "backlinks":
|
|
113
|
+
if (typeof input.note !== "string") {
|
|
114
|
+
return { success: false, data: {}, warnings: ["note required"] };
|
|
115
|
+
}
|
|
116
|
+
return runQueryBacklinks(process.cwd(), input.note);
|
|
117
|
+
case "cross-project":
|
|
118
|
+
return runQueryCrossProject(process.cwd());
|
|
119
|
+
default:
|
|
120
|
+
return { success: false, data: {}, warnings: ["unknown kind"] };
|
|
121
|
+
}
|
|
122
|
+
case "ori_add":
|
|
123
|
+
if (typeof input.title !== "string") {
|
|
124
|
+
return { success: false, data: {}, warnings: ["title required"] };
|
|
125
|
+
}
|
|
126
|
+
return runAdd({
|
|
127
|
+
startDir: process.cwd(),
|
|
128
|
+
title: input.title,
|
|
129
|
+
type: typeof input.type === "string" ? input.type : "insight",
|
|
130
|
+
});
|
|
131
|
+
case "ori_validate":
|
|
132
|
+
if (typeof input.path !== "string") {
|
|
133
|
+
return { success: false, data: {}, warnings: ["path required"] };
|
|
134
|
+
}
|
|
135
|
+
return runValidate({ notePath: input.path });
|
|
136
|
+
case "ori_health":
|
|
137
|
+
return runHealth(process.cwd());
|
|
138
|
+
case "ori_promote":
|
|
139
|
+
if (typeof input.path !== "string") {
|
|
140
|
+
return { success: false, data: {}, warnings: ["path required"] };
|
|
141
|
+
}
|
|
142
|
+
return runPromote({
|
|
143
|
+
startDir: process.cwd(),
|
|
144
|
+
noteName: input.path,
|
|
145
|
+
dryRun: input.dry_run === true,
|
|
146
|
+
type: typeof input.type === "string" ? input.type : undefined,
|
|
147
|
+
description: typeof input.description === "string" ? input.description : undefined,
|
|
148
|
+
links: Array.isArray(input.links) ? input.links : undefined,
|
|
149
|
+
project: Array.isArray(input.project)
|
|
150
|
+
? input.project
|
|
151
|
+
: undefined,
|
|
152
|
+
});
|
|
153
|
+
default:
|
|
154
|
+
return { success: false, data: {}, warnings: ["unknown tool"] };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export async function handleJsonRpcRequest(request) {
|
|
158
|
+
if (typeof request.method !== "string") {
|
|
159
|
+
return jsonRpcError(request.id ?? null, -32600, "Invalid Request: method must be a string");
|
|
160
|
+
}
|
|
161
|
+
if (request.method.startsWith("notifications/") || request.method === "initialized") {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
// Notifications must not receive responses.
|
|
165
|
+
if (request.id === undefined) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
if (request.method === "initialize") {
|
|
169
|
+
return jsonRpcResult(request.id, {
|
|
170
|
+
protocolVersion: "2024-11-05",
|
|
171
|
+
capabilities: { tools: {} },
|
|
172
|
+
serverInfo: { name: "ori-memory", version: "0.2.0" },
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
if (request.method === "tools/list") {
|
|
176
|
+
return jsonRpcResult(request.id, { tools: TOOL_LIST });
|
|
177
|
+
}
|
|
178
|
+
if (request.method === "tools/call") {
|
|
179
|
+
try {
|
|
180
|
+
const result = await handleToolsCall(request.params);
|
|
181
|
+
return jsonRpcResult(request.id, result);
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
return jsonRpcError(request.id, -32000, err instanceof Error ? err.message : "Internal server error");
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return jsonRpcError(request.id, -32601, "Method not found");
|
|
188
|
+
}
|
|
189
|
+
export async function processMcpChunk(buffer, incoming) {
|
|
190
|
+
let nextBuffer = Buffer.concat([buffer, incoming]);
|
|
191
|
+
const responses = [];
|
|
192
|
+
while (true) {
|
|
193
|
+
const headerEnd = nextBuffer.indexOf("\r\n\r\n");
|
|
194
|
+
if (headerEnd === -1)
|
|
195
|
+
break;
|
|
196
|
+
const headerBlock = nextBuffer.slice(0, headerEnd).toString("utf8");
|
|
197
|
+
const headers = headerBlock.split("\r\n");
|
|
198
|
+
const lengthHeader = headers.find((line) => line.toLowerCase().startsWith("content-length:"));
|
|
199
|
+
if (!lengthHeader) {
|
|
200
|
+
nextBuffer = nextBuffer.slice(headerEnd + 4);
|
|
201
|
+
responses.push(jsonRpcError(null, -32600, "Invalid Request: Missing Content-Length"));
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
const lengthValue = lengthHeader.split(":").slice(1).join(":").trim();
|
|
205
|
+
const bodyLength = Number(lengthValue);
|
|
206
|
+
if (!Number.isFinite(bodyLength) || bodyLength <= 0) {
|
|
207
|
+
nextBuffer = nextBuffer.slice(headerEnd + 4);
|
|
208
|
+
responses.push(jsonRpcError(null, -32600, "Invalid Request: Invalid Content-Length"));
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
const bodyStart = headerEnd + 4;
|
|
212
|
+
const bodyEnd = bodyStart + bodyLength;
|
|
213
|
+
if (nextBuffer.length < bodyEnd)
|
|
214
|
+
break;
|
|
215
|
+
const body = nextBuffer.slice(bodyStart, bodyEnd).toString("utf8");
|
|
216
|
+
nextBuffer = nextBuffer.slice(bodyEnd);
|
|
217
|
+
let rawRequest;
|
|
218
|
+
try {
|
|
219
|
+
rawRequest = JSON.parse(body);
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
responses.push(jsonRpcError(null, -32700, "Parse error"));
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
if (!rawRequest || typeof rawRequest !== "object") {
|
|
226
|
+
responses.push(jsonRpcError(null, -32600, "Invalid Request"));
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
const response = await handleJsonRpcRequest(rawRequest);
|
|
230
|
+
if (response) {
|
|
231
|
+
responses.push(response);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return { buffer: nextBuffer, responses };
|
|
235
|
+
}
|
|
236
|
+
export async function runServeMcp(_startDir) {
|
|
237
|
+
let buffer = Buffer.alloc(0);
|
|
238
|
+
let processing = Promise.resolve();
|
|
239
|
+
process.stdin.on("data", (chunk) => {
|
|
240
|
+
const incoming = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
|
|
241
|
+
processing = processing
|
|
242
|
+
.then(async () => {
|
|
243
|
+
const processed = await processMcpChunk(buffer, incoming);
|
|
244
|
+
buffer = processed.buffer;
|
|
245
|
+
for (const response of processed.responses) {
|
|
246
|
+
process.stdout.write(encodeResponse(response));
|
|
247
|
+
}
|
|
248
|
+
})
|
|
249
|
+
.catch((err) => {
|
|
250
|
+
process.stdout.write(encodeResponse(jsonRpcError(null, -32000, err instanceof Error ? err.message : "Internal server error")));
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA8BvE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { findVaultRoot, getVaultPaths, listNoteTitles } from "../core/vault.js";
|
|
3
|
+
import { buildGraph, findOrphans } from "../core/graph.js";
|
|
4
|
+
export async function runStatus(startDir) {
|
|
5
|
+
const vaultRoot = await findVaultRoot(startDir);
|
|
6
|
+
const paths = getVaultPaths(vaultRoot);
|
|
7
|
+
const allNotes = await listNoteTitles(paths.notes);
|
|
8
|
+
const graph = await buildGraph(paths.notes);
|
|
9
|
+
const orphans = findOrphans(graph, allNotes);
|
|
10
|
+
let inboxEntries;
|
|
11
|
+
try {
|
|
12
|
+
inboxEntries = await fs.readdir(paths.inbox, { withFileTypes: true });
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
if (err.code === "ENOENT") {
|
|
16
|
+
inboxEntries = [];
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
throw err;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const inboxCount = inboxEntries.filter((e) => e.isFile()).length;
|
|
23
|
+
return {
|
|
24
|
+
success: true,
|
|
25
|
+
data: {
|
|
26
|
+
vaultRoot,
|
|
27
|
+
noteCount: allNotes.length,
|
|
28
|
+
inboxCount,
|
|
29
|
+
orphanCount: orphans.length,
|
|
30
|
+
},
|
|
31
|
+
warnings: [],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAe,MAAM,SAAS,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAQ3D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB;IAC9C,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAEvC,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE7C,IAAI,YAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,YAAY,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,YAAY,GAAG,EAAE,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjE,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI,EAAE;YACJ,SAAS;YACT,SAAS,EAAE,QAAQ,CAAC,MAAM;YAC1B,UAAU;YACV,WAAW,EAAE,OAAO,CAAC,MAAM;SAC5B;QACD,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/cli/validate.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAsB,WAAW,CAC/B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAwCrE"}
|