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.
Files changed (125) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +217 -0
  3. package/adapters/claude-code/hooks/capture.mjs +58 -0
  4. package/adapters/claude-code/hooks/orient.mjs +114 -0
  5. package/adapters/claude-code/hooks/validate.mjs +56 -0
  6. package/dist/agents/lock.d.ts +3 -0
  7. package/dist/agents/lock.d.ts.map +1 -0
  8. package/dist/agents/lock.js +11 -0
  9. package/dist/agents/lock.js.map +1 -0
  10. package/dist/agents/protocol.d.ts +6 -0
  11. package/dist/agents/protocol.d.ts.map +1 -0
  12. package/dist/agents/protocol.js +10 -0
  13. package/dist/agents/protocol.js.map +1 -0
  14. package/dist/cli/add.d.ts +12 -0
  15. package/dist/cli/add.d.ts.map +1 -0
  16. package/dist/cli/add.js +88 -0
  17. package/dist/cli/add.js.map +1 -0
  18. package/dist/cli/archive.d.ts +25 -0
  19. package/dist/cli/archive.d.ts.map +1 -0
  20. package/dist/cli/archive.js +69 -0
  21. package/dist/cli/archive.js.map +1 -0
  22. package/dist/cli/bridge.d.ts +19 -0
  23. package/dist/cli/bridge.d.ts.map +1 -0
  24. package/dist/cli/bridge.js +180 -0
  25. package/dist/cli/bridge.js.map +1 -0
  26. package/dist/cli/health.d.ts +7 -0
  27. package/dist/cli/health.d.ts.map +1 -0
  28. package/dist/cli/health.js +66 -0
  29. package/dist/cli/health.js.map +1 -0
  30. package/dist/cli/init.d.ts +9 -0
  31. package/dist/cli/init.d.ts.map +1 -0
  32. package/dist/cli/init.js +44 -0
  33. package/dist/cli/init.js.map +1 -0
  34. package/dist/cli/promote.d.ts +35 -0
  35. package/dist/cli/promote.d.ts.map +1 -0
  36. package/dist/cli/promote.js +182 -0
  37. package/dist/cli/promote.js.map +1 -0
  38. package/dist/cli/query.d.ts +10 -0
  39. package/dist/cli/query.d.ts.map +1 -0
  40. package/dist/cli/query.js +74 -0
  41. package/dist/cli/query.js.map +1 -0
  42. package/dist/cli/serve.d.ts +27 -0
  43. package/dist/cli/serve.d.ts.map +1 -0
  44. package/dist/cli/serve.js +254 -0
  45. package/dist/cli/serve.js.map +1 -0
  46. package/dist/cli/status.d.ts +7 -0
  47. package/dist/cli/status.d.ts.map +1 -0
  48. package/dist/cli/status.js +34 -0
  49. package/dist/cli/status.js.map +1 -0
  50. package/dist/cli/validate.d.ts +9 -0
  51. package/dist/cli/validate.d.ts.map +1 -0
  52. package/dist/cli/validate.js +37 -0
  53. package/dist/cli/validate.js.map +1 -0
  54. package/dist/core/classify.d.ts +13 -0
  55. package/dist/core/classify.d.ts.map +1 -0
  56. package/dist/core/classify.js +126 -0
  57. package/dist/core/classify.js.map +1 -0
  58. package/dist/core/config.d.ts +82 -0
  59. package/dist/core/config.d.ts.map +1 -0
  60. package/dist/core/config.js +183 -0
  61. package/dist/core/config.js.map +1 -0
  62. package/dist/core/frontmatter.d.ts +11 -0
  63. package/dist/core/frontmatter.d.ts.map +1 -0
  64. package/dist/core/frontmatter.js +61 -0
  65. package/dist/core/frontmatter.js.map +1 -0
  66. package/dist/core/graph.d.ts +9 -0
  67. package/dist/core/graph.d.ts.map +1 -0
  68. package/dist/core/graph.js +56 -0
  69. package/dist/core/graph.js.map +1 -0
  70. package/dist/core/importance.d.ts +49 -0
  71. package/dist/core/importance.d.ts.map +1 -0
  72. package/dist/core/importance.js +230 -0
  73. package/dist/core/importance.js.map +1 -0
  74. package/dist/core/intent.d.ts +36 -0
  75. package/dist/core/intent.d.ts.map +1 -0
  76. package/dist/core/intent.js +108 -0
  77. package/dist/core/intent.js.map +1 -0
  78. package/dist/core/linkdetect.d.ts +34 -0
  79. package/dist/core/linkdetect.d.ts.map +1 -0
  80. package/dist/core/linkdetect.js +181 -0
  81. package/dist/core/linkdetect.js.map +1 -0
  82. package/dist/core/llm.d.ts +41 -0
  83. package/dist/core/llm.d.ts.map +1 -0
  84. package/dist/core/llm.js +36 -0
  85. package/dist/core/llm.js.map +1 -0
  86. package/dist/core/promote.d.ts +40 -0
  87. package/dist/core/promote.d.ts.map +1 -0
  88. package/dist/core/promote.js +246 -0
  89. package/dist/core/promote.js.map +1 -0
  90. package/dist/core/ranking.d.ts +33 -0
  91. package/dist/core/ranking.d.ts.map +1 -0
  92. package/dist/core/ranking.js +45 -0
  93. package/dist/core/ranking.js.map +1 -0
  94. package/dist/core/schema.d.ts +16 -0
  95. package/dist/core/schema.d.ts.map +1 -0
  96. package/dist/core/schema.js +76 -0
  97. package/dist/core/schema.js.map +1 -0
  98. package/dist/core/vault.d.ts +16 -0
  99. package/dist/core/vault.d.ts.map +1 -0
  100. package/dist/core/vault.js +52 -0
  101. package/dist/core/vault.js.map +1 -0
  102. package/dist/core/vitality.d.ts +55 -0
  103. package/dist/core/vitality.d.ts.map +1 -0
  104. package/dist/core/vitality.js +95 -0
  105. package/dist/core/vitality.js.map +1 -0
  106. package/dist/index.d.ts +3 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +139 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/providers/anthropic.d.ts +12 -0
  111. package/dist/providers/anthropic.d.ts.map +1 -0
  112. package/dist/providers/anthropic.js +90 -0
  113. package/dist/providers/anthropic.js.map +1 -0
  114. package/package.json +60 -0
  115. package/scaffold/.ori +1 -0
  116. package/scaffold/inbox/.gitkeep +1 -0
  117. package/scaffold/notes/index.md +19 -0
  118. package/scaffold/ops/observations/.gitkeep +1 -0
  119. package/scaffold/ops/reminders.md +3 -0
  120. package/scaffold/ops/sessions/.gitkeep +1 -0
  121. package/scaffold/ori.config.yaml +79 -0
  122. package/scaffold/templates/map.md +36 -0
  123. package/scaffold/templates/note.md +61 -0
  124. package/scaffold/templates/observation.md +38 -0
  125. 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,7 @@
1
+ export type StatusResult = {
2
+ success: boolean;
3
+ data: Record<string, unknown>;
4
+ warnings: string[];
5
+ };
6
+ export declare function runStatus(startDir: string): Promise<StatusResult>;
7
+ //# sourceMappingURL=status.d.ts.map
@@ -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,9 @@
1
+ export type ValidateOptions = {
2
+ notePath: string;
3
+ };
4
+ export declare function runValidate(options: ValidateOptions): Promise<{
5
+ success: boolean;
6
+ errors: string[];
7
+ warnings: string[];
8
+ }>;
9
+ //# sourceMappingURL=validate.d.ts.map
@@ -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"}