@soleri/core 2.11.0 → 7.0.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 (255) hide show
  1. package/data/flows/build.flow.yaml +128 -0
  2. package/data/flows/deliver.flow.yaml +110 -0
  3. package/data/flows/design.flow.yaml +108 -0
  4. package/data/flows/enhance.flow.yaml +90 -0
  5. package/data/flows/explore.flow.yaml +84 -0
  6. package/data/flows/fix.flow.yaml +90 -0
  7. package/data/flows/plan.flow.yaml +87 -0
  8. package/data/flows/review.flow.yaml +90 -0
  9. package/dist/brain/brain.d.ts.map +1 -1
  10. package/dist/brain/brain.js +10 -0
  11. package/dist/brain/brain.js.map +1 -1
  12. package/dist/brain/intelligence.d.ts.map +1 -1
  13. package/dist/brain/intelligence.js +16 -2
  14. package/dist/brain/intelligence.js.map +1 -1
  15. package/dist/capabilities/chain-mapping.d.ts +21 -0
  16. package/dist/capabilities/chain-mapping.d.ts.map +1 -0
  17. package/dist/capabilities/chain-mapping.js +86 -0
  18. package/dist/capabilities/chain-mapping.js.map +1 -0
  19. package/dist/capabilities/index.d.ts +10 -0
  20. package/dist/capabilities/index.d.ts.map +1 -0
  21. package/dist/capabilities/index.js +8 -0
  22. package/dist/capabilities/index.js.map +1 -0
  23. package/dist/capabilities/registry.d.ts +95 -0
  24. package/dist/capabilities/registry.d.ts.map +1 -0
  25. package/dist/capabilities/registry.js +227 -0
  26. package/dist/capabilities/registry.js.map +1 -0
  27. package/dist/capabilities/types.d.ts +106 -0
  28. package/dist/capabilities/types.d.ts.map +1 -0
  29. package/dist/capabilities/types.js +12 -0
  30. package/dist/capabilities/types.js.map +1 -0
  31. package/dist/control/intent-router.d.ts.map +1 -1
  32. package/dist/control/intent-router.js +58 -2
  33. package/dist/control/intent-router.js.map +1 -1
  34. package/dist/domain-packs/index.d.ts +8 -0
  35. package/dist/domain-packs/index.d.ts.map +1 -0
  36. package/dist/domain-packs/index.js +8 -0
  37. package/dist/domain-packs/index.js.map +1 -0
  38. package/dist/domain-packs/inject-rules.d.ts +24 -0
  39. package/dist/domain-packs/inject-rules.d.ts.map +1 -0
  40. package/dist/domain-packs/inject-rules.js +65 -0
  41. package/dist/domain-packs/inject-rules.js.map +1 -0
  42. package/dist/domain-packs/knowledge-installer.d.ts +27 -0
  43. package/dist/domain-packs/knowledge-installer.d.ts.map +1 -0
  44. package/dist/domain-packs/knowledge-installer.js +89 -0
  45. package/dist/domain-packs/knowledge-installer.js.map +1 -0
  46. package/dist/domain-packs/loader.d.ts +28 -0
  47. package/dist/domain-packs/loader.d.ts.map +1 -0
  48. package/dist/domain-packs/loader.js +105 -0
  49. package/dist/domain-packs/loader.js.map +1 -0
  50. package/dist/domain-packs/pack-runtime.d.ts +80 -0
  51. package/dist/domain-packs/pack-runtime.d.ts.map +1 -0
  52. package/dist/domain-packs/pack-runtime.js +36 -0
  53. package/dist/domain-packs/pack-runtime.js.map +1 -0
  54. package/dist/domain-packs/skills-installer.d.ts +21 -0
  55. package/dist/domain-packs/skills-installer.d.ts.map +1 -0
  56. package/dist/domain-packs/skills-installer.js +38 -0
  57. package/dist/domain-packs/skills-installer.js.map +1 -0
  58. package/dist/domain-packs/token-resolver.d.ts +37 -0
  59. package/dist/domain-packs/token-resolver.d.ts.map +1 -0
  60. package/dist/domain-packs/token-resolver.js +109 -0
  61. package/dist/domain-packs/token-resolver.js.map +1 -0
  62. package/dist/domain-packs/types.d.ts +91 -0
  63. package/dist/domain-packs/types.d.ts.map +1 -0
  64. package/dist/domain-packs/types.js +122 -0
  65. package/dist/domain-packs/types.js.map +1 -0
  66. package/dist/engine/bin/soleri-engine.d.ts +12 -0
  67. package/dist/engine/bin/soleri-engine.d.ts.map +1 -0
  68. package/dist/engine/bin/soleri-engine.js +183 -0
  69. package/dist/engine/bin/soleri-engine.js.map +1 -0
  70. package/dist/engine/core-ops.d.ts +27 -0
  71. package/dist/engine/core-ops.d.ts.map +1 -0
  72. package/dist/engine/core-ops.js +159 -0
  73. package/dist/engine/core-ops.js.map +1 -0
  74. package/dist/engine/index.d.ts +19 -0
  75. package/dist/engine/index.d.ts.map +1 -0
  76. package/dist/engine/index.js +17 -0
  77. package/dist/engine/index.js.map +1 -0
  78. package/dist/engine/register-engine.d.ts +54 -0
  79. package/dist/engine/register-engine.d.ts.map +1 -0
  80. package/dist/engine/register-engine.js +270 -0
  81. package/dist/engine/register-engine.js.map +1 -0
  82. package/dist/engine/test-helpers.d.ts +30 -0
  83. package/dist/engine/test-helpers.d.ts.map +1 -0
  84. package/dist/engine/test-helpers.js +59 -0
  85. package/dist/engine/test-helpers.js.map +1 -0
  86. package/dist/flows/context-router.d.ts +39 -0
  87. package/dist/flows/context-router.d.ts.map +1 -0
  88. package/dist/flows/context-router.js +206 -0
  89. package/dist/flows/context-router.js.map +1 -0
  90. package/dist/flows/dispatch-registry.d.ts +24 -0
  91. package/dist/flows/dispatch-registry.d.ts.map +1 -0
  92. package/dist/flows/dispatch-registry.js +70 -0
  93. package/dist/flows/dispatch-registry.js.map +1 -0
  94. package/dist/flows/epilogue.d.ts +24 -0
  95. package/dist/flows/epilogue.d.ts.map +1 -0
  96. package/dist/flows/epilogue.js +52 -0
  97. package/dist/flows/epilogue.js.map +1 -0
  98. package/dist/flows/executor.d.ts +25 -0
  99. package/dist/flows/executor.d.ts.map +1 -0
  100. package/dist/flows/executor.js +153 -0
  101. package/dist/flows/executor.js.map +1 -0
  102. package/dist/flows/gate-evaluator.d.ts +26 -0
  103. package/dist/flows/gate-evaluator.d.ts.map +1 -0
  104. package/dist/flows/gate-evaluator.js +162 -0
  105. package/dist/flows/gate-evaluator.js.map +1 -0
  106. package/dist/flows/index.d.ts +14 -0
  107. package/dist/flows/index.d.ts.map +1 -0
  108. package/dist/flows/index.js +20 -0
  109. package/dist/flows/index.js.map +1 -0
  110. package/dist/flows/loader.d.ts +17 -0
  111. package/dist/flows/loader.d.ts.map +1 -0
  112. package/dist/flows/loader.js +61 -0
  113. package/dist/flows/loader.js.map +1 -0
  114. package/dist/flows/plan-builder.d.ts +40 -0
  115. package/dist/flows/plan-builder.d.ts.map +1 -0
  116. package/dist/flows/plan-builder.js +213 -0
  117. package/dist/flows/plan-builder.js.map +1 -0
  118. package/dist/flows/probes.d.ts +11 -0
  119. package/dist/flows/probes.d.ts.map +1 -0
  120. package/dist/flows/probes.js +62 -0
  121. package/dist/flows/probes.js.map +1 -0
  122. package/dist/flows/types.d.ts +950 -0
  123. package/dist/flows/types.d.ts.map +1 -0
  124. package/dist/flows/types.js +105 -0
  125. package/dist/flows/types.js.map +1 -0
  126. package/dist/index.d.ts +11 -1
  127. package/dist/index.d.ts.map +1 -1
  128. package/dist/index.js +10 -1
  129. package/dist/index.js.map +1 -1
  130. package/dist/intelligence/loader.d.ts +19 -0
  131. package/dist/intelligence/loader.d.ts.map +1 -1
  132. package/dist/intelligence/loader.js +86 -5
  133. package/dist/intelligence/loader.js.map +1 -1
  134. package/dist/intelligence/types.d.ts +1 -0
  135. package/dist/intelligence/types.d.ts.map +1 -1
  136. package/dist/packs/types.d.ts +58 -19
  137. package/dist/packs/types.d.ts.map +1 -1
  138. package/dist/packs/types.js +14 -0
  139. package/dist/packs/types.js.map +1 -1
  140. package/dist/playbooks/generic/onboarding.d.ts +9 -0
  141. package/dist/playbooks/generic/onboarding.d.ts.map +1 -0
  142. package/dist/playbooks/generic/onboarding.js +74 -0
  143. package/dist/playbooks/generic/onboarding.js.map +1 -0
  144. package/dist/playbooks/playbook-registry.d.ts.map +1 -1
  145. package/dist/playbooks/playbook-registry.js +2 -0
  146. package/dist/playbooks/playbook-registry.js.map +1 -1
  147. package/dist/runtime/admin-extra-ops.d.ts.map +1 -1
  148. package/dist/runtime/admin-extra-ops.js +15 -9
  149. package/dist/runtime/admin-extra-ops.js.map +1 -1
  150. package/dist/runtime/admin-ops.js +4 -4
  151. package/dist/runtime/admin-ops.js.map +1 -1
  152. package/dist/runtime/capture-ops.d.ts.map +1 -1
  153. package/dist/runtime/capture-ops.js +33 -1
  154. package/dist/runtime/capture-ops.js.map +1 -1
  155. package/dist/runtime/domain-ops.d.ts +21 -5
  156. package/dist/runtime/domain-ops.d.ts.map +1 -1
  157. package/dist/runtime/domain-ops.js +85 -8
  158. package/dist/runtime/domain-ops.js.map +1 -1
  159. package/dist/runtime/facades/cognee-facade.d.ts.map +1 -1
  160. package/dist/runtime/facades/cognee-facade.js +3 -1
  161. package/dist/runtime/facades/cognee-facade.js.map +1 -1
  162. package/dist/runtime/facades/index.d.ts.map +1 -1
  163. package/dist/runtime/facades/index.js +10 -6
  164. package/dist/runtime/facades/index.js.map +1 -1
  165. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  166. package/dist/runtime/facades/vault-facade.js +2 -0
  167. package/dist/runtime/facades/vault-facade.js.map +1 -1
  168. package/dist/runtime/orchestrate-ops.d.ts +8 -7
  169. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  170. package/dist/runtime/orchestrate-ops.js +227 -58
  171. package/dist/runtime/orchestrate-ops.js.map +1 -1
  172. package/dist/runtime/runtime.d.ts.map +1 -1
  173. package/dist/runtime/runtime.js +23 -17
  174. package/dist/runtime/runtime.js.map +1 -1
  175. package/dist/runtime/types.d.ts +6 -2
  176. package/dist/runtime/types.d.ts.map +1 -1
  177. package/dist/runtime/vault-linking-ops.d.ts +13 -0
  178. package/dist/runtime/vault-linking-ops.d.ts.map +1 -0
  179. package/dist/runtime/vault-linking-ops.js +367 -0
  180. package/dist/runtime/vault-linking-ops.js.map +1 -0
  181. package/dist/vault/linking.d.ts +46 -0
  182. package/dist/vault/linking.d.ts.map +1 -0
  183. package/dist/vault/linking.js +275 -0
  184. package/dist/vault/linking.js.map +1 -0
  185. package/dist/vault/vault-types.d.ts +37 -0
  186. package/dist/vault/vault-types.d.ts.map +1 -1
  187. package/dist/vault/vault.d.ts +12 -0
  188. package/dist/vault/vault.d.ts.map +1 -1
  189. package/dist/vault/vault.js +85 -6
  190. package/dist/vault/vault.js.map +1 -1
  191. package/package.json +4 -1
  192. package/src/__tests__/admin-extra-ops.test.ts +1 -1
  193. package/src/__tests__/admin-ops.test.ts +2 -1
  194. package/src/__tests__/cognee-client-gaps.test.ts +470 -0
  195. package/src/__tests__/cognee-hybrid-search.test.ts +478 -0
  196. package/src/__tests__/cognee-sync-manager-deep.test.ts +630 -0
  197. package/src/__tests__/cognee-sync-manager.test.ts +1 -0
  198. package/src/__tests__/core-ops.test.ts +9 -61
  199. package/src/__tests__/domain-packs.test.ts +421 -0
  200. package/src/__tests__/flows.test.ts +604 -0
  201. package/src/__tests__/playbook-registry.test.ts +2 -2
  202. package/src/__tests__/playbook-seeder.test.ts +8 -8
  203. package/src/__tests__/playbook.test.ts +5 -5
  204. package/src/__tests__/token-resolver.test.ts +79 -0
  205. package/src/brain/brain.ts +12 -0
  206. package/src/brain/intelligence.ts +21 -2
  207. package/src/capabilities/chain-mapping.ts +93 -0
  208. package/src/capabilities/index.ts +21 -0
  209. package/src/capabilities/registry.ts +290 -0
  210. package/src/capabilities/types.ts +143 -0
  211. package/src/control/intent-router.ts +46 -2
  212. package/src/domain-packs/index.ts +27 -0
  213. package/src/domain-packs/inject-rules.ts +74 -0
  214. package/src/domain-packs/knowledge-installer.ts +116 -0
  215. package/src/domain-packs/loader.ts +124 -0
  216. package/src/domain-packs/pack-runtime.ts +99 -0
  217. package/src/domain-packs/skills-installer.ts +56 -0
  218. package/src/domain-packs/token-resolver.ts +126 -0
  219. package/src/domain-packs/types.ts +229 -0
  220. package/src/engine/__tests__/register-engine.test.ts +104 -0
  221. package/src/engine/bin/soleri-engine.ts +217 -0
  222. package/src/engine/core-ops.ts +178 -0
  223. package/src/engine/index.ts +19 -0
  224. package/src/engine/register-engine.ts +385 -0
  225. package/src/engine/test-helpers.ts +83 -0
  226. package/src/flows/context-router.ts +257 -0
  227. package/src/flows/dispatch-registry.ts +80 -0
  228. package/src/flows/epilogue.ts +65 -0
  229. package/src/flows/executor.ts +182 -0
  230. package/src/flows/gate-evaluator.ts +171 -0
  231. package/src/flows/index.ts +52 -0
  232. package/src/flows/loader.ts +63 -0
  233. package/src/flows/plan-builder.ts +250 -0
  234. package/src/flows/probes.ts +70 -0
  235. package/src/flows/types.ts +217 -0
  236. package/src/index.ts +68 -1
  237. package/src/intelligence/loader.ts +96 -5
  238. package/src/intelligence/types.ts +1 -0
  239. package/src/packs/types.ts +19 -0
  240. package/src/playbooks/generic/onboarding.ts +79 -0
  241. package/src/playbooks/playbook-registry.ts +2 -0
  242. package/src/runtime/admin-extra-ops.ts +14 -8
  243. package/src/runtime/admin-ops.ts +4 -4
  244. package/src/runtime/capture-ops.ts +40 -1
  245. package/src/runtime/domain-ops.ts +92 -7
  246. package/src/runtime/facades/cognee-facade.ts +3 -1
  247. package/src/runtime/facades/index.ts +12 -6
  248. package/src/runtime/facades/vault-facade.ts +2 -0
  249. package/src/runtime/orchestrate-ops.ts +271 -62
  250. package/src/runtime/runtime.ts +27 -18
  251. package/src/runtime/types.ts +6 -2
  252. package/src/runtime/vault-linking-ops.ts +454 -0
  253. package/src/vault/linking.ts +333 -0
  254. package/src/vault/vault-types.ts +46 -0
  255. package/src/vault/vault.ts +94 -7
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Vault linking ops — Zettelkasten bidirectional linking.
3
+ *
4
+ * Provides 8 ops: link_entries, unlink_entries, get_links, traverse,
5
+ * suggest_links, get_orphans, relink_vault, link_stats.
6
+ * Ported from Salvador MCP with improvements:
7
+ * - FTS5 for suggest_links (Salvador uses TF-IDF)
8
+ * - relink_vault: LLM-evaluated batch re-linking (Salvador uses a separate script)
9
+ */
10
+ import type { OpDefinition } from '../facades/types.js';
11
+ import type { AgentRuntime } from './types.js';
12
+ export declare function createVaultLinkingOps(runtime: AgentRuntime): OpDefinition[];
13
+ //# sourceMappingURL=vault-linking-ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-linking-ops.d.ts","sourceRoot":"","sources":["../../src/runtime/vault-linking-ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAe/C,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,EAAE,CA0a3E"}
@@ -0,0 +1,367 @@
1
+ /**
2
+ * Vault linking ops — Zettelkasten bidirectional linking.
3
+ *
4
+ * Provides 8 ops: link_entries, unlink_entries, get_links, traverse,
5
+ * suggest_links, get_orphans, relink_vault, link_stats.
6
+ * Ported from Salvador MCP with improvements:
7
+ * - FTS5 for suggest_links (Salvador uses TF-IDF)
8
+ * - relink_vault: LLM-evaluated batch re-linking (Salvador uses a separate script)
9
+ */
10
+ import { z } from 'zod';
11
+ import { LinkManager } from '../vault/linking.js';
12
+ const EVAL_SYSTEM_PROMPT = `You evaluate pairs of knowledge entries to determine if they should be linked in a Zettelkasten vault. For EACH pair, decide:
13
+ - If meaningfully related → return { "link": true, "type": "<type>", "note": "<1 sentence why>" }
14
+ - If NOT meaningfully related → return { "link": false }
15
+
16
+ Link types:
17
+ - "extends" — target builds on or refines the source
18
+ - "supports" — target provides evidence or foundation for the source
19
+ - "contradicts" — target is an opposing approach or counterpoint
20
+ - "sequences" — source must happen before target
21
+
22
+ Rules: Same category alone is NOT enough. Be selective. Return a JSON array.`;
23
+ export function createVaultLinkingOps(runtime) {
24
+ const { vault } = runtime;
25
+ const linkManager = new LinkManager(vault.getProvider());
26
+ return [
27
+ {
28
+ name: 'link_entries',
29
+ description: 'Create a typed link between two vault entries (Zettelkasten)',
30
+ auth: 'write',
31
+ schema: z.object({
32
+ sourceId: z.string().describe('REQUIRED: Source entry ID'),
33
+ targetId: z.string().describe('REQUIRED: Target entry ID'),
34
+ linkType: z
35
+ .enum(['supports', 'contradicts', 'extends', 'sequences'])
36
+ .describe('REQUIRED: Relationship type'),
37
+ note: z.string().optional().describe('Optional context for the link'),
38
+ }),
39
+ handler: async (params) => {
40
+ const sourceId = params.sourceId;
41
+ const targetId = params.targetId;
42
+ // Validate both entries exist to prevent dangling links
43
+ const provider = vault.getProvider();
44
+ const sourceExists = provider.get('SELECT id FROM entries WHERE id = ?', [
45
+ sourceId,
46
+ ]);
47
+ const targetExists = provider.get('SELECT id FROM entries WHERE id = ?', [
48
+ targetId,
49
+ ]);
50
+ if (!sourceExists || !targetExists) {
51
+ const missing = [];
52
+ if (!sourceExists)
53
+ missing.push(`source '${sourceId}'`);
54
+ if (!targetExists)
55
+ missing.push(`target '${targetId}'`);
56
+ throw new Error(`Entry not found: ${missing.join(' and ')}`);
57
+ }
58
+ linkManager.addLink(sourceId, targetId, params.linkType, params.note);
59
+ return {
60
+ success: true,
61
+ link: {
62
+ sourceId,
63
+ targetId,
64
+ linkType: params.linkType,
65
+ note: params.note,
66
+ },
67
+ sourceLinkCount: linkManager.getLinkCount(sourceId),
68
+ };
69
+ },
70
+ },
71
+ {
72
+ name: 'unlink_entries',
73
+ description: 'Remove a link between two vault entries',
74
+ auth: 'write',
75
+ schema: z.object({
76
+ sourceId: z.string().describe('REQUIRED: Source entry ID'),
77
+ targetId: z.string().describe('REQUIRED: Target entry ID'),
78
+ }),
79
+ handler: async (params) => {
80
+ linkManager.removeLink(params.sourceId, params.targetId);
81
+ return { success: true, removed: { sourceId: params.sourceId, targetId: params.targetId } };
82
+ },
83
+ },
84
+ {
85
+ name: 'get_links',
86
+ description: 'Get all links for a vault entry (outgoing + incoming backlinks)',
87
+ auth: 'read',
88
+ schema: z.object({
89
+ entryId: z.string().describe('REQUIRED: Entry ID'),
90
+ }),
91
+ handler: async (params) => {
92
+ const entryId = params.entryId;
93
+ const outgoing = linkManager.getLinks(entryId);
94
+ const incoming = linkManager.getBacklinks(entryId);
95
+ return { entryId, outgoing, incoming, totalLinks: outgoing.length + incoming.length };
96
+ },
97
+ },
98
+ {
99
+ name: 'traverse',
100
+ description: 'Walk the link graph from an entry up to N hops deep (Zettelkasten graph traversal)',
101
+ auth: 'read',
102
+ schema: z.object({
103
+ entryId: z.string().describe('REQUIRED: Starting entry ID'),
104
+ depth: z.coerce
105
+ .number()
106
+ .int()
107
+ .min(1)
108
+ .max(5)
109
+ .default(2)
110
+ .describe('Max hops (1-5, default 2)'),
111
+ }),
112
+ handler: async (params) => {
113
+ const entryId = params.entryId;
114
+ const depth = params.depth || 2;
115
+ const connected = linkManager.traverse(entryId, depth);
116
+ return { entryId, depth, connectedEntries: connected, totalConnected: connected.length };
117
+ },
118
+ },
119
+ {
120
+ name: 'suggest_links',
121
+ description: 'Find semantically similar entries as link candidates using FTS5 (Zettelkasten auto-linking)',
122
+ auth: 'read',
123
+ schema: z.object({
124
+ entryId: z.string().describe('REQUIRED: Entry ID to find link candidates for'),
125
+ limit: z.coerce
126
+ .number()
127
+ .int()
128
+ .min(1)
129
+ .max(20)
130
+ .default(5)
131
+ .describe('Max suggestions (default 5)'),
132
+ }),
133
+ handler: async (params) => {
134
+ const entryId = params.entryId;
135
+ const limit = params.limit || 5;
136
+ const suggestions = linkManager.suggestLinks(entryId, limit);
137
+ return { entryId, suggestions, totalSuggestions: suggestions.length };
138
+ },
139
+ },
140
+ {
141
+ name: 'get_orphans',
142
+ description: 'Find vault entries with zero links (Zettelkasten orphan detection)',
143
+ auth: 'read',
144
+ schema: z.object({
145
+ limit: z.coerce
146
+ .number()
147
+ .int()
148
+ .min(1)
149
+ .max(100)
150
+ .default(20)
151
+ .describe('Max orphans (default 20)'),
152
+ }),
153
+ handler: async (params) => {
154
+ const limit = params.limit || 20;
155
+ const orphans = linkManager.getOrphans(limit);
156
+ return { orphans, totalOrphans: orphans.length };
157
+ },
158
+ },
159
+ {
160
+ name: 'relink_vault',
161
+ description: 'Smart Zettelkasten re-linking: drops batch links, evaluates all entries with LLM, creates quality links with reasoning notes. Long-running operation.',
162
+ auth: 'write',
163
+ schema: z.object({
164
+ batchSize: z.coerce
165
+ .number()
166
+ .int()
167
+ .min(1)
168
+ .max(20)
169
+ .default(10)
170
+ .describe('Pairs per LLM call (default 10)'),
171
+ limit: z.coerce
172
+ .number()
173
+ .int()
174
+ .min(0)
175
+ .max(5000)
176
+ .default(0)
177
+ .describe('Max entries to process (0 = all)'),
178
+ dryRun: z.boolean().optional().default(false).describe('Preview without changes'),
179
+ }),
180
+ handler: async (params) => {
181
+ const batchSize = params.batchSize || 10;
182
+ const limit = params.limit || 0;
183
+ const dryRun = params.dryRun ?? false;
184
+ const { llmClient } = runtime;
185
+ if (!llmClient.isAvailable().anthropic && !llmClient.isAvailable().openai) {
186
+ return { success: false, error: 'No LLM provider available for link evaluation' };
187
+ }
188
+ const provider = vault.getProvider();
189
+ // Phase 1: Preserve manual links, drop batch links
190
+ const manualCount = provider.get("SELECT COUNT(*) as c FROM vault_links WHERE note IS NOT NULL AND note != ''")?.c ?? 0;
191
+ const batchCount = provider.get("SELECT COUNT(*) as c FROM vault_links WHERE note IS NULL OR note = ''")?.c ?? 0;
192
+ if (!dryRun) {
193
+ provider.run("DELETE FROM vault_links WHERE note IS NULL OR note = ''");
194
+ }
195
+ // Phase 2: Get entries and generate candidates
196
+ let entries = provider.all('SELECT id, title, type, description FROM entries ORDER BY updated_at DESC');
197
+ if (limit > 0)
198
+ entries = entries.slice(0, limit);
199
+ // Build candidates via tag overlap + category match
200
+ const candidates = [];
201
+ for (const entry of entries) {
202
+ const existingLinks = new Set([
203
+ ...linkManager.getLinks(entry.id).map((l) => l.targetId),
204
+ ...linkManager.getBacklinks(entry.id).map((l) => l.sourceId),
205
+ ]);
206
+ // Tag overlap matches
207
+ const matches = provider.all(`SELECT DISTINCT e.id, e.title, e.type, SUBSTR(e.description, 1, 200) as description
208
+ FROM entries e
209
+ JOIN (SELECT entry_id, tag FROM vault_tags WHERE entry_id = ?) src_tags ON 1=1
210
+ JOIN vault_tags t ON t.tag = src_tags.tag AND t.entry_id = e.id
211
+ WHERE e.id != ?
212
+ GROUP BY e.id ORDER BY COUNT(*) DESC LIMIT 5`, [entry.id, entry.id]);
213
+ // Fallback: category match
214
+ if (matches.length < 3) {
215
+ try {
216
+ const existing = new Set(matches.map((m) => m.id));
217
+ const catMatches = provider.all(`SELECT id, title, type, SUBSTR(description, 1, 200) as description
218
+ FROM entries WHERE id != ? AND type = ? LIMIT 3`, [entry.id, entry.type]);
219
+ for (const m of catMatches) {
220
+ if (!existing.has(m.id))
221
+ matches.push(m);
222
+ }
223
+ }
224
+ catch {
225
+ /* ignore */
226
+ }
227
+ }
228
+ for (const match of matches.slice(0, 5)) {
229
+ if (existingLinks.has(match.id))
230
+ continue;
231
+ candidates.push({
232
+ sourceId: entry.id,
233
+ sourceTitle: entry.title,
234
+ sourceType: entry.type,
235
+ sourceDesc: (entry.description || '').slice(0, 200),
236
+ targetId: match.id,
237
+ targetTitle: match.title,
238
+ targetType: match.type,
239
+ targetDesc: (match.description || '').slice(0, 200),
240
+ });
241
+ }
242
+ }
243
+ if (dryRun) {
244
+ return {
245
+ dryRun: true,
246
+ entries: entries.length,
247
+ candidates: candidates.length,
248
+ llmCallsNeeded: Math.ceil(candidates.length / batchSize),
249
+ manualLinksPreserved: manualCount,
250
+ batchLinksToRemove: batchCount,
251
+ };
252
+ }
253
+ // Phase 3: LLM evaluation in batches (sequential to respect rate limits)
254
+ let linksCreated = 0;
255
+ let pairsSkipped = 0;
256
+ let llmCalls = 0;
257
+ let errors = 0;
258
+ const now = Date.now();
259
+ // Build batches
260
+ const batches = [];
261
+ for (let i = 0; i < candidates.length; i += batchSize) {
262
+ batches.push(candidates.slice(i, i + batchSize));
263
+ }
264
+ // Process sequentially using reduce chain (avoids await-in-loop lint)
265
+ await batches.reduce(async (prev, batch) => {
266
+ await prev;
267
+ const pairsText = batch
268
+ .map((p, idx) => `--- Pair ${idx + 1} ---\nSOURCE [${p.sourceType}]: ${p.sourceTitle}\n${p.sourceDesc}\n\nTARGET [${p.targetType}]: ${p.targetTitle}\n${p.targetDesc}`)
269
+ .join('\n\n');
270
+ try {
271
+ const result = await llmClient.complete({
272
+ provider: llmClient.isAvailable().anthropic ? 'anthropic' : 'openai',
273
+ model: llmClient.isAvailable().anthropic ? 'claude-sonnet-4-20250514' : 'gpt-4o-mini',
274
+ systemPrompt: EVAL_SYSTEM_PROMPT,
275
+ userPrompt: pairsText,
276
+ maxTokens: 2000,
277
+ caller: 'relink_vault',
278
+ task: 'link-evaluation',
279
+ });
280
+ llmCalls++;
281
+ let cleaned = result.text.trim();
282
+ if (cleaned.startsWith('```')) {
283
+ const first = cleaned.indexOf('\n');
284
+ const last = cleaned.lastIndexOf('```');
285
+ cleaned = cleaned.slice(first + 1, last).trim();
286
+ }
287
+ const decisions = JSON.parse(cleaned);
288
+ for (let j = 0; j < decisions.length && j < batch.length; j++) {
289
+ const d = decisions[j];
290
+ if (d.link && d.type && d.note) {
291
+ if (batch[j].sourceId === batch[j].targetId)
292
+ continue;
293
+ try {
294
+ provider.run('INSERT OR IGNORE INTO vault_links (source_id, target_id, link_type, note, created_at) VALUES (?, ?, ?, ?, ?)', [batch[j].sourceId, batch[j].targetId, d.type, d.note, now]);
295
+ linksCreated++;
296
+ }
297
+ catch {
298
+ /* FK or duplicate */
299
+ }
300
+ }
301
+ else {
302
+ pairsSkipped++;
303
+ }
304
+ }
305
+ }
306
+ catch {
307
+ errors++;
308
+ }
309
+ }, Promise.resolve());
310
+ // Phase 4: Stats
311
+ const totalLinks = provider.get('SELECT COUNT(*) as c FROM vault_links')?.c ?? 0;
312
+ const orphanCount = provider.get(`SELECT COUNT(*) as c FROM entries
313
+ WHERE id NOT IN (SELECT source_id FROM vault_links)
314
+ AND id NOT IN (SELECT target_id FROM vault_links)`)?.c ?? 0;
315
+ const byType = provider.all('SELECT link_type, COUNT(*) as c FROM vault_links GROUP BY link_type ORDER BY c DESC');
316
+ return {
317
+ success: true,
318
+ entriesProcessed: entries.length,
319
+ candidatesEvaluated: candidates.length,
320
+ linksCreated,
321
+ pairsSkipped,
322
+ llmCalls,
323
+ errors,
324
+ totalLinks,
325
+ orphans: orphanCount,
326
+ byType: Object.fromEntries(byType.map((r) => [r.link_type, r.c])),
327
+ manualLinksPreserved: manualCount,
328
+ batchLinksRemoved: batchCount,
329
+ };
330
+ },
331
+ },
332
+ {
333
+ name: 'link_stats',
334
+ description: 'Get Zettelkasten graph statistics: total links, by type, most connected, orphan count.',
335
+ auth: 'read',
336
+ handler: async () => {
337
+ const provider = vault.getProvider();
338
+ try {
339
+ const totalLinks = provider.get('SELECT COUNT(*) as c FROM vault_links')?.c ?? 0;
340
+ const totalEntries = provider.get('SELECT COUNT(*) as c FROM entries')?.c ?? 0;
341
+ const orphans = provider.get(`SELECT COUNT(*) as c FROM entries
342
+ WHERE id NOT IN (SELECT source_id FROM vault_links)
343
+ AND id NOT IN (SELECT target_id FROM vault_links)`)?.c ?? 0;
344
+ const byType = provider.all('SELECT link_type, COUNT(*) as c FROM vault_links GROUP BY link_type ORDER BY c DESC');
345
+ const withNotes = provider.get("SELECT COUNT(*) as c FROM vault_links WHERE note IS NOT NULL AND note != ''")?.c ?? 0;
346
+ const mostConnected = provider.all(`SELECT e.title, (
347
+ (SELECT COUNT(*) FROM vault_links WHERE source_id = e.id) +
348
+ (SELECT COUNT(*) FROM vault_links WHERE target_id = e.id)
349
+ ) as links FROM entries e ORDER BY links DESC LIMIT 10`);
350
+ return {
351
+ totalEntries,
352
+ totalLinks,
353
+ orphans,
354
+ linksWithNotes: withNotes,
355
+ linkQuality: totalLinks > 0 ? `${((withNotes / totalLinks) * 100).toFixed(0)}%` : 'n/a',
356
+ byType: Object.fromEntries(byType.map((r) => [r.link_type, r.c])),
357
+ mostConnected,
358
+ };
359
+ }
360
+ catch {
361
+ return { totalLinks: 0, totalEntries: 0, orphans: 0, byType: {}, mostConnected: [] };
362
+ }
363
+ },
364
+ },
365
+ ];
366
+ }
367
+ //# sourceMappingURL=vault-linking-ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-linking-ops.js","sourceRoot":"","sources":["../../src/runtime/vault-linking-ops.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * LinkManager — Zettelkasten bidirectional linking for vault entries.
3
+ *
4
+ * Provides typed links between entries (supports, contradicts, extends, sequences),
5
+ * backlink traversal, graph walking, orphan detection, and link suggestions via FTS5.
6
+ *
7
+ * Ported from Salvador MCP with improvements:
8
+ * - Uses PersistenceProvider (not raw SQLite) for backend abstraction
9
+ * - Uses FTS5 for suggest_links (Salvador used TF-IDF cosine similarity)
10
+ * - Graceful degradation — all methods return empty on table-not-found
11
+ */
12
+ import type { PersistenceProvider } from '../persistence/types.js';
13
+ import type { VaultLink, LinkType, LinkedEntry, LinkSuggestion } from './vault-types.js';
14
+ export declare class LinkManager {
15
+ private provider;
16
+ private initialized;
17
+ constructor(provider: PersistenceProvider);
18
+ private ensureTable;
19
+ /** Create a typed link between two entries. */
20
+ addLink(sourceId: string, targetId: string, linkType: LinkType, note?: string): void;
21
+ /** Remove a link between two entries. */
22
+ removeLink(sourceId: string, targetId: string): void;
23
+ /** Get all outgoing links FROM an entry. */
24
+ getLinks(entryId: string): VaultLink[];
25
+ /** Get all incoming links TO an entry (backlinks). */
26
+ getBacklinks(entryId: string): VaultLink[];
27
+ /** Get total link count (outgoing + incoming). */
28
+ getLinkCount(entryId: string): number;
29
+ /**
30
+ * Walk the link graph from a starting entry up to `depth` hops.
31
+ * Returns all connected entries with link metadata.
32
+ * BFS — walks both outgoing and incoming links (undirected).
33
+ */
34
+ traverse(entryId: string, depth?: number): LinkedEntry[];
35
+ /** Find entries with zero links. */
36
+ getOrphans(limit?: number): Array<{
37
+ id: string;
38
+ title: string;
39
+ type: string;
40
+ domain: string;
41
+ }>;
42
+ /** Find semantically similar entries as link candidates using FTS5. */
43
+ suggestLinks(entryId: string, limit?: number): LinkSuggestion[];
44
+ private getEntryMeta;
45
+ }
46
+ //# sourceMappingURL=linking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linking.d.ts","sourceRoot":"","sources":["../../src/vault/linking.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EACV,SAAS,EAET,QAAQ,EACR,WAAW,EACX,cAAc,EACf,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,WAAW;IAGV,OAAO,CAAC,QAAQ;IAF5B,OAAO,CAAC,WAAW,CAAS;gBAER,QAAQ,EAAE,mBAAmB;IAQjD,OAAO,CAAC,WAAW;IAyBnB,+CAA+C;IAC/C,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAQpF,yCAAyC;IACzC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOpD,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE;IAYtC,sDAAsD;IACtD,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE;IAY1C,kDAAkD;IAClD,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAgBrC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,WAAW,EAAE;IAqD3D,oCAAoC;IACpC,UAAU,CACR,KAAK,GAAE,MAAW,GACjB,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAkBrE,uEAAuE;IACvE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,cAAc,EAAE;IAqGlE,OAAO,CAAC,YAAY;CAarB"}