@doubao-dev/cli 0.0.26 → 0.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/2168.js +14 -14
- package/dist/{2861.js → 2611.js} +2 -2
- package/dist/4931.js +1 -1
- package/dist/@byted-doubao-apps/template-empty/package.json +3 -3
- package/dist/@byted-doubao-apps/template-starter/package.json +3 -3
- package/dist/app.js +1 -1
- package/dist/assets/web-sdk-debugger/index.html +1 -1
- package/dist/assets/web-sdk-debugger/static/js/index.1448a806d8.js +26 -0
- package/dist/assets/web-sdk-debugger/wsd/doubao-apps-api.template.js +0 -0
- package/dist/assets/web-sdk-debugger/wsd/doubao-apps-framework.template.js +0 -0
- package/dist/check.js +1 -0
- package/dist/dbx.js +2 -2
- package/dist/demo-server.js +3 -3
- package/dist/demo.js +2 -0
- package/dist/dev-shell.js +1 -1
- package/dist/dev.js +5 -5
- package/dist/init.js +4 -4
- package/dist/ink.js +1 -1
- package/dist/login.js +1 -1
- package/dist/prompt.js +1 -1
- package/dist/run.js +2 -2
- package/dist/sdk.js +15 -15
- package/dist/sdk~1.js +5 -5
- package/dist/skill.js +1 -1
- package/dist/skills.js +1 -1
- package/dist/skills~2.js +2 -2
- package/dist/templates/README.md +1 -1
- package/dist/upload.js +6 -6
- package/dist/workspace.js +1 -1
- package/dist/yaml.js +1 -1
- package/package.json +2 -2
- package/skills/dbx-eval/SKILL.md +2 -2
- package/skills/doubao-agentic-service-development/SKILL.md +8 -8
- package/skills/doubao-agentic-service-development/references/auth.md +2 -2
- package/skills/doubao-agentic-service-development/references/business-template-debug.md +3 -3
- package/skills/doubao-agentic-service-development/references/dev-debug.md +2 -2
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/01-/345/237/272/347/241/200.md +175 -15
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/02-/347/263/273/347/273/237.md +3 -3
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/03-/350/207/252/345/256/232/344/271/211/351/200/232/344/277/241.md +1 -1
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/04-/345/256/232/344/275/215.md +1 -1
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/08-/344/272/244/344/272/222.md +221 -7
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/10-/347/275/221/347/273/234.md +20 -20
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/11-/345/252/222/344/275/223.md +2 -2
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/12-/344/270/232/345/212/241/350/203/275/345/212/233.md +3 -4
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/16-/350/223/235/347/211/231.md +3 -3
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/25-/346/227/240/351/232/234/347/242/215.md +1 -1
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/26-/345/237/272/347/241/200/344/277/241/346/201/257.md +3 -3
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/28-/345/211/252/350/264/264/346/235/277.md +2 -2
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/32-/346/211/253/347/240/201.md +1 -1
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/33-/345/261/217/345/271/225.md +1 -1
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/34-/351/234/207/345/212/250.md +2 -2
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/common-errors.md +1 -1
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/groups.md +3 -3
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/quick-reference.md +7 -3
- package/skills/doubao-agentic-service-development/references/frontend-dev.md +3 -3
- package/skills/doubao-agentic-service-development/references/generate-skill.md +1 -1
- package/skills/doubao-agentic-service-development/references/local-debug/simulator-eval.md +26 -22
- package/skills/doubao-agentic-service-development/references/manifest-guide.md +3 -3
- package/skills/doubao-agentic-service-development/references/mcp-protocol.md +1 -1
- package/skills/doubao-agentic-service-development/references/overview.md +4 -3
- package/skills/doubao-agentic-service-development/references/service-notice.md +1 -3
- package/skills/doubao-agentic-service-development/references/task-management.md +1 -3
- package/dist/assets/web-sdk-debugger/static/js/index.b85cbec3be.js +0 -26
- package/dist/dbx-demo.js +0 -2
- package/dist/eval.js +0 -1
- package/dist/validate.js +0 -1
- /package/dist/{2861.js.LICENSE.txt → 2611.js.LICENSE.txt} +0 -0
- /package/dist/{6780.js → 4594.js} +0 -0
package/dist/login.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"node:module";import{auth_login as e,auth_completeLogin as
|
|
1
|
+
import"node:module";import{auth_login as e,auth_completeLogin as t,option_Option as i,command_Command as n,types_TokenStatus as o,formatPollStatus as r,runCommand as a,auth_startLogin as s}from"./2168.js";import{openUrlInBrowser as c}from"./browser.js";async function l(e,t){let i=!e.json;return t.complete?g(e,t.complete):t.begin?d(e,i):u(e,i)}async function d(e,t){let i=await s(),n={userCode:i.userCode,deviceCode:i.deviceCode,verificationUrl:i.verificationUrl,expiresIn:i.expiresIn};return e.json||(e.log(`Visit: ${i.verificationUrl}`),e.log(`User code: ${i.userCode}`),e.log(""),t&&await f(e,i.verificationUrl),e.log("After approval, run:"),e.log(""),e.log(` $ dbx auth login --complete ${i.deviceCode}`)),n}async function g(e,i){let n,o=await t(i,{onPoll:t=>{e.json||t.status===n||(n=t.status,e.log(r(t.status)))}});return e.log(`Logged in. Token expires at: ${new Date(1e3*o.expiresAt).toISOString()}`),p(o)}async function u(t,i){let n,a=await e({onVerification:e=>{t.json||(t.log(`Visit: ${e.verificationUrl}`),t.log(`Expires in: ${e.expiresIn} seconds`),i&&f(t,e.verificationUrl),t.log(r(o.Pending)),n=o.Pending)},onPoll:e=>{t.json||e.status===n||(n=e.status,t.log(r(e.status)))}});return t.log(`Logged in. Token expires at: ${new Date(1e3*a.expiresAt).toISOString()}`),p(a)}function p(e){return{loggedIn:!0,uid:e.uid,expiresAt:e.expiresAt,baseUrl:e.baseUrl,tokenPath:e.tokenPath}}async function f(e,t){e.log("Opening auth link in browser...");try{await c(t)}catch(t){var i;e.warn(`failed to open browser: ${(i=t)instanceof Error&&i.message?i.message:String(i)}`)}}export default function(){return new n("login").description("登录").addOption(new i("--begin","Start device authorization and print instructions").conflicts("complete")).addOption(new i("--complete <device-code>","Complete device authorization with the given device code").conflicts("begin")).action(async(e,t)=>a(t,t=>l(t,e)))};
|
package/dist/prompt.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"node:module";import{ignoreUpdateVersion as r,runtime_packageName as e}from"./2168.js";import{formatError as t,updateCli as n}from"./update.js";import{source as i}from"./
|
|
1
|
+
import"node:module";import{ignoreUpdateVersion as r,runtime_packageName as e}from"./2168.js";import{formatError as t,updateCli as n}from"./update.js";import{source as i}from"./4594.js";import{dist as o}from"./@inquirer/select.js";async function s(s){let a;process.stderr.write(`
|
|
2
2
|
${i.bold.yellow("✨ Update available!")} ${i.dim(s.current)} -> ${i.green(s.latest)}
|
|
3
3
|
|
|
4
4
|
Release notes: ${i.underline("https://developer.doubao.com/docs/resources/changelog")}
|
package/dist/run.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./3768.js";import"./6831.js";import"./yaml.js";import{writeStructuredOutputDiagnostic as t,formatReferenceTimeContext as r,formatMs as i,isAppQuotaExhausted as a,parseJSONObject as s,classifyAttemptExecution as n,numberValue as o,LLMClient as l,shared_stringValue as c,sanitizeProgressFailure as d,getActiveBrowserStrategy as u,logger as p,EvalDevRuntimeProcessError as m,LLMResponseError as f,parseMCPHTTPBody as _,setTerminalMuted as h,requestStructuredOutput as g,fetchMCPDescriptor as y,genExplore as b,limitedIntentCount as v,projectEvalConfigPath as $,writeProjectEvalConfig as k,DEFAULT_EVAL_MODEL_ALIAS as x,isPostHookFailure as w,genDirectTrajectory as S,mergeEvalConfigs as j,timed as A,limitedEvalConcurrency as E,readManifestMcpUrl as M,limitedMaxRounds as C,StructuredOutputError as N,sanitizeDetailField as I,startEvalDevRuntime as P,registerStructuredOutputDiagnostics as O,buildAutoStartPayload as D,loadGlobalConfig as R,project_config_readEvalConfigFile as L,booleanValue as T,resolveProjectEvalConfig as F,LLMRequestTimeoutError as J,launchHeadlessBrowser as q,sanitizeLogText as z,isGatewayAuthFailure as K,genTrajectory as U,limitPipelineRunConfig as B,validateProjectEvalConfig as G,integerConfigValue as H,summarizeLogError as V,createReferenceTime as Y}from"./3974.js";import{createKitDevOptions as W}from"./kit-dev-options.js";import{readJsonIfExists as X,atomicWriteJson as Z}from"./json-file.js";import{Text as Q,build_render as ee,Static as et,components_Box as er,render_to_string as ei}from"./ink.js";import{Chalk as ea}from"./
|
|
1
|
+
import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./3768.js";import"./6831.js";import"./yaml.js";import{writeStructuredOutputDiagnostic as t,formatReferenceTimeContext as r,formatMs as i,isAppQuotaExhausted as a,parseJSONObject as s,classifyAttemptExecution as n,numberValue as o,LLMClient as l,shared_stringValue as c,sanitizeProgressFailure as d,getActiveBrowserStrategy as u,logger as p,EvalDevRuntimeProcessError as m,LLMResponseError as f,parseMCPHTTPBody as _,setTerminalMuted as h,requestStructuredOutput as g,fetchMCPDescriptor as y,genExplore as b,limitedIntentCount as v,projectEvalConfigPath as $,writeProjectEvalConfig as k,DEFAULT_EVAL_MODEL_ALIAS as x,isPostHookFailure as w,genDirectTrajectory as S,mergeEvalConfigs as j,timed as A,limitedEvalConcurrency as E,readManifestMcpUrl as M,limitedMaxRounds as C,StructuredOutputError as N,sanitizeDetailField as I,startEvalDevRuntime as P,registerStructuredOutputDiagnostics as O,buildAutoStartPayload as D,loadGlobalConfig as R,project_config_readEvalConfigFile as L,booleanValue as T,resolveProjectEvalConfig as F,LLMRequestTimeoutError as J,launchHeadlessBrowser as q,sanitizeLogText as z,isGatewayAuthFailure as K,genTrajectory as U,limitPipelineRunConfig as B,validateProjectEvalConfig as G,integerConfigValue as H,summarizeLogError as V,createReferenceTime as Y}from"./3974.js";import{createKitDevOptions as W}from"./kit-dev-options.js";import{readJsonIfExists as X,atomicWriteJson as Z}from"./json-file.js";import{Text as Q,build_render as ee,Static as et,components_Box as er,render_to_string as ei}from"./ink.js";import{Chalk as ea}from"./4594.js";import{runCommand as es,getAuthStatus as en,command_Command as eo,option_Option as el,isRecord as ec}from"./2168.js";import{lookupRun as ed,registerRun as eu}from"./run-registry.js";import{resolveAppKey as ep}from"./workspace.js";import{requireRuntimeSkillEntries as em}from"./project-layout.js";var ef={};e.r(ef),e.d(ef,{buildFreshConfig:()=>nH,configureEvalRunOptions:()=>nK,default:()=>nz,resolveEvalDevConfig:()=>nY,resolvePipelineRunConfig:()=>nU});let e_="dbx-eval-wasm-template-encoder";async function eh(e,t){let r=(await e())._encode(JSON.stringify(t)),i=r.buffer;try{if(0!==r.status)throw Error(`encode error: ${String(r.error_msg)}`);let e=Buffer.allocUnsafe(i.size());for(let t=0;t<e.length;t+=1)e[t]=i.get(t)??0;return{buffer:e,debugInfo:r.lepus_debug}}finally{eg(i),eg(r)}}function eg(e){"function"==typeof e.delete&&e.delete()}class ey{lynxTemplatePlugin;constructor(e){this.lynxTemplatePlugin=e}apply(t){t.hooks.thisCompilation.tap(e_,t=>{this.lynxTemplatePlugin.getLynxTemplatePluginHooks(t).encode.tapPromise({name:e_,stage:254},async({encodeOptions:t})=>eh((await import("./lepus.js").then(e.t.bind(e,"../../../node_modules/.pnpm/@byted-lynx+tasm@4.4.40_debug@4.4.3/node_modules/@byted-lynx/tasm/lepus.js",23))).default,t))})}}let eb=e("node:fs");async function ev(e){let t;process.env.DISABLE_APP_TEMPLATE_JS="1";let r=JSON.parse((0,eb.readFileSync)(e,"utf8")),i=!1,a=async()=>{i||(i=!0,t&&await t.stop(),eM({type:"stopped"}))},s=()=>{a().finally(()=>process.exit(0))};process.once("SIGINT",s),process.once("SIGTERM",s),process.on("message",e=>{var t;"object"==typeof(t=e)&&null!==t&&"type"in t&&"stop"===t.type&&s()});try{t=await e$(r),eM({type:"ready",webDebuggerUrl:t.webDebuggerUrl}),await new Promise(()=>void 0)}catch(t){let e=t instanceof Error?t:Error(String(t));eM({type:"failure",message:e.message,stack:e.stack}),await a().catch(()=>void 0),process.disconnect?.(),process.exitCode=1}finally{process.removeListener("SIGINT",s),process.removeListener("SIGTERM",s)}}async function e$(e){var t,r;let i,a,s,n=process.env.WATCHPACK_POLLING;n||(process.env.WATCHPACK_POLLING="1000");try{let r=await import("./sdk.js"),a=(t=r.DoubaoAppsSDK,class{delegate;constructor(e){let r=new t(e);this.delegate=r.launcher}dev(e){return this.delegate.dev({...e,rsbuildPlugins:[...e.rsbuildPlugins??[],{name:e_,setup(e){e.modifyBundlerChain((t,r)=>{if(r?.environment?.name==="web")return;let i=e.useExposed(Symbol.for("LynxTemplatePlugin"));t.plugin(e_).use(ey,[i.LynxTemplatePlugin])})}}]})}}),s=new r.DoubaoAppsSDK(e.miniappDir,a);eA("Launching isolated Kit dev runtime with WASM template encoding ..."),i=await s.dev(W({appId:e.appId,mcpEndpoint:e.mcpEndpoint,simulatorManifestPath:e.simulatorManifestPath,skillsDirectory:e.skillsDirectory,openBrowser:()=>void 0}))}finally{void 0===n?delete process.env.WATCHPACK_POLLING:process.env.WATCHPACK_POLLING=n}if(!i.webDebugger)throw await i.closeServer().catch(()=>void 0),Error("kit sdk.dev did not return webDebugger; simulator options may be misconfigured");let o=ej(i.webDebugger.url),l=(r=i.webDebugger).debuggerMcpEndpoint?ej(r.debuggerMcpEndpoint):ej(new URL("/__wsd_mcp",r.url).toString());eA(`Web debugger SPA: ${o}`),eA(`Debugger MCP: ${l}`);try{({browser:a,page:s}=await ex(o,l))}catch(e){throw eE(`Headless SDK attach failed; rolling back dev runtime: ${e.message}`),await ek(i),e}let c=!1;return{webDebuggerUrl:l,stop:async()=>{c||(c=!0,eA("stop: closing playwright page ..."),await eS(s.close(),5e3,"page.close").catch(e=>{eE(`page.close: ${e.message}`)}),eA("stop: closing playwright browser ..."),await eS(a.close(),5e3,"browser.close").catch(e=>{eE(`browser.close: ${e.message}`)}),await ek(i),eA("stop: done."))}}}async function ek(e){eA("stop: closing dev server ..."),await eS(e.closeServer(),1e4,"devHandle.closeServer").catch(e=>{eE(`closeServer failed: ${e.message}`)})}async function ex(e,t){let r,i=await q();try{if(r=await i.newPage(),await r.goto(e,{waitUntil:"domcontentloaded",timeout:3e4}),!await ew(t,3e4))throw Error(`SDK debugger did not attach at ${e} within 30s; widget bundle may not have loaded`);return await new Promise(e=>setTimeout(e,3e3)),eA("Headless SDK attached; widgets registered."),{browser:i,page:r}}catch(e){throw r&&await r.close().catch(()=>void 0),await i.close().catch(()=>void 0),e}}async function ew(e,t){let r=Date.now()+t,i=0;for(;Date.now()<r;){try{i+=1;let t=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/event-stream"},body:JSON.stringify({jsonrpc:"2.0",id:i,method:"tools/call",params:{name:"list_render_targets",arguments:{type:"all"}}})});if(t.ok){let e=_(await t.text(),t.headers.get("content-type"),i),r=e.result?.structuredContent?.widgets;if(Array.isArray(r)&&r.length>0)return!0}}catch{}await new Promise(e=>setTimeout(e,800))}return!1}function eS(e,t,r){return new Promise((i,a)=>{let s=setTimeout(()=>a(Error(`${r} timed out after ${t}ms`)),t);e.then(e=>{clearTimeout(s),i(e)},e=>{clearTimeout(s),a(e)})})}function ej(e){try{let t=new URL(e);return"localhost"===t.hostname&&(t.hostname="127.0.0.1"),t.toString()}catch{return e}}function eA(e){eM({type:"log",level:"log",message:e})}function eE(e){eM({type:"log",level:"warn",message:e})}function eM(e){process.send?.(e)}let eC={L1_platform:{shortLabel:"L1",promptName:"Sandbox 问题",legendLabel:"平台/环境",description:"工具可用性、时间上下文、状态隔离与注入或能力模拟失败。"},L2_tool:{shortLabel:"L2",promptName:"工具问题",legendLabel:"工具执行",description:"工具执行、结果、协议转换、参数传递或时间处理失败。"},L3_skill:{shortLabel:"L3",promptName:"Skill/模型能力问题",legendLabel:"Skill/模型能力",description:"任务理解、Skill 召回或遵循、结果核验、推理计算、模型幻觉编造或 Skill 定义失败。"},case_quality:{shortLabel:"CQ",promptName:"用例质量问题",legendLabel:"Case Quality",description:"用例剧本、前置条件或成功标准存在冲突。"},other_intent:{shortLabel:"O",promptName:"其他意图问题",legendLabel:"Other Intent",description:"任务路由错误或请求不属于当前 Skill 能力边界。"}},eN=Object.keys(eC),eI={sandbox:new Set(["工具可用性","时间上下文","状态隔离与注入","能力模拟"]),tool:new Set(["执行稳定性","结果正确性","协议转换正确性","参数传递完整性","时间处理正确性"]),skill:new Set(["任务理解","Skill召回或选择","Skill遵循","结果核验","模型幻觉编造","推理计算","能力边界描述缺失或模糊","工具契约描述错误","规则冲突或不可执行","skill过拟合"]),case_quality:new Set(["剧本冲突"]),other_intent:new Set(["路由与任务交接","非当前 Skill 能力边界"])};function eP(e){return eI["platform"===e?"sandbox":e]}function eO(e){switch(e){case"L1_platform":case"L2_tool":case"L3_skill":case"case_quality":case"other_intent":return e;case"L3_model":case"L4_skill":return"L3_skill";default:return}}function eD(e){switch(e){case"sandbox":case"tool":case"case_quality":case"other_intent":return e;case"model":case"skill":return"skill";default:return}}function eR(e){return Array.isArray(e.skill_documents)?e.skill_documents:"string"==typeof e.skill_document?[e.skill_document]:[]}function eL(e){let t=eR(e);return t.length<=1?t[0]??"":t.map((e,t)=>`## Skill document ${t+1}
|
|
2
2
|
${e}`).join("\n\n")}let eT=["0.0","0.5","1.0"],eF=["0.0","1.0"],eJ=new Set(["killer","strong","weak"]),eq=new Set(["tool_chain","constraint","terminal_state","text_quality","safety_boundary"]),ez=new Set(["复合前置检索","根本性指代歧义","直接写操作","定时/预约"]);function eK(e){if((0,eb.readFileSync)(e).byteLength>0x1400000)throw Error(`--eval-bundle exceeds 20 MiB: ${e}`);let t=X(e);if(!t)throw Error(`--eval-bundle is not valid JSON: ${e}`);if(1!==t.version)throw Error(`unsupported eval bundle version: ${String(t.version)}`);if(!Number.isFinite(new Date(t.reference_time).getTime()))throw Error("eval bundle reference_time must be an ISO timestamp");if(!Number.isInteger(t.pass_k)||t.pass_k<=0)throw Error("eval bundle pass_k must be a positive integer");if("string"!=typeof t.app_id||!t.app_id.trim())throw Error("eval bundle app_id must be a non-empty string");return function(e){for(let[t,r]of(delete e.global_principles,Object.entries(e.checklists||{})))e.checklists[t]=r.filter(e=>"principle"!==e.evaluator_type)}(t),function(e){if(!eB(e)||!e.name||!Array.isArray(e.tools))throw Error("eval bundle skill snapshot is invalid")}(t.skill),t.skill.skill_documents=eR(t.skill),delete t.skill.skill_document,function(e){if(!Array.isArray(e)||0===e.length)throw Error("eval bundle cases must be a non-empty array");let t=new Set;for(let r of e){if(!r.case_id||t.has(r.case_id))throw Error(`eval bundle has invalid or duplicate case_id: ${r.case_id}`);t.add(r.case_id)}}(t.cases),function(e,t){if(!eB(e))throw Error("eval bundle checklists must be an object");for(let r of t){let t=e[r];if(!Array.isArray(t)||0===t.length)throw Error(`eval bundle is missing checklists for case ${r}`);for(let e of t){if(!eB(e)||e.case_id!==r)throw Error(`eval bundle checklist case_id does not match key ${r}`);!function(e,t){if("string"!=typeof e.checklist_ref||!/^[A-Za-z0-9_-]{1,64}$/.test(e.checklist_ref))throw Error(`eval bundle checklist_ref is invalid for case ${t}`);if("rule"!==e.evaluator_type&&"rubric"!==e.evaluator_type&&"behavior"!==e.evaluator_type)throw Error(`eval bundle evaluator_type is invalid for case ${t}`);if(!Array.isArray(e.content)||0===e.content.length)throw Error(`eval bundle checklist content is empty for case ${t}`);if("rubric"===e.evaluator_type)return eU(e.content,`eval bundle rubric ${e.checklist_ref}`);for(let[r,i]of e.content.entries()){if(!eB(i))throw Error(`eval bundle ${e.evaluator_type} item ${r} must be an object`);if("string"!=typeof i.method||!i.method.trim()||!eB(i.params)||"string"!=typeof i.description||!i.description.trim())throw Error(`eval bundle ${e.evaluator_type} item ${r} is invalid for case ${t}`)}}(e,r)}}for(let r of Object.keys(e))if(!t.has(r))throw Error(`eval bundle has checklists for unknown case ${r}`)}(t.checklists,new Set(t.cases.map(e=>e.case_id))),function(e,t){if(!eB(e))throw Error("eval bundle trajectories must be an object");for(let r of t){let t=e[r.case_id];if(!Array.isArray(t)||0===t.length)throw Error(`eval bundle is missing trajectories for case ${r.case_id}`);for(let e=0;e<t.length;e++){let i=t[e];if(!eB(i)||!eB(i.metadata)||void 0!==i.metadata.case_id&&i.metadata.case_id!==r.case_id)throw Error(`eval bundle trajectory case_id does not match ${r.case_id}`);if(void 0!==i.metadata.attempt_k&&i.metadata.attempt_k!==e+1)throw Error(`eval bundle trajectory attempt_k for ${r.case_id} must be ${e+1}`)}}for(let r of Object.keys(e))if(!t.some(e=>e.case_id===r))throw Error(`eval bundle has trajectories for unknown case ${r}`)}(t.trajectories,t.cases),function(e){if(!eB(e.attempt_counts))throw Error("eval bundle attempt_counts must be an object");for(let t of e.cases){let r=e.trajectories[t.case_id].length,i=e.attempt_counts[t.case_id];if(!Number.isInteger(i)||i<=0||i!==r)throw Error(`eval bundle attempt_counts.${t.case_id} must equal ${r}`);if(i>e.pass_k)throw Error(`eval bundle attempt_counts.${t.case_id} exceeds pass_k ${e.pass_k}`)}}(t),t}function eU(e,t){let r=e.map((e,t)=>(function(e,t){if(!eB(e))throw Error(`injected rubrics[${t}] must be an object`);if(Buffer.byteLength(JSON.stringify(e))>32768)throw Error(`injected rubrics[${t}] exceeds 32768 bytes`);let r=e.step_index;if(!Number.isInteger(r)||0>=Number(r))throw Error(`injected rubrics[${t}].step_index must be positive`);if("string"!=typeof e.evidence||!e.evidence.trim())throw Error(`injected rubrics[${t}].evidence must be non-empty`);if(!eB(e.scoring_criteria))throw Error(`injected rubrics[${t}].scoring_criteria must be an object`);let i=Object.fromEntries(Object.entries(e.scoring_criteria).filter(([e,t])=>eT.includes(e)&&"string"==typeof t&&t.trim().length>0).map(([e,t])=>[e,t.trim()]));if(!eF.every(e=>i[e]))throw Error(`injected rubrics[${t}].scoring_criteria must contain non-empty 1.0 and 0.0 (0.5 is optional)`);let a=e.constraint_level;if(void 0!==a&&!eJ.has(a))throw Error(`injected rubrics[${t}].constraint_level is invalid`);let s=function(e,t){if(void 0===e)return;if(!eB(e))throw Error(`injected rubrics[${t}].dimension_capacity must be an object`);let r="model"===e.l1?"skill":e.l1,i="回复忠实性"===e.atomic?"模型幻觉编造":"skill工具描述错误"===e.atomic?"工具契约描述错误":e.atomic;if("string"!=typeof i||!eP(r)?.has(i))throw Error(`injected rubrics[${t}].dimension_capacity is invalid`);return{l1:r,atomic:i}}(e.dimension_capacity,t),n="string"==typeof e.dimension&&e.dimension.trim()?e.dimension.trim():void 0;if(n&&!eq.has(n))throw Error(`injected rubrics[${t}].dimension is invalid`);let o=function(e,t){if(void 0===e)return[];if(!Array.isArray(e)||e.some(e=>"string"!=typeof e||!e.trim()))throw Error(`${t} must contain non-empty strings`);return e.map(e=>e.trim())}(e.dimension_biz_scene,`injected rubrics[${t}].dimension_biz_scene`);for(let e of o)if(!ez.has(e))throw Error(`injected rubrics[${t}].dimension_biz_scene is invalid`);if(void 0!==e.weight&&("number"!=typeof e.weight||!Number.isFinite(e.weight)||e.weight<=0))throw Error(`injected rubrics[${t}].weight must be positive`);return{step_index:Number(r),evidence:e.evidence.trim(),scoring_criteria:i,...n?{dimension:n}:{},...a?{constraint_level:a}:{},...s?{dimension_capacity:s}:{},...o.length>0?{dimension_biz_scene:o}:{},..."number"==typeof e.weight&&Number.isFinite(e.weight)&&e.weight>0?{weight:e.weight}:{}}})(e,t)),i=new Set;for(let e of r){if(i.has(e.step_index))throw Error(`${t} contains duplicate step_index ${e.step_index}`);i.add(e.step_index)}return r}function eB(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}let eG=/^后台剧本(?:描述)?\s*[::]\s*/u,eH=/(?:[。;;]\s*|\r?\n+\s*)(?=(?:初始态|关键约束|系统需(?:要)?|用户可能|成功终态))/u,eV=/[。;;\s]+$/u;function eY(e){let t=e.trim();if(!t)return"";let r=t.replace(eG,"").trim();if(!r)return t;let i=eH.exec(r);return(i?r.slice(0,i.index):r).replace(eV,"").trim()||t}let eW=e("node:path");function eX(e){return e.length?`<ul>${e.map(e=>`<li>${tI(e)}</li>`).join("")}</ul>`:"—"}function eZ(e){let t=function(e){let t=/^pass_rate ([\d.]+) < threshold ([\d.]+)/.exec(e);if(t)return{label:"通过率低于阈值",detail:`实际 ${tA(Number(t[1]))},阈值 ${tA(Number(t[2]))}`};if("pass_rate is not a finite number"===e)return{label:"通过率无效",detail:"报告中的通过率不是有效数字,需要检查评分产物。"};let r=/^hard failure:\s*(.+)$/.exec(e);if(r){let e=r[1],t=/^user_experience veto:\s*(.+)$/.exec(e);return t?{label:"用户体验否决",detail:t[1]}:{label:"硬失败",detail:e}}let i=/^(\d+) L1_platform attribution item\(s\) indicate environment failures$/.exec(e);if(i)return{label:"平台/环境归因",detail:`${i[1]} 个失败项被归因为平台、环境或基础依赖问题。`};let a=/^skill_review score ([\d.]+) < ([\d.]+)/.exec(e);if(a)return{label:"Skill 审查低分",detail:`实际 ${a[1]},阈值 ${a[2]}`};if("skill description 与实际 tool 行为不匹配"===e)return{label:"Skill 描述不匹配",detail:"Skill 文档描述与实际工具行为不一致。"};let s=/^max_attempts (\d+) > (\d+)$/.exec(e);return s?{label:"重试次数过多",detail:`当前 ${s[1]} 次,准出上限 ${s[2]} 次。`}:{label:"准出规则命中",detail:e}}(e);return`<li>
|
|
3
3
|
<strong>${tI(t.label)}</strong>
|
|
4
4
|
<span>${tI(t.detail)}</span>
|
|
@@ -1422,7 +1422,7 @@ ${se(JSON.stringify(r.skill),4e4)}
|
|
|
1422
1422
|
输出完整性契约:
|
|
1423
1423
|
${JSON.stringify(a)}`}})})}catch(r){var i;if("AbortError"===r.name||"EvalRunStoppedError"===r.name)throw r;let e=r.message;return p.warn(`[developer-summary] 模型总结不可用,使用确定性回退(${(i=r)instanceof Error&&i.name?i.name:"Error"})`),function(e,t){if(0===e.items.length)return aY();let r=new Map;for(let t of e.items){let e=function(e){if(e.attribution?.atomic)return e.attribution.atomic;if("case_quality"===e.dimension)return"剧本与 Checklist 冲突";let t=`${e.description} ${e.reason}`;return[[/快照|cart_snapshot|透传|sku_id|unit_price/i,"购物车快照与字段透传"],[/预算|金额|实付|超支|价格|满减|优惠/i,"预算与金额结果正确性"],[/确认|下单|订单|支付|配送/i,"写操作确认与订单闭环"],[/场景|scene|人数|偏好|口味/i,"场景与用户约束满足"],[/搜索|筛选|排序|召回|商品|替换/i,"商品搜索与替换正确性"],[/参数|入参|枚举|字段|schema|契约|协议/i,"工具参数与协议契约"],[/回复|表述|编造|幻觉|卡片|reference_id/i,"回复真实性与卡片表达"],[/流程|顺序|路由|步骤|调用次数/i,"工具链路由与流程推进"],[/异常|失败|空结果|重试|降级/i,"异常处理与失败降级"]].find(([e])=>e.test(t))?.[1]||"其他 Rubric 扣分"}(t);r.set(e,[...r.get(e)||[],t])}let i=[...aX(e.items)].map(([e,t])=>({case_id:e,intent:t[0].intent,target_apis:sr(t.flatMap(e=>e.target_apis)),rubric_items:t.map(e=>({item_ref:e.item_ref,description:e.description,score:e.score,max_score:e.max_score,reason:e.reason,evidence:aZ(e),impact:a0(e)}))})),a=[],s=[],n=0;for(let[e,t]of r){let r=`cluster_${String(++n).padStart(3,"0")}`,i=function(e){if(e.some(e=>e.p0_eligible))return"P0";let t=e.flatMap(e=>[e.description,e.reason,e.dimension,e.attribution?.atomic,e.attribution?.note]).filter(Boolean).join(" ");return aB.test(t)?"P1":"P2"}(t),o=sr(t.flatMap(e=>e.target_apis));a.push({cluster_id:r,title:e,priority:i,case_ids:sr(t.map(e=>e.case_id)),item_refs:t.map(e=>e.item_ref),root_cause:t.find(e=>e.attribution?.note)?.attribution?.note||t[0].reason,impact:sr(t.map(a0)).join(";")}),s.push({cluster_id:r,skill_rules:"剧本冲突"===e?["保持当前正确的 Skill 规则,不为冲突检查项做反向修改。"]:[`在 Skill 中将“${e}”相关规则明确为可执行的前置条件、调用顺序、异常分支和结果核验要求。`],tools_or_apis:o,contract_changes:["剧本冲突"===e?"修正 Case、Checklist 或上下文释放规则,使检查要求只依赖模型实际可见且与 Skill/Tool Contract 一致的信息。":o.length>0?`检查并补齐 ${o.join("、")} 的必填入参、枚举边界、错误返回和关键字段透传。`:"补齐该流程的工具选择、参数校验、异常处理和结果透传契约。"],acceptance_criteria:["剧本冲突"===e?`重跑 ${sr(t.map(e=>e.case_id)).join("、")},不再产生同类剧本冲突免扣项。`:`重跑 ${sr(t.map(e=>e.case_id)).join("、")},对应 Rubric 全部满分且不产生相关硬失败。`]})}let o=function(e){let t=[];for(let r of["P0","P1","P2"]){let i=e.filter(e=>e.priority===r);0!==i.length&&t.push({priority:r,cluster_ids:i.map(e=>e.cluster_id),deliverables:i.map(e=>`完成“${e.title}”对应的 Skill 与工具契约整改`),acceptance_gate:`${i.flatMap(e=>e.case_ids).filter((e,t,r)=>r.indexOf(e)===t).join("、")} 的相关 Rubric 全部满分。`})}return t}(a);return{version:"developer-summary-v1",status:"fallback",summary:`共发现 ${e.items.length} 个 Rubric 扣分项,聚类为 ${a.length} 类 Skill/工具整改问题;请按 P0、P1、P2 顺序处理。`,case_details:i,issue_clusters:a,recommendations:s,roadmap:o,...t?{diagnostic:se(t,500)}:{}}}(t,e)}}function aH(e){let t=aX(e.items);return{required_item_refs:e.items.map(e=>e.item_ref),required_cases:[...t].map(([e,t])=>({case_id:e,item_refs:t.map(e=>e.item_ref)})),allowed_evidence_fact_ids:Object.fromEntries(e.items.map(e=>[e.item_ref,e.candidate_facts.map(e=>e.id)])),allowed_tools_or_apis:sr([...e.skill.tools.map(e=>e.name),...e.items.flatMap(e=>e.target_apis)]),p0_eligible_item_refs:e.items.filter(e=>e.p0_eligible).map(e=>e.item_ref)}}function aV(e,t,r="generated"){let i=new Map(t.items.map(e=>[e.item_ref,e])),a=aX(t.items),s=new Set([...t.skill.tools.map(e=>e.name),...t.items.flatMap(e=>e.target_apis)]),n=new Set,o=a2(e.case_details,"case_details").map((e,t)=>{let r=a1(e,`case_details[${t}]`),s=a3(r.case_id,"case_id"),o=a.get(s);if(!o)throw Error(`unknown developer summary case: ${s}`);let l=a2(r.items,"case_details.items").map((e,r)=>{let a=a1(e,`case_details[${t}].items[${r}]`),o=a3(a.item_ref,"item_ref"),l=i.get(o);if(!l||l.case_id!==s)throw Error(`invalid developer summary item_ref: ${o}`);if(n.has(o))throw Error(`duplicated developer summary item_ref: ${o}`);n.add(o);let c=new Map(l.candidate_facts.map(e=>[e.id,e])),d=a6(a.evidence_fact_ids,"evidence_fact_ids",!0).map(e=>{let t=c.get(e);if(!t)throw Error(`${o} references unavailable evidence fact: ${e}`);return aQ(t)});return{item_ref:o,description:l.description,score:l.score,max_score:l.max_score,reason:l.reason,evidence:d.length>0?d:aZ(l),impact:a3(a.impact,"impact")}});if(l.length!==o.length)throw Error(`developer summary case ${s} covers ${l.length}/${o.length} items`);return{case_id:s,intent:o[0].intent,target_apis:sr(o.flatMap(e=>e.target_apis)),rubric_items:l}});if(a5(n,i.keys(),"case_details"),o.length!==a.size)throw Error(`developer summary covers ${o.length}/${a.size} cases`);let l=new Set,c=new Set,d=a2(e.issue_clusters,"issue_clusters").map((e,t)=>{let r=a1(e,`issue_clusters[${t}]`),a=a3(r.cluster_id,"cluster_id");if(c.has(a))throw Error(`duplicated developer summary cluster: ${a}`);c.add(a);let s=a6(r.item_refs,"item_refs");for(let e of s){if(!i.has(e))throw Error(`cluster references unknown item_ref: ${e}`);if(l.has(e))throw Error(`item_ref belongs to multiple clusters: ${e}`);l.add(e)}let n=a8(r.priority);if("P0"===n&&!s.some(e=>i.get(e)?.p0_eligible))throw Error(`cluster ${a} is not eligible for P0`);return{cluster_id:a,title:a3(r.title,"title"),priority:n,case_ids:sr(s.map(e=>i.get(e)?.case_id||"")).filter(Boolean),item_refs:s,root_cause:a3(r.root_cause,"root_cause"),impact:a3(r.impact,"impact")}});a5(l,i.keys(),"issue_clusters");let u=new Set,p=a2(e.recommendations,"recommendations").map((e,t)=>{let r=a1(e,`recommendations[${t}]`),i=a3(r.cluster_id,"cluster_id");if(!c.has(i)||u.has(i))throw Error(`invalid or duplicated recommendation cluster: ${i}`);u.add(i);let a={cluster_id:i,skill_rules:a6(r.skill_rules,"skill_rules"),tools_or_apis:a6(r.tools_or_apis,"tools_or_apis",!0),contract_changes:a6(r.contract_changes,"contract_changes"),acceptance_criteria:a6(r.acceptance_criteria,"acceptance_criteria")};for(let e of a.tools_or_apis)if(!s.has(e))throw Error(`recommendation references unknown tool/API: ${e}`);return a7(a),a});a5(u,c,"recommendations");let m=new Set,f=a2(e.roadmap,"roadmap").map((e,t)=>{let r=a1(e,`roadmap[${t}]`),i=a8(r.priority),a=a6(r.cluster_ids,"cluster_ids");for(let e of a){let t=d.find(t=>t.cluster_id===e);if(!t||t.priority!==i)throw Error(`roadmap cluster ${e} does not match ${i}`);if(m.has(e))throw Error(`roadmap repeats cluster: ${e}`);m.add(e)}return{priority:i,cluster_ids:a,deliverables:a6(r.deliverables,"deliverables"),acceptance_gate:a3(r.acceptance_gate,"acceptance_gate")}});a5(m,c,"roadmap"),f.sort((e,t)=>a4(e.priority)-a4(t.priority));let _=a3(e.summary,"summary");return a7({summary:_,caseDetails:o,issueClusters:d,recommendations:p,roadmap:f}),{version:"developer-summary-v1",status:r,summary:_,case_details:o,issue_clusters:d,recommendations:p,roadmap:f}}function aY(){return{version:"developer-summary-v1",status:"empty",summary:"本次评测没有未达满分的 Rubric 项,无需生成整改建议。",case_details:[],issue_clusters:[],recommendations:[],roadmap:[]}}function aW(e){let t=new Map(e.facts.map(e=>[e.id,e])),r=[],i=e=>{!(!e||r.some(t=>t.id===e.id))&&r.length<8&&r.push(e)};for(let r of e.attribution?.evidence_fact_ids||[])i(t.get(r));for(let t of e.item.evidence_indices||[])for(let r of e.facts)r.message_index===t&&i(r);for(let t of e.targetApis)for(let r of e.facts)("tool_call"===r.component_kind||"tool_result"===r.component_kind)&&r.content?.includes(t)&&i(r);for(let t of[...e.facts].reverse())("assistant"===t.component_kind||"tool_result"===t.component_kind)&&i(t);return r}function aX(e){let t=new Map;for(let r of e)t.set(r.case_id,[...t.get(r.case_id)||[],r]);return t}function aZ(e){let t=e.candidate_facts.slice(0,3).map(aQ);return t.length>0?t:e.attribution?.trace_evidence_summary?[e.attribution.trace_evidence_summary]:[`评分理由:${e.reason}`]}function aQ(e){let t=se(e.content||"",240);return`第 ${e.round} 轮 ${e.component_kind}:${t||e.id}`}function a0(e){if(e.p0_eligible)return"可能阻断核心流程或造成订单、金额等严重业务错误。";let t=[e.description,e.reason,e.dimension,e.attribution?.atomic].filter(Boolean).join(" ");return aB.test(t)?"影响推荐质量、用户约束满足或工具参数与结果正确性。":"影响交互体验、处理效率或结果表达清晰度。"}function a1(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw Error(`${t} must be an object`);return e}function a2(e,t){if(!Array.isArray(e))throw Error(`${t} must be an array`);return e}function a3(e,t){if("string"!=typeof e||!e.trim())throw Error(`${t} must be a non-empty string`);return e.trim()}function a6(e,t,r=!1){let i=a2(e,t);if(!r&&0===i.length)throw Error(`${t} must not be empty`);if(i.some(e=>"string"!=typeof e||!e.trim()))throw Error(`${t} must contain non-empty strings`);return sr(i.map(e=>String(e).trim()))}function a8(e){if("P0"!==e&&"P1"!==e&&"P2"!==e)throw Error(`invalid developer summary priority: ${String(e)}`);return e}function a4(e){return"P0"===e?0:"P1"===e?1:2}function a5(e,t,r){let i=new Set(t);if(e.size!==i.size||[...i].some(t=>!e.has(t)))throw Error(`${r} does not cover all expected references`)}function a7(e){if(aK.test(JSON.stringify(e)))throw Error("developer summary must not recommend model changes")}function a9(e,t){if(void 0!==t)return t;if(!e)return{};try{return JSON.parse(e)}catch{return e}}function se(e,t){let r=[...e];return r.length<=t?e:`${r.slice(0,Math.max(0,t-1)).join("")}…`}function st(e){return Number.isFinite(e)?e:0}function sr(e){return[...new Set(e)]}function si(e){let{cases:t,skippedCases:r=[],apiDeps:i,flowMap:a,entityPool:s,skillReview:n,ruleSet:o,state:l,mode:c,veto:d,developerSummary:u,postHookSummary:p,passThreshold:m,totalDurationMs:f}=e,_=[],h=0,g=0,y=0,b=0,v=0,$={L1_platform:0,L2_tool:0,L3_skill:0,case_quality:0,other_intent:0},k={},x={};for(let{caseData:e,attempts:r}of t){let t=r.map((e,t)=>{let r=sc(e.scorerResult.eval_result.total_score),i=sc(e.scorerResult.eval_result.max_total_score),a=sa(e.scorerResult.attribution),s="blocked_posthook"===e.executionStatus||"blocked_case_conflict"===e.executionStatus||"blocked_unknown"===e.executionStatus,n=!s&&r2(e,m);return{attempt:t+1,status:s?"blocked":n?"passed":"failed",execution_status:e.executionStatus,score:Math.min(r,i),max_score:i,passed:n,attribution:a,attribution_v3:function(e){if(!e)return;let t=e.result,r=t.attributor_primary,i="judger"===r,a=eD(r);if("insufficient_evidence"===t.status||i||!a){let e=t.missing_evidence?.length?t.missing_evidence:[i?"历史 Judger 主归因已转为人工复核":"历史主归因分类无法迁移"];return{version:"v3",status:"insufficient_evidence",result:{status:"insufficient_evidence",missing_evidence:e,attributor_l1:[],attributor_l2:t.attributor_l2.map(t=>({status:"insufficient_evidence",missing_evidence:e,item_ref:t.item_ref,checklist_ref:t.checklist_ref,evaluator_type:t.evaluator_type,step_index:t.step_index,note:"历史 Judger 归因或矛盾证据需人工复核"})),attributor_biz_scene:[],attributor_reason:"历史归因已转为证据不足,需人工复核",attributor_evidence:[],skill_contract_fingerprint:t.skill_contract_fingerprint,requires_human_review:!0},legacy_attributions:[]}}let s=t.attributor_l2.map(e=>{var t;let r=eD(e.l1);return"insufficient_evidence"!==e.status&&r?{...e,l1:r,atomic:"回复忠实性"===(t=e.atomic||"")?"模型幻觉编造":"skill工具描述错误"===t?"工具契约描述错误":t}:{status:"insufficient_evidence",missing_evidence:e.missing_evidence?.length?e.missing_evidence:["历史 Judger 归因或矛盾证据需人工复核"],item_ref:e.item_ref,checklist_ref:e.checklist_ref,evaluator_type:e.evaluator_type,step_index:e.step_index,note:"judger"===e.l1?"历史 Judger 归因已转为人工复核":e.note}}),n=[...new Set(t.attributor_l1.flatMap(e=>{let t=eD(e);return t?[t]:[]}))];return{version:"v3",status:"attributed",result:{...t,...a?{attributor_primary:a}:{},attributor_l1:n,attributor_l2:s,requires_human_review:t.requires_human_review||s.some(e=>"insufficient_evidence"===e.status)},legacy_attributions:sa(e.legacy_attributions)}}(e.scorerResult.attribution_v3),user_experience:ss(e.scorerResult),error:e.error,posthook_diagnostic:e.posthookDiagnostic,timings:{trajectory_ms:e.timings?.trajectoryMs,score_ms:e.timings?.scoreMs,attribution_ms:e.timings?.attributionMs,user_experience_ms:e.timings?.userExperienceMs},by_evaluator:Object.fromEntries(Object.entries(e.scorerResult.by_evaluator??{}).filter(([e])=>"principle"!==e).map(([e,t])=>{let r=sc(t?.max);return[e,{...t,score:Math.min(sc(t?.score),r),max:r,items:Array.isArray(t?.items)?t.items:[]}]})),screenshots:Array.isArray(e.screenshots)?e.screenshots:[],duration_ms:sc(e.durationMs),termination:e.termination?{kind:e.termination.kind,round:e.termination.round,error:e.termination.error,log_id:e.termination.logId}:void 0}}),i=t.some(e=>e.passed),a=!i&&t.length>0&&t.every(e=>"blocked"===e.status);a?y++:(g++,i&&h++);let s=r3(r,m),n=s?r.indexOf(s):-1,o=n>=0?t[n]:{attempt:0,score:0,max_score:0,passed:!1,attribution:[],by_evaluator:{},screenshots:[],duration_ms:0};for(let[e,t]of(a||(b+=o.score,v+=o.max_score),Object.entries(o.by_evaluator)))t.max<=0||(k[e]=(k[e]||0)+t.score/t.max,x[e]=(x[e]||0)+1);let l=t.flatMap(e=>e.attribution);for(let e of l)$[e.level]=($[e.level]||0)+1;_.push({case_id:e.case_id,intent:e.intent,initial_state:e.initial_state,user_profile:e.user_profile,success_criteria:e.success_criteria,target_apis:e.target_apis,complexity:e.complexity,flow_id:e.flow_id,case_kind:e.case_kind,flow_variant:e.flow_variant,first_user_input:r.flatMap(e=>e.trajectory?.rounds||[]).find(e=>e.user_query)?.user_query,status:a?"blocked":i?"passed":"failed",passed:i,score:o.score,max_score:o.max_score,attempts:t,attribution:l})}let w=Object.fromEntries(Object.entries(k).map(([e,t])=>[e,t/x[e]])),S=function(e,t){let r=e.flatMap(e=>{let r=r3(e.attempts,t),i=r?ss(r.scorerResult):void 0;return i?[i]:[]});if(0!==r.length)return{average_rating:r.reduce((e,t)=>e+t.rating,0)/r.length,rated_cases:r.length,veto_cases:r.filter(e=>e.veto.triggered).length}}(t,m),j={pipeline_mode:c,pipeline:function(e,t,r){if("full_pipeline"!==e)return;let i=sn(r,"trajectoryMs"),a=sn(r,"scoreMs"),s=sn(r,"attributionMs"),n=void 0===a?void 0:Math.max(a-(s||0),0),o=e=>t?.phases[e]?.durationMs;return{nodes:[{name:"start"},{name:"gen_api_deps",duration_ms:o("apiDeps")},{name:"explore",duration_ms:o("explore")},{name:"entity_pool",duration_ms:o("entityPool")},{name:"skill_review",duration_ms:o("skillReview")},{name:"gen_intent",duration_ms:o("genIntent")},{name:"gen_checklist",duration_ms:o("genChecklist")},{name:"gen_trajectory",duration_ms:i},{name:"eval",duration_ms:n},{name:"attribution",duration_ms:s},{name:"gen_report",duration_ms:o("report")}]}}(c,l,t),summary:{total_cases:t.length,evaluated_cases:g,blocked_cases:y,skipped_cases:r.length,failed_cases:Math.max(g-h,0),passed_cases:h,pass_rate:g>0?h/g:0,avg_score:v>0?Math.min(b/v,1):0,total_duration_ms:sc(f),by_evaluator:w,pass:!d.hit},cases:_,skipped_cases:r,veto:d,attribution_summary:$,entity_pool:s??{entity_types:[],expanded_entities:[],intent_seeds:[]},api_deps:i??{api_dependencies:{}},skill_review:n??{overall_score:0,issues:[],suggestions:[],api_scores:[]},entity_pool_view:function(e){if(!e)return;let t=e.entity_types.map(e=>({name:e.type,count:e.instances.length,examples:e.instances.slice(0,3).map(e=>e.identifier)})),r=t.reduce((e,t)=>e+t.count,0)+e.expanded_entities.length;if(0!==t.length||0!==e.intent_seeds.length)return{total_types:t.length,total_instances:r,types:t,intent_seeds:e.intent_seeds.map(e=>({scenario:e.description||e.scenario||e.category,tags:e.flavor_dimensions.length>0?e.flavor_dimensions:e.complexity?[e.complexity]:[]}))}}(s),api_deps_view:function(e){if(e&&0!==Object.keys(e.api_dependencies).length)return{total_apis:Object.keys(e.api_dependencies).length,dependency_count:Object.values(e.api_dependencies).reduce((e,t)=>e+t.requires.length+t.mandatory_after.length,0),entry_apis:Object.entries(e.api_dependencies).filter(([e,t])=>0===t.requires.length&&0===t.mandatory_after.length).map(([e])=>e),terminal_apis:function(e){let t=new Set;for(let r of Object.values(e.api_dependencies)){for(let e of r.requires)t.add(e);for(let e of r.mandatory_after)t.add(e)}return Object.keys(e.api_dependencies).filter(e=>!t.has(e))}(e)}}(i),skill_review_view:function(e){if(!e)return;let t=e.issues.flatMap(e=>"string"==typeof e?[{severity:"low",category:"other",description:e,suggestion:"根据问题描述完成对应修改"}]:[e]),r=new Map;for(let e of t){let t=so.includes(e.category)?e.category:"other";r.set(t,[...r.get(t)||[],e])}return{overall_score:e.overall_score,issue_count:t.length,issue_groups:so.flatMap(e=>{let t=r.get(e);return t?[{category:e,items:t}]:[]}),api_scores:e.api_scores}}(n),flow_map_view:function(e){if(e&&0!==e.flows.length)return{total_flows:e.flows.length,flows:e.flows.map(e=>({id:e.id,name:e.name,description:e.description,complexity:e.complexity,steps:e.steps,variants:e.variants}))}}(a),case_composition:function(e){if(0===e.length)return;let t=0,r=0,i=0,a=e.map(({caseData:e})=>("simple"===e.complexity?t++:"medium"===e.complexity?r++:i++,{case_id:e.case_id,intent:e.intent,initial_state:e.initial_state,user_profile:e.user_profile,success_criteria:e.success_criteria||[],complexity:"complex"===e.complexity?"hard":e.complexity,flow_id:e.flow_id,case_kind:e.case_kind,flow_variant:e.flow_variant,entities:(e.selected_entity_identifiers||[]).length?e.selected_entity_identifiers||[]:e.entities.map(e=>e.identifier),target_apis:e.target_apis}));return{simple_count:t,medium_count:r,hard_count:i,cases:a}}(t),checklist_overview:function(e){if(!e)return;let t=[...e.checklists.entries()].flatMap(([e,t])=>t.flatMap(t=>t.content.map((r,i)=>({checklist_ref:t.checklist_ref||`${t.evaluator_type}_${e}`,evaluator_type:t.evaluator_type,source:t.source,step_index:"step_index"in r&&"number"==typeof r.step_index?r.step_index:i+1,item_id:"id"in r&&"string"==typeof r.id?r.id:`#${i+1}`,description:"evidence"in r&&"string"==typeof r.evidence?r.evidence:"description"in r&&"string"==typeof r.description?r.description:"",case_id:e}))));if(0===t.length)return;let r={rule:0,rubric:0,behavior:0};for(let e of t)r[e.evaluator_type]++;let i={rubric:"Rubric",behavior:"Behavior",rule:"Rule"};return{counts:r,total_items:t.length,items:t,groups:sl.flatMap(e=>{let r=t.filter(t=>t.evaluator_type===e);return r.length>0?[{evaluator_type:e,label:i[e],count:r.length,default_open:"rubric"===e,items:r}]:[]})}}(o),ux_summary:S,developer_summary:u};return p&&(j.posthook_summary=p),j}function sa(e){return Array.isArray(e)?e.flatMap(e=>{let t=eO(e.level);return t?[{...e,level:t}]:[]}):[]}function ss(e){var t;let r=e.by_evaluator?.[rg]?.details;if("object"==typeof(t=r)&&null!==t&&!Array.isArray(t))try{return rx(r)}catch{return}}function sn(e,t){let r=e.flatMap(e=>e.attempts.flatMap(e=>{let r=e.timings?.[t];return"number"==typeof r&&Number.isFinite(r)?[r]:[]}));return r.length>0?r.reduce((e,t)=>e+t,0):void 0}let so=["naming","description","parameter","coverage","document","tool","card","other"],sl=["rubric","behavior","rule"];function sc(e){var t;let r;return Math.max(Number.isFinite(r="number"==typeof(t=e)?t:"string"==typeof t?Number(t):NaN)?r:0,0)}function sd(e){return 2*!!e.tool_name+(e.schema_errors?.length||0)+ +(void 0!==e.arguments)+ +(void 0!==e.input_schema)}function su(e){return Array.isArray(e)?"array":null===e?"null":typeof e}function sp(e){return"object"!=typeof e||null===e||Array.isArray(e)?void 0:e}function sm(e){try{return JSON.stringify(e)}catch{return String(e)}}function sf(e,t){if(void 0!==t)return t;if(!e)return{};try{return JSON.parse(e)}catch{return e}}function s_(e,t){let r=e.split(/(?=^#{1,4}\s)/m).map(e=>e.trim()).filter(Boolean),i=r.filter(e=>t.some(t=>e.includes(t)));return(i.length>0?i:r.slice(0,1)).map(e=>e.slice(0,4e3))}function sh(e){return(0,tH.createHash)("sha256").update(e).digest("hex")}function sg(e){return[...new Set(e)]}function sy(e){return e.replace(/^\$\.?/,"").replace(/^\./,"")}function sb(e){return e.replace(/\s+/g," ").trim()}function sv(e){return JSON.stringify(function e(t){return Array.isArray(t)?t.map(e):"object"!=typeof t||null===t?t:Object.fromEntries(Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).map(([t,r])=>[t,e(r)]))}(e))}function s$(e,t){let r=e.tools.find(e=>e.name===t);return sf(r?.input_schema_json,r?.inputSchema)}function sk(e){return e.missing_required_paths.length>0||e.type_mismatches.length>0||e.enum_mismatches.length>0||e.additional_properties.length>0}function sx(e,t){let r=e.toLowerCase(),i=t.toLowerCase().replace(/\.\d+(?=\.|$)/g,""),a=i.split(".").filter(Boolean);if(0===a.length)return!1;if(r.includes(i)||a.length>2&&r.includes(a.at(-2))&&r.includes(a.at(-1))&&/字段|必填|required|来自|透传|携带|包含/.test(r))return!0;if(1===a.length){let e=a[0];return[`"${e}"`,`\`${e}\``,`${e}=`,`${e}:`].some(e=>r.includes(e))}let s=a.at(-2),n=a.at(-1);return[`${s}.${n}`,`"${s}"`,`\`${s}\``,s].some(e=>r.includes(e))&&[`"${n}"`,`\`${n}\``,`${n}=`,`${n}:`,`${s}.${n}`,n].some(e=>r.includes(e))}function sw(e,t,r,i,a){var s,n,o;let l=function(e,t){switch(e){case"skill_tool_schema_conflict":return{target:"skill",priority:"P0",change:"统一 Skill 中的字段名、枚举值和示例参数,使之与 tools/list 返回的 input schema 完全一致。",rationale:"当前 Skill 把模型引导到一个 Schema 不接受的调用面,修模型提示词无法根治。",acceptance_criteria:["Skill 示例参数通过真实 input schema 校验","同一工具不再出现由 Skill 明示字段导致的 additionalProperties 或 enum 错误"]};case"skill_guidance_gap":return{target:"skill",priority:"P1",change:`为关键字段补充来源说明与正例:${t.skill_mentions_missing_paths.join("、")||"缺失字段"}`,rationale:"模型能看到 Tool Schema,但缺少稳定的可执行指引,容易在嵌套对象上漏参。",acceptance_criteria:["Skill 明确字段来源、必填性和调用前检查步骤","相同 case 不再因同签名缺参失败"]};case"tool_schema_capability_gap":return{target:"tool_schema",priority:"P1",change:"为自然语言诉求增加可达的数据获取路径,例如查询工具、snapshot_id 或服务端补全能力,而不是要求模型直接构造内部字段。",rationale:"失败轮用户只表达业务目标,现有 Tool 契约没有提供把自然语言转成必填结构的通路。",acceptance_criteria:["用户仅给业务语义时存在合法调用链","缺少内部字段时返回可操作的澄清或查询路径"]};case"tool_schema_source_gap":return{target:"eval_context",priority:"P0",change:"把必需字段暴露为模型可获得的上游结果,或增加专门查询工具,避免依赖评测隐藏态或未注入上下文。",rationale:"字段确实存在,但来源不在模型可见工作流里,导致 PostHook 在信息桥接处失败。",acceptance_criteria:["缺失字段可以从可见工具结果或显式查询接口获得","不依赖评测隐藏态也能成功完成目标调用"]};case"tool_output_manifest_conflict":return{target:"manifest",priority:"P0",change:"对齐 structuredContent、实体主键、字段类型与 Manifest/Simulator PostHook 约束,并回放真实工具结果验证。",rationale:"工具结果阶段的协议不一致会让成功调用在 PostHook 被拦截。",acceptance_criteria:["Simulator 不再返回 tool_result/tool_report 校验错误","工具结果可以完成上报并渲染预期回复或卡片"]};case"contract_call_noncompliance":return{target:"skill",priority:"P1",change:"补充调用前自检步骤和失败反例,要求在发起工具调用前逐项校验字段、类型和枚举。",rationale:"必需信息已在可见来源中出现,问题落在实际调用构造而不是能力缺口。",acceptance_criteria:["相同输入下不再重复出现同签名参数错误","调用参数与上游来源字段一一对应"]};case"simulator_internal_failure":return{target:"simulator",priority:"P2",change:"补充更细的 PostHook 结构化错误码和字段级详情,避免只返回泛化协议失败。",rationale:"当前错误不足以稳定区分契约问题和平台问题,诊断颗粒度不够。",acceptance_criteria:["错误响应包含字段级失败位置或可唯一归因的错误码"]};case"insufficient_evidence":return{target:"simulator",priority:"P2",change:"保留原始 trace/stream/tool_report 细节,避免诊断阶段丢失上下文。",rationale:"当前证据不足以给出稳定结论。",acceptance_criteria:["同类失败可恢复出完整 trace 证据"]}}}(e,i);return{finding_id:`posthook_finding_${sh([e,r.group_id,r.tool_name||"",sv([...i.missing_required_paths,...i.type_mismatches.map(e=>e.path),...i.enum_mismatches.map(e=>e.path),...i.additional_properties])].join("\0")).slice(0,16)}`,category:e,confidence:(s=e,n=r,o=i,"insufficient_evidence"===s||"simulator_internal_failure"===s?"low":n.schema_errors.length>0&&(sk(o)||"tool_output_manifest_conflict"===s)?"high":"medium"),severity:t,summary:function(e,t,r){let i=t.tool_name||"unknown_tool",a=sg([...r.missing_required_paths,...r.type_mismatches.map(e=>e.path),...r.enum_mismatches.map(e=>e.path),...r.additional_properties]);switch(e){case"skill_tool_schema_conflict":return`${i} 的 Skill 指引与 Tool Schema 不一致,触发字段冲突:${a.join("、")||t.messages[0]||"unknown"}`;case"skill_guidance_gap":return`${i} 缺少关键字段指引:${r.skill_mentions_missing_paths.join("、")}`;case"tool_schema_capability_gap":return`${i} 需要当前对话无法自然获得的结构化字段,失败轮用户诉求为:${t.user_queries.join(";")||"unknown"}`;case"tool_schema_source_gap":return`${i} 所需字段仅存在于不可见来源或未暴露的数据源:${r.hidden_context_paths.join("、")}`;case"tool_output_manifest_conflict":return`${i} 的输出或上报结果未满足 Manifest/PostHook 协议,阶段=${t.stage||"unknown"}`;case"contract_call_noncompliance":return`${i} 的调用参数已具备可见来源但仍不符合契约:${a.join("、")||t.messages[0]||"unknown"}`;case"simulator_internal_failure":return`${i} 出现无法进一步结构化归因的内部协议错误:${t.messages[0]||"unknown"}`;case"insufficient_evidence":return t.messages[0]||"insufficient evidence"}}(e,r,i),tool_name:r.tool_name,schema_diff_indices:a,evidence:{event_group_ids:[r.group_id],event_ids:r.event_ids,user_queries:r.user_queries,missing_paths:i.missing_required_paths,type_paths:i.type_mismatches.map(e=>e.path),enum_paths:i.enum_mismatches.map(e=>e.path),additional_properties:i.additional_properties,visible_upstream_sources:i.visible_upstream_sources,hidden_context_paths:i.hidden_context_paths},recommendation:l}}function sS(e){return 10*({P0:0,P1:1,P2:2})[e.severity]+({tool_schema_source_gap:0,tool_output_manifest_conflict:1,skill_tool_schema_conflict:2,skill_guidance_gap:3,tool_schema_capability_gap:4,contract_call_noncompliance:5,simulator_internal_failure:6,insufficient_evidence:7})[e.category]}let sj={skill_tool_schema_conflict:"Skill 与 Tool Schema 冲突",skill_guidance_gap:"Skill 调用指引缺口",tool_schema_capability_gap:"Tool Schema 能力缺口",tool_schema_source_gap:"必填字段来源缺口",tool_output_manifest_conflict:"Tool 输出与 Manifest 冲突",contract_call_noncompliance:"调用未遵守可见契约",simulator_internal_failure:"Simulator 内部诊断不足",evaluation_context_injection_gap:"评测上下文注入缺口",skill_contract_gap:"Skill 契约缺口",skill_schema_conflict:"Skill 与 Schema 冲突",tool_schema_unusable:"工具 Schema 不可用",model_contract_noncompliance:"模型未遵守工具契约",simulator_platform_failure:"Simulator 平台故障",insufficient_evidence:"PostHook 证据不足"};function sA(e){return sP(e).sort().join("|")}function sE(e){return[e.code||"",e.stage||"",e.tool_name||"",e.message||""].join("\0")}function sM(e,t){return e.case_id.localeCompare(t.case_id)||e.attempt-t.attempt}function sC(e,t){return sI(e.priority)-sI(t.priority)||t.case_ids.length-e.case_ids.length||e.signature.localeCompare(t.signature)}function sN(e,t){return sI(e.priority)-sI(t.priority)||e.target.localeCompare(t.target)||e.change.localeCompare(t.change)}function sI(e){return"P0"===e?0:"P1"===e?1:2}function sP(e){return[...new Set(e)]}let sO="intent-seeds.json",sD="case-generation";class sR{outputDir;constructor(e){this.outputDir=e}loadSeedPlan(){return X((0,eW.join)(this.outputDir,sO))}saveSeedPlan(e){Z((0,eW.join)(this.outputDir,sO),e)}loadSeedArtifact(e){return X((0,eW.join)(this.outputDir,sD,`${sL(e)}.json`))}saveSeedArtifact(e){Z((0,eW.join)(this.outputDir,sD,`${sL(e.seed.seed_id)}.json`),e)}}function sL(e){if(!/^[A-Za-z0-9_-]+$/.test(e))throw Error(`invalid intent seed id: ${e}`);return e}let sT=e("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js");async function sF(e,t){var r,i,a;let s;t?.throwIfAborted(),p.log("[preflight] Running pre-flight checks...\n");let n=[],o="score_only"===(r=e).mode&&r.judge?{baseUrl:r.judge.baseUrl??r.llm.baseUrl,apiKey:r.judge.apiKey??r.llm.apiKey,model:r.judge.model??r.llm.model,temperature:r.judge.temperature??r.llm.temperature,maxTokens:r.judge.maxTokens??r.llm.maxTokens}:r.llm,l=(i=o.baseUrl,a=o.apiKey,i&&a?"openai":"gateway");if(n.push(await sJ(o,l)),n.push(function(e,t,r){let i="Model";if("openai"===t&&!e.model)return{name:i,passed:!1,fatal:!0,message:"generator model is empty",hint:"Set via --model flag or 'model' under 'ua:' in config (required when using a custom endpoint)"};let a=e.model||x;return{name:i,passed:!0,message:"score_only"===r?`judge=${a}`:`gen=${a}`,fatal:!0}}(o,l,e.mode)),n.push(function(e,t){let r="max_output_tokens";if("gateway"===t)return{name:r,passed:!0,message:"server-decided (gateway)",fatal:!1};let i=e.maxTokens??4096;return!Number.isFinite(i)||i<=0?{name:r,passed:!1,fatal:!0,message:`${i} (must be a positive number)`,hint:"Set a positive max_tokens value under 'ua:' in config YAML."}:{name:r,passed:!0,message:`${i}`,fatal:!1}}(o,l)),n.push(function(e,t){let r,i="Manifest app_key";if("openai"===t)return{name:i,passed:!0,message:"not required (custom endpoint)",fatal:!1};let a="Set a non-empty app_key in manifest.yaml (or pass --app-id); the DBX gateway needs it to attribute eval LLM calls.";try{r=sT.qg(e.app.manifestYAML)}catch(e){return{name:i,passed:!1,fatal:!0,message:`manifest YAML parse failed: ${e.message}`,hint:a}}let s=ec(r)?r.app_key:void 0;return"string"==typeof s&&s.trim()?{name:i,passed:!0,message:s.trim(),fatal:!0}:{name:i,passed:!1,fatal:!0,message:"manifest.yaml is missing app_key",hint:a}}(e,l)),n.push(function(e){let t="Output Directory";try{return(0,eb.mkdirSync)(e,{recursive:!0}),{name:t,passed:!0,message:e,fatal:!0}}catch(e){return{name:t,passed:!1,fatal:!0,message:`cannot create: ${e.message}`,hint:"Check permissions or use --output to specify a different path"}}}(e.outputDir)),"score_only"!==e.mode&&e.dev?.autoStart)for(let t of(n.push(function(e){let t="Miniapp node_modules",r=(0,eW.resolve)(e);if(!(0,eb.existsSync)(r)||!(0,eb.statSync)(r).isDirectory())return{name:t,passed:!1,fatal:!0,message:`miniapp directory not found: ${r}`,hint:"Pass --miniapp <dir> or ensure the dbx project frontend directory exists."};let i=(0,eW.join)(r,"node_modules");return(0,eb.existsSync)(i)?{name:t,passed:!0,message:i,fatal:!0}:{name:t,passed:!1,fatal:!0,message:`node_modules missing at ${i}`,hint:"Install miniapp dependencies first (e.g. run 'pnpm install' inside the miniapp)."}}(e.dev.autoStart.miniappDir)),await sq()))n.push(t);if("score_only"!==e.mode){let r=await sK(e);if(t?.throwIfAborted(),r.passed)n.push(r);else if("connectivity"===r.kind){p.log(" [preflight] MCP server not reachable, attempting auto-start...");let t=await sU(e.mcpUrl,e.projectPath);t.process?(s=t.process,(r=await sK(e)).passed?r.message=`${r.message}; auto-started pid ${t.process.pid}`:(t.process.kill(),s=void 0)):r.hint=t.hint,n.push(r)}else n.push(r)}let c=n.every(e=>e.passed||!e.fatal);for(let e of(p.log("\n ┌─────────────────────────────────────────────────────────"),p.log(" │ PRE-FLIGHT CHECK RESULTS"),p.log(" ├─────────────────────────────────────────────────────────"),n)){let t=e.passed?"\x1b[32m✓\x1b[0m":e.fatal?"\x1b[31m✗\x1b[0m":"\x1b[33m⚠\x1b[0m";p.log(` │ ${t} ${e.name}: ${e.message}`),!e.passed&&e.hint&&p.log(` │ └─ \x1b[36mHint:\x1b[0m ${e.hint}`)}if(p.log(" └─────────────────────────────────────────────────────────\n"),c){let e=n.filter(e=>!e.passed&&!e.fatal);e.length>0?p.log(`[preflight] \x1b[33m${e.length} warning(s), proceeding with caution.\x1b[0m
|
|
1424
1424
|
`):p.log("[preflight] \x1b[32mAll checks passed. Starting pipeline.\x1b[0m\n")}else{let e=n.filter(e=>!e.passed&&e.fatal);p.log(`[preflight] \x1b[31m${e.length} fatal check(s) failed. Pipeline cannot proceed.\x1b[0m`),p.log("[preflight] Fix the issues above and re-run.\n")}return{passed:c,checks:n,mcpProcess:s}}async function sJ(e,t){if("openai"===t){let t="API Key";return e.apiKey?{name:t,passed:!0,message:"已配置",fatal:!0}:{name:t,passed:!1,fatal:!0,message:"generator api_key is empty",hint:"Set via --api-key flag or add 'api_key' under 'ua:' in config YAML"}}let r="SSO Auth";try{let e=await en();if(!e.loggedIn)return{name:r,passed:!1,fatal:!0,message:e.credentialError?`credential store unavailable: ${e.credentialError.message}`:"not logged in",hint:"Run `dbx auth login` and retry."};return{name:r,passed:!0,message:`logged in as ${e.uid??"unknown"}`,fatal:!0}}catch(e){return{name:r,passed:!1,fatal:!0,message:`auth check failed: ${e.message}`,hint:"Run `dbx auth login` and retry."}}}async function sq(){let e=[];e.push(await sz());let t=function(){let e,t="File Descriptor Limit";if("win32"!==process.platform){try{let r=(0,tO.execFileSync)("sh",["-c","ulimit -n"],{encoding:"utf8",timeout:2e3}).trim();if("unlimited"===r)return{name:t,passed:!0,message:"unlimited",fatal:!1};let i=Number.parseInt(r,10);Number.isFinite(i)&&(e=i)}catch{}return void 0===e?{name:t,passed:!0,message:"unknown (recommend ulimit -n >= 4096)",fatal:!1}:e>=4096?{name:t,passed:!0,message:`${e}`,fatal:!1}:{name:t,passed:!1,fatal:!1,message:`${e} (below recommended 4096)`,hint:"Run 'ulimit -n 4096' before eval; a low limit causes EMFILE in the webpack watcher and Chrome crashes."}}}();return t&&e.push(t),e}async function sz(){let e="Render Runtime (Chrome)";try{let t=await q(),r=t.version(),i=u();await t.close();let a="chromium"===i?`bundled Chromium launches (v${r}; system Chrome unavailable)`:`system Chrome launches (v${r})`;return{name:e,passed:!0,message:a,fatal:!0}}catch(s){var t;let r,i,a=s.message||String(s);return{name:e,passed:!1,fatal:!0,message:(r=(t=a).toLowerCase()).includes("channel")&&(r.includes("chrome")||r.includes("not found"))&&(r.includes("executable")||r.includes("looks like"))?"system Google Chrome not found (channel:chrome)":r.includes("executable doesn't exist")||r.includes("install")?"system Google Chrome not found or not installed":r.includes("sigabrt")||r.includes("signal")?"Chrome started but crashed on launch (SIGABRT)":r.includes("emfile")||r.includes("too many open files")?"Chrome launch failed: too many open files (EMFILE)":r.includes(".so")||r.includes("shared librar")?"Chrome launch failed: missing system shared libraries":`Chrome launch failed: ${t.split("\n")[0]}`,hint:(i=a.toLowerCase()).includes("emfile")||i.includes("too many open files")?"Raise the file-descriptor limit (ulimit -n 4096) before running eval.":i.includes(".so")||i.includes("shared librar")?"On Linux install Chrome deps (e.g. npx playwright install-deps chromium) and CJK fonts (fonts-noto-cjk) for card text.":"linux"===process.platform?"Install Google Chrome, or run 'npx playwright install chromium' and its deps ('npx playwright install-deps chromium'). Servers/containers also need --no-sandbox.":"Install Google Chrome (stable), or run 'npx playwright install chromium' as a fallback browser."}}}async function sK(e){let t="MCP Contract";try{let r=await y(e.mcpUrl,e.app.appId),i=function(e,t){let r;try{r=sT.qg(e)}catch(e){return{passed:!1,message:`manifest YAML parse failed: ${e.message}`,hint:"Fix manifest.yaml syntax before running eval."}}if(!ec(r))return{passed:!1,message:"manifest must be a YAML object",hint:"Fix manifest.yaml before running eval."};let i=ec(r.tools)?Object.keys(r.tools):[],a=t.tools.map(e=>e.name?.trim()).filter(e=>!!e);if(0===a.length)return{passed:!1,message:"tools/list returned 0 tools",hint:"Ensure the MCP server registers tools before accepting requests."};let s=new Set(i),n=new Set(a),o=i.filter(e=>!n.has(e)),l=a.filter(e=>!s.has(e));if(0===o.length&&0===l.length)return{passed:!0,message:`${a.length} tools match manifest`};let c=[];return o.length>0&&c.push(`missing in MCP: ${o.join(", ")}`),l.length>0&&c.push(`not declared in manifest: ${l.join(", ")}`),{passed:!1,message:`ToolList mismatch (${c.join("; ")})`,hint:"Keep manifest.tools and MCP tools/list exactly aligned, including case-sensitive tool names."}}(e.app.manifestYAML,r.tools);if(i.passed)return{name:t,passed:!0,message:`${r.tools.name}: ${r.tools.tools.length} tools; manifest matches`,fatal:!0,kind:"contract"};return{name:t,passed:!1,fatal:!0,message:i.message,hint:i.hint,kind:"contract"}}catch(n){var r,i;let a,s=n.message||String(n);return{name:t,passed:!1,fatal:!0,message:(r=e.mcpUrl,(a=(i=s).toLowerCase()).includes("econnrefused")||a.includes("connection refused")||a.includes("fetch failed")?`connection refused at ${r}`:a.includes("timeout")||a.includes("abort")?`initialize/tools/list timed out for ${r}`:`initialize/tools/list failed for ${r}: ${i}`),hint:"Start the MCP server and verify manifest.mcp_server.end_point / --mcp-url. The server must support initialize and tools/list.",kind:"connectivity"}}}async function sU(e,t=process.cwd()){let r=new URL(e).port||"3000",i=(0,eW.resolve)(t),a=function(e=process.cwd()){let t=(0,eW.resolve)(e);return["test/mcp-server.ts","test/mcp-server.js","mcp-server.ts","mcp-server.js","server.ts","server.js","src/mcp-server.ts","src/mcp-server.js","src/server.ts","src/server.js"].map(e=>(0,eW.resolve)(t,e)).find(e=>(0,eb.existsSync)(e))}(i);if(a)try{let t=(0,tO.spawn)("npx",["tsx",a],{cwd:i,stdio:["ignore","pipe","pipe"],detached:!0});if(await sB(e,8e3))return p.log(" [preflight] MCP 服务已自动启动"),{process:t};t.kill()}catch{}return{hint:`Could not auto-start from ${i}. Start manually:
|
|
1425
|
-
• dbx mcp demo
|
|
1425
|
+
• dbx mcp demo --milk-tea --port ${r}
|
|
1426
1426
|
• Or: npx tsx ./your-mcp-server.ts
|
|
1427
1427
|
• Then pass --mcp-url ${e} if it differs from the default`}}async function sB(e,t){let r=Date.now()+t;for(;Date.now()<r;){try{if((await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json, text/event-stream"},body:JSON.stringify({jsonrpc:"2.0",method:"initialize",id:1,params:{protocolVersion:"2025-03-26",capabilities:{},clientInfo:{name:"wait",version:"0.1"}}}),signal:AbortSignal.timeout(2e3)})).ok)return!0}catch{}await new Promise(e=>setTimeout(e,500))}return!1}function sG(e){let t=e.match(/^---\n([\s\S]*?)\n---/);return t?{frontmatter:sT.qg(t[1]),body:e.slice(t[0].length)}:{frontmatter:{},body:e}}let sH=/^(?:doubao|miniapp)-[A-Za-z0-9]+(?:-[A-Za-z0-9]+)+$/;function sV(e,t){var r,i,a,s;let n,o,l,c,d=[sY("name.length",e.name.length>0&&e.name.length<=64,"high","naming","Skill name 必须非空且不超过 64 个字符"),sY("name.format",sH.test(e.name),"high","naming","Skill name 必须使用 doubao- 或 miniapp- 开头的多段式命名"),sY("description.length",e.description.length>0&&e.description.length<=300,"high","description","description 必须非空且不超过 300 个字符"),sY("description.third_person",(r=e.description,!/[我你您]/.test(r)),"high","description","description 必须使用第三人称,不包含我、你或您等交互话术"),sY("description.scope",(n=""!==(i=e.description).trim()&&i.includes("。"),o=i.includes("当用户")||i.includes("用户询问")||i.includes("用户提到")||i.includes("用户需要")||i.includes("处理"),n&&o),"high","description","description 必须包含能力说明和用户触发上下文")];return t?.trim()&&d.push((l=(a=t).split("\n").length,c=a.length,sY("document.bounds",l<=500&&c<=1e4,"high","document","SKILL.md 正文必须不超过 500 行和 10000 个字符")),function(e,t){let r=t.match(/^---\s*\n([\s\S]*?)\n---/);if(!r)return sY("document.frontmatter",!1,"high","document","SKILL.md 必须以包含 name 和 description 的 YAML frontmatter 开头");let i=function(e){let t={};for(let r of e.split("\n")){let e=r.indexOf(":");if(e<0)continue;let i=r.slice(0,e).trim(),a=r.slice(e+1).trim().replace(/^["']|["']$/g,"");t[i]=a}return t}(r[1]);return sY("document.frontmatter",i.name===e.name&&i.description===e.description,"high","document","YAML frontmatter 中的 name 和 description 必须与 SkillDefinition 一致")}(e,t),sY("document.structure",(s=t).includes("场景路由")&&s.includes("工具")&&(s.includes("失败")||s.includes("降级")),"medium","document","SKILL.md 必须包含场景路由、工具说明和失败或降级处理"),function(e,t){let r,i=new Set(e.tools.map(e=>e.name)),a=/(?:工具\s*\d*[::]|调用\s+)([A-Za-z][A-Za-z0-9_-]*)/g;for(;null!==(r=a.exec(t));)if(!i.has(r[1]))return sY("tool.reference",!1,"high","tool",`SKILL.md 引用了未声明的工具 "${r[1]}"`);return sY("tool.reference",!0,"high","tool","SKILL.md 中声明的工具均存在于 API 文档")}(e,t),function(e){let t,r=/<RichMediaCard\b([^>]*)>([\s\S]*?)<\/RichMediaCard>/g;for(;null!==(t=r.exec(e));){let e,r=function(e){let t,r={},i=/(\w+)="([^"]*)"/g;for(;null!==(t=i.exec(e));)r[t[1]]=t[2];return r}(t[1]);if("MiniAppCard"!==r.type)return sY("card.protocol",!1,"high","card",'RichMediaCard 必须使用 type="MiniAppCard"');try{e=JSON.parse(t[2].trim())}catch{return sY("card.protocol",!1,"high","card","RichMediaCard 内容必须是合法 JSON")}switch(r.mode){case"ref":{let t=e.refs;if(!Array.isArray(t)||0===t.length||""===t[0])return sY("card.protocol",!1,"high","card","ref 卡片必须提供非空 refs 数组");break}case"inline":if(!e.app_key||!e.card_template_id||!e.render_data)return sY("card.protocol",!1,"high","card","inline 卡片必须提供 app_key、card_template_id 和 render_data");break;default:return sY("card.protocol",!1,"high","card","RichMediaCard mode 必须为 ref 或 inline")}}return sY("card.protocol",!0,"high","card","RichMediaCard 协议符合 MiniAppCard 要求")}(t)),d}function sY(e,t,r,i,a){return{id:e,passed:t,severity:r,category:i,description:a}}async function sW(e,t,r,i=ru){var a,n,o,l,c;let d,u,m,f,_,h;p.debug("[skill-review] Reviewing skill quality...");let y="string"==typeof r?[r]:r??eR(e),b=eL({...e,skill_documents:y}),v=0===y.length?sV(e):y.flatMap(t=>{let{frontmatter:r}=sG(t);return sV({...e,name:"string"==typeof r.name?r.name:e.name,description:"string"==typeof r.description?r.description:e.description},t)}),$=v.filter(e=>!e.passed);$.length>0&&p.debug(`[skill-review] Static checks: ${$.length} failed`);let k=(a=e,n=b,u=a.tools.map((e,t)=>{let r=e.input_schema_json?`
|
|
1428
1428
|
parameters: ${e.input_schema_json}`:"",i=e.output_schema_json?`
|