@doubao-dev/cli 0.0.32 → 0.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/2168.js +16 -16
  2. package/dist/275.js +12 -14
  3. package/dist/2932.js +1 -1
  4. package/dist/318.js +1 -1
  5. package/dist/3974.js +22 -22
  6. package/dist/4525.js +1 -1
  7. package/dist/4880.js +1 -1
  8. package/dist/4931.js +2 -2
  9. package/dist/7410.js +1 -1
  10. package/dist/7417.js +204 -0
  11. package/dist/7417.js.LICENSE.txt +107 -0
  12. package/dist/7945.js +1 -0
  13. package/dist/8079.js +126 -0
  14. package/dist/{1560.js → 9091.js} +2 -2
  15. package/dist/9667.js +78 -0
  16. package/dist/{8891.js.LICENSE.txt → 9667.js.LICENSE.txt} +0 -108
  17. package/dist/@byted-doubao-apps/create.js +1 -1
  18. package/dist/@byted-doubao-apps/kit.js +1 -0
  19. package/dist/@byted-doubao-apps/login.js +1 -1
  20. package/dist/@byted-doubao-apps/login~1.js +1 -1
  21. package/dist/@byted-doubao-apps/template-empty/package.json +3 -3
  22. package/dist/@byted-doubao-apps/template-starter/package.json +3 -3
  23. package/dist/@byted-hdt/cli.js +1 -1
  24. package/dist/@inquirer/select.js +1 -1
  25. package/dist/app.js +1 -1
  26. package/dist/assets/web-sdk-debugger/__doubao_web_sdk_native_modules/applet-bridge-module-core.js +1 -1
  27. package/dist/assets/web-sdk-debugger/index.html +1 -1
  28. package/dist/assets/web-sdk-debugger/static/js/index.d1bb36b355.js +44 -0
  29. package/dist/assets/web-sdk-debugger/wsd/doubao-apps-api.template.js +0 -0
  30. package/dist/assets/web-sdk-debugger/wsd/doubao-apps-framework.template.js +0 -0
  31. package/dist/build.js +1 -1
  32. package/dist/build~1.js +6 -6
  33. package/dist/check.js +1 -1
  34. package/dist/demo-server.js +1 -1
  35. package/dist/dev-config.js +1 -1
  36. package/dist/dev-shell.js +1 -1
  37. package/dist/dev.js +10 -10
  38. package/dist/devtools.js +1 -1
  39. package/dist/gen-explore.js +1 -1
  40. package/dist/gen-trajectory.js +1 -1
  41. package/dist/init.js +4 -4
  42. package/dist/ink.js +1 -1
  43. package/dist/inquirer.js +1 -0
  44. package/dist/json-file.js +1 -1
  45. package/dist/kit-dev-options.js +1 -1
  46. package/dist/legacy-upload.js +1 -1
  47. package/dist/lepus.js +1 -1
  48. package/dist/ora.js +1 -1
  49. package/dist/project-layout.js +1 -1
  50. package/dist/prompt.js +1 -1
  51. package/dist/prompts.js +1 -1
  52. package/dist/report.js +1 -1
  53. package/dist/run-registry.js +1 -1
  54. package/dist/run.js +44 -44
  55. package/dist/sandbox.js +1 -1
  56. package/dist/scan.js +1 -1
  57. package/dist/sdk.js +63 -188
  58. package/dist/sdk~1.js +50 -50
  59. package/dist/server.js +1 -1
  60. package/dist/skill.js +1 -1
  61. package/dist/skills.js +1 -1
  62. package/dist/skills~1.js +2 -1
  63. package/dist/static/assets/web-view-proxy-bootstrap.js +1 -0
  64. package/dist/static/assets/web-view-proxy-page-client.js +1 -1
  65. package/dist/static/assets/web-view-proxy-service-worker.js +1 -1
  66. package/dist/status~1.js +1 -1
  67. package/dist/stop.js +1 -1
  68. package/dist/sync.js +1 -1
  69. package/dist/templates/README.md +0 -1
  70. package/dist/update.js +1 -1
  71. package/dist/workspace.js +1 -1
  72. package/dist/wrapper.js +1 -0
  73. package/dist/yaml.js +1 -1
  74. package/package.json +2 -2
  75. package/skills/dbx-eval/SKILL.md +15 -7
  76. package/skills/doubao-agentic-service-development/SKILL.md +1 -1
  77. package/skills/doubao-agentic-service-development/references/auth.md +1 -1
  78. package/skills/doubao-agentic-service-development/references/dev-debug.md +3 -3
  79. package/skills/doubao-agentic-service-development/references/frontend/components/map-canvas.md +1 -1
  80. package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/07-/347/225/214/351/235/242.md +0 -6
  81. package/skills/doubao-agentic-service-development/references/frontend/guides/debugger-mcp.md +2 -2
  82. package/skills/doubao-agentic-service-development/references/frontend/widget-templates/props.md +1 -1
  83. package/skills/doubao-agentic-service-development/references/frontend-dev.md +3 -3
  84. package/skills/doubao-agentic-service-development/references/local-debug/overview.md +2 -2
  85. package/skills/doubao-agentic-service-development/references/overview.md +16 -31
  86. package/skills/doubao-agentic-service-development/scripts/workspace.py +6 -89
  87. package/dist/180.js +0 -1
  88. package/dist/8891.js +0 -280
  89. package/dist/9635.js +0 -1
  90. package/dist/assets/web-sdk-debugger/static/js/index.75528d6de7.js +0 -26
  91. package/dist/dbx.js +0 -3
  92. package/dist/skills~2.js +0 -2
