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
|
@@ -145,16 +145,15 @@ export class Transpiler extends Feature {
|
|
|
145
145
|
entrypoints: [filePath],
|
|
146
146
|
target: 'bun',
|
|
147
147
|
format: 'cjs',
|
|
148
|
-
bundle: true,
|
|
149
148
|
external,
|
|
150
|
-
})
|
|
149
|
+
} as any)
|
|
151
150
|
|
|
152
151
|
if (!result.success) {
|
|
153
152
|
const msgs = result.logs.map((l: any) => l.message || String(l)).join('\n')
|
|
154
153
|
throw new Error(`Bundle failed for ${filePath}:\n${msgs}`)
|
|
155
154
|
}
|
|
156
155
|
|
|
157
|
-
return await result.outputs[0]
|
|
156
|
+
return await result.outputs[0]!.text()
|
|
158
157
|
}
|
|
159
158
|
}
|
|
160
159
|
|
package/src/node/features/ui.ts
CHANGED
|
@@ -72,6 +72,11 @@ export class UI<T extends UIState = UIState> extends Feature<T> {
|
|
|
72
72
|
print: ColoredPrintFunction = Object.assign((...args: any[]) => {
|
|
73
73
|
return console.log(...args)
|
|
74
74
|
}, {
|
|
75
|
+
error: (text: string) => console.log(colors.red(text)),
|
|
76
|
+
info: (text: string) => console.log(text),
|
|
77
|
+
success: (text: string) => console.log(colors.green(text)),
|
|
78
|
+
warn: (text: string) => console.log(colors.yellow(text)),
|
|
79
|
+
warning: (text: string) => console.log(colors.yellow(text)),
|
|
75
80
|
red: (text: string) => console.log(colors.red(text)),
|
|
76
81
|
green: (text: string) => console.log(colors.green(text)),
|
|
77
82
|
blue: (text: string) => console.log(colors.blue(text)),
|
package/src/node/features/vm.ts
CHANGED
|
@@ -55,17 +55,17 @@ export class VM<
|
|
|
55
55
|
* Register a virtual module that will be available to `require()` inside VM-executed code.
|
|
56
56
|
* Modules registered here take precedence over Node's native resolution.
|
|
57
57
|
*
|
|
58
|
-
* @param id - The module specifier (e.g. `'
|
|
58
|
+
* @param id - The module specifier (e.g. `'luca'`, `'zod'`)
|
|
59
59
|
* @param exports - The module's exports object
|
|
60
60
|
*
|
|
61
61
|
* @example
|
|
62
62
|
* ```typescript
|
|
63
63
|
* const vm = container.feature('vm')
|
|
64
|
-
* vm.defineModule('
|
|
64
|
+
* vm.defineModule('luca', { Container, Feature, fs, proc })
|
|
65
65
|
* vm.defineModule('zod', { z })
|
|
66
66
|
*
|
|
67
67
|
* // Now loadModule can resolve these in user code:
|
|
68
|
-
* // import { Container } from '
|
|
68
|
+
* // import { Container } from 'luca' → works
|
|
69
69
|
* ```
|
|
70
70
|
*/
|
|
71
71
|
defineModule(id: string, exports: any): void {
|
|
@@ -165,6 +165,15 @@ export class VM<
|
|
|
165
165
|
Buffer,
|
|
166
166
|
URL,
|
|
167
167
|
URLSearchParams,
|
|
168
|
+
AbortController,
|
|
169
|
+
AbortSignal,
|
|
170
|
+
FormData,
|
|
171
|
+
Blob,
|
|
172
|
+
File,
|
|
173
|
+
Headers,
|
|
174
|
+
Request,
|
|
175
|
+
Response,
|
|
176
|
+
fetch,
|
|
168
177
|
...this.container.context,
|
|
169
178
|
...ctx
|
|
170
179
|
})
|
|
@@ -451,6 +460,14 @@ export class VM<
|
|
|
451
460
|
Buffer,
|
|
452
461
|
URL,
|
|
453
462
|
URLSearchParams,
|
|
463
|
+
AbortController,
|
|
464
|
+
AbortSignal,
|
|
465
|
+
FormData,
|
|
466
|
+
Blob,
|
|
467
|
+
File,
|
|
468
|
+
Headers,
|
|
469
|
+
Request,
|
|
470
|
+
Response,
|
|
454
471
|
fetch,
|
|
455
472
|
...ctx,
|
|
456
473
|
})
|
package/src/node.ts
CHANGED
|
@@ -17,7 +17,7 @@ export default container as NodeContainer
|
|
|
17
17
|
export function createContainer() {
|
|
18
18
|
console.warn(
|
|
19
19
|
'[luca] createContainer() is unnecessary — import the default export instead.\n' +
|
|
20
|
-
' `import container from "
|
|
20
|
+
' `import container from "luca"`\n' +
|
|
21
21
|
' For a separate instance, use container.subcontainer().'
|
|
22
22
|
)
|
|
23
23
|
return container
|
|
@@ -45,7 +45,7 @@ export { Client, ClientsRegistry } from './client'
|
|
|
45
45
|
export { RestClient } from './clients/rest'
|
|
46
46
|
export { GraphClient } from './clients/graph'
|
|
47
47
|
export { WebSocketClient } from './clients/websocket'
|
|
48
|
-
export { Command, CommandsRegistry, commands } from './command'
|
|
48
|
+
export { Command, CommandsRegistry, commands, graftModule } from './command'
|
|
49
49
|
export { Endpoint, EndpointsRegistry, endpoints } from './endpoint'
|
|
50
50
|
export { Selector, SelectorsRegistry, selectors } from './selector'
|
|
51
51
|
export { Server, ServersRegistry } from './server'
|
|
@@ -69,7 +69,7 @@ export type { Entity } from './entity'
|
|
|
69
69
|
export type { EventMap } from './bus'
|
|
70
70
|
export type { SetStateValue, StateChangeType } from './state'
|
|
71
71
|
|
|
72
|
-
// Zod — so consumer code can `import { z } from '
|
|
72
|
+
// Zod — so consumer code can `import { z } from 'luca'`
|
|
73
73
|
export { z } from 'zod'
|
|
74
74
|
|
|
75
75
|
// Schemas
|
package/src/python/generated.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// Auto-generated scaffold and MCP readme content
|
|
2
|
-
// Generated at: 2026-04-10T05:00:53.697Z
|
|
3
2
|
// Source: docs/scaffolds/*.md, docs/examples/assistant/, and docs/mcp/readme.md
|
|
4
3
|
//
|
|
5
4
|
// Do not edit manually. Run: luca build-scaffolds
|
|
@@ -19,8 +18,8 @@ export const scaffolds: Record<string, ScaffoldData> = {
|
|
|
19
18
|
feature: {
|
|
20
19
|
sections: [
|
|
21
20
|
{ heading: "Imports", code: `import { z } from 'zod'
|
|
22
|
-
import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from '
|
|
23
|
-
import { Feature } from '
|
|
21
|
+
import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from 'luca'
|
|
22
|
+
import { Feature } from 'luca'` },
|
|
24
23
|
{ heading: "Schemas", code: `export const {{PascalName}}StateSchema = FeatureStateSchema.extend({
|
|
25
24
|
// Add your state fields here. These are observable — changes emit events.
|
|
26
25
|
// Example: itemCount: z.number().default(0).describe('Number of items stored'),
|
|
@@ -61,7 +60,7 @@ export class {{PascalName}} extends Feature<{{PascalName}}State, {{PascalName}}O
|
|
|
61
60
|
// Set up initial state, start background tasks, etc.
|
|
62
61
|
}
|
|
63
62
|
}` },
|
|
64
|
-
{ heading: "Module Augmentation", code: `declare module '
|
|
63
|
+
{ heading: "Module Augmentation", code: `declare module 'luca' {
|
|
65
64
|
interface AvailableFeatures {
|
|
66
65
|
{{camelName}}: typeof {{PascalName}}
|
|
67
66
|
}
|
|
@@ -72,10 +71,10 @@ static { Feature.register(this, '{{camelName}}') }
|
|
|
72
71
|
// At module level:
|
|
73
72
|
export default {{PascalName}}` },
|
|
74
73
|
{ heading: "Complete Example", code: `import { z } from 'zod'
|
|
75
|
-
import { FeatureStateSchema, FeatureOptionsSchema } from '
|
|
76
|
-
import { Feature } from '
|
|
74
|
+
import { FeatureStateSchema, FeatureOptionsSchema } from 'luca'
|
|
75
|
+
import { Feature } from 'luca'
|
|
77
76
|
|
|
78
|
-
declare module '
|
|
77
|
+
declare module 'luca' {
|
|
79
78
|
interface AvailableFeatures {
|
|
80
79
|
{{camelName}}: typeof {{PascalName}}
|
|
81
80
|
}
|
|
@@ -111,10 +110,10 @@ export class {{PascalName}} extends Feature<{{PascalName}}State, {{PascalName}}O
|
|
|
111
110
|
export default {{PascalName}}` }
|
|
112
111
|
],
|
|
113
112
|
full: `import { z } from 'zod'
|
|
114
|
-
import { FeatureStateSchema, FeatureOptionsSchema } from '
|
|
115
|
-
import { Feature } from '
|
|
113
|
+
import { FeatureStateSchema, FeatureOptionsSchema } from 'luca'
|
|
114
|
+
import { Feature } from 'luca'
|
|
116
115
|
|
|
117
|
-
declare module '
|
|
116
|
+
declare module 'luca' {
|
|
118
117
|
interface AvailableFeatures {
|
|
119
118
|
{{camelName}}: typeof {{PascalName}}
|
|
120
119
|
}
|
|
@@ -161,8 +160,8 @@ When to build a feature:
|
|
|
161
160
|
|
|
162
161
|
\`\`\`ts
|
|
163
162
|
import { z } from 'zod'
|
|
164
|
-
import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from '
|
|
165
|
-
import { Feature } from '
|
|
163
|
+
import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from 'luca'
|
|
164
|
+
import { Feature } from 'luca'
|
|
166
165
|
\`\`\`
|
|
167
166
|
|
|
168
167
|
These are the only imports your feature file needs from luca. If your feature wraps a third-party library, import it here too — feature implementations are the ONE place where direct library imports are allowed.
|
|
@@ -234,7 +233,7 @@ export class {{PascalName}} extends Feature<{{PascalName}}State, {{PascalName}}O
|
|
|
234
233
|
This is what gives \`container.feature('yourName')\` TypeScript autocomplete. Without it, the feature works but TypeScript won't know about it.
|
|
235
234
|
|
|
236
235
|
\`\`\`ts
|
|
237
|
-
declare module '
|
|
236
|
+
declare module 'luca' {
|
|
238
237
|
interface AvailableFeatures {
|
|
239
238
|
{{camelName}}: typeof {{PascalName}}
|
|
240
239
|
}
|
|
@@ -259,10 +258,10 @@ Here's a minimal but complete feature. This is what a real feature file looks li
|
|
|
259
258
|
|
|
260
259
|
\`\`\`ts
|
|
261
260
|
import { z } from 'zod'
|
|
262
|
-
import { FeatureStateSchema, FeatureOptionsSchema } from '
|
|
263
|
-
import { Feature } from '
|
|
261
|
+
import { FeatureStateSchema, FeatureOptionsSchema } from 'luca'
|
|
262
|
+
import { Feature } from 'luca'
|
|
264
263
|
|
|
265
|
-
declare module '
|
|
264
|
+
declare module 'luca' {
|
|
266
265
|
interface AvailableFeatures {
|
|
267
266
|
{{camelName}}: typeof {{PascalName}}
|
|
268
267
|
}
|
|
@@ -311,8 +310,8 @@ export default {{PascalName}}
|
|
|
311
310
|
client: {
|
|
312
311
|
sections: [
|
|
313
312
|
{ heading: "Imports", code: `import { z } from 'zod'
|
|
314
|
-
import { Client, RestClient } from '
|
|
315
|
-
import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from '
|
|
313
|
+
import { Client, RestClient } from 'luca/client'
|
|
314
|
+
import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from 'luca'` },
|
|
316
315
|
{ heading: "Schemas", code: `export const {{PascalName}}StateSchema = ClientStateSchema.extend({
|
|
317
316
|
// Add your state fields here.
|
|
318
317
|
// Example: authenticated: z.boolean().default(false).describe('Whether API auth is configured'),
|
|
@@ -354,7 +353,7 @@ export class {{PascalName}} extends RestClient<{{PascalName}}State, {{PascalName
|
|
|
354
353
|
// return this.get('/items')
|
|
355
354
|
// }
|
|
356
355
|
}` },
|
|
357
|
-
{ heading: "Module Augmentation", code: `declare module '
|
|
356
|
+
{ heading: "Module Augmentation", code: `declare module 'luca/client' {
|
|
358
357
|
interface AvailableClients {
|
|
359
358
|
{{camelName}}: typeof {{PascalName}}
|
|
360
359
|
}
|
|
@@ -365,10 +364,10 @@ static { Client.register(this, '{{camelName}}') }
|
|
|
365
364
|
// At module level:
|
|
366
365
|
export default {{PascalName}}` },
|
|
367
366
|
{ heading: "Complete Example", code: `import { z } from 'zod'
|
|
368
|
-
import { Client, RestClient } from '
|
|
369
|
-
import { ClientStateSchema, ClientOptionsSchema } from '
|
|
367
|
+
import { Client, RestClient } from 'luca/client'
|
|
368
|
+
import { ClientStateSchema, ClientOptionsSchema } from 'luca'
|
|
370
369
|
|
|
371
|
-
declare module '
|
|
370
|
+
declare module 'luca/client' {
|
|
372
371
|
interface AvailableClients {
|
|
373
372
|
{{camelName}}: typeof {{PascalName}}
|
|
374
373
|
}
|
|
@@ -406,10 +405,10 @@ export class {{PascalName}} extends RestClient<{{PascalName}}State, {{PascalName
|
|
|
406
405
|
export default {{PascalName}}` }
|
|
407
406
|
],
|
|
408
407
|
full: `import { z } from 'zod'
|
|
409
|
-
import { Client, RestClient } from '
|
|
410
|
-
import { ClientStateSchema, ClientOptionsSchema } from '
|
|
408
|
+
import { Client, RestClient } from 'luca/client'
|
|
409
|
+
import { ClientStateSchema, ClientOptionsSchema } from 'luca'
|
|
411
410
|
|
|
412
|
-
declare module '
|
|
411
|
+
declare module 'luca/client' {
|
|
413
412
|
interface AvailableClients {
|
|
414
413
|
{{camelName}}: typeof {{PascalName}}
|
|
415
414
|
}
|
|
@@ -458,8 +457,8 @@ When to build a client:
|
|
|
458
457
|
|
|
459
458
|
\`\`\`ts
|
|
460
459
|
import { z } from 'zod'
|
|
461
|
-
import { Client, RestClient } from '
|
|
462
|
-
import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from '
|
|
460
|
+
import { Client, RestClient } from 'luca/client'
|
|
461
|
+
import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from 'luca'
|
|
463
462
|
\`\`\`
|
|
464
463
|
|
|
465
464
|
Use \`RestClient\` for HTTP APIs (most common). It gives you \`get\`, \`post\`, \`put\`, \`patch\`, \`delete\` methods that handle JSON, headers, and error wrapping.
|
|
@@ -522,7 +521,7 @@ export class {{PascalName}} extends RestClient<{{PascalName}}State, {{PascalName
|
|
|
522
521
|
## Module Augmentation
|
|
523
522
|
|
|
524
523
|
\`\`\`ts
|
|
525
|
-
declare module '
|
|
524
|
+
declare module 'luca/client' {
|
|
526
525
|
interface AvailableClients {
|
|
527
526
|
{{camelName}}: typeof {{PascalName}}
|
|
528
527
|
}
|
|
@@ -545,10 +544,10 @@ export default {{PascalName}}
|
|
|
545
544
|
|
|
546
545
|
\`\`\`ts
|
|
547
546
|
import { z } from 'zod'
|
|
548
|
-
import { Client, RestClient } from '
|
|
549
|
-
import { ClientStateSchema, ClientOptionsSchema } from '
|
|
547
|
+
import { Client, RestClient } from 'luca/client'
|
|
548
|
+
import { ClientStateSchema, ClientOptionsSchema } from 'luca'
|
|
550
549
|
|
|
551
|
-
declare module '
|
|
550
|
+
declare module 'luca/client' {
|
|
552
551
|
interface AvailableClients {
|
|
553
552
|
{{camelName}}: typeof {{PascalName}}
|
|
554
553
|
}
|
|
@@ -599,10 +598,10 @@ export default {{PascalName}}
|
|
|
599
598
|
server: {
|
|
600
599
|
sections: [
|
|
601
600
|
{ heading: "Imports", code: `import { z } from 'zod'
|
|
602
|
-
import { Server } from '
|
|
603
|
-
import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from '
|
|
604
|
-
import type { NodeContainer } from '
|
|
605
|
-
import type { ServersInterface } from '
|
|
601
|
+
import { Server } from 'luca'
|
|
602
|
+
import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from 'luca'
|
|
603
|
+
import type { NodeContainer } from 'luca'
|
|
604
|
+
import type { ServersInterface } from 'luca'` },
|
|
606
605
|
{ heading: "Schemas", code: `export const {{PascalName}}StateSchema = ServerStateSchema.extend({
|
|
607
606
|
// Add your state fields here.
|
|
608
607
|
// Example: connectionCount: z.number().default(0).describe('Active connections'),
|
|
@@ -667,7 +666,7 @@ export class {{PascalName}} extends Server<{{PascalName}}State, {{PascalName}}Op
|
|
|
667
666
|
return this
|
|
668
667
|
}
|
|
669
668
|
}` },
|
|
670
|
-
{ heading: "Module Augmentation", code: `declare module '
|
|
669
|
+
{ heading: "Module Augmentation", code: `declare module 'luca' {
|
|
671
670
|
interface AvailableServers {
|
|
672
671
|
{{camelName}}: typeof {{PascalName}}
|
|
673
672
|
}
|
|
@@ -678,12 +677,12 @@ static { Server.register(this, '{{camelName}}') }
|
|
|
678
677
|
// At module level:
|
|
679
678
|
export default {{PascalName}}` },
|
|
680
679
|
{ heading: "Complete Example", code: `import { z } from 'zod'
|
|
681
|
-
import { Server } from '
|
|
682
|
-
import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from '
|
|
683
|
-
import type { NodeContainer } from '
|
|
684
|
-
import type { ServersInterface } from '
|
|
680
|
+
import { Server } from 'luca'
|
|
681
|
+
import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from 'luca'
|
|
682
|
+
import type { NodeContainer } from 'luca'
|
|
683
|
+
import type { ServersInterface } from 'luca'
|
|
685
684
|
|
|
686
|
-
declare module '
|
|
685
|
+
declare module 'luca' {
|
|
687
686
|
interface AvailableServers {
|
|
688
687
|
{{camelName}}: typeof {{PascalName}}
|
|
689
688
|
}
|
|
@@ -745,12 +744,12 @@ export class {{PascalName}} extends Server<{{PascalName}}State, {{PascalName}}Op
|
|
|
745
744
|
export default {{PascalName}}` }
|
|
746
745
|
],
|
|
747
746
|
full: `import { z } from 'zod'
|
|
748
|
-
import { Server } from '
|
|
749
|
-
import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from '
|
|
750
|
-
import type { NodeContainer } from '
|
|
751
|
-
import type { ServersInterface } from '
|
|
747
|
+
import { Server } from 'luca'
|
|
748
|
+
import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from 'luca'
|
|
749
|
+
import type { NodeContainer } from 'luca'
|
|
750
|
+
import type { ServersInterface } from 'luca'
|
|
752
751
|
|
|
753
|
-
declare module '
|
|
752
|
+
declare module 'luca' {
|
|
754
753
|
interface AvailableServers {
|
|
755
754
|
{{camelName}}: typeof {{PascalName}}
|
|
756
755
|
}
|
|
@@ -823,10 +822,10 @@ When to build a server:
|
|
|
823
822
|
|
|
824
823
|
\`\`\`ts
|
|
825
824
|
import { z } from 'zod'
|
|
826
|
-
import { Server } from '
|
|
827
|
-
import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from '
|
|
828
|
-
import type { NodeContainer } from '
|
|
829
|
-
import type { ServersInterface } from '
|
|
825
|
+
import { Server } from 'luca'
|
|
826
|
+
import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from 'luca'
|
|
827
|
+
import type { NodeContainer } from 'luca'
|
|
828
|
+
import type { ServersInterface } from 'luca'
|
|
830
829
|
\`\`\`
|
|
831
830
|
|
|
832
831
|
## Schemas
|
|
@@ -908,7 +907,7 @@ export class {{PascalName}} extends Server<{{PascalName}}State, {{PascalName}}Op
|
|
|
908
907
|
## Module Augmentation
|
|
909
908
|
|
|
910
909
|
\`\`\`ts
|
|
911
|
-
declare module '
|
|
910
|
+
declare module 'luca' {
|
|
912
911
|
interface AvailableServers {
|
|
913
912
|
{{camelName}}: typeof {{PascalName}}
|
|
914
913
|
}
|
|
@@ -931,12 +930,12 @@ export default {{PascalName}}
|
|
|
931
930
|
|
|
932
931
|
\`\`\`ts
|
|
933
932
|
import { z } from 'zod'
|
|
934
|
-
import { Server } from '
|
|
935
|
-
import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from '
|
|
936
|
-
import type { NodeContainer } from '
|
|
937
|
-
import type { ServersInterface } from '
|
|
933
|
+
import { Server } from 'luca'
|
|
934
|
+
import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from 'luca'
|
|
935
|
+
import type { NodeContainer } from 'luca'
|
|
936
|
+
import type { ServersInterface } from 'luca'
|
|
938
937
|
|
|
939
|
-
declare module '
|
|
938
|
+
declare module 'luca' {
|
|
940
939
|
interface AvailableServers {
|
|
941
940
|
{{camelName}}: typeof {{PascalName}}
|
|
942
941
|
}
|
|
@@ -1011,7 +1010,7 @@ export default {{PascalName}}
|
|
|
1011
1010
|
command: {
|
|
1012
1011
|
sections: [
|
|
1013
1012
|
{ heading: "Imports", code: `import { z } from 'zod'
|
|
1014
|
-
import type { ContainerContext } from '
|
|
1013
|
+
import type { ContainerContext } from 'luca'` },
|
|
1015
1014
|
{ heading: "Positional Arguments", code: `// luca {{kebabName}} ./src => options.target === './src'
|
|
1016
1015
|
export const positionals = ['target']` },
|
|
1017
1016
|
{ heading: "Args Schema", code: `export const argsSchema = z.object({
|
|
@@ -1033,7 +1032,7 @@ export const positionals = ['target']` },
|
|
|
1033
1032
|
// Your implementation here
|
|
1034
1033
|
}` },
|
|
1035
1034
|
{ heading: "Complete Example", code: `import { z } from 'zod'
|
|
1036
|
-
import type { ContainerContext } from '
|
|
1035
|
+
import type { ContainerContext } from 'luca'
|
|
1037
1036
|
|
|
1038
1037
|
export const description = '{{description}}'
|
|
1039
1038
|
|
|
@@ -1070,7 +1069,7 @@ export default async function {{camelName}}(options: z.infer<typeof argsSchema>,
|
|
|
1070
1069
|
}` }
|
|
1071
1070
|
],
|
|
1072
1071
|
full: `import { z } from 'zod'
|
|
1073
|
-
import type { ContainerContext } from '
|
|
1072
|
+
import type { ContainerContext } from 'luca'
|
|
1074
1073
|
|
|
1075
1074
|
export const description = '{{description}}'
|
|
1076
1075
|
|
|
@@ -1100,7 +1099,7 @@ When to build a command:
|
|
|
1100
1099
|
|
|
1101
1100
|
\`\`\`ts
|
|
1102
1101
|
import { z } from 'zod'
|
|
1103
|
-
import type { ContainerContext } from '
|
|
1102
|
+
import type { ContainerContext } from 'luca'
|
|
1104
1103
|
\`\`\`
|
|
1105
1104
|
|
|
1106
1105
|
## Positional Arguments
|
|
@@ -1155,7 +1154,7 @@ export default async function {{camelName}}(options: z.infer<typeof argsSchema>,
|
|
|
1155
1154
|
|
|
1156
1155
|
\`\`\`ts
|
|
1157
1156
|
import { z } from 'zod'
|
|
1158
|
-
import type { ContainerContext } from '
|
|
1157
|
+
import type { ContainerContext } from 'luca'
|
|
1159
1158
|
|
|
1160
1159
|
export const description = '{{description}}'
|
|
1161
1160
|
|
|
@@ -1322,7 +1321,7 @@ Run \`luca serve\` and they're automatically discovered and mounted.
|
|
|
1322
1321
|
|
|
1323
1322
|
Endpoints are lightweight — just exports and handler functions. No imports are required.
|
|
1324
1323
|
|
|
1325
|
-
If your project has
|
|
1324
|
+
If your project has \`luca\` as an npm dependency, you can import \`z\` from \`zod\` and \`EndpointContext\` from \`luca\` for type safety. Otherwise, use \`any\` types — the framework handles validation and context injection for you.
|
|
1326
1325
|
|
|
1327
1326
|
Access framework capabilities through the \`ctx\` parameter:
|
|
1328
1327
|
- \`ctx.container.feature('fs')\` for file operations
|
|
@@ -1368,7 +1367,7 @@ Return any object — it's automatically JSON-serialized as the response.
|
|
|
1368
1367
|
|
|
1369
1368
|
## Validation Schemas
|
|
1370
1369
|
|
|
1371
|
-
If \`zod\` is available (via
|
|
1370
|
+
If \`zod\` is available (via \`luca\` dependency or \`node_modules\`), export Zod schemas to validate parameters for each method. Name them \`{method}Schema\`:
|
|
1372
1371
|
|
|
1373
1372
|
\`\`\`ts
|
|
1374
1373
|
import { z } from 'zod'
|
|
@@ -1476,7 +1475,7 @@ export { del as delete }
|
|
|
1476
1475
|
selector: {
|
|
1477
1476
|
sections: [
|
|
1478
1477
|
{ heading: "Imports", code: `import { z } from 'zod'
|
|
1479
|
-
import type { ContainerContext } from '
|
|
1478
|
+
import type { ContainerContext } from 'luca'` },
|
|
1480
1479
|
{ heading: "Args Schema", code: `export const argsSchema = z.object({
|
|
1481
1480
|
// Add your input arguments here.
|
|
1482
1481
|
// Example: field: z.string().optional().describe('Specific field to return'),
|
|
@@ -1492,7 +1491,7 @@ import type { ContainerContext } from '@soederpop/luca'` },
|
|
|
1492
1491
|
return { /* your data */ }
|
|
1493
1492
|
}` },
|
|
1494
1493
|
{ heading: "Complete Example", code: `import { z } from 'zod'
|
|
1495
|
-
import type { ContainerContext } from '
|
|
1494
|
+
import type { ContainerContext } from 'luca'
|
|
1496
1495
|
|
|
1497
1496
|
export const description = '{{description}}'
|
|
1498
1497
|
|
|
@@ -1506,7 +1505,7 @@ export async function run(args: z.infer<typeof argsSchema>, context: ContainerCo
|
|
|
1506
1505
|
}` }
|
|
1507
1506
|
],
|
|
1508
1507
|
full: `import { z } from 'zod'
|
|
1509
|
-
import type { ContainerContext } from '
|
|
1508
|
+
import type { ContainerContext } from 'luca'
|
|
1510
1509
|
|
|
1511
1510
|
export const description = '{{description}}'
|
|
1512
1511
|
|
|
@@ -1531,7 +1530,7 @@ When to build a selector:
|
|
|
1531
1530
|
|
|
1532
1531
|
\`\`\`ts
|
|
1533
1532
|
import { z } from 'zod'
|
|
1534
|
-
import type { ContainerContext } from '
|
|
1533
|
+
import type { ContainerContext } from 'luca'
|
|
1535
1534
|
\`\`\`
|
|
1536
1535
|
|
|
1537
1536
|
## Args Schema
|
|
@@ -1587,7 +1586,7 @@ export async function run(args: z.infer<typeof argsSchema>, context: ContainerCo
|
|
|
1587
1586
|
|
|
1588
1587
|
\`\`\`ts
|
|
1589
1588
|
import { z } from 'zod'
|
|
1590
|
-
import type { ContainerContext } from '
|
|
1589
|
+
import type { ContainerContext } from 'luca'
|
|
1591
1590
|
|
|
1592
1591
|
export const description = '{{description}}'
|
|
1593
1592
|
|
|
@@ -1660,20 +1659,20 @@ Every capability goes through the container. If you need something that doesn't
|
|
|
1660
1659
|
|
|
1661
1660
|
## Import Rule
|
|
1662
1661
|
|
|
1663
|
-
All consumer code imports from
|
|
1662
|
+
All consumer code imports from \`luca\` only:
|
|
1664
1663
|
|
|
1665
1664
|
\`\`\`ts
|
|
1666
|
-
import { Feature, features, z, FeatureStateSchema, FeatureOptionsSchema } from '
|
|
1667
|
-
import { Client, clients, RestClient, ClientStateSchema } from '
|
|
1668
|
-
import { Server, servers, ServerStateSchema } from '
|
|
1669
|
-
import { commands, CommandOptionsSchema } from '
|
|
1665
|
+
import { Feature, features, z, FeatureStateSchema, FeatureOptionsSchema } from 'luca'
|
|
1666
|
+
import { Client, clients, RestClient, ClientStateSchema } from 'luca/client'
|
|
1667
|
+
import { Server, servers, ServerStateSchema } from 'luca'
|
|
1668
|
+
import { commands, CommandOptionsSchema } from 'luca'
|
|
1670
1669
|
\`\`\`
|
|
1671
1670
|
|
|
1672
1671
|
Never import from \`fs\`, \`path\`, \`crypto\`, or other Node builtins. Never import third-party packages in consumer code. If a container feature wraps the functionality, use it.
|
|
1673
1672
|
|
|
1674
1673
|
## Zod v4
|
|
1675
1674
|
|
|
1676
|
-
This project uses **Zod v4** — import \`z\` from
|
|
1675
|
+
This project uses **Zod v4** — import \`z\` from \`luca\`, never from \`'zod'\` directly. All option, state, and event schemas use Zod v4 syntax. Key patterns:
|
|
1677
1676
|
|
|
1678
1677
|
\`\`\`ts
|
|
1679
1678
|
// Extending base schemas (options, state, events)
|
|
@@ -1700,7 +1699,7 @@ Zod v4 differences from v3 that matter:
|
|
|
1700
1699
|
|
|
1701
1700
|
## Dependencies
|
|
1702
1701
|
|
|
1703
|
-
If the project has \`node_modules\` and a package manager, helper implementations can import third-party libraries internally. If not (e.g. running via the \`luca\` binary's VM), all code must import only from
|
|
1702
|
+
If the project has \`node_modules\` and a package manager, helper implementations can import third-party libraries internally. If not (e.g. running via the \`luca\` binary's VM), all code must import only from \`luca\`.
|
|
1704
1703
|
|
|
1705
1704
|
## Discovering Capabilities
|
|
1706
1705
|
|
|
@@ -1719,9 +1718,9 @@ Features access other features via \`this.container.feature(...)\`:
|
|
|
1719
1718
|
|
|
1720
1719
|
\`\`\`ts
|
|
1721
1720
|
import { z } from 'zod'
|
|
1722
|
-
import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from '
|
|
1723
|
-
import { Feature, features } from '
|
|
1724
|
-
import type { ContainerContext } from '
|
|
1721
|
+
import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from 'luca'
|
|
1722
|
+
import { Feature, features } from 'luca'
|
|
1723
|
+
import type { ContainerContext } from 'luca'
|
|
1725
1724
|
|
|
1726
1725
|
export const ConfigStateSchema = FeatureStateSchema.extend({
|
|
1727
1726
|
loaded: z.boolean().default(false).describe('Whether config has been loaded'),
|
|
@@ -1753,7 +1752,7 @@ export class Config extends Feature<z.infer<typeof ConfigStateSchema>, z.infer<t
|
|
|
1753
1752
|
}
|
|
1754
1753
|
}
|
|
1755
1754
|
|
|
1756
|
-
declare module '
|
|
1755
|
+
declare module 'luca' {
|
|
1757
1756
|
interface AvailableFeatures { config: typeof Config }
|
|
1758
1757
|
}
|
|
1759
1758
|
export default features.register('config', Config)
|
|
@@ -1765,8 +1764,8 @@ Clients access features and other clients via \`this.container\`:
|
|
|
1765
1764
|
|
|
1766
1765
|
\`\`\`ts
|
|
1767
1766
|
import { z } from 'zod'
|
|
1768
|
-
import { Client, clients, ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from '
|
|
1769
|
-
import type { ContainerContext } from '
|
|
1767
|
+
import { Client, clients, ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from 'luca'
|
|
1768
|
+
import type { ContainerContext } from 'luca'
|
|
1770
1769
|
|
|
1771
1770
|
export const GithubOptionsSchema = ClientOptionsSchema.extend({
|
|
1772
1771
|
token: z.string().describe('GitHub personal access token'),
|
|
@@ -1795,7 +1794,7 @@ export class GithubClient extends Client<z.infer<typeof ClientStateSchema>, z.in
|
|
|
1795
1794
|
}
|
|
1796
1795
|
}
|
|
1797
1796
|
|
|
1798
|
-
declare module '
|
|
1797
|
+
declare module 'luca' {
|
|
1799
1798
|
interface AvailableClients { github: typeof GithubClient }
|
|
1800
1799
|
}
|
|
1801
1800
|
export default clients.register('github', GithubClient)
|
|
@@ -1811,5 +1810,5 @@ export default clients.register('github', GithubClient)
|
|
|
1811
1810
|
|
|
1812
1811
|
## Portability
|
|
1813
1812
|
|
|
1814
|
-
Code that only imports from
|
|
1813
|
+
Code that only imports from \`luca\` can be copied between any luca project. That's the goal. Features, clients, servers, and commands written this way are portable building blocks.
|
|
1815
1814
|
`
|
package/src/selector.ts
CHANGED
package/src/servers/express.ts
CHANGED
|
@@ -183,7 +183,7 @@ export class ExpressServer<T extends ServerState = ServerState, K extends Expres
|
|
|
183
183
|
const glob = new Glob('**/*.ts')
|
|
184
184
|
|
|
185
185
|
// Use the helpers feature's VM-aware loader so endpoints can resolve
|
|
186
|
-
// packages like zod and
|
|
186
|
+
// packages like zod and luca even from the compiled binary
|
|
187
187
|
const helpers = this.container.feature('helpers') as any
|
|
188
188
|
|
|
189
189
|
for await (const file of glob.scan({ cwd: dir, absolute: true })) {
|
|
@@ -2,6 +2,8 @@ import { z } from 'zod'
|
|
|
2
2
|
import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from '../../schemas/base.js'
|
|
3
3
|
import { Feature } from '../feature.js'
|
|
4
4
|
import { Client } from '../../client.js'
|
|
5
|
+
import { allHelperInstances } from '../../container.js'
|
|
6
|
+
import type { Helper } from '../../helper.js'
|
|
5
7
|
import type { Registry } from '../../registry.js'
|
|
6
8
|
import type { AssetLoader } from './asset-loader.js'
|
|
7
9
|
|
|
@@ -106,6 +108,26 @@ export class Helpers extends Feature<HelpersState, HelpersOptions> {
|
|
|
106
108
|
this.state.set('manifestLoaded', false)
|
|
107
109
|
}
|
|
108
110
|
|
|
111
|
+
/**
|
|
112
|
+
* Returns all instantiated helper instances across all types, optionally filtered by class.
|
|
113
|
+
*
|
|
114
|
+
* @param FilterClass - When provided, only instances of this class are returned.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* // All instances of any type
|
|
119
|
+
* container.helpers.getInstances()
|
|
120
|
+
*
|
|
121
|
+
* // All Assistant instances
|
|
122
|
+
* const assistants = container.helpers.getInstances(Assistant)
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
getInstances(): Helper[]
|
|
126
|
+
getInstances<T extends Helper>(FilterClass: new (...args: any[]) => T): T[]
|
|
127
|
+
getInstances<T extends Helper>(FilterClass?: new (...args: any[]) => T): Helper[] | T[] {
|
|
128
|
+
return FilterClass ? allHelperInstances(FilterClass) : allHelperInstances()
|
|
129
|
+
}
|
|
130
|
+
|
|
109
131
|
/**
|
|
110
132
|
* Returns a unified view of all available helpers across all registries.
|
|
111
133
|
* Each key is a registry type, each value is the list of helper names in that registry.
|
package/tsconfig.json
CHANGED
|
@@ -21,18 +21,18 @@
|
|
|
21
21
|
"@/*": ["src/*"],
|
|
22
22
|
"@/web/*": ["src/web/*"],
|
|
23
23
|
"@/node/*": ["src/node/*"],
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
24
|
+
"luca": ["src/node.ts"],
|
|
25
|
+
"luca/node": ["src/node.ts"],
|
|
26
|
+
"luca/node/*": ["src/node/*"],
|
|
27
|
+
"luca/agi": ["src/agi/index.ts"],
|
|
28
|
+
"luca/agi/*": ["src/agi/*"],
|
|
29
|
+
"luca/web": ["src/browser.ts"],
|
|
30
|
+
"luca/web/*": ["src/web/*"],
|
|
31
|
+
"luca/schemas": ["src/schemas/base.ts"],
|
|
32
|
+
"luca/schemas/*": ["src/schemas/*"],
|
|
33
|
+
"luca/container": ["src/container.ts"],
|
|
34
|
+
"luca/client": ["src/client.ts"],
|
|
35
|
+
"luca/feature": ["src/feature.ts"]
|
|
36
36
|
},
|
|
37
37
|
|
|
38
38
|
// Best practices
|