@doubao-dev/cli 0.0.26 → 0.0.28
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/dist/2168.js +14 -14
- package/dist/{2861.js → 2611.js} +2 -2
- package/dist/4931.js +1 -1
- package/dist/@byted-doubao-apps/template-empty/package.json +3 -3
- package/dist/@byted-doubao-apps/template-starter/package.json +3 -3
- package/dist/app.js +1 -1
- package/dist/assets/web-sdk-debugger/index.html +1 -1
- package/dist/assets/web-sdk-debugger/static/js/index.1448a806d8.js +26 -0
- package/dist/assets/web-sdk-debugger/wsd/doubao-apps-api.template.js +0 -0
- package/dist/assets/web-sdk-debugger/wsd/doubao-apps-framework.template.js +0 -0
- package/dist/check.js +1 -0
- package/dist/dbx.js +2 -2
- package/dist/demo-server.js +3 -3
- package/dist/demo.js +2 -0
- package/dist/dev-shell.js +1 -1
- package/dist/dev.js +5 -5
- package/dist/init.js +4 -4
- package/dist/ink.js +1 -1
- package/dist/login.js +1 -1
- package/dist/prompt.js +1 -1
- package/dist/run.js +2 -2
- package/dist/sdk.js +15 -15
- package/dist/sdk~1.js +5 -5
- package/dist/skill.js +1 -1
- package/dist/skills.js +1 -1
- package/dist/skills~2.js +2 -2
- package/dist/templates/README.md +1 -1
- package/dist/upload.js +6 -6
- package/dist/workspace.js +1 -1
- package/dist/yaml.js +1 -1
- package/package.json +2 -2
- package/skills/dbx-eval/SKILL.md +2 -2
- package/skills/doubao-agentic-service-development/SKILL.md +8 -8
- package/skills/doubao-agentic-service-development/references/auth.md +2 -2
- package/skills/doubao-agentic-service-development/references/business-template-debug.md +3 -3
- package/skills/doubao-agentic-service-development/references/dev-debug.md +2 -2
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/01-/345/237/272/347/241/200.md +175 -15
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/02-/347/263/273/347/273/237.md +3 -3
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/03-/350/207/252/345/256/232/344/271/211/351/200/232/344/277/241.md +1 -1
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/04-/345/256/232/344/275/215.md +1 -1
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/08-/344/272/244/344/272/222.md +221 -7
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/10-/347/275/221/347/273/234.md +20 -20
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/11-/345/252/222/344/275/223.md +2 -2
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/12-/344/270/232/345/212/241/350/203/275/345/212/233.md +3 -4
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/16-/350/223/235/347/211/231.md +3 -3
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/25-/346/227/240/351/232/234/347/242/215.md +1 -1
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/26-/345/237/272/347/241/200/344/277/241/346/201/257.md +3 -3
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/28-/345/211/252/350/264/264/346/235/277.md +2 -2
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/32-/346/211/253/347/240/201.md +1 -1
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/33-/345/261/217/345/271/225.md +1 -1
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/34-/351/234/207/345/212/250.md +2 -2
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/common-errors.md +1 -1
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/groups.md +3 -3
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/quick-reference.md +7 -3
- package/skills/doubao-agentic-service-development/references/frontend-dev.md +3 -3
- package/skills/doubao-agentic-service-development/references/generate-skill.md +1 -1
- package/skills/doubao-agentic-service-development/references/local-debug/simulator-eval.md +26 -22
- package/skills/doubao-agentic-service-development/references/manifest-guide.md +3 -3
- package/skills/doubao-agentic-service-development/references/mcp-protocol.md +1 -1
- package/skills/doubao-agentic-service-development/references/overview.md +4 -3
- package/skills/doubao-agentic-service-development/references/service-notice.md +1 -3
- package/skills/doubao-agentic-service-development/references/task-management.md +1 -3
- package/dist/assets/web-sdk-debugger/static/js/index.b85cbec3be.js +0 -26
- package/dist/dbx-demo.js +0 -2
- package/dist/eval.js +0 -1
- package/dist/validate.js +0 -1
- /package/dist/{2861.js.LICENSE.txt → 2611.js.LICENSE.txt} +0 -0
- /package/dist/{6780.js → 4594.js} +0 -0
|
Binary file
|
|
Binary file
|
package/dist/check.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let e;import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import"./3768.js";import"./yaml.js";import{DBX_DEMO_NAMES as r,getDBXDemo as o,startMCPDemoServer as n}from"./demo-server.js";import{resolveProjectLayout as i,runtime_skill_layout_resolveRuntimeSkillLayout as s}from"./project-layout.js";import{http_getApiBaseUrl as a,parseInteger as l,runCommand as c,command_Command as d,option_Option as u,CliError as m,isRecord as p}from"./2168.js";import{extractMCPHeadersFromManifest as _}from"./manifest-mcp-config.js";import{verifyYAML as f}from"./app.js";import{SimulatorStreamError as g,runSimulatorStream as h}from"./simulator-client.js";import{source as y}from"./4594.js";var v={};t.r(v),t.d(v,{default:()=>ev,executeCheck:()=>ew,resolveYAMLType:()=>eP});let w=t("node:fs");var S=t.n(w);let b=t("node:path");var $=t.n(b);let C=t("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js"),x=new Set(["USER","ASSISTANT","TOOL"]);function P(e){let t=s(e);if("resolved"!==t.layout)throw k("missing"===t.layout?"skill_layout_missing":"skill_layout_invalid",t.error??`skill directory contains no runtime Skill: ${e}`,"请在选定目录任意层级放置至少一个普通文件 SKILL.md;符号链接不会被加载。");return t.entries.map(e=>e.content)}function E(e,t){if(!S().existsSync(e))throw k(`${t}_file_not_found`,`${t} file not found: ${e}`,`请检查 --${t} 路径;相对路径会按 --project-path 解析。`);if(!S().statSync(e).isFile())throw k(`${t}_path_not_file`,`${t} path must be a file: ${e}`,`请检查 --${t} 路径,不能传目录。`);return S().readFileSync(e,"utf8")}function k(e,t,r){let o=Error(t);return o.details={code:e,message:t,suggestion:r},o}function M(e,t){return $().isAbsolute(e)?e:$().resolve(t,e)}function T(e){return"string"==typeof e&&e.trim()?e:void 0}function j(e){var t,r;let o=[],n=e.preflight.filter(e=>"error"===e.level);for(let i of(o.push(...n),o.push(...(t=e.result.trace_events,r=e.result.request_id,t.filter(e=>e.error).map(e=>({code:String(e.error?.code||"trace_error"),level:"error",message:String(e.error?.user_message||e.error?.message||e.summary||"trace error"),suggestion:q(e.error?.code,r),details:e.error})))),e.result.stream_errors??[]))o.push(function(e){var t;let r=String(e?.message||"stream error"),o=String(e?.code||"stream_error");return{code:o,level:"error",message:r,suggestion:"string"==typeof e?.suggestion?e.suggestion:q(o,"")||((t=r).includes("exceeded max step")?"模型在最大步数内没有收口。请检查 skill 是否让模型重复查询/重复调用工具,或临时调大 --max-step 辅助定位。":t.includes("mcp tool invalid response")?"MCP 工具返回未通过 context post-hook。请对照 manifest 检查 tool_name、entity_type、主键字段和 structuredContent。":void 0),details:e?.details??e}}(i));if(!o.some(e=>"error"===e.level)){let t=e.cardExpectation??"auto";o.push(...function(e,t,r){let o=[];for(let t of e){let e=t.result_preview||"";(t.result_error||e.includes("MCP error")||e.includes("Input validation error"))&&o.push({code:"mcp_tool_result_error",level:"error",message:`MCP tool ${t.tool_name} returned an error result`,suggestion:"工具已被模型调用,但 MCP tools/call 返回业务/参数错误。请检查 Agent Flow 里的 args 与工具入参 schema 是否一致;常见问题是模型传了字符串数字,可在 MCP server 用 z.coerce.number() 或自行兼容转换。",details:{tool_name:t.tool_name,tool_call_id:t.tool_call_id,arguments:t.arguments,result_preview:e}})}return"auto"===r&&e.length>0&&0===t&&0===o.length&&o.push({code:"tool_called_but_no_card",level:"warn",message:"Tool call finished, but no card_delta was emitted",suggestion:"如果这是出卡工具,请检查工具 result 是否包含 structuredContent.entities、entity_type 是否在 manifest.entities 声明、tool_card_binding 是否绑定该工具。"}),o}(e.result.tool_calls,e.result.cards.length,t));let r=e.result.tool_calls.map(e=>e.tool_name),n=e.evalCase.expect?.tool_calls??[];n.length>0&&!function(e,t){let r=0;for(let o of t)if(o===e[r]&&(r+=1),r===e.length)return!0;return 0===e.length}(n,r)&&o.push({code:"expectation_tool_chain_mismatch",level:"error",message:`expected tool chain ${n.join(" -> ")}, actual ${r.join(" -> ")||"-"}`,suggestion:"请检查 skill 的工具流程描述、query 是否表达了对应意图,以及 MCP tools 是否暴露了这些工具。"});let i=e.evalCase.expect?.card;if(i||"required"===t){let t=i?.min_count??1,r=i?.widget_id?e.result.cards.filter(e=>e.widget_id===i.widget_id):e.result.cards;r.length<t&&o.push({code:"card_not_emitted",level:"error",message:i?.widget_id?`expected at least ${t} card(s) with widget_id ${i.widget_id}, actual ${r.length}`:`expected at least ${t} card(s), actual ${e.result.cards.length}`,suggestion:"如果工具已成功,重点检查 manifest.tools、entities.*.tool_card_binding、MCP result structuredContent.entities 和模型是否在工具后触发出卡。"})}for(let r of("none"===t&&e.result.cards.length>0&&o.push({code:"unexpected_card_emitted",level:"error",message:`expected no card, actual ${e.result.cards.length}`,suggestion:"如果当前用例不应出卡,请检查工具是否返回了非空 structuredContent.entities,或检查 manifest 中该工具的 tool_card_binding。"}),e.result.tool_calls))!e.manifest.tools[r.tool_name]&&e.manifest.cardBindings[r.tool_name]&&o.push({code:"card_tool_not_declared",level:"error",message:`${r.tool_name} has card binding but is not declared in manifest.tools`,suggestion:`请在 manifest.tools.${r.tool_name} 中声明 output.entity_types。`})}let i=function(e){let t=new Set,r=[];for(let o of e){if(function(e,t){return"SIMULATOR_STREAM_ERROR"===e.code&&t.some(t=>{if(t.code===e.code)return!1;if(e.message.includes(t.message))return!0;let r=A(function(e,t){if(!p(e))return;let r=e[t];return p(r)?r:void 0}(t.details,"details"),"raw_error")||A(t.details,"raw_error");return void 0!==r&&e.message.includes(r)})}(o,r))continue;let e=`${o.level}\u0000${o.code}\u0000${o.message}`;t.has(e)||(t.add(e),r.push(o))}return r}(o),s=0===i.filter(e=>"error"===e.level).length;return{ok:s,verdict:s?"PASS":"FAIL",case:e.evalCase,context:{history_count:e.evalCase.history_messages?.length??0,query:e.evalCase.query,mcp_url:e.evalCase.mcp.url,gateway_origin:e.gatewayOrigin,max_step:e.evalCase.max_step},preflight:e.preflight,errors:i,...e.result}}function A(e,t){if(!p(e))return;let r=e[t];return"string"==typeof r&&r?r:void 0}function q(e,t){return"miniapp_mcp_result_invalid"===e?"MCP 工具返回未通过智能服务协议校验。请检查返回 JSON 是否包含 content/structuredContent,entity_type 是否在 manifest.entities 中声明,实体主键字段是否匹配 is_entity_id。":"agent_run_failed"===e?`Agent 运行失败。请查看 request_id=${t||"-"} 对应 trace,重点关注是否重复 tool call、max_step 不足或模型没有触发卡片输出。`:"tool_call_or_report_failed"===e?"工具调用或结果上报失败。请检查 MCP tools/call 是否可用,以及返回的 structuredContent/entities 是否符合 manifest 声明。":void 0}let O="2025-11-25",I=["application/json","text/event-stream"];async function L(e,t,r){return Z(e)?R(e,t,r):U(e,t,r)}async function N(t,r){var o,n;if(e&&(o=e.url,n=t,Q(o)===Q(n)))return function(e){var t;let r=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return e;let{_response_meta:t,...r}=e;return r}(e);if(!r||"object"!=typeof r){let e=String(r??"");return{content:e,raw_result_text:e,raw_mcp_result_json:e}}if("string"==typeof r.content||"raw_mcp_result_json"in r||"raw_result_text"in r||"structured"in r){let e="string"==typeof r.content?r.content:JSON.stringify(r.content??""),t=r.raw_mcp_result_json||r.raw_result_text||e;return{...r,content:e,raw_result_text:r.raw_result_text||t,raw_mcp_result_json:r.raw_mcp_result_json||t,structured:r.structured??r.structuredContent,is_error:r.is_error??r.isError}}let o=JSON.stringify(r);return{content:o,structured:r.structuredContent,raw_result_text:o,raw_mcp_result_json:o,is_error:!0===r.isError,miniapp:(t=r,Array.isArray(t?.content)&&t?.structuredContent&&"object"==typeof t.structuredContent)?{is_mini_app:!0,mcp_channel:"flow_miniapp"}:void 0}}("sse"===e.kind?await H(e,r):await D(e,r));throw Error("MCP session is not initialized. Please ensure fetchMCPDescriptor runs before tools/call.")}async function U(t,r,o){let n=B(t);try{let t=await Y(n,{jsonrpc:"2.0",id:1,method:"initialize",params:{protocolVersion:O,capabilities:{},clientInfo:{name:"dbx-simulator-eval",version:"0.1.0"}}},{headers:o}),i=t.body.result?.protocolVersion??O,s=t.headers.get("mcp-session-id")??void 0;e={kind:"streamable",url:n,sessionID:s,protocolVersion:i,headers:o},await Y(n,{jsonrpc:"2.0",method:"notifications/initialized",params:{}},{sessionID:s,protocolVersion:i,allowEmpty:!0,headers:o});let a=await Y(n,{jsonrpc:"2.0",id:2,method:"tools/list",params:{}},{sessionID:s,protocolVersion:i,headers:o});return{tools:{server_id:ee(n),name:ee(n),description:"Standard MCP Streamable HTTP server",app_key:r,protocol:"streamable_http",tools:(a.body.result?.tools??[]).map(e=>({name:e.name,description:e.description??"",input_schema_json:JSON.stringify(e.inputSchema??e.input_schema??{})}))}}}catch(r){e=void 0;let t=Error("standard MCP Streamable HTTP initialize/tools/list failed");throw t.cause=r,t}}async function R(t,r,o){let n=G(t),i={kind:"sse",url:n,pending:new Map,headers:o};e=i;try{await K(i,{jsonrpc:"2.0",id:1,method:"initialize",params:{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"dbx-simulator-eval",version:"0.1.0"}}},!1),await K(i,{jsonrpc:"2.0",method:"notifications/initialized",params:{}},!0);let e=await K(i,{jsonrpc:"2.0",id:2,method:"tools/list",params:{}},!1);return{tools:{server_id:ee(n),name:ee(n),description:"Standard MCP SSE server",app_key:r,protocol:"sse",tools:(e.result?.tools??[]).map(e=>({name:e.name,description:e.description??"",input_schema_json:JSON.stringify(e.inputSchema??e.input_schema??{})}))}}}catch(r){W(i),e=void 0;let t=Error("standard MCP SSE initialize/tools/list failed");throw t.cause=r,t}}async function D(e,t){let r=ei(t.tool_name);if(!r)throw Error("MCP tool name is empty");return(await Y(e.url,{jsonrpc:"2.0",id:Date.now(),method:"tools/call",params:{name:r,arguments:es(t.arguments)??ea(ei(t.arguments_json))??{}}},{sessionID:e.sessionID,protocolVersion:e.protocolVersion,headers:e.headers})).body.result}async function H(e,t){let r=ei(t.tool_name);if(!r)throw Error("MCP tool name is empty");return(await K(e,{jsonrpc:"2.0",id:Date.now(),method:"tools/call",params:{name:r,arguments:es(t.arguments)??ea(ei(t.arguments_json))??{}}},!1)).result}async function K(e,t,r){let o;if(await J(e),!e.endpointURL)throw Error("MCP SSE did not provide endpoint event");let n=et(t),i=er(t)||"unknown",s=eo(t),a=s?`${i}:${s}`:i,l=null!==n,c=l?new Promise((t,r)=>{let o=setTimeout(()=>{e.pending.delete(n),r(Error(`MCP SSE request timed out: ${a}`))},1e4);e.pending.set(n,{resolve:t,reject:r,timeout:o})}):void 0;try{var d;let r;o=await X(e.endpointURL,{method:"POST",headers:(d=e.headers,(r=new Headers(d)).set("Content-Type","application/json"),r),body:JSON.stringify(t)},1e4,`MCP SSE POST ${a}`)}catch(t){throw l&&V(e,n),t}if(await o.text(),!o.ok)throw l&&V(e,n),Error(`MCP SSE POST failed: HTTP ${o.status}`);if(!l)return{};let u=await c;if(!u&&!r)throw Error("MCP SSE returned empty response");if(u?.error)throw Error(`MCP SSE error: [${u.error.code}]`);return u}async function J(e){if(e.ready)return e.ready;let t=new AbortController;return e.abortController=t,e.ready=new Promise((r,o)=>{let n=!1,i=setTimeout(()=>{t.abort(),s(Error("MCP SSE endpoint event timed out"))},1e4),s=e=>{n||(n=!0,clearTimeout(i),o(e))};z(e,t,t=>{e.endpointURL=new URL(t,e.url).toString(),n||(n=!0,clearTimeout(i),r())},s)}).catch(t=>{throw W(e,t),t}),e.ready}async function z(e,t,r,o){try{var n;let i,s=await fetch(e.url,{method:"GET",headers:(n=e.headers,(i=new Headers(n)).set("Accept","text/event-stream"),i),signal:t.signal});if(!s.ok||!s.body){await s.text(),o(Error(`MCP SSE GET failed: HTTP ${s.status}`));return}if(!String(s.headers.get("content-type")??"").toLowerCase().includes("text/event-stream"))return void o(Error(`MCP SSE GET content-type=${s.headers.get("content-type")??"-"}`));await F(e,s.body,r),t.signal.aborted||W(e,Error("MCP SSE stream closed"))}catch(r){if(!t.signal.aborted){let t=r instanceof Error?r:Error(String(r));o(t),W(e,t)}}}async function F(e,t,r){let o=t.getReader(),n=new TextDecoder,i="",s="message",a=[],l=()=>{if(0===a.length){s="message";return}(function(e,t,r,o){let n;if("endpoint"===t)return o(r.trim());if(!r.trim())return;try{n=JSON.parse(r)}catch{return}let i=n.id;if(null==i)return;let s=e.pending.get(i);s&&(clearTimeout(s.timeout),e.pending.delete(i),s.resolve(n))})(e,s,a.join("\n"),r),s="message",a=[]};for(;;){let{done:e,value:t}=await o.read();if(e)break;let r=(i+=n.decode(t,{stream:!0})).search(/\r?\n/);for(;r>=0;){let e=i.slice(0,r).replace(/\r$/,"");i=i.slice(r+("\r"===i[r]&&"\n"===i[r+1]?2:1)),""===e?l():e.startsWith("event:")?s=e.slice(6).trim():e.startsWith("data:")&&a.push(e.slice(5).trimStart()),r=i.search(/\r?\n/)}}i&&a.push(i),l()}function V(e,t){if(null===t)return;let r=e.pending.get(t);r&&(clearTimeout(r.timeout),e.pending.delete(t))}function W(e,t=Error("MCP SSE session closed")){for(let[r,o]of(e.abortController?.abort(),e.abortController=void 0,e.endpointURL=void 0,e.ready=void 0,e.pending.entries()))clearTimeout(o.timeout),o.reject(t),e.pending.delete(r)}async function Y(e,t,r){var o,n;let i,s,a,l=er(t)||"unknown",c=eo(t),d=c?`${l}:${c}`:l,u=await X(e,{method:"POST",headers:(o=t,(i=new Headers((n=r).headers)).set("Content-Type","application/json"),i.set("Accept",I.join(", ")),(s=er(o))&&i.set("Mcp-Method",s),(a=eo(o))&&i.set("Mcp-Name",a),n.protocolVersion&&i.set("MCP-Protocol-Version",n.protocolVersion),n.sessionID&&i.set("Mcp-Session-Id",n.sessionID),i),body:JSON.stringify(t)},1e4,`MCP Streamable HTTP ${d}`),m=await u.text();if(!u.ok)throw Error(`MCP Streamable HTTP failed: HTTP ${u.status}`);if(!m&&r.allowEmpty)return{body:{},headers:u.headers};if(!m)throw Error("MCP Streamable HTTP returned empty response");let p=function(e,t,r){if(t?.toLowerCase().includes("text/event-stream")){let t=function(e){let t=[],r=[],o=()=>{if(0===r.length)return;let e=r.join("\n");e.trim()&&t.push(JSON.parse(e)),r=[]};for(let t of e.split(/\r?\n/)){if(""===t){o();continue}t.startsWith("data:")&&r.push(t.slice(5).trimStart())}return o(),t}(e),o=t.find(e=>{var t,o;return t=e,null!==(o=r)&&en(t)&&t.id===o})??t.find(en);if(!o)throw Error("MCP SSE response has no JSON-RPC response");return o}return JSON.parse(e)}(m,u.headers.get("content-type"),et(t));if(p.error)throw Error(`MCP Streamable HTTP error: [${p.error.code}]`);return{body:p,headers:u.headers}}function B(e){let t=new URL(e);return("/"===t.pathname||""===t.pathname)&&(t.pathname="/mcp"),t.toString()}function G(e){return new URL(e).toString()}function Z(e){return new URL(e).pathname.replace(/\/+$/,"").toLowerCase().endsWith("/sse")}function Q(e){return Z(e)?G(e):B(e)}async function X(e,t,r,o){let n=new AbortController,i=setTimeout(()=>n.abort(),r);try{return await fetch(e,{...t,signal:n.signal})}catch(e){if(e instanceof Error&&"AbortError"===e.name)throw Error(`${o} timed out after ${r}ms`);throw e}finally{clearTimeout(i)}}function ee(e){let t=new URL(e);return`${t.hostname}_${t.port||t.protocol.replace(":","")}${t.pathname.replace(/[^A-Za-z0-9_-]/g,"_")}`}function et(e){return e&&"object"==typeof e&&"id"in e?e.id??null:null}function er(e){if(e&&"object"==typeof e&&"method"in e)return e.method}function eo(e){if(!e||"object"!=typeof e)return;let t=e.params;return t&&"object"==typeof t?"string"==typeof t.name?t.name:"string"==typeof t.uri?t.uri:void 0:void 0}function en(e){return!!(e&&"object"==typeof e&&"id"in e&&("result"in e||"error"in e))}function ei(e){return"string"==typeof e?e:""}function es(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:void 0}function ea(e){if(e)try{return JSON.parse(e)}catch{return}}function el(e,t){return{code:e,level:"info",message:t}}function ec(e,t,r){return{code:e,level:"warn",message:t,suggestion:r}}function ed(e,t,r){return{code:e,level:"error",message:t,suggestion:r}}async function eu(t){try{let e,n=function(e){let t=$().resolve(e.projectPath),n=i(t),s={...e.demo?function(e){try{return o(e).evalCase}catch{throw Error(`unknown dbx check demo: ${e}. Supported demos: ${r.join(", ")}`)}}(e.demo):{},...e.query?{query:e.query}:{},...void 0!==e.maxStep?{max_step:e.maxStep}:{}};if(e.historyPath&&(s.history_messages=function(e){if(!S().existsSync(e))throw k("history_file_not_found",`history file not found: ${e}`,"请检查 --history 路径;历史文件应为消息数组。");let t=function(e,t,r){try{return t.endsWith(".json")?JSON.parse(e):C.qg(e)}catch(e){throw k(`${r}_file_parse_failed`,`${r} file parse failed: ${e?.message||String(e)}`,`请检查 ${t} 的语法和缩进。`)}}(S().readFileSync(e,"utf8"),e,"history");if(!Array.isArray(t))throw k("history_file_invalid","history file must be an array","请把 history 文件写成数组,例如 [{ role: USER, content: hello }]。");return t}(M(e.historyPath,t))),e.skillsDirectory?s.skills=P(M(e.skillsDirectory,t)):s.skills||(s.skills=P(n.skillDirectory)),e.manifestPath)s.manifest=E(M(e.manifestPath,t),"manifest");else{var a;if(s.manifest&&((a=s.manifest).includes("/")||a.endsWith(".json")||a.endsWith(".yaml")||a.endsWith(".yml")))s.manifest=E(M(s.manifest,t),"manifest");else if(!s.manifest){let e=n.manifestPath;S().existsSync(e)&&(s.manifest=E(e,"manifest"))}}if(e.mcpUrl&&(s.manifest=function(e,t){if("string"!=typeof e)return;if(!e.trim())return e;let r=C.Tp(e);return r.setIn(["mcp_server","end_point"],t),r.setIn(["mcp_server","mcp_config","protocol"],"Streamable"),r.toString()}(s.manifest,e.mcpUrl)),function(e){if(!e.query||"string"!=typeof e.query||!e.query.trim())throw k("query_required","dbx check requires query","请通过 --query 传入本轮用户问题。");if(!Array.isArray(e.skills)||0===e.skills.length||e.skills.some(e=>"string"!=typeof e))throw k("skill_required","dbx check requires at least one Skill","请在项目 skill/ 中放置至少一个 SKILL.md,或通过 --skill 传入 Skill 目录。");if(!e.manifest||"string"!=typeof e.manifest)throw k("manifest_required","dbx check requires manifest YAML text or path","请在项目 manifest.yaml 放置 Manifest,或通过 --manifest 传入路径。")}(s),s.history_messages=(s.history_messages??[]).map((e,t)=>{if(!e||"object"!=typeof e)throw k("history_message_invalid",`history_messages[${t}] must be an object`,"请把每条历史消息写成 { role: USER|ASSISTANT|TOOL, content: string }。");let r=String(e.role||"").toUpperCase();if(!x.has(r))throw k("history_message_role_invalid",`history_messages[${t}].role must be USER, ASSISTANT or TOOL`,"请把 role 改成 USER、ASSISTANT 或 TOOL。");if("string"!=typeof e.content||!e.content.trim())throw k("history_message_content_invalid",`history_messages[${t}].content must be a non-empty string`,"请为该历史消息补充非空 content。");return{role:r,content:e.content}}),s.max_step=s.max_step??15,!Number.isInteger(s.max_step)||s.max_step<=0)throw k("max_step_invalid","max_step must be a positive integer","请删除 max_step 使用默认值 15,或通过 --max-step 传入正整数。");return s}(t),s=await f(n.manifest,"compatible");if(!s.data?.success||!s.data.manifest)throw new eh("manifest validation failed",{code:"manifest_validation_failed",message:"manifest validation failed",errors:s.data?.errors??[],warnings:s.data?.warnings??[],log_id:s.log_id});let l=function(e,t){if(!p(t))throw k("manifest_parse_result_missing","dbx check requires parsed manifest from yaml verify","请先确认后端 /yaml/verify 返回 data.manifest。");let r=p(t.mcp_server)?t.mcp_server:void 0,o=T(t.app_key),n=T(r?.end_point);if(!o)throw k("app_id_required","dbx check requires manifest AppID","请在 manifest.yaml 配置 app_key(该字段对外称 AppID)。");if(!n)throw k("mcp_url_required","dbx check requires manifest mcp_server.end_point","请在 manifest.yaml 配置 mcp_server.end_point。");return function(e,t,r){try{let t=new URL(e);if("http:"===t.protocol||"https:"===t.protocol)return}catch{}throw k(t,`${r} must be an http(s) URL: ${e}`,`请把 ${r} 配置为 http:// 或 https:// 开头的 MCP endpoint。`)}(n,"mcp_url_invalid","manifest.mcp_server.end_point"),{...e,app_key:o,app_name:T(t.name),mcp:{url:n,description:T(r?.description),headers:_(t)}}}(n,s.data.manifest),c=function(e){if(!p(e)){var t;let e;throw t="manifest must be a parsed object",(e=Error(t)).details={code:"manifest_yaml_invalid",message:t,suggestion:"请先运行 `dbx check --file <manifest.yaml>`,确认后端能解析 manifest。"},e}let r=p(e.tools)?e.tools:{},o=p(e.entities)?e.entities:{},n={};for(let e of Object.values(o))if(p(e)&&p(e.tool_card_binding))for(let[t,r]of Object.entries(e.tool_card_binding))"string"==typeof r&&(n[t]=r);return{raw:e,appKey:"string"==typeof e.app_key?e.app_key:void 0,tools:r,entities:o,cardBindings:n}}(s.data.manifest),d=await L(l.mcp.url,l.app_key,l.mcp.headers).catch(e=>{var t,r,o;let n,i,s,a,c,d=(t=e,r=l.mcp.url,(c=(o=a=String(t?.message||t),i=(n=o.match(/<pre>([\s\S]*?)<\/pre>/i)?.[1])?n.replace(/<br\s*\/?>/gi,"\n").replace(/ /g," ").replace(/"/g,'"').replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&"):o,(s=i.match(/(?:TypeError|ReferenceError|SyntaxError|Error):[^\n<]+/)?.[0])?s.trim():/HTTP 5\d\d/.test(o)?"MCP server returned HTTP 5xx":void 0))?{code:"mcp_server_internal_error",message:`MCP server returned an internal error while handling initialize/tools/list: ${c}`,suggestion:"CLI 已连上 MCP server,但 MCP server 在 initialize 或 tools/list 内部报错。请查看 MCP server 终端日志和报错堆栈,优先修 server 代码。",details:{url:r,raw_error:a,server_error:c}}:{code:"mcp_unreachable",message:a,suggestion:"请先启动标准 MCP server,并确认 manifest.mcp_server.end_point 指向 CLI 当前运行环境可访问的 Streamable HTTP /mcp 或 SSE /sse 地址;不要求公网 URL。",details:{url:r,raw_error:a}});throw new eh(`MCP server unreachable: ${l.mcp.url}`,d)}),u={...d.tools,server_id:l.mcp.server_id||d.tools.server_id,name:l.mcp.name||d.tools.name,description:l.mcp.description||d.tools.description},m=[...function(e){let t=[],{evalCase:r,manifest:o,mcp:n}=e,i=new Set(n.tools.map(e=>e.name).filter(Boolean)),s=Object.keys(o.tools),a=new Set(s);if(o.appKey===r.app_key?t.push(el("manifest_app_id_match",`manifest AppID matches request AppID (${r.app_key})`)):t.push(ed("manifest_app_id_mismatch",`manifest AppID (${o.appKey||"-"}) does not match request AppID (${r.app_key})`,"请保持请求 AppID 与 manifest.app_key 一致;如果走特殊测试链路会改写 AppID,需要确认后端映射规则。")),n.tools.length>0){let e="sse"===n.protocol?"SSE /sse":"Streamable HTTP /mcp";t.push(el("mcp_tools_loaded",`MCP exposes ${n.tools.length} tool(s) via ${e}`))}else t.push(ed("mcp_tools_empty","MCP did not expose any tool","请检查标准 MCP tools/list 是否返回 tools。Streamable HTTP 传 /mcp,SSE 传 /sse。"));for(let e of s)i.has(e)||t.push(ed("manifest_tool_missing_in_mcp",`manifest.tools declares ${e}, but MCP does not expose it`,"请确保会出卡的 tool 同时存在于 MCP tools 与 manifest.tools。"));for(let e of r.expect?.tool_calls??[])a.has(e)||t.push(ed("expected_tool_missing_in_manifest",`expect.tool_calls declares ${e}, but manifest.tools does not declare it`,`请在 manifest.tools.${e} 中声明该工具;非出卡工具也需要配置 output.kind,例如 execution_result。`)),i.has(e)||t.push(ed("expected_tool_missing_in_mcp",`expect.tool_calls declares ${e}, but MCP does not expose it`,"请确认 MCP tools/list 返回了期望调用的工具,或修正内置 demo 的 expect.tool_calls。"));let l=Object.keys(o.cardBindings);if(l.length>0)t.push(el("card_binding_found",`card binding found: ${l.map(e=>`${e} -> ${o.cardBindings[e]}`).join(", ")}`));else{var c,d;let e=(c=r,d=o,c.expect?.card||Object.values(d.tools).some(e=>p(e)&&p(e.output)&&"entities"===e.output.kind))?ed:ec;t.push(e("card_binding_missing","manifest.entities has no tool_card_binding","如果期望出卡,请在对应 entity 下配置 tool_card_binding,例如 Taxi_order: tpl.taxi_order。"))}for(let[e,r]of Object.entries(o.entities))p(r)&&p(r.schema)&&0===Object.entries(r.schema).filter(([,e])=>p(e)&&!0===e.is_entity_id).length&&t.push(ed("entity_id_missing",`manifest.entities.${e}.schema has no is_entity_id field`,"请为实体配置一个稳定主键字段,例如 product_id: { type: string, is_entity_id: true }。"));return t}({evalCase:l,manifest:c,mcp:u}),...function(e){let t=[];for(let r of e.tools){let e=eg(r.input_schema_json);if(e)for(let o of function e(t,r){let o=[];if(!p(t))return o;for(let e of["exclusiveMinimum","exclusiveMaximum"]){let n=t[e];"number"==typeof n&&o.push({path:`${r}/${e}`,value:n,message:`${e} is number ${n}, but simulator backend expects boolean`,suggestion:"如果使用 zod,避免 z.number().positive()/min()/max() 生成数值型 exclusiveMinimum/exclusiveMaximum;可改为 z.coerce.number() 并在工具内部校验业务范围。"})}for(let[n,i]of Object.entries(t))p(i)&&o.push(...e(i,`${r}/${n}`)),Array.isArray(i)&&i.forEach((t,i)=>{o.push(...e(t,`${r}/${n}/${i}`))});return o}(e,`tools/${r.name}/inputSchema`))t.push({code:"mcp_tool_schema_incompatible",level:"error",message:`MCP tool ${r.name} inputSchema is not compatible: ${o.message}`,suggestion:o.suggestion,details:{tool_name:r.name,path:o.path,value:o.value}})}return t}(u)],y=t.gatewayOrigin||a();if(!t.force&&m.some(e=>"error"===e.level))return j({evalCase:l,manifest:c,preflight:m,gatewayOrigin:y,cardExpectation:t.cardExpectation,result:em()});try{e=await h({evalCase:l,manifestYAML:l.manifest,mcp:u,gatewayOrigin:y,callbacks:{onToolCall:async(e,t)=>{var r,o;return N(l.mcp.url,(r=l,o=e,{request_id:t,app_key:o.app_key||r.app_key,server_id:o.server_id||r.mcp?.server_id||"",tool_call_id:o.tool_call_id,tool_name:o.tool_name,arguments:eg(o.arguments_json)||{},arguments_json:o.arguments_json||"{}"}))}}})}catch(e){if(e instanceof g)return j({evalCase:l,manifest:c,preflight:m,gatewayOrigin:y,cardExpectation:t.cardExpectation,result:ep(e.state,[e_(e)])});return j({evalCase:l,manifest:c,preflight:m,gatewayOrigin:y,result:{...em(),log_id:ef(e,"logId")||ef(e,"log_id"),stream_errors:[e_(e)]},cardExpectation:t.cardExpectation})}return j({evalCase:l,manifest:c,preflight:m,gatewayOrigin:y,cardExpectation:t.cardExpectation,result:ep(e)})}finally{e?.kind==="sse"&&W(e),e=void 0}}function em(){return{request_id:"",tool_calls:[],cards:[],answer:"",trace_events:[],stream_errors:[]}}function ep(e,t=[]){return{request_id:e.requestID,log_id:e.logID,trace_id:e.traceID,tool_calls:e.toolCalls.map(e=>{var t;return{tool_name:e.toolCall.tool_name,tool_call_id:e.toolCall.tool_call_id,app_key:e.toolCall.app_key,server_id:e.toolCall.server_id,arguments:eg(e.toolCall.arguments_json)??e.toolCall.arguments_json,report_code:"number"==typeof e.report?.code?e.report.code:void 0,report_message:"string"==typeof e.report?.message?e.report.message:void 0,result_error:e.result?.is_error,result_preview:(t=e.result?.raw_result_text||e.result?.content||"").length>240?`${t.slice(0,240)}...`:t}}),cards:e.cards,answer:e.answer,trace_events:e.traceEvents,stream_errors:[...e.streamErrors,...t]}}function e_(e){var t;let r=e instanceof Error?e.message:String(e);return{code:ef(e,"code")||"simulator_eval_runtime_error",level:"error",message:r,suggestion:(t=r).includes("fetch failed")||t.includes("ECONNREFUSED")||t.includes("ENOTFOUND")||t.includes("timed out")?"无法连接 Simulator gateway。请检查 --gateway-origin、网络/PPE 泳道、登录环境和代理配置。":t.includes("HTTP 400")||t.includes("HTTP 422")?"请求被 gateway 或 agent 拒绝。请检查 manifest YAML、mcp tools、AppID 和 query 是否匹配;可加 --verbose 查看更多 trace。":t.includes("HTTP 5")?"Simulator 服务端异常。请保留 log_id/request_id 给服务端排查。":t.includes("tool report failed")?"工具结果上报失败。请检查 MCP 返回的 structuredContent/entities 是否符合 manifest 声明。":void 0,details:p(e)?{...e,message:r}:r}}function ef(e,t){if(!p(e))return;let r=e[t];return"string"==typeof r&&r?r:void 0}function eg(e){if("string"==typeof e)try{return JSON.parse(e)}catch{return}}class eh extends Error{details;constructor(e,t){super(e),this.details=t}}let ey={runSimulator:eu,startDemoServer:n,validateFile:ex};function ev(){return new d("check").description("校验配置文件或检查 Agentic Service Simulator 链路").option("--file <file>","校验 manifest.yaml 或 business-templates.yaml").option("--project-path <path>","dbx 项目路径;相对路径参数会基于该目录解析",".").addOption(new u("--demo <name>","运行内置 demo").choices([...r])).option("--query <query>","当前轮用户 query").option("--history <path>","历史消息文件,支持 json/yaml 数组").option("--skill <path>","Skill 目录路径;显式目录优先,相对路径按 --project-path 解析;未传默认 skill/,递归加载所有 SKILL.md").option("--manifest <path>","manifest yaml 文件路径;默认按项目布局自动解析").option("--gateway-origin <url>","Simulator 网关 origin;默认使用 CLI build config apiBaseUrl").addOption(new u("--max-step <count>","Agent 最大循环步数").argParser(l)).addOption(new u("--expect-card <expectation>","当前评测是否期望出卡;required 要求至少一张卡,none 要求不出卡,auto 使用默认诊断").choices(["auto","required","none"]).default("auto")).option("--force","即使 preflight 发现配置错误也继续请求 Simulator",!1).option("--verbose","输出更多 trace 和工具结果摘要",!1).action(async(e,t)=>c(t,t=>ew(e,t)))}async function ew(e,t,r=ey){let o;if(e.file){var n;return((n=e).demo||n.query||n.history||n.skill||n.manifest||n.gatewayOrigin||void 0!==n.maxStep||n.force||n.verbose||"auto"!==n.expectCard)&&t.error("--file cannot be combined with Simulator check options"),r.validateFile(t,(0,b.resolve)(e.projectPath,e.file))}e.demo||e.query||t.error('check requires --file, --demo, or --query. Examples: dbx check --file manifest.yaml; dbx check --demo taxi; dbx check --query "..."');try{return e.demo&&(o=await r.startDemoServer({demo:e.demo,host:"127.0.0.1",port:0,log:t.log})),await eS(t,e,r.runSimulator,o?.streamableUrl)}finally{if(o)try{await o.close()}catch(e){t.warn(`Unable to stop Demo MCP Server: ${String(e)}`)}}}async function eS(e,t,r,o){let n;try{e.targetAppId=(n=await r({projectPath:t.projectPath,demo:t.demo,mcpUrl:o,query:t.query,historyPath:t.history,skillsDirectory:t.skill,manifestPath:t.manifest,gatewayOrigin:t.gatewayOrigin,maxStep:t.maxStep,cardExpectation:t.expectCard,force:t.force,verbose:t.verbose})).case.app_key}catch(a){var i,s;let t,r,o;if(e.json)throw a;let n=(t=p(i=a)?i.details:void 0,{code:e$(r=p(t)?t:void 0,"code"),message:e$(r,"message")||(i instanceof Error&&i.message?i.message:String(i)),suggestion:e$(r,"suggestion"),logId:e$(r,"log_id")||e$(r,"logId")||e$(i,"log_id")||e$(i,"logId"),details:t});throw new m((o=["Agentic Service Check failed before diagnostics could run","","Error",...(s=n).code?[`- code: ${s.code}`]:[],`- message: ${s.message}`,...s.logId?[`- log_id: ${s.logId}`]:[],...s.suggestion?[`- fix: ${s.suggestion}`]:[]],void 0!==s.details&&o.push("","Details",eb(s.details)),o.join("\n")),{details:n.details,logId:n.logId})}if(e.json||function(e,t,r){let o=t.ok?y.green("PASS"):y.red("FAIL");if(e.log(`${y.bold("Agentic Service Check")} ${o}`),e.log(""),e.log(y.bold("Input")),e.log(`- app_id: ${t.case.app_key}`),e.log(`- query: ${t.context.query}`),e.log(`- history_messages: ${t.context.history_count}`),e.log(`- mcp_url: ${t.context.mcp_url||"-"}`),e.log(`- gateway_origin: ${t.context.gateway_origin||"-"}`),e.log(`- max_step: ${t.context.max_step??"-"}`),e.log(`- request_id: ${t.request_id||"-"}`),e.log(`- log_id: ${t.log_id||"-"}`),e.log(""),eC(e,"Preflight",t.preflight,r),e.log(""),e.log(y.bold("Agent Flow")),0===t.tool_calls.length?e.log("- no tool call"):t.tool_calls.forEach((t,o)=>{e.log(`${o+1}. ${y.cyan(t.tool_name)} ${0===t.report_code?y.green("reported"):y.yellow(`report=${t.report_code??"-"}`)}`),e.log(` tool_call_id: ${t.tool_call_id}`),t.app_key&&e.log(` app_id: ${t.app_key}`),e.log(` args: ${JSON.stringify(t.arguments??{})}`),r&&t.result_preview&&e.log(` result: ${t.result_preview}`)}),e.log(""),e.log(y.bold("Cards")),0===t.cards.length?e.log("- no card emitted"):t.cards.forEach((t,r)=>{e.log(`${r+1}. widget_id=${t.widget_id||"-"} entity_id=${t.entity_id||"-"} template=${t.template||"-"}`)}),e.log(""),t.answer&&(e.log(y.bold("Answer")),e.log(t.answer),e.log("")),r&&t.trace_events.length>0){for(let r of(e.log(y.bold("Trace")),t.trace_events))e.log(`- ${r.name||"-"} ${r.status||"-"} ${r.tool_name||""} ${r.summary||""}`);e.log("")}eC(e,"Diagnostics",t.errors,r),e.log(""),e.log(`${y.bold("Verdict")}: ${o}`)}(e,n,t.verbose),!n.ok)throw new m("check failed",{json:n,logId:n.log_id});return n}function eb(e){return"string"==typeof e?e:JSON.stringify(e,null,2)}function e$(e,t){if(!p(e))return;let r=e[t];return"string"==typeof r&&r?r:void 0}function eC(e,t,r,o){if(e.log(y.bold(t)),0===r.length)return void e.log("- none");for(let t of r){let r="error"===t.level?y.red("✗"):"warn"===t.level?y.yellow("!"):y.green("✓");e.log(`${r} ${t.code}: ${t.message}`),t.suggestion&&e.log(` fix: ${t.suggestion}`),o&&void 0!==t.details&&e.log(` details: ${eb(t.details)}`)}}async function ex(e,t){(0,w.existsSync)(t)&&(0,w.statSync)(t).isFile()||e.error(`YAML file not found: ${t}`);let r=(0,w.readFileSync)(t,"utf8"),o=eP(t,e),n=await f(r,"compatible",o),i=n.data,s={valid:!!i?.success,manifest:i?.manifest,errors:eE(i?.errors??[]),warnings:eE(i?.warnings??[]),log_id:n.log_id??""};if("manifest"===o&&p(s.manifest)&&"string"==typeof s.manifest.app_key&&(e.targetAppId=s.manifest.app_key.trim()||void 0),e.log(`${o} validation: ${s.valid?"passed":"failed"}`),e.log(JSON.stringify(s,null,2)),!s.valid)throw new m(`${o} validation failed`,{json:s,logId:s.log_id});return s}function eP(e,t){switch((0,b.basename)(e).toLowerCase()){case"manifest.yaml":return"manifest";case"business-templates.yaml":return"business_templates";default:t.error(`Cannot infer YAML type from filename "${(0,b.basename)(e)}". Use manifest.yaml or business-templates.yaml.`)}}function eE(e){return e.map(e=>({code:e.code,path:e.path,message:e.message}))}export{v as check_namespaceObject};
|
package/dist/dbx.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import"node:module";import{__webpack_require__ as
|
|
2
|
-
`,"utf8")}function l(
|
|
1
|
+
import"node:module";import{__webpack_require__ as r}from"./rslib-runtime.js";import"./3768.js";import{isRecord as e}from"./2168.js";import{SUPPORTED_AGENTS as i}from"./skills~1.js";let o=r("node:fs"),n=r("node:path");function t(r){if(!o.existsSync(r))return{};let i=JSON.parse(o.readFileSync(r,"utf8"));return e(i)?i:{}}function s(r,l,f={}){let c=n.resolve(r,".dbx"),d=n.join(c,"config.json");o.mkdirSync(c,{recursive:!0});let _=function(r,o,n={}){var t;let s,l=e(r.frontend)?r.frontend:{},f=e(r.mcp_server)?r.mcp_server:{},c=e(t=r.app)?Object.fromEntries(Object.entries(t).filter(([r])=>"app_key"!==r)):{},d=(s=o.find(r=>"universal"!==r))?i.find(r=>r.id===s)?.host??"claude":"codex";return{...r,app:Object.keys(c).length>0?c:void 0,version:"string"==typeof r.version?r.version:"0.1.0",mode:"string"==typeof r.mode?r.mode:"ai-only",host:d,profile:"string"==typeof r.profile?r.profile:"",frontend:{...l,directory:"string"==typeof n.frontendDirectory?n.frontendDirectory:"string"==typeof l.directory?l.directory:""},mcp_server:{...f},skills:Array.isArray(r.skills)?r.skills:[]}}(t(d),l,f);o.writeFileSync(d,`${JSON.stringify(_,null,2)}
|
|
2
|
+
`,"utf8")}function l(r){return t(n.join(n.resolve(r,".dbx"),"config.json"))}function f(r,e,i={}){var s,l;let c=n.resolve(r,".dbx"),d=n.join(c,"config.json");o.mkdirSync(c,{recursive:!0});let _=t(d),p=(s=_.skills,l=e,Array.from(new Set([...Array.isArray(s)?s.filter(r=>"string"==typeof r):[],...l.filter(r=>"string"==typeof r)])).sort()),y={..._,skills_mode:void 0,skills:p,...i.source?{skills_source:i.source}:{},...i.skillsVersion?{skills_version:i.skillsVersion}:{},...i.cliVersion?{dbx_cli_version:i.cliVersion}:{}};o.writeFileSync(d,`${JSON.stringify(y,null,2)}
|
|
3
3
|
`,"utf8")}export{l as readDbxConfig,f as updateDbxConfigSkills,s as writeDbxConfig};
|
package/dist/demo-server.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./3768.js";import{
|
|
2
|
-
`),
|
|
1
|
+
import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./3768.js";import{isRecord as t}from"./2168.js";let r=e("node:fs");var n=e.n(r);let i=e("node:path");var o=e.n(i);let a=e("node:url"),s=o().dirname((0,a.fileURLToPath)(import.meta.url)),p=["taxi","milk-tea"];function d(e){if("taxi"===e)return l;if("milk-tea"===e)return c;throw Error(`unknown demo: ${e}. Supported demos: ${p.join(", ")}`)}let l={name:"taxi",appKey:"db_app_api_test_taxi",appName:"打车测试智能服务",serverName:"dbx-taxi-demo-mcp",tools:[{name:"Taxi_search",description:"搜索可用打车方案,返回 plan_id、车型、价格、距离和预计到达时间。",inputSchema:{type:"object",properties:{destination:{type:"string",description:"目的地"},preference:{type:"string",description:"车型或偏好,例如惠选、快车、商务"}},required:["destination"]}},{name:"Taxi_order",description:"根据 plan_id 发起打车订单,返回可出卡的智能服务订单实体。",inputSchema:{type:"object",properties:{plan_id:{type:"string",description:"Taxi_search 返回的方案 ID"},destination:{type:"string",description:"目的地"}},required:["plan_id"]}}],callTool:function(e,t){if("Taxi_search"===e){let e=m(t.destination)||"北京南站",r=m(t.preference)||"惠选";return{content:[{type:"text",text:`找到 2 个去${e}的${r}打车方案。`}],structuredContent:{plans:[{plan_id:"plan_demo_001",car_type:r,price_yuan:48.5,distance_km:12.8,eta_min:6},{plan_id:"plan_demo_002",car_type:"快车",price_yuan:55,distance_km:12.8,eta_min:4}]},isError:!1}}if("Taxi_order"===e){let e=m(t.destination)||"北京南站",r=m(t.plan_id)||"plan_demo_001";return{content:[{type:"text",text:`已为你创建去${e}的打车订单。`}],structuredContent:{entities:[{entity_type:"product",product_id:`taxi_order_${r}`,name:`去${e}的打车订单`,car_type:"惠选",price_yuan:48.5,status:"已下单"}]},isError:!1}}return{content:[{type:"text",text:`unknown tool: ${e}`}],isError:!0}},evalCase:{app_key:"doubao-api-test-taxi",app_name:"打车测试智能服务",query:"帮我叫一辆惠选去北京南站,直接下单",history_messages:[{role:"USER",content:"上一轮:你能调用智能服务工具吗?"},{role:"ASSISTANT",content:"可以,我会等待工具调用结果再继续回答。"}],skills:[_("taxi","SKILL.md")],manifest:_("taxi","manifest.yaml"),max_step:15,expect:{tool_calls:["Taxi_search","Taxi_order"],card:{widget_id:"tpl.taxi_order",min_count:1}}}},c={name:"milk-tea",appKey:"db_app_api_test_milk_tea",appName:"奶茶测试智能服务",serverName:"dbx-milk-tea-demo-mcp",tools:[{name:"MilkTea_search",description:"根据口味、场景和偏好搜索奶茶商品,返回 sku_id、名称、甜度、价格和推荐理由。",inputSchema:{type:"object",properties:{query:{type:"string",description:"用户想喝的饮品或场景,例如下午提神、少糖奶茶"},sugar:{type:"string",description:"甜度偏好,例如少糖、半糖、无糖"}},required:["query"]}},{name:"MilkTea_order",description:"根据 sku_id 创建奶茶订单,返回可出卡的智能服务订单实体。",inputSchema:{type:"object",properties:{sku_id:{type:"string",description:"MilkTea_search 返回的商品 ID"},sugar:{type:"string",description:"甜度"}},required:["sku_id"]}}],callTool:function(e,t){if("MilkTea_search"===e){let e=m(t.query)||"下午提神少糖奶茶",r=m(t.sugar)||"少糖";return{content:[{type:"text",text:`找到 3 个适合「${e}」的${r}奶茶选项。`}],structuredContent:{products:[{sku_id:"tea_demo_001",name:"冷萃乌龙奶茶",sugar:r,price_yuan:18,selling_point:"茶香明显,适合下午提神"},{sku_id:"tea_demo_002",name:"茉莉轻乳茶",sugar:r,price_yuan:16,selling_point:"口感清爽,负担较低"},{sku_id:"tea_demo_003",name:"厚乳拿铁奶茶",sugar:"半糖",price_yuan:21,selling_point:"奶香更足,提神感更强"}]},isError:!1}}if("MilkTea_order"===e){var r;let e=m(t.sku_id)||"tea_demo_001",n=m(t.sugar)||"少糖",i=("number"==typeof(r=t.quantity)&&Number.isFinite(r)?r:0)||1;return{content:[{type:"text",text:`已为你下单 ${i} 杯${n}冷萃乌龙奶茶。`}],structuredContent:{entities:[{entity_type:"product",product_id:`milk_tea_order_${e}`,name:"冷萃乌龙奶茶",sugar:n,quantity:i,price_yuan:18*i,status:"已下单",selling_point:"茶香明显,适合下午提神"}]},isError:!1}}return{content:[{type:"text",text:`unknown tool: ${e}`}],isError:!0}},evalCase:{app_key:"doubao-api-test-milk-tea",app_name:"奶茶测试智能服务",query:"我想点一杯适合下午提神的少糖奶茶,直接下单",history_messages:[{role:"USER",content:"上一轮:你能帮我点饮品吗?"},{role:"ASSISTANT",content:"可以,我会先查找合适饮品,再根据你的确认或明确下单意图创建订单。"}],skills:[_("milk-tea","SKILL.md")],manifest:_("milk-tea","manifest.yaml"),max_step:15,expect:{tool_calls:["MilkTea_search","MilkTea_order"],card:{widget_id:"tpl.milk_tea_order",min_count:1}}}};function m(e){return"string"==typeof e?e:""}function _(e,t){return n().readFileSync(o().join(s,"demos",`${e}.${t}`),"utf8")}let u=e("node:http");var y=e.n(u);let f=e("node:crypto");async function h(e){let t=d(e.demo),r=new Map,n=y().createServer(async(n,i)=>{try{let o=new URL(n.url||"/",`http://${n.headers.host||`${e.host}:${e.port}`}`);if("POST"===n.method&&"/mcp"===$(o.pathname)){let r=await x(n);e.log?.(`[mcp] ${r.method||"-"} ${k(r)}`);let o=g(t,r);if(!o){i.writeHead(202),i.end();return}i.writeHead(200,{"content-type":"application/json","mcp-session-id":`demo-${t.name}-session`}),i.end(JSON.stringify(o));return}if("GET"===n.method&&"/sse"===$(o.pathname)){let t=(0,f.randomUUID)();i.writeHead(200,{"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive"});let o={write:(e,t)=>{i.write(`event: ${e}
|
|
2
|
+
`),i.write(`data: ${"string"==typeof t?t:JSON.stringify(t)}
|
|
3
3
|
|
|
4
|
-
`)},close:()=>
|
|
4
|
+
`)},close:()=>i.end()};r.set(t,o),n.on("close",()=>r.delete(t)),o.write("endpoint",`/sse/message?session_id=${encodeURIComponent(t)}`),e.log?.(`[sse] connected session=${t}`);return}if("POST"===n.method&&"/sse/message"===$(o.pathname)){let a=o.searchParams.get("session_id")||"",s=r.get(a);if(!s)return void S(i,404,{error:"SSE session not found"});let p=await x(n);e.log?.(`[sse] ${p.method||"-"} ${k(p)}`);let d=g(t,p);i.writeHead(202),i.end(),d&&s.write("message",d);return}if("GET"===n.method&&"/health"===$(o.pathname))return void S(i,200,{ok:!0,demo:e.demo});S(i,404,{error:"not found",paths:["/mcp","/sse","/health"]})}catch(e){S(i,500,{error:e instanceof Error?e.message:String(e)})}});await new Promise((t,r)=>{n.once("error",r),n.listen(e.port,e.host,()=>{n.off("error",r),t()})});let i=n.address(),o="object"==typeof i&&i?i.port:e.port,a=`http://${e.host}:${o}`;return{origin:a,streamableUrl:`${a}/mcp`,sseUrl:`${a}/sse`,close:()=>new Promise((e,t)=>{for(let e of r.values())e.close();r.clear(),n.close(r=>r?t(r):e())})}}function g(e,r){if("initialize"===r.method)return{jsonrpc:"2.0",id:r.id,result:{protocolVersion:r.params?.protocolVersion||"2025-11-25",capabilities:{tools:{}},serverInfo:{name:e.serverName,version:"0.1.0"}}};if("notifications/initialized"!==r.method){if("tools/list"===r.method)return{jsonrpc:"2.0",id:r.id,result:{tools:e.tools}};if("tools/call"===r.method){let n="string"==typeof r.params?.name?r.params.name:"",i=t(r.params?.arguments)?r.params.arguments:{};return{jsonrpc:"2.0",id:r.id,result:e.callTool(n,i)}}return{jsonrpc:"2.0",id:r.id??null,error:{code:-32601,message:`Method not found: ${r.method||"-"}`}}}}function x(e){return new Promise((t,r)=>{let n="";e.setEncoding("utf8"),e.on("data",e=>{n+=e}),e.on("end",()=>{try{t(n?JSON.parse(n):{})}catch(e){r(e)}}),e.on("error",r)})}function k(e){if("tools/call"!==e.method)return"";let t=e.params?.name;return"string"==typeof t?t:""}function S(e,t,r){e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(r))}function $(e){return e.replace(/\/+$/,"")||"/"}export{p as DBX_DEMO_NAMES,d as getDBXDemo,h as startMCPDemoServer};
|
package/dist/demo.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"node:module";import{parseInteger as e,runCommand as o,command_Command as t,option_Option as r}from"./2168.js";import{DBX_DEMO_NAMES as s,startMCPDemoServer as i}from"./demo-server.js";import{dist as a}from"./@inquirer/select.js";let n={chooseDemo:e=>a(e,{output:process.stderr}),isInteractive:()=>!!process.stdin.isTTY&&!!process.stderr.isTTY,startServer:i,waitForShutdown:function(e){return new Promise(o=>{let t=!1,r=r=>{t||(t=!0,e(r).finally(o))};process.once("SIGINT",()=>r("SIGINT")),process.once("SIGTERM",()=>r("SIGTERM"))})},writeEvent:e=>process.stdout.write(`${JSON.stringify(e)}
|
|
2
|
+
`)};function l(e,o){return(e.taxi&&e.milkTea&&o.error("--taxi and --milk-tea cannot be combined"),e.taxi)?"taxi":e.milkTea?"milk-tea":void 0}async function m(e,o,t=n){return e||((o.json||!t.isInteractive())&&o.error(`demo is required outside an interactive terminal. Supported demos: ${s.join(", ")}. Example: dbx mcp demo --taxi --json`),t.chooseDemo({message:"选择要启动的 Demo MCP Server",choices:s.map(e=>({name:e,value:e}))}))}async function p(e,o,t,r=n){let s=await m(o,e,r),i=await r.startServer({demo:s,host:t.host,port:t.port,log:e.log});e.json?r.writeEvent({schema:"dbx.mcp.demo.v1",event:"ready",demo:s,pid:process.pid,endpoints:{streamable_http:i.streamableUrl,sse:i.sseUrl,health:`${i.origin}/health`}}):(e.log("Demo MCP Server started for local debugging"),e.log(`demo: ${s}`),e.log(`streamable_http: ${i.streamableUrl}`),e.log(`sse: ${i.sseUrl}`),e.log(`health: ${i.origin}/health`),e.log(""),e.log("press Ctrl+C to stop")),await r.waitForShutdown(async o=>{try{await i.close()}catch(o){e.warn(`Unable to stop Demo MCP Server: ${String(o)}`)}e.json&&r.writeEvent({schema:"dbx.mcp.demo.v1",event:"stopped",demo:s,pid:process.pid,signal:o})})}export default function(){return new t("demo").description("启动用于本地调试的内置 Demo MCP Server").option("--taxi","启动 Taxi Demo MCP Server").option("--milk-tea","启动 Milk Tea Demo MCP Server").option("--host <host>","监听 host","127.0.0.1").addOption(new r("--port <port>","监听端口;0 表示自动选择空闲端口").default(0).argParser(e)).action(async(e,t)=>o(t,o=>{let t=l(e,o);return p(o,t,e)}))};export{m as resolveMcpDemo,l as resolveMcpDemoFlag,p as runMcpDemo};
|
package/dist/dev-shell.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./6831.js";import"./3768.js";import{source as t,node_modules_figures as r}from"./6780.js";import{use_input as n,Text as l,build_render as a,use_app as s,Static as i,components_Box as o,use_window_size as c}from"./ink.js";import{DEV_SHELL_HELP_ITEMS as u,DEV_SHELL_DEVICE_HELP_ITEMS as _,formatDeviceAppSetupStatus as f}from"./dev.js";import{version_version as m}from"./2168.js";e.add({"../../../node_modules/.pnpm/deepmerge@4.3.1/node_modules/deepmerge/dist/cjs.js"(e){var t=function(e){var t,n,l;return!!(t=e)&&"object"==typeof t&&(n=e,"[object RegExp]"!==(l=Object.prototype.toString.call(n))&&"[object Date]"!==l&&n.$$typeof!==r)},r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?i(Array.isArray(e)?[]:{},e,t):e}function l(e,t,r){return e.concat(t).map(function(e){return n(e,r)})}function a(e){return Object.keys(e).concat(Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[])}function s(e,t){try{return t in e}catch(e){return!1}}function i(e,r,o){(o=o||{}).arrayMerge=o.arrayMerge||l,o.isMergeableObject=o.isMergeableObject||t,o.cloneUnlessOtherwiseSpecified=n;var c,u,_=Array.isArray(r);return _!==Array.isArray(e)?n(r,o):_?o.arrayMerge(e,r,o):(u={},(c=o).isMergeableObject(e)&&a(e).forEach(function(t){u[t]=n(e[t],c)}),a(r).forEach(function(t){s(e,t)&&!(Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))||(s(e,t)&&c.isMergeableObject(r[t])?u[t]=(function(e,t){if(!t.customMerge)return i;var r=t.customMerge(e);return"function"==typeof r?r:i})(t,c)(e[t],r[t],c):u[t]=n(r[t],c))}),u)}i.all=function(e,t){if(!Array.isArray(e))throw Error("first argument should be an array");return e.reduce(function(e,r){return i(e,r,t)},{})},e.exports=i}});let d={info:"blue",success:"green",error:"red",warning:"yellow"},v={success:"green",error:"red",warning:"yellow",info:"blue"},p={success:r.tick,error:r.cross,warning:r.warning,info:r.info},g=e("../../../node_modules/.pnpm/react@19.2.7/node_modules/react/index.js");e("../../../node_modules/.pnpm/deepmerge@4.3.1/node_modules/deepmerge/dist/cjs.js");let b=(0,g.createContext)({components:{Alert:{styles:{container:({variant:e})=>({flexGrow:1,borderStyle:"round",borderColor:d[e],gap:1,paddingX:1}),iconContainer:()=>({flexShrink:0}),icon:({variant:e})=>({color:d[e]}),content:()=>({flexShrink:1,flexGrow:1,minWidth:0,flexDirection:"column",gap:1}),title:()=>({bold:!0}),message:()=>({})},config({variant:e}){let t;return"info"===e&&(t=r.info),"success"===e&&(t=r.tick),"error"===e&&(t=r.cross),"warning"===e&&(t=r.warning),{icon:t}}},Badge:{styles:{container:({color:e})=>({backgroundColor:e}),label:()=>({color:"black"})}},ConfirmInput:{styles:{input:({isFocused:e})=>({dimColor:!e})}},MultiSelect:{styles:{container:()=>({flexDirection:"column"}),option:({isFocused:e})=>({gap:1,paddingLeft:2*!e}),selectedIndicator:()=>({color:"green"}),focusIndicator:()=>({color:"blue"}),label({isFocused:e,isSelected:t}){let r;return t&&(r="green"),e&&(r="blue"),{color:r}},highlightedText:()=>({bold:!0})}},OrderedList:{styles:{list:()=>({flexDirection:"column"}),listItem:()=>({gap:1}),marker:()=>({dimColor:!0}),content:()=>({flexDirection:"column"})}},ProgressBar:{styles:{container:()=>({flexGrow:1,minWidth:0}),completed:()=>({color:"magenta"}),remaining:()=>({dimColor:!0})},config:()=>({completedCharacter:r.square,remainingCharacter:r.squareLightShade})},Select:{styles:{container:()=>({flexDirection:"column"}),option:({isFocused:e})=>({gap:1,paddingLeft:2*!e}),selectedIndicator:()=>({color:"green"}),focusIndicator:()=>({color:"blue"}),label({isFocused:e,isSelected:t}){let r;return t&&(r="green"),e&&(r="blue"),{color:r}},highlightedText:()=>({bold:!0})}},Spinner:{styles:{container:()=>({gap:1}),frame:()=>({color:"blue"}),label:()=>({})}},StatusMessage:{styles:{container:()=>({gap:1}),iconContainer:()=>({flexShrink:0}),icon:({variant:e})=>({color:v[e]}),message:()=>({})},config:({variant:e})=>({icon:p[e]})},UnorderedList:{styles:{list:()=>({flexDirection:"column"}),listItem:()=>({gap:1}),marker:()=>({dimColor:!0}),content:()=>({flexDirection:"column"})},config:()=>({marker:r.line})},TextInput:{styles:{value:()=>({})}},EmailInput:{styles:{value:()=>({})}},PasswordInput:{styles:{value:()=>({})}}}}),h=e=>(0,g.useContext)(b).components[e],x=r.line;(0,g.createContext)({marker:x}),(0,g.createContext)({depth:0});class y extends Map{first;constructor(e){let t,r,n=[],l=0;for(let a of e){let e={...a,previous:r,next:void 0,index:l};r&&(r.next=e),t||=e,n.push([a.value,e]),l++,r=e}super(n),this.first=t}}let E=e("node:util");function C({isFocused:e,isSelected:t,children:n}){let{styles:a}=h("Select");return g.createElement(o,{...a.option({isFocused:e})},e&&g.createElement(l,{...a.focusIndicator()},r.pointer),g.createElement(l,{...a.label({isFocused:e,isSelected:t})},n),t&&g.createElement(l,{...a.selectedIndicator()},r.tick))}let w=(e,t)=>{switch(t.type){case"focus-next-option":{if(!e.focusedValue)return e;let t=e.optionMap.get(e.focusedValue);if(!t)return e;let r=t.next;if(!r)return e;if(!(r.index>=e.visibleToIndex))return{...e,focusedValue:r.value};let n=Math.min(e.optionMap.size,e.visibleToIndex+1),l=n-e.visibleOptionCount;return{...e,focusedValue:r.value,visibleFromIndex:l,visibleToIndex:n}}case"focus-previous-option":{if(!e.focusedValue)return e;let t=e.optionMap.get(e.focusedValue);if(!t)return e;let r=t.previous;if(!r)return e;if(!(r.index<=e.visibleFromIndex))return{...e,focusedValue:r.value};let n=Math.max(0,e.visibleFromIndex-1),l=n+e.visibleOptionCount;return{...e,focusedValue:r.value,visibleFromIndex:n,visibleToIndex:l}}case"select-focused-option":return{...e,previousValue:e.value,value:e.focusedValue};case"reset":return t.state}},S=({visibleOptionCount:e,defaultValue:t,options:r})=>{let n="number"==typeof e?Math.min(e,r.length):r.length,l=new y(r);return{optionMap:l,visibleOptionCount:n,focusedValue:l.first?.value,visibleFromIndex:0,visibleToIndex:n,previousValue:t,value:t}};function O({isDisabled:e=!1,visibleOptionCount:t=5,highlightText:r,options:a,defaultValue:s,onChange:i}){let c=(({visibleOptionCount:e=5,options:t,defaultValue:r,onChange:n})=>{let[l,a]=(0,g.useReducer)(w,{visibleOptionCount:e,defaultValue:r,options:t},S),[s,i]=(0,g.useState)(t);t===s||(0,E.isDeepStrictEqual)(t,s)||(a({type:"reset",state:S({visibleOptionCount:e,defaultValue:r,options:t})}),i(t));let o=(0,g.useCallback)(()=>{a({type:"focus-next-option"})},[]),c=(0,g.useCallback)(()=>{a({type:"focus-previous-option"})},[]),u=(0,g.useCallback)(()=>{a({type:"select-focused-option"})},[]),_=(0,g.useMemo)(()=>t.map((e,t)=>({...e,index:t})).slice(l.visibleFromIndex,l.visibleToIndex),[t,l.visibleFromIndex,l.visibleToIndex]);return(0,g.useEffect)(()=>{l.value&&l.previousValue!==l.value&&n?.(l.value)},[l.previousValue,l.value,t,n]),{focusedValue:l.focusedValue,visibleFromIndex:l.visibleFromIndex,visibleToIndex:l.visibleToIndex,value:l.value,visibleOptions:_,focusNextOption:o,focusPreviousOption:c,selectFocusedOption:u}})({visibleOptionCount:t,options:a,defaultValue:s,onChange:i});(({isDisabled:e=!1,state:t})=>{n((e,r)=>{r.downArrow&&t.focusNextOption(),r.upArrow&&t.focusPreviousOption(),r.return&&t.selectFocusedOption()},{isActive:!e})})({isDisabled:e,state:c});let{styles:u}=h("Select");return g.createElement(o,{...u.container()},c.visibleOptions.map(t=>{let n=t.label;if(r&&t.label.includes(r)){let e=t.label.indexOf(r);n=g.createElement(g.Fragment,null,t.label.slice(0,e),g.createElement(l,{...u.highlightedText()},r),t.label.slice(e+r.length))}return g.createElement(C,{key:t.value,isFocused:!e&&c.focusedValue===t.value,isSelected:c.value===t.value},n)}))}var k=JSON.parse('{"dots":{"interval":80,"frames":["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"]},"dots2":{"interval":80,"frames":["⣾","⣽","⣻","⢿","⡿","⣟","⣯","⣷"]},"dots3":{"interval":80,"frames":["⠋","⠙","⠚","⠞","⠖","⠦","⠴","⠲","⠳","⠓"]},"dots4":{"interval":80,"frames":["⠄","⠆","⠇","⠋","⠙","⠸","⠰","⠠","⠰","⠸","⠙","⠋","⠇","⠆"]},"dots5":{"interval":80,"frames":["⠋","⠙","⠚","⠒","⠂","⠂","⠒","⠲","⠴","⠦","⠖","⠒","⠐","⠐","⠒","⠓","⠋"]},"dots6":{"interval":80,"frames":["⠁","⠉","⠙","⠚","⠒","⠂","⠂","⠒","⠲","⠴","⠤","⠄","⠄","⠤","⠴","⠲","⠒","⠂","⠂","⠒","⠚","⠙","⠉","⠁"]},"dots7":{"interval":80,"frames":["⠈","⠉","⠋","⠓","⠒","⠐","⠐","⠒","⠖","⠦","⠤","⠠","⠠","⠤","⠦","⠖","⠒","⠐","⠐","⠒","⠓","⠋","⠉","⠈"]},"dots8":{"interval":80,"frames":["⠁","⠁","⠉","⠙","⠚","⠒","⠂","⠂","⠒","⠲","⠴","⠤","⠄","⠄","⠤","⠠","⠠","⠤","⠦","⠖","⠒","⠐","⠐","⠒","⠓","⠋","⠉","⠈","⠈"]},"dots9":{"interval":80,"frames":["⢹","⢺","⢼","⣸","⣇","⡧","⡗","⡏"]},"dots10":{"interval":80,"frames":["⢄","⢂","⢁","⡁","⡈","⡐","⡠"]},"dots11":{"interval":100,"frames":["⠁","⠂","⠄","⡀","⢀","⠠","⠐","⠈"]},"dots12":{"interval":80,"frames":["⢀⠀","⡀⠀","⠄⠀","⢂⠀","⡂⠀","⠅⠀","⢃⠀","⡃⠀","⠍⠀","⢋⠀","⡋⠀","⠍⠁","⢋⠁","⡋⠁","⠍⠉","⠋⠉","⠋⠉","⠉⠙","⠉⠙","⠉⠩","⠈⢙","⠈⡙","⢈⠩","⡀⢙","⠄⡙","⢂⠩","⡂⢘","⠅⡘","⢃⠨","⡃⢐","⠍⡐","⢋⠠","⡋⢀","⠍⡁","⢋⠁","⡋⠁","⠍⠉","⠋⠉","⠋⠉","⠉⠙","⠉⠙","⠉⠩","⠈⢙","⠈⡙","⠈⠩","⠀⢙","⠀⡙","⠀⠩","⠀⢘","⠀⡘","⠀⠨","⠀⢐","⠀⡐","⠀⠠","⠀⢀","⠀⡀"]},"dots13":{"interval":80,"frames":["⣼","⣹","⢻","⠿","⡟","⣏","⣧","⣶"]},"dots14":{"interval":80,"frames":["⠉⠉","⠈⠙","⠀⠹","⠀⢸","⠀⣰","⢀⣠","⣀⣀","⣄⡀","⣆⠀","⡇⠀","⠏⠀","⠋⠁"]},"dots8Bit":{"interval":80,"frames":["⠀","⠁","⠂","⠃","⠄","⠅","⠆","⠇","⡀","⡁","⡂","⡃","⡄","⡅","⡆","⡇","⠈","⠉","⠊","⠋","⠌","⠍","⠎","⠏","⡈","⡉","⡊","⡋","⡌","⡍","⡎","⡏","⠐","⠑","⠒","⠓","⠔","⠕","⠖","⠗","⡐","⡑","⡒","⡓","⡔","⡕","⡖","⡗","⠘","⠙","⠚","⠛","⠜","⠝","⠞","⠟","⡘","⡙","⡚","⡛","⡜","⡝","⡞","⡟","⠠","⠡","⠢","⠣","⠤","⠥","⠦","⠧","⡠","⡡","⡢","⡣","⡤","⡥","⡦","⡧","⠨","⠩","⠪","⠫","⠬","⠭","⠮","⠯","⡨","⡩","⡪","⡫","⡬","⡭","⡮","⡯","⠰","⠱","⠲","⠳","⠴","⠵","⠶","⠷","⡰","⡱","⡲","⡳","⡴","⡵","⡶","⡷","⠸","⠹","⠺","⠻","⠼","⠽","⠾","⠿","⡸","⡹","⡺","⡻","⡼","⡽","⡾","⡿","⢀","⢁","⢂","⢃","⢄","⢅","⢆","⢇","⣀","⣁","⣂","⣃","⣄","⣅","⣆","⣇","⢈","⢉","⢊","⢋","⢌","⢍","⢎","⢏","⣈","⣉","⣊","⣋","⣌","⣍","⣎","⣏","⢐","⢑","⢒","⢓","⢔","⢕","⢖","⢗","⣐","⣑","⣒","⣓","⣔","⣕","⣖","⣗","⢘","⢙","⢚","⢛","⢜","⢝","⢞","⢟","⣘","⣙","⣚","⣛","⣜","⣝","⣞","⣟","⢠","⢡","⢢","⢣","⢤","⢥","⢦","⢧","⣠","⣡","⣢","⣣","⣤","⣥","⣦","⣧","⢨","⢩","⢪","⢫","⢬","⢭","⢮","⢯","⣨","⣩","⣪","⣫","⣬","⣭","⣮","⣯","⢰","⢱","⢲","⢳","⢴","⢵","⢶","⢷","⣰","⣱","⣲","⣳","⣴","⣵","⣶","⣷","⢸","⢹","⢺","⢻","⢼","⢽","⢾","⢿","⣸","⣹","⣺","⣻","⣼","⣽","⣾","⣿"]},"dotsCircle":{"interval":80,"frames":["⢎ ","⠎⠁","⠊⠑","⠈⠱"," ⡱","⢀⡰","⢄⡠","⢆⡀"]},"sand":{"interval":80,"frames":["⠁","⠂","⠄","⡀","⡈","⡐","⡠","⣀","⣁","⣂","⣄","⣌","⣔","⣤","⣥","⣦","⣮","⣶","⣷","⣿","⡿","⠿","⢟","⠟","⡛","⠛","⠫","⢋","⠋","⠍","⡉","⠉","⠑","⠡","⢁"]},"line":{"interval":130,"frames":["-","\\\\","|","/"]},"line2":{"interval":100,"frames":["⠂","-","–","—","–","-"]},"rollingLine":{"interval":80,"frames":["/ "," - "," \\\\ "," |"," |"," \\\\ "," - ","/ "]},"pipe":{"interval":100,"frames":["┤","┘","┴","└","├","┌","┬","┐"]},"simpleDots":{"interval":400,"frames":[". ",".. ","..."," "]},"simpleDotsScrolling":{"interval":200,"frames":[". ",".. ","..."," .."," ."," "]},"star":{"interval":70,"frames":["✶","✸","✹","✺","✹","✷"]},"star2":{"interval":80,"frames":["+","x","*"]},"flip":{"interval":70,"frames":["_","_","_","-","`","`","\'","\xb4","-","_","_","_"]},"hamburger":{"interval":100,"frames":["☱","☲","☴"]},"growVertical":{"interval":120,"frames":["▁","▃","▄","▅","▆","▇","▆","▅","▄","▃"]},"growHorizontal":{"interval":120,"frames":["▏","▎","▍","▌","▋","▊","▉","▊","▋","▌","▍","▎"]},"balloon":{"interval":140,"frames":[" ",".","o","O","@","*"," "]},"balloon2":{"interval":120,"frames":[".","o","O","\xb0","O","o","."]},"noise":{"interval":100,"frames":["▓","▒","░"]},"bounce":{"interval":120,"frames":["⠁","⠂","⠄","⠂"]},"boxBounce":{"interval":120,"frames":["▖","▘","▝","▗"]},"boxBounce2":{"interval":100,"frames":["▌","▀","▐","▄"]},"triangle":{"interval":50,"frames":["◢","◣","◤","◥"]},"binary":{"interval":80,"frames":["010010","001100","100101","111010","111101","010111","101011","111000","110011","110101"]},"arc":{"interval":100,"frames":["◜","◠","◝","◞","◡","◟"]},"circle":{"interval":120,"frames":["◡","⊙","◠"]},"squareCorners":{"interval":180,"frames":["◰","◳","◲","◱"]},"circleQuarters":{"interval":120,"frames":["◴","◷","◶","◵"]},"circleHalves":{"interval":50,"frames":["◐","◓","◑","◒"]},"squish":{"interval":100,"frames":["╫","╪"]},"toggle":{"interval":250,"frames":["⊶","⊷"]},"toggle2":{"interval":80,"frames":["▫","▪"]},"toggle3":{"interval":120,"frames":["□","■"]},"toggle4":{"interval":100,"frames":["■","□","▪","▫"]},"toggle5":{"interval":100,"frames":["▮","▯"]},"toggle6":{"interval":300,"frames":["ဝ","၀"]},"toggle7":{"interval":80,"frames":["⦾","⦿"]},"toggle8":{"interval":100,"frames":["◍","◌"]},"toggle9":{"interval":100,"frames":["◉","◎"]},"toggle10":{"interval":100,"frames":["㊂","㊀","㊁"]},"toggle11":{"interval":50,"frames":["⧇","⧆"]},"toggle12":{"interval":120,"frames":["☗","☖"]},"toggle13":{"interval":80,"frames":["=","*","-"]},"arrow":{"interval":100,"frames":["←","↖","↑","↗","→","↘","↓","↙"]},"arrow2":{"interval":80,"frames":["⬆️ ","↗️ ","➡️ ","↘️ ","⬇️ ","↙️ ","⬅️ ","↖️ "]},"arrow3":{"interval":120,"frames":["▹▹▹▹▹","▸▹▹▹▹","▹▸▹▹▹","▹▹▸▹▹","▹▹▹▸▹","▹▹▹▹▸"]},"bouncingBar":{"interval":80,"frames":["[ ]","[= ]","[== ]","[=== ]","[====]","[ ===]","[ ==]","[ =]","[ ]","[ =]","[ ==]","[ ===]","[====]","[=== ]","[== ]","[= ]"]},"bouncingBall":{"interval":80,"frames":["( ● )","( ● )","( ● )","( ● )","( ●)","( ● )","( ● )","( ● )","( ● )","(● )"]},"smiley":{"interval":200,"frames":["\uD83D\uDE04 ","\uD83D\uDE1D "]},"monkey":{"interval":300,"frames":["\uD83D\uDE48 ","\uD83D\uDE48 ","\uD83D\uDE49 ","\uD83D\uDE4A "]},"hearts":{"interval":100,"frames":["\uD83D\uDC9B ","\uD83D\uDC99 ","\uD83D\uDC9C ","\uD83D\uDC9A ","\uD83D\uDC97 "]},"clock":{"interval":100,"frames":["\uD83D\uDD5B ","\uD83D\uDD50 ","\uD83D\uDD51 ","\uD83D\uDD52 ","\uD83D\uDD53 ","\uD83D\uDD54 ","\uD83D\uDD55 ","\uD83D\uDD56 ","\uD83D\uDD57 ","\uD83D\uDD58 ","\uD83D\uDD59 ","\uD83D\uDD5A "]},"earth":{"interval":180,"frames":["\uD83C\uDF0D ","\uD83C\uDF0E ","\uD83C\uDF0F "]},"material":{"interval":17,"frames":["█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁","██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁","███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁","████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁","██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁","██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁","███████▁▁▁▁▁▁▁▁▁▁▁▁▁","████████▁▁▁▁▁▁▁▁▁▁▁▁","█████████▁▁▁▁▁▁▁▁▁▁▁","█████████▁▁▁▁▁▁▁▁▁▁▁","██████████▁▁▁▁▁▁▁▁▁▁","███████████▁▁▁▁▁▁▁▁▁","█████████████▁▁▁▁▁▁▁","██████████████▁▁▁▁▁▁","██████████████▁▁▁▁▁▁","▁██████████████▁▁▁▁▁","▁██████████████▁▁▁▁▁","▁██████████████▁▁▁▁▁","▁▁██████████████▁▁▁▁","▁▁▁██████████████▁▁▁","▁▁▁▁█████████████▁▁▁","▁▁▁▁██████████████▁▁","▁▁▁▁██████████████▁▁","▁▁▁▁▁██████████████▁","▁▁▁▁▁██████████████▁","▁▁▁▁▁██████████████▁","▁▁▁▁▁▁██████████████","▁▁▁▁▁▁██████████████","▁▁▁▁▁▁▁█████████████","▁▁▁▁▁▁▁█████████████","▁▁▁▁▁▁▁▁████████████","▁▁▁▁▁▁▁▁████████████","▁▁▁▁▁▁▁▁▁███████████","▁▁▁▁▁▁▁▁▁███████████","▁▁▁▁▁▁▁▁▁▁██████████","▁▁▁▁▁▁▁▁▁▁██████████","▁▁▁▁▁▁▁▁▁▁▁▁████████","▁▁▁▁▁▁▁▁▁▁▁▁▁███████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████","█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████","██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███","██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███","███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███","████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██","█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█","█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█","██████▁▁▁▁▁▁▁▁▁▁▁▁▁█","████████▁▁▁▁▁▁▁▁▁▁▁▁","█████████▁▁▁▁▁▁▁▁▁▁▁","█████████▁▁▁▁▁▁▁▁▁▁▁","█████████▁▁▁▁▁▁▁▁▁▁▁","█████████▁▁▁▁▁▁▁▁▁▁▁","███████████▁▁▁▁▁▁▁▁▁","████████████▁▁▁▁▁▁▁▁","████████████▁▁▁▁▁▁▁▁","██████████████▁▁▁▁▁▁","██████████████▁▁▁▁▁▁","▁██████████████▁▁▁▁▁","▁██████████████▁▁▁▁▁","▁▁▁█████████████▁▁▁▁","▁▁▁▁▁████████████▁▁▁","▁▁▁▁▁████████████▁▁▁","▁▁▁▁▁▁███████████▁▁▁","▁▁▁▁▁▁▁▁█████████▁▁▁","▁▁▁▁▁▁▁▁█████████▁▁▁","▁▁▁▁▁▁▁▁▁█████████▁▁","▁▁▁▁▁▁▁▁▁█████████▁▁","▁▁▁▁▁▁▁▁▁▁█████████▁","▁▁▁▁▁▁▁▁▁▁▁████████▁","▁▁▁▁▁▁▁▁▁▁▁████████▁","▁▁▁▁▁▁▁▁▁▁▁▁███████▁","▁▁▁▁▁▁▁▁▁▁▁▁███████▁","▁▁▁▁▁▁▁▁▁▁▁▁▁███████","▁▁▁▁▁▁▁▁▁▁▁▁▁███████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁"]},"moon":{"interval":80,"frames":["\uD83C\uDF11 ","\uD83C\uDF12 ","\uD83C\uDF13 ","\uD83C\uDF14 ","\uD83C\uDF15 ","\uD83C\uDF16 ","\uD83C\uDF17 ","\uD83C\uDF18 "]},"runner":{"interval":140,"frames":["\uD83D\uDEB6 ","\uD83C\uDFC3 "]},"pong":{"interval":80,"frames":["▐⠂ ▌","▐⠈ ▌","▐ ⠂ ▌","▐ ⠠ ▌","▐ ⡀ ▌","▐ ⠠ ▌","▐ ⠂ ▌","▐ ⠈ ▌","▐ ⠂ ▌","▐ ⠠ ▌","▐ ⡀ ▌","▐ ⠠ ▌","▐ ⠂ ▌","▐ ⠈ ▌","▐ ⠂▌","▐ ⠠▌","▐ ⡀▌","▐ ⠠ ▌","▐ ⠂ ▌","▐ ⠈ ▌","▐ ⠂ ▌","▐ ⠠ ▌","▐ ⡀ ▌","▐ ⠠ ▌","▐ ⠂ ▌","▐ ⠈ ▌","▐ ⠂ ▌","▐ ⠠ ▌","▐ ⡀ ▌","▐⠠ ▌"]},"shark":{"interval":120,"frames":["▐|\\\\____________▌","▐_|\\\\___________▌","▐__|\\\\__________▌","▐___|\\\\_________▌","▐____|\\\\________▌","▐_____|\\\\_______▌","▐______|\\\\______▌","▐_______|\\\\_____▌","▐________|\\\\____▌","▐_________|\\\\___▌","▐__________|\\\\__▌","▐___________|\\\\_▌","▐____________|\\\\▌","▐____________/|▌","▐___________/|_▌","▐__________/|__▌","▐_________/|___▌","▐________/|____▌","▐_______/|_____▌","▐______/|______▌","▐_____/|_______▌","▐____/|________▌","▐___/|_________▌","▐__/|__________▌","▐_/|___________▌","▐/|____________▌"]},"dqpb":{"interval":100,"frames":["d","q","p","b"]},"weather":{"interval":100,"frames":["☀️ ","☀️ ","☀️ ","\uD83C\uDF24 ","⛅️ ","\uD83C\uDF25 ","☁️ ","\uD83C\uDF27 ","\uD83C\uDF28 ","\uD83C\uDF27 ","\uD83C\uDF28 ","\uD83C\uDF27 ","\uD83C\uDF28 ","⛈ ","\uD83C\uDF28 ","\uD83C\uDF27 ","\uD83C\uDF28 ","☁️ ","\uD83C\uDF25 ","⛅️ ","\uD83C\uDF24 ","☀️ ","☀️ "]},"christmas":{"interval":400,"frames":["\uD83C\uDF32","\uD83C\uDF84"]},"grenade":{"interval":80,"frames":["، ","′ "," \xb4 "," ‾ "," ⸌"," ⸊"," |"," ⁎"," ⁕"," ෴ "," ⁓"," "," "," "]},"point":{"interval":125,"frames":["∙∙∙","●∙∙","∙●∙","∙∙●","∙∙∙"]},"layer":{"interval":150,"frames":["-","=","≡"]},"betaWave":{"interval":80,"frames":["ρββββββ","βρβββββ","ββρββββ","βββρβββ","ββββρββ","βββββρβ","ββββββρ"]},"fingerDance":{"interval":160,"frames":["\uD83E\uDD18 ","\uD83E\uDD1F ","\uD83D\uDD96 ","✋ ","\uD83E\uDD1A ","\uD83D\uDC46 "]},"fistBump":{"interval":80,"frames":["\uD83E\uDD1C \uD83E\uDD1B ","\uD83E\uDD1C \uD83E\uDD1B ","\uD83E\uDD1C \uD83E\uDD1B "," \uD83E\uDD1C \uD83E\uDD1B "," \uD83E\uDD1C\uD83E\uDD1B "," \uD83E\uDD1C✨\uD83E\uDD1B ","\uD83E\uDD1C ✨ \uD83E\uDD1B "]},"soccerHeader":{"interval":80,"frames":[" \uD83E\uDDD1⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️\uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 "]},"mindblown":{"interval":160,"frames":["\uD83D\uDE10 ","\uD83D\uDE10 ","\uD83D\uDE2E ","\uD83D\uDE2E ","\uD83D\uDE26 ","\uD83D\uDE26 ","\uD83D\uDE27 ","\uD83D\uDE27 ","\uD83E\uDD2F ","\uD83D\uDCA5 ","✨ "," "," "," "]},"speaker":{"interval":160,"frames":["\uD83D\uDD08 ","\uD83D\uDD09 ","\uD83D\uDD0A ","\uD83D\uDD09 "]},"orangePulse":{"interval":100,"frames":["\uD83D\uDD38 ","\uD83D\uDD36 ","\uD83D\uDFE0 ","\uD83D\uDFE0 ","\uD83D\uDD36 "]},"bluePulse":{"interval":100,"frames":["\uD83D\uDD39 ","\uD83D\uDD37 ","\uD83D\uDD35 ","\uD83D\uDD35 ","\uD83D\uDD37 "]},"orangeBluePulse":{"interval":100,"frames":["\uD83D\uDD38 ","\uD83D\uDD36 ","\uD83D\uDFE0 ","\uD83D\uDFE0 ","\uD83D\uDD36 ","\uD83D\uDD39 ","\uD83D\uDD37 ","\uD83D\uDD35 ","\uD83D\uDD35 ","\uD83D\uDD37 "]},"timeTravel":{"interval":100,"frames":["\uD83D\uDD5B ","\uD83D\uDD5A ","\uD83D\uDD59 ","\uD83D\uDD58 ","\uD83D\uDD57 ","\uD83D\uDD56 ","\uD83D\uDD55 ","\uD83D\uDD54 ","\uD83D\uDD53 ","\uD83D\uDD52 ","\uD83D\uDD51 ","\uD83D\uDD50 "]},"aesthetic":{"interval":80,"frames":["▰▱▱▱▱▱▱","▰▰▱▱▱▱▱","▰▰▰▱▱▱▱","▰▰▰▰▱▱▱","▰▰▰▰▰▱▱","▰▰▰▰▰▰▱","▰▰▰▰▰▰▰","▰▱▱▱▱▱▱"]},"dwarfFortress":{"interval":80,"frames":[" ██████\xa3\xa3\xa3 ","☺██████\xa3\xa3\xa3 ","☺██████\xa3\xa3\xa3 ","☺▓█████\xa3\xa3\xa3 ","☺▓█████\xa3\xa3\xa3 ","☺▒█████\xa3\xa3\xa3 ","☺▒█████\xa3\xa3\xa3 ","☺░█████\xa3\xa3\xa3 ","☺░█████\xa3\xa3\xa3 ","☺ █████\xa3\xa3\xa3 "," ☺█████\xa3\xa3\xa3 "," ☺█████\xa3\xa3\xa3 "," ☺▓████\xa3\xa3\xa3 "," ☺▓████\xa3\xa3\xa3 "," ☺▒████\xa3\xa3\xa3 "," ☺▒████\xa3\xa3\xa3 "," ☺░████\xa3\xa3\xa3 "," ☺░████\xa3\xa3\xa3 "," ☺ ████\xa3\xa3\xa3 "," ☺████\xa3\xa3\xa3 "," ☺████\xa3\xa3\xa3 "," ☺▓███\xa3\xa3\xa3 "," ☺▓███\xa3\xa3\xa3 "," ☺▒███\xa3\xa3\xa3 "," ☺▒███\xa3\xa3\xa3 "," ☺░███\xa3\xa3\xa3 "," ☺░███\xa3\xa3\xa3 "," ☺ ███\xa3\xa3\xa3 "," ☺███\xa3\xa3\xa3 "," ☺███\xa3\xa3\xa3 "," ☺▓██\xa3\xa3\xa3 "," ☺▓██\xa3\xa3\xa3 "," ☺▒██\xa3\xa3\xa3 "," ☺▒██\xa3\xa3\xa3 "," ☺░██\xa3\xa3\xa3 "," ☺░██\xa3\xa3\xa3 "," ☺ ██\xa3\xa3\xa3 "," ☺██\xa3\xa3\xa3 "," ☺██\xa3\xa3\xa3 "," ☺▓█\xa3\xa3\xa3 "," ☺▓█\xa3\xa3\xa3 "," ☺▒█\xa3\xa3\xa3 "," ☺▒█\xa3\xa3\xa3 "," ☺░█\xa3\xa3\xa3 "," ☺░█\xa3\xa3\xa3 "," ☺ █\xa3\xa3\xa3 "," ☺█\xa3\xa3\xa3 "," ☺█\xa3\xa3\xa3 "," ☺▓\xa3\xa3\xa3 "," ☺▓\xa3\xa3\xa3 "," ☺▒\xa3\xa3\xa3 "," ☺▒\xa3\xa3\xa3 "," ☺░\xa3\xa3\xa3 "," ☺░\xa3\xa3\xa3 "," ☺ \xa3\xa3\xa3 "," ☺\xa3\xa3\xa3 "," ☺\xa3\xa3\xa3 "," ☺▓\xa3\xa3 "," ☺▓\xa3\xa3 "," ☺▒\xa3\xa3 "," ☺▒\xa3\xa3 "," ☺░\xa3\xa3 "," ☺░\xa3\xa3 "," ☺ \xa3\xa3 "," ☺\xa3\xa3 "," ☺\xa3\xa3 "," ☺▓\xa3 "," ☺▓\xa3 "," ☺▒\xa3 "," ☺▒\xa3 "," ☺░\xa3 "," ☺░\xa3 "," ☺ \xa3 "," ☺\xa3 "," ☺\xa3 "," ☺▓ "," ☺▓ "," ☺▒ "," ☺▒ "," ☺░ "," ☺░ "," ☺ "," ☺ &"," ☺ ☼&"," ☺ ☼ &"," ☺☼ &"," ☺☼ & "," ‼ & "," ☺ & "," ‼ & "," ☺ & "," ‼ & "," ☺ & ","‼ & "," & "," & "," & ░ "," & ▒ "," & ▓ "," & \xa3 "," & ░\xa3 "," & ▒\xa3 "," & ▓\xa3 "," & \xa3\xa3 "," & ░\xa3\xa3 "," & ▒\xa3\xa3 ","& ▓\xa3\xa3 ","& \xa3\xa3\xa3 "," ░\xa3\xa3\xa3 "," ▒\xa3\xa3\xa3 "," ▓\xa3\xa3\xa3 "," █\xa3\xa3\xa3 "," ░█\xa3\xa3\xa3 "," ▒█\xa3\xa3\xa3 "," ▓█\xa3\xa3\xa3 "," ██\xa3\xa3\xa3 "," ░██\xa3\xa3\xa3 "," ▒██\xa3\xa3\xa3 "," ▓██\xa3\xa3\xa3 "," ███\xa3\xa3\xa3 "," ░███\xa3\xa3\xa3 "," ▒███\xa3\xa3\xa3 "," ▓███\xa3\xa3\xa3 "," ████\xa3\xa3\xa3 "," ░████\xa3\xa3\xa3 "," ▒████\xa3\xa3\xa3 "," ▓████\xa3\xa3\xa3 "," █████\xa3\xa3\xa3 "," ░█████\xa3\xa3\xa3 "," ▒█████\xa3\xa3\xa3 "," ▓█████\xa3\xa3\xa3 "," ██████\xa3\xa3\xa3 "," ██████\xa3\xa3\xa3 "]},"fish":{"interval":80,"frames":["~~~~~~~~~~~~~~~~~~~~","> ~~~~~~~~~~~~~~~~~~","\xba> ~~~~~~~~~~~~~~~~~","(\xba> ~~~~~~~~~~~~~~~~","((\xba> ~~~~~~~~~~~~~~~","<((\xba> ~~~~~~~~~~~~~~","><((\xba> ~~~~~~~~~~~~~"," ><((\xba> ~~~~~~~~~~~~","~ ><((\xba> ~~~~~~~~~~~","~~ <>((\xba> ~~~~~~~~~~","~~~ ><((\xba> ~~~~~~~~~","~~~~ <>((\xba> ~~~~~~~~","~~~~~ ><((\xba> ~~~~~~~","~~~~~~ <>((\xba> ~~~~~~","~~~~~~~ ><((\xba> ~~~~~","~~~~~~~~ <>((\xba> ~~~~","~~~~~~~~~ ><((\xba> ~~~","~~~~~~~~~~ <>((\xba> ~~","~~~~~~~~~~~ ><((\xba> ~","~~~~~~~~~~~~ <>((\xba> ","~~~~~~~~~~~~~ ><((\xba>","~~~~~~~~~~~~~~ <>((\xba","~~~~~~~~~~~~~~~ ><((","~~~~~~~~~~~~~~~~ <>(","~~~~~~~~~~~~~~~~~ ><","~~~~~~~~~~~~~~~~~~ <","~~~~~~~~~~~~~~~~~~~~"]}}');function I({label:e,type:t}){let{frame:r}=function({type:e="dots"}){let[t,r]=(0,g.useState)(0),n=k[e];return(0,g.useEffect)(()=>{let e=setInterval(()=>{r(e=>e===n.frames.length-1?0:e+1)},n.interval);return()=>{clearInterval(e)}},[n]),{frame:n.frames[t]??""}}({type:t}),{styles:n}=h("Spinner");return g.createElement(o,{...n.container()},g.createElement(l,{...n.frame()},r),e&&g.createElement(l,{...n.label()},e))}Object.keys(k);let M=(e,t)=>{switch(t.type){case"move-cursor-left":return{...e,cursorOffset:Math.max(0,e.cursorOffset-1)};case"move-cursor-right":return{...e,cursorOffset:Math.min(e.value.length,e.cursorOffset+1)};case"insert":return{...e,previousValue:e.value,value:e.value.slice(0,e.cursorOffset)+t.text+e.value.slice(e.cursorOffset),cursorOffset:e.cursorOffset+t.text.length};case"delete":{let t=Math.max(0,e.cursorOffset-1);return{...e,previousValue:e.value,value:e.value.slice(0,t)+e.value.slice(t+1),cursorOffset:t}}}},A=t.inverse(" ");function D({isDisabled:e=!1,defaultValue:r,placeholder:a="",suggestions:s,onChange:i,onSubmit:o}){let{inputValue:c}=(({isDisabled:e=!1,state:r,placeholder:l=""})=>{let a=(0,g.useMemo)(()=>e?l?t.dim(l):"":l&&l.length>0?t.inverse(l[0])+t.dim(l.slice(1)):A,[e,l]),s=(0,g.useMemo)(()=>{if(e)return r.value;let n=0,l=r.value.length>0?"":A;for(let e of r.value)l+=n===r.cursorOffset?t.inverse(e):e,n++;return r.suggestion?r.cursorOffset===r.value.length?l+=t.inverse(r.suggestion[0])+t.dim(r.suggestion.slice(1)):l+=t.dim(r.suggestion):r.value.length>0&&r.cursorOffset===r.value.length&&(l+=A),l},[e,r.value,r.cursorOffset,r.suggestion]);return n((e,t)=>{if(!t.upArrow&&!t.downArrow&&(!t.ctrl||"c"!==e)&&!t.tab&&(!t.shift||!t.tab)){if(t.return)return void r.submit();t.leftArrow?r.moveCursorLeft():t.rightArrow?r.moveCursorRight():t.backspace||t.delete?r.delete():r.insert(e)}},{isActive:!e}),{inputValue:r.value.length>0?s:a}})({isDisabled:e,placeholder:a,state:(({defaultValue:e="",suggestions:t,onChange:r,onSubmit:n})=>{let[l,a]=(0,g.useReducer)(M,{previousValue:e,value:e,cursorOffset:e.length}),s=(0,g.useMemo)(()=>{if(0!==l.value.length)return t?.find(e=>e.startsWith(l.value))?.replace(l.value,"")},[l.value,t]),i=(0,g.useCallback)(()=>{a({type:"move-cursor-left"})},[]),o=(0,g.useCallback)(()=>{a({type:"move-cursor-right"})},[]),c=(0,g.useCallback)(e=>{a({type:"insert",text:e})},[]),u=(0,g.useCallback)(()=>{a({type:"delete"})},[]),_=(0,g.useCallback)(()=>{if(s){c(s),n?.(l.value+s);return}n?.(l.value)},[l.value,s,c,n]);return(0,g.useEffect)(()=>{l.value!==l.previousValue&&r?.(l.value)},[l.previousValue,l.value,r]),{...l,suggestion:s,moveCursorLeft:i,moveCursorRight:o,insert:c,delete:u,submit:_}})({defaultValue:r,suggestions:s,onChange:i,onSubmit:o})}),{styles:u}=h("TextInput");return g.createElement(l,{...u.value()},c)}(0,g.createContext)({marker:r.line});(0,g.createContext)({marker:""}),t.inverse(" "),t.inverse(" ");let P=e("node:os"),V=e("node:stream"),j="#72A7FF",F="#4B586C",T="#7F8DA6",$="#55D6A9",K="#F2C66D",R=u.map(({command:e})=>e.replace(/\s+\[[^\]]+\]$/,"")),B=_.map(({command:e})=>e.replace(/\s+\[[^\]]+\]$/,"")),L={id:"initial",kind:"initial"};function H(){let e=[],t=-1,r="";return{next:n=>t<0?n:(t-=1)<0?r:e[t],previous:n=>0===e.length?n:(t<0&&(r=n),t=Math.min(t+1,e.length-1),e[t]),record(n){e.unshift(n),e.length>20&&(e.length=20),t=-1,r=""}}}async function U(e){let t=new J,r=new Y(e.toChoices),n=new Q,l=await e.createSession(t,r.selectItem,n.update),s=a(g.createElement(W,{deviceAppSetup:n,selections:r,session:l,subscribeCompileProgress:e.subscribeCompileProgress,transcript:t}),{exitOnCtrlC:!1,maxFps:15,stderr:process.stderr,stdin:e.stdin,stdout:process.stderr});try{await s.waitUntilExit()}finally{r.cancel(),await l.close()}return{status:l.getState().status}}function W({deviceAppSetup:e,session:t,selections:r,subscribeCompileProgress:a,transcript:c}){let{exit:u}=s(),[_,f]=(0,g.useState)(),[m,d]=(0,g.useState)(!1),v=(0,g.useRef)(""),[p,b]=(0,g.useState)(0),h=(0,g.useRef)({device:H(),root:H()}).current,[x,y]=(0,g.useState)("root"),[E,C]=(0,g.useState)(()=>c.snapshot()),[w,S]=(0,g.useState)(),[k,M]=(0,g.useState)(()=>t.getState()),[A,P]=(0,g.useState)(),[V,U]=(0,g.useState)(()=>e.snapshot()),z=(0,g.useCallback)((e,t="执行中")=>{f(e?t:void 0)},[]),J=(0,g.useCallback)(()=>d(!0),[]);(0,g.useEffect)(()=>t.subscribe(e=>{"client-disconnected"===e&&y("root")}),[t]),(0,g.useEffect)(()=>e.subscribe(U),[e]),(0,g.useEffect)(()=>{m&&u()},[u,m]),(0,g.useEffect)(()=>c.subscribe(C),[c]),(0,g.useEffect)(()=>r.subscribe(e=>{S(e)}),[r]),(0,g.useEffect)(()=>a?.(e=>{P(e<1?e:void 0)}),[a]),(0,g.useEffect)(()=>{let e=setInterval(()=>M(t.getState()),500);return t.stopped.then(J,J),()=>clearInterval(e)},[J,t]);let Q=(0,g.useCallback)(e=>{let r=e.trim();if(!r||_)return;v.current="",b(e=>e+1),h[x].record(r),c.appendLine(`${"device"===x?"device ›":"›"} ${r}`);let n=r.toLowerCase(),l=n.split(/\s+/,1)[0];if("device"===x&&("back"===n||".."===r)){z(!0,"正在返回主命令"),t.returnToRoot().finally(()=>{y("root"),z(!1)});return}let a=r;"device"===x&&"status"!==l&&"web"!==l&&(a=`device ${r}`),z(!0),t.execute(a).then(e=>{"root"===x&&"enter-device"===e&&y("device"),M(t.getState())}).finally(()=>z(!1))},[_,h,x,t,z,c]);return n((e,n)=>{if(n.ctrl&&"c"===e){if(r.cancel(),_){t.cancelActiveCommand()&&z(!0,"正在停止");return}z(!0,"正在退出"),t.close().finally(J);return}if(!w&&n.ctrl&&"u"===e){v.current="",b(e=>e+1);return}w?n.escape&&r.resolve(void 0):(e=>{let t=h[x];if(e.upArrow)v.current=t.previous(v.current);else if(e.downArrow)v.current=t.next(v.current);else{if(!e.tab||e.shift)return;let t=("device"===x?B:R).find(e=>e.startsWith(v.current));if(!t||t===v.current)return;v.current=t}b(e=>e+1)})(n)}),g.createElement(g.Fragment,null,g.createElement(i,{items:[L,...E]},e=>{var t;if("initial"===e.kind)return g.createElement(o,{flexDirection:"column",key:e.id},g.createElement(G,{state:k}));let r=e.text.startsWith("⚠");return g.createElement(l,{color:r?void 0:(t=e.text,/^(error|failed|failure_reason|启动真机调试失败|启动豆包开发者工具失败|关闭豆包开发者工具失败)/i.test(t)?"#FF6B7A":/^(warning|toolchain warnings)/i.test(t)?K:/^✓ (下载豆包开发者工具|豆包开发者工具已安装)/.test(t)||/^(status: ok|status: running|page pushed|widget pushed|web_debugger|Web 模拟器已打开)/i.test(t)?$:/^(debug:|(?:device )?›)/i.test(t)?j:void 0),key:e.id,wrap:"wrap"},r&&g.createElement(l,{color:K},"⚠"),r?e.text.slice(1):e.text||" ")}),g.createElement(o,{display:m?"none":"flex",flexDirection:"column"},g.createElement(q,{scope:x}),g.createElement(o,{flexDirection:"column",marginTop:1},V?g.createElement(N,{progress:V}):void 0!==A?g.createElement(I,{label:`应用编译 ${Math.round(100*A)}%`}):_?g.createElement(I,{label:_}):null,w?g.createElement(o,{borderColor:F,borderStyle:"single",flexDirection:"column",paddingX:1},g.createElement(l,{bold:!0,color:j},"versionTag"===w.kind?"选择关联的 versionTag":`Select ${"page"===w.kind?"a page":"a widget"}`),g.createElement(O,{onChange:e=>r.resolve(e),options:w.choices,visibleOptionCount:7}),g.createElement(l,{color:T},"↑↓ move enter select esc cancel")):g.createElement(o,null,g.createElement(l,{bold:!0,color:j},"device"===x?"device › ":"› "),g.createElement(D,{defaultValue:v.current,isDisabled:!!_,key:p,onChange:e=>{v.current=e},onSubmit:Q,placeholder:"device"===x?"back 返回主命令":"Ctrl+C 退出",suggestions:"device"===x?B:R}))),g.createElement(X,{state:k})))}function N({progress:e}){let t=f(e);return"complete"===e.phase?g.createElement(o,null,g.createElement(l,{color:$},"✓ ",t)):g.createElement(o,null,g.createElement(I,{label:t}))}function q({scope:e}){let t="device"===e?_:u;return g.createElement(o,{flexDirection:"column",marginTop:1},g.createElement(l,{bold:!0,color:j},"device"===e?"真机调试命令":"可用命令"),t.map(e=>g.createElement(o,{flexDirection:"row",key:e.command},g.createElement(o,{width:24},g.createElement(l,{color:j},` ${e.command}`)),g.createElement(l,null,e.description))))}function G({state:e}){return g.createElement(o,{borderColor:F,borderStyle:"single",flexDirection:"column",paddingX:1},g.createElement(l,null,g.createElement(l,{color:j},">"),g.createElement(l,{bold:!0}," Doubao Dev CLI"),g.createElement(l,{color:T},` (v${m})`)),g.createElement(l,{wrap:"truncate-middle"},g.createElement(l,{color:T},"Project".padEnd(16)),z(e.projectPath??e.appDir)),g.createElement(l,{wrap:"truncate-middle"},g.createElement(l,{color:T},"App".padEnd(16)),e.appId??"-"))}function X({state:e}){let{columns:t}=c(),r="running"===e.status,n=e.appId??"-",a=z(e.projectPath??e.appDir),s=`${n} \xb7 ${a}`,i=s.length+2<=t?s:n;return g.createElement(l,{color:T,wrap:"truncate-middle"},g.createElement(l,{color:r?$:T},r?"●":"○"),` ${i}`)}function z(e){let t=(0,P.homedir)();return e===t?"~":e.startsWith(`${t}/`)||e.startsWith(`${t}\\`)?`~${e.slice(t.length)}`:e}class J extends V.Writable{carry="";id=0;lines=[];subscribers=new Set;snapshot(){return[...this.lines]}subscribe(e){return this.subscribers.add(e),()=>{this.subscribers.delete(e)}}appendLine(e){this.appendPart(e),this.notify()}_write(e,t,r){let n=`${this.carry}${e.toString()}`.split(/\r?\n/);for(let e of(this.carry=n.pop()??"",n))this.appendPart(e);this.notify(),r()}appendPart(e){this.lines.push({id:this.id++,kind:"line",text:e})}notify(){let e=this.snapshot();for(let t of this.subscribers)t(e)}}class Q{progress;subscribers=new Set;update=e=>{for(let t of(this.progress=e,this.subscribers))t(e)};snapshot(){return this.progress}subscribe(e){return this.subscribers.add(e),()=>{this.subscribers.delete(e)}}}class Y{toChoices;listener;resolver;constructor(e){this.toChoices=e}selectItem=async(e,t)=>{this.cancel();let r=this.toChoices(e,t);if(r.length)return new Promise(t=>{this.resolver=t,this.listener?.({choices:r,kind:e})})};subscribe(e){return this.listener=e,()=>{this.listener===e&&(this.listener=void 0)}}resolve(e){let t=this.resolver;this.resolver=void 0,this.listener?.(void 0),t?.(e)}cancel(){this.resolve(void 0)}}export{U as runInkDevShell};
|
|
1
|
+
import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./6831.js";import"./3768.js";import{source as t,node_modules_figures as r}from"./4594.js";import{use_input as n,Text as l,build_render as a,use_app as s,Static as i,components_Box as o,use_window_size as c}from"./ink.js";import{DEV_SHELL_HELP_ITEMS as u,DEV_SHELL_DEVICE_HELP_ITEMS as _,formatDeviceAppSetupStatus as f}from"./dev.js";import{version_version as m}from"./2168.js";e.add({"../../../node_modules/.pnpm/deepmerge@4.3.1/node_modules/deepmerge/dist/cjs.js"(e){var t=function(e){var t,n,l;return!!(t=e)&&"object"==typeof t&&(n=e,"[object RegExp]"!==(l=Object.prototype.toString.call(n))&&"[object Date]"!==l&&n.$$typeof!==r)},r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?i(Array.isArray(e)?[]:{},e,t):e}function l(e,t,r){return e.concat(t).map(function(e){return n(e,r)})}function a(e){return Object.keys(e).concat(Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[])}function s(e,t){try{return t in e}catch(e){return!1}}function i(e,r,o){(o=o||{}).arrayMerge=o.arrayMerge||l,o.isMergeableObject=o.isMergeableObject||t,o.cloneUnlessOtherwiseSpecified=n;var c,u,_=Array.isArray(r);return _!==Array.isArray(e)?n(r,o):_?o.arrayMerge(e,r,o):(u={},(c=o).isMergeableObject(e)&&a(e).forEach(function(t){u[t]=n(e[t],c)}),a(r).forEach(function(t){s(e,t)&&!(Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))||(s(e,t)&&c.isMergeableObject(r[t])?u[t]=(function(e,t){if(!t.customMerge)return i;var r=t.customMerge(e);return"function"==typeof r?r:i})(t,c)(e[t],r[t],c):u[t]=n(r[t],c))}),u)}i.all=function(e,t){if(!Array.isArray(e))throw Error("first argument should be an array");return e.reduce(function(e,r){return i(e,r,t)},{})},e.exports=i}});let d={info:"blue",success:"green",error:"red",warning:"yellow"},v={success:"green",error:"red",warning:"yellow",info:"blue"},p={success:r.tick,error:r.cross,warning:r.warning,info:r.info},g=e("../../../node_modules/.pnpm/react@19.2.7/node_modules/react/index.js");e("../../../node_modules/.pnpm/deepmerge@4.3.1/node_modules/deepmerge/dist/cjs.js");let b=(0,g.createContext)({components:{Alert:{styles:{container:({variant:e})=>({flexGrow:1,borderStyle:"round",borderColor:d[e],gap:1,paddingX:1}),iconContainer:()=>({flexShrink:0}),icon:({variant:e})=>({color:d[e]}),content:()=>({flexShrink:1,flexGrow:1,minWidth:0,flexDirection:"column",gap:1}),title:()=>({bold:!0}),message:()=>({})},config({variant:e}){let t;return"info"===e&&(t=r.info),"success"===e&&(t=r.tick),"error"===e&&(t=r.cross),"warning"===e&&(t=r.warning),{icon:t}}},Badge:{styles:{container:({color:e})=>({backgroundColor:e}),label:()=>({color:"black"})}},ConfirmInput:{styles:{input:({isFocused:e})=>({dimColor:!e})}},MultiSelect:{styles:{container:()=>({flexDirection:"column"}),option:({isFocused:e})=>({gap:1,paddingLeft:2*!e}),selectedIndicator:()=>({color:"green"}),focusIndicator:()=>({color:"blue"}),label({isFocused:e,isSelected:t}){let r;return t&&(r="green"),e&&(r="blue"),{color:r}},highlightedText:()=>({bold:!0})}},OrderedList:{styles:{list:()=>({flexDirection:"column"}),listItem:()=>({gap:1}),marker:()=>({dimColor:!0}),content:()=>({flexDirection:"column"})}},ProgressBar:{styles:{container:()=>({flexGrow:1,minWidth:0}),completed:()=>({color:"magenta"}),remaining:()=>({dimColor:!0})},config:()=>({completedCharacter:r.square,remainingCharacter:r.squareLightShade})},Select:{styles:{container:()=>({flexDirection:"column"}),option:({isFocused:e})=>({gap:1,paddingLeft:2*!e}),selectedIndicator:()=>({color:"green"}),focusIndicator:()=>({color:"blue"}),label({isFocused:e,isSelected:t}){let r;return t&&(r="green"),e&&(r="blue"),{color:r}},highlightedText:()=>({bold:!0})}},Spinner:{styles:{container:()=>({gap:1}),frame:()=>({color:"blue"}),label:()=>({})}},StatusMessage:{styles:{container:()=>({gap:1}),iconContainer:()=>({flexShrink:0}),icon:({variant:e})=>({color:v[e]}),message:()=>({})},config:({variant:e})=>({icon:p[e]})},UnorderedList:{styles:{list:()=>({flexDirection:"column"}),listItem:()=>({gap:1}),marker:()=>({dimColor:!0}),content:()=>({flexDirection:"column"})},config:()=>({marker:r.line})},TextInput:{styles:{value:()=>({})}},EmailInput:{styles:{value:()=>({})}},PasswordInput:{styles:{value:()=>({})}}}}),h=e=>(0,g.useContext)(b).components[e],x=r.line;(0,g.createContext)({marker:x}),(0,g.createContext)({depth:0});class y extends Map{first;constructor(e){let t,r,n=[],l=0;for(let a of e){let e={...a,previous:r,next:void 0,index:l};r&&(r.next=e),t||=e,n.push([a.value,e]),l++,r=e}super(n),this.first=t}}let E=e("node:util");function C({isFocused:e,isSelected:t,children:n}){let{styles:a}=h("Select");return g.createElement(o,{...a.option({isFocused:e})},e&&g.createElement(l,{...a.focusIndicator()},r.pointer),g.createElement(l,{...a.label({isFocused:e,isSelected:t})},n),t&&g.createElement(l,{...a.selectedIndicator()},r.tick))}let w=(e,t)=>{switch(t.type){case"focus-next-option":{if(!e.focusedValue)return e;let t=e.optionMap.get(e.focusedValue);if(!t)return e;let r=t.next;if(!r)return e;if(!(r.index>=e.visibleToIndex))return{...e,focusedValue:r.value};let n=Math.min(e.optionMap.size,e.visibleToIndex+1),l=n-e.visibleOptionCount;return{...e,focusedValue:r.value,visibleFromIndex:l,visibleToIndex:n}}case"focus-previous-option":{if(!e.focusedValue)return e;let t=e.optionMap.get(e.focusedValue);if(!t)return e;let r=t.previous;if(!r)return e;if(!(r.index<=e.visibleFromIndex))return{...e,focusedValue:r.value};let n=Math.max(0,e.visibleFromIndex-1),l=n+e.visibleOptionCount;return{...e,focusedValue:r.value,visibleFromIndex:n,visibleToIndex:l}}case"select-focused-option":return{...e,previousValue:e.value,value:e.focusedValue};case"reset":return t.state}},S=({visibleOptionCount:e,defaultValue:t,options:r})=>{let n="number"==typeof e?Math.min(e,r.length):r.length,l=new y(r);return{optionMap:l,visibleOptionCount:n,focusedValue:l.first?.value,visibleFromIndex:0,visibleToIndex:n,previousValue:t,value:t}};function O({isDisabled:e=!1,visibleOptionCount:t=5,highlightText:r,options:a,defaultValue:s,onChange:i}){let c=(({visibleOptionCount:e=5,options:t,defaultValue:r,onChange:n})=>{let[l,a]=(0,g.useReducer)(w,{visibleOptionCount:e,defaultValue:r,options:t},S),[s,i]=(0,g.useState)(t);t===s||(0,E.isDeepStrictEqual)(t,s)||(a({type:"reset",state:S({visibleOptionCount:e,defaultValue:r,options:t})}),i(t));let o=(0,g.useCallback)(()=>{a({type:"focus-next-option"})},[]),c=(0,g.useCallback)(()=>{a({type:"focus-previous-option"})},[]),u=(0,g.useCallback)(()=>{a({type:"select-focused-option"})},[]),_=(0,g.useMemo)(()=>t.map((e,t)=>({...e,index:t})).slice(l.visibleFromIndex,l.visibleToIndex),[t,l.visibleFromIndex,l.visibleToIndex]);return(0,g.useEffect)(()=>{l.value&&l.previousValue!==l.value&&n?.(l.value)},[l.previousValue,l.value,t,n]),{focusedValue:l.focusedValue,visibleFromIndex:l.visibleFromIndex,visibleToIndex:l.visibleToIndex,value:l.value,visibleOptions:_,focusNextOption:o,focusPreviousOption:c,selectFocusedOption:u}})({visibleOptionCount:t,options:a,defaultValue:s,onChange:i});(({isDisabled:e=!1,state:t})=>{n((e,r)=>{r.downArrow&&t.focusNextOption(),r.upArrow&&t.focusPreviousOption(),r.return&&t.selectFocusedOption()},{isActive:!e})})({isDisabled:e,state:c});let{styles:u}=h("Select");return g.createElement(o,{...u.container()},c.visibleOptions.map(t=>{let n=t.label;if(r&&t.label.includes(r)){let e=t.label.indexOf(r);n=g.createElement(g.Fragment,null,t.label.slice(0,e),g.createElement(l,{...u.highlightedText()},r),t.label.slice(e+r.length))}return g.createElement(C,{key:t.value,isFocused:!e&&c.focusedValue===t.value,isSelected:c.value===t.value},n)}))}var k=JSON.parse('{"dots":{"interval":80,"frames":["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"]},"dots2":{"interval":80,"frames":["⣾","⣽","⣻","⢿","⡿","⣟","⣯","⣷"]},"dots3":{"interval":80,"frames":["⠋","⠙","⠚","⠞","⠖","⠦","⠴","⠲","⠳","⠓"]},"dots4":{"interval":80,"frames":["⠄","⠆","⠇","⠋","⠙","⠸","⠰","⠠","⠰","⠸","⠙","⠋","⠇","⠆"]},"dots5":{"interval":80,"frames":["⠋","⠙","⠚","⠒","⠂","⠂","⠒","⠲","⠴","⠦","⠖","⠒","⠐","⠐","⠒","⠓","⠋"]},"dots6":{"interval":80,"frames":["⠁","⠉","⠙","⠚","⠒","⠂","⠂","⠒","⠲","⠴","⠤","⠄","⠄","⠤","⠴","⠲","⠒","⠂","⠂","⠒","⠚","⠙","⠉","⠁"]},"dots7":{"interval":80,"frames":["⠈","⠉","⠋","⠓","⠒","⠐","⠐","⠒","⠖","⠦","⠤","⠠","⠠","⠤","⠦","⠖","⠒","⠐","⠐","⠒","⠓","⠋","⠉","⠈"]},"dots8":{"interval":80,"frames":["⠁","⠁","⠉","⠙","⠚","⠒","⠂","⠂","⠒","⠲","⠴","⠤","⠄","⠄","⠤","⠠","⠠","⠤","⠦","⠖","⠒","⠐","⠐","⠒","⠓","⠋","⠉","⠈","⠈"]},"dots9":{"interval":80,"frames":["⢹","⢺","⢼","⣸","⣇","⡧","⡗","⡏"]},"dots10":{"interval":80,"frames":["⢄","⢂","⢁","⡁","⡈","⡐","⡠"]},"dots11":{"interval":100,"frames":["⠁","⠂","⠄","⡀","⢀","⠠","⠐","⠈"]},"dots12":{"interval":80,"frames":["⢀⠀","⡀⠀","⠄⠀","⢂⠀","⡂⠀","⠅⠀","⢃⠀","⡃⠀","⠍⠀","⢋⠀","⡋⠀","⠍⠁","⢋⠁","⡋⠁","⠍⠉","⠋⠉","⠋⠉","⠉⠙","⠉⠙","⠉⠩","⠈⢙","⠈⡙","⢈⠩","⡀⢙","⠄⡙","⢂⠩","⡂⢘","⠅⡘","⢃⠨","⡃⢐","⠍⡐","⢋⠠","⡋⢀","⠍⡁","⢋⠁","⡋⠁","⠍⠉","⠋⠉","⠋⠉","⠉⠙","⠉⠙","⠉⠩","⠈⢙","⠈⡙","⠈⠩","⠀⢙","⠀⡙","⠀⠩","⠀⢘","⠀⡘","⠀⠨","⠀⢐","⠀⡐","⠀⠠","⠀⢀","⠀⡀"]},"dots13":{"interval":80,"frames":["⣼","⣹","⢻","⠿","⡟","⣏","⣧","⣶"]},"dots14":{"interval":80,"frames":["⠉⠉","⠈⠙","⠀⠹","⠀⢸","⠀⣰","⢀⣠","⣀⣀","⣄⡀","⣆⠀","⡇⠀","⠏⠀","⠋⠁"]},"dots8Bit":{"interval":80,"frames":["⠀","⠁","⠂","⠃","⠄","⠅","⠆","⠇","⡀","⡁","⡂","⡃","⡄","⡅","⡆","⡇","⠈","⠉","⠊","⠋","⠌","⠍","⠎","⠏","⡈","⡉","⡊","⡋","⡌","⡍","⡎","⡏","⠐","⠑","⠒","⠓","⠔","⠕","⠖","⠗","⡐","⡑","⡒","⡓","⡔","⡕","⡖","⡗","⠘","⠙","⠚","⠛","⠜","⠝","⠞","⠟","⡘","⡙","⡚","⡛","⡜","⡝","⡞","⡟","⠠","⠡","⠢","⠣","⠤","⠥","⠦","⠧","⡠","⡡","⡢","⡣","⡤","⡥","⡦","⡧","⠨","⠩","⠪","⠫","⠬","⠭","⠮","⠯","⡨","⡩","⡪","⡫","⡬","⡭","⡮","⡯","⠰","⠱","⠲","⠳","⠴","⠵","⠶","⠷","⡰","⡱","⡲","⡳","⡴","⡵","⡶","⡷","⠸","⠹","⠺","⠻","⠼","⠽","⠾","⠿","⡸","⡹","⡺","⡻","⡼","⡽","⡾","⡿","⢀","⢁","⢂","⢃","⢄","⢅","⢆","⢇","⣀","⣁","⣂","⣃","⣄","⣅","⣆","⣇","⢈","⢉","⢊","⢋","⢌","⢍","⢎","⢏","⣈","⣉","⣊","⣋","⣌","⣍","⣎","⣏","⢐","⢑","⢒","⢓","⢔","⢕","⢖","⢗","⣐","⣑","⣒","⣓","⣔","⣕","⣖","⣗","⢘","⢙","⢚","⢛","⢜","⢝","⢞","⢟","⣘","⣙","⣚","⣛","⣜","⣝","⣞","⣟","⢠","⢡","⢢","⢣","⢤","⢥","⢦","⢧","⣠","⣡","⣢","⣣","⣤","⣥","⣦","⣧","⢨","⢩","⢪","⢫","⢬","⢭","⢮","⢯","⣨","⣩","⣪","⣫","⣬","⣭","⣮","⣯","⢰","⢱","⢲","⢳","⢴","⢵","⢶","⢷","⣰","⣱","⣲","⣳","⣴","⣵","⣶","⣷","⢸","⢹","⢺","⢻","⢼","⢽","⢾","⢿","⣸","⣹","⣺","⣻","⣼","⣽","⣾","⣿"]},"dotsCircle":{"interval":80,"frames":["⢎ ","⠎⠁","⠊⠑","⠈⠱"," ⡱","⢀⡰","⢄⡠","⢆⡀"]},"sand":{"interval":80,"frames":["⠁","⠂","⠄","⡀","⡈","⡐","⡠","⣀","⣁","⣂","⣄","⣌","⣔","⣤","⣥","⣦","⣮","⣶","⣷","⣿","⡿","⠿","⢟","⠟","⡛","⠛","⠫","⢋","⠋","⠍","⡉","⠉","⠑","⠡","⢁"]},"line":{"interval":130,"frames":["-","\\\\","|","/"]},"line2":{"interval":100,"frames":["⠂","-","–","—","–","-"]},"rollingLine":{"interval":80,"frames":["/ "," - "," \\\\ "," |"," |"," \\\\ "," - ","/ "]},"pipe":{"interval":100,"frames":["┤","┘","┴","└","├","┌","┬","┐"]},"simpleDots":{"interval":400,"frames":[". ",".. ","..."," "]},"simpleDotsScrolling":{"interval":200,"frames":[". ",".. ","..."," .."," ."," "]},"star":{"interval":70,"frames":["✶","✸","✹","✺","✹","✷"]},"star2":{"interval":80,"frames":["+","x","*"]},"flip":{"interval":70,"frames":["_","_","_","-","`","`","\'","\xb4","-","_","_","_"]},"hamburger":{"interval":100,"frames":["☱","☲","☴"]},"growVertical":{"interval":120,"frames":["▁","▃","▄","▅","▆","▇","▆","▅","▄","▃"]},"growHorizontal":{"interval":120,"frames":["▏","▎","▍","▌","▋","▊","▉","▊","▋","▌","▍","▎"]},"balloon":{"interval":140,"frames":[" ",".","o","O","@","*"," "]},"balloon2":{"interval":120,"frames":[".","o","O","\xb0","O","o","."]},"noise":{"interval":100,"frames":["▓","▒","░"]},"bounce":{"interval":120,"frames":["⠁","⠂","⠄","⠂"]},"boxBounce":{"interval":120,"frames":["▖","▘","▝","▗"]},"boxBounce2":{"interval":100,"frames":["▌","▀","▐","▄"]},"triangle":{"interval":50,"frames":["◢","◣","◤","◥"]},"binary":{"interval":80,"frames":["010010","001100","100101","111010","111101","010111","101011","111000","110011","110101"]},"arc":{"interval":100,"frames":["◜","◠","◝","◞","◡","◟"]},"circle":{"interval":120,"frames":["◡","⊙","◠"]},"squareCorners":{"interval":180,"frames":["◰","◳","◲","◱"]},"circleQuarters":{"interval":120,"frames":["◴","◷","◶","◵"]},"circleHalves":{"interval":50,"frames":["◐","◓","◑","◒"]},"squish":{"interval":100,"frames":["╫","╪"]},"toggle":{"interval":250,"frames":["⊶","⊷"]},"toggle2":{"interval":80,"frames":["▫","▪"]},"toggle3":{"interval":120,"frames":["□","■"]},"toggle4":{"interval":100,"frames":["■","□","▪","▫"]},"toggle5":{"interval":100,"frames":["▮","▯"]},"toggle6":{"interval":300,"frames":["ဝ","၀"]},"toggle7":{"interval":80,"frames":["⦾","⦿"]},"toggle8":{"interval":100,"frames":["◍","◌"]},"toggle9":{"interval":100,"frames":["◉","◎"]},"toggle10":{"interval":100,"frames":["㊂","㊀","㊁"]},"toggle11":{"interval":50,"frames":["⧇","⧆"]},"toggle12":{"interval":120,"frames":["☗","☖"]},"toggle13":{"interval":80,"frames":["=","*","-"]},"arrow":{"interval":100,"frames":["←","↖","↑","↗","→","↘","↓","↙"]},"arrow2":{"interval":80,"frames":["⬆️ ","↗️ ","➡️ ","↘️ ","⬇️ ","↙️ ","⬅️ ","↖️ "]},"arrow3":{"interval":120,"frames":["▹▹▹▹▹","▸▹▹▹▹","▹▸▹▹▹","▹▹▸▹▹","▹▹▹▸▹","▹▹▹▹▸"]},"bouncingBar":{"interval":80,"frames":["[ ]","[= ]","[== ]","[=== ]","[====]","[ ===]","[ ==]","[ =]","[ ]","[ =]","[ ==]","[ ===]","[====]","[=== ]","[== ]","[= ]"]},"bouncingBall":{"interval":80,"frames":["( ● )","( ● )","( ● )","( ● )","( ●)","( ● )","( ● )","( ● )","( ● )","(● )"]},"smiley":{"interval":200,"frames":["\uD83D\uDE04 ","\uD83D\uDE1D "]},"monkey":{"interval":300,"frames":["\uD83D\uDE48 ","\uD83D\uDE48 ","\uD83D\uDE49 ","\uD83D\uDE4A "]},"hearts":{"interval":100,"frames":["\uD83D\uDC9B ","\uD83D\uDC99 ","\uD83D\uDC9C ","\uD83D\uDC9A ","\uD83D\uDC97 "]},"clock":{"interval":100,"frames":["\uD83D\uDD5B ","\uD83D\uDD50 ","\uD83D\uDD51 ","\uD83D\uDD52 ","\uD83D\uDD53 ","\uD83D\uDD54 ","\uD83D\uDD55 ","\uD83D\uDD56 ","\uD83D\uDD57 ","\uD83D\uDD58 ","\uD83D\uDD59 ","\uD83D\uDD5A "]},"earth":{"interval":180,"frames":["\uD83C\uDF0D ","\uD83C\uDF0E ","\uD83C\uDF0F "]},"material":{"interval":17,"frames":["█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁","██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁","███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁","████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁","██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁","██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁","███████▁▁▁▁▁▁▁▁▁▁▁▁▁","████████▁▁▁▁▁▁▁▁▁▁▁▁","█████████▁▁▁▁▁▁▁▁▁▁▁","█████████▁▁▁▁▁▁▁▁▁▁▁","██████████▁▁▁▁▁▁▁▁▁▁","███████████▁▁▁▁▁▁▁▁▁","█████████████▁▁▁▁▁▁▁","██████████████▁▁▁▁▁▁","██████████████▁▁▁▁▁▁","▁██████████████▁▁▁▁▁","▁██████████████▁▁▁▁▁","▁██████████████▁▁▁▁▁","▁▁██████████████▁▁▁▁","▁▁▁██████████████▁▁▁","▁▁▁▁█████████████▁▁▁","▁▁▁▁██████████████▁▁","▁▁▁▁██████████████▁▁","▁▁▁▁▁██████████████▁","▁▁▁▁▁██████████████▁","▁▁▁▁▁██████████████▁","▁▁▁▁▁▁██████████████","▁▁▁▁▁▁██████████████","▁▁▁▁▁▁▁█████████████","▁▁▁▁▁▁▁█████████████","▁▁▁▁▁▁▁▁████████████","▁▁▁▁▁▁▁▁████████████","▁▁▁▁▁▁▁▁▁███████████","▁▁▁▁▁▁▁▁▁███████████","▁▁▁▁▁▁▁▁▁▁██████████","▁▁▁▁▁▁▁▁▁▁██████████","▁▁▁▁▁▁▁▁▁▁▁▁████████","▁▁▁▁▁▁▁▁▁▁▁▁▁███████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████","█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████","██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███","██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███","███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███","████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██","█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█","█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█","██████▁▁▁▁▁▁▁▁▁▁▁▁▁█","████████▁▁▁▁▁▁▁▁▁▁▁▁","█████████▁▁▁▁▁▁▁▁▁▁▁","█████████▁▁▁▁▁▁▁▁▁▁▁","█████████▁▁▁▁▁▁▁▁▁▁▁","█████████▁▁▁▁▁▁▁▁▁▁▁","███████████▁▁▁▁▁▁▁▁▁","████████████▁▁▁▁▁▁▁▁","████████████▁▁▁▁▁▁▁▁","██████████████▁▁▁▁▁▁","██████████████▁▁▁▁▁▁","▁██████████████▁▁▁▁▁","▁██████████████▁▁▁▁▁","▁▁▁█████████████▁▁▁▁","▁▁▁▁▁████████████▁▁▁","▁▁▁▁▁████████████▁▁▁","▁▁▁▁▁▁███████████▁▁▁","▁▁▁▁▁▁▁▁█████████▁▁▁","▁▁▁▁▁▁▁▁█████████▁▁▁","▁▁▁▁▁▁▁▁▁█████████▁▁","▁▁▁▁▁▁▁▁▁█████████▁▁","▁▁▁▁▁▁▁▁▁▁█████████▁","▁▁▁▁▁▁▁▁▁▁▁████████▁","▁▁▁▁▁▁▁▁▁▁▁████████▁","▁▁▁▁▁▁▁▁▁▁▁▁███████▁","▁▁▁▁▁▁▁▁▁▁▁▁███████▁","▁▁▁▁▁▁▁▁▁▁▁▁▁███████","▁▁▁▁▁▁▁▁▁▁▁▁▁███████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁","▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁"]},"moon":{"interval":80,"frames":["\uD83C\uDF11 ","\uD83C\uDF12 ","\uD83C\uDF13 ","\uD83C\uDF14 ","\uD83C\uDF15 ","\uD83C\uDF16 ","\uD83C\uDF17 ","\uD83C\uDF18 "]},"runner":{"interval":140,"frames":["\uD83D\uDEB6 ","\uD83C\uDFC3 "]},"pong":{"interval":80,"frames":["▐⠂ ▌","▐⠈ ▌","▐ ⠂ ▌","▐ ⠠ ▌","▐ ⡀ ▌","▐ ⠠ ▌","▐ ⠂ ▌","▐ ⠈ ▌","▐ ⠂ ▌","▐ ⠠ ▌","▐ ⡀ ▌","▐ ⠠ ▌","▐ ⠂ ▌","▐ ⠈ ▌","▐ ⠂▌","▐ ⠠▌","▐ ⡀▌","▐ ⠠ ▌","▐ ⠂ ▌","▐ ⠈ ▌","▐ ⠂ ▌","▐ ⠠ ▌","▐ ⡀ ▌","▐ ⠠ ▌","▐ ⠂ ▌","▐ ⠈ ▌","▐ ⠂ ▌","▐ ⠠ ▌","▐ ⡀ ▌","▐⠠ ▌"]},"shark":{"interval":120,"frames":["▐|\\\\____________▌","▐_|\\\\___________▌","▐__|\\\\__________▌","▐___|\\\\_________▌","▐____|\\\\________▌","▐_____|\\\\_______▌","▐______|\\\\______▌","▐_______|\\\\_____▌","▐________|\\\\____▌","▐_________|\\\\___▌","▐__________|\\\\__▌","▐___________|\\\\_▌","▐____________|\\\\▌","▐____________/|▌","▐___________/|_▌","▐__________/|__▌","▐_________/|___▌","▐________/|____▌","▐_______/|_____▌","▐______/|______▌","▐_____/|_______▌","▐____/|________▌","▐___/|_________▌","▐__/|__________▌","▐_/|___________▌","▐/|____________▌"]},"dqpb":{"interval":100,"frames":["d","q","p","b"]},"weather":{"interval":100,"frames":["☀️ ","☀️ ","☀️ ","\uD83C\uDF24 ","⛅️ ","\uD83C\uDF25 ","☁️ ","\uD83C\uDF27 ","\uD83C\uDF28 ","\uD83C\uDF27 ","\uD83C\uDF28 ","\uD83C\uDF27 ","\uD83C\uDF28 ","⛈ ","\uD83C\uDF28 ","\uD83C\uDF27 ","\uD83C\uDF28 ","☁️ ","\uD83C\uDF25 ","⛅️ ","\uD83C\uDF24 ","☀️ ","☀️ "]},"christmas":{"interval":400,"frames":["\uD83C\uDF32","\uD83C\uDF84"]},"grenade":{"interval":80,"frames":["، ","′ "," \xb4 "," ‾ "," ⸌"," ⸊"," |"," ⁎"," ⁕"," ෴ "," ⁓"," "," "," "]},"point":{"interval":125,"frames":["∙∙∙","●∙∙","∙●∙","∙∙●","∙∙∙"]},"layer":{"interval":150,"frames":["-","=","≡"]},"betaWave":{"interval":80,"frames":["ρββββββ","βρβββββ","ββρββββ","βββρβββ","ββββρββ","βββββρβ","ββββββρ"]},"fingerDance":{"interval":160,"frames":["\uD83E\uDD18 ","\uD83E\uDD1F ","\uD83D\uDD96 ","✋ ","\uD83E\uDD1A ","\uD83D\uDC46 "]},"fistBump":{"interval":80,"frames":["\uD83E\uDD1C \uD83E\uDD1B ","\uD83E\uDD1C \uD83E\uDD1B ","\uD83E\uDD1C \uD83E\uDD1B "," \uD83E\uDD1C \uD83E\uDD1B "," \uD83E\uDD1C\uD83E\uDD1B "," \uD83E\uDD1C✨\uD83E\uDD1B ","\uD83E\uDD1C ✨ \uD83E\uDD1B "]},"soccerHeader":{"interval":80,"frames":[" \uD83E\uDDD1⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️\uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 ","\uD83E\uDDD1 ⚽️ \uD83E\uDDD1 "]},"mindblown":{"interval":160,"frames":["\uD83D\uDE10 ","\uD83D\uDE10 ","\uD83D\uDE2E ","\uD83D\uDE2E ","\uD83D\uDE26 ","\uD83D\uDE26 ","\uD83D\uDE27 ","\uD83D\uDE27 ","\uD83E\uDD2F ","\uD83D\uDCA5 ","✨ "," "," "," "]},"speaker":{"interval":160,"frames":["\uD83D\uDD08 ","\uD83D\uDD09 ","\uD83D\uDD0A ","\uD83D\uDD09 "]},"orangePulse":{"interval":100,"frames":["\uD83D\uDD38 ","\uD83D\uDD36 ","\uD83D\uDFE0 ","\uD83D\uDFE0 ","\uD83D\uDD36 "]},"bluePulse":{"interval":100,"frames":["\uD83D\uDD39 ","\uD83D\uDD37 ","\uD83D\uDD35 ","\uD83D\uDD35 ","\uD83D\uDD37 "]},"orangeBluePulse":{"interval":100,"frames":["\uD83D\uDD38 ","\uD83D\uDD36 ","\uD83D\uDFE0 ","\uD83D\uDFE0 ","\uD83D\uDD36 ","\uD83D\uDD39 ","\uD83D\uDD37 ","\uD83D\uDD35 ","\uD83D\uDD35 ","\uD83D\uDD37 "]},"timeTravel":{"interval":100,"frames":["\uD83D\uDD5B ","\uD83D\uDD5A ","\uD83D\uDD59 ","\uD83D\uDD58 ","\uD83D\uDD57 ","\uD83D\uDD56 ","\uD83D\uDD55 ","\uD83D\uDD54 ","\uD83D\uDD53 ","\uD83D\uDD52 ","\uD83D\uDD51 ","\uD83D\uDD50 "]},"aesthetic":{"interval":80,"frames":["▰▱▱▱▱▱▱","▰▰▱▱▱▱▱","▰▰▰▱▱▱▱","▰▰▰▰▱▱▱","▰▰▰▰▰▱▱","▰▰▰▰▰▰▱","▰▰▰▰▰▰▰","▰▱▱▱▱▱▱"]},"dwarfFortress":{"interval":80,"frames":[" ██████\xa3\xa3\xa3 ","☺██████\xa3\xa3\xa3 ","☺██████\xa3\xa3\xa3 ","☺▓█████\xa3\xa3\xa3 ","☺▓█████\xa3\xa3\xa3 ","☺▒█████\xa3\xa3\xa3 ","☺▒█████\xa3\xa3\xa3 ","☺░█████\xa3\xa3\xa3 ","☺░█████\xa3\xa3\xa3 ","☺ █████\xa3\xa3\xa3 "," ☺█████\xa3\xa3\xa3 "," ☺█████\xa3\xa3\xa3 "," ☺▓████\xa3\xa3\xa3 "," ☺▓████\xa3\xa3\xa3 "," ☺▒████\xa3\xa3\xa3 "," ☺▒████\xa3\xa3\xa3 "," ☺░████\xa3\xa3\xa3 "," ☺░████\xa3\xa3\xa3 "," ☺ ████\xa3\xa3\xa3 "," ☺████\xa3\xa3\xa3 "," ☺████\xa3\xa3\xa3 "," ☺▓███\xa3\xa3\xa3 "," ☺▓███\xa3\xa3\xa3 "," ☺▒███\xa3\xa3\xa3 "," ☺▒███\xa3\xa3\xa3 "," ☺░███\xa3\xa3\xa3 "," ☺░███\xa3\xa3\xa3 "," ☺ ███\xa3\xa3\xa3 "," ☺███\xa3\xa3\xa3 "," ☺███\xa3\xa3\xa3 "," ☺▓██\xa3\xa3\xa3 "," ☺▓██\xa3\xa3\xa3 "," ☺▒██\xa3\xa3\xa3 "," ☺▒██\xa3\xa3\xa3 "," ☺░██\xa3\xa3\xa3 "," ☺░██\xa3\xa3\xa3 "," ☺ ██\xa3\xa3\xa3 "," ☺██\xa3\xa3\xa3 "," ☺██\xa3\xa3\xa3 "," ☺▓█\xa3\xa3\xa3 "," ☺▓█\xa3\xa3\xa3 "," ☺▒█\xa3\xa3\xa3 "," ☺▒█\xa3\xa3\xa3 "," ☺░█\xa3\xa3\xa3 "," ☺░█\xa3\xa3\xa3 "," ☺ █\xa3\xa3\xa3 "," ☺█\xa3\xa3\xa3 "," ☺█\xa3\xa3\xa3 "," ☺▓\xa3\xa3\xa3 "," ☺▓\xa3\xa3\xa3 "," ☺▒\xa3\xa3\xa3 "," ☺▒\xa3\xa3\xa3 "," ☺░\xa3\xa3\xa3 "," ☺░\xa3\xa3\xa3 "," ☺ \xa3\xa3\xa3 "," ☺\xa3\xa3\xa3 "," ☺\xa3\xa3\xa3 "," ☺▓\xa3\xa3 "," ☺▓\xa3\xa3 "," ☺▒\xa3\xa3 "," ☺▒\xa3\xa3 "," ☺░\xa3\xa3 "," ☺░\xa3\xa3 "," ☺ \xa3\xa3 "," ☺\xa3\xa3 "," ☺\xa3\xa3 "," ☺▓\xa3 "," ☺▓\xa3 "," ☺▒\xa3 "," ☺▒\xa3 "," ☺░\xa3 "," ☺░\xa3 "," ☺ \xa3 "," ☺\xa3 "," ☺\xa3 "," ☺▓ "," ☺▓ "," ☺▒ "," ☺▒ "," ☺░ "," ☺░ "," ☺ "," ☺ &"," ☺ ☼&"," ☺ ☼ &"," ☺☼ &"," ☺☼ & "," ‼ & "," ☺ & "," ‼ & "," ☺ & "," ‼ & "," ☺ & ","‼ & "," & "," & "," & ░ "," & ▒ "," & ▓ "," & \xa3 "," & ░\xa3 "," & ▒\xa3 "," & ▓\xa3 "," & \xa3\xa3 "," & ░\xa3\xa3 "," & ▒\xa3\xa3 ","& ▓\xa3\xa3 ","& \xa3\xa3\xa3 "," ░\xa3\xa3\xa3 "," ▒\xa3\xa3\xa3 "," ▓\xa3\xa3\xa3 "," █\xa3\xa3\xa3 "," ░█\xa3\xa3\xa3 "," ▒█\xa3\xa3\xa3 "," ▓█\xa3\xa3\xa3 "," ██\xa3\xa3\xa3 "," ░██\xa3\xa3\xa3 "," ▒██\xa3\xa3\xa3 "," ▓██\xa3\xa3\xa3 "," ███\xa3\xa3\xa3 "," ░███\xa3\xa3\xa3 "," ▒███\xa3\xa3\xa3 "," ▓███\xa3\xa3\xa3 "," ████\xa3\xa3\xa3 "," ░████\xa3\xa3\xa3 "," ▒████\xa3\xa3\xa3 "," ▓████\xa3\xa3\xa3 "," █████\xa3\xa3\xa3 "," ░█████\xa3\xa3\xa3 "," ▒█████\xa3\xa3\xa3 "," ▓█████\xa3\xa3\xa3 "," ██████\xa3\xa3\xa3 "," ██████\xa3\xa3\xa3 "]},"fish":{"interval":80,"frames":["~~~~~~~~~~~~~~~~~~~~","> ~~~~~~~~~~~~~~~~~~","\xba> ~~~~~~~~~~~~~~~~~","(\xba> ~~~~~~~~~~~~~~~~","((\xba> ~~~~~~~~~~~~~~~","<((\xba> ~~~~~~~~~~~~~~","><((\xba> ~~~~~~~~~~~~~"," ><((\xba> ~~~~~~~~~~~~","~ ><((\xba> ~~~~~~~~~~~","~~ <>((\xba> ~~~~~~~~~~","~~~ ><((\xba> ~~~~~~~~~","~~~~ <>((\xba> ~~~~~~~~","~~~~~ ><((\xba> ~~~~~~~","~~~~~~ <>((\xba> ~~~~~~","~~~~~~~ ><((\xba> ~~~~~","~~~~~~~~ <>((\xba> ~~~~","~~~~~~~~~ ><((\xba> ~~~","~~~~~~~~~~ <>((\xba> ~~","~~~~~~~~~~~ ><((\xba> ~","~~~~~~~~~~~~ <>((\xba> ","~~~~~~~~~~~~~ ><((\xba>","~~~~~~~~~~~~~~ <>((\xba","~~~~~~~~~~~~~~~ ><((","~~~~~~~~~~~~~~~~ <>(","~~~~~~~~~~~~~~~~~ ><","~~~~~~~~~~~~~~~~~~ <","~~~~~~~~~~~~~~~~~~~~"]}}');function I({label:e,type:t}){let{frame:r}=function({type:e="dots"}){let[t,r]=(0,g.useState)(0),n=k[e];return(0,g.useEffect)(()=>{let e=setInterval(()=>{r(e=>e===n.frames.length-1?0:e+1)},n.interval);return()=>{clearInterval(e)}},[n]),{frame:n.frames[t]??""}}({type:t}),{styles:n}=h("Spinner");return g.createElement(o,{...n.container()},g.createElement(l,{...n.frame()},r),e&&g.createElement(l,{...n.label()},e))}Object.keys(k);let M=(e,t)=>{switch(t.type){case"move-cursor-left":return{...e,cursorOffset:Math.max(0,e.cursorOffset-1)};case"move-cursor-right":return{...e,cursorOffset:Math.min(e.value.length,e.cursorOffset+1)};case"insert":return{...e,previousValue:e.value,value:e.value.slice(0,e.cursorOffset)+t.text+e.value.slice(e.cursorOffset),cursorOffset:e.cursorOffset+t.text.length};case"delete":{let t=Math.max(0,e.cursorOffset-1);return{...e,previousValue:e.value,value:e.value.slice(0,t)+e.value.slice(t+1),cursorOffset:t}}}},A=t.inverse(" ");function D({isDisabled:e=!1,defaultValue:r,placeholder:a="",suggestions:s,onChange:i,onSubmit:o}){let{inputValue:c}=(({isDisabled:e=!1,state:r,placeholder:l=""})=>{let a=(0,g.useMemo)(()=>e?l?t.dim(l):"":l&&l.length>0?t.inverse(l[0])+t.dim(l.slice(1)):A,[e,l]),s=(0,g.useMemo)(()=>{if(e)return r.value;let n=0,l=r.value.length>0?"":A;for(let e of r.value)l+=n===r.cursorOffset?t.inverse(e):e,n++;return r.suggestion?r.cursorOffset===r.value.length?l+=t.inverse(r.suggestion[0])+t.dim(r.suggestion.slice(1)):l+=t.dim(r.suggestion):r.value.length>0&&r.cursorOffset===r.value.length&&(l+=A),l},[e,r.value,r.cursorOffset,r.suggestion]);return n((e,t)=>{if(!t.upArrow&&!t.downArrow&&(!t.ctrl||"c"!==e)&&!t.tab&&(!t.shift||!t.tab)){if(t.return)return void r.submit();t.leftArrow?r.moveCursorLeft():t.rightArrow?r.moveCursorRight():t.backspace||t.delete?r.delete():r.insert(e)}},{isActive:!e}),{inputValue:r.value.length>0?s:a}})({isDisabled:e,placeholder:a,state:(({defaultValue:e="",suggestions:t,onChange:r,onSubmit:n})=>{let[l,a]=(0,g.useReducer)(M,{previousValue:e,value:e,cursorOffset:e.length}),s=(0,g.useMemo)(()=>{if(0!==l.value.length)return t?.find(e=>e.startsWith(l.value))?.replace(l.value,"")},[l.value,t]),i=(0,g.useCallback)(()=>{a({type:"move-cursor-left"})},[]),o=(0,g.useCallback)(()=>{a({type:"move-cursor-right"})},[]),c=(0,g.useCallback)(e=>{a({type:"insert",text:e})},[]),u=(0,g.useCallback)(()=>{a({type:"delete"})},[]),_=(0,g.useCallback)(()=>{if(s){c(s),n?.(l.value+s);return}n?.(l.value)},[l.value,s,c,n]);return(0,g.useEffect)(()=>{l.value!==l.previousValue&&r?.(l.value)},[l.previousValue,l.value,r]),{...l,suggestion:s,moveCursorLeft:i,moveCursorRight:o,insert:c,delete:u,submit:_}})({defaultValue:r,suggestions:s,onChange:i,onSubmit:o})}),{styles:u}=h("TextInput");return g.createElement(l,{...u.value()},c)}(0,g.createContext)({marker:r.line});(0,g.createContext)({marker:""}),t.inverse(" "),t.inverse(" ");let P=e("node:os"),V=e("node:stream"),j="#72A7FF",F="#4B586C",T="#7F8DA6",$="#55D6A9",K="#F2C66D",R=u.map(({command:e})=>e.replace(/\s+\[[^\]]+\]$/,"")),B=_.map(({command:e})=>e.replace(/\s+\[[^\]]+\]$/,"")),L={id:"initial",kind:"initial"};function H(){let e=[],t=-1,r="";return{next:n=>t<0?n:(t-=1)<0?r:e[t],previous:n=>0===e.length?n:(t<0&&(r=n),t=Math.min(t+1,e.length-1),e[t]),record(n){e.unshift(n),e.length>20&&(e.length=20),t=-1,r=""}}}async function U(e){let t=new J,r=new Y(e.toChoices),n=new Q,l=await e.createSession(t,r.selectItem,n.update),s=a(g.createElement(W,{deviceAppSetup:n,selections:r,session:l,subscribeCompileProgress:e.subscribeCompileProgress,transcript:t}),{exitOnCtrlC:!1,maxFps:15,stderr:process.stderr,stdin:e.stdin,stdout:process.stderr});try{await s.waitUntilExit()}finally{r.cancel(),await l.close()}return{status:l.getState().status}}function W({deviceAppSetup:e,session:t,selections:r,subscribeCompileProgress:a,transcript:c}){let{exit:u}=s(),[_,f]=(0,g.useState)(),[m,d]=(0,g.useState)(!1),v=(0,g.useRef)(""),[p,b]=(0,g.useState)(0),h=(0,g.useRef)({device:H(),root:H()}).current,[x,y]=(0,g.useState)("root"),[E,C]=(0,g.useState)(()=>c.snapshot()),[w,S]=(0,g.useState)(),[k,M]=(0,g.useState)(()=>t.getState()),[A,P]=(0,g.useState)(),[V,U]=(0,g.useState)(()=>e.snapshot()),z=(0,g.useCallback)((e,t="执行中")=>{f(e?t:void 0)},[]),J=(0,g.useCallback)(()=>d(!0),[]);(0,g.useEffect)(()=>t.subscribe(e=>{"client-disconnected"===e&&y("root")}),[t]),(0,g.useEffect)(()=>e.subscribe(U),[e]),(0,g.useEffect)(()=>{m&&u()},[u,m]),(0,g.useEffect)(()=>c.subscribe(C),[c]),(0,g.useEffect)(()=>r.subscribe(e=>{S(e)}),[r]),(0,g.useEffect)(()=>a?.(e=>{P(e<1?e:void 0)}),[a]),(0,g.useEffect)(()=>{let e=setInterval(()=>M(t.getState()),500);return t.stopped.then(J,J),()=>clearInterval(e)},[J,t]);let Q=(0,g.useCallback)(e=>{let r=e.trim();if(!r||_)return;v.current="",b(e=>e+1),h[x].record(r),c.appendLine(`${"device"===x?"device ›":"›"} ${r}`);let n=r.toLowerCase(),l=n.split(/\s+/,1)[0];if("device"===x&&("back"===n||".."===r)){z(!0,"正在返回主命令"),t.returnToRoot().finally(()=>{y("root"),z(!1)});return}let a=r;"device"===x&&"status"!==l&&"web"!==l&&(a=`device ${r}`),z(!0),t.execute(a).then(e=>{"root"===x&&"enter-device"===e&&y("device"),M(t.getState())}).finally(()=>z(!1))},[_,h,x,t,z,c]);return n((e,n)=>{if(n.ctrl&&"c"===e){if(r.cancel(),_){t.cancelActiveCommand()&&z(!0,"正在停止");return}z(!0,"正在退出"),t.close().finally(J);return}if(!w&&n.ctrl&&"u"===e){v.current="",b(e=>e+1);return}w?n.escape&&r.resolve(void 0):(e=>{let t=h[x];if(e.upArrow)v.current=t.previous(v.current);else if(e.downArrow)v.current=t.next(v.current);else{if(!e.tab||e.shift)return;let t=("device"===x?B:R).find(e=>e.startsWith(v.current));if(!t||t===v.current)return;v.current=t}b(e=>e+1)})(n)}),g.createElement(g.Fragment,null,g.createElement(i,{items:[L,...E]},e=>{var t;if("initial"===e.kind)return g.createElement(o,{flexDirection:"column",key:e.id},g.createElement(G,{state:k}));let r=e.text.startsWith("⚠");return g.createElement(l,{color:r?void 0:(t=e.text,/^(error|failed|failure_reason|启动真机调试失败|启动豆包开发者工具失败|关闭豆包开发者工具失败)/i.test(t)?"#FF6B7A":/^(warning|toolchain warnings)/i.test(t)?K:/^✓ (下载豆包开发者工具|豆包开发者工具已安装)/.test(t)||/^(status: ok|status: running|page pushed|widget pushed|web_debugger|Web 模拟器已打开)/i.test(t)?$:/^(debug:|(?:device )?›)/i.test(t)?j:void 0),key:e.id,wrap:"wrap"},r&&g.createElement(l,{color:K},"⚠"),r?e.text.slice(1):e.text||" ")}),g.createElement(o,{display:m?"none":"flex",flexDirection:"column"},g.createElement(q,{scope:x}),g.createElement(o,{flexDirection:"column",marginTop:1},V?g.createElement(N,{progress:V}):void 0!==A?g.createElement(I,{label:`应用编译 ${Math.round(100*A)}%`}):_?g.createElement(I,{label:_}):null,w?g.createElement(o,{borderColor:F,borderStyle:"single",flexDirection:"column",paddingX:1},g.createElement(l,{bold:!0,color:j},"versionTag"===w.kind?"选择关联的 versionTag":`Select ${"page"===w.kind?"a page":"a widget"}`),g.createElement(O,{onChange:e=>r.resolve(e),options:w.choices,visibleOptionCount:7}),g.createElement(l,{color:T},"↑↓ move enter select esc cancel")):g.createElement(o,null,g.createElement(l,{bold:!0,color:j},"device"===x?"device › ":"› "),g.createElement(D,{defaultValue:v.current,isDisabled:!!_,key:p,onChange:e=>{v.current=e},onSubmit:Q,placeholder:"device"===x?"back 返回主命令":"Ctrl+C 退出",suggestions:"device"===x?B:R}))),g.createElement(X,{state:k})))}function N({progress:e}){let t=f(e);return"complete"===e.phase?g.createElement(o,null,g.createElement(l,{color:$},"✓ ",t)):g.createElement(o,null,g.createElement(I,{label:t}))}function q({scope:e}){let t="device"===e?_:u;return g.createElement(o,{flexDirection:"column",marginTop:1},g.createElement(l,{bold:!0,color:j},"device"===e?"真机调试命令":"可用命令"),t.map(e=>g.createElement(o,{flexDirection:"row",key:e.command},g.createElement(o,{width:24},g.createElement(l,{color:j},` ${e.command}`)),g.createElement(l,null,e.description))))}function G({state:e}){return g.createElement(o,{borderColor:F,borderStyle:"single",flexDirection:"column",paddingX:1},g.createElement(l,null,g.createElement(l,{color:j},">"),g.createElement(l,{bold:!0}," Doubao Dev CLI"),g.createElement(l,{color:T},` (v${m})`)),g.createElement(l,{wrap:"truncate-middle"},g.createElement(l,{color:T},"Project".padEnd(16)),z(e.projectPath??e.appDir)),g.createElement(l,{wrap:"truncate-middle"},g.createElement(l,{color:T},"App".padEnd(16)),e.appId??"-"))}function X({state:e}){let{columns:t}=c(),r="running"===e.status,n=e.appId??"-",a=z(e.projectPath??e.appDir),s=`${n} \xb7 ${a}`,i=s.length+2<=t?s:n;return g.createElement(l,{color:T,wrap:"truncate-middle"},g.createElement(l,{color:r?$:T},r?"●":"○"),` ${i}`)}function z(e){let t=(0,P.homedir)();return e===t?"~":e.startsWith(`${t}/`)||e.startsWith(`${t}\\`)?`~${e.slice(t.length)}`:e}class J extends V.Writable{carry="";id=0;lines=[];subscribers=new Set;snapshot(){return[...this.lines]}subscribe(e){return this.subscribers.add(e),()=>{this.subscribers.delete(e)}}appendLine(e){this.appendPart(e),this.notify()}_write(e,t,r){let n=`${this.carry}${e.toString()}`.split(/\r?\n/);for(let e of(this.carry=n.pop()??"",n))this.appendPart(e);this.notify(),r()}appendPart(e){this.lines.push({id:this.id++,kind:"line",text:e})}notify(){let e=this.snapshot();for(let t of this.subscribers)t(e)}}class Q{progress;subscribers=new Set;update=e=>{for(let t of(this.progress=e,this.subscribers))t(e)};snapshot(){return this.progress}subscribe(e){return this.subscribers.add(e),()=>{this.subscribers.delete(e)}}}class Y{toChoices;listener;resolver;constructor(e){this.toChoices=e}selectItem=async(e,t)=>{this.cancel();let r=this.toChoices(e,t);if(r.length)return new Promise(t=>{this.resolver=t,this.listener?.({choices:r,kind:e})})};subscribe(e){return this.listener=e,()=>{this.listener===e&&(this.listener=void 0)}}resolve(e){let t=this.resolver;this.resolver=void 0,this.listener?.(void 0),t?.(e)}cancel(){this.resolve(void 0)}}export{U as runInkDevShell};
|