@andespindola/brainlink 0.1.0-beta.4 → 0.1.0-beta.40

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 (58) hide show
  1. package/AGENTS.md +5 -5
  2. package/CHANGELOG.md +43 -2
  3. package/CONTRIBUTING.md +2 -2
  4. package/COPYRIGHT.md +5 -0
  5. package/README.md +213 -20
  6. package/SECURITY.md +1 -1
  7. package/dist/application/add-note.js +62 -13
  8. package/dist/application/analyze-vault.js +95 -8
  9. package/dist/application/build-context.js +56 -1
  10. package/dist/application/dedupe-notes.js +226 -0
  11. package/dist/application/frontend/client-css.js +214 -100
  12. package/dist/application/frontend/client-html.js +60 -45
  13. package/dist/application/frontend/client-js.js +656 -94
  14. package/dist/application/get-graph-layout.js +22 -7
  15. package/dist/application/get-graph-node.js +12 -0
  16. package/dist/application/get-graph-summary.js +12 -0
  17. package/dist/application/get-graph.js +3 -3
  18. package/dist/application/import-legacy-sqlite.js +296 -0
  19. package/dist/application/index-vault.js +11 -4
  20. package/dist/application/list-agents.js +3 -3
  21. package/dist/application/list-links.js +5 -5
  22. package/dist/application/migrate-vault.js +91 -0
  23. package/dist/application/search-graph-node-ids.js +12 -0
  24. package/dist/application/search-knowledge.js +75 -5
  25. package/dist/application/server/routes.js +27 -1
  26. package/dist/benchmarks/large-vault.js +1 -1
  27. package/dist/cli/commands/agent-commands.js +412 -0
  28. package/dist/cli/commands/config-commands.js +167 -0
  29. package/dist/cli/commands/read-commands.js +25 -8
  30. package/dist/cli/commands/write-commands.js +669 -9
  31. package/dist/cli/main.js +4 -0
  32. package/dist/cli/runtime.js +5 -2
  33. package/dist/domain/context.js +53 -11
  34. package/dist/domain/embeddings.js +2 -1
  35. package/dist/domain/graph-layout.js +20 -14
  36. package/dist/domain/markdown.js +36 -4
  37. package/dist/domain/middle-out.js +18 -0
  38. package/dist/infrastructure/config.js +94 -8
  39. package/dist/infrastructure/file-index.js +328 -0
  40. package/dist/infrastructure/file-system-vault.js +15 -0
  41. package/dist/infrastructure/paths.js +9 -1
  42. package/dist/infrastructure/private-pack-codec.js +73 -0
  43. package/dist/infrastructure/search-packs.js +348 -0
  44. package/dist/infrastructure/session-state.js +172 -0
  45. package/dist/mcp/main.js +11 -3
  46. package/dist/mcp/server.js +27 -2
  47. package/dist/mcp/startup.js +35 -0
  48. package/dist/mcp/tools.js +633 -19
  49. package/docs/AGENT_USAGE.md +144 -16
  50. package/docs/ARCHITECTURE.md +37 -26
  51. package/docs/QUICKSTART.md +111 -0
  52. package/package.json +6 -4
  53. package/dist/infrastructure/sqlite/document-writer.js +0 -51
  54. package/dist/infrastructure/sqlite/graph-reader.js +0 -120
  55. package/dist/infrastructure/sqlite/schema.js +0 -111
  56. package/dist/infrastructure/sqlite/search-reader.js +0 -156
  57. package/dist/infrastructure/sqlite/types.js +0 -1
  58. package/dist/infrastructure/sqlite-index.js +0 -25
@@ -1,4 +1,4 @@
1
- import { getBrokenLinksReport, getOrphansReport, getStats, validateVault } from '../../application/analyze-vault.js';
1
+ import { getBrokenLinksReport, getExtendedStats, getOrphansReport, getStats, validateVault } from '../../application/analyze-vault.js';
2
2
  import { buildContextPackage } from '../../application/build-context.js';
3
3
  import { getGraph } from '../../application/get-graph.js';
4
4
  import { listAgents } from '../../application/list-agents.js';
