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,243 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { commands } from '../command.js'
|
|
3
|
+
import { CommandOptionsSchema } from '../schemas/base.js'
|
|
4
|
+
import type { ContainerContext } from '../container.js'
|
|
5
|
+
import type { HelperIntrospection, IntrospectionSection } from '../introspection/index.js'
|
|
6
|
+
import { __INTROSPECTION__, __BROWSER_INTROSPECTION__ } from '../introspection/index.js'
|
|
7
|
+
import { features } from '../feature.js'
|
|
8
|
+
import { ContainerDescriber } from '../container-describer.js'
|
|
9
|
+
import type { BrowserFeatureData } from '../container-describer.js'
|
|
10
|
+
import { presentIntrospectionAsTypeScript } from '../helper.js'
|
|
11
|
+
|
|
12
|
+
declare module '../command.js' {
|
|
13
|
+
interface AvailableCommands {
|
|
14
|
+
describe: ReturnType<typeof commands.registerHandler>
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const argsSchema = CommandOptionsSchema.extend({
|
|
19
|
+
json: z.boolean().default(false).describe('Output introspection data as JSON instead of markdown'),
|
|
20
|
+
typescript: z.boolean().default(false).describe('Output introspection data as TypeScript interface declarations'),
|
|
21
|
+
ts: z.boolean().default(false).describe('Alias for --typescript'),
|
|
22
|
+
pretty: z.boolean().default(false).describe('Render markdown with terminal styling via ui.markdown'),
|
|
23
|
+
title: z.boolean().default(true).describe('Include the title header in the output (use --no-title to omit)'),
|
|
24
|
+
// Clean section flags (can be combined: --description --usage)
|
|
25
|
+
description: z.boolean().default(false).describe('Show the description section'),
|
|
26
|
+
usage: z.boolean().default(false).describe('Show the usage section'),
|
|
27
|
+
methods: z.boolean().default(false).describe('Show the methods section'),
|
|
28
|
+
getters: z.boolean().default(false).describe('Show the getters section'),
|
|
29
|
+
events: z.boolean().default(false).describe('Show the events section'),
|
|
30
|
+
state: z.boolean().default(false).describe('Show the state section'),
|
|
31
|
+
options: z.boolean().default(false).describe('Show the options section'),
|
|
32
|
+
'env-vars': z.boolean().default(false).describe('Show the envVars section'),
|
|
33
|
+
envvars: z.boolean().default(false).describe('Show the envVars section'),
|
|
34
|
+
examples: z.boolean().default(false).describe('Show the examples section'),
|
|
35
|
+
// Legacy --only-* flags
|
|
36
|
+
'only-methods': z.boolean().default(false).describe('Show only the methods section'),
|
|
37
|
+
'only-getters': z.boolean().default(false).describe('Show only the getters section'),
|
|
38
|
+
'only-events': z.boolean().default(false).describe('Show only the events section'),
|
|
39
|
+
'only-state': z.boolean().default(false).describe('Show only the state section'),
|
|
40
|
+
'only-options': z.boolean().default(false).describe('Show only the options section'),
|
|
41
|
+
'only-env-vars': z.boolean().default(false).describe('Show only the envVars section'),
|
|
42
|
+
'only-envvars': z.boolean().default(false).describe('Show only the envVars section'),
|
|
43
|
+
'only-examples': z.boolean().default(false).describe('Show only the examples section'),
|
|
44
|
+
platform: z.enum(['browser', 'web', 'server', 'node', 'all']).default('all').describe('Which platform features to show: browser/web, server/node, or all'),
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
// --- Browser feature loading (build-time concern, lives here not in ContainerDescriber) ---
|
|
48
|
+
|
|
49
|
+
const WEB_FEATURE_IDS = ['speech', 'voice', 'assetLoader', 'network', 'vault', 'vm', 'esbuild', 'helpers', 'containerLink']
|
|
50
|
+
|
|
51
|
+
let _browserData: BrowserFeatureData | null = null
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Load web/browser feature introspection data into a separate map.
|
|
55
|
+
* This is a build-time hack: we import web feature classes into the node process,
|
|
56
|
+
* snapshot their introspection, then restore the node registry.
|
|
57
|
+
* The ContainerDescriber itself knows nothing about this.
|
|
58
|
+
*/
|
|
59
|
+
async function loadBrowserFeatures(): Promise<BrowserFeatureData> {
|
|
60
|
+
if (_browserData) return _browserData
|
|
61
|
+
|
|
62
|
+
const nodeFeatureIds = new Set(features.available)
|
|
63
|
+
const nodeIntrospection = new Map<string, HelperIntrospection>()
|
|
64
|
+
const nodeConstructors = new Map<string, any>()
|
|
65
|
+
|
|
66
|
+
for (const id of nodeFeatureIds) {
|
|
67
|
+
const data = __INTROSPECTION__.get(`features.${id}`)
|
|
68
|
+
if (data) nodeIntrospection.set(`features.${id}`, structuredClone(data))
|
|
69
|
+
try { nodeConstructors.set(id, features.lookup(id)) } catch {}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
await import('../introspection/generated.web.js')
|
|
73
|
+
|
|
74
|
+
await Promise.all([
|
|
75
|
+
import('../web/features/speech.js'),
|
|
76
|
+
import('../web/features/voice-recognition.js'),
|
|
77
|
+
import('../web/features/asset-loader.js'),
|
|
78
|
+
import('../web/features/network.js'),
|
|
79
|
+
import('../web/features/vault.js'),
|
|
80
|
+
import('../web/features/vm.js'),
|
|
81
|
+
import('../web/features/esbuild.js'),
|
|
82
|
+
import('../web/features/helpers.js'),
|
|
83
|
+
import('../web/features/container-link.js'),
|
|
84
|
+
])
|
|
85
|
+
|
|
86
|
+
const browserIntrospection = new Map<string, HelperIntrospection>()
|
|
87
|
+
const browserConstructors = new Map<string, any>()
|
|
88
|
+
const collidingIds = new Set<string>()
|
|
89
|
+
|
|
90
|
+
for (const id of WEB_FEATURE_IDS) {
|
|
91
|
+
const key = `features.${id}`
|
|
92
|
+
const data = __INTROSPECTION__.get(key)
|
|
93
|
+
if (data) browserIntrospection.set(key, structuredClone(data))
|
|
94
|
+
try { browserConstructors.set(id, features.lookup(id)) } catch {}
|
|
95
|
+
if (nodeFeatureIds.has(id)) collidingIds.add(id)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
for (const [id, ctor] of nodeConstructors) {
|
|
99
|
+
features.register(id, ctor)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
for (const [key, data] of nodeIntrospection) {
|
|
103
|
+
__INTROSPECTION__.set(key, data)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
for (const id of WEB_FEATURE_IDS) {
|
|
107
|
+
const key = `features.${id}`
|
|
108
|
+
if (!nodeIntrospection.has(key)) __INTROSPECTION__.delete(key)
|
|
109
|
+
if (!nodeFeatureIds.has(id)) features.unregister(id)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
for (const [key, data] of browserIntrospection) {
|
|
113
|
+
__BROWSER_INTROSPECTION__.set(key, data)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
_browserData = {
|
|
117
|
+
introspection: browserIntrospection,
|
|
118
|
+
constructors: browserConstructors,
|
|
119
|
+
available: WEB_FEATURE_IDS.filter(id => browserIntrospection.has(`features.${id}`)),
|
|
120
|
+
collidingIds,
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return _browserData
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function shouldIncludeBrowser(platform: string): boolean {
|
|
127
|
+
return platform === 'browser' || platform === 'web' || platform === 'all'
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// --- Command handler ---
|
|
131
|
+
|
|
132
|
+
export default async function describe(options: z.infer<typeof argsSchema>, context: ContainerContext) {
|
|
133
|
+
const container = context.container as any
|
|
134
|
+
const describer = new ContainerDescriber(container)
|
|
135
|
+
|
|
136
|
+
const args = container.argv._ as string[]
|
|
137
|
+
const targets = args.slice(1)
|
|
138
|
+
|
|
139
|
+
// No targets: show help screen
|
|
140
|
+
if (targets.length === 0) {
|
|
141
|
+
const { formatCommandHelp } = await import('./help.js')
|
|
142
|
+
const ui = container.feature('ui') as any
|
|
143
|
+
const Cmd = container.commands.lookup('describe')
|
|
144
|
+
console.log(formatCommandHelp('describe', Cmd, ui.colors))
|
|
145
|
+
return
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Build-time hack: load browser features into the describer if needed
|
|
149
|
+
if (shouldIncludeBrowser(options.platform)) {
|
|
150
|
+
const browserData = await loadBrowserFeatures()
|
|
151
|
+
describer.setBrowserData(browserData)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const sections = ContainerDescriber.getSectionsFromFlags(options)
|
|
155
|
+
|
|
156
|
+
const result = await describer.describe(targets, {
|
|
157
|
+
sections,
|
|
158
|
+
noTitle: !options.title,
|
|
159
|
+
platform: options.platform as any,
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
const wantsTypeScript = options.typescript || options.ts
|
|
163
|
+
|
|
164
|
+
if (wantsTypeScript) {
|
|
165
|
+
const output = renderResultAsTypeScript(result, targets, describer, sections)
|
|
166
|
+
if (options.pretty) {
|
|
167
|
+
const ui = container.feature('ui')
|
|
168
|
+
console.log(ui.markdown('```ts\n' + output + '\n```'))
|
|
169
|
+
} else {
|
|
170
|
+
console.log(output)
|
|
171
|
+
}
|
|
172
|
+
} else if (options.json) {
|
|
173
|
+
console.log(JSON.stringify(result.json, null, 2))
|
|
174
|
+
} else if (options.pretty) {
|
|
175
|
+
const ui = container.feature('ui')
|
|
176
|
+
console.log(ui.markdown(result.text))
|
|
177
|
+
} else {
|
|
178
|
+
console.log(result.text)
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Renders the describe result as TypeScript interface declarations.
|
|
184
|
+
* Handles single helpers, arrays of helpers (registry describes), and the container.
|
|
185
|
+
*/
|
|
186
|
+
function renderResultAsTypeScript(result: { json: any; text: string }, targets: string[], describer: ContainerDescriber, sections: (IntrospectionSection | 'description')[]): string {
|
|
187
|
+
const json = result.json
|
|
188
|
+
const section = sections.length === 1 && sections[0] !== 'description' ? sections[0] as IntrospectionSection : undefined
|
|
189
|
+
|
|
190
|
+
// Single helper introspection object (has shortcut = full data, or id = filtered data)
|
|
191
|
+
if (json && (json.shortcut || json.id)) {
|
|
192
|
+
// If sections were applied, the JSON is partial — get full data and pass section to renderer
|
|
193
|
+
const fullData = json.shortcut ? json : __INTROSPECTION__.get(json.id) || json
|
|
194
|
+
return presentIntrospectionAsTypeScript(fullData, section)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Container introspection (has className, registries, factories)
|
|
198
|
+
if (json && json.className && json.registries) {
|
|
199
|
+
const container = (describer as any).container
|
|
200
|
+
return container.introspectAsType()
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Array of results (e.g. from registry describe or multiple targets)
|
|
204
|
+
if (Array.isArray(json)) {
|
|
205
|
+
const interfaces = json
|
|
206
|
+
.filter((item: any) => item && (item.shortcut || item.id))
|
|
207
|
+
.map((item: any) => {
|
|
208
|
+
const fullData = item.shortcut ? item : __INTROSPECTION__.get(item.id) || item
|
|
209
|
+
return presentIntrospectionAsTypeScript(fullData, section)
|
|
210
|
+
})
|
|
211
|
+
return interfaces.join('\n\n')
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Object keyed by helper id (registry describe format — has _shared and per-helper summaries)
|
|
215
|
+
if (json && typeof json === 'object' && !json._helper && json._shared) {
|
|
216
|
+
const ids = Object.keys(json).filter(k => k !== '_shared')
|
|
217
|
+
const interfaces = ids
|
|
218
|
+
.map((id: string) => {
|
|
219
|
+
// Try qualified key first (e.g. "clients.rest"), then scan the introspection map
|
|
220
|
+
for (const prefix of ['features', 'clients', 'servers', 'commands', 'endpoints']) {
|
|
221
|
+
const data = __INTROSPECTION__.get(`${prefix}.${id}`)
|
|
222
|
+
if (data) return presentIntrospectionAsTypeScript(data, section)
|
|
223
|
+
}
|
|
224
|
+
return null
|
|
225
|
+
})
|
|
226
|
+
.filter(Boolean)
|
|
227
|
+
if (interfaces.length > 0) return interfaces.join('\n\n')
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Member-level result (has _helper and _type) — render the full helper interface
|
|
231
|
+
if (json && json._helper) {
|
|
232
|
+
const fullData = __INTROSPECTION__.get(json._helper) || __INTROSPECTION__.get(`features.${json._helper}`)
|
|
233
|
+
if (fullData) return presentIntrospectionAsTypeScript(fullData)
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return result.text
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
commands.registerHandler('describe', {
|
|
240
|
+
description: 'Describe the container, registries, or individual helpers',
|
|
241
|
+
argsSchema,
|
|
242
|
+
handler: describe,
|
|
243
|
+
})
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { commands } from '../command.js'
|
|
3
|
+
import { displayResult } from '../node/features/display-result.js'
|
|
4
|
+
import { CommandOptionsSchema } from '../schemas/base.js'
|
|
5
|
+
import type { ContainerContext } from '../container.js'
|
|
6
|
+
|
|
7
|
+
declare module '../command.js' {
|
|
8
|
+
interface AvailableCommands {
|
|
9
|
+
eval: ReturnType<typeof commands.registerHandler>
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const argsSchema = CommandOptionsSchema.extend({
|
|
14
|
+
json: z.boolean().default(false).describe('Serialize output as JSON'),
|
|
15
|
+
enable: z.string().optional().describe('Enable a feature before evaluating (e.g. --enable diskCache)'),
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
export default async function evalCommand(options: z.infer<typeof argsSchema>, context: ContainerContext) {
|
|
19
|
+
const container = context.container as any
|
|
20
|
+
|
|
21
|
+
container.addContext('feature', (...args: any) => container.feature(...args))
|
|
22
|
+
|
|
23
|
+
await container.helpers.discoverAll()
|
|
24
|
+
|
|
25
|
+
const args = container.argv._ as string[]
|
|
26
|
+
// args[0] is "eval", the rest is the code snippet
|
|
27
|
+
let code = args.slice(1).join(' ')
|
|
28
|
+
|
|
29
|
+
// Read from stdin if no inline code was provided
|
|
30
|
+
if (!code.trim()) {
|
|
31
|
+
code = await Bun.stdin.text()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (!code.trim()) {
|
|
35
|
+
console.error('Usage: luca eval "<code>" [--json]')
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const vm = container.feature('vm')
|
|
40
|
+
|
|
41
|
+
// HACK
|
|
42
|
+
Array(container.argv.enable).filter(Boolean).map((id) => {
|
|
43
|
+
container.feature(id, { ...container.argv, enable: true }).enable()
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
// Build context with container and all enabled feature instances
|
|
47
|
+
const ctx: Record<string, any> = { container }
|
|
48
|
+
for (const [name, instance] of Object.entries(container.enabledFeatures ?? {})) {
|
|
49
|
+
ctx[name] = instance
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const result = await vm.run(code, ctx)
|
|
53
|
+
|
|
54
|
+
if (options.json) {
|
|
55
|
+
console.log(JSON.stringify(result, null, 2))
|
|
56
|
+
} else {
|
|
57
|
+
displayResult(result)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export { displayResult } from '../node/features/display-result.js'
|
|
62
|
+
|
|
63
|
+
commands.registerHandler('eval', {
|
|
64
|
+
description: 'Evaluate a JavaScript/TypeScript expression with the container in scope',
|
|
65
|
+
argsSchema,
|
|
66
|
+
handler: evalCommand,
|
|
67
|
+
})
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { commands } from '../command.js'
|
|
3
|
+
import { CommandOptionsSchema } from '../schemas/base.js'
|
|
4
|
+
import type { ContainerContext } from '../container.js'
|
|
5
|
+
|
|
6
|
+
declare module '../command.js' {
|
|
7
|
+
interface AvailableCommands {
|
|
8
|
+
help: ReturnType<typeof commands.registerHandler>
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const argsSchema = CommandOptionsSchema.extend({})
|
|
13
|
+
|
|
14
|
+
/** Hidden option prefixes — legacy aliases that shouldn't clutter help output. */
|
|
15
|
+
const HIDDEN_PREFIXES = ['only-']
|
|
16
|
+
const HIDDEN_KEYS = new Set(['_', 'name', '_cacheKey', 'dispatchSource'])
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Extract CLI option info from a Zod schema.
|
|
20
|
+
* Walks through Zod v4 wrapper types (default, optional) to find descriptions, types, and defaults.
|
|
21
|
+
*/
|
|
22
|
+
function extractOptions(schema: any): Array<{ flag: string; description: string; type: string; defaultValue?: any }> {
|
|
23
|
+
if (!schema?.shape) return []
|
|
24
|
+
|
|
25
|
+
const options: Array<{ flag: string; description: string; type: string; defaultValue?: any }> = []
|
|
26
|
+
|
|
27
|
+
for (const [key, field] of Object.entries(schema.shape)) {
|
|
28
|
+
if (HIDDEN_KEYS.has(key)) continue
|
|
29
|
+
if (HIDDEN_PREFIXES.some((p) => key.startsWith(p))) continue
|
|
30
|
+
|
|
31
|
+
const f = field as any
|
|
32
|
+
// In Zod v4, description lives on the schema object itself
|
|
33
|
+
const description = f.description || ''
|
|
34
|
+
let type = 'string'
|
|
35
|
+
let defaultValue: any = undefined
|
|
36
|
+
|
|
37
|
+
// Walk through wrapper types to find leaf type and default
|
|
38
|
+
let current = f
|
|
39
|
+
while (current) {
|
|
40
|
+
const defType = current._def?.type || current.type
|
|
41
|
+
if (defType === 'default') {
|
|
42
|
+
defaultValue = current._def?.defaultValue
|
|
43
|
+
if (typeof defaultValue === 'function') defaultValue = defaultValue()
|
|
44
|
+
}
|
|
45
|
+
if (defType === 'boolean') { type = 'boolean'; break }
|
|
46
|
+
if (defType === 'string') { type = 'string'; break }
|
|
47
|
+
if (defType === 'number') { type = 'number'; break }
|
|
48
|
+
if (defType === 'enum') { type = current.options?.join(' | ') || 'enum'; break }
|
|
49
|
+
// Unwrap
|
|
50
|
+
current = current._def?.innerType
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
options.push({ flag: key, description, type, defaultValue })
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return options
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Format CLI-oriented help text for a single command.
|
|
61
|
+
* Exported so other commands (like describe) can reuse it.
|
|
62
|
+
*/
|
|
63
|
+
export function formatCommandHelp(name: string, Cmd: any, colors: any): string {
|
|
64
|
+
const desc = Cmd.commandDescription || ''
|
|
65
|
+
const schema = Cmd.argsSchema
|
|
66
|
+
const lines: string[] = []
|
|
67
|
+
|
|
68
|
+
lines.push('')
|
|
69
|
+
lines.push(` ${colors.cyan.bold(`luca ${name}`)} ${desc ? `${colors.dim('—')} ${desc}` : ''}`)
|
|
70
|
+
lines.push('')
|
|
71
|
+
|
|
72
|
+
const options = extractOptions(schema)
|
|
73
|
+
|
|
74
|
+
if (options.length === 0) {
|
|
75
|
+
lines.push(` ${colors.white('Usage:')} ${colors.cyan(`luca ${name}`)}`)
|
|
76
|
+
} else {
|
|
77
|
+
const booleans = options.filter((o) => o.type === 'boolean')
|
|
78
|
+
const valued = options.filter((o) => o.type !== 'boolean')
|
|
79
|
+
|
|
80
|
+
lines.push(` ${colors.white('Usage:')} ${colors.cyan(`luca ${name}`)} ${colors.dim('[options]')}`)
|
|
81
|
+
lines.push('')
|
|
82
|
+
|
|
83
|
+
if (valued.length > 0) {
|
|
84
|
+
lines.push(` ${colors.white('Options:')}`)
|
|
85
|
+
lines.push('')
|
|
86
|
+
const maxLen = Math.max(...valued.map((o) => `--${o.flag} <${o.type}>`.length))
|
|
87
|
+
for (const opt of valued) {
|
|
88
|
+
const flag = `--${opt.flag} <${opt.type}>`
|
|
89
|
+
let line = ` ${colors.green(flag.padEnd(maxLen + 2))} ${opt.description}`
|
|
90
|
+
if (opt.defaultValue !== undefined && opt.defaultValue !== false) {
|
|
91
|
+
line += ` ${colors.dim(`(default: ${opt.defaultValue})`)}`
|
|
92
|
+
}
|
|
93
|
+
lines.push(line)
|
|
94
|
+
}
|
|
95
|
+
lines.push('')
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (booleans.length > 0) {
|
|
99
|
+
lines.push(` ${colors.white('Flags:')}`)
|
|
100
|
+
lines.push('')
|
|
101
|
+
const maxLen = Math.max(...booleans.map((o) => `--${o.flag}`.length))
|
|
102
|
+
for (const opt of booleans) {
|
|
103
|
+
const flag = `--${opt.flag}`
|
|
104
|
+
let line = ` ${colors.green(flag.padEnd(maxLen + 2))} ${opt.description}`
|
|
105
|
+
if (opt.defaultValue === true) {
|
|
106
|
+
line += ` ${colors.dim('(default: true)')}`
|
|
107
|
+
}
|
|
108
|
+
lines.push(line)
|
|
109
|
+
}
|
|
110
|
+
lines.push('')
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return lines.join('\n')
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Strip ANSI escape codes for visible width calculation. */
|
|
118
|
+
function stripAnsi(s: string): string {
|
|
119
|
+
return s.replace(/\x1B\[[0-9;]*m/g, '')
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Merge two multi-line blocks side by side with a gap. */
|
|
123
|
+
function sideBySide(left: string[], right: string[], gap = 3): string[] {
|
|
124
|
+
const maxLeftWidth = Math.max(...left.map((l) => stripAnsi(l).length))
|
|
125
|
+
const maxLines = Math.max(left.length, right.length)
|
|
126
|
+
const result: string[] = []
|
|
127
|
+
|
|
128
|
+
for (let i = 0; i < maxLines; i++) {
|
|
129
|
+
const l = left[i] || ''
|
|
130
|
+
const r = right[i] || ''
|
|
131
|
+
const visLen = stripAnsi(l).length
|
|
132
|
+
const pad = Math.max(0, maxLeftWidth - visLen) + gap
|
|
133
|
+
result.push(l + ' '.repeat(pad) + r)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return result
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const LEGO_ROBOT = [
|
|
140
|
+
' ┌─○○─┐ ',
|
|
141
|
+
' │ ●● │ ',
|
|
142
|
+
' ├○──○┤ ',
|
|
143
|
+
' └─╨╨─┘ ',
|
|
144
|
+
]
|
|
145
|
+
|
|
146
|
+
const BANNER_COLORS: string[] = ['cyan', 'blue', 'magenta']
|
|
147
|
+
|
|
148
|
+
export default async function help(_options: z.infer<typeof argsSchema>, context: ContainerContext) {
|
|
149
|
+
const container = context.container as any
|
|
150
|
+
const ui = container.feature('ui') as any
|
|
151
|
+
const c = ui.colors
|
|
152
|
+
|
|
153
|
+
const args = container.argv._ as string[]
|
|
154
|
+
const target = args[1] as string
|
|
155
|
+
|
|
156
|
+
if (!target) {
|
|
157
|
+
// Robot (left) + banner (right), same height — direct 1:1 alignment
|
|
158
|
+
const banner = ui.banner('luca', { font: 'Small Slant', colors: BANNER_COLORS })
|
|
159
|
+
const bannerLines = banner.split('\n').filter((l: string) => l.trim())
|
|
160
|
+
const coloredRobot = ui.applyGradient(LEGO_ROBOT.join('\n'), BANNER_COLORS)
|
|
161
|
+
const robotLines = coloredRobot.split('\n') as string[]
|
|
162
|
+
const robotWidth = Math.max(...LEGO_ROBOT.map((l: string) => l.length))
|
|
163
|
+
|
|
164
|
+
const headerLines: string[] = []
|
|
165
|
+
const maxLines = Math.max(robotLines.length, bannerLines.length)
|
|
166
|
+
for (let i = 0; i < maxLines; i++) {
|
|
167
|
+
const rLine = robotLines[i] || ''
|
|
168
|
+
const rPad = robotWidth - stripAnsi(rLine).length
|
|
169
|
+
const bLine = bannerLines[i] || ''
|
|
170
|
+
headerLines.push(rLine + ' '.repeat(rPad + 2) + bLine)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
console.log('\n')
|
|
174
|
+
console.log(headerLines.join('\n'))
|
|
175
|
+
console.log(c.dim(' Lightweight Universal Conversational Architecture'))
|
|
176
|
+
console.log()
|
|
177
|
+
console.log(c.white(' Usage: ') + c.cyan('luca') + c.dim(' <command|file> [options]'))
|
|
178
|
+
console.log()
|
|
179
|
+
const allNames = (container.commands.available as string[]).filter((n: string) => n !== 'help')
|
|
180
|
+
const maxNameLen = Math.max(...allNames.map((n: string) => n.length)) + 2
|
|
181
|
+
|
|
182
|
+
const sources = (container as any)._commandSources as
|
|
183
|
+
| { builtinCommands: Set<string>; projectCommands: Set<string>; userCommands: Set<string> }
|
|
184
|
+
| undefined
|
|
185
|
+
|
|
186
|
+
const printCommands = (names: string[]) => {
|
|
187
|
+
for (const name of names) {
|
|
188
|
+
const Cmd = container.commands.lookup(name) as any
|
|
189
|
+
const desc = Cmd.commandDescription || ''
|
|
190
|
+
console.log(` ${c.cyan(name.padEnd(maxNameLen))} ${c.dim(desc)}`)
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Built-in commands
|
|
195
|
+
const builtinNames = sources
|
|
196
|
+
? allNames.filter((n) => sources.builtinCommands.has(n))
|
|
197
|
+
: allNames
|
|
198
|
+
console.log(c.white(' Commands:'))
|
|
199
|
+
console.log()
|
|
200
|
+
printCommands(builtinNames)
|
|
201
|
+
|
|
202
|
+
// Project-local commands
|
|
203
|
+
if (sources && sources.projectCommands.size > 0) {
|
|
204
|
+
console.log()
|
|
205
|
+
console.log(c.white(' Project Commands') + c.dim(' (./commands/*)'))
|
|
206
|
+
console.log()
|
|
207
|
+
printCommands(allNames.filter((n) => sources.projectCommands.has(n)))
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// User-level commands
|
|
211
|
+
if (sources && sources.userCommands.size > 0) {
|
|
212
|
+
console.log()
|
|
213
|
+
console.log(c.white(' User Commands') + c.dim(' (~/.luca/commands/*)'))
|
|
214
|
+
console.log()
|
|
215
|
+
printCommands(allNames.filter((n) => sources.userCommands.has(n)))
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
console.log()
|
|
219
|
+
console.log(c.dim(' Run ') + c.cyan('luca <file>') + c.dim(' to execute a script or markdown (.ts, .js, .md)'))
|
|
220
|
+
console.log(c.dim(' Run ') + c.cyan('luca help <command>') + c.dim(' for detailed usage of a command'))
|
|
221
|
+
console.log()
|
|
222
|
+
return
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (!container.commands.has(target)) {
|
|
226
|
+
console.error(` Unknown command: ${c.red(target)}`)
|
|
227
|
+
console.error()
|
|
228
|
+
console.error(` Run ${c.cyan('luca help')} to see available commands.`)
|
|
229
|
+
return
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const Cmd = container.commands.lookup(target) as any
|
|
233
|
+
console.log(formatCommandHelp(target, Cmd, c))
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
commands.registerHandler('help', {
|
|
237
|
+
description: 'Show help for luca commands',
|
|
238
|
+
argsSchema,
|
|
239
|
+
handler: help,
|
|
240
|
+
})
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { Command, commands, CommandsRegistry, type AvailableCommands, type CommandsInterface, type CommandHandler, type CommandState, type CommandOptions } from '../command.js'
|
|
2
|
+
|
|
3
|
+
// Side-effect imports register each command
|
|
4
|
+
import './run.js'
|
|
5
|
+
import './console.js'
|
|
6
|
+
import './serve.js'
|
|
7
|
+
import './chat.js'
|
|
8
|
+
import './prompt.js'
|
|
9
|
+
import './mcp.js'
|
|
10
|
+
import './sandbox-mcp.js'
|
|
11
|
+
import './describe.js'
|
|
12
|
+
import './eval.js'
|
|
13
|
+
import './help.js'
|
|
14
|
+
import './scaffold.js'
|
|
15
|
+
import './introspect.js'
|
|
16
|
+
import './save-api-docs.js'
|
|
17
|
+
import './bootstrap.js'
|
|
18
|
+
import './select.js'
|
|
19
|
+
import './code.js'
|