package/dist/server.js CHANGED
@@ -1,4 +1,4 @@
1
- import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./9635.js";import{sanitizeProgressFailure as t,sanitizeDetailField as r,command_Command as a,classifyEventStatus as s}from"./2168.js";import{openUrlInBrowser as n}from"./browser.js";import{readJsonIfExists as i}from"./json-file.js";import{runEvalCommand as o,EvalRunStoppedError as l,runFullPipeline as c,configureEvalRunOptions as d,reapEvalDescendantsSync as p,progressFailure as u,resolvePipelineRunConfig as m,installTwoStageSignalHandler as h}from"./run.js";var f={};e.r(f),e.d(f,{__testOnly:()=>j,default:()=>L});class g{runId;skillName;outputDir;now;startedAt;phases=[];details=[];events=[];listeners=new Set;cases=[];status="initializing";finishedAt;error;report;totalCases=0;sequence=0;nextDetailId=1;constructor(e){this.runId=e.runId,this.skillName=e.skillName,this.outputDir=e.outputDir,this.now=e.now??(()=>new Date),this.startedAt=this.now().toISOString()}start(){}setStatus(e,t){if(this.status=e,this.error=t,"stopped"===e){let e=this.now().toISOString();for(let t of this.phases)if("running"===t.status)for(let r of(t.status="stopped",t.finishedAt=e,t.tasks))"running"===r.status&&(r.status="stopped",r.finishedAt=e)}("completed"===e||"failed"===e||"stopped"===e)&&(this.finishedAt=this.now().toISOString()),this.emit("run.status",{status:e,error:t})}setReport(e){this.report=e,this.emit("report.ready",{summary:e.summary})}getReport(){return this.report}phaseStart(e){let t=this.now().toISOString(),r=this.phases.find(t=>t.id===e.id);r?Object.assign(r,e,{status:"running",startedAt:t,finishedAt:void 0,summary:void 0,reason:void 0,hint:void 0}):this.phases.push({...e,status:"running",startedAt:t,tasks:[]}),this.emit("phase.started",{...e})}phaseDone(e,t={}){let r=this.requirePhase(e);r.status="done",r.finishedAt=this.now().toISOString(),r.summary=t.summary,this.emit("phase.completed",{id:e,...t})}phaseFail(e,r){let a=t(r),s=this.requirePhase(e);s.status="failed",s.finishedAt=this.now().toISOString(),s.reason=a.reason,s.hint=a.hint,this.emit("phase.failed",{id:e,...a})}taskStart(e){let t=this.requirePhase(e.phaseId),r=this.now().toISOString(),a=t.tasks.find(t=>t.id===e.id);a?Object.assign(a,e,{status:"running",startedAt:r,finishedAt:void 0,summary:void 0,reason:void 0,hint:void 0,metadata:void 0}):t.tasks.push({...e,status:"running",startedAt:r}),this.emit("task.started",{...e})}taskUpdate(e,t){let r=this.requireTask(e);t.label&&(r.label=t.label),t.technicalName&&(r.technicalName=t.technicalName),void 0!==t.metadata&&(r.metadata=structuredClone(t.metadata)),this.emit("task.updated",{id:e,...t})}taskDone(e,t={}){let r=this.requireTask(e);r.status="done",r.finishedAt=this.now().toISOString(),r.summary=t.summary,this.emit("task.completed",{id:e,...t})}taskFail(e,r){let a=t(r),s=this.requireTask(e);s.status="failed",s.finishedAt=this.now().toISOString(),s.reason=a.reason,s.hint=a.hint,this.emit("task.failed",{id:e,...a})}failActive(e){let r=t(e),a=[...this.phases].reverse().find(e=>"running"===e.status);if(!a)return;let s=[...a.tasks].reverse().find(e=>"running"===e.status);s&&(s.status="failed",s.finishedAt=this.now().toISOString(),s.reason=r.reason,s.hint=r.hint,this.emit("task.failed",{id:s.id,...r})),this.phaseFail(a.id,r)}detail(e){let t=(e.fields??[]).map(([e,t])=>r(e,t)),a={id:String(this.nextDetailId),timestamp:this.now().toISOString(),title:e.title,technicalName:e.technicalName,fields:t.map(([e,t])=>[e,function(e){let t;if("string"==typeof e)t=e;else if(void 0===e)t="-";else try{t=JSON.stringify(e)}catch{t=String(e)}let r=t.replace(/\s+/g," ").trim();return r.length<=500?r:`${r.slice(0,499)}…`}(t)])};this.nextDetailId+=1,this.details.push(a),this.details.length>100&&this.details.splice(0,this.details.length-100),this.emit("detail",a)}updateRun(e){void 0!==e.totalCases&&(this.totalCases=e.totalCases);let t={...e,cases:e.cases?.map(e=>({...e,intent:e.label}))};t.cases&&(this.cases=t.cases.map(e=>({...e}))),this.emit("run.updated",t)}stop(){}snapshot(){let e=this.caseSnapshots(),t=e.filter(e=>["passed","failed","stopped"].includes(e.status)),r=e.filter(e=>"passed"===e.status).length,a=this.finishedAt?new Date(this.finishedAt).getTime():this.now().getTime();return{runId:this.runId,skillName:this.skillName,outputDir:this.outputDir,status:this.status,startedAt:this.startedAt,finishedAt:this.finishedAt,elapsedMs:Math.max(0,a-new Date(this.startedAt).getTime()),error:this.error?{...this.error}:void 0,sequence:this.sequence,totalCases:this.totalCases,completedCases:t.length,passedCases:r,progress:this.progress(e),phases:this.phases.map(v),cases:e,details:this.details.map(b),reportAvailable:!!this.report,reportSummary:this.report?{...this.report.summary}:void 0}}eventsAfter(e){return 0===this.events.length||e>=this.sequence?[]:e<(this.events[0]?.sequence??this.sequence)-1?void 0:this.events.filter(t=>t.sequence>e).map(y)}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}emit(e,t){let r={sequence:++this.sequence,timestamp:this.now().toISOString(),type:e,payload:t&&"object"==typeof t?structuredClone(t):t};for(let e of(this.events.push(r),this.events.length>2e3&&this.events.splice(0,this.events.length-2e3),this.listeners))e(y(r))}caseSnapshots(){let e=new Map(this.phases.flatMap(e=>e.tasks).filter(e=>e.id.startsWith("rollout:")).map(e=>[e.id.slice(8),e]));return this.cases.map(t=>{let r=e.get(t.id);if(!r)return{...t,status:"stopped"===this.status?"stopped":"waiting"};if("failed"===r.status)return{...t,status:"failed",summary:r.reason};if("stopped"===r.status)return{...t,status:"stopped",summary:"Evaluation stopped"};if("done"===r.status){let e=r.summary?.startsWith("PASS")??!1;return{...t,status:e?"passed":"failed",summary:r.summary}}return{...t,status:"scorer"===r.technicalName?"scoring":"running",summary:r.label}})}progress(e){let t=0;for(let[r,a]of Object.entries({preflight:5,analysis:20,"case-generation":15,rollout:50,veto:5,report:5})){let s=this.phases.find(e=>e.id===r);if(s?.status==="done")t+=a;else if("rollout"===r&&(s?.status==="running"||s?.status==="stopped")){let r=e.filter(e=>["passed","failed"].includes(e.status)).length;t+=this.totalCases>0?a*(r/this.totalCases):0}}return Math.max(0,Math.min(100,Math.round(t)))}requirePhase(e){let t=this.phases.find(t=>t.id===e);if(!t)throw Error(`progress phase not found: ${e}`);return t}requireTask(e){let t=this.phases.flatMap(e=>e.tasks).find(t=>t.id===e);if(!t)throw Error(`progress task not found: ${e}`);return t}}function v(e){return{...e,tasks:e.tasks.map(e=>({...e,metadata:void 0===e.metadata?void 0:structuredClone(e.metadata)}))}}function b(e){return{...e,fields:e.fields.map(([e,t])=>[e,t])}}function y(e){return{...e,payload:e.payload&&"object"==typeof e.payload?structuredClone(e.payload):e.payload}}let x=e("node:crypto"),k=e("node:fs"),w=e("node:http"),S=e("node:path"),C=e("node:url"),I=new Set(["127.0.0.1","localhost","::1"]);async function T(e){var t,r,a;let s=function(e="127.0.0.1"){let t=e.trim().toLowerCase();if(!I.has(t))throw Error(`dbx eval server only accepts loopback hosts: ${[...I].join(", ")}`);return t}(e.host),i=function(e=0){if(!Number.isInteger(e)||e<0||e>65535)throw Error(`Invalid eval server port: ${e}`);return e}(e.port),o=e.controlToken??(0,x.randomBytes)(24).toString("hex"),l=function(e=15e3){if(!Number.isFinite(e)||!Number.isInteger(e)||e<1||e>3e4)throw Error(`Invalid eval server heartbeat interval: ${e}. Expected 1-30000ms.`);return e}(e.heartbeatIntervalMs);(0,k.mkdirSync)(e.outputDir,{recursive:!0});let c=(0,k.realpathSync)(e.outputDir),d=new Set,p=(0,x.randomBytes)(18).toString("base64"),u=e.openDirectory??(e=>n(e)),m=(0,w.createServer)((t,r)=>{A({request:t,response:r,hub:e.hub,outputRoot:c,controlToken:o,nonce:p,clients:d,heartbeatIntervalMs:l,onStop:e.onStop,openDirectory:u}).catch(e=>{r.headersSent?r.end():_(r,500,{error:e instanceof Error?e.message:String(e)})})});await (t=m,r=i,a=s,new Promise((e,s)=>{function n(e){t.removeListener("listening",i),s(e)}function i(){t.removeListener("error",n),e()}t.once("error",n),t.once("listening",i),t.listen(r,a)}));let h=m.address();if(!h||"string"==typeof h)throw await R(m),Error("Eval server did not expose a TCP address");let f="127.0.0.1"===s||"localhost"===s?"localhost":`[${h.address}]`;return{url:`http://${f}:${h.port}`,host:s,port:h.port,controlToken:o,async close(){for(let e of d)e.end();d.clear(),await R(m)}}}async function A(e){let{request:t,response:r,hub:a,outputRoot:s,controlToken:n,nonce:i,clients:o,heartbeatIntervalMs:l,onStop:c,openDirectory:d}=e,p=new URL(t.url??"/","http://localhost"),u=p.pathname;if("GET"===t.method&&"/"===u){var m,h;let e,t=(e=JSON.stringify((m={controlToken:n,nonce:i}).controlToken),`<!doctype html>
1
+ import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./7945.js";import{sanitizeProgressFailure as t,sanitizeDetailField as r,command_Command as a,classifyEventStatus as s}from"./2168.js";import{openUrlInBrowser as n}from"./browser.js";import{readJsonIfExists as i}from"./json-file.js";import{runEvalCommand as o,EvalRunStoppedError as l,runFullPipeline as c,configureEvalRunOptions as d,reapEvalDescendantsSync as p,progressFailure as u,resolvePipelineRunConfig as m,installTwoStageSignalHandler as h}from"./run.js";var f={};e.r(f),e.d(f,{__testOnly:()=>j,default:()=>L});class g{runId;skillName;outputDir;now;startedAt;phases=[];details=[];events=[];listeners=new Set;cases=[];status="initializing";finishedAt;error;report;totalCases=0;sequence=0;nextDetailId=1;constructor(e){this.runId=e.runId,this.skillName=e.skillName,this.outputDir=e.outputDir,this.now=e.now??(()=>new Date),this.startedAt=this.now().toISOString()}start(){}setStatus(e,t){if(this.status=e,this.error=t,"stopped"===e){let e=this.now().toISOString();for(let t of this.phases)if("running"===t.status)for(let r of(t.status="stopped",t.finishedAt=e,t.tasks))"running"===r.status&&(r.status="stopped",r.finishedAt=e)}("completed"===e||"failed"===e||"stopped"===e)&&(this.finishedAt=this.now().toISOString()),this.emit("run.status",{status:e,error:t})}setReport(e){this.report=e,this.emit("report.ready",{summary:e.summary})}getReport(){return this.report}phaseStart(e){let t=this.now().toISOString(),r=this.phases.find(t=>t.id===e.id);r?Object.assign(r,e,{status:"running",startedAt:t,finishedAt:void 0,summary:void 0,reason:void 0,hint:void 0}):this.phases.push({...e,status:"running",startedAt:t,tasks:[]}),this.emit("phase.started",{...e})}phaseDone(e,t={}){let r=this.requirePhase(e);r.status="done",r.finishedAt=this.now().toISOString(),r.summary=t.summary,this.emit("phase.completed",{id:e,...t})}phaseFail(e,r){let a=t(r),s=this.requirePhase(e);s.status="failed",s.finishedAt=this.now().toISOString(),s.reason=a.reason,s.hint=a.hint,this.emit("phase.failed",{id:e,...a})}taskStart(e){let t=this.requirePhase(e.phaseId),r=this.now().toISOString(),a=t.tasks.find(t=>t.id===e.id);a?Object.assign(a,e,{status:"running",startedAt:r,finishedAt:void 0,summary:void 0,reason:void 0,hint:void 0,metadata:void 0}):t.tasks.push({...e,status:"running",startedAt:r}),this.emit("task.started",{...e})}taskUpdate(e,t){let r=this.requireTask(e);t.label&&(r.label=t.label),t.technicalName&&(r.technicalName=t.technicalName),void 0!==t.metadata&&(r.metadata=structuredClone(t.metadata)),this.emit("task.updated",{id:e,...t})}taskDone(e,t={}){let r=this.requireTask(e);r.status="done",r.finishedAt=this.now().toISOString(),r.summary=t.summary,this.emit("task.completed",{id:e,...t})}taskFail(e,r){let a=t(r),s=this.requireTask(e);s.status="failed",s.finishedAt=this.now().toISOString(),s.reason=a.reason,s.hint=a.hint,this.emit("task.failed",{id:e,...a})}failActive(e){let r=t(e),a=[...this.phases].reverse().find(e=>"running"===e.status);if(!a)return;let s=[...a.tasks].reverse().find(e=>"running"===e.status);s&&(s.status="failed",s.finishedAt=this.now().toISOString(),s.reason=r.reason,s.hint=r.hint,this.emit("task.failed",{id:s.id,...r})),this.phaseFail(a.id,r)}detail(e){let t=(e.fields??[]).map(([e,t])=>r(e,t)),a={id:String(this.nextDetailId),timestamp:this.now().toISOString(),title:e.title,technicalName:e.technicalName,fields:t.map(([e,t])=>[e,function(e){let t;if("string"==typeof e)t=e;else if(void 0===e)t="-";else try{t=JSON.stringify(e)}catch{t=String(e)}let r=t.replace(/\s+/g," ").trim();return r.length<=500?r:`${r.slice(0,499)}…`}(t)])};this.nextDetailId+=1,this.details.push(a),this.details.length>100&&this.details.splice(0,this.details.length-100),this.emit("detail",a)}updateRun(e){void 0!==e.totalCases&&(this.totalCases=e.totalCases);let t={...e,cases:e.cases?.map(e=>({...e,intent:e.label}))};t.cases&&(this.cases=t.cases.map(e=>({...e}))),this.emit("run.updated",t)}stop(){}snapshot(){let e=this.caseSnapshots(),t=e.filter(e=>["passed","failed","stopped"].includes(e.status)),r=e.filter(e=>"passed"===e.status).length,a=this.finishedAt?new Date(this.finishedAt).getTime():this.now().getTime();return{runId:this.runId,skillName:this.skillName,outputDir:this.outputDir,status:this.status,startedAt:this.startedAt,finishedAt:this.finishedAt,elapsedMs:Math.max(0,a-new Date(this.startedAt).getTime()),error:this.error?{...this.error}:void 0,sequence:this.sequence,totalCases:this.totalCases,completedCases:t.length,passedCases:r,progress:this.progress(e),phases:this.phases.map(v),cases:e,details:this.details.map(b),reportAvailable:!!this.report,reportSummary:this.report?{...this.report.summary}:void 0}}eventsAfter(e){return 0===this.events.length||e>=this.sequence?[]:e<(this.events[0]?.sequence??this.sequence)-1?void 0:this.events.filter(t=>t.sequence>e).map(y)}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}emit(e,t){let r={sequence:++this.sequence,timestamp:this.now().toISOString(),type:e,payload:t&&"object"==typeof t?structuredClone(t):t};for(let e of(this.events.push(r),this.events.length>2e3&&this.events.splice(0,this.events.length-2e3),this.listeners))e(y(r))}caseSnapshots(){let e=new Map(this.phases.flatMap(e=>e.tasks).filter(e=>e.id.startsWith("rollout:")).map(e=>[e.id.slice(8),e]));return this.cases.map(t=>{let r=e.get(t.id);if(!r)return{...t,status:"stopped"===this.status?"stopped":"waiting"};if("failed"===r.status)return{...t,status:"failed",summary:r.reason};if("stopped"===r.status)return{...t,status:"stopped",summary:"Evaluation stopped"};if("done"===r.status){let e=r.summary?.startsWith("PASS")??!1;return{...t,status:e?"passed":"failed",summary:r.summary}}return{...t,status:"scorer"===r.technicalName?"scoring":"running",summary:r.label}})}progress(e){let t=0;for(let[r,a]of Object.entries({preflight:5,analysis:20,"case-generation":15,rollout:50,veto:5,report:5})){let s=this.phases.find(e=>e.id===r);if(s?.status==="done")t+=a;else if("rollout"===r&&(s?.status==="running"||s?.status==="stopped")){let r=e.filter(e=>["passed","failed"].includes(e.status)).length;t+=this.totalCases>0?a*(r/this.totalCases):0}}return Math.max(0,Math.min(100,Math.round(t)))}requirePhase(e){let t=this.phases.find(t=>t.id===e);if(!t)throw Error(`progress phase not found: ${e}`);return t}requireTask(e){let t=this.phases.flatMap(e=>e.tasks).find(t=>t.id===e);if(!t)throw Error(`progress task not found: ${e}`);return t}}function v(e){return{...e,tasks:e.tasks.map(e=>({...e,metadata:void 0===e.metadata?void 0:structuredClone(e.metadata)}))}}function b(e){return{...e,fields:e.fields.map(([e,t])=>[e,t])}}function y(e){return{...e,payload:e.payload&&"object"==typeof e.payload?structuredClone(e.payload):e.payload}}let x=e("node:crypto"),k=e("node:fs"),w=e("node:http"),S=e("node:path"),C=e("node:url"),I=new Set(["127.0.0.1","localhost","::1"]);async function T(e){var t,r,a;let s=function(e="127.0.0.1"){let t=e.trim().toLowerCase();if(!I.has(t))throw Error(`dbx eval server only accepts loopback hosts: ${[...I].join(", ")}`);return t}(e.host),i=function(e=0){if(!Number.isInteger(e)||e<0||e>65535)throw Error(`Invalid eval server port: ${e}`);return e}(e.port),o=e.controlToken??(0,x.randomBytes)(24).toString("hex"),l=function(e=15e3){if(!Number.isFinite(e)||!Number.isInteger(e)||e<1||e>3e4)throw Error(`Invalid eval server heartbeat interval: ${e}. Expected 1-30000ms.`);return e}(e.heartbeatIntervalMs);(0,k.mkdirSync)(e.outputDir,{recursive:!0});let c=(0,k.realpathSync)(e.outputDir),d=new Set,p=(0,x.randomBytes)(18).toString("base64"),u=e.openDirectory??(e=>n(e)),m=(0,w.createServer)((t,r)=>{A({request:t,response:r,hub:e.hub,outputRoot:c,controlToken:o,nonce:p,clients:d,heartbeatIntervalMs:l,onStop:e.onStop,openDirectory:u}).catch(e=>{r.headersSent?r.end():_(r,500,{error:e instanceof Error?e.message:String(e)})})});await (t=m,r=i,a=s,new Promise((e,s)=>{function n(e){t.removeListener("listening",i),s(e)}function i(){t.removeListener("error",n),e()}t.once("error",n),t.once("listening",i),t.listen(r,a)}));let h=m.address();if(!h||"string"==typeof h)throw await R(m),Error("Eval server did not expose a TCP address");let f="127.0.0.1"===s||"localhost"===s?"localhost":`[${h.address}]`;return{url:`http://${f}:${h.port}`,host:s,port:h.port,controlToken:o,async close(){for(let e of d)e.end();d.clear(),await R(m)}}}async function A(e){let{request:t,response:r,hub:a,outputRoot:s,controlToken:n,nonce:i,clients:o,heartbeatIntervalMs:l,onStop:c,openDirectory:d}=e,p=new URL(t.url??"/","http://localhost"),u=p.pathname;if("GET"===t.method&&"/"===u){var m,h;let e,t=(e=JSON.stringify((m={controlToken:n,nonce:i}).controlToken),`<!doctype html>
2
2
  <html lang="zh-CN">
3
3
  <head>
4
4
  <meta charset="utf-8">