@@ -12,14 +12,14 @@ export const registerReadCommands = (program) => {
12
12
  .argument('<query>', 'search query')
13
13
  .option('-v, --vault <vault>', 'vault directory')
14
14
  .option('-a, --agent <agent>', 'filter by agent memory namespace')
15
- .option('-l, --limit <limit>', 'maximum results', '10')
15
+ .option('-l, --limit <limit>', 'maximum results')
16
16
  .option('-m, --mode <mode>', 'search mode: fts, semantic or hybrid')
17
17
  .option('--json', 'print machine-readable JSON')
18
18
  .description('search indexed knowledge')
19
19
  .action(async (query, options) => {
20
20
  const resolved = await resolveOptions(options);
21
- const limit = parsePositiveInteger(options.limit ?? String(resolved.config.defaultSearchLimit), resolved.config.defaultSearchLimit);
22
- const mode = sanitizeSearchMode(options.mode, resolved.config.defaultSearchMode);
21
+ const limit = parsePositiveInteger(options.limit ?? String(resolved.defaults.defaultSearchLimit), resolved.defaults.defaultSearchLimit);
22
+ const mode = sanitizeSearchMode(options.mode, resolved.defaults.defaultSearchMode);
23
23
  const results = await searchKnowledge(resolved.vault, query, limit, resolved.agent, mode);
24
24
  print(options.json, { query, agent: resolved.agent, limit, mode, results }, () => results
25
25
  .map((result, index) => [`${index + 1}. ${result.title} (${result.path}) score=${result.score.toFixed(3)} mode=${result.searchMode}`, result.content].join('\n'))
@@ -58,15 +58,15 @@ export const registerReadCommands = (program) => {
58
58
  .argument('<query>', 'context query')
59
59
  .option('-v, --vault <vault>', 'vault directory')
60
60
  .option('-a, --agent <agent>', 'filter by agent memory namespace')
61
- .option('-l, --limit <limit>', 'maximum search results before context selection', '12')
62
- .option('-t, --tokens <tokens>', 'maximum estimated context tokens', '2000')
61
+ .option('-l, --limit <limit>', 'maximum search results before context selection')
62
+ .option('-t, --tokens <tokens>', 'maximum estimated context tokens')
63
63
  .option('-m, --mode <mode>', 'search mode: fts, semantic or hybrid')
64
64
  .option('--json', 'print machine-readable JSON')
65
65
  .description('build a compact context package for an agent')
66
66
  .action(async (query, options) => {
67
67
  const resolved = await resolveOptions(options);
68
- const mode = sanitizeSearchMode(options.mode, resolved.config.defaultSearchMode);
69
- const contextPackage = await buildContextPackage(resolved.vault, query, parsePositiveInteger(options.limit ?? '12', 12), parsePositiveInteger(options.tokens ?? String(resolved.config.defaultContextTokens), resolved.config.defaultContextTokens), resolved.agent, mode);
68
+ const mode = sanitizeSearchMode(options.mode, resolved.defaults.defaultSearchMode);
69
+ const contextPackage = await buildContextPackage(resolved.vault, query, parsePositiveInteger(options.limit ?? String(resolved.defaults.defaultSearchLimit), resolved.defaults.defaultSearchLimit), parsePositiveInteger(options.tokens ?? String(resolved.defaults.defaultContextTokens), resolved.defaults.defaultContextTokens), resolved.agent, mode);
70
70
  print(options.json, contextPackage, () => contextPackage.content);
71
71
  });
72
72
  program
@@ -94,10 +94,27 @@ export const registerReadCommands = (program) => {
94
94
  .command('stats')
95
95
  .option('-v, --vault <vault>', 'vault directory')
96
96
  .option('-a, --agent <agent>', 'filter by agent memory namespace')
97
+ .option('--extended', 'include storage, quality and latency observability probes')
97
98
  .option('--json', 'print machine-readable JSON')
98
99
  .description('print indexed vault statistics')
99
100
  .action(async (options) => {
100
101
  const resolved = await resolveOptions(options);
102
+ if (options.extended) {
103
+ const stats = await getExtendedStats(resolved.vault, resolved.agent);
104
+ print(options.json, stats, () => [
105
+ `Documents: ${stats.stats.documentCount}`,
106
+ `Links: ${stats.stats.linkCount}`,
107
+ `Resolved links: ${stats.stats.resolvedLinkCount}`,
108
+ `Broken links: ${stats.stats.brokenLinkCount}`,
109
+ `Orphans: ${stats.stats.orphanCount}`,
110
+ `Tags: ${stats.stats.tagCount}`,
111
+ `Total files: ${stats.storage.totalFileCount}`,
112
+ `Markdown files: ${stats.storage.markdownFileCount}`,
113
+ `Vault bytes: ${stats.storage.totalBytes}`,
114
+ `Latency index/search/context (ms): ${stats.observability.latenciesMs.index}/${stats.observability.latenciesMs.search}/${stats.observability.latenciesMs.context}`
115
+ ].join('\n'));
116
+ return;
117
+ }
101
118
  const stats = await getStats(resolved.vault, resolved.agent);
102
119
  print(options.json, stats, () => [
103
120
  `Documents: ${stats.documentCount}`,