@doubao-dev/cli 0.0.31 → 0.0.33

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 (92) hide show
  1. package/dist/2168.js +16 -16
  2. package/dist/275.js +12 -14
  3. package/dist/2932.js +1 -1
  4. package/dist/318.js +1 -1
  5. package/dist/3974.js +22 -22
  6. package/dist/4525.js +1 -1
  7. package/dist/4880.js +1 -1
  8. package/dist/4931.js +2 -2
  9. package/dist/7410.js +1 -1
  10. package/dist/7417.js +204 -0
  11. package/dist/7417.js.LICENSE.txt +107 -0
  12. package/dist/7945.js +1 -0
  13. package/dist/8079.js +126 -0
  14. package/dist/{1560.js → 9091.js} +2 -2
  15. package/dist/9667.js +78 -0
  16. package/dist/{8891.js.LICENSE.txt → 9667.js.LICENSE.txt} +0 -108
  17. package/dist/@byted-doubao-apps/create.js +1 -1
  18. package/dist/@byted-doubao-apps/kit.js +1 -0
  19. package/dist/@byted-doubao-apps/login.js +1 -1
  20. package/dist/@byted-doubao-apps/login~1.js +1 -1
  21. package/dist/@byted-doubao-apps/template-empty/package.json +3 -3
  22. package/dist/@byted-doubao-apps/template-starter/package.json +3 -3
  23. package/dist/@byted-hdt/cli.js +1 -1
  24. package/dist/@inquirer/select.js +1 -1
  25. package/dist/app.js +1 -1
  26. package/dist/assets/web-sdk-debugger/__doubao_web_sdk_native_modules/applet-bridge-module-core.js +1 -1
  27. package/dist/assets/web-sdk-debugger/index.html +1 -1
  28. package/dist/assets/web-sdk-debugger/static/js/index.d1bb36b355.js +44 -0
  29. package/dist/assets/web-sdk-debugger/wsd/doubao-apps-api.template.js +0 -0
  30. package/dist/assets/web-sdk-debugger/wsd/doubao-apps-framework.template.js +0 -0
  31. package/dist/build.js +1 -1
  32. package/dist/build~1.js +6 -6
  33. package/dist/check.js +1 -1
  34. package/dist/demo-server.js +1 -1
  35. package/dist/dev-config.js +1 -1
  36. package/dist/dev-shell.js +1 -1
  37. package/dist/dev.js +10 -10
  38. package/dist/devtools.js +1 -1
  39. package/dist/gen-explore.js +1 -1
  40. package/dist/gen-trajectory.js +1 -1
  41. package/dist/init.js +4 -4
  42. package/dist/ink.js +1 -1
  43. package/dist/inquirer.js +1 -0
  44. package/dist/json-file.js +1 -1
  45. package/dist/kit-dev-options.js +1 -1
  46. package/dist/legacy-upload.js +1 -1
  47. package/dist/lepus.js +1 -1
  48. package/dist/ora.js +1 -1
  49. package/dist/project-layout.js +1 -1
  50. package/dist/prompt.js +1 -1
  51. package/dist/prompts.js +1 -1
  52. package/dist/report.js +1 -1
  53. package/dist/run-registry.js +1 -1
  54. package/dist/run.js +44 -44
  55. package/dist/sandbox.js +1 -1
  56. package/dist/scan.js +1 -1
  57. package/dist/sdk.js +63 -188
  58. package/dist/sdk~1.js +50 -50
  59. package/dist/server.js +1 -1
  60. package/dist/skill.js +1 -1
  61. package/dist/skills.js +1 -1
  62. package/dist/skills~1.js +2 -1
  63. package/dist/static/assets/web-view-proxy-bootstrap.js +1 -0
  64. package/dist/static/assets/web-view-proxy-page-client.js +1 -1
  65. package/dist/static/assets/web-view-proxy-service-worker.js +1 -1
  66. package/dist/status~1.js +1 -1
  67. package/dist/stop.js +1 -1
  68. package/dist/sync.js +1 -1
  69. package/dist/templates/README.md +0 -1
  70. package/dist/update.js +1 -1
  71. package/dist/workspace.js +1 -1
  72. package/dist/wrapper.js +1 -0
  73. package/dist/yaml.js +1 -1
  74. package/package.json +2 -2
  75. package/skills/dbx-eval/SKILL.md +15 -7
  76. package/skills/doubao-agentic-service-development/SKILL.md +1 -1
  77. package/skills/doubao-agentic-service-development/references/auth.md +1 -1
  78. package/skills/doubao-agentic-service-development/references/dev-debug.md +3 -3
  79. package/skills/doubao-agentic-service-development/references/frontend/components/map-canvas.md +1 -1
  80. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/07-/347/225/214/351/235/242.md +0 -6
  81. package/skills/doubao-agentic-service-development/references/frontend/guides/debugger-mcp.md +2 -2
  82. package/skills/doubao-agentic-service-development/references/frontend/widget-templates/props.md +1 -1
  83. package/skills/doubao-agentic-service-development/references/frontend-dev.md +3 -3
  84. package/skills/doubao-agentic-service-development/references/local-debug/overview.md +2 -2
  85. package/skills/doubao-agentic-service-development/references/overview.md +16 -31
  86. package/skills/doubao-agentic-service-development/scripts/workspace.py +6 -89
  87. package/dist/180.js +0 -1
  88. package/dist/8891.js +0 -280
  89. package/dist/9635.js +0 -1
  90. package/dist/assets/web-sdk-debugger/static/js/index.75528d6de7.js +0 -26
  91. package/dist/dbx.js +0 -3
  92. package/dist/skills~2.js +0 -2
