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,191 +0,0 @@
1
- ---
2
- title: Contentbase - Markdown as a Database
3
- tags: [contentbase, contentdb, markdown, database, models, query, collections]
4
- ---
5
-
6
- # Contentbase - Markdown as a Database
7
-
8
- Contentbase lets you treat folders of markdown files as queryable database collections. Define models with Zod schemas, extract structured data from frontmatter and content, and query it with a fluent API.
9
-
10
- ## Setup
11
-
12
- ```typescript
13
- import container from '@soederpop/luca'
14
-
15
- const db = container.feature('contentDb', { rootPath: './content' })
16
- const { defineModel, section, hasMany, belongsTo } = db.library
17
- ```
18
-
19
- ## Directory Structure
20
-
21
- ```
22
- content/
23
- ├── posts/
24
- │ ├── hello-world.md
25
- │ ├── getting-started.md
26
- │ └── advanced-tips.md
27
- ├── authors/
28
- │ ├── alice.md
29
- │ └── bob.md
30
- └── tags/
31
- ├── javascript.md
32
- └── typescript.md
33
- ```
34
-
35
- ## Defining Models
36
-
37
- Models map to subdirectories and define the shape of your content:
38
-
39
- ```typescript
40
- import { z } from 'zod'
41
-
42
- const Post = defineModel('Post', {
43
- // Maps to content/posts/
44
- prefix: 'posts',
45
-
46
- // Frontmatter schema
47
- meta: z.object({
48
- title: z.string(),
49
- date: z.string(),
50
- status: z.enum(['draft', 'published', 'archived']),
51
- author: z.string().optional(),
52
- tags: z.array(z.string()).default([]),
53
- }),
54
-
55
- // Extract structured data from the markdown body
56
- sections: {
57
- summary: section('Summary', {
58
- extract: (query) => query.select('paragraph')?.toString() || '',
59
- schema: z.string(),
60
- }),
61
- codeExamples: section('Code Examples', {
62
- extract: (query) => query.selectAll('code').map((n: any) => n.toString()),
63
- schema: z.array(z.string()),
64
- }),
65
- },
66
-
67
- // Relationships
68
- relationships: {
69
- author: belongsTo(() => Author, { key: 'meta.author' }),
70
- tags: hasMany(() => Tag, { heading: 'Tags' }),
71
- },
72
- })
73
-
74
- const Author = defineModel('Author', {
75
- prefix: 'authors',
76
- meta: z.object({
77
- name: z.string(),
78
- email: z.string().email(),
79
- role: z.enum(['writer', 'editor', 'admin']),
80
- }),
81
- relationships: {
82
- posts: hasMany(() => Post, { foreignKey: 'meta.author' }),
83
- },
84
- })
85
- ```
86
-
87
- ## Registering and Loading
88
-
89
- ```typescript
90
- db.register(Post)
91
- db.register(Author)
92
- await db.load() // Parses all markdown files and builds the queryable index
93
- ```
94
-
95
- ## Querying
96
-
97
- Contentbase provides a fluent query API:
98
-
99
- ```typescript
100
- // Fetch all posts
101
- const allPosts = await db.query(Post).fetchAll()
102
-
103
- // Filter by frontmatter fields
104
- const published = await db.query(Post)
105
- .where('meta.status', 'published')
106
- .fetchAll()
107
-
108
- // Multiple filters
109
- const recentPosts = await db.query(Post)
110
- .where('meta.status', 'published')
111
- .where('meta.tags', 'includes', 'javascript')
112
- .fetchAll()
113
-
114
- // Get a single document by slug (filename without .md)
115
- const post = await db.query(Post).find('hello-world')
116
- ```
117
-
118
- ## Markdown File Format
119
-
120
- Each markdown file has YAML frontmatter and a body:
121
-
122
- ```markdown
123
- ---
124
- title: Hello World
125
- date: 2024-01-15
126
- status: published
127
- author: alice
128
- tags: [javascript, tutorial]
129
- ---
130
-
131
- # Hello World
132
-
133
- This is the post content.
134
-
135
- ## Summary
136
-
137
- A brief introduction to our blog.
138
-
139
- ## Code Examples
140
-
141
- \`\`\`javascript
142
- console.log('Hello!')
143
- \`\`\`
144
- ```
145
-
146
- ## Use Cases
147
-
148
- - **Documentation sites** -- query and render docs with frontmatter metadata
149
- - **Blog engines** -- posts with authors, tags, categories
150
- - **Knowledge bases** -- structured content with relationships
151
- - **Project management** -- epics, stories, tasks as markdown with status tracking
152
- - **Configuration** -- human-readable config files that are also queryable
153
-
154
- ## Full Example: Blog Engine
155
-
156
- ```typescript
157
- import container from '@soederpop/luca'
158
- import { z } from 'zod'
159
-
160
- const db = container.feature('contentDb', { rootPath: './blog' })
161
- const { defineModel, section, hasMany } = db.library
162
-
163
- const Post = defineModel('Post', {
164
- prefix: 'posts',
165
- meta: z.object({
166
- title: z.string(),
167
- date: z.string(),
168
- status: z.enum(['draft', 'published']),
169
- tags: z.array(z.string()).default([]),
170
- }),
171
- sections: {
172
- excerpt: section('Excerpt', {
173
- extract: (q) => q.select('paragraph')?.toString() || '',
174
- schema: z.string(),
175
- }),
176
- },
177
- })
178
-
179
- db.register(Post)
180
- await db.load()
181
-
182
- // Get published posts for the homepage
183
- const posts = await db.query(Post)
184
- .where('meta.status', 'published')
185
- .fetchAll()
186
-
187
- for (const post of posts) {
188
- console.log(`${post.meta.title} (${post.meta.date})`)
189
- console.log(` ${post.sections.excerpt}`)
190
- }
191
- ```
@@ -1,215 +0,0 @@
1
- ---
2
- title: Building Assistants
3
- tags: [assistants, ai, openai, tools, hooks, conversation, CORE.md]
4
- ---
5
-
6
- # Building Assistants
7
-
8
- Assistants are AI-powered conversational agents defined by a file-based convention. Each assistant lives in its own folder with a system prompt, tools, hooks, and documentation.
9
-
10
- ## Directory Structure
11
-
12
- ```
13
- assistants/my-assistant/
14
- ├── CORE.md # System prompt (required)
15
- ├── tools.ts # Tool definitions with Zod schemas
16
- ├── hooks.ts # Lifecycle event handlers
17
- └── docs/ # Internal documentation the assistant can search
18
- ├── guide.md
19
- └── faq.md
20
- ```
21
-
22
- ## CORE.md -- The System Prompt
23
-
24
- This is the assistant's personality and instructions. It's a markdown file that becomes the system message:
25
-
26
- ```markdown
27
- # Customer Support Assistant
28
-
29
- You are a helpful customer support agent for Acme Corp. You help users with
30
- billing questions, account issues, and product information.
31
-
32
- Always research internal docs before answering product questions.
33
- Be polite and concise.
34
- ```
35
-
36
- ## tools.ts -- Tool Definitions
37
-
38
- Define functions that the assistant can call. Each tool has a Zod schema describing its parameters:
39
-
40
- ```typescript
41
- const { z } = require('zod')
42
-
43
- async function lookupOrder({ orderId }) {
44
- // In a real app, query your database
45
- return {
46
- orderId,
47
- status: 'shipped',
48
- trackingNumber: 'ABC123',
49
- estimatedDelivery: '2024-01-20',
50
- }
51
- }
52
-
53
- async function createTicket({ subject, priority, description }) {
54
- // Create a support ticket
55
- const ticketId = `TICKET-${Date.now()}`
56
- return {
57
- ticketId,
58
- subject,
59
- priority,
60
- message: `Ticket ${ticketId} created successfully`,
61
- }
62
- }
63
-
64
- async function searchProducts({ query, category }) {
65
- // Search product catalog
66
- return {
67
- results: [
68
- { name: 'Widget Pro', price: 29.99, inStock: true },
69
- { name: 'Widget Lite', price: 19.99, inStock: false },
70
- ],
71
- }
72
- }
73
-
74
- const schemas = {
75
- lookupOrder: z.object({
76
- orderId: z.string().describe('The order ID to look up'),
77
- }).describe('Look up an order by its ID to get status and tracking info'),
78
-
79
- createTicket: z.object({
80
- subject: z.string().describe('Brief ticket subject line'),
81
- priority: z.enum(['low', 'medium', 'high']).describe('Ticket priority'),
82
- description: z.string().describe('Detailed description of the issue'),
83
- }).describe('Create a new support ticket'),
84
-
85
- searchProducts: z.object({
86
- query: z.string().describe('Search terms'),
87
- category: z.string().optional().describe('Product category filter'),
88
- }).describe('Search the product catalog'),
89
- }
90
-
91
- module.exports = { lookupOrder, createTicket, searchProducts, schemas }
92
- ```
93
-
94
- **Important:** The function name must match the key in the `schemas` object. The `.describe()` on the schema object itself becomes the tool description that the AI model sees.
95
-
96
- ## hooks.ts -- Lifecycle Hooks
97
-
98
- React to assistant events:
99
-
100
- ```typescript
101
- function started() {
102
- console.log('[assistant] Session started')
103
- }
104
-
105
- function response(text) {
106
- // Called when the assistant produces a text response
107
- console.log(`[assistant] ${text.slice(0, 100)}...`)
108
- }
109
-
110
- function toolCall(name, args) {
111
- // Called before a tool is executed
112
- console.log(`[assistant] Calling tool: ${name}`, args)
113
- }
114
-
115
- function error(err) {
116
- console.error('[assistant] Error:', err.message)
117
- }
118
-
119
- module.exports = { started, response, toolCall, error }
120
- ```
121
-
122
- ## docs/ -- Internal Documentation
123
-
124
- The `docs/` folder contains markdown files that the assistant can search using the built-in `researchInternalDocs` tool. This is automatically injected -- you don't need to define it in tools.ts.
125
-
126
- ```
127
- docs/
128
- ├── billing-faq.md
129
- ├── product-catalog.md
130
- ├── return-policy.md
131
- └── troubleshooting.md
132
- ```
133
-
134
- In CORE.md, instruct the assistant to use it:
135
-
136
- ```markdown
137
- When asked about products, billing, or policies, always use the
138
- researchInternalDocs tool first to find accurate information before answering.
139
- ```
140
-
141
- ## Using the Assistant
142
-
143
- ### In a Script
144
-
145
- ```typescript
146
- import container from '@soederpop/luca'
147
-
148
- const assistant = container.feature('assistant', {
149
- folder: 'assistants/my-assistant',
150
- model: 'gpt-4o',
151
- })
152
-
153
- // Ask a question
154
- const answer = await assistant.ask('What is the return policy?')
155
- console.log(answer)
156
-
157
- // Multi-turn conversation
158
- const follow = await assistant.ask('And how long does the refund take?')
159
- console.log(follow)
160
-
161
- // Save the conversation
162
- await assistant.save({ title: 'Return policy inquiry' })
163
- ```
164
-
165
- ### In an Endpoint
166
-
167
- Expose the assistant as an API:
168
-
169
- ```typescript
170
- // endpoints/ask.ts
171
- import { z } from 'zod'
172
- import type { EndpointContext } from '@soederpop/luca'
173
-
174
- export const path = '/api/ask'
175
- export const description = 'Ask the support assistant a question'
176
- export const tags = ['assistant']
177
-
178
- export const postSchema = z.object({
179
- question: z.string().describe('Your question'),
180
- })
181
-
182
- export async function post(params: z.infer<typeof postSchema>, ctx: EndpointContext) {
183
- const assistant = ctx.container.feature('assistant', {
184
- folder: 'assistants/my-assistant',
185
- model: 'gpt-4o',
186
- })
187
-
188
- const answer = await assistant.ask(params.question)
189
- return { answer }
190
- }
191
- ```
192
-
193
- ### Streaming Responses
194
-
195
- ```typescript
196
- const assistant = container.feature('assistant', {
197
- folder: 'assistants/my-assistant',
198
- model: 'gpt-4o',
199
- })
200
-
201
- // Listen for chunks as they arrive
202
- assistant.on('chunk', (text) => {
203
- process.stdout.write(text)
204
- })
205
-
206
- await assistant.ask('Explain quantum computing')
207
- ```
208
-
209
- ## Best Practices
210
-
211
- 1. **Write focused CORE.md prompts** -- tell the assistant exactly what it is and what it should/shouldn't do
212
- 2. **Keep tools simple** -- each tool should do one thing. The AI model is better at composing simple tools than using complex ones
213
- 3. **Use docs/ liberally** -- put all reference material in docs/ so the assistant can look things up rather than relying on the model's training data
214
- 4. **Use Zod `.describe()`** -- the descriptions on schemas and fields are what the model sees to decide when and how to call tools
215
- 5. **Test with real questions** -- ask the assistant the kinds of things real users will ask
@@ -1,157 +0,0 @@
1
- ---
2
- title: Introspection and Discovery
3
- tags: [introspection, runtime, discovery, documentation, describe, inspect]
4
- ---
5
-
6
- # Introspection and Discovery
7
-
8
- One of Luca's defining features is that everything is discoverable at runtime. You don't need to read documentation to learn what's available -- you can ask the system itself.
9
-
10
- ## Why Introspection Matters
11
-
12
- Introspection serves two audiences:
13
-
14
- 1. **Developers** -- discover APIs while coding, without leaving the REPL or editor
15
- 2. **AI Agents** -- learn the full API surface dynamically, enabling them to use features they weren't explicitly trained on
16
-
17
- ## Container-Level Introspection
18
-
19
- ```typescript
20
- // Structured data about the entire container
21
- const info = container.introspect()
22
- // Returns: registries, enabled features, state schema, available helpers
23
-
24
- // Human-readable markdown
25
- const docs = container.introspectAsText()
26
- ```
27
-
28
- ## Registry-Level Discovery
29
-
30
- ```typescript
31
- // What's available?
32
- container.features.available
33
- // => ['fs', 'git', 'proc', 'vm', 'ui', 'diskCache', 'contentDb', ...]
34
-
35
- // Describe one
36
- container.features.describe('diskCache')
37
- // => Markdown documentation for diskCache feature
38
-
39
- // Describe everything
40
- container.features.describeAll()
41
- // => Full documentation for all registered features
42
-
43
- // Structured introspection data
44
- container.features.introspect('fs')
45
- // => { methods, getters, state, options, events, ... }
46
- ```
47
-
48
- Same API for all registries:
49
-
50
- ```typescript
51
- container.servers.available
52
- container.servers.describe('express')
53
-
54
- container.clients.available
55
- container.clients.describe('rest')
56
-
57
- container.commands.available
58
- container.commands.describe('serve')
59
- ```
60
-
61
- ## Helper-Level Introspection
62
-
63
- Every helper instance can describe itself:
64
-
65
- ```typescript
66
- const fs = container.feature('fs')
67
-
68
- // Structured data
69
- const info = fs.introspect()
70
- // => { className, methods: [...], getters: [...], state: {...}, events: [...] }
71
-
72
- // Human-readable markdown
73
- const docs = fs.introspectAsText()
74
- ```
75
-
76
- ### Quick Discovery with $getters and $methods
77
-
78
- Every helper exposes `$getters` and `$methods` — string arrays listing what's available on the instance. Useful for quick exploration without parsing the full introspection object:
79
-
80
- ```typescript
81
- const fs = container.feature('fs')
82
- fs.$methods // => ['readFile', 'writeFile', 'walk', 'readdir', ...]
83
- fs.$getters // => ['cwd', 'sep', ...]
84
- ```
85
-
86
- ### What's in the Introspection Data?
87
-
88
- - **Class name** and description (from JSDoc)
89
- - **Methods** -- name, description, parameters, return type
90
- - **Getters** -- name, description, type
91
- - **State schema** -- all observable state fields with descriptions
92
- - **Options schema** -- all configuration options with descriptions and defaults
93
- - **Events** -- known event names with descriptions
94
-
95
- ## How It Works
96
-
97
- Introspection comes from two sources:
98
-
99
- 1. **Build-time extraction** -- Luca's build step parses JSDoc comments, method signatures, and getter types from source code using AST analysis. Run `bun run build:introspection` to update this.
100
-
101
- 2. **Runtime Zod schemas** -- State, options, and events schemas provide descriptions, types, and defaults at runtime via Zod's `.describe()` method.
102
-
103
- ## Practical Example: Dynamic Tool Generation
104
-
105
- An AI agent can use introspection to generate tool definitions for any feature:
106
-
107
- ```typescript
108
- // Agent discovers available features
109
- const available = container.features.available
110
-
111
- // Agent learns about a specific feature
112
- const fsInfo = container.features.introspect('fs')
113
-
114
- // fsInfo.methods tells the agent:
115
- // - readFile(path: string): string
116
- // - writeFile(path: string, content: string): Promise<string>
117
- // - walk(basePath: string, options?: WalkOptions): { files: string[], directories: string[] }
118
- // etc.
119
-
120
- // The agent can now use these methods without prior training on the fs feature
121
- ```
122
-
123
- ## Using Introspection in Your Features
124
-
125
- Make your custom features introspectable by:
126
-
127
- 1. Writing JSDoc on the class, methods, and getters
128
- 2. Using Zod `.describe()` on schema fields
129
- 3. Running `bun run build:introspection` after changes
130
-
131
- ```typescript
132
- /**
133
- * Manages a pool of database connections with automatic health checking.
134
- * Connections are recycled when they become stale or unhealthy.
135
- */
136
- export class ConnectionPool extends Feature<PoolState, PoolOptions> {
137
- /**
138
- * Acquire a connection from the pool.
139
- * Blocks until a connection is available or the timeout is reached.
140
- */
141
- async acquire(timeout?: number): Promise<Connection> {
142
- // ...
143
- }
144
-
145
- /** The number of idle connections currently in the pool */
146
- get idleCount(): number {
147
- // ...
148
- }
149
-
150
- /** The number of active connections currently checked out */
151
- get activeCount(): number {
152
- // ...
153
- }
154
- }
155
- ```
156
-
157
- Now `container.features.describe('connectionPool')` returns rich documentation, and `container.features.introspect('connectionPool')` returns structured data -- all extracted from what you already wrote.