@doubao-dev/cli 0.0.34 → 0.0.36

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 (142) hide show
  1. package/dist/1232.js +1 -0
  2. package/dist/1264.js +1 -0
  3. package/dist/1611.js +2 -0
  4. package/dist/2232.js +60 -0
  5. package/dist/2507.js +1 -0
  6. package/dist/275.js +5 -8
  7. package/dist/2932.js +1 -1
  8. package/dist/4525.js +1 -1
  9. package/dist/4880.js +1 -1
  10. package/dist/4931.js +1 -1
  11. package/dist/{3688.js → 5887.js} +3 -3
  12. package/dist/6438.js +140 -0
  13. package/dist/6976.js +280 -0
  14. package/dist/{8981.js.LICENSE.txt → 6976.js.LICENSE.txt} +108 -0
  15. package/dist/7410.js +1 -2
  16. package/dist/@byted-doubao-apps/create.js +1 -1
  17. package/dist/@byted-doubao-apps/kit.js +1 -1
  18. package/dist/@byted-doubao-apps/login.js +2 -2
  19. package/dist/@byted-doubao-apps/login~1.js +2 -2
  20. package/dist/@byted-doubao-apps/template-empty/package.json +3 -3
  21. package/dist/@byted-doubao-apps/template-starter/package.json +3 -3
  22. package/dist/@byted-hdt/cli.js +1 -1
  23. package/dist/@inquirer/select.js +1 -1
  24. package/dist/{assets/web-sdk-debugger/static/wasm/eaf690f2cd.module.wasm → @lynx-js/static/wasm/77fb77f77f.module.wasm} +0 -0
  25. package/dist/@lynx-js/{web-core-canary.js → web-core.js} +2 -2
  26. package/dist/app.js +1 -1
  27. package/dist/assets/web-sdk-debugger/__doubao_web_sdk_native_modules/applet-bridge-module-core.js +1 -1
  28. package/dist/assets/web-sdk-debugger/index.html +1 -1
  29. package/dist/assets/web-sdk-debugger/preact-devtools/index.js +4 -1
  30. package/dist/assets/web-sdk-debugger/static/css/index.ef5d8bc5ad.css +1 -0
  31. package/dist/assets/web-sdk-debugger/static/js/{682.de47e82f6b.js → 426.53c43a8594.js} +2 -2
  32. package/dist/assets/web-sdk-debugger/static/js/479.26e0b1d922.js +1829 -0
  33. package/dist/assets/web-sdk-debugger/static/js/async/503.259fed5610.js +1 -0
  34. package/dist/assets/web-sdk-debugger/static/js/async/{legacy-wasm-js.bacc8b5564.js → legacy-wasm-js.9b9367f818.js} +2 -2
  35. package/dist/assets/web-sdk-debugger/static/js/async/lynx-core-chunk.7f5e94dfae.js +5 -0
  36. package/dist/assets/web-sdk-debugger/static/js/async/web-core-main-chunk.f78260697f.js +1 -0
  37. package/dist/assets/web-sdk-debugger/static/js/async/web-core-markup-encoder.33c43c480e.js +4 -0
  38. package/dist/assets/web-sdk-debugger/static/js/async/web-core-template-loader-thread.ba290b32d7.js +4 -0
  39. package/dist/assets/web-sdk-debugger/static/js/async/web-core-worker-chunk.9a5989b104.js +1 -0
  40. package/dist/assets/web-sdk-debugger/static/js/async/web-elements.3fbd53918e.js +365 -0
  41. package/dist/assets/web-sdk-debugger/static/js/async/xmarkdown-deps.efd0ffb051.js +5 -0
  42. package/dist/assets/web-sdk-debugger/static/js/async/{xmarkdown-deps.3ea5672b2c.js.LICENSE.txt → xmarkdown-deps.efd0ffb051.js.LICENSE.txt} +1 -1
  43. package/dist/assets/web-sdk-debugger/static/js/index.b6e5c76345.js +44 -0
  44. package/dist/assets/web-sdk-debugger/static/js/lib-polyfill.c91181f230.js +1 -0
  45. package/dist/assets/web-sdk-debugger/static/wasm/{69a8ba8eb9.module.wasm → 4c402c7981.module.wasm} +0 -0
  46. package/dist/assets/web-sdk-debugger/static/wasm/{03b02f9e5a.module.wasm → 72aaf7d0aa.module.wasm} +0 -0
  47. package/dist/{@lynx-js/static/wasm/eaf690f2cd.module.wasm → assets/web-sdk-debugger/static/wasm/77fb77f77f.module.wasm} +0 -0
  48. package/dist/assets/web-sdk-debugger/wsd/doubao-apps-api.template.js +0 -0
  49. package/dist/assets/web-sdk-debugger/wsd/doubao-apps-framework.template.js +0 -0
  50. package/dist/assets/web-sdk-debugger/wsd/doubao-apps-react-dev.template.js +0 -0
  51. package/dist/assets/web-sdk-debugger/wsd/doubao-apps-react.template.js +0 -0
  52. package/dist/browser.js +1 -1
  53. package/dist/build.js +1 -1
  54. package/dist/build~1.js +10 -10
  55. package/dist/check.js +1 -1
  56. package/dist/client.js +1 -0
  57. package/dist/client~1.js +1 -0
  58. package/dist/components-loader.js +1 -1
  59. package/dist/demo-server.js +2 -2
  60. package/dist/demo.js +2 -2
  61. package/dist/dev-config.js +2 -2
  62. package/dist/dev-shell.js +1 -1
  63. package/dist/dev.js +19 -16
  64. package/dist/explore.js +10 -0
  65. package/dist/gen-explore.js +1 -1
  66. package/dist/gen-trajectory.js +1 -1
  67. package/dist/info.js +2 -2
  68. package/dist/init.js +4 -4
  69. package/dist/ink.js +1 -1
  70. package/dist/inquirer.js +1 -1
  71. package/dist/json-file.js +2 -2
  72. package/dist/legacy-status.js +1 -1
  73. package/dist/legacy-upload.js +1 -1
  74. package/dist/lepus.js +1 -1
  75. package/dist/login.js +2 -1
  76. package/dist/main.js +1 -1
  77. package/dist/{manifest-mcp-config.js → manifest-headers.js} +1 -1
  78. package/dist/ora.js +1 -1
  79. package/dist/portal.js +1 -1
  80. package/dist/project-layout.js +1 -1
  81. package/dist/project.js +1 -1
  82. package/dist/prompt.js +8 -8
  83. package/dist/prompts.js +1 -1
  84. package/dist/qrcode.js +1 -0
  85. package/dist/report.js +1 -1
  86. package/dist/run-registry.js +1 -1
  87. package/dist/run.js +321 -321
  88. package/dist/sandbox.js +1 -1
  89. package/dist/scan.js +1 -1
  90. package/dist/sdk.js +192 -59
  91. package/dist/sdk~1.js +66 -58
  92. package/dist/server.js +10 -10
  93. package/dist/skill.js +1 -1
  94. package/dist/skills.js +1 -1
  95. package/dist/skills~1.js +1 -1
  96. package/dist/status.js +1 -1
  97. package/dist/status~1.js +2 -2
  98. package/dist/stop.js +1 -1
  99. package/dist/sync.js +1 -1
  100. package/dist/trajectory.js +3 -0
  101. package/dist/update.js +1 -1
  102. package/dist/upgrade.js +1 -1
  103. package/dist/workspace.js +1 -1
  104. package/dist/yaml.js +1 -1
  105. package/package.json +7 -7
  106. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/02-/347/263/273/347/273/237.md +2 -2
  107. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/06-/350/267/257/347/224/261.md +4 -0
  108. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/07-/347/225/214/351/235/242.md +8 -0
  109. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/26-/345/237/272/347/241/200/344/277/241/346/201/257.md +2 -1
  110. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/33-/345/261/217/345/271/225.md +124 -8
  111. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/groups.md +1 -1
  112. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/quick-reference.md +2 -1
  113. package/skills/doubao-agentic-service-development/references/frontend/examples/page-widget-basics.md +1 -0
  114. package/skills/doubao-agentic-service-development/references/frontend/guides/client-tools-and-events.md +209 -0
  115. package/skills/doubao-agentic-service-development/references/frontend/guides/component-development.md +7 -1
  116. package/skills/doubao-agentic-service-development/references/frontend/guides/debugger-mcp.md +1 -1
  117. package/skills/doubao-agentic-service-development/references/frontend/widget-templates/overview.md +13 -9
  118. package/skills/doubao-agentic-service-development/references/frontend/widget-templates/props.md +26 -1
  119. package/skills/doubao-agentic-service-development/references/frontend-dev.md +2 -0
  120. package/dist/2168.js +0 -60
  121. package/dist/318.js +0 -1
  122. package/dist/3974.js +0 -151
  123. package/dist/6427.js +0 -126
  124. package/dist/7417.js +0 -204
  125. package/dist/7417.js.LICENSE.txt +0 -107
  126. package/dist/7945.js +0 -1
  127. package/dist/8981.js +0 -78
  128. package/dist/assets/web-sdk-debugger/static/css/index.7c65607402.css +0 -1
  129. package/dist/assets/web-sdk-debugger/static/js/670.8a8f0f7d57.js +0 -1829
  130. package/dist/assets/web-sdk-debugger/static/js/async/503.cf61731bba.js +0 -1
  131. package/dist/assets/web-sdk-debugger/static/js/async/lynx-core-chunk.afc1ded023.js +0 -5
  132. package/dist/assets/web-sdk-debugger/static/js/async/web-core-main-chunk.7fe9af852c.js +0 -1
  133. package/dist/assets/web-sdk-debugger/static/js/async/web-core-markup-encoder.f81d6d2cae.js +0 -4
  134. package/dist/assets/web-sdk-debugger/static/js/async/web-core-template-loader-thread.4a49f8a286.js +0 -4
  135. package/dist/assets/web-sdk-debugger/static/js/async/web-core-worker-chunk.c315fd6753.js +0 -1
  136. package/dist/assets/web-sdk-debugger/static/js/async/web-elements.43d1e29387.js +0 -365
  137. package/dist/assets/web-sdk-debugger/static/js/async/xmarkdown-deps.3ea5672b2c.js +0 -5
  138. package/dist/assets/web-sdk-debugger/static/js/index.9f626ba3a2.js +0 -44
  139. package/dist/assets/web-sdk-debugger/static/js/lib-polyfill.9daa7c863e.js +0 -1
  140. package/dist/simulator-client.js +0 -1
  141. /package/dist/{7410.js.LICENSE.txt → 1611.js.LICENSE.txt} +0 -0
  142. /package/dist/assets/web-sdk-debugger/static/js/{670.8a8f0f7d57.js.LICENSE.txt → 479.26e0b1d922.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"./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};
1
+ import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./1264.js";import"./yaml.js";import{DBX_DEMO_NAMES as t,getDBXDemo as r,startMCPDemoServer as o}from"./demo-server.js";import{resolveProjectLayout as s,resolveRuntimeSkillLayout as i}from"./project-layout.js";import{parseInteger as a,option_Option as n,command_Command as l,CliError as c,http_getApiBaseUrl as _,runCommand as m,stringField as d,isRecord as u}from"./2232.js";import{extractMCPHeadersFromManifest as p}from"./manifest-headers.js";import{reportToolResult as g,SimulatorStreamError as f,runSimulatorStream as h}from"./client~1.js";import{verifyYAML as y}from"./app.js";import{connectMCPClient as v}from"./client.js";import{source as S}from"./5887.js";var $={};e.r($),e.d($,{default:()=>z,executeCheck:()=>B,resolveYAMLType:()=>X});let w=e("node:fs");var x=e.n(w);let C=e("node:path");var b=e.n(C);let k=e("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js"),P=new Set(["USER","ASSISTANT","TOOL"]);function A(e){let t=i(e);if("resolved"!==t.layout)throw E("missing"===t.layout?"skill_layout_missing":"skill_layout_invalid",t.error??`Skill 目录中没有可用的运行时 Skill: ${e}`,"请在选定目录任意层级放置至少一个普通文件 SKILL.md;符号链接不会被加载。");return t.entries.map(e=>e.content)}function M(e,t){if(!x().existsSync(e))throw E(`${t}_file_not_found`,`未找到 ${t} 文件: ${e}`,`请检查 --${t} 路径;相对路径会按 --project-path 解析。`);if(!x().statSync(e).isFile())throw E(`${t}_path_not_file`,`${t} 路径必须是文件: ${e}`,`请检查 --${t} 路径,不能传目录。`);return x().readFileSync(e,"utf8")}function E(e,t,r){let o=Error(t);return o.details={code:e,message:t,suggestion:r},o}function I(e,t){return b().isAbsolute(e)?e:b().resolve(t,e)}function q(e){return"string"==typeof e&&e.trim()?e:void 0}function O(e){var t,r;let o=[],s=e.preflight.filter(e=>"error"===e.level);for(let i of(o.push(...s),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||"调用轨迹错误"),suggestion:T(e.error?.code,r),details:e.error})))),e.result.stream_errors??[]))o.push(function(e){var t;let r=String(e?.message||"流式响应错误"),o=String(e?.code||"stream_error");return{code:o,level:"error",message:r,suggestion:"string"==typeof e?.suggestion?e.suggestion:T(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 工具 ${t.tool_name} 返回错误结果`,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:"工具调用已完成,但未输出 card_delta",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),s=e.evalCase.expect?.tool_calls??[];s.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}(s,r)&&o.push({code:"expectation_tool_chain_mismatch",level:"error",message:`期望工具调用链为 ${s.join(" -> ")},实际为 ${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?`期望至少 ${t} 张 widget_id 为 ${i.widget_id} 的卡片,实际为 ${r.length} 张`:`期望至少 ${t} 张卡片,实际为 ${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:`期望不输出卡片,实际输出 ${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} 已绑定卡片,但未在 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=d(function(e,t){if(!u(e))return;let r=e[t];return u(r)?r:void 0}(t.details,"details"),"raw_error")||d(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),a=0===i.filter(e=>"error"===e.level).length;return{ok:a,verdict:a?"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 T(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}function j(e,t){return{code:e,level:"info",message:t}}function D(e,t,r){return{code:e,level:"warn",message:t,suggestion:r}}function K(e,t,r){return{code:e,level:"error",message:t,suggestion:r}}async function L(e,t,r){try{let o=await e.callbacks.onToolCall(r,t.requestID),{report:s}=await g({gatewayOrigin:e.gatewayOrigin,requestID:t.requestID,traceID:t.traceID,toolCall:r,result:o,status:"SUCCESS"});t.toolCalls.push({toolCall:r,result:o,report:s}),e.callbacks.onToolReported?.(r,s)}catch(e){t.toolCalls.push({toolCall:r}),t.streamErrors.push({code:"tool_call_or_report_failed",message:e?.message||String(e),tool_name:r.tool_name,tool_call_id:r.tool_call_id,log_id:d(e,"logId")||d(e,"log_id")})}}async function U(e){let o;try{let a,n=function(e){let o=b().resolve(e.projectPath),i=s(o),a={...e.demo?function(e){try{return r(e).evalCase}catch{throw Error(`未知 dbx check 示例:${e}。支持的示例: ${t.join(", ")}`)}}(e.demo):{},...e.query?{query:e.query}:{},...void 0!==e.maxStep?{max_step:e.maxStep}:{}};if(e.historyPath&&(a.history_messages=function(e){if(!x().existsSync(e))throw E("history_file_not_found",`未找到历史消息文件: ${e}`,"请检查 --history 路径;历史文件应为消息数组。");let t=function(e,t,r){try{return t.endsWith(".json")?JSON.parse(e):k.qg(e)}catch(e){throw E(`${r}_file_parse_failed`,`${r} 文件解析失败: ${e?.message||String(e)}`,`请检查 ${t} 的语法和缩进。`)}}(x().readFileSync(e,"utf8"),e,"history");if(!Array.isArray(t))throw E("history_file_invalid","历史消息文件必须是数组","请把 history 文件写成数组,例如 [{ role: USER, content: hello }]。");return t}(I(e.historyPath,o))),e.skillsDirectory?a.skills=A(I(e.skillsDirectory,o)):a.skills||(a.skills=A(i.skillDirectory)),e.manifestPath)a.manifest=M(I(e.manifestPath,o),"manifest");else{var n;if(a.manifest&&((n=a.manifest).includes("/")||n.endsWith(".json")||n.endsWith(".yaml")||n.endsWith(".yml")))a.manifest=M(I(a.manifest,o),"manifest");else if(!a.manifest){let e=i.manifestPath;x().existsSync(e)&&(a.manifest=M(e,"manifest"))}}if(e.mcpUrl&&(a.manifest=function(e,t){if("string"!=typeof e)return;if(!e.trim())return e;let r=k.Tp(e);return r.setIn(["mcp_server","end_point"],t),r.setIn(["mcp_server","mcp_config","protocol"],"Streamable"),r.toString()}(a.manifest,e.mcpUrl)),function(e){if(!e.query||"string"!=typeof e.query||!e.query.trim())throw E("query_required","dbx check 需要 query","请通过 --query 传入本轮用户问题。");if(!Array.isArray(e.skills)||0===e.skills.length||e.skills.some(e=>"string"!=typeof e))throw E("skill_required","dbx check 至少需要一个 Skill","请在项目 skill/ 中放置至少一个 SKILL.md,或通过 --skill 传入 Skill 目录。");if(!e.manifest||"string"!=typeof e.manifest)throw E("manifest_required","dbx check 需要 manifest YAML 文本或文件路径","请在项目 manifest.yaml 放置 Manifest,或通过 --manifest 传入路径。")}(a),a.history_messages=(a.history_messages??[]).map((e,t)=>{if(!e||"object"!=typeof e)throw E("history_message_invalid",`history_messages[${t}] 必须是对象`,"请把每条历史消息写成 { role: USER|ASSISTANT|TOOL, content: string }。");let r=String(e.role||"").toUpperCase();if(!P.has(r))throw E("history_message_role_invalid",`history_messages[${t}].role 必须为 USER、ASSISTANT 或 TOOL`,"请把 role 改成 USER、ASSISTANT 或 TOOL。");if("string"!=typeof e.content||!e.content.trim())throw E("history_message_content_invalid",`history_messages[${t}].content 必须是非空字符串`,"请为该历史消息补充非空 content。");return{role:r,content:e.content}}),a.max_step=a.max_step??15,!Number.isInteger(a.max_step)||a.max_step<=0)throw E("max_step_invalid","max_step 必须是正整数","请删除 max_step 使用默认值 15,或通过 --max-step 传入正整数。");return a}(e),l=await y(n.manifest,"compatible");if(!l.data?.success||!l.data.manifest)throw new Y("manifest 校验失败",{code:"manifest_validation_failed",message:"manifest 校验失败",errors:l.data?.errors??[],warnings:l.data?.warnings??[],log_id:l.log_id});let c=function(e,t){if(!u(t))throw E("manifest_parse_result_missing","dbx check 需要 YAML 校验接口返回解析后的 manifest","请先确认后端 /yaml/verify 返回 data.manifest。");let r=u(t.mcp_server)?t.mcp_server:void 0,o=q(t.app_key),s=q(r?.end_point);if(!o)throw E("app_id_required","dbx check 需要 manifest AppID","请在 manifest.yaml 配置 app_key(该字段对外称 AppID)。");if(!s)throw E("mcp_url_required","dbx check 需要 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 E(t,`${r} 必须是 http(s) URL: ${e}`,`请把 ${r} 配置为 http:// 或 https:// 开头的 MCP endpoint。`)}(s,"mcp_url_invalid","manifest.mcp_server.end_point"),{...e,app_key:o,app_name:q(t.name),mcp:{url:s,description:q(r?.description),headers:p(t)}}}(n,l.data.manifest),m=function(e){if(!u(e)){var t;let e;throw t="manifest 必须是已解析的对象",(e=Error(t)).details={code:"manifest_yaml_invalid",message:t,suggestion:"请先运行 `dbx check --file <manifest.yaml>`,确认后端能解析 manifest。"},e}let r=u(e.tools)?e.tools:{},o=u(e.entities)?e.entities:{},s={};for(let e of Object.values(o))if(u(e)&&u(e.tool_card_binding))for(let[t,r]of Object.entries(e.tool_card_binding))"string"==typeof r&&(s[t]=r);return{raw:e,appKey:"string"==typeof e.app_key?e.app_key:void 0,tools:r,entities:o,cardBindings:s}}(l.data.manifest),g={...(o=await v(c.mcp.url,c.app_key,c.mcp.headers).catch(e=>{var t,r,o;let s,i,a,n,l,_=(t=e,r=c.mcp.url,(l=(o=n=String(t?.message||t),i=(s=o.match(/<pre>([\s\S]*?)<\/pre>/i)?.[1])?s.replace(/<br\s*\/?>/gi,"\n").replace(/&nbsp;/g," ").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&"):o,(a=i.match(/(?:TypeError|ReferenceError|SyntaxError|Error):[^\n<]+/)?.[0])?a.trim():/HTTP 5\d\d/.test(o)?"MCP 服务器返回 HTTP 5xx":void 0))?{code:"mcp_server_internal_error",message:`MCP 服务器处理 initialize/tools/list 时发生内部错误: ${l}`,suggestion:"CLI 已连上 MCP server,但 MCP server 在 initialize 或 tools/list 内部报错。请查看 MCP server 终端日志和报错堆栈,优先修 server 代码。",details:{url:r,raw_error:n,server_error:l}}:{code:"mcp_unreachable",message:n,suggestion:"请先启动标准 MCP server,并确认 manifest.mcp_server.end_point 指向 CLI 当前运行环境可访问的 Streamable HTTP /mcp 或 SSE /sse 地址;不要求公网 URL。",details:{url:r,raw_error:n}});throw new Y(`MCP server unreachable: ${c.mcp.url}`,_)})).tools,server_id:c.mcp.server_id||o.tools.server_id,name:c.mcp.name||o.tools.name,description:c.mcp.description||o.tools.description},S=[...function(e){let t=[],{evalCase:r,manifest:o,mcp:s}=e,i=new Set(s.tools.map(e=>e.name).filter(Boolean)),a=Object.keys(o.tools),n=new Set(a);if(o.appKey===r.app_key?t.push(j("manifest_app_id_match",`manifest AppID 与请求 AppID 一致(${r.app_key})`)):t.push(K("manifest_app_id_mismatch",`manifest AppID(${o.appKey||"-"})与请求 AppID(${r.app_key})不一致`,"请保持请求 AppID 与 manifest.app_key 一致;如果走特殊测试链路会改写 AppID,需要确认后端映射规则。")),s.tools.length>0){let e="sse"===s.protocol?"SSE /sse":"Streamable HTTP /mcp";t.push(j("mcp_tools_loaded",`MCP 通过 ${e} 提供了 ${s.tools.length} 个工具`))}else t.push(K("mcp_tools_empty","MCP 未提供任何工具","请检查标准 MCP tools/list 是否返回 tools。Streamable HTTP 传 /mcp,SSE 传 /sse。"));for(let e of a)i.has(e)||t.push(K("manifest_tool_missing_in_mcp",`manifest.tools 声明了 ${e},但 MCP 未提供此工具`,"请确保会出卡的 tool 同时存在于 MCP tools 与 manifest.tools。"));for(let e of r.expect?.tool_calls??[])n.has(e)||t.push(K("expected_tool_missing_in_manifest",`expect.tool_calls 声明了 ${e},但 manifest.tools 未声明此工具`,`请在 manifest.tools.${e} 中声明该工具;非出卡工具也需要配置 output.kind,例如 execution_result。`)),i.has(e)||t.push(K("expected_tool_missing_in_mcp",`expect.tool_calls 声明了 ${e},但 MCP 未提供此工具`,"请确认 MCP tools/list 返回了期望调用的工具,或修正内置 demo 的 expect.tool_calls。"));let l=Object.keys(o.cardBindings);if(l.length>0)t.push(j("card_binding_found",`已找到卡片绑定: ${l.map(e=>`${e} -> ${o.cardBindings[e]}`).join(", ")}`));else{var c,_;let e=(c=r,_=o,c.expect?.card||Object.values(_.tools).some(e=>u(e)&&u(e.output)&&"entities"===e.output.kind))?K:D;t.push(e("card_binding_missing","manifest.entities 中没有 tool_card_binding","如果期望出卡,请在对应 entity 下配置 tool_card_binding,例如 Taxi_order: tpl.taxi_order。"))}for(let[e,r]of Object.entries(o.entities))u(r)&&u(r.schema)&&0===Object.entries(r.schema).filter(([,e])=>u(e)&&!0===e.is_entity_id).length&&t.push(K("entity_id_missing",`manifest.entities.${e}.schema 中没有标记 is_entity_id 的字段`,"请为实体配置一个稳定主键字段,例如 product_id: { type: string, is_entity_id: true }。"));return t}({evalCase:c,manifest:m,mcp:g}),...function(e){let t=[];for(let r of e.tools){let e=F(r.input_schema_json);if(e)for(let o of function e(t,r){let o=[];if(!u(t))return o;for(let e of["exclusiveMinimum","exclusiveMaximum"]){let s=t[e];"number"==typeof s&&o.push({path:`${r}/${e}`,value:s,message:`${e} 为数值 ${s},但模拟器后端要求布尔值`,suggestion:"如果使用 zod,避免 z.number().positive()/min()/max() 生成数值型 exclusiveMinimum/exclusiveMaximum;可改为 z.coerce.number() 并在工具内部校验业务范围。"})}for(let[s,i]of Object.entries(t))u(i)&&o.push(...e(i,`${r}/${s}`)),Array.isArray(i)&&i.forEach((t,i)=>{o.push(...e(t,`${r}/${s}/${i}`))});return o}(e,`tools/${r.name}/inputSchema`))t.push({code:"mcp_tool_schema_incompatible",level:"error",message:`MCP 工具 ${r.name} 的 inputSchema 不兼容: ${o.message}`,suggestion:o.suggestion,details:{tool_name:r.name,path:o.path,value:o.value}})}return t}(g)],$=e.gatewayOrigin||_();if(!e.force&&S.some(e=>"error"===e.level))return O({evalCase:c,manifest:m,preflight:S,gatewayOrigin:$,cardExpectation:e.cardExpectation,result:N()});try{var i;a=await (i={evalCase:c,manifestYAML:c.manifest,mcp:g,gatewayOrigin:$,callbacks:{onToolCall:async(e,t)=>{var r,s;return o.callTool((r=c,s=e,{request_id:t,app_key:s.app_key||r.app_key,server_id:s.server_id||r.mcp?.server_id||"",tool_call_id:s.tool_call_id,tool_name:s.tool_name,arguments:F(s.arguments_json)||{},arguments_json:s.arguments_json||"{}"}))}}},h(i,L))}catch(t){if(t instanceof f)return O({evalCase:c,manifest:m,preflight:S,gatewayOrigin:$,cardExpectation:e.cardExpectation,result:R(t.state,[H(t)])});return O({evalCase:c,manifest:m,preflight:S,gatewayOrigin:$,result:{...N(),log_id:d(t,"logId")||d(t,"log_id"),stream_errors:[H(t)]},cardExpectation:e.cardExpectation})}return O({evalCase:c,manifest:m,preflight:S,gatewayOrigin:$,cardExpectation:e.cardExpectation,result:R(a)})}finally{o?.close()}}function N(){return{request_id:"",tool_calls:[],cards:[],answer:"",trace_events:[],stream_errors:[]}}function R(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:F(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 H(e){var t;let r=e instanceof Error?e.message:String(e);return{code:d(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")||t.includes("超时")?"无法连接 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")||t.includes("工具结果上报失败")?"工具结果上报失败。请检查 MCP 返回的 structuredContent/entities 是否符合 manifest 声明。":void 0,details:u(e)?{...e,message:r}:r}}function F(e){if("string"==typeof e)try{return JSON.parse(e)}catch{return}}class Y extends Error{details;constructor(e,t){super(e),this.details=t}}let J={runSimulator:U,startDemoServer:o,validateFile:V};function z(){return new l("check").description("校验配置文件或检查 Agentic Service Simulator 链路").option("--file <file>","校验 manifest.yaml 或 business-templates.yaml").option("--project-path <path>","dbx 项目路径;相对路径参数会基于该目录解析",".").addOption(new n("--demo <name>","运行内置示例").choices([...t])).option("--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>","模拟器网关地址;默认使用 CLI 构建配置中的 apiBaseUrl").addOption(new n("--max-step <count>","Agent 最大循环步数").argParser(a)).addOption(new n("--expect-card <expectation>","当前评测是否期望出卡;required 要求至少一张卡,none 要求不出卡,auto 使用默认诊断").choices(["auto","required","none"]).default("auto")).option("--force","即使预检查发现配置错误也继续请求模拟器",!1).option("--verbose","输出更多执行轨迹和工具结果摘要",!1).action(async(e,t)=>m(t,t=>B({...e,verbose:t.verbose},t)))}async function B(e,t,r=J){let o;if(e.file){var s;return((s=e).demo||s.query||s.history||s.skill||s.manifest||s.gatewayOrigin||void 0!==s.maxStep||s.force||"auto"!==s.expectCard)&&t.error("--file 不能与模拟器检查选项同时使用"),r.validateFile(t,(0,C.resolve)(e.projectPath,e.file))}e.demo||e.query||t.error('check 需要指定 --file、--demo 或 --query。示例: 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 W(t,e,r.runSimulator,o?.streamableUrl)}finally{if(o)try{await o.close()}catch(e){t.warn(`停止示例 MCP 服务失败:${String(e)}`)}}}async function W(e,t,r,o){let s;try{e.targetAppId=(s=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(n){var i,a;let t,r,o;if(e.json)throw n;let s=(t=u(i=n)?i.details:void 0,{code:d(r=u(t)?t:void 0,"code"),message:d(r,"message")||(i instanceof Error&&i.message?i.message:String(i)),suggestion:d(r,"suggestion"),logId:d(r,"log_id")||d(r,"logId")||d(i,"log_id")||d(i,"logId"),details:t});throw new c((o=["Agentic Service 检查失败,未能运行诊断","","错误",...(a=s).code?[`- 错误码:${a.code}`]:[],`- 错误信息:${a.message}`,...a.logId?[`- log_id: ${a.logId}`]:[],...a.suggestion?[`- 修复建议:${a.suggestion}`]:[]],void 0!==a.details&&o.push("","详细信息",G(a.details)),o.join("\n")),{details:s.details,logId:s.logId})}if(e.json||function(e,t,r){let o=t.ok?S.green("通过"):S.red("未通过");if(e.log(`${S.bold("Agentic Service 检查")} ${o}`),e.log(""),e.log(S.bold("输入")),e.log(`- app_id: ${t.case.app_key}`),e.log(`- 用户输入:${t.context.query}`),e.log(`- 历史消息数:${t.context.history_count}`),e.log(`- MCP 地址:${t.context.mcp_url||"-"}`),e.log(`- 网关地址:${t.context.gateway_origin||"-"}`),e.log(`- 最大步数:${t.context.max_step??"-"}`),e.log(`- 请求 ID:${t.request_id||"-"}`),e.log(`- log_id: ${t.log_id||"-"}`),e.log(""),Q(e,"预检查",t.preflight,r),e.log(""),e.log(S.bold("Agent Flow")),0===t.tool_calls.length?e.log("- 未调用工具"):t.tool_calls.forEach((t,o)=>{e.log(`${o+1}. ${S.cyan(t.tool_name)} ${0===t.report_code?S.green("已上报"):S.yellow(`上报状态码=${t.report_code??"-"}`)}`),e.log(` 工具调用 ID:${t.tool_call_id}`),t.app_key&&e.log(` app_id: ${t.app_key}`),e.log(` 参数:${JSON.stringify(t.arguments??{})}`),r&&t.result_preview&&e.log(` 结果:${t.result_preview}`)}),e.log(""),e.log(S.bold("卡片")),0===t.cards.length?e.log("- 未输出卡片"):t.cards.forEach((t,r)=>{e.log(`${r+1}. 组件 ID=${t.widget_id||"-"} 实体 ID=${t.entity_id||"-"} 模板=${t.template||"-"}`)}),e.log(""),t.answer&&(e.log(S.bold("回复")),e.log(t.answer),e.log("")),r&&t.trace_events.length>0){for(let r of(e.log(S.bold("执行轨迹")),t.trace_events))e.log(`- ${r.name||"-"} ${r.status||"-"} ${r.tool_name||""} ${r.summary||""}`);e.log("")}Q(e,"诊断结果",t.errors,r),e.log(""),e.log(`${S.bold("结论")}: ${o}`)}(e,s,t.verbose),!s.ok)throw new c("检查失败",{json:s,logId:s.log_id});return s}function G(e){return"string"==typeof e?e:JSON.stringify(e,null,2)}function Q(e,t,r,o){if(e.log(S.bold(t)),0===r.length)return void e.log("- 无");for(let t of r){let r="error"===t.level?S.red("✗"):"warn"===t.level?S.yellow("!"):S.green("✓");e.log(`${r} ${t.code}: ${t.message}`),t.suggestion&&e.log(` 修复建议:${t.suggestion}`),o&&void 0!==t.details&&e.log(` 详细信息:${G(t.details)}`)}}async function V(e,t){(0,w.existsSync)(t)&&(0,w.statSync)(t).isFile()||e.error(`未找到 YAML 文件:${t}`);let r=(0,w.readFileSync)(t,"utf8"),o=X(t,e),s=await y(r,"compatible",o),i=s.data,a={valid:!!i?.success,manifest:i?.manifest,errors:Z(i?.errors??[]),warnings:Z(i?.warnings??[]),log_id:s.log_id??""};if("manifest"===o&&u(a.manifest)&&"string"==typeof a.manifest.app_key&&(e.targetAppId=a.manifest.app_key.trim()||void 0),e.log(`${o} 校验:${a.valid?"通过":"失败"}`),e.log(JSON.stringify(a,null,2)),!a.valid)throw new c(`${o} 校验失败`,{json:a,logId:a.log_id});return a}function X(e,t){switch((0,C.basename)(e).toLowerCase()){case"manifest.yaml":return"manifest";case"business-templates.yaml":return"business_templates";default:t.error(`无法根据文件名“${(0,C.basename)(e)}”确定 YAML 类型,请使用 manifest.yaml 或 business-templates.yaml。`)}}function Z(e){return e.map(e=>({code:e.code,path:e.path,message:e.message}))}export{$ as check_namespaceObject};
package/dist/client.js ADDED
@@ -0,0 +1 @@
1
+ import"node:module";let e=["application/json","text/event-stream"];function t(e){var t;let r=a(e.tool_name);if(!r)throw Error("MCP 工具名称为空");return{jsonrpc:"2.0",id:Date.now(),method:"tools/call",params:{name:r,arguments:((t=e.arguments)&&"object"==typeof t&&!Array.isArray(t)?t:void 0)??function(e){if(e)try{return JSON.parse(e)}catch{return}}(a(e.arguments_json))??{}}}}function r(e){let t=new URL(e);return`${t.hostname}_${t.port||t.protocol.replace(":","")}${t.pathname.replace(/[^A-Za-z0-9_-]/g,"_")}`}function n(e){return e&&"object"==typeof e&&"id"in e?e.id??null:null}function o(e){if(e&&"object"==typeof e&&"method"in e)return e.method}function i(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 a(e){return"string"==typeof e?e:""}async function s(e,t,r){let n=t.getReader(),o=new TextDecoder,i="",a="message",s=[],c=()=>{if(0===s.length){a="message";return}(function(e,t,r,n){let o;if("endpoint"===t)return n(r.trim());if(!r.trim())return;try{o=JSON.parse(r)}catch{return}let i=o.id;if(null==i)return;let a=e.pending.get(i);a&&(clearTimeout(a.timeout),e.pending.delete(i),a.resolve(o))})(e,a,s.join("\n"),r),a="message",s=[]};for(;;){let{done:e,value:t}=await n.read();if(e)break;let r=(i+=o.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?c():e.startsWith("event:")?a=e.slice(6).trim():e.startsWith("data:")&&s.push(e.slice(5).trimStart()),r=i.search(/\r?\n/)}}i&&s.push(i),c()}function c(e,t){if(null===t)return;let r=e.pending.get(t);r&&(clearTimeout(r.timeout),e.pending.delete(t))}function l(e){let t=e instanceof Error&&e.name?e.name:"MCPRequestError",r=e instanceof Error?e.message:String(e),n=r.match(/\bHTTP\s+(\d{3})\b/i)?.[1],o=r.match(/错误码\s+(-?\d+)/)?.[1];return n?`${t},HTTP ${n}`:o?`${t},错误码 ${o}`:t}function u(e,t,r){if(t?.toLowerCase().includes("text/event-stream")){let t=function(e){let t=[],r=[],n=()=>{if(0===r.length)return;let e=r.join("\n").trim();e&&"[DONE]"!==e&&t.push(JSON.parse(e)),r=[]};for(let t of e.split(/\r?\n/)){if(""===t){n();continue}t.startsWith("data:")&&r.push(t.slice(5).trimStart())}return n(),t}(e),n=t.find(e=>{var t,n;return t=e,null!==(n=r)&&p(t)&&t.id===n})??t.find(p);if(!n)throw Error("MCP SSE 响应中没有 JSON-RPC 响应");return n}return JSON.parse(e)}function p(e){return!!(e&&"object"==typeof e&&"id"in e&&("result"in e||"error"in e))}let d="2025-11-25";async function m(e,t,r,n=T){let o=await f(e,t,r,n);try{return{tools:o.tools}}finally{o.close()}}async function f(e,t,r,n=T){return new URL(e).pathname.replace(/\/+$/,"").toLowerCase().endsWith("/sse")?y(e,t,r,n):h(e,t,r,n)}async function h(e,t,n,o=T){let i,a=(("/"===(i=new URL(e)).pathname||""===i.pathname)&&(i.pathname="/mcp"),i.toString());try{let e=await C(a,{jsonrpc:"2.0",id:1,method:"initialize",params:{protocolVersion:d,capabilities:{},clientInfo:{name:"dbx-simulator-eval",version:"0.1.0"}}},{headers:n,request:o}),i=e.body.result?.protocolVersion??d,s=e.headers.get("mcp-session-id")??void 0;await C(a,{jsonrpc:"2.0",method:"notifications/initialized",params:{}},{sessionID:s,protocolVersion:i,allowEmpty:!0,headers:n,request:o});let c=await C(a,{jsonrpc:"2.0",id:2,method:"tools/list",params:{}},{sessionID:s,protocolVersion:i,headers:n,request:o});return w({kind:"streamable",request:o,url:a,sessionID:s,protocolVersion:i,headers:n},{tools:{server_id:r(a),name:r(a),description:"Standard MCP Streamable HTTP server",app_key:t,protocol:"streamable_http",tools:(c.body.result?.tools??[]).map(e=>({name:e.name,description:e.description??"",input_schema_json:JSON.stringify(e.inputSchema??e.input_schema??{}),output_schema_json:JSON.stringify(e.outputSchema??e.output_schema??{})}))}})}catch(e){throw Error(`MCP Streamable HTTP 初始化失败(${l(e)})`)}}async function y(e,t,n,o=T){let i=new URL(e).toString(),a={kind:"sse",request:o,url:i,pending:new Map,headers:n};try{await g(a,{jsonrpc:"2.0",id:1,method:"initialize",params:{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"dbx-simulator-eval",version:"0.1.0"}}},!1),await g(a,{jsonrpc:"2.0",method:"notifications/initialized",params:{}},!0);let e=await g(a,{jsonrpc:"2.0",id:2,method:"tools/list",params:{}},!1);return w(a,{tools:{server_id:r(i),name:r(i),description:"Standard MCP SSE server",app_key:t,protocol:"sse",tools:(e.result?.tools??[]).map(e=>({name:e.name,description:e.description??"",input_schema_json:JSON.stringify(e.inputSchema??e.input_schema??{}),output_schema_json:JSON.stringify(e.outputSchema??e.output_schema??{})}))}})}catch(e){throw b(a),Error(`MCP SSE 初始化失败(${l(e)})`)}}function w(e,t){let r=!1;return{...t,async callTool(t){if(r)throw Error("MCP 客户端已关闭");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 n=JSON.stringify(r);return{content:n,structured:r.structuredContent,raw_result_text:n,raw_mcp_result_json:n,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 _(e,t):await S(e,t))},close(){r||(r=!0,"sse"===e.kind&&b(e))}}}async function S(e,r){return(await C(e.url,t(r),{sessionID:e.sessionID,protocolVersion:e.protocolVersion,headers:e.headers,request:e.request})).body.result}async function _(e,r){return(await g(e,t(r),!1)).result}async function g(e,t,r){let a;if(await E(e),!e.endpointURL)throw Error("MCP SSE 未返回 endpoint 事件");let s=n(t),l=o(t)||"unknown",u=i(t),p=u?`${l}:${u}`:l,d=null!==s,m=d?new Promise((t,r)=>{let n=setTimeout(()=>{e.pending.delete(s),r(Error(`MCP SSE 请求超时:${p}`))},1e4);e.pending.set(s,{resolve:t,reject:r,timeout:n})}):void 0;m?.catch(()=>void 0);try{var f;let r;({response:a}=await e.request(e.endpointURL,{method:"POST",headers:(f=e.headers,(r=new Headers(f)).set("Content-Type","application/json"),r),body:JSON.stringify(t)},1e4,`MCP SSE POST ${p}`))}catch(t){throw d&&c(e,s),t}if(!a.ok)throw d&&c(e,s),Error(`MCP SSE 请求失败(HTTP ${a.status})`);if(!d)return{};let h=await m;if(!h&&!r)throw Error("MCP SSE 返回了空响应");if(h?.error)throw Error(`MCP SSE 请求失败(错误码 ${h.error.code})`);return h}async function E(e){if(e.ready)return e.ready;let t=new AbortController;return e.abortController=t,e.ready=new Promise((r,n)=>{let o=!1,i=setTimeout(()=>{t.abort(),a(Error("等待 MCP SSE endpoint 事件超时"))},1e4),a=e=>{o||(o=!0,clearTimeout(i),n(e))};P(e,t,t=>{e.endpointURL=new URL(t,e.url).toString(),o||(o=!0,clearTimeout(i),r())},a)}).catch(t=>{throw b(e,t),t}),e.ready}async function P(e,t,r,n){try{var o;let i,a=await fetch(e.url,{method:"GET",headers:(o=e.headers,(i=new Headers(o)).set("Accept","text/event-stream"),i),signal:t.signal});if(!a.ok||!a.body){await a.body?.cancel(),n(Error(`MCP SSE 连接失败(HTTP ${a.status})`));return}if(!String(a.headers.get("content-type")??"").toLowerCase().includes("text/event-stream"))return void n(Error(`MCP SSE GET content-type=${a.headers.get("content-type")??"-"}`));await s(e,a.body,r),t.signal.aborted||b(e,Error("MCP SSE stream closed"))}catch(r){if(!t.signal.aborted){let t=r instanceof Error?r:Error(String(r));n(t),b(e,t)}}}function b(e,t=Error("MCP SSE session closed")){for(let[r,n]of(e.abortController?.abort(),e.abortController=void 0,e.endpointURL=void 0,e.ready=void 0,e.pending.entries()))clearTimeout(n.timeout),n.reject(t),e.pending.delete(r)}async function C(t,r,a){let s,c,l,p=o(r)||"unknown",d=i(r),m=d?`${p}:${d}`:p,{response:f,text:h}=await a.request(t,{method:"POST",headers:((s=new Headers(a.headers)).set("Content-Type","application/json"),s.set("Accept",e.join(", ")),(c=o(r))&&s.set("Mcp-Method",c),(l=i(r))&&s.set("Mcp-Name",l),a.protocolVersion&&s.set("MCP-Protocol-Version",a.protocolVersion),a.sessionID&&s.set("Mcp-Session-Id",a.sessionID),s),body:JSON.stringify(r)},1e4,`MCP Streamable HTTP ${m}`);if(!f.ok)throw Error(`MCP Streamable HTTP 请求失败(HTTP ${f.status})`);if(!h&&a.allowEmpty)return{body:{},headers:f.headers};if(!h)throw Error("MCP Streamable HTTP 返回了空响应");let y=u(h,f.headers.get("content-type"),n(r));if(y.error)throw Error(`MCP Streamable HTTP 请求失败(错误码 ${y.error.code})`);return{body:y,headers:f.headers}}async function T(e,t,r,n){let o=new AbortController,i=setTimeout(()=>o.abort(),r);try{let r=await fetch(e,{...t,signal:o.signal});if(!r.ok)return await r.body?.cancel(),{response:r,text:""};return{response:r,text:await r.text()}}catch(e){if(e instanceof Error&&"AbortError"===e.name)throw new DOMException(`${n} 请求超时(${r} 毫秒)`,"TimeoutError");throw e}finally{clearTimeout(i)}}export{f as connectMCPClient,m as fetchMCPDescriptor,l as mcpErrorSummary,u as parseMCPHTTPBody,T as requestMCP};
@@ -0,0 +1 @@
1
+ import"node:module";import{configuredFetch as t,http_getApiBaseUrl as e}from"./2232.js";function r(t){return t.replace(/\/+$/,"")}async function a(a,o){var n,_,d;let c,p={requestID:"",answer:"",toolCalls:[],cards:[],traceEvents:[],streamErrors:[]},m=await t(`${r(a.gatewayOrigin||e())}/app_developer/simulator/chat`,{method:"POST",headers:{"content-type":"application/json",accept:"text/event-stream"},body:JSON.stringify((n=a.evalCase,_=a.manifestYAML,d=a.mcp,c=n.app_name||n.app_key,{app_id:n.app_key,scene:"dbx_simulator_eval",history_messages:n.history_messages??[],message:{role:"USER",content:n.query},client:{platform:"cli",locale:"zh-CN",timezone:new Intl.DateTimeFormat().resolvedOptions().timeZone||"Asia/Shanghai"},ext:{dbx_simulator_eval:"true",stateless_context:"client_history"},max_step:n.max_step??15,mini_apps:[{app_key:n.app_key,app_name:c,skills:n.skills,manifest:{app_key:n.app_key,app_name:c,raw_manifest_yaml:_},mcp_servers:[{server_id:n.mcp?.server_id||d.server_id,name:n.mcp?.name||d.name,description:n.mcp?.description||d.description||"",tools:d.tools}]}],web_capabilities:{supports_debug_event:!0}}))});if(p.logID=m.headers.get("x-tt-logid")||void 0,!m.ok||!m.body)throw await m.body?.cancel(),new l(`模拟器对话失败:HTTP ${m.status}`,p.logID);try{await s(m.body,async t=>{var e,r,s;let l,i,n;if(t?.ack?.request_id&&(p.requestID=t.ack.request_id),t?.request_id&&!p.requestID&&(p.requestID=t.request_id),t?.trace?.trace_id&&(p.traceID=t.trace.trace_id),t?.text_delta?.delta&&(p.answer+=String(t.text_delta.delta)),t?.trace_event&&p.traceEvents.push({name:(e=t.trace_event).name,status:e.status,summary:e.summary,tool_name:e.tool_name,error:e.error}),t?.card_delta&&p.cards.push((l=(r=t.card_delta).card||{},n=(i=function(t){if("string"==typeof t)try{return JSON.parse(t)}catch{return}}(l.props_json)||{}).extra||{},{widget_id:i.widget_id,entity_id:i.entity_id,template:n["doubao/outputTemplate"],card_id:r.card_id||l.card_id,card_type:l.card_type})),t?.stream_error&&p.streamErrors.push(t.stream_error),t?.tool_call){let e=(s=t.tool_call,{tool_call_id:String(s.tool_call_id||""),tool_name:String(s.tool_name||""),server_id:s.server_id,app_key:s.app_key,arguments_json:s.arguments_json,status:s.status});await o(a,p,e)}})}catch(e){let t=new i(e?.message||String(e),p,p.logID);throw t.cause=e,t}return p}async function o(a){let o=Date.now(),s=await t(`${r(a.gatewayOrigin||e())}/app_developer/simulator/tool/report`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({request_id:a.requestID,tool_call_id:a.toolCall.tool_call_id,server_id:a.toolCall.server_id||"",tool_name:a.toolCall.tool_name,status:a.status,app_key:a.toolCall.app_key,result:{tool_call_id:a.toolCall.tool_call_id,content:a.result.content||"",structured_json:JSON.stringify(a.result.structured||{})},raw_result_text:a.result.raw_result_text||a.result.content||"",raw_mcp_result_json:a.result.raw_mcp_result_json||"",miniapp:a.result.miniapp,timing:{started_at_ms:o,ended_at_ms:Date.now(),duration_ms:Date.now()-o,attempt:1},trace:{trace_id:a.traceID,component:"dbx_simulator_eval",stage:"tool_report",sampled:!0},ext:{reported_by:"dbx_simulator_eval"}})}),i=await s.text();if(!s.ok)throw new l(`工具结果上报失败:HTTP ${s.status}`,s.headers.get("x-tt-logid")||void 0);return{report:i?JSON.parse(i):{},logId:s.headers.get("x-tt-logid")||void 0}}async function s(t,e){let r=t.getReader(),a=new TextDecoder,o="";try{for(;;){let{done:t,value:s}=await r.read();if(t)break;let l=(o+=a.decode(s,{stream:!0})).split("\n\n");for(let t of(o=l.pop()||"",l)){let r=function(t){let e=t.split(/\r?\n/).filter(t=>t.startsWith("data:")).map(t=>t.slice(5).trimStart()).join("\n");if(e)try{return JSON.parse(e)}catch(t){throw Error(`模拟器 SSE 数据无效: ${t?.message||String(t)}`)}}(t);r&&await e(r)}}}catch(t){throw await r.cancel(t).catch(()=>void 0),t}finally{r.releaseLock()}}class l extends Error{logId;constructor(t,e){super(t),this.logId=e}}class i extends Error{state;logId;cause;constructor(t,e,r){super(t),this.state=e,this.logId=r}}export{l as SimulatorHTTPError,i as SimulatorStreamError,o as reportToolResult,a as runSimulatorStream};
@@ -1,2 +1,2 @@
1
- import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import{walk_simple as e}from"./7526.js";import"./3551.js";var i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r=new Uint8Array(64),n=new Uint8Array(128);for(let t=0;t<i.length;t++){let e=i.charCodeAt(t);r[t]=e,n[e]=t}function o(t,e,i){let n=e-i;n=n<0?-n<<1|1:n<<1;do{let e=31&n;(n>>>=5)>0&&(e|=32),t.write(r[e])}while(n>0);return e}var s="u">typeof TextDecoder?new TextDecoder:"u">typeof Buffer?{decode:t=>Buffer.from(t.buffer,t.byteOffset,t.byteLength).toString()}:{decode(t){let e="";for(let i=0;i<t.length;i++)e+=String.fromCharCode(t[i]);return e}},h=class{constructor(){this.pos=0,this.out="",this.buffer=new Uint8Array(16384)}write(t){let{buffer:e}=this;e[this.pos++]=t,16384===this.pos&&(this.out+=s.decode(e),this.pos=0)}flush(){let{buffer:t,out:e,pos:i}=this;return i>0?e+s.decode(t.subarray(0,i)):e}};class l{constructor(t){this.bits=t instanceof l?t.bits.slice():[]}add(t){this.bits[t>>5]|=1<<(31&t)}has(t){return!!(this.bits[t>>5]&1<<(31&t))}}class a{constructor(t,e,i){this.start=t,this.end=e,this.original=i,this.intro="",this.outro="",this.content=i,this.storeName=!1,this.edited=!1,this.previous=null,this.next=null}appendLeft(t){this.outro+=t}appendRight(t){this.intro=this.intro+t}clone(){let t=new a(this.start,this.end,this.original);return t.intro=this.intro,t.outro=this.outro,t.content=this.content,t.storeName=this.storeName,t.edited=this.edited,t}contains(t){return this.start<t&&t<this.end}eachNext(t){let e=this;for(;e;)t(e),e=e.next}eachPrevious(t){let e=this;for(;e;)t(e),e=e.previous}edit(t,e,i){return this.content=t,i||(this.intro="",this.outro=""),this.storeName=e,this.edited=!0,this}prependLeft(t){this.outro=t+this.outro}prependRight(t){this.intro=t+this.intro}reset(){this.intro="",this.outro="",this.edited&&(this.content=this.original,this.storeName=!1,this.edited=!1)}split(t){let e=t-this.start,i=this.original.slice(0,e),r=this.original.slice(e);this.original=i;let n=new a(t,this.end,r);return n.outro=this.outro,this.outro="",this.end=t,this.edited?(n.edit("",!1),this.content=""):this.content=i,n.next=this.next,n.next&&(n.next.previous=n),n.previous=this,this.next=n,n}toString(){return this.intro+this.content+this.outro}trimEnd(t){if(this.outro=this.outro.replace(t,""),this.outro.length)return!0;let e=this.content.replace(t,"");return e.length?(e!==this.content&&(this.split(this.start+e.length).edit("",void 0,!0),this.edited&&this.edit(e,this.storeName,!0)),!0):(this.edit("",void 0,!0),this.intro=this.intro.replace(t,""),!!this.intro.length||void 0)}trimStart(t){if(this.intro=this.intro.replace(t,""),this.intro.length)return!0;let e=this.content.replace(t,"");if(e.length){if(e!==this.content){let t=this.split(this.end-e.length);this.edited&&t.edit(e,this.storeName,!0),this.edit("",void 0,!0)}return!0}if(this.edit("",void 0,!0),this.outro=this.outro.replace(t,""),this.outro.length)return!0}}let u="u">typeof globalThis&&"function"==typeof globalThis.btoa?t=>globalThis.btoa(unescape(encodeURIComponent(t))):"function"==typeof Buffer?t=>Buffer.from(t,"utf-8").toString("base64"):()=>{throw Error("Unsupported environment: `window.btoa` or `Buffer` should be supported.")};class d{constructor(t){this.version=3,this.file=t.file,this.sources=t.sources,this.sourcesContent=t.sourcesContent,this.names=t.names,this.mappings=function(t){let e=new h,i=0,r=0,n=0,s=0;for(let h=0;h<t.length;h++){let l=t[h];if(h>0&&e.write(59),0===l.length)continue;let a=0;for(let t=0;t<l.length;t++){let h=l[t];t>0&&e.write(44),a=o(e,h[0],a),1!==h.length&&(i=o(e,h[1],i),r=o(e,h[2],r),n=o(e,h[3],n),4!==h.length&&(s=o(e,h[4],s)))}}return e.flush()}(t.mappings),void 0!==t.x_google_ignoreList&&(this.x_google_ignoreList=t.x_google_ignoreList),void 0!==t.debugId&&(this.debugId=t.debugId)}toString(){return JSON.stringify(this)}toUrl(){return"data:application/json;charset=utf-8;base64,"+u(this.toString())}}let g=Object.prototype.toString;function f(t){let e=t.split("\n"),i=[];for(let t=0,r=0;t<e.length;t++)i.push(r),r+=e[t].length+1;return function(t){let e=0,r=i.length;for(;e<r;){let n=e+r>>1;t<i[n]?r=n:e=n+1}let n=e-1,o=t-i[n];return{line:n,column:o}}}let p=/\w/;class c{constructor(t){this.hires=t,this.generatedCodeLine=0,this.generatedCodeColumn=0,this.raw=[],this.rawSegments=this.raw[this.generatedCodeLine]=[],this.pending=null}addEdit(t,e,i,r){if(e.length){let n=e.length-1,o=e.indexOf("\n",0),s=-1;for(;o>=0&&n>o;){let n=[this.generatedCodeColumn,t,i.line,i.column];r>=0&&n.push(r),this.rawSegments.push(n),this.generatedCodeLine+=1,this.raw[this.generatedCodeLine]=this.rawSegments=[],this.generatedCodeColumn=0,s=o,o=e.indexOf("\n",o+1)}let h=[this.generatedCodeColumn,t,i.line,i.column];r>=0&&h.push(r),this.rawSegments.push(h),this.advance(e.slice(s+1))}else this.pending&&(this.rawSegments.push(this.pending),this.advance(e));this.pending=null}addUneditedChunk(t,e,i,r,n){let o=e.start,s=!0,h=!1;for(;o<e.end;){if("\n"===i[o])r.line+=1,r.column=0,this.generatedCodeLine+=1,this.raw[this.generatedCodeLine]=this.rawSegments=[],this.generatedCodeColumn=0,s=!0,h=!1;else{if(this.hires||s||n.has(o)){let e=[this.generatedCodeColumn,t,r.line,r.column];"boundary"===this.hires?p.test(i[o])?h||(this.rawSegments.push(e),h=!0):(this.rawSegments.push(e),h=!1):this.rawSegments.push(e)}r.column+=1,this.generatedCodeColumn+=1,s=!1}o+=1}this.pending=null}advance(t){if(!t)return;let e=t.split("\n");if(e.length>1){for(let t=0;t<e.length-1;t++)this.generatedCodeLine++,this.raw[this.generatedCodeLine]=this.rawSegments=[];this.generatedCodeColumn=0}this.generatedCodeColumn+=e[e.length-1].length}}let b={insertLeft:!1,insertRight:!1,storeName:!1};class m{constructor(t,e={}){let i=new a(0,t.length,t);Object.defineProperties(this,{original:{writable:!0,value:t},outro:{writable:!0,value:""},intro:{writable:!0,value:""},firstChunk:{writable:!0,value:i},lastChunk:{writable:!0,value:i},lastSearchedChunk:{writable:!0,value:i},byStart:{writable:!0,value:{}},byEnd:{writable:!0,value:{}},filename:{writable:!0,value:e.filename},indentExclusionRanges:{writable:!0,value:e.indentExclusionRanges},sourcemapLocations:{writable:!0,value:new l},storedNames:{writable:!0,value:{}},indentStr:{writable:!0,value:void 0},ignoreList:{writable:!0,value:e.ignoreList},offset:{writable:!0,value:e.offset||0}}),this.byStart[0]=i,this.byEnd[t.length]=i}addSourcemapLocation(t){this.sourcemapLocations.add(t)}append(t){if("string"!=typeof t)throw TypeError("outro content must be a string");return this.outro+=t,this}appendLeft(t,e){if(t+=this.offset,"string"!=typeof e)throw TypeError("inserted content must be a string");this._split(t);let i=this.byEnd[t];return i?i.appendLeft(e):this.intro+=e,this}appendRight(t,e){if(t+=this.offset,"string"!=typeof e)throw TypeError("inserted content must be a string");this._split(t);let i=this.byStart[t];return i?i.appendRight(e):this.outro+=e,this}clone(){let t=new m(this.original,{filename:this.filename,offset:this.offset}),e=this.firstChunk,i=t.firstChunk=t.lastSearchedChunk=e.clone();for(;e;){t.byStart[i.start]=i,t.byEnd[i.end]=i;let r=e.next,n=r&&r.clone();n&&(i.next=n,n.previous=i,i=n),e=r}return t.lastChunk=i,this.indentExclusionRanges&&(t.indentExclusionRanges=this.indentExclusionRanges.slice()),t.sourcemapLocations=new l(this.sourcemapLocations),t.intro=this.intro,t.outro=this.outro,t}generateDecodedMap(t){t=t||{};let e=Object.keys(this.storedNames),i=new c(t.hires),r=f(this.original);return this.intro&&i.advance(this.intro),this.firstChunk.eachNext(t=>{let n=r(t.start);t.intro.length&&i.advance(t.intro),t.edited?i.addEdit(0,t.content,n,t.storeName?e.indexOf(t.original):-1):i.addUneditedChunk(0,t,this.original,n,this.sourcemapLocations),t.outro.length&&i.advance(t.outro)}),this.outro&&i.advance(this.outro),{file:t.file?t.file.split(/[/\\]/).pop():void 0,sources:[t.source?function(t,e){let i=t.split(/[/\\]/),r=e.split(/[/\\]/);for(i.pop();i[0]===r[0];)i.shift(),r.shift();if(i.length){let t=i.length;for(;t--;)i[t]=".."}return i.concat(r).join("/")}(t.file||"",t.source):t.file||""],sourcesContent:t.includeContent?[this.original]:void 0,names:e,mappings:i.raw,x_google_ignoreList:this.ignoreList?[0]:void 0}}generateMap(t){return new d(this.generateDecodedMap(t))}_ensureindentStr(){let t,e,i;void 0===this.indentStr&&(this.indentStr=(e=(t=this.original.split("\n")).filter(t=>/^\t+/.test(t)),i=t.filter(t=>/^ {2,}/.test(t)),0===e.length&&0===i.length?null:e.length>=i.length?" ":Array(i.reduce((t,e)=>Math.min(/^ +/.exec(e)[0].length,t),1/0)+1).join(" ")))}_getRawIndentString(){return this._ensureindentStr(),this.indentStr}getIndentString(){return this._ensureindentStr(),null===this.indentStr?" ":this.indentStr}indent(t,e){var i;let r=/^[^\r\n]/gm;if(i=t,"[object Object]"===g.call(i)&&(e=t,t=void 0),void 0===t&&(this._ensureindentStr(),t=this.indentStr||" "),""===t)return this;let n={};(e=e||{}).exclude&&("number"==typeof e.exclude[0]?[e.exclude]:e.exclude).forEach(t=>{for(let e=t[0];e<t[1];e+=1)n[e]=!0});let o=!1!==e.indentStart,s=e=>o?`${t}${e}`:(o=!0,e);this.intro=this.intro.replace(r,s);let h=0,l=this.firstChunk;for(;l;){let e=l.end;if(l.edited)!n[h]&&(l.content=l.content.replace(r,s),l.content.length&&(o="\n"===l.content[l.content.length-1]));else for(h=l.start;h<e;){if(!n[h]){let e=this.original[h];"\n"===e?o=!0:"\r"!==e&&o&&(o=!1,h===l.start?l.prependRight(t):(this._splitChunk(l,h),(l=l.next).prependRight(t)))}h+=1}h=l.end,l=l.next}return this.outro=this.outro.replace(r,s),this}insert(){throw Error("magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)")}insertLeft(t,e){return b.insertLeft||(console.warn("magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead"),b.insertLeft=!0),this.appendLeft(t,e)}insertRight(t,e){return b.insertRight||(console.warn("magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead"),b.insertRight=!0),this.prependRight(t,e)}move(t,e,i){if(t+=this.offset,e+=this.offset,(i+=this.offset)>=t&&i<=e)throw Error("Cannot move a selection inside itself");this._split(t),this._split(e),this._split(i);let r=this.byStart[t],n=this.byEnd[e],o=r.previous,s=n.next,h=this.byStart[i];if(!h&&n===this.lastChunk)return this;let l=h?h.previous:this.lastChunk;return o&&(o.next=s),s&&(s.previous=o),l&&(l.next=r),h&&(h.previous=n),r.previous||(this.firstChunk=n.next),n.next||(this.lastChunk=r.previous,this.lastChunk.next=null),r.previous=l,n.next=h||null,l||(this.firstChunk=r),h||(this.lastChunk=n),this}overwrite(t,e,i,r){return r=r||{},this.update(t,e,i,{...r,overwrite:!r.contentOnly})}update(t,e,i,r){if(t+=this.offset,e+=this.offset,"string"!=typeof i)throw TypeError("replacement content must be a string");if(0!==this.original.length){for(;t<0;)t+=this.original.length;for(;e<0;)e+=this.original.length}if(e>this.original.length)throw Error("end is out of bounds");if(t===e)throw Error("Cannot overwrite a zero-length range – use appendLeft or prependRight instead");this._split(t),this._split(e),!0===r&&(b.storeName||(console.warn("The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string"),b.storeName=!0),r={storeName:!0});let n=void 0!==r&&r.storeName,o=void 0!==r&&r.overwrite;if(n){let i=this.original.slice(t,e);Object.defineProperty(this.storedNames,i,{writable:!0,value:!0,enumerable:!0})}let s=this.byStart[t],h=this.byEnd[e];if(s){let t=s;for(;t!==h;){if(t.next!==this.byStart[t.end])throw Error("Cannot overwrite across a split point");(t=t.next).edit("",!1)}s.edit(i,n,!o)}else{let r=new a(t,e,"").edit(i,n);h.next=r,r.previous=h}return this}prepend(t){if("string"!=typeof t)throw TypeError("outro content must be a string");return this.intro=t+this.intro,this}prependLeft(t,e){if(t+=this.offset,"string"!=typeof e)throw TypeError("inserted content must be a string");this._split(t);let i=this.byEnd[t];return i?i.prependLeft(e):this.intro=e+this.intro,this}prependRight(t,e){if(t+=this.offset,"string"!=typeof e)throw TypeError("inserted content must be a string");this._split(t);let i=this.byStart[t];return i?i.prependRight(e):this.outro=e+this.outro,this}remove(t,e){if(t+=this.offset,e+=this.offset,0!==this.original.length){for(;t<0;)t+=this.original.length;for(;e<0;)e+=this.original.length}if(t===e)return this;if(t<0||e>this.original.length)throw Error("Character is out of bounds");if(t>e)throw Error("end must be greater than start");this._split(t),this._split(e);let i=this.byStart[t];for(;i;)i.intro="",i.outro="",i.edit(""),i=e>i.end?this.byStart[i.end]:null;return this}reset(t,e){if(t+=this.offset,e+=this.offset,0!==this.original.length){for(;t<0;)t+=this.original.length;for(;e<0;)e+=this.original.length}if(t===e)return this;if(t<0||e>this.original.length)throw Error("Character is out of bounds");if(t>e)throw Error("end must be greater than start");this._split(t),this._split(e);let i=this.byStart[t];for(;i;)i.reset(),i=e>i.end?this.byStart[i.end]:null;return this}lastChar(){if(this.outro.length)return this.outro[this.outro.length-1];let t=this.lastChunk;do{if(t.outro.length)return t.outro[t.outro.length-1];if(t.content.length)return t.content[t.content.length-1];if(t.intro.length)return t.intro[t.intro.length-1]}while(t=t.previous);return this.intro.length?this.intro[this.intro.length-1]:""}lastLine(){let t=this.outro.lastIndexOf("\n");if(-1!==t)return this.outro.substr(t+1);let e=this.outro,i=this.lastChunk;do{if(i.outro.length>0){if(-1!==(t=i.outro.lastIndexOf("\n")))return i.outro.substr(t+1)+e;e=i.outro+e}if(i.content.length>0){if(-1!==(t=i.content.lastIndexOf("\n")))return i.content.substr(t+1)+e;e=i.content+e}if(i.intro.length>0){if(-1!==(t=i.intro.lastIndexOf("\n")))return i.intro.substr(t+1)+e;e=i.intro+e}}while(i=i.previous);return -1!==(t=this.intro.lastIndexOf("\n"))?this.intro.substr(t+1)+e:this.intro+e}slice(t=0,e=this.original.length-this.offset){if(t+=this.offset,e+=this.offset,0!==this.original.length){for(;t<0;)t+=this.original.length;for(;e<0;)e+=this.original.length}let i="",r=this.firstChunk;for(;r&&(r.start>t||r.end<=t);){if(r.start<e&&r.end>=e)return i;r=r.next}if(r&&r.edited&&r.start!==t)throw Error(`Cannot use replaced character ${t} as slice start anchor.`);let n=r;for(;r;){r.intro&&(n!==r||r.start===t)&&(i+=r.intro);let o=r.start<e&&r.end>=e;if(o&&r.edited&&r.end!==e)throw Error(`Cannot use replaced character ${e} as slice end anchor.`);let s=n===r?t-r.start:0,h=o?r.content.length+e-r.end:r.content.length;if(i+=r.content.slice(s,h),r.outro&&(!o||r.end===e)&&(i+=r.outro),o)break;r=r.next}return i}snip(t,e){let i=this.clone();return i.remove(0,t),i.remove(e,i.original.length),i}_split(t){if(this.byStart[t]||this.byEnd[t])return;let e=this.lastSearchedChunk,i=e,r=t>e.end;for(;e;){if(e.contains(t))return this._splitChunk(e,t);if((e=r?this.byStart[e.end]:this.byEnd[e.start])===i)return;i=e}}_splitChunk(t,e){if(t.edited&&t.content.length){let i=f(this.original)(e);throw Error(`Cannot split a chunk that has already been edited (${i.line}:${i.column} – "${t.original}")`)}let i=t.split(e);return this.byEnd[e]=t,this.byStart[e]=i,this.byEnd[i.end]=i,t===this.lastChunk&&(this.lastChunk=i),this.lastSearchedChunk=t,!0}toString(){let t=this.intro,e=this.firstChunk;for(;e;)t+=e.toString(),e=e.next;return t+this.outro}isEmpty(){let t=this.firstChunk;do if(t.intro.length&&t.intro.trim()||t.content.length&&t.content.trim()||t.outro.length&&t.outro.trim())return!1;while(t=t.next);return!0}length(){let t=this.firstChunk,e=0;do e+=t.intro.length+t.content.length+t.outro.length;while(t=t.next);return e}trimLines(){return this.trim("[\\r\\n]")}trim(t){return this.trimStart(t).trimEnd(t)}trimEndAborted(t){let e=RegExp((t||"\\s")+"+$");if(this.outro=this.outro.replace(e,""),this.outro.length)return!0;let i=this.lastChunk;do{let t=i.end,r=i.trimEnd(e);if(i.end!==t&&(this.lastChunk===i&&(this.lastChunk=i.next),this.byEnd[i.end]=i,this.byStart[i.next.start]=i.next,this.byEnd[i.next.end]=i.next),r)return!0;i=i.previous}while(i);return!1}trimEnd(t){return this.trimEndAborted(t),this}trimStartAborted(t){let e=RegExp("^"+(t||"\\s")+"+");if(this.intro=this.intro.replace(e,""),this.intro.length)return!0;let i=this.firstChunk;do{let t=i.end,r=i.trimStart(e);if(i.end!==t&&(i===this.lastChunk&&(this.lastChunk=i.next),this.byEnd[i.end]=i,this.byStart[i.next.start]=i.next,this.byEnd[i.next.end]=i.next),r)return!0;i=i.next}while(i);return!1}trimStart(t){return this.trimStartAborted(t),this}hasChanged(){return this.original!==this.toString()}_replaceRegexp(t,e){function i(t,i){return"string"==typeof e?e.replace(/\$(\$|&|\d+)/g,(e,i)=>"$"===i?"$":"&"===i?t[0]:+i<t.length?t[+i]:`$${i}`):e(...t,t.index,i,t.groups)}if(t.global)(function(t,e){let i,r=[];for(;i=t.exec(e);)r.push(i);return r})(t,this.original).forEach(t=>{if(null!=t.index){let e=i(t,this.original);e!==t[0]&&this.overwrite(t.index,t.index+t[0].length,e)}});else{let e=this.original.match(t);if(e&&null!=e.index){let t=i(e,this.original);t!==e[0]&&this.overwrite(e.index,e.index+e[0].length,t)}}return this}_replaceString(t,e){let{original:i}=this,r=i.indexOf(t);return -1!==r&&("function"==typeof e&&(e=e(t,r,i)),t!==e&&this.overwrite(r,r+t.length,e)),this}replace(t,e){return"string"==typeof t?this._replaceString(t,e):this._replaceRegexp(t,e)}_replaceAllString(t,e){let{original:i}=this,r=t.length;for(let n=i.indexOf(t);-1!==n;n=i.indexOf(t,n+r)){let t=i.slice(n,n+r),o=e;"function"==typeof e&&(o=e(t,n,i)),t!==o&&this.overwrite(n,n+r,o)}return this}replaceAll(t,e){if("string"==typeof t)return this._replaceAllString(t,e);if(!t.global)throw TypeError("MagicString.prototype.replaceAll called with a non-global RegExp argument");return this._replaceRegexp(t,e)}}Object.prototype.hasOwnProperty;let w=t("../../../node_modules/.pnpm/@swc+core@1.15.11_@swc+helpers@0.5.23/node_modules/@swc/core/index.js"),v={audio:"DoubaoAudio",button:"DoubaoButton",camera:"DoubaoCamera",canvas:"DoubaoCanvas",map:"DoubaoMap","map-marker":"DoubaoMapMarker",markdown:"DoubaoMarkdown","navigation-bar":"DoubaoNavigationBar","long-image":"DoubaoLongImage","movable-area":"DoubaoMovableArea","movable-view":"DoubaoMovableView",popup:"DoubaoPopup",radio:"DoubaoRadio","radio-group":"DoubaoRadioGroup","rich-text":"DoubaoRichText",slider:"DoubaoSlider",switch:"DoubaoSwitch",swiper:"DoubaoSwiper","swiper-item":"DoubaoSwiperItem","picker-column":"DoubaoPickerColumn","picker-divider":"DoubaoPickerDivider","picker-view":"DoubaoPickerView","theme-provider":"DoubaoThemeProvider",video:"DoubaoVideo","web-view":"DoubaoWebView",image:"DoubaoImage",input:"DoubaoInput",list:"DoubaoList","scroll-view":"DoubaoScrollView",svg:"DoubaoSvg",text:"DoubaoText",textarea:"DoubaoTextArea",view:"DoubaoView"};function C(t){return"Identifier"===t.type&&t.value in v?t.value:null}function S(t,e,i,r,n){if("Identifier"!==e.type)return;let o=n(e.span.start-r),s=n(e.span.end-r);t.overwrite(o,s,i)}export default function(t){let i=this.async();try{let{frameworkPackage:r="@byted-doubao-apps/framework"}=this.getOptions(),n=new m(t),o=(0,w.parseSync)(t,{syntax:"typescript",tsx:!0,decorators:!0}),s=function(t){let e=0;for(;e<t.length;){let i=t[e];if(" "===i||" "===i||"\n"===i||"\r"===i||"\f"===i){e+=1;continue}if("/"===i&&"/"===t[e+1]){for(e+=2;e<t.length&&"\n"!==t[e];)e+=1;continue}if("/"===i&&"*"===t[e+1]){for(e+=2;e<t.length&&("*"!==t[e]||"/"!==t[e+1]);)e+=1;e<t.length&&(e+=2);continue}break}return Buffer.byteLength(t.slice(0,e))}(t),h=Math.max(0,o.span.start-s),l=function(t){let e=new Map([[0,0]]),i=0,r=0;for(let n of t)i+=Buffer.byteLength(n),r+=n.length,e.set(i,r);return t=>{let i=e.get(t);if(void 0===i)throw Error(`Unable to map byte offset ${t} to string index`);return i}}(t),a=new Set;if(e(o,{JSXOpeningElement(t){let e=C(t.name);if(!e)return;let i=v[e];S(n,t.name,i,h,l),a.add(i)},JSXClosingElement(t){let e=C(t.name);if(!e)return;let i=v[e];S(n,t.name,i,h,l),a.add(i)}}),a.size>0){let t=Array.from(a).map(t=>{let e=t.replace("Doubao","");return`${e} as ${t}`}).join(", "),e=`import { ${t} } from '${r}/components';
1
+ import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import{walk_simple as e}from"./7526.js";import"./3551.js";var i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r=new Uint8Array(64),n=new Uint8Array(128);for(let t=0;t<i.length;t++){let e=i.charCodeAt(t);r[t]=e,n[e]=t}function o(t,e,i){let n=e-i;n=n<0?-n<<1|1:n<<1;do{let e=31&n;(n>>>=5)>0&&(e|=32),t.write(r[e])}while(n>0);return e}var s="u">typeof TextDecoder?new TextDecoder:"u">typeof Buffer?{decode:t=>Buffer.from(t.buffer,t.byteOffset,t.byteLength).toString()}:{decode(t){let e="";for(let i=0;i<t.length;i++)e+=String.fromCharCode(t[i]);return e}},h=class{constructor(){this.pos=0,this.out="",this.buffer=new Uint8Array(16384)}write(t){let{buffer:e}=this;e[this.pos++]=t,16384===this.pos&&(this.out+=s.decode(e),this.pos=0)}flush(){let{buffer:t,out:e,pos:i}=this;return i>0?e+s.decode(t.subarray(0,i)):e}};class l{constructor(t){this.bits=t instanceof l?t.bits.slice():[]}add(t){this.bits[t>>5]|=1<<(31&t)}has(t){return!!(this.bits[t>>5]&1<<(31&t))}}class a{constructor(t,e,i){this.start=t,this.end=e,this.original=i,this.intro="",this.outro="",this.content=i,this.storeName=!1,this.edited=!1,this.previous=null,this.next=null}appendLeft(t){this.outro+=t}appendRight(t){this.intro=this.intro+t}clone(){let t=new a(this.start,this.end,this.original);return t.intro=this.intro,t.outro=this.outro,t.content=this.content,t.storeName=this.storeName,t.edited=this.edited,t}contains(t){return this.start<t&&t<this.end}eachNext(t){let e=this;for(;e;)t(e),e=e.next}eachPrevious(t){let e=this;for(;e;)t(e),e=e.previous}edit(t,e,i){return this.content=t,i||(this.intro="",this.outro=""),this.storeName=e,this.edited=!0,this}prependLeft(t){this.outro=t+this.outro}prependRight(t){this.intro=t+this.intro}reset(){this.intro="",this.outro="",this.edited&&(this.content=this.original,this.storeName=!1,this.edited=!1)}split(t){let e=t-this.start,i=this.original.slice(0,e),r=this.original.slice(e);this.original=i;let n=new a(t,this.end,r);return n.outro=this.outro,this.outro="",this.end=t,this.edited?(n.edit("",!1),this.content=""):this.content=i,n.next=this.next,n.next&&(n.next.previous=n),n.previous=this,this.next=n,n}toString(){return this.intro+this.content+this.outro}trimEnd(t){if(this.outro=this.outro.replace(t,""),this.outro.length)return!0;let e=this.content.replace(t,"");return e.length?(e!==this.content&&(this.split(this.start+e.length).edit("",void 0,!0),this.edited&&this.edit(e,this.storeName,!0)),!0):(this.edit("",void 0,!0),this.intro=this.intro.replace(t,""),!!this.intro.length||void 0)}trimStart(t){if(this.intro=this.intro.replace(t,""),this.intro.length)return!0;let e=this.content.replace(t,"");if(e.length){if(e!==this.content){let t=this.split(this.end-e.length);this.edited&&t.edit(e,this.storeName,!0),this.edit("",void 0,!0)}return!0}if(this.edit("",void 0,!0),this.outro=this.outro.replace(t,""),this.outro.length)return!0}}let u="u">typeof globalThis&&"function"==typeof globalThis.btoa?t=>globalThis.btoa(unescape(encodeURIComponent(t))):"function"==typeof Buffer?t=>Buffer.from(t,"utf-8").toString("base64"):()=>{throw Error("Unsupported environment: `window.btoa` or `Buffer` should be supported.")};class d{constructor(t){this.version=3,this.file=t.file,this.sources=t.sources,this.sourcesContent=t.sourcesContent,this.names=t.names,this.mappings=function(t){let e=new h,i=0,r=0,n=0,s=0;for(let h=0;h<t.length;h++){let l=t[h];if(h>0&&e.write(59),0===l.length)continue;let a=0;for(let t=0;t<l.length;t++){let h=l[t];t>0&&e.write(44),a=o(e,h[0],a),1!==h.length&&(i=o(e,h[1],i),r=o(e,h[2],r),n=o(e,h[3],n),4!==h.length&&(s=o(e,h[4],s)))}}return e.flush()}(t.mappings),void 0!==t.x_google_ignoreList&&(this.x_google_ignoreList=t.x_google_ignoreList),void 0!==t.debugId&&(this.debugId=t.debugId)}toString(){return JSON.stringify(this)}toUrl(){return"data:application/json;charset=utf-8;base64,"+u(this.toString())}}let g=Object.prototype.toString;function f(t){let e=t.split("\n"),i=[];for(let t=0,r=0;t<e.length;t++)i.push(r),r+=e[t].length+1;return function(t){let e=0,r=i.length;for(;e<r;){let n=e+r>>1;t<i[n]?r=n:e=n+1}let n=e-1,o=t-i[n];return{line:n,column:o}}}let p=/\w/;class c{constructor(t){this.hires=t,this.generatedCodeLine=0,this.generatedCodeColumn=0,this.raw=[],this.rawSegments=this.raw[this.generatedCodeLine]=[],this.pending=null}addEdit(t,e,i,r){if(e.length){let n=e.length-1,o=e.indexOf("\n",0),s=-1;for(;o>=0&&n>o;){let n=[this.generatedCodeColumn,t,i.line,i.column];r>=0&&n.push(r),this.rawSegments.push(n),this.generatedCodeLine+=1,this.raw[this.generatedCodeLine]=this.rawSegments=[],this.generatedCodeColumn=0,s=o,o=e.indexOf("\n",o+1)}let h=[this.generatedCodeColumn,t,i.line,i.column];r>=0&&h.push(r),this.rawSegments.push(h),this.advance(e.slice(s+1))}else this.pending&&(this.rawSegments.push(this.pending),this.advance(e));this.pending=null}addUneditedChunk(t,e,i,r,n){let o=e.start,s=!0,h=!1;for(;o<e.end;){if("\n"===i[o])r.line+=1,r.column=0,this.generatedCodeLine+=1,this.raw[this.generatedCodeLine]=this.rawSegments=[],this.generatedCodeColumn=0,s=!0,h=!1;else{if(this.hires||s||n.has(o)){let e=[this.generatedCodeColumn,t,r.line,r.column];"boundary"===this.hires?p.test(i[o])?h||(this.rawSegments.push(e),h=!0):(this.rawSegments.push(e),h=!1):this.rawSegments.push(e)}r.column+=1,this.generatedCodeColumn+=1,s=!1}o+=1}this.pending=null}advance(t){if(!t)return;let e=t.split("\n");if(e.length>1){for(let t=0;t<e.length-1;t++)this.generatedCodeLine++,this.raw[this.generatedCodeLine]=this.rawSegments=[];this.generatedCodeColumn=0}this.generatedCodeColumn+=e[e.length-1].length}}let b={insertLeft:!1,insertRight:!1,storeName:!1};class m{constructor(t,e={}){let i=new a(0,t.length,t);Object.defineProperties(this,{original:{writable:!0,value:t},outro:{writable:!0,value:""},intro:{writable:!0,value:""},firstChunk:{writable:!0,value:i},lastChunk:{writable:!0,value:i},lastSearchedChunk:{writable:!0,value:i},byStart:{writable:!0,value:{}},byEnd:{writable:!0,value:{}},filename:{writable:!0,value:e.filename},indentExclusionRanges:{writable:!0,value:e.indentExclusionRanges},sourcemapLocations:{writable:!0,value:new l},storedNames:{writable:!0,value:{}},indentStr:{writable:!0,value:void 0},ignoreList:{writable:!0,value:e.ignoreList},offset:{writable:!0,value:e.offset||0}}),this.byStart[0]=i,this.byEnd[t.length]=i}addSourcemapLocation(t){this.sourcemapLocations.add(t)}append(t){if("string"!=typeof t)throw TypeError("outro content must be a string");return this.outro+=t,this}appendLeft(t,e){if(t+=this.offset,"string"!=typeof e)throw TypeError("inserted content must be a string");this._split(t);let i=this.byEnd[t];return i?i.appendLeft(e):this.intro+=e,this}appendRight(t,e){if(t+=this.offset,"string"!=typeof e)throw TypeError("inserted content must be a string");this._split(t);let i=this.byStart[t];return i?i.appendRight(e):this.outro+=e,this}clone(){let t=new m(this.original,{filename:this.filename,offset:this.offset}),e=this.firstChunk,i=t.firstChunk=t.lastSearchedChunk=e.clone();for(;e;){t.byStart[i.start]=i,t.byEnd[i.end]=i;let r=e.next,n=r&&r.clone();n&&(i.next=n,n.previous=i,i=n),e=r}return t.lastChunk=i,this.indentExclusionRanges&&(t.indentExclusionRanges=this.indentExclusionRanges.slice()),t.sourcemapLocations=new l(this.sourcemapLocations),t.intro=this.intro,t.outro=this.outro,t}generateDecodedMap(t){t=t||{};let e=Object.keys(this.storedNames),i=new c(t.hires),r=f(this.original);return this.intro&&i.advance(this.intro),this.firstChunk.eachNext(t=>{let n=r(t.start);t.intro.length&&i.advance(t.intro),t.edited?i.addEdit(0,t.content,n,t.storeName?e.indexOf(t.original):-1):i.addUneditedChunk(0,t,this.original,n,this.sourcemapLocations),t.outro.length&&i.advance(t.outro)}),this.outro&&i.advance(this.outro),{file:t.file?t.file.split(/[/\\]/).pop():void 0,sources:[t.source?function(t,e){let i=t.split(/[/\\]/),r=e.split(/[/\\]/);for(i.pop();i[0]===r[0];)i.shift(),r.shift();if(i.length){let t=i.length;for(;t--;)i[t]=".."}return i.concat(r).join("/")}(t.file||"",t.source):t.file||""],sourcesContent:t.includeContent?[this.original]:void 0,names:e,mappings:i.raw,x_google_ignoreList:this.ignoreList?[0]:void 0}}generateMap(t){return new d(this.generateDecodedMap(t))}_ensureindentStr(){let t,e,i;void 0===this.indentStr&&(this.indentStr=(e=(t=this.original.split("\n")).filter(t=>/^\t+/.test(t)),i=t.filter(t=>/^ {2,}/.test(t)),0===e.length&&0===i.length?null:e.length>=i.length?" ":Array(i.reduce((t,e)=>Math.min(/^ +/.exec(e)[0].length,t),1/0)+1).join(" ")))}_getRawIndentString(){return this._ensureindentStr(),this.indentStr}getIndentString(){return this._ensureindentStr(),null===this.indentStr?" ":this.indentStr}indent(t,e){var i;let r=/^[^\r\n]/gm;if(i=t,"[object Object]"===g.call(i)&&(e=t,t=void 0),void 0===t&&(this._ensureindentStr(),t=this.indentStr||" "),""===t)return this;let n={};(e=e||{}).exclude&&("number"==typeof e.exclude[0]?[e.exclude]:e.exclude).forEach(t=>{for(let e=t[0];e<t[1];e+=1)n[e]=!0});let o=!1!==e.indentStart,s=e=>o?`${t}${e}`:(o=!0,e);this.intro=this.intro.replace(r,s);let h=0,l=this.firstChunk;for(;l;){let e=l.end;if(l.edited)!n[h]&&(l.content=l.content.replace(r,s),l.content.length&&(o="\n"===l.content[l.content.length-1]));else for(h=l.start;h<e;){if(!n[h]){let e=this.original[h];"\n"===e?o=!0:"\r"!==e&&o&&(o=!1,h===l.start?l.prependRight(t):(this._splitChunk(l,h),(l=l.next).prependRight(t)))}h+=1}h=l.end,l=l.next}return this.outro=this.outro.replace(r,s),this}insert(){throw Error("magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)")}insertLeft(t,e){return b.insertLeft||(console.warn("magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead"),b.insertLeft=!0),this.appendLeft(t,e)}insertRight(t,e){return b.insertRight||(console.warn("magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead"),b.insertRight=!0),this.prependRight(t,e)}move(t,e,i){if(t+=this.offset,e+=this.offset,(i+=this.offset)>=t&&i<=e)throw Error("Cannot move a selection inside itself");this._split(t),this._split(e),this._split(i);let r=this.byStart[t],n=this.byEnd[e],o=r.previous,s=n.next,h=this.byStart[i];if(!h&&n===this.lastChunk)return this;let l=h?h.previous:this.lastChunk;return o&&(o.next=s),s&&(s.previous=o),l&&(l.next=r),h&&(h.previous=n),r.previous||(this.firstChunk=n.next),n.next||(this.lastChunk=r.previous,this.lastChunk.next=null),r.previous=l,n.next=h||null,l||(this.firstChunk=r),h||(this.lastChunk=n),this}overwrite(t,e,i,r){return r=r||{},this.update(t,e,i,{...r,overwrite:!r.contentOnly})}update(t,e,i,r){if(t+=this.offset,e+=this.offset,"string"!=typeof i)throw TypeError("replacement content must be a string");if(0!==this.original.length){for(;t<0;)t+=this.original.length;for(;e<0;)e+=this.original.length}if(e>this.original.length)throw Error("end is out of bounds");if(t===e)throw Error("Cannot overwrite a zero-length range – use appendLeft or prependRight instead");this._split(t),this._split(e),!0===r&&(b.storeName||(console.warn("The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string"),b.storeName=!0),r={storeName:!0});let n=void 0!==r&&r.storeName,o=void 0!==r&&r.overwrite;if(n){let i=this.original.slice(t,e);Object.defineProperty(this.storedNames,i,{writable:!0,value:!0,enumerable:!0})}let s=this.byStart[t],h=this.byEnd[e];if(s){let t=s;for(;t!==h;){if(t.next!==this.byStart[t.end])throw Error("Cannot overwrite across a split point");(t=t.next).edit("",!1)}s.edit(i,n,!o)}else{let r=new a(t,e,"").edit(i,n);h.next=r,r.previous=h}return this}prepend(t){if("string"!=typeof t)throw TypeError("outro content must be a string");return this.intro=t+this.intro,this}prependLeft(t,e){if(t+=this.offset,"string"!=typeof e)throw TypeError("inserted content must be a string");this._split(t);let i=this.byEnd[t];return i?i.prependLeft(e):this.intro=e+this.intro,this}prependRight(t,e){if(t+=this.offset,"string"!=typeof e)throw TypeError("inserted content must be a string");this._split(t);let i=this.byStart[t];return i?i.prependRight(e):this.outro=e+this.outro,this}remove(t,e){if(t+=this.offset,e+=this.offset,0!==this.original.length){for(;t<0;)t+=this.original.length;for(;e<0;)e+=this.original.length}if(t===e)return this;if(t<0||e>this.original.length)throw Error("Character is out of bounds");if(t>e)throw Error("end must be greater than start");this._split(t),this._split(e);let i=this.byStart[t];for(;i;)i.intro="",i.outro="",i.edit(""),i=e>i.end?this.byStart[i.end]:null;return this}reset(t,e){if(t+=this.offset,e+=this.offset,0!==this.original.length){for(;t<0;)t+=this.original.length;for(;e<0;)e+=this.original.length}if(t===e)return this;if(t<0||e>this.original.length)throw Error("Character is out of bounds");if(t>e)throw Error("end must be greater than start");this._split(t),this._split(e);let i=this.byStart[t];for(;i;)i.reset(),i=e>i.end?this.byStart[i.end]:null;return this}lastChar(){if(this.outro.length)return this.outro[this.outro.length-1];let t=this.lastChunk;do{if(t.outro.length)return t.outro[t.outro.length-1];if(t.content.length)return t.content[t.content.length-1];if(t.intro.length)return t.intro[t.intro.length-1]}while(t=t.previous);return this.intro.length?this.intro[this.intro.length-1]:""}lastLine(){let t=this.outro.lastIndexOf("\n");if(-1!==t)return this.outro.substr(t+1);let e=this.outro,i=this.lastChunk;do{if(i.outro.length>0){if(-1!==(t=i.outro.lastIndexOf("\n")))return i.outro.substr(t+1)+e;e=i.outro+e}if(i.content.length>0){if(-1!==(t=i.content.lastIndexOf("\n")))return i.content.substr(t+1)+e;e=i.content+e}if(i.intro.length>0){if(-1!==(t=i.intro.lastIndexOf("\n")))return i.intro.substr(t+1)+e;e=i.intro+e}}while(i=i.previous);return -1!==(t=this.intro.lastIndexOf("\n"))?this.intro.substr(t+1)+e:this.intro+e}slice(t=0,e=this.original.length-this.offset){if(t+=this.offset,e+=this.offset,0!==this.original.length){for(;t<0;)t+=this.original.length;for(;e<0;)e+=this.original.length}let i="",r=this.firstChunk;for(;r&&(r.start>t||r.end<=t);){if(r.start<e&&r.end>=e)return i;r=r.next}if(r&&r.edited&&r.start!==t)throw Error(`Cannot use replaced character ${t} as slice start anchor.`);let n=r;for(;r;){r.intro&&(n!==r||r.start===t)&&(i+=r.intro);let o=r.start<e&&r.end>=e;if(o&&r.edited&&r.end!==e)throw Error(`Cannot use replaced character ${e} as slice end anchor.`);let s=n===r?t-r.start:0,h=o?r.content.length+e-r.end:r.content.length;if(i+=r.content.slice(s,h),r.outro&&(!o||r.end===e)&&(i+=r.outro),o)break;r=r.next}return i}snip(t,e){let i=this.clone();return i.remove(0,t),i.remove(e,i.original.length),i}_split(t){if(this.byStart[t]||this.byEnd[t])return;let e=this.lastSearchedChunk,i=e,r=t>e.end;for(;e;){if(e.contains(t))return this._splitChunk(e,t);if((e=r?this.byStart[e.end]:this.byEnd[e.start])===i)return;i=e}}_splitChunk(t,e){if(t.edited&&t.content.length){let i=f(this.original)(e);throw Error(`Cannot split a chunk that has already been edited (${i.line}:${i.column} – "${t.original}")`)}let i=t.split(e);return this.byEnd[e]=t,this.byStart[e]=i,this.byEnd[i.end]=i,t===this.lastChunk&&(this.lastChunk=i),this.lastSearchedChunk=t,!0}toString(){let t=this.intro,e=this.firstChunk;for(;e;)t+=e.toString(),e=e.next;return t+this.outro}isEmpty(){let t=this.firstChunk;do if(t.intro.length&&t.intro.trim()||t.content.length&&t.content.trim()||t.outro.length&&t.outro.trim())return!1;while(t=t.next);return!0}length(){let t=this.firstChunk,e=0;do e+=t.intro.length+t.content.length+t.outro.length;while(t=t.next);return e}trimLines(){return this.trim("[\\r\\n]")}trim(t){return this.trimStart(t).trimEnd(t)}trimEndAborted(t){let e=RegExp((t||"\\s")+"+$");if(this.outro=this.outro.replace(e,""),this.outro.length)return!0;let i=this.lastChunk;do{let t=i.end,r=i.trimEnd(e);if(i.end!==t&&(this.lastChunk===i&&(this.lastChunk=i.next),this.byEnd[i.end]=i,this.byStart[i.next.start]=i.next,this.byEnd[i.next.end]=i.next),r)return!0;i=i.previous}while(i);return!1}trimEnd(t){return this.trimEndAborted(t),this}trimStartAborted(t){let e=RegExp("^"+(t||"\\s")+"+");if(this.intro=this.intro.replace(e,""),this.intro.length)return!0;let i=this.firstChunk;do{let t=i.end,r=i.trimStart(e);if(i.end!==t&&(i===this.lastChunk&&(this.lastChunk=i.next),this.byEnd[i.end]=i,this.byStart[i.next.start]=i.next,this.byEnd[i.next.end]=i.next),r)return!0;i=i.next}while(i);return!1}trimStart(t){return this.trimStartAborted(t),this}hasChanged(){return this.original!==this.toString()}_replaceRegexp(t,e){function i(t,i){return"string"==typeof e?e.replace(/\$(\$|&|\d+)/g,(e,i)=>"$"===i?"$":"&"===i?t[0]:+i<t.length?t[+i]:`$${i}`):e(...t,t.index,i,t.groups)}if(t.global)(function(t,e){let i,r=[];for(;i=t.exec(e);)r.push(i);return r})(t,this.original).forEach(t=>{if(null!=t.index){let e=i(t,this.original);e!==t[0]&&this.overwrite(t.index,t.index+t[0].length,e)}});else{let e=this.original.match(t);if(e&&null!=e.index){let t=i(e,this.original);t!==e[0]&&this.overwrite(e.index,e.index+e[0].length,t)}}return this}_replaceString(t,e){let{original:i}=this,r=i.indexOf(t);return -1!==r&&("function"==typeof e&&(e=e(t,r,i)),t!==e&&this.overwrite(r,r+t.length,e)),this}replace(t,e){return"string"==typeof t?this._replaceString(t,e):this._replaceRegexp(t,e)}_replaceAllString(t,e){let{original:i}=this,r=t.length;for(let n=i.indexOf(t);-1!==n;n=i.indexOf(t,n+r)){let t=i.slice(n,n+r),o=e;"function"==typeof e&&(o=e(t,n,i)),t!==o&&this.overwrite(n,n+r,o)}return this}replaceAll(t,e){if("string"==typeof t)return this._replaceAllString(t,e);if(!t.global)throw TypeError("MagicString.prototype.replaceAll called with a non-global RegExp argument");return this._replaceRegexp(t,e)}}Object.prototype.hasOwnProperty;let w=t("../../../node_modules/.pnpm/@swc+core@1.15.11_@swc+helpers@0.5.23/node_modules/@swc/core/index.js"),v={audio:"DoubaoAudio",button:"DoubaoButton",camera:"DoubaoCamera",canvas:"DoubaoCanvas",map:"DoubaoMap","map-marker":"DoubaoMapMarker",markdown:"DoubaoMarkdown","navigation-bar":"DoubaoNavigationBar","long-image":"DoubaoLongImage","movable-area":"DoubaoMovableArea","movable-view":"DoubaoMovableView",popup:"DoubaoPopup",radio:"DoubaoRadio","radio-group":"DoubaoRadioGroup","rich-text":"DoubaoRichText",slider:"DoubaoSlider",switch:"DoubaoSwitch",swiper:"DoubaoSwiper","swiper-item":"DoubaoSwiperItem","picker-column":"DoubaoPickerColumn","picker-divider":"DoubaoPickerDivider","picker-view":"DoubaoPickerView","theme-provider":"DoubaoThemeProvider",video:"DoubaoVideo","web-view":"DoubaoWebView",image:"DoubaoImage",input:"DoubaoInput",list:"DoubaoList","scroll-view":"DoubaoScrollView",svg:"DoubaoSvg",text:"DoubaoText",textarea:"DoubaoTextArea",view:"DoubaoView"};function C(t){return"Identifier"===t.type&&t.value in v?t.value:null}function S(t,e,i,r,n){if("Identifier"!==e.type)return;let o=n(e.span.start-r),s=n(e.span.end-r);t.overwrite(o,s,i)}export default function(t){let i=this.async();try{let{frameworkPackage:r="@byted-doubao-apps/framework"}=this.getOptions(),n=new m(t),o=(0,w.parseSync)(t,{syntax:"typescript",tsx:!0,decorators:!0}),s=function(t){let e=0;for(;e<t.length;){let i=t[e];if(" "===i||" "===i||"\n"===i||"\r"===i||"\f"===i){e+=1;continue}if("/"===i&&"/"===t[e+1]){for(e+=2;e<t.length&&"\n"!==t[e];)e+=1;continue}if("/"===i&&"*"===t[e+1]){for(e+=2;e<t.length&&("*"!==t[e]||"/"!==t[e+1]);)e+=1;e<t.length&&(e+=2);continue}break}return Buffer.byteLength(t.slice(0,e))}(t),h=Math.max(0,o.span.start-s),l=function(t){let e=new Map([[0,0]]),i=0,r=0;for(let n of t)i+=Buffer.byteLength(n),r+=n.length,e.set(i,r);return t=>{let i=e.get(t);if(void 0===i)throw Error(`无法将字节偏移量 ${t} 映射为字符串索引`);return i}}(t),a=new Set;if(e(o,{JSXOpeningElement(t){let e=C(t.name);if(!e)return;let i=v[e];S(n,t.name,i,h,l),a.add(i)},JSXClosingElement(t){let e=C(t.name);if(!e)return;let i=v[e];S(n,t.name,i,h,l),a.add(i)}}),a.size>0){let t=Array.from(a).map(t=>{let e=t.replace("Doubao","");return`${e} as ${t}`}).join(", "),e=`import { ${t} } from '${r}/components';
2
2
  `;n.prepend(e)}if(n.hasChanged()){let t=n.toString(),e=n.generateMap({includeContent:!0,hires:!0,source:this.resourcePath,file:this.resourcePath});i(null,t,e)}else i(null,t)}catch(e){i(null,t)}};
@@ -1,4 +1,4 @@
1
- import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./7945.js";import{isRecord as t}from"./2168.js";let r=e("node:fs");var n=e.n(r);let i=e("node:path");var o=e.n(i);let a=e("node:url"),s=o().dirname((0,a.fileURLToPath)(import.meta.url)),p=["taxi","milk-tea"];function d(e){if("taxi"===e)return l;if("milk-tea"===e)return c;throw Error(`unknown demo: ${e}. Supported demos: ${p.join(", ")}`)}let l={name:"taxi",appKey:"db_app_api_test_taxi",appName:"打车测试智能服务",serverName:"dbx-taxi-demo-mcp",tools:[{name:"Taxi_search",description:"搜索可用打车方案,返回 plan_id、车型、价格、距离和预计到达时间。",inputSchema:{type:"object",properties:{destination:{type:"string",description:"目的地"},preference:{type:"string",description:"车型或偏好,例如惠选、快车、商务"}},required:["destination"]}},{name:"Taxi_order",description:"根据 plan_id 发起打车订单,返回可出卡的智能服务订单实体。",inputSchema:{type:"object",properties:{plan_id:{type:"string",description:"Taxi_search 返回的方案 ID"},destination:{type:"string",description:"目的地"}},required:["plan_id"]}}],callTool:function(e,t){if("Taxi_search"===e){let e=m(t.destination)||"北京南站",r=m(t.preference)||"惠选";return{content:[{type:"text",text:`找到 2 个去${e}的${r}打车方案。`}],structuredContent:{plans:[{plan_id:"plan_demo_001",car_type:r,price_yuan:48.5,distance_km:12.8,eta_min:6},{plan_id:"plan_demo_002",car_type:"快车",price_yuan:55,distance_km:12.8,eta_min:4}]},isError:!1}}if("Taxi_order"===e){let e=m(t.destination)||"北京南站",r=m(t.plan_id)||"plan_demo_001";return{content:[{type:"text",text:`已为你创建去${e}的打车订单。`}],structuredContent:{entities:[{entity_type:"product",product_id:`taxi_order_${r}`,name:`去${e}的打车订单`,car_type:"惠选",price_yuan:48.5,status:"已下单"}]},isError:!1}}return{content:[{type:"text",text:`unknown tool: ${e}`}],isError:!0}},evalCase:{app_key:"doubao-api-test-taxi",app_name:"打车测试智能服务",query:"帮我叫一辆惠选去北京南站,直接下单",history_messages:[{role:"USER",content:"上一轮:你能调用智能服务工具吗?"},{role:"ASSISTANT",content:"可以,我会等待工具调用结果再继续回答。"}],skills:[_("taxi","SKILL.md")],manifest:_("taxi","manifest.yaml"),max_step:15,expect:{tool_calls:["Taxi_search","Taxi_order"],card:{widget_id:"tpl.taxi_order",min_count:1}}}},c={name:"milk-tea",appKey:"db_app_api_test_milk_tea",appName:"奶茶测试智能服务",serverName:"dbx-milk-tea-demo-mcp",tools:[{name:"MilkTea_search",description:"根据口味、场景和偏好搜索奶茶商品,返回 sku_id、名称、甜度、价格和推荐理由。",inputSchema:{type:"object",properties:{query:{type:"string",description:"用户想喝的饮品或场景,例如下午提神、少糖奶茶"},sugar:{type:"string",description:"甜度偏好,例如少糖、半糖、无糖"}},required:["query"]}},{name:"MilkTea_order",description:"根据 sku_id 创建奶茶订单,返回可出卡的智能服务订单实体。",inputSchema:{type:"object",properties:{sku_id:{type:"string",description:"MilkTea_search 返回的商品 ID"},sugar:{type:"string",description:"甜度"}},required:["sku_id"]}}],callTool:function(e,t){if("MilkTea_search"===e){let e=m(t.query)||"下午提神少糖奶茶",r=m(t.sugar)||"少糖";return{content:[{type:"text",text:`找到 3 个适合「${e}」的${r}奶茶选项。`}],structuredContent:{products:[{sku_id:"tea_demo_001",name:"冷萃乌龙奶茶",sugar:r,price_yuan:18,selling_point:"茶香明显,适合下午提神"},{sku_id:"tea_demo_002",name:"茉莉轻乳茶",sugar:r,price_yuan:16,selling_point:"口感清爽,负担较低"},{sku_id:"tea_demo_003",name:"厚乳拿铁奶茶",sugar:"半糖",price_yuan:21,selling_point:"奶香更足,提神感更强"}]},isError:!1}}if("MilkTea_order"===e){var r;let e=m(t.sku_id)||"tea_demo_001",n=m(t.sugar)||"少糖",i=("number"==typeof(r=t.quantity)&&Number.isFinite(r)?r:0)||1;return{content:[{type:"text",text:`已为你下单 ${i} 杯${n}冷萃乌龙奶茶。`}],structuredContent:{entities:[{entity_type:"product",product_id:`milk_tea_order_${e}`,name:"冷萃乌龙奶茶",sugar:n,quantity:i,price_yuan:18*i,status:"已下单",selling_point:"茶香明显,适合下午提神"}]},isError:!1}}return{content:[{type:"text",text:`unknown tool: ${e}`}],isError:!0}},evalCase:{app_key:"doubao-api-test-milk-tea",app_name:"奶茶测试智能服务",query:"我想点一杯适合下午提神的少糖奶茶,直接下单",history_messages:[{role:"USER",content:"上一轮:你能帮我点饮品吗?"},{role:"ASSISTANT",content:"可以,我会先查找合适饮品,再根据你的确认或明确下单意图创建订单。"}],skills:[_("milk-tea","SKILL.md")],manifest:_("milk-tea","manifest.yaml"),max_step:15,expect:{tool_calls:["MilkTea_search","MilkTea_order"],card:{widget_id:"tpl.milk_tea_order",min_count:1}}}};function m(e){return"string"==typeof e?e:""}function _(e,t){return n().readFileSync(o().join(s,"demos",`${e}.${t}`),"utf8")}let u=e("node:http");var y=e.n(u);let f=e("node:crypto");async function h(e){let t=d(e.demo),r=new Map,n=y().createServer(async(n,i)=>{try{let o=new URL(n.url||"/",`http://${n.headers.host||`${e.host}:${e.port}`}`);if("POST"===n.method&&"/mcp"===$(o.pathname)){let r=await x(n);e.log?.(`[mcp] ${r.method||"-"} ${k(r)}`);let o=g(t,r);if(!o){i.writeHead(202),i.end();return}i.writeHead(200,{"content-type":"application/json","mcp-session-id":`demo-${t.name}-session`}),i.end(JSON.stringify(o));return}if("GET"===n.method&&"/sse"===$(o.pathname)){let t=(0,f.randomUUID)();i.writeHead(200,{"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive"});let o={write:(e,t)=>{i.write(`event: ${e}
1
+ import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./1264.js";import{isRecord as t}from"./2232.js";let r=e("node:fs");var n=e.n(r);let i=e("node:path");var o=e.n(i);let a=e("node:url"),s=o().dirname((0,a.fileURLToPath)(import.meta.url)),p=["taxi","milk-tea"];function d(e){if("taxi"===e)return l;if("milk-tea"===e)return c;throw Error(`未知示例:${e}。支持的示例: ${p.join(", ")}`)}let l={name:"taxi",appKey:"db_app_api_test_taxi",appName:"打车测试智能服务",serverName:"dbx-taxi-demo-mcp",tools:[{name:"Taxi_search",description:"搜索可用打车方案,返回 plan_id、车型、价格、距离和预计到达时间。",inputSchema:{type:"object",properties:{destination:{type:"string",description:"目的地"},preference:{type:"string",description:"车型或偏好,例如惠选、快车、商务"}},required:["destination"]}},{name:"Taxi_order",description:"根据 plan_id 发起打车订单,返回可出卡的智能服务订单实体。",inputSchema:{type:"object",properties:{plan_id:{type:"string",description:"Taxi_search 返回的方案 ID"},destination:{type:"string",description:"目的地"}},required:["plan_id"]}}],callTool:function(e,t){if("Taxi_search"===e){let e=m(t.destination)||"北京南站",r=m(t.preference)||"惠选";return{content:[{type:"text",text:`找到 2 个去${e}的${r}打车方案。`}],structuredContent:{plans:[{plan_id:"plan_demo_001",car_type:r,price_yuan:48.5,distance_km:12.8,eta_min:6},{plan_id:"plan_demo_002",car_type:"快车",price_yuan:55,distance_km:12.8,eta_min:4}]},isError:!1}}if("Taxi_order"===e){let e=m(t.destination)||"北京南站",r=m(t.plan_id)||"plan_demo_001";return{content:[{type:"text",text:`已为你创建去${e}的打车订单。`}],structuredContent:{entities:[{entity_type:"product",product_id:`taxi_order_${r}`,name:`去${e}的打车订单`,car_type:"惠选",price_yuan:48.5,status:"已下单"}]},isError:!1}}return{content:[{type:"text",text:`unknown tool: ${e}`}],isError:!0}},evalCase:{app_key:"doubao-api-test-taxi",app_name:"打车测试智能服务",query:"帮我叫一辆惠选去北京南站,直接下单",history_messages:[{role:"USER",content:"上一轮:你能调用智能服务工具吗?"},{role:"ASSISTANT",content:"可以,我会等待工具调用结果再继续回答。"}],skills:[_("taxi","SKILL.md")],manifest:_("taxi","manifest.yaml"),max_step:15,expect:{tool_calls:["Taxi_search","Taxi_order"],card:{widget_id:"tpl.taxi_order",min_count:1}}}},c={name:"milk-tea",appKey:"db_app_api_test_milk_tea",appName:"奶茶测试智能服务",serverName:"dbx-milk-tea-demo-mcp",tools:[{name:"MilkTea_search",description:"根据口味、场景和偏好搜索奶茶商品,返回 sku_id、名称、甜度、价格和推荐理由。",inputSchema:{type:"object",properties:{query:{type:"string",description:"用户想喝的饮品或场景,例如下午提神、少糖奶茶"},sugar:{type:"string",description:"甜度偏好,例如少糖、半糖、无糖"}},required:["query"]}},{name:"MilkTea_order",description:"根据 sku_id 创建奶茶订单,返回可出卡的智能服务订单实体。",inputSchema:{type:"object",properties:{sku_id:{type:"string",description:"MilkTea_search 返回的商品 ID"},sugar:{type:"string",description:"甜度"}},required:["sku_id"]}}],callTool:function(e,t){if("MilkTea_search"===e){let e=m(t.query)||"下午提神少糖奶茶",r=m(t.sugar)||"少糖";return{content:[{type:"text",text:`找到 3 个适合「${e}」的${r}奶茶选项。`}],structuredContent:{products:[{sku_id:"tea_demo_001",name:"冷萃乌龙奶茶",sugar:r,price_yuan:18,selling_point:"茶香明显,适合下午提神"},{sku_id:"tea_demo_002",name:"茉莉轻乳茶",sugar:r,price_yuan:16,selling_point:"口感清爽,负担较低"},{sku_id:"tea_demo_003",name:"厚乳拿铁奶茶",sugar:"半糖",price_yuan:21,selling_point:"奶香更足,提神感更强"}]},isError:!1}}if("MilkTea_order"===e){var r;let e=m(t.sku_id)||"tea_demo_001",n=m(t.sugar)||"少糖",i=("number"==typeof(r=t.quantity)&&Number.isFinite(r)?r:0)||1;return{content:[{type:"text",text:`已为你下单 ${i} 杯${n}冷萃乌龙奶茶。`}],structuredContent:{entities:[{entity_type:"product",product_id:`milk_tea_order_${e}`,name:"冷萃乌龙奶茶",sugar:n,quantity:i,price_yuan:18*i,status:"已下单",selling_point:"茶香明显,适合下午提神"}]},isError:!1}}return{content:[{type:"text",text:`unknown tool: ${e}`}],isError:!0}},evalCase:{app_key:"doubao-api-test-milk-tea",app_name:"奶茶测试智能服务",query:"我想点一杯适合下午提神的少糖奶茶,直接下单",history_messages:[{role:"USER",content:"上一轮:你能帮我点饮品吗?"},{role:"ASSISTANT",content:"可以,我会先查找合适饮品,再根据你的确认或明确下单意图创建订单。"}],skills:[_("milk-tea","SKILL.md")],manifest:_("milk-tea","manifest.yaml"),max_step:15,expect:{tool_calls:["MilkTea_search","MilkTea_order"],card:{widget_id:"tpl.milk_tea_order",min_count:1}}}};function m(e){return"string"==typeof e?e:""}function _(e,t){return n().readFileSync(o().join(s,"demos",`${e}.${t}`),"utf8")}let u=e("node:http");var y=e.n(u);let f=e("node:crypto");async function h(e){let t=d(e.demo),r=new Map,n=y().createServer(async(n,i)=>{try{let o=new URL(n.url||"/",`http://${n.headers.host||`${e.host}:${e.port}`}`);if("POST"===n.method&&"/mcp"===S(o.pathname)){let r=await x(n);e.log?.(`[mcp] ${r.method||"-"} ${k(r)}`);let o=g(t,r);if(!o){i.writeHead(202),i.end();return}i.writeHead(200,{"content-type":"application/json","mcp-session-id":`demo-${t.name}-session`}),i.end(JSON.stringify(o));return}if("GET"===n.method&&"/sse"===S(o.pathname)){let t=(0,f.randomUUID)();i.writeHead(200,{"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive"});let o={write:(e,t)=>{i.write(`event: ${e}
2
2
  `),i.write(`data: ${"string"==typeof t?t:JSON.stringify(t)}
3
3
 
4
- `)},close:()=>i.end()};r.set(t,o),n.on("close",()=>r.delete(t)),o.write("endpoint",`/sse/message?session_id=${encodeURIComponent(t)}`),e.log?.(`[sse] connected session=${t}`);return}if("POST"===n.method&&"/sse/message"===$(o.pathname)){let a=o.searchParams.get("session_id")||"",s=r.get(a);if(!s)return void S(i,404,{error:"SSE session not found"});let p=await x(n);e.log?.(`[sse] ${p.method||"-"} ${k(p)}`);let d=g(t,p);i.writeHead(202),i.end(),d&&s.write("message",d);return}if("GET"===n.method&&"/health"===$(o.pathname))return void S(i,200,{ok:!0,demo:e.demo});S(i,404,{error:"not found",paths:["/mcp","/sse","/health"]})}catch(e){S(i,500,{error:e instanceof Error?e.message:String(e)})}});await new Promise((t,r)=>{n.once("error",r),n.listen(e.port,e.host,()=>{n.off("error",r),t()})});let i=n.address(),o="object"==typeof i&&i?i.port:e.port,a=`http://${e.host}:${o}`;return{origin:a,streamableUrl:`${a}/mcp`,sseUrl:`${a}/sse`,close:()=>new Promise((e,t)=>{for(let e of r.values())e.close();r.clear(),n.close(r=>r?t(r):e())})}}function g(e,r){if("initialize"===r.method)return{jsonrpc:"2.0",id:r.id,result:{protocolVersion:r.params?.protocolVersion||"2025-11-25",capabilities:{tools:{}},serverInfo:{name:e.serverName,version:"0.1.0"}}};if("notifications/initialized"!==r.method){if("tools/list"===r.method)return{jsonrpc:"2.0",id:r.id,result:{tools:e.tools}};if("tools/call"===r.method){let n="string"==typeof r.params?.name?r.params.name:"",i=t(r.params?.arguments)?r.params.arguments:{};return{jsonrpc:"2.0",id:r.id,result:e.callTool(n,i)}}return{jsonrpc:"2.0",id:r.id??null,error:{code:-32601,message:`Method not found: ${r.method||"-"}`}}}}function x(e){return new Promise((t,r)=>{let n="";e.setEncoding("utf8"),e.on("data",e=>{n+=e}),e.on("end",()=>{try{t(n?JSON.parse(n):{})}catch(e){r(e)}}),e.on("error",r)})}function k(e){if("tools/call"!==e.method)return"";let t=e.params?.name;return"string"==typeof t?t:""}function S(e,t,r){e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(r))}function $(e){return e.replace(/\/+$/,"")||"/"}export{p as DBX_DEMO_NAMES,d as getDBXDemo,h as startMCPDemoServer};
4
+ `)},close:()=>i.end()};r.set(t,o),n.on("close",()=>r.delete(t)),o.write("endpoint",`/sse/message?session_id=${encodeURIComponent(t)}`),e.log?.(`[sse] 已连接,会话=${t}`);return}if("POST"===n.method&&"/sse/message"===S(o.pathname)){let a=o.searchParams.get("session_id")||"",s=r.get(a);if(!s)return void $(i,404,{error:"SSE session not found"});let p=await x(n);e.log?.(`[sse] ${p.method||"-"} ${k(p)}`);let d=g(t,p);i.writeHead(202),i.end(),d&&s.write("message",d);return}if("GET"===n.method&&"/health"===S(o.pathname))return void $(i,200,{ok:!0,demo:e.demo});$(i,404,{error:"not found",paths:["/mcp","/sse","/health"]})}catch(e){$(i,500,{error:e instanceof Error?e.message:String(e)})}});await new Promise((t,r)=>{n.once("error",r),n.listen(e.port,e.host,()=>{n.off("error",r),t()})});let i=n.address(),o="object"==typeof i&&i?i.port:e.port,a=`http://${e.host}:${o}`;return{origin:a,streamableUrl:`${a}/mcp`,sseUrl:`${a}/sse`,close:()=>new Promise((e,t)=>{for(let e of r.values())e.close();r.clear(),n.close(r=>r?t(r):e())})}}function g(e,r){if("initialize"===r.method)return{jsonrpc:"2.0",id:r.id,result:{protocolVersion:r.params?.protocolVersion||"2025-11-25",capabilities:{tools:{}},serverInfo:{name:e.serverName,version:"0.1.0"}}};if("notifications/initialized"!==r.method){if("tools/list"===r.method)return{jsonrpc:"2.0",id:r.id,result:{tools:e.tools}};if("tools/call"===r.method){let n="string"==typeof r.params?.name?r.params.name:"",i=t(r.params?.arguments)?r.params.arguments:{};return{jsonrpc:"2.0",id:r.id,result:e.callTool(n,i)}}return{jsonrpc:"2.0",id:r.id??null,error:{code:-32601,message:`Method not found: ${r.method||"-"}`}}}}function x(e){return new Promise((t,r)=>{let n="";e.setEncoding("utf8"),e.on("data",e=>{n+=e}),e.on("end",()=>{try{t(n?JSON.parse(n):{})}catch(e){r(e)}}),e.on("error",r)})}function k(e){if("tools/call"!==e.method)return"";let t=e.params?.name;return"string"==typeof t?t:""}function $(e,t,r){e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(r))}function S(e){return e.replace(/\/+$/,"")||"/"}export{p as DBX_DEMO_NAMES,d as getDBXDemo,h as startMCPDemoServer};
package/dist/demo.js CHANGED
@@ -1,2 +1,2 @@
1
- import"node:module";import{parseInteger as e,runCommand as o,command_Command as t,argument_Argument as r,option_Option as s}from"./2168.js";import{DBX_DEMO_NAMES as n,startMCPDemoServer as i}from"./demo-server.js";import{dist as a}from"./@inquirer/select.js";async function l(e,o,t=!!process.stdin.isTTY&&!!process.stderr.isTTY){return e||((o.json||!t)&&o.error(`demo is required outside an interactive terminal. Supported demos: ${n.join(", ")}. Example: dbx mcp demo taxi --json`),a({message:"选择要启动的 Demo MCP Server",choices:n.map(e=>({name:e,value:e}))},{output:process.stderr}))}async function p(e,o,t,r=i,s=m){let n=await l(o,e),a=await r({demo:n,host:t.host,port:t.port,log:e.log});if(e.json){let e={schema:"dbx.mcp.demo.v1",event:"ready",demo:n,pid:process.pid,endpoints:{streamable_http:a.streamableUrl,sse:a.sseUrl,health:`${a.origin}/health`}};process.stdout.write(`${JSON.stringify(e)}
2
- `)}else e.log("Demo MCP Server started for local debugging"),e.log(`demo: ${n}`),e.log(`streamable_http: ${a.streamableUrl}`),e.log(`sse: ${a.sseUrl}`),e.log(`health: ${a.origin}/health`),e.log(""),e.log("press Ctrl+C to stop");await s(async o=>{process.exitCode="SIGINT"===o?130:143,await a.close().catch(o=>e.warn(`Unable to stop Demo MCP Server: ${String(o)}`))})}function m(e,o=process){return new Promise(t=>{let r=!1;function s(s){r||(r=!0,e(s).finally(()=>{o.off("SIGINT",n),o.off("SIGTERM",i),t()}))}function n(){s("SIGINT")}function i(){s("SIGTERM")}o.once("SIGINT",n),o.once("SIGTERM",i)})}export default function(){return new t("demo").description("启动内置 MCP 示例服务").usage("[options] [demo]\n\nExample:\n dbx mcp demo taxi").addArgument(new r("[demo]","Demo 名称").choices(n)).option("--host <host>","监听地址","127.0.0.1").addOption(new s("--port <port>","监听端口;0 表示自动选择空闲端口").default(0).argParser(e)).action(async(e,t,r)=>o(r,o=>p(o,e,t)))};export{l as resolveMcpDemo,p as runMcpDemo,m as waitForShutdown};
1
+ import"node:module";import{parseInteger as o,runCommand as e,command_Command as t,argument_Argument as r,option_Option as s}from"./2232.js";import{DBX_DEMO_NAMES as n,startMCPDemoServer as i}from"./demo-server.js";import{dist as a}from"./@inquirer/select.js";async function c(o,e,t=!!process.stdin.isTTY&&!!process.stderr.isTTY){return o||((e.json||!t)&&e.error(`非交互式终端需要指定示例名称。支持的示例:${n.join(", ")}。示例:dbx mcp demo taxi --json`),a({message:"选择要启动的示例 MCP 服务",choices:n.map(o=>({name:o,value:o}))},{output:process.stderr}))}async function l(o,e,t,r=i,s=p){let n=await c(e,o),a=await r({demo:n,host:t.host,port:t.port,log:o.log});if(o.json){let o={schema:"dbx.mcp.demo.v1",event:"ready",demo:n,pid:process.pid,endpoints:{streamable_http:a.streamableUrl,sse:a.sseUrl,health:`${a.origin}/health`}};process.stdout.write(`${JSON.stringify(o)}
2
+ `)}else o.log("用于本地调试的示例 MCP 服务已启动"),o.log(`示例:${n}`),o.log(`流式 HTTP 地址:${a.streamableUrl}`),o.log(`SSE 地址:${a.sseUrl}`),o.log(`健康检查地址:${a.origin}/health`),o.log(""),o.log(" Ctrl+C 停止");await s(async e=>{process.exitCode="SIGINT"===e?130:143,await a.close().catch(e=>o.warn(`停止示例 MCP 服务失败:${String(e)}`))})}function p(o,e=process){return new Promise(t=>{let r=!1;function s(s){r||(r=!0,o(s).finally(()=>{e.off("SIGINT",n),e.off("SIGTERM",i),t()}))}function n(){s("SIGINT")}function i(){s("SIGTERM")}e.once("SIGINT",n),e.once("SIGTERM",i)})}export default function(){return new t("demo").description("启动内置 MCP 示例服务").usage("[options] [demo]\n\n示例:\n dbx mcp demo taxi").addArgument(new r("[demo]","示例名称").choices(n)).option("--host <host>","监听地址","127.0.0.1").addOption(new s("--port <port>","监听端口;0 表示自动选择空闲端口").default(0).argParser(o)).action(async(o,t,r)=>e(r,e=>l(e,o,t)))};export{c as resolveMcpDemo,l as runMcpDemo,p as waitForShutdown};
@@ -1,2 +1,2 @@
1
- import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./7945.js";import"./yaml.js";import{GatewayResponseError as t,verifyYAML as s}from"./app.js";import{resolveProjectLayout as i,runtime_skill_layout_resolveRuntimeSkillLayout as a}from"./project-layout.js";import{isRecord as r}from"./2168.js";class n extends Error{exitCode=1;logId;details;constructor(e){let t,s;super((s=(t=e.errors[0])?`: ${t.message}`:"",`manifest validation failed for dbx dev${s}`)),this.name="DevManifestValidationError",this.logId=e.log_id;let{manifest:i,...a}=e;this.details=a}}class o extends Error{exitCode=1;logId;details;constructor(e){let t=e.errors[0],s=t?`: ${t.message}`:"";super(`business templates validation failed for dbx dev${s}`),this.name="DevBusinessTemplatesValidationError",this.logId=e.log_id;let{manifest:i,...a}=e;this.details=a}}let d={"dev.manifest.parse_failed":e=>`Manifest 无法解析:${e.path??"未知路径"};将跳过 simulator manifest 并继续启动`,"dev.manifest.invalid_root":e=>`Manifest 内容必须是对象:${e.path??"未知路径"};将跳过 simulator manifest 并继续启动`,"dev.manifest.app_key_missing":e=>`Manifest 未配置 app_key:${e.path??"未知路径"};将由 Kit 从前端工程配置解析 AppID`,"dev.manifest.not_found":e=>`未找到 Manifest 文件:${e.path??"未知路径"};将跳过 simulator manifest 并继续启动`,"dev.manifest.not_ready":()=>"Manifest 未就绪","dev.manifest.validation_failed":e=>`Manifest 校验未通过${e.message?`:${e.message}`:""}`,"dev.manifest.validation_http_error":e=>{var t,s;return`Manifest 校验服务异常${void 0===(t=e.httpStatus)?"":`(HTTP ${t})`}${(s=e.logId)?`,log_id: ${s}`:""}`},"dev.manifest.validation_service_error":e=>{var t;return`${e.message??"Manifest 校验服务返回错误"}${void 0===(t=e.serviceCode)?"":`(错误码 ${t})`}`},"dev.skill.not_found":e=>`未找到 Skill 文件:${e.path??"未知路径"};将跳过 simulator skill 并继续启动`,"dev.mcp.not_configured":()=>"MCP 未配置服务地址","dev.mcp.confirm_connection":()=>"请确认 MCP 已连接"};function l(e){let t=!e.manifestReady||!e.mcpEndpointSet,s=[...e.warnings];if(e.manifestReady||s.some(e=>"manifest"===e.source)||s.push({code:"dev.manifest.not_ready",source:"manifest"}),e.mcpEndpointSet?t&&!s.some(e=>"mcp"===e.source)&&s.push({code:"dev.mcp.confirm_connection",source:"mcp"}):s.push({code:"dev.mcp.not_configured",source:"mcp"}),0!==s.length)return`${t?"暂无法调试":"启动提醒"}:${s.map(m).join(";")}`}function m(e){let t=d[e.code];return t?t(e):e.message?e.message:`${e.source} warning (${e.code})`}let c=e("node:fs"),f=e("node:path"),p=e("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js"),u="DOUBAO_SIMULATOR_MCP_ENDPOINT";function v(e){let t=e?.permissions;return void 0===t?void 0:Object.values(t).map(({scope_name:e,description:t})=>({scope_name:e,description:t}))}async function _(e){let t,s=c.readFileSync(e,"utf8");if(!s.trim())throw Error(`business-templates.yaml is empty: ${e}`);try{t=p.qg(s)}catch(s){let t=s instanceof Error?s.message:String(s);throw Error(`invalid business-templates.yaml: ${e}: ${t}`)}if(!r(t))throw Error(`business-templates.yaml content must be an object: ${e}`);return await $(e),{file:e,validated:!0}}async function h(e){let s;try{s=p.qg(c.readFileSync(e,"utf8"))}catch{return{usable:!1,validated:!1,warnings:[{code:"dev.manifest.parse_failed",source:"manifest",path:e}]}}if(!r(s))return{usable:!1,validated:!1,warnings:[{code:"dev.manifest.invalid_root",source:"manifest",path:e}]};let i=[],a="string"==typeof s.app_key?s.app_key.trim():void 0;a||i.push({code:"dev.manifest.app_key_missing",source:"manifest",path:e});let o=s,d=!1;try{let t=await S(e);d=!0,r(t.manifest)&&(o=t.manifest)}catch(e){i.push(function(e){var s;if(e instanceof t)return{code:void 0!==e.httpStatus?"dev.manifest.validation_http_error":"dev.manifest.validation_service_error",source:"manifest",serviceCode:e.serviceCode,httpStatus:e.httpStatus,message:e.serviceMessage,logId:e.logId};let i=e instanceof n?e.details.errors[0]:void 0;return i?{source:"manifest",code:i.code,path:i.path,message:i.message}:{code:"dev.manifest.validation_failed",source:"manifest",message:(s=e)instanceof Error?s.message:String(s)}}(e))}return{...a?{appId:a}:{},manifest:o,usable:!0,validated:d,warnings:i}}function g(e){let t=i(e.projectPath),s=e.manifest?.trim(),r=s?E(e.projectPath,s):t.manifestPath,n=e.skill?.trim(),o=n?E(e.projectPath,n):t.skillDirectory,d=[],l=[],m=c.existsSync(r),p=f.join(f.dirname(r),"business-templates.yaml"),u=c.existsSync(p),v=n?a(o):t.skillResolution;if(m?c.statSync(r).isFile()||d.push(`manifest path must be a file: ${r}`):l.push({code:"dev.manifest.not_found",source:"manifest",path:r}),u&&!c.statSync(p).isFile()&&d.push(`business templates path must be a file: ${p}`),"missing"===v.layout?d.push(`skill directory contains no runtime Skill: ${o}; add at least one regular file named SKILL.md anywhere under the selected directory`):"invalid"===v.layout&&d.push(v.error??`invalid Skill layout: ${o}`),d.length>0)throw Error(`dbx dev path check failed:
2
- ${d.join("\n")}`);return{...u?{businessTemplatesPath:p}:{},...m?{simulatorManifestPath:r}:{},..."resolved"===v.layout?{skillsDirectory:o}:{},warnings:l}}async function y(e=process.env,t,s,i){let a=t?.trim();if(a)return M(a,"--mcp-endpoint");let r=e[u]?.trim();return r?M(r,u):s?w(s,i):void 0}async function S(e){let t=await s(c.readFileSync(e,"utf8"),"compatible"),i=t.data,a={file:e,valid:!!i?.success,manifest:i?.manifest,errors:b(i?.errors??[]),warnings:b(i?.warnings??[]),log_id:t.log_id??""};if(!a.valid)throw new n(a);return a}async function $(e){let t=await s(c.readFileSync(e,"utf8"),"compatible","business_templates"),i=t.data,a={file:e,valid:!!i?.success,errors:b(i?.errors??[]),warnings:b(i?.warnings??[]),log_id:t.log_id??""};if(!a.valid)throw new o(a);return a}async function w(e,t){let s=t??(await S(e)).manifest,i=r(s)&&r(s.mcp_server)?s.mcp_server:void 0,a=i?.end_point;if("string"==typeof a&&a.trim())return M(a.trim(),"manifest.mcp_server.end_point")}function b(e){return e.map(e=>({code:e.code,path:e.path,message:e.message}))}function M(e,t){try{let t=new URL(e);if("http:"===t.protocol||"https:"===t.protocol)return e}catch{}throw Error(`dbx dev ${t} must be an http(s) URL: ${e}`)}function E(e,t){let s=t.trim();if(!s)throw Error("path must not be empty");return f.resolve(e,s)}export{v as extractDevPermissions,l as formatFinalDevWarnings,_ as prepareDevBusinessTemplates,h as prepareDevManifest,y as resolveDevMcpEndpoint,g as resolveDevSimulatorPaths,S as validateDevManifest};
1
+ import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./1264.js";import"./yaml.js";import{isRecord as t}from"./2232.js";import{GatewayResponseError as s,verifyYAML as i}from"./app.js";import{resolveProjectLayout as r,resolveRuntimeSkillLayout as a}from"./project-layout.js";function n(e){if(t(e))switch(e.code){case"NOT_LOGGED_IN":return"尚未登录豆包开发者平台,请运行 `dbx auth login` 后重试。";case"TOKEN_EXPIRED":return"豆包开发者平台登录已过期,请运行 `dbx auth login` 后重试。";default:return}}class o extends Error{exitCode=1;logId;details;constructor(e){let t,s;super((s=(t=e.errors[0])?`: ${t.message}`:"",`dbx dev Manifest 校验失败${s}`)),this.name="DevManifestValidationError",this.logId=e.log_id;let{manifest:i,...r}=e;this.details=r}}class d extends Error{exitCode=1;logId;details;constructor(e){let t=e.errors[0],s=t?`: ${t.message}`:"";super(`dbx dev 业务模板校验失败${s}`),this.name="DevBusinessTemplatesValidationError",this.logId=e.log_id;let{manifest:i,...r}=e;this.details=r}}let l={"dev.manifest.parse_failed":e=>`Manifest 无法解析:${e.path??"未知路径"};将跳过模拟器的 Manifest 配置并继续启动`,"dev.manifest.invalid_root":e=>`Manifest 内容必须是对象:${e.path??"未知路径"};将跳过模拟器的 Manifest 配置并继续启动`,"dev.manifest.app_key_missing":e=>`Manifest 未配置 app_key:${e.path??"未知路径"};将由 Kit 从前端工程配置解析 AppID`,"dev.manifest.not_found":e=>`未找到 Manifest 文件:${e.path??"未知路径"};将跳过模拟器的 Manifest 配置并继续启动`,"dev.manifest.not_ready":()=>"Manifest 未就绪","dev.manifest.validation_failed":e=>`Manifest 校验未通过${e.message?`:${e.message}`:""}`,"dev.manifest.validation_http_error":e=>{var t,s;return`Manifest 校验服务异常${void 0===(t=e.httpStatus)?"":`(HTTP ${t})`}${(s=e.logId)?`,log_id: ${s}`:""}`},"dev.manifest.validation_service_error":e=>{var t;return`${e.message??"Manifest 校验服务返回错误"}${void 0===(t=e.serviceCode)?"":`(错误码 ${t})`}`},"dev.skill.not_found":e=>`未找到 Skill 文件:${e.path??"未知路径"};将跳过模拟器的 Skill 配置并继续启动`,"dev.mcp.not_configured":()=>"MCP 未配置服务地址"};function m(e){let t=!e.manifestReady||!e.mcpEndpointSet,s=[...e.warnings];if(e.manifestReady||s.some(e=>"manifest"===e.source)||s.push({code:"dev.manifest.not_ready",source:"manifest"}),e.mcpEndpointSet||s.push({code:"dev.mcp.not_configured",source:"mcp"}),0!==s.length)return`${t?"暂无法调试":"启动提醒"}:${s.map(f).join(";")}`}function f(e){let t=l[e.code];return t?t(e):e.message?e.message:`${e.source} 警告(${e.code})`}let c=e("node:fs"),u=e("node:path"),p=e("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js"),_="DOUBAO_SIMULATOR_MCP_ENDPOINT";function v(e){let t=e?.permissions;return void 0===t?void 0:Object.values(t).map(({scope_name:e,description:t})=>({scope_name:e,description:t}))}async function h(e){let s,i=c.readFileSync(e,"utf8");if(!i.trim())throw Error(`business-templates.yaml 内容为空:${e}`);try{s=p.qg(i)}catch(s){let t=s instanceof Error?s.message:String(s);throw Error(`business-templates.yaml 无效:${e}: ${t}`)}if(!t(s))throw Error(`business-templates.yaml 内容必须是对象:${e}`);return await M(e),{file:e,validated:!0}}async function g(e){let i;try{i=p.qg(c.readFileSync(e,"utf8"))}catch{return{usable:!1,validated:!1,warnings:[{code:"dev.manifest.parse_failed",source:"manifest",path:e}]}}if(!t(i))return{usable:!1,validated:!1,warnings:[{code:"dev.manifest.invalid_root",source:"manifest",path:e}]};let r=[],a="string"==typeof i.app_key?i.app_key.trim():void 0;a||r.push({code:"dev.manifest.app_key_missing",source:"manifest",path:e});let d=i,l=!1;try{let s=await $(e);l=!0,t(s.manifest)&&(d=s.manifest)}catch(e){r.push(function(e){var t;let i=n(e);if(i)return{code:"dev.manifest.auth_failed",source:"manifest",message:i};if(e instanceof s)return{code:void 0!==e.httpStatus?"dev.manifest.validation_http_error":"dev.manifest.validation_service_error",source:"manifest",serviceCode:e.serviceCode,httpStatus:e.httpStatus,message:e.serviceMessage,logId:e.logId};let r=e instanceof o?e.details.errors[0]:void 0;return r?{source:"manifest",code:r.code,path:r.path,message:r.message}:{code:"dev.manifest.validation_failed",source:"manifest",message:(t=e)instanceof Error?t.message:String(t)}}(e))}return{...a?{appId:a}:{},manifest:d,usable:!0,validated:l,warnings:r}}function y(e){let t=r(e.projectPath),s=e.manifest?.trim(),i=s?C(e.projectPath,s):t.manifestPath,n=e.skill?.trim(),o=n?C(e.projectPath,n):t.skillDirectory,d=[],l=[],m=c.existsSync(i),f=u.join(u.dirname(i),"business-templates.yaml"),p=c.existsSync(f),_=n?a(o):t.skillResolution;if(m?c.statSync(i).isFile()||d.push(`Manifest 路径必须指向文件:${i}`):l.push({code:"dev.manifest.not_found",source:"manifest",path:i}),p&&!c.statSync(f).isFile()&&d.push(`业务模板路径必须指向文件:${f}`),"missing"===_.layout?d.push(`Skill 目录中未找到运行时 Skill:${o}; 请在所选目录或其子目录中添加至少一个名为 SKILL.md 的普通文件`):"invalid"===_.layout&&d.push(_.error??`Skill 目录结构无效:${o}`),d.length>0)throw Error(`dbx dev 路径检查失败:
2
+ ${d.join("\n")}`);return{...p?{businessTemplatesPath:f}:{},...m?{simulatorManifestPath:i}:{},..."resolved"===_.layout?{skillsDirectory:o}:{},warnings:l}}async function S(e=process.env,t,s,i){let r=t?.trim();if(r)return P(r,"--mcp-endpoint");let a=e[_]?.trim();return a?P(a,_):s?E(s,i):void 0}async function $(e){let t=await i(c.readFileSync(e,"utf8"),"compatible"),s=t.data,r={file:e,valid:!!s?.success,manifest:s?.manifest,errors:w(s?.errors??[]),warnings:w(s?.warnings??[]),log_id:t.log_id??""};if(!r.valid)throw new o(r);return r}async function M(e){let t=await i(c.readFileSync(e,"utf8"),"compatible","business_templates"),s=t.data,r={file:e,valid:!!s?.success,errors:w(s?.errors??[]),warnings:w(s?.warnings??[]),log_id:t.log_id??""};if(!r.valid)throw new d(r);return r}async function E(e,s){let i=s??(await $(e)).manifest,r=t(i)&&t(i.mcp_server)?i.mcp_server:void 0,a=r?.end_point;if("string"==typeof a&&a.trim())return P(a.trim(),"manifest.mcp_server.end_point")}function w(e){return e.map(e=>({code:e.code,path:e.path,message:e.message}))}function P(e,t){try{let t=new URL(e);if("http:"===t.protocol||"https:"===t.protocol)return e}catch{}throw Error(`dbx dev ${t} 必须是 HTTP HTTPS 地址:${e}`)}function C(e,t){let s=t.trim();if(!s)throw Error("路径不能为空");return u.resolve(e,s)}export{v as extractDevPermissions,m as formatFinalDevWarnings,n as getAuthErrorMessage,h as prepareDevBusinessTemplates,g as prepareDevManifest,S as resolveDevMcpEndpoint,y as resolveDevSimulatorPaths,$ as validateDevManifest};