package/dist/build.js CHANGED
@@ -1 +1 @@
1
- import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./ora.js";import{withCliErrorCode as t,CliUsageError as i,parsePositiveInteger as o,runCommand as r,command_Command as a,option_Option as _,CliError as n}from"./2168.js";import{resolveProjectAppId as s}from"./project.js";import{waitForArtifactStatus as l,logArtifactBuildFailure as d,logArtifactDebugInstructions as u,queryArtifactStatus as p}from"./status~1.js";import{uploadArtifacts as c}from"./build~1.js";import{normalizeAppVersionTag as f}from"./app.js";var g={};e.r(g),e.d(g,{default:()=>R});let m=e("../../../node_modules/.pnpm/ora@5.4.1/node_modules/ora/index.js");var v=e.n(m);let b={queued:"排队中",building:"构建中",succeeded:"成功",failed:"失败",unknown:"未知"};async function w(e,i,o=c,r=l){let a=s(i.project);e.targetAppId=a,e.log("正在检查应用级平台配置;同步后的配置不会随应用版本回滚");let _=e.json?void 0:v()("正在准备构建...").start(),p=await t("DBX_UPLOAD_FAILED",()=>o(e,{appId:a,project:i.project,release:!!i.release,appVersionTag:"string"==typeof i.release?i.release:void 0,quiet:!0})).finally(()=>_?.stop()),f=p.version_tag;if(!f)throw new n("Build submission returned no version",{code:"DBX_UPLOAD_FAILED"});let g={operation:"build",app_id:a,version_tag:f,version_kind:i.release?"release":"test",state:"queued",terminal:!1,uploaded_artifacts:p.uploaded_artifacts,packages:p.packages,config_sync_results:p.uploaded_artifacts.includes("business_templates")?[{config_type:"business-templates",scope:"app",state:"succeeded",rolled_back_with_version:!1,result:p.business_template_sync_result}]:[],version_detail_url:p.next?.version_detail_url,next_actions:[{purpose:"check_build_status",argv:["dbx","--json","build","status",f,"--project",i.project]}],log_id:p.log_id};if(!i.wait)return C(e,g),g;_?.start("正在等待云端构建...");let m=await t("DBX_REMOTE_ERROR",()=>r(a,f,i.timeoutSeconds)).finally(()=>_?.stop()),b={...g,...E(m),version_detail_url:m.version_detail_url??g.version_detail_url,next_actions:[]};if(C(e,b),d(e,m),u(e,m),"failed"===b.state)throw new n("Cloud build failed",{code:"DBX_BUILD_FAILED",details:b,logId:m.log_id});return b}async function S(e,i,o,r=p){let a=s(i);e.targetAppId=a;let _=await t("DBX_REMOTE_ERROR",()=>r(a,o,0)),n={operation:"build.status",...E(_)};return C(e,n),d(e,_),u(e,_),n}function A(e){try{let t=f(e);if(t)return t}catch{}throw new i(`正式版本号 ${JSON.stringify(e.trim())} 格式不正确。请使用三段纯数字,例如 1.2.3;不要添加 v 前缀或预发布后缀。`,"DBX_VERSION_TAG_INVALID")}function E(e){let t=e.status;return{app_id:e.app_id,version_tag:e.version_tag,state:t,terminal:"succeeded"===t||"failed"===t,provider_status:e.artifact_status,status_description:e.artifact_status_description,version_detail_url:e.version_detail_url,app_detail_url:e.app_detail_url,doubao_debug_conversation_url:e.doubao_debug_conversation_url,build_error:e.artifact_build_error_info,error_info_file:e.error_info_file,log_id:e.log_id}}function C(e,t){e.log(`构建状态: ${b[t.state]??t.state}`),e.log(`AppID: ${t.app_id}`),e.log(`版本号: ${t.version_tag}`),t.log_id&&e.log(`log_id: ${t.log_id}`),"succeeded"!==t.state&&t.version_detail_url&&e.log(`版本详情: ${t.version_detail_url}`),t.config_sync_results?.length&&e.log("应用级平台配置已同步;这些配置不会随应用版本回滚")}function R(){let e=D(new a("build").description("上传并触发云构建")).addOption(new _("--release [version]","构建正式版本,可指定版本号(如 1.2.3)").argParser(A)).option("--no-wait","提交后直接返回,不等待构建完成").addOption(new _("--timeout-seconds <seconds>","等待构建的最长时间(秒)").default(300).argParser(o)).addHelpText("after","\n默认构建测试版本;加 --release 构建正式版本,版本号留空时自动生成。\n构建不会自动提审或发布。平台配置会一并同步,不随版本回滚。\n").action(async(e,t)=>r(t,o=>((function(e,t){if(!t.wait&&"cli"===e.getOptionValueSourceWithGlobals("timeoutSeconds"))throw new i("--timeout-seconds cannot be used with --no-wait")})(t,e),w(o,e))));return e.addCommand(D(new a("status").description("查看构建状态").argument("<version>","版本号")).action(async(e,t,i)=>r(i,t=>S(t,i.optsWithGlobals().project,e)))),e}function D(e){return e.option("--project <path>","项目目录",".")}export{g as build_namespaceObject};
1
+ import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./ora.js";import{withCliErrorCode as t,CliUsageError as o,parsePositiveInteger as i,runCommand as r,command_Command as n,option_Option as a,CliError as s}from"./2168.js";import{resolveProjectAppId as _}from"./project.js";import{waitForArtifactStatus as l,logArtifactBuildFailure as d,logArtifactDebugInstructions as u,queryArtifactStatus as p}from"./status~1.js";import{uploadArtifacts as c}from"./build~1.js";import{normalizeAppVersionTag as f}from"./app.js";var g={};e.r(g),e.d(g,{default:()=>R});let v=e("../../../node_modules/.pnpm/ora@5.4.1/node_modules/ora/index.js");var m=e.n(v);let b={queued:"排队中",building:"构建中",succeeded:"成功",failed:"失败",unknown:"未知"};async function w(e,o,i=c,r=l){let n=_(o.project);e.targetAppId=n,e.log("正在检查应用级平台配置;同步后的配置不会随应用版本回滚");let a=e.json?void 0:m()("正在准备构建...").start(),p=await t("DBX_UPLOAD_FAILED",()=>i(e,{appId:n,project:o.project,release:!!o.release,appVersionTag:"string"==typeof o.release?o.release:void 0,quiet:!0,env:o.env,secretEnv:o.secretEnv})).finally(()=>a?.stop()),f=p.version_tag;if(!f)throw new s("Build submission returned no version",{code:"DBX_UPLOAD_FAILED"});let g={operation:"build",app_id:n,version_tag:f,version_kind:o.release?"release":"test",state:"queued",terminal:!1,uploaded_artifacts:p.uploaded_artifacts,packages:p.packages,config_sync_results:p.uploaded_artifacts.includes("business_templates")?[{config_type:"business-templates",scope:"app",state:"succeeded",rolled_back_with_version:!1,result:p.business_template_sync_result}]:[],version_detail_url:p.next?.version_detail_url,next_actions:[{purpose:"check_build_status",argv:["dbx","--json","build","status",f,"--project",o.project]}],log_id:p.log_id};if(!o.wait)return C(e,g),g;a?.start("正在等待云端构建...");let v=await t("DBX_REMOTE_ERROR",()=>r(n,f,o.timeoutSeconds)).finally(()=>a?.stop()),b={...g,...A(v),version_detail_url:v.version_detail_url??g.version_detail_url,next_actions:[]};if(C(e,b),d(e,v),u(e,v),"failed"===b.state)throw new s("Cloud build failed",{code:"DBX_BUILD_FAILED",details:b,logId:v.log_id});return b}async function E(e,o,i,r=p){let n=_(o);e.targetAppId=n;let a=await t("DBX_REMOTE_ERROR",()=>r(n,i,0)),s={operation:"build.status",...A(a)};return C(e,s),d(e,a),u(e,a),s}function S(e){try{let t=f(e);if(t)return t}catch{}throw new o(`正式版本号 ${JSON.stringify(e.trim())} 格式不正确。请使用三段纯数字,例如 1.2.3;不要添加 v 前缀或预发布后缀。`,"DBX_VERSION_TAG_INVALID")}function A(e){let t=e.status;return{app_id:e.app_id,version_tag:e.version_tag,state:t,terminal:"succeeded"===t||"failed"===t,provider_status:e.artifact_status,status_description:e.artifact_status_description,version_detail_url:e.version_detail_url,app_detail_url:e.app_detail_url,doubao_debug_conversation_url:e.doubao_debug_conversation_url,build_error:e.artifact_build_error_info,error_info_file:e.error_info_file,log_id:e.log_id}}function C(e,t){e.log(`构建状态: ${b[t.state]??t.state}`),e.log(`AppID: ${t.app_id}`),e.log(`版本号: ${t.version_tag}`),t.log_id&&e.log(`log_id: ${t.log_id}`),"succeeded"!==t.state&&t.version_detail_url&&e.log(`版本详情: ${t.version_detail_url}`),t.config_sync_results?.length&&e.log("应用级平台配置已同步;这些配置不会随应用版本回滚")}function R(){let e=h(new n("build").description("上传并触发云构建")).addOption(new a("--release [version]","构建正式版本,可指定版本号(如 1.2.3)").argParser(S)).option("--no-wait","提交后直接返回,不等待构建完成").option("--env <path>","构建变量文件;真实文件名须以 .env 开头,相对 --project 解析").option("--secret-env <path>","秘密构建变量文件;覆盖 --env 中的同名变量").addOption(new a("--timeout-seconds <seconds>","等待构建的最长时间(秒)").default(300).argParser(i)).addHelpText("after","\n默认构建测试版本;加 --release 构建正式版本,版本号留空时自动生成。\n构建不会自动提审或发布。平台配置会一并同步,不随版本回滚。\n").action(async(e,t)=>r(t,i=>((function(e,t){if(!t.wait&&"cli"===e.getOptionValueSourceWithGlobals("timeoutSeconds"))throw new o("--timeout-seconds cannot be used with --no-wait")})(t,e),w(i,e))));return e.addCommand(h(new n("status").description("查看构建状态").argument("<version>","版本号")).action(async(e,t,o)=>r(o,t=>E(t,o.optsWithGlobals().project,e)))),e}function h(e){return e.option("--project <path>","项目目录",".")}export{g as build_namespaceObject};
package/dist/build~1.js CHANGED
@@ -1,12 +1,12 @@
1
- import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./yaml.js";import"./9635.js";import{getLastHttpResponseLogId as t,CliError as r,isRecord as i}from"./2168.js";import{uploadMiniAppVersionDraftPackage as n,verifyYAML as s,submitMiniAppVersionDraft as a,uploadMiniAppVersionDraftSourceCode as o,normalizeAppVersionTag as l}from"./app.js";import{remoteFileName as u,sourceTypeForWorkspaceFileType as p,describeWorkspaceUpload as d,resolveAppKey as c}from"./workspace.js";import{requireRuntimeSkillEntries as f,resolveProjectLayout as _}from"./project-layout.js";import{miniAppVersionDetailUrl as m}from"./portal.js";let h=e("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js");function g(e){if(!i(e))return;let t=i(e.mcp_server)?e.mcp_server:void 0,r=t?.end_point;return"string"==typeof r&&r.trim()?r:void 0}function y(e,t,r){return{checked:!0,endpoint:e,cloud_reachable:!1,reason:t,message:r}}function v(e){let t=e.split(".");if(4!==t.length)return;let r=t.map(e=>Number(e));if(!r.some(e=>!Number.isInteger(e)||e<0||e>255))return r}let w=e("node:fs"),b=e("node:util");async function E(e,t={}){let r=k(e),i={cwd:r};try{await U({action:"build",appDir:r,appId:t.appId})}catch(e){throw new C(r,e,i)}return i}async function I(e,t){let r=k(e),i={cwd:r,output_dir:t},n="";try{i.archive_path=n=(await U({action:"cloudPackage",appDir:r,outputDir:t})).archivePath||""}catch(e){throw new $(r,e,i)}if(!n)throw new $(r,Error("DoubaoAppsSDK.cloudPackage did not return an archive path"),i);return n}function k(e){if(!(0,w.existsSync)(e))throw Error(`frontend_code path not found: ${e}`);if((0,w.statSync)(e).isFile())throw Error(`frontend_code must be a directory: ${e}`);return(0,w.realpathSync)(e)}async function U(e){let t,r,n,s,a=process.cwd(),o={CI:process.env.CI,FORCE_COLOR:process.env.FORCE_COLOR,NO_COLOR:process.env.NO_COLOR},l=(t=[],r=[],n=process.stdout.write,s=process.stderr.write,process.stdout.write=L(t),process.stderr.write=L(r),{result(){let e=S({stdout:t.join(""),stderr:r.join("")});return{...e,...e.stdout||e.stderr?{output:P([e.stdout,e.stderr].filter(Boolean).join("\n"))}:{}}},restore(){process.stdout.write=n,process.stderr.write=s}});try{process.chdir(e.appDir),process.env.CI="true",process.env.FORCE_COLOR="0",process.env.NO_COLOR="1";let{DoubaoAppsSDK:t}=await import("./sdk.js"),r=new t(e.appDir);if("build"===e.action)return await r.build(e.appId?{appId:e.appId}:void 0),l.result();let i=await r.cloudPackage({outputDir:e.outputDir});return{...l.result(),archivePath:i}}catch(t){let e=l.result();throw i(t)&&Object.assign(t,e),t}finally{l.restore(),process.chdir(a),function(e){for(let[t,r]of Object.entries(e))void 0===r?delete process.env[t]:process.env[t]=r}(o)}}function L(e){return(t,r,i)=>{e.push("string"==typeof t?t:Buffer.from(t).toString("string"==typeof r?r:"utf8"));let n="function"==typeof r?r:i;return n?.(),!0}}function S(e){let t=P(e.stdout),r=P(e.stderr),i=P(e.output);return{...t?{stdout:t}:{},...r?{stderr:r}:{},...i?{output:i}:{}}}class C extends Error{exitCode=1;details;constructor(e,t,r){var i;let n,s=x(t),a=r?.stdout||s.stdout,o=r?.stderr||s.stderr,l=j(r?.output||s.output||o||a),u={code:"frontend_build_check_failed",cwd:r?.cwd||e,...void 0===s.exitCode?{}:{exit_code:s.exitCode},...s.signal?{signal:s.signal}:{},...s.shortMessage?{short_message:s.shortMessage}:{},...s.originalMessage?{original_message:s.originalMessage}:{},...l?{output:l}:{}};super((n=(i=u).output||i.stderr||i.stdout||i.short_message||i.original_message||"unknown build failure",["frontend build check failed",`cwd: ${i.cwd}`,"build output:",n].join("\n"))),this.name="FrontendBuildCheckError",this.details=u}}class $ extends Error{exitCode=1;details;constructor(e,t,r){var i;let n,s=x(t),a=r?.stdout||s.stdout,o=r?.stderr||s.stderr,l=j(r?.output||s.output||o||a),u={code:"frontend_package_failed",cwd:r?.cwd||e,output_dir:r?.output_dir??"",...r?.archive_path?{archive_path:r.archive_path}:{},...void 0===s.exitCode?{}:{exit_code:s.exitCode},...s.signal?{signal:s.signal}:{},...s.shortMessage?{short_message:s.shortMessage}:{},...s.originalMessage?{original_message:s.originalMessage}:{},...l?{output:l}:{}};super((n=(i=u).output||i.stderr||i.stdout||i.short_message||i.original_message||"unknown package failure",["frontend package failed",`cwd: ${i.cwd}`,"package output:",n].join("\n"))),this.name="FrontendPackageError",this.details=u}}function x(e){if(!i(e))return{output:String(e)};let t=S({stdout:e.stdout,stderr:e.stderr,output:e.all??e.output}),r=!!(t.stdout||t.stderr||t.output);return{exitCode:"number"==typeof e.exitCode?e.exitCode:void 0,signal:"string"==typeof e.signal?e.signal:void 0,shortMessage:r||"string"!=typeof e.shortMessage?void 0:e.shortMessage,originalMessage:"string"==typeof e.originalMessage?e.originalMessage:r||"string"!=typeof e.message?void 0:e.message,...t}}function P(e){let t=Buffer.isBuffer(e)?e.toString("utf8"):"string"==typeof e?e:"";return(0,b.stripVTControlCharacters)(t).replace(/\r\n/g,"\n").replace(/\r/g,"\n").split("\n").map(e=>e.trimEnd()).join("\n").trim()||void 0}function j(e){let t,r=P(e);if(!r)return;let i=(t=[r.search(/(^|\n)error\s+Build error:/i),r.search(/(^|\n)Build error:/i),r.search(/(^|\n)File:\s/i),r.search(/(^|\n)\s*[×x]\s+.*TS\d+:/i)].filter(e=>e>=0)).length>0?Math.min(...t):-1,n=i>=0?r.slice(i).trim():r;return n.length<=4e3?n:`${n.slice(0,4e3).trimEnd()}
2
- ... output truncated ...`}let M=e("node:path");async function O(e,r){let n=l(r.appVersionTag);if(r.businessTemplatesOnly&&(r.release||n))throw Error("--release cannot be used with --business-templates-only because this mode does not submit a version");let s=_(r.project),o=F(r.project,r.manifest,s.manifestPath),p=F(r.project,r.skill,s.skillDirectory),d=F(r.project,r.frontendCode,(0,M.resolve)(r.project,s.frontendDirectory)),f=c(r.project,r.appId,o);if(e.targetAppId=f,r.businessTemplatesOnly)return B(e,f,r);let b=r.keepPackages,I=T(),k="",U="",L="",S="",C=[],$=[];try{var x,P,j,O,A,V,G;let i,s,l,c,F=[],B=await E(d,{appId:f});j=o,O=I,Y(j,"manifest"),i=(0,M.join)(O,"manifest.yaml"),(0,w.copyFileSync)(j,i),k=i,$.push(H({type:"manifest",file:k}));let T=await q(k),J=R(r);J&&(S=N(J,I),$.push(H({type:"business_templates",file:S})));let Q=S?await W(S):void 0;A=r.project,V=I,s=_(A),C=[{type:"events",file:s.eventsPath},{type:"tools",file:s.toolsPath}].flatMap(e=>{if(!(0,w.existsSync)(e.file))return[];Y(e.file,e.type);let t=(0,M.join)(V,u(e.type));return(0,w.copyFileSync)(e.file,t),[{type:e.type,file:t}]}),$.push(...C.map(H));let Z=(x=(0,w.readFileSync)(k,"utf8"),P=T.manifest,(l=g(function(e){try{return h.qg(e)}catch{return}}(x))??g(P))?function(e){let t,r=e.trim();try{t=new URL(r)}catch{return y(r,"invalid_url","manifest.mcp_server.end_point must be a valid http(s) URL.")}if("http:"!==t.protocol&&"https:"!==t.protocol)return y(r,"invalid_protocol","manifest.mcp_server.end_point must use http:// or https://.");let i=function(e){if(!e)return"empty_hostname";if("localhost"===e||e.endsWith(".localhost"))return"localhost";if(e.endsWith(".local")||e.endsWith(".lan")||e.endsWith(".internal"))return"private_hostname";if(!e.includes(".")&&!e.includes(":"))return"unqualified_hostname";let t=v(e)??function(e){let t="::ffff:";if(!e.startsWith(t))return;let r=e.slice(t.length),i=v(r);if(i)return i;let n=r.split(":");if(2!==n.length)return;let s=n.map(e=>Number.parseInt(e,16));if(s.some((e,t)=>!/^[0-9a-f]{1,4}$/i.test(n[t])||!Number.isInteger(e)||e<0||e>65535))return;let[a,o]=s;return[a>>8,255&a,o>>8,255&o]}(e);return t?function(e){let[t,r]=e;return 10===t?"private_ipv4":127===t?"loopback_ipv4":172===t&&r>=16&&r<=31||192===t&&168===r?"private_ipv4":169===t&&254===r?"link_local_ipv4":100===t&&r>=64&&r<=127?"carrier_grade_nat_ipv4":0===t?"reserved_ipv4":192===t&&0===e[1]&&2===e[2]||198===t&&51===e[1]&&100===e[2]||203===t&&0===e[1]&&113===e[2]?"documentation_ipv4":198===t&&(18===r||19===r)?"benchmark_ipv4":t>=224?"reserved_ipv4":void 0}(t):e.includes(":")?function(e){if("::1"===e||"0:0:0:0:0:0:0:1"===e)return"loopback_ipv6";let t=Number.parseInt(e.split(":")[0]||"0",16);if(Number.isFinite(t)){if((65024&t)==64512)return"unique_local_ipv6";if((65472&t)==65152)return"link_local_ipv6"}}(e):void 0}(t.hostname.replace(/^\[/,"").replace(/\]$/,"").toLowerCase());return i?y(r,i,"manifest.mcp_server.end_point points to a local or private network address that cloud build and real devices cannot reach."):{checked:!0,endpoint:r,cloud_reachable:!0}}(l):{checked:!1,cloud_reachable:!1,reason:"mcp_endpoint_missing",message:"manifest.mcp_server.end_point is missing"});if(Z.checked&&!Z.cloud_reachable&&e.warn((c=Z.endpoint??"(missing)",`manifest.mcp_server.end_point may not be reachable from cloud build or real devices.
3
- endpoint: ${c}
4
- reason: ${Z.reason??"unknown"}
1
+ import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./yaml.js";import"./7945.js";import{CliUsageError as t,getLastHttpResponseLogId as r,CliError as n,isRecord as i}from"./2168.js";import{uploadMiniAppVersionDraftPackage as s,verifyYAML as o,submitMiniAppVersionDraft as a,uploadMiniAppVersionDraftSourceCode as l,normalizeAppVersionTag as p}from"./app.js";import{remoteFileName as c,sourceTypeForWorkspaceFileType as u,describeWorkspaceUpload as d,resolveAppKey as f}from"./workspace.js";import{requireRuntimeSkillEntries as _,resolveProjectLayout as m}from"./project-layout.js";import{miniAppVersionDetailUrl as h}from"./portal.js";import"./3551.js";e.add({"../../../node_modules/.pnpm/dotenv@17.2.3/node_modules/dotenv/lib/main.js"(e,t,r){let n=r("fs"),i=r("path"),s=r("os"),o=r("crypto"),a=r("../../../node_modules/.pnpm/dotenv@17.2.3/node_modules/dotenv/package.json").version,l=["\uD83D\uDD10 encrypt with Dotenvx: https://dotenvx.com","\uD83D\uDD10 prevent committing .env to code: https://dotenvx.com/precommit","\uD83D\uDD10 prevent building .env in docker: https://dotenvx.com/prebuild","\uD83D\uDCE1 add observability to secrets: https://dotenvx.com/ops","\uD83D\uDC65 sync secrets across teammates & machines: https://dotenvx.com/ops","\uD83D\uDDC2️ backup and recover secrets: https://dotenvx.com/ops","✅ audit secrets and track compliance: https://dotenvx.com/ops","\uD83D\uDD04 add secrets lifecycle management: https://dotenvx.com/ops","\uD83D\uDD11 add access controls to secrets: https://dotenvx.com/ops","\uD83D\uDEE0️ run anywhere with `dotenvx run -- yourcommand`","⚙️ specify custom .env file path with { path: '/custom/path/.env' }","⚙️ enable debug logging with { debug: true }","⚙️ override existing env vars with { override: true }","⚙️ suppress all logs with { quiet: true }","⚙️ write to custom object with { processEnv: myObject }","⚙️ load multiple .env files with { path: ['.env.local', '.env'] }"];function p(e){return"string"==typeof e?!["false","0","no","off",""].includes(e.toLowerCase()):!!e}let c=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function u(e){console.log(`[dotenv@${a}][DEBUG] ${e}`)}function d(e){console.log(`[dotenv@${a}] ${e}`)}function f(e){return e&&e.DOTENV_KEY&&e.DOTENV_KEY.length>0?e.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function _(e){let t=null;if(e&&e.path&&e.path.length>0)if(Array.isArray(e.path))for(let r of e.path)n.existsSync(r)&&(t=r.endsWith(".vault")?r:`${r}.vault`);else t=e.path.endsWith(".vault")?e.path:`${e.path}.vault`;else t=i.resolve(process.cwd(),".env.vault");return n.existsSync(t)?t:null}function m(e){return"~"===e[0]?i.join(s.homedir(),e.slice(1)):e}let h={configDotenv:function(e){let t,r=i.resolve(process.cwd(),".env"),s="utf8",o=process.env;e&&null!=e.processEnv&&(o=e.processEnv);let a=p(o.DOTENV_CONFIG_DEBUG||e&&e.debug),c=p(o.DOTENV_CONFIG_QUIET||e&&e.quiet);e&&e.encoding?s=e.encoding:a&&u("No encoding is specified. UTF-8 is used by default");let f=[r];if(e&&e.path)if(Array.isArray(e.path))for(let t of(f=[],e.path))f.push(m(t));else f=[m(e.path)];let _={};for(let r of f)try{let t=h.parse(n.readFileSync(r,{encoding:s}));h.populate(_,t,e)}catch(e){a&&u(`Failed to load ${r} ${e.message}`),t=e}let v=h.populate(o,_,e);if(a=p(o.DOTENV_CONFIG_DEBUG||a),c=p(o.DOTENV_CONFIG_QUIET||c),a||!c){var g;let e=Object.keys(v).length,r=[];for(let e of f)try{let t=i.relative(process.cwd(),e);r.push(t)}catch(r){a&&u(`Failed to load ${e} ${r.message}`),t=r}d(`injecting env (${e}) from ${r.join(",")} ${(g=`-- tip: ${l[Math.floor(Math.random()*l.length)]}`,process.stdout.isTTY?`\x1b[2m${g}\x1b[0m`:g)}`)}return t?{parsed:_,error:t}:{parsed:_}},_configVault:function(e){let t=p(process.env.DOTENV_CONFIG_DEBUG||e&&e.debug),r=p(process.env.DOTENV_CONFIG_QUIET||e&&e.quiet);(t||!r)&&d("Loading env from encrypted .env.vault");let n=h._parseVault(e),i=process.env;return e&&null!=e.processEnv&&(i=e.processEnv),h.populate(i,n,e),{parsed:n}},_parseVault:function(e){let t,r=_(e=e||{});e.path=r;let n=h.configDotenv(e);if(!n.parsed){let e=Error(`MISSING_DATA: Cannot parse ${r} for an unknown reason`);throw e.code="MISSING_DATA",e}let i=f(e).split(","),s=i.length;for(let e=0;e<s;e++)try{let r=i[e].trim(),s=function(e,t){let r;try{r=new URL(t)}catch(e){if("ERR_INVALID_URL"===e.code){let e=Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development");throw e.code="INVALID_DOTENV_KEY",e}throw e}let n=r.password;if(!n){let e=Error("INVALID_DOTENV_KEY: Missing key part");throw e.code="INVALID_DOTENV_KEY",e}let i=r.searchParams.get("environment");if(!i){let e=Error("INVALID_DOTENV_KEY: Missing environment part");throw e.code="INVALID_DOTENV_KEY",e}let s=`DOTENV_VAULT_${i.toUpperCase()}`,o=e.parsed[s];if(!o){let e=Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${s} in your .env.vault file.`);throw e.code="NOT_FOUND_DOTENV_ENVIRONMENT",e}return{ciphertext:o,key:n}}(n,r);t=h.decrypt(s.ciphertext,s.key);break}catch(t){if(e+1>=s)throw t}return h.parse(t)},config:function(e){if(0===f(e).length)return h.configDotenv(e);let t=_(e);if(!t){var r;return r=`You set DOTENV_KEY but you are missing a .env.vault file at ${t}. Did you forget to build it?`,console.error(`[dotenv@${a}][WARN] ${r}`),h.configDotenv(e)}return h._configVault(e)},decrypt:function(e,t){let r=Buffer.from(t.slice(-64),"hex"),n=Buffer.from(e,"base64"),i=n.subarray(0,12),s=n.subarray(-16);n=n.subarray(12,-16);try{let e=o.createDecipheriv("aes-256-gcm",r,i);return e.setAuthTag(s),`${e.update(n)}${e.final()}`}catch(n){let e=n instanceof RangeError,t="Invalid key length"===n.message,r="Unsupported state or unable to authenticate data"===n.message;if(e||t){let e=Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)");throw e.code="INVALID_DOTENV_KEY",e}if(r){let e=Error("DECRYPTION_FAILED: Please check your DOTENV_KEY");throw e.code="DECRYPTION_FAILED",e}throw n}},parse:function(e){let t,r={},n=e.toString();for(n=n.replace(/\r\n?/mg,"\n");null!=(t=c.exec(n));){let e=t[1],n=t[2]||"",i=(n=n.trim())[0];n=n.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),'"'===i&&(n=(n=n.replace(/\\n/g,"\n")).replace(/\\r/g,"\r")),r[e]=n}return r},populate:function(e,t,r={}){let n=!!(r&&r.debug),i=!!(r&&r.override),s={};if("object"!=typeof t){let e=Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");throw e.code="OBJECT_REQUIRED",e}for(let r of Object.keys(t))Object.prototype.hasOwnProperty.call(e,r)?(!0===i&&(e[r]=t[r],s[r]=t[r]),n&&(!0===i?u(`"${r}" is already defined and WAS overwritten`):u(`"${r}" is already defined and was NOT overwritten`))):(e[r]=t[r],s[r]=t[r]);return s}};e.exports.configDotenv=h.configDotenv,e.exports._configVault=h._configVault,e.exports._parseVault=h._parseVault,e.exports.config=h.config,e.exports.decrypt=h.decrypt,e.exports.parse=h.parse,e.exports.populate=h.populate,e.exports=h},"../../../node_modules/.pnpm/dotenv@17.2.3/node_modules/dotenv/package.json"(e){e.exports={version:"17.2.3"}}});let v=e("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js");function g(e){if(!i(e))return;let t=i(e.mcp_server)?e.mcp_server:void 0,r=t?.end_point;return"string"==typeof r&&r.trim()?r:void 0}function y(e,t,r){return{checked:!0,endpoint:e,cloud_reachable:!1,reason:t,message:r}}function w(e){let t=e.split(".");if(4!==t.length)return;let r=t.map(e=>Number(e));if(!r.some(e=>!Number.isInteger(e)||e<0||e>255))return r}let E=e("node:fs"),b=e("node:util");async function I(e,t={}){let r=N(e),n={cwd:r};try{await $({action:"build",appDir:r,appId:t.appId})}catch(e){throw new D(r,e,n)}return n}async function k(e,t,r){let n=N(e),i={cwd:n,output_dir:t},s="";try{i.archive_path=s=(await $({action:"cloudPackage",appDir:n,outputDir:t})).archivePath||""}catch(e){throw new S(n,e,i,r)}if(!s)throw new S(n,Error("DoubaoAppsSDK.cloudPackage did not return an archive path"),i,r);return s}function N(e){if(!(0,E.existsSync)(e))throw Error(`frontend_code path not found: ${e}`);if((0,E.statSync)(e).isFile())throw Error(`frontend_code must be a directory: ${e}`);return(0,E.realpathSync)(e)}async function $(e){let t,r,n,s,o=process.cwd(),a={...process.env},l=(t=[],r=[],n=process.stdout.write,s=process.stderr.write,process.stdout.write=U(t),process.stderr.write=U(r),{result(){let e=O({stdout:t.join(""),stderr:r.join("")});return{...e,...e.stdout||e.stderr?{output:L([e.stdout,e.stderr].filter(Boolean).join("\n"))}:{}}},restore(){process.stdout.write=n,process.stderr.write=s}});try{process.chdir(e.appDir),process.env.CI="true",process.env.FORCE_COLOR="0",process.env.NO_COLOR="1";let{DoubaoAppsSDK:t}=await import("./sdk.js"),r=new t(e.appDir);if("build"===e.action)return await r.build(e.appId?{appId:e.appId}:void 0),l.result();let n=await r.cloudPackage({outputDir:e.outputDir});return{...l.result(),archivePath:n}}catch(t){let e=l.result();throw i(t)&&Object.assign(t,e),t}finally{l.restore(),process.chdir(o),function(e){for(let t of Object.keys(process.env))Object.prototype.hasOwnProperty.call(e,t)||delete process.env[t];Object.assign(process.env,e)}(a)}}function U(e){return(t,r,n)=>{e.push("string"==typeof t?t:Buffer.from(t).toString("string"==typeof r?r:"utf8"));let i="function"==typeof r?r:n;return i?.(),!0}}function O(e){let t=L(e.stdout),r=L(e.stderr),n=L(e.output);return{...t?{stdout:t}:{},...r?{stderr:r}:{},...n?{output:n}:{}}}class D extends Error{exitCode=1;details;constructor(e,t,r){var n;let i,s=x(t),o=r?.stdout||s.stdout,a=r?.stderr||s.stderr,l=T(r?.output||s.output||a||o),p={code:"frontend_build_check_failed",cwd:r?.cwd||e,...void 0===s.exitCode?{}:{exit_code:s.exitCode},...s.signal?{signal:s.signal}:{},...s.shortMessage?{short_message:s.shortMessage}:{},...s.originalMessage?{original_message:s.originalMessage}:{},...l?{output:l}:{}};super((i=(n=p).output||n.stderr||n.stdout||n.short_message||n.original_message||"unknown build failure",["frontend build check failed",`cwd: ${n.cwd}`,"build output:",i].join("\n"))),this.name="FrontendBuildCheckError",this.details=p}}class S extends Error{exitCode=1;details;constructor(e,t,r,n){var i;let s,o=function(e,t){let r=x(e),n=[...new Set(t?.flatMap(({value:e,is_secret:t})=>t&&e?[e,JSON.stringify(e).slice(1,-1),L(e)??""].filter(Boolean):[]))].sort((e,t)=>t.length-e.length);for(let[e,t]of Object.entries(r))"string"==typeof t&&Object.assign(r,{[e]:n.reduce((e,t)=>e.split(t).join("[REDACTED]"),t)});return r}(t,n),a=r?.stdout||o.stdout,l=r?.stderr||o.stderr,p=T(r?.output||o.output||l||a),c={code:"frontend_package_failed",cwd:r?.cwd||e,output_dir:r?.output_dir??"",...r?.archive_path?{archive_path:r.archive_path}:{},...void 0===o.exitCode?{}:{exit_code:o.exitCode},...o.signal?{signal:o.signal}:{},...o.shortMessage?{short_message:o.shortMessage}:{},...o.originalMessage?{original_message:o.originalMessage}:{},...p?{output:p}:{}};super((s=(i=c).output||i.stderr||i.stdout||i.short_message||i.original_message||"unknown package failure",["frontend package failed",`cwd: ${i.cwd}`,"package output:",s].join("\n"))),this.name="FrontendPackageError",this.details=c}}function x(e){if(!i(e))return{output:String(e)};let t=O({stdout:e.stdout,stderr:e.stderr,output:e.all??e.output}),r=!!(t.stdout||t.stderr||t.output);return{exitCode:"number"==typeof e.exitCode?e.exitCode:void 0,signal:"string"==typeof e.signal?e.signal:void 0,shortMessage:r||"string"!=typeof e.shortMessage?void 0:e.shortMessage,originalMessage:"string"==typeof e.originalMessage?e.originalMessage:r||"string"!=typeof e.message?void 0:e.message,...t}}function L(e){let t=Buffer.isBuffer(e)?e.toString("utf8"):"string"==typeof e?e:"";return(0,b.stripVTControlCharacters)(t).replace(/\r\n/g,"\n").replace(/\r/g,"\n").split("\n").map(e=>e.trimEnd()).join("\n").trim()||void 0}function T(e){let t,r=L(e);if(!r)return;let n=(t=[r.search(/(^|\n)error\s+Build error:/i),r.search(/(^|\n)Build error:/i),r.search(/(^|\n)File:\s/i),r.search(/(^|\n)\s*[×x]\s+.*TS\d+:/i)].filter(e=>e>=0)).length>0?Math.min(...t):-1,i=n>=0?r.slice(n).trim():r;return i.length<=4e3?i:`${i.slice(0,4e3).trimEnd()}
2
+ ... output truncated ...`}let C=e("node:fs/promises"),j=e("node:path"),V=e("../../../node_modules/.pnpm/dotenv@17.2.3/node_modules/dotenv/lib/main.js"),P=/^[A-Za-z_][A-Za-z0-9_]*$/,A=new Set(["platform_info_version_tag","platform_info_upload_token","platform_info_app_name","platform_info_app_icon","platform_info_app_key","skip_uploading","X_TT_ENV"]);async function M(e){if(void 0===e.env&&void 0===e.secretEnv)return;let r=K(e.project,e.env,"--env"),n=K(e.project,e.secretEnv,"--secret-env"),i=new Map;try{for(let[e,t]of[[r,!1],[n,!0]])if(e)for(let[r,n]of Object.entries((0,V.parse)(await (0,C.readFile)(e,"utf8"))))i.set(r,{name:r,value:n,env_var_name:r,...t?{is_secret:!0}:{}})}catch{throw new t("Selected build environment files must be readable files")}let s=[...i.values()];for(let{name:e,value:r,is_secret:n}of s){if(!P.test(e))throw new t("Invalid build environment variable name");if(A.has(e))throw new t(`Build environment variable is reserved: ${e}`);if(n&&e.startsWith("PUBLIC_"))throw new t(`Secret build environment cannot contain PUBLIC_ variables: ${e}`);if("NODE_ENV"===e&&"production"!==r)throw new t("Build environment variable NODE_ENV must be production")}return s}function K(e,r,n){let i;if(void 0!==r){try{if(i=(0,E.realpathSync)((0,j.resolve)(e,r)),!(0,E.statSync)(i).isFile())throw Error("not a file")}catch{throw new t(`${n} must refer to a readable file`)}if(!(0,j.basename)(i).startsWith(".env"))throw new t(`${n} real filename must start with .env`);return i}}async function F(e,t){let n=p(t.appVersionTag);if(t.businessTemplatesOnly&&(void 0!==t.env||void 0!==t.secretEnv))throw Error("--env and --secret-env cannot be used with --business-templates-only");let s=await M(t);if(t.businessTemplatesOnly&&(t.release||n))throw Error("--release cannot be used with --business-templates-only because this mode does not submit a version");let o=m(t.project),l=B(t.project,t.manifest,o.manifestPath),u=B(t.project,t.skill,o.skillDirectory),d=B(t.project,t.frontendCode,(0,j.resolve)(t.project,o.frontendDirectory)),_=f(t.project,t.appId,l);if(e.targetAppId=_,t.businessTemplatesOnly)return R(e,_,t);let b=t.keepPackages,k=H(),N="",$="",U="",O="",D=[],S=[];try{var x,L,T,C,V,P,A;let i,o,p,f,M=[],K=void 0===s?await I(d,{appId:_}):{cwd:d,skipped:!0};T=l,C=k,en(T,"manifest"),i=(0,j.join)(C,"manifest.yaml"),(0,E.copyFileSync)(T,i),N=i,S.push(J({type:"manifest",file:N}));let F=await X(N),B=Y(t);B&&(O=z(B,k),S.push(J({type:"business_templates",file:O})));let R=O?await Z(O):void 0;V=t.project,P=k,o=m(V),D=[{type:"events",file:o.eventsPath},{type:"tools",file:o.toolsPath}].flatMap(e=>{if(!(0,E.existsSync)(e.file))return[];en(e.file,e.type);let t=(0,j.join)(P,c(e.type));return(0,E.copyFileSync)(e.file,t),[{type:e.type,file:t}]}),S.push(...D.map(J));let H=(x=(0,E.readFileSync)(N,"utf8"),L=F.manifest,(p=g(function(e){try{return v.qg(e)}catch{return}}(x))??g(L))?function(e){let t,r=e.trim();try{t=new URL(r)}catch{return y(r,"invalid_url","manifest.mcp_server.end_point must be a valid http(s) URL.")}if("http:"!==t.protocol&&"https:"!==t.protocol)return y(r,"invalid_protocol","manifest.mcp_server.end_point must use http:// or https://.");let n=function(e){if(!e)return"empty_hostname";if("localhost"===e||e.endsWith(".localhost"))return"localhost";if(e.endsWith(".local")||e.endsWith(".lan")||e.endsWith(".internal"))return"private_hostname";if(!e.includes(".")&&!e.includes(":"))return"unqualified_hostname";let t=w(e)??function(e){let t="::ffff:";if(!e.startsWith(t))return;let r=e.slice(t.length),n=w(r);if(n)return n;let i=r.split(":");if(2!==i.length)return;let s=i.map(e=>Number.parseInt(e,16));if(s.some((e,t)=>!/^[0-9a-f]{1,4}$/i.test(i[t])||!Number.isInteger(e)||e<0||e>65535))return;let[o,a]=s;return[o>>8,255&o,a>>8,255&a]}(e);return t?function(e){let[t,r]=e;return 10===t?"private_ipv4":127===t?"loopback_ipv4":172===t&&r>=16&&r<=31||192===t&&168===r?"private_ipv4":169===t&&254===r?"link_local_ipv4":100===t&&r>=64&&r<=127?"carrier_grade_nat_ipv4":0===t?"reserved_ipv4":192===t&&0===e[1]&&2===e[2]||198===t&&51===e[1]&&100===e[2]||203===t&&0===e[1]&&113===e[2]?"documentation_ipv4":198===t&&(18===r||19===r)?"benchmark_ipv4":t>=224?"reserved_ipv4":void 0}(t):e.includes(":")?function(e){if("::1"===e||"0:0:0:0:0:0:0:1"===e)return"loopback_ipv6";let t=Number.parseInt(e.split(":")[0]||"0",16);if(Number.isFinite(t)){if((65024&t)==64512)return"unique_local_ipv6";if((65472&t)==65152)return"link_local_ipv6"}}(e):void 0}(t.hostname.replace(/^\[/,"").replace(/\]$/,"").toLowerCase());return n?y(r,n,"manifest.mcp_server.end_point points to a local or private network address that cloud build and real devices cannot reach."):{checked:!0,endpoint:r,cloud_reachable:!0}}(p):{checked:!1,cloud_reachable:!1,reason:"mcp_endpoint_missing",message:"manifest.mcp_server.end_point is missing"});if(H.checked&&!H.cloud_reachable&&e.warn((f=H.endpoint??"(missing)",`manifest.mcp_server.end_point may not be reachable from cloud build or real devices.
3
+ endpoint: ${f}
4
+ reason: ${H.reason??"unknown"}
5
5
 
