luca 3.0.0 → 3.1.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.
- package/.github/workflows/release.yaml +1 -0
- package/CLAUDE.md +10 -2
- package/README.md +130 -112
- package/assistants/codingAssistant/CORE.md +6 -1
- package/assistants/codingAssistant/hooks.ts +1 -1
- package/assistants/inkbot/hooks.ts +1 -1
- package/assistants/inkbot/tools.ts +1 -1
- package/bun.lock +264 -321
- package/commands/audit-docs.ts +2 -2
- package/commands/build-bootstrap.ts +2 -3
- package/commands/build-python-bridge.ts +2 -3
- package/commands/build-scaffolds.ts +2 -3
- package/commands/bundle-consumer-project.ts +521 -0
- package/commands/generate-api-docs.ts +2 -2
- package/commands/inkbot.ts +2 -2
- package/commands/release.ts +2 -2
- package/commands/social.ts +137 -0
- package/commands/try-all-challenges.ts +3 -3
- package/commands/try-challenge.ts +3 -3
- package/datasets/lora/agentic-loop-session-candidates.jsonl +91 -0
- package/datasets/lora/agentic-loop-session-curation-summary.json +123 -0
- package/datasets/lora/luca-session-candidates.jsonl +29 -0
- package/datasets/lora/luca-session-curation-summary.json +121 -0
- package/datasets/lora/review-batch-1.jsonl +30 -0
- package/datasets/lora/review-manifest.json +41 -0
- package/datasets/lora/review-queue.jsonl +120 -0
- package/datasets/lora/review-schema.json +134 -0
- package/datasets/lora/review-template.jsonl +2 -0
- package/datasets/lora/review-ui.html +725 -0
- package/dist/agi/container.server.d.ts +2 -2
- package/dist/agi/features/assistant.d.ts +2 -2
- package/dist/agi/features/assistants-manager.d.ts +1 -1
- package/dist/agi/features/autonomous-assistant.d.ts +1 -1
- package/dist/agi/features/browser-use.d.ts +1 -1
- package/dist/agi/features/claude-code.d.ts +1 -1
- package/dist/agi/features/conversation-history.d.ts +2 -2
- package/dist/agi/features/conversation.d.ts +1 -1
- package/dist/agi/features/docs-reader.d.ts +1 -1
- package/dist/agi/features/file-tools.d.ts +1 -1
- package/dist/agi/features/luca-coder.d.ts +1 -1
- package/dist/agi/features/openai-codex.d.ts +1 -1
- package/dist/agi/features/skills-library.d.ts +1 -1
- package/dist/clients/civitai/index.d.ts +4 -4
- package/dist/clients/client-template.d.ts +4 -4
- package/dist/clients/comfyui/index.d.ts +2 -2
- package/dist/clients/elevenlabs/index.d.ts +2 -2
- package/dist/clients/openai/index.d.ts +2 -2
- package/dist/clients/supabase/index.d.ts +3 -3
- package/dist/command.d.ts +1 -1
- package/dist/node/container.d.ts +1 -1
- package/dist/node/features/helpers.d.ts +3 -3
- package/dist/node/features/semantic-search.d.ts +1 -1
- package/dist/node/features/vm.d.ts +3 -3
- package/dist/node.d.ts +1 -1
- package/dist/scaffolds/generated.d.ts +1 -1
- package/dist/selector.d.ts +1 -1
- package/features/cipher-social.ts +493 -0
- package/index.html +217 -190
- package/luca.console.ts +1 -1
- package/package.json +7 -2
- package/public/index.html +217 -190
- package/public/slides-ai-native.html +1 -1
- package/public/slides-intro.html +2 -2
- package/scripts/curate-claude-sessions.ts +561 -0
- package/scripts/examples/ask-luca-expert.ts +1 -1
- package/scripts/examples/assistant-questions.ts +1 -1
- package/scripts/examples/excalidraw-expert.ts +1 -1
- package/scripts/examples/file-manager.ts +1 -1
- package/scripts/examples/ideas.ts +1 -1
- package/scripts/examples/interactive-chat.ts +1 -1
- package/scripts/examples/opening-a-web-browser.ts +1 -1
- package/scripts/examples/telegram-bot.ts +1 -1
- package/scripts/examples/using-assistant-with-mcp.ts +1 -1
- package/scripts/examples/using-claude-code.ts +1 -1
- package/scripts/examples/using-contentdb.ts +2 -2
- package/scripts/examples/using-conversations.ts +1 -1
- package/scripts/examples/using-disk-cache.ts +1 -1
- package/scripts/examples/using-docker-shell.ts +1 -1
- package/scripts/examples/using-elevenlabs.ts +1 -1
- package/scripts/examples/using-google-calendar.ts +1 -1
- package/scripts/examples/using-google-docs.ts +1 -1
- package/scripts/examples/using-google-drive.ts +1 -1
- package/scripts/examples/using-google-sheets.ts +1 -1
- package/scripts/examples/using-nlp.ts +1 -1
- package/scripts/examples/using-ollama.ts +1 -1
- package/scripts/examples/using-postgres.ts +1 -1
- package/scripts/examples/using-runpod.ts +1 -1
- package/scripts/examples/using-tts.ts +1 -1
- package/scripts/scaffold.ts +5 -5
- package/scripts/scratch.ts +1 -1
- package/scripts/test-assistant-hooks.ts +1 -1
- package/scripts/test-docs-reader.ts +1 -1
- package/src/agi/container.server.ts +6 -2
- package/src/agi/features/agent-memory.ts +25 -25
- package/src/agi/features/assistant.ts +34 -5
- package/src/agi/features/assistants-manager.ts +122 -6
- package/src/agi/features/autonomous-assistant.ts +1 -1
- package/src/agi/features/browser-use.ts +20 -1
- package/src/agi/features/claude-code.ts +51 -5
- package/src/agi/features/coding-tools.ts +1 -1
- package/src/agi/features/conversation-history.ts +181 -4
- package/src/agi/features/conversation.ts +186 -15
- package/src/agi/features/docs-reader.ts +2 -2
- package/src/agi/features/file-tools.ts +49 -2
- package/src/agi/features/luca-coder.ts +7 -5
- package/src/agi/features/mcp-bridge.ts +532 -0
- package/src/agi/features/openai-codex.ts +2 -2
- package/src/agi/features/skills-library.ts +131 -52
- package/src/agi/lib/token-counter.ts +80 -0
- package/src/bootstrap/generated.ts +56 -57
- package/src/browser.ts +1 -1
- package/src/cli/build-info.ts +2 -2
- package/src/cli/cli.ts +2 -2
- package/src/clients/civitai/index.ts +5 -5
- package/src/clients/client-template.ts +4 -4
- package/src/clients/comfyui/index.ts +4 -4
- package/src/clients/elevenlabs/index.ts +4 -4
- package/src/clients/openai/index.ts +7 -7
- package/src/clients/supabase/index.ts +4 -4
- package/src/clients/voicebox/index.ts +4 -4
- package/src/command.ts +2 -1
- package/src/commands/chat.ts +1 -0
- package/src/commands/eval.ts +2 -56
- package/src/commands/introspect.ts +1 -1
- package/src/commands/prompt.ts +41 -9
- package/src/container-describer.ts +8 -1
- package/src/container.ts +13 -0
- package/src/entity.ts +2 -2
- package/src/helper.ts +1 -1
- package/src/introspection/generated.agi.ts +29596 -27654
- package/src/introspection/generated.node.ts +20284 -19247
- package/src/introspection/generated.web.ts +605 -584
- package/src/introspection/scan.ts +11 -6
- package/src/node/container.ts +9 -1
- package/src/node/features/content-db.ts +39 -2
- package/src/node/features/display-result.ts +57 -0
- package/src/node/features/helpers.ts +46 -7
- package/src/node/features/python.ts +25 -19
- package/src/node/features/repl.ts +1 -1
- package/src/node/features/secure-shell.ts +11 -17
- package/src/node/features/semantic-search.ts +2 -2
- package/src/node/features/socket-repl.ts +336 -0
- package/src/node/features/telnyx-assistant-connector.ts +1206 -0
- package/src/node/features/transpiler.ts +2 -3
- package/src/node/features/ui.ts +5 -0
- package/src/node/features/vm.ts +20 -3
- package/src/node.ts +3 -3
- package/src/python/generated.ts +0 -1
- package/src/scaffolds/generated.ts +82 -83
- package/src/selector.ts +1 -1
- package/src/servers/express.ts +1 -1
- package/src/web/features/helpers.ts +22 -0
- package/tsconfig.json +12 -12
- package/docs/CLI.md +0 -335
- package/docs/CNAME +0 -1
- package/docs/README.md +0 -60
- package/docs/TABLE-OF-CONTENTS.md +0 -183
- package/docs/apis/clients/elevenlabs.md +0 -308
- package/docs/apis/clients/graph.md +0 -107
- package/docs/apis/clients/openai.md +0 -429
- package/docs/apis/clients/rest.md +0 -161
- package/docs/apis/clients/websocket.md +0 -174
- package/docs/apis/features/agi/assistant.md +0 -625
- package/docs/apis/features/agi/assistants-manager.md +0 -282
- package/docs/apis/features/agi/auto-assistant.md +0 -279
- package/docs/apis/features/agi/browser-use.md +0 -802
- package/docs/apis/features/agi/claude-code.md +0 -884
- package/docs/apis/features/agi/conversation-history.md +0 -364
- package/docs/apis/features/agi/conversation.md +0 -548
- package/docs/apis/features/agi/docs-reader.md +0 -99
- package/docs/apis/features/agi/file-tools.md +0 -163
- package/docs/apis/features/agi/luca-coder.md +0 -407
- package/docs/apis/features/agi/openai-codex.md +0 -396
- package/docs/apis/features/agi/openapi.md +0 -138
- package/docs/apis/features/agi/semantic-search.md +0 -387
- package/docs/apis/features/agi/skills-library.md +0 -239
- package/docs/apis/features/node/container-link.md +0 -192
- package/docs/apis/features/node/content-db.md +0 -450
- package/docs/apis/features/node/disk-cache.md +0 -379
- package/docs/apis/features/node/dns.md +0 -652
- package/docs/apis/features/node/docker.md +0 -706
- package/docs/apis/features/node/downloader.md +0 -81
- package/docs/apis/features/node/esbuild.md +0 -60
- package/docs/apis/features/node/file-manager.md +0 -191
- package/docs/apis/features/node/fs.md +0 -1217
- package/docs/apis/features/node/git.md +0 -371
- package/docs/apis/features/node/google-auth.md +0 -193
- package/docs/apis/features/node/google-calendar.md +0 -202
- package/docs/apis/features/node/google-docs.md +0 -173
- package/docs/apis/features/node/google-drive.md +0 -246
- package/docs/apis/features/node/google-mail.md +0 -214
- package/docs/apis/features/node/google-sheets.md +0 -194
- package/docs/apis/features/node/grep.md +0 -292
- package/docs/apis/features/node/helpers.md +0 -164
- package/docs/apis/features/node/ink.md +0 -334
- package/docs/apis/features/node/ipc-socket.md +0 -249
- package/docs/apis/features/node/json-tree.md +0 -86
- package/docs/apis/features/node/networking.md +0 -316
- package/docs/apis/features/node/nlp.md +0 -133
- package/docs/apis/features/node/opener.md +0 -97
- package/docs/apis/features/node/os.md +0 -146
- package/docs/apis/features/node/package-finder.md +0 -392
- package/docs/apis/features/node/postgres.md +0 -234
- package/docs/apis/features/node/proc.md +0 -399
- package/docs/apis/features/node/process-manager.md +0 -305
- package/docs/apis/features/node/python.md +0 -604
- package/docs/apis/features/node/redis.md +0 -380
- package/docs/apis/features/node/repl.md +0 -88
- package/docs/apis/features/node/runpod.md +0 -674
- package/docs/apis/features/node/secure-shell.md +0 -176
- package/docs/apis/features/node/semantic-search.md +0 -408
- package/docs/apis/features/node/sqlite.md +0 -233
- package/docs/apis/features/node/telegram.md +0 -279
- package/docs/apis/features/node/transpiler.md +0 -74
- package/docs/apis/features/node/tts.md +0 -133
- package/docs/apis/features/node/ui.md +0 -701
- package/docs/apis/features/node/vault.md +0 -59
- package/docs/apis/features/node/vm.md +0 -75
- package/docs/apis/features/node/yaml-tree.md +0 -85
- package/docs/apis/features/node/yaml.md +0 -176
- package/docs/apis/features/web/asset-loader.md +0 -59
- package/docs/apis/features/web/container-link.md +0 -192
- package/docs/apis/features/web/esbuild.md +0 -54
- package/docs/apis/features/web/helpers.md +0 -164
- package/docs/apis/features/web/network.md +0 -44
- package/docs/apis/features/web/speech.md +0 -69
- package/docs/apis/features/web/vault.md +0 -59
- package/docs/apis/features/web/vm.md +0 -75
- package/docs/apis/features/web/voice.md +0 -84
- package/docs/apis/servers/express.md +0 -171
- package/docs/apis/servers/mcp.md +0 -238
- package/docs/apis/servers/websocket.md +0 -170
- package/docs/bootstrap/CLAUDE.md +0 -101
- package/docs/bootstrap/SKILL.md +0 -341
- package/docs/bootstrap/templates/about-command.ts +0 -41
- package/docs/bootstrap/templates/docs-models.ts +0 -22
- package/docs/bootstrap/templates/docs-readme.md +0 -43
- package/docs/bootstrap/templates/example-feature.ts +0 -53
- package/docs/bootstrap/templates/health-endpoint.ts +0 -15
- package/docs/bootstrap/templates/luca-cli.ts +0 -30
- package/docs/bootstrap/templates/runme.md +0 -54
- package/docs/challenges/caching-proxy.md +0 -16
- package/docs/challenges/content-db-round-trip.md +0 -14
- package/docs/challenges/custom-command.md +0 -9
- package/docs/challenges/file-watcher-pipeline.md +0 -11
- package/docs/challenges/grep-audit-report.md +0 -15
- package/docs/challenges/multi-feature-dashboard.md +0 -14
- package/docs/challenges/process-orchestrator.md +0 -17
- package/docs/challenges/rest-api-server-with-client.md +0 -12
- package/docs/challenges/script-runner-with-vm.md +0 -11
- package/docs/challenges/simple-rest-api.md +0 -15
- package/docs/challenges/websocket-serve-and-client.md +0 -11
- package/docs/challenges/yaml-config-system.md +0 -14
- package/docs/command-system-overhaul.md +0 -94
- package/docs/documentation-audit.md +0 -134
- package/docs/examples/assistant/CORE.md +0 -18
- package/docs/examples/assistant/hooks.ts +0 -3
- package/docs/examples/assistant/tools.ts +0 -10
- package/docs/examples/assistant-hooks-reference.ts +0 -171
- package/docs/examples/assistant-with-process-manager.md +0 -84
- package/docs/examples/content-db.md +0 -77
- package/docs/examples/disk-cache.md +0 -83
- package/docs/examples/docker.md +0 -101
- package/docs/examples/downloader.md +0 -70
- package/docs/examples/entity.md +0 -124
- package/docs/examples/esbuild.md +0 -80
- package/docs/examples/feature-as-tool-provider.md +0 -143
- package/docs/examples/file-manager.md +0 -82
- package/docs/examples/fs.md +0 -83
- package/docs/examples/git.md +0 -85
- package/docs/examples/google-auth.md +0 -88
- package/docs/examples/google-calendar.md +0 -94
- package/docs/examples/google-docs.md +0 -82
- package/docs/examples/google-drive.md +0 -96
- package/docs/examples/google-sheets.md +0 -95
- package/docs/examples/grep.md +0 -85
- package/docs/examples/ink-blocks.md +0 -75
- package/docs/examples/ink-renderer.md +0 -41
- package/docs/examples/ink.md +0 -103
- package/docs/examples/ipc-socket.md +0 -103
- package/docs/examples/json-tree.md +0 -91
- package/docs/examples/networking.md +0 -58
- package/docs/examples/nlp.md +0 -91
- package/docs/examples/opener.md +0 -78
- package/docs/examples/os.md +0 -72
- package/docs/examples/package-finder.md +0 -89
- package/docs/examples/postgres.md +0 -91
- package/docs/examples/proc.md +0 -81
- package/docs/examples/process-manager.md +0 -79
- package/docs/examples/python.md +0 -132
- package/docs/examples/repl.md +0 -93
- package/docs/examples/runpod.md +0 -119
- package/docs/examples/secure-shell.md +0 -92
- package/docs/examples/sqlite.md +0 -86
- package/docs/examples/structured-output-with-assistants.md +0 -144
- package/docs/examples/telegram.md +0 -77
- package/docs/examples/tts.md +0 -86
- package/docs/examples/ui.md +0 -80
- package/docs/examples/vault.md +0 -70
- package/docs/examples/vm.md +0 -86
- package/docs/examples/websocket-ask-and-reply-example.md +0 -128
- package/docs/examples/yaml-tree.md +0 -93
- package/docs/examples/yaml.md +0 -104
- package/docs/ideas/assistant-factory-pattern.md +0 -142
- package/docs/in-memory-fs.md +0 -4
- package/docs/introspection-audit.md +0 -49
- package/docs/introspection.md +0 -164
- package/docs/mcp/readme.md +0 -162
- package/docs/models.ts +0 -41
- package/docs/philosophy.md +0 -86
- package/docs/principles.md +0 -7
- package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +0 -34
- package/docs/prompts/check-for-undocumented-features.md +0 -27
- package/docs/prompts/mcp-test-easy-command.md +0 -27
- package/docs/scaffolds/client.md +0 -149
- package/docs/scaffolds/command.md +0 -120
- package/docs/scaffolds/endpoint.md +0 -171
- package/docs/scaffolds/feature.md +0 -158
- package/docs/scaffolds/selector.md +0 -91
- package/docs/scaffolds/server.md +0 -196
- package/docs/selectors.md +0 -115
- package/docs/sessions/custom-command/attempt-log-2.md +0 -195
- package/docs/sessions/file-watcher-pipeline/attempt-log-1.md +0 -728
- package/docs/sessions/file-watcher-pipeline/attempt-log-2.md +0 -555
- package/docs/sessions/grep-audit-report/attempt-log-1.md +0 -289
- package/docs/sessions/multi-feature-dashboard/attempt-log-2.md +0 -679
- package/docs/sessions/rest-api-server-with-client/attempt-log-1.md +0 -1
- package/docs/sessions/rest-api-server-with-client/attempt-log-3.md +0 -920
- package/docs/sessions/simple-rest-api/attempt-log-1.md +0 -593
- package/docs/sessions/websocket-serve-and-client/attempt-log-2.md +0 -995
- package/docs/tutorials/00-bootstrap.md +0 -166
- package/docs/tutorials/01-getting-started.md +0 -106
- package/docs/tutorials/02-container.md +0 -210
- package/docs/tutorials/03-scripts.md +0 -194
- package/docs/tutorials/04-features-overview.md +0 -196
- package/docs/tutorials/05-state-and-events.md +0 -171
- package/docs/tutorials/06-servers.md +0 -157
- package/docs/tutorials/07-endpoints.md +0 -198
- package/docs/tutorials/08-commands.md +0 -252
- package/docs/tutorials/09-clients.md +0 -162
- package/docs/tutorials/10-creating-features.md +0 -203
- package/docs/tutorials/11-contentbase.md +0 -191
- package/docs/tutorials/12-assistants.md +0 -215
- package/docs/tutorials/13-introspection.md +0 -157
- package/docs/tutorials/14-type-system.md +0 -174
- package/docs/tutorials/15-project-patterns.md +0 -222
- package/docs/tutorials/16-google-features.md +0 -534
- package/docs/tutorials/17-tui-blocks.md +0 -530
- package/docs/tutorials/18-semantic-search.md +0 -334
- package/docs/tutorials/19-python-sessions.md +0 -401
- package/docs/tutorials/20-browser-esm.md +0 -234
- package/index.ts +0 -1
- package/src/agi/endpoints/ask.ts +0 -60
- package/src/agi/endpoints/conversations/[id].ts +0 -45
- package/src/agi/endpoints/conversations.ts +0 -31
- package/src/agi/endpoints/experts.ts +0 -37
- package/test/assistant-hooks.test.ts +0 -306
- package/test/assistant.test.ts +0 -81
- package/test/bus.test.ts +0 -134
- package/test/clients-servers.test.ts +0 -217
- package/test/command.test.ts +0 -267
- package/test/container-link.test.ts +0 -274
- package/test/conversation.test.ts +0 -220
- package/test/features.test.ts +0 -160
- package/test/fork-and-research.test.ts +0 -450
- package/test/integration.test.ts +0 -787
- package/test/interceptor-chain.test.ts +0 -61
- package/test/node-container.test.ts +0 -121
- package/test/python-session.test.ts +0 -105
- package/test/rate-limit.test.ts +0 -272
- package/test/semantic-search.test.ts +0 -550
- package/test/state.test.ts +0 -121
- package/test/vm-context.test.ts +0 -146
- package/test/vm-loadmodule.test.ts +0 -213
- package/test/websocket-ask.test.ts +0 -101
- package/test-integration/assistant.test.ts +0 -138
- package/test-integration/assistants-manager.test.ts +0 -113
- package/test-integration/claude-code.test.ts +0 -98
- package/test-integration/conversation-history.test.ts +0 -205
- package/test-integration/conversation.test.ts +0 -137
- package/test-integration/elevenlabs.test.ts +0 -55
- package/test-integration/google-services.test.ts +0 -80
- package/test-integration/helpers.ts +0 -89
- package/test-integration/memory.test.ts +0 -204
- package/test-integration/openai-codex.test.ts +0 -93
- package/test-integration/runpod.test.ts +0 -58
- package/test-integration/server-endpoints.test.ts +0 -97
- 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.
|