luca 2.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 +170 -0
- package/AGENTS.md +99 -0
- package/CLAUDE.md +123 -0
- package/CNAME +1 -0
- package/README.md +275 -9
- package/RUNME.md +56 -0
- package/assistants/codingAssistant/ABOUT.md +5 -0
- package/assistants/codingAssistant/CORE.md +33 -0
- package/assistants/codingAssistant/hooks.ts +21 -0
- package/assistants/codingAssistant/tools.ts +12 -0
- package/assistants/inkbot/ABOUT.md +16 -0
- package/assistants/inkbot/CORE.md +330 -0
- package/assistants/inkbot/hooks.ts +6 -0
- package/assistants/inkbot/tools.ts +53 -0
- package/assistants/researcher/ABOUT.md +5 -0
- package/assistants/researcher/CORE.md +46 -0
- package/assistants/researcher/hooks.ts +16 -0
- package/assistants/researcher/tools.ts +237 -0
- package/bun.lock +2667 -0
- package/bunfig.toml +3 -0
- package/commands/audit-docs.ts +740 -0
- package/commands/build-bootstrap.ts +117 -0
- package/commands/build-python-bridge.ts +42 -0
- package/commands/build-scaffolds.ts +175 -0
- package/commands/bundle-consumer-project.ts +521 -0
- package/commands/generate-api-docs.ts +114 -0
- package/commands/inkbot.ts +874 -0
- package/commands/release.ts +80 -0
- package/commands/try-all-challenges.ts +543 -0
- package/commands/try-challenge.ts +100 -0
- package/dist/agi/container.server.d.ts +63 -0
- package/dist/agi/container.server.d.ts.map +1 -0
- package/dist/agi/endpoints/ask.d.ts +20 -0
- package/dist/agi/endpoints/ask.d.ts.map +1 -0
- package/dist/agi/endpoints/conversations/[id].d.ts +27 -0
- package/dist/agi/endpoints/conversations/[id].d.ts.map +1 -0
- package/dist/agi/endpoints/conversations.d.ts +18 -0
- package/dist/agi/endpoints/conversations.d.ts.map +1 -0
- package/dist/agi/endpoints/experts.d.ts +8 -0
- package/dist/agi/endpoints/experts.d.ts.map +1 -0
- package/dist/agi/feature.d.ts +9 -0
- package/dist/agi/feature.d.ts.map +1 -0
- package/dist/agi/features/assistant.d.ts +509 -0
- package/dist/agi/features/assistant.d.ts.map +1 -0
- package/dist/agi/features/assistants-manager.d.ts +236 -0
- package/dist/agi/features/assistants-manager.d.ts.map +1 -0
- package/dist/agi/features/autonomous-assistant.d.ts +281 -0
- package/dist/agi/features/autonomous-assistant.d.ts.map +1 -0
- package/dist/agi/features/browser-use.d.ts +479 -0
- package/dist/agi/features/browser-use.d.ts.map +1 -0
- package/dist/agi/features/claude-code.d.ts +824 -0
- package/dist/agi/features/claude-code.d.ts.map +1 -0
- package/dist/agi/features/conversation-history.d.ts +245 -0
- package/dist/agi/features/conversation-history.d.ts.map +1 -0
- package/dist/agi/features/conversation.d.ts +464 -0
- package/dist/agi/features/conversation.d.ts.map +1 -0
- package/dist/agi/features/docs-reader.d.ts +72 -0
- package/dist/agi/features/docs-reader.d.ts.map +1 -0
- package/dist/agi/features/file-tools.d.ts +110 -0
- package/dist/agi/features/file-tools.d.ts.map +1 -0
- package/dist/agi/features/luca-coder.d.ts +323 -0
- package/dist/agi/features/luca-coder.d.ts.map +1 -0
- package/dist/agi/features/openai-codex.d.ts +381 -0
- package/dist/agi/features/openai-codex.d.ts.map +1 -0
- package/dist/agi/features/openapi.d.ts +200 -0
- package/dist/agi/features/openapi.d.ts.map +1 -0
- package/dist/agi/features/skills-library.d.ts +167 -0
- package/dist/agi/features/skills-library.d.ts.map +1 -0
- package/dist/agi/index.d.ts +5 -0
- package/dist/agi/index.d.ts.map +1 -0
- package/dist/agi/lib/interceptor-chain.d.ts +44 -0
- package/dist/agi/lib/interceptor-chain.d.ts.map +1 -0
- package/dist/agi/lib/token-counter.d.ts +13 -0
- package/dist/agi/lib/token-counter.d.ts.map +1 -0
- package/dist/bootstrap/generated.d.ts +5 -0
- package/dist/bootstrap/generated.d.ts.map +1 -0
- package/dist/browser.d.ts +12 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/bus.d.ts +29 -0
- package/dist/bus.d.ts.map +1 -0
- package/dist/cli/build-info.d.ts +4 -0
- package/dist/cli/build-info.d.ts.map +1 -0
- package/dist/cli/cli.d.ts +3 -12
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/client.d.ts +60 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/clients/civitai/index.d.ts +472 -0
- package/dist/clients/civitai/index.d.ts.map +1 -0
- package/dist/clients/client-template.d.ts +30 -0
- package/dist/clients/client-template.d.ts.map +1 -0
- package/dist/clients/comfyui/index.d.ts +281 -0
- package/dist/clients/comfyui/index.d.ts.map +1 -0
- package/dist/clients/elevenlabs/index.d.ts +197 -0
- package/dist/clients/elevenlabs/index.d.ts.map +1 -0
- package/dist/clients/graph.d.ts +64 -0
- package/dist/clients/graph.d.ts.map +1 -0
- package/dist/clients/openai/index.d.ts +247 -0
- package/dist/clients/openai/index.d.ts.map +1 -0
- package/dist/clients/rest.d.ts +92 -0
- package/dist/clients/rest.d.ts.map +1 -0
- package/dist/clients/supabase/index.d.ts +176 -0
- package/dist/clients/supabase/index.d.ts.map +1 -0
- package/dist/clients/websocket.d.ts +127 -0
- package/dist/clients/websocket.d.ts.map +1 -0
- package/dist/command.d.ts +163 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/commands/bootstrap.d.ts +20 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/chat.d.ts +37 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/code.d.ts +28 -0
- package/dist/commands/code.d.ts.map +1 -0
- package/dist/commands/console.d.ts +22 -0
- package/dist/commands/console.d.ts.map +1 -0
- package/dist/commands/describe.d.ts +50 -0
- package/dist/commands/describe.d.ts.map +1 -0
- package/dist/commands/eval.d.ts +23 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/help.d.ts +25 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/index.d.ts +18 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/introspect.d.ts +24 -0
- package/dist/commands/introspect.d.ts.map +1 -0
- package/dist/commands/mcp.d.ts +35 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/prompt.d.ts +38 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/run.d.ts +24 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/sandbox-mcp.d.ts +34 -0
- package/dist/commands/sandbox-mcp.d.ts.map +1 -0
- package/dist/commands/save-api-docs.d.ts +21 -0
- package/dist/commands/save-api-docs.d.ts.map +1 -0
- package/dist/commands/scaffold.d.ts +24 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/select.d.ts +22 -0
- package/dist/commands/select.d.ts.map +1 -0
- package/dist/commands/serve.d.ts +29 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/container-describer.d.ts +144 -0
- package/dist/container-describer.d.ts.map +1 -0
- package/dist/container.d.ts +451 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/endpoint.d.ts +113 -0
- package/dist/endpoint.d.ts.map +1 -0
- package/dist/feature.d.ts +47 -0
- package/dist/feature.d.ts.map +1 -0
- package/dist/graft.d.ts +29 -0
- package/dist/graft.d.ts.map +1 -0
- package/dist/hash-object.d.ts +8 -0
- package/dist/hash-object.d.ts.map +1 -0
- package/dist/helper.d.ts +209 -0
- package/dist/helper.d.ts.map +1 -0
- package/dist/introspection/generated.node.d.ts +44623 -0
- package/dist/introspection/generated.node.d.ts.map +1 -0
- package/dist/introspection/generated.web.d.ts +1412 -0
- package/dist/introspection/generated.web.d.ts.map +1 -0
- package/dist/introspection/index.d.ts +156 -0
- package/dist/introspection/index.d.ts.map +1 -0
- package/dist/introspection/scan.d.ts +147 -0
- package/dist/introspection/scan.d.ts.map +1 -0
- package/dist/node/container.d.ts +256 -0
- package/dist/node/container.d.ts.map +1 -0
- package/dist/node/feature.d.ts +9 -0
- package/dist/node/feature.d.ts.map +1 -0
- package/dist/node/features/container-link.d.ts +213 -0
- package/dist/node/features/container-link.d.ts.map +1 -0
- package/dist/node/features/content-db.d.ts +354 -0
- package/dist/node/features/content-db.d.ts.map +1 -0
- package/dist/node/features/disk-cache.d.ts +236 -0
- package/dist/node/features/disk-cache.d.ts.map +1 -0
- package/dist/node/features/dns.d.ts +511 -0
- package/dist/node/features/dns.d.ts.map +1 -0
- package/dist/node/features/docker.d.ts +485 -0
- package/dist/node/features/docker.d.ts.map +1 -0
- package/dist/node/features/downloader.d.ts +73 -0
- package/dist/node/features/downloader.d.ts.map +1 -0
- package/dist/node/features/figlet-fonts.d.ts +4 -0
- package/dist/node/features/figlet-fonts.d.ts.map +1 -0
- package/dist/node/features/file-manager.d.ts +177 -0
- package/dist/node/features/file-manager.d.ts.map +1 -0
- package/dist/node/features/fs.d.ts +635 -0
- package/dist/node/features/fs.d.ts.map +1 -0
- package/dist/node/features/git.d.ts +329 -0
- package/dist/node/features/git.d.ts.map +1 -0
- package/dist/node/features/google-auth.d.ts +200 -0
- package/dist/node/features/google-auth.d.ts.map +1 -0
- package/dist/node/features/google-calendar.d.ts +194 -0
- package/dist/node/features/google-calendar.d.ts.map +1 -0
- package/dist/node/features/google-docs.d.ts +138 -0
- package/dist/node/features/google-docs.d.ts.map +1 -0
- package/dist/node/features/google-drive.d.ts +202 -0
- package/dist/node/features/google-drive.d.ts.map +1 -0
- package/dist/node/features/google-mail.d.ts +221 -0
- package/dist/node/features/google-mail.d.ts.map +1 -0
- package/dist/node/features/google-sheets.d.ts +157 -0
- package/dist/node/features/google-sheets.d.ts.map +1 -0
- package/dist/node/features/grep.d.ts +207 -0
- package/dist/node/features/grep.d.ts.map +1 -0
- package/dist/node/features/helpers.d.ts +236 -0
- package/dist/node/features/helpers.d.ts.map +1 -0
- package/dist/node/features/ink.d.ts +332 -0
- package/dist/node/features/ink.d.ts.map +1 -0
- package/dist/node/features/ipc-socket.d.ts +298 -0
- package/dist/node/features/ipc-socket.d.ts.map +1 -0
- package/dist/node/features/json-tree.d.ts +140 -0
- package/dist/node/features/json-tree.d.ts.map +1 -0
- package/dist/node/features/networking.d.ts +373 -0
- package/dist/node/features/networking.d.ts.map +1 -0
- package/dist/node/features/nlp.d.ts +125 -0
- package/dist/node/features/nlp.d.ts.map +1 -0
- package/dist/node/features/opener.d.ts +93 -0
- package/dist/node/features/opener.d.ts.map +1 -0
- package/dist/node/features/os.d.ts +168 -0
- package/dist/node/features/os.d.ts.map +1 -0
- package/dist/node/features/package-finder.d.ts +419 -0
- package/dist/node/features/package-finder.d.ts.map +1 -0
- package/dist/node/features/postgres.d.ts +173 -0
- package/dist/node/features/postgres.d.ts.map +1 -0
- package/dist/node/features/proc.d.ts +285 -0
- package/dist/node/features/proc.d.ts.map +1 -0
- package/dist/node/features/process-manager.d.ts +427 -0
- package/dist/node/features/process-manager.d.ts.map +1 -0
- package/dist/node/features/python.d.ts +477 -0
- package/dist/node/features/python.d.ts.map +1 -0
- package/dist/node/features/redis.d.ts +247 -0
- package/dist/node/features/redis.d.ts.map +1 -0
- package/dist/node/features/repl.d.ts +84 -0
- package/dist/node/features/repl.d.ts.map +1 -0
- package/dist/node/features/runpod.d.ts +527 -0
- package/dist/node/features/runpod.d.ts.map +1 -0
- package/dist/node/features/secure-shell.d.ts +145 -0
- package/dist/node/features/secure-shell.d.ts.map +1 -0
- package/dist/node/features/semantic-search.d.ts +207 -0
- package/dist/node/features/semantic-search.d.ts.map +1 -0
- package/dist/node/features/sqlite.d.ts +180 -0
- package/dist/node/features/sqlite.d.ts.map +1 -0
- package/dist/node/features/telegram.d.ts +173 -0
- package/dist/node/features/telegram.d.ts.map +1 -0
- package/dist/node/features/transpiler.d.ts +51 -0
- package/dist/node/features/transpiler.d.ts.map +1 -0
- package/dist/node/features/tts.d.ts +108 -0
- package/dist/node/features/tts.d.ts.map +1 -0
- package/dist/node/features/ui.d.ts +562 -0
- package/dist/node/features/ui.d.ts.map +1 -0
- package/dist/node/features/vault.d.ts +90 -0
- package/dist/node/features/vault.d.ts.map +1 -0
- package/dist/node/features/vm.d.ts +285 -0
- package/dist/node/features/vm.d.ts.map +1 -0
- package/dist/node/features/yaml-tree.d.ts +118 -0
- package/dist/node/features/yaml-tree.d.ts.map +1 -0
- package/dist/node/features/yaml.d.ts +127 -0
- package/dist/node/features/yaml.d.ts.map +1 -0
- package/dist/node.d.ts +67 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/python/generated.d.ts +2 -0
- package/dist/python/generated.d.ts.map +1 -0
- package/dist/react/index.d.ts +36 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/registry.d.ts +97 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/scaffolds/generated.d.ts +13 -0
- package/dist/scaffolds/generated.d.ts.map +1 -0
- package/dist/scaffolds/template.d.ts +11 -0
- package/dist/scaffolds/template.d.ts.map +1 -0
- package/dist/schemas/base.d.ts +254 -0
- package/dist/schemas/base.d.ts.map +1 -0
- package/dist/selector.d.ts +130 -0
- package/dist/selector.d.ts.map +1 -0
- package/dist/server.d.ts +89 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/servers/express.d.ts +104 -0
- package/dist/servers/express.d.ts.map +1 -0
- package/dist/servers/mcp.d.ts +201 -0
- package/dist/servers/mcp.d.ts.map +1 -0
- package/dist/servers/socket.d.ts +121 -0
- package/dist/servers/socket.d.ts.map +1 -0
- package/dist/state.d.ts +24 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/web/clients/socket.d.ts +37 -0
- package/dist/web/clients/socket.d.ts.map +1 -0
- package/dist/web/container.d.ts +55 -0
- package/dist/web/container.d.ts.map +1 -0
- package/dist/web/extension.d.ts +4 -0
- package/dist/web/extension.d.ts.map +1 -0
- package/dist/web/feature.d.ts +8 -0
- package/dist/web/feature.d.ts.map +1 -0
- package/dist/web/features/asset-loader.d.ts +35 -0
- package/dist/web/features/asset-loader.d.ts.map +1 -0
- package/dist/web/features/container-link.d.ts +167 -0
- package/dist/web/features/container-link.d.ts.map +1 -0
- package/dist/web/features/esbuild.d.ts +51 -0
- package/dist/web/features/esbuild.d.ts.map +1 -0
- package/dist/web/features/helpers.d.ts +140 -0
- package/dist/web/features/helpers.d.ts.map +1 -0
- package/dist/web/features/network.d.ts +69 -0
- package/dist/web/features/network.d.ts.map +1 -0
- package/dist/web/features/speech.d.ts +71 -0
- package/dist/web/features/speech.d.ts.map +1 -0
- package/dist/web/features/vault.d.ts +62 -0
- package/dist/web/features/vault.d.ts.map +1 -0
- package/dist/web/features/vm.d.ts +48 -0
- package/dist/web/features/vm.d.ts.map +1 -0
- package/dist/web/features/voice-recognition.d.ts +96 -0
- package/dist/web/features/voice-recognition.d.ts.map +1 -0
- package/dist/web/shims/isomorphic-vm.d.ts +22 -0
- package/dist/web/shims/isomorphic-vm.d.ts.map +1 -0
- package/index.html +1457 -0
- package/index.ts +1 -0
- package/install.sh +84 -0
- package/luca.cli.ts +16 -0
- package/luca.console.ts +9 -0
- package/main.py +6 -0
- package/package.json +219 -58
- package/public/index.html +1457 -0
- package/public/slides-ai-native.html +902 -0
- package/public/slides-intro.html +974 -0
- package/pyproject.toml +7 -0
- package/scripts/build-web.ts +28 -0
- package/scripts/examples/ask-luca-expert.ts +42 -0
- package/scripts/examples/assistant-questions.ts +12 -0
- package/scripts/examples/excalidraw-expert.ts +75 -0
- package/scripts/examples/expert-chat.ts +0 -0
- package/scripts/examples/file-manager.ts +14 -0
- package/scripts/examples/ideas.ts +12 -0
- package/scripts/examples/interactive-chat.ts +20 -0
- package/scripts/examples/openai-tool-calls.ts +113 -0
- package/scripts/examples/opening-a-web-browser.ts +5 -0
- package/scripts/examples/telegram-bot.ts +79 -0
- package/scripts/examples/using-assistant-with-mcp.ts +555 -0
- package/scripts/examples/using-claude-code.ts +10 -0
- package/scripts/examples/using-contentdb.ts +35 -0
- package/scripts/examples/using-conversations.ts +35 -0
- package/scripts/examples/using-disk-cache.ts +10 -0
- package/scripts/examples/using-docker-shell.ts +75 -0
- package/scripts/examples/using-elevenlabs.ts +25 -0
- package/scripts/examples/using-google-calendar.ts +57 -0
- package/scripts/examples/using-google-docs.ts +74 -0
- package/scripts/examples/using-google-drive.ts +74 -0
- package/scripts/examples/using-google-sheets.ts +89 -0
- package/scripts/examples/using-nlp.ts +55 -0
- package/scripts/examples/using-ollama.ts +11 -0
- package/scripts/examples/using-postgres.ts +55 -0
- package/scripts/examples/using-runpod.ts +32 -0
- package/scripts/examples/using-tts.ts +40 -0
- package/scripts/scaffold.ts +391 -0
- package/scripts/scratch.ts +15 -0
- package/scripts/stamp-build.sh +12 -0
- package/scripts/test-assistant-hooks.ts +13 -0
- package/scripts/test-docs-reader.ts +10 -0
- package/scripts/test-linux-binary.sh +80 -0
- package/scripts/update-introspection-data.ts +58 -0
- package/src/agi/README.md +14 -0
- package/src/agi/container.server.ts +156 -0
- package/src/agi/feature.ts +13 -0
- package/src/agi/features/agent-memory.ts +694 -0
- package/src/agi/features/assistant.ts +1653 -0
- package/src/agi/features/assistants-manager.ts +534 -0
- package/src/agi/features/autonomous-assistant.ts +431 -0
- package/src/agi/features/browser-use.ts +672 -0
- package/src/agi/features/claude-code.ts +1584 -0
- package/src/agi/features/coding-tools.ts +175 -0
- package/src/agi/features/conversation-history.ts +672 -0
- package/src/agi/features/conversation.ts +1494 -0
- package/src/agi/features/docs-reader.ts +167 -0
- package/src/agi/features/file-tools.ts +340 -0
- package/src/agi/features/luca-coder.ts +641 -0
- package/src/agi/features/mcp-bridge.ts +532 -0
- package/src/agi/features/openai-codex.ts +651 -0
- package/src/agi/features/openapi.ts +445 -0
- package/src/agi/features/skills-library.ts +557 -0
- package/src/agi/index.ts +6 -0
- package/src/agi/lib/interceptor-chain.ts +89 -0
- package/src/agi/lib/token-counter.ts +202 -0
- package/src/bootstrap/generated.ts +9791 -0
- package/src/browser.ts +25 -0
- package/src/bus.ts +122 -0
- package/src/cli/build-info.ts +4 -0
- package/src/cli/cli.ts +355 -0
- package/src/client.ts +170 -0
- package/src/clients/civitai/index.ts +537 -0
- package/src/clients/client-template.ts +41 -0
- package/src/clients/comfyui/index.ts +604 -0
- package/src/clients/elevenlabs/index.ts +317 -0
- package/src/clients/graph.ts +87 -0
- package/src/clients/openai/index.ts +456 -0
- package/src/clients/rest.ts +207 -0
- package/src/clients/supabase/index.ts +357 -0
- package/src/clients/voicebox/index.ts +300 -0
- package/src/clients/websocket.ts +251 -0
- package/src/command.ts +506 -0
- package/src/commands/bootstrap.ts +244 -0
- package/src/commands/chat.ts +309 -0
- package/src/commands/code.ts +371 -0
- package/src/commands/console.ts +189 -0
- package/src/commands/describe.ts +243 -0
- package/src/commands/eval.ts +67 -0
- package/src/commands/help.ts +240 -0
- package/src/commands/index.ts +19 -0
- package/src/commands/introspect.ts +218 -0
- package/src/commands/mcp.ts +64 -0
- package/src/commands/prompt.ts +1014 -0
- package/src/commands/run.ts +278 -0
- package/src/commands/sandbox-mcp.ts +343 -0
- package/src/commands/save-api-docs.ts +51 -0
- package/src/commands/scaffold.ts +225 -0
- package/src/commands/select.ts +99 -0
- package/src/commands/serve.ts +208 -0
- package/src/container-describer.ts +1091 -0
- package/src/container.ts +1199 -0
- package/src/endpoint.ts +365 -0
- package/src/entity.ts +173 -0
- package/src/feature.ts +118 -0
- package/src/graft.ts +181 -0
- package/src/hash-object.ts +97 -0
- package/src/helper.ts +849 -0
- package/src/introspection/generated.agi.ts +41200 -0
- package/src/introspection/generated.node.ts +28773 -0
- package/src/introspection/generated.web.ts +2272 -0
- package/src/introspection/index.ts +296 -0
- package/src/introspection/scan.ts +1136 -0
- package/src/node/container.ts +409 -0
- package/src/node/feature.ts +13 -0
- package/src/node/features/container-link.ts +559 -0
- package/src/node/features/content-db.ts +849 -0
- package/src/node/features/disk-cache.ts +388 -0
- package/src/node/features/display-result.ts +57 -0
- package/src/node/features/dns.ts +669 -0
- package/src/node/features/docker.ts +921 -0
- package/src/node/features/downloader.ts +79 -0
- package/src/node/features/figlet-fonts.ts +600 -0
- package/src/node/features/file-manager.ts +535 -0
- package/src/node/features/fs.ts +1050 -0
- package/src/node/features/git.ts +592 -0
- package/src/node/features/google-auth.ts +504 -0
- package/src/node/features/google-calendar.ts +306 -0
- package/src/node/features/google-docs.ts +412 -0
- package/src/node/features/google-drive.ts +346 -0
- package/src/node/features/google-mail.ts +540 -0
- package/src/node/features/google-sheets.ts +286 -0
- package/src/node/features/grep.ts +427 -0
- package/src/node/features/helpers.ts +762 -0
- package/src/node/features/ink.ts +490 -0
- package/src/node/features/ipc-socket.ts +649 -0
- package/src/node/features/json-tree.ts +170 -0
- package/src/node/features/networking.ts +961 -0
- package/src/node/features/nlp.ts +212 -0
- package/src/node/features/opener.ts +180 -0
- package/src/node/features/os.ts +403 -0
- package/src/node/features/package-finder.ts +540 -0
- package/src/node/features/postgres.ts +289 -0
- package/src/node/features/proc.ts +503 -0
- package/src/node/features/process-manager.ts +844 -0
- package/src/node/features/python.ts +912 -0
- package/src/node/features/redis.ts +446 -0
- package/src/node/features/repl.ts +212 -0
- package/src/node/features/runpod.ts +811 -0
- package/src/node/features/secure-shell.ts +261 -0
- package/src/node/features/semantic-search.ts +935 -0
- package/src/node/features/sqlite.ts +289 -0
- package/src/node/features/telegram.ts +343 -0
- package/src/node/features/transpiler.ts +160 -0
- package/src/node/features/tts.ts +185 -0
- package/src/node/features/ui.ts +791 -0
- package/src/node/features/vault.ts +153 -0
- package/src/node/features/vm.ts +462 -0
- package/src/node/features/yaml-tree.ts +148 -0
- package/src/node/features/yaml.ts +133 -0
- package/src/node.ts +76 -0
- package/src/python/bridge.py +220 -0
- package/src/python/generated.ts +226 -0
- package/src/react/index.ts +175 -0
- package/src/registry.ts +210 -0
- package/src/scaffolds/generated.ts +1814 -0
- package/src/scaffolds/template.ts +46 -0
- package/src/schemas/base.ts +296 -0
- package/src/selector.ts +352 -0
- package/src/server.ts +229 -0
- package/src/servers/express.ts +283 -0
- package/src/servers/mcp.ts +802 -0
- package/src/servers/socket.ts +258 -0
- package/src/state.ts +101 -0
- package/src/web/clients/socket.ts +99 -0
- package/src/web/container.ts +75 -0
- package/src/web/extension.ts +30 -0
- package/src/web/feature.ts +12 -0
- package/src/web/features/asset-loader.ts +72 -0
- package/src/web/features/container-link.ts +382 -0
- package/src/web/features/esbuild.ts +93 -0
- package/src/web/features/helpers.ts +291 -0
- package/src/web/features/network.ts +85 -0
- package/src/web/features/speech.ts +104 -0
- package/src/web/features/vault.ts +207 -0
- package/src/web/features/vm.ts +85 -0
- package/src/web/features/voice-recognition.ts +161 -0
- package/src/web/shims/isomorphic-vm.ts +149 -0
- package/tsconfig.build.json +12 -0
- package/tsconfig.json +58 -0
- package/uv.lock +8 -0
- package/LICENSE +0 -21
- package/dist/cli/cli.js +0 -48
- package/dist/cli/common.d.ts +0 -2
- package/dist/cli/common.js +0 -6
- package/dist/cli/index.d.ts +0 -2
- package/dist/cli/index.js +0 -5
- package/dist/cli/run.d.ts +0 -1
- package/dist/cli/run.js +0 -38
- package/dist/core/index.d.ts +0 -4
- package/dist/core/index.js +0 -32
- package/dist/core/read.d.ts +0 -2
- package/dist/core/read.js +0 -29
- package/dist/core/request.d.ts +0 -1
- package/dist/core/request.js +0 -2
- package/dist/core/write.d.ts +0 -2
- package/dist/core/write.js +0 -21
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -5
- package/dist/utils/common.d.ts +0 -9
- package/dist/utils/common.js +0 -57
- package/dist/utils/consts.d.ts +0 -3
- package/dist/utils/consts.js +0 -11
- package/dist/utils/dict.d.ts +0 -1
- package/dist/utils/dict.js +0 -7
- package/dist/utils/index.d.ts +0 -5
- package/dist/utils/index.js +0 -21
- package/dist/utils/log.d.ts +0 -1
- package/dist/utils/log.js +0 -5
- package/dist/utils/types.d.ts +0 -1
- package/dist/utils/types.js +0 -2
- package/dist/utils/utils.test.d.ts +0 -1
- package/dist/utils/utils.test.js +0 -7
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build-linux:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
|
|
14
|
+
- name: Setup Bun
|
|
15
|
+
uses: oven-sh/setup-bun@v2
|
|
16
|
+
|
|
17
|
+
- name: Install dependencies
|
|
18
|
+
run: bun install
|
|
19
|
+
|
|
20
|
+
- name: Pre-build steps
|
|
21
|
+
run: |
|
|
22
|
+
bash scripts/stamp-build.sh
|
|
23
|
+
bun run build:introspection
|
|
24
|
+
bun run build:scaffolds
|
|
25
|
+
bun run build:bootstrap
|
|
26
|
+
bun run build:python-bridge
|
|
27
|
+
|
|
28
|
+
- name: Build Linux binaries
|
|
29
|
+
run: |
|
|
30
|
+
mkdir -p dist/release
|
|
31
|
+
bun build ./src/cli/cli.ts --compile --target=bun-linux-x64 --outfile dist/release/luca-linux-x64 --external node-llama-cpp
|
|
32
|
+
bun build ./src/cli/cli.ts --compile --target=bun-linux-arm64 --outfile dist/release/luca-linux-arm64 --external node-llama-cpp
|
|
33
|
+
|
|
34
|
+
- name: Upload Linux artifacts
|
|
35
|
+
uses: actions/upload-artifact@v4
|
|
36
|
+
with:
|
|
37
|
+
name: linux-binaries
|
|
38
|
+
path: dist/release/luca-linux-*
|
|
39
|
+
|
|
40
|
+
build-windows:
|
|
41
|
+
runs-on: windows-latest
|
|
42
|
+
steps:
|
|
43
|
+
- uses: actions/checkout@v4
|
|
44
|
+
|
|
45
|
+
- name: Setup Bun
|
|
46
|
+
uses: oven-sh/setup-bun@v2
|
|
47
|
+
|
|
48
|
+
- name: Install dependencies
|
|
49
|
+
run: bun install
|
|
50
|
+
|
|
51
|
+
- name: Pre-build steps
|
|
52
|
+
shell: bash
|
|
53
|
+
run: |
|
|
54
|
+
bash scripts/stamp-build.sh
|
|
55
|
+
bun run build:introspection
|
|
56
|
+
bun run build:scaffolds
|
|
57
|
+
bun run build:bootstrap
|
|
58
|
+
bun run build:python-bridge
|
|
59
|
+
|
|
60
|
+
- name: Build Windows binary
|
|
61
|
+
shell: bash
|
|
62
|
+
run: |
|
|
63
|
+
mkdir -p dist/release
|
|
64
|
+
bun build ./src/cli/cli.ts --compile --target=bun-windows-x64 --outfile dist/release/luca-windows-x64.exe --external node-llama-cpp
|
|
65
|
+
|
|
66
|
+
- name: Upload Windows artifact
|
|
67
|
+
uses: actions/upload-artifact@v4
|
|
68
|
+
with:
|
|
69
|
+
name: windows-binaries
|
|
70
|
+
path: dist/release/luca-windows-x64.exe
|
|
71
|
+
|
|
72
|
+
build-macos:
|
|
73
|
+
runs-on: macos-latest
|
|
74
|
+
steps:
|
|
75
|
+
- uses: actions/checkout@v4
|
|
76
|
+
|
|
77
|
+
- name: Setup Bun
|
|
78
|
+
uses: oven-sh/setup-bun@v2
|
|
79
|
+
|
|
80
|
+
- name: Install dependencies
|
|
81
|
+
run: bun install
|
|
82
|
+
|
|
83
|
+
- name: Pre-build steps
|
|
84
|
+
run: |
|
|
85
|
+
bash scripts/stamp-build.sh
|
|
86
|
+
bun run build:introspection
|
|
87
|
+
bun run build:scaffolds
|
|
88
|
+
bun run build:bootstrap
|
|
89
|
+
bun run build:python-bridge
|
|
90
|
+
|
|
91
|
+
- name: Build macOS binaries
|
|
92
|
+
run: |
|
|
93
|
+
mkdir -p dist/release
|
|
94
|
+
bun build ./src/cli/cli.ts --compile --target=bun-darwin-x64 --outfile dist/release/luca-darwin-x64 --external node-llama-cpp
|
|
95
|
+
bun build ./src/cli/cli.ts --compile --target=bun-darwin-arm64 --outfile dist/release/luca-darwin-arm64 --external node-llama-cpp
|
|
96
|
+
|
|
97
|
+
- name: Import Developer ID Certificate
|
|
98
|
+
env:
|
|
99
|
+
CERTIFICATE_P12: ${{ secrets.APPLE_CERTIFICATE_P12 }}
|
|
100
|
+
CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
|
|
101
|
+
run: |
|
|
102
|
+
echo "$CERTIFICATE_P12" | base64 --decode > certificate.p12
|
|
103
|
+
security create-keychain -p "" build.keychain
|
|
104
|
+
security import certificate.p12 -k build.keychain \
|
|
105
|
+
-P "$CERTIFICATE_PASSWORD" -T /usr/bin/codesign
|
|
106
|
+
security list-keychains -s build.keychain
|
|
107
|
+
security default-keychain -s build.keychain
|
|
108
|
+
security unlock-keychain -p "" build.keychain
|
|
109
|
+
security set-key-partition-list -S apple-tool:,apple: \
|
|
110
|
+
-s -k "" build.keychain
|
|
111
|
+
|
|
112
|
+
- name: Sign macOS binaries
|
|
113
|
+
run: |
|
|
114
|
+
codesign --sign "Developer ID Application: Demitra Del Fiacco (77WL45HR8M)" \
|
|
115
|
+
--force --options runtime --timestamp dist/release/luca-darwin-x64
|
|
116
|
+
codesign --remove-signature dist/release/luca-darwin-arm64
|
|
117
|
+
codesign --sign "Developer ID Application: Demitra Del Fiacco (77WL45HR8M)" \
|
|
118
|
+
--force --options runtime --timestamp dist/release/luca-darwin-arm64
|
|
119
|
+
|
|
120
|
+
- name: Notarize macOS binaries
|
|
121
|
+
env:
|
|
122
|
+
APPLE_ID: ${{ secrets.APPLE_ID }}
|
|
123
|
+
APPLE_APP_PASSWORD: ${{ secrets.APPLE_APP_PASSWORD }}
|
|
124
|
+
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
|
125
|
+
run: |
|
|
126
|
+
zip dist/release/luca-darwin-x64.zip dist/release/luca-darwin-x64
|
|
127
|
+
xcrun notarytool submit dist/release/luca-darwin-x64.zip \
|
|
128
|
+
--apple-id "$APPLE_ID" \
|
|
129
|
+
--password "$APPLE_APP_PASSWORD" \
|
|
130
|
+
--team-id "$APPLE_TEAM_ID" \
|
|
131
|
+
--wait
|
|
132
|
+
|
|
133
|
+
zip dist/release/luca-darwin-arm64.zip dist/release/luca-darwin-arm64
|
|
134
|
+
xcrun notarytool submit dist/release/luca-darwin-arm64.zip \
|
|
135
|
+
--apple-id "$APPLE_ID" \
|
|
136
|
+
--password "$APPLE_APP_PASSWORD" \
|
|
137
|
+
--team-id "$APPLE_TEAM_ID" \
|
|
138
|
+
--wait
|
|
139
|
+
|
|
140
|
+
- name: Staple notarization
|
|
141
|
+
run: |
|
|
142
|
+
xcrun stapler staple dist/release/luca-darwin-x64 || true
|
|
143
|
+
xcrun stapler staple dist/release/luca-darwin-arm64 || true
|
|
144
|
+
|
|
145
|
+
- name: Upload macOS artifacts
|
|
146
|
+
uses: actions/upload-artifact@v4
|
|
147
|
+
with:
|
|
148
|
+
name: macos-binaries
|
|
149
|
+
path: dist/release/luca-darwin-*
|
|
150
|
+
exclude: |
|
|
151
|
+
dist/release/*.zip
|
|
152
|
+
|
|
153
|
+
create-release:
|
|
154
|
+
needs: [build-linux, build-windows, build-macos]
|
|
155
|
+
runs-on: ubuntu-latest
|
|
156
|
+
permissions:
|
|
157
|
+
contents: write
|
|
158
|
+
steps:
|
|
159
|
+
- name: Download all artifacts
|
|
160
|
+
uses: actions/download-artifact@v4
|
|
161
|
+
with:
|
|
162
|
+
merge-multiple: true
|
|
163
|
+
path: dist/release
|
|
164
|
+
|
|
165
|
+
- name: Create draft GitHub release
|
|
166
|
+
uses: softprops/action-gh-release@v2
|
|
167
|
+
with:
|
|
168
|
+
draft: true
|
|
169
|
+
generate_release_notes: true
|
|
170
|
+
files: dist/release/*
|
package/AGENTS.md
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# LUCA
|
|
2
|
+
|
|
3
|
+
Lightweight Universal Conversational Architecture. Runtime is bun.
|
|
4
|
+
|
|
5
|
+
The runtime is bun, that means no vitest.
|
|
6
|
+
|
|
7
|
+
Luca provides a system for building runtime `container` objects which provide server and browser applications with all of the dependencies they need to build complete applications. A `container` is a per process global singleton, event bus, state machine, and dependency injector. A `container` is either based on a node or browser runtime, and comes with features optimized for that environment. You can build your own container on top of it, with your own features, clients, servers. It is very much inspired by docker layer caching.
|
|
8
|
+
|
|
9
|
+
A `container` could be used for all "business logic" and state, and be a headless provider for an entire application. The UI, Scripting output, input, etc, are all just functional interfaces and event bindings to the core container and all of its helpers, and their state.
|
|
10
|
+
|
|
11
|
+
Dependencies consist of Helpers - Features, Clients, Servers, as well as primitives like event buses, observable state. The `container` contains registries of all available components: `container.features`, `container.clients`, `container.servers`, `container.commands`, `container.endpoints` as well as factory functions to create instances of them: `container.feature('fileManager')`, `container.server('express')`.
|
|
12
|
+
|
|
13
|
+
The `container` and its helpers are perfect for scripts and long running services on the backend, or highly reactive and stateful applications on the frontend. The components can easily talk to eachother, as the `container` on the server provides servers like `container.server('express')` and `container.server('websocket')` as well as `container.client('rest')` and `container.client('websocket')` and others.
|
|
14
|
+
|
|
15
|
+
On the frontend the browser container is perfect for highly reactive, stateful web applications, especially works well with React.
|
|
16
|
+
|
|
17
|
+
## The `luca` CLI
|
|
18
|
+
|
|
19
|
+
- in dev, `bun run src/cli/cli.ts` is the same as `luca`
|
|
20
|
+
|
|
21
|
+
- in prod, or educational material, `luca` refers to the binary build. In this mode, it can work in any project, and load `commands/` and `endpoints/` through its VM and therefore allows folders of these modules which don't depend on anything from NPM to extend the CLI and be used in commands like `luca serve` to run a local express server
|
|
22
|
+
|
|
23
|
+
- The `luca` cli is an extremely helpful tool.
|
|
24
|
+
- it runs code `luca eval "container.features.available"`
|
|
25
|
+
- it generates docs:
|
|
26
|
+
- `luca describe diskCache`
|
|
27
|
+
- `luca describe` describe the container itself
|
|
28
|
+
- `luca describe servers` describe which servers are available
|
|
29
|
+
- `luca describe ui.banner` describe a specific method or getter on a helper
|
|
30
|
+
- the arguments to describe are pretty forgiving and permissive
|
|
31
|
+
|
|
32
|
+
**IMPORTANT NOTE** When trying to investigate features, clients, servers, etc, see if these tools can help you first instead of searching for files and reading them that way. If youw ant to understand what they do, vs how theyre actually implemented
|
|
33
|
+
|
|
34
|
+
## Coding style and guidelines
|
|
35
|
+
|
|
36
|
+
- The container is intended to provide a collection of blessed, approved, audited modules that we've built and curated together. It is intended to be the primary API and interface through the system
|
|
37
|
+
- The container should provide you with everything you need, and you should not need to be importing dependencies or other modules. If you find yourself stuck by this constraint, raise this concern, and we can work on finding a way to bring in a feature or client
|
|
38
|
+
- When trying to find paths in the project, use `container.paths.resolve()` or `container.paths.join()` instead of `import { resolve } from 'path'`
|
|
39
|
+
- **NEVER import from `fs`, `path`, or other Node builtins when the container provides equivalents.** Use `container.feature('fs')` for file operations, `container.paths` for path operations. This applies everywhere — command handlers, scripts, and feature implementations alike. If a container feature wraps the functionality, use it.
|
|
40
|
+
|
|
41
|
+
## Container Utilities
|
|
42
|
+
|
|
43
|
+
The container provides `container.utils` with common utilities. **Use these instead of importing packages directly** — they work in both node and web environments.
|
|
44
|
+
|
|
45
|
+
- `container.utils.uuid()` — generates a v4 UUID (use instead of importing `node-uuid` or `crypto`)
|
|
46
|
+
- `container.utils.hashObject(obj)` — deterministic hash of any object
|
|
47
|
+
- `container.utils.stringUtils` — `{ kebabCase, camelCase, upperFirst, lowerFirst, pluralize, singularize }`
|
|
48
|
+
- `container.utils.lodash` — `{ uniq, keyBy, uniqBy, groupBy, debounce, throttle, mapValues, mapKeys, pick, get, set, omit }`
|
|
49
|
+
|
|
50
|
+
Also available on every container:
|
|
51
|
+
- `container.uuid` — the container's own unique ID
|
|
52
|
+
- `container.paths.resolve()` / `container.paths.join()` — path operations
|
|
53
|
+
|
|
54
|
+
## Adding a New Feature — Checklist
|
|
55
|
+
|
|
56
|
+
When creating a new feature (e.g. `gws`), all four of these steps must be completed or `container.feature('gws')` will fail silently or lack type safety:
|
|
57
|
+
|
|
58
|
+
1. **Feature file** — `src/node/features/gws.ts`
|
|
59
|
+
- Export the class: `export class Gws extends Feature { ... }`
|
|
60
|
+
- Register at bottom: `export default features.register('gws', Gws)`
|
|
61
|
+
|
|
62
|
+
2. **Side-effect import** — `src/node/container.ts` (import block ~line 20-63)
|
|
63
|
+
- Add `import "./features/gws";` (this triggers registration)
|
|
64
|
+
|
|
65
|
+
3. **Type import + re-export** — `src/node/container.ts` (type imports ~line 65-148)
|
|
66
|
+
- Add `import type { Gws } from './features/gws';`
|
|
67
|
+
- Add `type Gws,` to the `export { ... }` block
|
|
68
|
+
|
|
69
|
+
4. **Feature type mapping** — `src/node/container.ts` (`NodeFeatures` interface ~line 170-215)
|
|
70
|
+
- Add `gws: typeof Gws;` to the `NodeFeatures` interface
|
|
71
|
+
|
|
72
|
+
Missing step 2 = feature never registers (invisible).
|
|
73
|
+
Missing steps 3-4 = no autocomplete, `container.feature('gws')` returns `Feature` not `Gws`.
|
|
74
|
+
|
|
75
|
+
If the feature has a test, it goes in `test/gws.test.ts`.
|
|
76
|
+
|
|
77
|
+
## Type Safety and Introspection
|
|
78
|
+
|
|
79
|
+
- Zod does a lot of the heavy lifting for us with its type inference
|
|
80
|
+
- For more descriptive things like class descriptions, method descriptions, we rely on jsdoc blocks. These are parsed and used to generate modules we commit to source. We shouldn't let these drift, so for this reason we have a pre-commit hook which ensures they're up to date
|
|
81
|
+
- We rely on module augmentation a lot to make sure `container.feature()` can provide type signatures for everything that gets added to it by extension modules down the road. ( kind of like we did with AGIContainer extending NodeContainer )
|
|
82
|
+
|
|
83
|
+
## Testing
|
|
84
|
+
|
|
85
|
+
- Test runner is **bun** (not vitest). Do not import from or add vitest.
|
|
86
|
+
- `bun test` or `bun run test` — runs unit tests only (`test/*.test.ts`)
|
|
87
|
+
- `bun run test:integration` — runs integration tests in `test-integration/` that hit real APIs/CLIs (gated by env vars)
|
|
88
|
+
- Import `mock`, `spyOn` from `bun:test` when needed. If you import anything from `bun:test`, you must also import `describe`, `it`, `expect`, etc. from there (importing disables auto-globals).
|
|
89
|
+
- **ALL tests must pass. Zero tolerance for test failures.** The ESBuild feature's "service is no longer running" error is a known critical bug — if you encounter it, fix it. Do not ignore it, do not skip it, do not leave it broken. This applies to every test: if a test fails, that is a blocker. Fix the root cause.
|
|
90
|
+
|
|
91
|
+
## API Docs
|
|
92
|
+
|
|
93
|
+
- See [docs/apis](./docs/apis/) for detailed API descriptions of the public methods and options for creating various helpers
|
|
94
|
+
- See [docs/examples](./docs/examples/) for examples of using each feature. NOTE: These docs are runnable so you can see the output of the code blocks. `luca run docs/examples/grep` for example
|
|
95
|
+
- See [docs/tutorials](./docs/tutorials/) for longer form tutorials on various subjects and best practices
|
|
96
|
+
|
|
97
|
+
## Git Strategy
|
|
98
|
+
|
|
99
|
+
- We generally roll all on main. Commit your changes after you're done, only your changes. Leave a good message, tell me why don't just tell me what. Don't gimme that coauthored by whoever bullshit. The streets know we're one.
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# LUCA
|
|
2
|
+
|
|
3
|
+
Lightweight Universal Conversational Architecture. Runtime is bun.
|
|
4
|
+
|
|
5
|
+
The runtime is bun, that means no vitest.
|
|
6
|
+
|
|
7
|
+
Luca provides a system for building runtime `container` objects which provide server and browser applications with all of the dependencies they need to build complete applications. A `container` is a per process global singleton, event bus, state machine, and dependency injector. A `container` is either based on a node or browser runtime, and comes with features optimized for that environment. You can build your own container on top of it, with your own features, clients, servers. It is very much inspired by docker layer caching.
|
|
8
|
+
|
|
9
|
+
A `container` could be used for all "business logic" and state, and be a headless provider for an entire application. The UI, Scripting output, input, etc, are all just functional interfaces and event bindings to the core container and all of its helpers, and their state.
|
|
10
|
+
|
|
11
|
+
Dependencies consist of Helpers - Features, Clients, Servers, as well as primitives like event buses, observable state. The `container` contains registries of all available components: `container.features`, `container.clients`, `container.servers`, `container.commands`, `container.endpoints` as well as factory functions to create instances of them: `container.feature('fileManager')`, `container.server('express')`.
|
|
12
|
+
|
|
13
|
+
The `container` and its helpers are perfect for scripts and long running services on the backend, or highly reactive and stateful applications on the frontend. The components can easily talk to eachother, as the `container` on the server provides servers like `container.server('express')` and `container.server('websocket')` as well as `container.client('rest')` and `container.client('websocket')` and others.
|
|
14
|
+
|
|
15
|
+
On the frontend the browser container is perfect for highly reactive, stateful web applications, especially works well with React.
|
|
16
|
+
|
|
17
|
+
## Developer Standards
|
|
18
|
+
|
|
19
|
+
- Please try not to have broken tests committed to the build and let them slide. Encourage me to fix them so they dont grow out of control.
|
|
20
|
+
- When working on features, clients, servers, or other helpers, the introspection system relies on good zod descriptions, and good jsdoc descriptions
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## The `luca` CLI
|
|
24
|
+
|
|
25
|
+
- in dev, `bun run src/cli/cli.ts` is the same as `luca`
|
|
26
|
+
|
|
27
|
+
- in prod, or educational material, `luca` refers to the binary build. In this mode, it can work in any project, and load `commands/` and `endpoints/` through its VM and therefore allows folders of these modules which don't depend on anything from NPM to extend the CLI and be used in commands like `luca serve` to run a local express server
|
|
28
|
+
|
|
29
|
+
- The `luca` cli is an extremely helpful tool.
|
|
30
|
+
- it runs code `luca eval "container.features.available"`
|
|
31
|
+
- it generates docs:
|
|
32
|
+
- `luca describe diskCache`
|
|
33
|
+
- `luca describe` describe the container itself
|
|
34
|
+
- `luca describe servers` describe which servers are available
|
|
35
|
+
- `luca describe ui.banner` describe a specific method or getter on a helper
|
|
36
|
+
- the arguments to describe are pretty forgiving and permissive
|
|
37
|
+
- `luca chat` — start an interactive chat session with an assistant
|
|
38
|
+
- `luca scaffold assistant <name>` — generate boilerplate for a new assistant
|
|
39
|
+
|
|
40
|
+
**IMPORTANT NOTE** When trying to investigate features, clients, servers, etc, see if these tools can help you first instead of searching for files and reading them that way. If youw ant to understand what they do, vs how theyre actually implemented
|
|
41
|
+
|
|
42
|
+
## OpenAI Tool Schemas (Zod → JSON Schema)
|
|
43
|
+
|
|
44
|
+
**OpenAI requires `required` to list ALL property keys in `properties`**, even optional ones. Zod's `toJSONSchema()` only puts non-optional fields in `required`, which OpenAI rejects with "Missing 'X'" errors. The `assistant.addTool()` method handles this automatically by always setting `required: Object.keys(properties)`. Do NOT use `z.any()` or `z.record(z.any())` in tool schemas — Zod v4's `toJSONSchema()` cannot serialize `z.any()` and will throw `schema._zod is undefined`. Use concrete types like `z.string()` instead (e.g. accept a JSON string and parse it at runtime).
|
|
45
|
+
|
|
46
|
+
## Coding style and guidelines
|
|
47
|
+
|
|
48
|
+
- The container is intended to provide a collection of blessed, approved, audited modules that we've built and curated together. It is intended to be the primary API and interface through the system
|
|
49
|
+
- The container should provide you with everything you need, and you should not need to be importing dependencies or other modules. If you find yourself stuck by this constraint, raise this concern, and we can work on finding a way to bring in a feature or client
|
|
50
|
+
- When trying to find paths in the project, use `container.paths.resolve()` or `container.paths.join()` instead of `import { resolve } from 'path'`
|
|
51
|
+
- **`paths.join()` vs `paths.resolve()` gotcha:** `paths.join()` always prepends `container.cwd` — even if you pass an absolute path as the first arg. Use `paths.resolve(absolutePath, 'sub')` when the base is already absolute (e.g. `os.tmpdir`). `resolve` respects absolute first args just like Node's `path.resolve`.
|
|
52
|
+
- **NEVER import from `fs`, `path`, or other Node builtins when the container provides equivalents.** Use `container.feature('fs')` for file operations, `container.paths` for path operations. This applies everywhere — command handlers, scripts, and feature implementations alike. If a container feature wraps the functionality, use it.
|
|
53
|
+
|
|
54
|
+
## Container Utilities
|
|
55
|
+
|
|
56
|
+
The container provides `container.utils` with common utilities. **Use these instead of importing packages directly** — they work in both node and web environments.
|
|
57
|
+
|
|
58
|
+
- `container.utils.uuid()` — generates a v4 UUID (use instead of importing `node-uuid` or `crypto`)
|
|
59
|
+
- `container.utils.hashObject(obj)` — deterministic hash of any object
|
|
60
|
+
- `container.utils.stringUtils` — `{ kebabCase, camelCase, upperFirst, lowerFirst, pluralize, singularize }`
|
|
61
|
+
- `container.utils.lodash` — `{ uniq, keyBy, uniqBy, groupBy, debounce, throttle, mapValues, mapKeys, pick, get, set, omit }`
|
|
62
|
+
|
|
63
|
+
Also available on every container:
|
|
64
|
+
- `container.uuid` — the container's own unique ID
|
|
65
|
+
- `container.paths.resolve()` / `container.paths.join()` — path operations
|
|
66
|
+
|
|
67
|
+
## Adding a New Feature — Checklist
|
|
68
|
+
|
|
69
|
+
When creating a new feature (e.g. `gws`), all four of these steps must be completed or `container.feature('gws')` will fail silently or lack type safety:
|
|
70
|
+
|
|
71
|
+
1. **Feature file** — `src/node/features/gws.ts`
|
|
72
|
+
- Export the class: `export class Gws extends Feature { ... }`
|
|
73
|
+
- Register inside the class: `static { Feature.register(this, 'gws') }`
|
|
74
|
+
- Default export is just the class: `export default Gws`
|
|
75
|
+
|
|
76
|
+
2. **Side-effect import** — `src/node/container.ts` (import block ~line 20-63)
|
|
77
|
+
- Add `import "./features/gws";` (this triggers registration)
|
|
78
|
+
|
|
79
|
+
3. **Type import + re-export** — `src/node/container.ts` (type imports ~line 65-148)
|
|
80
|
+
- Add `import type { Gws } from './features/gws';`
|
|
81
|
+
- Add `type Gws,` to the `export { ... }` block
|
|
82
|
+
|
|
83
|
+
4. **Feature type mapping** — `src/node/container.ts` (`NodeFeatures` interface ~line 170-215)
|
|
84
|
+
- Add `gws: typeof Gws;` to the `NodeFeatures` interface
|
|
85
|
+
|
|
86
|
+
Missing step 2 = feature never registers (invisible).
|
|
87
|
+
Missing steps 3-4 = no autocomplete, `container.feature('gws')` returns `Feature` not `Gws`.
|
|
88
|
+
|
|
89
|
+
If the feature has a test, it goes in `test/gws.test.ts`.
|
|
90
|
+
|
|
91
|
+
## Type Safety and Introspection
|
|
92
|
+
|
|
93
|
+
- Zod does a lot of the heavy lifting for us with its type inference
|
|
94
|
+
- For more descriptive things like class descriptions, method descriptions, we rely on jsdoc blocks. These are parsed and used to generate modules we commit to source. We shouldn't let these drift, so for this reason we have a pre-commit hook which ensures they're up to date
|
|
95
|
+
- We rely on module augmentation a lot to make sure `container.feature()` can provide type signatures for everything that gets added to it by extension modules down the road. ( kind of like we did with AGIContainer extending NodeContainer )
|
|
96
|
+
|
|
97
|
+
## Generated Files — Build Artifacts
|
|
98
|
+
|
|
99
|
+
**Files matching `generated.ts` or `.generated*.ts` are BUILD ARTIFACTS, not source of truth.** They are produced by the introspection system (which parses JSDoc blocks, Zod schemas, etc.) and bundled into the binary at compile time. **Never edit these files directly** — your changes will be overwritten on the next build.
|
|
100
|
+
|
|
101
|
+
The source of truth for scaffolds and templates is the markdown files and the actual source code with their JSDoc annotations. If scaffold output is wrong, fix the markdown source or the JSDoc blocks on the real classes, then rebuild.
|
|
102
|
+
|
|
103
|
+
This means **JSDoc blocks on helpers (features, clients, servers) must be valid and complete** — they are picked up by the introspection system, used to generate API docs, scaffold tutorials, and the `luca describe` output. Treat JSDoc as documentation infrastructure, not comments.
|
|
104
|
+
|
|
105
|
+
## Testing
|
|
106
|
+
|
|
107
|
+
- Test runner is **bun** (not vitest). Do not import from or add vitest.
|
|
108
|
+
- `bun test` or `bun run test` — runs unit tests only (`test/*.test.ts`)
|
|
109
|
+
- `bun run test:integration` — runs integration tests in `test-integration/` that hit real APIs/CLIs (gated by env vars)
|
|
110
|
+
- Import `mock`, `spyOn` from `bun:test` when needed. If you import anything from `bun:test`, you must also import `describe`, `it`, `expect`, etc. from there (importing disables auto-globals).
|
|
111
|
+
- **ALL tests must pass. Zero tolerance for test failures.** The ESBuild feature's "service is no longer running" error is a known critical bug — if you encounter it, fix it. Do not ignore it, do not skip it, do not leave it broken. This applies to every test: if a test fails, that is a blocker. Fix the root cause.
|
|
112
|
+
|
|
113
|
+
## API Docs
|
|
114
|
+
|
|
115
|
+
- See [docs/apis](./docs/apis/) for detailed API descriptions of the public methods and options for creating various helpers
|
|
116
|
+
- See [docs/examples](./docs/examples/) for examples of using each feature. NOTE: These docs are runnable so you can see the output of the code blocks. `luca run docs/examples/grep` for example
|
|
117
|
+
- See [docs/tutorials](./docs/tutorials/) for longer form tutorials on various subjects and best practices
|
|
118
|
+
|
|
119
|
+
## Git Strategy
|
|
120
|
+
|
|
121
|
+
- We generally roll all on main. Commit your changes after you're done, only your changes. Leave a good message, tell me why don't just tell me what. Don't gimme that coauthored by whoever bullshit. The streets know we're one.
|
|
122
|
+
|
|
123
|
+
- Always commit your work
|
package/CNAME
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
luca-js.soederpop.com
|