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.
- 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 +220 -322
- 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/try-all-challenges.ts +3 -3
- package/commands/try-challenge.ts +3 -3
- 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/index.html +217 -190
- package/luca.console.ts +1 -1
- package/package.json +2 -2
- package/public/index.html +217 -190
- package/public/slides-ai-native.html +1 -1
- package/public/slides-intro.html +2 -2
- 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 +28563 -27571
- package/src/introspection/generated.node.ts +20281 -20194
- package/src/introspection/generated.web.ts +605 -584
- package/src/introspection/scan.ts +11 -6
- package/src/node/container.ts +1 -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 +42 -15
- 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/transpiler.ts +2 -3
- package/src/node/features/ui.ts +5 -0
- package/src/node/features/vm.ts +3 -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/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,5 +1,4 @@
|
|
|
1
1
|
// Auto-generated bootstrap content
|
|
2
|
-
// Generated at: 2026-04-10T05:00:54.788Z
|
|
3
2
|
// Source: docs/bootstrap/*.md, docs/bootstrap/templates/*, docs/examples/*.md, docs/tutorials/*.md
|
|
4
3
|
//
|
|
5
4
|
// Do not edit manually. Run: luca build-bootstrap
|
|
@@ -7,11 +6,11 @@
|
|
|
7
6
|
export const bootstrapFiles: Record<string, string> = {
|
|
8
7
|
"SKILL": `---
|
|
9
8
|
name: Using the luca framework
|
|
10
|
-
description: The
|
|
9
|
+
description: The luca framework, when you see a project with docs/ commands/ features/ luca.cli.ts endpoints/ folders, or luca is in the package.json, or the user is asking you to develop a new Luca feature, use this skill to learn about the APIs and how to learn the framework at runtime. The luca cli bundles all of the documentation in a searchable, progressively learnable interface designed for students and AI assistants alike
|
|
11
10
|
---
|
|
12
11
|
# Luca: Learning the Container
|
|
13
12
|
|
|
14
|
-
The Luca framework
|
|
13
|
+
The Luca framework \`luca\` ships a \`luca\` binary — a bun-based CLI for a dependency injection container. This project is based on it if this skill is present. The container auto-discovers modules in \`commands/\`, \`clients/\`, \`servers/\`, \`features/\`, and \`endpoints/\` folders.
|
|
15
14
|
|
|
16
15
|
The \`luca\` cli loads typescript modules in through its VM which injects a \`container\` global that is a singleton object from which you can learn about, and access all different kinds of utils and Helpers (features, clients, servers, commands, and compositions thereof)
|
|
17
16
|
|
|
@@ -551,11 +550,11 @@ Content goes here.
|
|
|
551
550
|
- \`luca describe contentDb\` — runtime docs for the contentDb feature
|
|
552
551
|
`,
|
|
553
552
|
"example-feature": `import { z } from 'zod'
|
|
554
|
-
import { FeatureStateSchema, FeatureOptionsSchema } from '
|
|
555
|
-
import { Feature } from '
|
|
556
|
-
import type { ContainerContext } from '
|
|
553
|
+
import { FeatureStateSchema, FeatureOptionsSchema } from 'luca'
|
|
554
|
+
import { Feature } from 'luca'
|
|
555
|
+
import type { ContainerContext } from 'luca'
|
|
557
556
|
|
|
558
|
-
declare module '
|
|
557
|
+
declare module 'luca' {
|
|
559
558
|
interface AvailableFeatures {
|
|
560
559
|
example: typeof Example
|
|
561
560
|
}
|
|
@@ -612,7 +611,7 @@ export default Example
|
|
|
612
611
|
* For example: \`luca about commands\` → options._[1] === 'commands'
|
|
613
612
|
*/
|
|
614
613
|
import { z } from 'zod'
|
|
615
|
-
import type { ContainerContext } from '
|
|
614
|
+
import type { ContainerContext } from 'luca'
|
|
616
615
|
|
|
617
616
|
export const description = 'Display project information and discovered helpers'
|
|
618
617
|
|
|
@@ -2286,7 +2285,7 @@ Here's the structure of the built-in \`fileTools\` feature (simplified for clari
|
|
|
2286
2285
|
|
|
2287
2286
|
\`\`\`ts
|
|
2288
2287
|
import { z } from 'zod'
|
|
2289
|
-
import { Feature } from '
|
|
2288
|
+
import { Feature } from 'luca/feature'
|
|
2290
2289
|
|
|
2291
2290
|
export class FileTools extends Feature {
|
|
2292
2291
|
static { Feature.register(this, 'fileTools') }
|
|
@@ -5314,7 +5313,7 @@ A feature has:
|
|
|
5314
5313
|
|
|
5315
5314
|
\`\`\`typescript
|
|
5316
5315
|
import { z } from 'zod'
|
|
5317
|
-
import { Feature, features, FeatureStateSchema, FeatureOptionsSchema } from '
|
|
5316
|
+
import { Feature, features, FeatureStateSchema, FeatureOptionsSchema } from 'luca'
|
|
5318
5317
|
|
|
5319
5318
|
// Define state schema by extending the base FeatureStateSchema
|
|
5320
5319
|
export const CounterStateSchema = FeatureStateSchema.extend({
|
|
@@ -5379,7 +5378,7 @@ export class Counter extends Feature<CounterState, CounterOptions> {
|
|
|
5379
5378
|
features.register('counter', Counter)
|
|
5380
5379
|
|
|
5381
5380
|
// Module augmentation for type safety
|
|
5382
|
-
declare module '
|
|
5381
|
+
declare module 'luca' {
|
|
5383
5382
|
interface AvailableFeatures {
|
|
5384
5383
|
counter: typeof Counter
|
|
5385
5384
|
}
|
|
@@ -5671,7 +5670,7 @@ tags: [setup, quickstart, project, init]
|
|
|
5671
5670
|
\`\`\`bash
|
|
5672
5671
|
mkdir my-app && cd my-app
|
|
5673
5672
|
bun init -y
|
|
5674
|
-
bun add
|
|
5673
|
+
bun add luca
|
|
5675
5674
|
\`\`\`
|
|
5676
5675
|
|
|
5677
5676
|
## Project Structure
|
|
@@ -5705,7 +5704,7 @@ Everything in Luca revolves around the **container**. It is a per-process single
|
|
|
5705
5704
|
In scripts, you create one directly:
|
|
5706
5705
|
|
|
5707
5706
|
\`\`\`typescript
|
|
5708
|
-
import container from '
|
|
5707
|
+
import container from 'luca/node'
|
|
5709
5708
|
|
|
5710
5709
|
// Now you have access to all features
|
|
5711
5710
|
const fs = container.fs // File system operations
|
|
@@ -5791,7 +5790,7 @@ Define schemas for your handlers. Parameters are validated automatically:
|
|
|
5791
5790
|
\`\`\`typescript
|
|
5792
5791
|
// endpoints/users.ts
|
|
5793
5792
|
import { z } from 'zod'
|
|
5794
|
-
import type { EndpointContext } from '
|
|
5793
|
+
import type { EndpointContext } from 'luca'
|
|
5795
5794
|
|
|
5796
5795
|
export const path = '/api/users'
|
|
5797
5796
|
export const description = 'User management'
|
|
@@ -5828,7 +5827,7 @@ Use \`:param\` in the path or bracket-based file naming:
|
|
|
5828
5827
|
\`\`\`typescript
|
|
5829
5828
|
// endpoints/users/[id].ts
|
|
5830
5829
|
import { z } from 'zod'
|
|
5831
|
-
import type { EndpointContext } from '
|
|
5830
|
+
import type { EndpointContext } from 'luca'
|
|
5832
5831
|
|
|
5833
5832
|
export const path = '/api/users/:id'
|
|
5834
5833
|
export const description = 'Get, update, or delete a specific user'
|
|
@@ -5923,7 +5922,7 @@ The server automatically:
|
|
|
5923
5922
|
You can also set up the server in a script:
|
|
5924
5923
|
|
|
5925
5924
|
\`\`\`typescript
|
|
5926
|
-
import container from '
|
|
5925
|
+
import container from 'luca'
|
|
5927
5926
|
|
|
5928
5927
|
const server = container.server('express', { port: 3000, cors: true })
|
|
5929
5928
|
|
|
@@ -6267,8 +6266,8 @@ await python.stopSession()
|
|
|
6267
6266
|
\`\`\`ts skip
|
|
6268
6267
|
// commands/analyze.ts
|
|
6269
6268
|
import { z } from 'zod'
|
|
6270
|
-
import type { ContainerContext } from '
|
|
6271
|
-
import { CommandOptionsSchema } from '
|
|
6269
|
+
import type { ContainerContext } from 'luca'
|
|
6270
|
+
import { CommandOptionsSchema } from 'luca/schemas'
|
|
6272
6271
|
|
|
6273
6272
|
export const positionals = ['target']
|
|
6274
6273
|
export const argsSchema = CommandOptionsSchema.extend({
|
|
@@ -6376,7 +6375,7 @@ Luca's \`semanticSearch\` feature provides BM25 keyword search, vector similarit
|
|
|
6376
6375
|
The fastest way to use semantic search is through the \`contentDb\` feature, which handles indexing and querying automatically:
|
|
6377
6376
|
|
|
6378
6377
|
\`\`\`typescript
|
|
6379
|
-
import container from '
|
|
6378
|
+
import container from 'luca'
|
|
6380
6379
|
|
|
6381
6380
|
const db = container.feature('contentDb', { rootPath: './docs' })
|
|
6382
6381
|
await db.load()
|
|
@@ -6412,8 +6411,8 @@ await db.hybridSearch('authentication flow', { limit: 5 })
|
|
|
6412
6411
|
For more control, use the \`semanticSearch\` feature directly:
|
|
6413
6412
|
|
|
6414
6413
|
\`\`\`typescript
|
|
6415
|
-
import container from '
|
|
6416
|
-
import { SemanticSearch } from '
|
|
6414
|
+
import container from 'luca'
|
|
6415
|
+
import { SemanticSearch } from 'luca/node/features/semantic-search'
|
|
6417
6416
|
|
|
6418
6417
|
// Attach the feature to the container
|
|
6419
6418
|
SemanticSearch.attach(container)
|
|
@@ -7233,7 +7232,7 @@ Commands are CLI actions that the \`luca\` command discovers and runs. They are
|
|
|
7233
7232
|
\`\`\`typescript
|
|
7234
7233
|
// commands/seed.ts
|
|
7235
7234
|
import { z } from 'zod'
|
|
7236
|
-
import type { ContainerContext } from '
|
|
7235
|
+
import type { ContainerContext } from 'luca'
|
|
7237
7236
|
|
|
7238
7237
|
export const description = 'Seed the database with sample data'
|
|
7239
7238
|
|
|
@@ -7284,7 +7283,7 @@ The simplest pattern — export a default async function. The function becomes t
|
|
|
7284
7283
|
\`\`\`typescript
|
|
7285
7284
|
// commands/greet.ts
|
|
7286
7285
|
import { z } from 'zod'
|
|
7287
|
-
import type { ContainerContext } from '
|
|
7286
|
+
import type { ContainerContext } from 'luca'
|
|
7288
7287
|
|
|
7289
7288
|
export const description = 'Greet someone'
|
|
7290
7289
|
export const argsSchema = z.object({
|
|
@@ -7303,7 +7302,7 @@ Useful when you want to co-locate all exports in one object:
|
|
|
7303
7302
|
\`\`\`typescript
|
|
7304
7303
|
// commands/deploy.ts
|
|
7305
7304
|
import { z } from 'zod'
|
|
7306
|
-
import type { ContainerContext } from '
|
|
7305
|
+
import type { ContainerContext } from 'luca'
|
|
7307
7306
|
|
|
7308
7307
|
export const argsSchema = z.object({
|
|
7309
7308
|
env: z.enum(['staging', 'production']).describe('Target environment'),
|
|
@@ -7486,7 +7485,7 @@ Luca's type system ensures that as you add features, clients, servers, and comma
|
|
|
7486
7485
|
When you register a new helper, you augment the corresponding interface so TypeScript knows about it:
|
|
7487
7486
|
|
|
7488
7487
|
\`\`\`typescript
|
|
7489
|
-
import { Feature, features, FeatureStateSchema, FeatureOptionsSchema } from '
|
|
7488
|
+
import { Feature, features, FeatureStateSchema, FeatureOptionsSchema } from 'luca'
|
|
7490
7489
|
import { z } from 'zod'
|
|
7491
7490
|
|
|
7492
7491
|
// 1. Define your feature
|
|
@@ -7498,7 +7497,7 @@ export class MyCache extends Feature<MyCacheState, MyCacheOptions> {
|
|
|
7498
7497
|
features.register('myCache', MyCache)
|
|
7499
7498
|
|
|
7500
7499
|
// 3. Augment the interface
|
|
7501
|
-
declare module '
|
|
7500
|
+
declare module 'luca' {
|
|
7502
7501
|
interface AvailableFeatures {
|
|
7503
7502
|
myCache: typeof MyCache
|
|
7504
7503
|
}
|
|
@@ -7574,28 +7573,28 @@ The pattern is the same for features, clients, servers, and commands:
|
|
|
7574
7573
|
|
|
7575
7574
|
\`\`\`typescript
|
|
7576
7575
|
// Features
|
|
7577
|
-
declare module '
|
|
7576
|
+
declare module 'luca' {
|
|
7578
7577
|
interface AvailableFeatures {
|
|
7579
7578
|
myFeature: typeof MyFeature
|
|
7580
7579
|
}
|
|
7581
7580
|
}
|
|
7582
7581
|
|
|
7583
7582
|
// Clients
|
|
7584
|
-
declare module '
|
|
7583
|
+
declare module 'luca' {
|
|
7585
7584
|
interface AvailableClients {
|
|
7586
7585
|
myClient: typeof MyClient
|
|
7587
7586
|
}
|
|
7588
7587
|
}
|
|
7589
7588
|
|
|
7590
7589
|
// Servers
|
|
7591
|
-
declare module '
|
|
7590
|
+
declare module 'luca' {
|
|
7592
7591
|
interface AvailableServers {
|
|
7593
7592
|
myServer: typeof MyServer
|
|
7594
7593
|
}
|
|
7595
7594
|
}
|
|
7596
7595
|
|
|
7597
7596
|
// Commands
|
|
7598
|
-
declare module '
|
|
7597
|
+
declare module 'luca' {
|
|
7599
7598
|
interface AvailableCommands {
|
|
7600
7599
|
myCommand: typeof MyCommand
|
|
7601
7600
|
}
|
|
@@ -7631,7 +7630,7 @@ export class Analytics extends Feature<AnalyticsState, AnalyticsOptions> { ... }
|
|
|
7631
7630
|
|
|
7632
7631
|
// 2. You register + augment
|
|
7633
7632
|
features.register('analytics', Analytics)
|
|
7634
|
-
declare module '
|
|
7633
|
+
declare module 'luca' {
|
|
7635
7634
|
interface AvailableFeatures { analytics: typeof Analytics }
|
|
7636
7635
|
}
|
|
7637
7636
|
|
|
@@ -7664,14 +7663,14 @@ The container is the heart of every Luca application. It is a per-process single
|
|
|
7664
7663
|
## Getting the Container
|
|
7665
7664
|
|
|
7666
7665
|
\`\`\`typescript
|
|
7667
|
-
import container from '
|
|
7666
|
+
import container from 'luca'
|
|
7668
7667
|
\`\`\`
|
|
7669
7668
|
|
|
7670
|
-
The import resolves automatically based on environment --
|
|
7669
|
+
The import resolves automatically based on environment -- \`luca\` gives you a \`NodeContainer\` on the server and a \`WebContainer\` in browser builds. You can also be explicit:
|
|
7671
7670
|
|
|
7672
7671
|
\`\`\`typescript
|
|
7673
|
-
import container from '
|
|
7674
|
-
import container from '
|
|
7672
|
+
import container from 'luca/node' // Always NodeContainer
|
|
7673
|
+
import container from 'luca/web' // Always WebContainer
|
|
7675
7674
|
\`\`\`
|
|
7676
7675
|
|
|
7677
7676
|
The NodeContainer comes pre-loaded with registries for features, clients, servers, commands, and endpoints. Core features like \`fs\`, \`git\`, \`proc\`, \`os\`, \`networking\`, \`ui\`, and \`vm\` are auto-enabled.
|
|
@@ -7875,7 +7874,7 @@ You can use Luca in any browser environment — no bundler, no build step. Impor
|
|
|
7875
7874
|
|
|
7876
7875
|
\`\`\`html
|
|
7877
7876
|
<script type="module">
|
|
7878
|
-
import "https://esm.sh
|
|
7877
|
+
import "https://esm.sh/luca/web"
|
|
7879
7878
|
|
|
7880
7879
|
const container = window.luca
|
|
7881
7880
|
console.log(container.uuid) // unique container ID
|
|
@@ -7889,7 +7888,7 @@ If you prefer a named import:
|
|
|
7889
7888
|
|
|
7890
7889
|
\`\`\`html
|
|
7891
7890
|
<script type="module">
|
|
7892
|
-
import container from "https://esm.sh
|
|
7891
|
+
import container from "https://esm.sh/luca/web"
|
|
7893
7892
|
// container === window.luca
|
|
7894
7893
|
</script>
|
|
7895
7894
|
\`\`\`
|
|
@@ -7900,7 +7899,7 @@ Once you have the container, features work exactly like they do on the server
|
|
|
7900
7899
|
|
|
7901
7900
|
\`\`\`html
|
|
7902
7901
|
<script type="module">
|
|
7903
|
-
import "https://esm.sh
|
|
7902
|
+
import "https://esm.sh/luca/web"
|
|
7904
7903
|
const { luca: container } = window
|
|
7905
7904
|
|
|
7906
7905
|
// Load a script from a CDN
|
|
@@ -7927,7 +7926,7 @@ The container is a state machine and event bus. This works identically to the se
|
|
|
7927
7926
|
|
|
7928
7927
|
\`\`\`html
|
|
7929
7928
|
<script type="module">
|
|
7930
|
-
import container from "https://esm.sh
|
|
7929
|
+
import container from "https://esm.sh/luca/web"
|
|
7931
7930
|
|
|
7932
7931
|
// Listen for state changes
|
|
7933
7932
|
container.on('stateChanged', ({ changes }) => {
|
|
@@ -7948,7 +7947,7 @@ Make HTTP requests with the built-in REST client. Methods return parsed JSON dir
|
|
|
7948
7947
|
|
|
7949
7948
|
\`\`\`html
|
|
7950
7949
|
<script type="module">
|
|
7951
|
-
import container from "https://esm.sh
|
|
7950
|
+
import container from "https://esm.sh/luca/web"
|
|
7952
7951
|
|
|
7953
7952
|
const api = container.client('rest', { baseURL: 'https://jsonplaceholder.typicode.com' })
|
|
7954
7953
|
const posts = await api.get('/posts')
|
|
@@ -7962,7 +7961,7 @@ Connect to a WebSocket server:
|
|
|
7962
7961
|
|
|
7963
7962
|
\`\`\`html
|
|
7964
7963
|
<script type="module">
|
|
7965
|
-
import container from "https://esm.sh
|
|
7964
|
+
import container from "https://esm.sh/luca/web"
|
|
7966
7965
|
|
|
7967
7966
|
const socket = container.client('socket', { url: 'ws://localhost:3000' })
|
|
7968
7967
|
socket.on('message', (data) => console.log('Received:', data))
|
|
@@ -7976,7 +7975,7 @@ The container exposes the \`Feature\` class directly, so you can create your own
|
|
|
7976
7975
|
|
|
7977
7976
|
\`\`\`html
|
|
7978
7977
|
<script type="module">
|
|
7979
|
-
import container from "https://esm.sh
|
|
7978
|
+
import container from "https://esm.sh/luca/web"
|
|
7980
7979
|
|
|
7981
7980
|
const { Feature } = container
|
|
7982
7981
|
|
|
@@ -8008,7 +8007,7 @@ The container's built-in utilities are available in the browser too.
|
|
|
8008
8007
|
|
|
8009
8008
|
\`\`\`html
|
|
8010
8009
|
<script type="module">
|
|
8011
|
-
import container from "https://esm.sh
|
|
8010
|
+
import container from "https://esm.sh/luca/web"
|
|
8012
8011
|
|
|
8013
8012
|
// UUID generation
|
|
8014
8013
|
const id = container.utils.uuid()
|
|
@@ -8037,7 +8036,7 @@ The container's built-in utilities are available in the browser too.
|
|
|
8037
8036
|
<pre id="output"></pre>
|
|
8038
8037
|
|
|
8039
8038
|
<script type="module">
|
|
8040
|
-
import container from "https://esm.sh
|
|
8039
|
+
import container from "https://esm.sh/luca/web"
|
|
8041
8040
|
|
|
8042
8041
|
const log = (msg) => {
|
|
8043
8042
|
document.getElementById('output').textContent += msg + '\\n'
|
|
@@ -8082,7 +8081,7 @@ Save this as an HTML file, open it in a browser, and everything works — no npm
|
|
|
8082
8081
|
|
|
8083
8082
|
## Gotchas
|
|
8084
8083
|
|
|
8085
|
-
- **esm.sh caches aggressively.** Pin a version if you need stability: \`https://esm.sh
|
|
8084
|
+
- **esm.sh caches aggressively.** Pin a version if you need stability: \`https://esm.sh/luca@0.0.29/web\`
|
|
8086
8085
|
- **Browser features only.** The web container doesn't include node-specific features like \`fs\`, \`git\`, \`proc\`, or \`docker\`. If you need server features, run Luca on the server and connect via the REST or WebSocket clients.
|
|
8087
8086
|
- **\`window.luca\` is the singleton.** Don't call \`createContainer()\` — it just warns and returns the same instance. If you need isolation, use \`container.subcontainer()\`.
|
|
8088
8087
|
- **CORS applies.** REST client requests from the browser are subject to browser CORS rules. Your API must send the right headers.
|
|
@@ -8128,7 +8127,7 @@ my-api/
|
|
|
8128
8127
|
"seed": "luca seed"
|
|
8129
8128
|
},
|
|
8130
8129
|
"dependencies": {
|
|
8131
|
-
"
|
|
8130
|
+
"luca": "latest",
|
|
8132
8131
|
"zod": "^3.24.0"
|
|
8133
8132
|
}
|
|
8134
8133
|
}
|
|
@@ -8188,7 +8187,7 @@ The endpoint creates the assistant and forwards questions:
|
|
|
8188
8187
|
\`\`\`typescript
|
|
8189
8188
|
// endpoints/ask.ts
|
|
8190
8189
|
import { z } from 'zod'
|
|
8191
|
-
import type { EndpointContext } from '
|
|
8190
|
+
import type { EndpointContext } from 'luca'
|
|
8192
8191
|
|
|
8193
8192
|
export const path = '/api/ask'
|
|
8194
8193
|
export const postSchema = z.object({
|
|
@@ -8232,7 +8231,7 @@ docs-site/
|
|
|
8232
8231
|
\`\`\`typescript
|
|
8233
8232
|
// endpoints/docs.ts
|
|
8234
8233
|
import { z } from 'zod'
|
|
8235
|
-
import type { EndpointContext } from '
|
|
8234
|
+
import type { EndpointContext } from 'luca'
|
|
8236
8235
|
|
|
8237
8236
|
export const path = '/api/docs'
|
|
8238
8237
|
export const getSchema = z.object({
|
|
@@ -8500,7 +8499,7 @@ Contentbase lets you treat folders of markdown files as queryable database colle
|
|
|
8500
8499
|
## Setup
|
|
8501
8500
|
|
|
8502
8501
|
\`\`\`typescript
|
|
8503
|
-
import container from '
|
|
8502
|
+
import container from 'luca'
|
|
8504
8503
|
|
|
8505
8504
|
const db = container.feature('contentDb', { rootPath: './content' })
|
|
8506
8505
|
const { defineModel, section, hasMany, belongsTo } = db.library
|
|
@@ -8644,7 +8643,7 @@ console.log('Hello!')
|
|
|
8644
8643
|
## Full Example: Blog Engine
|
|
8645
8644
|
|
|
8646
8645
|
\`\`\`typescript
|
|
8647
|
-
import container from '
|
|
8646
|
+
import container from 'luca'
|
|
8648
8647
|
import { z } from 'zod'
|
|
8649
8648
|
|
|
8650
8649
|
const db = container.feature('contentDb', { rootPath: './blog' })
|
|
@@ -8825,7 +8824,7 @@ researchInternalDocs tool first to find accurate information before answering.
|
|
|
8825
8824
|
### In a Script
|
|
8826
8825
|
|
|
8827
8826
|
\`\`\`typescript
|
|
8828
|
-
import container from '
|
|
8827
|
+
import container from 'luca'
|
|
8829
8828
|
|
|
8830
8829
|
const assistant = container.feature('assistant', {
|
|
8831
8830
|
folder: 'assistants/my-assistant',
|
|
@@ -8851,7 +8850,7 @@ Expose the assistant as an API:
|
|
|
8851
8850
|
\`\`\`typescript
|
|
8852
8851
|
// endpoints/ask.ts
|
|
8853
8852
|
import { z } from 'zod'
|
|
8854
|
-
import type { EndpointContext } from '
|
|
8853
|
+
import type { EndpointContext } from 'luca'
|
|
8855
8854
|
|
|
8856
8855
|
export const path = '/api/ask'
|
|
8857
8856
|
export const description = 'Ask the support assistant a question'
|
|
@@ -8913,7 +8912,7 @@ luca run scripts/hello.ts
|
|
|
8913
8912
|
|
|
8914
8913
|
\`\`\`typescript
|
|
8915
8914
|
// scripts/hello.ts
|
|
8916
|
-
import container from '
|
|
8915
|
+
import container from 'luca'
|
|
8917
8916
|
|
|
8918
8917
|
console.log('Available features:', container.features.available)
|
|
8919
8918
|
console.log('Git branch:', container.git.branch)
|
|
@@ -9015,7 +9014,7 @@ console.log(\`Found \${files.length} files in src/\`)
|
|
|
9015
9014
|
|
|
9016
9015
|
\`\`\`typescript
|
|
9017
9016
|
// scripts/process-images.ts
|
|
9018
|
-
import container from '
|
|
9017
|
+
import container from 'luca'
|
|
9019
9018
|
|
|
9020
9019
|
const { fs, proc } = container
|
|
9021
9020
|
|
|
@@ -9034,7 +9033,7 @@ console.log('Done.')
|
|
|
9034
9033
|
|
|
9035
9034
|
\`\`\`typescript
|
|
9036
9035
|
// scripts/migrate-data.ts
|
|
9037
|
-
import container from '
|
|
9036
|
+
import container from 'luca'
|
|
9038
9037
|
|
|
9039
9038
|
const { fs } = container
|
|
9040
9039
|
|
|
@@ -9062,7 +9061,7 @@ console.log('Migration complete.')
|
|
|
9062
9061
|
|
|
9063
9062
|
\`\`\`typescript
|
|
9064
9063
|
// scripts/weekly-report.ts
|
|
9065
|
-
import container from '
|
|
9064
|
+
import container from 'luca'
|
|
9066
9065
|
|
|
9067
9066
|
const { git, fs } = container
|
|
9068
9067
|
|
|
@@ -9211,7 +9210,7 @@ container.clients.describe('rest')
|
|
|
9211
9210
|
\`\`\`typescript
|
|
9212
9211
|
// endpoints/proxy.ts
|
|
9213
9212
|
import { z } from 'zod'
|
|
9214
|
-
import type { EndpointContext } from '
|
|
9213
|
+
import type { EndpointContext } from 'luca'
|
|
9215
9214
|
|
|
9216
9215
|
export const path = '/api/external-data'
|
|
9217
9216
|
|
package/src/browser.ts
CHANGED
|
@@ -18,7 +18,7 @@ export default container
|
|
|
18
18
|
export function createContainer() {
|
|
19
19
|
console.warn(
|
|
20
20
|
'[luca] createContainer() is unnecessary — import the default export instead.\n' +
|
|
21
|
-
' `import container from "
|
|
21
|
+
' `import container from "luca"`\n' +
|
|
22
22
|
' For a separate instance, use container.subcontainer().'
|
|
23
23
|
)
|
|
24
24
|
return container
|
package/src/cli/build-info.ts
CHANGED
package/src/cli/cli.ts
CHANGED
|
@@ -7,12 +7,12 @@ import { BUILD_SHA, BUILD_BRANCH, BUILD_DATE } from './build-info'
|
|
|
7
7
|
const args = process.argv.slice(2)
|
|
8
8
|
if (args.includes('--version') || args.includes('-v')) {
|
|
9
9
|
console.log(`luca v${pkg.version} (${BUILD_BRANCH}@${BUILD_SHA}) built ${BUILD_DATE}`)
|
|
10
|
-
console.log(` npm: https://www.npmjs.com/package
|
|
10
|
+
console.log(` npm: https://www.npmjs.com/package/luca`)
|
|
11
11
|
console.log(` git: https://github.com/soederpop/luca`)
|
|
12
12
|
process.exit(0)
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
import container from '
|
|
15
|
+
import container from 'luca/agi'
|
|
16
16
|
import '@/commands/index.js'
|
|
17
17
|
import { homedir } from 'os'
|
|
18
18
|
import { join } from 'path'
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Client,
|
|
3
3
|
type ClientOptions,
|
|
4
|
-
} from "
|
|
4
|
+
} from "luca/client";
|
|
5
5
|
import { RestClient } from "../rest";
|
|
6
|
-
import { type ContainerContext } from "
|
|
6
|
+
import { type ContainerContext } from "luca/container";
|
|
7
7
|
import { isEmpty, maxBy, omitBy } from "lodash-es";
|
|
8
|
-
import { NodeContainer } from "
|
|
8
|
+
import { NodeContainer } from "luca/node/container";
|
|
9
9
|
import { z } from 'zod'
|
|
10
|
-
import { ClientStateSchema } from '
|
|
10
|
+
import { ClientStateSchema } from 'luca/schemas/base.js'
|
|
11
11
|
|
|
12
|
-
declare module "
|
|
12
|
+
declare module "luca/client" {
|
|
13
13
|
interface AvailableClients {
|
|
14
14
|
civitai: typeof CivitaiClient;
|
|
15
15
|
}
|
|
@@ -2,13 +2,13 @@ import {
|
|
|
2
2
|
type ClientOptions,
|
|
3
3
|
type ClientsInterface,
|
|
4
4
|
clients,
|
|
5
|
-
} from "
|
|
5
|
+
} from "luca/client";
|
|
6
6
|
import { RestClient } from "./rest";
|
|
7
|
-
import { type ContainerContext } from "
|
|
7
|
+
import { type ContainerContext } from "luca/container";
|
|
8
8
|
import { z } from 'zod'
|
|
9
|
-
import { ClientStateSchema } from '
|
|
9
|
+
import { ClientStateSchema } from 'luca/schemas/base.js'
|
|
10
10
|
|
|
11
|
-
declare module "
|
|
11
|
+
declare module "luca/client" {
|
|
12
12
|
interface AvailableClients {
|
|
13
13
|
myClient: typeof MyClient;
|
|
14
14
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Client,
|
|
3
|
-
} from "
|
|
3
|
+
} from "luca/client";
|
|
4
4
|
import { RestClient } from "../rest";
|
|
5
|
-
import type { ContainerContext } from "
|
|
5
|
+
import type { ContainerContext } from "luca/container";
|
|
6
6
|
import { z } from 'zod'
|
|
7
|
-
import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from '
|
|
7
|
+
import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from 'luca/schemas/base.js'
|
|
8
8
|
|
|
9
|
-
declare module "
|
|
9
|
+
declare module "luca/client" {
|
|
10
10
|
interface AvailableClients {
|
|
11
11
|
comfyui: typeof ComfyUIClient;
|
|
12
12
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
|
-
import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from '
|
|
3
|
-
import { Client } from "
|
|
2
|
+
import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from 'luca/schemas/base.js'
|
|
3
|
+
import { Client } from "luca/client";
|
|
4
4
|
import { RestClient } from "../rest";
|
|
5
|
-
import type { ContainerContext } from "
|
|
5
|
+
import type { ContainerContext } from "luca/container";
|
|
6
6
|
import type { NodeContainer } from "../../node/container.js";
|
|
7
7
|
import type { AxiosRequestConfig } from 'axios'
|
|
8
8
|
|
|
9
|
-
declare module "
|
|
9
|
+
declare module "luca/client" {
|
|
10
10
|
interface AvailableClients {
|
|
11
11
|
elevenlabs: typeof ElevenLabsClient;
|
|
12
12
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
|
-
import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from '
|
|
3
|
-
import { Client } from "
|
|
4
|
-
import type { Container, ContainerContext } from "
|
|
2
|
+
import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from 'luca/schemas/base.js'
|
|
3
|
+
import { Client } from "luca/client";
|
|
4
|
+
import type { Container, ContainerContext } from "luca/container";
|
|
5
5
|
|
|
6
6
|
import OpenAI from "openai";
|
|
7
7
|
|
|
@@ -21,7 +21,7 @@ export const OpenAIClientOptionsSchema = ClientOptionsSchema.extend({
|
|
|
21
21
|
organization: z.string().optional().describe('OpenAI organization ID'),
|
|
22
22
|
project: z.string().optional().describe('OpenAI project ID'),
|
|
23
23
|
dangerouslyAllowBrowser: z.boolean().optional().describe('Allow usage in browser environments'),
|
|
24
|
-
defaultModel: z.string().optional().describe('Default model for completions (
|
|
24
|
+
defaultModel: z.string().optional().describe('Default model for completions (falls back to OPENAI_DEFAULT_MODEL env var, then gpt-5.4-mini)'),
|
|
25
25
|
timeout: z.number().optional().describe('Request timeout in milliseconds'),
|
|
26
26
|
maxRetries: z.number().optional().describe('Maximum number of retries on failure'),
|
|
27
27
|
})
|
|
@@ -52,7 +52,7 @@ export class OpenAIClient extends Client<OpenAIClientState, OpenAIClientOptions>
|
|
|
52
52
|
private openai!: OpenAI;
|
|
53
53
|
|
|
54
54
|
static override shortcut = "clients.openai" as const
|
|
55
|
-
static override envVars = ['OPENAI_API_KEY']
|
|
55
|
+
static override envVars = ['OPENAI_API_KEY', 'OPENAI_DEFAULT_MODEL']
|
|
56
56
|
static override stateSchema = OpenAIClientStateSchema
|
|
57
57
|
static override optionsSchema = OpenAIClientOptionsSchema
|
|
58
58
|
static override eventsSchema = OpenAIClientEventsSchema
|
|
@@ -116,7 +116,7 @@ export class OpenAIClient extends Client<OpenAIClientState, OpenAIClientOptions>
|
|
|
116
116
|
|
|
117
117
|
/** The default model used for completions, from options or 'gpt-4o'. */
|
|
118
118
|
get defaultModel(): string {
|
|
119
|
-
return this.options.defaultModel || 'gpt-
|
|
119
|
+
return this.options.defaultModel || process.env.OPENAI_DEFAULT_MODEL || 'gpt-5.4-mini';
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
private updateTokenUsage(usage?: OpenAI.CompletionUsage | OpenAI.Embeddings.CreateEmbeddingResponse.Usage) {
|
|
@@ -287,7 +287,7 @@ export class OpenAIClient extends Client<OpenAIClientState, OpenAIClientOptions>
|
|
|
287
287
|
|
|
288
288
|
try {
|
|
289
289
|
const response = await this.openai.completions.create({
|
|
290
|
-
model: options.model ||
|
|
290
|
+
model: options.model || this.defaultModel,
|
|
291
291
|
prompt,
|
|
292
292
|
stream: false, // Ensure non-streaming response
|
|
293
293
|
...options
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Client,
|
|
3
|
-
} from "
|
|
4
|
-
import type { ContainerContext } from "
|
|
3
|
+
} from "luca/client";
|
|
4
|
+
import type { ContainerContext } from "luca/container";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import {
|
|
7
7
|
ClientStateSchema,
|
|
8
8
|
ClientOptionsSchema,
|
|
9
9
|
ClientEventsSchema,
|
|
10
|
-
} from "
|
|
10
|
+
} from "luca/schemas/base.js";
|
|
11
11
|
import {
|
|
12
12
|
createClient,
|
|
13
13
|
type SupabaseClient as SupabaseSDKClient,
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
type RealtimeChannel,
|
|
16
16
|
} from "@supabase/supabase-js";
|
|
17
17
|
|
|
18
|
-
declare module "
|
|
18
|
+
declare module "luca/client" {
|
|
19
19
|
interface AvailableClients {
|
|
20
20
|
supabase: typeof SupabaseClient;
|
|
21
21
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
|
-
import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from '
|
|
3
|
-
import { Client } from "
|
|
2
|
+
import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from 'luca/schemas/base.js'
|
|
3
|
+
import { Client } from "luca/client";
|
|
4
4
|
import { RestClient } from "../rest";
|
|
5
|
-
import type { ContainerContext } from "
|
|
5
|
+
import type { ContainerContext } from "luca/container";
|
|
6
6
|
import type { NodeContainer } from "../../node/container.js";
|
|
7
7
|
|
|
8
|
-
declare module "
|
|
8
|
+
declare module "luca/client" {
|
|
9
9
|
interface AvailableClients {
|
|
10
10
|
voicebox: typeof VoiceBoxClient;
|
|
11
11
|
}
|
package/src/command.ts
CHANGED
|
@@ -31,7 +31,7 @@ export type CommandHandler<T = any> = (options: T, context: ContainerContext) =>
|
|
|
31
31
|
*
|
|
32
32
|
* @example
|
|
33
33
|
* ```typescript
|
|
34
|
-
* declare module '
|
|
34
|
+
* declare module 'luca' {
|
|
35
35
|
* interface AvailableCommands {
|
|
36
36
|
* serve: SimpleCommand<typeof argsSchema>
|
|
37
37
|
* }
|
|
@@ -432,6 +432,7 @@ export class CommandsRegistry extends Registry<Command<any>> {
|
|
|
432
432
|
const Grafted = graftModule(Command as any, {
|
|
433
433
|
description: commandModule.description,
|
|
434
434
|
argsSchema: commandModule.argsSchema,
|
|
435
|
+
positionals: commandModule.positionals ?? mod.positionals,
|
|
435
436
|
handler: commandModule.handler,
|
|
436
437
|
}, name, 'commands')
|
|
437
438
|
this.register(name, Grafted as any)
|