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,317 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from 'luca/schemas/base.js'
|
|
3
|
+
import { Client } from "luca/client";
|
|
4
|
+
import { RestClient } from "../rest";
|
|
5
|
+
import type { ContainerContext } from "luca/container";
|
|
6
|
+
import type { NodeContainer } from "../../node/container.js";
|
|
7
|
+
import type { AxiosRequestConfig } from 'axios'
|
|
8
|
+
|
|
9
|
+
declare module "luca/client" {
|
|
10
|
+
interface AvailableClients {
|
|
11
|
+
elevenlabs: typeof ElevenLabsClient;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const ElevenLabsClientOptionsSchema = ClientOptionsSchema.extend({
|
|
16
|
+
apiKey: z.string().optional().describe('ElevenLabs API key (falls back to ELEVENLABS_API_KEY env var)'),
|
|
17
|
+
defaultVoiceId: z.string().optional().describe('Default voice ID for speech synthesis'),
|
|
18
|
+
defaultModelId: z.string().optional().default('eleven_multilingual_v2').describe('Default TTS model ID'),
|
|
19
|
+
outputFormat: z.string().optional().default('mp3_44100_128').describe('Audio output format (e.g. mp3_44100_128, pcm_16000)'),
|
|
20
|
+
})
|
|
21
|
+
export type ElevenLabsClientOptions = z.infer<typeof ElevenLabsClientOptionsSchema>
|
|
22
|
+
|
|
23
|
+
export const ElevenLabsClientStateSchema = ClientStateSchema.extend({
|
|
24
|
+
requestCount: z.number().default(0).describe('Total number of API requests made'),
|
|
25
|
+
characterCount: z.number().default(0).describe('Total characters sent for synthesis (tracks billing usage)'),
|
|
26
|
+
lastRequestTime: z.number().nullable().default(null).describe('Timestamp of the last API request'),
|
|
27
|
+
})
|
|
28
|
+
export type ElevenLabsClientState = z.infer<typeof ElevenLabsClientStateSchema>
|
|
29
|
+
|
|
30
|
+
export const ElevenLabsClientEventsSchema = ClientEventsSchema.extend({
|
|
31
|
+
speech: z.tuple([z.object({
|
|
32
|
+
voiceId: z.string(),
|
|
33
|
+
text: z.string(),
|
|
34
|
+
audioSize: z.number(),
|
|
35
|
+
})]).describe('Emitted after speech synthesis completes'),
|
|
36
|
+
voices: z.tuple([z.array(z.any())]).describe('Emitted after listing voices'),
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
export type ElevenLabsVoiceSettings = {
|
|
40
|
+
stability?: number
|
|
41
|
+
similarityBoost?: number
|
|
42
|
+
style?: number
|
|
43
|
+
speed?: number
|
|
44
|
+
useSpeakerBoost?: boolean
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export type SynthesizeOptions = {
|
|
48
|
+
voiceId?: string
|
|
49
|
+
modelId?: string
|
|
50
|
+
outputFormat?: string
|
|
51
|
+
voiceSettings?: ElevenLabsVoiceSettings
|
|
52
|
+
disableCache?: boolean
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* ElevenLabs client — text-to-speech synthesis via the ElevenLabs REST API.
|
|
57
|
+
*
|
|
58
|
+
* Provides methods for listing voices, listing models, and generating speech audio.
|
|
59
|
+
* Audio is returned as a Buffer; use `say()` for a convenience method that writes to disk.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const el = container.client('elevenlabs')
|
|
64
|
+
* await el.connect()
|
|
65
|
+
* const voices = await el.listVoices()
|
|
66
|
+
* const audio = await el.synthesize('Hello world')
|
|
67
|
+
* // audio is a Buffer of mp3 data
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export class ElevenLabsClient extends RestClient<ElevenLabsClientState, ElevenLabsClientOptions> {
|
|
71
|
+
static override shortcut = "clients.elevenlabs" as const
|
|
72
|
+
static override envVars = ['ELEVENLABS_API_KEY']
|
|
73
|
+
static override stateSchema = ElevenLabsClientStateSchema
|
|
74
|
+
static override optionsSchema = ElevenLabsClientOptionsSchema
|
|
75
|
+
static override eventsSchema = ElevenLabsClientEventsSchema
|
|
76
|
+
|
|
77
|
+
static { Client.register(this, 'elevenlabs') }
|
|
78
|
+
|
|
79
|
+
override get initialState(): ElevenLabsClientState {
|
|
80
|
+
return {
|
|
81
|
+
...super.initialState,
|
|
82
|
+
requestCount: 0,
|
|
83
|
+
characterCount: 0,
|
|
84
|
+
lastRequestTime: null,
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
constructor(options: ElevenLabsClientOptions, context: ContainerContext) {
|
|
89
|
+
options = {
|
|
90
|
+
...options,
|
|
91
|
+
baseURL: 'https://api.elevenlabs.io',
|
|
92
|
+
}
|
|
93
|
+
super(options, context)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
override get container(): NodeContainer {
|
|
97
|
+
return super.container as unknown as NodeContainer
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** The resolved API key from options or environment. */
|
|
101
|
+
get apiKey(): string {
|
|
102
|
+
return this.options.apiKey || process.env.ELEVENLABS_API_KEY || ''
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Inject the xi-api-key header before each request.
|
|
107
|
+
*/
|
|
108
|
+
override async beforeRequest() {
|
|
109
|
+
this.axios.defaults.headers.common['xi-api-key'] = this.apiKey
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
private trackRequest(characters = 0) {
|
|
113
|
+
const requestCount = this.state.get('requestCount') || 0
|
|
114
|
+
const characterCount = this.state.get('characterCount') || 0
|
|
115
|
+
this.setState({
|
|
116
|
+
requestCount: requestCount + 1,
|
|
117
|
+
characterCount: characterCount + characters,
|
|
118
|
+
lastRequestTime: Date.now(),
|
|
119
|
+
})
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Validate the API key by listing available models.
|
|
124
|
+
*
|
|
125
|
+
* @returns This client instance
|
|
126
|
+
* @throws If the API key is invalid or the connection fails
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* await el.connect()
|
|
131
|
+
* ```
|
|
132
|
+
*/
|
|
133
|
+
override async connect(): Promise<this> {
|
|
134
|
+
try {
|
|
135
|
+
await this.get('/v1/models')
|
|
136
|
+
await super.connect()
|
|
137
|
+
this.emit('connected' as any)
|
|
138
|
+
return this
|
|
139
|
+
} catch (error) {
|
|
140
|
+
this.emit('failure', error)
|
|
141
|
+
throw error
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* List available voices with optional search and filtering.
|
|
147
|
+
*
|
|
148
|
+
* @param options - Query parameters for filtering voices
|
|
149
|
+
* @returns Array of voice objects
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```typescript
|
|
153
|
+
* const voices = await el.listVoices()
|
|
154
|
+
* const premade = await el.listVoices({ category: 'premade' })
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
async listVoices(options: {
|
|
158
|
+
search?: string
|
|
159
|
+
category?: string
|
|
160
|
+
voice_type?: string
|
|
161
|
+
page_size?: number
|
|
162
|
+
next_page_token?: string
|
|
163
|
+
} = {}): Promise<any> {
|
|
164
|
+
this.trackRequest()
|
|
165
|
+
const result = await this.get('/v2/voices', options)
|
|
166
|
+
if (result?.voices) {
|
|
167
|
+
this.emit('voices', result.voices)
|
|
168
|
+
}
|
|
169
|
+
return result
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Get details for a single voice.
|
|
174
|
+
*
|
|
175
|
+
* @param voiceId - The voice ID to look up
|
|
176
|
+
* @returns Voice object with settings, labels, and metadata
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```typescript
|
|
180
|
+
* const voice = await el.getVoice('21m00Tcm4TlvDq8ikWAM')
|
|
181
|
+
* console.log(voice.name, voice.settings)
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
async getVoice(voiceId: string): Promise<any> {
|
|
185
|
+
this.trackRequest()
|
|
186
|
+
return this.get(`/v1/voices/${voiceId}`)
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* List available TTS models.
|
|
191
|
+
*
|
|
192
|
+
* @returns Array of model objects with IDs and capabilities
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* ```typescript
|
|
196
|
+
* const models = await el.listModels()
|
|
197
|
+
* console.log(models.map(m => m.model_id))
|
|
198
|
+
* ```
|
|
199
|
+
*/
|
|
200
|
+
async listModels(): Promise<any[]> {
|
|
201
|
+
this.trackRequest()
|
|
202
|
+
return this.get('/v1/models')
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Synthesize speech from text, returning audio as a Buffer.
|
|
207
|
+
*
|
|
208
|
+
* @param text - The text to convert to speech
|
|
209
|
+
* @param options - Voice, model, format, and voice settings overrides
|
|
210
|
+
* @returns Audio data as a Buffer
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* ```typescript
|
|
214
|
+
* const audio = await el.synthesize('Hello world')
|
|
215
|
+
* // audio is a Buffer of mp3 data
|
|
216
|
+
*
|
|
217
|
+
* const custom = await el.synthesize('Hello', {
|
|
218
|
+
* voiceId: '21m00Tcm4TlvDq8ikWAM',
|
|
219
|
+
* voiceSettings: { stability: 0.5, similarityBoost: 0.8 }
|
|
220
|
+
* })
|
|
221
|
+
* ```
|
|
222
|
+
*/
|
|
223
|
+
async synthesize(text: string, options: SynthesizeOptions = {}): Promise<Buffer> {
|
|
224
|
+
const voiceId = options.voiceId || this.options.defaultVoiceId || 'JBFqnCBsd6RMkjVDRZzb'
|
|
225
|
+
const modelId = options.modelId || this.options.defaultModelId || 'eleven_multilingual_v2'
|
|
226
|
+
const outputFormat = options.outputFormat || this.options.outputFormat || 'mp3_44100_128'
|
|
227
|
+
|
|
228
|
+
const body: Record<string, any> = {
|
|
229
|
+
text,
|
|
230
|
+
model_id: modelId,
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (options.voiceSettings) {
|
|
234
|
+
body.voice_settings = {
|
|
235
|
+
stability: options.voiceSettings.stability,
|
|
236
|
+
similarity_boost: options.voiceSettings.similarityBoost,
|
|
237
|
+
style: options.voiceSettings.style,
|
|
238
|
+
speed: options.voiceSettings.speed,
|
|
239
|
+
use_speaker_boost: options.voiceSettings.useSpeakerBoost,
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Check disk cache for previously synthesized audio
|
|
244
|
+
if (!options.disableCache) {
|
|
245
|
+
const { hashObject } = this.container.utils
|
|
246
|
+
const cacheKey = `elevenlabs:${hashObject({ text, voiceId, modelId, outputFormat, voiceSettings: options.voiceSettings })}`
|
|
247
|
+
const diskCache = this.container.feature('diskCache')
|
|
248
|
+
|
|
249
|
+
if (await diskCache.has(cacheKey)) {
|
|
250
|
+
console.log(`Cache Hit: ${cacheKey}`)
|
|
251
|
+
const cached = await diskCache.get(cacheKey)
|
|
252
|
+
const audioBuffer = Buffer.from(cached, 'base64')
|
|
253
|
+
|
|
254
|
+
this.emit('speech', {
|
|
255
|
+
voiceId,
|
|
256
|
+
text,
|
|
257
|
+
audioSize: audioBuffer.length,
|
|
258
|
+
})
|
|
259
|
+
|
|
260
|
+
return audioBuffer
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const audioBuffer = await this.fetchSpeech(voiceId, outputFormat, body, text.length)
|
|
264
|
+
await diskCache.set(cacheKey, audioBuffer.toString('base64'))
|
|
265
|
+
|
|
266
|
+
this.emit('speech', { voiceId, text, audioSize: audioBuffer.length })
|
|
267
|
+
return audioBuffer
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
const audioBuffer = await this.fetchSpeech(voiceId, outputFormat, body, text.length)
|
|
271
|
+
this.emit('speech', { voiceId, text, audioSize: audioBuffer.length })
|
|
272
|
+
return audioBuffer
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
private async fetchSpeech(voiceId: string, outputFormat: string, body: Record<string, any>, charCount: number): Promise<Buffer> {
|
|
276
|
+
this.trackRequest(charCount)
|
|
277
|
+
await this.beforeRequest()
|
|
278
|
+
|
|
279
|
+
const response = await this.axios({
|
|
280
|
+
method: 'POST',
|
|
281
|
+
url: `/v1/text-to-speech/${voiceId}`,
|
|
282
|
+
params: { output_format: outputFormat },
|
|
283
|
+
data: body,
|
|
284
|
+
responseType: 'arraybuffer',
|
|
285
|
+
headers: {
|
|
286
|
+
'Content-Type': 'application/json',
|
|
287
|
+
Accept: 'audio/mpeg',
|
|
288
|
+
},
|
|
289
|
+
})
|
|
290
|
+
|
|
291
|
+
return Buffer.from(response.data)
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Synthesize speech and write the audio to a file.
|
|
296
|
+
*
|
|
297
|
+
* @param text - The text to convert to speech
|
|
298
|
+
* @param outputPath - File path to write the audio to
|
|
299
|
+
* @param options - Voice, model, format, and voice settings overrides
|
|
300
|
+
* @returns The resolved output path
|
|
301
|
+
*
|
|
302
|
+
* @example
|
|
303
|
+
* ```typescript
|
|
304
|
+
* const path = await el.say('Hello world', './hello.mp3')
|
|
305
|
+
* console.log(`Audio saved to ${path}`)
|
|
306
|
+
* ```
|
|
307
|
+
*/
|
|
308
|
+
async say(text: string, outputPath: string, options: SynthesizeOptions = {}): Promise<string> {
|
|
309
|
+
const audio = await this.synthesize(text, options)
|
|
310
|
+
const resolvedPath = this.container.paths.resolve(outputPath)
|
|
311
|
+
await this.container.fs.writeFileAsync(resolvedPath, audio)
|
|
312
|
+
return resolvedPath
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
export default ElevenLabsClient
|
|
317
|
+
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { Client } from '../client.js'
|
|
3
|
+
import { RestClient } from './rest.js'
|
|
4
|
+
import type { ClientState } from '../client.js'
|
|
5
|
+
import {
|
|
6
|
+
GraphClientOptionsSchema, GraphClientEventsSchema,
|
|
7
|
+
} from '../schemas/base.js'
|
|
8
|
+
|
|
9
|
+
export type GraphClientOptions = z.infer<typeof GraphClientOptionsSchema>
|
|
10
|
+
|
|
11
|
+
declare module '../client' {
|
|
12
|
+
interface AvailableClients {
|
|
13
|
+
graph: typeof GraphClient
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* GraphQL client that wraps RestClient with convenience methods for executing
|
|
19
|
+
* queries and mutations. Automatically handles the GraphQL request envelope
|
|
20
|
+
* (query/variables/operationName) and unwraps responses, extracting the `data`
|
|
21
|
+
* field and emitting events for GraphQL-level errors.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const gql = container.client('graph', { baseURL: 'https://api.example.com' })
|
|
26
|
+
* const data = await gql.query(`{ users { id name } }`)
|
|
27
|
+
* await gql.mutate(`mutation($name: String!) { createUser(name: $name) { id } }`, { name: 'Alice' })
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export class GraphClient<
|
|
31
|
+
T extends ClientState = ClientState,
|
|
32
|
+
K extends GraphClientOptions = GraphClientOptions
|
|
33
|
+
> extends RestClient<T, K> {
|
|
34
|
+
static override shortcut = "clients.graph" as const
|
|
35
|
+
static override optionsSchema = GraphClientOptionsSchema
|
|
36
|
+
static override eventsSchema = GraphClientEventsSchema
|
|
37
|
+
static { Client.register(this, 'graph') }
|
|
38
|
+
|
|
39
|
+
/** The GraphQL endpoint path. Defaults to '/graphql'. */
|
|
40
|
+
get endpoint() {
|
|
41
|
+
return (this.options as GraphClientOptions).endpoint || '/graphql'
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Execute a GraphQL query and return the unwrapped data.
|
|
46
|
+
* @param query - The GraphQL query string
|
|
47
|
+
* @param variables - Optional variables for the query
|
|
48
|
+
* @param operationName - Optional operation name when the query contains multiple operations
|
|
49
|
+
*/
|
|
50
|
+
async query<R = any>(query: string, variables?: Record<string, any>, operationName?: string): Promise<R> {
|
|
51
|
+
return this.execute<R>(query, variables, operationName)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Execute a GraphQL mutation and return the unwrapped data.
|
|
56
|
+
* Semantically identical to query() but named for clarity when performing mutations.
|
|
57
|
+
* @param mutation - The GraphQL mutation string
|
|
58
|
+
* @param variables - Optional variables for the mutation
|
|
59
|
+
* @param operationName - Optional operation name when the mutation contains multiple operations
|
|
60
|
+
*/
|
|
61
|
+
async mutate<R = any>(mutation: string, variables?: Record<string, any>, operationName?: string): Promise<R> {
|
|
62
|
+
return this.execute<R>(mutation, variables, operationName)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Execute a GraphQL operation, unwrap the response, and handle errors.
|
|
67
|
+
* Posts to the configured endpoint with the standard GraphQL envelope.
|
|
68
|
+
* If the response contains GraphQL-level errors, emits both 'graphqlError'
|
|
69
|
+
* and 'failure' events before returning the data.
|
|
70
|
+
*/
|
|
71
|
+
private async execute<R = any>(query: string, variables?: Record<string, any>, operationName?: string): Promise<R> {
|
|
72
|
+
const body: Record<string, any> = { query }
|
|
73
|
+
if (variables) body.variables = variables
|
|
74
|
+
if (operationName) body.operationName = operationName
|
|
75
|
+
|
|
76
|
+
const response = await this.post(this.endpoint, body)
|
|
77
|
+
|
|
78
|
+
if (response?.errors?.length) {
|
|
79
|
+
this.emit('graphqlError', response.errors)
|
|
80
|
+
this.emit('failure', response.errors)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return response?.data as R
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export default GraphClient
|