6
6
  Impact:
7
7
  - Upload will continue.
8
8
  - Cloud build may still succeed, but runtime MCP calls may fail if the endpoint is not reachable from the cloud/device environment.
9
9
 
10
10
  Action:
11
- Set manifest.mcp_server.end_point to an http(s) MCP URL reachable from the cloud/device environment before release.`),{style:"label"}),F.push(await D(f,{type:"manifest",file:k})),S){let e={type:"business_templates",file:S},t=await D(f,e);X(t.business_template_sync_result),F.push(t)}for(let e of C)F.push(await D(f,e));let ee=await z(p,I);U=ee.file,$.push(H({type:"skill",file:U}));let et=function(e,t){let r,i=(0,w.readFileSync)(e);if(i.byteLength<22||(r=i.readUInt32LE(0),0x4034b50!==r&&0x6054b50!==r&&0x8074b50!==r))throw Error(`invalid skill zip: ${e} is not a zip file`);let n=function(e){let t=function(e){let t=Math.max(0,e.length-65535-22);for(let r=e.length-22;r>=t;r-=1)if(0x6054b50===e.readUInt32LE(r))return r;return -1}(e);if(t<0)return[];let r=e.readUInt32LE(t+12),i=e.readUInt32LE(t+16),n=Math.min(e.length,i+r),s=[],a=i;for(;a+46<=n&&0x2014b50===e.readUInt32LE(a);){let t=e.readUInt16LE(a+28),r=e.readUInt16LE(a+30),i=e.readUInt16LE(a+32),n=a+46,o=n+t;s.push(e.toString("utf8",n,o)),a=o+r+i}return s}(i),s=t.map(e=>e.relativePath),a=s.filter(e=>!n.includes(e));if(a.length>0)throw Error(`invalid skill zip: missing discovered Skill entries: ${a.join(", ")}`);return{valid:!0,file_name:(0,M.basename)(e),skill_paths:s}}(U,ee.skills);F.push(await D(f,{type:"skill",file:U})),L=await K(d,I),$.push(H({type:"frontend_code",file:L})),F.push(await D(f,{type:"frontend_code",file:L}));let er=await a(f,{appVersionTag:n,release:r.release}),ei=er.data?.version_tag||(G=F,G.find(e=>e.version_tag)?.version_tag??""),en={app_id:f,version_tag:ei,status:"submitted",submitted:!0,build_triggered:!0,uploaded_artifacts:F.map(e=>e.type),packages:$,business_template_sync_result:F.find(e=>"business_templates"===e.type)?.business_template_sync_result,next:{status_command:`dbx app artifacts status --app-id ${f} --version-tag ${ei} --poll`,version_detail_url:m(f,ei)},...b?{kept_packages:{temp_dir:I,manifest:k,skill_zip:U,frontend_code_zip:L,...S?{business_templates:S}:{},...Object.fromEntries(C.map(e=>[e.type,e.file]))}}:{},...e.debug?{debug:{frontend_build_check:B,manifest:T,...Q?{business_templates:Q}:{},skill:et,uploads:F,endpoints:{manifest_validate:{method:"POST",path:"/app_developer/api/yaml/verify"},upload:{method:"POST",path:"/app_developer/api/apps/:app_key/draft/upload"},source_code_upload_start:{method:"POST",path:"/app_developer/api/apps/:app_key/draft/source_code/upload/start"},source_code_tos_upload:{method:"PUT",path:"<upload_url>"},source_code_upload_finish:{method:"POST",path:"/app_developer/api/apps/:app_key/draft/source_code/upload/finish"},submit:{method:"POST",path:"/app_developer/api/apps/:app_key/draft/submit"}}}}:{},log_id:er.log_id??t()??""};if(!r.quiet){for(let t of(e.log("artifacts uploaded and build triggered"),e.log(`app_id: ${f}`),e.log(`version_tag: ${ei}`),e.log(`status: ${en.status}`),e.log(`next: ${en.next.status_command}`),e.log(`version detail: ${en.next.version_detail_url}`),e.log("package sizes:"),$))e.log(` ${t.type}: ${t.file_name} (${t.file_size_human})`);b&&e.log(`kept packages: ${I}`)}return en}catch(e){throw function(e,t){let r=e instanceof Error?e:Error(String(e));if(0===t.length)return r;let n=t.map(e=>({...e})),s=r.details;return r.details=i(s)?{...s,package_sizes:n}:{...void 0===s?{}:{cause:s},package_sizes:n},r.message.includes("package sizes:")||(r.message=`${r.message}
12
- ${["package sizes:",...t.map(e=>` ${e.type}: ${e.file_name} (${e.file_size_human})`)].join("\n")}`),r}(e,$)}finally{b||(0,w.rmSync)(I,{recursive:!0,force:!0})}}function F(e,t,r){return t?.trim()?(0,M.resolve)(e,t.trim()):r}async function B(e,r,i){let n=R(i);if(!n)throw Error(`business_templates file not found: ${(0,M.resolve)(i.project,"business-templates.yaml")}`);let s=T(),a=N(n,s);try{let n=await W(a),o=await D(r,{type:"business_templates",file:a});X(o.business_template_sync_result);let l={app_id:r,status:"uploaded",submitted:!1,build_triggered:!1,uploaded_artifacts:[o.type],packages:[H({type:"business_templates",file:a})],business_template_validation:n,business_template_sync_result:o.business_template_sync_result,log_id:t()??"",...i.keepPackages?{kept_packages:{temp_dir:s,business_templates:a}}:{}};return i.quiet||(e.log("business templates uploaded"),e.log(`app_id: ${r}`)),l}finally{i.keepPackages||(0,w.rmSync)(s,{recursive:!0,force:!0})}}function N(e,t){Y(e,"business_templates");let r=(0,M.join)(t,"business-templates.yaml");return(0,w.copyFileSync)(e,r),r}function R(e){if(e.businessTemplates){let t=(0,M.resolve)(e.project,e.businessTemplates.trim());return Y(t,"business_templates"),t}let t=_(e.project).businessTemplatesPath;return(0,w.existsSync)(t)&&(0,w.statSync)(t).isFile()?t:""}async function z(e,t){let r=f(e),i=(0,M.join)(t,"skill.zip");return function(e,t){let r=[],i=[],n=0;for(let t of e){let e=t.data,s=Buffer.from(t.zipPath),a=function(e){let t=0xffffffff;for(let r of e)t=t>>>8^A[(t^r)&255];return(0xffffffff^t)>>>0}(e),o=Buffer.alloc(30);o.writeUInt32LE(0x4034b50,0),o.writeUInt16LE(20,4),o.writeUInt16LE(2048,6),o.writeUInt16LE(0,8),o.writeUInt16LE(0,10),o.writeUInt16LE(0,12),o.writeUInt32LE(a,14),o.writeUInt32LE(e.length,18),o.writeUInt32LE(e.length,22),o.writeUInt16LE(s.length,26),o.writeUInt16LE(0,28),r.push(o,s,e);let l=Buffer.alloc(46);l.writeUInt32LE(0x2014b50,0),l.writeUInt16LE(20,4),l.writeUInt16LE(20,6),l.writeUInt16LE(2048,8),l.writeUInt16LE(0,10),l.writeUInt16LE(0,12),l.writeUInt16LE(0,14),l.writeUInt32LE(a,16),l.writeUInt32LE(e.length,20),l.writeUInt32LE(e.length,24),l.writeUInt16LE(s.length,28),l.writeUInt16LE(0,30),l.writeUInt16LE(0,32),l.writeUInt16LE(0,34),l.writeUInt16LE(0,36),l.writeUInt32LE(0,38),l.writeUInt32LE(n,42),i.push(l,s),n+=o.length+s.length+e.length}let s=n,a=Buffer.concat(i),o=Buffer.alloc(22);o.writeUInt32LE(0x6054b50,0),o.writeUInt16LE(0,4),o.writeUInt16LE(0,6),o.writeUInt16LE(e.length,8),o.writeUInt16LE(e.length,10),o.writeUInt32LE(a.length,12),o.writeUInt32LE(s,16),o.writeUInt16LE(0,20),(0,w.writeFileSync)(t,Buffer.concat([...r,a,o]))}(r.map(e=>({zipPath:e.relativePath,data:Buffer.from(e.content)})),i),{file:i,skills:r}}async function K(e,t){if(function(e,t){if(!(0,w.existsSync)(e))throw Error(`${t} path not found: ${e}`)}(e,"frontend_code"),(0,w.statSync)(e).isFile())throw Error(`frontend_code must be a directory: ${e}`);let r=await I(e,t);return Y(r,"frontend_code"),r}function T(){let e=(0,M.join)("/tmp","dbx","artifacts-upload");return(0,w.mkdirSync)(e,{recursive:!0}),(0,w.mkdtempSync)((0,M.join)(e,"upload-"))}let A=function(){let e=[];for(let t=0;t<256;t+=1){let r=t;for(let e=0;e<8;e+=1)r=1&r?0xedb88320^r>>>1:r>>>1;e[t]=r>>>0}return e}();async function D(e,t){var r;if("frontend_code"===t.type){let r=await o({appKey:e,filePath:t.file});return{...d(t),source_type:p(t.type),version_tag:r.data?.version_tag??""}}let i=await n({appKey:e,sourceType:p(t.type),filePath:t.file,contentType:"manifest"===(r=t.type)||"business_templates"===r?"application/x-yaml":"events"===r||"tools"===r?"application/json":"application/zip"});return{...d(t),source_type:p(t.type),version_tag:i.data?.version_tag??"",business_template_sync_result:i.data?.business_template_sync_result}}function H(e){let t=d(e);return{type:t.type,file_name:t.file_name,file_size:t.file_size,file_size_human:function(e){let t=["B","KiB","MiB","GiB"],r=e,i=0;for(;r>=1024&&i<t.length-1;)r/=1024,i+=1;return 0===i?`${e} B`:`${r>=10?r.toFixed(1):r.toFixed(2)} ${t[i]}`}(t.file_size)}}async function q(e){return V(e,"manifest","manifest")}async function W(e){return V(e,"business templates","business_templates")}async function V(e,i,n){let a=await s((0,w.readFileSync)(e,"utf8"),"strict",n),o=a.data,l={valid:!!o?.success,manifest:o?.manifest,errors:G(o?.errors??[]),warnings:G(o?.warnings??[]),log_id:a.log_id??t()??""};if(!l.valid){var u,p;throw new r((u=i,0===(p=l.errors).length?`${u} validation failed`:[`${u} validation failed`,`${u} validation errors:`,...p.map(e=>` - [${e.code}] ${e.path}: ${e.message}`)].join("\n")),{code:"DBX_VALIDATION_FAILED",details:l,logId:l.log_id})}return{...l,valid:!0}}function G(e){return e.map(e=>({code:e.code,path:e.path,message:e.message}))}function X(e){let i=e?.results.find(e=>1!==e.sync_status||e.error_message?.trim());if(e&&!i)return;let n=i?`${i.template_key}: ${i.error_message?.trim()||`sync_status=${i.sync_status}`}`:"no sync result returned";throw new r(`business templates sync failed: ${n}`,{code:"DBX_CONFIG_SYNC_FAILED",details:e,logId:t()})}function Y(e,t){if(!(0,w.existsSync)(e)||!(0,w.statSync)(e).isFile())throw Error(`${t} file not found: ${e}`)}export{B as runBusinessTemplatesUpload,O as uploadArtifacts};
11
+ Set manifest.mcp_server.end_point to an http(s) MCP URL reachable from the cloud/device environment before release.`),{style:"label"}),M.push(await Q(_,{type:"manifest",file:N})),O){let e={type:"business_templates",file:O},t=await Q(_,e);er(t.business_template_sync_result),M.push(t)}for(let e of D)M.push(await Q(_,e));let q=await G(u,k);$=q.file,S.push(J({type:"skill",file:$}));let ee=function(e,t){let r,n=(0,E.readFileSync)(e);if(n.byteLength<22||(r=n.readUInt32LE(0),0x4034b50!==r&&0x6054b50!==r&&0x8074b50!==r))throw Error(`invalid skill zip: ${e} is not a zip file`);let i=function(e){let t=function(e){let t=Math.max(0,e.length-65535-22);for(let r=e.length-22;r>=t;r-=1)if(0x6054b50===e.readUInt32LE(r))return r;return -1}(e);if(t<0)return[];let r=e.readUInt32LE(t+12),n=e.readUInt32LE(t+16),i=Math.min(e.length,n+r),s=[],o=n;for(;o+46<=i&&0x2014b50===e.readUInt32LE(o);){let t=e.readUInt16LE(o+28),r=e.readUInt16LE(o+30),n=e.readUInt16LE(o+32),i=o+46,a=i+t;s.push(e.toString("utf8",i,a)),o=a+r+n}return s}(n),s=t.map(e=>e.relativePath),o=s.filter(e=>!i.includes(e));if(o.length>0)throw Error(`invalid skill zip: missing discovered Skill entries: ${o.join(", ")}`);return{valid:!0,file_name:(0,j.basename)(e),skill_paths:s}}($,q.skills);M.push(await Q(_,{type:"skill",file:$})),U=await W(d,k,s),S.push(J({type:"frontend_code",file:U})),M.push(await Q(_,{type:"frontend_code",file:U}));let et=await a(_,{appVersionTag:n,release:t.release,variables:s}),ei=et.data?.version_tag||(A=M,A.find(e=>e.version_tag)?.version_tag??""),es={app_id:_,version_tag:ei,status:"submitted",submitted:!0,build_triggered:!0,uploaded_artifacts:M.map(e=>e.type),packages:S,business_template_sync_result:M.find(e=>"business_templates"===e.type)?.business_template_sync_result,next:{status_command:`dbx app artifacts status --app-id ${_} --version-tag ${ei} --poll`,version_detail_url:h(_,ei)},...b?{kept_packages:{temp_dir:k,manifest:N,skill_zip:$,frontend_code_zip:U,...O?{business_templates:O}:{},...Object.fromEntries(D.map(e=>[e.type,e.file]))}}:{},...e.debug?{debug:{frontend_build_check:K,manifest:F,...R?{business_templates:R}:{},skill:ee,uploads:M,endpoints:{manifest_validate:{method:"POST",path:"/app_developer/api/yaml/verify"},upload:{method:"POST",path:"/app_developer/api/apps/:app_key/draft/upload"},source_code_upload_start:{method:"POST",path:"/app_developer/api/apps/:app_key/draft/source_code/upload/start"},source_code_tos_upload:{method:"PUT",path:"<upload_url>"},source_code_upload_finish:{method:"POST",path:"/app_developer/api/apps/:app_key/draft/source_code/upload/finish"},submit:{method:"POST",path:"/app_developer/api/apps/:app_key/draft/submit"}}}}:{},log_id:et.log_id??r()??""};if(!t.quiet){for(let t of(e.log("artifacts uploaded and build triggered"),e.log(`app_id: ${_}`),e.log(`version_tag: ${ei}`),e.log(`status: ${es.status}`),e.log(`next: ${es.next.status_command}`),e.log(`version detail: ${es.next.version_detail_url}`),e.log("package sizes:"),S))e.log(` ${t.type}: ${t.file_name} (${t.file_size_human})`);b&&e.log(`kept packages: ${k}`)}return es}catch(e){throw function(e,t){let r=e instanceof Error?e:Error(String(e));if(0===t.length)return r;let n=t.map(e=>({...e})),s=r.details;return r.details=i(s)?{...s,package_sizes:n}:{...void 0===s?{}:{cause:s},package_sizes:n},r.message.includes("package sizes:")||(r.message=`${r.message}
12
+ ${["package sizes:",...t.map(e=>` ${e.type}: ${e.file_name} (${e.file_size_human})`)].join("\n")}`),r}(e,S)}finally{b||(0,E.rmSync)(k,{recursive:!0,force:!0})}}function B(e,t,r){return t?.trim()?(0,j.resolve)(e,t.trim()):r}async function R(e,t,n){let i=Y(n);if(!i)throw Error(`business_templates file not found: ${(0,j.resolve)(n.project,"business-templates.yaml")}`);let s=H(),o=z(i,s);try{let i=await Z(o),a=await Q(t,{type:"business_templates",file:o});er(a.business_template_sync_result);let l={app_id:t,status:"uploaded",submitted:!1,build_triggered:!1,uploaded_artifacts:[a.type],packages:[J({type:"business_templates",file:o})],business_template_validation:i,business_template_sync_result:a.business_template_sync_result,log_id:r()??"",...n.keepPackages?{kept_packages:{temp_dir:s,business_templates:o}}:{}};return n.quiet||(e.log("business templates uploaded"),e.log(`app_id: ${t}`)),l}finally{n.keepPackages||(0,E.rmSync)(s,{recursive:!0,force:!0})}}function z(e,t){en(e,"business_templates");let r=(0,j.join)(t,"business-templates.yaml");return(0,E.copyFileSync)(e,r),r}function Y(e){if(e.businessTemplates){let t=(0,j.resolve)(e.project,e.businessTemplates.trim());return en(t,"business_templates"),t}let t=m(e.project).businessTemplatesPath;return(0,E.existsSync)(t)&&(0,E.statSync)(t).isFile()?t:""}async function G(e,t){let r=_(e),n=(0,j.join)(t,"skill.zip");return function(e,t){let r=[],n=[],i=0;for(let t of e){let e=t.data,s=Buffer.from(t.zipPath),o=function(e){let t=0xffffffff;for(let r of e)t=t>>>8^q[(t^r)&255];return(0xffffffff^t)>>>0}(e),a=Buffer.alloc(30);a.writeUInt32LE(0x4034b50,0),a.writeUInt16LE(20,4),a.writeUInt16LE(2048,6),a.writeUInt16LE(0,8),a.writeUInt16LE(0,10),a.writeUInt16LE(0,12),a.writeUInt32LE(o,14),a.writeUInt32LE(e.length,18),a.writeUInt32LE(e.length,22),a.writeUInt16LE(s.length,26),a.writeUInt16LE(0,28),r.push(a,s,e);let l=Buffer.alloc(46);l.writeUInt32LE(0x2014b50,0),l.writeUInt16LE(20,4),l.writeUInt16LE(20,6),l.writeUInt16LE(2048,8),l.writeUInt16LE(0,10),l.writeUInt16LE(0,12),l.writeUInt16LE(0,14),l.writeUInt32LE(o,16),l.writeUInt32LE(e.length,20),l.writeUInt32LE(e.length,24),l.writeUInt16LE(s.length,28),l.writeUInt16LE(0,30),l.writeUInt16LE(0,32),l.writeUInt16LE(0,34),l.writeUInt16LE(0,36),l.writeUInt32LE(0,38),l.writeUInt32LE(i,42),n.push(l,s),i+=a.length+s.length+e.length}let s=i,o=Buffer.concat(n),a=Buffer.alloc(22);a.writeUInt32LE(0x6054b50,0),a.writeUInt16LE(0,4),a.writeUInt16LE(0,6),a.writeUInt16LE(e.length,8),a.writeUInt16LE(e.length,10),a.writeUInt32LE(o.length,12),a.writeUInt32LE(s,16),a.writeUInt16LE(0,20),(0,E.writeFileSync)(t,Buffer.concat([...r,o,a]))}(r.map(e=>({zipPath:e.relativePath,data:Buffer.from(e.content)})),n),{file:n,skills:r}}async function W(e,t,r){if(function(e,t){if(!(0,E.existsSync)(e))throw Error(`${t} path not found: ${e}`)}(e,"frontend_code"),(0,E.statSync)(e).isFile())throw Error(`frontend_code must be a directory: ${e}`);let n=await k(e,t,r);return en(n,"frontend_code"),n}function H(){let e=(0,j.join)("/tmp","dbx","artifacts-upload");return(0,E.mkdirSync)(e,{recursive:!0}),(0,E.mkdtempSync)((0,j.join)(e,"upload-"))}let q=function(){let e=[];for(let t=0;t<256;t+=1){let r=t;for(let e=0;e<8;e+=1)r=1&r?0xedb88320^r>>>1:r>>>1;e[t]=r>>>0}return e}();async function Q(e,t){var r;if("frontend_code"===t.type){let r=await l({appKey:e,filePath:t.file});return{...d(t),source_type:u(t.type),version_tag:r.data?.version_tag??""}}let n=await s({appKey:e,sourceType:u(t.type),filePath:t.file,contentType:"manifest"===(r=t.type)||"business_templates"===r?"application/x-yaml":"events"===r||"tools"===r?"application/json":"application/zip"});return{...d(t),source_type:u(t.type),version_tag:n.data?.version_tag??"",business_template_sync_result:n.data?.business_template_sync_result}}function J(e){let t=d(e);return{type:t.type,file_name:t.file_name,file_size:t.file_size,file_size_human:function(e){let t=["B","KiB","MiB","GiB"],r=e,n=0;for(;r>=1024&&n<t.length-1;)r/=1024,n+=1;return 0===n?`${e} B`:`${r>=10?r.toFixed(1):r.toFixed(2)} ${t[n]}`}(t.file_size)}}async function X(e){return ee(e,"manifest","manifest")}async function Z(e){return ee(e,"business templates","business_templates")}async function ee(e,t,i){let s=await o((0,E.readFileSync)(e,"utf8"),"strict",i),a=s.data,l={valid:!!a?.success,manifest:a?.manifest,errors:et(a?.errors??[]),warnings:et(a?.warnings??[]),log_id:s.log_id??r()??""};if(!l.valid){var p,c;throw new n((p=t,0===(c=l.errors).length?`${p} validation failed`:[`${p} validation failed`,`${p} validation errors:`,...c.map(e=>` - [${e.code}] ${e.path}: ${e.message}`)].join("\n")),{code:"DBX_VALIDATION_FAILED",details:l,logId:l.log_id})}return{...l,valid:!0}}function et(e){return e.map(e=>({code:e.code,path:e.path,message:e.message}))}function er(e){let t=e?.results.find(e=>3!==e.sync_status||e.error_message?.trim());if(e&&!t)return;let i=t?`${t.template_key}: ${t.error_message?.trim()||`sync_status=${t.sync_status}`}`:"no sync result returned";throw new n(`business templates sync failed: ${i}`,{code:"DBX_CONFIG_SYNC_FAILED",details:e,logId:r()})}function en(e,t){if(!(0,E.existsSync)(e)||!(0,E.statSync)(e).isFile())throw Error(`${t} file not found: ${e}`)}export{R as runBusinessTemplatesUpload,F as uploadArtifacts};
package/dist/check.js CHANGED
@@ -1 +1 @@
1
- let e;import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import"./9635.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"./1560.js";var v={};t.r(v),t.d(v,{default:()=>ev,executeCheck:()=>ew,resolveYAMLType:()=>eP});let w=t("node:fs");var S=t.n(w);let b=t("node:path");var $=t.n(b);let C=t("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js"),x=new Set(["USER","ASSISTANT","TOOL"]);function P(e){let t=s(e);if("resolved"!==t.layout)throw k("missing"===t.layout?"skill_layout_missing":"skill_layout_invalid",t.error??`skill directory contains no runtime Skill: ${e}`,"请在选定目录任意层级放置至少一个普通文件 SKILL.md;符号链接不会被加载。");return t.entries.map(e=>e.content)}function E(e,t){if(!S().existsSync(e))throw k(`${t}_file_not_found`,`${t} file not found: ${e}`,`请检查 --${t} 路径;相对路径会按 --project-path 解析。`);if(!S().statSync(e).isFile())throw k(`${t}_path_not_file`,`${t} path must be a file: ${e}`,`请检查 --${t} 路径,不能传目录。`);return S().readFileSync(e,"utf8")}function k(e,t,r){let o=Error(t);return o.details={code:e,message:t,suggestion:r},o}function M(e,t){return $().isAbsolute(e)?e:$().resolve(t,e)}function T(e){return"string"==typeof e&&e.trim()?e:void 0}function j(e){var t,r;let o=[],n=e.preflight.filter(e=>"error"===e.level);for(let i of(o.push(...n),o.push(...(t=e.result.trace_events,r=e.result.request_id,t.filter(e=>e.error).map(e=>({code:String(e.error?.code||"trace_error"),level:"error",message:String(e.error?.user_message||e.error?.message||e.summary||"trace error"),suggestion:q(e.error?.code,r),details:e.error})))),e.result.stream_errors??[]))o.push(function(e){var t;let r=String(e?.message||"stream error"),o=String(e?.code||"stream_error");return{code:o,level:"error",message:r,suggestion:"string"==typeof e?.suggestion?e.suggestion:q(o,"")||((t=r).includes("exceeded max step")?"模型在最大步数内没有收口。请检查 skill 是否让模型重复查询/重复调用工具,或临时调大 --max-step 辅助定位。":t.includes("mcp tool invalid response")?"MCP 工具返回未通过 context post-hook。请对照 manifest 检查 tool_name、entity_type、主键字段和 structuredContent。":void 0),details:e?.details??e}}(i));if(!o.some(e=>"error"===e.level)){let t=e.cardExpectation??"auto";o.push(...function(e,t,r){let o=[];for(let t of e){let e=t.result_preview||"";(t.result_error||e.includes("MCP error")||e.includes("Input validation error"))&&o.push({code:"mcp_tool_result_error",level:"error",message:`MCP tool ${t.tool_name} returned an error result`,suggestion:"工具已被模型调用,但 MCP tools/call 返回业务/参数错误。请检查 Agent Flow 里的 args 与工具入参 schema 是否一致;常见问题是模型传了字符串数字,可在 MCP server 用 z.coerce.number() 或自行兼容转换。",details:{tool_name:t.tool_name,tool_call_id:t.tool_call_id,arguments:t.arguments,result_preview:e}})}return"auto"===r&&e.length>0&&0===t&&0===o.length&&o.push({code:"tool_called_but_no_card",level:"warn",message:"Tool call finished, but no card_delta was emitted",suggestion:"如果这是出卡工具,请检查工具 result 是否包含 structuredContent.entities、entity_type 是否在 manifest.entities 声明、tool_card_binding 是否绑定该工具。"}),o}(e.result.tool_calls,e.result.cards.length,t));let r=e.result.tool_calls.map(e=>e.tool_name),n=e.evalCase.expect?.tool_calls??[];n.length>0&&!function(e,t){let r=0;for(let o of t)if(o===e[r]&&(r+=1),r===e.length)return!0;return 0===e.length}(n,r)&&o.push({code:"expectation_tool_chain_mismatch",level:"error",message:`expected tool chain ${n.join(" -> ")}, actual ${r.join(" -> ")||"-"}`,suggestion:"请检查 skill 的工具流程描述、query 是否表达了对应意图,以及 MCP tools 是否暴露了这些工具。"});let i=e.evalCase.expect?.card;if(i||"required"===t){let t=i?.min_count??1,r=i?.widget_id?e.result.cards.filter(e=>e.widget_id===i.widget_id):e.result.cards;r.length<t&&o.push({code:"card_not_emitted",level:"error",message:i?.widget_id?`expected at least ${t} card(s) with widget_id ${i.widget_id}, actual ${r.length}`:`expected at least ${t} card(s), actual ${e.result.cards.length}`,suggestion:"如果工具已成功,重点检查 manifest.tools、entities.*.tool_card_binding、MCP result structuredContent.entities 和模型是否在工具后触发出卡。"})}for(let r of("none"===t&&e.result.cards.length>0&&o.push({code:"unexpected_card_emitted",level:"error",message:`expected no card, actual ${e.result.cards.length}`,suggestion:"如果当前用例不应出卡,请检查工具是否返回了非空 structuredContent.entities,或检查 manifest 中该工具的 tool_card_binding。"}),e.result.tool_calls))!e.manifest.tools[r.tool_name]&&e.manifest.cardBindings[r.tool_name]&&o.push({code:"card_tool_not_declared",level:"error",message:`${r.tool_name} has card binding but is not declared in manifest.tools`,suggestion:`请在 manifest.tools.${r.tool_name} 中声明 output.entity_types。`})}let i=function(e){let t=new Set,r=[];for(let o of e){if(function(e,t){return"SIMULATOR_STREAM_ERROR"===e.code&&t.some(t=>{if(t.code===e.code)return!1;if(e.message.includes(t.message))return!0;let r=A(function(e,t){if(!p(e))return;let r=e[t];return p(r)?r:void 0}(t.details,"details"),"raw_error")||A(t.details,"raw_error");return void 0!==r&&e.message.includes(r)})}(o,r))continue;let e=`${o.level}\u0000${o.code}\u0000${o.message}`;t.has(e)||(t.add(e),r.push(o))}return r}(o),s=0===i.filter(e=>"error"===e.level).length;return{ok:s,verdict:s?"PASS":"FAIL",case:e.evalCase,context:{history_count:e.evalCase.history_messages?.length??0,query:e.evalCase.query,mcp_url:e.evalCase.mcp.url,gateway_origin:e.gatewayOrigin,max_step:e.evalCase.max_step},preflight:e.preflight,errors:i,...e.result}}function A(e,t){if(!p(e))return;let r=e[t];return"string"==typeof r&&r?r:void 0}function q(e,t){return"miniapp_mcp_result_invalid"===e?"MCP 工具返回未通过智能服务协议校验。请检查返回 JSON 是否包含 content/structuredContent,entity_type 是否在 manifest.entities 中声明,实体主键字段是否匹配 is_entity_id。":"agent_run_failed"===e?`Agent 运行失败。请查看 request_id=${t||"-"} 对应 trace,重点关注是否重复 tool call、max_step 不足或模型没有触发卡片输出。`:"tool_call_or_report_failed"===e?"工具调用或结果上报失败。请检查 MCP tools/call 是否可用,以及返回的 structuredContent/entities 是否符合 manifest 声明。":void 0}let O="2025-11-25",I=["application/json","text/event-stream"];async function L(e,t,r){return Z(e)?R(e,t,r):U(e,t,r)}async function N(t,r){var o,n;if(e&&(o=e.url,n=t,Q(o)===Q(n)))return function(e){var t;let r=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return e;let{_response_meta:t,...r}=e;return r}(e);if(!r||"object"!=typeof r){let e=String(r??"");return{content:e,raw_result_text:e,raw_mcp_result_json:e}}if("string"==typeof r.content||"raw_mcp_result_json"in r||"raw_result_text"in r||"structured"in r){let e="string"==typeof r.content?r.content:JSON.stringify(r.content??""),t=r.raw_mcp_result_json||r.raw_result_text||e;return{...r,content:e,raw_result_text:r.raw_result_text||t,raw_mcp_result_json:r.raw_mcp_result_json||t,structured:r.structured??r.structuredContent,is_error:r.is_error??r.isError}}let o=JSON.stringify(r);return{content:o,structured:r.structuredContent,raw_result_text:o,raw_mcp_result_json:o,is_error:!0===r.isError,miniapp:(t=r,Array.isArray(t?.content)&&t?.structuredContent&&"object"==typeof t.structuredContent)?{is_mini_app:!0,mcp_channel:"flow_miniapp"}:void 0}}("sse"===e.kind?await H(e,r):await D(e,r));throw Error("MCP session is not initialized. Please ensure fetchMCPDescriptor runs before tools/call.")}async function U(t,r,o){let n=B(t);try{let t=await Y(n,{jsonrpc:"2.0",id:1,method:"initialize",params:{protocolVersion:O,capabilities:{},clientInfo:{name:"dbx-simulator-eval",version:"0.1.0"}}},{headers:o}),i=t.body.result?.protocolVersion??O,s=t.headers.get("mcp-session-id")??void 0;e={kind:"streamable",url:n,sessionID:s,protocolVersion:i,headers:o},await Y(n,{jsonrpc:"2.0",method:"notifications/initialized",params:{}},{sessionID:s,protocolVersion:i,allowEmpty:!0,headers:o});let a=await Y(n,{jsonrpc:"2.0",id:2,method:"tools/list",params:{}},{sessionID:s,protocolVersion:i,headers:o});return{tools:{server_id:ee(n),name:ee(n),description:"Standard MCP Streamable HTTP server",app_key:r,protocol:"streamable_http",tools:(a.body.result?.tools??[]).map(e=>({name:e.name,description:e.description??"",input_schema_json:JSON.stringify(e.inputSchema??e.input_schema??{})}))}}}catch(r){e=void 0;let t=Error("standard MCP Streamable HTTP initialize/tools/list failed");throw t.cause=r,t}}async function R(t,r,o){let n=G(t),i={kind:"sse",url:n,pending:new Map,headers:o};e=i;try{await K(i,{jsonrpc:"2.0",id:1,method:"initialize",params:{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"dbx-simulator-eval",version:"0.1.0"}}},!1),await K(i,{jsonrpc:"2.0",method:"notifications/initialized",params:{}},!0);let e=await K(i,{jsonrpc:"2.0",id:2,method:"tools/list",params:{}},!1);return{tools:{server_id:ee(n),name:ee(n),description:"Standard MCP SSE server",app_key:r,protocol:"sse",tools:(e.result?.tools??[]).map(e=>({name:e.name,description:e.description??"",input_schema_json:JSON.stringify(e.inputSchema??e.input_schema??{})}))}}}catch(r){W(i),e=void 0;let t=Error("standard MCP SSE initialize/tools/list failed");throw t.cause=r,t}}async function D(e,t){let r=ei(t.tool_name);if(!r)throw Error("MCP tool name is empty");return(await Y(e.url,{jsonrpc:"2.0",id:Date.now(),method:"tools/call",params:{name:r,arguments:es(t.arguments)??ea(ei(t.arguments_json))??{}}},{sessionID:e.sessionID,protocolVersion:e.protocolVersion,headers:e.headers})).body.result}async function H(e,t){let r=ei(t.tool_name);if(!r)throw Error("MCP tool name is empty");return(await K(e,{jsonrpc:"2.0",id:Date.now(),method:"tools/call",params:{name:r,arguments:es(t.arguments)??ea(ei(t.arguments_json))??{}}},!1)).result}async function K(e,t,r){let o;if(await J(e),!e.endpointURL)throw Error("MCP SSE did not provide endpoint event");let n=et(t),i=er(t)||"unknown",s=eo(t),a=s?`${i}:${s}`:i,l=null!==n,c=l?new Promise((t,r)=>{let o=setTimeout(()=>{e.pending.delete(n),r(Error(`MCP SSE request timed out: ${a}`))},1e4);e.pending.set(n,{resolve:t,reject:r,timeout:o})}):void 0;try{var d;let r;o=await X(e.endpointURL,{method:"POST",headers:(d=e.headers,(r=new Headers(d)).set("Content-Type","application/json"),r),body:JSON.stringify(t)},1e4,`MCP SSE POST ${a}`)}catch(t){throw l&&V(e,n),t}if(await o.text(),!o.ok)throw l&&V(e,n),Error(`MCP SSE POST failed: HTTP ${o.status}`);if(!l)return{};let u=await c;if(!u&&!r)throw Error("MCP SSE returned empty response");if(u?.error)throw Error(`MCP SSE error: [${u.error.code}]`);return u}async function J(e){if(e.ready)return e.ready;let t=new AbortController;return e.abortController=t,e.ready=new Promise((r,o)=>{let n=!1,i=setTimeout(()=>{t.abort(),s(Error("MCP SSE endpoint event timed out"))},1e4),s=e=>{n||(n=!0,clearTimeout(i),o(e))};z(e,t,t=>{e.endpointURL=new URL(t,e.url).toString(),n||(n=!0,clearTimeout(i),r())},s)}).catch(t=>{throw W(e,t),t}),e.ready}async function z(e,t,r,o){try{var n;let i,s=await fetch(e.url,{method:"GET",headers:(n=e.headers,(i=new Headers(n)).set("Accept","text/event-stream"),i),signal:t.signal});if(!s.ok||!s.body){await s.text(),o(Error(`MCP SSE GET failed: HTTP ${s.status}`));return}if(!String(s.headers.get("content-type")??"").toLowerCase().includes("text/event-stream"))return void o(Error(`MCP SSE GET content-type=${s.headers.get("content-type")??"-"}`));await F(e,s.body,r),t.signal.aborted||W(e,Error("MCP SSE stream closed"))}catch(r){if(!t.signal.aborted){let t=r instanceof Error?r:Error(String(r));o(t),W(e,t)}}}async function F(e,t,r){let o=t.getReader(),n=new TextDecoder,i="",s="message",a=[],l=()=>{if(0===a.length){s="message";return}(function(e,t,r,o){let n;if("endpoint"===t)return o(r.trim());if(!r.trim())return;try{n=JSON.parse(r)}catch{return}let i=n.id;if(null==i)return;let s=e.pending.get(i);s&&(clearTimeout(s.timeout),e.pending.delete(i),s.resolve(n))})(e,s,a.join("\n"),r),s="message",a=[]};for(;;){let{done:e,value:t}=await o.read();if(e)break;let r=(i+=n.decode(t,{stream:!0})).search(/\r?\n/);for(;r>=0;){let e=i.slice(0,r).replace(/\r$/,"");i=i.slice(r+("\r"===i[r]&&"\n"===i[r+1]?2:1)),""===e?l():e.startsWith("event:")?s=e.slice(6).trim():e.startsWith("data:")&&a.push(e.slice(5).trimStart()),r=i.search(/\r?\n/)}}i&&a.push(i),l()}function V(e,t){if(null===t)return;let r=e.pending.get(t);r&&(clearTimeout(r.timeout),e.pending.delete(t))}function W(e,t=Error("MCP SSE session closed")){for(let[r,o]of(e.abortController?.abort(),e.abortController=void 0,e.endpointURL=void 0,e.ready=void 0,e.pending.entries()))clearTimeout(o.timeout),o.reject(t),e.pending.delete(r)}async function Y(e,t,r){var o,n;let i,s,a,l=er(t)||"unknown",c=eo(t),d=c?`${l}:${c}`:l,u=await X(e,{method:"POST",headers:(o=t,(i=new Headers((n=r).headers)).set("Content-Type","application/json"),i.set("Accept",I.join(", ")),(s=er(o))&&i.set("Mcp-Method",s),(a=eo(o))&&i.set("Mcp-Name",a),n.protocolVersion&&i.set("MCP-Protocol-Version",n.protocolVersion),n.sessionID&&i.set("Mcp-Session-Id",n.sessionID),i),body:JSON.stringify(t)},1e4,`MCP Streamable HTTP ${d}`),m=await u.text();if(!u.ok)throw Error(`MCP Streamable HTTP failed: HTTP ${u.status}`);if(!m&&r.allowEmpty)return{body:{},headers:u.headers};if(!m)throw Error("MCP Streamable HTTP returned empty response");let p=function(e,t,r){if(t?.toLowerCase().includes("text/event-stream")){let t=function(e){let t=[],r=[],o=()=>{if(0===r.length)return;let e=r.join("\n");e.trim()&&t.push(JSON.parse(e)),r=[]};for(let t of e.split(/\r?\n/)){if(""===t){o();continue}t.startsWith("data:")&&r.push(t.slice(5).trimStart())}return o(),t}(e),o=t.find(e=>{var t,o;return t=e,null!==(o=r)&&en(t)&&t.id===o})??t.find(en);if(!o)throw Error("MCP SSE response has no JSON-RPC response");return o}return JSON.parse(e)}(m,u.headers.get("content-type"),et(t));if(p.error)throw Error(`MCP Streamable HTTP error: [${p.error.code}]`);return{body:p,headers:u.headers}}function B(e){let t=new URL(e);return("/"===t.pathname||""===t.pathname)&&(t.pathname="/mcp"),t.toString()}function G(e){return new URL(e).toString()}function Z(e){return new URL(e).pathname.replace(/\/+$/,"").toLowerCase().endsWith("/sse")}function Q(e){return Z(e)?G(e):B(e)}async function X(e,t,r,o){let n=new AbortController,i=setTimeout(()=>n.abort(),r);try{return await fetch(e,{...t,signal:n.signal})}catch(e){if(e instanceof Error&&"AbortError"===e.name)throw Error(`${o} timed out after ${r}ms`);throw e}finally{clearTimeout(i)}}function ee(e){let t=new URL(e);return`${t.hostname}_${t.port||t.protocol.replace(":","")}${t.pathname.replace(/[^A-Za-z0-9_-]/g,"_")}`}function et(e){return e&&"object"==typeof e&&"id"in e?e.id??null:null}function er(e){if(e&&"object"==typeof e&&"method"in e)return e.method}function eo(e){if(!e||"object"!=typeof e)return;let t=e.params;return t&&"object"==typeof t?"string"==typeof t.name?t.name:"string"==typeof t.uri?t.uri:void 0:void 0}function en(e){return!!(e&&"object"==typeof e&&"id"in e&&("result"in e||"error"in e))}function ei(e){return"string"==typeof e?e:""}function es(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:void 0}function ea(e){if(e)try{return JSON.parse(e)}catch{return}}function el(e,t){return{code:e,level:"info",message:t}}function ec(e,t,r){return{code:e,level:"warn",message:t,suggestion:r}}function ed(e,t,r){return{code:e,level:"error",message:t,suggestion:r}}async function eu(t){try{let e,n=function(e){let t=$().resolve(e.projectPath),n=i(t),s={...e.demo?function(e){try{return o(e).evalCase}catch{throw Error(`unknown dbx check demo: ${e}. Supported demos: ${r.join(", ")}`)}}(e.demo):{},...e.query?{query:e.query}:{},...void 0!==e.maxStep?{max_step:e.maxStep}:{}};if(e.historyPath&&(s.history_messages=function(e){if(!S().existsSync(e))throw k("history_file_not_found",`history file not found: ${e}`,"请检查 --history 路径;历史文件应为消息数组。");let t=function(e,t,r){try{return t.endsWith(".json")?JSON.parse(e):C.qg(e)}catch(e){throw k(`${r}_file_parse_failed`,`${r} file parse failed: ${e?.message||String(e)}`,`请检查 ${t} 的语法和缩进。`)}}(S().readFileSync(e,"utf8"),e,"history");if(!Array.isArray(t))throw k("history_file_invalid","history file must be an array","请把 history 文件写成数组,例如 [{ role: USER, content: hello }]。");return t}(M(e.historyPath,t))),e.skillsDirectory?s.skills=P(M(e.skillsDirectory,t)):s.skills||(s.skills=P(n.skillDirectory)),e.manifestPath)s.manifest=E(M(e.manifestPath,t),"manifest");else{var a;if(s.manifest&&((a=s.manifest).includes("/")||a.endsWith(".json")||a.endsWith(".yaml")||a.endsWith(".yml")))s.manifest=E(M(s.manifest,t),"manifest");else if(!s.manifest){let e=n.manifestPath;S().existsSync(e)&&(s.manifest=E(e,"manifest"))}}if(e.mcpUrl&&(s.manifest=function(e,t){if("string"!=typeof e)return;if(!e.trim())return e;let r=C.Tp(e);return r.setIn(["mcp_server","end_point"],t),r.setIn(["mcp_server","mcp_config","protocol"],"Streamable"),r.toString()}(s.manifest,e.mcpUrl)),function(e){if(!e.query||"string"!=typeof e.query||!e.query.trim())throw k("query_required","dbx check requires query","请通过 --query 传入本轮用户问题。");if(!Array.isArray(e.skills)||0===e.skills.length||e.skills.some(e=>"string"!=typeof e))throw k("skill_required","dbx check requires at least one Skill","请在项目 skill/ 中放置至少一个 SKILL.md,或通过 --skill 传入 Skill 目录。");if(!e.manifest||"string"!=typeof e.manifest)throw k("manifest_required","dbx check requires manifest YAML text or path","请在项目 manifest.yaml 放置 Manifest,或通过 --manifest 传入路径。")}(s),s.history_messages=(s.history_messages??[]).map((e,t)=>{if(!e||"object"!=typeof e)throw k("history_message_invalid",`history_messages[${t}] must be an object`,"请把每条历史消息写成 { role: USER|ASSISTANT|TOOL, content: string }。");let r=String(e.role||"").toUpperCase();if(!x.has(r))throw k("history_message_role_invalid",`history_messages[${t}].role must be USER, ASSISTANT or TOOL`,"请把 role 改成 USER、ASSISTANT 或 TOOL。");if("string"!=typeof e.content||!e.content.trim())throw k("history_message_content_invalid",`history_messages[${t}].content must be a non-empty string`,"请为该历史消息补充非空 content。");return{role:r,content:e.content}}),s.max_step=s.max_step??15,!Number.isInteger(s.max_step)||s.max_step<=0)throw k("max_step_invalid","max_step must be a positive integer","请删除 max_step 使用默认值 15,或通过 --max-step 传入正整数。");return s}(t),s=await f(n.manifest,"compatible");if(!s.data?.success||!s.data.manifest)throw new eh("manifest validation failed",{code:"manifest_validation_failed",message:"manifest validation failed",errors:s.data?.errors??[],warnings:s.data?.warnings??[],log_id:s.log_id});let l=function(e,t){if(!p(t))throw k("manifest_parse_result_missing","dbx check requires parsed manifest from yaml verify","请先确认后端 /yaml/verify 返回 data.manifest。");let r=p(t.mcp_server)?t.mcp_server:void 0,o=T(t.app_key),n=T(r?.end_point);if(!o)throw k("app_id_required","dbx check requires manifest AppID","请在 manifest.yaml 配置 app_key(该字段对外称 AppID)。");if(!n)throw k("mcp_url_required","dbx check requires manifest mcp_server.end_point","请在 manifest.yaml 配置 mcp_server.end_point。");return function(e,t,r){try{let t=new URL(e);if("http:"===t.protocol||"https:"===t.protocol)return}catch{}throw k(t,`${r} must be an http(s) URL: ${e}`,`请把 ${r} 配置为 http:// 或 https:// 开头的 MCP endpoint。`)}(n,"mcp_url_invalid","manifest.mcp_server.end_point"),{...e,app_key:o,app_name:T(t.name),mcp:{url:n,description:T(r?.description),headers:_(t)}}}(n,s.data.manifest),c=function(e){if(!p(e)){var t;let e;throw t="manifest must be a parsed object",(e=Error(t)).details={code:"manifest_yaml_invalid",message:t,suggestion:"请先运行 `dbx check --file <manifest.yaml>`,确认后端能解析 manifest。"},e}let r=p(e.tools)?e.tools:{},o=p(e.entities)?e.entities:{},n={};for(let e of Object.values(o))if(p(e)&&p(e.tool_card_binding))for(let[t,r]of Object.entries(e.tool_card_binding))"string"==typeof r&&(n[t]=r);return{raw:e,appKey:"string"==typeof e.app_key?e.app_key:void 0,tools:r,entities:o,cardBindings:n}}(s.data.manifest),d=await L(l.mcp.url,l.app_key,l.mcp.headers).catch(e=>{var t,r,o;let n,i,s,a,c,d=(t=e,r=l.mcp.url,(c=(o=a=String(t?.message||t),i=(n=o.match(/<pre>([\s\S]*?)<\/pre>/i)?.[1])?n.replace(/<br\s*\/?>/gi,"\n").replace(/&nbsp;/g," ").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&"):o,(s=i.match(/(?:TypeError|ReferenceError|SyntaxError|Error):[^\n<]+/)?.[0])?s.trim():/HTTP 5\d\d/.test(o)?"MCP server returned HTTP 5xx":void 0))?{code:"mcp_server_internal_error",message:`MCP server returned an internal error while handling initialize/tools/list: ${c}`,suggestion:"CLI 已连上 MCP server,但 MCP server 在 initialize 或 tools/list 内部报错。请查看 MCP server 终端日志和报错堆栈,优先修 server 代码。",details:{url:r,raw_error:a,server_error:c}}:{code:"mcp_unreachable",message:a,suggestion:"请先启动标准 MCP server,并确认 manifest.mcp_server.end_point 指向 CLI 当前运行环境可访问的 Streamable HTTP /mcp 或 SSE /sse 地址;不要求公网 URL。",details:{url:r,raw_error:a}});throw new eh(`MCP server unreachable: ${l.mcp.url}`,d)}),u={...d.tools,server_id:l.mcp.server_id||d.tools.server_id,name:l.mcp.name||d.tools.name,description:l.mcp.description||d.tools.description},m=[...function(e){let t=[],{evalCase:r,manifest:o,mcp:n}=e,i=new Set(n.tools.map(e=>e.name).filter(Boolean)),s=Object.keys(o.tools),a=new Set(s);if(o.appKey===r.app_key?t.push(el("manifest_app_id_match",`manifest AppID matches request AppID (${r.app_key})`)):t.push(ed("manifest_app_id_mismatch",`manifest AppID (${o.appKey||"-"}) does not match request AppID (${r.app_key})`,"请保持请求 AppID 与 manifest.app_key 一致;如果走特殊测试链路会改写 AppID,需要确认后端映射规则。")),n.tools.length>0){let e="sse"===n.protocol?"SSE /sse":"Streamable HTTP /mcp";t.push(el("mcp_tools_loaded",`MCP exposes ${n.tools.length} tool(s) via ${e}`))}else t.push(ed("mcp_tools_empty","MCP did not expose any tool","请检查标准 MCP tools/list 是否返回 tools。Streamable HTTP 传 /mcp,SSE 传 /sse。"));for(let e of s)i.has(e)||t.push(ed("manifest_tool_missing_in_mcp",`manifest.tools declares ${e}, but MCP does not expose it`,"请确保会出卡的 tool 同时存在于 MCP tools 与 manifest.tools。"));for(let e of r.expect?.tool_calls??[])a.has(e)||t.push(ed("expected_tool_missing_in_manifest",`expect.tool_calls declares ${e}, but manifest.tools does not declare it`,`请在 manifest.tools.${e} 中声明该工具;非出卡工具也需要配置 output.kind,例如 execution_result。`)),i.has(e)||t.push(ed("expected_tool_missing_in_mcp",`expect.tool_calls declares ${e}, but MCP does not expose it`,"请确认 MCP tools/list 返回了期望调用的工具,或修正内置 demo 的 expect.tool_calls。"));let l=Object.keys(o.cardBindings);if(l.length>0)t.push(el("card_binding_found",`card binding found: ${l.map(e=>`${e} -> ${o.cardBindings[e]}`).join(", ")}`));else{var c,d;let e=(c=r,d=o,c.expect?.card||Object.values(d.tools).some(e=>p(e)&&p(e.output)&&"entities"===e.output.kind))?ed:ec;t.push(e("card_binding_missing","manifest.entities has no tool_card_binding","如果期望出卡,请在对应 entity 下配置 tool_card_binding,例如 Taxi_order: tpl.taxi_order。"))}for(let[e,r]of Object.entries(o.entities))p(r)&&p(r.schema)&&0===Object.entries(r.schema).filter(([,e])=>p(e)&&!0===e.is_entity_id).length&&t.push(ed("entity_id_missing",`manifest.entities.${e}.schema has no is_entity_id field`,"请为实体配置一个稳定主键字段,例如 product_id: { type: string, is_entity_id: true }。"));return t}({evalCase:l,manifest:c,mcp:u}),...function(e){let t=[];for(let r of e.tools){let e=eg(r.input_schema_json);if(e)for(let o of function e(t,r){let o=[];if(!p(t))return o;for(let e of["exclusiveMinimum","exclusiveMaximum"]){let n=t[e];"number"==typeof n&&o.push({path:`${r}/${e}`,value:n,message:`${e} is number ${n}, but simulator backend expects boolean`,suggestion:"如果使用 zod,避免 z.number().positive()/min()/max() 生成数值型 exclusiveMinimum/exclusiveMaximum;可改为 z.coerce.number() 并在工具内部校验业务范围。"})}for(let[n,i]of Object.entries(t))p(i)&&o.push(...e(i,`${r}/${n}`)),Array.isArray(i)&&i.forEach((t,i)=>{o.push(...e(t,`${r}/${n}/${i}`))});return o}(e,`tools/${r.name}/inputSchema`))t.push({code:"mcp_tool_schema_incompatible",level:"error",message:`MCP tool ${r.name} inputSchema is not compatible: ${o.message}`,suggestion:o.suggestion,details:{tool_name:r.name,path:o.path,value:o.value}})}return t}(u)],y=t.gatewayOrigin||a();if(!t.force&&m.some(e=>"error"===e.level))return j({evalCase:l,manifest:c,preflight:m,gatewayOrigin:y,cardExpectation:t.cardExpectation,result:em()});try{e=await h({evalCase:l,manifestYAML:l.manifest,mcp:u,gatewayOrigin:y,callbacks:{onToolCall:async(e,t)=>{var r,o;return N(l.mcp.url,(r=l,o=e,{request_id:t,app_key:o.app_key||r.app_key,server_id:o.server_id||r.mcp?.server_id||"",tool_call_id:o.tool_call_id,tool_name:o.tool_name,arguments:eg(o.arguments_json)||{},arguments_json:o.arguments_json||"{}"}))}}})}catch(e){if(e instanceof g)return j({evalCase:l,manifest:c,preflight:m,gatewayOrigin:y,cardExpectation:t.cardExpectation,result:ep(e.state,[e_(e)])});return j({evalCase:l,manifest:c,preflight:m,gatewayOrigin:y,result:{...em(),log_id:ef(e,"logId")||ef(e,"log_id"),stream_errors:[e_(e)]},cardExpectation:t.cardExpectation})}return j({evalCase:l,manifest:c,preflight:m,gatewayOrigin:y,cardExpectation:t.cardExpectation,result:ep(e)})}finally{e?.kind==="sse"&&W(e),e=void 0}}function em(){return{request_id:"",tool_calls:[],cards:[],answer:"",trace_events:[],stream_errors:[]}}function ep(e,t=[]){return{request_id:e.requestID,log_id:e.logID,trace_id:e.traceID,tool_calls:e.toolCalls.map(e=>{var t;return{tool_name:e.toolCall.tool_name,tool_call_id:e.toolCall.tool_call_id,app_key:e.toolCall.app_key,server_id:e.toolCall.server_id,arguments:eg(e.toolCall.arguments_json)??e.toolCall.arguments_json,report_code:"number"==typeof e.report?.code?e.report.code:void 0,report_message:"string"==typeof e.report?.message?e.report.message:void 0,result_error:e.result?.is_error,result_preview:(t=e.result?.raw_result_text||e.result?.content||"").length>240?`${t.slice(0,240)}...`:t}}),cards:e.cards,answer:e.answer,trace_events:e.traceEvents,stream_errors:[...e.streamErrors,...t]}}function e_(e){var t;let r=e instanceof Error?e.message:String(e);return{code:ef(e,"code")||"simulator_eval_runtime_error",level:"error",message:r,suggestion:(t=r).includes("fetch failed")||t.includes("ECONNREFUSED")||t.includes("ENOTFOUND")||t.includes("timed out")?"无法连接 Simulator gateway。请检查 --gateway-origin、网络/PPE 泳道、登录环境和代理配置。":t.includes("HTTP 400")||t.includes("HTTP 422")?"请求被 gateway 或 agent 拒绝。请检查 manifest YAML、mcp tools、AppID 和 query 是否匹配;可加 --verbose 查看更多 trace。":t.includes("HTTP 5")?"Simulator 服务端异常。请保留 log_id/request_id 给服务端排查。":t.includes("tool report failed")?"工具结果上报失败。请检查 MCP 返回的 structuredContent/entities 是否符合 manifest 声明。":void 0,details:p(e)?{...e,message:r}:r}}function ef(e,t){if(!p(e))return;let r=e[t];return"string"==typeof r&&r?r:void 0}function eg(e){if("string"==typeof e)try{return JSON.parse(e)}catch{return}}class eh extends Error{details;constructor(e,t){super(e),this.details=t}}let ey={runSimulator:eu,startDemoServer:n,validateFile:ex};function ev(){return new d("check").description("校验配置文件或检查 Agentic Service Simulator 链路").option("--file <file>","校验 manifest.yaml 或 business-templates.yaml").option("--project-path <path>","dbx 项目路径;相对路径参数会基于该目录解析",".").addOption(new u("--demo <name>","运行内置 demo").choices([...r])).option("--query <query>","当前轮用户 query").option("--history <path>","历史消息文件,支持 json/yaml 数组").option("--skill <path>","Skill 目录路径;显式目录优先,相对路径按 --project-path 解析;未传默认 skill/,递归加载所有 SKILL.md").option("--manifest <path>","manifest yaml 文件路径;默认按项目布局自动解析").option("--gateway-origin <url>","Simulator 网关 origin;默认使用 CLI build config apiBaseUrl").addOption(new u("--max-step <count>","Agent 最大循环步数").argParser(l)).addOption(new u("--expect-card <expectation>","当前评测是否期望出卡;required 要求至少一张卡,none 要求不出卡,auto 使用默认诊断").choices(["auto","required","none"]).default("auto")).option("--force","即使 preflight 发现配置错误也继续请求 Simulator",!1).option("--verbose","输出更多 trace 和工具结果摘要",!1).action(async(e,t)=>c(t,t=>ew(e,t)))}async function ew(e,t,r=ey){let o;if(e.file){var n;return((n=e).demo||n.query||n.history||n.skill||n.manifest||n.gatewayOrigin||void 0!==n.maxStep||n.force||n.verbose||"auto"!==n.expectCard)&&t.error("--file cannot be combined with Simulator check options"),r.validateFile(t,(0,b.resolve)(e.projectPath,e.file))}e.demo||e.query||t.error('check requires --file, --demo, or --query. Examples: dbx check --file manifest.yaml; dbx check --demo taxi; dbx check --query "..."');try{return e.demo&&(o=await r.startDemoServer({demo:e.demo,host:"127.0.0.1",port:0,log:t.log})),await eS(t,e,r.runSimulator,o?.streamableUrl)}finally{if(o)try{await o.close()}catch(e){t.warn(`Unable to stop Demo MCP Server: ${String(e)}`)}}}async function eS(e,t,r,o){let n;try{e.targetAppId=(n=await r({projectPath:t.projectPath,demo:t.demo,mcpUrl:o,query:t.query,historyPath:t.history,skillsDirectory:t.skill,manifestPath:t.manifest,gatewayOrigin:t.gatewayOrigin,maxStep:t.maxStep,cardExpectation:t.expectCard,force:t.force,verbose:t.verbose})).case.app_key}catch(a){var i,s;let t,r,o;if(e.json)throw a;let n=(t=p(i=a)?i.details:void 0,{code:e$(r=p(t)?t:void 0,"code"),message:e$(r,"message")||(i instanceof Error&&i.message?i.message:String(i)),suggestion:e$(r,"suggestion"),logId:e$(r,"log_id")||e$(r,"logId")||e$(i,"log_id")||e$(i,"logId"),details:t});throw new m((o=["Agentic Service Check failed before diagnostics could run","","Error",...(s=n).code?[`- code: ${s.code}`]:[],`- message: ${s.message}`,...s.logId?[`- log_id: ${s.logId}`]:[],...s.suggestion?[`- fix: ${s.suggestion}`]:[]],void 0!==s.details&&o.push("","Details",eb(s.details)),o.join("\n")),{details:n.details,logId:n.logId})}if(e.json||function(e,t,r){let o=t.ok?y.green("PASS"):y.red("FAIL");if(e.log(`${y.bold("Agentic Service Check")} ${o}`),e.log(""),e.log(y.bold("Input")),e.log(`- app_id: ${t.case.app_key}`),e.log(`- query: ${t.context.query}`),e.log(`- history_messages: ${t.context.history_count}`),e.log(`- mcp_url: ${t.context.mcp_url||"-"}`),e.log(`- gateway_origin: ${t.context.gateway_origin||"-"}`),e.log(`- max_step: ${t.context.max_step??"-"}`),e.log(`- request_id: ${t.request_id||"-"}`),e.log(`- log_id: ${t.log_id||"-"}`),e.log(""),eC(e,"Preflight",t.preflight,r),e.log(""),e.log(y.bold("Agent Flow")),0===t.tool_calls.length?e.log("- no tool call"):t.tool_calls.forEach((t,o)=>{e.log(`${o+1}. ${y.cyan(t.tool_name)} ${0===t.report_code?y.green("reported"):y.yellow(`report=${t.report_code??"-"}`)}`),e.log(` tool_call_id: ${t.tool_call_id}`),t.app_key&&e.log(` app_id: ${t.app_key}`),e.log(` args: ${JSON.stringify(t.arguments??{})}`),r&&t.result_preview&&e.log(` result: ${t.result_preview}`)}),e.log(""),e.log(y.bold("Cards")),0===t.cards.length?e.log("- no card emitted"):t.cards.forEach((t,r)=>{e.log(`${r+1}. widget_id=${t.widget_id||"-"} entity_id=${t.entity_id||"-"} template=${t.template||"-"}`)}),e.log(""),t.answer&&(e.log(y.bold("Answer")),e.log(t.answer),e.log("")),r&&t.trace_events.length>0){for(let r of(e.log(y.bold("Trace")),t.trace_events))e.log(`- ${r.name||"-"} ${r.status||"-"} ${r.tool_name||""} ${r.summary||""}`);e.log("")}eC(e,"Diagnostics",t.errors,r),e.log(""),e.log(`${y.bold("Verdict")}: ${o}`)}(e,n,t.verbose),!n.ok)throw new m("check failed",{json:n,logId:n.log_id});return n}function eb(e){return"string"==typeof e?e:JSON.stringify(e,null,2)}function e$(e,t){if(!p(e))return;let r=e[t];return"string"==typeof r&&r?r:void 0}function eC(e,t,r,o){if(e.log(y.bold(t)),0===r.length)return void e.log("- none");for(let t of r){let r="error"===t.level?y.red("✗"):"warn"===t.level?y.yellow("!"):y.green("✓");e.log(`${r} ${t.code}: ${t.message}`),t.suggestion&&e.log(` fix: ${t.suggestion}`),o&&void 0!==t.details&&e.log(` details: ${eb(t.details)}`)}}async function ex(e,t){(0,w.existsSync)(t)&&(0,w.statSync)(t).isFile()||e.error(`YAML file not found: ${t}`);let r=(0,w.readFileSync)(t,"utf8"),o=eP(t,e),n=await f(r,"compatible",o),i=n.data,s={valid:!!i?.success,manifest:i?.manifest,errors:eE(i?.errors??[]),warnings:eE(i?.warnings??[]),log_id:n.log_id??""};if("manifest"===o&&p(s.manifest)&&"string"==typeof s.manifest.app_key&&(e.targetAppId=s.manifest.app_key.trim()||void 0),e.log(`${o} validation: ${s.valid?"passed":"failed"}`),e.log(JSON.stringify(s,null,2)),!s.valid)throw new m(`${o} validation failed`,{json:s,logId:s.log_id});return s}function eP(e,t){switch((0,b.basename)(e).toLowerCase()){case"manifest.yaml":return"manifest";case"business-templates.yaml":return"business_templates";default:t.error(`Cannot infer YAML type from filename "${(0,b.basename)(e)}". Use manifest.yaml or business-templates.yaml.`)}}function eE(e){return e.map(e=>({code:e.code,path:e.path,message:e.message}))}export{v as check_namespaceObject};
1
+ let e;import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import"./7945.js";import"./yaml.js";import{DBX_DEMO_NAMES as r,getDBXDemo as o,startMCPDemoServer as n}from"./demo-server.js";import{resolveProjectLayout as i,runtime_skill_layout_resolveRuntimeSkillLayout as s}from"./project-layout.js";import{http_getApiBaseUrl as a,parseInteger as l,runCommand as c,command_Command as d,option_Option as u,CliError as m,isRecord as p}from"./2168.js";import{extractMCPHeadersFromManifest as _}from"./manifest-mcp-config.js";import{verifyYAML as f}from"./app.js";import{SimulatorStreamError as g,runSimulatorStream as h}from"./simulator-client.js";import{source as y}from"./9091.js";var v={};t.r(v),t.d(v,{default:()=>ev,executeCheck:()=>ew,resolveYAMLType:()=>eP});let w=t("node:fs");var S=t.n(w);let b=t("node:path");var $=t.n(b);let C=t("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js"),x=new Set(["USER","ASSISTANT","TOOL"]);function P(e){let t=s(e);if("resolved"!==t.layout)throw k("missing"===t.layout?"skill_layout_missing":"skill_layout_invalid",t.error??`skill directory contains no runtime Skill: ${e}`,"请在选定目录任意层级放置至少一个普通文件 SKILL.md;符号链接不会被加载。");return t.entries.map(e=>e.content)}function E(e,t){if(!S().existsSync(e))throw k(`${t}_file_not_found`,`${t} file not found: ${e}`,`请检查 --${t} 路径;相对路径会按 --project-path 解析。`);if(!S().statSync(e).isFile())throw k(`${t}_path_not_file`,`${t} path must be a file: ${e}`,`请检查 --${t} 路径,不能传目录。`);return S().readFileSync(e,"utf8")}function k(e,t,r){let o=Error(t);return o.details={code:e,message:t,suggestion:r},o}function M(e,t){return $().isAbsolute(e)?e:$().resolve(t,e)}function T(e){return"string"==typeof e&&e.trim()?e:void 0}function j(e){var t,r;let o=[],n=e.preflight.filter(e=>"error"===e.level);for(let i of(o.push(...n),o.push(...(t=e.result.trace_events,r=e.result.request_id,t.filter(e=>e.error).map(e=>({code:String(e.error?.code||"trace_error"),level:"error",message:String(e.error?.user_message||e.error?.message||e.summary||"trace error"),suggestion:q(e.error?.code,r),details:e.error})))),e.result.stream_errors??[]))o.push(function(e){var t;let r=String(e?.message||"stream error"),o=String(e?.code||"stream_error");return{code:o,level:"error",message:r,suggestion:"string"==typeof e?.suggestion?e.suggestion:q(o,"")||((t=r).includes("exceeded max step")?"模型在最大步数内没有收口。请检查 skill 是否让模型重复查询/重复调用工具,或临时调大 --max-step 辅助定位。":t.includes("mcp tool invalid response")?"MCP 工具返回未通过 context post-hook。请对照 manifest 检查 tool_name、entity_type、主键字段和 structuredContent。":void 0),details:e?.details??e}}(i));if(!o.some(e=>"error"===e.level)){let t=e.cardExpectation??"auto";o.push(...function(e,t,r){let o=[];for(let t of e){let e=t.result_preview||"";(t.result_error||e.includes("MCP error")||e.includes("Input validation error"))&&o.push({code:"mcp_tool_result_error",level:"error",message:`MCP tool ${t.tool_name} returned an error result`,suggestion:"工具已被模型调用,但 MCP tools/call 返回业务/参数错误。请检查 Agent Flow 里的 args 与工具入参 schema 是否一致;常见问题是模型传了字符串数字,可在 MCP server 用 z.coerce.number() 或自行兼容转换。",details:{tool_name:t.tool_name,tool_call_id:t.tool_call_id,arguments:t.arguments,result_preview:e}})}return"auto"===r&&e.length>0&&0===t&&0===o.length&&o.push({code:"tool_called_but_no_card",level:"warn",message:"Tool call finished, but no card_delta was emitted",suggestion:"如果这是出卡工具,请检查工具 result 是否包含 structuredContent.entities、entity_type 是否在 manifest.entities 声明、tool_card_binding 是否绑定该工具。"}),o}(e.result.tool_calls,e.result.cards.length,t));let r=e.result.tool_calls.map(e=>e.tool_name),n=e.evalCase.expect?.tool_calls??[];n.length>0&&!function(e,t){let r=0;for(let o of t)if(o===e[r]&&(r+=1),r===e.length)return!0;return 0===e.length}(n,r)&&o.push({code:"expectation_tool_chain_mismatch",level:"error",message:`expected tool chain ${n.join(" -> ")}, actual ${r.join(" -> ")||"-"}`,suggestion:"请检查 skill 的工具流程描述、query 是否表达了对应意图,以及 MCP tools 是否暴露了这些工具。"});let i=e.evalCase.expect?.card;if(i||"required"===t){let t=i?.min_count??1,r=i?.widget_id?e.result.cards.filter(e=>e.widget_id===i.widget_id):e.result.cards;r.length<t&&o.push({code:"card_not_emitted",level:"error",message:i?.widget_id?`expected at least ${t} card(s) with widget_id ${i.widget_id}, actual ${r.length}`:`expected at least ${t} card(s), actual ${e.result.cards.length}`,suggestion:"如果工具已成功,重点检查 manifest.tools、entities.*.tool_card_binding、MCP result structuredContent.entities 和模型是否在工具后触发出卡。"})}for(let r of("none"===t&&e.result.cards.length>0&&o.push({code:"unexpected_card_emitted",level:"error",message:`expected no card, actual ${e.result.cards.length}`,suggestion:"如果当前用例不应出卡,请检查工具是否返回了非空 structuredContent.entities,或检查 manifest 中该工具的 tool_card_binding。"}),e.result.tool_calls))!e.manifest.tools[r.tool_name]&&e.manifest.cardBindings[r.tool_name]&&o.push({code:"card_tool_not_declared",level:"error",message:`${r.tool_name} has card binding but is not declared in manifest.tools`,suggestion:`请在 manifest.tools.${r.tool_name} 中声明 output.entity_types。`})}let i=function(e){let t=new Set,r=[];for(let o of e){if(function(e,t){return"SIMULATOR_STREAM_ERROR"===e.code&&t.some(t=>{if(t.code===e.code)return!1;if(e.message.includes(t.message))return!0;let r=A(function(e,t){if(!p(e))return;let r=e[t];return p(r)?r:void 0}(t.details,"details"),"raw_error")||A(t.details,"raw_error");return void 0!==r&&e.message.includes(r)})}(o,r))continue;let e=`${o.level}\u0000${o.code}\u0000${o.message}`;t.has(e)||(t.add(e),r.push(o))}return r}(o),s=0===i.filter(e=>"error"===e.level).length;return{ok:s,verdict:s?"PASS":"FAIL",case:e.evalCase,context:{history_count:e.evalCase.history_messages?.length??0,query:e.evalCase.query,mcp_url:e.evalCase.mcp.url,gateway_origin:e.gatewayOrigin,max_step:e.evalCase.max_step},preflight:e.preflight,errors:i,...e.result}}function A(e,t){if(!p(e))return;let r=e[t];return"string"==typeof r&&r?r:void 0}function q(e,t){return"miniapp_mcp_result_invalid"===e?"MCP 工具返回未通过智能服务协议校验。请检查返回 JSON 是否包含 content/structuredContent,entity_type 是否在 manifest.entities 中声明,实体主键字段是否匹配 is_entity_id。":"agent_run_failed"===e?`Agent 运行失败。请查看 request_id=${t||"-"} 对应 trace,重点关注是否重复 tool call、max_step 不足或模型没有触发卡片输出。`:"tool_call_or_report_failed"===e?"工具调用或结果上报失败。请检查 MCP tools/call 是否可用,以及返回的 structuredContent/entities 是否符合 manifest 声明。":void 0}let O="2025-11-25",I=["application/json","text/event-stream"];async function L(e,t,r){return Z(e)?R(e,t,r):U(e,t,r)}async function N(t,r){var o,n;if(e&&(o=e.url,n=t,Q(o)===Q(n)))return function(e){var t;let r=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return e;let{_response_meta:t,...r}=e;return r}(e);if(!r||"object"!=typeof r){let e=String(r??"");return{content:e,raw_result_text:e,raw_mcp_result_json:e}}if("string"==typeof r.content||"raw_mcp_result_json"in r||"raw_result_text"in r||"structured"in r){let e="string"==typeof r.content?r.content:JSON.stringify(r.content??""),t=r.raw_mcp_result_json||r.raw_result_text||e;return{...r,content:e,raw_result_text:r.raw_result_text||t,raw_mcp_result_json:r.raw_mcp_result_json||t,structured:r.structured??r.structuredContent,is_error:r.is_error??r.isError}}let o=JSON.stringify(r);return{content:o,structured:r.structuredContent,raw_result_text:o,raw_mcp_result_json:o,is_error:!0===r.isError,miniapp:(t=r,Array.isArray(t?.content)&&t?.structuredContent&&"object"==typeof t.structuredContent)?{is_mini_app:!0,mcp_channel:"flow_miniapp"}:void 0}}("sse"===e.kind?await H(e,r):await D(e,r));throw Error("MCP session is not initialized. Please ensure fetchMCPDescriptor runs before tools/call.")}async function U(t,r,o){let n=B(t);try{let t=await Y(n,{jsonrpc:"2.0",id:1,method:"initialize",params:{protocolVersion:O,capabilities:{},clientInfo:{name:"dbx-simulator-eval",version:"0.1.0"}}},{headers:o}),i=t.body.result?.protocolVersion??O,s=t.headers.get("mcp-session-id")??void 0;e={kind:"streamable",url:n,sessionID:s,protocolVersion:i,headers:o},await Y(n,{jsonrpc:"2.0",method:"notifications/initialized",params:{}},{sessionID:s,protocolVersion:i,allowEmpty:!0,headers:o});let a=await Y(n,{jsonrpc:"2.0",id:2,method:"tools/list",params:{}},{sessionID:s,protocolVersion:i,headers:o});return{tools:{server_id:ee(n),name:ee(n),description:"Standard MCP Streamable HTTP server",app_key:r,protocol:"streamable_http",tools:(a.body.result?.tools??[]).map(e=>({name:e.name,description:e.description??"",input_schema_json:JSON.stringify(e.inputSchema??e.input_schema??{})}))}}}catch(r){e=void 0;let t=Error("standard MCP Streamable HTTP initialize/tools/list failed");throw t.cause=r,t}}async function R(t,r,o){let n=G(t),i={kind:"sse",url:n,pending:new Map,headers:o};e=i;try{await K(i,{jsonrpc:"2.0",id:1,method:"initialize",params:{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"dbx-simulator-eval",version:"0.1.0"}}},!1),await K(i,{jsonrpc:"2.0",method:"notifications/initialized",params:{}},!0);let e=await K(i,{jsonrpc:"2.0",id:2,method:"tools/list",params:{}},!1);return{tools:{server_id:ee(n),name:ee(n),description:"Standard MCP SSE server",app_key:r,protocol:"sse",tools:(e.result?.tools??[]).map(e=>({name:e.name,description:e.description??"",input_schema_json:JSON.stringify(e.inputSchema??e.input_schema??{})}))}}}catch(r){W(i),e=void 0;let t=Error("standard MCP SSE initialize/tools/list failed");throw t.cause=r,t}}async function D(e,t){let r=ei(t.tool_name);if(!r)throw Error("MCP tool name is empty");return(await Y(e.url,{jsonrpc:"2.0",id:Date.now(),method:"tools/call",params:{name:r,arguments:es(t.arguments)??ea(ei(t.arguments_json))??{}}},{sessionID:e.sessionID,protocolVersion:e.protocolVersion,headers:e.headers})).body.result}async function H(e,t){let r=ei(t.tool_name);if(!r)throw Error("MCP tool name is empty");return(await K(e,{jsonrpc:"2.0",id:Date.now(),method:"tools/call",params:{name:r,arguments:es(t.arguments)??ea(ei(t.arguments_json))??{}}},!1)).result}async function K(e,t,r){let o;if(await J(e),!e.endpointURL)throw Error("MCP SSE did not provide endpoint event");let n=et(t),i=er(t)||"unknown",s=eo(t),a=s?`${i}:${s}`:i,l=null!==n,c=l?new Promise((t,r)=>{let o=setTimeout(()=>{e.pending.delete(n),r(Error(`MCP SSE request timed out: ${a}`))},1e4);e.pending.set(n,{resolve:t,reject:r,timeout:o})}):void 0;try{var d;let r;o=await X(e.endpointURL,{method:"POST",headers:(d=e.headers,(r=new Headers(d)).set("Content-Type","application/json"),r),body:JSON.stringify(t)},1e4,`MCP SSE POST ${a}`)}catch(t){throw l&&V(e,n),t}if(await o.text(),!o.ok)throw l&&V(e,n),Error(`MCP SSE POST failed: HTTP ${o.status}`);if(!l)return{};let u=await c;if(!u&&!r)throw Error("MCP SSE returned empty response");if(u?.error)throw Error(`MCP SSE error: [${u.error.code}]`);return u}async function J(e){if(e.ready)return e.ready;let t=new AbortController;return e.abortController=t,e.ready=new Promise((r,o)=>{let n=!1,i=setTimeout(()=>{t.abort(),s(Error("MCP SSE endpoint event timed out"))},1e4),s=e=>{n||(n=!0,clearTimeout(i),o(e))};z(e,t,t=>{e.endpointURL=new URL(t,e.url).toString(),n||(n=!0,clearTimeout(i),r())},s)}).catch(t=>{throw W(e,t),t}),e.ready}async function z(e,t,r,o){try{var n;let i,s=await fetch(e.url,{method:"GET",headers:(n=e.headers,(i=new Headers(n)).set("Accept","text/event-stream"),i),signal:t.signal});if(!s.ok||!s.body){await s.text(),o(Error(`MCP SSE GET failed: HTTP ${s.status}`));return}if(!String(s.headers.get("content-type")??"").toLowerCase().includes("text/event-stream"))return void o(Error(`MCP SSE GET content-type=${s.headers.get("content-type")??"-"}`));await F(e,s.body,r),t.signal.aborted||W(e,Error("MCP SSE stream closed"))}catch(r){if(!t.signal.aborted){let t=r instanceof Error?r:Error(String(r));o(t),W(e,t)}}}async function F(e,t,r){let o=t.getReader(),n=new TextDecoder,i="",s="message",a=[],l=()=>{if(0===a.length){s="message";return}(function(e,t,r,o){let n;if("endpoint"===t)return o(r.trim());if(!r.trim())return;try{n=JSON.parse(r)}catch{return}let i=n.id;if(null==i)return;let s=e.pending.get(i);s&&(clearTimeout(s.timeout),e.pending.delete(i),s.resolve(n))})(e,s,a.join("\n"),r),s="message",a=[]};for(;;){let{done:e,value:t}=await o.read();if(e)break;let r=(i+=n.decode(t,{stream:!0})).search(/\r?\n/);for(;r>=0;){let e=i.slice(0,r).replace(/\r$/,"");i=i.slice(r+("\r"===i[r]&&"\n"===i[r+1]?2:1)),""===e?l():e.startsWith("event:")?s=e.slice(6).trim():e.startsWith("data:")&&a.push(e.slice(5).trimStart()),r=i.search(/\r?\n/)}}i&&a.push(i),l()}function V(e,t){if(null===t)return;let r=e.pending.get(t);r&&(clearTimeout(r.timeout),e.pending.delete(t))}function W(e,t=Error("MCP SSE session closed")){for(let[r,o]of(e.abortController?.abort(),e.abortController=void 0,e.endpointURL=void 0,e.ready=void 0,e.pending.entries()))clearTimeout(o.timeout),o.reject(t),e.pending.delete(r)}async function Y(e,t,r){var o,n;let i,s,a,l=er(t)||"unknown",c=eo(t),d=c?`${l}:${c}`:l,u=await X(e,{method:"POST",headers:(o=t,(i=new Headers((n=r).headers)).set("Content-Type","application/json"),i.set("Accept",I.join(", ")),(s=er(o))&&i.set("Mcp-Method",s),(a=eo(o))&&i.set("Mcp-Name",a),n.protocolVersion&&i.set("MCP-Protocol-Version",n.protocolVersion),n.sessionID&&i.set("Mcp-Session-Id",n.sessionID),i),body:JSON.stringify(t)},1e4,`MCP Streamable HTTP ${d}`),m=await u.text();if(!u.ok)throw Error(`MCP Streamable HTTP failed: HTTP ${u.status}`);if(!m&&r.allowEmpty)return{body:{},headers:u.headers};if(!m)throw Error("MCP Streamable HTTP returned empty response");let p=function(e,t,r){if(t?.toLowerCase().includes("text/event-stream")){let t=function(e){let t=[],r=[],o=()=>{if(0===r.length)return;let e=r.join("\n");e.trim()&&t.push(JSON.parse(e)),r=[]};for(let t of e.split(/\r?\n/)){if(""===t){o();continue}t.startsWith("data:")&&r.push(t.slice(5).trimStart())}return o(),t}(e),o=t.find(e=>{var t,o;return t=e,null!==(o=r)&&en(t)&&t.id===o})??t.find(en);if(!o)throw Error("MCP SSE response has no JSON-RPC response");return o}return JSON.parse(e)}(m,u.headers.get("content-type"),et(t));if(p.error)throw Error(`MCP Streamable HTTP error: [${p.error.code}]`);return{body:p,headers:u.headers}}function B(e){let t=new URL(e);return("/"===t.pathname||""===t.pathname)&&(t.pathname="/mcp"),t.toString()}function G(e){return new URL(e).toString()}function Z(e){return new URL(e).pathname.replace(/\/+$/,"").toLowerCase().endsWith("/sse")}function Q(e){return Z(e)?G(e):B(e)}async function X(e,t,r,o){let n=new AbortController,i=setTimeout(()=>n.abort(),r);try{return await fetch(e,{...t,signal:n.signal})}catch(e){if(e instanceof Error&&"AbortError"===e.name)throw Error(`${o} timed out after ${r}ms`);throw e}finally{clearTimeout(i)}}function ee(e){let t=new URL(e);return`${t.hostname}_${t.port||t.protocol.replace(":","")}${t.pathname.replace(/[^A-Za-z0-9_-]/g,"_")}`}function et(e){return e&&"object"==typeof e&&"id"in e?e.id??null:null}function er(e){if(e&&"object"==typeof e&&"method"in e)return e.method}function eo(e){if(!e||"object"!=typeof e)return;let t=e.params;return t&&"object"==typeof t?"string"==typeof t.name?t.name:"string"==typeof t.uri?t.uri:void 0:void 0}function en(e){return!!(e&&"object"==typeof e&&"id"in e&&("result"in e||"error"in e))}function ei(e){return"string"==typeof e?e:""}function es(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:void 0}function ea(e){if(e)try{return JSON.parse(e)}catch{return}}function el(e,t){return{code:e,level:"info",message:t}}function ec(e,t,r){return{code:e,level:"warn",message:t,suggestion:r}}function ed(e,t,r){return{code:e,level:"error",message:t,suggestion:r}}async function eu(t){try{let e,n=function(e){let t=$().resolve(e.projectPath),n=i(t),s={...e.demo?function(e){try{return o(e).evalCase}catch{throw Error(`unknown dbx check demo: ${e}. Supported demos: ${r.join(", ")}`)}}(e.demo):{},...e.query?{query:e.query}:{},...void 0!==e.maxStep?{max_step:e.maxStep}:{}};if(e.historyPath&&(s.history_messages=function(e){if(!S().existsSync(e))throw k("history_file_not_found",`history file not found: ${e}`,"请检查 --history 路径;历史文件应为消息数组。");let t=function(e,t,r){try{return t.endsWith(".json")?JSON.parse(e):C.qg(e)}catch(e){throw k(`${r}_file_parse_failed`,`${r} file parse failed: ${e?.message||String(e)}`,`请检查 ${t} 的语法和缩进。`)}}(S().readFileSync(e,"utf8"),e,"history");if(!Array.isArray(t))throw k("history_file_invalid","history file must be an array","请把 history 文件写成数组,例如 [{ role: USER, content: hello }]。");return t}(M(e.historyPath,t))),e.skillsDirectory?s.skills=P(M(e.skillsDirectory,t)):s.skills||(s.skills=P(n.skillDirectory)),e.manifestPath)s.manifest=E(M(e.manifestPath,t),"manifest");else{var a;if(s.manifest&&((a=s.manifest).includes("/")||a.endsWith(".json")||a.endsWith(".yaml")||a.endsWith(".yml")))s.manifest=E(M(s.manifest,t),"manifest");else if(!s.manifest){let e=n.manifestPath;S().existsSync(e)&&(s.manifest=E(e,"manifest"))}}if(e.mcpUrl&&(s.manifest=function(e,t){if("string"!=typeof e)return;if(!e.trim())return e;let r=C.Tp(e);return r.setIn(["mcp_server","end_point"],t),r.setIn(["mcp_server","mcp_config","protocol"],"Streamable"),r.toString()}(s.manifest,e.mcpUrl)),function(e){if(!e.query||"string"!=typeof e.query||!e.query.trim())throw k("query_required","dbx check requires query","请通过 --query 传入本轮用户问题。");if(!Array.isArray(e.skills)||0===e.skills.length||e.skills.some(e=>"string"!=typeof e))throw k("skill_required","dbx check requires at least one Skill","请在项目 skill/ 中放置至少一个 SKILL.md,或通过 --skill 传入 Skill 目录。");if(!e.manifest||"string"!=typeof e.manifest)throw k("manifest_required","dbx check requires manifest YAML text or path","请在项目 manifest.yaml 放置 Manifest,或通过 --manifest 传入路径。")}(s),s.history_messages=(s.history_messages??[]).map((e,t)=>{if(!e||"object"!=typeof e)throw k("history_message_invalid",`history_messages[${t}] must be an object`,"请把每条历史消息写成 { role: USER|ASSISTANT|TOOL, content: string }。");let r=String(e.role||"").toUpperCase();if(!x.has(r))throw k("history_message_role_invalid",`history_messages[${t}].role must be USER, ASSISTANT or TOOL`,"请把 role 改成 USER、ASSISTANT 或 TOOL。");if("string"!=typeof e.content||!e.content.trim())throw k("history_message_content_invalid",`history_messages[${t}].content must be a non-empty string`,"请为该历史消息补充非空 content。");return{role:r,content:e.content}}),s.max_step=s.max_step??15,!Number.isInteger(s.max_step)||s.max_step<=0)throw k("max_step_invalid","max_step must be a positive integer","请删除 max_step 使用默认值 15,或通过 --max-step 传入正整数。");return s}(t),s=await f(n.manifest,"compatible");if(!s.data?.success||!s.data.manifest)throw new eh("manifest validation failed",{code:"manifest_validation_failed",message:"manifest validation failed",errors:s.data?.errors??[],warnings:s.data?.warnings??[],log_id:s.log_id});let l=function(e,t){if(!p(t))throw k("manifest_parse_result_missing","dbx check requires parsed manifest from yaml verify","请先确认后端 /yaml/verify 返回 data.manifest。");let r=p(t.mcp_server)?t.mcp_server:void 0,o=T(t.app_key),n=T(r?.end_point);if(!o)throw k("app_id_required","dbx check requires manifest AppID","请在 manifest.yaml 配置 app_key(该字段对外称 AppID)。");if(!n)throw k("mcp_url_required","dbx check requires manifest mcp_server.end_point","请在 manifest.yaml 配置 mcp_server.end_point。");return function(e,t,r){try{let t=new URL(e);if("http:"===t.protocol||"https:"===t.protocol)return}catch{}throw k(t,`${r} must be an http(s) URL: ${e}`,`请把 ${r} 配置为 http:// 或 https:// 开头的 MCP endpoint。`)}(n,"mcp_url_invalid","manifest.mcp_server.end_point"),{...e,app_key:o,app_name:T(t.name),mcp:{url:n,description:T(r?.description),headers:_(t)}}}(n,s.data.manifest),c=function(e){if(!p(e)){var t;let e;throw t="manifest must be a parsed object",(e=Error(t)).details={code:"manifest_yaml_invalid",message:t,suggestion:"请先运行 `dbx check --file <manifest.yaml>`,确认后端能解析 manifest。"},e}let r=p(e.tools)?e.tools:{},o=p(e.entities)?e.entities:{},n={};for(let e of Object.values(o))if(p(e)&&p(e.tool_card_binding))for(let[t,r]of Object.entries(e.tool_card_binding))"string"==typeof r&&(n[t]=r);return{raw:e,appKey:"string"==typeof e.app_key?e.app_key:void 0,tools:r,entities:o,cardBindings:n}}(s.data.manifest),d=await L(l.mcp.url,l.app_key,l.mcp.headers).catch(e=>{var t,r,o;let n,i,s,a,c,d=(t=e,r=l.mcp.url,(c=(o=a=String(t?.message||t),i=(n=o.match(/<pre>([\s\S]*?)<\/pre>/i)?.[1])?n.replace(/<br\s*\/?>/gi,"\n").replace(/&nbsp;/g," ").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&"):o,(s=i.match(/(?:TypeError|ReferenceError|SyntaxError|Error):[^\n<]+/)?.[0])?s.trim():/HTTP 5\d\d/.test(o)?"MCP server returned HTTP 5xx":void 0))?{code:"mcp_server_internal_error",message:`MCP server returned an internal error while handling initialize/tools/list: ${c}`,suggestion:"CLI 已连上 MCP server,但 MCP server 在 initialize 或 tools/list 内部报错。请查看 MCP server 终端日志和报错堆栈,优先修 server 代码。",details:{url:r,raw_error:a,server_error:c}}:{code:"mcp_unreachable",message:a,suggestion:"请先启动标准 MCP server,并确认 manifest.mcp_server.end_point 指向 CLI 当前运行环境可访问的 Streamable HTTP /mcp 或 SSE /sse 地址;不要求公网 URL。",details:{url:r,raw_error:a}});throw new eh(`MCP server unreachable: ${l.mcp.url}`,d)}),u={...d.tools,server_id:l.mcp.server_id||d.tools.server_id,name:l.mcp.name||d.tools.name,description:l.mcp.description||d.tools.description},m=[...function(e){let t=[],{evalCase:r,manifest:o,mcp:n}=e,i=new Set(n.tools.map(e=>e.name).filter(Boolean)),s=Object.keys(o.tools),a=new Set(s);if(o.appKey===r.app_key?t.push(el("manifest_app_id_match",`manifest AppID matches request AppID (${r.app_key})`)):t.push(ed("manifest_app_id_mismatch",`manifest AppID (${o.appKey||"-"}) does not match request AppID (${r.app_key})`,"请保持请求 AppID 与 manifest.app_key 一致;如果走特殊测试链路会改写 AppID,需要确认后端映射规则。")),n.tools.length>0){let e="sse"===n.protocol?"SSE /sse":"Streamable HTTP /mcp";t.push(el("mcp_tools_loaded",`MCP exposes ${n.tools.length} tool(s) via ${e}`))}else t.push(ed("mcp_tools_empty","MCP did not expose any tool","请检查标准 MCP tools/list 是否返回 tools。Streamable HTTP 传 /mcp,SSE 传 /sse。"));for(let e of s)i.has(e)||t.push(ed("manifest_tool_missing_in_mcp",`manifest.tools declares ${e}, but MCP does not expose it`,"请确保会出卡的 tool 同时存在于 MCP tools 与 manifest.tools。"));for(let e of r.expect?.tool_calls??[])a.has(e)||t.push(ed("expected_tool_missing_in_manifest",`expect.tool_calls declares ${e}, but manifest.tools does not declare it`,`请在 manifest.tools.${e} 中声明该工具;非出卡工具也需要配置 output.kind,例如 execution_result。`)),i.has(e)||t.push(ed("expected_tool_missing_in_mcp",`expect.tool_calls declares ${e}, but MCP does not expose it`,"请确认 MCP tools/list 返回了期望调用的工具,或修正内置 demo 的 expect.tool_calls。"));let l=Object.keys(o.cardBindings);if(l.length>0)t.push(el("card_binding_found",`card binding found: ${l.map(e=>`${e} -> ${o.cardBindings[e]}`).join(", ")}`));else{var c,d;let e=(c=r,d=o,c.expect?.card||Object.values(d.tools).some(e=>p(e)&&p(e.output)&&"entities"===e.output.kind))?ed:ec;t.push(e("card_binding_missing","manifest.entities has no tool_card_binding","如果期望出卡,请在对应 entity 下配置 tool_card_binding,例如 Taxi_order: tpl.taxi_order。"))}for(let[e,r]of Object.entries(o.entities))p(r)&&p(r.schema)&&0===Object.entries(r.schema).filter(([,e])=>p(e)&&!0===e.is_entity_id).length&&t.push(ed("entity_id_missing",`manifest.entities.${e}.schema has no is_entity_id field`,"请为实体配置一个稳定主键字段,例如 product_id: { type: string, is_entity_id: true }。"));return t}({evalCase:l,manifest:c,mcp:u}),...function(e){let t=[];for(let r of e.tools){let e=eg(r.input_schema_json);if(e)for(let o of function e(t,r){let o=[];if(!p(t))return o;for(let e of["exclusiveMinimum","exclusiveMaximum"]){let n=t[e];"number"==typeof n&&o.push({path:`${r}/${e}`,value:n,message:`${e} is number ${n}, but simulator backend expects boolean`,suggestion:"如果使用 zod,避免 z.number().positive()/min()/max() 生成数值型 exclusiveMinimum/exclusiveMaximum;可改为 z.coerce.number() 并在工具内部校验业务范围。"})}for(let[n,i]of Object.entries(t))p(i)&&o.push(...e(i,`${r}/${n}`)),Array.isArray(i)&&i.forEach((t,i)=>{o.push(...e(t,`${r}/${n}/${i}`))});return o}(e,`tools/${r.name}/inputSchema`))t.push({code:"mcp_tool_schema_incompatible",level:"error",message:`MCP tool ${r.name} inputSchema is not compatible: ${o.message}`,suggestion:o.suggestion,details:{tool_name:r.name,path:o.path,value:o.value}})}return t}(u)],y=t.gatewayOrigin||a();if(!t.force&&m.some(e=>"error"===e.level))return j({evalCase:l,manifest:c,preflight:m,gatewayOrigin:y,cardExpectation:t.cardExpectation,result:em()});try{e=await h({evalCase:l,manifestYAML:l.manifest,mcp:u,gatewayOrigin:y,callbacks:{onToolCall:async(e,t)=>{var r,o;return N(l.mcp.url,(r=l,o=e,{request_id:t,app_key:o.app_key||r.app_key,server_id:o.server_id||r.mcp?.server_id||"",tool_call_id:o.tool_call_id,tool_name:o.tool_name,arguments:eg(o.arguments_json)||{},arguments_json:o.arguments_json||"{}"}))}}})}catch(e){if(e instanceof g)return j({evalCase:l,manifest:c,preflight:m,gatewayOrigin:y,cardExpectation:t.cardExpectation,result:ep(e.state,[e_(e)])});return j({evalCase:l,manifest:c,preflight:m,gatewayOrigin:y,result:{...em(),log_id:ef(e,"logId")||ef(e,"log_id"),stream_errors:[e_(e)]},cardExpectation:t.cardExpectation})}return j({evalCase:l,manifest:c,preflight:m,gatewayOrigin:y,cardExpectation:t.cardExpectation,result:ep(e)})}finally{e?.kind==="sse"&&W(e),e=void 0}}function em(){return{request_id:"",tool_calls:[],cards:[],answer:"",trace_events:[],stream_errors:[]}}function ep(e,t=[]){return{request_id:e.requestID,log_id:e.logID,trace_id:e.traceID,tool_calls:e.toolCalls.map(e=>{var t;return{tool_name:e.toolCall.tool_name,tool_call_id:e.toolCall.tool_call_id,app_key:e.toolCall.app_key,server_id:e.toolCall.server_id,arguments:eg(e.toolCall.arguments_json)??e.toolCall.arguments_json,report_code:"number"==typeof e.report?.code?e.report.code:void 0,report_message:"string"==typeof e.report?.message?e.report.message:void 0,result_error:e.result?.is_error,result_preview:(t=e.result?.raw_result_text||e.result?.content||"").length>240?`${t.slice(0,240)}...`:t}}),cards:e.cards,answer:e.answer,trace_events:e.traceEvents,stream_errors:[...e.streamErrors,...t]}}function e_(e){var t;let r=e instanceof Error?e.message:String(e);return{code:ef(e,"code")||"simulator_eval_runtime_error",level:"error",message:r,suggestion:(t=r).includes("fetch failed")||t.includes("ECONNREFUSED")||t.includes("ENOTFOUND")||t.includes("timed out")?"无法连接 Simulator gateway。请检查 --gateway-origin、网络/PPE 泳道、登录环境和代理配置。":t.includes("HTTP 400")||t.includes("HTTP 422")?"请求被 gateway 或 agent 拒绝。请检查 manifest YAML、mcp tools、AppID 和 query 是否匹配;可加 --verbose 查看更多 trace。":t.includes("HTTP 5")?"Simulator 服务端异常。请保留 log_id/request_id 给服务端排查。":t.includes("tool report failed")?"工具结果上报失败。请检查 MCP 返回的 structuredContent/entities 是否符合 manifest 声明。":void 0,details:p(e)?{...e,message:r}:r}}function ef(e,t){if(!p(e))return;let r=e[t];return"string"==typeof r&&r?r:void 0}function eg(e){if("string"==typeof e)try{return JSON.parse(e)}catch{return}}class eh extends Error{details;constructor(e,t){super(e),this.details=t}}let ey={runSimulator:eu,startDemoServer:n,validateFile:ex};function ev(){return new d("check").description("校验配置文件或检查 Agentic Service Simulator 链路").option("--file <file>","校验 manifest.yaml 或 business-templates.yaml").option("--project-path <path>","dbx 项目路径;相对路径参数会基于该目录解析",".").addOption(new u("--demo <name>","运行内置 demo").choices([...r])).option("--query <query>","当前轮用户 query").option("--history <path>","历史消息文件,支持 json/yaml 数组").option("--skill <path>","Skill 目录路径;显式目录优先,相对路径按 --project-path 解析;未传默认 skill/,递归加载所有 SKILL.md").option("--manifest <path>","manifest yaml 文件路径;默认按项目布局自动解析").option("--gateway-origin <url>","Simulator 网关 origin;默认使用 CLI build config apiBaseUrl").addOption(new u("--max-step <count>","Agent 最大循环步数").argParser(l)).addOption(new u("--expect-card <expectation>","当前评测是否期望出卡;required 要求至少一张卡,none 要求不出卡,auto 使用默认诊断").choices(["auto","required","none"]).default("auto")).option("--force","即使 preflight 发现配置错误也继续请求 Simulator",!1).option("--verbose","输出更多 trace 和工具结果摘要",!1).action(async(e,t)=>c(t,t=>ew(e,t)))}async function ew(e,t,r=ey){let o;if(e.file){var n;return((n=e).demo||n.query||n.history||n.skill||n.manifest||n.gatewayOrigin||void 0!==n.maxStep||n.force||n.verbose||"auto"!==n.expectCard)&&t.error("--file cannot be combined with Simulator check options"),r.validateFile(t,(0,b.resolve)(e.projectPath,e.file))}e.demo||e.query||t.error('check requires --file, --demo, or --query. Examples: dbx check --file manifest.yaml; dbx check --demo taxi; dbx check --query "..."');try{return e.demo&&(o=await r.startDemoServer({demo:e.demo,host:"127.0.0.1",port:0,log:t.log})),await eS(t,e,r.runSimulator,o?.streamableUrl)}finally{if(o)try{await o.close()}catch(e){t.warn(`Unable to stop Demo MCP Server: ${String(e)}`)}}}async function eS(e,t,r,o){let n;try{e.targetAppId=(n=await r({projectPath:t.projectPath,demo:t.demo,mcpUrl:o,query:t.query,historyPath:t.history,skillsDirectory:t.skill,manifestPath:t.manifest,gatewayOrigin:t.gatewayOrigin,maxStep:t.maxStep,cardExpectation:t.expectCard,force:t.force,verbose:t.verbose})).case.app_key}catch(a){var i,s;let t,r,o;if(e.json)throw a;let n=(t=p(i=a)?i.details:void 0,{code:e$(r=p(t)?t:void 0,"code"),message:e$(r,"message")||(i instanceof Error&&i.message?i.message:String(i)),suggestion:e$(r,"suggestion"),logId:e$(r,"log_id")||e$(r,"logId")||e$(i,"log_id")||e$(i,"logId"),details:t});throw new m((o=["Agentic Service Check failed before diagnostics could run","","Error",...(s=n).code?[`- code: ${s.code}`]:[],`- message: ${s.message}`,...s.logId?[`- log_id: ${s.logId}`]:[],...s.suggestion?[`- fix: ${s.suggestion}`]:[]],void 0!==s.details&&o.push("","Details",eb(s.details)),o.join("\n")),{details:n.details,logId:n.logId})}if(e.json||function(e,t,r){let o=t.ok?y.green("PASS"):y.red("FAIL");if(e.log(`${y.bold("Agentic Service Check")} ${o}`),e.log(""),e.log(y.bold("Input")),e.log(`- app_id: ${t.case.app_key}`),e.log(`- query: ${t.context.query}`),e.log(`- history_messages: ${t.context.history_count}`),e.log(`- mcp_url: ${t.context.mcp_url||"-"}`),e.log(`- gateway_origin: ${t.context.gateway_origin||"-"}`),e.log(`- max_step: ${t.context.max_step??"-"}`),e.log(`- request_id: ${t.request_id||"-"}`),e.log(`- log_id: ${t.log_id||"-"}`),e.log(""),eC(e,"Preflight",t.preflight,r),e.log(""),e.log(y.bold("Agent Flow")),0===t.tool_calls.length?e.log("- no tool call"):t.tool_calls.forEach((t,o)=>{e.log(`${o+1}. ${y.cyan(t.tool_name)} ${0===t.report_code?y.green("reported"):y.yellow(`report=${t.report_code??"-"}`)}`),e.log(` tool_call_id: ${t.tool_call_id}`),t.app_key&&e.log(` app_id: ${t.app_key}`),e.log(` args: ${JSON.stringify(t.arguments??{})}`),r&&t.result_preview&&e.log(` result: ${t.result_preview}`)}),e.log(""),e.log(y.bold("Cards")),0===t.cards.length?e.log("- no card emitted"):t.cards.forEach((t,r)=>{e.log(`${r+1}. widget_id=${t.widget_id||"-"} entity_id=${t.entity_id||"-"} template=${t.template||"-"}`)}),e.log(""),t.answer&&(e.log(y.bold("Answer")),e.log(t.answer),e.log("")),r&&t.trace_events.length>0){for(let r of(e.log(y.bold("Trace")),t.trace_events))e.log(`- ${r.name||"-"} ${r.status||"-"} ${r.tool_name||""} ${r.summary||""}`);e.log("")}eC(e,"Diagnostics",t.errors,r),e.log(""),e.log(`${y.bold("Verdict")}: ${o}`)}(e,n,t.verbose),!n.ok)throw new m("check failed",{json:n,logId:n.log_id});return n}function eb(e){return"string"==typeof e?e:JSON.stringify(e,null,2)}function e$(e,t){if(!p(e))return;let r=e[t];return"string"==typeof r&&r?r:void 0}function eC(e,t,r,o){if(e.log(y.bold(t)),0===r.length)return void e.log("- none");for(let t of r){let r="error"===t.level?y.red("✗"):"warn"===t.level?y.yellow("!"):y.green("✓");e.log(`${r} ${t.code}: ${t.message}`),t.suggestion&&e.log(` fix: ${t.suggestion}`),o&&void 0!==t.details&&e.log(` details: ${eb(t.details)}`)}}async function ex(e,t){(0,w.existsSync)(t)&&(0,w.statSync)(t).isFile()||e.error(`YAML file not found: ${t}`);let r=(0,w.readFileSync)(t,"utf8"),o=eP(t,e),n=await f(r,"compatible",o),i=n.data,s={valid:!!i?.success,manifest:i?.manifest,errors:eE(i?.errors??[]),warnings:eE(i?.warnings??[]),log_id:n.log_id??""};if("manifest"===o&&p(s.manifest)&&"string"==typeof s.manifest.app_key&&(e.targetAppId=s.manifest.app_key.trim()||void 0),e.log(`${o} validation: ${s.valid?"passed":"failed"}`),e.log(JSON.stringify(s,null,2)),!s.valid)throw new m(`${o} validation failed`,{json:s,logId:s.log_id});return s}function eP(e,t){switch((0,b.basename)(e).toLowerCase()){case"manifest.yaml":return"manifest";case"business-templates.yaml":return"business_templates";default:t.error(`Cannot infer YAML type from filename "${(0,b.basename)(e)}". Use manifest.yaml or business-templates.yaml.`)}}function eE(e){return e.map(e=>({code:e.code,path:e.path,message:e.message}))}export{v as check_namespaceObject};
@@ -1,4 +1,4 @@
1
- import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./9635.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"./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}
2
2
  `),i.write(`data: ${"string"==typeof t?t:JSON.stringify(t)}
3
3
 
4
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};
@@ -1,2 +1,2 @@
1
- import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./9635.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:
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
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};