package/dist/skill.js CHANGED
@@ -1 +1 @@
1
- import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import"./9635.js";import{version_version as e,runCommand as l,command_Command as o,option_Option as s,collectChoiceValues as r}from"./2168.js";import{updateDbxConfigSkills as i}from"./dbx.js";import{selectInitAgents as n,INIT_AGENT_IDS as a}from"./prompts.js";import{installSkillsToRoots as _,listBundledSkills as c}from"./skills~2.js";import{scanInstalledSkillRoots as S}from"./scan.js";import{SUPPORTED_AGENTS as g}from"./skills~1.js";let k=t("node:path"),p="dbx-eval",d={listBundledSkills:c,scanInstalledSkillRoots:S,installSkillsToRoots:_,updateDbxConfigSkills:i,selectAgents:n,isInteractive:()=>!!process.stdin.isTTY&&!!process.stderr.isTTY};async function f(t,l,o=d){var s,r,i;let n=(0,k.resolve)(t.projectPath),a=o.listBundledSkills();a.includes(p)||l.error(`当前 CLI 未打包 ${p} Skill,无法补装。请升级或重新安装 dbx CLI。`);let _=o.scanInstalledSkillRoots(n,a),c=_.length>0,S=c?(s=_,r=t,i=l,r.agent.length>0&&i.warn("检测到已初始化的 Skill 目录,将向全部已发现目录补装 dbx-eval;--agent 不生效。"),{targetRoots:s,skillNames:[p]}):await m(n,t,l,o),g=await o.installSkillsToRoots({targetRoots:S.targetRoots,skillNames:S.skillNames,cwd:n,cliVersion:e,yes:t.yes});return o.updateDbxConfigSkills(n,g.skillNames,{source:"bundled",skillsVersion:g.skillsVersion,cliVersion:e}),function(t,e){if(t.json)return;let l="backfill"===e.branch?`已为存量项目补装 ${p}`:"已完成 Skill 初始化";for(let o of(t.log(l),t.log(`project: ${e.projectPath}`),t.log(`skills: ${e.skillNames.join(", ")}`),t.log("targets:"),e.targetRoots))t.log(` - ${o}`)}(l,{projectPath:n,branch:c?"backfill":"first-install",targetRoots:S.targetRoots,skillNames:g.skillNames}),{success:!0,branch:c?"backfill":"first-install",project_path:n,target_roots:S.targetRoots,skills:g.skillNames,skills_version:g.skillsVersion,hosted_root:g.hostedRoot}}async function m(t,e,l,o){let s,r=function(t){let e=Array.from(new Set(t.map(t=>t.trim()).filter(Boolean)));if(0===e.length)return;let l=new Set(a),o=e.filter(t=>!l.has(t));if(o.length>0)throw Error(`不支持的 Agent: ${o.join(", ")}。支持: ${a.join(", ")}。`);return u(e)}(e.agent);return r?s=r:o.isInteractive()?s=u(await o.selectAgents()):l.error("当前项目尚未初始化 Skill,且处于非交互环境。请通过 --agent <id> 指定目标 Agent。"),{targetRoots:s.map(t=>{let e=g.find(e=>e.id===t);return e?.projectPath??""})}}function u(t){return Array.from(new Set(["universal",...t]))}export default function(){return new o("skill").description("为存量项目补装 dbx-eval Skill;未初始化时按选择的 Agent 安装全部内置 Skills").option("--project-path <path>","dbx project path",".").addOption(new s("--agent <agent>","未初始化项目要安装的 Agent,可重复传入;universal 会自动包含").default([]).argParser(r(a))).option("-y, --yes","允许覆盖已有非软链 Skill 目录;覆盖前会自动备份",!1).action(async(t,e)=>l(e,e=>f(t,e)))};export{f as executeEvalSkill};
1
+ import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import"./7945.js";import{version_version as e,runCommand as l,command_Command as o,option_Option as r,collectChoiceValues as s}from"./2168.js";import{selectInitAgents as i,INIT_AGENT_IDS as n}from"./prompts.js";import{installSkillsToRoots as a,SUPPORTED_AGENTS as c,listBundledSkills as _}from"./skills~1.js";import{scanInstalledSkillRoots as g}from"./scan.js";let k=t("node:path"),p="dbx-eval",S={listBundledSkills:_,scanInstalledSkillRoots:g,installSkillsToRoots:a,selectAgents:i,isInteractive:()=>!!process.stdin.isTTY&&!!process.stderr.isTTY};async function d(t,l,o=S){var r,s,i;let n=(0,k.resolve)(t.projectPath),a=o.listBundledSkills();a.includes(p)||l.error(`当前 CLI 未打包 ${p} Skill,无法补装。请升级或重新安装 dbx CLI。`);let c=o.scanInstalledSkillRoots(n,a),_=c.length>0,g=_?(r=c,s=t,i=l,s.agent.length>0&&i.warn("检测到已初始化的 Skill 目录,将向全部已发现目录补装 dbx-eval;--agent 不生效。"),{targetRoots:r,skillNames:[p]}):await f(n,t,l,o),m=await o.installSkillsToRoots({targetRoots:g.targetRoots,skillNames:g.skillNames,cwd:n,cliVersion:e,yes:t.yes});return function(t,e){if(t.json)return;let l="backfill"===e.branch?`已为存量项目补装 ${p}`:"已完成 Skill 初始化";for(let o of(t.log(l),t.log(`project: ${e.projectPath}`),t.log(`skills: ${e.skillNames.join(", ")}`),t.log("targets:"),e.targetRoots))t.log(` - ${o}`)}(l,{projectPath:n,branch:_?"backfill":"first-install",targetRoots:g.targetRoots,skillNames:m.skillNames}),{success:!0,branch:_?"backfill":"first-install",project_path:n,target_roots:g.targetRoots,skills:m.skillNames,skills_version:m.skillsVersion,hosted_root:m.hostedRoot}}async function f(t,e,l,o){let r,s=function(t){let e=Array.from(new Set(t.map(t=>t.trim()).filter(Boolean)));if(0===e.length)return;let l=new Set(n),o=e.filter(t=>!l.has(t));if(o.length>0)throw Error(`不支持的 Agent: ${o.join(", ")}。支持: ${n.join(", ")}。`);return m(e)}(e.agent);return s?r=s:o.isInteractive()?r=m(await o.selectAgents()):l.error("当前项目尚未初始化 Skill,且处于非交互环境。请通过 --agent <id> 指定目标 Agent。"),{targetRoots:r.map(t=>{let e=c.find(e=>e.id===t);return e?.projectPath??""})}}function m(t){return Array.from(new Set(["universal",...t]))}export default function(){return new o("skill").description("为存量项目补装 dbx-eval Skill;未初始化时按选择的 Agent 安装全部内置 Skills").option("--project-path <path>","dbx project path",".").addOption(new r("--agent <agent>","未初始化项目要安装的 Agent,可重复传入;universal 会自动包含").default([]).argParser(s(n))).option("-y, --yes","允许覆盖已有非软链 Skill 目录;覆盖前会自动备份",!1).action(async(t,e)=>l(e,e=>d(t,e)))};export{d as executeEvalSkill};
package/dist/skills.js CHANGED
@@ -1 +1 @@
1
- import"node:module";import{__webpack_require__ as s}from"./rslib-runtime.js";import"./9635.js";import{version_version as o,command_Command as r,runCommand as l}from"./2168.js";import{updateDbxConfigSkills as t,readDbxConfig as e}from"./dbx.js";import{installSkillsToRoots as i,listBundledSkills as _}from"./skills~2.js";import{scanInstalledSkillRoots as n}from"./scan.js";import{SUPPORTED_AGENTS as m}from"./skills~1.js";let a=s("node:fs");async function c(s){let o=process.cwd();if(!a.existsSync(".dbx/config.json"))return;let r=e(o),l=_(),c=m.find(s=>s.host===r.host),S=await i({targetRoots:[".agents/skills/",...c?[c.projectPath]:[],...n(o,l)],cwd:o,cliVersion:s,yes:!0});return t(o,S.skillNames,{source:"bundled",skillsVersion:S.skillsVersion,cliVersion:s}),S}export default function(){return new r("skills").description("管理内置开发 skills").addCommand(new r("sync").description("同步内置开发 skills").action(async(s,r)=>l(r,async s=>{let r=await c(o);return r?r.skillNames.length?(s.log(`已同步 ${r.skillNames.length} 个内置开发 skill。`),{skills:r.skillNames}):s.error("未找到内置开发 Skill。"):s.error("当前目录不是 dbx 项目。")})))};export{c as syncProjectSkills};
1
+ import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./7945.js";import{runCommand as t,version_version as r,command_Command as s,isRecord as l}from"./2168.js";import{installSkillsToRoots as o,SUPPORTED_AGENTS as n,listBundledSkills as i}from"./skills~1.js";import{scanInstalledSkillRoots as _}from"./scan.js";import{findProjectRoot as c}from"./project-layout.js";var a={};e.r(a),e.d(a,{default:()=>d,syncProjectSkills:()=>f});let m=e("node:fs"),S=e("node:path");function d(){return new s("skills").description("管理内置开发 skills").addCommand(new s("sync").description("同步内置开发 skills").action(async(e,s)=>t(s,async e=>{let t=await f(r);return t?t.skillNames.length?(e.log(`已同步 ${t.skillNames.length} 个内置开发 skill。`),{skills:t.skillNames}):e.error("未找到内置开发 Skill。"):e.error("当前目录不是 dbx 项目。")})))}async function f(e){let t=c(process.cwd());if(!t)return;let r=function(e){let t=S.resolve(e,".dbx","config.json");if(!m.existsSync(t))return{};let r=JSON.parse(m.readFileSync(t,"utf8"));return l(r)?r:{}}(t),s=i(),a=n.find(e=>e.host===r.host);return o({targetRoots:[".agents/skills/",...a?[a.projectPath]:[],..._(t,s)],cwd:t,cliVersion:e,yes:!0})}export{a as skills_namespaceObject,f as syncProjectSkills};
package/dist/skills~1.js CHANGED
@@ -1 +1,2 @@
1
- import"node:module";let l=[{id:"universal",host:"universal",name:"Universal",installPath:".agents/skills/",projectPath:".agents/skills/",globalPath:"~/.agents/skills/"},{id:"claude-code",host:"claude",name:"Claude Code",installPath:".claude/skills/",projectPath:".claude/skills/",globalPath:"~/.claude/skills/"},{id:"coco",host:"coco",name:"Coco",installPath:".coco/skills/",projectPath:".coco/skills/",globalPath:"~/.coco/skills/"},{id:"codex",host:"codex",name:"Codex",installPath:".agents/skills/",projectPath:".codex/skills/",globalPath:"~/.codex/skills/"},{id:"trae",host:"trae",name:"TRAE",installPath:".trae/skills/",projectPath:".trae/skills/",globalPath:"~/.trae/skills/"},{id:"cursor",host:"cursor",name:"Cursor",installPath:".agents/skills/",projectPath:".agents/skills/",globalPath:"~/.cursor/skills/"}];export{l as SUPPORTED_AGENTS};
1
+ import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./7945.js";let t=[{id:"universal",host:"universal",name:"Universal",installPath:".agents/skills/",projectPath:".agents/skills/",globalPath:"~/.agents/skills/"},{id:"claude-code",host:"claude",name:"Claude Code",installPath:".claude/skills/",projectPath:".claude/skills/",globalPath:"~/.claude/skills/"},{id:"coco",host:"coco",name:"Coco",installPath:".coco/skills/",projectPath:".coco/skills/",globalPath:"~/.coco/skills/"},{id:"codex",host:"codex",name:"Codex",installPath:".agents/skills/",projectPath:".codex/skills/",globalPath:"~/.codex/skills/"},{id:"trae",host:"trae",name:"TRAE",installPath:".trae/skills/",projectPath:".trae/skills/",globalPath:"~/.trae/skills/"},{id:"cursor",host:"cursor",name:"Cursor",installPath:".agents/skills/",projectPath:".agents/skills/",globalPath:"~/.cursor/skills/"}],l=e("node:path");var r=e.n(l);let n=e("node:url"),i=r().dirname((0,n.fileURLToPath)(import.meta.url)),s=r().resolve(i,"../skills"),o=e("node:fs"),a=e("node:os");class c extends Error{cause;constructor(e,t){let l=t?`
2
+ 原因: ${t.message}`:"";super(`${e}${l}`),this.cause=t,this.name="SkillsInstallError"}}let u=".dbx",h="skills";function d(){return o.existsSync(s)?o.readdirSync(s).filter(e=>{let t=l.join(s,e);return o.statSync(t).isDirectory()&&o.existsSync(l.join(t,"SKILL.md"))}).sort():[]}function f(e){let t,r,n,i=(t=j(e),r=l.join(a.homedir(),u,h,"versions",j(e)),0===(n=d()).length||y(s,r),{skillNames:n,bundledRoot:s,hostedRoot:r,skillsVersion:t}),o=l.join(a.homedir(),u,h,"current");return i.skillNames.length>0&&y(i.hostedRoot,o),{...i,currentRoot:o}}async function S(e){let{agents:l,...r}=e;if(0===l.length)throw Error("至少需要选择一个 Agent");let n=[];for(let e of l){let l=t.find(t=>t.id===e);l&&n.push(l.projectPath)}return k({targetRoots:n,...r})}async function k(e){var t,r,n,i,s;let d,S,k,y,{targetRoots:j,skillNames:v,cwd:b,cliVersion:w,yes:E=!1,onDiscovered:$,onSkillDone:x}=e,{skillNames:_,bundledRoot:C,hostedRoot:A,currentRoot:R,skillsVersion:N}=f(w),T=function(e,t){if(!t)return e;let l=new Set(e),r=Array.from(new Set(t)),n=r.filter(e=>!l.has(e));if(n.length>0)throw Error(`请求安装的 Skill 不在当前 CLI 内置列表中: ${n.join(", ")}。可用: ${e.join(", ")}。`);return r}(_,v);$?.(T);let L=l.resolve(b??"."),K=m(j.map(e=>l.isAbsolute(e)?e:l.join(L,e))),U=[];for(let e of T)try{let i=l.join(R,e);for(let s of K){let c=l.join(s,e);t=i,r=c,n=E,o.mkdirSync(l.dirname(r),{recursive:!0}),function(e,t,r){let n=P(t);if(!n)return;if(n.isSymbolicLink()){if(function(e,t){try{return o.realpathSync(e)!==o.realpathSync(t)}catch{return!1}}(e,t)&&!r&&!function(e){try{let t=l.join(a.homedir(),u,h,"versions"),r=o.readlinkSync(e),n=l.isAbsolute(r)?r:l.resolve(l.dirname(e),r);if(g(t,n,e))return!0;let i=o.realpathSync(e),s=o.realpathSync(t);return g(s,i,e)}catch{return!1}}(t))throw Error(`目标 Skill 软链已存在但指向其他位置: ${t}。如需替换,请添加 --yes。`);o.unlinkSync(t);return}if(!r)throw Error(`目标 Skill 已存在且不是软链: ${t}。如需覆盖,请添加 --yes,现有目录会被备份后替换。`);let i=function(e){let t=new Date().toISOString().replace(/[-:]/g,"").replace(/\..+$/,"").replace("T","-"),l=`${e}.bak-${t}`,r=l,n=1;for(;o.existsSync(r);)r=`${l}-${n}`,n+=1;return r}(t);o.renameSync(t,i)}(t,r,n),p(t,r)}x?.(e,!0)}catch(t){U.push(t),x?.(e,!1)}if(U.length>0)throw new c("内置 Skills 安装失败",U[0]);return i=L,s=T,d=l.join(i,".gitignore"),(y=[...k=(S=o.existsSync(d)?o.readFileSync(d,"utf8"):"")?S.split(/\r?\n/):[],...s.map(e=>`/**/skills/${e}`).filter(e=>!k.includes(e))].join("\n"))!==S&&o.writeFileSync(d,y),{skillNames:T,bundledRoot:C,hostedRoot:A,currentRoot:R,skillsVersion:N}}function m(e){let t=new Set,r=new Set,n=[];for(let i of e){let e,s=l.resolve(i);if(!t.has(s)){t.add(s);try{e=o.realpathSync(s)}catch{e=void 0}if(void 0!==e){if(r.has(e))continue;r.add(e)}n.push(s)}}return n}function y(e,t){let r=P(t);r?.isSymbolicLink()?o.unlinkSync(t):r&&o.rmSync(t,{recursive:!0,force:!0}),o.mkdirSync(l.dirname(t),{recursive:!0}),p(e,t)}function p(e,t){let l="win32"===process.platform?"junction":"dir";o.symlinkSync(e,t,l)}function g(e,t,r){let n=l.relative(e,t);if(!n||n.startsWith("..")||l.isAbsolute(n))return!1;let i=n.split(l.sep);return 2===i.length&&i[0].length>0&&i[1]===l.basename(r)}function P(e){try{return o.lstatSync(e)}catch(e){if("ENOENT"===e.code)return;throw e}}function j(e){let t=e.trim();if(!t)throw Error("cliVersion 不能为空");return t.replace(/[\\/]/g,"_")}export{t as SUPPORTED_AGENTS,m as dedupeRoots,S as installSkills,k as installSkillsToRoots,d as listBundledSkills,f as refreshCurrentSkills};
@@ -0,0 +1 @@
1
+ (async function(){await navigator.serviceWorker.register("/__webview/sw.js",{scope:"/"}),await navigator.serviceWorker.ready,navigator.serviceWorker.controller||await new Promise(e=>{navigator.serviceWorker.addEventListener("controllerchange",()=>e(),{once:!0})}),location.replace(`/__webview/page${location.search}`)})().catch(e=>{document.body.textContent=`WebView 启动失败: ${String(e)}`});
@@ -1 +1 @@
1
- let e=document.currentScript;if(!(e instanceof HTMLScriptElement))throw Error("web-view proxy client must run from a script element");let t=new URL(e.src).searchParams,r=t.get("mobileUserAgent"),i=t.get("originalPath");if(!r||null===i)throw Error("web-view proxy client configuration is missing");if(window!==window.parent){try{history.replaceState(null,"",i)}catch{}try{Object.defineProperty(Navigator.prototype,"userAgent",{get:()=>r,configurable:!0}),Object.defineProperty(Navigator.prototype,"platform",{get:()=>"iPhone",configurable:!0})}catch{}"AppletBridgeModule"in window||Object.defineProperty(window,"AppletBridgeModule",{configurable:!0,writable:!0,value:{postMessage(o){let n="string"==typeof o?o:JSON.stringify(o);try{window.parent.postMessage(n,"*")}catch{}return Promise.resolve({})},postMessageSync:()=>void 0}})}
1
+ (()=>{let e=document.currentScript;if(!(e instanceof HTMLScriptElement))throw Error("web-view proxy client must run from a script element");let t=new URL(e.src).searchParams,o=t.get("mobileUserAgent"),i=t.get("originalPath"),r=t.get("parentOrigin");if(!o||null===i||!r)throw Error("web-view proxy client configuration is missing");if(window!==window.parent){window.addEventListener("message",e=>{if(e.source===window.parent&&e.origin===r&&e.data&&"object"==typeof e.data)if("__doubao_web_view_eval__"===e.data.type&&"string"==typeof e.data.code)try{window.eval(e.data.code)}catch{}else"__doubao_web_view_message__"===e.data.type&&"string"==typeof e.data.payload&&window.onWebViewMessage?.(e.data.payload)}),window.addEventListener("load",()=>{window.parent.postMessage(JSON.stringify({type:"__doubao_web_view_set_title__",title:document.title||""}),r)},{once:!0});try{history.replaceState(null,"",i)}catch{}try{Object.defineProperty(Navigator.prototype,"userAgent",{get:()=>o,configurable:!0}),Object.defineProperty(Navigator.prototype,"platform",{get:()=>"iPhone",configurable:!0})}catch{}"AppletBridgeModule"in window||Object.defineProperty(window,"AppletBridgeModule",{configurable:!0,writable:!0,value:{postMessage(e){let t="string"==typeof e?e:JSON.stringify(e);try{window.parent.postMessage(t,r)}catch{}return Promise.resolve({})},postMessageSync:()=>void 0}})}})();
@@ -1 +1 @@
1
- !function(t){let e="doubao-web-view-states-v2",n=t.location.pathname.slice(0,-6),i=`${n}/page`,a=`${n}/runtime`;function o(e){return new Request(`${t.location.origin}${n}/client/${encodeURIComponent(e)}`)}async function r(n,i){let a=await t.caches.open(e);await a.put(o(n),new Response(JSON.stringify(i)))}async function s(n){let i=await t.caches.open(e),a=await i.match(o(n));if(a)return JSON.parse(await a.text())}function c(t){return new Response(t.body,{headers:t.headers,status:t.status,statusText:t.statusText})}async function l(e,n,i,a=n){let o=[e.clientId,e.resultingClientId].filter(Boolean),s=await t.fetch(i??e.request),u=s.headers.get("x-doubao-web-view-target")??n;return await Promise.all(o.map(t=>r(t,{src:a,target:u}))),c(s)}async function u(e){let{request:o}=e,r=await s(e.clientId);if(!r)return t.fetch(o);let u=new URL(r.src),d=new URL(o.url);if(d.origin===t.location.origin&&d.pathname.startsWith(`${n}/`))return t.fetch(o);let h=d.origin===t.location.origin?new URL(d.pathname+d.search,r.target):d;if(d.origin===t.location.origin&&h.protocol===t.location.protocol&&(h.protocol=u.protocol),"navigate"===o.mode&&"GET"===o.method){let n=new URL(i,t.location.origin);return n.searchParams.set("url",h.toString()),l(e,h.toString(),n,r.src)}let g=new URL(a,t.location.origin);g.searchParams.set("url",h.toString());let w={credentials:"omit",headers:o.headers,method:o.method,redirect:o.redirect};return"GET"!==o.method&&"HEAD"!==o.method&&(w.body=await o.clone().blob()),c(await t.fetch(g,w))}t.addEventListener("install",e=>e.waitUntil(t.skipWaiting())),t.addEventListener("activate",e=>e.waitUntil(t.clients.claim())),t.addEventListener("fetch",e=>{let n=new URL(e.request.url);if("navigate"===e.request.mode&&n.origin===t.location.origin&&n.pathname===i){let t=n.searchParams.get("url");t&&e.respondWith(l(e,t));return}e.clientId&&e.respondWith(u(e))})}(globalThis);
1
+ !function(t){let e="doubao-web-view-states-v2",i=t.location.pathname.slice(0,-6),n=`${i}/page`,a=`${i}/runtime`;function r(e){return new Request(`${t.location.origin}${i}/client/${encodeURIComponent(e)}`)}async function o(i,n){let a=await t.caches.open(e);await a.put(r(i),new Response(JSON.stringify(n)))}async function s(i){let n=await t.caches.open(e),a=await n.match(r(i));if(a)return JSON.parse(await a.text())}function c(t){return new Response(t.body,{headers:t.headers,status:t.status,statusText:t.statusText})}async function l(e,i,n,a=i){let r=[e.clientId,e.resultingClientId].filter(Boolean),s=await t.fetch(n??e.request),u=s.headers.get("x-doubao-web-view-target")??i;return await Promise.all(r.map(t=>o(t,{src:a,target:u,parentOrigin:s.headers.get("x-doubao-web-view-parent-origin")??void 0}))),c(s)}async function u(e){let{request:r}=e,o=await s(e.clientId);if(!o)return t.fetch(r);let u=new URL(o.src),d=new URL(r.url);if(d.origin===t.location.origin&&d.pathname.startsWith(`${i}/`))return t.fetch(r);let g=d.origin===t.location.origin?new URL(d.pathname+d.search,o.target):d;if(d.origin===t.location.origin&&g.protocol===t.location.protocol&&(g.protocol=u.protocol),"navigate"===r.mode&&"GET"===r.method){let i=new URL(n,t.location.origin);return i.searchParams.set("url",g.toString()),o.parentOrigin&&i.searchParams.set("parentOrigin",o.parentOrigin),l(e,g.toString(),i,o.src)}let h=new URL(a,t.location.origin);h.searchParams.set("url",g.toString());let w={credentials:"omit",headers:r.headers,method:r.method,redirect:r.redirect};return"GET"!==r.method&&"HEAD"!==r.method&&(w.body=await r.clone().blob()),c(await t.fetch(h,w))}t.addEventListener("install",e=>e.waitUntil(t.skipWaiting())),t.addEventListener("activate",e=>e.waitUntil(t.clients.claim())),t.addEventListener("fetch",e=>{let i=new URL(e.request.url);if("navigate"===e.request.mode&&i.origin===t.location.origin&&i.pathname===n){let t=i.searchParams.get("url");t&&e.respondWith(l(e,t));return}e.clientId&&e.respondWith(u(e))})}(globalThis);
package/dist/status~1.js CHANGED
@@ -1,2 +1,2 @@
1
- import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import{promises_namespaceObject as r}from"./9635.js";import{getMiniAppVersionArtifact as e}from"./app.js";import{CliError as i,getLastHttpResponseLogId as a}from"./2168.js";import{resolveAppKey as o}from"./workspace.js";import{miniAppDetailUrl as n,miniAppVersionDetailUrl as s}from"./portal.js";let _=t("node:fs"),u=t("node:os"),f=t("node:path"),d={1:{name:"PENDING_BUILD",description:"Waiting for cloud build to start"},2:{name:"BUILD_STARTED",description:"Cloud build has started"},3:{name:"CODE_READY",description:"Source package is ready"},4:{name:"COMPILING",description:"Compiling frontend code"},5:{name:"COMPILE_SUCCEEDED",description:"Compilation succeeded; waiting for upload or final packaging"},6:{name:"UPLOADING",description:"Uploading build output"},7:{name:"BUILD_SUCCEEDED",description:"Cloud build succeeded"},8:{name:"BUILD_FAILED",description:"Cloud build failed"}};async function l(t,r,e=g,i=m){let a=o(r.project,r.appId);t.targetAppId=a;let n=r.poll?await i(a,r.versionTag,r.timeoutSeconds,r.intervalSeconds):await e(a,r.versionTag,0),s=$(n),_=C(n);if(t.log(`artifact status: ${s.status}`),"number"==typeof s.artifact_status?t.log(`artifact_status: ${s.artifact_status} (${s.artifact_status_name})`):t.log("artifact_status: unknown"),t.log(`status_description: ${s.artifact_status_description}`),t.log(`app_id: ${s.app_id}`),t.log(`version_tag: ${s.version_tag}`),p(t,n),c(t,n),_)throw S(`artifact build failed: ${_}`,s);return s}function c(t,r){let e=C(r);if(e)for(let i of(t.log(`failure_reason: ${e}`),function(t,r){if(!t)return[];let e=[];if(t.error_code&&e.push(`error_code: ${t.error_code}`),r?(e.push(`error_info_file: ${r}`),e.push("error_info: written to temporary file for agent diagnosis")):t.error_info&&e.push(`error_info: ${t.error_info}`),"number"==typeof t.last_status_before_failed){let r=b(t.last_status_before_failed);e.push(`last_status_before_failed: ${t.last_status_before_failed} (${r.name})`),e.push(`last_status_description: ${r.description}`)}return e}(r.artifact_build_error_info,r.error_info_file)))t.log(i)}function p(t,r){"succeeded"===r.status&&(t.log("后续调试指引:"),t.log(`1. 打开版本详情页查看真机调试二维码: ${r.version_detail_url}`),t.log(`2. 扫码前,先将豆包 UID 加入当前应用的调试白名单: ${r.app_detail_url} 的「体验白名单」部分。`),t.log("3. 在豆包 App 中打开调试对话。"),t.log(`4. 如果是首次调试,在手机浏览器中打开 ${r.doubao_debug_conversation_url},会自动调起豆包 App 并打开调试会话。`))}async function g(t,r,i){var o,d,l,c;let p,g,m,$=await e(t,r),C=$.data,S=b(C?.artifact_status),w=(o=C,8===(p=o?.artifact_status)||o?.artifact_build_error_info?"failed":7===p?"succeeded":1===p?"queued":"number"==typeof p&&p>=2&&p<=6?"building":"unknown"),A="failed"===w&&C?.artifact_build_error_info?.error_info?(d=t,l=C?.version_tag||r,c=C.artifact_build_error_info.error_info,g=(0,f.join)((0,u.tmpdir)(),"dbx-artifact-build-errors"),(0,_.mkdirSync)(g,{recursive:!0}),m=(0,f.join)(g,`${D(d)}-${D(l)}-${Date.now()}-${process.pid}.log`),(0,_.writeFileSync)(m,c.endsWith("\n")?c:`${c}
1
+ import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import{external_node_timers_promises_namespaceObject as r}from"./7945.js";import{getMiniAppVersionArtifact as e}from"./app.js";import{CliError as i,getLastHttpResponseLogId as a}from"./2168.js";import{resolveAppKey as o}from"./workspace.js";import{miniAppDetailUrl as n,miniAppVersionDetailUrl as s}from"./portal.js";let _=t("node:fs"),u=t("node:os"),f=t("node:path"),d={1:{name:"PENDING_BUILD",description:"Waiting for cloud build to start"},2:{name:"BUILD_STARTED",description:"Cloud build has started"},3:{name:"CODE_READY",description:"Source package is ready"},4:{name:"COMPILING",description:"Compiling frontend code"},5:{name:"COMPILE_SUCCEEDED",description:"Compilation succeeded; waiting for upload or final packaging"},6:{name:"UPLOADING",description:"Uploading build output"},7:{name:"BUILD_SUCCEEDED",description:"Cloud build succeeded"},8:{name:"BUILD_FAILED",description:"Cloud build failed"}};async function l(t,r,e=g,i=m){let a=o(r.project,r.appId);t.targetAppId=a;let n=r.poll?await i(a,r.versionTag,r.timeoutSeconds,r.intervalSeconds):await e(a,r.versionTag,0),s=$(n),_=C(n);if(t.log(`artifact status: ${s.status}`),"number"==typeof s.artifact_status?t.log(`artifact_status: ${s.artifact_status} (${s.artifact_status_name})`):t.log("artifact_status: unknown"),t.log(`status_description: ${s.artifact_status_description}`),t.log(`app_id: ${s.app_id}`),t.log(`version_tag: ${s.version_tag}`),p(t,n),c(t,n),_)throw S(`artifact build failed: ${_}`,s);return s}function c(t,r){let e=C(r);if(e)for(let i of(t.log(`failure_reason: ${e}`),function(t,r){if(!t)return[];let e=[];if(t.error_code&&e.push(`error_code: ${t.error_code}`),r?(e.push(`error_info_file: ${r}`),e.push("error_info: written to temporary file for agent diagnosis")):t.error_info&&e.push(`error_info: ${t.error_info}`),"number"==typeof t.last_status_before_failed){let r=b(t.last_status_before_failed);e.push(`last_status_before_failed: ${t.last_status_before_failed} (${r.name})`),e.push(`last_status_description: ${r.description}`)}return e}(r.artifact_build_error_info,r.error_info_file)))t.log(i)}function p(t,r){"succeeded"===r.status&&(t.log("后续调试指引:"),t.log(`1. 打开版本详情页查看真机调试二维码: ${r.version_detail_url}`),t.log(`2. 扫码前,先将豆包 UID 加入当前应用的调试白名单: ${r.app_detail_url} 的「体验白名单」部分。`),t.log("3. 在豆包 App 中打开调试对话。"),t.log(`4. 如果是首次调试,在手机浏览器中打开 ${r.doubao_debug_conversation_url},会自动调起豆包 App 并打开调试会话。`))}async function g(t,r,i){var o,d,l,c;let p,g,m,$=await e(t,r),C=$.data,S=b(C?.artifact_status),w=(o=C,8===(p=o?.artifact_status)||o?.artifact_build_error_info?"failed":7===p?"succeeded":1===p?"queued":"number"==typeof p&&p>=2&&p<=6?"building":"unknown"),A="failed"===w&&C?.artifact_build_error_info?.error_info?(d=t,l=C?.version_tag||r,c=C.artifact_build_error_info.error_info,g=(0,f.join)((0,u.tmpdir)(),"dbx-artifact-build-errors"),(0,_.mkdirSync)(g,{recursive:!0}),m=(0,f.join)(g,`${D(d)}-${D(l)}-${Date.now()}-${process.pid}.log`),(0,_.writeFileSync)(m,c.endsWith("\n")?c:`${c}
2
2
  `,"utf8"),m):void 0,E=C?.artifact_build_error_info?function(t,r){if(!r)return t;let{error_info:e,...i}=t;return i}(C.artifact_build_error_info,!!A):void 0;return{app_id:t,version_tag:C?.version_tag||r,artifact_status:C?.artifact_status,artifact_status_name:S.name,artifact_status_description:S.description,status:w,...E?{artifact_build_error_info:E}:{},...A?{error_info_file:A}:{},attempt:i,..."succeeded"===w?{version_detail_url:s(t,C?.version_tag||r),app_detail_url:n(t),doubao_debug_conversation_url:"https://inhouse.doubao.com/bot/2xgttdEs"}:{},log_id:$.log_id??a()??""}}async function m(t,e,i,a=5,o=g){let n=Date.now(),s=0,_=await o(t,e,s);for(;"succeeded"!==_.status&&"failed"!==_.status;){if(Date.now()-n>=1e3*i)throw S("artifact build status polling timed out",$(_),"DBX_WAIT_TIMEOUT");await (0,r.setTimeout)(1e3*a),s+=1,_=await o(t,e,s)}return _}function b(t){return"number"!=typeof t?{name:"UNKNOWN",description:"No artifact status was returned by the server"}:d[t]??{name:"UNKNOWN",description:`Unrecognized artifact status ${t}`}}function $(t){return{...t,status:"succeeded"===t.status?"success":"queued"===t.status||"unknown"===t.status&&"number"==typeof t.artifact_status?"building":t.status}}function C(t){let r=t.artifact_build_error_info;if(r){var e,i;let a;return e=r,i=t.error_info_file,a=e.error_code||"artifact build failed",i?`${a}; error_info written to ${i}`:e.error_info?e.error_info:e.error_code?e.error_code:"number"==typeof e.last_status_before_failed?`artifact build failed after status ${e.last_status_before_failed}`:"artifact build failed"}let a=t.artifact_status;if(8===a){let t=b(a);return`artifact_status=${a} (${t.name})`}}function D(t){return t.trim().replace(/[^a-zA-Z0-9._-]+/g,"_")||"unknown"}function S(t,r,e="DBX_BUILD_FAILED"){return new i(t,{code:e,details:r,logId:a()})}export{c as logArtifactBuildFailure,p as logArtifactDebugInstructions,g as queryArtifactStatus,l as runArtifactsStatus,m as waitForArtifactStatus};
