luca 3.0.0 → 3.0.2

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 (372) hide show
  1. package/.github/workflows/release.yaml +1 -0
  2. package/CLAUDE.md +10 -2
  3. package/README.md +130 -112
  4. package/assistants/codingAssistant/CORE.md +6 -1
  5. package/assistants/codingAssistant/hooks.ts +1 -1
  6. package/assistants/inkbot/hooks.ts +1 -1
  7. package/assistants/inkbot/tools.ts +1 -1
  8. package/bun.lock +220 -322
  9. package/commands/audit-docs.ts +2 -2
  10. package/commands/build-bootstrap.ts +2 -3
  11. package/commands/build-python-bridge.ts +2 -3
  12. package/commands/build-scaffolds.ts +2 -3
  13. package/commands/bundle-consumer-project.ts +521 -0
  14. package/commands/generate-api-docs.ts +2 -2
  15. package/commands/inkbot.ts +2 -2
  16. package/commands/release.ts +2 -2
  17. package/commands/try-all-challenges.ts +3 -3
  18. package/commands/try-challenge.ts +3 -3
  19. package/dist/agi/container.server.d.ts +2 -2
  20. package/dist/agi/features/assistant.d.ts +2 -2
  21. package/dist/agi/features/assistants-manager.d.ts +1 -1
  22. package/dist/agi/features/autonomous-assistant.d.ts +1 -1
  23. package/dist/agi/features/browser-use.d.ts +1 -1
  24. package/dist/agi/features/claude-code.d.ts +1 -1
  25. package/dist/agi/features/conversation-history.d.ts +2 -2
  26. package/dist/agi/features/conversation.d.ts +1 -1
  27. package/dist/agi/features/docs-reader.d.ts +1 -1
  28. package/dist/agi/features/file-tools.d.ts +1 -1
  29. package/dist/agi/features/luca-coder.d.ts +1 -1
  30. package/dist/agi/features/openai-codex.d.ts +1 -1
  31. package/dist/agi/features/skills-library.d.ts +1 -1
  32. package/dist/clients/civitai/index.d.ts +4 -4
  33. package/dist/clients/client-template.d.ts +4 -4
  34. package/dist/clients/comfyui/index.d.ts +2 -2
  35. package/dist/clients/elevenlabs/index.d.ts +2 -2
  36. package/dist/clients/openai/index.d.ts +2 -2
  37. package/dist/clients/supabase/index.d.ts +3 -3
  38. package/dist/command.d.ts +1 -1
  39. package/dist/node/container.d.ts +1 -1
  40. package/dist/node/features/helpers.d.ts +3 -3
  41. package/dist/node/features/semantic-search.d.ts +1 -1
  42. package/dist/node/features/vm.d.ts +3 -3
  43. package/dist/node.d.ts +1 -1
  44. package/dist/scaffolds/generated.d.ts +1 -1
  45. package/dist/selector.d.ts +1 -1
  46. package/index.html +217 -190
  47. package/luca.console.ts +1 -1
  48. package/package.json +2 -2
  49. package/public/index.html +217 -190
  50. package/public/slides-ai-native.html +1 -1
  51. package/public/slides-intro.html +2 -2
  52. package/scripts/examples/ask-luca-expert.ts +1 -1
  53. package/scripts/examples/assistant-questions.ts +1 -1
  54. package/scripts/examples/excalidraw-expert.ts +1 -1
  55. package/scripts/examples/file-manager.ts +1 -1
  56. package/scripts/examples/ideas.ts +1 -1
  57. package/scripts/examples/interactive-chat.ts +1 -1
  58. package/scripts/examples/opening-a-web-browser.ts +1 -1
  59. package/scripts/examples/telegram-bot.ts +1 -1
  60. package/scripts/examples/using-assistant-with-mcp.ts +1 -1
  61. package/scripts/examples/using-claude-code.ts +1 -1
  62. package/scripts/examples/using-contentdb.ts +2 -2
  63. package/scripts/examples/using-conversations.ts +1 -1
  64. package/scripts/examples/using-disk-cache.ts +1 -1
  65. package/scripts/examples/using-docker-shell.ts +1 -1
  66. package/scripts/examples/using-elevenlabs.ts +1 -1
  67. package/scripts/examples/using-google-calendar.ts +1 -1
  68. package/scripts/examples/using-google-docs.ts +1 -1
  69. package/scripts/examples/using-google-drive.ts +1 -1
  70. package/scripts/examples/using-google-sheets.ts +1 -1
  71. package/scripts/examples/using-nlp.ts +1 -1
  72. package/scripts/examples/using-ollama.ts +1 -1
  73. package/scripts/examples/using-postgres.ts +1 -1
  74. package/scripts/examples/using-runpod.ts +1 -1
  75. package/scripts/examples/using-tts.ts +1 -1
  76. package/scripts/scaffold.ts +5 -5
  77. package/scripts/scratch.ts +1 -1
  78. package/scripts/test-assistant-hooks.ts +1 -1
  79. package/scripts/test-docs-reader.ts +1 -1
  80. package/src/agi/container.server.ts +6 -2
  81. package/src/agi/features/agent-memory.ts +25 -25
  82. package/src/agi/features/assistant.ts +34 -5
  83. package/src/agi/features/assistants-manager.ts +122 -6
  84. package/src/agi/features/autonomous-assistant.ts +1 -1
  85. package/src/agi/features/browser-use.ts +20 -1
  86. package/src/agi/features/claude-code.ts +51 -5
  87. package/src/agi/features/coding-tools.ts +1 -1
  88. package/src/agi/features/conversation-history.ts +181 -4
  89. package/src/agi/features/conversation.ts +186 -15
  90. package/src/agi/features/docs-reader.ts +2 -2
  91. package/src/agi/features/file-tools.ts +49 -2
  92. package/src/agi/features/luca-coder.ts +7 -5
  93. package/src/agi/features/mcp-bridge.ts +532 -0
  94. package/src/agi/features/openai-codex.ts +2 -2
  95. package/src/agi/features/skills-library.ts +131 -52
  96. package/src/agi/lib/token-counter.ts +80 -0
  97. package/src/bootstrap/generated.ts +56 -57
  98. package/src/browser.ts +1 -1
  99. package/src/cli/build-info.ts +2 -2
  100. package/src/cli/cli.ts +2 -2
  101. package/src/clients/civitai/index.ts +5 -5
  102. package/src/clients/client-template.ts +4 -4
  103. package/src/clients/comfyui/index.ts +4 -4
  104. package/src/clients/elevenlabs/index.ts +4 -4
  105. package/src/clients/openai/index.ts +7 -7
  106. package/src/clients/supabase/index.ts +4 -4
  107. package/src/clients/voicebox/index.ts +4 -4
  108. package/src/command.ts +2 -1
  109. package/src/commands/chat.ts +1 -0
  110. package/src/commands/eval.ts +2 -56
  111. package/src/commands/introspect.ts +1 -1
  112. package/src/commands/prompt.ts +41 -9
  113. package/src/container-describer.ts +8 -1
  114. package/src/container.ts +13 -0
  115. package/src/entity.ts +2 -2
  116. package/src/helper.ts +1 -1
  117. package/src/introspection/generated.agi.ts +28563 -27571
  118. package/src/introspection/generated.node.ts +20281 -20194
  119. package/src/introspection/generated.web.ts +605 -584
  120. package/src/introspection/scan.ts +11 -6
  121. package/src/node/container.ts +1 -1
  122. package/src/node/features/content-db.ts +39 -2
  123. package/src/node/features/display-result.ts +57 -0
  124. package/src/node/features/helpers.ts +42 -15
  125. package/src/node/features/python.ts +25 -19
  126. package/src/node/features/repl.ts +1 -1
  127. package/src/node/features/secure-shell.ts +11 -17
  128. package/src/node/features/semantic-search.ts +2 -2
  129. package/src/node/features/transpiler.ts +2 -3
  130. package/src/node/features/ui.ts +5 -0
  131. package/src/node/features/vm.ts +3 -3
  132. package/src/node.ts +3 -3
  133. package/src/python/generated.ts +0 -1
  134. package/src/scaffolds/generated.ts +82 -83
  135. package/src/selector.ts +1 -1
  136. package/src/servers/express.ts +1 -1
  137. package/src/web/features/helpers.ts +22 -0
  138. package/tsconfig.json +12 -12
  139. package/docs/CLI.md +0 -335
  140. package/docs/CNAME +0 -1
  141. package/docs/README.md +0 -60
  142. package/docs/TABLE-OF-CONTENTS.md +0 -183
  143. package/docs/apis/clients/elevenlabs.md +0 -308
  144. package/docs/apis/clients/graph.md +0 -107
  145. package/docs/apis/clients/openai.md +0 -429
  146. package/docs/apis/clients/rest.md +0 -161
  147. package/docs/apis/clients/websocket.md +0 -174
  148. package/docs/apis/features/agi/assistant.md +0 -625
  149. package/docs/apis/features/agi/assistants-manager.md +0 -282
  150. package/docs/apis/features/agi/auto-assistant.md +0 -279
  151. package/docs/apis/features/agi/browser-use.md +0 -802
  152. package/docs/apis/features/agi/claude-code.md +0 -884
  153. package/docs/apis/features/agi/conversation-history.md +0 -364
  154. package/docs/apis/features/agi/conversation.md +0 -548
  155. package/docs/apis/features/agi/docs-reader.md +0 -99
  156. package/docs/apis/features/agi/file-tools.md +0 -163
  157. package/docs/apis/features/agi/luca-coder.md +0 -407
  158. package/docs/apis/features/agi/openai-codex.md +0 -396
  159. package/docs/apis/features/agi/openapi.md +0 -138
  160. package/docs/apis/features/agi/semantic-search.md +0 -387
  161. package/docs/apis/features/agi/skills-library.md +0 -239
  162. package/docs/apis/features/node/container-link.md +0 -192
  163. package/docs/apis/features/node/content-db.md +0 -450
  164. package/docs/apis/features/node/disk-cache.md +0 -379
  165. package/docs/apis/features/node/dns.md +0 -652
  166. package/docs/apis/features/node/docker.md +0 -706
  167. package/docs/apis/features/node/downloader.md +0 -81
  168. package/docs/apis/features/node/esbuild.md +0 -60
  169. package/docs/apis/features/node/file-manager.md +0 -191
  170. package/docs/apis/features/node/fs.md +0 -1217
  171. package/docs/apis/features/node/git.md +0 -371
  172. package/docs/apis/features/node/google-auth.md +0 -193
  173. package/docs/apis/features/node/google-calendar.md +0 -202
  174. package/docs/apis/features/node/google-docs.md +0 -173
  175. package/docs/apis/features/node/google-drive.md +0 -246
  176. package/docs/apis/features/node/google-mail.md +0 -214
  177. package/docs/apis/features/node/google-sheets.md +0 -194
  178. package/docs/apis/features/node/grep.md +0 -292
  179. package/docs/apis/features/node/helpers.md +0 -164
  180. package/docs/apis/features/node/ink.md +0 -334
  181. package/docs/apis/features/node/ipc-socket.md +0 -249
  182. package/docs/apis/features/node/json-tree.md +0 -86
  183. package/docs/apis/features/node/networking.md +0 -316
  184. package/docs/apis/features/node/nlp.md +0 -133
  185. package/docs/apis/features/node/opener.md +0 -97
  186. package/docs/apis/features/node/os.md +0 -146
  187. package/docs/apis/features/node/package-finder.md +0 -392
  188. package/docs/apis/features/node/postgres.md +0 -234
  189. package/docs/apis/features/node/proc.md +0 -399
  190. package/docs/apis/features/node/process-manager.md +0 -305
  191. package/docs/apis/features/node/python.md +0 -604
  192. package/docs/apis/features/node/redis.md +0 -380
  193. package/docs/apis/features/node/repl.md +0 -88
  194. package/docs/apis/features/node/runpod.md +0 -674
  195. package/docs/apis/features/node/secure-shell.md +0 -176
  196. package/docs/apis/features/node/semantic-search.md +0 -408
  197. package/docs/apis/features/node/sqlite.md +0 -233
  198. package/docs/apis/features/node/telegram.md +0 -279
  199. package/docs/apis/features/node/transpiler.md +0 -74
  200. package/docs/apis/features/node/tts.md +0 -133
  201. package/docs/apis/features/node/ui.md +0 -701
  202. package/docs/apis/features/node/vault.md +0 -59
  203. package/docs/apis/features/node/vm.md +0 -75
  204. package/docs/apis/features/node/yaml-tree.md +0 -85
  205. package/docs/apis/features/node/yaml.md +0 -176
  206. package/docs/apis/features/web/asset-loader.md +0 -59
  207. package/docs/apis/features/web/container-link.md +0 -192
  208. package/docs/apis/features/web/esbuild.md +0 -54
  209. package/docs/apis/features/web/helpers.md +0 -164
  210. package/docs/apis/features/web/network.md +0 -44
  211. package/docs/apis/features/web/speech.md +0 -69
  212. package/docs/apis/features/web/vault.md +0 -59
  213. package/docs/apis/features/web/vm.md +0 -75
  214. package/docs/apis/features/web/voice.md +0 -84
  215. package/docs/apis/servers/express.md +0 -171
  216. package/docs/apis/servers/mcp.md +0 -238
  217. package/docs/apis/servers/websocket.md +0 -170
  218. package/docs/bootstrap/CLAUDE.md +0 -101
  219. package/docs/bootstrap/SKILL.md +0 -341
  220. package/docs/bootstrap/templates/about-command.ts +0 -41
  221. package/docs/bootstrap/templates/docs-models.ts +0 -22
  222. package/docs/bootstrap/templates/docs-readme.md +0 -43
  223. package/docs/bootstrap/templates/example-feature.ts +0 -53
  224. package/docs/bootstrap/templates/health-endpoint.ts +0 -15
  225. package/docs/bootstrap/templates/luca-cli.ts +0 -30
  226. package/docs/bootstrap/templates/runme.md +0 -54
  227. package/docs/challenges/caching-proxy.md +0 -16
  228. package/docs/challenges/content-db-round-trip.md +0 -14
  229. package/docs/challenges/custom-command.md +0 -9
  230. package/docs/challenges/file-watcher-pipeline.md +0 -11
  231. package/docs/challenges/grep-audit-report.md +0 -15
  232. package/docs/challenges/multi-feature-dashboard.md +0 -14
  233. package/docs/challenges/process-orchestrator.md +0 -17
  234. package/docs/challenges/rest-api-server-with-client.md +0 -12
  235. package/docs/challenges/script-runner-with-vm.md +0 -11
  236. package/docs/challenges/simple-rest-api.md +0 -15
  237. package/docs/challenges/websocket-serve-and-client.md +0 -11
  238. package/docs/challenges/yaml-config-system.md +0 -14
  239. package/docs/command-system-overhaul.md +0 -94
  240. package/docs/documentation-audit.md +0 -134
  241. package/docs/examples/assistant/CORE.md +0 -18
  242. package/docs/examples/assistant/hooks.ts +0 -3
  243. package/docs/examples/assistant/tools.ts +0 -10
  244. package/docs/examples/assistant-hooks-reference.ts +0 -171
  245. package/docs/examples/assistant-with-process-manager.md +0 -84
  246. package/docs/examples/content-db.md +0 -77
  247. package/docs/examples/disk-cache.md +0 -83
  248. package/docs/examples/docker.md +0 -101
  249. package/docs/examples/downloader.md +0 -70
  250. package/docs/examples/entity.md +0 -124
  251. package/docs/examples/esbuild.md +0 -80
  252. package/docs/examples/feature-as-tool-provider.md +0 -143
  253. package/docs/examples/file-manager.md +0 -82
  254. package/docs/examples/fs.md +0 -83
  255. package/docs/examples/git.md +0 -85
  256. package/docs/examples/google-auth.md +0 -88
  257. package/docs/examples/google-calendar.md +0 -94
  258. package/docs/examples/google-docs.md +0 -82
  259. package/docs/examples/google-drive.md +0 -96
  260. package/docs/examples/google-sheets.md +0 -95
  261. package/docs/examples/grep.md +0 -85
  262. package/docs/examples/ink-blocks.md +0 -75
  263. package/docs/examples/ink-renderer.md +0 -41
  264. package/docs/examples/ink.md +0 -103
  265. package/docs/examples/ipc-socket.md +0 -103
  266. package/docs/examples/json-tree.md +0 -91
  267. package/docs/examples/networking.md +0 -58
  268. package/docs/examples/nlp.md +0 -91
  269. package/docs/examples/opener.md +0 -78
  270. package/docs/examples/os.md +0 -72
  271. package/docs/examples/package-finder.md +0 -89
  272. package/docs/examples/postgres.md +0 -91
  273. package/docs/examples/proc.md +0 -81
  274. package/docs/examples/process-manager.md +0 -79
  275. package/docs/examples/python.md +0 -132
  276. package/docs/examples/repl.md +0 -93
  277. package/docs/examples/runpod.md +0 -119
  278. package/docs/examples/secure-shell.md +0 -92
  279. package/docs/examples/sqlite.md +0 -86
  280. package/docs/examples/structured-output-with-assistants.md +0 -144
  281. package/docs/examples/telegram.md +0 -77
  282. package/docs/examples/tts.md +0 -86
  283. package/docs/examples/ui.md +0 -80
  284. package/docs/examples/vault.md +0 -70
  285. package/docs/examples/vm.md +0 -86
  286. package/docs/examples/websocket-ask-and-reply-example.md +0 -128
  287. package/docs/examples/yaml-tree.md +0 -93
  288. package/docs/examples/yaml.md +0 -104
  289. package/docs/ideas/assistant-factory-pattern.md +0 -142
  290. package/docs/in-memory-fs.md +0 -4
  291. package/docs/introspection-audit.md +0 -49
  292. package/docs/introspection.md +0 -164
  293. package/docs/mcp/readme.md +0 -162
  294. package/docs/models.ts +0 -41
  295. package/docs/philosophy.md +0 -86
  296. package/docs/principles.md +0 -7
  297. package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +0 -34
  298. package/docs/prompts/check-for-undocumented-features.md +0 -27
  299. package/docs/prompts/mcp-test-easy-command.md +0 -27
  300. package/docs/scaffolds/client.md +0 -149
  301. package/docs/scaffolds/command.md +0 -120
  302. package/docs/scaffolds/endpoint.md +0 -171
  303. package/docs/scaffolds/feature.md +0 -158
  304. package/docs/scaffolds/selector.md +0 -91
  305. package/docs/scaffolds/server.md +0 -196
  306. package/docs/selectors.md +0 -115
  307. package/docs/sessions/custom-command/attempt-log-2.md +0 -195
  308. package/docs/sessions/file-watcher-pipeline/attempt-log-1.md +0 -728
  309. package/docs/sessions/file-watcher-pipeline/attempt-log-2.md +0 -555
  310. package/docs/sessions/grep-audit-report/attempt-log-1.md +0 -289
  311. package/docs/sessions/multi-feature-dashboard/attempt-log-2.md +0 -679
  312. package/docs/sessions/rest-api-server-with-client/attempt-log-1.md +0 -1
  313. package/docs/sessions/rest-api-server-with-client/attempt-log-3.md +0 -920
  314. package/docs/sessions/simple-rest-api/attempt-log-1.md +0 -593
  315. package/docs/sessions/websocket-serve-and-client/attempt-log-2.md +0 -995
  316. package/docs/tutorials/00-bootstrap.md +0 -166
  317. package/docs/tutorials/01-getting-started.md +0 -106
  318. package/docs/tutorials/02-container.md +0 -210
  319. package/docs/tutorials/03-scripts.md +0 -194
  320. package/docs/tutorials/04-features-overview.md +0 -196
  321. package/docs/tutorials/05-state-and-events.md +0 -171
  322. package/docs/tutorials/06-servers.md +0 -157
  323. package/docs/tutorials/07-endpoints.md +0 -198
  324. package/docs/tutorials/08-commands.md +0 -252
  325. package/docs/tutorials/09-clients.md +0 -162
  326. package/docs/tutorials/10-creating-features.md +0 -203
  327. package/docs/tutorials/11-contentbase.md +0 -191
  328. package/docs/tutorials/12-assistants.md +0 -215
  329. package/docs/tutorials/13-introspection.md +0 -157
  330. package/docs/tutorials/14-type-system.md +0 -174
  331. package/docs/tutorials/15-project-patterns.md +0 -222
  332. package/docs/tutorials/16-google-features.md +0 -534
  333. package/docs/tutorials/17-tui-blocks.md +0 -530
  334. package/docs/tutorials/18-semantic-search.md +0 -334
  335. package/docs/tutorials/19-python-sessions.md +0 -401
  336. package/docs/tutorials/20-browser-esm.md +0 -234
  337. package/src/agi/endpoints/ask.ts +0 -60
  338. package/src/agi/endpoints/conversations/[id].ts +0 -45
  339. package/src/agi/endpoints/conversations.ts +0 -31
  340. package/src/agi/endpoints/experts.ts +0 -37
  341. package/test/assistant-hooks.test.ts +0 -306
  342. package/test/assistant.test.ts +0 -81
  343. package/test/bus.test.ts +0 -134
  344. package/test/clients-servers.test.ts +0 -217
  345. package/test/command.test.ts +0 -267
  346. package/test/container-link.test.ts +0 -274
  347. package/test/conversation.test.ts +0 -220
  348. package/test/features.test.ts +0 -160
  349. package/test/fork-and-research.test.ts +0 -450
  350. package/test/integration.test.ts +0 -787
  351. package/test/interceptor-chain.test.ts +0 -61
  352. package/test/node-container.test.ts +0 -121
  353. package/test/python-session.test.ts +0 -105
  354. package/test/rate-limit.test.ts +0 -272
  355. package/test/semantic-search.test.ts +0 -550
  356. package/test/state.test.ts +0 -121
  357. package/test/vm-context.test.ts +0 -146
  358. package/test/vm-loadmodule.test.ts +0 -213
  359. package/test/websocket-ask.test.ts +0 -101
  360. package/test-integration/assistant.test.ts +0 -138
  361. package/test-integration/assistants-manager.test.ts +0 -113
  362. package/test-integration/claude-code.test.ts +0 -98
  363. package/test-integration/conversation-history.test.ts +0 -205
  364. package/test-integration/conversation.test.ts +0 -137
  365. package/test-integration/elevenlabs.test.ts +0 -55
  366. package/test-integration/google-services.test.ts +0 -80
  367. package/test-integration/helpers.ts +0 -89
  368. package/test-integration/memory.test.ts +0 -204
  369. package/test-integration/openai-codex.test.ts +0 -93
  370. package/test-integration/runpod.test.ts +0 -58
  371. package/test-integration/server-endpoints.test.ts +0 -97
  372. package/test-integration/telegram.test.ts +0 -46
