@doubao-dev/cli 0.0.14 → 0.0.15

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 (91) hide show
  1. package/bin/run.js +1 -1
  2. package/dist/1664.js +60 -0
  3. package/dist/180.js +1 -0
  4. package/dist/{bin/win32-x64/security_tasm_codec.exe → 1966.js} +0 -0
  5. package/dist/1966.js.LICENSE.txt +119 -0
  6. package/dist/2585.js +2 -0
  7. package/dist/318.js +1 -0
  8. package/dist/3551.js +1 -0
  9. package/dist/3997.js +2 -0
  10. package/dist/4880.js +1 -0
  11. package/dist/5418.js +3 -0
  12. package/dist/5732.js +1 -0
  13. package/dist/7410.js +2 -0
  14. package/dist/7410.js.LICENSE.txt +1 -0
  15. package/dist/7526.js +1 -0
  16. package/dist/@byted-doubao-apps/create.js +4 -5
  17. package/dist/@byted-doubao-apps/login.js +2 -3
  18. package/dist/@byted-doubao-apps/login~1.js +2 -0
  19. package/dist/@byted-doubao-apps/template-empty/package.json +3 -3
  20. package/dist/@byted-doubao-apps/template-starter/package.json +3 -3
  21. package/dist/@byted-hdt/cli.js +11 -12
  22. package/dist/@inquirer/select.js +1 -0
  23. package/dist/app.js +1 -2
  24. package/dist/assets/web-sdk-debugger/index.html +1 -1
  25. package/dist/assets/web-sdk-debugger/static/css/{index.4b84c01189.css → index.123e72a5bc.css} +1 -1
  26. package/dist/assets/web-sdk-debugger/static/js/index.019ceb233a.js +26 -0
  27. package/dist/assets/web-sdk-debugger/wsd/doubao-apps-api.template.js +0 -0
  28. package/dist/assets/web-sdk-debugger/wsd/doubao-apps-framework.template.js +0 -0
  29. package/dist/auth.js +1 -2
  30. package/dist/browser.js +1 -2
  31. package/dist/components-loader.js +2 -3
  32. package/dist/dbx-demo.js +2 -3
  33. package/dist/demo-server.js +3 -4
  34. package/dist/dev-service-client.js +16 -10
  35. package/dist/dev-service-client.js.LICENSE.txt +89 -0
  36. package/dist/dev-shell.js +5 -2
  37. package/dist/dev-shell.js.LICENSE.txt +59 -0
  38. package/dist/dev.js +18 -19
  39. package/dist/devtools.js +2 -0
  40. package/dist/devtools.js.LICENSE.txt +1 -0
  41. package/dist/environment.js +1 -0
  42. package/dist/eval.js +1 -2
  43. package/dist/get.js +1 -2
  44. package/dist/init.js +6 -7
  45. package/dist/login.js +1 -2
  46. package/dist/main.js +1 -0
  47. package/dist/manifest-mcp-config.js +1 -2
  48. package/dist/project-layout.js +1 -2
  49. package/dist/prompt.js +5 -6
  50. package/dist/push-page.js +1 -2
  51. package/dist/push-widget.js +1 -2
  52. package/dist/rslib-runtime.js +1 -2
  53. package/dist/sandbox.js +1 -2
  54. package/dist/sdk.js +76 -169
  55. package/dist/sdk.js.LICENSE.txt +1 -13
  56. package/dist/sdk~1.js +218 -0
  57. package/dist/sdk~1.js.LICENSE.txt +15 -0
  58. package/dist/skills.js +2 -3
  59. package/dist/static/404/404.html +455 -0
  60. package/dist/static/assets/package.json +137 -0
  61. package/dist/static/home_choose/chooseRegion.html +345 -0
  62. package/dist/static/openChrome.applescript +88 -0
  63. package/dist/status.js +2 -3
  64. package/dist/status~1.js +1 -2
  65. package/dist/stop.js +1 -2
  66. package/dist/update.js +1 -2
  67. package/dist/upgrade.js +1 -2
  68. package/dist/upload.js +7 -8
  69. package/dist/validate.js +1 -2
  70. package/dist/yaml.js +25 -0
  71. package/package.json +34 -35
  72. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/01-/345/237/272/347/241/200.md +114 -7
  73. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/02-/347/263/273/347/273/237.md +126 -0
  74. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/06-/344/272/244/344/272/222.md +71 -0
  75. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/08-/347/275/221/347/273/234.md +222 -0
  76. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/10-/344/270/232/345/212/241/350/203/275/345/212/233.md +122 -0
  77. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/groups.md +5 -5
  78. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/quick-reference.md +7 -2
  79. package/dist/183.js +0 -2
  80. package/dist/564.js +0 -13
  81. package/dist/714.js +0 -1
  82. package/dist/assets/web-sdk-debugger/static/js/index.62b5cae841.js +0 -26
  83. package/dist/bin/darwin-arm64/security_tasm_codec +0 -0
  84. package/dist/bin/darwin-arm64/security_tasm_codec.sha256 +0 -1
  85. package/dist/bin/darwin-x64/security_tasm_codec +0 -0
  86. package/dist/bin/darwin-x64/security_tasm_codec.sha256 +0 -1
  87. package/dist/bin/linux-x64/security_tasm_codec +0 -0
  88. package/dist/bin/linux-x64/security_tasm_codec.sha256 +0 -1
  89. package/dist/bin/win32-x64/security_tasm_codec.exe.sha256 +0 -1
  90. package/dist/index.js +0 -1
  91. package/dist/package.json +0 -56