package/dist/stop.js CHANGED
@@ -1 +1 @@
1
- import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import"./9635.js";import{stopDevService as e,connectDevService as o,DEV_ACTIONS as r}from"./275.js";import{command_Command as s,runCommand as p}from"./2168.js";import{resolveProjectLayout as a}from"./project-layout.js";let i=t("node:path");async function n(t){let o=(0,i.resolve)(process.cwd()),r=a(o).frontendDirectory,s=await _(o,r);if(s)return t.log("dev service stopped"),t.log("status: stopping"),{status:"stopping",result:s};let p=await e({projectPath:o,appDir:r});return t.targetAppId=p?.appId,t.log("dev service stopped"),t.log(`status: ${p?.status??"stopped"}`),p??{status:"stopped"}}async function _(t,e){let s;try{return s=await o({projectPath:t,appDir:e,nodeIdPrefix:"dev-stop",requestTimeoutMs:5e3}),await s.call(r.stop)}catch{return}finally{await s?.stop().catch(()=>void 0)}}export default function(){return new s("stop").description("停止常驻 dev 调试服务").action(async(t,e)=>p(e,t=>n(t)))};
1
+ import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import"./7945.js";import{command_Command as o,runCommand as e}from"./2168.js";import{connectDevService as r,DEV_ACTIONS as _}from"./275.js";import{resolveProjectLayout as i}from"./project-layout.js";let n=t("node:path");async function a(t){let o=(0,n.resolve)(process.cwd()),e=i(o).frontendDirectory,r=await p(o,e);return t.log("dev service stopping"),{status:"stopping",result:r}}async function p(t,o){let e;try{return e=await r({projectPath:t,appDir:o,nodeIdPrefix:"dev-stop",requestTimeoutMs:5e3}),await e.call(_.stop)}finally{await e?.stop().catch(()=>void 0)}}export default function(){return new o("stop").description("停止常驻 dev 调试服务").action(async(t,o)=>e(o,t=>a(t)))};
package/dist/sync.js CHANGED
@@ -1 +1 @@
1
- import"node:module";import{__webpack_require__ as o}from"./rslib-runtime.js";import"./9635.js";import{CliUsageError as t,withCliErrorCode as n,runCommand as e,command_Command as _,CliError as i}from"./2168.js";import{resolveProjectAppId as r}from"./project.js";import{resolveProjectLayout as s}from"./project-layout.js";import{runBusinessTemplatesUpload as p}from"./build~1.js";let c=o("node:fs"),a="business-templates";async function f(o,e,_,l=p){let u=_?.trim();if(void 0!==_&&u!==a)throw new t(`unsupported config type ${JSON.stringify(u)}; supported types: ${a}`,"DBX_USAGE_ERROR",{allowed_types:[a]});let d=r(e);o.targetAppId=d;let g=s(e).businessTemplatesPath,y=await n("DBX_PROJECT_INVALID",async()=>(0,c.statSync)(g,{throwIfNoEntry:!1})?.isFile()??!1);if(u===a&&!y)throw new i(`business-templates configuration not found: ${g}`,{code:"DBX_PROJECT_INVALID"});if(!y)return o.log("no platform configuration found; nothing to sync"),{operation:"config.sync",app_id:d,synced_count:0,config_sync_results:[]};let m=await n("DBX_CONFIG_SYNC_FAILED",()=>l(o,d,{project:e,quiet:!0})),C={operation:"config.sync",app_id:d,synced_count:1,config_sync_results:[{config_type:a,scope:"app",state:"succeeded",rolled_back_with_version:!1,result:m.business_template_sync_result}],log_id:m.log_id};return o.log("platform configuration synced"),o.log(`config_type: ${a}`),o.log("platform configs are app-scoped and are not rolled back with app versions"),C}export default function(){return new _("sync").description("同步配置到开发者平台").argument("[config-type]",`配置类型,默认同步项目中找到的全部配置(目前支持 ${a})`).option("--project <path>","项目目录",".").action(async(o,t,n)=>e(n,n=>f(n,t.project,o)))};export{f as runConfigSync};
1
+ import"node:module";import{__webpack_require__ as o}from"./rslib-runtime.js";import"./7945.js";import{CliUsageError as t,withCliErrorCode as n,runCommand as e,command_Command as _,CliError as i}from"./2168.js";import{resolveProjectAppId as r}from"./project.js";import{resolveProjectLayout as s}from"./project-layout.js";import{runBusinessTemplatesUpload as p}from"./build~1.js";let c=o("node:fs"),a="business-templates";async function f(o,e,_,l=p){let u=_?.trim();if(void 0!==_&&u!==a)throw new t(`unsupported config type ${JSON.stringify(u)}; supported types: ${a}`,"DBX_USAGE_ERROR",{allowed_types:[a]});let d=r(e);o.targetAppId=d;let g=s(e).businessTemplatesPath,y=await n("DBX_PROJECT_INVALID",async()=>(0,c.statSync)(g,{throwIfNoEntry:!1})?.isFile()??!1);if(u===a&&!y)throw new i(`business-templates configuration not found: ${g}`,{code:"DBX_PROJECT_INVALID"});if(!y)return o.log("no platform configuration found; nothing to sync"),{operation:"config.sync",app_id:d,synced_count:0,config_sync_results:[]};let m=await n("DBX_CONFIG_SYNC_FAILED",()=>l(o,d,{project:e,quiet:!0})),C={operation:"config.sync",app_id:d,synced_count:1,config_sync_results:[{config_type:a,scope:"app",state:"succeeded",rolled_back_with_version:!1,result:m.business_template_sync_result}],log_id:m.log_id};return o.log("platform configuration synced"),o.log(`config_type: ${a}`),o.log("platform configs are app-scoped and are not rolled back with app versions"),C}export default function(){return new _("sync").description("同步配置到开发者平台").argument("[config-type]",`配置类型,默认同步项目中找到的全部配置(目前支持 ${a})`).option("--project <path>","项目目录",".").action(async(o,t,n)=>e(n,n=>f(n,t.project,o)))};export{f as runConfigSync};
@@ -32,7 +32,6 @@ Web 模拟器成功打开,即表示本地调试服务已启动。
32
32
  │ ├── pages/ # 独立页面