@@ -1,334 +0,0 @@
1
- ---
2
- title: Semantic Search
3
- tags: [semantic-search, embeddings, vector-search, bm25, hybrid-search, sqlite, contentdb]
4
- ---
5
-
6
- # Semantic Search
7
-
8
- Luca's `semanticSearch` feature provides BM25 keyword search, vector similarity search, and hybrid search with Reciprocal Rank Fusion -- all backed by SQLite. It chunks documents intelligently, generates embeddings via OpenAI or a local GGUF model, and stores everything in a single `.sqlite` file.
9
-
10
- ## Quick Start with ContentDb
11
-
12
- The fastest way to use semantic search is through the `contentDb` feature, which handles indexing and querying automatically:
13
-
14
- ```typescript
15
- import container from '@soederpop/luca'
16
-
17
- const db = container.feature('contentDb', { rootPath: './docs' })
18
- await db.load()
19
-
20
- // Build the search index (generates embeddings for all documents)
21
- await db.buildSearchIndex({
22
- onProgress: (indexed, total) => console.log(`${indexed}/${total}`)
23
- })
24
-
25
- // Search your documents
26
- const results = await db.hybridSearch('how does authentication work')
27
- for (const r of results) {
28
- console.log(`${r.title} (score: ${r.score.toFixed(3)})`)
29
- console.log(` ${r.snippet}`)
30
- }
31
- ```
32
-
33
- ContentDb provides three search methods that delegate to the underlying semanticSearch feature:
34
-
35
- ```typescript
36
- // BM25 keyword search -- best for exact term matching
37
- await db.search('OAuth2 token refresh')
38
-
39
- // Vector similarity search -- finds conceptually related documents
40
- await db.vectorSearch('how do users log in')
41
-
42
- // Hybrid search -- combines both via Reciprocal Rank Fusion (recommended)
43
- await db.hybridSearch('authentication flow', { limit: 5 })
44
- ```
45
-
46
- ## Using SemanticSearch Directly
47
-
48
- For more control, use the `semanticSearch` feature directly:
49
-
50
- ```typescript
51
- import container from '@soederpop/luca'
52
- import { SemanticSearch } from '@soederpop/luca/node/features/semantic-search'
53
-
54
- // Attach the feature to the container
55
- SemanticSearch.attach(container)
56
-
57
- const search = container.feature('semanticSearch', {
58
- dbPath: '.contentbase/search.sqlite',
59
- embeddingProvider: 'openai', // or 'local'
60
- embeddingModel: 'text-embedding-3-small',
61
- chunkStrategy: 'section', // 'section' | 'fixed' | 'document'
62
- chunkSize: 900,
63
- })
64
-
65
- await search.initDb()
66
- ```
67
-
68
- ## Indexing Documents
69
-
70
- Documents are represented as `DocumentInput` objects with optional section metadata:
71
-
72
- ```typescript
73
- await search.indexDocuments([
74
- {
75
- pathId: 'guides/auth',
76
- model: 'Guide',
77
- title: 'Authentication Guide',
78
- meta: { status: 'published', category: 'security' },
79
- content: 'Full document content here...',
80
- sections: [
81
- {
82
- heading: 'OAuth2 Flow',
83
- headingPath: 'Authentication Guide > OAuth2 Flow',
84
- content: 'OAuth2 uses authorization codes and tokens...',
85
- level: 2,
86
- },
87
- {
88
- heading: 'Session Management',
89
- headingPath: 'Authentication Guide > Session Management',
90
- content: 'Sessions are stored server-side with a cookie...',
91
- level: 2,
92
- },
93
- ],
94
- },
95
- {
96
- pathId: 'guides/deployment',
97
- title: 'Deployment Guide',
98
- content: 'How to deploy your application...',
99
- },
100
- ])
101
- ```
102
-
103
- The `indexDocuments` method:
104
- 1. Stores documents in SQLite with FTS5 full-text indexing
105
- 2. Chunks each document based on the configured strategy
106
- 3. Generates embeddings for every chunk
107
- 4. Stores embeddings as BLOBs alongside the chunk text
108
-
109
- ## Chunking Strategies
110
-
111
- The feature splits documents into chunks before embedding. Choose a strategy based on your content:
112
-
113
- ### Section (default)
114
-
115
- Splits at heading boundaries (`## H2`, `### H3`). Each section becomes a chunk, prefixed with the heading path for context. Falls back to fixed chunking if the document has no sections.
116
-
117
- ```typescript
118
- const search = container.feature('semanticSearch', {
119
- chunkStrategy: 'section',
120
- chunkSize: 900, // max tokens per chunk (sections exceeding this are split at paragraphs)
121
- })
122
- ```
123
-
124
- Best for: structured documents with clear heading hierarchies.
125
-
126
- ### Fixed
127
-
128
- Splits by word count with configurable overlap between chunks:
129
-
130
- ```typescript
131
- const search = container.feature('semanticSearch', {
132
- chunkStrategy: 'fixed',
133
- chunkSize: 900,
134
- chunkOverlap: 0.15, // 15% overlap between adjacent chunks
135
- })
136
- ```
137
-
138
- Best for: unstructured prose, logs, or transcripts.
139
-
140
- ### Document
141
-
142
- One chunk per document -- no splitting:
143
-
144
- ```typescript
145
- const search = container.feature('semanticSearch', {
146
- chunkStrategy: 'document',
147
- })
148
- ```
149
-
150
- Best for: short documents where splitting would lose context.
151
-
152
- ## Search Methods
153
-
154
- ### BM25 Keyword Search
155
-
156
- Uses SQLite FTS5 with Porter stemming for traditional keyword matching:
157
-
158
- ```typescript
159
- const results = await search.search('authentication tokens', {
160
- limit: 10,
161
- model: 'Guide', // filter by document model
162
- where: { status: 'published' }, // filter by metadata fields
163
- })
164
- ```
165
-
166
- Returns results ranked by BM25 relevance with highlighted snippets.
167
-
168
- ### Vector Similarity Search
169
-
170
- Embeds the query and computes cosine similarity against all stored chunk embeddings:
171
-
172
- ```typescript
173
- const results = await search.vectorSearch('how do users prove their identity', {
174
- limit: 10,
175
- })
176
- ```
177
-
178
- Finds conceptually related content even without keyword overlap. Results are deduplicated by document, keeping the best-scoring chunk per document.
179
-
180
- ### Hybrid Search (Recommended)
181
-
182
- Runs both BM25 and vector search in parallel, then fuses results using Reciprocal Rank Fusion:
183
-
184
- ```typescript
185
- const results = await search.hybridSearch('authentication flow', {
186
- limit: 10,
187
- model: 'Guide',
188
- where: { category: 'security' },
189
- })
190
- ```
191
-
192
- This gives the best results for most queries -- keyword precision combined with semantic recall.
193
-
194
- ## Search Results
195
-
196
- All search methods return `SearchResult[]`:
197
-
198
- ```typescript
199
- interface SearchResult {
200
- pathId: string // document identifier
201
- model: string // content model name
202
- title: string // document title
203
- meta: Record<string, any> // document metadata
204
- score: number // relevance score
205
- snippet: string // matched text excerpt
206
- matchedSection?: string // section heading where the match occurred
207
- headingPath?: string // full heading breadcrumb (e.g. "Auth > OAuth2 > Tokens")
208
- }
209
- ```
210
-
211
- ## Embedding Providers
212
-
213
- ### OpenAI (default)
214
-
215
- Uses the OpenAI embeddings API. Requires an `openai` client registered in the container.
216
-
217
- ```typescript
218
- const search = container.feature('semanticSearch', {
219
- embeddingProvider: 'openai',
220
- embeddingModel: 'text-embedding-3-small', // 1536 dimensions
221
- // also available: 'text-embedding-3-large' (3072 dimensions)
222
- })
223
- ```
224
-
225
- ### Local (GGUF)
226
-
227
- Runs embeddings locally using `node-llama-cpp` with a GGUF model file:
228
-
229
- ```typescript
230
- const search = container.feature('semanticSearch', {
231
- embeddingProvider: 'local',
232
- embeddingModel: 'embedding-gemma-300M-Q8_0', // 768 dimensions
233
- })
234
-
235
- // Install the dependency if needed
236
- await search.installLocalEmbeddings(process.cwd())
237
- ```
238
-
239
- Local models are loaded from `~/.cache/luca/models/` or `~/.cache/qmd/models/`. The model is kept in memory and automatically disposed after 5 minutes of inactivity.
240
-
241
- ## Index Management
242
-
243
- ### Incremental Updates
244
-
245
- The feature tracks content hashes to avoid re-embedding unchanged documents:
246
-
247
- ```typescript
248
- // Check if a document needs re-indexing
249
- if (search.needsReindex(doc)) {
250
- search.removeDocument(doc.pathId)
251
- await search.indexDocuments([doc])
252
- }
253
- ```
254
-
255
- ### Remove Stale Documents
256
-
257
- Clean up documents that no longer exist in your collection:
258
-
259
- ```typescript
260
- const currentIds = ['guides/auth', 'guides/deployment']
261
- search.removeStale(currentIds) // deletes any indexed docs not in this list
262
- ```
263
-
264
- ### Full Reindex
265
-
266
- Clear everything and start fresh:
267
-
268
- ```typescript
269
- await search.reindex() // clears all data
270
- await search.indexDocuments(allDocs) // re-index everything
271
- ```
272
-
273
- ### Index Status
274
-
275
- ```typescript
276
- const stats = search.getStats()
277
- // {
278
- // documentCount: 42,
279
- // chunkCount: 187,
280
- // embeddingCount: 187,
281
- // lastIndexedAt: '2026-03-06T...',
282
- // provider: 'openai',
283
- // model: 'text-embedding-3-small',
284
- // dimensions: 1536,
285
- // dbSizeBytes: 2457600,
286
- // }
287
- ```
288
-
289
- ## Database Scoping
290
-
291
- Each provider/model combination gets its own SQLite file. If you configure `dbPath: '.contentbase/search.sqlite'` with the OpenAI provider and `text-embedding-3-small` model, the actual file will be `.contentbase/search.openai-text-embedding-3-small.sqlite`. This prevents dimension mismatches if you switch providers.
292
-
293
- ## ContentDb Integration Details
294
-
295
- When using `contentDb.buildSearchIndex()`, the feature automatically:
296
-
297
- - Extracts sections from your markdown documents at H2 boundaries
298
- - Converts each document to a `DocumentInput` with pathId, title, meta, and sections
299
- - Skips unchanged documents (incremental by default)
300
- - Removes documents that no longer exist in the collection
301
-
302
- ```typescript
303
- const db = container.feature('contentDb', { rootPath: './docs' })
304
- await db.load()
305
-
306
- // Incremental update (default)
307
- const { indexed, total } = await db.buildSearchIndex()
308
- console.log(`Indexed ${indexed} of ${total} documents`)
309
-
310
- // Force full rebuild
311
- await db.rebuildSearchIndex()
312
-
313
- // Check index health
314
- console.log(db.searchIndexStatus)
315
- ```
316
-
317
- ## Lifecycle
318
-
319
- Always close the feature when done to release the SQLite connection and any loaded models:
320
-
321
- ```typescript
322
- await search.close()
323
- ```
324
-
325
- The feature emits events you can listen to:
326
-
327
- ```typescript
328
- search.on('dbReady', () => console.log('Database initialized'))
329
- search.on('indexed', ({ documents, chunks }) => {
330
- console.log(`Indexed ${documents} docs (${chunks} chunks)`)
331
- })
332
- search.on('modelLoaded', () => console.log('Local embedding model loaded'))
333
- search.on('modelDisposed', () => console.log('Local embedding model released'))
334
- ```