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,49 @@
1
+ import Graph from "graphology";
2
+ import type { LinkGraph } from "./graph.js";
3
+ export interface CommunityInfo {
4
+ size: number;
5
+ members: string[];
6
+ meanVitality?: number;
7
+ freshness?: number;
8
+ }
9
+ export interface GraphMetrics {
10
+ pagerank: Map<string, number>;
11
+ communities: Map<string, number>;
12
+ bridges: Set<string>;
13
+ betweenness: Map<string, number>;
14
+ communityStats: Map<number, CommunityInfo>;
15
+ }
16
+ export interface NoteIndex {
17
+ frontmatter: Map<string, Record<string, unknown>>;
18
+ }
19
+ /**
20
+ * Convert the simple LinkGraph from graph.ts into a graphology DirectedGraph.
21
+ */
22
+ export declare function buildGraphologyGraph(linkGraph: LinkGraph): Graph;
23
+ /**
24
+ * Compute PageRank scores for all nodes.
25
+ */
26
+ export declare function computePageRank(graph: Graph, alpha?: number): Map<string, number>;
27
+ /**
28
+ * Detect communities using Louvain algorithm.
29
+ */
30
+ export declare function detectCommunities(graph: Graph): Map<string, number>;
31
+ /**
32
+ * Find bridge notes: articulation points + high-degree hubs + map notes + cross-project connectors.
33
+ * Uses a simplified Tarjan's algorithm for articulation points.
34
+ */
35
+ export declare function findBridgeNotes(graph: Graph, noteIndex?: NoteIndex): Set<string>;
36
+ /**
37
+ * Compute betweenness centrality for all nodes.
38
+ */
39
+ export declare function computeBetweenness(graph: Graph): Map<string, number>;
40
+ /**
41
+ * Compute all graph metrics in one pass.
42
+ */
43
+ export declare function computeGraphMetrics(linkGraph: LinkGraph, noteIndex?: NoteIndex): GraphMetrics;
44
+ /**
45
+ * Personalized PageRank from seed nodes.
46
+ * Used for query-time graph traversal (Signal 3 in the retrieval pipeline).
47
+ */
48
+ export declare function personalizedPageRank(graph: Graph, seeds: string[], alpha?: number, iterations?: number): Map<string, number>;
49
+ //# sourceMappingURL=importance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importance.d.ts","sourceRoot":"","sources":["../../src/core/importance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAI/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACnD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,GAAG,KAAK,CA0BhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,KAAK,EACZ,KAAK,GAAE,MAAa,GACnB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAOrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBnE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,KAAK,EACZ,SAAS,CAAC,EAAE,SAAS,GACpB,GAAG,CAAC,MAAM,CAAC,CAuFb;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAOpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,EACpB,SAAS,CAAC,EAAE,SAAS,GACpB,YAAY,CAmBd;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,GAAE,MAAa,EACpB,UAAU,GAAE,MAAW,GACtB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA4CrB"}
@@ -0,0 +1,230 @@
1
+ import Graph from "graphology";
2
+ import pagerank from "graphology-metrics/centrality/pagerank.js";
3
+ import betweennessCentrality from "graphology-metrics/centrality/betweenness.js";
4
+ import louvain from "graphology-communities-louvain";
5
+ /**
6
+ * Convert the simple LinkGraph from graph.ts into a graphology DirectedGraph.
7
+ */
8
+ export function buildGraphologyGraph(linkGraph) {
9
+ const graph = new Graph({ type: "directed", multi: false });
10
+ // Add all nodes (from both outgoing keys and incoming keys)
11
+ const allNodes = new Set();
12
+ for (const key of linkGraph.outgoing.keys())
13
+ allNodes.add(key);
14
+ for (const key of linkGraph.incoming.keys())
15
+ allNodes.add(key);
16
+ // Also add targets that might only appear as targets
17
+ for (const targets of linkGraph.outgoing.values()) {
18
+ for (const t of targets)
19
+ allNodes.add(t);
20
+ }
21
+ for (const node of allNodes) {
22
+ if (!graph.hasNode(node))
23
+ graph.addNode(node);
24
+ }
25
+ // Add edges
26
+ for (const [source, targets] of linkGraph.outgoing) {
27
+ for (const target of targets) {
28
+ if (!graph.hasEdge(source, target)) {
29
+ graph.addEdge(source, target);
30
+ }
31
+ }
32
+ }
33
+ return graph;
34
+ }
35
+ /**
36
+ * Compute PageRank scores for all nodes.
37
+ */
38
+ export function computePageRank(graph, alpha = 0.85) {
39
+ const scores = pagerank(graph, { alpha, getEdgeWeight: null });
40
+ const result = new Map();
41
+ graph.forEachNode((node) => {
42
+ result.set(node, scores[node] ?? 0);
43
+ });
44
+ return result;
45
+ }
46
+ /**
47
+ * Detect communities using Louvain algorithm.
48
+ */
49
+ export function detectCommunities(graph) {
50
+ // Louvain needs undirected — create undirected copy
51
+ const undirected = new Graph({ type: "undirected", multi: false });
52
+ graph.forEachNode((node) => {
53
+ if (!undirected.hasNode(node))
54
+ undirected.addNode(node);
55
+ });
56
+ graph.forEachEdge((_edge, _attrs, source, target) => {
57
+ if (!undirected.hasNode(source))
58
+ undirected.addNode(source);
59
+ if (!undirected.hasNode(target))
60
+ undirected.addNode(target);
61
+ if (source !== target && !undirected.hasEdge(source, target)) {
62
+ undirected.addEdge(source, target);
63
+ }
64
+ });
65
+ const communities = louvain(undirected);
66
+ const result = new Map();
67
+ for (const [node, community] of Object.entries(communities)) {
68
+ result.set(node, community);
69
+ }
70
+ return result;
71
+ }
72
+ /**
73
+ * Find bridge notes: articulation points + high-degree hubs + map notes + cross-project connectors.
74
+ * Uses a simplified Tarjan's algorithm for articulation points.
75
+ */
76
+ export function findBridgeNotes(graph, noteIndex) {
77
+ const bridges = new Set();
78
+ // 1. Tarjan's algorithm for articulation points on undirected view
79
+ const visited = new Set();
80
+ const disc = new Map();
81
+ const low = new Map();
82
+ const parent = new Map();
83
+ let timer = 0;
84
+ function dfs(u) {
85
+ visited.add(u);
86
+ disc.set(u, timer);
87
+ low.set(u, timer);
88
+ timer++;
89
+ let children = 0;
90
+ // Get neighbors (both directions for undirected view)
91
+ const neighbors = new Set();
92
+ graph.forEachOutNeighbor(u, (n) => neighbors.add(n));
93
+ graph.forEachInNeighbor(u, (n) => neighbors.add(n));
94
+ for (const v of neighbors) {
95
+ if (!visited.has(v)) {
96
+ children++;
97
+ parent.set(v, u);
98
+ dfs(v);
99
+ low.set(u, Math.min(low.get(u), low.get(v)));
100
+ // u is an articulation point if:
101
+ // 1. u is root of DFS tree and has 2+ children
102
+ if (parent.get(u) === null && children > 1) {
103
+ bridges.add(u);
104
+ }
105
+ // 2. u is not root and low[v] >= disc[u]
106
+ if (parent.get(u) !== null && low.get(v) >= disc.get(u)) {
107
+ bridges.add(u);
108
+ }
109
+ }
110
+ else if (v !== parent.get(u)) {
111
+ low.set(u, Math.min(low.get(u), disc.get(v)));
112
+ }
113
+ }
114
+ }
115
+ graph.forEachNode((node) => {
116
+ if (!visited.has(node)) {
117
+ parent.set(node, null);
118
+ dfs(node);
119
+ }
120
+ });
121
+ // 2. High-degree hubs: in_degree > 2x median
122
+ const inDegrees = [];
123
+ graph.forEachNode((node) => {
124
+ inDegrees.push(graph.inDegree(node));
125
+ });
126
+ inDegrees.sort((a, b) => a - b);
127
+ const median = inDegrees.length > 0
128
+ ? inDegrees[Math.floor(inDegrees.length / 2)]
129
+ : 0;
130
+ const hubThreshold = median * 2;
131
+ graph.forEachNode((node) => {
132
+ if (graph.inDegree(node) > hubThreshold && hubThreshold > 0) {
133
+ bridges.add(node);
134
+ }
135
+ });
136
+ // 3. Map notes (title ends with " map")
137
+ graph.forEachNode((node) => {
138
+ if (node.endsWith(" map") || node === "index") {
139
+ bridges.add(node);
140
+ }
141
+ });
142
+ // 4. Cross-project connectors (2+ project tags AND in_degree >= 3)
143
+ if (noteIndex) {
144
+ for (const [title, fm] of noteIndex.frontmatter) {
145
+ const project = Array.isArray(fm.project) ? fm.project : [];
146
+ if (project.length >= 2 && graph.hasNode(title) && graph.inDegree(title) >= 3) {
147
+ bridges.add(title);
148
+ }
149
+ }
150
+ }
151
+ return bridges;
152
+ }
153
+ /**
154
+ * Compute betweenness centrality for all nodes.
155
+ */
156
+ export function computeBetweenness(graph) {
157
+ const scores = betweennessCentrality(graph);
158
+ const result = new Map();
159
+ graph.forEachNode((node) => {
160
+ result.set(node, scores[node] ?? 0);
161
+ });
162
+ return result;
163
+ }
164
+ /**
165
+ * Compute all graph metrics in one pass.
166
+ */
167
+ export function computeGraphMetrics(linkGraph, noteIndex) {
168
+ const graph = buildGraphologyGraph(linkGraph);
169
+ const pr = computePageRank(graph);
170
+ const communities = detectCommunities(graph);
171
+ const bridges = findBridgeNotes(graph, noteIndex);
172
+ const betweenness = computeBetweenness(graph);
173
+ // Build community stats
174
+ const communityStats = new Map();
175
+ for (const [node, communityId] of communities) {
176
+ if (!communityStats.has(communityId)) {
177
+ communityStats.set(communityId, { size: 0, members: [] });
178
+ }
179
+ const stat = communityStats.get(communityId);
180
+ stat.size++;
181
+ stat.members.push(node);
182
+ }
183
+ return { pagerank: pr, communities, bridges, betweenness, communityStats };
184
+ }
185
+ /**
186
+ * Personalized PageRank from seed nodes.
187
+ * Used for query-time graph traversal (Signal 3 in the retrieval pipeline).
188
+ */
189
+ export function personalizedPageRank(graph, seeds, alpha = 0.85, iterations = 20) {
190
+ const N = graph.order;
191
+ if (N === 0)
192
+ return new Map();
193
+ // Initialize: seed nodes get equal personalization weight
194
+ const personalization = new Map();
195
+ const validSeeds = seeds.filter((s) => graph.hasNode(s));
196
+ if (validSeeds.length === 0) {
197
+ // Fallback to uniform
198
+ graph.forEachNode((node) => personalization.set(node, 1 / N));
199
+ }
200
+ else {
201
+ graph.forEachNode((node) => personalization.set(node, 0));
202
+ for (const seed of validSeeds) {
203
+ personalization.set(seed, 1 / validSeeds.length);
204
+ }
205
+ }
206
+ // Power iteration
207
+ let scores = new Map(personalization);
208
+ for (let iter = 0; iter < iterations; iter++) {
209
+ const newScores = new Map();
210
+ graph.forEachNode((node) => newScores.set(node, 0));
211
+ graph.forEachNode((node) => {
212
+ const outDeg = graph.outDegree(node);
213
+ if (outDeg === 0)
214
+ return;
215
+ const share = (scores.get(node) ?? 0) / outDeg;
216
+ graph.forEachOutNeighbor(node, (neighbor) => {
217
+ newScores.set(neighbor, (newScores.get(neighbor) ?? 0) + share);
218
+ });
219
+ });
220
+ // Apply damping + personalization restart
221
+ graph.forEachNode((node) => {
222
+ const dampedScore = alpha * (newScores.get(node) ?? 0);
223
+ const restart = (1 - alpha) * (personalization.get(node) ?? 0);
224
+ newScores.set(node, dampedScore + restart);
225
+ });
226
+ scores = newScores;
227
+ }
228
+ return scores;
229
+ }
230
+ //# sourceMappingURL=importance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importance.js","sourceRoot":"","sources":["../../src/core/importance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export type QueryIntent = "episodic" | "procedural" | "semantic" | "decision";
2
+ export interface SpaceWeights {
3
+ text: number;
4
+ temporal: number;
5
+ vitality: number;
6
+ importance: number;
7
+ type: number;
8
+ community: number;
9
+ }
10
+ export interface SplitWeights {
11
+ title: number;
12
+ description: number;
13
+ body: number;
14
+ }
15
+ export interface ClassifiedQuery {
16
+ intent: QueryIntent;
17
+ confidence: number;
18
+ query: string;
19
+ entities: string[];
20
+ spaceWeights: SpaceWeights;
21
+ splitWeights: SplitWeights;
22
+ }
23
+ /**
24
+ * Classify query intent using heuristic pattern matching.
25
+ * Returns classified query with weight profiles for the retrieval engine.
26
+ */
27
+ export declare function classifyIntent(query: string, noteIndex?: string[]): ClassifiedQuery;
28
+ /**
29
+ * Get space weight profile for a given intent.
30
+ */
31
+ export declare function getSpaceWeights(intent: QueryIntent): SpaceWeights;
32
+ /**
33
+ * Get split vector weight profile for a given intent.
34
+ */
35
+ export declare function getSplitWeights(intent: QueryIntent): SplitWeights;
36
+ //# sourceMappingURL=intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../src/core/intent.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;CAC5B;AA8ED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAM,EAAO,GACvB,eAAe,CAuBjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAEjE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAEjE"}
@@ -0,0 +1,108 @@
1
+ const INTENT_PATTERNS = [
2
+ {
3
+ intent: "episodic",
4
+ patterns: [
5
+ /\bwhen\s+did\b/i,
6
+ /\blast\s+time\b/i,
7
+ /\bwhat\s+happened\b/i,
8
+ /\brecently\b/i,
9
+ /\bhistory\s+of\b/i,
10
+ /\btimeline\b/i,
11
+ /\bwhen\s+was\b/i,
12
+ /\bremember\s+when\b/i,
13
+ ],
14
+ },
15
+ {
16
+ intent: "procedural",
17
+ patterns: [
18
+ /\bhow\s+to\b/i,
19
+ /\bsteps?\s+for\b/i,
20
+ /\bprocess\b/i,
21
+ /\bprocedure\b/i,
22
+ /\binstructions?\b/i,
23
+ /\bworkflow\b/i,
24
+ /\bhow\s+do\b/i,
25
+ /\bguide\b/i,
26
+ ],
27
+ },
28
+ {
29
+ intent: "decision",
30
+ patterns: [
31
+ /\bwhy\s+did\s+we\b/i,
32
+ /\bdecision\b/i,
33
+ /\bchose\b/i,
34
+ /\bchoose\b/i,
35
+ /\balternatives?\b/i,
36
+ /\btrade-?off\b/i,
37
+ /\brationale\b/i,
38
+ /\bdecided\b/i,
39
+ ],
40
+ },
41
+ // semantic is the default — no specific patterns needed
42
+ ];
43
+ const SPACE_WEIGHTS = {
44
+ episodic: { text: 0.40, temporal: 0.25, vitality: 0.15, importance: 0.05, type: 0.05, community: 0.10 },
45
+ procedural: { text: 0.30, temporal: 0.05, vitality: 0.10, importance: 0.30, type: 0.10, community: 0.15 },
46
+ semantic: { text: 0.65, temporal: 0.05, vitality: 0.10, importance: 0.10, type: 0.05, community: 0.05 },
47
+ decision: { text: 0.30, temporal: 0.15, vitality: 0.10, importance: 0.10, type: 0.30, community: 0.05 },
48
+ };
49
+ const SPLIT_WEIGHTS = {
50
+ semantic: { title: 0.5, description: 0.3, body: 0.2 },
51
+ episodic: { title: 0.2, description: 0.2, body: 0.6 },
52
+ decision: { title: 0.4, description: 0.4, body: 0.2 },
53
+ procedural: { title: 0.3, description: 0.3, body: 0.4 },
54
+ };
55
+ /**
56
+ * Extract note title entities from query by fuzzy matching against known titles.
57
+ */
58
+ function extractEntities(query, noteIndex) {
59
+ const queryLower = query.toLowerCase();
60
+ const entities = [];
61
+ for (const title of noteIndex) {
62
+ const titleLower = title.toLowerCase();
63
+ // Direct substring match
64
+ if (queryLower.includes(titleLower) && titleLower.length >= 3) {
65
+ entities.push(title);
66
+ }
67
+ }
68
+ // Sort by length descending (prefer longer/more specific matches)
69
+ return entities.sort((a, b) => b.length - a.length);
70
+ }
71
+ /**
72
+ * Classify query intent using heuristic pattern matching.
73
+ * Returns classified query with weight profiles for the retrieval engine.
74
+ */
75
+ export function classifyIntent(query, noteIndex = []) {
76
+ let bestIntent = "semantic"; // default
77
+ let bestScore = 0;
78
+ for (const { intent, patterns } of INTENT_PATTERNS) {
79
+ const matchCount = patterns.filter((p) => p.test(query)).length;
80
+ if (matchCount > bestScore) {
81
+ bestScore = matchCount;
82
+ bestIntent = intent;
83
+ }
84
+ }
85
+ const confidence = bestScore >= 2 ? 1.0 : bestScore === 1 ? 0.7 : 0.5;
86
+ const entities = extractEntities(query, noteIndex);
87
+ return {
88
+ intent: bestIntent,
89
+ confidence,
90
+ query,
91
+ entities,
92
+ spaceWeights: SPACE_WEIGHTS[bestIntent],
93
+ splitWeights: SPLIT_WEIGHTS[bestIntent],
94
+ };
95
+ }
96
+ /**
97
+ * Get space weight profile for a given intent.
98
+ */
99
+ export function getSpaceWeights(intent) {
100
+ return SPACE_WEIGHTS[intent];
101
+ }
102
+ /**
103
+ * Get split vector weight profile for a given intent.
104
+ */
105
+ export function getSplitWeights(intent) {
106
+ return SPLIT_WEIGHTS[intent];
107
+ }
108
+ //# sourceMappingURL=intent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent.js","sourceRoot":"","sources":["../../src/core/intent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { LinkGraph } from "./graph.js";
2
+ export type DetectedLink = {
3
+ title: string;
4
+ offset: number;
5
+ length: number;
6
+ alreadyLinked: boolean;
7
+ };
8
+ export type LinkSuggestion = {
9
+ title: string;
10
+ reason: "title-match" | "tag-overlap" | "project-overlap" | "shared-neighborhood";
11
+ confidence: number;
12
+ };
13
+ export type VaultIndex = {
14
+ titles: string[];
15
+ frontmatter: Map<string, Record<string, unknown>>;
16
+ graph: LinkGraph;
17
+ };
18
+ /**
19
+ * Scan body text for mentions of existing note titles.
20
+ * Returns detected mentions sorted by offset.
21
+ * Skips mentions already wrapped in [[]].
22
+ */
23
+ export declare function detectLinks(body: string, existingTitles: string[]): DetectedLink[];
24
+ /**
25
+ * Apply detected links to body text, wrapping unlinked mentions in [[]].
26
+ * Processes from end to start to preserve offsets.
27
+ */
28
+ export declare function applyLinks(body: string, links: DetectedLink[]): string;
29
+ /**
30
+ * Suggest structural connections via graph heuristics.
31
+ * No LLM — pure computation over vault metadata and link graph.
32
+ */
33
+ export declare function suggestLinks(frontmatter: Record<string, unknown>, body: string, vaultIndex: VaultIndex): LinkSuggestion[];
34
+ //# sourceMappingURL=linkdetect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkdetect.d.ts","sourceRoot":"","sources":["../../src/core/linkdetect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EACF,aAAa,GACb,aAAa,GACb,iBAAiB,GACjB,qBAAqB,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,KAAK,EAAE,SAAS,CAAC;CAClB,CAAC;AAuCF;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EAAE,GACvB,YAAY,EAAE,CAoChB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CAatE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,UAAU,GACrB,cAAc,EAAE,CA2FlB"}