@@ -0,0 +1 @@
1
+ /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
@@ -0,0 +1 @@
1
+ import"node:module";let o=globalThis.window?.document!==void 0;globalThis.process?.versions?.node,globalThis.process?.versions?.bun,globalThis.Deno?.version?.deno,globalThis.process?.versions?.electron,globalThis.navigator?.userAgent?.includes("jsdom");let a=globalThis.navigator?.userAgentData?.platform;"macOS"===a||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform,"Windows"===a||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform,"Linux"===a||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform,"iOS"===a||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),"Android"===a||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform;export{o as isBrowser};
package/dist/eval.js CHANGED
@@ -1,2 +1 @@
1
- let e;import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import r from"chalk";import{Command as o,Option as s}from"commander";import i from"node:fs";import n from"node:path";import a from"yaml";import{DBX_DEMO_NAMES as l,getDBXDemo as c,isDBXDemoName as d,readDBXDemoServerState as u}from"./dbx-demo.js";import{resolveProjectLayout as p}from"./project-layout.js";import{http_getApiBaseUrl as m,parseInteger as _,runCommand as f,configuredFetch as g,CliError as h,isRecord as y}from"./564.js";import{extractMCPHeadersFromManifest as v}from"./manifest-mcp-config.js";import{verifyYAML as w}from"./app.js";var S={};t.r(S),t.d(S,{default:()=>e$});let $=new Set(["USER","ASSISTANT","TOOL"]);function b(e,t){if(!i.existsSync(e))throw x(`${t}_file_not_found`,`${t} file not found: ${e}`,`请检查 --${t} 路径;相对路径会按 --project-path 解析。`);if(!i.statSync(e).isFile())throw x(`${t}_path_not_file`,`${t} path must be a file: ${e}`,`请检查 --${t} 路径,不能传目录。`);return i.readFileSync(e,"utf8")}function x(e,t,r){let o=Error(t);return o.details={code:e,message:t,suggestion:r},o}function C(e,t){return n.isAbsolute(e)?e:n.resolve(t,e)}function E(e){return e.includes("/")||e.endsWith(".md")||e.endsWith(".json")||e.endsWith(".yaml")||e.endsWith(".yml")}function P(e){return"string"==typeof e&&e.trim()?e:void 0}function k(e){var t,r;let o=[],s=e.preflight.filter(e=>"error"===e.level);for(let i of(o.push(...s),o.push(...(t=e.result.trace_events,r=e.result.request_id,t.filter(e=>e.error).map(e=>({code:String(e.error?.code||"trace_error"),level:"error",message:String(e.error?.user_message||e.error?.message||e.summary||"trace error"),suggestion:T(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:T(o,"")||((t=r).includes("exceeded max step")?"模型在最大步数内没有收口。请检查 skill 是否让模型重复查询/重复调用工具,或临时调大 --max-step 辅助定位。":t.includes("mcp tool invalid response")?"MCP 工具返回未通过 context post-hook。请对照 manifest 检查 tool_name、entity_type、主键字段和 structuredContent。":void 0),details:e?.details??e}}(i));if(!o.some(e=>"error"===e.level)){let t=e.cardExpectation??"auto";o.push(...function(e,t,r){let o=[];for(let t of e){let e=t.result_preview||"";(t.result_error||e.includes("MCP error")||e.includes("Input validation error"))&&o.push({code:"mcp_tool_result_error",level:"error",message:`MCP 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),s=e.evalCase.expect?.tool_calls??[];s.length>0&&!function(e,t){let r=0;for(let o of t)if(o===e[r]&&(r+=1),r===e.length)return!0;return 0===e.length}(s,r)&&o.push({code:"expectation_tool_chain_mismatch",level:"error",message:`expected tool chain ${s.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=j(function(e,t){if(!y(e))return;let r=e[t];return y(r)?r:void 0}(t.details,"details"),"raw_error")||j(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),n=0===i.filter(e=>"error"===e.level).length;return{ok:n,verdict:n?"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 j(e,t){if(!y(e))return;let r=e[t];return"string"==typeof r&&r?r:void 0}function T(e,t){return"miniapp_mcp_result_invalid"===e?"MCP 工具返回未通过智能服务协议校验。请检查返回 JSON 是否包含 content/structuredContent,entity_type 是否在 manifest.entities 中声明,实体主键字段是否匹配 is_entity_id。":"agent_run_failed"===e?`Agent 运行失败。请查看 request_id=${t||"-"} 对应 trace,重点关注是否重复 tool call、max_step 不足或模型没有触发卡片输出。`:"tool_call_or_report_failed"===e?"工具调用或结果上报失败。请检查 MCP tools/call 是否可用,以及返回的 structuredContent/entities 是否符合 manifest 声明。":void 0}let M="2025-11-25",O=["application/json","text/event-stream"];async function q(e,t,r){return B(e)?D(e,t,r):I(e,t,r)}async function A(t,r){var o,s;if(e&&(o=e.url,s=t,Y(o)===Y(s)))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 R(e,r):await N(e,r));throw Error("MCP session is not initialized. Please ensure fetchMCPDescriptor runs before tools/call.")}async function I(t,r,o){let s=W(t);try{let t=await F(s,{jsonrpc:"2.0",id:1,method:"initialize",params:{protocolVersion:M,capabilities:{},clientInfo:{name:"dbx-simulator-eval",version:"0.1.0"}}},{headers:o}),i=t.body.result?.protocolVersion??M,n=t.headers.get("mcp-session-id")??void 0;e={kind:"streamable",url:s,sessionID:n,protocolVersion:i,headers:o},await F(s,{jsonrpc:"2.0",method:"notifications/initialized",params:{}},{sessionID:n,protocolVersion:i,allowEmpty:!0,headers:o});let a=await F(s,{jsonrpc:"2.0",id:2,method:"tools/list",params:{}},{sessionID:n,protocolVersion:i,headers:o});return{tools:{server_id:Z(s),name:Z(s),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(t){throw e=void 0,Error(`standard MCP Streamable HTTP initialize/tools/list failed: ${s}: ${t?.message||String(t)}`)}}async function D(t,r,o){let s=V(t),i={kind:"sse",url:s,pending:new Map,headers:o};e=i;try{await L(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 L(i,{jsonrpc:"2.0",method:"notifications/initialized",params:{}},!0);let e=await L(i,{jsonrpc:"2.0",id:2,method:"tools/list",params:{}},!1);return{tools:{server_id:Z(s),name:Z(s),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(t){throw K(i),e=void 0,Error(`standard MCP SSE initialize/tools/list failed: ${s}: ${t?.message||String(t)}`)}}async function N(e,t){let r=er(t.tool_name);if(!r)throw Error("MCP tool name is empty");return(await F(e.url,{jsonrpc:"2.0",id:Date.now(),method:"tools/call",params:{name:r,arguments:eo(t.arguments)??es(er(t.arguments_json))??{}}},{sessionID:e.sessionID,protocolVersion:e.protocolVersion,headers:e.headers})).body.result}async function R(e,t){let r=er(t.tool_name);if(!r)throw Error("MCP tool name is empty");return(await L(e,{jsonrpc:"2.0",id:Date.now(),method:"tools/call",params:{name:r,arguments:eo(t.arguments)??es(er(t.arguments_json))??{}}},!1)).result}async function L(e,t,r){let o;if(await U(e),!e.endpointURL)throw Error("MCP SSE did not provide endpoint event");let s=Q(t),i=X(t)||"unknown",n=ee(t),a=n?`${i}:${n}`:i,l=null!==s,c=l?new Promise((t,r)=>{let o=setTimeout(()=>{e.pending.delete(s),r(Error(`MCP SSE request timed out: ${a}`))},1e4);e.pending.set(s,{resolve:t,reject:r,timeout:o})}):void 0;try{var d;let r;o=await G(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&&z(e,s),t}let u=await o.text();if(!o.ok)throw l&&z(e,s),Error(`MCP SSE POST ${o.status}: ${u}`);if(!l)return{};let p=await c;if(!p&&!r)throw Error("MCP SSE returned empty response");if(p?.error)throw Error(`MCP SSE error: [${p.error.code}] ${p.error.message}`);return p}async function U(e){if(e.ready)return e.ready;let t=new AbortController;return e.abortController=t,e.ready=new Promise((r,o)=>{let s=!1,i=setTimeout(()=>{t.abort(),n(Error(`MCP SSE endpoint event timed out: ${e.url}`))},1e4),n=e=>{s||(s=!0,clearTimeout(i),o(e))};H(e,t,t=>{e.endpointURL=new URL(t,e.url).toString(),s||(s=!0,clearTimeout(i),r())},n)}).catch(t=>{throw K(e,t),t}),e.ready}async function H(e,t,r,o){try{var s;let i,n=await fetch(e.url,{method:"GET",headers:(s=e.headers,(i=new Headers(s)).set("Accept","text/event-stream"),i),signal:t.signal});if(!n.ok||!n.body){let e=await n.text();o(Error(`MCP SSE GET ${n.status}: ${e}`));return}if(!String(n.headers.get("content-type")??"").toLowerCase().includes("text/event-stream"))return void o(Error(`MCP SSE GET content-type=${n.headers.get("content-type")??"-"}`));await J(e,n.body,r),t.signal.aborted||K(e,Error("MCP SSE stream closed"))}catch(r){if(!t.signal.aborted){let t=r instanceof Error?r:Error(String(r));o(t),K(e,t)}}}async function J(e,t,r){let o=t.getReader(),s=new TextDecoder,i="",n="message",a=[],l=()=>{if(0===a.length){n="message";return}(function(e,t,r,o){let s;if("endpoint"===t)return o(r.trim());if(!r.trim())return;try{s=JSON.parse(r)}catch{return}let i=s.id;if(null==i)return;let n=e.pending.get(i);n&&(clearTimeout(n.timeout),e.pending.delete(i),n.resolve(s))})(e,n,a.join("\n"),r),n="message",a=[]};for(;;){let{done:e,value:t}=await o.read();if(e)break;let r=(i+=s.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:")?n=e.slice(6).trim():e.startsWith("data:")&&a.push(e.slice(5).trimStart()),r=i.search(/\r?\n/)}}i&&a.push(i),l()}function z(e,t){if(null===t)return;let r=e.pending.get(t);r&&(clearTimeout(r.timeout),e.pending.delete(t))}function K(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 F(e,t,r){var o,s;let i,n,a,l=X(t)||"unknown",c=ee(t),d=c?`${l}:${c}`:l,u=await G(e,{method:"POST",headers:(o=t,(i=new Headers((s=r).headers)).set("Content-Type","application/json"),i.set("Accept",O.join(", ")),(n=X(o))&&i.set("Mcp-Method",n),(a=ee(o))&&i.set("Mcp-Name",a),s.protocolVersion&&i.set("MCP-Protocol-Version",s.protocolVersion),s.sessionID&&i.set("Mcp-Session-Id",s.sessionID),i),body:JSON.stringify(t)},1e4,`MCP Streamable HTTP ${d}`),p=await u.text();if(!u.ok)throw Error(`MCP Streamable HTTP ${u.status}: ${p}`);if(!p&&r.allowEmpty)return{body:{},headers:u.headers};if(!p)throw Error("MCP Streamable HTTP returned empty response");let m=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)&&et(t)&&t.id===o})??t.find(et);if(!o)throw Error("MCP SSE response has no JSON-RPC response");return o}return JSON.parse(e)}(p,u.headers.get("content-type"),Q(t));if(m.error)throw Error(`MCP Streamable HTTP error: [${m.error.code}] ${m.error.message}`);return{body:m,headers:u.headers}}function W(e){let t=new URL(e);return("/"===t.pathname||""===t.pathname)&&(t.pathname="/mcp"),t.toString()}function V(e){return new URL(e).toString()}function B(e){return new URL(e).pathname.replace(/\/+$/,"").toLowerCase().endsWith("/sse")}function Y(e){return B(e)?V(e):W(e)}async function G(e,t,r,o){let s=new AbortController,i=setTimeout(()=>s.abort(),r);try{return await fetch(e,{...t,signal:s.signal})}catch(e){if(e instanceof Error&&"AbortError"===e.name)throw Error(`${o} timed out after ${r}ms`);throw e}finally{clearTimeout(i)}}function Z(e){let t=new URL(e);return`${t.hostname}_${t.port||t.protocol.replace(":","")}${t.pathname.replace(/[^A-Za-z0-9_-]/g,"_")}`}function Q(e){return e&&"object"==typeof e&&"id"in e?e.id??null:null}function X(e){if(e&&"object"==typeof e&&"method"in e)return e.method}function ee(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 et(e){return!!(e&&"object"==typeof e&&"id"in e&&("result"in e||"error"in e))}function er(e){return"string"==typeof e?e:""}function eo(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:void 0}function es(e){if(e)try{return JSON.parse(e)}catch{return}}function ei(e,t){return{code:e,level:"info",message:t}}function en(e,t,r){return{code:e,level:"warn",message:t,suggestion:r}}function ea(e,t,r){return{code:e,level:"error",message:t,suggestion:r}}async function el(e){var t,r,o;let s,i={requestID:"",answer:"",toolCalls:[],cards:[],traceEvents:[],streamErrors:[]},n=await g(`${eu(e.gatewayOrigin||m())}/app_developer/simulator/chat`,{method:"POST",headers:{"content-type":"application/json",accept:"text/event-stream"},body:JSON.stringify((t=e.evalCase,r=e.manifestYAML,o=e.mcp,s=t.app_name||t.app_key,{app_id:t.app_key,scene:"dbx_simulator_eval",history_messages:t.history_messages??[],message:{role:"USER",content:t.query},client:{platform:"cli",locale:"zh-CN",timezone:Intl.DateTimeFormat().resolvedOptions().timeZone||"Asia/Shanghai"},ext:{dbx_simulator_eval:"true",stateless_context:"client_history"},max_step:t.max_step??15,mini_apps:[{app_key:t.app_key,app_name:s,skill:t.skill,manifest:{app_key:t.app_key,app_name:s,raw_manifest_yaml:r},mcp_servers:[{server_id:t.mcp?.server_id||o.server_id,name:t.mcp?.name||o.name,description:t.mcp?.description||o.description||"",tools:o.tools}]}],web_capabilities:{supports_debug_event:!0}}))});if(i.logID=n.headers.get("x-tt-logid")||void 0,!n.ok||!n.body){let e=await n.text();throw new em(`chat failed: HTTP ${n.status} ${e}`,i.logID)}try{await ed(n.body,async t=>{var r,o,s,n,a;let l,c,d;if(r=i,o=t,o?.ack?.request_id&&(r.requestID=o.ack.request_id),o?.request_id&&!r.requestID&&(r.requestID=o.request_id),o?.trace?.trace_id&&(r.traceID=o.trace.trace_id),t?.text_delta?.delta&&(i.answer+=String(t.text_delta.delta)),t?.trace_event&&i.traceEvents.push({name:(s=t.trace_event).name,status:s.status,summary:s.summary,tool_name:s.tool_name,error:s.error}),t?.card_delta&&i.cards.push((l=(n=t.card_delta).card||{},d=(c=function(e){if("string"==typeof e)try{return JSON.parse(e)}catch{return}}(l.props_json)||{}).extra||{},{widget_id:c.widget_id,entity_id:c.entity_id,template:d["doubao/outputTemplate"],card_id:n.card_id||l.card_id,card_type:l.card_type})),t?.stream_error&&i.streamErrors.push(t.stream_error),t?.tool_call){let r=(a=t.tool_call,{tool_call_id:String(a.tool_call_id||""),tool_name:String(a.tool_name||""),server_id:a.server_id,app_key:a.app_key,arguments_json:a.arguments_json,status:a.status});try{let t=await e.callbacks.onToolCall(r,i.requestID),o=await ec({gatewayOrigin:e.gatewayOrigin,requestID:i.requestID,traceID:i.traceID,toolCall:r,result:t});i.toolCalls.push({toolCall:r,result:t,report:o}),e.callbacks.onToolReported?.(r,o)}catch(e){i.toolCalls.push({toolCall:r}),i.streamErrors.push({code:"tool_call_or_report_failed",message:e?.message||String(e),tool_name:r.tool_name,tool_call_id:r.tool_call_id,log_id:ep(e,"logId")||ep(e,"log_id")})}}})}catch(t){let e=new e_(t?.message||String(t),i,i.logID);throw e.cause=t,e}return i}async function ec(e){let t=Date.now(),r=await g(`${eu(e.gatewayOrigin||m())}/app_developer/simulator/tool/report`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({request_id:e.requestID,tool_call_id:e.toolCall.tool_call_id,server_id:e.toolCall.server_id||"",tool_name:e.toolCall.tool_name,status:"SUCCESS",app_key:e.toolCall.app_key,result:{tool_call_id:e.toolCall.tool_call_id,content:e.result.content||"",structured_json:JSON.stringify(e.result.structured||{})},raw_result_text:e.result.raw_result_text||e.result.content||"",raw_mcp_result_json:e.result.raw_mcp_result_json||"",miniapp:e.result.miniapp,timing:{started_at_ms:t,ended_at_ms:Date.now(),duration_ms:Date.now()-t,attempt:1},trace:{trace_id:e.traceID,component:"dbx_simulator_eval",stage:"tool_report",sampled:!0},ext:{reported_by:"dbx_simulator_eval"}})}),o=await r.text();if(!r.ok)throw new em(`tool report failed: HTTP ${r.status} ${o}`,r.headers.get("x-tt-logid")||void 0);return o?JSON.parse(o):{}}async function ed(e,t){let r=e.getReader(),o=new TextDecoder,s="";for(;;){let{done:e,value:i}=await r.read();if(e)break;let n=(s+=o.decode(i,{stream:!0})).split("\n\n");for(let e of(s=n.pop()||"",n)){let r=function(e){let t=e.split(/\r?\n/).filter(e=>e.startsWith("data:")).map(e=>e.slice(5).trimStart()).join("\n");if(t)try{return JSON.parse(t)}catch(e){throw Error(`invalid simulator SSE data: ${e?.message||String(e)}`)}}(e);r&&await t(r)}}}function eu(e){return e.replace(/\/+$/,"")}function ep(e,t){if("object"!=typeof e||null===e||Array.isArray(e))return;let r=e[t];return"string"==typeof r&&r?r:void 0}class em extends Error{constructor(e,t){super(e),this.logId=t}}class e_ extends Error{constructor(e,t,r){super(e),this.state=t,this.logId=r}}async function ef(t){try{let e,r=function(e){let t=n.resolve(e.projectPath),r=p(t),o=e.demo?function(e){try{return c(e).evalCase}catch{throw Error(`unknown simulator eval demo: ${e}. Supported demos: ${l.join(", ")}`)}}(e.demo):{},s=e.demo&&d(e.demo)?u(t,e.demo)?.streamableUrl:void 0,m={...o,...e.query?{query:e.query}:{},...void 0!==e.maxStep?{max_step:e.maxStep}:{}};if(e.historyPath&&(m.history_messages=function(e){if(!i.existsSync(e))throw x("history_file_not_found",`history file not found: ${e}`,"请检查 --history 路径;历史文件应为消息数组。");let t=function(e,t,r){try{return t.endsWith(".json")?JSON.parse(e):a.parse(e)}catch(e){throw x(`${r}_file_parse_failed`,`${r} file parse failed: ${e?.message||String(e)}`,`请检查 ${t} 的语法和缩进。`)}}(i.readFileSync(e,"utf8"),e,"history");if(!Array.isArray(t))throw x("history_file_invalid","history file must be an array","请把 history 文件写成数组,例如 [{ role: USER, content: hello }]。");return t}(C(e.historyPath,t))),e.skillPath)m.skill=b(C(e.skillPath,t),"skill");else if(m.skill&&E(m.skill))m.skill=b(C(m.skill,t),"skill");else if(!m.skill){let e=r.skillPath;i.existsSync(e)&&(m.skill=b(e,"skill"))}if(e.manifestPath)m.manifest=b(C(e.manifestPath,t),"manifest");else if(m.manifest&&E(m.manifest))m.manifest=b(C(m.manifest,t),"manifest");else if(!m.manifest){let e=r.manifestPath;i.existsSync(e)&&(m.manifest=b(e,"manifest"))}if(s&&(m.manifest=function(e,t){if("string"==typeof e)return e.trim()?[e.trimEnd(),"\nmcp_server:",` end_point: ${JSON.stringify(t)}`," mcp_config:\n protocol: Streamable\n"].join("\n"):e}(m.manifest,s)),function(e){if(!e.query||"string"!=typeof e.query||!e.query.trim())throw x("query_required","simulator eval requires query","请通过 --query 传入本轮用户问题。");if(!e.skill||"string"!=typeof e.skill)throw x("skill_required","simulator eval requires skill text or skill path","请在项目 skill/SKILL.md 放置 Skill,或通过 --skill 传入路径。");if(!e.manifest||"string"!=typeof e.manifest)throw x("manifest_required","simulator eval requires manifest YAML text or path","请在项目 manifest.yaml 放置 Manifest,或通过 --manifest 传入路径。")}(m),m.history_messages=(m.history_messages??[]).map((e,t)=>{if(!e||"object"!=typeof e)throw x("history_message_invalid",`history_messages[${t}] must be an object`,"请把每条历史消息写成 { role: USER|ASSISTANT|TOOL, content: string }。");let r=String(e.role||"").toUpperCase();if(!$.has(r))throw x("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 x("history_message_content_invalid",`history_messages[${t}].content must be a non-empty string`,"请为该历史消息补充非空 content。");return{role:r,content:e.content}}),m.max_step=m.max_step??15,!Number.isInteger(m.max_step)||m.max_step<=0)throw x("max_step_invalid","max_step must be a positive integer","请删除 max_step 使用默认值 15,或通过 --max-step 传入正整数。");return m}(t),o=await w(r.manifest,"compatible");if(!o.data?.success||!o.data.manifest)throw new eS("manifest validation failed",{code:"manifest_validation_failed",message:"manifest validation failed",errors:o.data?.errors??[],warnings:o.data?.warnings??[],log_id:o.log_id});let s=function(e,t){if(!y(t))throw x("manifest_parse_result_missing","simulator eval requires parsed manifest from yaml verify","请先确认后端 /yaml/verify 返回 data.manifest。");let r=y(t.mcp_server)?t.mcp_server:void 0,o=P(t.app_key),s=P(r?.end_point);if(!o)throw x("app_id_required","simulator eval requires manifest AppID","请在 manifest.yaml 配置 app_key(该字段对外称 AppID)。");if(!s)throw x("mcp_url_required","simulator eval 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 x(t,`${r} must be an http(s) URL: ${e}`,`请把 ${r} 配置为 http:// 或 https:// 开头的 MCP endpoint。`)}(s,"mcp_url_invalid","manifest.mcp_server.end_point"),{...e,app_key:o,app_name:P(t.name),mcp:{url:s,description:P(r?.description),headers:v(t)}}}(r,o.data.manifest),_=function(e){if(!y(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 app artifacts validate <manifest.yaml>`,确认后端能解析 manifest。"},e}let r=y(e.tools)?e.tools:{},o=y(e.entities)?e.entities:{},s={};for(let e of Object.values(o))if(y(e)&&y(e.tool_card_binding))for(let[t,r]of Object.entries(e.tool_card_binding))"string"==typeof r&&(s[t]=r);return{raw:e,appKey:"string"==typeof e.app_key?e.app_key:void 0,tools:r,entities:o,cardBindings:s}}(o.data.manifest),f=await q(s.mcp.url,s.app_key,s.mcp.headers).catch(e=>{var t,r,o;let i,n,a,l,c,d=(t=e,r=s.mcp.url,(c=(o=l=String(t?.message||t),n=(i=o.match(/<pre>([\s\S]*?)<\/pre>/i)?.[1])?i.replace(/<br\s*\/?>/gi,"\n").replace(/&nbsp;/g," ").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&"):o,(a=n.match(/(?:TypeError|ReferenceError|SyntaxError|Error):[^\n<]+/)?.[0])?a.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:l,server_error:c}}:{code:"mcp_unreachable",message:l,suggestion:"请先启动标准 MCP server,并确认 manifest.mcp_server.end_point 指向 CLI 当前运行环境可访问的 Streamable HTTP /mcp 或 SSE /sse 地址;不要求公网 URL。",details:{url:r,raw_error:l}});throw new eS(`MCP server unreachable: ${s.mcp.url}`,d)}),g={...f.tools,server_id:s.mcp.server_id||f.tools.server_id,name:s.mcp.name||f.tools.name,description:s.mcp.description||f.tools.description},h=[...function(e){let t=[],{evalCase:r,manifest:o,mcp:s}=e,i=new Set(s.tools.map(e=>e.name).filter(Boolean)),n=Object.keys(o.tools),a=new Set(n);if(o.appKey===r.app_key?t.push(ei("manifest_app_id_match",`manifest AppID matches request AppID (${r.app_key})`)):t.push(ea("manifest_app_id_mismatch",`manifest AppID (${o.appKey||"-"}) does not match request AppID (${r.app_key})`,"请保持请求 AppID 与 manifest.app_key 一致;如果走特殊测试链路会改写 AppID,需要确认后端映射规则。")),s.tools.length>0){let e="sse"===s.protocol?"SSE /sse":"Streamable HTTP /mcp";t.push(ei("mcp_tools_loaded",`MCP exposes ${s.tools.length} tool(s) via ${e}`))}else t.push(ea("mcp_tools_empty","MCP did not expose any tool","请检查标准 MCP tools/list 是否返回 tools。Streamable HTTP 传 /mcp,SSE 传 /sse。"));for(let e of n)i.has(e)||t.push(ea("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(ea("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(ea("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(ei("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=>y(e)&&y(e.output)&&"entities"===e.output.kind))?ea:en;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))y(r)&&y(r.schema)&&0===Object.entries(r.schema).filter(([,e])=>y(e)&&!0===e.is_entity_id).length&&t.push(ea("entity_id_missing",`manifest.entities.${e}.schema has no is_entity_id field`,"请为实体配置一个稳定主键字段,例如 product_id: { type: string, is_entity_id: true }。"));return t}({evalCase:s,manifest:_,mcp:g}),...function(e){let t=[];for(let r of e.tools){let e=ew(r.input_schema_json);if(e)for(let o of function e(t,r){let o=[];if(!y(t))return o;for(let e of["exclusiveMinimum","exclusiveMaximum"]){let s=t[e];"number"==typeof s&&o.push({path:`${r}/${e}`,value:s,message:`${e} is number ${s}, but simulator backend expects boolean`,suggestion:"如果使用 zod,避免 z.number().positive()/min()/max() 生成数值型 exclusiveMinimum/exclusiveMaximum;可改为 z.coerce.number() 并在工具内部校验业务范围。"})}for(let[s,i]of Object.entries(t))y(i)&&o.push(...e(i,`${r}/${s}`)),Array.isArray(i)&&i.forEach((t,i)=>{o.push(...e(t,`${r}/${s}/${i}`))});return o}(e,`tools/${r.name}/inputSchema`))t.push({code:"mcp_tool_schema_incompatible",level:"error",message:`MCP 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}(g)],S=t.gatewayOrigin||m();if(!t.force&&h.some(e=>"error"===e.level))return k({evalCase:s,manifest:_,preflight:h,gatewayOrigin:S,cardExpectation:t.cardExpectation,result:eg()});try{e=await el({evalCase:s,manifestYAML:s.manifest,mcp:g,gatewayOrigin:S,callbacks:{onToolCall:async(e,t)=>{var r,o;return A(s.mcp.url,(r=s,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:ew(o.arguments_json)||{},arguments_json:o.arguments_json||"{}"}))}}})}catch(e){if(e instanceof e_)return k({evalCase:s,manifest:_,preflight:h,gatewayOrigin:S,cardExpectation:t.cardExpectation,result:eh(e.state,[ey(e)])});return k({evalCase:s,manifest:_,preflight:h,gatewayOrigin:S,result:{...eg(),log_id:ev(e,"logId")||ev(e,"log_id"),stream_errors:[ey(e)]},cardExpectation:t.cardExpectation})}return k({evalCase:s,manifest:_,preflight:h,gatewayOrigin:S,cardExpectation:t.cardExpectation,result:eh(e)})}finally{e?.kind==="sse"&&K(e),e=void 0}}function eg(){return{request_id:"",tool_calls:[],cards:[],answer:"",trace_events:[],stream_errors:[]}}function eh(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:ew(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 ey(e){var t;let r=e instanceof Error?e.message:String(e);return{code:ev(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:y(e)?{...e,message:r}:r}}function ev(e,t){if(!y(e))return;let r=e[t];return"string"==typeof r&&r?r:void 0}function ew(e){if("string"==typeof e)try{return JSON.parse(e)}catch{return}}class eS extends Error{constructor(e,t){super(e),this.details=t}}function e$(){return new o("eval").description("评测 Agentic Service Simulator 后端链路").option("--project-path <path>","dbx 项目路径;相对路径参数会基于该目录解析",".").addOption(new s("--demo <name>","运行内置 demo").choices([...l])).option("--query <query>","当前轮用户 query").option("--history <path>","历史消息文件,支持 json/yaml 数组").option("--skill <path>","Skill md 文件路径;默认按项目布局自动解析").option("--manifest <path>","manifest yaml 文件路径;默认按项目布局自动解析").option("--gateway-origin <url>","Simulator 网关 origin;默认使用 CLI build config apiBaseUrl").addOption(new s("--max-step <count>","Agent 最大循环步数").argParser(_)).addOption(new s("--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)=>f(t,t=>eb(t,e)))}async function eb(e,t){let o;try{o=await ef({projectPath:t.projectPath,demo:t.demo,query:t.query,historyPath:t.history,skillPath:t.skill,manifestPath:t.manifest,gatewayOrigin:t.gatewayOrigin,maxStep:t.maxStep,cardExpectation:t.expectCard,force:t.force,verbose:t.verbose})}catch(a){var s,i;let t,r,o;if(e.json)throw a;let n=(t=y(s=a)?s.details:void 0,{code:eC(r=y(t)?t:void 0,"code"),message:eC(r,"message")||(s instanceof Error&&s.message?s.message:String(s)),suggestion:eC(r,"suggestion"),logId:eC(r,"log_id")||eC(r,"logId")||eC(s,"log_id")||eC(s,"logId"),details:t});throw new h((o=["Agentic Service Simulator Eval failed before diagnostics could run","","Error",...(i=n).code?[`- code: ${i.code}`]:[],`- message: ${i.message}`,...i.logId?[`- log_id: ${i.logId}`]:[],...i.suggestion?[`- fix: ${i.suggestion}`]:[]],void 0!==i.details&&o.push("","Details",ex(i.details)),o.join("\n")),{details:n.details,logId:n.logId})}if(e.json||function(e,t,r,o){let s=t.ok?o.green("PASS"):o.red("FAIL");if(e.log(`${o.bold("Agentic Service Simulator Eval")} ${s}`),e.log(""),e.log(o.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(""),eE(e,"Preflight",t.preflight,r,o),e.log(""),e.log(o.bold("Agent Flow")),0===t.tool_calls.length?e.log("- no tool call"):t.tool_calls.forEach((t,s)=>{e.log(`${s+1}. ${o.cyan(t.tool_name)} ${0===t.report_code?o.green("reported"):o.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(o.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(o.bold("Answer")),e.log(t.answer),e.log("")),r&&t.trace_events.length>0){for(let r of(e.log(o.bold("Trace")),t.trace_events))e.log(`- ${r.name||"-"} ${r.status||"-"} ${r.tool_name||""} ${r.summary||""}`);e.log("")}eE(e,"Diagnostics",t.errors,r,o),e.log(""),e.log(`${o.bold("Verdict")}: ${s}`)}(e,o,t.verbose,r),!o.ok)throw new h("simulator eval failed",{json:o,logId:o.log_id});return o}function ex(e){return"string"==typeof e?e:JSON.stringify(e,null,2)}function eC(e,t){if(!y(e))return;let r=e[t];return"string"==typeof r&&r?r:void 0}function eE(e,t,r,o,s){if(e.log(s.bold(t)),0===r.length)return void e.log("- none");for(let t of r){let r="error"===t.level?s.red("✗"):"warn"===t.level?s.yellow("!"):s.green("✓");e.log(`${r} ${t.code}: ${t.message}`),t.suggestion&&e.log(` fix: ${t.suggestion}`),o&&void 0!==t.details&&e.log(` details: ${ex(t.details)}`)}}export{S as eval_namespaceObject};
2
- //# sourceMappingURL=eval.js.map
1
+ let e;import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import{isRecord as r,parseInteger as o,option_Option as s,command_Command as i,CliError as n,http_getApiBaseUrl as a,runCommand as l,configuredFetch as c,chalk_source as d}from"./1664.js";import"./yaml.js";import{DBX_DEMO_NAMES as u,getDBXDemo as p,isDBXDemoName as m,readDBXDemoServerState as _}from"./dbx-demo.js";import{resolveProjectLayout as f}from"./project-layout.js";import{extractMCPHeadersFromManifest as g}from"./manifest-mcp-config.js";import{verifyYAML as h}from"./app.js";var y={};t.r(y),t.d(y,{default:()=>ex});let v=t("node:fs");var w=t.n(v);let S=t("node:path");var $=t.n(S);let b=t("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js"),x=new Set(["USER","ASSISTANT","TOOL"]);function C(e,t){if(!w().existsSync(e))throw E(`${t}_file_not_found`,`${t} file not found: ${e}`,`请检查 --${t} 路径;相对路径会按 --project-path 解析。`);if(!w().statSync(e).isFile())throw E(`${t}_path_not_file`,`${t} path must be a file: ${e}`,`请检查 --${t} 路径,不能传目录。`);return w().readFileSync(e,"utf8")}function E(e,t,r){let o=Error(t);return o.details={code:e,message:t,suggestion:r},o}function P(e,t){return $().isAbsolute(e)?e:$().resolve(t,e)}function k(e){return e.includes("/")||e.endsWith(".md")||e.endsWith(".json")||e.endsWith(".yaml")||e.endsWith(".yml")}function j(e){return"string"==typeof e&&e.trim()?e:void 0}function T(e){var t,o;let s=[],i=e.preflight.filter(e=>"error"===e.level);for(let r of(s.push(...i),s.push(...(t=e.result.trace_events,o=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:I(e.error?.code,o),details:e.error})))),e.result.stream_errors??[]))s.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:I(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}}(r));if(!s.some(e=>"error"===e.level)){let t=e.cardExpectation??"auto";s.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),o=e.evalCase.expect?.tool_calls??[];o.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}(o,r)&&s.push({code:"expectation_tool_chain_mismatch",level:"error",message:`expected tool chain ${o.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&&s.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&&s.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]&&s.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 n=function(e){let t=new Set,o=[];for(let s 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 o=M(function(e,t){if(!r(e))return;let o=e[t];return r(o)?o:void 0}(t.details,"details"),"raw_error")||M(t.details,"raw_error");return void 0!==o&&e.message.includes(o)})}(s,o))continue;let e=`${s.level}\u0000${s.code}\u0000${s.message}`;t.has(e)||(t.add(e),o.push(s))}return o}(s),a=0===n.filter(e=>"error"===e.level).length;return{ok:a,verdict:a?"PASS":"FAIL",case:e.evalCase,context:{history_count:e.evalCase.history_messages?.length??0,query:e.evalCase.query,mcp_url:e.evalCase.mcp.url,gateway_origin:e.gatewayOrigin,max_step:e.evalCase.max_step},preflight:e.preflight,errors:n,...e.result}}function M(e,t){if(!r(e))return;let o=e[t];return"string"==typeof o&&o?o:void 0}function I(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",q=["application/json","text/event-stream"];async function A(e,t,r){return G(e)?R(e,t,r):N(e,t,r)}async function D(t,r){var o,s;if(e&&(o=e.url,s=t,Z(o)===Z(s)))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 L(e,r):await U(e,r));throw Error("MCP session is not initialized. Please ensure fetchMCPDescriptor runs before tools/call.")}async function N(t,r,o){let s=B(t);try{let t=await V(s,{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,n=t.headers.get("mcp-session-id")??void 0;e={kind:"streamable",url:s,sessionID:n,protocolVersion:i,headers:o},await V(s,{jsonrpc:"2.0",method:"notifications/initialized",params:{}},{sessionID:n,protocolVersion:i,allowEmpty:!0,headers:o});let a=await V(s,{jsonrpc:"2.0",id:2,method:"tools/list",params:{}},{sessionID:n,protocolVersion:i,headers:o});return{tools:{server_id:X(s),name:X(s),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(t){throw e=void 0,Error(`standard MCP Streamable HTTP initialize/tools/list failed: ${s}: ${t?.message||String(t)}`)}}async function R(t,r,o){let s=Y(t),i={kind:"sse",url:s,pending:new Map,headers:o};e=i;try{await H(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 H(i,{jsonrpc:"2.0",method:"notifications/initialized",params:{}},!0);let e=await H(i,{jsonrpc:"2.0",id:2,method:"tools/list",params:{}},!1);return{tools:{server_id:X(s),name:X(s),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(t){throw W(i),e=void 0,Error(`standard MCP SSE initialize/tools/list failed: ${s}: ${t?.message||String(t)}`)}}async function U(e,t){let r=es(t.tool_name);if(!r)throw Error("MCP tool name is empty");return(await V(e.url,{jsonrpc:"2.0",id:Date.now(),method:"tools/call",params:{name:r,arguments:ei(t.arguments)??en(es(t.arguments_json))??{}}},{sessionID:e.sessionID,protocolVersion:e.protocolVersion,headers:e.headers})).body.result}async function L(e,t){let r=es(t.tool_name);if(!r)throw Error("MCP tool name is empty");return(await H(e,{jsonrpc:"2.0",id:Date.now(),method:"tools/call",params:{name:r,arguments:ei(t.arguments)??en(es(t.arguments_json))??{}}},!1)).result}async function H(e,t,r){let o;if(await J(e),!e.endpointURL)throw Error("MCP SSE did not provide endpoint event");let s=ee(t),i=et(t)||"unknown",n=er(t),a=n?`${i}:${n}`:i,l=null!==s,c=l?new Promise((t,r)=>{let o=setTimeout(()=>{e.pending.delete(s),r(Error(`MCP SSE request timed out: ${a}`))},1e4);e.pending.set(s,{resolve:t,reject:r,timeout:o})}):void 0;try{var d;let r;o=await Q(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&&F(e,s),t}let u=await o.text();if(!o.ok)throw l&&F(e,s),Error(`MCP SSE POST ${o.status}: ${u}`);if(!l)return{};let p=await c;if(!p&&!r)throw Error("MCP SSE returned empty response");if(p?.error)throw Error(`MCP SSE error: [${p.error.code}] ${p.error.message}`);return p}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 s=!1,i=setTimeout(()=>{t.abort(),n(Error(`MCP SSE endpoint event timed out: ${e.url}`))},1e4),n=e=>{s||(s=!0,clearTimeout(i),o(e))};K(e,t,t=>{e.endpointURL=new URL(t,e.url).toString(),s||(s=!0,clearTimeout(i),r())},n)}).catch(t=>{throw W(e,t),t}),e.ready}async function K(e,t,r,o){try{var s;let i,n=await fetch(e.url,{method:"GET",headers:(s=e.headers,(i=new Headers(s)).set("Accept","text/event-stream"),i),signal:t.signal});if(!n.ok||!n.body){let e=await n.text();o(Error(`MCP SSE GET ${n.status}: ${e}`));return}if(!String(n.headers.get("content-type")??"").toLowerCase().includes("text/event-stream"))return void o(Error(`MCP SSE GET content-type=${n.headers.get("content-type")??"-"}`));await z(e,n.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 z(e,t,r){let o=t.getReader(),s=new TextDecoder,i="",n="message",a=[],l=()=>{if(0===a.length){n="message";return}(function(e,t,r,o){let s;if("endpoint"===t)return o(r.trim());if(!r.trim())return;try{s=JSON.parse(r)}catch{return}let i=s.id;if(null==i)return;let n=e.pending.get(i);n&&(clearTimeout(n.timeout),e.pending.delete(i),n.resolve(s))})(e,n,a.join("\n"),r),n="message",a=[]};for(;;){let{done:e,value:t}=await o.read();if(e)break;let r=(i+=s.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:")?n=e.slice(6).trim():e.startsWith("data:")&&a.push(e.slice(5).trimStart()),r=i.search(/\r?\n/)}}i&&a.push(i),l()}function F(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 V(e,t,r){var o,s;let i,n,a,l=et(t)||"unknown",c=er(t),d=c?`${l}:${c}`:l,u=await Q(e,{method:"POST",headers:(o=t,(i=new Headers((s=r).headers)).set("Content-Type","application/json"),i.set("Accept",q.join(", ")),(n=et(o))&&i.set("Mcp-Method",n),(a=er(o))&&i.set("Mcp-Name",a),s.protocolVersion&&i.set("MCP-Protocol-Version",s.protocolVersion),s.sessionID&&i.set("Mcp-Session-Id",s.sessionID),i),body:JSON.stringify(t)},1e4,`MCP Streamable HTTP ${d}`),p=await u.text();if(!u.ok)throw Error(`MCP Streamable HTTP ${u.status}: ${p}`);if(!p&&r.allowEmpty)return{body:{},headers:u.headers};if(!p)throw Error("MCP Streamable HTTP returned empty response");let m=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)&&eo(t)&&t.id===o})??t.find(eo);if(!o)throw Error("MCP SSE response has no JSON-RPC response");return o}return JSON.parse(e)}(p,u.headers.get("content-type"),ee(t));if(m.error)throw Error(`MCP Streamable HTTP error: [${m.error.code}] ${m.error.message}`);return{body:m,headers:u.headers}}function B(e){let t=new URL(e);return("/"===t.pathname||""===t.pathname)&&(t.pathname="/mcp"),t.toString()}function Y(e){return new URL(e).toString()}function G(e){return new URL(e).pathname.replace(/\/+$/,"").toLowerCase().endsWith("/sse")}function Z(e){return G(e)?Y(e):B(e)}async function Q(e,t,r,o){let s=new AbortController,i=setTimeout(()=>s.abort(),r);try{return await fetch(e,{...t,signal:s.signal})}catch(e){if(e instanceof Error&&"AbortError"===e.name)throw Error(`${o} timed out after ${r}ms`);throw e}finally{clearTimeout(i)}}function X(e){let t=new URL(e);return`${t.hostname}_${t.port||t.protocol.replace(":","")}${t.pathname.replace(/[^A-Za-z0-9_-]/g,"_")}`}function ee(e){return e&&"object"==typeof e&&"id"in e?e.id??null:null}function et(e){if(e&&"object"==typeof e&&"method"in e)return e.method}function er(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 eo(e){return!!(e&&"object"==typeof e&&"id"in e&&("result"in e||"error"in e))}function es(e){return"string"==typeof e?e:""}function ei(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:void 0}function en(e){if(e)try{return JSON.parse(e)}catch{return}}function ea(e,t){return{code:e,level:"info",message:t}}function el(e,t,r){return{code:e,level:"warn",message:t,suggestion:r}}function ec(e,t,r){return{code:e,level:"error",message:t,suggestion:r}}async function ed(e){var t,r,o;let s,i={requestID:"",answer:"",toolCalls:[],cards:[],traceEvents:[],streamErrors:[]},n=await c(`${em(e.gatewayOrigin||a())}/app_developer/simulator/chat`,{method:"POST",headers:{"content-type":"application/json",accept:"text/event-stream"},body:JSON.stringify((t=e.evalCase,r=e.manifestYAML,o=e.mcp,s=t.app_name||t.app_key,{app_id:t.app_key,scene:"dbx_simulator_eval",history_messages:t.history_messages??[],message:{role:"USER",content:t.query},client:{platform:"cli",locale:"zh-CN",timezone:Intl.DateTimeFormat().resolvedOptions().timeZone||"Asia/Shanghai"},ext:{dbx_simulator_eval:"true",stateless_context:"client_history"},max_step:t.max_step??15,mini_apps:[{app_key:t.app_key,app_name:s,skill:t.skill,manifest:{app_key:t.app_key,app_name:s,raw_manifest_yaml:r},mcp_servers:[{server_id:t.mcp?.server_id||o.server_id,name:t.mcp?.name||o.name,description:t.mcp?.description||o.description||"",tools:o.tools}]}],web_capabilities:{supports_debug_event:!0}}))});if(i.logID=n.headers.get("x-tt-logid")||void 0,!n.ok||!n.body){let e=await n.text();throw new ef(`chat failed: HTTP ${n.status} ${e}`,i.logID)}try{await ep(n.body,async t=>{var r,o,s,n,a;let l,c,d;if(r=i,o=t,o?.ack?.request_id&&(r.requestID=o.ack.request_id),o?.request_id&&!r.requestID&&(r.requestID=o.request_id),o?.trace?.trace_id&&(r.traceID=o.trace.trace_id),t?.text_delta?.delta&&(i.answer+=String(t.text_delta.delta)),t?.trace_event&&i.traceEvents.push({name:(s=t.trace_event).name,status:s.status,summary:s.summary,tool_name:s.tool_name,error:s.error}),t?.card_delta&&i.cards.push((l=(n=t.card_delta).card||{},d=(c=function(e){if("string"==typeof e)try{return JSON.parse(e)}catch{return}}(l.props_json)||{}).extra||{},{widget_id:c.widget_id,entity_id:c.entity_id,template:d["doubao/outputTemplate"],card_id:n.card_id||l.card_id,card_type:l.card_type})),t?.stream_error&&i.streamErrors.push(t.stream_error),t?.tool_call){let r=(a=t.tool_call,{tool_call_id:String(a.tool_call_id||""),tool_name:String(a.tool_name||""),server_id:a.server_id,app_key:a.app_key,arguments_json:a.arguments_json,status:a.status});try{let t=await e.callbacks.onToolCall(r,i.requestID),o=await eu({gatewayOrigin:e.gatewayOrigin,requestID:i.requestID,traceID:i.traceID,toolCall:r,result:t});i.toolCalls.push({toolCall:r,result:t,report:o}),e.callbacks.onToolReported?.(r,o)}catch(e){i.toolCalls.push({toolCall:r}),i.streamErrors.push({code:"tool_call_or_report_failed",message:e?.message||String(e),tool_name:r.tool_name,tool_call_id:r.tool_call_id,log_id:e_(e,"logId")||e_(e,"log_id")})}}})}catch(t){let e=new eg(t?.message||String(t),i,i.logID);throw e.cause=t,e}return i}async function eu(e){let t=Date.now(),r=await c(`${em(e.gatewayOrigin||a())}/app_developer/simulator/tool/report`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({request_id:e.requestID,tool_call_id:e.toolCall.tool_call_id,server_id:e.toolCall.server_id||"",tool_name:e.toolCall.tool_name,status:"SUCCESS",app_key:e.toolCall.app_key,result:{tool_call_id:e.toolCall.tool_call_id,content:e.result.content||"",structured_json:JSON.stringify(e.result.structured||{})},raw_result_text:e.result.raw_result_text||e.result.content||"",raw_mcp_result_json:e.result.raw_mcp_result_json||"",miniapp:e.result.miniapp,timing:{started_at_ms:t,ended_at_ms:Date.now(),duration_ms:Date.now()-t,attempt:1},trace:{trace_id:e.traceID,component:"dbx_simulator_eval",stage:"tool_report",sampled:!0},ext:{reported_by:"dbx_simulator_eval"}})}),o=await r.text();if(!r.ok)throw new ef(`tool report failed: HTTP ${r.status} ${o}`,r.headers.get("x-tt-logid")||void 0);return o?JSON.parse(o):{}}async function ep(e,t){let r=e.getReader(),o=new TextDecoder,s="";for(;;){let{done:e,value:i}=await r.read();if(e)break;let n=(s+=o.decode(i,{stream:!0})).split("\n\n");for(let e of(s=n.pop()||"",n)){let r=function(e){let t=e.split(/\r?\n/).filter(e=>e.startsWith("data:")).map(e=>e.slice(5).trimStart()).join("\n");if(t)try{return JSON.parse(t)}catch(e){throw Error(`invalid simulator SSE data: ${e?.message||String(e)}`)}}(e);r&&await t(r)}}}function em(e){return e.replace(/\/+$/,"")}function e_(e,t){if("object"!=typeof e||null===e||Array.isArray(e))return;let r=e[t];return"string"==typeof r&&r?r:void 0}class ef extends Error{logId;constructor(e,t){super(e),this.logId=t}}class eg extends Error{state;logId;cause;constructor(e,t,r){super(e),this.state=t,this.logId=r}}async function eh(t){try{let e,o=function(e){let t=$().resolve(e.projectPath),r=f(t),o=e.demo?function(e){try{return p(e).evalCase}catch{throw Error(`unknown simulator eval demo: ${e}. Supported demos: ${u.join(", ")}`)}}(e.demo):{},s=e.demo&&m(e.demo)?_(t,e.demo)?.streamableUrl:void 0,i={...o,...e.query?{query:e.query}:{},...void 0!==e.maxStep?{max_step:e.maxStep}:{}};if(e.historyPath&&(i.history_messages=function(e){if(!w().existsSync(e))throw E("history_file_not_found",`history file not found: ${e}`,"请检查 --history 路径;历史文件应为消息数组。");let t=function(e,t,r){try{return t.endsWith(".json")?JSON.parse(e):b.qg(e)}catch(e){throw E(`${r}_file_parse_failed`,`${r} file parse failed: ${e?.message||String(e)}`,`请检查 ${t} 的语法和缩进。`)}}(w().readFileSync(e,"utf8"),e,"history");if(!Array.isArray(t))throw E("history_file_invalid","history file must be an array","请把 history 文件写成数组,例如 [{ role: USER, content: hello }]。");return t}(P(e.historyPath,t))),e.skillPath)i.skill=C(P(e.skillPath,t),"skill");else if(i.skill&&k(i.skill))i.skill=C(P(i.skill,t),"skill");else if(!i.skill){let e=r.skillPath;w().existsSync(e)&&(i.skill=C(e,"skill"))}if(e.manifestPath)i.manifest=C(P(e.manifestPath,t),"manifest");else if(i.manifest&&k(i.manifest))i.manifest=C(P(i.manifest,t),"manifest");else if(!i.manifest){let e=r.manifestPath;w().existsSync(e)&&(i.manifest=C(e,"manifest"))}if(s&&(i.manifest=function(e,t){if("string"==typeof e)return e.trim()?[e.trimEnd(),"\nmcp_server:",` end_point: ${JSON.stringify(t)}`," mcp_config:\n protocol: Streamable\n"].join("\n"):e}(i.manifest,s)),function(e){if(!e.query||"string"!=typeof e.query||!e.query.trim())throw E("query_required","simulator eval requires query","请通过 --query 传入本轮用户问题。");if(!e.skill||"string"!=typeof e.skill)throw E("skill_required","simulator eval requires skill text or skill path","请在项目 skill/SKILL.md 放置 Skill,或通过 --skill 传入路径。");if(!e.manifest||"string"!=typeof e.manifest)throw E("manifest_required","simulator eval requires manifest YAML text or path","请在项目 manifest.yaml 放置 Manifest,或通过 --manifest 传入路径。")}(i),i.history_messages=(i.history_messages??[]).map((e,t)=>{if(!e||"object"!=typeof e)throw E("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 E("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 E("history_message_content_invalid",`history_messages[${t}].content must be a non-empty string`,"请为该历史消息补充非空 content。");return{role:r,content:e.content}}),i.max_step=i.max_step??15,!Number.isInteger(i.max_step)||i.max_step<=0)throw E("max_step_invalid","max_step must be a positive integer","请删除 max_step 使用默认值 15,或通过 --max-step 传入正整数。");return i}(t),s=await h(o.manifest,"compatible");if(!s.data?.success||!s.data.manifest)throw new eb("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 i=function(e,t){if(!r(t))throw E("manifest_parse_result_missing","simulator eval requires parsed manifest from yaml verify","请先确认后端 /yaml/verify 返回 data.manifest。");let o=r(t.mcp_server)?t.mcp_server:void 0,s=j(t.app_key),i=j(o?.end_point);if(!s)throw E("app_id_required","simulator eval requires manifest AppID","请在 manifest.yaml 配置 app_key(该字段对外称 AppID)。");if(!i)throw E("mcp_url_required","simulator eval 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 E(t,`${r} must be an http(s) URL: ${e}`,`请把 ${r} 配置为 http:// 或 https:// 开头的 MCP endpoint。`)}(i,"mcp_url_invalid","manifest.mcp_server.end_point"),{...e,app_key:s,app_name:j(t.name),mcp:{url:i,description:j(o?.description),headers:g(t)}}}(o,s.data.manifest),n=function(e){if(!r(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 app artifacts validate <manifest.yaml>`,确认后端能解析 manifest。"},e}let o=r(e.tools)?e.tools:{},s=r(e.entities)?e.entities:{},i={};for(let e of Object.values(s))if(r(e)&&r(e.tool_card_binding))for(let[t,r]of Object.entries(e.tool_card_binding))"string"==typeof r&&(i[t]=r);return{raw:e,appKey:"string"==typeof e.app_key?e.app_key:void 0,tools:o,entities:s,cardBindings:i}}(s.data.manifest),l=await A(i.mcp.url,i.app_key,i.mcp.headers).catch(e=>{var t,r,o;let s,n,a,l,c,d=(t=e,r=i.mcp.url,(c=(o=l=String(t?.message||t),n=(s=o.match(/<pre>([\s\S]*?)<\/pre>/i)?.[1])?s.replace(/<br\s*\/?>/gi,"\n").replace(/&nbsp;/g," ").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&"):o,(a=n.match(/(?:TypeError|ReferenceError|SyntaxError|Error):[^\n<]+/)?.[0])?a.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:l,server_error:c}}:{code:"mcp_unreachable",message:l,suggestion:"请先启动标准 MCP server,并确认 manifest.mcp_server.end_point 指向 CLI 当前运行环境可访问的 Streamable HTTP /mcp 或 SSE /sse 地址;不要求公网 URL。",details:{url:r,raw_error:l}});throw new eb(`MCP server unreachable: ${i.mcp.url}`,d)}),c={...l.tools,server_id:i.mcp.server_id||l.tools.server_id,name:i.mcp.name||l.tools.name,description:i.mcp.description||l.tools.description},d=[...function(e){let t=[],{evalCase:o,manifest:s,mcp:i}=e,n=new Set(i.tools.map(e=>e.name).filter(Boolean)),a=Object.keys(s.tools),l=new Set(a);if(s.appKey===o.app_key?t.push(ea("manifest_app_id_match",`manifest AppID matches request AppID (${o.app_key})`)):t.push(ec("manifest_app_id_mismatch",`manifest AppID (${s.appKey||"-"}) does not match request AppID (${o.app_key})`,"请保持请求 AppID 与 manifest.app_key 一致;如果走特殊测试链路会改写 AppID,需要确认后端映射规则。")),i.tools.length>0){let e="sse"===i.protocol?"SSE /sse":"Streamable HTTP /mcp";t.push(ea("mcp_tools_loaded",`MCP exposes ${i.tools.length} tool(s) via ${e}`))}else t.push(ec("mcp_tools_empty","MCP did not expose any tool","请检查标准 MCP tools/list 是否返回 tools。Streamable HTTP 传 /mcp,SSE 传 /sse。"));for(let e of a)n.has(e)||t.push(ec("manifest_tool_missing_in_mcp",`manifest.tools declares ${e}, but MCP does not expose it`,"请确保会出卡的 tool 同时存在于 MCP tools 与 manifest.tools。"));for(let e of o.expect?.tool_calls??[])l.has(e)||t.push(ec("expected_tool_missing_in_manifest",`expect.tool_calls declares ${e}, but manifest.tools does not declare it`,`请在 manifest.tools.${e} 中声明该工具;非出卡工具也需要配置 output.kind,例如 execution_result。`)),n.has(e)||t.push(ec("expected_tool_missing_in_mcp",`expect.tool_calls declares ${e}, but MCP does not expose it`,"请确认 MCP tools/list 返回了期望调用的工具,或修正内置 demo 的 expect.tool_calls。"));let c=Object.keys(s.cardBindings);if(c.length>0)t.push(ea("card_binding_found",`card binding found: ${c.map(e=>`${e} -> ${s.cardBindings[e]}`).join(", ")}`));else{var d,u;let e=(d=o,u=s,d.expect?.card||Object.values(u.tools).some(e=>r(e)&&r(e.output)&&"entities"===e.output.kind))?ec:el;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,o]of Object.entries(s.entities))r(o)&&r(o.schema)&&0===Object.entries(o.schema).filter(([,e])=>r(e)&&!0===e.is_entity_id).length&&t.push(ec("entity_id_missing",`manifest.entities.${e}.schema has no is_entity_id field`,"请为实体配置一个稳定主键字段,例如 product_id: { type: string, is_entity_id: true }。"));return t}({evalCase:i,manifest:n,mcp:c}),...function(e){let t=[];for(let o of e.tools){let e=e$(o.input_schema_json);if(e)for(let s of function e(t,o){let s=[];if(!r(t))return s;for(let e of["exclusiveMinimum","exclusiveMaximum"]){let r=t[e];"number"==typeof r&&s.push({path:`${o}/${e}`,value:r,message:`${e} is number ${r}, but simulator backend expects boolean`,suggestion:"如果使用 zod,避免 z.number().positive()/min()/max() 生成数值型 exclusiveMinimum/exclusiveMaximum;可改为 z.coerce.number() 并在工具内部校验业务范围。"})}for(let[i,n]of Object.entries(t))r(n)&&s.push(...e(n,`${o}/${i}`)),Array.isArray(n)&&n.forEach((t,r)=>{s.push(...e(t,`${o}/${i}/${r}`))});return s}(e,`tools/${o.name}/inputSchema`))t.push({code:"mcp_tool_schema_incompatible",level:"error",message:`MCP tool ${o.name} inputSchema is not compatible: ${s.message}`,suggestion:s.suggestion,details:{tool_name:o.name,path:s.path,value:s.value}})}return t}(c)],y=t.gatewayOrigin||a();if(!t.force&&d.some(e=>"error"===e.level))return T({evalCase:i,manifest:n,preflight:d,gatewayOrigin:y,cardExpectation:t.cardExpectation,result:ey()});try{e=await ed({evalCase:i,manifestYAML:i.manifest,mcp:c,gatewayOrigin:y,callbacks:{onToolCall:async(e,t)=>{var r,o;return D(i.mcp.url,(r=i,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:e$(o.arguments_json)||{},arguments_json:o.arguments_json||"{}"}))}}})}catch(e){if(e instanceof eg)return T({evalCase:i,manifest:n,preflight:d,gatewayOrigin:y,cardExpectation:t.cardExpectation,result:ev(e.state,[ew(e)])});return T({evalCase:i,manifest:n,preflight:d,gatewayOrigin:y,result:{...ey(),log_id:eS(e,"logId")||eS(e,"log_id"),stream_errors:[ew(e)]},cardExpectation:t.cardExpectation})}return T({evalCase:i,manifest:n,preflight:d,gatewayOrigin:y,cardExpectation:t.cardExpectation,result:ev(e)})}finally{e?.kind==="sse"&&W(e),e=void 0}}function ey(){return{request_id:"",tool_calls:[],cards:[],answer:"",trace_events:[],stream_errors:[]}}function ev(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:e$(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 ew(e){var t;let o=e instanceof Error?e.message:String(e);return{code:eS(e,"code")||"simulator_eval_runtime_error",level:"error",message:o,suggestion:(t=o).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:r(e)?{...e,message:o}:o}}function eS(e,t){if(!r(e))return;let o=e[t];return"string"==typeof o&&o?o:void 0}function e$(e){if("string"==typeof e)try{return JSON.parse(e)}catch{return}}class eb extends Error{details;constructor(e,t){super(e),this.details=t}}function ex(){return new i("eval").description("评测 Agentic Service Simulator 后端链路").option("--project-path <path>","dbx 项目路径;相对路径参数会基于该目录解析",".").addOption(new s("--demo <name>","运行内置 demo").choices([...u])).option("--query <query>","当前轮用户 query").option("--history <path>","历史消息文件,支持 json/yaml 数组").option("--skill <path>","Skill md 文件路径;默认按项目布局自动解析").option("--manifest <path>","manifest yaml 文件路径;默认按项目布局自动解析").option("--gateway-origin <url>","Simulator 网关 origin;默认使用 CLI build config apiBaseUrl").addOption(new s("--max-step <count>","Agent 最大循环步数").argParser(o)).addOption(new s("--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)=>l(t,t=>eC(t,e)))}async function eC(e,t){let o;try{o=await eh({projectPath:t.projectPath,demo:t.demo,query:t.query,historyPath:t.history,skillPath:t.skill,manifestPath:t.manifest,gatewayOrigin:t.gatewayOrigin,maxStep:t.maxStep,cardExpectation:t.expectCard,force:t.force,verbose:t.verbose})}catch(c){var s,i;let t,o,a;if(e.json)throw c;let l=(t=r(s=c)?s.details:void 0,{code:eP(o=r(t)?t:void 0,"code"),message:eP(o,"message")||(s instanceof Error&&s.message?s.message:String(s)),suggestion:eP(o,"suggestion"),logId:eP(o,"log_id")||eP(o,"logId")||eP(s,"log_id")||eP(s,"logId"),details:t});throw new n((a=["Agentic Service Simulator Eval failed before diagnostics could run","","Error",...(i=l).code?[`- code: ${i.code}`]:[],`- message: ${i.message}`,...i.logId?[`- log_id: ${i.logId}`]:[],...i.suggestion?[`- fix: ${i.suggestion}`]:[]],void 0!==i.details&&a.push("","Details",eE(i.details)),a.join("\n")),{details:l.details,logId:l.logId})}if(e.json||function(e,t,r,o){let s=t.ok?o.green("PASS"):o.red("FAIL");if(e.log(`${o.bold("Agentic Service Simulator Eval")} ${s}`),e.log(""),e.log(o.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(""),ek(e,"Preflight",t.preflight,r,o),e.log(""),e.log(o.bold("Agent Flow")),0===t.tool_calls.length?e.log("- no tool call"):t.tool_calls.forEach((t,s)=>{e.log(`${s+1}. ${o.cyan(t.tool_name)} ${0===t.report_code?o.green("reported"):o.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(o.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(o.bold("Answer")),e.log(t.answer),e.log("")),r&&t.trace_events.length>0){for(let r of(e.log(o.bold("Trace")),t.trace_events))e.log(`- ${r.name||"-"} ${r.status||"-"} ${r.tool_name||""} ${r.summary||""}`);e.log("")}ek(e,"Diagnostics",t.errors,r,o),e.log(""),e.log(`${o.bold("Verdict")}: ${s}`)}(e,o,t.verbose,d),!o.ok)throw new n("simulator eval failed",{json:o,logId:o.log_id});return o}function eE(e){return"string"==typeof e?e:JSON.stringify(e,null,2)}function eP(e,t){if(!r(e))return;let o=e[t];return"string"==typeof o&&o?o:void 0}function ek(e,t,r,o,s){if(e.log(s.bold(t)),0===r.length)return void e.log("- none");for(let t of r){let r="error"===t.level?s.red("✗"):"warn"===t.level?s.yellow("!"):s.green("✓");e.log(`${r} ${t.code}: ${t.message}`),t.suggestion&&e.log(` fix: ${t.suggestion}`),o&&void 0!==t.details&&e.log(` details: ${eE(t.details)}`)}}export{y as eval_namespaceObject};
package/dist/get.js CHANGED
@@ -1,2 +1 @@
1
- import"node:module";import{Command as o}from"commander";import{runCommand as _}from"./564.js";import{fetchSandboxAppCredentials as d}from"./sandbox.js";async function a(o){let _=await d();return _.sandbox_project_id&&o.log(`sandbox_project_id: ${_.sandbox_project_id}`),o.log(`sandbox_app_id: ${_.sandbox_app_id}`),o.log(`sandbox_app_secret: ${_.sandbox_app_secret}`),_.log_id&&o.log(`log_id: ${_.log_id}`),_}export default function(){return new o("get").description("获取 sandbox appid 和 appsecret").action(async(o,d)=>_(d,o=>a(o)))};
2
- //# sourceMappingURL=get.js.map
1
+ import"node:module";import{command_Command as o,runCommand as _}from"./1664.js";import{fetchSandboxAppCredentials as d}from"./sandbox.js";async function a(o){let _=await d();return _.sandbox_project_id&&o.log(`sandbox_project_id: ${_.sandbox_project_id}`),o.log(`sandbox_app_id: ${_.sandbox_app_id}`),o.log(`sandbox_app_secret: ${_.sandbox_app_secret}`),_.log_id&&o.log(`log_id: ${_.log_id}`),_}export default function(){return new o("get").description("获取 sandbox appid 和 appsecret").action(async(o,d)=>_(d,o=>a(o)))};
package/dist/init.js CHANGED
@@ -1,8 +1,7 @@
1
- import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import t,{existsSync as r,lstatSync as n,mkdirSync as i,readFileSync as s,readdirSync as o,rmSync as a,statSync as l,writeFileSync as p}from"node:fs";import d,{isAbsolute as c,resolve as u,win32 as f}from"node:path";import{Command as h,Option as m}from"commander";import{checkbox as g,input as y}from"@inquirer/prompts";import _ from"chalk";import b from"ora";import{stripVTControlCharacters as w}from"node:util";import{execa as S}from"execa";import{fileURLToPath as v}from"node:url";import k from"yaml";import{AGENTIC_SERVICE_SKILL_NAME as x,AGENTIC_SERVICE_DISPLAY_NAME as j,isRecord as $,version_version as E,types_TokenStatus as A,DEFAULT_FRONTEND_DIRECTORY as P,runCommand as N,collectChoiceValues as I}from"./564.js";import{installSkills as O,SUPPORTED_AGENTS as R}from"./skills.js";import{resolveProjectLayout as q}from"./project-layout.js";import{formatPollStatus as M,login as V,getAuthStatus as C}from"./auth.js";import{openUrlInBrowser as K}from"./browser.js";import{fetchSandboxAppCredentials as U}from"./sandbox.js";import*as D from"node:fs";import*as T from"node:path";var F={};function B(e){if(!D.existsSync(e))return{};let t=JSON.parse(D.readFileSync(e,"utf8"));return $(t)?t:{}}e.r(F),e.d(F,{default:()=>eb});let H=new Set(["node_modules",".git"]);async function J(e){var t;let n=e.appId.trim();if(!n)throw Error("frontend scaffold requires a sandbox AppID");let s=e.directory?.trim()||".",p=d.resolve(e.projectPath),c=d.resolve(p,s),u=(t=c,d.basename(t)||P),f=!!(e.overwriteExisting&&r(c));f&&c!==p&&(e.onStatus?.("clearing_existing_directory"),function(e){if(!l(e).isDirectory())throw Error(`frontend scaffold target is not a directory: ${e}`);for(let t of o(e))H.has(t)||a(d.join(e,t),{recursive:!0,force:!0});i(e,{recursive:!0})}(c)),e.onStatus?.("creating_scaffold");let{create:h}=await import("./@byted-doubao-apps/create.js");return await h({template:"starter",projectDir:c,public:!0,appId:n,name:j,packageName:u,overwrite:!0,git:!1,login:!0}),{directory:s,path:c,app_id:n,template:"starter",package_name:u,overwritten:f}}let L=["universal","claude-code","codex","trae"],G="universal",z={output:process.stderr};async function Y(){let e=R.filter(e=>L.includes(e.id)).filter(e=>e.id!==G);return g({message:"选择要初始化的 Agent",choices:[{name:"Universal (.agents/skills)",short:"Universal",value:G,checked:!0,disabled:" "},...e.map(e=>({name:`${e.name} (${e.projectPath.replace(/\/+$/,"")})`,short:e.name,value:e.id}))],shortcuts:{all:null,invert:null},theme:{style:{disabled:e=>e.trimEnd(),keysHelpTip:()=>"↑↓ move, space select, enter confirm"}}},z)}async function W(){return y({message:"项目文件夹名",default:"my-app",required:!0,validate(e){let t=X(e);return t?d.isAbsolute(t)||f.isAbsolute(t)?"请输入相对目录名称":!("."===t||t.split("/").includes(".."))||"目录必须位于当前目录内":"目录名称不能为空"}},z).then(X)}function X(e){return e.trim().replace(/\\/g,"/").replace(/\/+$/,"")}let Q=`这是一个豆包智能服务工程,请结合 ${x} Skill 进行开发`;class Z{constructor(e){this.options=e}header(e){if(!this.options.enabled)return;let t=this.options.useSpinner?_.bold.cyan(e):`== ${e} ==`;this.options.log(t)}card(e,t){if(!this.options.enabled)return;let r=Math.max(...t.map(([e])=>e.length),0),n=[` ${e} `,...t.map(([e,t])=>` ${e.padEnd(r)} ${t} `)],i=Math.max(...n.map(e=>e.length)),s=`+${"-".repeat(i)}+`;for(let e of[s,...n.map((e,t)=>{let r=`${e}${" ".repeat(i-e.length)}`;return`|${0===t&&this.options.useSpinner?_.bold(r):r}|`}),s])this.options.log(this.options.useSpinner?_.cyan(e):e)}section(e){if(!this.options.enabled)return;let t=this.options.useSpinner?_.bold(e):e;this.options.log(t)}blank(){this.options.enabled&&this.options.log("")}info(e,t){this.options.enabled&&this.options.log(function(e,t,r){if(void 0===t)return` ${e}`;let n=r?_.cyan(e):e;return` ${n}: ${t}`}(e,t,this.options.useSpinner))}note(e){this.options.enabled&&this.options.log(` - ${e}`)}warn(e){this.options.enabled&&(this.stopActive(),this.options.warn(e))}startStep(e){if(this.options.enabled){if(this.stopActive(),this.options.useSpinner){this.spinner=b({text:e,color:"cyan",stream:process.stderr}).start();return}this.options.log(et("run",e,this.options.useSpinner))}}updateStep(e){if(this.options.enabled){if(!this.spinner)return void this.options.log(et("run",e,this.options.useSpinner));this.spinner.text=e}}succeedStep(e){if(this.options.enabled){if(this.spinner){this.spinner.succeed(e),this.spinner=void 0;return}this.options.log(et("ok",e,this.options.useSpinner))}}warnStep(e){if(this.options.enabled){if(this.spinner){this.spinner.warn(e),this.spinner=void 0;return}this.options.warn(et("warn",e,this.options.useSpinner))}}failStep(e){if(this.options.enabled){if(this.spinner){this.spinner.fail(e),this.spinner=void 0;return}this.options.warn(et("fail",e,this.options.useSpinner))}}stopActive(){this.spinner&&(this.spinner.stop(),this.spinner=void 0)}}function ee(){return!!(process.stderr.isTTY&&!process.env.CI)}function et(e,t,r){let n=`[${e}]`;if(!r)return` ${n} ${t}`;let i="ok"===e?_.green:"warn"===e?_.yellow:"fail"===e?_.red:_.cyan;return` ${i(n)} ${t}`}let er=["@swc/core","@speedy-js/esbuild","core-js","crc64-ecma182.js","esbuild"],en=["@byted-lynx/js-check-"],ei={commandVersion:async e=>(await S(e,["--version"],{env:process.env,stdio:["ignore","pipe","pipe"]})).stdout.trim(),pnpmInstall:async(e,t={})=>eu(["install"],e,{streamOutput:t.streamOutput??!1}),pnpmApproveBuilds:async(e,t)=>eu("all"===t?["approve-builds","--all"]:["approve-builds",...t],e,{streamOutput:!1})};async function es(e=ei){try{return{version:await e.commandVersion("npm")}}catch{throw Error("npm not found in PATH. dbx init requires npm. Please install Node.js/npm and retry.")}}async function eo(e=ei){try{return{version:await e.commandVersion("pnpm")}}catch{throw Error("pnpm not found in PATH. dbx init requires pnpm. Install pnpm and retry.")}}async function ea(e,t={}){let r=t.runner??ei,n=t.autoApproveBuilds??"known",i=0;try{return i+=1,await r.pnpmInstall(e,{streamOutput:t.streamOutput}),{dependencies_installed:!0,install_attempts:i,recovered_from_ignored_builds:!1,approved_builds:[]}}catch(a){let s;if(!1===n||!((s=eh(a)).includes("ERR_PNPM_IGNORED_BUILDS")||s.includes("Ignored build scripts:")))return ec(e,i,a);let o=function(e,t){let r;if(t.pnpmVersion&&!ep(t.pnpmVersion,"10.1.0"))return null;let n=(r=w(eh(e)).match(/Ignored build scripts:\s*([\s\S]*?)(?:\n\s*\n|\nRun\s+"pnpm approve-builds"|$)/))?r[1].split(",").map(e=>(function(e){if(!e)return null;if(e.startsWith("@")){let t=e.indexOf("@",1);return t>0?e.slice(0,t):e}let t=e.lastIndexOf("@");return t>0?e.slice(0,t):e})(e.trim().replace(/[.。]$/,""))).filter(e=>!!e):[],i="all-pending"===t.mode?n:n.filter(el);return i.length>0?[...new Set(i)]:"all-pending"===t.mode&&t.pnpmVersion&&ep(t.pnpmVersion,"10.32.0")?"all":null}(a,{mode:n,pnpmVersion:t.pnpmVersion});if(!o)return ec(e,i,a);try{return await r.pnpmApproveBuilds(e,o),i+=1,await r.pnpmInstall(e,{streamOutput:t.streamOutput}),{dependencies_installed:!0,install_attempts:i,recovered_from_ignored_builds:!0,approved_builds:"all"===o?["*"]:[...o]}}catch(t){return ec(e,i,t,{approvedBuilds:"all"===o?["*"]:[...o]})}}}function el(e){return er.includes(e)||en.some(t=>e.startsWith(t))}function ep(e,t){let r=ed(e),n=ed(t);if(!r||!n)return!1;for(let e=0;e<r.length&&!(r[e]>n[e]);e+=1)if(r[e]<n[e])return!1;return!0}function ed(e){let t=e.trim().match(/^v?(\d+)\.(\d+)\.(\d+)/);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}function ec(e,t,r,n={}){return{dependencies_installed:!1,install_attempts:t,recovered_from_ignored_builds:!1,approved_builds:n.approvedBuilds??[],install_warning:`pnpm install did not complete in ${e}: ${ef(r)}`}}async function eu(e,t,r){var n;let i=S("pnpm",[...e],{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"],all:!0});return r.streamOutput&&i.all?.pipe(process.stderr),{stdout:(n=await i).stdout??"",stderr:n.stderr??"",all:n.all??[n.stdout,n.stderr].filter(Boolean).join("\n")}}function ef(e){if(e&&"object"==typeof e&&"shortMessage"in e){let t=e.shortMessage;if("string"==typeof t&&t.length>0)return t}return e instanceof Error&&e.message?e.message:String(e)}function eh(e){let t=[ef(e)];return e&&"object"==typeof e&&("string"==typeof e.all&&t.push(e.all),"string"==typeof e.stdout&&t.push(e.stdout),"string"==typeof e.stderr&&t.push(e.stderr)),t.filter(Boolean).join("\n")}let em="__DBX_APP_KEY__";function eg(e,r){if(!t.statSync(e).isFile())throw Error(`project artifact path must be a file: ${r}`)}function ey(e){let r=d.dirname(v(import.meta.url)),n=d.join(r,"templates",e);if(!t.existsSync(n))throw Error(`dbx init template not found: ${e}`);return t.readFileSync(n,"utf8")}let e_="项目文件夹名";function eb(){return new h("init").description("创建一个新的 dbx 项目").argument("[directory]","要创建的新项目目录名").option("-y, --yes","允许覆盖已有非软链 Skill 目录;覆盖前会自动备份",!1).addOption(new m("--skills-mode <mode>","内置 Skills 安装方式").choices(["link","copy"]).default("link")).addOption(new m("--agent <agent>","要初始化的 Agent,可重复传入;universal 会自动包含").default([]).argParser(I(L))).option("--install-deps","创建前端脚手架后安装依赖",!0).option("--no-install-deps","创建前端脚手架后不安装依赖").option("--no-prompt","缺少初始化决策时直接失败,不进入交互式提示",!1).option("--schema","输出 dbx init 的机器可读参数契约;不执行初始化",!1).addOption(new m("--auth <mode>","认证策略:login 允许交互登录,require 只接受已登录状态;skip 不适用于 init").choices(["login","require","skip"])).addHelpText("after",`
1
+ import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import{AGENTIC_SERVICE_SKILL_NAME as t,AGENTIC_SERVICE_DISPLAY_NAME as i,execa as r,isRecord as n,collectChoiceValues as s,version_version as o,command_Command as a,option_Option as l,types_TokenStatus as p,DEFAULT_FRONTEND_DIRECTORY as d,runCommand as c,chalk_source as u}from"./1664.js";import{dist as h,input_dist as f}from"./5418.js";import"./yaml.js";import{installSkills as m,SUPPORTED_AGENTS as g}from"./skills.js";import{resolveProjectLayout as y}from"./project-layout.js";import{formatPollStatus as _,login as b,getAuthStatus as w}from"./auth.js";import{fetchSandboxAppCredentials as S}from"./sandbox.js";import{openUrlInBrowser as v}from"./browser.js";var k={};e.r(k),e.d(k,{default:()=>ed});let x=e("node:fs");var j=e.n(x);let $=e("node:path");var E=e.n($);function A(e){if(!x.existsSync(e))return{};let t=JSON.parse(x.readFileSync(e,"utf8"));return n(t)?t:{}}let P=new Set(["node_modules",".git"]);async function N(e){var t;let r=e.appId.trim();if(!r)throw Error("frontend scaffold requires a sandbox AppID");let n=e.directory?.trim()||".",s=E().resolve(e.projectPath),o=E().resolve(s,n),a=(t=o,E().basename(t)||d),l=!!(e.overwriteExisting&&(0,x.existsSync)(o));l&&o!==s&&(e.onStatus?.("clearing_existing_directory"),function(e){if(!(0,x.statSync)(e).isDirectory())throw Error(`frontend scaffold target is not a directory: ${e}`);for(let t of(0,x.readdirSync)(e))P.has(t)||(0,x.rmSync)(E().join(e,t),{recursive:!0,force:!0});(0,x.mkdirSync)(e,{recursive:!0})}(o)),e.onStatus?.("creating_scaffold");let{create:p}=await import("./@byted-doubao-apps/create.js");return await p({template:"starter",projectDir:o,public:!0,appId:r,name:i,packageName:a,overwrite:!0,git:e.initializeGit??!1,login:!0}),{directory:n,path:o,app_id:r,template:"starter",package_name:a,overwritten:l}}let I=["universal","claude-code","codex","trae"],R="universal",O={output:process.stderr};async function C(){let e=g.filter(e=>I.includes(e.id)).filter(e=>e.id!==R);return h({message:"选择要初始化的 Agent",choices:[{name:"Universal (.agents/skills)",short:"Universal",value:R,checked:!0,disabled:" "},...e.map(e=>({name:`${e.name} (${e.projectPath.replace(/\/+$/,"")})`,short:e.name,value:e.id}))],shortcuts:{all:null,invert:null},theme:{style:{disabled:e=>e.trimEnd(),keysHelpTip:()=>"↑↓ move, space select, enter confirm"}}},O)}async function q(){return f({message:"是否初始化 Git 仓库? (Y/n)"},O).then(e=>"n"!==e&&"N"!==e)}async function K(){return f({message:"项目文件夹名",default:"my-app",required:!0,validate(e){let t=M(e);return t?E().isAbsolute(t)||$.win32.isAbsolute(t)?"请输入相对目录名称":!("."===t||t.split("/").includes(".."))||"目录必须位于当前目录内":"目录名称不能为空"}},O).then(M)}function M(e){return e.trim().replace(/\\/g,"/").replace(/\/+$/,"")}let U=`这是一个豆包智能服务工程,请结合 ${t} Skill 进行开发`,V=e("../../../node_modules/.pnpm/ora@5.4.1/node_modules/ora/index.js");var T=e.n(V);class D{options;spinner;constructor(e){this.options=e}header(e){if(!this.options.enabled)return;let t=this.options.useSpinner?u.bold.cyan(e):`== ${e} ==`;this.options.log(t)}card(e,t){if(!this.options.enabled)return;let i=Math.max(...t.map(([e])=>e.length),0),r=[` ${e} `,...t.map(([e,t])=>` ${e.padEnd(i)} ${t} `)],n=Math.max(...r.map(e=>e.length)),s=`+${"-".repeat(n)}+`;for(let e of[s,...r.map((e,t)=>{let i=`${e}${" ".repeat(n-e.length)}`;return`|${0===t&&this.options.useSpinner?u.bold(i):i}|`}),s])this.options.log(this.options.useSpinner?u.cyan(e):e)}section(e){if(!this.options.enabled)return;let t=this.options.useSpinner?u.bold(e):e;this.options.log(t)}blank(){this.options.enabled&&this.options.log("")}info(e,t){this.options.enabled&&this.options.log(function(e,t,i){if(void 0===t)return` ${e}`;let r=i?u.cyan(e):e;return` ${r}: ${t}`}(e,t,this.options.useSpinner))}note(e){this.options.enabled&&this.options.log(` - ${e}`)}warn(e){this.options.enabled&&(this.stopActive(),this.options.warn(e))}startStep(e){if(this.options.enabled){if(this.stopActive(),this.options.useSpinner){this.spinner=T()({text:e,color:"cyan",stream:process.stderr}).start();return}this.options.log(z("run",e,this.options.useSpinner))}}updateStep(e){if(this.options.enabled){if(!this.spinner)return void this.options.log(z("run",e,this.options.useSpinner));this.spinner.text=e}}succeedStep(e){if(this.options.enabled){if(this.spinner){this.spinner.succeed(e),this.spinner=void 0;return}this.options.log(z("ok",e,this.options.useSpinner))}}warnStep(e){if(this.options.enabled){if(this.spinner){this.spinner.warn(e),this.spinner=void 0;return}this.options.warn(z("warn",e,this.options.useSpinner))}}failStep(e){if(this.options.enabled){if(this.spinner){this.spinner.fail(e),this.spinner=void 0;return}this.options.warn(z("fail",e,this.options.useSpinner))}}stopActive(){this.spinner&&(this.spinner.stop(),this.spinner=void 0)}}function F(){return!!(process.stderr.isTTY&&!process.env.CI)}function z(e,t,i){let r=`[${e}]`;if(!i)return` ${r} ${t}`;let n="ok"===e?u.green:"warn"===e?u.yellow:"fail"===e?u.red:u.cyan;return` ${n(r)} ${t}`}let G=e("node:util"),H=["@swc/core","@speedy-js/esbuild","core-js","crc64-ecma182.js","esbuild"],B=["@byted-lynx/js-check-"],L={commandVersion:async e=>(await r(e,["--version"],{env:process.env,stdio:["ignore","pipe","pipe"]})).stdout.trim(),pnpmInstall:async(e,t={})=>et(["install"],e,{streamOutput:t.streamOutput??!1}),pnpmApproveBuilds:async(e,t)=>et("all"===t?["approve-builds","--all"]:["approve-builds",...t],e,{streamOutput:!1})};async function J(e=L){try{return{version:await e.commandVersion("npm")}}catch{throw Error("npm not found in PATH. dbx init requires npm. Please install Node.js/npm and retry.")}}async function Y(e=L){try{return{version:await e.commandVersion("pnpm")}}catch{throw Error("pnpm not found in PATH. dbx init requires pnpm. Install pnpm and retry.")}}async function W(e,t={}){let i=t.runner??L,r=t.autoApproveBuilds??"known",n=0;try{return n+=1,await i.pnpmInstall(e,{streamOutput:t.streamOutput}),{dependencies_installed:!0,install_attempts:n,recovered_from_ignored_builds:!1,approved_builds:[]}}catch(a){let s;if(!1===r||!((s=er(a)).includes("ERR_PNPM_IGNORED_BUILDS")||s.includes("Ignored build scripts:")))return ee(e,n,a);let o=function(e,t){var i;let r;if(t.pnpmVersion&&!Q(t.pnpmVersion,"10.1.0"))return null;let n=(i=er(e),(r=(0,G.stripVTControlCharacters)(i).match(/Ignored build scripts:\s*([\s\S]*?)(?:\n\s*\n|\nRun\s+"pnpm approve-builds"|$)/))?r[1].split(",").map(e=>(function(e){if(!e)return null;if(e.startsWith("@")){let t=e.indexOf("@",1);return t>0?e.slice(0,t):e}let t=e.lastIndexOf("@");return t>0?e.slice(0,t):e})(e.trim().replace(/[.。]$/,""))).filter(e=>!!e):[]),s="all-pending"===t.mode?n:n.filter(X);return s.length>0?[...new Set(s)]:"all-pending"===t.mode&&t.pnpmVersion&&Q(t.pnpmVersion,"10.32.0")?"all":null}(a,{mode:r,pnpmVersion:t.pnpmVersion});if(!o)return ee(e,n,a);try{return await i.pnpmApproveBuilds(e,o),n+=1,await i.pnpmInstall(e,{streamOutput:t.streamOutput}),{dependencies_installed:!0,install_attempts:n,recovered_from_ignored_builds:!0,approved_builds:"all"===o?["*"]:[...o]}}catch(t){return ee(e,n,t,{approvedBuilds:"all"===o?["*"]:[...o]})}}}function X(e){return H.includes(e)||B.some(t=>e.startsWith(t))}function Q(e,t){let i=Z(e),r=Z(t);if(!i||!r)return!1;for(let e=0;e<i.length&&!(i[e]>r[e]);e+=1)if(i[e]<r[e])return!1;return!0}function Z(e){let t=e.trim().match(/^v?(\d+)\.(\d+)\.(\d+)/);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}function ee(e,t,i,r={}){return{dependencies_installed:!1,install_attempts:t,recovered_from_ignored_builds:!1,approved_builds:r.approvedBuilds??[],install_warning:`pnpm install did not complete in ${e}: ${ei(i)}`}}async function et(e,t,i){var n;let s=r("pnpm",[...e],{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"],all:!0});return i.streamOutput&&s.all?.pipe(process.stderr),{stdout:(n=await s).stdout??"",stderr:n.stderr??"",all:n.all??[n.stdout,n.stderr].filter(Boolean).join("\n")}}function ei(e){if(e&&"object"==typeof e&&"shortMessage"in e){let t=e.shortMessage;if("string"==typeof t&&t.length>0)return t}return e instanceof Error&&e.message?e.message:String(e)}function er(e){let t=[ei(e)];return e&&"object"==typeof e&&("string"==typeof e.all&&t.push(e.all),"string"==typeof e.stdout&&t.push(e.stdout),"string"==typeof e.stderr&&t.push(e.stderr)),t.filter(Boolean).join("\n")}let en=e("node:url"),es=e("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js"),eo="__DBX_APP_KEY__";function ea(e,t){if(!j().statSync(e).isFile())throw Error(`project artifact path must be a file: ${t}`)}function el(e){let t=E().dirname((0,en.fileURLToPath)(import.meta.url)),i=E().join(t,"templates",e);if(!j().existsSync(i))throw Error(`dbx init template not found: ${e}`);return j().readFileSync(i,"utf8")}let ep="项目文件夹名";function ed(){return new a("init").description("创建一个新的 dbx 项目").argument("[directory]","要创建的新项目目录名").option("-y, --yes","允许覆盖已有非软链 Skill 目录;覆盖前会自动备份",!1).addOption(new l("--skills-mode <mode>","内置 Skills 安装方式").choices(["link","copy"]).default("link")).addOption(new l("--agent <agent>","要初始化的 Agent,可重复传入;universal 会自动包含").default([]).argParser(s(I))).option("--install-deps","创建前端脚手架后安装依赖",!0).option("--no-install-deps","创建前端脚手架后不安装依赖").option("--git","在项目根目录初始化 Git 仓库").option("--no-prompt","缺少初始化决策时直接失败,不进入交互式提示",!1).option("--schema","输出 dbx init 的机器可读参数契约;不执行初始化",!1).addOption(new l("--auth <mode>","认证策略:login 允许交互登录,require 只接受已登录状态;skip 不适用于 init").choices(["login","require","skip"])).addHelpText("after",`
2
2
  Examples:
3
- ${ev().map(e=>` ${e}`).join("\n")}`).action(async(e,t,r)=>N(r,r=>new ew(r).run(e,t)))}class ew{constructor(e){this.context=e}jsonEnabled(){return this.context.json}log(e){this.context.log(e)}warn(e){this.context.warn(e)}async run(e,i){var o,a,l,c,u,f,h,m,g,y,_,b,w;let S,v,x,j,A,P,N,I;if(i.schema)return this.emitSchema();let M=!(i.noPrompt||process.env.DBX_PROMPT_DISABLED)&&!this.context.json&&process.stdin.isTTY&&process.stderr.isTTY,V=await eS(e,M);!function(e){try{n(e)}catch(e){var t;if("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code)return;throw e}throw Error(`dbx init target directory already exists: ${e}. Choose a new directory name.`)}(V);let C={authMode:(o=i.auth,a=M,"require"===o||"login"===o?o:a?"login":"require"),installFrontendDependencies:i.installDeps,skillsMode:i.skillsMode,yes:i.yes};if("skip"===i.auth)throw Error("dbx init always creates a frontend project and requires authentication; use --auth login or --auth require.");let K=await this.collectInitPlan(i,M);this.initReporter=new Z({enabled:!this.jsonEnabled(),useSpinner:ee(),log:e=>this.log(e),warn:e=>this.warn(e)}),this.jsonEnabled()||this.emitInitStart(V,K);try{let e;S=await this.ensureRequiredRuntime(),v=await this.ensureAuthenticated(C.authMode),x=await this.executeFrontendProjectPlan(V,K.frontend,C.installFrontendDependencies),this.reporter().startStep("project artifacts: ensuring manifest.yaml and skill/SKILL.md"),j=function(e,r={}){let n=q(e,{kind:r.layout}),i=n.root,s=n.manifestPath,o=n.skillPath,a={app_key:"",layout:n.kind,manifest_path:s,skill_path:o,created:[],preserved:[]};return t.existsSync(s)?(eg(s,"manifest.yaml"),a.app_key=function(e){var r;let n=k.parse(t.readFileSync(e,"utf8")),i=(r=n,"object"!=typeof r||null===r||Array.isArray(r))?void 0:n.app_key;if("string"==typeof i&&i.trim())return i.trim();throw Error(`manifest app_key is required: ${e}`)}(s),a.preserved.push(d.relative(i,s))):(a.app_key=r.appKey?.trim()||"db_app_xxxxxx",t.mkdirSync(d.dirname(s),{recursive:!0}),t.writeFileSync(s,function(e){let t=ey("manifest.yaml");if(2!==t.split(em).length)throw Error(`dbx init manifest template must contain exactly one ${em}`);return t.replace(em,JSON.stringify(e))}(a.app_key),"utf8"),a.created.push(d.relative(i,s))),t.existsSync(o)?(eg(o,d.relative(i,o)),a.preserved.push(d.relative(i,o))):(t.mkdirSync(d.dirname(o),{recursive:!0}),t.writeFileSync(o,ey(d.join("skill","SKILL.md")),"utf8"),a.created.push(d.relative(i,o))),a}(V,{appKey:x.scaffold.app_id,layout:"root"}),this.reporter().succeedStep(`project artifacts: created ${j.created.length}, preserved ${j.preserved.length}`),e=d.resolve(V,"README.md"),t.writeFileSync(e,ey("README.md"),"utf8"),this.reporter().startStep("project files: writing .dbx/config.json and AGENTS.md"),function(e,t,r={}){let n=T.resolve(e,".dbx"),i=T.join(n,"config.json");D.mkdirSync(n,{recursive:!0});let s=function(e,t,r={}){var n;let i,s=$(e.frontend)?e.frontend:{},o=$(e.mcp_server)?e.mcp_server:{},a=(n=e.app,$(n)?Object.fromEntries(Object.entries(n).filter(([e])=>"app_key"!==e)):{}),l=(i=t.find(e=>"universal"!==e))?R.find(e=>e.id===i)?.host??"claude":"codex";return{...e,app:Object.keys(a).length>0?a:void 0,version:"string"==typeof e.version?e.version:"0.1.0",mode:"string"==typeof e.mode?e.mode:"ai-only",host:l,profile:"string"==typeof e.profile?e.profile:"",frontend:{...s,directory:"string"==typeof r.frontendDirectory?r.frontendDirectory:"string"==typeof s.directory?s.directory:""},mcp_server:{...o},skills:Array.isArray(e.skills)?e.skills:[]}}(B(i),t,r);D.writeFileSync(i,`${JSON.stringify(s,null,2)}
4
- `,"utf8")}(V,K.agents,{frontendDirectory:x.directory}),A=function(e){let t=d.resolve(e,"AGENTS.md");if(!r(t))return p(t,`${Q}
5
- `,"utf8"),{path:t,created:!0,updated:!1,already_present:!1};let n=s(t,"utf8");if(n.includes(Q))return{path:t,created:!1,updated:!1,already_present:!0};let i=0===n.length||n.endsWith("\n")?"":"\n";return p(t,`${n}${i}${Q}
6
- `,"utf8"),{path:t,created:!1,updated:!0,already_present:!1}}(V),this.reporter().succeedStep("project files: wrote .dbx/config.json and AGENTS.md"),this.reporter().startStep("skills: syncing bundled skills"),P=await O({agents:K.agents,cwd:V,mode:C.skillsMode,cliVersion:E,yes:C.yes}),this.reporter().succeedStep(`skills: synced ${P.skillNames.length} bundled skill(s)`)}catch(e){throw this.reporter().failStep("dbx init failed"),e}!function(e,t,r={}){let n=T.join(T.resolve(e,".dbx"),"config.json"),i={...B(n),skills:t,...r.source?{skills_source:r.source}:{},...r.mode?{skills_mode:r.mode}:{},...r.skillsVersion?{skills_version:r.skillsVersion}:{},...r.cliVersion?{dbx_cli_version:r.cliVersion}:{}};D.writeFileSync(n,`${JSON.stringify(i,null,2)}
7
- `,"utf8")}(V,P.skillNames,{source:"bundled",mode:P.mode,skillsVersion:P.skillsVersion,cliVersion:E});let U={success:!0,project_path:V,config_path:`${V.replace(/\/+$/,"")}/.dbx/config.json`,agent_response:(l=V,c=K,u=x,f=A,h=P.skillNames,{tone:"concise_user_facing",summary:(I=((N=(m=c.agents).filter(e=>"universal"!==e)).length>0?N:m).join(", "),`dbx 初始化完成,已为 ${I} 创建完整项目并配置内置 Skills。`),changes:(g=l,y=c,_=u,b=f,w=h,{config:`${g.replace(/\/+$/,"")}/.dbx/config.json`,agent_md:b.path,frontend:{directory:_.directory,description:"已在项目根目录创建前端工程"},skills:{names:w,targets:y.agents.map(e=>{let t=R.find(t=>t.id===e);return{id:e,skills_path:t?.projectPath??""}}).map(e=>({agent:e.id,path:`${g.replace(/\/+$/,"")}/${e.skills_path}`}))}}),notes:ek(u),response_guidance:["Lead with the outcome, not the command line.","Group generated paths by purpose instead of listing every raw file when that would be noisy.","Do not add unrelated git status notes unless the user asked or the git state changes the next step."]}),auth:v,environment:S,agents:K.agents,frontend:x,project_artifacts:j,agent_md:A,skills:P.skillNames,skills_mode:P.mode,skills_version:P.skillsVersion,bundled_root:P.bundledRoot,hosted_root:P.hostedRoot};return this.jsonEnabled()||this.emitInitSuccess(V,x),U}emitSchema(){let e={command:"dbx init",description:"Create a new dbx project with a frontend scaffold, project artifacts, AGENTS.md guidance, and bundled skills.",risk:"write",writes_project_files:!0,requires_interactive_confirmation_to_apply:!1,requires_complete_user_decisions_to_apply:!0,json_supported:!0,user_decisions:{must_ask_user_before_choosing_flags:!0,preferred_user_prompt_style:"Ask a short product question with choices first; keep raw CLI flags as secondary detail only.",project_directory:`${e_}(默认:my-app)`,agent:"Ask which agent targets to install for, for example codex, trae, or claude-code. Universal is always included."},agent_guidance:{recommended_flow:["Run `dbx init --schema --json` if you need the command contract.","For any uncertain user_decisions item, ask the user with the provided prompt and choices instead of exposing raw flags first.","Use `dbx init <directory> --agent <id> --json` to create and inspect a new project."],cautions:["The directory argument must name a new directory; dbx init never initializes the current directory.","--yes only allows replacing existing Skill directories; it does not choose unspecified init parameters.","Use --no-install-deps only when dependency installation should be deferred."]},flags:{path:{kind:"argument",type:"string",required_for_non_interactive_plan:!0,default:"my-app",description:"New project directory name under the current directory."},agent:{type:"array",repeatable:!0,options:[...L],auto_includes:["universal"],description:"Agent skill targets to initialize."},"install-deps":{type:"boolean",default:!0,description:"Install dependencies for the generated frontend project."},"skills-mode":{type:"string",options:["link","copy"],default:"link"},auth:{type:"string",options:["login","require"],default:"login in interactive text mode; require when prompts are unavailable or JSON output is enabled"},yes:{type:"boolean",description:"Allows replacing existing non-symlink Skill directories only. Does not choose unspecified init parameters."},"no-prompt":{type:"boolean",description:"Fail instead of prompting when init decisions are missing."},json:{type:"boolean",description:"Output machine-readable JSON."}},examples:ev()};return this.context.log(JSON.stringify(e,null,2)),e}reporter(){return this.initReporter||(this.initReporter=new Z({enabled:!this.jsonEnabled(),useSpinner:ee(),log:e=>this.log(e),warn:e=>this.warn(e)})),this.initReporter}async collectInitPlan(e,t){let r=function(e){var t;let r,n=function e(t){return Array.isArray(t)?t.flatMap(t=>e(t)):"string"!=typeof t?[]:t.split(",").map(e=>e.trim()).filter(Boolean)}(e);if(0===n.length)return;let i=new Set(L),s=n.filter(e=>!i.has(e));if(s.length>0)throw Error(`Unsupported init agent(s): ${s.join(", ")}. Supported agents: ${L.join(", ")}.`);return t=["universal",...n],r=new Set,t.filter(e=>!r.has(e)&&(r.add(e),!0))}(e.agent);return r||t||ex("dbx init needs --agent <id> when prompts are disabled or unavailable.",{code:"missing_init_decision",missing_flags:["--agent"],user_prompt:"要为哪个 Agent 安装 dbx Skills?",choices:L.filter(e=>"universal"!==e).map(e=>({value:e,label:e})),examples:ev()}),{agents:r??await Y(),frontend:{directory:"."}}}emitInitStart(e,t){let r=this.reporter();r.header("Initializing dbx project"),r.section("Plan"),r.info("project",u(e)),r.info("agents",t.agents.join(", ")),r.blank(),r.section("Progress")}emitInitSuccess(e,t){let r=this.reporter();r.blank(),r.header("dbx project initialized"),r.info("config",`${u(e)}/.dbx/config.json`);let n=ek(t);if(n.length>0)for(let e of(r.blank(),r.info("notes"),n))r.note(e)}async ensureRequiredRuntime(){this.reporter().startStep("runtime: checking npm");try{let e=await es();return this.reporter().succeedStep(`runtime: npm ${e.version}`),{npm:e}}catch(e){throw this.reporter().failStep("runtime: npm check failed"),e}}async ensureAuthenticated(e){let t,r;this.reporter().startStep("auth: checking login status");try{t=await C({fetch:async(e,t)=>{let r=new AbortController,n=setTimeout(()=>r.abort(),5e3);try{return await fetch(e,{...t,signal:r.signal})}finally{clearTimeout(n)}}})}catch(e){this.reporter().warnStep(`auth: login status check failed, starting login: ${ej(e)}`),t={loggedIn:!1,tokenPath:""}}if(t.loggedIn)return this.reporter().succeedStep("auth: already logged in"),{already_logged_in:!0,login_performed:!1,uid:t.uid,expires_at:t.expiresAt,base_url:t.baseUrl};if("require"===e)throw this.reporter().failStep("auth: login required"),Error("dbx init requires an existing login when prompts are disabled or JSON output is enabled. Run `dbx auth login` first.");this.reporter().succeedStep("auth: not logged in, starting login"),this.reporter().startStep("auth: waiting for login");let n=await V({onVerification:e=>{this.jsonEnabled()||(this.reporter().info("auth visit",e.verificationUrl),this.reporter().info("auth expires in",`${e.expiresIn} seconds`),this.openVerificationUrl(e.verificationUrl),this.reporter().updateStep(`auth: ${M(A.Pending)}`),r=A.Pending)},onPoll:e=>{this.context.json||e.status!==r&&(r=e.status,this.reporter().updateStep(`auth: ${M(e.status)}`))}});return this.reporter().succeedStep(`auth: logged in, token expires at ${new Date(1e3*n.expiresAt).toISOString()}`),{already_logged_in:!1,login_performed:!0,uid:n.uid,expires_at:n.expiresAt,base_url:n.baseUrl,token_path:n.tokenPath}}async openVerificationUrl(e){this.reporter().info("auth","opening link in browser");try{await K(e)}catch(e){this.reporter().warn(`failed to open browser: ${ej(e)}`)}}async executeFrontendProjectPlan(e,t,r){let n,i;this.reporter().startStep("sandbox app: fetching AppID");let s=await U();this.reporter().succeedStep(`sandbox app: ready (${s.sandbox_app_id})`),this.reporter().startStep("frontend: creating scaffold in the new project root");let o=await J({projectPath:e,directory:t.directory,appId:s.sandbox_app_id,onStatus:e=>{"clearing_existing_directory"===e?this.reporter().updateStep("frontend: clearing existing scaffold files (keeping node_modules cache)"):this.reporter().updateStep("frontend: writing scaffold files in the new project root")}});if(this.reporter().succeedStep("frontend: scaffold ready in the new project root"),!r)return{directory:t.directory,scaffold:o,package_manager:{dependencies:{dependencies_installed:!1,install_attempts:0,recovered_from_ignored_builds:!1,approved_builds:[],install_warning:"skipped by --no-install-deps"}}};this.reporter().startStep("dependencies: checking pnpm");try{n=await eo()}catch(e){return i={dependencies_installed:!1,install_attempts:0,recovered_from_ignored_builds:!1,approved_builds:[],install_warning:ej(e)},this.reporter().warnStep(`frontend dependencies were not installed: ${i.install_warning}`),{directory:t.directory,scaffold:o,package_manager:{dependencies:i}}}if(this.reporter().startStep(`dependencies: installing frontend packages with pnpm ${n.version}`),(i=await ea(o.path,{pnpmVersion:n.version,autoApproveBuilds:"all-pending",streamOutput:this.context.debug})).dependencies_installed?this.reporter().succeedStep(`dependencies: installed frontend packages with pnpm ${n.version}`):this.reporter().warnStep(`dependencies: install incomplete (${i.install_warning??"unknown reason"})`),!this.jsonEnabled()&&i.recovered_from_ignored_builds){let e=i.approved_builds.includes("*")?"all pending dependency build scripts":`${i.approved_builds.length} dependency build script package(s)`;this.reporter().warn(`pnpm blocked dependency build scripts; approved ${e} and retried install`)}return{directory:t.directory,scaffold:o,package_manager:{pnpm:n,dependencies:i}}}}async function eS(e,t){let r=e?.trim()||(t?await W():"");return r||ex("dbx init requires a new project directory when prompts are disabled or unavailable.",{code:"missing_project_directory",missing_flags:["directory"],user_prompt:e_,examples:ev()}),function(e){let t=e.trim().replace(/\\/g,"/").replace(/\/+$/,"");if(!t||"."===t)throw Error("dbx init requires a new project directory name.");if(c(t)||f.isAbsolute(t))throw Error("dbx init project directory must be relative.");if(t.split("/").includes(".."))throw Error("dbx init project directory must stay inside the current directory.");return u(process.cwd(),t)}(r)}function ev(){return["dbx init my-app --agent codex --json","dbx init my-app --agent codex --no-install-deps --json"]}function ek(e){let t=[];return e.package_manager?.dependencies.install_warning&&t.push(`前端依赖未完整安装:${e.package_manager.dependencies.install_warning}`),t}function ex(e,t){let r=Error(e);throw r.details=t,r}function ej(e){return e instanceof Error&&"AbortError"===e.name?"timed out":e instanceof Error&&e.message?e.message:String(e)}export{F as init_namespaceObject};
8
- //# sourceMappingURL=init.js.map
3
+ ${eh().map(e=>` ${e}`).join("\n")}`).action(async(e,t,i)=>c(i,i=>new ec(i).run(e,t)))}class ec{context;initReporter;constructor(e){this.context=e}jsonEnabled(){return this.context.json}log(e){this.context.log(e)}warn(e){this.context.warn(e)}async run(e,t){var i,r,s,a,l,p,d,c,u,h,f,_,b;let w,S,v,k,P,N,I,R;if(t.schema)return this.emitSchema();let O=!(t.noPrompt||process.env.DBX_PROMPT_DISABLED)&&!this.context.json&&process.stdin.isTTY&&process.stderr.isTTY,C=await eu(e,O);!function(e){try{(0,x.lstatSync)(e)}catch(e){var t;if("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code)return;throw e}throw Error(`dbx init target directory already exists: ${e}. Choose a new directory name.`)}(C);let q={authMode:(i=t.auth,r=O,"require"===i||"login"===i?i:r?"login":"require"),installFrontendDependencies:t.installDeps,skillsMode:t.skillsMode,yes:t.yes};if("skip"===t.auth)throw Error("dbx init always creates a frontend project and requires authentication; use --auth login or --auth require.");let K=await this.collectInitPlan(t,O);this.initReporter=new D({enabled:!this.jsonEnabled(),useSpinner:F(),log:e=>this.log(e),warn:e=>this.warn(e)}),this.jsonEnabled()||this.emitInitStart(C,K);try{let e;w=await this.ensureRequiredRuntime(),S=await this.ensureAuthenticated(q.authMode),v=await this.executeFrontendProjectPlan(C,K.frontend,q.installFrontendDependencies),this.reporter().startStep("project artifacts: ensuring manifest.yaml and skill/SKILL.md"),k=function(e,t={}){let i=y(e,{kind:t.layout}),r=i.root,n=i.manifestPath,s=i.skillPath,o={app_key:"",layout:i.kind,manifest_path:n,skill_path:s,created:[],preserved:[]};return j().existsSync(n)?(ea(n,"manifest.yaml"),o.app_key=function(e){var t;let i=es.qg(j().readFileSync(e,"utf8")),r=(t=i,"object"!=typeof t||null===t||Array.isArray(t))?void 0:i.app_key;if("string"==typeof r&&r.trim())return r.trim();throw Error(`manifest app_key is required: ${e}`)}(n),o.preserved.push(E().relative(r,n))):(o.app_key=t.appKey?.trim()||"db_app_xxxxxx",j().mkdirSync(E().dirname(n),{recursive:!0}),j().writeFileSync(n,function(e){let t=el("manifest.yaml");if(2!==t.split(eo).length)throw Error(`dbx init manifest template must contain exactly one ${eo}`);return t.replace(eo,JSON.stringify(e))}(o.app_key),"utf8"),o.created.push(E().relative(r,n))),j().existsSync(s)?(ea(s,E().relative(r,s)),o.preserved.push(E().relative(r,s))):(j().mkdirSync(E().dirname(s),{recursive:!0}),j().writeFileSync(s,el(E().join("skill","SKILL.md")),"utf8"),o.created.push(E().relative(r,s))),o}(C,{appKey:v.scaffold.app_id,layout:"root"}),this.reporter().succeedStep(`project artifacts: created ${k.created.length}, preserved ${k.preserved.length}`),e=E().resolve(C,"README.md"),j().writeFileSync(e,el("README.md"),"utf8"),this.reporter().startStep("project files: writing .dbx/config.json and AGENTS.md"),function(e,t,i={}){let r=$.resolve(e,".dbx"),s=$.join(r,"config.json");x.mkdirSync(r,{recursive:!0});let o=function(e,t,i={}){var r;let s,o=n(e.frontend)?e.frontend:{},a=n(e.mcp_server)?e.mcp_server:{},l=(r=e.app,n(r)?Object.fromEntries(Object.entries(r).filter(([e])=>"app_key"!==e)):{}),p=(s=t.find(e=>"universal"!==e))?g.find(e=>e.id===s)?.host??"claude":"codex";return{...e,app:Object.keys(l).length>0?l:void 0,version:"string"==typeof e.version?e.version:"0.1.0",mode:"string"==typeof e.mode?e.mode:"ai-only",host:p,profile:"string"==typeof e.profile?e.profile:"",frontend:{...o,directory:"string"==typeof i.frontendDirectory?i.frontendDirectory:"string"==typeof o.directory?o.directory:""},mcp_server:{...a},skills:Array.isArray(e.skills)?e.skills:[]}}(A(s),t,i);x.writeFileSync(s,`${JSON.stringify(o,null,2)}
4
+ `,"utf8")}(C,K.agents,{frontendDirectory:v.directory}),P=function(e){let t=E().resolve(e,"AGENTS.md");if(!(0,x.existsSync)(t))return(0,x.writeFileSync)(t,`${U}
5
+ `,"utf8"),{path:t,created:!0,updated:!1,already_present:!1};let i=(0,x.readFileSync)(t,"utf8");if(i.includes(U))return{path:t,created:!1,updated:!1,already_present:!0};let r=0===i.length||i.endsWith("\n")?"":"\n";return(0,x.writeFileSync)(t,`${i}${r}${U}
6
+ `,"utf8"),{path:t,created:!1,updated:!0,already_present:!1}}(C),this.reporter().succeedStep("project files: wrote .dbx/config.json and AGENTS.md"),this.reporter().startStep("skills: syncing bundled skills"),N=await m({agents:K.agents,cwd:C,mode:q.skillsMode,cliVersion:o,yes:q.yes}),this.reporter().succeedStep(`skills: synced ${N.skillNames.length} bundled skill(s)`)}catch(e){throw this.reporter().failStep("dbx init failed"),e}!function(e,t,i={}){let r=$.join($.resolve(e,".dbx"),"config.json"),n={...A(r),skills:t,...i.source?{skills_source:i.source}:{},...i.mode?{skills_mode:i.mode}:{},...i.skillsVersion?{skills_version:i.skillsVersion}:{},...i.cliVersion?{dbx_cli_version:i.cliVersion}:{}};x.writeFileSync(r,`${JSON.stringify(n,null,2)}
7
+ `,"utf8")}(C,N.skillNames,{source:"bundled",mode:N.mode,skillsVersion:N.skillsVersion,cliVersion:o});let M={success:!0,project_path:C,config_path:`${C.replace(/\/+$/,"")}/.dbx/config.json`,agent_response:(s=C,a=K,l=v,p=P,d=N.skillNames,{tone:"concise_user_facing",summary:(R=((I=(c=a.agents).filter(e=>"universal"!==e)).length>0?I:c).join(", "),`dbx 初始化完成,已为 ${R} 创建完整项目并配置内置 Skills。`),changes:(u=s,h=a,f=l,_=p,b=d,{config:`${u.replace(/\/+$/,"")}/.dbx/config.json`,agent_md:_.path,frontend:{directory:f.directory,description:"已在项目根目录创建前端工程"},skills:{names:b,targets:h.agents.map(e=>{let t=g.find(t=>t.id===e);return{id:e,skills_path:t?.projectPath??""}}).map(e=>({agent:e.id,path:`${u.replace(/\/+$/,"")}/${e.skills_path}`}))}}),notes:ef(l),response_guidance:["Lead with the outcome, not the command line.","Group generated paths by purpose instead of listing every raw file when that would be noisy.","Do not add unrelated git status notes unless the user asked or the git state changes the next step."]}),auth:S,environment:w,agents:K.agents,frontend:v,project_artifacts:k,agent_md:P,skills:N.skillNames,skills_mode:N.mode,skills_version:N.skillsVersion,bundled_root:N.bundledRoot,hosted_root:N.hostedRoot};return this.jsonEnabled()||this.emitInitSuccess(C,v),M}emitSchema(){let e={command:"dbx init",description:"Create a new dbx project with a frontend scaffold, project artifacts, AGENTS.md guidance, and bundled skills.",risk:"write",writes_project_files:!0,requires_interactive_confirmation_to_apply:!1,requires_complete_user_decisions_to_apply:!0,json_supported:!0,user_decisions:{must_ask_user_before_choosing_flags:!0,preferred_user_prompt_style:"Ask a short product question with choices first; keep raw CLI flags as secondary detail only.",project_directory:`${ep}(默认:my-app)`,agent:"Ask which agent targets to install for, for example codex, trae, or claude-code. Universal is always included.",git:"Ask whether to initialize a Git repository at the project root. The recommended default is true."},agent_guidance:{recommended_flow:["Run `dbx init --schema --json` if you need the command contract.","For any uncertain user_decisions item, ask the user with the provided prompt and choices instead of exposing raw flags first.","Use `dbx init <directory> --agent <id> --json` to create and inspect a new project."],cautions:["The directory argument must name a new directory; dbx init never initializes the current directory.","--yes only allows replacing existing Skill directories; it does not choose unspecified init parameters.","Use --no-install-deps only when dependency installation should be deferred."]},flags:{path:{kind:"argument",type:"string",required_for_non_interactive_plan:!0,default:"my-app",description:"New project directory name under the current directory."},agent:{type:"array",repeatable:!0,options:[...I],auto_includes:["universal"],description:"Agent skill targets to initialize."},"install-deps":{type:"boolean",default:!0,description:"Install dependencies for the generated frontend project."},git:{type:"boolean",default:!1,description:"Initialize a Git repository at the project root."},"skills-mode":{type:"string",options:["link","copy"],default:"link"},auth:{type:"string",options:["login","require"],default:"login in interactive text mode; require when prompts are unavailable or JSON output is enabled"},yes:{type:"boolean",description:"Allows replacing existing non-symlink Skill directories only. Does not choose unspecified init parameters."},"no-prompt":{type:"boolean",description:"Fail instead of prompting when init decisions are missing."},json:{type:"boolean",description:"Output machine-readable JSON."}},examples:eh()};return this.context.log(JSON.stringify(e,null,2)),e}reporter(){return this.initReporter||(this.initReporter=new D({enabled:!this.jsonEnabled(),useSpinner:F(),log:e=>this.log(e),warn:e=>this.warn(e)})),this.initReporter}async collectInitPlan(e,t){let i=function(e){var t;let i,r=function e(t){return Array.isArray(t)?t.flatMap(t=>e(t)):"string"!=typeof t?[]:t.split(",").map(e=>e.trim()).filter(Boolean)}(e);if(0===r.length)return;let n=new Set(I),s=r.filter(e=>!n.has(e));if(s.length>0)throw Error(`Unsupported init agent(s): ${s.join(", ")}. Supported agents: ${I.join(", ")}.`);return t=["universal",...r],i=new Set,t.filter(e=>!i.has(e)&&(i.add(e),!0))}(e.agent);return i||t||em("dbx init needs --agent <id> when prompts are disabled or unavailable.",{code:"missing_init_decision",missing_flags:["--agent"],user_prompt:"要为哪个 Agent 安装 dbx Skills?",choices:I.filter(e=>"universal"!==e).map(e=>({value:e,label:e})),examples:eh()}),{agents:i??await C(),frontend:{directory:".",initializeGit:e.git||!!t&&await q()}}}emitInitStart(e,t){let i=this.reporter();i.header("Initializing dbx project"),i.section("Plan"),i.info("project",ey(e)),i.info("agents",t.agents.join(", ")),i.info("git",t.frontend.initializeGit?"initialize at project root":"skip"),i.blank(),i.section("Progress")}emitInitSuccess(e,t){let i=this.reporter();i.blank(),i.header("dbx project initialized"),i.info("config",`${ey(e)}/.dbx/config.json`);let r=ef(t);if(r.length>0)for(let e of(i.blank(),i.info("notes"),r))i.note(e)}async ensureRequiredRuntime(){this.reporter().startStep("runtime: checking npm");try{let e=await J();return this.reporter().succeedStep(`runtime: npm ${e.version}`),{npm:e}}catch(e){throw this.reporter().failStep("runtime: npm check failed"),e}}async ensureAuthenticated(e){let t,i;this.reporter().startStep("auth: checking login status");try{t=await w({fetch:async(e,t)=>{let i=new AbortController,r=setTimeout(()=>i.abort(),5e3);try{return await fetch(e,{...t,signal:i.signal})}finally{clearTimeout(r)}}})}catch(e){this.reporter().warnStep(`auth: login status check failed, starting login: ${eg(e)}`),t={loggedIn:!1,tokenPath:""}}if(t.loggedIn)return this.reporter().succeedStep("auth: already logged in"),{already_logged_in:!0,login_performed:!1,uid:t.uid,expires_at:t.expiresAt,base_url:t.baseUrl};if("require"===e)throw this.reporter().failStep("auth: login required"),Error("dbx init requires an existing login when prompts are disabled or JSON output is enabled. Run `dbx auth login` first.");this.reporter().succeedStep("auth: not logged in, starting login"),this.reporter().startStep("auth: waiting for login");let r=await b({onVerification:e=>{this.jsonEnabled()||(this.reporter().info("auth visit",e.verificationUrl),this.reporter().info("auth expires in",`${e.expiresIn} seconds`),this.openVerificationUrl(e.verificationUrl),this.reporter().updateStep(`auth: ${_(p.Pending)}`),i=p.Pending)},onPoll:e=>{this.context.json||e.status!==i&&(i=e.status,this.reporter().updateStep(`auth: ${_(e.status)}`))}});return this.reporter().succeedStep(`auth: logged in, token expires at ${new Date(1e3*r.expiresAt).toISOString()}`),{already_logged_in:!1,login_performed:!0,uid:r.uid,expires_at:r.expiresAt,base_url:r.baseUrl,token_path:r.tokenPath}}async openVerificationUrl(e){this.reporter().info("auth","opening link in browser");try{await v(e)}catch(e){this.reporter().warn(`failed to open browser: ${eg(e)}`)}}async executeFrontendProjectPlan(e,t,i){let r,n;this.reporter().startStep("sandbox app: fetching AppID");let s=await S();this.reporter().succeedStep(`sandbox app: ready (${s.sandbox_app_id})`),this.reporter().startStep("frontend: creating scaffold in the new project root");let o=await N({projectPath:e,directory:t.directory,appId:s.sandbox_app_id,initializeGit:t.initializeGit,onStatus:e=>{"clearing_existing_directory"===e?this.reporter().updateStep("frontend: clearing existing scaffold files (keeping node_modules cache)"):this.reporter().updateStep("frontend: writing scaffold files in the new project root")}});if(this.reporter().succeedStep("frontend: scaffold ready in the new project root"),t.initializeGit&&(this.reporter().startStep("git: checking repository initialization"),(0,x.existsSync)((0,$.resolve)(o.path,".git"))?this.reporter().succeedStep("git: repository initialized at project root"):this.reporter().warnStep("git: repository initialization was requested but .git was not created")),!i)return{directory:t.directory,scaffold:o,package_manager:{dependencies:{dependencies_installed:!1,install_attempts:0,recovered_from_ignored_builds:!1,approved_builds:[],install_warning:"skipped by --no-install-deps"}}};this.reporter().startStep("dependencies: checking pnpm");try{r=await Y()}catch(e){return n={dependencies_installed:!1,install_attempts:0,recovered_from_ignored_builds:!1,approved_builds:[],install_warning:eg(e)},this.reporter().warnStep(`frontend dependencies were not installed: ${n.install_warning}`),{directory:t.directory,scaffold:o,package_manager:{dependencies:n}}}if(this.reporter().startStep(`dependencies: installing frontend packages with pnpm ${r.version}`),(n=await W(o.path,{pnpmVersion:r.version,autoApproveBuilds:"all-pending",streamOutput:this.context.debug})).dependencies_installed?this.reporter().succeedStep(`dependencies: installed frontend packages with pnpm ${r.version}`):this.reporter().warnStep(`dependencies: install incomplete (${n.install_warning??"unknown reason"})`),!this.jsonEnabled()&&n.recovered_from_ignored_builds){let e=n.approved_builds.includes("*")?"all pending dependency build scripts":`${n.approved_builds.length} dependency build script package(s)`;this.reporter().warn(`pnpm blocked dependency build scripts; approved ${e} and retried install`)}return{directory:t.directory,scaffold:o,package_manager:{pnpm:r,dependencies:n}}}}async function eu(e,t){let i=e?.trim()||(t?await K():"");return i||em("dbx init requires a new project directory when prompts are disabled or unavailable.",{code:"missing_project_directory",missing_flags:["directory"],user_prompt:ep,examples:eh()}),function(e){let t=e.trim().replace(/\\/g,"/").replace(/\/+$/,"");if(!t||"."===t)throw Error("dbx init requires a new project directory name.");if((0,$.isAbsolute)(t)||$.win32.isAbsolute(t))throw Error("dbx init project directory must be relative.");if(t.split("/").includes(".."))throw Error("dbx init project directory must stay inside the current directory.");return(0,$.resolve)(process.cwd(),t)}(i)}function eh(){return["dbx init my-app --agent codex --json","dbx init my-app --agent codex --no-install-deps --json"]}function ef(e){let t=[];return e.package_manager?.dependencies.install_warning&&t.push(`前端依赖未完整安装:${e.package_manager.dependencies.install_warning}`),t}function em(e,t){let i=Error(e);throw i.details=t,i}function eg(e){return e instanceof Error&&"AbortError"===e.name?"timed out":e instanceof Error&&e.message?e.message:String(e)}function ey(e){return(0,$.resolve)(e)}export{k as init_namespaceObject};
package/dist/login.js CHANGED
@@ -1,2 +1 @@
1
- import"node:module";import{Command as e,Option as o}from"commander";import{types_TokenStatus as n,runCommand as t}from"./564.js";import{formatPollStatus as i,login as r,startLogin as a,completeLogin as s}from"./auth.js";import{openUrlInBrowser as c}from"./browser.js";async function l(e,o){var n,t;let i=(n=o.open,t=e.json,n&&!t);return o.complete?p(e,o.complete):o.begin?d(e,i):g(e,i)}async function d(e,o=!1){let n=await a(),t={userCode:n.userCode,deviceCode:n.deviceCode,verificationUrl:n.verificationUrl,expiresIn:n.expiresIn};return e.json||(e.log(`Visit: ${n.verificationUrl}`),e.log(`User code: ${n.userCode}`),e.log(""),o&&await f(e,n.verificationUrl),e.log("After approval, run:"),e.log(""),e.log(` $ dbx auth login --complete ${n.deviceCode}`)),t}async function p(e,o){let n,t=await s(o,{onPoll:o=>{e.json||o.status===n||(n=o.status,e.log(i(o.status)))}});return e.log(`Logged in. Token expires at: ${new Date(1e3*t.expiresAt).toISOString()}`),u(t)}async function g(e,o=!1){let t,a=await r({onVerification:r=>{e.json||(e.log(`Visit: ${r.verificationUrl}`),e.log(`Expires in: ${r.expiresIn} seconds`),o&&f(e,r.verificationUrl),e.log(i(n.Pending)),t=n.Pending)},onPoll:o=>{e.json||o.status===t||(t=o.status,e.log(i(o.status)))}});return e.log(`Logged in. Token expires at: ${new Date(1e3*a.expiresAt).toISOString()}`),u(a)}function u(e){return{loggedIn:!0,uid:e.uid,expiresAt:e.expiresAt,baseUrl:e.baseUrl,tokenPath:e.tokenPath}}async function f(e,o){e.log("Opening auth link in browser...");try{await c(o)}catch(o){var n;e.warn(`failed to open browser: ${(n=o)instanceof Error&&n.message?n.message:String(n)}`)}}export default function(){return new e("login").description("登录").addOption(new o("--begin","Start device authorization and print instructions").conflicts("complete")).addOption(new o("--complete <device-code>","Complete device authorization with the given device code").conflicts("begin")).option("--open","自动在浏览器打开认证链接",!0).option("--no-open","不自动在浏览器打开认证链接").action(async(e,o)=>t(o,o=>l(o,e)))};
2
- //# sourceMappingURL=login.js.map
1
+ import"node:module";import{option_Option as e,command_Command as o,runCommand as n,types_TokenStatus as t}from"./1664.js";import{formatPollStatus as i,login as r,startLogin as a,completeLogin as s}from"./auth.js";import{openUrlInBrowser as c}from"./browser.js";async function l(e,o){var n,t;let i=(n=o.open,t=e.json,n&&!t);return o.complete?g(e,o.complete):o.begin?d(e,i):p(e,i)}async function d(e,o=!1){let n=await a(),t={userCode:n.userCode,deviceCode:n.deviceCode,verificationUrl:n.verificationUrl,expiresIn:n.expiresIn};return e.json||(e.log(`Visit: ${n.verificationUrl}`),e.log(`User code: ${n.userCode}`),e.log(""),o&&await f(e,n.verificationUrl),e.log("After approval, run:"),e.log(""),e.log(` $ dbx auth login --complete ${n.deviceCode}`)),t}async function g(e,o){let n,t=await s(o,{onPoll:o=>{e.json||o.status===n||(n=o.status,e.log(i(o.status)))}});return e.log(`Logged in. Token expires at: ${new Date(1e3*t.expiresAt).toISOString()}`),u(t)}async function p(e,o=!1){let n,a=await r({onVerification:r=>{e.json||(e.log(`Visit: ${r.verificationUrl}`),e.log(`Expires in: ${r.expiresIn} seconds`),o&&f(e,r.verificationUrl),e.log(i(t.Pending)),n=t.Pending)},onPoll:o=>{e.json||o.status===n||(n=o.status,e.log(i(o.status)))}});return e.log(`Logged in. Token expires at: ${new Date(1e3*a.expiresAt).toISOString()}`),u(a)}function u(e){return{loggedIn:!0,uid:e.uid,expiresAt:e.expiresAt,baseUrl:e.baseUrl,tokenPath:e.tokenPath}}async function f(e,o){e.log("Opening auth link in browser...");try{await c(o)}catch(o){var n;e.warn(`failed to open browser: ${(n=o)instanceof Error&&n.message?n.message:String(n)}`)}}export default function(){return new o("login").description("登录").addOption(new e("--begin","Start device authorization and print instructions").conflicts("complete")).addOption(new e("--complete <device-code>","Complete device authorization with the given device code").conflicts("begin")).option("--open","自动在浏览器打开认证链接",!0).option("--no-open","不自动在浏览器打开认证链接").action(async(e,o)=>n(o,o=>l(o,e)))};
package/dist/main.js ADDED
@@ -0,0 +1 @@
1
+ import"node:module";export{main}from"./1664.js";
@@ -1,2 +1 @@
1
- import"node:module";import{isRecord as e}from"./564.js";function r(r){let o=e(r)&&e(r.mcp_server)?r.mcp_server:void 0,t=e(o?.mcp_config)?o.mcp_config:void 0,i=Array.isArray(t?.headers)?t.headers:[],n={};for(let r of i)e(r)&&"constant"===r.source&&"string"==typeof r.key&&"string"==typeof r.value&&(n[r.key]=r.value);return Object.keys(n).length>0?n:void 0}export{r as extractMCPHeadersFromManifest};
2
- //# sourceMappingURL=manifest-mcp-config.js.map
1
+ import"node:module";import{isRecord as e}from"./1664.js";function r(r){let o=e(r)&&e(r.mcp_server)?r.mcp_server:void 0,t=e(o?.mcp_config)?o.mcp_config:void 0,i=Array.isArray(t?.headers)?t.headers:[],n={};for(let r of i)e(r)&&"constant"===r.source&&"string"==typeof r.key&&"string"==typeof r.value&&(n[r.key]=r.value);return Object.keys(n).length>0?n:void 0}export{r as extractMCPHeadersFromManifest};
@@ -1,2 +1 @@
1
- import"node:module";import t from"node:fs";import r from"node:path";let e="manifest.yaml",i=r.join("skill","SKILL.md");function n(s,c={}){var f;let a=r.resolve(s),u=c.kind??(f=a,!function(n){if(!l(r.join(n,e))&&!l(r.join(n,i)))return!1;let s=o(n);return void 0!==s?"."===s:!function(r){try{return t.statSync(r).isDirectory()}catch{return!1}}(r.join(n,"miniapp"))}(r.resolve(f))?"legacy":"root");return{kind:u,root:a,frontendDirectory:c.frontendDirectory??("root"===u?".":o(a)??"miniapp"),manifestPath:r.join(a,e),skillDirectory:r.join(a,"skill"),skillPath:r.join(a,i)}}function o(e){let i=r.join(e,".dbx","config.json");if(l(i))try{let l=JSON.parse(t.readFileSync(i,"utf8"));if(s(l)&&s(l.frontend)){let t=l.frontend.directory;if("string"==typeof t&&t.trim()){var n=e,o=t;let i=o.trim();if(!i||r.isAbsolute(i)||r.win32.isAbsolute(i))return;let l=r.relative(n,r.resolve(n,i));return r.isAbsolute(l)||".."===l||l.startsWith(`..${r.sep}`)?void 0:l||"."}}}catch{}}function l(r){try{return t.statSync(r).isFile()}catch{return!1}}function s(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}export{n as resolveProjectLayout};
2
- //# sourceMappingURL=project-layout.js.map
1
+ import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import"./1664.js";let r=t("node:fs");var e=t.n(r);let n=t("node:path");var i=t.n(n);let o="manifest.yaml",l=i().join("skill","SKILL.md");function s(t,r={}){var n;let f=i().resolve(t),u=r.kind??(n=f,!function(t){if(!c(i().join(t,o))&&!c(i().join(t,l)))return!1;let r=a(t);return void 0!==r?"."===r:!function(t){try{return e().statSync(t).isDirectory()}catch{return!1}}(i().join(t,"miniapp"))}(i().resolve(n))?"legacy":"root");return{kind:u,root:f,frontendDirectory:r.frontendDirectory??("root"===u?".":a(f)??"miniapp"),manifestPath:i().join(f,o),skillDirectory:i().join(f,"skill"),skillPath:i().join(f,l)}}function a(t){let r=i().join(t,".dbx","config.json");if(c(r))try{let l=JSON.parse(e().readFileSync(r,"utf8"));if(f(l)&&f(l.frontend)){let r=l.frontend.directory;if("string"==typeof r&&r.trim()){var n=t,o=r;let e=o.trim();if(!e||i().isAbsolute(e)||i().win32.isAbsolute(e))return;let l=i().relative(n,i().resolve(n,e));return i().isAbsolute(l)||".."===l||l.startsWith(`..${i().sep}`)?void 0:l||"."}}}catch{}}function c(t){try{return e().statSync(t).isFile()}catch{return!1}}function f(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}export{s as resolveProjectLayout};
package/dist/prompt.js CHANGED
@@ -1,11 +1,10 @@
1
- import"node:module";import{select as r}from"@inquirer/prompts";import e from"chalk";import{ignoreUpdateVersion as t,runtime_packageName as n}from"./564.js";import{formatError as i,updateCli as s}from"./update.js";async function o(o){let a;process.stderr.write(`
1
+ import"node:module";import{ignoreUpdateVersion as r,chalk_source as e,runtime_packageName as t}from"./1664.js";import{formatError as n,updateCli as i}from"./update.js";import{dist as s}from"./@inquirer/select.js";async function o(o){let a;process.stderr.write(`
2
2
  ${e.bold.yellow("✨ Update available!")} ${e.dim(o.current)} -> ${e.green(o.latest)}
3
3
 
4
4
  Release notes: ${e.underline("https://developer.doubao.com/docs/resources/changelog")}
5
5
 
6
- `);try{a=await r({message:"Select an action",choices:[{name:`1. Update now (runs \`npm install -g ${n}\`)`,value:"update"},{name:"2. Skip",value:"skip"},{name:"3. Skip until next version",value:"skip_version"}]},{output:process.stderr})}catch(r){if(r instanceof Error&&"ExitPromptError"===r.name)return!1;return process.stderr.write(`Warning: update prompt failed: ${i(r)}
7
- `),!1}if("skip_version"===a)return t(o.latest),!1;if("skip"===a)return!1;try{let r=await s({currentVersion:o.current});if("updated"!==r.action)return!1;return process.stderr.write(`dbx upgraded: ${r.currentVersion} -> ${r.latestVersion}. Run your original dbx command again to use the new version.
6
+ `);try{a=await s({message:"Select an action",choices:[{name:`1. Update now (runs \`npm install -g ${t}\`)`,value:"update"},{name:"2. Skip",value:"skip"},{name:"3. Skip until next version",value:"skip_version"}]},{output:process.stderr})}catch(r){if(r instanceof Error&&"ExitPromptError"===r.name)return!1;return process.stderr.write(`Warning: update prompt failed: ${n(r)}
7
+ `),!1}if("skip_version"===a)return r(o.latest),!1;if("skip"===a)return!1;try{let r=await i({currentVersion:o.current});if("updated"!==r.action)return!1;return process.stderr.write(`dbx upgraded: ${r.currentVersion} -> ${r.latestVersion}. Run your original dbx command again to use the new version.
8
8
  `),r.skillsWarning&&process.stderr.write(`Warning: skills refresh failed: ${r.skillsWarning}
9
- `),!0}catch(r){return process.stderr.write(`Warning: dbx upgrade failed: ${i(r)}
10
- `),!1}}export{o as promptForUpdate};
11
- //# sourceMappingURL=prompt.js.map
9
+ `),!0}catch(r){return process.stderr.write(`Warning: dbx upgrade failed: ${n(r)}
10
+ `),!1}}export{o as promptForUpdate};
package/dist/push-page.js CHANGED
@@ -1,2 +1 @@
1
- import"node:module";import{resolve as e}from"node:path";import{Command as t,Option as o}from"commander";import{runCommand as i}from"./564.js";import{DEV_ACTIONS as d,parseJsonData as a,ensureDevActionSucceeded as p,connectDevService as n,summarizeData as r}from"./dev-service-client.js";import{resolveProjectLayout as s}from"./project-layout.js";async function g(t,o){let i=e(process.cwd()),g=s(i).frontendDirectory,u=await n({projectPath:i,appDir:g,nodeIdPrefix:"dev-push-page"});try{let e=a(o.data,"--data");t.log(`debug: page push request ${JSON.stringify({pageId:o.pageId,data:r(e),settings:o.settings,mode:o.mode,deviceId:o.deviceId})}`);let i=p("pushPage",await u.call(d.openPage,{pageId:o.pageId,pageData:e,pageSettings:o.settings,mode:o.mode,deviceId:o.deviceId}));return t.log("page pushed"),t.log(`page_id: ${o.pageId}`),t.log(`status: ${function(e){if(!e.ok)return"failed";let t=function(e){if(!e||"object"!=typeof e)return;let t=e.data;if(!t||"object"!=typeof t)return;let o=t.msg;return"string"==typeof o?o:void 0}(e.result);return"string"==typeof t&&t.trim()?t:"ok"}(i)}`),i}finally{await u.stop().catch(()=>void 0)}}export default function(){return new t("push-page").description("通过常驻 dev service 打开智能服务页面").requiredOption("--page-id <id>","页面 id,例如 home").option("--data <json>","页面入参 JSON,会透传给 DoubaoAppsSDK.openPage 的 pageData").option("--settings <settings>","页面设置,会透传给 DoubaoAppsSDK.openPage 的 pageSettings").addOption(new o("--mode <mode>","页面打开模式").choices(["full","popup","floating"]).default("full")).option("--device-id <id>","调试设备 id;默认由 SDK 在单设备连接时自动选择").action(async(e,t)=>i(t,t=>g(t,e)))};
2
- //# sourceMappingURL=push-page.js.map
1
+ import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import{command_Command as t,option_Option as o,runCommand as i}from"./1664.js";import{DEV_ACTIONS as d,parseJsonData as a,ensureDevActionSucceeded as p,connectDevService as n,summarizeData as r}from"./dev-service-client.js";import{resolveProjectLayout as s}from"./project-layout.js";let g=e("node:path");async function u(e,t){let o=(0,g.resolve)(process.cwd()),i=s(o).frontendDirectory,u=await n({projectPath:o,appDir:i,nodeIdPrefix:"dev-push-page"});try{let o=a(t.data,"--data");e.log(`debug: page push request ${JSON.stringify({pageId:t.pageId,data:r(o),settings:t.settings,mode:t.mode,deviceId:t.deviceId})}`);let i=p("pushPage",await u.call(d.openPage,{pageId:t.pageId,pageData:o,pageSettings:t.settings,mode:t.mode,deviceId:t.deviceId}));return e.log("page pushed"),e.log(`page_id: ${t.pageId}`),e.log(`status: ${function(e){if(!e.ok)return"failed";let t=function(e){if(!e||"object"!=typeof e)return;let t=e.data;if(!t||"object"!=typeof t)return;let o=t.msg;return"string"==typeof o?o:void 0}(e.result);return"string"==typeof t&&t.trim()?t:"ok"}(i)}`),i}finally{await u.stop().catch(()=>void 0)}}export default function(){return new t("push-page").description("通过常驻 dev service 打开智能服务页面").requiredOption("--page-id <id>","页面 id,例如 home").option("--data <json>","页面入参 JSON,会透传给 DoubaoAppsSDK.openPage 的 pageData").option("--settings <settings>","页面设置,会透传给 DoubaoAppsSDK.openPage 的 pageSettings").addOption(new o("--mode <mode>","页面打开模式").choices(["full","popup","floating"]).default("full")).option("--device-id <id>","调试设备 id;默认由 SDK 在单设备连接时自动选择").action(async(e,t)=>i(t,t=>u(t,e)))};
@@ -1,2 +1 @@
1
- import"node:module";import{resolve as t}from"node:path";import{Command as e}from"commander";import{runCommand as d}from"./564.js";import{DEV_ACTIONS as i,parseJsonData as o,ensureDevActionSucceeded as r,connectDevService as n,summarizeData as a}from"./dev-service-client.js";import{resolveProjectLayout as p}from"./project-layout.js";async function u(e,d){let u=t(process.cwd()),g=p(u).frontendDirectory,s=await n({projectPath:u,appDir:g,nodeIdPrefix:"dev-push-widget"});try{let t=o(d.data,"--data");e.log(`debug: widget push request ${JSON.stringify({widgetId:d.widgetId,data:a(t),botId:d.botId,deviceId:d.deviceId})}`);let n=r("pushWidget",await s.call(i.pushWidget,{widgetId:d.widgetId,widgetData:t,botId:d.botId,deviceId:d.deviceId}));return e.log("widget pushed"),e.log(`widget_id: ${d.widgetId}`),e.log(`status: ${function(t){if(!t.ok)return"failed";let e=function(t){if(!t||"object"!=typeof t)return;let e=t.data;if(!e||"object"!=typeof e)return;let d=e.msg;return"string"==typeof d?d:void 0}(t.result);return"string"==typeof e&&e.trim()?e:"ok"}(n)}`),n}finally{await s.stop().catch(()=>void 0)}}export default function(){return new e("push-widget").description("通过常驻 dev service 推送智能服务卡片").requiredOption("--widget-id <id>","卡片 widget id,例如 hello-world").option("--data <json>","卡片入参 JSON,会透传给 DoubaoAppsSDK.pushWidget 的 widgetData").option("--bot-id <id>","目标 bot id;默认使用 SDK/环境变量配置").option("--device-id <id>","调试设备 id;默认由 SDK 在单设备连接时自动选择").action(async(t,e)=>d(e,e=>u(e,t)))};
2
- //# sourceMappingURL=push-widget.js.map
1
+ import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import{command_Command as e,runCommand as d}from"./1664.js";import{DEV_ACTIONS as i,parseJsonData as o,ensureDevActionSucceeded as r,connectDevService as n,summarizeData as a}from"./dev-service-client.js";import{resolveProjectLayout as p}from"./project-layout.js";let u=t("node:path");async function g(t,e){let d=(0,u.resolve)(process.cwd()),g=p(d).frontendDirectory,s=await n({projectPath:d,appDir:g,nodeIdPrefix:"dev-push-widget"});try{let d=o(e.data,"--data");t.log(`debug: widget push request ${JSON.stringify({widgetId:e.widgetId,data:a(d),botId:e.botId,deviceId:e.deviceId})}`);let n=r("pushWidget",await s.call(i.pushWidget,{widgetId:e.widgetId,widgetData:d,botId:e.botId,deviceId:e.deviceId}));return t.log("widget pushed"),t.log(`widget_id: ${e.widgetId}`),t.log(`status: ${function(t){if(!t.ok)return"failed";let e=function(t){if(!t||"object"!=typeof t)return;let e=t.data;if(!e||"object"!=typeof e)return;let d=e.msg;return"string"==typeof d?d:void 0}(t.result);return"string"==typeof e&&e.trim()?e:"ok"}(n)}`),n}finally{await s.stop().catch(()=>void 0)}}export default function(){return new e("push-widget").description("通过常驻 dev service 推送智能服务卡片").requiredOption("--widget-id <id>","卡片 widget id,例如 hello-world").option("--data <json>","卡片入参 JSON,会透传给 DoubaoAppsSDK.pushWidget 的 widgetData").option("--bot-id <id>","目标 bot id;默认使用 SDK/环境变量配置").option("--device-id <id>","调试设备 id;默认由 SDK 在单设备连接时自动选择").action(async(t,e)=>d(e,e=>g(e,t)))};
@@ -1,2 +1 @@
1
- import"node:module";var e={},r={};function o(t){var n=r[t];if(void 0!==n)return n.exports;var a=r[t]={exports:{}};return e[t].call(a.exports,a,a.exports,o),a.exports}o.m=e,o.d=(e,r,t)=>{var n=(r,t)=>{for(var n in r)o.o(r,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,[t]:r[n]})};n(r,"get"),n(t,"value")},o.add=function(e){Object.assign(o.m,e)},o.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),o.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),o.p="";export{o as __webpack_require__};
2
- //# sourceMappingURL=rslib-runtime.js.map
1
+ import"node:module";var e,t,r={},o={};function n(e){var t=o[e];if(void 0!==t)return t.exports;var a=o[e]={exports:{}};return r[e].call(a.exports,a,a.exports,n),a.exports}n.m=r,n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,n.t=function(r,o){if(1&o&&(r=this(r)),8&o||"object"==typeof r&&r&&(4&o&&r.__esModule||16&o&&"function"==typeof r.then))return r;var a=Object.create(null);n.r(a);var p={};e=e||[null,t({}),t([]),t(t)];for(var u=2&o&&r;("object"==typeof u||"function"==typeof u)&&!~e.indexOf(u);u=t(u))Object.getOwnPropertyNames(u).forEach(e=>{p[e]=()=>r[e]});return p.default=()=>r,n.d(a,p),a},n.d=(e,t,r)=>{var o=(t,r)=>{for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,[r]:t[o]})};o(t,"get"),o(r,"value")},n.add=function(e){Object.assign(n.m,e)},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),n.p="",n.b=new URL("./",import.meta.url);export{n as __webpack_require__};
package/dist/sandbox.js CHANGED
@@ -1,2 +1 @@
1
- import"node:module";import{getSandboxApp as a}from"./app.js";import{getLastHttpResponseLogId as _}from"./564.js";async function o(){var o=await a();let p=o.data??{},d={sandbox_project_id:p.sandbox_project_id??"",sandbox_app_id:p.sandbox_app_id??p.sandbox_appid??"",sandbox_app_secret:p.sandbox_app_secret??p.sandbox_appsecret??"",log_id:o.log_id??_()??""};if(!d.sandbox_app_id||!d.sandbox_app_secret)throw Error("Get sandbox app failed: missing sandbox app credentials");return d}export{o as fetchSandboxAppCredentials};
2
- //# sourceMappingURL=sandbox.js.map
1
+ import"node:module";import{getSandboxApp as a}from"./app.js";import{getLastHttpResponseLogId as _}from"./1664.js";async function o(){var o=await a();let p=o.data??{},d={sandbox_project_id:p.sandbox_project_id??"",sandbox_app_id:p.sandbox_app_id??p.sandbox_appid??"",sandbox_app_secret:p.sandbox_app_secret??p.sandbox_appsecret??"",log_id:o.log_id??_()??""};if(!d.sandbox_app_id||!d.sandbox_app_secret)throw Error("Get sandbox app failed: missing sandbox app credentials");return d}export{o as fetchSandboxAppCredentials};