luca 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/release.yaml +169 -0
- package/AGENTS.md +99 -0
- package/CLAUDE.md +115 -0
- package/CNAME +1 -0
- package/README.md +257 -9
- package/RUNME.md +56 -0
- package/assistants/codingAssistant/ABOUT.md +5 -0
- package/assistants/codingAssistant/CORE.md +28 -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 +2769 -0
- package/bunfig.toml +3 -0
- package/commands/audit-docs.ts +740 -0
- package/commands/build-bootstrap.ts +118 -0
- package/commands/build-python-bridge.ts +43 -0
- package/commands/build-scaffolds.ts +176 -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/docs/CLI.md +335 -0
- package/docs/CNAME +1 -0
- package/docs/README.md +60 -0
- package/docs/TABLE-OF-CONTENTS.md +183 -0
- package/docs/apis/clients/elevenlabs.md +308 -0
- package/docs/apis/clients/graph.md +107 -0
- package/docs/apis/clients/openai.md +429 -0
- package/docs/apis/clients/rest.md +161 -0
- package/docs/apis/clients/websocket.md +174 -0
- package/docs/apis/features/agi/assistant.md +625 -0
- package/docs/apis/features/agi/assistants-manager.md +282 -0
- package/docs/apis/features/agi/auto-assistant.md +279 -0
- package/docs/apis/features/agi/browser-use.md +802 -0
- package/docs/apis/features/agi/claude-code.md +884 -0
- package/docs/apis/features/agi/conversation-history.md +364 -0
- package/docs/apis/features/agi/conversation.md +548 -0
- package/docs/apis/features/agi/docs-reader.md +99 -0
- package/docs/apis/features/agi/file-tools.md +163 -0
- package/docs/apis/features/agi/luca-coder.md +407 -0
- package/docs/apis/features/agi/openai-codex.md +396 -0
- package/docs/apis/features/agi/openapi.md +138 -0
- package/docs/apis/features/agi/semantic-search.md +387 -0
- package/docs/apis/features/agi/skills-library.md +239 -0
- package/docs/apis/features/node/container-link.md +192 -0
- package/docs/apis/features/node/content-db.md +450 -0
- package/docs/apis/features/node/disk-cache.md +379 -0
- package/docs/apis/features/node/dns.md +652 -0
- package/docs/apis/features/node/docker.md +706 -0
- package/docs/apis/features/node/downloader.md +81 -0
- package/docs/apis/features/node/esbuild.md +60 -0
- package/docs/apis/features/node/file-manager.md +191 -0
- package/docs/apis/features/node/fs.md +1217 -0
- package/docs/apis/features/node/git.md +371 -0
- package/docs/apis/features/node/google-auth.md +193 -0
- package/docs/apis/features/node/google-calendar.md +202 -0
- package/docs/apis/features/node/google-docs.md +173 -0
- package/docs/apis/features/node/google-drive.md +246 -0
- package/docs/apis/features/node/google-mail.md +214 -0
- package/docs/apis/features/node/google-sheets.md +194 -0
- package/docs/apis/features/node/grep.md +292 -0
- package/docs/apis/features/node/helpers.md +164 -0
- package/docs/apis/features/node/ink.md +334 -0
- package/docs/apis/features/node/ipc-socket.md +249 -0
- package/docs/apis/features/node/json-tree.md +86 -0
- package/docs/apis/features/node/networking.md +316 -0
- package/docs/apis/features/node/nlp.md +133 -0
- package/docs/apis/features/node/opener.md +97 -0
- package/docs/apis/features/node/os.md +146 -0
- package/docs/apis/features/node/package-finder.md +392 -0
- package/docs/apis/features/node/postgres.md +234 -0
- package/docs/apis/features/node/proc.md +399 -0
- package/docs/apis/features/node/process-manager.md +305 -0
- package/docs/apis/features/node/python.md +604 -0
- package/docs/apis/features/node/redis.md +380 -0
- package/docs/apis/features/node/repl.md +88 -0
- package/docs/apis/features/node/runpod.md +674 -0
- package/docs/apis/features/node/secure-shell.md +176 -0
- package/docs/apis/features/node/semantic-search.md +408 -0
- package/docs/apis/features/node/sqlite.md +233 -0
- package/docs/apis/features/node/telegram.md +279 -0
- package/docs/apis/features/node/transpiler.md +74 -0
- package/docs/apis/features/node/tts.md +133 -0
- package/docs/apis/features/node/ui.md +701 -0
- package/docs/apis/features/node/vault.md +59 -0
- package/docs/apis/features/node/vm.md +75 -0
- package/docs/apis/features/node/yaml-tree.md +85 -0
- package/docs/apis/features/node/yaml.md +176 -0
- package/docs/apis/features/web/asset-loader.md +59 -0
- package/docs/apis/features/web/container-link.md +192 -0
- package/docs/apis/features/web/esbuild.md +54 -0
- package/docs/apis/features/web/helpers.md +164 -0
- package/docs/apis/features/web/network.md +44 -0
- package/docs/apis/features/web/speech.md +69 -0
- package/docs/apis/features/web/vault.md +59 -0
- package/docs/apis/features/web/vm.md +75 -0
- package/docs/apis/features/web/voice.md +84 -0
- package/docs/apis/servers/express.md +171 -0
- package/docs/apis/servers/mcp.md +238 -0
- package/docs/apis/servers/websocket.md +170 -0
- package/docs/bootstrap/CLAUDE.md +101 -0
- package/docs/bootstrap/SKILL.md +341 -0
- package/docs/bootstrap/templates/about-command.ts +41 -0
- package/docs/bootstrap/templates/docs-models.ts +22 -0
- package/docs/bootstrap/templates/docs-readme.md +43 -0
- package/docs/bootstrap/templates/example-feature.ts +53 -0
- package/docs/bootstrap/templates/health-endpoint.ts +15 -0
- package/docs/bootstrap/templates/luca-cli.ts +30 -0
- package/docs/bootstrap/templates/runme.md +54 -0
- package/docs/challenges/caching-proxy.md +16 -0
- package/docs/challenges/content-db-round-trip.md +14 -0
- package/docs/challenges/custom-command.md +9 -0
- package/docs/challenges/file-watcher-pipeline.md +11 -0
- package/docs/challenges/grep-audit-report.md +15 -0
- package/docs/challenges/multi-feature-dashboard.md +14 -0
- package/docs/challenges/process-orchestrator.md +17 -0
- package/docs/challenges/rest-api-server-with-client.md +12 -0
- package/docs/challenges/script-runner-with-vm.md +11 -0
- package/docs/challenges/simple-rest-api.md +15 -0
- package/docs/challenges/websocket-serve-and-client.md +11 -0
- package/docs/challenges/yaml-config-system.md +14 -0
- package/docs/command-system-overhaul.md +94 -0
- package/docs/documentation-audit.md +134 -0
- package/docs/examples/assistant/CORE.md +18 -0
- package/docs/examples/assistant/hooks.ts +3 -0
- package/docs/examples/assistant/tools.ts +10 -0
- package/docs/examples/assistant-hooks-reference.ts +171 -0
- package/docs/examples/assistant-with-process-manager.md +84 -0
- package/docs/examples/content-db.md +77 -0
- package/docs/examples/disk-cache.md +83 -0
- package/docs/examples/docker.md +101 -0
- package/docs/examples/downloader.md +70 -0
- package/docs/examples/entity.md +124 -0
- package/docs/examples/esbuild.md +80 -0
- package/docs/examples/feature-as-tool-provider.md +143 -0
- package/docs/examples/file-manager.md +82 -0
- package/docs/examples/fs.md +83 -0
- package/docs/examples/git.md +85 -0
- package/docs/examples/google-auth.md +88 -0
- package/docs/examples/google-calendar.md +94 -0
- package/docs/examples/google-docs.md +82 -0
- package/docs/examples/google-drive.md +96 -0
- package/docs/examples/google-sheets.md +95 -0
- package/docs/examples/grep.md +85 -0
- package/docs/examples/ink-blocks.md +75 -0
- package/docs/examples/ink-renderer.md +41 -0
- package/docs/examples/ink.md +103 -0
- package/docs/examples/ipc-socket.md +103 -0
- package/docs/examples/json-tree.md +91 -0
- package/docs/examples/networking.md +58 -0
- package/docs/examples/nlp.md +91 -0
- package/docs/examples/opener.md +78 -0
- package/docs/examples/os.md +72 -0
- package/docs/examples/package-finder.md +89 -0
- package/docs/examples/postgres.md +91 -0
- package/docs/examples/proc.md +81 -0
- package/docs/examples/process-manager.md +79 -0
- package/docs/examples/python.md +132 -0
- package/docs/examples/repl.md +93 -0
- package/docs/examples/runpod.md +119 -0
- package/docs/examples/secure-shell.md +92 -0
- package/docs/examples/sqlite.md +86 -0
- package/docs/examples/structured-output-with-assistants.md +144 -0
- package/docs/examples/telegram.md +77 -0
- package/docs/examples/tts.md +86 -0
- package/docs/examples/ui.md +80 -0
- package/docs/examples/vault.md +70 -0
- package/docs/examples/vm.md +86 -0
- package/docs/examples/websocket-ask-and-reply-example.md +128 -0
- package/docs/examples/yaml-tree.md +93 -0
- package/docs/examples/yaml.md +104 -0
- package/docs/ideas/assistant-factory-pattern.md +142 -0
- package/docs/in-memory-fs.md +4 -0
- package/docs/introspection-audit.md +49 -0
- package/docs/introspection.md +164 -0
- package/docs/mcp/readme.md +162 -0
- package/docs/models.ts +41 -0
- package/docs/philosophy.md +86 -0
- package/docs/principles.md +7 -0
- package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +34 -0
- package/docs/prompts/check-for-undocumented-features.md +27 -0
- package/docs/prompts/mcp-test-easy-command.md +27 -0
- package/docs/scaffolds/client.md +149 -0
- package/docs/scaffolds/command.md +120 -0
- package/docs/scaffolds/endpoint.md +171 -0
- package/docs/scaffolds/feature.md +158 -0
- package/docs/scaffolds/selector.md +91 -0
- package/docs/scaffolds/server.md +196 -0
- package/docs/selectors.md +115 -0
- package/docs/sessions/custom-command/attempt-log-2.md +195 -0
- package/docs/sessions/file-watcher-pipeline/attempt-log-1.md +728 -0
- package/docs/sessions/file-watcher-pipeline/attempt-log-2.md +555 -0
- package/docs/sessions/grep-audit-report/attempt-log-1.md +289 -0
- package/docs/sessions/multi-feature-dashboard/attempt-log-2.md +679 -0
- package/docs/sessions/rest-api-server-with-client/attempt-log-1.md +1 -0
- package/docs/sessions/rest-api-server-with-client/attempt-log-3.md +920 -0
- package/docs/sessions/simple-rest-api/attempt-log-1.md +593 -0
- package/docs/sessions/websocket-serve-and-client/attempt-log-2.md +995 -0
- package/docs/tutorials/00-bootstrap.md +166 -0
- package/docs/tutorials/01-getting-started.md +106 -0
- package/docs/tutorials/02-container.md +210 -0
- package/docs/tutorials/03-scripts.md +194 -0
- package/docs/tutorials/04-features-overview.md +196 -0
- package/docs/tutorials/05-state-and-events.md +171 -0
- package/docs/tutorials/06-servers.md +157 -0
- package/docs/tutorials/07-endpoints.md +198 -0
- package/docs/tutorials/08-commands.md +252 -0
- package/docs/tutorials/09-clients.md +162 -0
- package/docs/tutorials/10-creating-features.md +203 -0
- package/docs/tutorials/11-contentbase.md +191 -0
- package/docs/tutorials/12-assistants.md +215 -0
- package/docs/tutorials/13-introspection.md +157 -0
- package/docs/tutorials/14-type-system.md +174 -0
- package/docs/tutorials/15-project-patterns.md +222 -0
- package/docs/tutorials/16-google-features.md +534 -0
- package/docs/tutorials/17-tui-blocks.md +530 -0
- package/docs/tutorials/18-semantic-search.md +334 -0
- package/docs/tutorials/19-python-sessions.md +401 -0
- package/docs/tutorials/20-browser-esm.md +234 -0
- package/index.html +1430 -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 +1430 -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 +152 -0
- package/src/agi/endpoints/ask.ts +60 -0
- package/src/agi/endpoints/conversations/[id].ts +45 -0
- package/src/agi/endpoints/conversations.ts +31 -0
- package/src/agi/endpoints/experts.ts +37 -0
- package/src/agi/feature.ts +13 -0
- package/src/agi/features/agent-memory.ts +694 -0
- package/src/agi/features/assistant.ts +1624 -0
- package/src/agi/features/assistants-manager.ts +418 -0
- package/src/agi/features/autonomous-assistant.ts +431 -0
- package/src/agi/features/browser-use.ts +653 -0
- package/src/agi/features/claude-code.ts +1538 -0
- package/src/agi/features/coding-tools.ts +175 -0
- package/src/agi/features/conversation-history.ts +495 -0
- package/src/agi/features/conversation.ts +1323 -0
- package/src/agi/features/docs-reader.ts +167 -0
- package/src/agi/features/file-tools.ts +293 -0
- package/src/agi/features/luca-coder.ts +639 -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 +478 -0
- package/src/agi/index.ts +6 -0
- package/src/agi/lib/interceptor-chain.ts +89 -0
- package/src/agi/lib/token-counter.ts +122 -0
- package/src/bootstrap/generated.ts +9792 -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 +505 -0
- package/src/commands/bootstrap.ts +244 -0
- package/src/commands/chat.ts +308 -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 +121 -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 +982 -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 +1084 -0
- package/src/container.ts +1186 -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 +40208 -0
- package/src/introspection/generated.node.ts +28686 -0
- package/src/introspection/generated.web.ts +2251 -0
- package/src/introspection/index.ts +296 -0
- package/src/introspection/scan.ts +1131 -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 +812 -0
- package/src/node/features/disk-cache.ts +388 -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 +735 -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 +906 -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 +267 -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 +161 -0
- package/src/node/features/tts.ts +185 -0
- package/src/node/features/ui.ts +786 -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 +227 -0
- package/src/react/index.ts +175 -0
- package/src/registry.ts +210 -0
- package/src/scaffolds/generated.ts +1815 -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 +269 -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/test/assistant-hooks.test.ts +306 -0
- package/test/assistant.test.ts +81 -0
- package/test/bus.test.ts +134 -0
- package/test/clients-servers.test.ts +217 -0
- package/test/command.test.ts +267 -0
- package/test/container-link.test.ts +274 -0
- package/test/conversation.test.ts +220 -0
- package/test/features.test.ts +160 -0
- package/test/fork-and-research.test.ts +450 -0
- package/test/integration.test.ts +787 -0
- package/test/interceptor-chain.test.ts +61 -0
- package/test/node-container.test.ts +121 -0
- package/test/python-session.test.ts +105 -0
- package/test/rate-limit.test.ts +272 -0
- package/test/semantic-search.test.ts +550 -0
- package/test/state.test.ts +121 -0
- package/test/vm-context.test.ts +146 -0
- package/test/vm-loadmodule.test.ts +213 -0
- package/test/websocket-ask.test.ts +101 -0
- package/test-integration/assistant.test.ts +138 -0
- package/test-integration/assistants-manager.test.ts +113 -0
- package/test-integration/claude-code.test.ts +98 -0
- package/test-integration/conversation-history.test.ts +205 -0
- package/test-integration/conversation.test.ts +137 -0
- package/test-integration/elevenlabs.test.ts +55 -0
- package/test-integration/google-services.test.ts +80 -0
- package/test-integration/helpers.ts +89 -0
- package/test-integration/memory.test.ts +204 -0
- package/test-integration/openai-codex.test.ts +93 -0
- package/test-integration/runpod.test.ts +58 -0
- package/test-integration/server-endpoints.test.ts +97 -0
- package/test-integration/telegram.test.ts +46 -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,357 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Client,
|
|
3
|
+
} from "@soederpop/luca/client";
|
|
4
|
+
import type { ContainerContext } from "@soederpop/luca/container";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import {
|
|
7
|
+
ClientStateSchema,
|
|
8
|
+
ClientOptionsSchema,
|
|
9
|
+
ClientEventsSchema,
|
|
10
|
+
} from "@soederpop/luca/schemas/base.js";
|
|
11
|
+
import {
|
|
12
|
+
createClient,
|
|
13
|
+
type SupabaseClient as SupabaseSDKClient,
|
|
14
|
+
type SupabaseClientOptions as SupabaseSDKOptions,
|
|
15
|
+
type RealtimeChannel,
|
|
16
|
+
} from "@supabase/supabase-js";
|
|
17
|
+
|
|
18
|
+
declare module "@soederpop/luca/client" {
|
|
19
|
+
interface AvailableClients {
|
|
20
|
+
supabase: typeof SupabaseClient;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Schemas
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
|
|
28
|
+
export const SupabaseClientOptionsSchema = ClientOptionsSchema.extend({
|
|
29
|
+
supabaseUrl: z
|
|
30
|
+
.string()
|
|
31
|
+
.describe("The Supabase project URL (e.g. https://xyz.supabase.co)"),
|
|
32
|
+
supabaseKey: z
|
|
33
|
+
.string()
|
|
34
|
+
.describe("The Supabase anon or service-role key"),
|
|
35
|
+
clientOptions: z
|
|
36
|
+
.record(z.string(), z.any())
|
|
37
|
+
.optional()
|
|
38
|
+
.describe(
|
|
39
|
+
"Pass-through options forwarded directly to the Supabase SDK createClient()"
|
|
40
|
+
),
|
|
41
|
+
}).describe("Options for creating a Supabase client");
|
|
42
|
+
|
|
43
|
+
export const SupabaseClientStateSchema = ClientStateSchema.extend({
|
|
44
|
+
authenticated: z
|
|
45
|
+
.boolean()
|
|
46
|
+
.default(false)
|
|
47
|
+
.describe("Whether a user session is currently active"),
|
|
48
|
+
userId: z
|
|
49
|
+
.string()
|
|
50
|
+
.nullable()
|
|
51
|
+
.default(null)
|
|
52
|
+
.describe("The authenticated user's ID, if any"),
|
|
53
|
+
userEmail: z
|
|
54
|
+
.string()
|
|
55
|
+
.nullable()
|
|
56
|
+
.default(null)
|
|
57
|
+
.describe("The authenticated user's email, if any"),
|
|
58
|
+
realtimeChannels: z
|
|
59
|
+
.array(z.string())
|
|
60
|
+
.default([])
|
|
61
|
+
.describe("Names of currently subscribed realtime channels"),
|
|
62
|
+
lastError: z
|
|
63
|
+
.string()
|
|
64
|
+
.nullable()
|
|
65
|
+
.default(null)
|
|
66
|
+
.describe("The most recent error message, if any"),
|
|
67
|
+
}).describe("Supabase client state");
|
|
68
|
+
|
|
69
|
+
export const SupabaseClientEventsSchema = ClientEventsSchema.extend({
|
|
70
|
+
authStateChange: z
|
|
71
|
+
.tuple([
|
|
72
|
+
z.string().describe("The auth event name (e.g. SIGNED_IN, SIGNED_OUT)"),
|
|
73
|
+
z.any().describe("The session object"),
|
|
74
|
+
])
|
|
75
|
+
.describe("Emitted when the auth state changes"),
|
|
76
|
+
realtimeMessage: z
|
|
77
|
+
.tuple([
|
|
78
|
+
z.string().describe("The channel name"),
|
|
79
|
+
z.any().describe("The payload"),
|
|
80
|
+
])
|
|
81
|
+
.describe("Emitted when a realtime message is received"),
|
|
82
|
+
realtimeStatus: z
|
|
83
|
+
.tuple([
|
|
84
|
+
z.string().describe("The channel name"),
|
|
85
|
+
z.string().describe("The status (e.g. SUBSCRIBED, CLOSED)"),
|
|
86
|
+
])
|
|
87
|
+
.describe("Emitted when a realtime channel status changes"),
|
|
88
|
+
error: z
|
|
89
|
+
.tuple([z.any().describe("The error object")])
|
|
90
|
+
.describe("Emitted on any Supabase error"),
|
|
91
|
+
}).describe("Supabase client events");
|
|
92
|
+
|
|
93
|
+
export type SupabaseClientOptions = z.infer<typeof SupabaseClientOptionsSchema>;
|
|
94
|
+
export type SupabaseClientState = z.infer<typeof SupabaseClientStateSchema>;
|
|
95
|
+
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// Client
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Supabase client for the Luca container system.
|
|
102
|
+
*
|
|
103
|
+
* Wraps the official `@supabase/supabase-js` SDK and exposes it through Luca's
|
|
104
|
+
* typed state, events, and introspection system. The SDK is isomorphic so this
|
|
105
|
+
* single implementation works in both Node and browser containers.
|
|
106
|
+
*
|
|
107
|
+
* Use `client.sdk` for full SDK access, or use the convenience wrappers for
|
|
108
|
+
* common operations (auth, database queries, storage, edge functions, realtime).
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* const supabase = container.client('supabase', {
|
|
113
|
+
* supabaseUrl: 'https://xyz.supabase.co',
|
|
114
|
+
* supabaseKey: 'your-anon-key',
|
|
115
|
+
* })
|
|
116
|
+
*
|
|
117
|
+
* // Query data
|
|
118
|
+
* const { data } = await supabase.from('users').select('*')
|
|
119
|
+
*
|
|
120
|
+
* // Auth
|
|
121
|
+
* await supabase.signInWithPassword('user@example.com', 'password')
|
|
122
|
+
*
|
|
123
|
+
* // Realtime
|
|
124
|
+
* supabase.subscribe('changes', 'users', (payload) => {
|
|
125
|
+
* console.log('Change:', payload)
|
|
126
|
+
* })
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
export class SupabaseClient extends Client<
|
|
130
|
+
SupabaseClientState,
|
|
131
|
+
SupabaseClientOptions
|
|
132
|
+
> {
|
|
133
|
+
static override shortcut = "clients.supabase" as const;
|
|
134
|
+
static override description =
|
|
135
|
+
"Supabase client wrapping the official SDK with typed state, events, and realtime channel management";
|
|
136
|
+
|
|
137
|
+
static override stateSchema = SupabaseClientStateSchema;
|
|
138
|
+
static override optionsSchema = SupabaseClientOptionsSchema;
|
|
139
|
+
static override eventsSchema = SupabaseClientEventsSchema;
|
|
140
|
+
|
|
141
|
+
static { Client.register(this, 'supabase') }
|
|
142
|
+
|
|
143
|
+
private _sdk!: SupabaseSDKClient<any, any>;
|
|
144
|
+
private _channels = new Map<string, RealtimeChannel>();
|
|
145
|
+
|
|
146
|
+
constructor(options: SupabaseClientOptions, context: ContainerContext) {
|
|
147
|
+
super(options, context);
|
|
148
|
+
|
|
149
|
+
const sdkOptions = (options.clientOptions ?? {}) as SupabaseSDKOptions<string>;
|
|
150
|
+
this._sdk = createClient(options.supabaseUrl, options.supabaseKey, sdkOptions);
|
|
151
|
+
|
|
152
|
+
this._sdk.auth.onAuthStateChange((event, session) => {
|
|
153
|
+
const user = session?.user;
|
|
154
|
+
this.state.set("authenticated", !!session);
|
|
155
|
+
this.state.set("userId", user?.id ?? null);
|
|
156
|
+
this.state.set("userEmail", user?.email ?? null);
|
|
157
|
+
this.emit("authStateChange" as any, event, session);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
this.state.set("connected", true);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ---------------------------------------------------------------------------
|
|
164
|
+
// SDK access
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
|
|
167
|
+
/** Returns the raw Supabase SDK client for full access to all SDK methods. */
|
|
168
|
+
get sdk(): SupabaseSDKClient<any, any> {
|
|
169
|
+
return this._sdk;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
// Database
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Start a query on a Postgres table or view.
|
|
178
|
+
* @param table - The table or view name to query
|
|
179
|
+
*/
|
|
180
|
+
from(table: string) {
|
|
181
|
+
return this._sdk.from(table);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Call a Postgres function (RPC).
|
|
186
|
+
* @param fn - The function name
|
|
187
|
+
* @param params - Arguments to pass to the function
|
|
188
|
+
* @param options - Optional settings (head, get, count)
|
|
189
|
+
*/
|
|
190
|
+
rpc(fn: string, params?: Record<string, unknown>, options?: { head?: boolean; get?: boolean; count?: "exact" | "planned" | "estimated" }) {
|
|
191
|
+
return this._sdk.rpc(fn, params, options);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// ---------------------------------------------------------------------------
|
|
195
|
+
// Auth
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
|
|
198
|
+
/** Sign in with email and password. */
|
|
199
|
+
async signInWithPassword(email: string, password: string) {
|
|
200
|
+
const result = await this._sdk.auth.signInWithPassword({ email, password });
|
|
201
|
+
if (result.error) {
|
|
202
|
+
this._setError(result.error.message);
|
|
203
|
+
}
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** Create a new user account with email and password. */
|
|
208
|
+
async signUp(email: string, password: string) {
|
|
209
|
+
const result = await this._sdk.auth.signUp({ email, password });
|
|
210
|
+
if (result.error) {
|
|
211
|
+
this._setError(result.error.message);
|
|
212
|
+
}
|
|
213
|
+
return result;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/** Sign the current user out. */
|
|
217
|
+
async signOut() {
|
|
218
|
+
const result = await this._sdk.auth.signOut();
|
|
219
|
+
if (result.error) {
|
|
220
|
+
this._setError(result.error.message);
|
|
221
|
+
}
|
|
222
|
+
return result;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** Get the current session, if any. */
|
|
226
|
+
async getSession() {
|
|
227
|
+
return this._sdk.auth.getSession();
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/** Get the current user, if any. */
|
|
231
|
+
async getUser() {
|
|
232
|
+
return this._sdk.auth.getUser();
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
// Storage
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
|
|
239
|
+
/** Returns the Supabase Storage client for managing buckets and files. */
|
|
240
|
+
get storage() {
|
|
241
|
+
return this._sdk.storage;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// ---------------------------------------------------------------------------
|
|
245
|
+
// Edge Functions
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
247
|
+
|
|
248
|
+
/** Returns the Supabase Functions client. */
|
|
249
|
+
get functions() {
|
|
250
|
+
return this._sdk.functions;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/** Invoke a Supabase Edge Function by name. */
|
|
254
|
+
async invoke(name: string, body?: any) {
|
|
255
|
+
const result = await this._sdk.functions.invoke(name, { body });
|
|
256
|
+
if (result.error) {
|
|
257
|
+
this._setError(result.error.message);
|
|
258
|
+
}
|
|
259
|
+
return result;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// ---------------------------------------------------------------------------
|
|
263
|
+
// Realtime
|
|
264
|
+
// ---------------------------------------------------------------------------
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Subscribe to realtime changes on a Postgres table.
|
|
268
|
+
* @param channelName - A name for this subscription channel
|
|
269
|
+
* @param table - The table to listen to
|
|
270
|
+
* @param callback - Called with the payload on each change
|
|
271
|
+
* @param event - The event type to listen for (default: all changes)
|
|
272
|
+
*/
|
|
273
|
+
subscribe(
|
|
274
|
+
channelName: string,
|
|
275
|
+
table: string,
|
|
276
|
+
callback: (payload: any) => void,
|
|
277
|
+
event: "INSERT" | "UPDATE" | "DELETE" | "*" = "*"
|
|
278
|
+
): RealtimeChannel {
|
|
279
|
+
const channel = this._sdk
|
|
280
|
+
.channel(channelName)
|
|
281
|
+
.on(
|
|
282
|
+
"postgres_changes" as any,
|
|
283
|
+
{ event, schema: "public", table },
|
|
284
|
+
(payload: any) => {
|
|
285
|
+
this.emit("realtimeMessage" as any, channelName, payload);
|
|
286
|
+
callback(payload);
|
|
287
|
+
}
|
|
288
|
+
)
|
|
289
|
+
.subscribe((status: string) => {
|
|
290
|
+
this.emit("realtimeStatus" as any, channelName, status);
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
this._channels.set(channelName, channel);
|
|
294
|
+
this._syncChannelState();
|
|
295
|
+
return channel;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Unsubscribe and remove a realtime channel by name.
|
|
300
|
+
* @param channelName - The channel name to remove
|
|
301
|
+
*/
|
|
302
|
+
async unsubscribe(channelName: string) {
|
|
303
|
+
const channel = this._channels.get(channelName);
|
|
304
|
+
if (channel) {
|
|
305
|
+
await this._sdk.removeChannel(channel);
|
|
306
|
+
this._channels.delete(channelName);
|
|
307
|
+
this._syncChannelState();
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/** Unsubscribe and remove all realtime channels. */
|
|
312
|
+
async unsubscribeAll() {
|
|
313
|
+
await this._sdk.removeAllChannels();
|
|
314
|
+
this._channels.clear();
|
|
315
|
+
this._syncChannelState();
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// ---------------------------------------------------------------------------
|
|
319
|
+
// Lifecycle
|
|
320
|
+
// ---------------------------------------------------------------------------
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Connect is a no-op since the Supabase SDK initializes on construction.
|
|
324
|
+
* The client is ready to use immediately after creation.
|
|
325
|
+
*/
|
|
326
|
+
override async connect() {
|
|
327
|
+
this.state.set("connected", true);
|
|
328
|
+
return this;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Disconnect by signing out and removing all realtime channels.
|
|
333
|
+
*/
|
|
334
|
+
async disconnect() {
|
|
335
|
+
await this.unsubscribeAll();
|
|
336
|
+
await this._sdk.auth.signOut();
|
|
337
|
+
this.state.set("connected", false);
|
|
338
|
+
this.state.set("authenticated", false);
|
|
339
|
+
this.state.set("userId", null);
|
|
340
|
+
this.state.set("userEmail", null);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// ---------------------------------------------------------------------------
|
|
344
|
+
// Internal
|
|
345
|
+
// ---------------------------------------------------------------------------
|
|
346
|
+
|
|
347
|
+
private _syncChannelState() {
|
|
348
|
+
this.state.set("realtimeChannels", Array.from(this._channels.keys()));
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
private _setError(message: string) {
|
|
352
|
+
this.state.set("lastError", message);
|
|
353
|
+
this.emit("error" as any, new Error(message));
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
export default SupabaseClient;
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from '@soederpop/luca/schemas/base.js'
|
|
3
|
+
import { Client } from "@soederpop/luca/client";
|
|
4
|
+
import { RestClient } from "../rest";
|
|
5
|
+
import type { ContainerContext } from "@soederpop/luca/container";
|
|
6
|
+
import type { NodeContainer } from "../../node/container.js";
|
|
7
|
+
|
|
8
|
+
declare module "@soederpop/luca/client" {
|
|
9
|
+
interface AvailableClients {
|
|
10
|
+
voicebox: typeof VoiceBoxClient;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const VoiceBoxClientOptionsSchema = ClientOptionsSchema.extend({
|
|
15
|
+
baseURL: z.string().optional().describe('VoiceBox server URL (falls back to VOICEBOX_URL env var, default http://127.0.0.1:17493)'),
|
|
16
|
+
defaultProfileId: z.string().optional().describe('Default voice profile ID for synthesis'),
|
|
17
|
+
defaultEngine: z.string().optional().default('qwen').describe('Default TTS engine (qwen, luxtts, chatterbox, chatterbox_turbo)'),
|
|
18
|
+
defaultModelSize: z.string().optional().default('1.7B').describe('Default model size (1.7B or 0.6B)'),
|
|
19
|
+
defaultLanguage: z.string().optional().default('en').describe('Default language code'),
|
|
20
|
+
})
|
|
21
|
+
export type VoiceBoxClientOptions = z.infer<typeof VoiceBoxClientOptionsSchema>
|
|
22
|
+
|
|
23
|
+
export const VoiceBoxClientStateSchema = 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'),
|
|
26
|
+
lastRequestTime: z.number().nullable().default(null).describe('Timestamp of the last API request'),
|
|
27
|
+
})
|
|
28
|
+
export type VoiceBoxClientState = z.infer<typeof VoiceBoxClientStateSchema>
|
|
29
|
+
|
|
30
|
+
export const VoiceBoxClientEventsSchema = ClientEventsSchema.extend({
|
|
31
|
+
speech: z.tuple([z.object({
|
|
32
|
+
profileId: z.string(),
|
|
33
|
+
text: z.string(),
|
|
34
|
+
audioSize: z.number(),
|
|
35
|
+
})]).describe('Emitted after speech synthesis completes'),
|
|
36
|
+
profiles: z.tuple([z.array(z.any())]).describe('Emitted after listing profiles'),
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
export type EffectConfig = {
|
|
40
|
+
type: string
|
|
41
|
+
enabled?: boolean
|
|
42
|
+
params?: Record<string, any>
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type SynthesizeOptions = {
|
|
46
|
+
profileId?: string
|
|
47
|
+
engine?: string
|
|
48
|
+
modelSize?: string
|
|
49
|
+
language?: string
|
|
50
|
+
instruct?: string
|
|
51
|
+
seed?: number
|
|
52
|
+
maxChunkChars?: number
|
|
53
|
+
crossfadeMs?: number
|
|
54
|
+
normalize?: boolean
|
|
55
|
+
effectsChain?: EffectConfig[]
|
|
56
|
+
disableCache?: boolean
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* VoiceBox client — local TTS synthesis via VoiceBox.sh REST API (Qwen3-TTS).
|
|
61
|
+
*
|
|
62
|
+
* Provides methods for managing voice profiles and generating speech audio locally.
|
|
63
|
+
* Uses the streaming endpoint for synchronous synthesis (returns WAV buffer).
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const vb = container.client('voicebox')
|
|
68
|
+
* await vb.connect()
|
|
69
|
+
* const profiles = await vb.listProfiles()
|
|
70
|
+
* const audio = await vb.synthesize('Hello world', { profileId: profiles[0].id })
|
|
71
|
+
* // audio is a Buffer of WAV data
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export class VoiceBoxClient extends RestClient<VoiceBoxClientState, VoiceBoxClientOptions> {
|
|
75
|
+
static override shortcut = "clients.voicebox" as const
|
|
76
|
+
static override envVars = ['VOICEBOX_URL']
|
|
77
|
+
static override stateSchema = VoiceBoxClientStateSchema
|
|
78
|
+
static override optionsSchema = VoiceBoxClientOptionsSchema
|
|
79
|
+
static override eventsSchema = VoiceBoxClientEventsSchema
|
|
80
|
+
|
|
81
|
+
static { Client.register(this, 'voicebox') }
|
|
82
|
+
|
|
83
|
+
override get initialState(): VoiceBoxClientState {
|
|
84
|
+
return {
|
|
85
|
+
...super.initialState,
|
|
86
|
+
requestCount: 0,
|
|
87
|
+
characterCount: 0,
|
|
88
|
+
lastRequestTime: null,
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
constructor(options: VoiceBoxClientOptions, context: ContainerContext) {
|
|
93
|
+
options = {
|
|
94
|
+
...options,
|
|
95
|
+
baseURL: options.baseURL || process.env.VOICEBOX_URL || 'http://127.0.0.1:17493',
|
|
96
|
+
}
|
|
97
|
+
super(options, context)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
override get container(): NodeContainer {
|
|
101
|
+
return super.container as unknown as NodeContainer
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private trackRequest(characters = 0) {
|
|
105
|
+
const requestCount = this.state.get('requestCount') || 0
|
|
106
|
+
const characterCount = this.state.get('characterCount') || 0
|
|
107
|
+
this.setState({
|
|
108
|
+
requestCount: requestCount + 1,
|
|
109
|
+
characterCount: characterCount + characters,
|
|
110
|
+
lastRequestTime: Date.now(),
|
|
111
|
+
})
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Validate the VoiceBox server is reachable by hitting the health endpoint.
|
|
116
|
+
*/
|
|
117
|
+
override async connect(): Promise<this> {
|
|
118
|
+
try {
|
|
119
|
+
const health = await this.get('/health')
|
|
120
|
+
if (health?.status !== 'ok' && health?.status !== 'healthy') {
|
|
121
|
+
// Accept any 200 response as healthy
|
|
122
|
+
}
|
|
123
|
+
await super.connect()
|
|
124
|
+
this.emit('connected' as any)
|
|
125
|
+
return this
|
|
126
|
+
} catch (error) {
|
|
127
|
+
this.emit('failure', error)
|
|
128
|
+
throw error
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* List all voice profiles.
|
|
134
|
+
*
|
|
135
|
+
* @returns Array of voice profile objects
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* const profiles = await vb.listProfiles()
|
|
140
|
+
* console.log(profiles.map(p => `${p.name} (${p.sample_count} samples)`))
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
async listProfiles(): Promise<any[]> {
|
|
144
|
+
this.trackRequest()
|
|
145
|
+
const result = await this.get('/profiles')
|
|
146
|
+
const profiles = Array.isArray(result) ? result : []
|
|
147
|
+
this.emit('profiles', profiles)
|
|
148
|
+
return profiles
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Get a single voice profile by ID.
|
|
153
|
+
*/
|
|
154
|
+
async getProfile(profileId: string): Promise<any> {
|
|
155
|
+
this.trackRequest()
|
|
156
|
+
return this.get(`/profiles/${profileId}`)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Create a new voice profile.
|
|
161
|
+
*/
|
|
162
|
+
async createProfile(name: string, options: { description?: string; language?: string } = {}): Promise<any> {
|
|
163
|
+
this.trackRequest()
|
|
164
|
+
return this.post('/profiles', { name, ...options })
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* List available audio effects and their parameter definitions.
|
|
169
|
+
*/
|
|
170
|
+
async listEffects(): Promise<any> {
|
|
171
|
+
this.trackRequest()
|
|
172
|
+
return this.get('/effects/available')
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Synthesize speech from text using the streaming endpoint.
|
|
177
|
+
* Returns audio as a WAV Buffer (synchronous — blocks until audio is ready).
|
|
178
|
+
*
|
|
179
|
+
* @param text - The text to convert to speech
|
|
180
|
+
* @param options - Profile, engine, model, and other synthesis options
|
|
181
|
+
* @returns Audio data as a WAV Buffer
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```typescript
|
|
185
|
+
* const audio = await vb.synthesize('Hello world', { profileId: 'abc-123' })
|
|
186
|
+
* // audio is a Buffer of WAV data
|
|
187
|
+
* ```
|
|
188
|
+
*/
|
|
189
|
+
async synthesize(text: string, options: SynthesizeOptions = {}): Promise<Buffer> {
|
|
190
|
+
const profileId = options.profileId || this.options.defaultProfileId
|
|
191
|
+
if (!profileId) throw new Error('profileId is required for VoiceBox synthesis')
|
|
192
|
+
|
|
193
|
+
const engine = options.engine || this.options.defaultEngine || 'qwen'
|
|
194
|
+
const modelSize = options.modelSize || this.options.defaultModelSize || '1.7B'
|
|
195
|
+
const language = options.language || this.options.defaultLanguage || 'en'
|
|
196
|
+
|
|
197
|
+
const body: Record<string, any> = {
|
|
198
|
+
profile_id: profileId,
|
|
199
|
+
text,
|
|
200
|
+
language,
|
|
201
|
+
engine,
|
|
202
|
+
model_size: modelSize,
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (options.instruct) body.instruct = options.instruct
|
|
206
|
+
if (options.seed != null) body.seed = options.seed
|
|
207
|
+
if (options.maxChunkChars != null) body.max_chunk_chars = options.maxChunkChars
|
|
208
|
+
if (options.crossfadeMs != null) body.crossfade_ms = options.crossfadeMs
|
|
209
|
+
if (options.normalize != null) body.normalize = options.normalize
|
|
210
|
+
if (options.effectsChain) body.effects_chain = options.effectsChain
|
|
211
|
+
|
|
212
|
+
// Check disk cache
|
|
213
|
+
if (!options.disableCache) {
|
|
214
|
+
const { hashObject } = this.container.utils
|
|
215
|
+
const cacheKey = `voicebox:${hashObject({ text, profileId, engine, modelSize, language, instruct: options.instruct })}`
|
|
216
|
+
const diskCache = this.container.feature('diskCache')
|
|
217
|
+
|
|
218
|
+
if (await diskCache.has(cacheKey)) {
|
|
219
|
+
const cached = await diskCache.get(cacheKey)
|
|
220
|
+
const audioBuffer = Buffer.from(cached, 'base64')
|
|
221
|
+
this.emit('speech', { profileId, text, audioSize: audioBuffer.length })
|
|
222
|
+
return audioBuffer
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const audioBuffer = await this.fetchStreamAudio(body, text.length)
|
|
226
|
+
await diskCache.set(cacheKey, audioBuffer.toString('base64'))
|
|
227
|
+
this.emit('speech', { profileId, text, audioSize: audioBuffer.length })
|
|
228
|
+
return audioBuffer
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const audioBuffer = await this.fetchStreamAudio(body, text.length)
|
|
232
|
+
this.emit('speech', { profileId, text, audioSize: audioBuffer.length })
|
|
233
|
+
return audioBuffer
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Generate speech asynchronously (returns metadata, not audio).
|
|
238
|
+
* Use getAudio() to fetch the audio after generation completes.
|
|
239
|
+
*/
|
|
240
|
+
async generate(text: string, options: SynthesizeOptions = {}): Promise<any> {
|
|
241
|
+
const profileId = options.profileId || this.options.defaultProfileId
|
|
242
|
+
if (!profileId) throw new Error('profileId is required for VoiceBox generation')
|
|
243
|
+
|
|
244
|
+
const body: Record<string, any> = {
|
|
245
|
+
profile_id: profileId,
|
|
246
|
+
text,
|
|
247
|
+
language: options.language || this.options.defaultLanguage || 'en',
|
|
248
|
+
engine: options.engine || this.options.defaultEngine || 'qwen',
|
|
249
|
+
model_size: options.modelSize || this.options.defaultModelSize || '1.7B',
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (options.instruct) body.instruct = options.instruct
|
|
253
|
+
if (options.seed != null) body.seed = options.seed
|
|
254
|
+
if (options.effectsChain) body.effects_chain = options.effectsChain
|
|
255
|
+
|
|
256
|
+
this.trackRequest(text.length)
|
|
257
|
+
return this.post('/generate', body)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Fetch generated audio by generation ID. Returns WAV Buffer.
|
|
262
|
+
*/
|
|
263
|
+
async getAudio(generationId: string): Promise<Buffer> {
|
|
264
|
+
this.trackRequest()
|
|
265
|
+
const response = await this.axios({
|
|
266
|
+
method: 'GET',
|
|
267
|
+
url: `/audio/${generationId}`,
|
|
268
|
+
responseType: 'arraybuffer',
|
|
269
|
+
headers: { Accept: 'audio/wav' },
|
|
270
|
+
})
|
|
271
|
+
return Buffer.from(response.data)
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Synthesize and write audio to a file.
|
|
276
|
+
*/
|
|
277
|
+
async say(text: string, outputPath: string, options: SynthesizeOptions = {}): Promise<string> {
|
|
278
|
+
const audio = await this.synthesize(text, options)
|
|
279
|
+
const resolvedPath = this.container.paths.resolve(outputPath)
|
|
280
|
+
await this.container.fs.writeFileAsync(resolvedPath, audio)
|
|
281
|
+
return resolvedPath
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
private async fetchStreamAudio(body: Record<string, any>, charCount: number): Promise<Buffer> {
|
|
285
|
+
this.trackRequest(charCount)
|
|
286
|
+
const response = await this.axios({
|
|
287
|
+
method: 'POST',
|
|
288
|
+
url: '/generate/stream',
|
|
289
|
+
data: body,
|
|
290
|
+
responseType: 'arraybuffer',
|
|
291
|
+
headers: {
|
|
292
|
+
'Content-Type': 'application/json',
|
|
293
|
+
Accept: 'audio/wav',
|
|
294
|
+
},
|
|
295
|
+
})
|
|
296
|
+
return Buffer.from(response.data)
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
export default VoiceBoxClient
|