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,382 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from '../../schemas/base.js'
|
|
3
|
+
import { Feature } from '../feature.js'
|
|
4
|
+
|
|
5
|
+
// --- Message Types ---
|
|
6
|
+
|
|
7
|
+
export const MessageTypes = {
|
|
8
|
+
register: 'register',
|
|
9
|
+
registered: 'registered',
|
|
10
|
+
eval: 'eval',
|
|
11
|
+
evalResult: 'evalResult',
|
|
12
|
+
event: 'event',
|
|
13
|
+
ping: 'ping',
|
|
14
|
+
pong: 'pong',
|
|
15
|
+
disconnect: 'disconnect',
|
|
16
|
+
error: 'error',
|
|
17
|
+
} as const
|
|
18
|
+
|
|
19
|
+
export type MessageType = typeof MessageTypes[keyof typeof MessageTypes]
|
|
20
|
+
|
|
21
|
+
// --- Link Message Envelope ---
|
|
22
|
+
|
|
23
|
+
export interface LinkMessage<T = any> {
|
|
24
|
+
type: MessageType
|
|
25
|
+
id: string
|
|
26
|
+
timestamp: number
|
|
27
|
+
token?: string
|
|
28
|
+
data?: T
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// --- Registration Data ---
|
|
32
|
+
|
|
33
|
+
export interface RegisterData {
|
|
34
|
+
uuid: string
|
|
35
|
+
url?: string
|
|
36
|
+
capabilities?: string[]
|
|
37
|
+
meta?: Record<string, any>
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface RegisteredData {
|
|
41
|
+
token: string
|
|
42
|
+
hostId: string
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// --- Eval Data ---
|
|
46
|
+
|
|
47
|
+
export interface EvalData {
|
|
48
|
+
code: string
|
|
49
|
+
context?: Record<string, any>
|
|
50
|
+
requestId: string
|
|
51
|
+
timeout?: number
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface EvalResultData {
|
|
55
|
+
requestId: string
|
|
56
|
+
result?: any
|
|
57
|
+
error?: string
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// --- Event Data ---
|
|
61
|
+
|
|
62
|
+
export interface EventData {
|
|
63
|
+
eventName: string
|
|
64
|
+
data?: any
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// --- Schemas ---
|
|
68
|
+
|
|
69
|
+
export const ContainerLinkStateSchema = FeatureStateSchema.extend({
|
|
70
|
+
connected: z.boolean().default(false).describe('Whether connected to the host'),
|
|
71
|
+
token: z.string().optional().describe('Auth token received from host during registration'),
|
|
72
|
+
hostId: z.string().optional().describe('UUID of the connected host container'),
|
|
73
|
+
reconnectAttempts: z.number().default(0).describe('Number of reconnection attempts made'),
|
|
74
|
+
})
|
|
75
|
+
export type ContainerLinkState = z.infer<typeof ContainerLinkStateSchema>
|
|
76
|
+
|
|
77
|
+
export const ContainerLinkOptionsSchema = FeatureOptionsSchema.extend({
|
|
78
|
+
hostUrl: z.string().optional().describe('WebSocket URL of the host container (e.g. ws://localhost:8089)'),
|
|
79
|
+
meta: z.record(z.string(), z.any()).optional().describe('Metadata to send during registration'),
|
|
80
|
+
capabilities: z.array(z.string()).optional().describe('Capability tags to advertise to the host'),
|
|
81
|
+
reconnect: z.boolean().default(true).describe('Whether to automatically reconnect on disconnection'),
|
|
82
|
+
reconnectInterval: z.number().default(1000).describe('Base interval in ms between reconnection attempts'),
|
|
83
|
+
maxReconnectAttempts: z.number().default(10).describe('Maximum number of reconnection attempts'),
|
|
84
|
+
})
|
|
85
|
+
export type ContainerLinkOptions = z.infer<typeof ContainerLinkOptionsSchema>
|
|
86
|
+
|
|
87
|
+
export const ContainerLinkEventsSchema = FeatureEventsSchema.extend({
|
|
88
|
+
connected: z.tuple([z.string().describe('Host container UUID')]).describe('Emitted when successfully registered with the host'),
|
|
89
|
+
disconnected: z.tuple([z.string().optional().describe('Reason')]).describe('Emitted when disconnected from the host'),
|
|
90
|
+
evalRequest: z.tuple([z.string().describe('Code to evaluate'), z.string().describe('Request ID')]).describe('Emitted before executing an eval request from the host'),
|
|
91
|
+
reconnecting: z.tuple([z.number().describe('Attempt number')]).describe('Emitted when attempting to reconnect'),
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
// --- Feature ---
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* ContainerLink (Web-side) — WebSocket client that connects to a node host.
|
|
98
|
+
*
|
|
99
|
+
* Connects to a ContainerLink host over WebSocket. The host can evaluate code
|
|
100
|
+
* in this container, and the web side can emit structured events to the host.
|
|
101
|
+
* The web side can NEVER eval code in the host — trust is strictly one-way.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```typescript
|
|
105
|
+
* const link = container.feature('containerLink', {
|
|
106
|
+
* enable: true,
|
|
107
|
+
* hostUrl: 'ws://localhost:8089',
|
|
108
|
+
* })
|
|
109
|
+
* await link.connect()
|
|
110
|
+
*
|
|
111
|
+
* // Send events to the host
|
|
112
|
+
* link.emitToHost('click', { x: 100, y: 200 })
|
|
113
|
+
*
|
|
114
|
+
* // Listen for eval requests before they execute
|
|
115
|
+
* link.on('evalRequest', (code, requestId) => {
|
|
116
|
+
* console.log('Host is evaluating:', code)
|
|
117
|
+
* })
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
export class ContainerLink extends Feature<ContainerLinkState, ContainerLinkOptions> {
|
|
121
|
+
static override shortcut = 'features.containerLink' as const
|
|
122
|
+
static override stateSchema = ContainerLinkStateSchema
|
|
123
|
+
static override optionsSchema = ContainerLinkOptionsSchema
|
|
124
|
+
static override eventsSchema = ContainerLinkEventsSchema
|
|
125
|
+
|
|
126
|
+
static { Feature.register(this as any, 'containerLink') }
|
|
127
|
+
|
|
128
|
+
private _ws?: WebSocket
|
|
129
|
+
private _reconnectTimer?: ReturnType<typeof setTimeout>
|
|
130
|
+
|
|
131
|
+
override get initialState(): ContainerLinkState {
|
|
132
|
+
return {
|
|
133
|
+
...super.initialState,
|
|
134
|
+
connected: false,
|
|
135
|
+
reconnectAttempts: 0,
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Whether currently connected to the host. */
|
|
140
|
+
get isConnected(): boolean {
|
|
141
|
+
return this.state.get('connected') || false
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** The auth token received from the host. */
|
|
145
|
+
get token(): string | undefined {
|
|
146
|
+
return this.state.get('token')
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** The host container's UUID. */
|
|
150
|
+
get hostId(): string | undefined {
|
|
151
|
+
return this.state.get('hostId')
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Connect to the host WebSocket server and perform registration.
|
|
156
|
+
*
|
|
157
|
+
* @param hostUrl - Override the configured host URL
|
|
158
|
+
* @returns Promise that resolves when registered
|
|
159
|
+
*/
|
|
160
|
+
async connect(hostUrl?: string): Promise<this> {
|
|
161
|
+
const url = hostUrl || this.options.hostUrl
|
|
162
|
+
if (!url) {
|
|
163
|
+
throw new Error('No hostUrl provided for containerLink connection')
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (this._ws) {
|
|
167
|
+
this._ws.close()
|
|
168
|
+
this._ws = undefined
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return new Promise((resolve, reject) => {
|
|
172
|
+
const ws = new WebSocket(url)
|
|
173
|
+
this._ws = ws
|
|
174
|
+
|
|
175
|
+
let registered = false
|
|
176
|
+
|
|
177
|
+
ws.onopen = () => {
|
|
178
|
+
// Send registration
|
|
179
|
+
const msg = this.createMessage(MessageTypes.register, {
|
|
180
|
+
uuid: this.container.uuid,
|
|
181
|
+
url: typeof window !== 'undefined' ? window.location?.href : undefined,
|
|
182
|
+
capabilities: this.options.capabilities,
|
|
183
|
+
meta: this.options.meta,
|
|
184
|
+
})
|
|
185
|
+
ws.send(JSON.stringify(msg))
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
ws.onmessage = (event: MessageEvent) => {
|
|
189
|
+
let msg: LinkMessage
|
|
190
|
+
try {
|
|
191
|
+
msg = JSON.parse(event.data)
|
|
192
|
+
} catch {
|
|
193
|
+
return
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if (!registered && msg.type === MessageTypes.registered) {
|
|
197
|
+
registered = true
|
|
198
|
+
const data = msg.data as RegisteredData
|
|
199
|
+
this.setState({
|
|
200
|
+
connected: true,
|
|
201
|
+
token: data.token,
|
|
202
|
+
hostId: data.hostId,
|
|
203
|
+
reconnectAttempts: 0,
|
|
204
|
+
})
|
|
205
|
+
this.emit('connected', data.hostId)
|
|
206
|
+
resolve(this)
|
|
207
|
+
return
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (!registered && msg.type === MessageTypes.error) {
|
|
211
|
+
reject(new Error(msg.data?.message || 'Registration failed'))
|
|
212
|
+
return
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
this.handleMessage(msg)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
ws.onclose = () => {
|
|
219
|
+
const wasConnected = this.isConnected
|
|
220
|
+
this.setState({ connected: false })
|
|
221
|
+
|
|
222
|
+
if (wasConnected) {
|
|
223
|
+
this.emit('disconnected', 'closed')
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (!registered) {
|
|
227
|
+
reject(new Error('WebSocket closed before registration'))
|
|
228
|
+
return
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
this.maybeReconnect(url)
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
ws.onerror = () => {
|
|
235
|
+
if (!registered) {
|
|
236
|
+
reject(new Error('WebSocket connection error'))
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
})
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Disconnect from the host.
|
|
244
|
+
*
|
|
245
|
+
* @param reason - Optional reason string
|
|
246
|
+
*/
|
|
247
|
+
disconnect(reason?: string): void {
|
|
248
|
+
// Prevent reconnection
|
|
249
|
+
this.clearReconnectTimer()
|
|
250
|
+
|
|
251
|
+
if (this._ws) {
|
|
252
|
+
try {
|
|
253
|
+
const msg = this.createMessage(MessageTypes.disconnect, { reason: reason || 'client disconnect' }, this.token)
|
|
254
|
+
this._ws.send(JSON.stringify(msg))
|
|
255
|
+
} catch { /* ignore */ }
|
|
256
|
+
|
|
257
|
+
this._ws.close()
|
|
258
|
+
this._ws = undefined
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
this.setState({ connected: false, token: undefined, hostId: undefined })
|
|
262
|
+
this.emit('disconnected', reason)
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Send a structured event to the host container.
|
|
267
|
+
*
|
|
268
|
+
* @param eventName - Name of the event
|
|
269
|
+
* @param data - Optional event data
|
|
270
|
+
*/
|
|
271
|
+
emitToHost(eventName: string, data?: any): void {
|
|
272
|
+
if (!this._ws || !this.isConnected) {
|
|
273
|
+
throw new Error('Not connected to host')
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const msg = this.createMessage<EventData>(MessageTypes.event, {
|
|
277
|
+
eventName,
|
|
278
|
+
data,
|
|
279
|
+
}, this.token)
|
|
280
|
+
|
|
281
|
+
this._ws.send(JSON.stringify(msg))
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// --- Internal ---
|
|
285
|
+
|
|
286
|
+
private handleMessage(msg: LinkMessage): void {
|
|
287
|
+
switch (msg.type) {
|
|
288
|
+
case MessageTypes.eval:
|
|
289
|
+
this.handleEval(msg as LinkMessage<EvalData>)
|
|
290
|
+
break
|
|
291
|
+
|
|
292
|
+
case MessageTypes.ping:
|
|
293
|
+
this.respondToPing()
|
|
294
|
+
break
|
|
295
|
+
|
|
296
|
+
case MessageTypes.disconnect:
|
|
297
|
+
this.clearReconnectTimer()
|
|
298
|
+
this._ws?.close()
|
|
299
|
+
this._ws = undefined
|
|
300
|
+
this.setState({ connected: false, token: undefined, hostId: undefined })
|
|
301
|
+
this.emit('disconnected', msg.data?.reason || 'host disconnect')
|
|
302
|
+
break
|
|
303
|
+
|
|
304
|
+
default:
|
|
305
|
+
break
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
private async handleEval(msg: LinkMessage<EvalData>): Promise<void> {
|
|
310
|
+
const data = msg.data
|
|
311
|
+
if (!data?.code || !data?.requestId) return
|
|
312
|
+
|
|
313
|
+
this.emit('evalRequest', data.code, data.requestId)
|
|
314
|
+
|
|
315
|
+
try {
|
|
316
|
+
const vm = this.container.feature('vm') as any
|
|
317
|
+
const result = await vm.run(data.code, data.context || {})
|
|
318
|
+
|
|
319
|
+
const response = this.createMessage(MessageTypes.evalResult, {
|
|
320
|
+
requestId: data.requestId,
|
|
321
|
+
result,
|
|
322
|
+
}, this.token)
|
|
323
|
+
|
|
324
|
+
this._ws?.send(JSON.stringify(response))
|
|
325
|
+
} catch (err: any) {
|
|
326
|
+
const response = this.createMessage(MessageTypes.evalResult, {
|
|
327
|
+
requestId: data.requestId,
|
|
328
|
+
error: err?.message || String(err),
|
|
329
|
+
}, this.token)
|
|
330
|
+
|
|
331
|
+
this._ws?.send(JSON.stringify(response))
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
private respondToPing(): void {
|
|
336
|
+
if (!this._ws || !this.isConnected) return
|
|
337
|
+
const msg = this.createMessage(MessageTypes.pong, undefined, this.token)
|
|
338
|
+
this._ws.send(JSON.stringify(msg))
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
private maybeReconnect(url: string): void {
|
|
342
|
+
if (!this.options.reconnect) return
|
|
343
|
+
|
|
344
|
+
const attempts = this.state.get('reconnectAttempts') || 0
|
|
345
|
+
const max = this.options.maxReconnectAttempts || 10
|
|
346
|
+
|
|
347
|
+
if (attempts >= max) return
|
|
348
|
+
|
|
349
|
+
const baseInterval = this.options.reconnectInterval || 1000
|
|
350
|
+
const delay = baseInterval * Math.pow(1.5, attempts)
|
|
351
|
+
const nextAttempt = attempts + 1
|
|
352
|
+
|
|
353
|
+
this.setState({ reconnectAttempts: nextAttempt })
|
|
354
|
+
this.emit('reconnecting', nextAttempt)
|
|
355
|
+
|
|
356
|
+
this._reconnectTimer = setTimeout(() => {
|
|
357
|
+
this.connect(url).catch(() => {
|
|
358
|
+
// Reconnect failure handled by connect's onclose
|
|
359
|
+
})
|
|
360
|
+
}, delay)
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/** Create a link protocol message with a unique ID. */
|
|
364
|
+
private createMessage<T = any>(type: MessageType, data?: T, token?: string): LinkMessage<T> {
|
|
365
|
+
return {
|
|
366
|
+
type,
|
|
367
|
+
id: this.container.utils.uuid(),
|
|
368
|
+
timestamp: Date.now(),
|
|
369
|
+
...(token != null ? { token } : {}),
|
|
370
|
+
...(data != null ? { data } : {}),
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
private clearReconnectTimer(): void {
|
|
375
|
+
if (this._reconnectTimer) {
|
|
376
|
+
clearTimeout(this._reconnectTimer)
|
|
377
|
+
this._reconnectTimer = undefined
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export default ContainerLink
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { FeatureStateSchema, FeatureOptionsSchema } from '../../schemas/base.js'
|
|
3
|
+
import { Feature, type FeatureState } from "../feature.js";
|
|
4
|
+
import type * as esbuild from 'esbuild-wasm';
|
|
5
|
+
|
|
6
|
+
export const EsbuildWebOptionsSchema = FeatureOptionsSchema.extend({
|
|
7
|
+
transformOptions: z.any().describe('Partial<esbuild.TransformOptions>').optional(),
|
|
8
|
+
tsconfig: z.string().optional().describe('Path to a tsconfig.json file for TypeScript compilation'),
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
export type EsbuildWebOptions = z.infer<typeof EsbuildWebOptionsSchema>
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Browser-side TypeScript/ESM compilation feature using esbuild-wasm.
|
|
15
|
+
*
|
|
16
|
+
* Loads esbuild's WebAssembly build via the AssetLoader, then provides
|
|
17
|
+
* `compile()` and `transform()` methods that work entirely in the browser.
|
|
18
|
+
* Useful for live playgrounds, in-browser REPLs, and client-side bundling.
|
|
19
|
+
*
|
|
20
|
+
* @extends Feature
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const esbuild = container.feature('esbuild')
|
|
25
|
+
* await esbuild.start()
|
|
26
|
+
* const result = await esbuild.compile('const x: number = 1')
|
|
27
|
+
* console.log(result.code)
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export class Esbuild extends Feature<FeatureState, EsbuildWebOptions> {
|
|
31
|
+
static override stateSchema = FeatureStateSchema
|
|
32
|
+
static override optionsSchema = EsbuildWebOptionsSchema
|
|
33
|
+
static override shortcut = "features.esbuild" as const
|
|
34
|
+
|
|
35
|
+
static { Feature.register(this as any, 'esbuild') }
|
|
36
|
+
|
|
37
|
+
/** Returns the assetLoader feature for loading external libraries from unpkg. */
|
|
38
|
+
get assetLoader() {
|
|
39
|
+
return this.container.feature("assetLoader");
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
compiler!: typeof esbuild
|
|
43
|
+
|
|
44
|
+
async compile(code:string, options?: esbuild.TransformOptions) {
|
|
45
|
+
if(!this.compiler) {
|
|
46
|
+
throw new Error('esbuild not started')
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const { hashObject } = this.container.utils
|
|
50
|
+
|
|
51
|
+
const cacheKey = hashObject({ code, options })
|
|
52
|
+
|
|
53
|
+
if (compileCache.has(cacheKey)) {
|
|
54
|
+
return compileCache.get(cacheKey)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const result = await this.compiler.transform(code, {
|
|
58
|
+
loader: 'ts',
|
|
59
|
+
target: 'es2015',
|
|
60
|
+
...this.options.transformOptions,
|
|
61
|
+
...options
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
compileCache.set(cacheKey, result)
|
|
65
|
+
|
|
66
|
+
return result
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
clearCache() {
|
|
70
|
+
compileCache.clear()
|
|
71
|
+
return this
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async start() {
|
|
75
|
+
if((this as any).compiler) {
|
|
76
|
+
return this
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const esbuild = await this.assetLoader.unpkg('esbuild-wasm', 'esbuild');
|
|
80
|
+
await esbuild.initialize({
|
|
81
|
+
wasmURL: 'https://unpkg.com/esbuild-wasm/esbuild.wasm'
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
this.compiler = esbuild
|
|
85
|
+
|
|
86
|
+
return this
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export default Esbuild;
|
|
92
|
+
|
|
93
|
+
const compileCache = new Map()
|