@doubao-dev/cli 0.0.33 → 0.0.35

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.
Files changed (29) hide show
  1. package/dist/2168.js +2 -2
  2. package/dist/275.js +5 -5
  3. package/dist/4931.js +1 -1
  4. package/dist/{8079.js → 6427.js} +3 -3
  5. package/dist/{9667.js → 8981.js} +2 -2
  6. package/dist/@byted-doubao-apps/kit.js +1 -1
  7. package/dist/@byted-doubao-apps/login.js +1 -1
  8. package/dist/@byted-doubao-apps/template-empty/package.json +3 -3
  9. package/dist/@byted-doubao-apps/template-starter/package.json +3 -3
  10. package/dist/assets/web-sdk-debugger/__doubao_web_sdk_native_modules/applet-bridge-module-core.js +1 -1
  11. package/dist/assets/web-sdk-debugger/index.html +1 -1
  12. package/dist/assets/web-sdk-debugger/static/js/index.9f626ba3a2.js +44 -0
  13. package/dist/assets/web-sdk-debugger/wsd/doubao-apps-api.template.js +0 -0
  14. package/dist/assets/web-sdk-debugger/wsd/doubao-apps-framework.template.js +0 -0
  15. package/dist/check.js +1 -1
  16. package/dist/dev-shell.js +1 -1
  17. package/dist/dev.js +5 -5
  18. package/dist/init.js +1 -1
  19. package/dist/ink.js +1 -1
  20. package/dist/prompt.js +1 -1
  21. package/dist/run.js +1 -1
  22. package/dist/sdk.js +42 -42
  23. package/dist/sdk~1.js +28 -28
  24. package/package.json +2 -3
  25. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/06-/350/267/257/347/224/261.md +2 -2
  26. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/08-/344/272/244/344/272/222.md +2 -2
  27. package/dist/assets/web-sdk-debugger/static/js/index.d1bb36b355.js +0 -44
  28. /package/dist/{9091.js → 3688.js} +0 -0
  29. /package/dist/{9667.js.LICENSE.txt → 8981.js.LICENSE.txt} +0 -0
package/dist/check.js CHANGED
@@ -1 +1 @@
1
- let e;import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import"./7945.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"./9091.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(/&nbsp;/g," ").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/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};
1
+ let e;import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import"./7945.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"./3688.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(/&nbsp;/g," ").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/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/dev-shell.js CHANGED
@@ -1 +1 @@
1
- import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./6831.js";import"./7945.js";import{source as t,node_modules_figures as r}from"./9091.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 k({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 O=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=O[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(O);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:t,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)(),[O,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?"desktop ›":"›"} ${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=`desktop ${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:O}));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:|(?:desktop )?›)/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(k,{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?"desktop › ":"› "),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:O})))}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"./7945.js";import{source as t,node_modules_figures as r}from"./3688.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 k({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 O=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=O[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(O);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:t,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)(),[O,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?"desktop ›":"›"} ${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=`desktop ${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:O}));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:|(?:desktop )?›)/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(k,{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?"desktop › ":"› "),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:O})))}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};