@elizaos/plugin-xai 2.0.0-alpha.5 → 2.0.0-beta.1
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/LICENSE +21 -0
- package/README.md +20 -19
- package/auto-enable.ts +17 -0
- package/dist/browser/index.browser.js +3 -3
- package/dist/browser/index.browser.js.map +5 -5
- package/dist/cjs/index.node.cjs +362 -11054
- package/dist/cjs/index.node.js.map +5 -110
- package/dist/index.browser.d.ts +2 -5
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/models/grok.d.ts.map +1 -1
- package/dist/node/index.node.js +339 -11104
- package/dist/node/index.node.js.map +5 -110
- package/package.json +34 -100
- package/dist/actions/post.d.ts +0 -3
- package/dist/actions/post.d.ts.map +0 -1
- package/dist/base.d.ts +0 -55
- package/dist/base.d.ts.map +0 -1
- package/dist/client/api-types.d.ts +0 -28
- package/dist/client/api-types.d.ts.map +0 -1
- package/dist/client/auth-providers/broker.d.ts +0 -19
- package/dist/client/auth-providers/broker.d.ts.map +0 -1
- package/dist/client/auth-providers/env.d.ts +0 -20
- package/dist/client/auth-providers/env.d.ts.map +0 -1
- package/dist/client/auth-providers/factory.d.ts +0 -5
- package/dist/client/auth-providers/factory.d.ts.map +0 -1
- package/dist/client/auth-providers/interactive.d.ts +0 -7
- package/dist/client/auth-providers/interactive.d.ts.map +0 -1
- package/dist/client/auth-providers/oauth2-pkce.d.ts +0 -24
- package/dist/client/auth-providers/oauth2-pkce.d.ts.map +0 -1
- package/dist/client/auth-providers/pkce.d.ts +0 -5
- package/dist/client/auth-providers/pkce.d.ts.map +0 -1
- package/dist/client/auth-providers/token-store.d.ts +0 -31
- package/dist/client/auth-providers/token-store.d.ts.map +0 -1
- package/dist/client/auth-providers/types.d.ts +0 -35
- package/dist/client/auth-providers/types.d.ts.map +0 -1
- package/dist/client/auth.d.ts +0 -38
- package/dist/client/auth.d.ts.map +0 -1
- package/dist/client/client.d.ts +0 -462
- package/dist/client/client.d.ts.map +0 -1
- package/dist/client/errors.d.ts +0 -72
- package/dist/client/errors.d.ts.map +0 -1
- package/dist/client/index.d.ts +0 -21
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/posts.d.ts +0 -325
- package/dist/client/posts.d.ts.map +0 -1
- package/dist/client/profile.d.ts +0 -140
- package/dist/client/profile.d.ts.map +0 -1
- package/dist/client/relationships.d.ts +0 -47
- package/dist/client/relationships.d.ts.map +0 -1
- package/dist/client/search.d.ts +0 -48
- package/dist/client/search.d.ts.map +0 -1
- package/dist/client/types.d.ts +0 -24
- package/dist/client/types.d.ts.map +0 -1
- package/dist/constants.d.ts +0 -5
- package/dist/constants.d.ts.map +0 -1
- package/dist/discovery.d.ts +0 -37
- package/dist/discovery.d.ts.map +0 -1
- package/dist/environment.d.ts +0 -40
- package/dist/environment.d.ts.map +0 -1
- package/dist/generated/prompts/typescript/prompts.d.ts +0 -22
- package/dist/generated/prompts/typescript/prompts.d.ts.map +0 -1
- package/dist/generated/specs/spec-helpers.d.ts +0 -49
- package/dist/generated/specs/spec-helpers.d.ts.map +0 -1
- package/dist/generated/specs/specs.d.ts +0 -65
- package/dist/generated/specs/specs.d.ts.map +0 -1
- package/dist/interactions.d.ts +0 -129
- package/dist/interactions.d.ts.map +0 -1
- package/dist/post.d.ts +0 -43
- package/dist/post.d.ts.map +0 -1
- package/dist/services/x.service.d.ts +0 -23
- package/dist/services/x.service.d.ts.map +0 -1
- package/dist/templates.d.ts +0 -6
- package/dist/templates.d.ts.map +0 -1
- package/dist/timeline.d.ts +0 -46
- package/dist/timeline.d.ts.map +0 -1
- package/dist/types.d.ts +0 -150
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/error-handler.d.ts +0 -20
- package/dist/utils/error-handler.d.ts.map +0 -1
- package/dist/utils/memory.d.ts +0 -21
- package/dist/utils/memory.d.ts.map +0 -1
- package/dist/utils/settings.d.ts +0 -3
- package/dist/utils/settings.d.ts.map +0 -1
- package/dist/utils/time.d.ts +0 -2
- package/dist/utils/time.d.ts.map +0 -1
- package/dist/utils.d.ts +0 -36
- package/dist/utils.d.ts.map +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Shaw Walters and elizaOS Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
# @elizaos/plugin-xai
|
|
1
|
+
# @elizaos/plugin-xai
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
xAI Grok models for elizaOS — text generation and embeddings.
|
|
4
|
+
|
|
5
|
+
For X (formerly Twitter) social posting, mentions, and timeline interactions,
|
|
6
|
+
use [`@elizaos/plugin-x`](../plugin-x) instead. This package is
|
|
7
|
+
intentionally Grok-only.
|
|
4
8
|
|
|
5
9
|
## Installation
|
|
6
10
|
|
|
7
11
|
```bash
|
|
8
|
-
|
|
12
|
+
bun add @elizaos/plugin-xai
|
|
9
13
|
```
|
|
10
14
|
|
|
11
15
|
## Usage
|
|
@@ -14,34 +18,31 @@ pnpm add @elizaos/plugin-xai
|
|
|
14
18
|
import { XAIPlugin } from "@elizaos/plugin-xai";
|
|
15
19
|
import { AgentRuntime, ModelType } from "@elizaos/core";
|
|
16
20
|
|
|
17
|
-
// Register plugin
|
|
18
21
|
const runtime = new AgentRuntime({
|
|
19
22
|
plugins: [XAIPlugin],
|
|
20
23
|
});
|
|
21
24
|
|
|
22
|
-
// Use Grok models
|
|
23
25
|
const text = await runtime.useModel(ModelType.TEXT_SMALL, {
|
|
24
26
|
prompt: "Explain quantum computing",
|
|
25
27
|
});
|
|
26
|
-
|
|
27
|
-
// Use X service
|
|
28
|
-
const xService = runtime.getService("x") as XService;
|
|
29
|
-
const profile = await xService.xClient.client.xClient.me();
|
|
30
|
-
console.log(`@${profile.username}`);
|
|
31
28
|
```
|
|
32
29
|
|
|
33
|
-
##
|
|
30
|
+
## Configuration
|
|
34
31
|
|
|
35
|
-
|
|
36
|
-
# Build
|
|
37
|
-
bun run build
|
|
32
|
+
Set `XAI_API_KEY` and (optionally) override defaults:
|
|
38
33
|
|
|
39
|
-
|
|
40
|
-
|
|
34
|
+
| Variable | Default | Description |
|
|
35
|
+
| --------------------- | -------------------- | ----------------------------------- |
|
|
36
|
+
| `XAI_API_KEY` | — | Required. xAI API key. |
|
|
37
|
+
| `XAI_MODEL` | `grok-3` | Large/default text-generation model. |
|
|
38
|
+
| `XAI_SMALL_MODEL` | `grok-3-mini` | Smaller/faster text model. |
|
|
39
|
+
| `XAI_EMBEDDING_MODEL` | `grok-embedding` | Embedding model. |
|
|
40
|
+
| `XAI_BASE_URL` | `https://api.x.ai/v1`| API base URL. |
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
bun run lint
|
|
42
|
+
## Development
|
|
44
43
|
|
|
45
|
-
|
|
44
|
+
```bash
|
|
45
|
+
bun run build
|
|
46
|
+
bun run test
|
|
46
47
|
bun run typecheck
|
|
47
48
|
```
|
package/auto-enable.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Auto-enable check for @elizaos/plugin-xai.
|
|
2
|
+
//
|
|
3
|
+
// Plugin manifest entry-point — referenced by package.json's
|
|
4
|
+
// `elizaos.plugin.autoEnableModule`. Keep this module light: env reads only,
|
|
5
|
+
// no service init, no transitive imports of the full plugin runtime. The
|
|
6
|
+
// auto-enable engine loads dozens of these per boot.
|
|
7
|
+
import type { PluginAutoEnableContext } from "@elizaos/core";
|
|
8
|
+
|
|
9
|
+
const ENV_KEYS = ["XAI_API_KEY", "GROK_API_KEY"] as const;
|
|
10
|
+
|
|
11
|
+
/** Enable when an xAI / Grok API key is present. */
|
|
12
|
+
export function shouldEnable(ctx: PluginAutoEnableContext): boolean {
|
|
13
|
+
return ENV_KEYS.some((k) => {
|
|
14
|
+
const v = ctx.env[k];
|
|
15
|
+
return typeof v === "string" && v.trim() !== "";
|
|
16
|
+
});
|
|
17
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{logger as
|
|
2
|
-
`);for(let
|
|
1
|
+
import{logger as V,ModelType as J}from"@elizaos/core";import{EventType as m,logger as F,ModelType as W,recordLlmCall as h}from"@elizaos/core";var t="https://api.x.ai/v1",D={small:"grok-3-mini",large:"grok-3",embedding:"grok-embedding"};function M(I){let _=I.getSetting("XAI_API_KEY");if(!_||typeof _!=="string")throw Error("XAI_API_KEY is required");let G=I.getSetting("XAI_BASE_URL"),A=I.getSetting("XAI_SMALL_MODEL"),E=I.getSetting("XAI_MODEL")||I.getSetting("XAI_LARGE_MODEL"),P=I.getSetting("XAI_EMBEDDING_MODEL");return{apiKey:_,baseUrl:typeof G==="string"?G:t,smallModel:typeof A==="string"?A:D.small,largeModel:typeof E==="string"?E:D.large,embeddingModel:typeof P==="string"?P:D.embedding}}function S(I){return{Authorization:`Bearer ${I.apiKey}`,"Content-Type":"application/json"}}function s(I){if(!I)return;if(Array.isArray(I))return I.map((_)=>T(_)).filter((_)=>_!==void 0);if(typeof I==="object"){let _=[];for(let[G,A]of Object.entries(I)){let E=T({...A,name:G});if(E)_.push(E)}return _.length>0?_:void 0}return}function T(I){let _=I.name??I.function?.name;if(!_)return;let G=I.description??I.function?.description,A=I.parameters??I.function?.parameters??I.inputSchema??{type:"object"};return{type:"function",function:{name:_,...G?{description:G}:{},parameters:A}}}function r(I){if(!I)return;if(typeof I==="string"&&(I==="auto"||I==="none"||I==="required"))return I;let _=I;if(_.type==="function")return I;if(_.type==="tool"&&typeof _.toolName==="string")return{type:"function",function:{name:_.toolName}};if(typeof _.name==="string")return{type:"function",function:{name:_.name}};return}function a(I){if(!I)return;let _=I,G=_.schema??I;return{type:"json_schema",json_schema:{name:typeof _.name==="string"?_.name:"structured_response",schema:G,strict:!0}}}function H(I){if(typeof I!=="number"||!Number.isFinite(I))return;return Math.max(0,Math.round(I))}function Z(I){if(!I||typeof I!=="object")return null;let _=I,G=H(_.prompt_tokens??_.inputTokens),A=H(_.completion_tokens??_.outputTokens),E=H(_.total_tokens??_.totalTokens);if(G===void 0&&A===void 0&&E===void 0)return null;let P=G??(A===void 0&&E!==void 0?E:Math.max(0,(E??0)-(A??0))),K=A??Math.max(0,(E??P)-P);return{promptTokens:P,completionTokens:K,totalTokens:E??P+K}}function x(I){return I.length===0?0:Math.ceil(I.length/4)}function g(I,_){let G=x(I),A=x(typeof _==="string"?_:String(_));return{promptTokens:G,completionTokens:A,totalTokens:G+A,estimated:!0}}function o(I){let _=x(I);return{promptTokens:_,completionTokens:0,totalTokens:_,estimated:!0}}function y(I,_,G,A){I.emitEvent(m.MODEL_USED,{runtime:I,source:"xai",provider:"xai",type:_,model:G,modelName:G,tokens:{prompt:A.promptTokens,completion:A.completionTokens,total:A.totalTokens,...A.estimated?{estimated:!0}:{}},...A.estimated?{usageEstimated:!0}:{}})}async function d(I,_,G,A,E){let P=E,K=E.prompt??"",f=s(P.tools),b=r(P.toolChoice),z=a(P.responseSchema),U=Boolean(P.messages||P.tools||P.toolChoice||P.responseSchema),p=P.messages?.length?P.messages:[{role:"user",content:K}],R={model:A,messages:p};if(E.temperature!==void 0)R.temperature=E.temperature;if(E.maxTokens!==void 0)R.max_tokens=E.maxTokens;if(E.stopSequences)R.stop=E.stopSequences;if(f)R.tools=f;if(b)R.tool_choice=b;if(z)R.response_format=z;if(E.stream&&E.onStreamChunk){R.stream=!0;let X=E.onStreamChunk;return h(I,{model:A,systemPrompt:"",userPrompt:K,temperature:E.temperature??0,maxTokens:E.maxTokens??0,purpose:"external_llm",actionType:"xai.chat.completions.stream"},async()=>{let $=await fetch(`${_.baseUrl}/chat/completions`,{method:"POST",headers:S(_),body:JSON.stringify(R)});if(!$.ok){let Y=await $.text();throw Error(`Grok API error (${$.status}): ${Y}`)}let B=$.body?.getReader();if(!B)throw Error("No response body");let j=new TextDecoder,q="",w=null,L=A;while(!0){let{done:Y,value:n}=await B.read();if(Y)break;let l=j.decode(n).split(`
|
|
2
|
+
`);for(let k of l){if(!k.startsWith("data: "))continue;let v=k.slice(6);if(v==="[DONE]")continue;let Q=JSON.parse(v),C=Z(Q.usage);if(C)w=C;if(typeof Q.model==="string"&&Q.model.length>0)L=Q.model;let O=Q.choices?.[0]?.delta?.content;if(O)q+=O,X(O)}}return y(I,G,L,w??g(K,q)),q})}return h(I,{model:A,systemPrompt:"",userPrompt:K,temperature:E.temperature??0,maxTokens:E.maxTokens??0,purpose:"external_llm",actionType:"xai.chat.completions.create"},async()=>{let X=await fetch(`${_.baseUrl}/chat/completions`,{method:"POST",headers:S(_),body:JSON.stringify(R)});if(!X.ok){let w=await X.text();throw Error(`Grok API error (${X.status}): ${w}`)}let $=await X.json(),B=$.choices?.[0],j=B?.message?.content??"",q=B?.message?.tool_calls??[];if(!U&&!j)throw Error("No content in Grok response");if(y(I,G,$.model||A,Z($.usage)??g(E.prompt??"",j)),U){let w=Z($.usage);return{text:j,toolCalls:q.map((Y)=>({toolCallId:Y.id,toolName:Y.function.name,input:e(Y.function.arguments)})),finishReason:B?.finish_reason,...w?{usage:{promptTokens:w.promptTokens,completionTokens:w.completionTokens,totalTokens:w.totalTokens}}:{}}}return j})}function e(I){if(typeof I!=="string")return I;try{return JSON.parse(I)}catch{return I}}async function II(I,_,G){let A=await fetch(`${_.baseUrl}/embeddings`,{method:"POST",headers:S(_),body:JSON.stringify({model:_.embeddingModel,input:G})});if(!A.ok){let P=await A.text();throw Error(`Grok Embedding API error (${A.status}): ${P}`)}let E=await A.json();if(!E.data?.[0]?.embedding)throw Error("No embedding in Grok response");return y(I,W.TEXT_EMBEDDING,E.model||_.embeddingModel,Z(E.usage)??o(G)),E.data[0].embedding}async function c(I,_){let G=M(I);return F.debug(`[Grok] Generating text with model: ${G.smallModel}`),await d(I,G,W.TEXT_SMALL,G.smallModel,_)}async function u(I,_){let G=M(I);return F.debug(`[Grok] Generating text with model: ${G.largeModel}`),await d(I,G,W.TEXT_LARGE,G.largeModel,_)}async function i(I,_){if(_===null)throw Error("Null params provided for embedding");let G=M(I),A=typeof _==="string"?_:_.text;if(!A)throw Error("Empty text provided for embedding");return F.debug(`[Grok] Creating embedding with model: ${G.embeddingModel}`),II(I,G,A)}function N(I){return!!I.getSetting("XAI_API_KEY")}var RI={name:"xai",description:"xAI Grok models for text generation and embeddings",autoEnable:{envKeys:["XAI_API_KEY","GROK_API_KEY"]},init:async(I,_)=>{if(V.log("Initializing xAI plugin..."),N(_))V.log("✓ Grok API configured");else V.warn("XAI_API_KEY not set; Grok models will fail at call time.")},models:{[J.TEXT_SMALL]:c,[J.TEXT_LARGE]:u,[J.TEXT_EMBEDDING]:i},tests:[{name:"xai_plugin_tests",tests:[{name:"grok_api_connectivity",fn:async(I)=>{let _=I.getSetting("XAI_API_KEY");if(!_)return;let G=I.getSetting("XAI_BASE_URL")||"https://api.x.ai/v1",A=await fetch(`${G}/models`,{headers:{Authorization:`Bearer ${_}`}});if(!A.ok)throw Error(`Grok API error: ${A.status}`);let E=await A.json();V.info(`Grok connected: ${E.data.length} models`)}},{name:"grok_text_generation",fn:async(I)=>{if(!N(I))return;let _=await I.useModel(J.TEXT_SMALL,{prompt:"Say hello in exactly 5 words."});if(typeof _!=="string"||!_)throw Error("Expected non-empty string");V.info(`Generated: "${_.slice(0,50)}..."`)}}]}]};export{XI as default,RI as XAIPlugin};
|
|
3
3
|
|
|
4
|
-
//# debugId=
|
|
4
|
+
//# debugId=CC6D39C862491DE864756E2164756E21
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../index.
|
|
3
|
+
"sources": ["../../index.ts", "../../models/grok.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type
|
|
6
|
-
"import {\n type GenerateTextParams,\n type IAgentRuntime,\n logger,\n type TextEmbeddingParams,\n type TextStreamResult,\n} from \"@elizaos/core\";\n\nconst XAI_API_BASE = \"https://api.x.ai/v1\";\n\nconst DEFAULT_MODELS = {\n small: \"grok-3-mini\",\n large: \"grok-3\",\n embedding: \"grok-embedding\",\n} as const;\n\ninterface GrokConfig {\n apiKey: string;\n baseUrl: string;\n smallModel: string;\n largeModel: string;\n embeddingModel: string;\n}\n\nfunction getConfig(runtime: IAgentRuntime): GrokConfig {\n const apiKey = runtime.getSetting(\"XAI_API_KEY\");\n if (!apiKey || typeof apiKey !== \"string\") {\n throw new Error(\"XAI_API_KEY is required\");\n }\n\n const baseUrl = runtime.getSetting(\"XAI_BASE_URL\");\n const smallModel = runtime.getSetting(\"XAI_SMALL_MODEL\");\n const largeModel = runtime.getSetting(\"XAI_MODEL\") || runtime.getSetting(\"XAI_LARGE_MODEL\");\n const embeddingModel = runtime.getSetting(\"XAI_EMBEDDING_MODEL\");\n\n return {\n apiKey,\n baseUrl: typeof baseUrl === \"string\" ? baseUrl : XAI_API_BASE,\n smallModel: typeof smallModel === \"string\" ? smallModel : DEFAULT_MODELS.small,\n largeModel: typeof largeModel === \"string\" ? largeModel : DEFAULT_MODELS.large,\n embeddingModel: typeof embeddingModel === \"string\" ? embeddingModel : DEFAULT_MODELS.embedding,\n };\n}\n\nfunction getAuthHeader(config: GrokConfig): Record<string, string> {\n return {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n}\n\ninterface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\ninterface ChatCompletionResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: string;\n content: string;\n };\n finish_reason: string;\n }>;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\ninterface EmbeddingResponse {\n object: string;\n data: Array<{\n object: string;\n embedding: number[];\n index: number;\n }>;\n model: string;\n usage: {\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n\nasync function generateText(\n config: GrokConfig,\n model: string,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n const messages: ChatMessage[] = [];\n messages.push({ role: \"user\", content: params.prompt });\n\n const body: Record<string, unknown> = {\n model,\n messages,\n };\n\n if (params.temperature !== undefined) {\n body.temperature = params.temperature;\n }\n if (params.maxTokens !== undefined) {\n body.max_tokens = params.maxTokens;\n }\n if (params.stopSequences) {\n body.stop = params.stopSequences;\n }\n\n if (params.stream && params.onStreamChunk) {\n body.stream = true;\n\n const response = await fetch(`${config.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: getAuthHeader(config),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok API error (${response.status}): ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n let fullText = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const data = line.slice(6);\n if (data === \"[DONE]\") continue;\n\n const parsed = JSON.parse(data);\n const content = parsed.choices[0].delta?.content;\n if (content) {\n fullText += content;\n params.onStreamChunk(content);\n }\n }\n }\n\n return fullText;\n }\n\n const response = await fetch(`${config.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: getAuthHeader(config),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok API error (${response.status}): ${error}`);\n }\n\n const data = (await response.json()) as ChatCompletionResponse;\n\n if (!data.choices?.[0]?.message?.content) {\n throw new Error(\"No content in Grok response\");\n }\n\n return data.choices[0].message.content;\n}\n\nasync function createEmbedding(config: GrokConfig, text: string): Promise<number[]> {\n const response = await fetch(`${config.baseUrl}/embeddings`, {\n method: \"POST\",\n headers: getAuthHeader(config),\n body: JSON.stringify({\n model: config.embeddingModel,\n input: text,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok Embedding API error (${response.status}): ${error}`);\n }\n\n const data = (await response.json()) as EmbeddingResponse;\n\n if (!data.data?.[0]?.embedding) {\n throw new Error(\"No embedding in Grok response\");\n }\n\n return data.data[0].embedding;\n}\n\nexport async function handleTextSmall(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n const config = getConfig(runtime);\n logger.debug(`[Grok] Generating text with model: ${config.smallModel}`);\n return generateText(config, config.smallModel, params);\n}\n\nexport async function handleTextLarge(\n runtime: IAgentRuntime,\n params: GenerateTextParams\n): Promise<string | TextStreamResult> {\n const config = getConfig(runtime);\n logger.debug(`[Grok] Generating text with model: ${config.largeModel}`);\n return generateText(config, config.largeModel, params);\n}\n\nexport async function handleTextEmbedding(\n runtime: IAgentRuntime,\n params: TextEmbeddingParams | string | null\n): Promise<number[]> {\n if (params === null) {\n throw new Error(\"Null params provided for embedding\");\n }\n const config = getConfig(runtime);\n const text = typeof params === \"string\" ? params : (params as TextEmbeddingParams).text;\n if (!text) {\n throw new Error(\"Empty text provided for embedding\");\n }\n logger.debug(`[Grok] Creating embedding with model: ${config.embeddingModel}`);\n return createEmbedding(config, text);\n}\n\nexport async function listModels(runtime: IAgentRuntime): Promise<Record<string, unknown>[]> {\n const config = getConfig(runtime);\n\n const response = await fetch(`${config.baseUrl}/models`, {\n headers: getAuthHeader(config),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok API error (${response.status}): ${error}`);\n }\n\n const data = (await response.json()) as { data: Record<string, unknown>[] };\n return data.data;\n}\n\nexport function isGrokConfigured(runtime: IAgentRuntime): boolean {\n return !!runtime.getSetting(\"XAI_API_KEY\");\n}\n"
|
|
5
|
+
"import {\n type IAgentRuntime,\n logger,\n ModelType,\n type Plugin,\n} from \"@elizaos/core\";\nimport {\n handleTextEmbedding,\n handleTextLarge,\n handleTextSmall,\n isGrokConfigured,\n} from \"./models/grok\";\n\nexport const XAIPlugin: Plugin = {\n name: \"xai\",\n description: \"xAI Grok models for text generation and embeddings\",\n autoEnable: {\n envKeys: [\"XAI_API_KEY\", \"GROK_API_KEY\"],\n },\n\n init: async (_config: Record<string, string>, runtime: IAgentRuntime) => {\n logger.log(\"Initializing xAI plugin...\");\n if (isGrokConfigured(runtime)) {\n logger.log(\"✓ Grok API configured\");\n } else {\n logger.warn(\"XAI_API_KEY not set; Grok models will fail at call time.\");\n }\n },\n\n models: {\n [ModelType.TEXT_SMALL]: handleTextSmall,\n [ModelType.TEXT_LARGE]: handleTextLarge,\n [ModelType.TEXT_EMBEDDING]: handleTextEmbedding,\n },\n\n tests: [\n {\n name: \"xai_plugin_tests\",\n tests: [\n {\n name: \"grok_api_connectivity\",\n fn: async (runtime: IAgentRuntime): Promise<void> => {\n const apiKey = runtime.getSetting(\"XAI_API_KEY\");\n if (!apiKey) return;\n\n const baseUrl =\n runtime.getSetting(\"XAI_BASE_URL\") || \"https://api.x.ai/v1\";\n const response = await fetch(`${baseUrl}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n });\n\n if (!response.ok) {\n throw new Error(`Grok API error: ${response.status}`);\n }\n\n const data = (await response.json()) as { data: unknown[] };\n logger.info(`Grok connected: ${data.data.length} models`);\n },\n },\n {\n name: \"grok_text_generation\",\n fn: async (runtime: IAgentRuntime): Promise<void> => {\n if (!isGrokConfigured(runtime)) return;\n\n const text = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: \"Say hello in exactly 5 words.\",\n });\n\n if (typeof text !== \"string\" || !text) {\n throw new Error(\"Expected non-empty string\");\n }\n\n logger.info(`Generated: \"${text.slice(0, 50)}...\"`);\n },\n },\n ],\n },\n ],\n};\n\nexport default XAIPlugin;\n",
|
|
6
|
+
"import {\n EventType,\n type EventPayload,\n type GenerateTextParams,\n type IAgentRuntime,\n logger,\n type ModelTypeName,\n ModelType,\n type TextEmbeddingParams,\n type TextStreamResult,\n recordLlmCall,\n} from \"@elizaos/core\";\n\nconst XAI_API_BASE = \"https://api.x.ai/v1\";\n\nconst DEFAULT_MODELS = {\n small: \"grok-3-mini\",\n large: \"grok-3\",\n embedding: \"grok-embedding\",\n} as const;\n\ninterface GrokConfig {\n apiKey: string;\n baseUrl: string;\n smallModel: string;\n largeModel: string;\n embeddingModel: string;\n}\n\nfunction getConfig(runtime: IAgentRuntime): GrokConfig {\n const apiKey = runtime.getSetting(\"XAI_API_KEY\");\n if (!apiKey || typeof apiKey !== \"string\") {\n throw new Error(\"XAI_API_KEY is required\");\n }\n\n const baseUrl = runtime.getSetting(\"XAI_BASE_URL\");\n const smallModel = runtime.getSetting(\"XAI_SMALL_MODEL\");\n const largeModel =\n runtime.getSetting(\"XAI_MODEL\") || runtime.getSetting(\"XAI_LARGE_MODEL\");\n const embeddingModel = runtime.getSetting(\"XAI_EMBEDDING_MODEL\");\n\n return {\n apiKey,\n baseUrl: typeof baseUrl === \"string\" ? baseUrl : XAI_API_BASE,\n smallModel:\n typeof smallModel === \"string\" ? smallModel : DEFAULT_MODELS.small,\n largeModel:\n typeof largeModel === \"string\" ? largeModel : DEFAULT_MODELS.large,\n embeddingModel:\n typeof embeddingModel === \"string\"\n ? embeddingModel\n : DEFAULT_MODELS.embedding,\n };\n}\n\nfunction getAuthHeader(config: GrokConfig): Record<string, string> {\n return {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n}\n\ninterface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | unknown[];\n tool_call_id?: string;\n tool_calls?: unknown[];\n name?: string;\n}\n\ninterface ChatCompletionResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: string;\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n };\n finish_reason: string;\n }>;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\ninterface XaiNativeTextResult {\n text: string;\n toolCalls: Array<{ toolCallId: string; toolName: string; input: unknown }>;\n finishReason?: string;\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n}\n\ntype XaiToolDefinition = {\n type?: \"function\";\n name?: string;\n description?: string;\n parameters?: unknown;\n inputSchema?: unknown;\n function?: { name?: string; description?: string; parameters?: unknown };\n};\n\ntype XaiToolChoice =\n | \"auto\"\n | \"none\"\n | \"required\"\n | { type: \"function\"; function: { name: string } }\n | { type: \"tool\"; toolName: string }\n | { name: string };\n\nfunction normalizeXaiTools(tools: unknown): unknown[] | undefined {\n if (!tools) return undefined;\n if (Array.isArray(tools)) {\n return tools\n .map((tool) => normalizeXaiTool(tool as XaiToolDefinition))\n .filter((tool): tool is Record<string, unknown> => tool !== undefined);\n }\n if (typeof tools === \"object\") {\n const out: Record<string, unknown>[] = [];\n for (const [name, value] of Object.entries(\n tools as Record<string, XaiToolDefinition>,\n )) {\n const normalized = normalizeXaiTool({ ...value, name });\n if (normalized) out.push(normalized);\n }\n return out.length > 0 ? out : undefined;\n }\n return undefined;\n}\n\nfunction normalizeXaiTool(\n tool: XaiToolDefinition,\n): Record<string, unknown> | undefined {\n const name = tool.name ?? tool.function?.name;\n if (!name) return undefined;\n const description = tool.description ?? tool.function?.description;\n const parameters = tool.parameters ??\n tool.function?.parameters ??\n tool.inputSchema ?? { type: \"object\" };\n return {\n type: \"function\",\n function: {\n name,\n ...(description ? { description } : {}),\n parameters,\n },\n };\n}\n\nfunction normalizeXaiToolChoice(toolChoice: unknown): unknown {\n if (!toolChoice) return undefined;\n if (\n typeof toolChoice === \"string\" &&\n (toolChoice === \"auto\" ||\n toolChoice === \"none\" ||\n toolChoice === \"required\")\n ) {\n return toolChoice;\n }\n const choice = toolChoice as Record<string, unknown>;\n if (choice.type === \"function\") return toolChoice;\n if (choice.type === \"tool\" && typeof choice.toolName === \"string\") {\n return { type: \"function\", function: { name: choice.toolName } };\n }\n if (typeof choice.name === \"string\") {\n return { type: \"function\", function: { name: choice.name } };\n }\n return undefined;\n}\n\nfunction buildXaiResponseFormat(responseSchema: unknown): unknown {\n if (!responseSchema) return undefined;\n const r = responseSchema as Record<string, unknown>;\n const schema = (r.schema ?? responseSchema) as Record<string, unknown>;\n const name = typeof r.name === \"string\" ? r.name : \"structured_response\";\n return {\n type: \"json_schema\",\n json_schema: { name, schema, strict: true },\n };\n}\n\ninterface StreamCompletionChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n };\n }>;\n usage?: OpenAIUsage;\n model?: string;\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n}\n\ninterface EmbeddingResponse {\n object: string;\n data: Array<{\n object: string;\n embedding: number[];\n index: number;\n }>;\n model: string;\n usage: {\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n\ntype NormalizedUsage = {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n estimated?: boolean;\n};\n\nfunction toFiniteNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return undefined;\n }\n return Math.max(0, Math.round(value));\n}\n\nfunction normalizeTokenUsage(usage: unknown): NormalizedUsage | null {\n if (!usage || typeof usage !== \"object\") {\n return null;\n }\n\n const record = usage as OpenAIUsage;\n const promptTokens = toFiniteNumber(\n record.prompt_tokens ?? record.inputTokens,\n );\n const completionTokens = toFiniteNumber(\n record.completion_tokens ?? record.outputTokens,\n );\n const totalTokens = toFiniteNumber(record.total_tokens ?? record.totalTokens);\n\n if (\n promptTokens === undefined &&\n completionTokens === undefined &&\n totalTokens === undefined\n ) {\n return null;\n }\n\n const normalizedPromptTokens =\n promptTokens ??\n (completionTokens === undefined && totalTokens !== undefined\n ? totalTokens\n : Math.max(0, (totalTokens ?? 0) - (completionTokens ?? 0)));\n const normalizedCompletionTokens =\n completionTokens ??\n Math.max(\n 0,\n (totalTokens ?? normalizedPromptTokens) - normalizedPromptTokens,\n );\n\n return {\n promptTokens: normalizedPromptTokens,\n completionTokens: normalizedCompletionTokens,\n totalTokens:\n totalTokens ?? normalizedPromptTokens + normalizedCompletionTokens,\n };\n}\n\nfunction estimateTokenCount(text: string): number {\n return text.length === 0 ? 0 : Math.ceil(text.length / 4);\n}\n\nfunction estimateUsage(prompt: string, response: unknown): NormalizedUsage {\n const promptTokens = estimateTokenCount(prompt);\n const completionTokens = estimateTokenCount(\n typeof response === \"string\" ? response : String(response),\n );\n return {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n estimated: true,\n };\n}\n\nfunction estimateEmbeddingUsage(text: string): NormalizedUsage {\n const promptTokens = estimateTokenCount(text);\n return {\n promptTokens,\n completionTokens: 0,\n totalTokens: promptTokens,\n estimated: true,\n };\n}\n\nfunction emitModelUsed(\n runtime: IAgentRuntime,\n type: ModelTypeName,\n model: string,\n usage: NormalizedUsage,\n): void {\n void runtime.emitEvent(\n EventType.MODEL_USED as string,\n {\n runtime,\n source: \"xai\",\n provider: \"xai\",\n type,\n model,\n modelName: model,\n tokens: {\n prompt: usage.promptTokens,\n completion: usage.completionTokens,\n total: usage.totalTokens,\n ...(usage.estimated ? { estimated: true } : {}),\n },\n ...(usage.estimated ? { usageEstimated: true } : {}),\n } as EventPayload,\n );\n}\n\nasync function generateText(\n runtime: IAgentRuntime,\n config: GrokConfig,\n modelType: ModelTypeName,\n model: string,\n params: GenerateTextParams,\n): Promise<string | TextStreamResult | XaiNativeTextResult> {\n const paramsWithNative = params as GenerateTextParams & {\n messages?: ChatMessage[];\n tools?: unknown;\n toolChoice?: XaiToolChoice;\n responseSchema?: unknown;\n };\n const promptText = params.prompt ?? \"\";\n const tools = normalizeXaiTools(paramsWithNative.tools);\n const toolChoice = normalizeXaiToolChoice(paramsWithNative.toolChoice);\n const responseFormat = buildXaiResponseFormat(\n paramsWithNative.responseSchema,\n );\n const returnNative = Boolean(\n paramsWithNative.messages ||\n paramsWithNative.tools ||\n paramsWithNative.toolChoice ||\n paramsWithNative.responseSchema,\n );\n\n const messages: ChatMessage[] = paramsWithNative.messages?.length\n ? (paramsWithNative.messages as ChatMessage[])\n : [{ role: \"user\", content: promptText }];\n\n const body: Record<string, unknown> = {\n model,\n messages,\n };\n\n if (params.temperature !== undefined) {\n body.temperature = params.temperature;\n }\n if (params.maxTokens !== undefined) {\n body.max_tokens = params.maxTokens;\n }\n if (params.stopSequences) {\n body.stop = params.stopSequences;\n }\n if (tools) {\n body.tools = tools;\n }\n if (toolChoice) {\n body.tool_choice = toolChoice;\n }\n if (responseFormat) {\n body.response_format = responseFormat;\n }\n\n if (params.stream && params.onStreamChunk) {\n body.stream = true;\n const onStreamChunk = params.onStreamChunk;\n\n return recordLlmCall(\n runtime,\n {\n model,\n systemPrompt: \"\",\n userPrompt: promptText,\n temperature: params.temperature ?? 0,\n maxTokens: params.maxTokens ?? 0,\n purpose: \"external_llm\",\n actionType: \"xai.chat.completions.stream\",\n },\n async () => {\n const response = await fetch(`${config.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: getAuthHeader(config),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok API error (${response.status}): ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n let fullText = \"\";\n let usage: NormalizedUsage | null = null;\n let responseModel = model;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const data = line.slice(6);\n if (data === \"[DONE]\") continue;\n\n const parsed = JSON.parse(data) as StreamCompletionChunk;\n const chunkUsage = normalizeTokenUsage(parsed.usage);\n if (chunkUsage) {\n usage = chunkUsage;\n }\n if (typeof parsed.model === \"string\" && parsed.model.length > 0) {\n responseModel = parsed.model;\n }\n\n const content = parsed.choices?.[0]?.delta?.content;\n if (content) {\n fullText += content;\n onStreamChunk(content);\n }\n }\n }\n\n emitModelUsed(\n runtime,\n modelType,\n responseModel,\n usage ?? estimateUsage(promptText, fullText),\n );\n return fullText;\n },\n );\n }\n\n return recordLlmCall(\n runtime,\n {\n model,\n systemPrompt: \"\",\n userPrompt: promptText,\n temperature: params.temperature ?? 0,\n maxTokens: params.maxTokens ?? 0,\n purpose: \"external_llm\",\n actionType: \"xai.chat.completions.create\",\n },\n async () => {\n const response = await fetch(`${config.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: getAuthHeader(config),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok API error (${response.status}): ${error}`);\n }\n\n const data = (await response.json()) as ChatCompletionResponse;\n\n const choice = data.choices?.[0];\n const rawText = choice?.message?.content ?? \"\";\n const rawToolCalls = choice?.message?.tool_calls ?? [];\n\n if (!returnNative && !rawText) {\n throw new Error(\"No content in Grok response\");\n }\n\n emitModelUsed(\n runtime,\n modelType,\n data.model || model,\n normalizeTokenUsage(data.usage) ??\n estimateUsage(params.prompt ?? \"\", rawText),\n );\n\n if (returnNative) {\n const usage = normalizeTokenUsage(data.usage);\n const native: XaiNativeTextResult = {\n text: rawText,\n toolCalls: rawToolCalls.map((tc) => ({\n toolCallId: tc.id,\n toolName: tc.function.name,\n input: parseJsonOrRaw(tc.function.arguments),\n })),\n finishReason: choice?.finish_reason,\n ...(usage\n ? {\n usage: {\n promptTokens: usage.promptTokens,\n completionTokens: usage.completionTokens,\n totalTokens: usage.totalTokens,\n },\n }\n : {}),\n };\n return native;\n }\n\n return rawText;\n },\n );\n}\n\nfunction parseJsonOrRaw(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\nasync function createEmbedding(\n runtime: IAgentRuntime,\n config: GrokConfig,\n text: string,\n): Promise<number[]> {\n const response = await fetch(`${config.baseUrl}/embeddings`, {\n method: \"POST\",\n headers: getAuthHeader(config),\n body: JSON.stringify({\n model: config.embeddingModel,\n input: text,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok Embedding API error (${response.status}): ${error}`);\n }\n\n const data = (await response.json()) as EmbeddingResponse;\n\n if (!data.data?.[0]?.embedding) {\n throw new Error(\"No embedding in Grok response\");\n }\n\n emitModelUsed(\n runtime,\n ModelType.TEXT_EMBEDDING,\n data.model || config.embeddingModel,\n normalizeTokenUsage(data.usage) ?? estimateEmbeddingUsage(text),\n );\n return data.data[0].embedding;\n}\n\nexport async function handleTextSmall(\n runtime: IAgentRuntime,\n params: GenerateTextParams,\n): Promise<string | TextStreamResult> {\n const config = getConfig(runtime);\n logger.debug(`[Grok] Generating text with model: ${config.smallModel}`);\n // Native result (with toolCalls) is cast through the string return type:\n // elizaOS's plugin Model handler signature is\n // `Promise<string | TextStreamResult>`. Consumers that pass `tools` /\n // `messages` / `responseSchema` / `toolChoice` unwrap the native shape from\n // `useModel`.\n return (await generateText(\n runtime,\n config,\n ModelType.TEXT_SMALL,\n config.smallModel,\n params,\n )) as string | TextStreamResult;\n}\n\nexport async function handleTextLarge(\n runtime: IAgentRuntime,\n params: GenerateTextParams,\n): Promise<string | TextStreamResult> {\n const config = getConfig(runtime);\n logger.debug(`[Grok] Generating text with model: ${config.largeModel}`);\n return (await generateText(\n runtime,\n config,\n ModelType.TEXT_LARGE,\n config.largeModel,\n params,\n )) as string | TextStreamResult;\n}\n\nexport async function handleTextEmbedding(\n runtime: IAgentRuntime,\n params: TextEmbeddingParams | string | null,\n): Promise<number[]> {\n if (params === null) {\n throw new Error(\"Null params provided for embedding\");\n }\n const config = getConfig(runtime);\n const text =\n typeof params === \"string\" ? params : (params as TextEmbeddingParams).text;\n if (!text) {\n throw new Error(\"Empty text provided for embedding\");\n }\n logger.debug(\n `[Grok] Creating embedding with model: ${config.embeddingModel}`,\n );\n return createEmbedding(runtime, config, text);\n}\n\nexport async function listModels(\n runtime: IAgentRuntime,\n): Promise<Record<string, unknown>[]> {\n const config = getConfig(runtime);\n\n const response = await fetch(`${config.baseUrl}/models`, {\n headers: getAuthHeader(config),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Grok API error (${response.status}): ${error}`);\n }\n\n const data = (await response.json()) as { data: Record<string, unknown>[] };\n return data.data;\n}\n\nexport function isGrokConfigured(runtime: IAgentRuntime): boolean {\n return !!runtime.getSetting(\"XAI_API_KEY\");\n}\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "AAAA,iBAEE,eACA,sBCHF,oBACE,YAIA,eAEA,mBAGA,sBAGF,IAAM,EAAe,sBAEf,EAAiB,CACrB,MAAO,cACP,MAAO,SACP,UAAW,gBACb,EAUA,SAAS,CAAS,CAAC,EAAoC,CACrD,IAAM,EAAS,EAAQ,WAAW,aAAa,EAC/C,GAAI,CAAC,GAAU,OAAO,IAAW,SAC/B,MAAU,MAAM,yBAAyB,EAG3C,IAAM,EAAU,EAAQ,WAAW,cAAc,EAC3C,EAAa,EAAQ,WAAW,iBAAiB,EACjD,EACJ,EAAQ,WAAW,WAAW,GAAK,EAAQ,WAAW,iBAAiB,EACnE,EAAiB,EAAQ,WAAW,qBAAqB,EAE/D,MAAO,CACL,SACA,QAAS,OAAO,IAAY,SAAW,EAAU,EACjD,WACE,OAAO,IAAe,SAAW,EAAa,EAAe,MAC/D,WACE,OAAO,IAAe,SAAW,EAAa,EAAe,MAC/D,eACE,OAAO,IAAmB,SACtB,EACA,EAAe,SACvB,EAGF,SAAS,CAAa,CAAC,EAA4C,CACjE,MAAO,CACL,cAAe,UAAU,EAAO,SAChC,eAAgB,kBAClB,EAgEF,SAAS,CAAiB,CAAC,EAAuC,CAChE,GAAI,CAAC,EAAO,OACZ,GAAI,MAAM,QAAQ,CAAK,EACrB,OAAO,EACJ,IAAI,CAAC,IAAS,EAAiB,CAAyB,CAAC,EACzD,OAAO,CAAC,IAA0C,IAAS,MAAS,EAEzE,GAAI,OAAO,IAAU,SAAU,CAC7B,IAAM,EAAiC,CAAC,EACxC,QAAY,EAAM,KAAU,OAAO,QACjC,CACF,EAAG,CACD,IAAM,EAAa,EAAiB,IAAK,EAAO,MAAK,CAAC,EACtD,GAAI,EAAY,EAAI,KAAK,CAAU,EAErC,OAAO,EAAI,OAAS,EAAI,EAAM,OAEhC,OAGF,SAAS,CAAgB,CACvB,EACqC,CACrC,IAAM,EAAO,EAAK,MAAQ,EAAK,UAAU,KACzC,GAAI,CAAC,EAAM,OACX,IAAM,EAAc,EAAK,aAAe,EAAK,UAAU,YACjD,EAAa,EAAK,YACtB,EAAK,UAAU,YACf,EAAK,aAAe,CAAE,KAAM,QAAS,EACvC,MAAO,CACL,KAAM,WACN,SAAU,CACR,UACI,EAAc,CAAE,aAAY,EAAI,CAAC,EACrC,YACF,CACF,EAGF,SAAS,CAAsB,CAAC,EAA8B,CAC5D,GAAI,CAAC,EAAY,OACjB,GACE,OAAO,IAAe,WACrB,IAAe,QACd,IAAe,QACf,IAAe,YAEjB,OAAO,EAET,IAAM,EAAS,EACf,GAAI,EAAO,OAAS,WAAY,OAAO,EACvC,GAAI,EAAO,OAAS,QAAU,OAAO,EAAO,WAAa,SACvD,MAAO,CAAE,KAAM,WAAY,SAAU,CAAE,KAAM,EAAO,QAAS,CAAE,EAEjE,GAAI,OAAO,EAAO,OAAS,SACzB,MAAO,CAAE,KAAM,WAAY,SAAU,CAAE,KAAM,EAAO,IAAK,CAAE,EAE7D,OAGF,SAAS,CAAsB,CAAC,EAAkC,CAChE,GAAI,CAAC,EAAgB,OACrB,IAAM,EAAI,EACJ,EAAU,EAAE,QAAU,EAE5B,MAAO,CACL,KAAM,cACN,YAAa,CAAE,KAHJ,OAAO,EAAE,OAAS,SAAW,EAAE,KAAO,sBAG5B,SAAQ,OAAQ,EAAK,CAC5C,EA2CF,SAAS,CAAc,CAAC,EAAoC,CAC1D,GAAI,OAAO,IAAU,UAAY,CAAC,OAAO,SAAS,CAAK,EACrD,OAEF,OAAO,KAAK,IAAI,EAAG,KAAK,MAAM,CAAK,CAAC,EAGtC,SAAS,CAAmB,CAAC,EAAwC,CACnE,GAAI,CAAC,GAAS,OAAO,IAAU,SAC7B,OAAO,KAGT,IAAM,EAAS,EACT,EAAe,EACnB,EAAO,eAAiB,EAAO,WACjC,EACM,EAAmB,EACvB,EAAO,mBAAqB,EAAO,YACrC,EACM,EAAc,EAAe,EAAO,cAAgB,EAAO,WAAW,EAE5E,GACE,IAAiB,QACjB,IAAqB,QACrB,IAAgB,OAEhB,OAAO,KAGT,IAAM,EACJ,IACC,IAAqB,QAAa,IAAgB,OAC/C,EACA,KAAK,IAAI,GAAI,GAAe,IAAM,GAAoB,EAAE,GACxD,EACJ,GACA,KAAK,IACH,GACC,GAAe,GAA0B,CAC5C,EAEF,MAAO,CACL,aAAc,EACd,iBAAkB,EAClB,YACE,GAAe,EAAyB,CAC5C,EAGF,SAAS,CAAkB,CAAC,EAAsB,CAChD,OAAO,EAAK,SAAW,EAAI,EAAI,KAAK,KAAK,EAAK,OAAS,CAAC,EAG1D,SAAS,CAAa,CAAC,EAAgB,EAAoC,CACzE,IAAM,EAAe,EAAmB,CAAM,EACxC,EAAmB,EACvB,OAAO,IAAa,SAAW,EAAW,OAAO,CAAQ,CAC3D,EACA,MAAO,CACL,eACA,mBACA,YAAa,EAAe,EAC5B,UAAW,EACb,EAGF,SAAS,CAAsB,CAAC,EAA+B,CAC7D,IAAM,EAAe,EAAmB,CAAI,EAC5C,MAAO,CACL,eACA,iBAAkB,EAClB,YAAa,EACb,UAAW,EACb,EAGF,SAAS,CAAa,CACpB,EACA,EACA,EACA,EACM,CACD,EAAQ,UACX,EAAU,WACV,CACE,UACA,OAAQ,MACR,SAAU,MACV,OACA,QACA,UAAW,EACX,OAAQ,CACN,OAAQ,EAAM,aACd,WAAY,EAAM,iBAClB,MAAO,EAAM,eACT,EAAM,UAAY,CAAE,UAAW,EAAK,EAAI,CAAC,CAC/C,KACI,EAAM,UAAY,CAAE,eAAgB,EAAK,EAAI,CAAC,CACpD,CACF,EAGF,eAAe,CAAY,CACzB,EACA,EACA,EACA,EACA,EAC0D,CAC1D,IAAM,EAAmB,EAMnB,EAAa,EAAO,QAAU,GAC9B,EAAQ,EAAkB,EAAiB,KAAK,EAChD,EAAa,EAAuB,EAAiB,UAAU,EAC/D,EAAiB,EACrB,EAAiB,cACnB,EACM,EAAe,QACnB,EAAiB,UACf,EAAiB,OACjB,EAAiB,YACjB,EAAiB,cACrB,EAEM,EAA0B,EAAiB,UAAU,OACtD,EAAiB,SAClB,CAAC,CAAE,KAAM,OAAQ,QAAS,CAAW,CAAC,EAEpC,EAAgC,CACpC,QACA,UACF,EAEA,GAAI,EAAO,cAAgB,OACzB,EAAK,YAAc,EAAO,YAE5B,GAAI,EAAO,YAAc,OACvB,EAAK,WAAa,EAAO,UAE3B,GAAI,EAAO,cACT,EAAK,KAAO,EAAO,cAErB,GAAI,EACF,EAAK,MAAQ,EAEf,GAAI,EACF,EAAK,YAAc,EAErB,GAAI,EACF,EAAK,gBAAkB,EAGzB,GAAI,EAAO,QAAU,EAAO,cAAe,CACzC,EAAK,OAAS,GACd,IAAM,EAAgB,EAAO,cAE7B,OAAO,EACL,EACA,CACE,QACA,aAAc,GACd,WAAY,EACZ,YAAa,EAAO,aAAe,EACnC,UAAW,EAAO,WAAa,EAC/B,QAAS,eACT,WAAY,6BACd,EACA,SAAY,CACV,IAAM,EAAW,MAAM,MAAM,GAAG,EAAO,2BAA4B,CACjE,OAAQ,OACR,QAAS,EAAc,CAAM,EAC7B,KAAM,KAAK,UAAU,CAAI,CAC3B,CAAC,EAED,GAAI,CAAC,EAAS,GAAI,CAChB,IAAM,EAAQ,MAAM,EAAS,KAAK,EAClC,MAAU,MAAM,mBAAmB,EAAS,YAAY,GAAO,EAGjE,IAAM,EAAS,EAAS,MAAM,UAAU,EACxC,GAAI,CAAC,EACH,MAAU,MAAM,kBAAkB,EAGpC,IAAM,EAAU,IAAI,YAChB,EAAW,GACX,EAAgC,KAChC,EAAgB,EAEpB,MAAO,GAAM,CACX,IAAQ,OAAM,SAAU,MAAM,EAAO,KAAK,EAC1C,GAAI,EAAM,MAGV,IAAM,EADQ,EAAQ,OAAO,CAAK,EACd,MAAM;AAAA,CAAI,EAE9B,QAAW,KAAQ,EAAO,CACxB,GAAI,CAAC,EAAK,WAAW,QAAQ,EAAG,SAChC,IAAM,EAAO,EAAK,MAAM,CAAC,EACzB,GAAI,IAAS,SAAU,SAEvB,IAAM,EAAS,KAAK,MAAM,CAAI,EACxB,EAAa,EAAoB,EAAO,KAAK,EACnD,GAAI,EACF,EAAQ,EAEV,GAAI,OAAO,EAAO,QAAU,UAAY,EAAO,MAAM,OAAS,EAC5D,EAAgB,EAAO,MAGzB,IAAM,EAAU,EAAO,UAAU,IAAI,OAAO,QAC5C,GAAI,EACF,GAAY,EACZ,EAAc,CAAO,GAW3B,OANA,EACE,EACA,EACA,EACA,GAAS,EAAc,EAAY,CAAQ,CAC7C,EACO,EAEX,EAGF,OAAO,EACL,EACA,CACE,QACA,aAAc,GACd,WAAY,EACZ,YAAa,EAAO,aAAe,EACnC,UAAW,EAAO,WAAa,EAC/B,QAAS,eACT,WAAY,6BACd,EACA,SAAY,CACV,IAAM,EAAW,MAAM,MAAM,GAAG,EAAO,2BAA4B,CACjE,OAAQ,OACR,QAAS,EAAc,CAAM,EAC7B,KAAM,KAAK,UAAU,CAAI,CAC3B,CAAC,EAED,GAAI,CAAC,EAAS,GAAI,CAChB,IAAM,EAAQ,MAAM,EAAS,KAAK,EAClC,MAAU,MAAM,mBAAmB,EAAS,YAAY,GAAO,EAGjE,IAAM,EAAQ,MAAM,EAAS,KAAK,EAE5B,EAAS,EAAK,UAAU,GACxB,EAAU,GAAQ,SAAS,SAAW,GACtC,EAAe,GAAQ,SAAS,YAAc,CAAC,EAErD,GAAI,CAAC,GAAgB,CAAC,EACpB,MAAU,MAAM,6BAA6B,EAW/C,GARA,EACE,EACA,EACA,EAAK,OAAS,EACd,EAAoB,EAAK,KAAK,GAC5B,EAAc,EAAO,QAAU,GAAI,CAAO,CAC9C,EAEI,EAAc,CAChB,IAAM,EAAQ,EAAoB,EAAK,KAAK,EAmB5C,MAlBoC,CAClC,KAAM,EACN,UAAW,EAAa,IAAI,CAAC,KAAQ,CACnC,WAAY,EAAG,GACf,SAAU,EAAG,SAAS,KACtB,MAAO,EAAe,EAAG,SAAS,SAAS,CAC7C,EAAE,EACF,aAAc,GAAQ,iBAClB,EACA,CACE,MAAO,CACL,aAAc,EAAM,aACpB,iBAAkB,EAAM,iBACxB,YAAa,EAAM,WACrB,CACF,EACA,CAAC,CACP,EAIF,OAAO,EAEX,EAGF,SAAS,CAAc,CAAC,EAAyB,CAC/C,GAAI,OAAO,IAAU,SAAU,OAAO,EACtC,GAAI,CACF,OAAO,KAAK,MAAM,CAAK,EACvB,KAAM,CACN,OAAO,GAIX,eAAe,EAAe,CAC5B,EACA,EACA,EACmB,CACnB,IAAM,EAAW,MAAM,MAAM,GAAG,EAAO,qBAAsB,CAC3D,OAAQ,OACR,QAAS,EAAc,CAAM,EAC7B,KAAM,KAAK,UAAU,CACnB,MAAO,EAAO,eACd,MAAO,CACT,CAAC,CACH,CAAC,EAED,GAAI,CAAC,EAAS,GAAI,CAChB,IAAM,EAAQ,MAAM,EAAS,KAAK,EAClC,MAAU,MAAM,6BAA6B,EAAS,YAAY,GAAO,EAG3E,IAAM,EAAQ,MAAM,EAAS,KAAK,EAElC,GAAI,CAAC,EAAK,OAAO,IAAI,UACnB,MAAU,MAAM,+BAA+B,EASjD,OANA,EACE,EACA,EAAU,eACV,EAAK,OAAS,EAAO,eACrB,EAAoB,EAAK,KAAK,GAAK,EAAuB,CAAI,CAChE,EACO,EAAK,KAAK,GAAG,UAGtB,eAAsB,CAAe,CACnC,EACA,EACoC,CACpC,IAAM,EAAS,EAAU,CAAO,EAOhC,OANA,EAAO,MAAM,sCAAsC,EAAO,YAAY,EAM9D,MAAM,EACZ,EACA,EACA,EAAU,WACV,EAAO,WACP,CACF,EAGF,eAAsB,CAAe,CACnC,EACA,EACoC,CACpC,IAAM,EAAS,EAAU,CAAO,EAEhC,OADA,EAAO,MAAM,sCAAsC,EAAO,YAAY,EAC9D,MAAM,EACZ,EACA,EACA,EAAU,WACV,EAAO,WACP,CACF,EAGF,eAAsB,CAAmB,CACvC,EACA,EACmB,CACnB,GAAI,IAAW,KACb,MAAU,MAAM,oCAAoC,EAEtD,IAAM,EAAS,EAAU,CAAO,EAC1B,EACJ,OAAO,IAAW,SAAW,EAAU,EAA+B,KACxE,GAAI,CAAC,EACH,MAAU,MAAM,mCAAmC,EAKrD,OAHA,EAAO,MACL,yCAAyC,EAAO,gBAClD,EACO,GAAgB,EAAS,EAAQ,CAAI,EAqBvC,SAAS,CAAgB,CAAC,EAAiC,CAChE,MAAO,CAAC,CAAC,EAAQ,WAAW,aAAa,ED/nBpC,IAAM,GAAoB,CAC/B,KAAM,MACN,YAAa,qDACb,WAAY,CACV,QAAS,CAAC,cAAe,cAAc,CACzC,EAEA,KAAM,MAAO,EAAiC,IAA2B,CAEvE,GADA,EAAO,IAAI,4BAA4B,EACnC,EAAiB,CAAO,EAC1B,EAAO,IAAI,uBAAsB,EAEjC,OAAO,KAAK,0DAA0D,GAI1E,OAAQ,EACL,EAAU,YAAa,GACvB,EAAU,YAAa,GACvB,EAAU,gBAAiB,CAC9B,EAEA,MAAO,CACL,CACE,KAAM,mBACN,MAAO,CACL,CACE,KAAM,wBACN,GAAI,MAAO,IAA0C,CACnD,IAAM,EAAS,EAAQ,WAAW,aAAa,EAC/C,GAAI,CAAC,EAAQ,OAEb,IAAM,EACJ,EAAQ,WAAW,cAAc,GAAK,sBAClC,EAAW,MAAM,MAAM,GAAG,WAAkB,CAChD,QAAS,CAAE,cAAe,UAAU,GAAS,CAC/C,CAAC,EAED,GAAI,CAAC,EAAS,GACZ,MAAU,MAAM,mBAAmB,EAAS,QAAQ,EAGtD,IAAM,EAAQ,MAAM,EAAS,KAAK,EAClC,EAAO,KAAK,mBAAmB,EAAK,KAAK,eAAe,EAE5D,EACA,CACE,KAAM,uBACN,GAAI,MAAO,IAA0C,CACnD,GAAI,CAAC,EAAiB,CAAO,EAAG,OAEhC,IAAM,EAAO,MAAM,EAAQ,SAAS,EAAU,WAAY,CACxD,OAAQ,+BACV,CAAC,EAED,GAAI,OAAO,IAAS,UAAY,CAAC,EAC/B,MAAU,MAAM,2BAA2B,EAG7C,EAAO,KAAK,eAAe,EAAK,MAAM,EAAG,EAAE,OAAO,EAEtD,CACF,CACF,CACF,CACF",
|
|
9
|
+
"debugId": "CC6D39C862491DE864756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|