luca 1.1.2 → 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 -8
- 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 -0
- 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 -66
- 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/index.d.ts +0 -2
- package/dist/cli/index.js +0 -5
- package/dist/cli/run.d.ts +0 -12
- package/dist/cli/run.js +0 -42
- package/dist/config/consts.d.ts +0 -2
- package/dist/config/consts.js +0 -29
- package/dist/config/default.d.ts +0 -8
- package/dist/config/default.js +0 -15
- package/dist/config/initConfig.d.ts +0 -1
- package/dist/config/initConfig.js +0 -52
- package/dist/config/openConfig.d.ts +0 -2
- package/dist/config/openConfig.js +0 -24
- package/dist/config/runConfig.d.ts +0 -3
- package/dist/config/runConfig.js +0 -117
- package/dist/config/types.d.ts +0 -13
- package/dist/config/types.js +0 -2
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -5
- package/dist/utils/common.d.ts +0 -2
- package/dist/utils/common.js +0 -52
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.js +0 -17
|
@@ -0,0 +1,456 @@
|
|
|
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 type { Container, ContainerContext } from "@soederpop/luca/container";
|
|
5
|
+
|
|
6
|
+
import OpenAI from "openai";
|
|
7
|
+
|
|
8
|
+
export const OpenAIClientStateSchema = ClientStateSchema.extend({
|
|
9
|
+
requestCount: z.number().default(0).describe('Total number of API requests made'),
|
|
10
|
+
lastRequestTime: z.number().nullable().default(null).describe('Timestamp of the last API request'),
|
|
11
|
+
tokenUsage: z.object({
|
|
12
|
+
prompt: z.number().default(0).describe('Total prompt tokens consumed'),
|
|
13
|
+
completion: z.number().default(0).describe('Total completion tokens consumed'),
|
|
14
|
+
total: z.number().default(0).describe('Total tokens consumed (prompt + completion)'),
|
|
15
|
+
}).default({ prompt: 0, completion: 0, total: 0 }).describe('Cumulative token usage across all requests'),
|
|
16
|
+
})
|
|
17
|
+
export type OpenAIClientState = z.infer<typeof OpenAIClientStateSchema>
|
|
18
|
+
|
|
19
|
+
export const OpenAIClientOptionsSchema = ClientOptionsSchema.extend({
|
|
20
|
+
apiKey: z.string().optional().describe('OpenAI API key (falls back to OPENAI_API_KEY env var)'),
|
|
21
|
+
organization: z.string().optional().describe('OpenAI organization ID'),
|
|
22
|
+
project: z.string().optional().describe('OpenAI project ID'),
|
|
23
|
+
dangerouslyAllowBrowser: z.boolean().optional().describe('Allow usage in browser environments'),
|
|
24
|
+
defaultModel: z.string().optional().describe('Default model for completions (default: gpt-4o)'),
|
|
25
|
+
timeout: z.number().optional().describe('Request timeout in milliseconds'),
|
|
26
|
+
maxRetries: z.number().optional().describe('Maximum number of retries on failure'),
|
|
27
|
+
})
|
|
28
|
+
export type OpenAIClientOptions = z.infer<typeof OpenAIClientOptionsSchema>
|
|
29
|
+
|
|
30
|
+
export const OpenAIClientEventsSchema = ClientEventsSchema.extend({
|
|
31
|
+
connected: z.tuple([]).describe('Emitted when the API connection is verified'),
|
|
32
|
+
completion: z.tuple([z.any().describe('The completion or response object')]).describe('Emitted after a chat completion, legacy completion, or response is created'),
|
|
33
|
+
embedding: z.tuple([z.any().describe('The embedding response object')]).describe('Emitted after embeddings are created'),
|
|
34
|
+
image: z.tuple([z.any().describe('The image generation response object')]).describe('Emitted after an image is generated'),
|
|
35
|
+
models: z.tuple([z.any().describe('The models list response')]).describe('Emitted after listing available models'),
|
|
36
|
+
}).describe('OpenAI client events')
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* OpenAI client — wraps the OpenAI SDK for chat completions, responses API, embeddings, and image generation.
|
|
40
|
+
*
|
|
41
|
+
* Provides convenience methods for common operations while tracking token usage and request counts.
|
|
42
|
+
* Supports both the Chat Completions API and the newer Responses API.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* const openai = container.client('openai', { defaultModel: 'gpt-4o' })
|
|
47
|
+
* const answer = await openai.ask('What is the meaning of life?')
|
|
48
|
+
* console.log(answer)
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export class OpenAIClient extends Client<OpenAIClientState, OpenAIClientOptions> {
|
|
52
|
+
private openai!: OpenAI;
|
|
53
|
+
|
|
54
|
+
static override shortcut = "clients.openai" as const
|
|
55
|
+
static override envVars = ['OPENAI_API_KEY']
|
|
56
|
+
static override stateSchema = OpenAIClientStateSchema
|
|
57
|
+
static override optionsSchema = OpenAIClientOptionsSchema
|
|
58
|
+
static override eventsSchema = OpenAIClientEventsSchema
|
|
59
|
+
|
|
60
|
+
static { Client.register(this, 'openai') }
|
|
61
|
+
|
|
62
|
+
/** Initial state with zeroed token usage counters. */
|
|
63
|
+
override get initialState(): OpenAIClientState {
|
|
64
|
+
return {
|
|
65
|
+
...super.initialState,
|
|
66
|
+
requestCount: 0,
|
|
67
|
+
lastRequestTime: null,
|
|
68
|
+
tokenUsage: {
|
|
69
|
+
prompt: 0,
|
|
70
|
+
completion: 0,
|
|
71
|
+
total: 0
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
constructor(options: OpenAIClientOptions, context: ContainerContext) {
|
|
77
|
+
super(options, context);
|
|
78
|
+
this.initializeOpenAI();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private initializeOpenAI() {
|
|
82
|
+
this.openai = new OpenAI({
|
|
83
|
+
apiKey: this.options.apiKey || process.env.OPENAI_API_KEY,
|
|
84
|
+
organization: this.options.organization,
|
|
85
|
+
project: this.options.project,
|
|
86
|
+
dangerouslyAllowBrowser: this.options.dangerouslyAllowBrowser,
|
|
87
|
+
timeout: this.options.timeout,
|
|
88
|
+
maxRetries: this.options.maxRetries,
|
|
89
|
+
baseURL: this.options.baseURL,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Test the API connection by listing models.
|
|
95
|
+
*
|
|
96
|
+
* @returns This client instance
|
|
97
|
+
* @throws If the API key is invalid or the connection fails
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* await openai.connect()
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
override async connect(): Promise<this> {
|
|
105
|
+
try {
|
|
106
|
+
// Test the connection by making a simple request
|
|
107
|
+
await this.openai.models.list();
|
|
108
|
+
await super.connect();
|
|
109
|
+
this.emit('connected');
|
|
110
|
+
return this;
|
|
111
|
+
} catch (error) {
|
|
112
|
+
this.emit('failure', error);
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** The default model used for completions, from options or 'gpt-4o'. */
|
|
118
|
+
get defaultModel(): string {
|
|
119
|
+
return this.options.defaultModel || 'gpt-4o';
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
private updateTokenUsage(usage?: OpenAI.CompletionUsage | OpenAI.Embeddings.CreateEmbeddingResponse.Usage) {
|
|
123
|
+
if (usage) {
|
|
124
|
+
const currentUsage = this.state.get('tokenUsage') || { prompt: 0, completion: 0, total: 0 };
|
|
125
|
+
this.setState({
|
|
126
|
+
tokenUsage: {
|
|
127
|
+
prompt: currentUsage.prompt + (usage.prompt_tokens || 0),
|
|
128
|
+
completion: currentUsage.completion + ('completion_tokens' in usage ? usage.completion_tokens || 0 : 0),
|
|
129
|
+
total: currentUsage.total + (usage.total_tokens || 0)
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
private updateResponsesTokenUsage(usage?: OpenAI.Responses.ResponseUsage) {
|
|
136
|
+
if (usage) {
|
|
137
|
+
const currentUsage = this.state.get('tokenUsage') || { prompt: 0, completion: 0, total: 0 };
|
|
138
|
+
this.setState({
|
|
139
|
+
tokenUsage: {
|
|
140
|
+
prompt: currentUsage.prompt + (usage.input_tokens || 0),
|
|
141
|
+
completion: currentUsage.completion + (usage.output_tokens || 0),
|
|
142
|
+
total: currentUsage.total + (usage.total_tokens || 0),
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
private trackRequest() {
|
|
149
|
+
const requestCount = this.state.get('requestCount') || 0;
|
|
150
|
+
this.setState({
|
|
151
|
+
requestCount: requestCount + 1,
|
|
152
|
+
lastRequestTime: Date.now()
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Create a chat completion using the Chat Completions API.
|
|
158
|
+
*
|
|
159
|
+
* @param messages - Array of chat messages
|
|
160
|
+
* @param options - Additional parameters for the completion
|
|
161
|
+
* @returns The complete chat completion response
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```typescript
|
|
165
|
+
* const response = await openai.createChatCompletion([
|
|
166
|
+
* { role: 'system', content: 'You are a helpful assistant.' },
|
|
167
|
+
* { role: 'user', content: 'Hello!' }
|
|
168
|
+
* ])
|
|
169
|
+
* console.log(response.choices[0]?.message?.content)
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
async createChatCompletion(
|
|
173
|
+
messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[],
|
|
174
|
+
options: Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams> = {}
|
|
175
|
+
): Promise<OpenAI.Chat.Completions.ChatCompletion> {
|
|
176
|
+
this.trackRequest();
|
|
177
|
+
|
|
178
|
+
try {
|
|
179
|
+
const response = await this.openai.chat.completions.create({
|
|
180
|
+
model: this.defaultModel,
|
|
181
|
+
messages,
|
|
182
|
+
stream: false, // Ensure non-streaming response
|
|
183
|
+
...options
|
|
184
|
+
}) as OpenAI.Chat.Completions.ChatCompletion;
|
|
185
|
+
|
|
186
|
+
this.updateTokenUsage(response.usage);
|
|
187
|
+
this.emit('completion', response);
|
|
188
|
+
|
|
189
|
+
return response;
|
|
190
|
+
} catch (error) {
|
|
191
|
+
this.emit('failure', error);
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Create a response using the Responses API.
|
|
198
|
+
*
|
|
199
|
+
* @param input - The input prompt or message array
|
|
200
|
+
* @param options - Additional parameters for the response
|
|
201
|
+
* @returns The complete response object
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```typescript
|
|
205
|
+
* const response = await openai.createResponse('Explain quantum computing')
|
|
206
|
+
* ```
|
|
207
|
+
*/
|
|
208
|
+
async createResponse(
|
|
209
|
+
input: OpenAI.Responses.ResponseInput | string,
|
|
210
|
+
options: Partial<OpenAI.Responses.ResponseCreateParamsNonStreaming> = {}
|
|
211
|
+
): Promise<OpenAI.Responses.Response> {
|
|
212
|
+
this.trackRequest();
|
|
213
|
+
|
|
214
|
+
try {
|
|
215
|
+
const response = await this.openai.responses.create({
|
|
216
|
+
model: this.defaultModel as OpenAI.Responses.ResponseCreateParams['model'],
|
|
217
|
+
input,
|
|
218
|
+
...options,
|
|
219
|
+
stream: false,
|
|
220
|
+
}) as OpenAI.Responses.Response;
|
|
221
|
+
|
|
222
|
+
this.updateResponsesTokenUsage(response.usage || undefined);
|
|
223
|
+
this.emit('completion', response);
|
|
224
|
+
|
|
225
|
+
return response;
|
|
226
|
+
} catch (error) {
|
|
227
|
+
this.emit('failure', error);
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Stream a response using the Responses API.
|
|
234
|
+
*
|
|
235
|
+
* @param input - The input prompt or message array
|
|
236
|
+
* @param options - Additional parameters for the streaming response
|
|
237
|
+
* @returns An async iterable of response stream events
|
|
238
|
+
*
|
|
239
|
+
* @example
|
|
240
|
+
* ```typescript
|
|
241
|
+
* const stream = await openai.streamResponse('Write a poem')
|
|
242
|
+
* for await (const event of stream) {
|
|
243
|
+
* if (event.type === 'response.output_text.delta') {
|
|
244
|
+
* process.stdout.write(event.delta)
|
|
245
|
+
* }
|
|
246
|
+
* }
|
|
247
|
+
* ```
|
|
248
|
+
*/
|
|
249
|
+
async streamResponse(
|
|
250
|
+
input: OpenAI.Responses.ResponseInput | string,
|
|
251
|
+
options: Partial<OpenAI.Responses.ResponseCreateParamsStreaming> = {}
|
|
252
|
+
): Promise<AsyncIterable<OpenAI.Responses.ResponseStreamEvent>> {
|
|
253
|
+
this.trackRequest();
|
|
254
|
+
|
|
255
|
+
try {
|
|
256
|
+
const stream = await this.openai.responses.create({
|
|
257
|
+
model: this.defaultModel as OpenAI.Responses.ResponseCreateParams['model'],
|
|
258
|
+
input,
|
|
259
|
+
...options,
|
|
260
|
+
stream: true,
|
|
261
|
+
}) as AsyncIterable<OpenAI.Responses.ResponseStreamEvent>;
|
|
262
|
+
|
|
263
|
+
return stream;
|
|
264
|
+
} catch (error) {
|
|
265
|
+
this.emit('failure', error);
|
|
266
|
+
throw error;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Create a legacy text completion.
|
|
272
|
+
*
|
|
273
|
+
* @param prompt - The text prompt to complete
|
|
274
|
+
* @param options - Additional parameters for the completion
|
|
275
|
+
* @returns The complete completion response
|
|
276
|
+
*
|
|
277
|
+
* @example
|
|
278
|
+
* ```typescript
|
|
279
|
+
* const response = await openai.createCompletion('Once upon a time')
|
|
280
|
+
* ```
|
|
281
|
+
*/
|
|
282
|
+
async createCompletion(
|
|
283
|
+
prompt: string,
|
|
284
|
+
options: Partial<OpenAI.Completions.CompletionCreateParams> = {}
|
|
285
|
+
): Promise<OpenAI.Completions.Completion> {
|
|
286
|
+
this.trackRequest();
|
|
287
|
+
|
|
288
|
+
try {
|
|
289
|
+
const response = await this.openai.completions.create({
|
|
290
|
+
model: options.model || 'gpt-5',
|
|
291
|
+
prompt,
|
|
292
|
+
stream: false, // Ensure non-streaming response
|
|
293
|
+
...options
|
|
294
|
+
}) as OpenAI.Completions.Completion;
|
|
295
|
+
|
|
296
|
+
this.updateTokenUsage(response.usage);
|
|
297
|
+
this.emit('completion', response);
|
|
298
|
+
|
|
299
|
+
return response;
|
|
300
|
+
} catch (error) {
|
|
301
|
+
this.emit('failure', error);
|
|
302
|
+
throw error;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Create text embeddings for semantic search or similarity comparisons.
|
|
308
|
+
*
|
|
309
|
+
* @param input - A string or array of strings to embed
|
|
310
|
+
* @param options - Additional parameters (model, etc.)
|
|
311
|
+
* @returns The embedding response with vectors
|
|
312
|
+
*
|
|
313
|
+
* @example
|
|
314
|
+
* ```typescript
|
|
315
|
+
* const response = await openai.createEmbedding('Hello world')
|
|
316
|
+
* console.log(response.data[0].embedding.length)
|
|
317
|
+
* ```
|
|
318
|
+
*/
|
|
319
|
+
async createEmbedding(
|
|
320
|
+
input: string | string[],
|
|
321
|
+
options: Partial<OpenAI.Embeddings.EmbeddingCreateParams> = {}
|
|
322
|
+
): Promise<OpenAI.Embeddings.CreateEmbeddingResponse> {
|
|
323
|
+
this.trackRequest();
|
|
324
|
+
|
|
325
|
+
try {
|
|
326
|
+
const response = await this.openai.embeddings.create({
|
|
327
|
+
model: options.model || 'text-embedding-ada-002',
|
|
328
|
+
input,
|
|
329
|
+
...options
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
this.updateTokenUsage(response.usage);
|
|
333
|
+
this.emit('embedding', response);
|
|
334
|
+
|
|
335
|
+
return response;
|
|
336
|
+
} catch (error) {
|
|
337
|
+
this.emit('failure', error);
|
|
338
|
+
throw error;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Generate an image from a text prompt using DALL-E.
|
|
344
|
+
*
|
|
345
|
+
* @param prompt - Description of the image to generate
|
|
346
|
+
* @param options - Additional parameters (size, n, etc.)
|
|
347
|
+
* @returns The image response with URLs or base64 data
|
|
348
|
+
*
|
|
349
|
+
* @example
|
|
350
|
+
* ```typescript
|
|
351
|
+
* const response = await openai.createImage('A sunset over mountains')
|
|
352
|
+
* console.log(response.data[0].url)
|
|
353
|
+
* ```
|
|
354
|
+
*/
|
|
355
|
+
async createImage(
|
|
356
|
+
prompt: string,
|
|
357
|
+
options: Partial<OpenAI.Images.ImageGenerateParams> = {}
|
|
358
|
+
): Promise<OpenAI.Images.ImagesResponse> {
|
|
359
|
+
this.trackRequest();
|
|
360
|
+
|
|
361
|
+
try {
|
|
362
|
+
const response = await this.openai.images.generate({
|
|
363
|
+
prompt,
|
|
364
|
+
n: 1,
|
|
365
|
+
size: '1024x1024',
|
|
366
|
+
...options
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
this.emit('image', response);
|
|
370
|
+
|
|
371
|
+
return response;
|
|
372
|
+
} catch (error) {
|
|
373
|
+
this.emit('failure', error);
|
|
374
|
+
throw error;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* List all available models.
|
|
380
|
+
*
|
|
381
|
+
* @returns Paginated list of available models
|
|
382
|
+
*
|
|
383
|
+
* @example
|
|
384
|
+
* ```typescript
|
|
385
|
+
* const models = await openai.listModels()
|
|
386
|
+
* ```
|
|
387
|
+
*/
|
|
388
|
+
async listModels(): Promise<OpenAI.Models.ModelsPage> {
|
|
389
|
+
try {
|
|
390
|
+
const response = await this.openai.models.list();
|
|
391
|
+
this.emit('models', response);
|
|
392
|
+
return response;
|
|
393
|
+
} catch (error) {
|
|
394
|
+
this.emit('failure', error);
|
|
395
|
+
throw error;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Ask a single question and get a text response.
|
|
401
|
+
*
|
|
402
|
+
* Convenience wrapper around `createChatCompletion` for simple Q&A.
|
|
403
|
+
*
|
|
404
|
+
* @param question - The question to ask
|
|
405
|
+
* @param options - Additional completion parameters
|
|
406
|
+
* @returns The assistant's text response
|
|
407
|
+
*
|
|
408
|
+
* @example
|
|
409
|
+
* ```typescript
|
|
410
|
+
* const answer = await openai.ask('What is 2 + 2?')
|
|
411
|
+
* console.log(answer) // '4'
|
|
412
|
+
* ```
|
|
413
|
+
*/
|
|
414
|
+
async ask(
|
|
415
|
+
question: string,
|
|
416
|
+
options: Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams> = {}
|
|
417
|
+
): Promise<string> {
|
|
418
|
+
const response = await this.createChatCompletion([
|
|
419
|
+
{ role: 'user', content: question }
|
|
420
|
+
], options);
|
|
421
|
+
|
|
422
|
+
return response.choices[0]?.message?.content || '';
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Send a multi-turn conversation and get a text response.
|
|
427
|
+
*
|
|
428
|
+
* Convenience wrapper around `createChatCompletion` that returns just the text.
|
|
429
|
+
*
|
|
430
|
+
* @param messages - Array of chat messages
|
|
431
|
+
* @param options - Additional completion parameters
|
|
432
|
+
* @returns The assistant's text response
|
|
433
|
+
*
|
|
434
|
+
* @example
|
|
435
|
+
* ```typescript
|
|
436
|
+
* const reply = await openai.chat([
|
|
437
|
+
* { role: 'system', content: 'You are a pirate.' },
|
|
438
|
+
* { role: 'user', content: 'Hello!' }
|
|
439
|
+
* ])
|
|
440
|
+
* ```
|
|
441
|
+
*/
|
|
442
|
+
async chat(
|
|
443
|
+
messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[],
|
|
444
|
+
options: Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams> = {}
|
|
445
|
+
): Promise<string> {
|
|
446
|
+
const response = await this.createChatCompletion(messages, options);
|
|
447
|
+
return response.choices[0]?.message?.content || '';
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/** The underlying OpenAI SDK instance for advanced use cases. */
|
|
451
|
+
get raw(): OpenAI {
|
|
452
|
+
return this.openai;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
export default OpenAIClient;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import axios, { type AxiosError, type AxiosInstance, type AxiosRequestConfig } from "axios";
|
|
2
|
+
import { Client, type ClientOptions, type ClientState } from '../client.js'
|
|
3
|
+
import type { ContainerContext } from '../container.js'
|
|
4
|
+
import { ClientEventsSchema } from '../schemas/base.js'
|
|
5
|
+
import { z } from 'zod'
|
|
6
|
+
|
|
7
|
+
export const RestClientEventsSchema = ClientEventsSchema.extend({}).describe('REST client events')
|
|
8
|
+
|
|
9
|
+
declare module '../client' {
|
|
10
|
+
interface AvailableClients {
|
|
11
|
+
rest: typeof RestClient
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* HTTP REST client built on top of axios. Provides convenience methods for
|
|
17
|
+
* GET, POST, PUT, PATCH, and DELETE requests with automatic JSON handling,
|
|
18
|
+
* configurable base URL, and error event emission.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const api = container.client('rest', { baseURL: 'https://api.example.com', json: true })
|
|
23
|
+
* const users = await api.get('/users')
|
|
24
|
+
* await api.post('/users', { name: 'Alice' })
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export class RestClient<
|
|
28
|
+
T extends ClientState = ClientState,
|
|
29
|
+
K extends ClientOptions = ClientOptions
|
|
30
|
+
> extends Client<T, K> {
|
|
31
|
+
axios!: AxiosInstance;
|
|
32
|
+
|
|
33
|
+
static override shortcut: string = "clients.rest"
|
|
34
|
+
static override eventsSchema = RestClientEventsSchema
|
|
35
|
+
static { Client.register(this, 'rest') }
|
|
36
|
+
|
|
37
|
+
constructor(options: K, context: ContainerContext) {
|
|
38
|
+
super(options, context);
|
|
39
|
+
|
|
40
|
+
this.axios = axios.create({
|
|
41
|
+
baseURL: this.baseURL,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
if (this.useJSON) {
|
|
45
|
+
this.axios.defaults.headers.common = {
|
|
46
|
+
...this.axios.defaults.headers.common,
|
|
47
|
+
"Content-Type": "application/json",
|
|
48
|
+
Accept: "application/json",
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async beforeRequest(): Promise<void> {
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Whether JSON content-type headers should be set automatically. */
|
|
57
|
+
get useJSON() {
|
|
58
|
+
return !!this.options.json
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
override get baseURL() {
|
|
62
|
+
return this.options.baseURL || '/'
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Send a PATCH request. Returns the parsed response body directly (not an
|
|
67
|
+
* axios Response wrapper). On HTTP errors, returns the error as JSON instead
|
|
68
|
+
* of throwing.
|
|
69
|
+
* @param url - Request path relative to baseURL
|
|
70
|
+
* @param data - Request body
|
|
71
|
+
* @param options - Additional axios request config
|
|
72
|
+
* @returns Parsed response body
|
|
73
|
+
*/
|
|
74
|
+
async patch(url: string, data: any = {}, options: AxiosRequestConfig = {}): Promise<any> {
|
|
75
|
+
await this.beforeRequest();
|
|
76
|
+
return this.axios({
|
|
77
|
+
...options,
|
|
78
|
+
method: "PATCH",
|
|
79
|
+
url,
|
|
80
|
+
data,
|
|
81
|
+
})
|
|
82
|
+
.then((r) => r.data)
|
|
83
|
+
.catch((e: any) => {
|
|
84
|
+
if (e.isAxiosError) {
|
|
85
|
+
return this.handleError(e);
|
|
86
|
+
} else {
|
|
87
|
+
throw e;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Send a PUT request. Returns the parsed response body directly (not an
|
|
94
|
+
* axios Response wrapper). On HTTP errors, returns the error as JSON instead
|
|
95
|
+
* of throwing.
|
|
96
|
+
* @param url - Request path relative to baseURL
|
|
97
|
+
* @param data - Request body
|
|
98
|
+
* @param options - Additional axios request config
|
|
99
|
+
* @returns Parsed response body
|
|
100
|
+
*/
|
|
101
|
+
async put(url: string, data: any = {}, options: AxiosRequestConfig = {}): Promise<any> {
|
|
102
|
+
await this.beforeRequest();
|
|
103
|
+
return this.axios({
|
|
104
|
+
...options,
|
|
105
|
+
method: "PUT",
|
|
106
|
+
url,
|
|
107
|
+
data,
|
|
108
|
+
})
|
|
109
|
+
.then((r) => r.data)
|
|
110
|
+
.catch((e: any) => {
|
|
111
|
+
if (e.isAxiosError) {
|
|
112
|
+
return this.handleError(e);
|
|
113
|
+
} else {
|
|
114
|
+
throw e;
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Send a POST request. Returns the parsed response body directly (not an
|
|
121
|
+
* axios Response wrapper). On HTTP errors, returns the error as JSON instead
|
|
122
|
+
* of throwing.
|
|
123
|
+
* @param url - Request path relative to baseURL
|
|
124
|
+
* @param data - Request body
|
|
125
|
+
* @param options - Additional axios request config
|
|
126
|
+
* @returns Parsed response body
|
|
127
|
+
*/
|
|
128
|
+
async post(url: string, data: any = {}, options: AxiosRequestConfig = {}): Promise<any> {
|
|
129
|
+
await this.beforeRequest();
|
|
130
|
+
return this.axios({
|
|
131
|
+
...options,
|
|
132
|
+
method: "POST",
|
|
133
|
+
url,
|
|
134
|
+
data,
|
|
135
|
+
})
|
|
136
|
+
.then((r) => r.data)
|
|
137
|
+
.catch((e: any) => {
|
|
138
|
+
if (e.isAxiosError) {
|
|
139
|
+
return this.handleError(e);
|
|
140
|
+
} else {
|
|
141
|
+
throw e;
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Send a DELETE request. Returns the parsed response body directly (not an
|
|
148
|
+
* axios Response wrapper). On HTTP errors, returns the error as JSON instead
|
|
149
|
+
* of throwing.
|
|
150
|
+
* @param url - Request path relative to baseURL
|
|
151
|
+
* @param params - Query parameters
|
|
152
|
+
* @param options - Additional axios request config
|
|
153
|
+
* @returns Parsed response body
|
|
154
|
+
*/
|
|
155
|
+
async delete(url: string, params: any = {}, options: AxiosRequestConfig = {}): Promise<any> {
|
|
156
|
+
await this.beforeRequest();
|
|
157
|
+
return this.axios({
|
|
158
|
+
...options,
|
|
159
|
+
method: "DELETE",
|
|
160
|
+
url,
|
|
161
|
+
params,
|
|
162
|
+
})
|
|
163
|
+
.then((r) => r.data)
|
|
164
|
+
.catch((e: any) => {
|
|
165
|
+
if (e.isAxiosError) {
|
|
166
|
+
return this.handleError(e);
|
|
167
|
+
} else {
|
|
168
|
+
throw e;
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Send a GET request. Returns the parsed response body directly (not an
|
|
175
|
+
* axios Response wrapper). On HTTP errors, returns the error as JSON instead
|
|
176
|
+
* of throwing.
|
|
177
|
+
* @param url - Request path relative to baseURL
|
|
178
|
+
* @param params - Query parameters
|
|
179
|
+
* @param options - Additional axios request config
|
|
180
|
+
* @returns Parsed response body
|
|
181
|
+
*/
|
|
182
|
+
async get(url: string, params: any = {}, options: AxiosRequestConfig = {}): Promise<any> {
|
|
183
|
+
await this.beforeRequest()
|
|
184
|
+
return this.axios({
|
|
185
|
+
...options,
|
|
186
|
+
method: "GET",
|
|
187
|
+
url,
|
|
188
|
+
params,
|
|
189
|
+
})
|
|
190
|
+
.then((r) => r.data)
|
|
191
|
+
.catch((e: any) => {
|
|
192
|
+
if (e.isAxiosError) {
|
|
193
|
+
return this.handleError(e);
|
|
194
|
+
} else {
|
|
195
|
+
throw e;
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/** Handle an axios error by emitting 'failure' and returning the error as JSON. */
|
|
201
|
+
async handleError(error: AxiosError): Promise<object> {
|
|
202
|
+
this.emit('failure', error)
|
|
203
|
+
return error.toJSON();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export default RestClient
|