33
33
  │ └── widgets/ # 工具结果组件
34
34
  ├── package.json # 前端依赖和脚本
35
- ├── .dbx/config.json # DBX 项目配置
36
35
  └── AGENTS.md # Agent 开发引导
37
36
  ```
38
37
 
package/dist/update.js CHANGED
@@ -1 +1 @@
1
- import"node:module";import{execa as r,runtime_packageName as n,compareSemver as t,normalizeVersion as e,isValidSemver as a,writeUpdateCheckState as i}from"./2168.js";import{refreshCurrentSkills as o}from"./skills~2.js";let l={npmView:async n=>(await r("npm",["view",n,"version"],{env:process.env,stdio:["ignore","pipe","pipe"]})).stdout.trim(),async npmInstallGlobal(n){await r("npm",["install","-g",n],{env:process.env,stdio:"inherit"})},async npmAvailable(){try{return await r("npm",["--version"],{env:process.env,stdio:["ignore","ignore","ignore"]}),!0}catch{return!1}}};async function s(r,o=l){let p=e(await o.npmView(n)),u=e(r);if(!a(p))throw Error(`Invalid latest version from npm registry: ${p}`);if(!a(u))throw Error(`Invalid current version: ${r}`);return await i(p),{currentVersion:u,latestVersion:p,updateAvailable:t(p,u)>0}}async function p(r){let t=r.runner??l,e=await s(r.currentVersion,t);if(r.check)return{...e,action:e.updateAvailable?"check_update_available":"already_up_to_date"};if(!r.force&&!e.updateAvailable)return{...e,action:"already_up_to_date"};if(!await t.npmAvailable())throw Error(`npm not found in PATH. Install npm or update manually with npm install -g ${n}`);await t.npmInstallGlobal(`${n}@${e.latestVersion}`),await i(e.latestVersion);let a=function(r){try{return{skills:o(r)}}catch(r){return{skillsWarning:u(r)}}}(e.latestVersion);return{...e,action:"updated",...a}}function u(r){return r instanceof Error&&r.message?r.message:String(r)}export{u as formatError,p as updateCli};
1
+ import"node:module";import{execa as r,runtime_packageName as n,compareSemver as t,normalizeVersion as e,isValidSemver as a,writeUpdateCheckState as i}from"./2168.js";import{refreshCurrentSkills as o}from"./skills~1.js";let l={npmView:async n=>(await r("npm",["view",n,"version"],{env:process.env,stdio:["ignore","pipe","pipe"]})).stdout.trim(),async npmInstallGlobal(n){await r("npm",["install","-g",n],{env:process.env,stdio:"inherit"})},async npmAvailable(){try{return await r("npm",["--version"],{env:process.env,stdio:["ignore","ignore","ignore"]}),!0}catch{return!1}}};async function s(r,o=l){let p=e(await o.npmView(n)),u=e(r);if(!a(p))throw Error(`Invalid latest version from npm registry: ${p}`);if(!a(u))throw Error(`Invalid current version: ${r}`);return await i(p),{currentVersion:u,latestVersion:p,updateAvailable:t(p,u)>0}}async function p(r){let t=r.runner??l,e=await s(r.currentVersion,t);if(r.check)return{...e,action:e.updateAvailable?"check_update_available":"already_up_to_date"};if(!r.force&&!e.updateAvailable)return{...e,action:"already_up_to_date"};if(!await t.npmAvailable())throw Error(`npm not found in PATH. Install npm or update manually with npm install -g ${n}`);await t.npmInstallGlobal(`${n}@${e.latestVersion}`),await i(e.latestVersion);let a=function(r){try{return{skills:o(r)}}catch(r){return{skillsWarning:u(r)}}}(e.latestVersion);return{...e,action:"updated",...a}}function u(r){return r instanceof Error&&r.message?r.message:String(r)}export{u as formatError,p as updateCli};
package/dist/workspace.js CHANGED
@@ -1 +1 @@
1
- import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./9635.js";import"./yaml.js";import{FRONTEND_ARCHIVE_FILENAME as t}from"./app.js";import{resolveProjectLayout as r}from"./project-layout.js";import{isRecord as s}from"./2168.js";let i=e("node:crypto"),n=e("node:fs"),o=e("node:path"),a=e("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js");function p(e,t,s){let i=s??r(e).manifestPath;if(!(0,n.existsSync)(i)){if(t)return t;throw Error(`missing AppID: manifest file not found: ${i}`)}let o=l(i);if(t&&t!==o)throw Error(`AppID mismatch: --app-id is ${t}, but manifest.app_key is ${o}. Update the resolved Manifest; it is the single source of truth.`);return o}function l(e){let t;if(!(0,n.statSync)(e).isFile())throw Error(`missing AppID: manifest path is not a file: ${e}`);try{t=a.qg((0,n.readFileSync)(e,"utf8"))}catch(r){let t=r instanceof Error?r.message:String(r);throw Error(`invalid manifest.yaml: ${e}: ${t}`)}let r=s(t)?t.app_key:void 0;if("string"==typeof r&&r.trim())return r.trim();throw Error(`missing AppID: write app_key in ${e}`)}function m(e){let t=(0,n.readFileSync)(e.file),r=(0,n.statSync)(e.file);return{type:e.type,file:e.file,file_name:(0,o.basename)(e.file),file_size:r.size,sha256:(0,i.createHash)("sha256").update(t).digest("hex"),remote_file_name:_(e.type),replaced:!0}}function _(e){switch(e){case"manifest":return"manifest.yaml";case"skill":return"skill.zip";case"frontend_code":return t;case"business_templates":return"business-templates.yaml";case"events":return"events.json";case"tools":return"tools.json"}}function f(e){switch(e){case"manifest":return 2;case"skill":return 3;case"frontend_code":return 1;case"business_templates":return 4;case"events":return 5;case"tools":return 6}}export{m as describeWorkspaceUpload,l as readManifestAppKey,_ as remoteFileName,p as resolveAppKey,f as sourceTypeForWorkspaceFileType};
1
+ import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./7945.js";import"./yaml.js";import{FRONTEND_ARCHIVE_FILENAME as t}from"./app.js";import{resolveProjectLayout as r}from"./project-layout.js";import{isRecord as s}from"./2168.js";let i=e("node:crypto"),n=e("node:fs"),o=e("node:path"),a=e("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js");function p(e,t,s){let i=s??r(e).manifestPath;if(!(0,n.existsSync)(i)){if(t)return t;throw Error(`missing AppID: manifest file not found: ${i}`)}let o=l(i);if(t&&t!==o)throw Error(`AppID mismatch: --app-id is ${t}, but manifest.app_key is ${o}. Update the resolved Manifest; it is the single source of truth.`);return o}function l(e){let t;if(!(0,n.statSync)(e).isFile())throw Error(`missing AppID: manifest path is not a file: ${e}`);try{t=a.qg((0,n.readFileSync)(e,"utf8"))}catch(r){let t=r instanceof Error?r.message:String(r);throw Error(`invalid manifest.yaml: ${e}: ${t}`)}let r=s(t)?t.app_key:void 0;if("string"==typeof r&&r.trim())return r.trim();throw Error(`missing AppID: write app_key in ${e}`)}function m(e){let t=(0,n.readFileSync)(e.file),r=(0,n.statSync)(e.file);return{type:e.type,file:e.file,file_name:(0,o.basename)(e.file),file_size:r.size,sha256:(0,i.createHash)("sha256").update(t).digest("hex"),remote_file_name:_(e.type),replaced:!0}}function _(e){switch(e){case"manifest":return"manifest.yaml";case"skill":return"skill.zip";case"frontend_code":return t;case"business_templates":return"business-templates.yaml";case"events":return"events.json";case"tools":return"tools.json"}}function f(e){switch(e){case"manifest":return 2;case"skill":return 3;case"frontend_code":return 1;case"business_templates":return 4;case"events":return 5;case"tools":return 6}}export{m as describeWorkspaceUpload,l as readManifestAppKey,_ as remoteFileName,p as resolveAppKey,f as sourceTypeForWorkspaceFileType};
@@ -0,0 +1 @@
1
+ import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./4525.js";e("../../../node_modules/.pnpm/ws@8.21.2/node_modules/ws/lib/stream.js"),e("../../../node_modules/.pnpm/ws@8.21.2/node_modules/ws/lib/extension.js"),e("../../../node_modules/.pnpm/ws@8.21.2/node_modules/ws/lib/permessage-deflate.js"),e("../../../node_modules/.pnpm/ws@8.21.2/node_modules/ws/lib/receiver.js"),e("../../../node_modules/.pnpm/ws@8.21.2/node_modules/ws/lib/sender.js"),e("../../../node_modules/.pnpm/ws@8.21.2/node_modules/ws/lib/subprotocol.js");let s=e("../../../node_modules/.pnpm/ws@8.21.2/node_modules/ws/lib/websocket.js");e("../../../node_modules/.pnpm/ws@8.21.2/node_modules/ws/lib/websocket-server.js");let o=s;export{o as wrapper};
package/dist/yaml.js CHANGED
@@ -1,4 +1,4 @@
1
- import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./9635.js";import"./180.js";e.add({"../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-collection.js"(e,t,s){var n=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js"),o=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/Scalar.js"),i=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLMap.js"),l=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLSeq.js"),a=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-map.js"),r=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-seq.js"),d=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-collection.js");function m(e,t,s,n,o,i){let l="block-map"===s.type?a.resolveBlockMap(e,t,s,n,i):"block-seq"===s.type?r.resolveBlockSeq(e,t,s,n,i):d.resolveFlowCollection(e,t,s,n,i),m=l.constructor;return"!"===o||o===m.tagName?l.tag=m.tagName:o&&(l.tag=o),l}t.composeCollection=function(e,t,s,a,r){let d=a.tag,c=d?t.directives.tagName(d.source,e=>r(d,"TAG_RESOLVE_FAILED",e)):null;if("block-seq"===s.type){let{anchor:e,newlineAfterProp:t}=a,s=e&&d?e.offset>d.offset?e:d:e??d;s&&(!t||t.offset<s.offset)&&r(s,"MISSING_CHAR","Missing newline after block sequence props")}let u="block-map"===s.type?"map":"block-seq"===s.type?"seq":"{"===s.start.source?"map":"seq";if(!d||!c||"!"===c||c===i.YAMLMap.tagName&&"map"===u||c===l.YAMLSeq.tagName&&"seq"===u)return m(e,t,s,r,c);let p=t.schema.tags.find(e=>e.tag===c&&e.collection===u);if(!p){let n=t.schema.knownTags[c];if(n?.collection!==u)return n?r(d,"BAD_COLLECTION_TYPE",`${n.tag} used for ${u} collection, but expects ${n.collection??"scalar"}`,!0):r(d,"TAG_RESOLVE_FAILED",`Unresolved tag: ${c}`,!0),m(e,t,s,r,c);t.schema.tags.push(Object.assign({},n,{default:!1})),p=n}let f=m(e,t,s,r,c,p),h=p.resolve?.(f,e=>r(d,"TAG_RESOLVE_FAILED",e),t.options)??f,y=n.isNode(h)?h:new o.Scalar(h);return y.range=f.range,y.tag=c,p?.format&&(y.format=p.format),y}},"../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-doc.js"(e,t,s){var n=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/doc/Document.js"),o=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-node.js"),i=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-end.js"),l=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-props.js");t.composeDoc=function(e,t,{offset:s,start:a,value:r,end:d},m){let c=Object.assign({_directives:t},e),u=new n.Document(void 0,c),p={atKey:!1,atRoot:!0,directives:u.directives,options:u.options,schema:u.schema},f=l.resolveProps(a,{indicator:"doc-start",next:r??d?.[0],offset:s,onError:m,parentIndent:0,startOnNewline:!0});f.found&&(u.directives.docStart=!0,r&&("block-map"===r.type||"block-seq"===r.type)&&!f.hasNewline&&m(f.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),u.contents=r?o.composeNode(p,r,f,m):o.composeEmptyNode(p,f.end,a,null,f,m);let h=u.contents.range[2],y=i.resolveEnd(d,h,!1,m);return y.comment&&(u.comment=y.comment),u.range=[s,h,y.offset],u}},"../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-node.js"(e,t,s){var n=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/Alias.js"),o=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js"),i=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-collection.js"),l=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-scalar.js"),a=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-end.js"),r=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/util-empty-scalar-position.js");let d={composeNode:m,composeEmptyNode:c};function m(e,t,s,r){let m,u=e.atKey,{spaceBefore:p,comment:f,anchor:h,tag:y}=s,g=!0;switch(t.type){case"alias":m=function({options:e},{offset:t,source:s,end:o},i){let l=new n.Alias(s.substring(1));""===l.source&&i(t,"BAD_ALIAS","Alias cannot be an empty string"),l.source.endsWith(":")&&i(t+s.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let r=t+s.length,d=a.resolveEnd(o,r,e.strict,i);return l.range=[t,r,d.offset],d.comment&&(l.comment=d.comment),l}(e,t,r),(h||y)&&r(t,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":m=l.composeScalar(e,t,y,r),h&&(m.anchor=h.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{m=i.composeCollection(d,e,t,s,r),h&&(m.anchor=h.source.substring(1))}catch(e){r(t,"RESOURCE_EXHAUSTION",e instanceof Error?e.message:String(e))}break;default:{let e="error"===t.type?t.message:`Unsupported token (type: ${t.type})`;r(t,"UNEXPECTED_TOKEN",e),g=!1}}return m??(m=c(e,t.offset,void 0,null,s,r)),h&&""===m.anchor&&r(h,"BAD_ALIAS","Anchor cannot be an empty string"),u&&e.options.stringKeys&&(!o.isScalar(m)||"string"!=typeof m.value||m.tag&&"tag:yaml.org,2002:str"!==m.tag)&&r(y??t,"NON_STRING_KEY","With stringKeys, all keys must be strings"),p&&(m.spaceBefore=!0),f&&("scalar"===t.type&&""===t.source?m.comment=f:m.commentBefore=f),e.options.keepSourceTokens&&g&&(m.srcToken=t),m}function c(e,t,s,n,{spaceBefore:o,comment:i,anchor:a,tag:d,end:m},u){let p={type:"scalar",offset:r.emptyScalarPosition(t,s,n),indent:-1,source:""},f=l.composeScalar(e,p,d,u);return a&&(f.anchor=a.source.substring(1),""===f.anchor&&u(a,"BAD_ALIAS","Anchor cannot be an empty string")),o&&(f.spaceBefore=!0),i&&(f.comment=i,f.range[2]=m),f}t.composeEmptyNode=c,t.composeNode=m},"../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-scalar.js"(e,t,s){var n=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js"),o=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/Scalar.js"),i=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-scalar.js"),l=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-scalar.js");t.composeScalar=function(e,t,s,a){let r,d,{value:m,type:c,comment:u,range:p}="block-scalar"===t.type?i.resolveBlockScalar(e,t,a):l.resolveFlowScalar(t,e.options.strict,a),f=s?e.directives.tagName(s.source,e=>a(s,"TAG_RESOLVE_FAILED",e)):null;r=e.options.stringKeys&&e.atKey?e.schema[n.SCALAR]:f?function(e,t,s,o,i){if("!"===s)return e[n.SCALAR];let l=[];for(let t of e.tags)if(!t.collection&&t.tag===s)if(!t.default||!t.test)return t;else l.push(t);for(let e of l)if(e.test?.test(t))return e;let a=e.knownTags[s];return a&&!a.collection?(e.tags.push(Object.assign({},a,{default:!1,test:void 0})),a):(i(o,"TAG_RESOLVE_FAILED",`Unresolved tag: ${s}`,"tag:yaml.org,2002:str"!==s),e[n.SCALAR])}(e.schema,m,f,s,a):"scalar"===t.type?function({atKey:e,directives:t,schema:s},o,i,l){let a=s.tags.find(t=>(!0===t.default||e&&"key"===t.default)&&t.test?.test(o))||s[n.SCALAR];if(s.compat){let e=s.compat.find(e=>e.default&&e.test?.test(o))??s[n.SCALAR];if(a.tag!==e.tag){let s=t.tagString(a.tag),n=t.tagString(e.tag);l(i,"TAG_RESOLVE_FAILED",`Value may be parsed as either ${s} or ${n}`,!0)}}return a}(e,m,t,a):e.schema[n.SCALAR];try{let i=r.resolve(m,e=>a(s??t,"TAG_RESOLVE_FAILED",e),e.options);d=n.isScalar(i)?i:new o.Scalar(i)}catch(e){a(s??t,"TAG_RESOLVE_FAILED",e instanceof Error?e.message:String(e)),d=new o.Scalar(m)}return d.range=p,d.source=m,c&&(d.type=c),f&&(d.tag=f),r.format&&(d.format=r.format),u&&(d.comment=u),d}},"../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/composer.js"(e,t,s){var n=s("process"),o=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/doc/directives.js"),i=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/doc/Document.js"),l=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/errors.js"),a=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js"),r=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-doc.js"),d=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-end.js");function m(e){if("number"==typeof e)return[e,e+1];if(Array.isArray(e))return 2===e.length?e:[e[0],e[1]];let{offset:t,source:s}=e;return[t,t+("string"==typeof s?s.length:1)]}function c(e){let t="",s=!1,n=!1;for(let o=0;o<e.length;++o){let i=e[o];switch(i[0]){case"#":t+=(""===t?"":n?"\n\n":"\n")+(i.substring(1)||" "),s=!0,n=!1;break;case"%":e[o+1]?.[0]!=="#"&&(o+=1),s=!1;break;default:s||(n=!0),s=!1}}return{comment:t,afterEmptyLine:n}}t.Composer=class{constructor(e={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(e,t,s,n)=>{let o=m(e);n?this.warnings.push(new l.YAMLWarning(o,t,s)):this.errors.push(new l.YAMLParseError(o,t,s))},this.directives=new o.Directives({version:e.version||"1.2"}),this.options=e}decorate(e,t){let{comment:s,afterEmptyLine:n}=c(this.prelude);if(s){let o=e.contents;if(t)e.comment=e.comment?`${e.comment}
1
+ import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./7945.js";e.add({"../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-collection.js"(e,t,s){var n=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js"),o=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/Scalar.js"),i=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLMap.js"),l=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLSeq.js"),a=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-map.js"),r=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-seq.js"),d=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-collection.js");function m(e,t,s,n,o,i){let l="block-map"===s.type?a.resolveBlockMap(e,t,s,n,i):"block-seq"===s.type?r.resolveBlockSeq(e,t,s,n,i):d.resolveFlowCollection(e,t,s,n,i),m=l.constructor;return"!"===o||o===m.tagName?l.tag=m.tagName:o&&(l.tag=o),l}t.composeCollection=function(e,t,s,a,r){let d=a.tag,c=d?t.directives.tagName(d.source,e=>r(d,"TAG_RESOLVE_FAILED",e)):null;if("block-seq"===s.type){let{anchor:e,newlineAfterProp:t}=a,s=e&&d?e.offset>d.offset?e:d:e??d;s&&(!t||t.offset<s.offset)&&r(s,"MISSING_CHAR","Missing newline after block sequence props")}let u="block-map"===s.type?"map":"block-seq"===s.type?"seq":"{"===s.start.source?"map":"seq";if(!d||!c||"!"===c||c===i.YAMLMap.tagName&&"map"===u||c===l.YAMLSeq.tagName&&"seq"===u)return m(e,t,s,r,c);let p=t.schema.tags.find(e=>e.tag===c&&e.collection===u);if(!p){let n=t.schema.knownTags[c];if(n?.collection!==u)return n?r(d,"BAD_COLLECTION_TYPE",`${n.tag} used for ${u} collection, but expects ${n.collection??"scalar"}`,!0):r(d,"TAG_RESOLVE_FAILED",`Unresolved tag: ${c}`,!0),m(e,t,s,r,c);t.schema.tags.push(Object.assign({},n,{default:!1})),p=n}let f=m(e,t,s,r,c,p),h=p.resolve?.(f,e=>r(d,"TAG_RESOLVE_FAILED",e),t.options)??f,y=n.isNode(h)?h:new o.Scalar(h);return y.range=f.range,y.tag=c,p?.format&&(y.format=p.format),y}},"../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-doc.js"(e,t,s){var n=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/doc/Document.js"),o=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-node.js"),i=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-end.js"),l=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-props.js");t.composeDoc=function(e,t,{offset:s,start:a,value:r,end:d},m){let c=Object.assign({_directives:t},e),u=new n.Document(void 0,c),p={atKey:!1,atRoot:!0,directives:u.directives,options:u.options,schema:u.schema},f=l.resolveProps(a,{indicator:"doc-start",next:r??d?.[0],offset:s,onError:m,parentIndent:0,startOnNewline:!0});f.found&&(u.directives.docStart=!0,r&&("block-map"===r.type||"block-seq"===r.type)&&!f.hasNewline&&m(f.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),u.contents=r?o.composeNode(p,r,f,m):o.composeEmptyNode(p,f.end,a,null,f,m);let h=u.contents.range[2],y=i.resolveEnd(d,h,!1,m);return y.comment&&(u.comment=y.comment),u.range=[s,h,y.offset],u}},"../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-node.js"(e,t,s){var n=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/Alias.js"),o=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js"),i=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-collection.js"),l=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-scalar.js"),a=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-end.js"),r=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/util-empty-scalar-position.js");let d={composeNode:m,composeEmptyNode:c};function m(e,t,s,r){let m,u=e.atKey,{spaceBefore:p,comment:f,anchor:h,tag:y}=s,g=!0;switch(t.type){case"alias":m=function({options:e},{offset:t,source:s,end:o},i){let l=new n.Alias(s.substring(1));""===l.source&&i(t,"BAD_ALIAS","Alias cannot be an empty string"),l.source.endsWith(":")&&i(t+s.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let r=t+s.length,d=a.resolveEnd(o,r,e.strict,i);return l.range=[t,r,d.offset],d.comment&&(l.comment=d.comment),l}(e,t,r),(h||y)&&r(t,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":m=l.composeScalar(e,t,y,r),h&&(m.anchor=h.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{m=i.composeCollection(d,e,t,s,r),h&&(m.anchor=h.source.substring(1))}catch(e){r(t,"RESOURCE_EXHAUSTION",e instanceof Error?e.message:String(e))}break;default:{let e="error"===t.type?t.message:`Unsupported token (type: ${t.type})`;r(t,"UNEXPECTED_TOKEN",e),g=!1}}return m??(m=c(e,t.offset,void 0,null,s,r)),h&&""===m.anchor&&r(h,"BAD_ALIAS","Anchor cannot be an empty string"),u&&e.options.stringKeys&&(!o.isScalar(m)||"string"!=typeof m.value||m.tag&&"tag:yaml.org,2002:str"!==m.tag)&&r(y??t,"NON_STRING_KEY","With stringKeys, all keys must be strings"),p&&(m.spaceBefore=!0),f&&("scalar"===t.type&&""===t.source?m.comment=f:m.commentBefore=f),e.options.keepSourceTokens&&g&&(m.srcToken=t),m}function c(e,t,s,n,{spaceBefore:o,comment:i,anchor:a,tag:d,end:m},u){let p={type:"scalar",offset:r.emptyScalarPosition(t,s,n),indent:-1,source:""},f=l.composeScalar(e,p,d,u);return a&&(f.anchor=a.source.substring(1),""===f.anchor&&u(a,"BAD_ALIAS","Anchor cannot be an empty string")),o&&(f.spaceBefore=!0),i&&(f.comment=i,f.range[2]=m),f}t.composeEmptyNode=c,t.composeNode=m},"../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-scalar.js"(e,t,s){var n=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js"),o=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/Scalar.js"),i=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-scalar.js"),l=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-scalar.js");t.composeScalar=function(e,t,s,a){let r,d,{value:m,type:c,comment:u,range:p}="block-scalar"===t.type?i.resolveBlockScalar(e,t,a):l.resolveFlowScalar(t,e.options.strict,a),f=s?e.directives.tagName(s.source,e=>a(s,"TAG_RESOLVE_FAILED",e)):null;r=e.options.stringKeys&&e.atKey?e.schema[n.SCALAR]:f?function(e,t,s,o,i){if("!"===s)return e[n.SCALAR];let l=[];for(let t of e.tags)if(!t.collection&&t.tag===s)if(!t.default||!t.test)return t;else l.push(t);for(let e of l)if(e.test?.test(t))return e;let a=e.knownTags[s];return a&&!a.collection?(e.tags.push(Object.assign({},a,{default:!1,test:void 0})),a):(i(o,"TAG_RESOLVE_FAILED",`Unresolved tag: ${s}`,"tag:yaml.org,2002:str"!==s),e[n.SCALAR])}(e.schema,m,f,s,a):"scalar"===t.type?function({atKey:e,directives:t,schema:s},o,i,l){let a=s.tags.find(t=>(!0===t.default||e&&"key"===t.default)&&t.test?.test(o))||s[n.SCALAR];if(s.compat){let e=s.compat.find(e=>e.default&&e.test?.test(o))??s[n.SCALAR];if(a.tag!==e.tag){let s=t.tagString(a.tag),n=t.tagString(e.tag);l(i,"TAG_RESOLVE_FAILED",`Value may be parsed as either ${s} or ${n}`,!0)}}return a}(e,m,t,a):e.schema[n.SCALAR];try{let i=r.resolve(m,e=>a(s??t,"TAG_RESOLVE_FAILED",e),e.options);d=n.isScalar(i)?i:new o.Scalar(i)}catch(e){a(s??t,"TAG_RESOLVE_FAILED",e instanceof Error?e.message:String(e)),d=new o.Scalar(m)}return d.range=p,d.source=m,c&&(d.type=c),f&&(d.tag=f),r.format&&(d.format=r.format),u&&(d.comment=u),d}},"../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/composer.js"(e,t,s){var n=s("process"),o=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/doc/directives.js"),i=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/doc/Document.js"),l=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/errors.js"),a=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js"),r=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-doc.js"),d=s("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-end.js");function m(e){if("number"==typeof e)return[e,e+1];if(Array.isArray(e))return 2===e.length?e:[e[0],e[1]];let{offset:t,source:s}=e;return[t,t+("string"==typeof s?s.length:1)]}function c(e){let t="",s=!1,n=!1;for(let o=0;o<e.length;++o){let i=e[o];switch(i[0]){case"#":t+=(""===t?"":n?"\n\n":"\n")+(i.substring(1)||" "),s=!0,n=!1;break;case"%":e[o+1]?.[0]!=="#"&&(o+=1),s=!1;break;default:s||(n=!0),s=!1}}return{comment:t,afterEmptyLine:n}}t.Composer=class{constructor(e={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(e,t,s,n)=>{let o=m(e);n?this.warnings.push(new l.YAMLWarning(o,t,s)):this.errors.push(new l.YAMLParseError(o,t,s))},this.directives=new o.Directives({version:e.version||"1.2"}),this.options=e}decorate(e,t){let{comment:s,afterEmptyLine:n}=c(this.prelude);if(s){let o=e.contents;if(t)e.comment=e.comment?`${e.comment}
2
2
  ${s}`:s;else if(n||e.directives.docStart||!o)e.commentBefore=s;else if(a.isCollection(o)&&!o.flow&&o.items.length>0){let e=o.items[0];a.isPair(e)&&(e=e.key);let t=e.commentBefore;e.commentBefore=t?`${s}
3
3
  ${t}`:s}else{let e=o.commentBefore;o.commentBefore=e?`${s}
4
4
  ${e}`:s}}if(t){for(let t=0;t<this.errors.length;++t)e.errors.push(this.errors[t]);for(let t=0;t<this.warnings.length;++t)e.warnings.push(this.warnings[t])}else e.errors=this.errors,e.warnings=this.warnings;this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:c(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(e,t=!1,s=-1){for(let t of e)yield*this.next(t);yield*this.end(t,s)}*next(e){switch(n.env.LOG_STREAM&&console.dir(e,{depth:null}),e.type){case"directive":this.directives.add(e.source,(t,s,n)=>{let o=m(e);o[0]+=t,this.onError(o,"BAD_DIRECTIVE",s,n)}),this.prelude.push(e.source),this.atDirectives=!0;break;case"document":{let t=r.composeDoc(this.options,this.directives,e,this.onError);this.atDirectives&&!t.directives.docStart&&this.onError(e,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(t,!1),this.doc&&(yield this.doc),this.doc=t,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(e.source);break;case"error":{let t=e.source?`${e.message}: ${JSON.stringify(e.source)}`:e.message,s=new l.YAMLParseError(m(e),"UNEXPECTED_TOKEN",t);this.atDirectives||!this.doc?this.errors.push(s):this.doc.errors.push(s);break}case"doc-end":{if(!this.doc){this.errors.push(new l.YAMLParseError(m(e),"UNEXPECTED_TOKEN","Unexpected doc-end without preceding document"));break}this.doc.directives.docEnd=!0;let t=d.resolveEnd(e.end,e.offset+e.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),t.comment){let e=this.doc.comment;this.doc.comment=e?`${e}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doubao-dev/cli",
3
- "version": "0.0.32",
3
+ "version": "0.0.33",
4
4
  "description": "Doubao Dev CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -46,7 +46,7 @@
46
46
  "node-loader": "2.1.0",
47
47
  "rimraf": "5.0.10",
48
48
  "typescript": "6.0.3",
49
- "@byted-doubao-apps/cli": "0.0.32"
49
+ "@byted-doubao-apps/cli": "0.0.33"
50
50
  },
51
51
  "optionalDependencies": {
52
52
  "@doubao-dev/security-tasm": "0.0.22",
@@ -122,12 +122,12 @@ server` / `dbx eval run` / `gen-explore` / `gen-trajectory`)之前,必须先
122
122
  把该值展示给用户并要求其明确确认「就用这个 app_key」;`manifest.yaml` 缺失
123
123
  `app_key`、值为空或用户不确认时,用 `AskUserQuestion` 追问,拿到后写入
124
124
  `manifest.yaml` 的 `app_key` 字段(Manifest 是唯一事实来源,不要只写进
125
- `.dbx/eval.yaml`)。使用 `--app-id` 时其值必须与 Manifest 的 `app_key` 一致,
125
+ `node_modules/.doubao-dev/eval.yaml`)。使用 `--app-id` 时其值必须与 Manifest 的 `app_key` 一致,
126
126
  否则 `resolveAppKey` 会报 `AppID mismatch`。未获得用户对 `app_key` 的确认,
127
127
  不得发起评测。这一步与登录无关:`dbx auth login` 只提供 SSO 登录态,不提供
128
128
  `app_key`。仅当用户明确使用自定义 OpenAI-compatible endpoint(不走 Gateway)
129
129
  时,`app_key` 才非必需。
130
- 3. 检查 `<projectPath>/.dbx/eval.yaml`。
130
+ 3. 检查 `<projectPath>/node_modules/.doubao-dev/eval.yaml`。
131
131
  4. 文件存在时读取并检查必需字段,不要重复询问已有信息。
132
132
  5. 文件不存在或字段不完整时,必须使用 `AskUserQuestion` 一次询问一个问题,
133
133
  收集缺失信息后再运行。
@@ -136,7 +136,7 @@ server` / `dbx eval run` / `gen-explore` / `gen-trajectory`)之前,必须先
136
136
  `dbx eval run` 或向用户确认降级。
137
137
 
138
138
  使用自定义 LLM endpoint 或 MCP Header 时,项目配置会包含明文凭证。不得在回复、
139
- 日志摘要或错误信息中输出完整凭证,不得建议用户提交或分享 `.dbx/eval.yaml`。
139
+ 日志摘要或错误信息中输出完整凭证,不得建议用户提交或分享 `node_modules/.doubao-dev/eval.yaml`。
140
140
 
141
141
  ## 必需信息
142
142
 
@@ -194,7 +194,7 @@ Header 值必须是 YAML 字符串;数字和布尔值需要加引号。该配
194
194
 
195
195
  ## 首次配置
196
196
 
197
- 不要直接写最终的 `<projectPath>/.dbx/eval.yaml`。在本地临时目录生成 YAML,
197
+ 不要直接写最终的 `<projectPath>/node_modules/.doubao-dev/eval.yaml`。在本地临时目录生成 YAML,
198
198
  将收集的信息写入后通过 `-c` 交给 CLI。默认使用实时页面:
199
199
 
200
200
  ```bash
@@ -217,7 +217,7 @@ dbx eval run \
217
217
  CLI 校验成功后会把最终生效配置原子写入:
218
218
 
219
219
  ```text
220
- <projectPath>/.dbx/eval.yaml
220
+ <projectPath>/node_modules/.doubao-dev/eval.yaml
221
221
  ```
222
222
 
223
223
  显式 `-c` 会更新项目默认配置。后续运行可省略 `-c`:
@@ -234,7 +234,7 @@ dbx eval server --project-path <projectPath>
234
234
  ```text
235
235
  显式 CLI 参数
236
236
  > -c 指定 YAML(替换项目 YAML 层,不与项目 YAML 合并)
237
- > <projectPath>/.dbx/eval.yaml(未指定 -c 时)
237
+ > <projectPath>/node_modules/.doubao-dev/eval.yaml(未指定 -c 时)
238
238
  > ~/.dbx/config.yaml
239
239
  > Manifest 推导
240
240
  > 非 endpoint 默认值
@@ -387,7 +387,7 @@ dbx eval run \
387
387
  - `state.json`
388
388
  - `failure.json`(提前终止时存在)
389
389
  - `case-validation.json` 和 `cases.raw.json`(Case 数完整性失败时的诊断产物)
390
- - `.dbx/eval.yaml`
390
+ - `node_modules/.doubao-dev/eval.yaml`
391
391
  - `skill-review.json` 和 `veto.json`
392
392
  - `flow-map.json` 和 `generation-coverage.json`(业务流驱动生成时存在)
393
393
  - `trajectories/`、`scores/` 和 `screenshots/`(存在时)
@@ -402,3 +402,11 @@ dbx eval run \
402
402
  - localhost 页面 URL(使用 `server` 且仍驻留时)
403
403
 
404
404
  不得把缺少截图描述成评测失败;`skip_render` 模式下无截图是预期行为。
405
+
406
+ ### 本地配置目录兼容
407
+
408
+ 项目评测配置保存到 `<projectPath>/node_modules/.doubao-dev/eval.yaml`。
409
+ 未指定 `-c` 且新文件不存在时,兼容读取旧 `<projectPath>/.dbx/eval.yaml`;两份文件不合并。
410
+ 新文件损坏会报错,不回退。命令自动保存配置时只写新位置,旧文件和 `-c` 输入文件不修改。
411
+ 清理 `node_modules` 会丢失其中的评测设置,可通过原有全局配置、`-c` 或命令行重新提供。
412
+ 报告及运行快照仍保存在原输出目录。
@@ -101,7 +101,7 @@ description: 豆包智能服务全链路开发指南。当用户需要从零开
101
101
  dbx dev --mcp-endpoint <mcp_endpoint>
102
102
  ```
103
103
 
104
- 命令把当前目录当作 dbx 项目目录,按项目布局和 `.dbx/config.json` 自动解析前端目录,默认读取根目录 `manifest.yaml`,并递归读取 `skill/` 下的所有 `SKILL.md`。传入 `--skill <目录>` 时改为递归读取指定目录。`--mcp-endpoint` 使用当前机器可访问的 Streamable HTTP `/mcp` 地址。
104
+ 命令把当前目录当作 dbx 项目目录,按项目布局(兼容旧 `.dbx/config.json`)自动解析前端目录,默认读取根目录 `manifest.yaml`,并递归读取 `skill/` 下的所有 `SKILL.md`。传入 `--skill <目录>` 时改为递归读取指定目录。`--mcp-endpoint` 使用当前机器可访问的 Streamable HTTP `/mcp` 地址。
105
105
 
106
106
  使用本地 MCP Server 时,按 [本地调试总流程](references/local-debug/overview.md) 由 Agent 帮用户启动和管理 Server。Agent 从项目脚本或 Server 代码确定实际启动命令,通过环境变量指定 OpenAPI BaseDomain,完成日志检查和 endpoint 验证后再运行 `dbx dev`。
107
107
 
@@ -498,7 +498,7 @@ export default defineLoginPage({
498
498
 
499
499
  登录页开发使用 `dbx dev`,不是 `npm run dev`。`dbx dev` 从 dbx 项目根目录启动,并连接本地业务 Server 暴露的 MCP endpoint;它不会代替开发者启动业务 Server。
500
500
 
501
- 开始前确认项目根目录包含 `manifest.yaml`、`.dbx` 状态目录,以及至少包含一个 `SKILL.md` 的运行态 `skill/`;CLI 会递归加载其中所有 `SKILL.md`。前端目录由项目布局、`.dbx/config.json` 或 CLI 默认规则解析。标准流程如下:
501
+ 开始前确认项目根目录包含 `manifest.yaml`,以及至少包含一个 `SKILL.md` 的运行态 `skill/`;CLI 会递归加载其中所有 `SKILL.md`。前端目录由项目布局、旧 `.dbx/config.json` 或 CLI 默认规则解析。标准流程如下:
502
502
 
503
503
  1. 按 [本地调试总流程](local-debug/overview.md) 选择 App 配置路径并设置业务 Server 启动环境变量。
504
504
  2. 在独立终端启动业务 Server。业务 Server 负责业务登录接口、MCP `/mcp`、FetchTokenURL、RefreshTokenURL 和需要的本地持久化;AppSecret 从服务端安全配置读取。mock MVP 只通过 `DOUBAO_AUTH_MODE=mock` 选择 mock 链路,固定验证码保留在源码和页面 hint 中,不增加 `DEV_VERIFY_CODE` 等验证码环境变量。
@@ -26,9 +26,9 @@
26
26
 
27
27
  ## 启动前检查
28
28
 
29
- 1. 确认 dbx 项目根目录:应有 `manifest.yaml`、`.dbx` 状态目录,以及至少包含一个 `SKILL.md` 的运行态 `skill/`;文件可以位于目录中的任意层级。
29
+ 1. 确认 dbx 项目根目录:应有 `manifest.yaml`,以及至少包含一个 `SKILL.md` 的运行态 `skill/`;文件可以位于目录中的任意层级。
30
30
  2. 项目存在 `business-templates.yaml` 时,确认它已纳入本次 Manifest、前端资源和其它真机调试产物组成的完整调试包。
31
- 3. 确认前端工程目录。前端目录由项目布局和 `.dbx/config.json` 自动解析。
31
+ 3. 确认前端工程目录。前端目录由项目布局(兼容旧 `.dbx/config.json`)自动解析。
32
32
  4. 确认 MCP endpoint 对本机可访问。若端口已有监听进程,先识别或复用它;不要为“清端口”直接结束未知进程。
33
33
  5. 交互式终端会启动 Ink REPL;无 TTY 时会以前台模式持续运行 dev service,并在启动后打印 Web Simulator 地址。使用 Ctrl+C 或默认 `kill`(SIGTERM)停止。
34
34
 
@@ -147,7 +147,7 @@ widget <widget-id> --data '<json>'
147
147
  ### 6. Web 与停止
148
148
 
149
149
  - `web` 提示 URL 未就绪,或启动日志包含 Web SDK / JSON 解析错误时,记录完整错误和 log id;不要宣称 Web 调试已启动。继续用真机验证,或排查当前 `dbx dev` 会话的 Web SDK 配置。
150
- - 调试结束时退出 REPL(例如按 Ctrl+C),或在另一个终端执行 `dbx dev stop`。如果进程和监听端口已消失但状态仍为 `stopping`,保留 `.dbx` 会话信息并报告为 CLI 状态残留;不要直接删除状态目录。
150
+ - 调试结束时退出 REPL(例如按 Ctrl+C),或在另一个终端执行 `dbx dev stop`。如果进程和监听端口已消失但状态仍为 `stopping`,保留 `node_modules/.doubao-dev/dev/` 会话信息并报告为 CLI 状态残留;不要直接删除状态目录。
151
151
 
152
152
  ## 问答:权限、授权与无法继续
153
153
 
@@ -20,7 +20,7 @@
20
20
  | enableScale | boolean | true | 允许缩放 |
21
21
  | enableDrag | boolean | true | 允许拖动 |
22
22
  | enableRotate | boolean | false | 允许旋转 |
23
- | mapStyle | `'normal-light' \| 'normal-dark' \| 'simple-light' \| 'simple-dark'` | `'normal-light'` | 地图主题 |
23
+ | mapStyle | `'normal-light' \| 'normal-dark' \| 'simple-light' \| 'simple-dark' \| string` | `'normal-light'` | 地图主题,支持内置主题;自 0.2.1 起支持自定义样式 ID |
24
24
  | onClick | (e: { point: { latitude: number; longitude: number } }) => void | - | 点击地图 |
25
25
  | onMapLoaded | () => void | - | 地图加载完成 |
26
26
  | onRegionChange | (e) => void | - | 视野变化 |
@@ -22,9 +22,6 @@
22
22
 
23
23
  调用不会改变对话框状态,也不会触发高度变化事件。
24
24
 
25
- ## 扫码预览
26
- ![扫码预览 getChatPanelInfo](https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=doubao%3A%2F%2Fdoubao_apps%3Fapp_id%3Ddb_1McM5Ni%26path%3D%252Fpages%252Fapi%252Fui%252Fchat-panel%252Findex)
27
-
28
25
  ## 支持版本
29
26
 
30
27
  前端库版本不低于 `0.0.42`。
@@ -116,9 +113,6 @@ console.log('current chat panel', { height, state });
116
113
 
117
114
  注册后不会立即回调当前值。需要当前状态时,先调用 getChatPanelInfo。
118
115
 
119
- ## 扫码预览
120
- ![扫码预览 onChatPanelHeightChanged](https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=doubao%3A%2F%2Fdoubao_apps%3Fapp_id%3Ddb_1McM5Ni%26path%3D%252Fpages%252Fapi%252Fui%252Fchat-panel%252Findex)
121
-
122
116
  ## 支持版本
123
117
 
124
118
  前端库版本不低于 `0.0.42`。
@@ -44,8 +44,8 @@ Page / Widget 运行现场。它不替代用户业务 MCP server,只描述 deb
44
44
  - 方法:`POST /__wsd_mcp`。
45
45
  - 会话:当前实现不生成 session id,每次请求创建一次 MCP server / transport。
46
46
  - CORS 预检:`OPTIONS /__wsd_mcp` 返回 204。
47
- - 数据来源:调试台 UI 会把运行期快照写回 `/__agent_trace`,查询 tools 从 debugger server 内存中的最新快照读取数据。
48
- - 浏览器控制:调试台通过内部 SSE 通道接收控制命令;渲染命令会在目标完成渲染且生成匹配命令的新 DOM 快照后回执。
47
+ - 数据来源:调试台 UI 通过 `/__wsd_connection` WebSocket 同步运行期快照、接收控制命令和 Sandbox 事件,查询 tools 从 debugger server 内存中的最新快照读取数据。`/__agent_trace` 保留为 HTTP 快照访问接口。
48
+ - 浏览器控制:调试台通过共享 WebSocket 通道接收控制命令;渲染命令会在目标完成渲染且生成匹配命令的新 DOM 快照后回执。
49
49
 
50
50
  Web SDK Debugger 连接用户业务 MCP endpoint 时使用自动版本协商:优先选择 `2026-07-28`,对只支持 2025-era
51
51
  的 server 回退到 legacy handshake。每次 `tools/list` 或 `tools/call` 都建立独立 client,因此会重新执行协商,不缓存
@@ -243,7 +243,7 @@ MapCard 的 `ref` 直接绑定到内部 Map,可通过 `MapRef` 调用地图实
243
243
  | `className` / `style` | `string` / `CSSProperties` | 卡片根节点自定义样式 |
244
244
  | `onClick` | `(event) => void` | 卡片根节点点击 |
245
245
 
246
- `AskHumanCardItem`:`key?` · `text?: TemplateText` · `loading?` · `showArrow?: 'left' | 'right' | 'none'` · `onClick?` · `className?` · `style?`
246
+ `AskHumanCardItem`:`key?` · `text?: TemplateText` · `loading?` · `openType?: 'launchApp'` · `launchAppUrl?` · `showArrow?: 'left' | 'right' | 'none'` · `onClick?` · `onLaunchApp?` · `onLaunchAppError?` · `className?` · `style?`
247
247
 
248
248
  跳过、固定跳转等入口也通过 `items` 表达;`showArrow` 支持 `'left'`、`'right'`、`'none'`,默认不展示。单个全宽操作按钮用
249
249
  `variant="jump"` 和一个 `items` 项表达。
@@ -6,7 +6,7 @@
6
6
 
7
7
  | 场景 | 先做什么 |
8
8
  |------|----------|
9
- | 找不到前端目录 | 读取 `.dbx/config.json` 的 `frontend.directory`;缺失时再按项目结构判断,常见目录是 `doubao-agentic-service` |
9
+ | 找不到前端目录 | 读取 `.dbx/config.json` 的 `frontend.directory`;缺失时再按项目结构判断,新项目使用根目录,旧项目按脚本返回的路径处理 |
10
10
  | 需要新建智能服务前端工程 | 使用公开版智能服务框架创建命令;不要在已有 dbx 项目里另起一套平行前端 |
11
11
  | 卡片没出现、模型没调 tool、Manifest 绑定不确定 | 先读 [`dbx check` 指南](local-debug/simulator-eval.md),用 `dbx check --query "<当前轮用户问题>"` 验证 Skill、MCP、Manifest、tool result 和 `card_delta` |
12
12
  | 需要看页面、卡片样式、点击或路由 | 先读 [本地调试总流程](local-debug/overview.md),用 `dbx dev` 打开 Web 模拟器 |
@@ -17,8 +17,8 @@
17
17
 
18
18
  ## dbx 工程规则
19
19
 
20
- - 前端源码不放在 `.dbx/workspace` 下;`.dbx/workspace` 只保存打包产物和中间文件。
21
- - 前端目录优先来自 `.dbx/config.json` 的 `frontend.directory`。
20
+ - 前端源码保留在项目根目录;打包临时文件由上传命令管理。
21
+ - 旧项目前端目录可来自 `.dbx/config.json` 的 `frontend.directory`。
22
22
  - 如果前端脚手架不存在,先修复初始化流程;只有用户明确要求新建智能服务工程时,才执行创建命令。
23
23
  - 在 `src/config/runtime.ts` 集中维护非敏感的 `appId` 和 `apiBaseUrl`;`src/app.config.ts` 引用 `runtimeConfig.appId`,普通 HTTP 请求通过统一 client 使用 `runtimeConfig.apiBaseUrl`。不要在 Page / Widget 中硬编码 AppID 或服务端 URL,AppSecret 绝不进入前端配置。
24
24
  - 构建或上传前,将 `runtimeConfig.appId`、`runtimeConfig.apiBaseUrl` 与 Manifest 的 `app_key`、`mcp_server.end_point` 作为同一配置组恢复为用户确认的正式值。
@@ -60,8 +60,8 @@ dbx dev --mcp-endpoint <mcp_endpoint>
60
60
  默认约定:
61
61
 
62
62
  - 项目目录固定为当前目录,前端目录按项目布局自动解析。
63
- - 当前目录就是 `.dbx` 状态、默认 Manifest、默认运行态 Skills 和前端目录所在目录;默认路径是 `manifest.yaml` 与 `skill/`。
64
- - 前端目录优先读取 `.dbx/config.json` 里的 `frontend.directory`;未配置时按 CLI 默认规则处理。
63
+ - 当前目录就是项目根目录;调试状态写入 `node_modules/.doubao-dev/`,Manifest、运行态 Skills 和前端源码保留在项目中;默认路径是 `manifest.yaml` 与 `skill/`。
64
+ - 前端目录兼容读取旧 `.dbx/config.json` 里的 `frontend.directory`;未配置时按 CLI 默认规则处理。
65
65
  - Manifest 默认是 `<project>/manifest.yaml`。
66
66
  - 运行态 Skills 默认目录是 `<project>/skill/`;CLI 递归加载其中所有 `SKILL.md`,并按相对路径稳定排序。
67
67
  - MCP endpoint 用 `--mcp-endpoint <mcp_endpoint>` 显式传入;本地 Web 模拟器使用 Streamable HTTP `/mcp` 地址。