@microi.net/cli 6.3.2 → 6.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +4 -4
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/microi-cli.js +69 -67
- package/scripts/microi-skills.meta.json +237 -237
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +6 -6
- package/skills/microi-codex/SKILL.md +2 -0
- package/skills/microi-codex-installer/SKILL.md +32 -3
- package/skills/microi-docs-coverage/references/capability-map.md +2 -2
- package/skills/system-observability/SKILL.md +5 -1
- package/skills/system-observability/references/framework-status-widgets.md +14 -2
- package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +5 -4
package/scripts/microi-cli.js
CHANGED
|
@@ -1,59 +1,59 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var
|
|
3
|
-
`,r:"\r",t:" ",'"':'"',"\\":"\\","/":"/"},Xe=class s extends Ji{static make(e){return new s(e)}constructor(e){super(Object.assign({},e,{readableObjectMode:!0})),this._packKeys=this._packStrings=this._packNumbers=this._streamKeys=this._streamStrings=this._streamNumbers=!0,e&&("packValues"in e&&(this._packKeys=this._packStrings=this._packNumbers=e.packValues),"packKeys"in e&&(this._packKeys=e.packKeys),"packStrings"in e&&(this._packStrings=e.packStrings),"packNumbers"in e&&(this._packNumbers=e.packNumbers),"streamValues"in e&&(this._streamKeys=this._streamStrings=this._streamNumbers=e.streamValues),"streamKeys"in e&&(this._streamKeys=e.streamKeys),"streamStrings"in e&&(this._streamStrings=e.streamStrings),"streamNumbers"in e&&(this._streamNumbers=e.streamNumbers),this._jsonStreaming=e.jsonStreaming),!this._packKeys&&(this._streamKeys=!0),!this._packStrings&&(this._streamStrings=!0),!this._packNumbers&&(this._streamNumbers=!0),this._done=!1,this._expect=this._jsonStreaming?"done":"value",this._stack=[],this._parent="",this._open_number=!1,this._accumulator=""}_flush(e){this._done=!0,super._flush(t=>{if(t)return e(t);this._open_number&&(this._streamNumbers&&this.push({name:"endNumber"}),this._open_number=!1,this._packNumbers&&(this.push({name:"numberValue",value:this._accumulator}),this._accumulator="")),e(null)})}_processBuffer(e){let t,n,r=0;e:for(;;)switch(this._expect){case"value1":case"value":if(J.value1.lastIndex=r,t=J.value1.exec(this._buffer),!t){if(this._done||r+qi<this._buffer.length)return r<this._buffer.length?e(new Error("Parser cannot parse input: expected a value")):e(new Error("Parser has expected a value"));break e}switch(n=t[0],n){case'"':this._streamStrings&&this.push({name:"startString"}),this._expect="string";break;case"{":this.push({name:"startObject"}),this._stack.push(this._parent),this._parent="object",this._expect="key1";break;case"[":this.push({name:"startArray"}),this._stack.push(this._parent),this._parent="array",this._expect="value1";break;case"]":if(this._expect!=="value1")return e(new Error("Parser cannot parse input: unexpected token ']'"));this._open_number&&(this._streamNumbers&&this.push({name:"endNumber"}),this._open_number=!1,this._packNumbers&&(this.push({name:"numberValue",value:this._accumulator}),this._accumulator="")),this.push({name:"endArray"}),this._parent=this._stack.pop(),this._expect=Me[this._parent];break;case"-":this._open_number=!0,this._streamNumbers&&(this.push({name:"startNumber"}),this.push({name:"numberChunk",value:"-"})),this._packNumbers&&(this._accumulator="-"),this._expect="numberStart";break;case"0":this._open_number=!0,this._streamNumbers&&(this.push({name:"startNumber"}),this.push({name:"numberChunk",value:"0"})),this._packNumbers&&(this._accumulator="0"),this._expect="numberFraction";break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":this._open_number=!0,this._streamNumbers&&(this.push({name:"startNumber"}),this.push({name:"numberChunk",value:n})),this._packNumbers&&(this._accumulator=n),this._expect="numberDigit";break;case"true":case"false":case"null":if(this._buffer.length-r===n.length&&!this._done)break e;this.push({name:n+"Value",value:Yi[n]}),this._expect=Me[this._parent];break}Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"keyVal":case"string":if(J.string.lastIndex=r,t=J.string.exec(this._buffer),!t){if(r<this._buffer.length&&(this._done||this._buffer.length-r>=6))return e(new Error("Parser cannot parse input: escaped characters"));if(this._done)return e(new Error("Parser has expected a string value"));break e}if(n=t[0],n==='"')this._expect==="keyVal"?(this._streamKeys&&this.push({name:"endKey"}),this._packKeys&&(this.push({name:"keyValue",value:this._accumulator}),this._accumulator=""),this._expect="colon"):(this._streamStrings&&this.push({name:"endString"}),this._packStrings&&(this.push({name:"stringValue",value:this._accumulator}),this._accumulator=""),this._expect=Me[this._parent]);else if(n.length>1&&n.charAt(0)==="\\"){let i=n.length==2?Xi[n.charAt(1)]:Qi(n);(this._expect==="keyVal"?this._streamKeys:this._streamStrings)&&this.push({name:"stringChunk",value:i}),(this._expect==="keyVal"?this._packKeys:this._packStrings)&&(this._accumulator+=i)}else(this._expect==="keyVal"?this._streamKeys:this._streamStrings)&&this.push({name:"stringChunk",value:n}),(this._expect==="keyVal"?this._packKeys:this._packStrings)&&(this._accumulator+=n);Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"key1":case"key":if(J.key1.lastIndex=r,t=J.key1.exec(this._buffer),!t){if(r<this._buffer.length||this._done)return e(new Error("Parser cannot parse input: expected an object key"));break e}if(n=t[0],n==='"')this._streamKeys&&this.push({name:"startKey"}),this._expect="keyVal";else if(n==="}"){if(this._expect!=="key1")return e(new Error("Parser cannot parse input: unexpected token '}'"));this.push({name:"endObject"}),this._parent=this._stack.pop(),this._expect=Me[this._parent]}Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"colon":if(J.colon.lastIndex=r,t=J.colon.exec(this._buffer),!t){if(r<this._buffer.length||this._done)return e(new Error("Parser cannot parse input: expected ':'"));break e}n=t[0],n===":"&&(this._expect="value"),Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"arrayStop":case"objectStop":if(J.comma.lastIndex=r,t=J.comma.exec(this._buffer),!t){if(r<this._buffer.length||this._done)return e(new Error("Parser cannot parse input: expected ','"));break e}if(this._open_number&&(this._streamNumbers&&this.push({name:"endNumber"}),this._open_number=!1,this._packNumbers&&(this.push({name:"numberValue",value:this._accumulator}),this._accumulator="")),n=t[0],n===",")this._expect=this._expect==="arrayStop"?"value":"key";else if(n==="}"||n==="]"){if(n==="}"?this._expect==="arrayStop":this._expect!=="arrayStop")return e(new Error("Parser cannot parse input: expected '"+(this._expect==="arrayStop"?"]":"}")+"'"));this.push({name:n==="}"?"endObject":"endArray"}),this._parent=this._stack.pop(),this._expect=Me[this._parent]}Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"numberStart":if(J.numberStart.lastIndex=r,t=J.numberStart.exec(this._buffer),!t){if(r<this._buffer.length||this._done)return e(new Error("Parser cannot parse input: expected a starting digit"));break e}n=t[0],this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),this._expect=n==="0"?"numberFraction":"numberDigit",Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"numberDigit":if(J.numberDigit.lastIndex=r,t=J.numberDigit.exec(this._buffer),!t){if(r<this._buffer.length||this._done)return e(new Error("Parser cannot parse input: expected a digit"));break e}if(n=t[0],n)this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;else{if(r<this._buffer.length){this._expect="numberFraction";break}if(this._done){this._expect=Me[this._parent];break}break e}break;case"numberFraction":if(J.numberFraction.lastIndex=r,t=J.numberFraction.exec(this._buffer),!t){if(r<this._buffer.length||this._done){this._expect=Me[this._parent];break}break e}n=t[0],this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),this._expect=n==="."?"numberFracStart":"numberExpSign",Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"numberFracStart":if(J.numberFracStart.lastIndex=r,t=J.numberFracStart.exec(this._buffer),!t){if(r<this._buffer.length||this._done)return e(new Error("Parser cannot parse input: expected a fractional part of a number"));break e}n=t[0],this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),this._expect="numberFracDigit",Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"numberFracDigit":if(J.numberFracDigit.lastIndex=r,t=J.numberFracDigit.exec(this._buffer),n=t[0],n)this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;else{if(r<this._buffer.length){this._expect="numberExponent";break}if(this._done){this._expect=Me[this._parent];break}break e}break;case"numberExponent":if(J.numberExponent.lastIndex=r,t=J.numberExponent.exec(this._buffer),!t){if(r<this._buffer.length){this._expect=Me[this._parent];break}if(this._done){this._expect="done";break}break e}n=t[0],this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),this._expect="numberExpSign",Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"numberExpSign":if(J.numberExpSign.lastIndex=r,t=J.numberExpSign.exec(this._buffer),!t){if(r<this._buffer.length){this._expect="numberExpStart";break}if(this._done)return e(new Error("Parser has expected an exponent value of a number"));break e}n=t[0],this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),this._expect="numberExpStart",Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"numberExpStart":if(J.numberExpStart.lastIndex=r,t=J.numberExpStart.exec(this._buffer),!t){if(r<this._buffer.length||this._done)return e(new Error("Parser cannot parse input: expected an exponent part of a number"));break e}n=t[0],this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),this._expect="numberExpDigit",Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"numberExpDigit":if(J.numberExpDigit.lastIndex=r,t=J.numberExpDigit.exec(this._buffer),n=t[0],n)this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;else{if(r<this._buffer.length||this._done){this._expect=Me[this._parent];break}break e}break;case"done":if(J.ws.lastIndex=r,t=J.ws.exec(this._buffer),!t){if(r<this._buffer.length){if(this._jsonStreaming){this._expect="value";break}return e(new Error("Parser cannot parse input: unexpected characters"))}break e}n=t[0],this._open_number&&(this._streamNumbers&&this.push({name:"endNumber"}),this._open_number=!1,this._packNumbers&&(this.push({name:"numberValue",value:this._accumulator}),this._accumulator="")),Ce?this._buffer=this._buffer.slice(n.length):r+=n.length;break}!Ce&&(this._buffer=this._buffer.slice(r)),e(null)}};Xe.parser=Xe.make;Xe.make.Constructor=Xe;ys.exports=Xe});var ws=un((Fa,Cs)=>{"use strict";var Zi=s=>s.on("data",e=>s.emit(e.name,e.value));Cs.exports=Zi});var Es=un((Oa,bs)=>{"use strict";var pr=Ss(),eo=ws(),mr=s=>eo(new pr(s));mr.Parser=pr;mr.parser=pr.parser;bs.exports=mr});var ce=$(require("fs")),pe=$(require("path")),xi=$(require("readline"));var zr=$(require("os")),Jr=process.cwd();function qr(s){Jr=s}var ji={append:s=>process.stderr.write(s),appendLine:(s="")=>console.error(s),clear:()=>{},show:()=>{},hide:()=>{},replace:s=>process.stderr.write(s),dispose:()=>{},name:"Microi CLI"},Rt={get workspaceFolders(){return[{uri:{fsPath:Jr}}]},workspaceFile:void 0,findFiles:async()=>[]},Qn={machineId:zr.hostname()||"microi-cli",sessionId:`microi-cli-${process.pid}`},at={executeCommand:async()=>{}},ct={Notification:15},Yr={file:s=>({fsPath:s})},we={createOutputChannel:()=>ji,showInformationMessage:async()=>{},showWarningMessage:async()=>{},showErrorMessage:async()=>{},showTextDocument:async()=>{},onDidChangeWindowState:()=>({dispose:()=>{}}),withProgress:async(s,e)=>e({report:({message:t})=>t&&console.error(t)},{isCancellationRequested:!1,onCancellationRequested:()=>({dispose:()=>{}})})};var k=$(require("fs")),P=$(require("path"));var Tn=$(require("https")),_n=$(require("http")),Gt=$(require("crypto")),wt=$(require("fs"));var _e=$(require("path")),ee=$(require("fs")),ms=$(require("crypto"));var ut=".microi-meta.json",dn=".microi-config.json",Nt=".microi-mcp-tokens.json";var Qr=".mcp.json";var Ne="Microi-V8-Engine";var dt="\u63A5\u53E3\u5F15\u64CE",Xr="V8\u4E8B\u4EF6",je="\u8868\u5355\u5F15\u64CE",qe="\u6A21\u5757\u5F15\u64CE",gt="\u6D41\u7A0B\u5F15\u64CE",Zr="AI\u5E94\u7528",gn="\u8868\u5355V8\u4E8B\u4EF6",Mt="\u5B57\u6BB5V8\u4E8B\u4EF6",pn="\u8282\u70B9",es={InFormV8:"\u524D\u7AEF\u8868\u5355\u8FDB\u5165V8\u4E8B\u4EF6",SubmitFormV8:"\u524D\u7AEF\u8868\u5355\u63D0\u4EA4\u524DV8\u4E8B\u4EF6",SubmitBeforeServerV8:"\u540E\u7AEF\u8868\u5355\u63D0\u4EA4\u524DV8\u4E8B\u4EF6",SubmitAfterServerV8:"\u540E\u7AEF\u8868\u5355\u63D0\u4EA4\u540EV8\u4E8B\u4EF6",ServerDataV8:"\u540E\u7AEF\u6570\u636E\u5904\u7406V8\u4E8B\u4EF6",OutFormV8:"\u524D\u7AEF\u8868\u5355\u63D0\u4EA4\u540EV8\u4E8B\u4EF6",DataFilterV8:"\u540E\u7AEF\u6570\u636E\u8FC7\u6EE4V8\u4E8B\u4EF6",DataLogBeforeClientV8:"\u524D\u7AEF\u6570\u636E\u65E5\u5FD7\u5199\u5165\u524DV8\u4E8B\u4EF6",DataLogBeforeServerV8:"\u540E\u7AEF\u6570\u636E\u65E5\u5FD7\u5199\u5165\u524DV8\u4E8B\u4EF6",DataLogAfterServerV8:"\u540E\u7AEF\u6570\u636E\u65E5\u5FD7\u5199\u5165\u540EV8\u4E8B\u4EF6",DataLogAfterClientV8:"\u524D\u7AEF\u6570\u636E\u65E5\u5FD7\u5199\u5165\u540EV8\u4E8B\u4EF6",DataCommentBeforeClientV8:"\u524D\u7AEF\u6570\u636E\u8BC4\u8BBA\u5199\u5165\u524DV8\u4E8B\u4EF6",DataCommentBeforeServerV8:"\u540E\u7AEF\u6570\u636E\u8BC4\u8BBA\u5199\u5165\u524DV8\u4E8B\u4EF6",DataCommentAfterServerV8:"\u540E\u7AEF\u6570\u636E\u8BC4\u8BBA\u5199\u5165\u540EV8\u4E8B\u4EF6",DataCommentAfterClientV8:"\u524D\u7AEF\u6570\u636E\u8BC4\u8BBA\u5199\u5165\u540EV8\u4E8B\u4EF6",DataVersionBeforeClientV8:"\u524D\u7AEF\u6570\u636E\u7248\u672C\u5199\u5165\u524DV8\u4E8B\u4EF6",DataVersionBeforeServerV8:"\u540E\u7AEF\u6570\u636E\u7248\u672C\u5199\u5165\u524DV8\u4E8B\u4EF6",DataVersionAfterServerV8:"\u540E\u7AEF\u6570\u636E\u7248\u672C\u5199\u5165\u540EV8\u4E8B\u4EF6",DataVersionAfterClientV8:"\u524D\u7AEF\u6570\u636E\u7248\u672C\u5199\u5165\u540EV8\u4E8B\u4EF6"},Xn={V8Code:"\u503C\u53D8\u66F4V8\u4E8B\u4EF6",KeyupV8Code:"\u952E\u76D8V8\u4E8B\u4EF6",V8TmpEngineTable:"\u6A21\u677FV8\u5F15\u64CE\uFF08\u8868\u683C\uFF09",V8TmpEngineForm:"\u6A21\u677FV8\u5F15\u64CE\uFF08\u8868\u5355\uFF09"},pt={PageTabs:"\u9875\u9762\u591ATab",PageBtns:"[\u9875\u9762]\u66F4\u591A\u6309\u94AE",MoreBtns:"[\u884C]\u66F4\u591A\u6309\u94AE",FormBtns:"[\u8868\u5355]\u66F4\u591A\u6309\u94AE",BatchSelectMoreBtns:"[\u6279\u91CF\u9009\u62E9]\u66F4\u591A\u6309\u94AE",ExportMoreBtns:"[\u5BFC\u51FA]\u66F4\u591A\u6309\u94AE"},At={SqlJoin:"Join\u5173\u8054",SqlWhere:"Where\u6761\u4EF6"},ts={StartV8:"\u8282\u70B9\u5F00\u59CB\u524D\u7AEFV8\u4E8B\u4EF6",EndV8:"\u8282\u70B9\u7ED3\u675F\u524D\u7AEFV8\u4E8B\u4EF6",StartV8Server:"\u8282\u70B9\u5F00\u59CB\u540E\u7AEFV8\u4E8B\u4EF6",EndV8Server:"\u8282\u70B9\u7ED3\u675F\u540E\u7AEFV8\u4E8B\u4EF6",LineValueV8:"\u6761\u4EF6\u5224\u65ADV8\u4E8B\u4EF6",AllowAddUserV8Code:"\u5141\u8BB8\u6DFB\u52A0\u5BA1\u6279\u4EBAV8\u4E8B\u4EF6"},xt=".microi-typings",mn="v8-engine.d.ts",Zn=".github",er="copilot-instructions.md",tr="CLAUDE.md",nr="AGENTS.md",rr=".cursorrules",sr=".cursor/rules",ir="microi-skills.mdc",z={LOGIN:"/api/SysUser/Login",TOKEN_LOGIN:"/api/SysUser/tokenlogin",GET_SYS_CONFIG:"/api/DiyTable/GetSysConfig",GET_CAPTCHA:"/api/Captcha/GetCaptcha",GET_STATUS:"/api/V8Debug/GetStatus",GET_ENGINE_LIST:"/api/V8Debug/GetApiEngineList",UPDATE_ENGINE_CODE:"/api/V8Debug/UpdateApiEngineCode",EXECUTE_ENGINE:"/api/V8Debug/ExecuteApiEngine",UPLOAD_FILE_BASE64:"/api/V8Debug/UploadFileBase64",LIST_APPLICATIONS:"/api/V8Debug/ListApplications",GET_APPLICATION_CONTEXT:"/api/V8Debug/GetApplicationContext",GET_APPLICATION_FILE:"/api/V8Debug/GetApplicationFile",SYNC_MICRO_SERVICE_SOURCE:"/api/V8Debug/SyncMicroServiceSource",STAGE_MICRO_SERVICE_SOURCE_FILE:"/api/V8Debug/StageMicroServiceSourceFile",FINALIZE_MICRO_SERVICE_SOURCE_MANIFEST:"/api/V8Debug/FinalizeMicroServiceSourceManifest",UPLOAD_APPLICATION_ASSET_STREAM:"/api/V8Debug/UploadApplicationAssetStream",FINALIZE_APPLICATION_STREAM_PUBLISH:"/api/V8Debug/FinalizeApplicationStreamPublish",GET_EVENT_LIST:"/api/V8Debug/GetV8EventList",GET_EVENT_CODE:"/api/V8Debug/GetV8EventCode",UPDATE_EVENT_CODE:"/api/V8Debug/UpdateV8EventCode",EXECUTE_EVENT:"/api/V8Debug/ExecuteV8Event",GET_WORKFLOW_V8_EVENT_LIST:"/api/V8Debug/GetWorkflowV8EventList",GET_WORKFLOW_V8_EVENT_CODE:"/api/V8Debug/GetWorkflowV8EventCode",UPDATE_WORKFLOW_V8_EVENT_CODE:"/api/V8Debug/UpdateWorkflowV8EventCode",GET_ENGINE_CODE:"/api/V8Debug/GetApiEngineCode",CREATE_ENGINE:"/api/V8Debug/CreateApiEngine",REFRESH_TOKEN:"/api/SysUser/RefreshToken",GET_DB_SCHEMA:"/api/V8Debug/GetDbSchema",LIST_MODULES:"/api/V8Debug/ListModules",GET_MODULE:"/api/V8Debug/GetModule",UPDATE_MODULE:"/api/V8Debug/UpdateModule",GET_FIELD_LIST:"/api/V8Debug/GetFieldList",UPDATE_FIELD:"/api/V8Debug/UpdateField",GET_PLAYWRIGHT_CONTEXT:"/api/V8Debug/GetPlaywrightContext",FORM_GET_DATA:"/api/FormEngine/GetFormData",FORM_GET_LIST:"/api/FormEngine/GetTableData",FORM_ADD:"/api/FormEngine/AddFormData",FORM_UPDATE:"/api/FormEngine/UptFormData",FORM_UPDATE_BY_WHERE:"/api/FormEngine/UptFormDataByWhere",FORM_DELETE_BY_WHERE:"/api/FormEngine/DelFormDataByWhere",DEBUG_WS:"/api/V8Debug/ws"},mt=".microi-db-schema.json",Ye=".microi-db-schema.md";var or=`\u26A0\uFE0F \u4FEE\u6539\u540E\u8BF7\u624B\u52A8\u63A8\u9001\u5230\u6570\u636E\u5E93
|
|
2
|
+
"use strict";var qi=Object.create;var es=Object.defineProperty;var Yi=Object.getOwnPropertyDescriptor;var Qi=Object.getOwnPropertyNames;var Xi=Object.getPrototypeOf,Zi=Object.prototype.hasOwnProperty;var mn=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports);var eo=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Qi(e))!Zi.call(s,r)&&r!==t&&es(s,r,{get:()=>e[r],enumerable:!(n=Yi(e,r))||n.enumerable});return s};var O=(s,e,t)=>(t=s!=null?qi(Xi(s)):{},eo(e||!s||!s.__esModule?es(t,"default",{value:s,enumerable:!0}):t,s));var Es=mn((Ya,ks)=>{"use strict";var{Transform:io}=require("stream"),{StringDecoder:oo}=require("string_decoder"),Cr=class extends io{constructor(e){super(Object.assign({},e,{writableObjectMode:!1})),this._buffer=""}_transform(e,t,n){typeof e=="string"?this._transform=this._transformString:(this._stringDecoder=new oo,this._transform=this._transformBuffer),this._transform(e,t,n)}_transformBuffer(e,t,n){this._buffer+=this._stringDecoder.write(e),this._processBuffer(n)}_transformString(e,t,n){this._buffer+=e.toString(),this._processBuffer(n)}_processBuffer(e){this._buffer&&(this.push(this._buffer,"utf8"),this._buffer=""),e(null)}_flushInput(){this._stringDecoder&&(this._buffer+=this._stringDecoder.end())}_flush(e){this._flushInput(),this._processBuffer(e)}};ks.exports=Cr});var _s=mn((Qa,Ts)=>{"use strict";var ao=Es(),J={value1:/^(?:[\"\{\[\]\-\d]|true\b|false\b|null\b|\s{1,256})/,string:/^(?:[^\x00-\x1f\"\\]{1,256}|\\[bfnrt\"\\\/]|\\u[\da-fA-F]{4}|\")/,key1:/^(?:[\"\}]|\s{1,256})/,colon:/^(?:\:|\s{1,256})/,comma:/^(?:[\,\]\}]|\s{1,256})/,ws:/^\s{1,256}/,numberStart:/^\d/,numberDigit:/^\d{0,256}/,numberFraction:/^[\.eE]/,numberExponent:/^[eE]/,numberExpSign:/^[-+]/},co=16,we=!0;try{new RegExp(".","y"),we=!1}catch{}!we&&Object.keys(J).forEach(s=>{let e=J[s].source.slice(1);e.slice(0,3)==="(?:"&&e.slice(-1)===")"&&(e=e.slice(3,-1)),J[s]=new RegExp(e,"y")});J.numberFracStart=J.numberExpStart=J.numberStart;J.numberFracDigit=J.numberExpDigit=J.numberDigit;var lo={true:!0,false:!1,null:null},Fe={object:"objectStop",array:"arrayStop","":"done"},uo=s=>String.fromCharCode(parseInt(s.slice(2),16)),go={b:"\b",f:"\f",n:`
|
|
3
|
+
`,r:"\r",t:" ",'"':'"',"\\":"\\","/":"/"},st=class s extends ao{static make(e){return new s(e)}constructor(e){super(Object.assign({},e,{readableObjectMode:!0})),this._packKeys=this._packStrings=this._packNumbers=this._streamKeys=this._streamStrings=this._streamNumbers=!0,e&&("packValues"in e&&(this._packKeys=this._packStrings=this._packNumbers=e.packValues),"packKeys"in e&&(this._packKeys=e.packKeys),"packStrings"in e&&(this._packStrings=e.packStrings),"packNumbers"in e&&(this._packNumbers=e.packNumbers),"streamValues"in e&&(this._streamKeys=this._streamStrings=this._streamNumbers=e.streamValues),"streamKeys"in e&&(this._streamKeys=e.streamKeys),"streamStrings"in e&&(this._streamStrings=e.streamStrings),"streamNumbers"in e&&(this._streamNumbers=e.streamNumbers),this._jsonStreaming=e.jsonStreaming),!this._packKeys&&(this._streamKeys=!0),!this._packStrings&&(this._streamStrings=!0),!this._packNumbers&&(this._streamNumbers=!0),this._done=!1,this._expect=this._jsonStreaming?"done":"value",this._stack=[],this._parent="",this._open_number=!1,this._accumulator=""}_flush(e){this._done=!0,super._flush(t=>{if(t)return e(t);this._open_number&&(this._streamNumbers&&this.push({name:"endNumber"}),this._open_number=!1,this._packNumbers&&(this.push({name:"numberValue",value:this._accumulator}),this._accumulator="")),e(null)})}_processBuffer(e){let t,n,r=0;e:for(;;)switch(this._expect){case"value1":case"value":if(J.value1.lastIndex=r,t=J.value1.exec(this._buffer),!t){if(this._done||r+co<this._buffer.length)return r<this._buffer.length?e(new Error("Parser cannot parse input: expected a value")):e(new Error("Parser has expected a value"));break e}switch(n=t[0],n){case'"':this._streamStrings&&this.push({name:"startString"}),this._expect="string";break;case"{":this.push({name:"startObject"}),this._stack.push(this._parent),this._parent="object",this._expect="key1";break;case"[":this.push({name:"startArray"}),this._stack.push(this._parent),this._parent="array",this._expect="value1";break;case"]":if(this._expect!=="value1")return e(new Error("Parser cannot parse input: unexpected token ']'"));this._open_number&&(this._streamNumbers&&this.push({name:"endNumber"}),this._open_number=!1,this._packNumbers&&(this.push({name:"numberValue",value:this._accumulator}),this._accumulator="")),this.push({name:"endArray"}),this._parent=this._stack.pop(),this._expect=Fe[this._parent];break;case"-":this._open_number=!0,this._streamNumbers&&(this.push({name:"startNumber"}),this.push({name:"numberChunk",value:"-"})),this._packNumbers&&(this._accumulator="-"),this._expect="numberStart";break;case"0":this._open_number=!0,this._streamNumbers&&(this.push({name:"startNumber"}),this.push({name:"numberChunk",value:"0"})),this._packNumbers&&(this._accumulator="0"),this._expect="numberFraction";break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":this._open_number=!0,this._streamNumbers&&(this.push({name:"startNumber"}),this.push({name:"numberChunk",value:n})),this._packNumbers&&(this._accumulator=n),this._expect="numberDigit";break;case"true":case"false":case"null":if(this._buffer.length-r===n.length&&!this._done)break e;this.push({name:n+"Value",value:lo[n]}),this._expect=Fe[this._parent];break}we?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"keyVal":case"string":if(J.string.lastIndex=r,t=J.string.exec(this._buffer),!t){if(r<this._buffer.length&&(this._done||this._buffer.length-r>=6))return e(new Error("Parser cannot parse input: escaped characters"));if(this._done)return e(new Error("Parser has expected a string value"));break e}if(n=t[0],n==='"')this._expect==="keyVal"?(this._streamKeys&&this.push({name:"endKey"}),this._packKeys&&(this.push({name:"keyValue",value:this._accumulator}),this._accumulator=""),this._expect="colon"):(this._streamStrings&&this.push({name:"endString"}),this._packStrings&&(this.push({name:"stringValue",value:this._accumulator}),this._accumulator=""),this._expect=Fe[this._parent]);else if(n.length>1&&n.charAt(0)==="\\"){let o=n.length==2?go[n.charAt(1)]:uo(n);(this._expect==="keyVal"?this._streamKeys:this._streamStrings)&&this.push({name:"stringChunk",value:o}),(this._expect==="keyVal"?this._packKeys:this._packStrings)&&(this._accumulator+=o)}else(this._expect==="keyVal"?this._streamKeys:this._streamStrings)&&this.push({name:"stringChunk",value:n}),(this._expect==="keyVal"?this._packKeys:this._packStrings)&&(this._accumulator+=n);we?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"key1":case"key":if(J.key1.lastIndex=r,t=J.key1.exec(this._buffer),!t){if(r<this._buffer.length||this._done)return e(new Error("Parser cannot parse input: expected an object key"));break e}if(n=t[0],n==='"')this._streamKeys&&this.push({name:"startKey"}),this._expect="keyVal";else if(n==="}"){if(this._expect!=="key1")return e(new Error("Parser cannot parse input: unexpected token '}'"));this.push({name:"endObject"}),this._parent=this._stack.pop(),this._expect=Fe[this._parent]}we?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"colon":if(J.colon.lastIndex=r,t=J.colon.exec(this._buffer),!t){if(r<this._buffer.length||this._done)return e(new Error("Parser cannot parse input: expected ':'"));break e}n=t[0],n===":"&&(this._expect="value"),we?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"arrayStop":case"objectStop":if(J.comma.lastIndex=r,t=J.comma.exec(this._buffer),!t){if(r<this._buffer.length||this._done)return e(new Error("Parser cannot parse input: expected ','"));break e}if(this._open_number&&(this._streamNumbers&&this.push({name:"endNumber"}),this._open_number=!1,this._packNumbers&&(this.push({name:"numberValue",value:this._accumulator}),this._accumulator="")),n=t[0],n===",")this._expect=this._expect==="arrayStop"?"value":"key";else if(n==="}"||n==="]"){if(n==="}"?this._expect==="arrayStop":this._expect!=="arrayStop")return e(new Error("Parser cannot parse input: expected '"+(this._expect==="arrayStop"?"]":"}")+"'"));this.push({name:n==="}"?"endObject":"endArray"}),this._parent=this._stack.pop(),this._expect=Fe[this._parent]}we?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"numberStart":if(J.numberStart.lastIndex=r,t=J.numberStart.exec(this._buffer),!t){if(r<this._buffer.length||this._done)return e(new Error("Parser cannot parse input: expected a starting digit"));break e}n=t[0],this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),this._expect=n==="0"?"numberFraction":"numberDigit",we?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"numberDigit":if(J.numberDigit.lastIndex=r,t=J.numberDigit.exec(this._buffer),!t){if(r<this._buffer.length||this._done)return e(new Error("Parser cannot parse input: expected a digit"));break e}if(n=t[0],n)this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),we?this._buffer=this._buffer.slice(n.length):r+=n.length;else{if(r<this._buffer.length){this._expect="numberFraction";break}if(this._done){this._expect=Fe[this._parent];break}break e}break;case"numberFraction":if(J.numberFraction.lastIndex=r,t=J.numberFraction.exec(this._buffer),!t){if(r<this._buffer.length||this._done){this._expect=Fe[this._parent];break}break e}n=t[0],this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),this._expect=n==="."?"numberFracStart":"numberExpSign",we?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"numberFracStart":if(J.numberFracStart.lastIndex=r,t=J.numberFracStart.exec(this._buffer),!t){if(r<this._buffer.length||this._done)return e(new Error("Parser cannot parse input: expected a fractional part of a number"));break e}n=t[0],this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),this._expect="numberFracDigit",we?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"numberFracDigit":if(J.numberFracDigit.lastIndex=r,t=J.numberFracDigit.exec(this._buffer),n=t[0],n)this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),we?this._buffer=this._buffer.slice(n.length):r+=n.length;else{if(r<this._buffer.length){this._expect="numberExponent";break}if(this._done){this._expect=Fe[this._parent];break}break e}break;case"numberExponent":if(J.numberExponent.lastIndex=r,t=J.numberExponent.exec(this._buffer),!t){if(r<this._buffer.length){this._expect=Fe[this._parent];break}if(this._done){this._expect="done";break}break e}n=t[0],this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),this._expect="numberExpSign",we?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"numberExpSign":if(J.numberExpSign.lastIndex=r,t=J.numberExpSign.exec(this._buffer),!t){if(r<this._buffer.length){this._expect="numberExpStart";break}if(this._done)return e(new Error("Parser has expected an exponent value of a number"));break e}n=t[0],this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),this._expect="numberExpStart",we?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"numberExpStart":if(J.numberExpStart.lastIndex=r,t=J.numberExpStart.exec(this._buffer),!t){if(r<this._buffer.length||this._done)return e(new Error("Parser cannot parse input: expected an exponent part of a number"));break e}n=t[0],this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),this._expect="numberExpDigit",we?this._buffer=this._buffer.slice(n.length):r+=n.length;break;case"numberExpDigit":if(J.numberExpDigit.lastIndex=r,t=J.numberExpDigit.exec(this._buffer),n=t[0],n)this._streamNumbers&&this.push({name:"numberChunk",value:n}),this._packNumbers&&(this._accumulator+=n),we?this._buffer=this._buffer.slice(n.length):r+=n.length;else{if(r<this._buffer.length||this._done){this._expect=Fe[this._parent];break}break e}break;case"done":if(J.ws.lastIndex=r,t=J.ws.exec(this._buffer),!t){if(r<this._buffer.length){if(this._jsonStreaming){this._expect="value";break}return e(new Error("Parser cannot parse input: unexpected characters"))}break e}n=t[0],this._open_number&&(this._streamNumbers&&this.push({name:"endNumber"}),this._open_number=!1,this._packNumbers&&(this.push({name:"numberValue",value:this._accumulator}),this._accumulator="")),we?this._buffer=this._buffer.slice(n.length):r+=n.length;break}!we&&(this._buffer=this._buffer.slice(r)),e(null)}};st.parser=st.make;st.make.Constructor=st;Ts.exports=st});var Is=mn((Xa,Ps)=>{"use strict";var po=s=>s.on("data",e=>s.emit(e.name,e.value));Ps.exports=po});var Ds=mn((Za,Rs)=>{"use strict";var wr=_s(),fo=Is(),br=s=>fo(new wr(s));br.Parser=wr;br.parser=wr.parser;Rs.exports=br});var ce=O(require("fs")),fe=O(require("path")),zi=O(require("readline"));var ts=O(require("os")),ns=process.cwd();function rs(s){ns=s}var to={append:s=>process.stderr.write(s),appendLine:(s="")=>console.error(s),clear:()=>{},show:()=>{},hide:()=>{},replace:s=>process.stderr.write(s),dispose:()=>{},name:"Microi CLI"},xt={get workspaceFolders(){return[{uri:{fsPath:ns}}]},workspaceFile:void 0,findFiles:async()=>[]},sr={machineId:ts.hostname()||"microi-cli",sessionId:`microi-cli-${process.pid}`},ut={executeCommand:async()=>{}},gt={Notification:15},ss={file:s=>({fsPath:s})},ve={createOutputChannel:()=>to,showInformationMessage:async()=>{},showWarningMessage:async()=>{},showErrorMessage:async()=>{},showTextDocument:async()=>{},onDidChangeWindowState:()=>({dispose:()=>{}}),withProgress:async(s,e)=>e({report:({message:t})=>t&&console.error(t)},{isCancellationRequested:!1,onCancellationRequested:()=>({dispose:()=>{}})})};var E=O(require("fs")),P=O(require("path"));var Dn=O(require("https")),Nn=O(require("http")),Yt=O(require("crypto")),Et=O(require("fs"));var Ie=O(require("path")),te=O(require("fs")),vs=O(require("crypto"));var ft=".microi-meta.json",hn=".microi-config.json",Ft=".microi-mcp-tokens.json";var is=".mcp.json";var xe="Microi-V8-Engine";var mt="\u63A5\u53E3\u5F15\u64CE",os="V8\u4E8B\u4EF6",ze="\u8868\u5355\u5F15\u64CE",tt="\u6A21\u5757\u5F15\u64CE",ht="\u6D41\u7A0B\u5F15\u64CE",as="AI\u5E94\u7528",yn="\u8868\u5355V8\u4E8B\u4EF6",Ot="\u5B57\u6BB5V8\u4E8B\u4EF6",Sn="\u8282\u70B9",cs={InFormV8:"\u524D\u7AEF\u8868\u5355\u8FDB\u5165V8\u4E8B\u4EF6",SubmitFormV8:"\u524D\u7AEF\u8868\u5355\u63D0\u4EA4\u524DV8\u4E8B\u4EF6",SubmitBeforeServerV8:"\u540E\u7AEF\u8868\u5355\u63D0\u4EA4\u524DV8\u4E8B\u4EF6",SubmitAfterServerV8:"\u540E\u7AEF\u8868\u5355\u63D0\u4EA4\u540EV8\u4E8B\u4EF6",ServerDataV8:"\u540E\u7AEF\u6570\u636E\u5904\u7406V8\u4E8B\u4EF6",OutFormV8:"\u524D\u7AEF\u8868\u5355\u63D0\u4EA4\u540EV8\u4E8B\u4EF6",DataFilterV8:"\u540E\u7AEF\u6570\u636E\u8FC7\u6EE4V8\u4E8B\u4EF6",DataLogBeforeClientV8:"\u524D\u7AEF\u6570\u636E\u65E5\u5FD7\u5199\u5165\u524DV8\u4E8B\u4EF6",DataLogBeforeServerV8:"\u540E\u7AEF\u6570\u636E\u65E5\u5FD7\u5199\u5165\u524DV8\u4E8B\u4EF6",DataLogAfterServerV8:"\u540E\u7AEF\u6570\u636E\u65E5\u5FD7\u5199\u5165\u540EV8\u4E8B\u4EF6",DataLogAfterClientV8:"\u524D\u7AEF\u6570\u636E\u65E5\u5FD7\u5199\u5165\u540EV8\u4E8B\u4EF6",DataCommentBeforeClientV8:"\u524D\u7AEF\u6570\u636E\u8BC4\u8BBA\u5199\u5165\u524DV8\u4E8B\u4EF6",DataCommentBeforeServerV8:"\u540E\u7AEF\u6570\u636E\u8BC4\u8BBA\u5199\u5165\u524DV8\u4E8B\u4EF6",DataCommentAfterServerV8:"\u540E\u7AEF\u6570\u636E\u8BC4\u8BBA\u5199\u5165\u540EV8\u4E8B\u4EF6",DataCommentAfterClientV8:"\u524D\u7AEF\u6570\u636E\u8BC4\u8BBA\u5199\u5165\u540EV8\u4E8B\u4EF6",DataVersionBeforeClientV8:"\u524D\u7AEF\u6570\u636E\u7248\u672C\u5199\u5165\u524DV8\u4E8B\u4EF6",DataVersionBeforeServerV8:"\u540E\u7AEF\u6570\u636E\u7248\u672C\u5199\u5165\u524DV8\u4E8B\u4EF6",DataVersionAfterServerV8:"\u540E\u7AEF\u6570\u636E\u7248\u672C\u5199\u5165\u540EV8\u4E8B\u4EF6",DataVersionAfterClientV8:"\u524D\u7AEF\u6570\u636E\u7248\u672C\u5199\u5165\u540EV8\u4E8B\u4EF6"},ir={V8Code:"\u503C\u53D8\u66F4V8\u4E8B\u4EF6",KeyupV8Code:"\u952E\u76D8V8\u4E8B\u4EF6",V8TmpEngineTable:"\u6A21\u677FV8\u5F15\u64CE\uFF08\u8868\u683C\uFF09",V8TmpEngineForm:"\u6A21\u677FV8\u5F15\u64CE\uFF08\u8868\u5355\uFF09"},yt={PageTabs:"\u9875\u9762\u591ATab",PageBtns:"[\u9875\u9762]\u66F4\u591A\u6309\u94AE",MoreBtns:"[\u884C]\u66F4\u591A\u6309\u94AE",FormBtns:"[\u8868\u5355]\u66F4\u591A\u6309\u94AE",BatchSelectMoreBtns:"[\u6279\u91CF\u9009\u62E9]\u66F4\u591A\u6309\u94AE",ExportMoreBtns:"[\u5BFC\u51FA]\u66F4\u591A\u6309\u94AE"},Vt={SqlJoin:"Join\u5173\u8054",SqlWhere:"Where\u6761\u4EF6"},ls={StartV8:"\u8282\u70B9\u5F00\u59CB\u524D\u7AEFV8\u4E8B\u4EF6",EndV8:"\u8282\u70B9\u7ED3\u675F\u524D\u7AEFV8\u4E8B\u4EF6",StartV8Server:"\u8282\u70B9\u5F00\u59CB\u540E\u7AEFV8\u4E8B\u4EF6",EndV8Server:"\u8282\u70B9\u7ED3\u675F\u540E\u7AEFV8\u4E8B\u4EF6",LineValueV8:"\u6761\u4EF6\u5224\u65ADV8\u4E8B\u4EF6",AllowAddUserV8Code:"\u5141\u8BB8\u6DFB\u52A0\u5BA1\u6279\u4EBAV8\u4E8B\u4EF6"},Bt=".microi-typings",Cn="v8-engine.d.ts",or=".github",ar="copilot-instructions.md",cr="CLAUDE.md",lr="AGENTS.md",dr=".cursorrules",ur=".cursor/rules",gr="microi-skills.mdc",z={LOGIN:"/api/SysUser/Login",TOKEN_LOGIN:"/api/SysUser/tokenlogin",GET_SYS_CONFIG:"/api/DiyTable/GetSysConfig",GET_CAPTCHA:"/api/Captcha/GetCaptcha",GET_STATUS:"/api/V8Debug/GetStatus",GET_ENGINE_LIST:"/api/V8Debug/GetApiEngineList",UPDATE_ENGINE_CODE:"/api/V8Debug/UpdateApiEngineCode",EXECUTE_ENGINE:"/api/V8Debug/ExecuteApiEngine",UPLOAD_FILE_BASE64:"/api/V8Debug/UploadFileBase64",LIST_APPLICATIONS:"/api/V8Debug/ListApplications",GET_APPLICATION_CONTEXT:"/api/V8Debug/GetApplicationContext",GET_APPLICATION_FILE:"/api/V8Debug/GetApplicationFile",SYNC_MICRO_SERVICE_SOURCE:"/api/V8Debug/SyncMicroServiceSource",STAGE_MICRO_SERVICE_SOURCE_FILE:"/api/V8Debug/StageMicroServiceSourceFile",FINALIZE_MICRO_SERVICE_SOURCE_MANIFEST:"/api/V8Debug/FinalizeMicroServiceSourceManifest",UPLOAD_APPLICATION_ASSET_STREAM:"/api/V8Debug/UploadApplicationAssetStream",FINALIZE_APPLICATION_STREAM_PUBLISH:"/api/V8Debug/FinalizeApplicationStreamPublish",GET_EVENT_LIST:"/api/V8Debug/GetV8EventList",GET_EVENT_CODE:"/api/V8Debug/GetV8EventCode",UPDATE_EVENT_CODE:"/api/V8Debug/UpdateV8EventCode",EXECUTE_EVENT:"/api/V8Debug/ExecuteV8Event",GET_WORKFLOW_V8_EVENT_LIST:"/api/V8Debug/GetWorkflowV8EventList",GET_WORKFLOW_V8_EVENT_CODE:"/api/V8Debug/GetWorkflowV8EventCode",UPDATE_WORKFLOW_V8_EVENT_CODE:"/api/V8Debug/UpdateWorkflowV8EventCode",GET_ENGINE_CODE:"/api/V8Debug/GetApiEngineCode",CREATE_ENGINE:"/api/V8Debug/CreateApiEngine",REFRESH_TOKEN:"/api/SysUser/RefreshToken",GET_DB_SCHEMA:"/api/V8Debug/GetDbSchema",LIST_MODULES:"/api/V8Debug/ListModules",GET_MODULE:"/api/V8Debug/GetModule",UPDATE_MODULE:"/api/V8Debug/UpdateModule",GET_FIELD_LIST:"/api/V8Debug/GetFieldList",UPDATE_FIELD:"/api/V8Debug/UpdateField",GET_PLAYWRIGHT_CONTEXT:"/api/V8Debug/GetPlaywrightContext",FORM_GET_DATA:"/api/FormEngine/GetFormData",FORM_GET_LIST:"/api/FormEngine/GetTableData",FORM_ADD:"/api/FormEngine/AddFormData",FORM_UPDATE:"/api/FormEngine/UptFormData",FORM_UPDATE_BY_WHERE:"/api/FormEngine/UptFormDataByWhere",FORM_DELETE_BY_WHERE:"/api/FormEngine/DelFormDataByWhere",DEBUG_WS:"/api/V8Debug/ws"},St=".microi-db-schema.json",nt=".microi-db-schema.md";var pr=`\u26A0\uFE0F \u4FEE\u6539\u540E\u8BF7\u624B\u52A8\u63A8\u9001\u5230\u6570\u636E\u5E93
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
`;var
|
|
6
|
+
`;var Ct="microi.isLoggedIn";var fr="microi.authToken",Te="microi.username",_e="microi.password",ds=`-----BEGIN PUBLIC KEY-----
|
|
7
7
|
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7q21EG3HiSFNO9XFUJoMeyz2R
|
|
8
8
|
XaFX8UgCFE4d4pvK6IvQsWunm+WfYqgrSzBMS1LH1fstmZB0wnVUX1uGROaZTKGZ
|
|
9
9
|
1rS/MVn4i6CsPgP9Q7nFV6dZvbxro1byH/E3CV/Q1CgCDeue9FzQUlWQ+UZld8Jg
|
|
10
10
|
1DsI9VJ7gTHGL3R7sQIDAQAB
|
|
11
|
-
-----END PUBLIC KEY-----`;var Ee
|
|
12
|
-
`;)t++;else if(s[t]==="/"&&s[t+1]==="*"){for(t+=2;t<s.length&&!(s[t]==="*"&&s[t+1]==="/");)t++;t+=2}else e+=s[t],t++;return JSON.parse(e)}function
|
|
13
|
-
`),d=a.includes(
|
|
11
|
+
-----END PUBLIC KEY-----`;var Ee=O(require("fs")),de=O(require("path")),mr=require("child_process");var us="# Microi VS Code extension local runtime files";function wn(s){let e="",t=0;for(;t<s.length;)if(s[t]==='"'){let n=t;for(t++;t<s.length&&s[t]!=='"';)s[t]==="\\"&&t++,t++;t++,e+=s.slice(n,t)}else if(s[t]==="/"&&s[t+1]==="/")for(;t<s.length&&s[t]!==`
|
|
12
|
+
`;)t++;else if(s[t]==="/"&&s[t+1]==="*"){for(t+=2;t<s.length&&!(s[t]==="*"&&s[t+1]==="/");)t++;t+=2}else e+=s[t],t++;return JSON.parse(e)}function Ce(s){Ee.existsSync(s)||Ee.mkdirSync(s,{recursive:!0})}function gs(s){return s.replace(/\\/g,"/").replace(/^\.\//,"")}function ps(s){let e=s;for(;;){let t=de.join(e,".git");if(Ee.existsSync(t))try{let r=Ee.statSync(t);if(r.isDirectory())return{gitDir:t,workTreeRoot:e};if(r.isFile()){let i=Ee.readFileSync(t,"utf-8").match(/^gitdir:\s*(.+)$/m);if(i?.[1])return{gitDir:de.isAbsolute(i[1])?i[1]:de.resolve(e,i[1]),workTreeRoot:e}}}catch{return null}let n=de.dirname(e);if(n===e)return null;e=n}}function Je(s,e){try{let t=ps(s);if(!t)return;let n=de.join(t.gitDir,"info");Ce(n);let r=de.join(n,"exclude"),o=gs(de.relative(t.workTreeRoot,s)),i=e.map(p=>p.trim()).filter(Boolean).map(p=>gs(p.replace(/^\/+/,""))).map(p=>o?`${o}/${p}`:p),a=Ee.existsSync(r)?Ee.readFileSync(r,"utf-8"):"",c=new Set(a.split(/\r?\n/).map(p=>p.trim())),l=i.filter(p=>!c.has(p));if(!l.length)return;let g=a.length>0&&!a.endsWith(`
|
|
13
|
+
`),d=a.includes(us)?"":`${us}
|
|
14
14
|
`,u=`${g?`
|
|
15
15
|
`:""}${d}${l.join(`
|
|
16
16
|
`)}
|
|
17
|
-
`;Ee.appendFileSync(r,u,"utf-8")}catch{}}function
|
|
18
|
-
`)}function
|
|
17
|
+
`;Ee.appendFileSync(r,u,"utf-8")}catch{}}function wt(s){if(process.platform==="win32")try{let e=ps(s);if(!e)return;try{if((0,mr.execFileSync)("git",["config","--get","core.longpaths"],{cwd:e.workTreeRoot,encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0}).trim().toLowerCase()==="true")return}catch{}(0,mr.execFileSync)("git",["config","core.longpaths","true"],{cwd:e.workTreeRoot,stdio:"ignore",windowsHide:!0})}catch{}}function ee(s){let e=String(s||"").replace(/[<>:"/\\|?*\x00-\x1F]/g,"_").replace(/[. ]+$/g,""),t=!e||e==="."||e===".."?"_":e;return/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/i.test(t)?`_${t}`:t}function hr(s){return encodeURIComponent(String(s||"")).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function no(s){try{return decodeURIComponent(String(s||""))}catch{return String(s||"")}}function Ue(s){let e=s.indexOf(pr);return e!==-1?s.substring(e+pr.length):s}function ro(s){let e=s||"";if(!e.trim())return!1;let t=e.trimStart();return t.startsWith("var ")||t.startsWith("let ")||t.startsWith("const ")||t.startsWith("function")||t.startsWith("return")||t.startsWith("//")||t.startsWith("/*")||e.includes("V8.")||e.includes("return ")||e.includes("=>")||e.includes("console.")||e.includes(";")||e.includes("{")||e.includes(`
|
|
18
|
+
`)}function yr(s){let e=s||"",t=e.trim();if(!t||t.length%4!==0||!/^[A-Za-z0-9+/]+={0,2}$/.test(t))return e;try{let n=Buffer.from(t,"base64").toString("utf8");if(!n||n.includes("\uFFFD"))return e;let r=t.replace(/=+$/,""),o=Buffer.from(n,"utf8").toString("base64").replace(/=+$/,"");return r!==o?e:ro(n)?n:e}catch{return e}}function fs(s,e){let n=de.relative(e,s).split(de.sep);if(n.length>=5&&(n[2]===mt||n[2]==="api-engine")){let r=n[1],o=r.split(".")[0];if(n.length===5&&n[4]?.endsWith(".js")){let i=n[4].replace(".js",""),a=i.match(/\(([^)]+)\)$/);return a?{serverDir:n[0],osClientDir:r,osClient:o,category:n[3],apiEngineKey:no(a[1])}:{serverDir:n[0],osClientDir:r,osClient:o,category:n[3],apiEngineKey:i}}if(n.length>=6&&n[5]?.endsWith(".js"))return{serverDir:n[0],osClientDir:r,osClient:o,category:n[3],apiEngineKey:n[5].replace(".js","")}}return null}function ms(s,e){let n=de.relative(e,s).split(de.sep),r=o=>{let i=o.match(/[((]([^))]+)[))]\s*$/);return i?i[1]:o};if(n.length>=6&&n[2]===ze&&n[4]===yn){let o=n[1],i=o.split(".")[0],a=r(n[3]),c=n[5].replace(/\.js$/i,""),l=r(c);return{serverDir:n[0],osClientDir:o,osClient:i,formEngineKey:a,eventType:l}}if(n.length>=5&&(n[2]===os||n[2]==="v8-event"||n[2]==="v8-events")){let o=n[1],i=o.split(".")[0],a=r(n[3]);return{serverDir:n[0],osClientDir:o,osClient:i,formEngineKey:a,eventType:n[4].replace(/\.js$/i,"")}}return null}function Pe(s){return(s||new Date).toISOString().replace("T"," ").substring(0,19)}function hs(s,e){let n=de.relative(e,s).split(de.sep);if(n.length<7||n[2]!==ze||n[4]!==Ot)return null;let r=d=>{let u=d.match(/[((]([^))]+)[))]\s*$/);return u?u[1]:d},o=n[1],i=o.split(".")[0],a=r(n[3]),c=r(n[5]),l=n[6].replace(/\.js$/i,""),g=r(l);return{serverDir:n[0],osClientDir:o,osClient:i,tableName:a,fieldName:c,v8Key:g}}function ys(s,e){let n=de.relative(e,s).split(de.sep);if(n[2]!==tt)return null;let r=d=>{let u=d.match(/[((]([^))]+)[))]\s*$/);return u?u[1]:d},o=d=>d.replace(/[((][^))]+[))]\s*$/,"").trim()||d,i=n[1],a=i.split(".")[0],c=n.findIndex((d,u)=>u>2&&Object.prototype.hasOwnProperty.call(yt,r(d)));if(c<=3)return null;let l=r(n[c-1]),g=r(n[c]);if(n.length>c+1&&n[c+1].endsWith(".js")){let d=n[c+1].replace(/\.js$/i,""),u=r(d),p=o(d).replace(/_显隐判断$/,"")||o(d),f=d.includes("\u663E\u9690\u5224\u65AD")?"V8CodeShow":"V8Code";return{serverDir:n[0],osClientDir:i,osClient:a,moduleId:l,btnField:g,btnId:u,btnName:p,v8SubField:f}}if(n.length>c+2&&n[c+2].endsWith(".js")){let d=r(n[c+1]),u=o(n[c+1]),p=n[c+2].replace(/\.js$/i,""),f=r(p);return f!=="V8Code"&&f!=="V8CodeShow"?null:{serverDir:n[0],osClientDir:i,osClient:a,moduleId:l,btnField:g,btnId:d,btnName:u,v8SubField:f}}return null}function Ss(s,e){let n=de.relative(e,s).split(de.sep),r=n[n.length-1];if(n.length<5||n[2]!==tt||!r?.endsWith(".js"))return null;let o=l=>{let g=l.match(/[((]([^))]+)[))]\s*$/);return g?g[1]:l},i=o(r.replace(/\.js$/i,""));if(!Object.prototype.hasOwnProperty.call(Vt,i))return null;let a=o(n[n.length-2]);if(!a)return null;let c=n[1];return{serverDir:n[0],osClientDir:c,osClient:c.split(".")[0],moduleId:a,scriptField:i}}function Cs(s){let e=[],t=[{label:"tokens truncated",regex:/(?:\.\.\.|…)\s*[\d,.]+\s+tokens?\s+truncated\s*(?:\.\.\.|…)/i},{label:"Exit code",regex:/^\s*Exit code:\s*-?\d+\s*$/i},{label:"Process exited with code",regex:/^\s*Process exited with code\s+-?\d+\s*$/i},{label:"Chunk ID",regex:/^\s*Chunk ID:\s*\S+\s*$/i},{label:"Wall time",regex:/^\s*Wall time:\s*[\d.]+\s*(?:s|sec(?:ond)?s?)\s*$/i}];return s.replace(/\r\n/g,`
|
|
19
19
|
`).split(`
|
|
20
|
-
`).forEach((n,r)=>{for(let
|
|
21
|
-
`,"utf-8"),ee.renameSync(n,e)}finally{try{ee.existsSync(n)&&ee.unlinkSync(n)}catch{}}}async mutateWorkspaceConfig(e){let t=this.getWorkspaceConfigPath();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");ee.mkdirSync(_e.dirname(t),{recursive:!0});let n=`${t}.lock`,r=Date.now()+3e3,i;for(;i===void 0;)try{i=ee.openSync(n,"wx",384),ee.writeFileSync(i,JSON.stringify({pid:process.pid,createdAt:Date.now()}),"utf-8")}catch(o){if(o.code!=="EEXIST")throw o;try{Date.now()-ee.statSync(n).mtimeMs>3e4&&ee.unlinkSync(n)}catch{}if(Date.now()>=r)throw new Error("Microi \u914D\u7F6E\u6B63\u5728\u88AB CLI \u6216 VS Code \u63D2\u4EF6\u4FEE\u6539\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");await new Promise(c=>setTimeout(c,40))}try{let o=this.readWorkspaceConfigForUpdate(t),a=this.normalizeSettings(e(o));return this.writeWorkspaceConfig(t,a),this.normalizeSettings(a)}finally{try{ee.closeSync(i)}catch{}try{ee.unlinkSync(n)}catch{}}}normalizeSettings(e){return{...this.defaultSettings,...e,profiles:Array.isArray(e.profiles)?e.profiles:[],showConsoleOnExecute:e.showConsoleOnExecute??this.defaultSettings.showConsoleOnExecute}}getSettings(){return this.normalizeSettings(this.readWorkspaceConfig())}async updateSettings(e){await this.mutateWorkspaceConfig(t=>({...t,...e}))}getProfiles(){return this.getSettings().profiles}findProfileByIdentity(e,t){let n=this.profileIdentity({apiBaseUrl:e,osClient:t});return this.getProfiles().find(r=>this.profileIdentity(r)===n)}async addProfile(e){await this.upsertProfiles([e])}async upsertProfiles(e){await this.mutateWorkspaceConfig(t=>{let n=Array.isArray(t.profiles)?[...t.profiles]:[];for(let r of e){let i=this.profileIdentity(r),o=n.findIndex(a=>this.profileIdentity(a)===i);if(o>=0){let a=n[o];n[o]={...a,...r,apiBaseUrl:a.apiBaseUrl,osClient:a.osClient}}else n.push(r)}return{...t,profiles:n}})}async removeProfile(e){let t=await this.mutateWorkspaceConfig(n=>{let r=Array.isArray(n.profiles)?[...n.profiles]:[];return r.splice(e,1),{...n,profiles:r}});this._activeProfileIndex>=t.profiles.length&&(this._activeProfileIndex=t.profiles.length-1)}profileIdentity(e){let t=String(e.apiBaseUrl||"").trim().replace(/\/+$/,""),n=t;try{let r=new URL(t);n=`${r.protocol.toLowerCase()}//${r.host.toLowerCase()}${r.pathname.replace(/\/+$/,"")}`}catch{n=t.toLowerCase()}return`${n}|${String(e.osClient||"").trim().toLowerCase()}`}setActiveProfile(e){this._activeProfileIndex=e}get activeProfileIndex(){return this._activeProfileIndex}getActiveProfile(){let e=this.getProfiles();if(this._activeProfileIndex>=0&&this._activeProfileIndex<e.length)return e[this._activeProfileIndex];let t=this.getSettings();return t.apiBaseUrl?{label:"",apiBaseUrl:t.apiBaseUrl,osClient:t.osClient}:e[0]}getWorkspaceRoot(){return Rt.workspaceFolders?.[0]?.uri.fsPath}getDefaultSyncRootDir(e){return this.ensureDefaultSyncDirCasing(e),_e.join(e,Ne)}ensureDefaultSyncDirCasing(e){try{if(!ee.existsSync(e))return;let t=ee.readdirSync(e,{withFileTypes:!0}).filter(a=>a.isDirectory());if(t.some(a=>a.name===Ne))return;let n=t.find(a=>a.name.toLowerCase()===Ne.toLowerCase());if(!n)return;let r=_e.join(e,n.name),i=_e.join(e,Ne),o=_e.join(e,`${Ne}.case-rename-${Date.now()}`);ee.renameSync(r,o);try{ee.renameSync(o,i)}catch(a){try{ee.renameSync(o,r)}catch{}throw a}}catch{this._syncDirCasingWarningShown||(this._syncDirCasingWarningShown=!0,F.warn(`Microi: \u65E0\u6CD5\u5C06\u65E7\u540C\u6B65\u76EE\u5F55\u91CD\u547D\u540D\u4E3A ${Ne}\uFF0C\u8BF7\u5173\u95ED\u6B63\u5728\u5360\u7528 microi-v8-engine \u7684\u6587\u4EF6\u3001\u7EC8\u7AEF\u6216\u6269\u5C55\u7A97\u53E3\u540E\u91CD\u542F VS Code\uFF0C\u6216\u624B\u52A8\u6539\u540D\u3002`))}}getWorkspaceSecretKey(e){let t=this.getWorkspaceRoot()||"no-workspace",n=_e.resolve(t).toLowerCase(),r=ms.createHash("sha256").update(n).digest("hex").slice(0,16);return`${e}.workspace.${r}`}getSyncRootDir(){let e=this.getSettings();if(e.localDir)return e.localDir;let t=this.getWorkspaceRoot();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");return this.getDefaultSyncRootDir(t)}getEngineDir(){return this.getSyncRootDir()}getEventDir(){return this.getSyncRootDir()}buildServerDirName(e,t){let n=t;try{n=new URL(t).host}catch{}return Z(`${e||"\u672A\u547D\u540D"} (${n})`)}buildOsClientDirName(e,t,n){return Z([e||"default",t||"default",n||"default"].join("."))}getApiBaseUrl(){let e=this.getActiveProfile();return e?.apiBaseUrl?e.apiBaseUrl:this.getSettings().apiBaseUrl||""}getOsClient(){let e=this.getActiveProfile();return e?.osClient?e.osClient:this.getSettings().osClient||""}};var fr=$(require("fs")),vs=$(require("crypto")),ks=require("stream"),Ts=require("stream/promises"),{parser:to}=Es();async function _s(s,e,t){if(!Number.isSafeInteger(t.size)||t.size<0)throw new Error("\u6E90\u7801\u6587\u4EF6\u5927\u5C0F\u4E0D\u5408\u6CD5");let n=await fr.promises.open(e,"wx",384),r=vs.createHash("sha256"),i=0,o=0,a=0,c="",l="",g=[],d=0,u,p="",m="",f=[],y=()=>{let E=f[f.length-1];return E?`${E.path}${E.path?".":""}${Array.isArray(E.value)?E.value.length:E.key}`:""},C=E=>{let O=f[f.length-1];if(!O){u=E;return}Array.isArray(O.value)?O.value.push(E):(O.value[O.key]=E,O.key=void 0)},h=async()=>{let E=Buffer.concat(g,d);g=[],d=0;for(let O=0;O<E.length;){let V=await n.write(E,O,E.length-O);if(!V.bytesWritten)throw new Error("\u6E90\u7801\u4E34\u65F6\u6587\u4EF6\u5199\u5165\u5931\u8D25");O+=V.bytesWritten}},S=async E=>{if(i+=E.length,i>t.size)throw new Error(`\u6E90\u7801\u5927\u5C0F\u8D85\u8FC7\u6E05\u5355\uFF1A${t.relativePath}`);r.update(E),g.push(E),d+=E.length,d>=64*1024&&await h()},w="",v=0,b=new ks.Transform({transform(E,O,V){v+=E.length,V(v>t.size*8+4*1024*1024?new Error("\u6E90\u7801\u54CD\u5E94\u8D85\u8FC7\u6E05\u5355\u4F20\u8F93\u9884\u7B97"):null,E)}}),_=to({packStrings:!1,streamStrings:!0,packKeys:!1,streamKeys:!0,packNumbers:!0,streamNumbers:!1});try{await(0,Ts.pipeline)(s,b,_,async R=>{for await(let L of R)switch(L.name){case"startObject":case"startArray":{if(f.length>32)throw new Error("\u6E90\u7801\u54CD\u5E94\u5D4C\u5957\u8FC7\u6DF1");let T=L.name==="startArray"?[]:Object.create(null),I=y();C(T),f.push({value:T,path:I,keys:new Set});break}case"endObject":case"endArray":f.pop();break;case"startKey":w="",p="#key";break;case"stringChunk":{if(p==="#key"){if(w+=L.value,w.length>4096)throw new Error("\u6E90\u7801\u54CD\u5E94\u5B57\u6BB5\u540D\u8FC7\u957F");break}if(!m){if(p.startsWith("Data.Application."))break;if(o+=Buffer.byteLength(L.value),o>1024*1024)throw new Error("\u6E90\u7801\u54CD\u5E94\u5143\u6570\u636E\u8FC7\u5927");c+=L.value;break}let T=l+L.value;if(m==="base64"){if(!/^[A-Za-z0-9+/=]*$/u.test(T))throw new Error("\u6E90\u7801 Base64 \u7F16\u7801\u4E0D\u5408\u6CD5");let I=Math.max(0,Math.floor(T.length/4)*4-4),x=T.slice(0,I);if(x.includes("="))throw new Error("\u6E90\u7801 Base64 padding \u4E0D\u5408\u6CD5");await S(Buffer.from(x,"base64")),l=T.slice(I)}else{let I=T.charCodeAt(T.length-1),x=I>=55296&&I<=56319?T.length-1:T.length;await S(Buffer.from(T.slice(0,x),"utf8")),l=T.slice(x)}break}case"endKey":{let T=f[f.length-1];if(o+=Buffer.byteLength(w),o>1024*1024)throw new Error("\u6E90\u7801\u54CD\u5E94\u5143\u6570\u636E\u8FC7\u5927");if(!T||T.keys.has(w))throw new Error("\u6E90\u7801\u54CD\u5E94\u5305\u542B\u91CD\u590D\u5B57\u6BB5");T.keys.add(w),T.key=w,p="";break}case"startString":if(c="",l="",p=y(),m=p==="Data.File.Content"?"utf8":p==="Data.File.FileByteBase64"?"base64":"",m&&++a>1)throw new Error("\u6E90\u7801\u54CD\u5E94\u5305\u542B\u591A\u4E2A\u5185\u5BB9\u5B57\u6BB5");break;case"endString":if(m==="base64"){let T=Buffer.from(l,"base64");if(T.toString("base64")!==l)throw new Error("\u6E90\u7801 Base64 \u5C3E\u90E8\u4E0D\u5B8C\u6574");await S(T)}else m&&await S(Buffer.from(l,"utf8"));C(m?"":c),m="";break;case"numberValue":C(Number(L.value));break;case"trueValue":C(!0);break;case"falseValue":C(!1);break;case"nullValue":C(null);break}}),await h();let E=u?.Data?.File;if(u?.Code!==1)throw new Error(u?.Msg||"\u8BFB\u53D6\u5E94\u7528\u6E90\u7801\u5931\u8D25");if(!E||E.ContentReadError||E.ContentSkipped||a!==1)throw new Error(E?.ContentReadError||"\u6E90\u7801\u54CD\u5E94\u6CA1\u6709\u5B8C\u6574\u6587\u4EF6\u5185\u5BB9");if(String(E.FilePath||E.Path||E.FileName||"").replace(/\\/g,"/")!==t.relativePath)throw new Error("\u6E90\u7801\u54CD\u5E94\u6587\u4EF6\u8DEF\u5F84\u4E0E\u8BF7\u6C42\u4E0D\u4E00\u81F4");if(i!==t.size)throw new Error(`\u6E90\u7801\u5927\u5C0F\u4E0E\u6E05\u5355\u4E0D\u4E00\u81F4\uFF1A${t.relativePath}`);let O=r.digest("hex"),V=String(E.ContentHash||E.Sha256||E.Hash||"").toLowerCase();if(t.sha256&&O!==t.sha256||V&&O!==V)throw new Error(`\u6E90\u7801 SHA-256 \u6821\u9A8C\u5931\u8D25\uFF1A${t.relativePath}`);return{size:i,sha256:O}}catch(E){throw await n.close(),await fr.promises.unlink(e).catch(()=>{}),E}finally{await n.close().catch(()=>{})}}function Is(s){if(s?.Code===1001||s?.Code===1002)return!0;let e=String(s?.DataAppend?.ReasonCode||"").trim();if(/^(MissingToken|MalformedToken|MissingClaims|TenantMismatch|AuthVersionChanged|JwtExpired|SessionExpired|SessionMissing|TokenReplaced|SignatureMismatch)$/i.test(e))return!0;let t=[s?.Msg,s?.DataAppend?.UserMessage,s?.DataAppend?.AppendMsg].filter(Boolean).join(" ");return/Token签名|Token.*(无效|失效|过期)|登录.*(无效|失效|过期)|invalid\s*token|token\s*invalid|signature\s*mismatch/i.test(t)}function Ot(s){if(!Is(s))return!1;let e=String(s?.DataAppend?.ReasonCode||"").trim();if(/^(InvalidTenant|InvalidOsClient|TenantNotFound|TenantDisabled)$/i.test(e))return!0;let t=[s?.Msg,s?.DataAppend?.UserMessage,s?.DataAppend?.Hint].filter(Boolean).join(" ");return/无效的租户标识|租户不存在|租户.*未启用|invalid\s+(tenant|osclient)|tenant\s+not\s+found|unknown\s+tenant/i.test(t)}function yn(s){return Is(s)&&!Ot(s)}function Ds(s){return/^[a-f0-9]{64}$/i.test(String(s||"").trim())}function Sn(s){try{let t=String(s||"").replace(/^Bearer\s+/i,"").trim().split(".");if(t.length!==3)return"";let r=JSON.parse(Buffer.from(t[1],"base64url").toString("utf8"))?.Did;return typeof r=="string"&&r===r.trim()&&!/^empty$/i.test(r)&&/^[\x20-\x7e]{1,128}$/.test(r)?r:""}catch{return""}}function Ps(s){try{let t=String(s||"").replace(/^Bearer\s+/i,"").trim().split(".");if(t.length<2)return;let n=t[1].replace(/-/g,"+").replace(/_/g,"/"),r=JSON.parse(Buffer.from(n,"base64").toString("utf-8")),i=Number(r.MicroiTokenIssuedAt??r.iat);return Number.isFinite(i)&&i>0?i:void 0}catch{return}}function yt(s,e,t=!1){let n=String(s||"").trim(),r=String(e||"").trim();if(!n)return r;if(!r||r===n)return n;let i=Ps(n),o=Ps(r);return i!==void 0&&o!==void 0&&i!==o?o>i?r:n:i===void 0&&o!==void 0?r:o===void 0&&i!==void 0?n:t?r:n}var hn=class{constructor(){this.inFlight=new Map}async run(e,t){let n=this.inFlight.get(e);if(n)return n;let r=Promise.resolve().then(t);this.inFlight.set(e,r);try{return await r}finally{this.inFlight.get(e)===r&&this.inFlight.delete(e)}}};var St=$(require("child_process")),Rs=require("crypto"),ge=$(require("fs")),kn=$(require("path")),Ct=".microi-workspace-secrets.dpapi.json";async function Ht(s,e,t=()=>{}){if(t(),s.storeMany){await s.storeMany(e);return}for(let[n,r]of Object.entries(e))t(),await s.store(n,r)}var Ns=["$ErrorActionPreference = 'Stop';","Add-Type -AssemblyName System.Security;","$inputBase64 = [Console]::In.ReadToEnd().Trim();","$plain = [Convert]::FromBase64String($inputBase64);","$cipher = [Security.Cryptography.ProtectedData]::Protect($plain, $null, [Security.Cryptography.DataProtectionScope]::CurrentUser);","[Console]::Out.Write([Convert]::ToBase64String($cipher));"].join(" "),Ms=["$ErrorActionPreference = 'Stop';","Add-Type -AssemblyName System.Security;","$inputBase64 = [Console]::In.ReadToEnd().Trim();","$cipher = [Convert]::FromBase64String($inputBase64);","$plain = [Security.Cryptography.ProtectedData]::Unprotect($cipher, $null, [Security.Cryptography.DataProtectionScope]::CurrentUser);","[Console]::Out.Write([Convert]::ToBase64String($plain));"].join(" ");function Cn(s,e){if(process.platform!=="win32")throw new Error("\u5F53\u524D\u64CD\u4F5C\u7CFB\u7EDF\u4E0D\u652F\u6301 Windows DPAPI \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93");let t=process.env.SystemRoot||"C:\\Windows",n=kn.join(t,"System32","WindowsPowerShell","v1.0","powershell.exe"),r=St.spawnSync(n,["-NoLogo","-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-Command",s],{input:e.toString("base64"),encoding:"utf8",windowsHide:!0,maxBuffer:4*1024*1024,timeout:15e3}),i=String(r.stdout||"").trim();if(r.error||r.status!==0||!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(i))throw new Error("Windows DPAPI \u64CD\u4F5C\u5931\u8D25\uFF1B\u51ED\u636E\u672A\u5199\u5165\u660E\u6587\u6587\u4EF6");return Buffer.from(i,"base64")}function no(s){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,s)}var hr="dpapi-session-v1:",Bt="keychain-session-v1:",Ut="secretservice-session-v1:",Ze="net.microi.cli.workspace.v1",jt="net.microi.cli.session.v1",wn=s=>(0,Rs.createHash)("sha256").update(s).digest("hex");function Kt(s,e,t,n){if(process.platform!=="linux"||!/^[a-f0-9]{64}$/.test(t)||![Ze,jt].includes(e))throw new Error("Linux Secret Service \u5F15\u7528\u683C\u5F0F\u65E0\u6548");let r=[s,...s==="store"?["--label=Microi CLI credentials"]:[],"service",e,"account",t],i=St.spawnSync("/usr/bin/secret-tool",r,{...s==="store"?{input:Buffer.from(n,"utf8").toString("base64")}:{},encoding:"utf8",timeout:15e3,maxBuffer:4*1024*1024});if(!i.error&&i.status===1&&!String(i.stderr||"").trim()&&s!=="store")return;if(i.error||i.status!==0)throw new Error("MICROI_SECURE_STORAGE_UNAVAILABLE\uFF1ALinux Secret Service \u4E0D\u53EF\u7528\uFF1B\u8BF7\u5B89\u88C5\u7CFB\u7EDF secret-tool \u5E76\u542F\u7528\u5F53\u524D\u7528\u6237\u7684 D-Bus \u4F1A\u8BDD\u548C\u5DF2\u89E3\u9501\u94A5\u5319\u73AF\u3002\u65E0\u5B89\u5168\u5B58\u50A8\u7684\u4E91\u5BBF\u4E3B\u4E0D\u80FD\u6301\u4E45\u5316\u51ED\u636E\uFF1B\u4E0D\u4F1A\u56DE\u9000\u660E\u6587\u6587\u4EF6\u3002");if(s!=="lookup")return;let o=String(i.stdout||"").trim();if(!o||Buffer.from(o,"base64").toString("base64")!==o)throw new Error("Linux Secret Service \u51ED\u636E\u683C\u5F0F\u65E0\u6548");return Buffer.from(o,"base64").toString("utf8")}function As(s,e,t){if(Kt("store",s,e,t),Kt("lookup",s,e)!==t)throw new Error("Linux Secret Service \u5199\u5165\u56DE\u8BFB\u4E0D\u4E00\u81F4\uFF1B\u672A\u56DE\u9000\u660E\u6587\u6587\u4EF6")}var bn=class{constructor(e){this.workspaceTokenFile=e;this.onDidChange=()=>({dispose:()=>{}})}account(e){return wn(`${this.workspaceTokenFile}\0${e}`)}async get(e){return Kt("lookup",Ze,this.account(e))}async store(e,t){As(Ze,this.account(e),t)}async delete(e){Kt("clear",Ze,this.account(e))}};function yr(s,e){if(process.platform!=="darwin")throw new Error("macOS Keychain is unavailable on this platform");let t=St.spawnSync("/usr/bin/security",["find-generic-password","-s",s,"-a",e,"-w"],{encoding:"utf8",timeout:15e3,maxBuffer:4*1024*1024});if(t.status===44)return;if(t.error||t.status!==0)throw new Error("macOS Keychain \u8BFB\u53D6\u5931\u8D25\uFF1B\u51ED\u636E\u672A\u5199\u5165\u660E\u6587\u6587\u4EF6");let n=String(t.stdout||"").trim();if(!/^[A-Za-z0-9+/]+={0,2}$/.test(n))throw new Error("macOS Keychain \u51ED\u636E\u683C\u5F0F\u65E0\u6548");return Buffer.from(n,"base64").toString("utf8")}function xs(s,e,t){if(process.platform!=="darwin")throw new Error("macOS Keychain is unavailable on this platform");let n=Buffer.from(t,"utf8").toString("base64"),r=`add-generic-password -U -s ${s} -a ${e} -w ${n}
|
|
22
|
-
`,
|
|
23
|
-
`,"utf8")}catch(
|
|
24
|
-
`,{encoding:"utf8",mode:384}),
|
|
25
|
-
`,document:{version:1,values:{...o.values}}}}finally{try{ge.existsSync(i)&&ge.unlinkSync(i)}catch{}try{ge.closeSync(r)}catch{}try{ge.unlinkSync(t)}catch{}}}readDocument(){if(!ge.existsSync(this.filePath))return this.decodedDocument=void 0,{version:1,values:{}};if(ge.statSync(this.filePath).size>2*1024*1024)throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u8D85\u8FC7\u5B89\u5168\u5927\u5C0F\u9650\u5236\uFF0C\u5DF2\u62D2\u7EDD\u8BFB\u53D6");let e,t=ge.readFileSync(this.filePath,"utf8");if(this.decodedDocument?.source===t)return{version:1,values:{...this.decodedDocument.document.values}};this.decodedDocument=void 0;try{e=JSON.parse(t)}catch{throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u4E14\u505C\u6B62\u8986\u76D6")}let n=this.decodeDocument(e);return this.decodedDocument={source:t,document:n},{version:1,values:{...n.values}}}decodeDocument(e){if(e.version!==1||e.protection!=="windows-dpapi-current-user"||typeof e.ciphertext!="string"||!e.ciphertext)throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u683C\u5F0F\u65E0\u6548\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u4E14\u505C\u6B62\u8986\u76D6");try{let t=this.unprotect(Buffer.from(e.ciphertext,"base64"));if(t.length===0)return{version:1,values:{}};let n=JSON.parse(t.toString("utf8"));if(n.version!==1||!n.values||typeof n.values!="object")throw new Error("invalid document");return n.values=Object.fromEntries(Object.entries(n.values).filter(r=>typeof r[0]=="string"&&typeof r[1]=="string")),n}catch{throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u65E0\u6CD5\u7531\u5F53\u524D Windows \u7528\u6237\u89E3\u5BC6\uFF0C\u5DF2\u505C\u6B62\u8986\u76D6")}}};var Fs="microi.authTokenMap",oo=64*1024;function ao(s){return new Promise((e,t)=>{let n=!1,r=()=>{s.removeListener("drain",o),s.removeListener("error",a),s.removeListener("close",c)},i=l=>{n||(n=!0,r(),l())},o=()=>i(e),a=l=>i(()=>t(l)),c=()=>i(()=>t(new Error("\u8BF7\u6C42\u8FDE\u63A5\u5728\u5199\u5165\u5B8C\u6210\u524D\u5173\u95ED")));s.once("drain",o),s.once("error",a),s.once("close",c)})}async function co(s,e,t){let n=Buffer.isBuffer(e)?e:Buffer.from(e,"utf8"),r=0;for(;r<n.length;){let i=Math.min(r+oo,n.length),o=s.write(n.subarray(r,i));r=i,t?.(r),o||await ao(s)}return s.end(),r}var j=class s{constructor(){this._strictTlsHosts=new Set;this._token="";this._tokenMap={};this._tokenPersistence=Promise.resolve();this._authRecoveryGate=new hn;this._authRecoveryWaiters=new Map}setStrictTlsHosts(e){this._strictTlsHosts=new Set(e.map(t=>t.toLowerCase()))}static getInstance(){return s._instance||(s._instance=new s),s._instance}setSecretStorage(e){this._secretStorage=e}setAuthRecoveryHandler(e){this._authRecoveryHandler=e}setResponseTokenAdmission(e){this._responseTokenAdmission=e}captureResponseTokenCommit(e){return this._responseTokenAdmission?.(e)||{current:()=>e.isRequestCurrent?.()!==!1,commit:async t=>e.isRequestCurrent?.()===!1?!1:(await this.setToken(t,e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork),!0)}}setTokenStateChangedHandler(e){this._tokenStateChangedHandler=e}async notifyTokenStateChanged(){if(this._tokenStateChangedHandler)try{await this._tokenStateChangedHandler()}catch{}}getDeviceId(e){let t=Sn(e);if(t)return t;let n=Rt.workspaceFile?.fsPath||Rt.workspaceFolders?.map(o=>o.uri.fsPath).sort().join("|")||Qn.sessionId||"empty-window",r=Gt.createHash("sha256").update(n.toLowerCase()).digest("hex").slice(0,16),i=`VSCode:${Qn.machineId||"Unknown"}:${r}`;return/^[\x20-\x7e]{1,128}$/.test(i)?i:`VSCode:${Gt.createHash("sha256").update(i,"utf8").digest("hex").slice(0,32)}`}tokenKey(e,t,n,r){return t?[e,t,n||"",r||""].join("|"):e}legacyCompactTokenKey(e,t,n,r){return[e,t,n,r].filter(Boolean).join("|")}legacyTokenScope(e,t){try{let n=e.trim().replace(/\/+$/,"").toLowerCase(),r=String(t||"").trim().toLowerCase(),i=N.getInstance().getProfiles().filter(a=>String(a.apiBaseUrl||"").trim().replace(/\/+$/,"").toLowerCase()===n);return{tenantKeyUnambiguous:i.filter(a=>String(a.osClient||"").trim().toLowerCase()===r).length<=1,apiKeyUnambiguous:i.length<=1}}catch{return{tenantKeyUnambiguous:!0,apiKeyUnambiguous:!0}}}tokenLookupKeys(e,t,n,r){let i=[],o=this.legacyTokenScope(e,t);if(t){let a=this.tokenKey(e,t,n,r),c=this.tokenKey(e,t,"",""),l=this.legacyCompactTokenKey(e,t,n,r);i.push(a),o.tenantKeyUnambiguous&&i.push(c),(l===a||o.tenantKeyUnambiguous)&&i.push(l),n&&o.tenantKeyUnambiguous&&i.push(this.legacyCompactTokenKey(e,t,n)),o.tenantKeyUnambiguous&&i.push(this.legacyCompactTokenKey(e,t))}return(!t||o.apiKeyUnambiguous)&&i.push(e),Array.from(new Set(i))}async persistTokens(){let e=this._tokenPersistence.then(()=>this.persistCurrentTokens(),()=>this.persistCurrentTokens());return this._tokenPersistence=e.catch(()=>{}),e}async persistCurrentTokens(){if(!this._secretStorage)return;let e=N.getInstance(),t=e.getWorkspaceSecretKey(ar),n=e.getWorkspaceSecretKey(Fs);if(this._token&&Object.keys(this._tokenMap).length>0){await Ht(this._secretStorage,{[t]:this._token,[n]:JSON.stringify(this._tokenMap)});return}this._token?await this._secretStorage.store(t,this._token):await this._secretStorage.delete(t),Object.keys(this._tokenMap).length>0?await this._secretStorage.store(n,JSON.stringify(this._tokenMap)):await this._secretStorage.delete(n)}async setToken(e,t,n,r,i){this._token=e,t&&(this._tokenMap[this.tokenKey(t,n,r,i)]=e),await this.persistTokens(),await this.notifyTokenStateChanged()}async loadToken(){if(this._token)return this._token;if(this._secretStorage){let e=N.getInstance();this._token=await this._secretStorage.get(e.getWorkspaceSecretKey(ar))||"";try{let t=await this._secretStorage.get(e.getWorkspaceSecretKey(Fs));t&&(this._tokenMap=JSON.parse(t))}catch{}}return this._token}getTokenForServer(e,t,n,r){let i=this.tokenLookupKeys(e,t,n,r),o="";for(let a of i)t&&a===e||(o=yt(o,this._tokenMap[a]));return o||i.includes(e)&&this._tokenMap[e]||""}getExactTokenForServer(e,t,n,r){return this._tokenMap[this.tokenKey(e,t,n,r)]||""}async adoptTokenFromSharedFile(e,t,n,r,i){await this.adoptTokensFromSharedFile([{token:e,apiBaseUrl:t,osClient:n,osClientType:r,osClientNetwork:i}])}async adoptTokensFromSharedFile(e){let t=0,n=!1;for(let r of e){let i=String(r.token||"").trim();if(!i)continue;let o=this.tokenKey(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork);this._tokenMap[o]!==i&&(this._tokenMap[o]=i,t+=1,n=!0);let a=yt(this._token,i);a!==this._token&&(this._token=a,n=!0)}return n&&await this.persistTokens(),t}async clearTokenForServer(e,t,n,r,i){let o=!1;for(let a of this.tokenLookupKeys(e,t,n,r))this._tokenMap[a]&&(!i||this._tokenMap[a]===i)&&(delete this._tokenMap[a],o=!0);this._token&&(!i||this._token===i)&&(this._token="",o=!0),o&&(await this.persistTokens(),await this.notifyTokenStateChanged())}async clearToken(){this._token="",this._tokenMap={},await this.persistTokens(),await this.notifyTokenStateChanged()}get hasToken(){return!!this._token||Object.keys(this._tokenMap).length>0}isInvalidRefreshToken(e,t){if(t===401||t===403)return!0;let n=String(e?.DataAppend?.ReasonCode||"");if(/^(MissingToken|MalformedToken|MissingClaims|TenantMismatch|AuthVersionChanged|JwtExpired|SessionExpired|SessionMissing|TokenReplaced)$/i.test(n))return!0;let r=e?.Msg||"";return e?.Code!==1&&/无效.*Token|Token.*无效|Token.*过期|登录.*过期|租户.*不一致|invalid\s*token|token\s*invalid/i.test(r)}serializeRequestBody(e,t){if(t==="form"){let n=new URLSearchParams;if(e&&typeof e=="object"&&!Array.isArray(e))for(let[r,i]of Object.entries(e))i!=null&&n.append(r,typeof i=="object"?JSON.stringify(i):String(i));return n.toString()}return JSON.stringify(e)}maskSensitiveBody(e){if(!e||typeof e!="object")return e;if(Array.isArray(e))return e.map(n=>this.maskSensitiveBody(n));let t={};for(let[n,r]of Object.entries(e))/^(pwd|password|authorization|token)$/i.test(n)?t[n]="***":r&&typeof r=="object"?t[n]=this.maskSensitiveBody(r):t[n]=r;return t}async refreshTokenForRequest(e,t,n,r){if(!t)return!1;let i=N.getInstance(),o=e.osClient||i.getOsClient()||"",a=r||this.captureResponseTokenCommit({apiBaseUrl:e.apiBaseUrl||n,osClient:e.osClient,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork});if(!a.current()||e.signal?.aborted)return!1;try{let c=await this.request({method:"POST",path:z.REFRESH_TOKEN,body:{authorization:t,OsClient:o||void 0,_ClientType:"VSCode"},apiBaseUrl:n,osClient:e.osClient,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork,allowAuthRetry:!1,persistResponseToken:!1,timeout:e.timeout,signal:e.signal,silent:e.silent});if(!a.current()||e.signal?.aborted)return!1;let l=c._headers?.authorization||"";return c.Code===1&&l?await a.commit(l)&&a.current()&&!e.signal?.aborted:(this.isInvalidRefreshToken(c,c._httpStatus)&&a.current()&&!e.signal?.aborted&&await this.clearTokenForServer(e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork,t),!1)}catch{return!1}}async recoverAuthForRequest(e,t){if(!this._authRecoveryHandler||e.signal?.aborted)return!1;let n=N.getInstance(),r={apiBaseUrl:e.apiBaseUrl||t,osClient:e.osClient||n.getOsClient()||void 0,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork,isRequestCurrent:()=>!e.signal?.aborted},i=this.tokenKey(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork),o=this._authRecoveryWaiters.get(i)||new Set;this._authRecoveryWaiters.set(i,o);let a=r.isRequestCurrent;o.add(a);let c={...r,isRequestCurrent:()=>[...o].some(l=>l())};try{return await this._authRecoveryGate.run(i,()=>this._authRecoveryHandler(c))}finally{o.delete(a),!o.size&&this._authRecoveryWaiters.get(i)===o&&this._authRecoveryWaiters.delete(i)}}async request(e){let t=N.getInstance(),n=e.apiBaseUrl||t.getApiBaseUrl();if(!n)throw new Error('\u672A\u914D\u7F6E API \u5730\u5740\uFF0C\u8BF7\u5148\u6267\u884C "Microi: \u914D\u7F6E\u8FDE\u63A5"');let r=!0,i=this.captureResponseTokenCommit({apiBaseUrl:n,osClient:e.osClient,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork,isRequestCurrent:()=>r&&!e.signal?.aborted}),o=i.current,a=new URL(n),l=a.pathname.replace(/\/+$/,"")+e.path;if(e.params){let S=new URLSearchParams;for(let[v,b]of Object.entries(e.params))b!==void 0&&b!==""&&S.append(v,b);let w=S.toString();w&&(l+=`?${w}`)}let g=a.protocol==="https:",d=g?Tn:_n,u=e.bodyFormat||"json",p=e.body!==void 0?this.serializeRequestBody(e.body,u):void 0,m={hostname:a.hostname,port:a.port||(g?443:80),path:l,method:e.method,headers:{"Content-Type":u==="form"?"application/x-www-form-urlencoded":"application/json",Accept:"application/json",did:this.getDeviceId()},timeout:e.timeout||3e4,rejectUnauthorized:this._strictTlsHosts.has(a.hostname.toLowerCase())};p!==void 0&&(m.headers["Content-Length"]=Buffer.byteLength(p));let f=e.allowAuthRetry!==!1,y=e.osClient||t.getOsClient()||"";y&&(m.headers.OsClient=y);let C=e.apiBaseUrl?this.getTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork):await this.loadToken();m.headers.did=this.getDeviceId(C),C&&(m.headers.Authorization=`Bearer ${C}`);let h=`${n}${l}`;if(e.silent||ye.log("API",`\u27A1\uFE0F ${e.method} ${h}`),e.body&&!e.silent){let S=JSON.stringify(this.maskSensitiveBody(e.body));ye.appendLine(` Body: ${S.length>500?S.substring(0,500)+"...(truncated)":S}`)}return new Promise((S,w)=>{let v=!1,b,_=new AbortController,E=()=>!v&&!_.signal.aborted&&!e.signal?.aborted,O={current:()=>E()&&i.current(),commit:G=>E()&&i.current()?i.commit(G):Promise.resolve(!1)},V=e.timeout||3e4,R=G=>{v||(v=!0,r=!1,clearTimeout(I),e.signal?.removeEventListener("abort",x),G())},L=G=>R(()=>S(G)),T=G=>R(()=>w(G)),I=setTimeout(()=>{_.abort(),b?.destroy(),T(new Error("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5\uFF1B\u670D\u52A1\u7AEF\u662F\u5426\u5DF2\u63D0\u4EA4\u672A\u77E5"))},V),x=()=>{_.abort(),b?.destroy(),T(new Error("\u8BF7\u6C42\u5DF2\u53D6\u6D88\uFF1B\u82E5\u5DF2\u63D0\u4EA4\u8BF7\u5148\u56DE\u8BFB\u7ED3\u679C"))},Y=p===void 0?0:Buffer.byteLength(p),Q=0;try{b=d.request(m,G=>{let ne=[];G.on("data",le=>ne.push(le)),G.on("error",T),G.on("aborted",()=>T(new Error("\u670D\u52A1\u5668\u63D0\u524D\u65AD\u5F00\u54CD\u5E94\uFF0C\u8BF7\u91CD\u8BD5\u8BFB\u53D6\u7ED3\u679C"))),G.on("end",()=>{(async()=>{if(v||e.signal?.aborted)return;let le=Buffer.concat(ne).toString("utf-8"),se=G.statusCode||0;if(!e.silent){ye.log("API",`\u2B05\uFE0F ${se} ${e.method} ${e.path}`);let ie=le.length>500?le.substring(0,500)+"...(truncated)":le;ye.appendLine(` Response: ${ie}`)}let M;try{M=JSON.parse(le)}catch{}if(M){let ie={};for(let[fe,De]of Object.entries(G.headers))typeof De=="string"&&(ie[fe.toLowerCase()]=De);M._headers=ie,Object.defineProperty(M,"_httpStatus",{value:se,enumerable:!1});let re=ie.authorization||"";if(e.persistResponseToken!==!1&&re&&re!==C&&o()&&!v&&!e.signal?.aborted&&await O.commit(re),!E())return;if(f&&Ot(M))ye.log("API",`\u26A0\uFE0F \u79DF\u6237\u8FDE\u63A5\u914D\u7F6E\u65E0\u6548\uFF0C\u5DF2\u505C\u6B62 token \u5237\u65B0\u4E0E\u9759\u9ED8\u91CD\u767B: ${M.Msg||""}`);else if(f&&o()&&yn(M)){ye.log("API",`\u{1F510} \u8EAB\u4EFD\u5DF2\u8FC7\u671F\uFF0C\u5C1D\u8BD5\u4F7F\u7528\u65E7 token \u5237\u65B0\u540E\u91CD\u8BD5: ${M.Msg||""}`);let fe=await this.refreshTokenForRequest({...e,signal:_.signal},C,n,O);if(!E())return;let De=fe||E()&&o()&&await this.recoverAuthForRequest({...e,signal:_.signal},n);if(!E())return;if(De){try{L(await this.request({...e,signal:_.signal,allowAuthRetry:!1}))}catch(Dt){T(Dt)}return}}L(M)}else if(se===401||se===403){if(f&&E()&&o()){let ie=await this.refreshTokenForRequest({...e,signal:_.signal},C,n,O);if(!E())return;let re=ie||E()&&o()&&await this.recoverAuthForRequest({...e,signal:_.signal},n);if(!E())return;if(re){try{L(await this.request({...e,signal:_.signal,allowAuthRetry:!1}))}catch(fe){T(fe)}return}}T(new Error(`\u8EAB\u4EFD\u9A8C\u8BC1\u5931\u8D25 (HTTP ${se})\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55`))}else if(se>=400){let ie=le.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim().substring(0,120);T(new Error(`\u670D\u52A1\u5668\u9519\u8BEF (HTTP ${se}): ${ie||"\u672A\u77E5\u9519\u8BEF"}`))}else T(new Error(`\u54CD\u5E94\u89E3\u6790\u5931\u8D25 (HTTP ${se}): ${le.substring(0,200)}`))})().catch(T)})})}catch(G){T(G);return}let me=!1;if(b.on("error",G=>{if(me)return;let ne=Ft(G),le=Y>0?`\uFF1B\u8BF7\u6C42\u4F53\u5DF2\u5206\u7247\u6392\u961F ${Q}/${Y} bytes\uFF0C\u670D\u52A1\u7AEF\u662F\u5426\u5DF2\u63D0\u4EA4\u672A\u77E5\uFF0C\u63D2\u4EF6\u4E0D\u4F1A\u76F2\u76EE\u91CD\u653E\u975E\u5E42\u7B49\u8BF7\u6C42`:"";e.silent||ye.log("API",`\u274C ${e.method} ${e.path} Error: ${ne}${le}`),T(new Error(`\u8BF7\u6C42\u5931\u8D25: ${ne}${le}`))}),b.on("timeout",()=>{me=!0,b.destroy(),e.silent||ye.log("API",`\u23F0 ${e.method} ${e.path} Timeout`),T(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),e.signal?.addEventListener("abort",x,{once:!0}),e.signal?.aborted){x();return}p!==void 0?co(b,p,G=>{Q=G}).catch(G=>{!me&&!b.destroyed&&b.destroy(G instanceof Error?G:new Error(String(G)))}):b.end()})}async get(e,t,n,r){return this.request({method:"GET",path:e,params:t,apiBaseUrl:n,osClient:r?.osClient,osClientType:r?.osClientType,osClientNetwork:r?.osClientNetwork})}async post(e,t,n,r,i,o,a){return this.request({method:"POST",path:e,body:t,params:n,apiBaseUrl:r,osClient:i?.osClient,osClientType:i?.osClientType,osClientNetwork:i?.osClientNetwork,timeout:o,silent:a})}async downloadApplicationSourceFile(e,t,n,r,i){let o=new URL(r);if(!["http:","https:"].includes(o.protocol)||o.username||o.password)throw new Error("\u6E90\u7801 API \u5730\u5740\u4E0D\u5408\u6CD5");let a=this.getTokenForServer(r,i.osClient,i.osClientType,i.osClientNetwork),c=JSON.stringify({OsClient:i.osClient,AppIdOrKey:e,FilePath:t.relativePath,IncludeContents:!0,MaxFileBytes:Math.max(1,t.size)});return new Promise((l,g)=>{let d=(o.protocol==="https:"?Tn:_n).request({hostname:o.hostname,port:o.port||(o.protocol==="https:"?443:80),path:o.pathname.replace(/\/+$/,"")+z.GET_APPLICATION_FILE,method:"POST",rejectUnauthorized:this._strictTlsHosts.has(o.hostname.toLowerCase()),headers:{"Content-Type":"application/json",Accept:"application/json","Content-Length":Buffer.byteLength(c),did:this.getDeviceId(a),...a?{Authorization:`Bearer ${a}`}:{},...i.osClient?{OsClient:i.osClient}:{}}},p=>{if(p.statusCode!==200){p.destroy(),g(new Error(`\u6E90\u7801\u4E0B\u8F7D\u5931\u8D25\uFF1AHTTP ${p.statusCode}`));return}_s(p,n,t).then(l,g)}),u=setTimeout(()=>d.destroy(new Error("\u6E90\u7801\u4E0B\u8F7D\u8D85\u65F6")),5*60*1e3);d.once("close",()=>clearTimeout(u)),d.once("error",g),d.end(c)})}async getRaw(e,t,n){let r=N.getInstance(),i=n||r.getApiBaseUrl();if(!i)throw new Error("\u672A\u914D\u7F6E API \u5730\u5740");let o=new URL(i),c=o.pathname.replace(/\/+$/,"")+e;if(t){let u=new URLSearchParams;for(let[m,f]of Object.entries(t))f!==void 0&&f!==""&&u.append(m,f);let p=u.toString();p&&(c+=`?${p}`)}let l=o.protocol==="https:",g=l?Tn:_n,d={hostname:o.hostname,port:o.port||(l?443:80),path:c,method:"GET",timeout:15e3,rejectUnauthorized:this._strictTlsHosts.has(o.hostname.toLowerCase())};return new Promise((u,p)=>{let m=g.request(d,f=>{let y=[];f.on("data",C=>y.push(C)),f.on("end",()=>{let C=Buffer.concat(y),h=f.headers.captchaid||"";u({data:C,captchaId:h,statusCode:f.statusCode||0,contentType:String(f.headers["content-type"]||"")})})});m.on("error",f=>p(new Error(`\u8BF7\u6C42\u5931\u8D25: ${f.message}`))),m.on("timeout",()=>{m.destroy(),p(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),m.end()})}async postMultipartFile(e,t,n,r,i,o,a=30*60*1e3){let c=wt.realpathSync(n),l=wt.lstatSync(c);if(!l.isFile()||l.isSymbolicLink())throw new Error(`\u4E0A\u4F20\u8D44\u4EA7\u5FC5\u987B\u662F\u666E\u901A\u6587\u4EF6\u4E14\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\uFF1A${n}`);if(!r||/[\r\n"]/u.test(r))throw new Error("\u4E0A\u4F20\u6587\u4EF6\u540D\u4E0D\u5408\u6CD5");let g=String(i||"").replace(/\/+$/,""),d=this.captureResponseTokenCommit({apiBaseUrl:g,osClient:o?.osClient,osClientType:o?.osClientType,osClientNetwork:o?.osClientNetwork}),u=new URL(g),p=`----microi-vscode-${Gt.randomBytes(24).toString("hex")}`,m=Object.entries(t).map(([_,E])=>Buffer.from(`--${p}\r
|
|
20
|
+
`).forEach((n,r)=>{for(let o of t)if(o.regex.test(n)){e.push({line:r+1,marker:o.label});break}}),e}function ws(s,e){let n=de.relative(e,s).split(de.sep);if(n.length<7||n[2]!==ht||n[4]!==Sn||!n[6]?.endsWith(".js"))return null;let r=g=>{let d=g.match(/[((]([^))]+)[))]\s*$/);return d?d[1]:g},o=n[1],i=o.split(".")[0],a=r(n[3]),c=r(n[5]),l=r(n[6].replace(/\.js$/i,""));return{serverDir:n[0],osClientDir:o,osClient:i,flowDesignId:a,nodeId:c,eventType:l}}function Lt(s){return String(s).padStart(2,"0")}function bs(s=new Date){return`${s.getFullYear()}-${Lt(s.getMonth()+1)}-${Lt(s.getDate())} ${Lt(s.getHours())}:${Lt(s.getMinutes())}:${Lt(s.getSeconds())}`}function rt(s,e,t){let n=String(t??"").trim();!n||e.has(n)||(e.add(n),s.push(n))}function $t(s){if(typeof s=="string")return s.trim()||"\u672A\u77E5\u9519\u8BEF";if(!s||typeof s!="object")return String(s??"\u672A\u77E5\u9519\u8BEF");let e=s,t=[],n=new Set;return rt(t,n,e.message),rt(t,n,e.code),rt(t,n,e.syscall),e.address&&rt(t,n,`address=${e.address}`),e.port!==void 0&&e.port!==null&&e.port!==""&&rt(t,n,`port=${e.port}`),(Array.isArray(e.errors)?e.errors:[]).forEach(o=>rt(t,n,$t(o))),t.length||rt(t,n,e.name),t.join(" | ")||"\u672A\u77E5\u9519\u8BEF"}var Se=class s{static init(){s._channel||(s._channel=ve.createOutputChannel("Microi \u543E\u7801"))}static get channel(){return s._channel}static log(e,t){s.init();let n=bs();s._channel.appendLine(`[${n}] [${e}] ${t}`)}static appendLine(e){s.init(),s._channel.appendLine(e)}static show(e){s._channel.show(e)}static dispose(){s._channel?.dispose()}};function so(s){return typeof s=="string"?s:s&&typeof s=="object"&&"title"in s?String(s.title||""):""}function Sr(s,e){return s.then(t=>{let n=so(t);return n&&Se.log("\u901A\u77E5/\u64CD\u4F5C",`${e}\u901A\u77E5\u9009\u62E9\uFF1A${n}`),t})}var V=class{static info(e,...t){return Se.log("\u901A\u77E5/\u4FE1\u606F",e),Sr(ve.showInformationMessage(e,...t),"\u4FE1\u606F")}static warn(e,...t){return Se.log("\u901A\u77E5/\u8B66\u544A",e),Sr(ve.showWarningMessage(e,...t),"\u8B66\u544A")}static error(e,...t){return Se.log("\u901A\u77E5/\u9519\u8BEF",e),Sr(ve.showErrorMessage(e,...t),"\u9519\u8BEF")}};var N=class s{constructor(){this._activeProfileIndex=-1;this._syncDirCasingWarningShown=!1;this.defaultSettings={apiBaseUrl:"",osClient:"",localDir:"",showConsoleOnExecute:!0,profiles:[]}}static getInstance(){return s._instance||(s._instance=new s),s._instance}getWorkspaceConfigPath(){let e=this.getWorkspaceRoot();if(e)return Ie.join(this.getDefaultSyncRootDir(e),hn)}getWorkspaceStateFilePath(e){let t=this.getWorkspaceRoot();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");return Ie.join(this.getDefaultSyncRootDir(t),e)}readWorkspaceConfig(){let e=this.getWorkspaceConfigPath();if(!e||!te.existsSync(e))return{};try{let t=JSON.parse(te.readFileSync(e,"utf-8"));return t&&typeof t=="object"?t:{}}catch{return{}}}readWorkspaceConfigForUpdate(e){if(!te.existsSync(e))return{};let t;try{t=JSON.parse(te.readFileSync(e,"utf-8"))}catch(n){throw new Error(`Microi \u914D\u7F6E\u6587\u4EF6\u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u5E76\u505C\u6B62\u5199\u5165\uFF1A${e}\uFF08${n instanceof Error?n.message:String(n)}\uFF09`)}if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Microi \u914D\u7F6E\u6587\u4EF6\u5FC5\u987B\u662F JSON \u5BF9\u8C61\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u5E76\u505C\u6B62\u5199\u5165\uFF1A${e}`);return t}writeWorkspaceConfig(e,t){te.mkdirSync(Ie.dirname(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;try{te.writeFileSync(n,`${JSON.stringify(t,null,2)}
|
|
21
|
+
`,"utf-8"),te.renameSync(n,e)}finally{try{te.existsSync(n)&&te.unlinkSync(n)}catch{}}}async mutateWorkspaceConfig(e){let t=this.getWorkspaceConfigPath();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");te.mkdirSync(Ie.dirname(t),{recursive:!0});let n=`${t}.lock`,r=Date.now()+3e3,o;for(;o===void 0;)try{o=te.openSync(n,"wx",384),te.writeFileSync(o,JSON.stringify({pid:process.pid,createdAt:Date.now()}),"utf-8")}catch(i){if(i.code!=="EEXIST")throw i;try{Date.now()-te.statSync(n).mtimeMs>3e4&&te.unlinkSync(n)}catch{}if(Date.now()>=r)throw new Error("Microi \u914D\u7F6E\u6B63\u5728\u88AB CLI \u6216 VS Code \u63D2\u4EF6\u4FEE\u6539\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");await new Promise(c=>setTimeout(c,40))}try{let i=this.readWorkspaceConfigForUpdate(t),a=this.normalizeSettings(e(i));return this.writeWorkspaceConfig(t,a),this.normalizeSettings(a)}finally{try{te.closeSync(o)}catch{}try{te.unlinkSync(n)}catch{}}}normalizeSettings(e){return{...this.defaultSettings,...e,profiles:Array.isArray(e.profiles)?e.profiles:[],showConsoleOnExecute:e.showConsoleOnExecute??this.defaultSettings.showConsoleOnExecute}}getSettings(){return this.normalizeSettings(this.readWorkspaceConfig())}async updateSettings(e){await this.mutateWorkspaceConfig(t=>({...t,...e}))}getProfiles(){return this.getSettings().profiles}findProfileByIdentity(e,t){let n=this.profileIdentity({apiBaseUrl:e,osClient:t});return this.getProfiles().find(r=>this.profileIdentity(r)===n)}async addProfile(e){await this.upsertProfiles([e])}async upsertProfiles(e){await this.mutateWorkspaceConfig(t=>{let n=Array.isArray(t.profiles)?[...t.profiles]:[];for(let r of e){let o=this.profileIdentity(r),i=n.findIndex(a=>this.profileIdentity(a)===o);if(i>=0){let a=n[i];n[i]={...a,...r,apiBaseUrl:a.apiBaseUrl,osClient:a.osClient}}else n.push(r)}return{...t,profiles:n}})}async removeProfile(e){let t=await this.mutateWorkspaceConfig(n=>{let r=Array.isArray(n.profiles)?[...n.profiles]:[];return r.splice(e,1),{...n,profiles:r}});this._activeProfileIndex>=t.profiles.length&&(this._activeProfileIndex=t.profiles.length-1)}profileIdentity(e){let t=String(e.apiBaseUrl||"").trim().replace(/\/+$/,""),n=t;try{let r=new URL(t);n=`${r.protocol.toLowerCase()}//${r.host.toLowerCase()}${r.pathname.replace(/\/+$/,"")}`}catch{n=t.toLowerCase()}return`${n}|${String(e.osClient||"").trim().toLowerCase()}`}setActiveProfile(e){this._activeProfileIndex=e}get activeProfileIndex(){return this._activeProfileIndex}getActiveProfile(){let e=this.getProfiles();if(this._activeProfileIndex>=0&&this._activeProfileIndex<e.length)return e[this._activeProfileIndex];let t=this.getSettings();return t.apiBaseUrl?{label:"",apiBaseUrl:t.apiBaseUrl,osClient:t.osClient}:e[0]}getWorkspaceRoot(){return xt.workspaceFolders?.[0]?.uri.fsPath}getDefaultSyncRootDir(e){return this.ensureDefaultSyncDirCasing(e),Ie.join(e,xe)}ensureDefaultSyncDirCasing(e){try{if(!te.existsSync(e))return;let t=te.readdirSync(e,{withFileTypes:!0}).filter(a=>a.isDirectory());if(t.some(a=>a.name===xe))return;let n=t.find(a=>a.name.toLowerCase()===xe.toLowerCase());if(!n)return;let r=Ie.join(e,n.name),o=Ie.join(e,xe),i=Ie.join(e,`${xe}.case-rename-${Date.now()}`);te.renameSync(r,i);try{te.renameSync(i,o)}catch(a){try{te.renameSync(i,r)}catch{}throw a}}catch{this._syncDirCasingWarningShown||(this._syncDirCasingWarningShown=!0,V.warn(`Microi: \u65E0\u6CD5\u5C06\u65E7\u540C\u6B65\u76EE\u5F55\u91CD\u547D\u540D\u4E3A ${xe}\uFF0C\u8BF7\u5173\u95ED\u6B63\u5728\u5360\u7528 microi-v8-engine \u7684\u6587\u4EF6\u3001\u7EC8\u7AEF\u6216\u6269\u5C55\u7A97\u53E3\u540E\u91CD\u542F VS Code\uFF0C\u6216\u624B\u52A8\u6539\u540D\u3002`))}}getWorkspaceSecretKey(e){let t=this.getWorkspaceRoot()||"no-workspace",n=Ie.resolve(t).toLowerCase(),r=vs.createHash("sha256").update(n).digest("hex").slice(0,16);return`${e}.workspace.${r}`}getSyncRootDir(){let e=this.getSettings();if(e.localDir)return e.localDir;let t=this.getWorkspaceRoot();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");return this.getDefaultSyncRootDir(t)}getEngineDir(){return this.getSyncRootDir()}getEventDir(){return this.getSyncRootDir()}buildServerDirName(e,t){let n=t;try{n=new URL(t).host}catch{}return ee(`${e||"\u672A\u547D\u540D"} (${n})`)}buildOsClientDirName(e,t,n){return ee([e||"default",t||"default",n||"default"].join("."))}getApiBaseUrl(){let e=this.getActiveProfile();return e?.apiBaseUrl?e.apiBaseUrl:this.getSettings().apiBaseUrl||""}getOsClient(){let e=this.getActiveProfile();return e?.osClient?e.osClient:this.getSettings().osClient||""}};var vr=O(require("fs")),Ns=O(require("crypto")),Ms=require("stream"),As=require("stream/promises"),{parser:mo}=Ds();async function xs(s,e,t){if(!Number.isSafeInteger(t.size)||t.size<0)throw new Error("\u6E90\u7801\u6587\u4EF6\u5927\u5C0F\u4E0D\u5408\u6CD5");let n=await vr.promises.open(e,"wx",384),r=Ns.createHash("sha256"),o=0,i=0,a=0,c="",l="",g=[],d=0,u,p="",f="",m=[],S=()=>{let v=m[m.length-1];return v?`${v.path}${v.path?".":""}${Array.isArray(v.value)?v.value.length:v.key}`:""},C=v=>{let B=m[m.length-1];if(!B){u=v;return}Array.isArray(B.value)?B.value.push(v):(B.value[B.key]=v,B.key=void 0)},h=async()=>{let v=Buffer.concat(g,d);g=[],d=0;for(let B=0;B<v.length;){let F=await n.write(v,B,v.length-B);if(!F.bytesWritten)throw new Error("\u6E90\u7801\u4E34\u65F6\u6587\u4EF6\u5199\u5165\u5931\u8D25");B+=F.bytesWritten}},y=async v=>{if(o+=v.length,o>t.size)throw new Error(`\u6E90\u7801\u5927\u5C0F\u8D85\u8FC7\u6E05\u5355\uFF1A${t.relativePath}`);r.update(v),g.push(v),d+=v.length,d>=64*1024&&await h()},w="",k=0,b=new Ms.Transform({transform(v,B,F){k+=v.length,F(k>t.size*8+4*1024*1024?new Error("\u6E90\u7801\u54CD\u5E94\u8D85\u8FC7\u6E05\u5355\u4F20\u8F93\u9884\u7B97"):null,v)}}),_=mo({packStrings:!1,streamStrings:!0,packKeys:!1,streamKeys:!0,packNumbers:!0,streamNumbers:!1});try{await(0,As.pipeline)(s,b,_,async D=>{for await(let L of D)switch(L.name){case"startObject":case"startArray":{if(m.length>32)throw new Error("\u6E90\u7801\u54CD\u5E94\u5D4C\u5957\u8FC7\u6DF1");let T=L.name==="startArray"?[]:Object.create(null),I=S();C(T),m.push({value:T,path:I,keys:new Set});break}case"endObject":case"endArray":m.pop();break;case"startKey":w="",p="#key";break;case"stringChunk":{if(p==="#key"){if(w+=L.value,w.length>4096)throw new Error("\u6E90\u7801\u54CD\u5E94\u5B57\u6BB5\u540D\u8FC7\u957F");break}if(!f){if(p.startsWith("Data.Application."))break;if(i+=Buffer.byteLength(L.value),i>1024*1024)throw new Error("\u6E90\u7801\u54CD\u5E94\u5143\u6570\u636E\u8FC7\u5927");c+=L.value;break}let T=l+L.value;if(f==="base64"){if(!/^[A-Za-z0-9+/=]*$/u.test(T))throw new Error("\u6E90\u7801 Base64 \u7F16\u7801\u4E0D\u5408\u6CD5");let I=Math.max(0,Math.floor(T.length/4)*4-4),x=T.slice(0,I);if(x.includes("="))throw new Error("\u6E90\u7801 Base64 padding \u4E0D\u5408\u6CD5");await y(Buffer.from(x,"base64")),l=T.slice(I)}else{let I=T.charCodeAt(T.length-1),x=I>=55296&&I<=56319?T.length-1:T.length;await y(Buffer.from(T.slice(0,x),"utf8")),l=T.slice(x)}break}case"endKey":{let T=m[m.length-1];if(i+=Buffer.byteLength(w),i>1024*1024)throw new Error("\u6E90\u7801\u54CD\u5E94\u5143\u6570\u636E\u8FC7\u5927");if(!T||T.keys.has(w))throw new Error("\u6E90\u7801\u54CD\u5E94\u5305\u542B\u91CD\u590D\u5B57\u6BB5");T.keys.add(w),T.key=w,p="";break}case"startString":if(c="",l="",p=S(),f=p==="Data.File.Content"?"utf8":p==="Data.File.FileByteBase64"?"base64":"",f&&++a>1)throw new Error("\u6E90\u7801\u54CD\u5E94\u5305\u542B\u591A\u4E2A\u5185\u5BB9\u5B57\u6BB5");break;case"endString":if(f==="base64"){let T=Buffer.from(l,"base64");if(T.toString("base64")!==l)throw new Error("\u6E90\u7801 Base64 \u5C3E\u90E8\u4E0D\u5B8C\u6574");await y(T)}else f&&await y(Buffer.from(l,"utf8"));C(f?"":c),f="";break;case"numberValue":C(Number(L.value));break;case"trueValue":C(!0);break;case"falseValue":C(!1);break;case"nullValue":C(null);break}}),await h();let v=u?.Data?.File;if(u?.Code!==1)throw new Error(u?.Msg||"\u8BFB\u53D6\u5E94\u7528\u6E90\u7801\u5931\u8D25");if(!v||v.ContentReadError||v.ContentSkipped||a!==1)throw new Error(v?.ContentReadError||"\u6E90\u7801\u54CD\u5E94\u6CA1\u6709\u5B8C\u6574\u6587\u4EF6\u5185\u5BB9");if(String(v.FilePath||v.Path||v.FileName||"").replace(/\\/g,"/")!==t.relativePath)throw new Error("\u6E90\u7801\u54CD\u5E94\u6587\u4EF6\u8DEF\u5F84\u4E0E\u8BF7\u6C42\u4E0D\u4E00\u81F4");if(o!==t.size)throw new Error(`\u6E90\u7801\u5927\u5C0F\u4E0E\u6E05\u5355\u4E0D\u4E00\u81F4\uFF1A${t.relativePath}`);let B=r.digest("hex"),F=String(v.ContentHash||v.Sha256||v.Hash||"").toLowerCase();if(t.sha256&&B!==t.sha256||F&&B!==F)throw new Error(`\u6E90\u7801 SHA-256 \u6821\u9A8C\u5931\u8D25\uFF1A${t.relativePath}`);return{size:o,sha256:B}}catch(v){throw await n.close(),await vr.promises.unlink(e).catch(()=>{}),v}finally{await n.close().catch(()=>{})}}function Os(s){if(s?.Code===1001||s?.Code===1002)return!0;let e=String(s?.DataAppend?.ReasonCode||"").trim();if(/^(MissingToken|MalformedToken|MissingClaims|TenantMismatch|AuthVersionChanged|JwtExpired|SessionExpired|SessionMissing|TokenReplaced|SignatureMismatch)$/i.test(e))return!0;let t=[s?.Msg,s?.DataAppend?.UserMessage,s?.DataAppend?.AppendMsg].filter(Boolean).join(" ");return/Token签名|Token.*(无效|失效|过期)|登录.*(无效|失效|过期)|invalid\s*token|token\s*invalid|signature\s*mismatch/i.test(t)}function Ut(s){if(!Os(s))return!1;let e=String(s?.DataAppend?.ReasonCode||"").trim();if(/^(InvalidTenant|InvalidOsClient|TenantNotFound|TenantDisabled)$/i.test(e))return!0;let t=[s?.Msg,s?.DataAppend?.UserMessage,s?.DataAppend?.Hint].filter(Boolean).join(" ");return/无效的租户标识|租户不存在|租户.*未启用|invalid\s+(tenant|osclient)|tenant\s+not\s+found|unknown\s+tenant/i.test(t)}function vn(s){return Os(s)&&!Ut(s)}function Vs(s){return/^[a-f0-9]{64}$/i.test(String(s||"").trim())}function kn(s){try{let t=String(s||"").replace(/^Bearer\s+/i,"").trim().split(".");if(t.length!==3)return"";let r=JSON.parse(Buffer.from(t[1],"base64url").toString("utf8"))?.Did;return typeof r=="string"&&r===r.trim()&&!/^empty$/i.test(r)&&/^[\x20-\x7e]{1,128}$/.test(r)?r:""}catch{return""}}function Fs(s){try{let t=String(s||"").replace(/^Bearer\s+/i,"").trim().split(".");if(t.length<2)return;let n=t[1].replace(/-/g,"+").replace(/_/g,"/"),r=JSON.parse(Buffer.from(n,"base64").toString("utf-8")),o=Number(r.MicroiTokenIssuedAt??r.iat);return Number.isFinite(o)&&o>0?o:void 0}catch{return}}function bt(s,e,t=!1){let n=String(s||"").trim(),r=String(e||"").trim();if(!n)return r;if(!r||r===n)return n;let o=Fs(n),i=Fs(r);return o!==void 0&&i!==void 0&&o!==i?i>o?r:n:o===void 0&&i!==void 0?r:i===void 0&&o!==void 0?n:t?r:n}var bn=class{constructor(){this.inFlight=new Map}async run(e,t){let n=this.inFlight.get(e);if(n)return n;let r=Promise.resolve().then(t);this.inFlight.set(e,r);try{return await r}finally{this.inFlight.get(e)===r&&this.inFlight.delete(e)}}};var vt=O(require("child_process")),Bs=require("crypto"),pe=O(require("fs")),Rn=O(require("path")),kt=".microi-workspace-secrets.dpapi.json";async function Jt(s,e,t=()=>{}){if(t(),s.storeMany){await s.storeMany(e);return}for(let[n,r]of Object.entries(e))t(),await s.store(n,r)}var Ls=["$ErrorActionPreference = 'Stop';","Add-Type -AssemblyName System.Security;","$inputBase64 = [Console]::In.ReadToEnd().Trim();","$plain = [Convert]::FromBase64String($inputBase64);","$cipher = [Security.Cryptography.ProtectedData]::Protect($plain, $null, [Security.Cryptography.DataProtectionScope]::CurrentUser);","[Console]::Out.Write([Convert]::ToBase64String($cipher));"].join(" "),$s=["$ErrorActionPreference = 'Stop';","Add-Type -AssemblyName System.Security;","$inputBase64 = [Console]::In.ReadToEnd().Trim();","$cipher = [Convert]::FromBase64String($inputBase64);","$plain = [Security.Cryptography.ProtectedData]::Unprotect($cipher, $null, [Security.Cryptography.DataProtectionScope]::CurrentUser);","[Console]::Out.Write([Convert]::ToBase64String($plain));"].join(" ");function En(s,e){if(process.platform!=="win32")throw new Error("\u5F53\u524D\u64CD\u4F5C\u7CFB\u7EDF\u4E0D\u652F\u6301 Windows DPAPI \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93");let t=process.env.SystemRoot||"C:\\Windows",n=Rn.join(t,"System32","WindowsPowerShell","v1.0","powershell.exe"),r=vt.spawnSync(n,["-NoLogo","-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-Command",s],{input:e.toString("base64"),encoding:"utf8",windowsHide:!0,maxBuffer:4*1024*1024,timeout:15e3}),o=String(r.stdout||"").trim();if(r.error||r.status!==0||!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(o))throw new Error("Windows DPAPI \u64CD\u4F5C\u5931\u8D25\uFF1B\u51ED\u636E\u672A\u5199\u5165\u660E\u6587\u6587\u4EF6");return Buffer.from(o,"base64")}function ho(s){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,s)}var kr="dpapi-session-v1:",Ht="keychain-session-v1:",Wt="secretservice-session-v1:",it="net.microi.cli.workspace.v1",Gt="net.microi.cli.session.v1",Tn=s=>(0,Bs.createHash)("sha256").update(s).digest("hex");function zt(s,e,t,n){if(process.platform!=="linux"||!/^[a-f0-9]{64}$/.test(t)||![it,Gt].includes(e))throw new Error("Linux Secret Service \u5F15\u7528\u683C\u5F0F\u65E0\u6548");let r=[s,...s==="store"?["--label=Microi CLI credentials"]:[],"service",e,"account",t],o=vt.spawnSync("/usr/bin/secret-tool",r,{...s==="store"?{input:Buffer.from(n,"utf8").toString("base64")}:{},encoding:"utf8",timeout:15e3,maxBuffer:4*1024*1024});if(!o.error&&o.status===1&&!String(o.stderr||"").trim()&&s!=="store")return;if(o.error||o.status!==0)throw new Error("MICROI_SECURE_STORAGE_UNAVAILABLE\uFF1ALinux Secret Service \u4E0D\u53EF\u7528\uFF1B\u8BF7\u5B89\u88C5\u7CFB\u7EDF secret-tool \u5E76\u542F\u7528\u5F53\u524D\u7528\u6237\u7684 D-Bus \u4F1A\u8BDD\u548C\u5DF2\u89E3\u9501\u94A5\u5319\u73AF\u3002\u65E0\u5B89\u5168\u5B58\u50A8\u7684\u4E91\u5BBF\u4E3B\u4E0D\u80FD\u6301\u4E45\u5316\u51ED\u636E\uFF1B\u4E0D\u4F1A\u56DE\u9000\u660E\u6587\u6587\u4EF6\u3002");if(s!=="lookup")return;let i=String(o.stdout||"").trim();if(!i||Buffer.from(i,"base64").toString("base64")!==i)throw new Error("Linux Secret Service \u51ED\u636E\u683C\u5F0F\u65E0\u6548");return Buffer.from(i,"base64").toString("utf8")}function Us(s,e,t){if(zt("store",s,e,t),zt("lookup",s,e)!==t)throw new Error("Linux Secret Service \u5199\u5165\u56DE\u8BFB\u4E0D\u4E00\u81F4\uFF1B\u672A\u56DE\u9000\u660E\u6587\u6587\u4EF6")}var _n=class{constructor(e){this.workspaceTokenFile=e;this.onDidChange=()=>({dispose:()=>{}})}account(e){return Tn(`${this.workspaceTokenFile}\0${e}`)}async get(e){return zt("lookup",it,this.account(e))}async store(e,t){Us(it,this.account(e),t)}async delete(e){zt("clear",it,this.account(e))}};function Er(s,e){if(process.platform!=="darwin")throw new Error("macOS Keychain is unavailable on this platform");let t=vt.spawnSync("/usr/bin/security",["find-generic-password","-s",s,"-a",e,"-w"],{encoding:"utf8",timeout:15e3,maxBuffer:4*1024*1024});if(t.status===44)return;if(t.error||t.status!==0)throw new Error("macOS Keychain \u8BFB\u53D6\u5931\u8D25\uFF1B\u51ED\u636E\u672A\u5199\u5165\u660E\u6587\u6587\u4EF6");let n=String(t.stdout||"").trim();if(!/^[A-Za-z0-9+/]+={0,2}$/.test(n))throw new Error("macOS Keychain \u51ED\u636E\u683C\u5F0F\u65E0\u6548");return Buffer.from(n,"base64").toString("utf8")}function js(s,e,t){if(process.platform!=="darwin")throw new Error("macOS Keychain is unavailable on this platform");let n=Buffer.from(t,"utf8").toString("base64"),r=`add-generic-password -U -s ${s} -a ${e} -w ${n}
|
|
22
|
+
`,o=vt.spawnSync("/usr/bin/security",["-q","-i"],{input:r,encoding:"utf8",timeout:15e3,maxBuffer:4*1024*1024});if(o.error||o.status!==0||Er(s,e)!==t)throw new Error("macOS Keychain \u5199\u5165\u6216\u56DE\u8BFB\u5931\u8D25\uFF1B\u51ED\u636E\u672A\u5199\u5165\u660E\u6587\u6587\u4EF6")}function yo(s,e){if(process.platform!=="darwin")throw new Error("macOS Keychain is unavailable on this platform");let t=vt.spawnSync("/usr/bin/security",["delete-generic-password","-s",s,"-a",e],{encoding:"utf8",timeout:15e3,maxBuffer:4*1024*1024});if(t.error||t.status!==0&&t.status!==44)throw new Error("macOS Keychain \u5220\u9664\u5931\u8D25")}var Pn=class{constructor(e){this.workspaceTokenFile=e;this.onDidChange=()=>({dispose:()=>{}})}account(e){return Tn(`${this.workspaceTokenFile}\0${e}`)}async get(e){return Er(it,this.account(e))}async store(e,t){js(it,this.account(e),t)}async delete(e){yo(it,this.account(e))}},jt=new Map,Kt=new Map;function qt(s){return typeof s=="string"&&(s.startsWith(kr)||s.startsWith(Ht)||s.startsWith(Wt))}function Ks(s){if(!s||qt(s))return s;if(process.platform==="darwin"){let e=Ht+Tn(s);return js(Gt,e.slice(Ht.length),s),e}if(process.platform==="linux"){let e=Wt+Tn(s);return Us(Gt,e.slice(Wt.length),s),e}return Kt.has(s)||(Kt.size>256&&Kt.clear(),Kt.set(s,kr+En(Ls,Buffer.from(s,"utf8")).toString("base64"))),Kt.get(s)}function Tr(s){if(typeof s!="string")return"";if(!qt(s))return s;if(s.startsWith(Wt)){let e=zt("lookup",Gt,s.slice(Wt.length));if(!e)throw new Error("Linux Secret Service Token \u5F15\u7528\u4E0D\u5B58\u5728");return e}if(s.startsWith(Ht)){let e=s.slice(Ht.length);if(!/^[a-f0-9]{64}$/.test(e))throw new Error("macOS Keychain Token \u5F15\u7528\u683C\u5F0F\u65E0\u6548");let t=Er(Gt,e);if(!t)throw new Error("macOS Keychain Token \u5F15\u7528\u4E0D\u5B58\u5728");return t}return jt.has(s)||(jt.size>256&&jt.clear(),jt.set(s,En($s,Buffer.from(s.slice(kr.length),"base64")).toString("utf8"))),jt.get(s)}function So(s){if(!Number.isInteger(s)||s<=1)return!1;try{return process.kill(s,0),!0}catch(e){return e.code==="EPERM"}}function Co(s){try{let e=JSON.parse(pe.readFileSync(s,"utf8"));return So(Number(e?.pid))}catch{return!1}}var In=class{constructor(e,t){this.filePath=e;this.onDidChange=()=>({dispose:()=>{}});this.protect=t?.protect||(n=>En(Ls,n)),this.unprotect=t?.unprotect||(n=>En($s,n))}async get(e){return this.readDocument().values[e]}async store(e,t){await this.storeMany({[e]:t})}async storeMany(e){this.mutate(t=>{for(let[n,r]of Object.entries(e))t.values[n]=r})}async delete(e){this.mutate(t=>{delete t.values[e]})}mutate(e){pe.mkdirSync(Rn.dirname(this.filePath),{recursive:!0});let t=`${this.filePath}.lock`,n=Date.now()+3e3,r;for(;r===void 0;)try{r=pe.openSync(t,"wx",384),pe.writeFileSync(r,`${JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()})}
|
|
23
|
+
`,"utf8")}catch(i){if(i.code!=="EEXIST")throw i;try{let a=Date.now()-pe.statSync(t).mtimeMs>3e4;(!Co(t)||a)&&pe.unlinkSync(t)}catch{}if(Date.now()>=n)throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u6B63\u88AB\u53E6\u4E00\u8FDB\u7A0B\u66F4\u65B0\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");ho(40)}let o=`${this.filePath}.${process.pid}.${Date.now()}.tmp`;try{let i=this.readDocument(),a=JSON.stringify(i);e(i);let c=JSON.stringify(i);if(a===c)return;let l=Buffer.from(c,"utf8"),g={version:1,protection:"windows-dpapi-current-user",ciphertext:this.protect(l).toString("base64")};if(!this.unprotect(Buffer.from(g.ciphertext,"base64")).equals(l))throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u52A0\u5BC6\u56DE\u8BFB\u4E0D\u4E00\u81F4\uFF0C\u5DF2\u4FDD\u7559\u539F\u4FDD\u9669\u5E93");pe.writeFileSync(o,`${JSON.stringify(g,null,2)}
|
|
24
|
+
`,{encoding:"utf8",mode:384}),pe.renameSync(o,this.filePath),this.decodedDocument={source:`${JSON.stringify(g,null,2)}
|
|
25
|
+
`,document:{version:1,values:{...i.values}}}}finally{try{pe.existsSync(o)&&pe.unlinkSync(o)}catch{}try{pe.closeSync(r)}catch{}try{pe.unlinkSync(t)}catch{}}}readDocument(){if(!pe.existsSync(this.filePath))return this.decodedDocument=void 0,{version:1,values:{}};if(pe.statSync(this.filePath).size>2*1024*1024)throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u8D85\u8FC7\u5B89\u5168\u5927\u5C0F\u9650\u5236\uFF0C\u5DF2\u62D2\u7EDD\u8BFB\u53D6");let e,t=pe.readFileSync(this.filePath,"utf8");if(this.decodedDocument?.source===t)return{version:1,values:{...this.decodedDocument.document.values}};this.decodedDocument=void 0;try{e=JSON.parse(t)}catch{throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u4E14\u505C\u6B62\u8986\u76D6")}let n=this.decodeDocument(e);return this.decodedDocument={source:t,document:n},{version:1,values:{...n.values}}}decodeDocument(e){if(e.version!==1||e.protection!=="windows-dpapi-current-user"||typeof e.ciphertext!="string"||!e.ciphertext)throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u683C\u5F0F\u65E0\u6548\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u4E14\u505C\u6B62\u8986\u76D6");try{let t=this.unprotect(Buffer.from(e.ciphertext,"base64"));if(t.length===0)return{version:1,values:{}};let n=JSON.parse(t.toString("utf8"));if(n.version!==1||!n.values||typeof n.values!="object")throw new Error("invalid document");return n.values=Object.fromEntries(Object.entries(n.values).filter(r=>typeof r[0]=="string"&&typeof r[1]=="string")),n}catch{throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u65E0\u6CD5\u7531\u5F53\u524D Windows \u7528\u6237\u89E3\u5BC6\uFF0C\u5DF2\u505C\u6B62\u8986\u76D6")}}};var Hs="microi.authTokenMap",wo=64*1024;function bo(s){return new Promise((e,t)=>{let n=!1,r=()=>{s.removeListener("drain",i),s.removeListener("error",a),s.removeListener("close",c)},o=l=>{n||(n=!0,r(),l())},i=()=>o(e),a=l=>o(()=>t(l)),c=()=>o(()=>t(new Error("\u8BF7\u6C42\u8FDE\u63A5\u5728\u5199\u5165\u5B8C\u6210\u524D\u5173\u95ED")));s.once("drain",i),s.once("error",a),s.once("close",c)})}async function vo(s,e,t){let n=Buffer.isBuffer(e)?e:Buffer.from(e,"utf8"),r=0;for(;r<n.length;){let o=Math.min(r+wo,n.length),i=s.write(n.subarray(r,o));r=o,t?.(r),i||await bo(s)}return s.end(),r}var j=class s{constructor(){this._strictTlsHosts=new Set;this._token="";this._tokenMap={};this._tokenPersistence=Promise.resolve();this._authRecoveryGate=new bn;this._authRecoveryWaiters=new Map}setStrictTlsHosts(e){this._strictTlsHosts=new Set(e.map(t=>t.toLowerCase()))}static getInstance(){return s._instance||(s._instance=new s),s._instance}setSecretStorage(e){this._secretStorage=e}setAuthRecoveryHandler(e){this._authRecoveryHandler=e}setResponseTokenAdmission(e){this._responseTokenAdmission=e}captureResponseTokenCommit(e){return this._responseTokenAdmission?.(e)||{current:()=>e.isRequestCurrent?.()!==!1,commit:async t=>e.isRequestCurrent?.()===!1?!1:(await this.setToken(t,e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork),!0)}}setTokenStateChangedHandler(e){this._tokenStateChangedHandler=e}async notifyTokenStateChanged(){if(this._tokenStateChangedHandler)try{await this._tokenStateChangedHandler()}catch{}}getDeviceId(e){let t=kn(e);if(t)return t;let n=xt.workspaceFile?.fsPath||xt.workspaceFolders?.map(i=>i.uri.fsPath).sort().join("|")||sr.sessionId||"empty-window",r=Yt.createHash("sha256").update(n.toLowerCase()).digest("hex").slice(0,16),o=`VSCode:${sr.machineId||"Unknown"}:${r}`;return/^[\x20-\x7e]{1,128}$/.test(o)?o:`VSCode:${Yt.createHash("sha256").update(o,"utf8").digest("hex").slice(0,32)}`}tokenKey(e,t,n,r){return t?[e,t,n||"",r||""].join("|"):e}legacyCompactTokenKey(e,t,n,r){return[e,t,n,r].filter(Boolean).join("|")}legacyTokenScope(e,t){try{let n=e.trim().replace(/\/+$/,"").toLowerCase(),r=String(t||"").trim().toLowerCase(),o=N.getInstance().getProfiles().filter(a=>String(a.apiBaseUrl||"").trim().replace(/\/+$/,"").toLowerCase()===n);return{tenantKeyUnambiguous:o.filter(a=>String(a.osClient||"").trim().toLowerCase()===r).length<=1,apiKeyUnambiguous:o.length<=1}}catch{return{tenantKeyUnambiguous:!0,apiKeyUnambiguous:!0}}}tokenLookupKeys(e,t,n,r){let o=[],i=this.legacyTokenScope(e,t);if(t){let a=this.tokenKey(e,t,n,r),c=this.tokenKey(e,t,"",""),l=this.legacyCompactTokenKey(e,t,n,r);o.push(a),i.tenantKeyUnambiguous&&o.push(c),(l===a||i.tenantKeyUnambiguous)&&o.push(l),n&&i.tenantKeyUnambiguous&&o.push(this.legacyCompactTokenKey(e,t,n)),i.tenantKeyUnambiguous&&o.push(this.legacyCompactTokenKey(e,t))}return(!t||i.apiKeyUnambiguous)&&o.push(e),Array.from(new Set(o))}async persistTokens(){let e=this._tokenPersistence.then(()=>this.persistCurrentTokens(),()=>this.persistCurrentTokens());return this._tokenPersistence=e.catch(()=>{}),e}async persistCurrentTokens(){if(!this._secretStorage)return;let e=N.getInstance(),t=e.getWorkspaceSecretKey(fr),n=e.getWorkspaceSecretKey(Hs);if(this._token&&Object.keys(this._tokenMap).length>0){await Jt(this._secretStorage,{[t]:this._token,[n]:JSON.stringify(this._tokenMap)});return}this._token?await this._secretStorage.store(t,this._token):await this._secretStorage.delete(t),Object.keys(this._tokenMap).length>0?await this._secretStorage.store(n,JSON.stringify(this._tokenMap)):await this._secretStorage.delete(n)}async setToken(e,t,n,r,o){this._token=e,t&&(this._tokenMap[this.tokenKey(t,n,r,o)]=e),await this.persistTokens(),await this.notifyTokenStateChanged()}async loadToken(){if(this._token)return this._token;if(this._secretStorage){let e=N.getInstance();this._token=await this._secretStorage.get(e.getWorkspaceSecretKey(fr))||"";try{let t=await this._secretStorage.get(e.getWorkspaceSecretKey(Hs));t&&(this._tokenMap=JSON.parse(t))}catch{}}return this._token}getTokenForServer(e,t,n,r){let o=this.tokenLookupKeys(e,t,n,r),i="";for(let a of o)t&&a===e||(i=bt(i,this._tokenMap[a]));return i||o.includes(e)&&this._tokenMap[e]||""}getExactTokenForServer(e,t,n,r){return this._tokenMap[this.tokenKey(e,t,n,r)]||""}async adoptTokenFromSharedFile(e,t,n,r,o){await this.adoptTokensFromSharedFile([{token:e,apiBaseUrl:t,osClient:n,osClientType:r,osClientNetwork:o}])}async adoptTokensFromSharedFile(e){let t=0,n=!1;for(let r of e){let o=String(r.token||"").trim();if(!o)continue;let i=this.tokenKey(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork);this._tokenMap[i]!==o&&(this._tokenMap[i]=o,t+=1,n=!0);let a=bt(this._token,o);a!==this._token&&(this._token=a,n=!0)}return n&&await this.persistTokens(),t}async clearTokenForServer(e,t,n,r,o){let i=!1;for(let a of this.tokenLookupKeys(e,t,n,r))this._tokenMap[a]&&(!o||this._tokenMap[a]===o)&&(delete this._tokenMap[a],i=!0);this._token&&(!o||this._token===o)&&(this._token="",i=!0),i&&(await this.persistTokens(),await this.notifyTokenStateChanged())}async clearToken(){this._token="",this._tokenMap={},await this.persistTokens(),await this.notifyTokenStateChanged()}get hasToken(){return!!this._token||Object.keys(this._tokenMap).length>0}isInvalidRefreshToken(e,t){if(t===401||t===403)return!0;let n=String(e?.DataAppend?.ReasonCode||"");if(/^(MissingToken|MalformedToken|MissingClaims|TenantMismatch|AuthVersionChanged|JwtExpired|SessionExpired|SessionMissing|TokenReplaced)$/i.test(n))return!0;let r=e?.Msg||"";return e?.Code!==1&&/无效.*Token|Token.*无效|Token.*过期|登录.*过期|租户.*不一致|invalid\s*token|token\s*invalid/i.test(r)}serializeRequestBody(e,t){if(t==="form"){let n=new URLSearchParams;if(e&&typeof e=="object"&&!Array.isArray(e))for(let[r,o]of Object.entries(e))o!=null&&n.append(r,typeof o=="object"?JSON.stringify(o):String(o));return n.toString()}return JSON.stringify(e)}maskSensitiveBody(e){if(!e||typeof e!="object")return e;if(Array.isArray(e))return e.map(n=>this.maskSensitiveBody(n));let t={};for(let[n,r]of Object.entries(e))/^(pwd|password|authorization|token)$/i.test(n)?t[n]="***":r&&typeof r=="object"?t[n]=this.maskSensitiveBody(r):t[n]=r;return t}async refreshTokenForRequest(e,t,n,r){if(!t)return!1;let o=N.getInstance(),i=e.osClient||o.getOsClient()||"",a=r||this.captureResponseTokenCommit({apiBaseUrl:e.apiBaseUrl||n,osClient:e.osClient,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork});if(!a.current()||e.signal?.aborted)return!1;try{let c=await this.request({method:"POST",path:z.REFRESH_TOKEN,body:{authorization:t,OsClient:i||void 0,_ClientType:"VSCode"},apiBaseUrl:n,osClient:e.osClient,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork,allowAuthRetry:!1,persistResponseToken:!1,timeout:e.timeout,signal:e.signal,silent:e.silent});if(!a.current()||e.signal?.aborted)return!1;let l=c._headers?.authorization||"";return c.Code===1&&l?await a.commit(l)&&a.current()&&!e.signal?.aborted:(this.isInvalidRefreshToken(c,c._httpStatus)&&a.current()&&!e.signal?.aborted&&await this.clearTokenForServer(e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork,t),!1)}catch{return!1}}async recoverAuthForRequest(e,t){if(!this._authRecoveryHandler||e.signal?.aborted)return!1;let n=N.getInstance(),r={apiBaseUrl:e.apiBaseUrl||t,osClient:e.osClient||n.getOsClient()||void 0,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork,isRequestCurrent:()=>!e.signal?.aborted},o=this.tokenKey(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork),i=this._authRecoveryWaiters.get(o)||new Set;this._authRecoveryWaiters.set(o,i);let a=r.isRequestCurrent;i.add(a);let c={...r,isRequestCurrent:()=>[...i].some(l=>l())};try{return await this._authRecoveryGate.run(o,()=>this._authRecoveryHandler(c))}finally{i.delete(a),!i.size&&this._authRecoveryWaiters.get(o)===i&&this._authRecoveryWaiters.delete(o)}}async request(e){let t=N.getInstance(),n=e.apiBaseUrl||t.getApiBaseUrl();if(!n)throw new Error('\u672A\u914D\u7F6E API \u5730\u5740\uFF0C\u8BF7\u5148\u6267\u884C "Microi: \u914D\u7F6E\u8FDE\u63A5"');let r=!0,o=this.captureResponseTokenCommit({apiBaseUrl:n,osClient:e.osClient,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork,isRequestCurrent:()=>r&&!e.signal?.aborted}),i=o.current,a=new URL(n),l=a.pathname.replace(/\/+$/,"")+e.path;if(e.params){let y=new URLSearchParams;for(let[k,b]of Object.entries(e.params))b!==void 0&&b!==""&&y.append(k,b);let w=y.toString();w&&(l+=`?${w}`)}let g=a.protocol==="https:",d=g?Dn:Nn,u=e.bodyFormat||"json",p=e.body!==void 0?this.serializeRequestBody(e.body,u):void 0,f={hostname:a.hostname,port:a.port||(g?443:80),path:l,method:e.method,headers:{"Content-Type":u==="form"?"application/x-www-form-urlencoded":"application/json",Accept:"application/json",did:this.getDeviceId()},timeout:e.timeout||3e4,rejectUnauthorized:this._strictTlsHosts.has(a.hostname.toLowerCase())};p!==void 0&&(f.headers["Content-Length"]=Buffer.byteLength(p));let m=e.allowAuthRetry!==!1,S=e.osClient||t.getOsClient()||"";S&&(f.headers.OsClient=S);let C=e.apiBaseUrl?this.getTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork):await this.loadToken();f.headers.did=this.getDeviceId(C),C&&(f.headers.Authorization=`Bearer ${C}`);let h=`${n}${l}`;if(e.silent||Se.log("API",`\u27A1\uFE0F ${e.method} ${h}`),e.body&&!e.silent){let y=JSON.stringify(this.maskSensitiveBody(e.body));Se.appendLine(` Body: ${y.length>500?y.substring(0,500)+"...(truncated)":y}`)}return new Promise((y,w)=>{let k=!1,b,_=new AbortController,v=()=>!k&&!_.signal.aborted&&!e.signal?.aborted,B={current:()=>v()&&o.current(),commit:G=>v()&&o.current()?o.commit(G):Promise.resolve(!1)},F=e.timeout||3e4,D=G=>{k||(k=!0,r=!1,clearTimeout(I),e.signal?.removeEventListener("abort",x),G())},L=G=>D(()=>y(G)),T=G=>D(()=>w(G)),I=setTimeout(()=>{_.abort(),b?.destroy(),T(new Error("\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5\uFF1B\u670D\u52A1\u7AEF\u662F\u5426\u5DF2\u63D0\u4EA4\u672A\u77E5"))},F),x=()=>{_.abort(),b?.destroy(),T(new Error("\u8BF7\u6C42\u5DF2\u53D6\u6D88\uFF1B\u82E5\u5DF2\u63D0\u4EA4\u8BF7\u5148\u56DE\u8BFB\u7ED3\u679C"))},Y=p===void 0?0:Buffer.byteLength(p),Q=0;try{b=d.request(f,G=>{let re=[];G.on("data",le=>re.push(le)),G.on("error",T),G.on("aborted",()=>T(new Error("\u670D\u52A1\u5668\u63D0\u524D\u65AD\u5F00\u54CD\u5E94\uFF0C\u8BF7\u91CD\u8BD5\u8BFB\u53D6\u7ED3\u679C"))),G.on("end",()=>{(async()=>{if(k||e.signal?.aborted)return;let le=Buffer.concat(re).toString("utf-8"),ie=G.statusCode||0;if(!e.silent){Se.log("API",`\u2B05\uFE0F ${ie} ${e.method} ${e.path}`);let oe=le.length>500?le.substring(0,500)+"...(truncated)":le;Se.appendLine(` Response: ${oe}`)}let M;try{M=JSON.parse(le)}catch{}if(M){let oe={};for(let[he,Me]of Object.entries(G.headers))typeof Me=="string"&&(oe[he.toLowerCase()]=Me);M._headers=oe,Object.defineProperty(M,"_httpStatus",{value:ie,enumerable:!1});let se=oe.authorization||"";if(e.persistResponseToken!==!1&&se&&se!==C&&i()&&!k&&!e.signal?.aborted&&await B.commit(se),!v())return;if(m&&Ut(M))Se.log("API",`\u26A0\uFE0F \u79DF\u6237\u8FDE\u63A5\u914D\u7F6E\u65E0\u6548\uFF0C\u5DF2\u505C\u6B62 token \u5237\u65B0\u4E0E\u9759\u9ED8\u91CD\u767B: ${M.Msg||""}`);else if(m&&i()&&vn(M)){Se.log("API",`\u{1F510} \u8EAB\u4EFD\u5DF2\u8FC7\u671F\uFF0C\u5C1D\u8BD5\u4F7F\u7528\u65E7 token \u5237\u65B0\u540E\u91CD\u8BD5: ${M.Msg||""}`);let he=await this.refreshTokenForRequest({...e,signal:_.signal},C,n,B);if(!v())return;let Me=he||v()&&i()&&await this.recoverAuthForRequest({...e,signal:_.signal},n);if(!v())return;if(Me){try{L(await this.request({...e,signal:_.signal,allowAuthRetry:!1}))}catch(At){T(At)}return}}L(M)}else if(ie===401||ie===403){if(m&&v()&&i()){let oe=await this.refreshTokenForRequest({...e,signal:_.signal},C,n,B);if(!v())return;let se=oe||v()&&i()&&await this.recoverAuthForRequest({...e,signal:_.signal},n);if(!v())return;if(se){try{L(await this.request({...e,signal:_.signal,allowAuthRetry:!1}))}catch(he){T(he)}return}}T(new Error(`\u8EAB\u4EFD\u9A8C\u8BC1\u5931\u8D25 (HTTP ${ie})\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55`))}else if(ie>=400){let oe=le.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim().substring(0,120);T(new Error(`\u670D\u52A1\u5668\u9519\u8BEF (HTTP ${ie}): ${oe||"\u672A\u77E5\u9519\u8BEF"}`))}else T(new Error(`\u54CD\u5E94\u89E3\u6790\u5931\u8D25 (HTTP ${ie}): ${le.substring(0,200)}`))})().catch(T)})})}catch(G){T(G);return}let me=!1;if(b.on("error",G=>{if(me)return;let re=$t(G),le=Y>0?`\uFF1B\u8BF7\u6C42\u4F53\u5DF2\u5206\u7247\u6392\u961F ${Q}/${Y} bytes\uFF0C\u670D\u52A1\u7AEF\u662F\u5426\u5DF2\u63D0\u4EA4\u672A\u77E5\uFF0C\u63D2\u4EF6\u4E0D\u4F1A\u76F2\u76EE\u91CD\u653E\u975E\u5E42\u7B49\u8BF7\u6C42`:"";e.silent||Se.log("API",`\u274C ${e.method} ${e.path} Error: ${re}${le}`),T(new Error(`\u8BF7\u6C42\u5931\u8D25: ${re}${le}`))}),b.on("timeout",()=>{me=!0,b.destroy(),e.silent||Se.log("API",`\u23F0 ${e.method} ${e.path} Timeout`),T(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),e.signal?.addEventListener("abort",x,{once:!0}),e.signal?.aborted){x();return}p!==void 0?vo(b,p,G=>{Q=G}).catch(G=>{!me&&!b.destroyed&&b.destroy(G instanceof Error?G:new Error(String(G)))}):b.end()})}async get(e,t,n,r){return this.request({method:"GET",path:e,params:t,apiBaseUrl:n,osClient:r?.osClient,osClientType:r?.osClientType,osClientNetwork:r?.osClientNetwork})}async post(e,t,n,r,o,i,a){return this.request({method:"POST",path:e,body:t,params:n,apiBaseUrl:r,osClient:o?.osClient,osClientType:o?.osClientType,osClientNetwork:o?.osClientNetwork,timeout:i,silent:a})}async downloadApplicationSourceFile(e,t,n,r,o){let i=new URL(r);if(!["http:","https:"].includes(i.protocol)||i.username||i.password)throw new Error("\u6E90\u7801 API \u5730\u5740\u4E0D\u5408\u6CD5");let a=this.getTokenForServer(r,o.osClient,o.osClientType,o.osClientNetwork),c=JSON.stringify({OsClient:o.osClient,AppIdOrKey:e,FilePath:t.relativePath,IncludeContents:!0,MaxFileBytes:Math.max(1,t.size)});return new Promise((l,g)=>{let d=(i.protocol==="https:"?Dn:Nn).request({hostname:i.hostname,port:i.port||(i.protocol==="https:"?443:80),path:i.pathname.replace(/\/+$/,"")+z.GET_APPLICATION_FILE,method:"POST",rejectUnauthorized:this._strictTlsHosts.has(i.hostname.toLowerCase()),headers:{"Content-Type":"application/json",Accept:"application/json","Content-Length":Buffer.byteLength(c),did:this.getDeviceId(a),...a?{Authorization:`Bearer ${a}`}:{},...o.osClient?{OsClient:o.osClient}:{}}},p=>{if(p.statusCode!==200){p.destroy(),g(new Error(`\u6E90\u7801\u4E0B\u8F7D\u5931\u8D25\uFF1AHTTP ${p.statusCode}`));return}xs(p,n,t).then(l,g)}),u=setTimeout(()=>d.destroy(new Error("\u6E90\u7801\u4E0B\u8F7D\u8D85\u65F6")),5*60*1e3);d.once("close",()=>clearTimeout(u)),d.once("error",g),d.end(c)})}async getRaw(e,t,n){let r=N.getInstance(),o=n||r.getApiBaseUrl();if(!o)throw new Error("\u672A\u914D\u7F6E API \u5730\u5740");let i=new URL(o),c=i.pathname.replace(/\/+$/,"")+e;if(t){let u=new URLSearchParams;for(let[f,m]of Object.entries(t))m!==void 0&&m!==""&&u.append(f,m);let p=u.toString();p&&(c+=`?${p}`)}let l=i.protocol==="https:",g=l?Dn:Nn,d={hostname:i.hostname,port:i.port||(l?443:80),path:c,method:"GET",timeout:15e3,rejectUnauthorized:this._strictTlsHosts.has(i.hostname.toLowerCase())};return new Promise((u,p)=>{let f=g.request(d,m=>{let S=[];m.on("data",C=>S.push(C)),m.on("end",()=>{let C=Buffer.concat(S),h=m.headers.captchaid||"";u({data:C,captchaId:h,statusCode:m.statusCode||0,contentType:String(m.headers["content-type"]||"")})})});f.on("error",m=>p(new Error(`\u8BF7\u6C42\u5931\u8D25: ${m.message}`))),f.on("timeout",()=>{f.destroy(),p(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),f.end()})}async postMultipartFile(e,t,n,r,o,i,a=30*60*1e3){let c=Et.realpathSync(n),l=Et.lstatSync(c);if(!l.isFile()||l.isSymbolicLink())throw new Error(`\u4E0A\u4F20\u8D44\u4EA7\u5FC5\u987B\u662F\u666E\u901A\u6587\u4EF6\u4E14\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\uFF1A${n}`);if(!r||/[\r\n"]/u.test(r))throw new Error("\u4E0A\u4F20\u6587\u4EF6\u540D\u4E0D\u5408\u6CD5");let g=String(o||"").replace(/\/+$/,""),d=this.captureResponseTokenCommit({apiBaseUrl:g,osClient:i?.osClient,osClientType:i?.osClientType,osClientNetwork:i?.osClientNetwork}),u=new URL(g),p=`----microi-vscode-${Yt.randomBytes(24).toString("hex")}`,f=Object.entries(t).map(([_,v])=>Buffer.from(`--${p}\r
|
|
26
26
|
Content-Disposition: form-data; name="${_}"\r
|
|
27
27
|
\r
|
|
28
|
-
${
|
|
29
|
-
`,"utf8")),
|
|
28
|
+
${v}\r
|
|
29
|
+
`,"utf8")),m=Buffer.from(`--${p}\r
|
|
30
30
|
Content-Disposition: form-data; name="file"; filename="${r}"\r
|
|
31
31
|
Content-Type: application/octet-stream\r
|
|
32
32
|
\r
|
|
33
|
-
`,"utf8"),
|
|
33
|
+
`,"utf8"),S=Buffer.concat([...f,m]),C=Buffer.from(`\r
|
|
34
34
|
--${p}--\r
|
|
35
|
-
`,"utf8"),h=o?this.getTokenForServer(g,o.osClient,o.osClientType,o.osClientNetwork):await this.loadToken(),S=u.protocol==="https:",w=S?Tn:_n,v=u.pathname.replace(/\/+$/,""),b={hostname:u.hostname,port:u.port||(S?443:80),path:v+e,method:"POST",timeout:a,rejectUnauthorized:this._strictTlsHosts.has(u.hostname.toLowerCase()),headers:{Accept:"application/json",...h?{Authorization:`Bearer ${h}`}:{},did:this.getDeviceId(h),...o?.osClient?{OsClient:o.osClient}:{},"Content-Type":`multipart/form-data; boundary=${p}`,"Content-Length":y.length+l.size+C.length}};return new Promise((_,E)=>{let O=!1,V=T=>{O||(O=!0,E(T))},R=w.request(b,T=>{let I=[];T.on("data",x=>I.push(x)),T.on("end",async()=>{if(O)return;let x=Buffer.concat(I).toString("utf8"),Y;try{Y=JSON.parse(x)}catch{V(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u54CD\u5E94\u4E0D\u662F JSON\uFF08HTTP ${T.statusCode||0}\uFF09`));return}let Q=String(T.headers.authorization||"");Q&&d.current()&&await d.commit(Q),O=!0,_(Y)})});R.on("error",T=>V(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u5931\u8D25\uFF1A${Ft(T)}`))),R.on("timeout",()=>{R.destroy(),V(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u8D85\u65F6\uFF08${a}ms\uFF09`))}),R.write(y);let L=wt.createReadStream(c);L.on("error",T=>{R.destroy(),V(new Error(`\u8BFB\u53D6\u672C\u5730\u53D1\u5E03\u8D44\u4EA7\u5931\u8D25\uFF1A${Ft(T)}`))}),L.on("end",()=>R.end(C)),L.pipe(R,{end:!1})})}};var bt=$(require("crypto")),q=$(require("fs")),zt=$(require("path"));var lo=60*60*1e3,uo=5*60,Os=24*60*60,go=2*60*1e3,po=60*1e3;function mo(s,e){let t=(e||"").trim();return t?bt.publicEncrypt({key:t,padding:bt.constants.RSA_PKCS1_PADDING},Buffer.from(s,"utf-8")).toString("base64"):s}var be=class s{constructor(){this._isLoggedIn=!1;this._refreshInProgress=!1;this._mcpTokenFilePath="";this._mcpAuthRecoveryDirPath="";this._mcpAuthRecoveryInProgress=new Set;this._mcpAuthRecoveryFailureUntil=new Map;this._mcpAuthRecoveryPassInProgress=!1;this._lastAuthWarning="";this._lastAuthWarningTime=0;this._loggedOutProfiles=new Set;this._profileAuthEpochs=new Map;this._profileLoginIntents=new Map;this._explicitLogins=new Map;this._profileAuthMutations=new Map;this.protectedMcpTokenKeys=new Set}profileIdentity(e){return this.mcpRecoveryIdentity(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork)}logoutMarkerKey(e){return this.secretKey("microi.explicitLogout."+this.profileIdentity(e))}profileEpoch(e){return this._profileAuthEpochs.get(this.profileIdentity(e))||0}nextProfileEpoch(e){let t=this.profileEpoch(e)+1;return this._profileAuthEpochs.set(this.profileIdentity(e),t),t}async isProfileLoggedOut(e){let t=this.profileIdentity(e),n=this.profileEpoch(e);return this._loggedOutProfiles.has(t)?!0:(await this._secretStorage?.get(this.logoutMarkerKey(e))==="1"&&this.profileEpoch(e)===n&&this._loggedOutProfiles.add(t),this._loggedOutProfiles.has(t))}profileAuthCurrent(e,t){return this.profileEpoch(e)===t&&!this._loggedOutProfiles.has(this.profileIdentity(e))}mutateProfile(e,t){return this.mutateProfiles([e],t)}mutateProfiles(e,t){let n=Array.from(new Set(e.map(a=>this.profileIdentity(a)))),i=Promise.all(n.map(a=>this._profileAuthMutations.get(a)||Promise.resolve())).then(t,t),o=i.then(()=>{},()=>{});for(let a of n)this._profileAuthMutations.set(a,o);return o.then(()=>{for(let a of n)this._profileAuthMutations.get(a)===o&&this._profileAuthMutations.delete(a)}),i}static getInstance(){return s._instance||(s._instance=new s),s._instance}setSecretStorage(e){this._secretStorage=e,j.getInstance().setResponseTokenAdmission(t=>{let n=N.getInstance(),r=t.osClient||n.getOsClient()||"",i=n.getProfiles().filter(d=>this.normalizeApiBaseUrl(d.apiBaseUrl)===this.normalizeApiBaseUrl(t.apiBaseUrl)&&this.normalizeOsClient(d.osClient)===this.normalizeOsClient(r)&&(!t.osClientType||this.normalizeIdentityPart(d.osClientType)===this.normalizeIdentityPart(t.osClientType))&&(!t.osClientNetwork||this.normalizeIdentityPart(d.osClientNetwork)===this.normalizeIdentityPart(t.osClientNetwork))),o=i.length===1?i[0]:{label:"",...t,osClient:r},a=this.profileEpoch(o),c=this.profileIdentity(o),l=this._profileLoginIntents.get(c)||0,g=()=>t.isRequestCurrent?.()!==!1&&i.length<=1&&this.profileAuthCurrent(o,a)&&(this._profileLoginIntents.get(c)||0)===l;return{current:g,commit:d=>this.mutateProfile(o,async()=>g()?(await j.getInstance().setToken(d,t.apiBaseUrl,t.osClient,t.osClientType,t.osClientNetwork),g()):!1)}}),j.getInstance().setTokenStateChangedHandler(async()=>{await this.writeMcpTokenFile()}),j.getInstance().setAuthRecoveryHandler(async t=>{let n=N.getInstance(),r=this.normalizeApiBaseUrl(t.apiBaseUrl),i=this.normalizeOsClient(t.osClient),o=this.normalizeIdentityPart(t.osClientType),a=this.normalizeIdentityPart(t.osClientNetwork),c=n.getProfiles().filter(d=>this.normalizeApiBaseUrl(d.apiBaseUrl)===r&&this.normalizeOsClient(d.osClient)===i),l=c.find(d=>this.normalizeIdentityPart(d.osClientType)===o&&this.normalizeIdentityPart(d.osClientNetwork)===a);if(!l&&!o&&!a&&c.length===1&&(l=c[0]),!l&&c.length===0&&(l={label:t.osClient||t.apiBaseUrl,apiBaseUrl:t.apiBaseUrl,osClient:t.osClient||"",osClientType:t.osClientType,osClientNetwork:t.osClientNetwork}),!l)return this.showAuthExpiredWarning("\u68C0\u6D4B\u5230\u540C\u4E00\u670D\u52A1\u5668\u4E0E\u79DF\u6237\u5B58\u5728\u591A\u4E2A\u8FDE\u63A5\u73AF\u5883\uFF0C\u65E0\u6CD5\u5B89\u5168\u5224\u65AD\u5E94\u6062\u590D\u54EA\u4E00\u4E2A\u767B\u5F55\u8EAB\u4EFD\u3002"),!1;let g=await this.reLoginForProfile(l,t.isRequestCurrent);return t.isRequestCurrent?.()===!1?!1:(g&&(this._isLoggedIn=!0,await at.executeCommand("setContext",ft,!0)),await this.writeMcpTokenFile(),g)})}setMcpTokenFilePath(e){this._mcpTokenFilePath=e,this._mcpAuthRecoveryDirPath=e?`${e}.recovery`:""}enableProtectedMcpTokens(e){let t=this.normalizeApiBaseUrl(e.apiBaseUrl),n=this.normalizeOsClient(e.osClient);this.protectedMcpTokenKeys.add(this.mcpRecoveryIdentity(t,n,e.osClientType,e.osClientNetwork)),this.protectedMcpTokenKeys.add(n?`${t}|${n}`:t)}get mcpTokenFilePath(){return this._mcpTokenFilePath}get mcpAuthRecoveryDirPath(){return this._mcpAuthRecoveryDirPath}async loadMcpTokenFile(){if(!this._mcpTokenFilePath||!q.existsSync(this._mcpTokenFilePath))return 0;let e;try{let i=JSON.parse(q.readFileSync(this._mcpTokenFilePath,"utf-8"));if(!i||typeof i!="object"||Array.isArray(i))return 0;for(let[o,a]of Object.entries(i))Wt(a)&&this.protectedMcpTokenKeys.add(o);e=Object.fromEntries(Object.entries(i).map(([o,a])=>[o,Sr(a)]))}catch{return 0}let t=j.getInstance(),n=N.getInstance().getProfiles(),r=[];for(let i of n){if(await this.isProfileLoggedOut(i))continue;let o=this.normalizeApiBaseUrl(i.apiBaseUrl),a=this.normalizeOsClient(i.osClient),c=this.mcpRecoveryIdentity(o,a,i.osClientType,i.osClientNetwork),g=n.filter(y=>this.normalizeApiBaseUrl(y.apiBaseUrl)===o&&this.normalizeOsClient(y.osClient)===a).length===1?[[o,a,i.osClientType,i.osClientNetwork].filter(Boolean).join("|"),[o,a,i.osClientType].filter(Boolean).join("|"),a?`${o}|${a}`:o]:[],d=typeof e[c]=="string"&&String(e[c]).trim()?String(e[c]).trim():"",u=g.map(y=>e[y]).find(y=>typeof y=="string"&&y.trim()),p=t.getTokenForServer(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork),m=t.getExactTokenForServer(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork),f=yt(p,d||u,!!d&&!m);!f||m===f||r.push({token:f,apiBaseUrl:i.apiBaseUrl,osClient:i.osClient,osClientType:i.osClientType,osClientNetwork:i.osClientNetwork,authEpoch:this.profileEpoch(i),profile:i})}return t.adoptTokensFromSharedFile(r.filter(i=>this.profileAuthCurrent(i.profile,i.authEpoch)))}get isLoggedIn(){return this._isLoggedIn}secretKey(e){return N.getInstance().getWorkspaceSecretKey(e)}normalizeApiBaseUrl(e){return(e||"").trim().replace(/\/+$/,"")}normalizeOsClient(e){return(e||"").trim()}normalizeIdentityPart(e){return(e||"").trim()}mcpRecoveryIdentity(e,t,n,r){return[this.normalizeApiBaseUrl(e),this.normalizeOsClient(t),this.normalizeIdentityPart(n),this.normalizeIdentityPart(r)].join("|")}serverSecretKey(e,t,n){return this.secretKey(`${e}.${this.normalizeApiBaseUrl(t)}|${this.normalizeOsClient(n)}`)}getCredentialSecretKeys(e){return{usernameKey:this.serverSecretKey(ve,e.apiBaseUrl,e.osClient),passwordKey:this.serverSecretKey(ke,e.apiBaseUrl,e.osClient)}}legacyServerSecretKey(e,t){return this.secretKey(`${e}.${this.normalizeApiBaseUrl(t)}`)}canUseLegacyCredential(e,t){let n=this.normalizeApiBaseUrl(e),r=this.normalizeOsClient(t);if(!n)return!1;let i=N.getInstance().getProfiles().filter(a=>this.normalizeApiBaseUrl(a.apiBaseUrl)===n);if(i.length===0)return!r;if(i.length===1)return!0;let o=i.filter(a=>this.normalizeOsClient(a.osClient)===r);return!!r&&o.length===i.length}async writeMcpTokenFile(){if(!this._mcpTokenFilePath)return;let e=j.getInstance(),t=N.getInstance(),n=t.getProfiles(),r=this._mcpTokenFilePath;if(!(n.some(f=>!!this.normalizeApiBaseUrl(f.apiBaseUrl)&&!!this.normalizeOsClient(f.osClient))||!!this.normalizeApiBaseUrl(t.getApiBaseUrl())&&!!this.normalizeOsClient(t.getOsClient()))&&!q.existsSync(r))return;let o={},a=new Set,c=[];for(let f of n){let y=this.normalizeApiBaseUrl(f.apiBaseUrl),C=this.normalizeOsClient(f.osClient),h=this.mcpRecoveryIdentity(y,C,f.osClientType,f.osClientNetwork);a.add(h);let S=n.filter(_=>this.normalizeApiBaseUrl(_.apiBaseUrl)===y&&this.normalizeOsClient(_.osClient)===C),w=C?`${y}|${C}`:y;S.length===1&&a.add(w);let b=await this.isProfileLoggedOut(f)?"":e.getTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork);c.push({profile:f,exactKey:h,legacyKey:S.length===1?w:void 0,currentToken:b,currentExactToken:e.getExactTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork)}),b&&(o[h]=b,S.length===1&&(o[w]=b))}let l=zt.dirname(r);q.existsSync(l)||q.mkdirSync(l,{recursive:!0});let g=`${r}.lock`,d=Date.now()+3e3,u;for(;u===void 0;)try{u=q.openSync(g,"wx",384),q.writeFileSync(u,JSON.stringify({pid:process.pid,createdAt:Date.now()}),"utf-8")}catch(f){if(f.code!=="EEXIST")throw f;try{Date.now()-q.statSync(g).mtimeMs>3e4&&q.unlinkSync(g)}catch{}if(Date.now()>=d)throw new Error("Microi MCP Token \u6587\u4EF6\u6B63\u5728\u88AB CLI \u6216 VS Code \u63D2\u4EF6\u4FEE\u6539\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");await new Promise(y=>setTimeout(y,40))}let p=`${r}.${process.pid}.${Date.now()}.tmp`,m=[];try{let f={};if(q.existsSync(r)){let h=JSON.parse(q.readFileSync(r,"utf-8"));if(!h||typeof h!="object"||Array.isArray(h))throw new Error(`Microi MCP Token \u6587\u4EF6\u5FC5\u987B\u662F JSON \u5BF9\u8C61\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1A${r}`);for(let[S,w]of Object.entries(h))Wt(w)&&this.protectedMcpTokenKeys.add(S);f=Object.fromEntries(Object.entries(h).filter(S=>typeof S[1]=="string"&&!!S[1]).map(([S,w])=>[S,Sr(w)]))}for(let h of c){if(h.legacyKey&&(this.protectedMcpTokenKeys.has(h.exactKey)||this.protectedMcpTokenKeys.has(h.legacyKey))&&(this.protectedMcpTokenKeys.add(h.exactKey),this.protectedMcpTokenKeys.add(h.legacyKey)),delete o[h.exactKey],h.legacyKey&&delete o[h.legacyKey],this._loggedOutProfiles.has(this.profileIdentity(h.profile)))continue;h.currentToken=e.getTokenForServer(h.profile.apiBaseUrl,h.profile.osClient,h.profile.osClientType,h.profile.osClientNetwork),h.currentExactToken=e.getExactTokenForServer(h.profile.apiBaseUrl,h.profile.osClient,h.profile.osClientType,h.profile.osClientNetwork);let S=f[h.exactKey]||"",w=h.legacyKey&&f[h.legacyKey]||"",v=yt(h.currentToken,S||w,!!S&&!h.currentExactToken);v&&(o[h.exactKey]=v,h.legacyKey&&(o[h.legacyKey]=v),v!==h.currentExactToken&&m.push({profile:h.profile,token:v,authEpoch:this.profileEpoch(h.profile)}))}for(let h of a)delete f[h];let y={...f,...o},C=Object.fromEntries(Object.entries(y).map(([h,S])=>[h,this.protectedMcpTokenKeys.has(h)?Vs(S):S]));q.writeFileSync(p,`${JSON.stringify(C,null,2)}
|
|
36
|
-
`,{encoding:"utf-8",mode:384});for(let h=0;;h++)try{q.renameSync(p,r);break}catch(S){let w=S.code;if(!["EPERM","EACCES","EBUSY"].includes(w||"")||h>=3)throw S;await new Promise(v=>setTimeout(v,20*2**h))}}finally{try{q.existsSync(p)&&q.unlinkSync(p)}catch{}try{q.closeSync(u)}catch{}try{q.unlinkSync(g)}catch{}}await e.adoptTokensFromSharedFile(m.filter(f=>this.profileAuthCurrent(f.profile,f.authEpoch)).map(f=>({token:f.token,apiBaseUrl:f.profile.apiBaseUrl,osClient:f.profile.osClient,osClientType:f.profile.osClientType,osClientNetwork:f.profile.osClientNetwork})))}tokenFingerprint(e){return bt.createHash("sha256").update(String(e||"")).digest("hex")}deleteMcpAuthRecoveryRequests(e,t){let n=this._mcpAuthRecoveryDirPath;if(!n||!q.existsSync(n))return;let r=[];try{r=q.readdirSync(n).filter(i=>i.endsWith(".json")).slice(0,200)}catch{return}for(let i of r){let o=zt.join(n,i);try{let a=JSON.parse(q.readFileSync(o,"utf-8")),c=this.normalizeApiBaseUrl(String(a.apiBaseUrl||"")),l=this.normalizeOsClient(String(a.osClient||"")),g=this.normalizeIdentityPart(String(a.osClientType||"")),d=this.normalizeIdentityPart(String(a.osClientNetwork||"")),u=this.mcpRecoveryIdentity(c,l,g,d);if(!g&&!d){let p=t.filter(m=>this.normalizeApiBaseUrl(m.apiBaseUrl)===c&&this.normalizeOsClient(m.osClient)===l);p.length===1&&(u=this.mcpRecoveryIdentity(p[0].apiBaseUrl,p[0].osClient,p[0].osClientType,p[0].osClientNetwork))}u===e&&q.unlinkSync(o)}catch{}}}async processMcpAuthRecoveryRequests(){let e=this._mcpAuthRecoveryDirPath;if(!(!e||!q.existsSync(e)||this._mcpAuthRecoveryPassInProgress)){this._mcpAuthRecoveryPassInProgress=!0;try{let t=[];try{t=q.readdirSync(e).filter(o=>o.endsWith(".json")).slice(0,100)}catch{return}let r=N.getInstance().getProfiles(),i=j.getInstance();for(let o of t){let a=zt.join(e,o),c={};try{c=JSON.parse(q.readFileSync(a,"utf-8"))}catch{try{q.unlinkSync(a)}catch{}continue}let l=Number(c.requestedAt||0),g=this.normalizeApiBaseUrl(String(c.apiBaseUrl||"")),d=this.normalizeOsClient(String(c.osClient||"")),u=this.normalizeIdentityPart(String(c.osClientType||"")),p=this.normalizeIdentityPart(String(c.osClientNetwork||"")),m=String(c.failedTokenHash||"").trim().toLowerCase();if(Number(c.version)!==1||!g||!l||Math.abs(Date.now()-l)>go||!Ds(m)){try{q.unlinkSync(a)}catch{}continue}let f=r.filter(h=>this.normalizeApiBaseUrl(h.apiBaseUrl)===g&&this.normalizeOsClient(h.osClient)===d),y=u||p?f.find(h=>this.normalizeIdentityPart(h.osClientType)===u&&this.normalizeIdentityPart(h.osClientNetwork)===p):f.length===1?f[0]:void 0;if(!y){try{q.unlinkSync(a)}catch{}continue}let C=this.mcpRecoveryIdentity(y.apiBaseUrl,y.osClient,y.osClientType,y.osClientNetwork);if(await this.isProfileLoggedOut(y)){this.deleteMcpAuthRecoveryRequests(C,r);continue}if(!this._mcpAuthRecoveryInProgress.has(C)){if((this._mcpAuthRecoveryFailureUntil.get(C)||0)>Date.now()){this.deleteMcpAuthRecoveryRequests(C,r);continue}this._mcpAuthRecoveryInProgress.add(C);try{let h=i.getTokenForServer(y.apiBaseUrl,y.osClient,y.osClientType,y.osClientNetwork);h&&this.tokenFingerprint(h)!==m?(this._mcpAuthRecoveryFailureUntil.delete(C),await this.writeMcpTokenFile()):(h&&await i.clearTokenForServer(y.apiBaseUrl,y.osClient,y.osClientType,y.osClientNetwork,h),await this.reLoginForProfile(y)?this._mcpAuthRecoveryFailureUntil.delete(C):(this._mcpAuthRecoveryFailureUntil.set(C,Date.now()+po),this.showAuthExpiredWarning("MCP \u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u4FDD\u5B58\u7684\u51ED\u636E\u65E0\u6CD5\u9759\u9ED8\u6062\u590D\uFF1B\u82E5\u670D\u52A1\u5668\u542F\u7528\u4E86\u9A8C\u8BC1\u7801\uFF0C\u8BF7\u5728\u63D2\u4EF6\u914D\u7F6E\u4E2D\u4EA4\u4E92\u5F0F\u91CD\u65B0\u767B\u5F55\u3002")))}finally{this._mcpAuthRecoveryInProgress.delete(C),this.deleteMcpAuthRecoveryRequests(C,r)}}}}finally{this._mcpAuthRecoveryPassInProgress=!1}}}startMcpAuthRecoveryWatcher(){this._mcpAuthRecoveryTimer||!this._mcpAuthRecoveryDirPath||(this._mcpAuthRecoveryTimer=setInterval(()=>{this.processMcpAuthRecoveryRequests()},1e3),this.processMcpAuthRecoveryRequests())}stopMcpAuthRecoveryWatcher(){this._mcpAuthRecoveryTimer&&(clearInterval(this._mcpAuthRecoveryTimer),this._mcpAuthRecoveryTimer=void 0)}async tryAutoLogin(){let e=j.getInstance(),n=N.getInstance().getProfiles(),r=!1,i=await e.loadToken(),o=await this.loadMcpTokenFile();r=!!i||o>0||e.hasToken;let a=n.filter(d=>!e.getTokenForServer(d.apiBaseUrl,d.osClient,d.osClientType,d.osClientNetwork)),c=0,l=async()=>{for(;c<a.length;){let d=a[c++];await this.reLoginForProfile(d)&&(r=!0)}},g=Math.min(4,a.length);return await Promise.all(Array.from({length:g},()=>l())),r&&(this._isLoggedIn=!0,await at.executeCommand("setContext",ft,!0),await this.writeMcpTokenFile()),r}async getSysConfig(e,t,n,r=!1,i){let o=j.getInstance(),a=N.getInstance();try{let c=await o.request({method:"POST",path:z.GET_SYS_CONFIG,body:{_SearchEqual:{IsEnable:1},OsClient:t||a.getOsClient()||void 0},apiBaseUrl:e,osClient:t,allowAuthRetry:!1,silent:r,timeout:i?.timeout,signal:i?.signal});if(c.Code===1&&c.Data)return c.Data;n&&(n.message=c.Code!==1?`\u670D\u52A1\u5668\u8FD4\u56DE\u9519\u8BEF (Code: ${c.Code})${c.Msg?"\uFF1A"+c.Msg:""}\uFF0C\u8BF7\u68C0\u67E5 OsClient \u662F\u5426\u6B63\u786E`:"\u670D\u52A1\u5668\u672A\u8FD4\u56DE\u914D\u7F6E\u6570\u636E")}catch(c){n&&(n.message=c instanceof Error?c.message:String(c))}return null}async getCaptcha(e,t){let n=j.getInstance(),r=N.getInstance();try{let i=await n.getRaw(z.GET_CAPTCHA,{OsClient:t||r.getOsClient()||""},e);if(i.data&&i.captchaId){let o=i.data.toString("base64");return{captchaId:i.captchaId,imageBase64:`data:image/png;base64,${o}`}}}catch{}return null}async login(e,t,n={}){let r=j.getInstance(),i=N.getInstance(),o=n.osClient||i.getOsClient(),a=n.silent??!1,c={label:o||"",apiBaseUrl:n.apiBaseUrl||i.getApiBaseUrl(),osClient:o,osClientType:n.osClientType,osClientNetwork:n.osClientNetwork},l=this.profileEpoch(c),g=this.profileIdentity(c);if(n.automatic&&this._explicitLogins.has(g))return{ok:!1,msg:"\u7528\u6237\u6B63\u5728\u767B\u5F55\uFF0C\u540E\u53F0\u6062\u590D\u5DF2\u8DF3\u8FC7\u3002"};let d=(this._profileLoginIntents.get(g)||0)+1;this._profileLoginIntents.set(g,d),n.automatic||this._explicitLogins.set(g,d);let u=()=>{if(n.signal?.aborted||n.isRequestCurrent?.()===!1)throw new Error("\u767B\u5F55\u5DF2\u53D6\u6D88\uFF1B\u5982\u66FE\u63D0\u4EA4\u8BF7\u5148\u5237\u65B0\u5F53\u524D\u8FDE\u63A5\u72B6\u6001\u3002");if(this.profileEpoch(c)!==l||this._profileLoginIntents.get(g)!==d)throw new Error("\u8BE5\u8FDE\u63A5\u5DF2\u9000\u51FA\u6216\u88AB\u65B0\u7684\u767B\u5F55\u66FF\u6362\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002")};try{n.onProgress?.("configuration");let p={},m=await this.getSysConfig(n.apiBaseUrl,o,p,a,n);if(u(),!m&&n.signal)return{ok:!1,msg:p.message||"\u8BFB\u53D6\u767B\u5F55\u914D\u7F6E\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5\u3002"};let f=m?.EnableCaptcha;if((f===!0||f===1||String(f||"").trim().toLowerCase()==="true")&&(!n.captchaId||!n.captchaValue)){let _="\u670D\u52A1\u5668\u5DF2\u5F00\u542F\u56FE\u5F62\u9A8C\u8BC1\u7801\uFF0C\u8BF7\u5728\u63D2\u4EF6\u914D\u7F6E\u4E2D\u4EA4\u4E92\u5F0F\u767B\u5F55\u3002";return a||F.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${_}`),{ok:!1,msg:_}}let C=typeof m?.LoginRsaPublicKey=="string"&&m.LoginRsaPublicKey.trim()?m.LoginRsaPublicKey:ns,h=mo(t,C),S={Account:e,Pwd:h,OsClient:o||void 0,_ClientType:"VSCode"};n.captchaId&&n.captchaValue&&(S._CaptchaId=n.captchaId,S._CaptchaValue=n.captchaValue),n.onProgress?.("authentication");let w=await r.request({method:"POST",path:z.LOGIN,persistResponseToken:!1,body:S,bodyFormat:"form",apiBaseUrl:n.apiBaseUrl,osClient:n.osClient,osClientType:n.osClientType,osClientNetwork:n.osClientNetwork,allowAuthRetry:!1,silent:a,timeout:n.timeout,signal:n.signal});u();let b=w._headers?.authorization||"";if(w.Code===1)return await this.mutateProfile(c,async()=>{if(u(),n.onProgress?.("credentials"),await this.isProfileLoggedOut(c)&&!b)throw new Error("\u767B\u5F55\u54CD\u5E94\u7F3A\u5C11\u65B0\u4F1A\u8BDD\uFF0C\u4FDD\u6301\u5DF2\u9000\u51FA\u72B6\u6001\u3002");return u(),l=this.nextProfileEpoch(c),await this._secretStorage?.delete(this.logoutMarkerKey(c)),u(),this._loggedOutProfiles.delete(this.profileIdentity(c)),b&&(await r.setToken(b,n.apiBaseUrl,n.osClient,n.osClientType,n.osClientNetwork),u()),this._secretStorage&&(n.apiBaseUrl?(await Ht(this._secretStorage,{[this.serverSecretKey(ve,n.apiBaseUrl,o)]:e,[this.serverSecretKey(ke,n.apiBaseUrl,o)]:t},u),u()):(await Ht(this._secretStorage,{[this.secretKey(ve)]:e,[this.secretKey(ke)]:t},u),u())),w.Data?.OsClient&&!o&&await i.updateSettings({osClient:w.Data.OsClient}),u(),this._isLoggedIn=!0,await at.executeCommand("setContext",ft,!0),u(),n.onProgress?.("synchronization"),await this.writeMcpTokenFile(),u(),a||F.info(`Microi: \u767B\u5F55\u6210\u529F\uFF0C\u6B22\u8FCE ${w.Data?.Name||w.Data?.Account||e}`),{ok:!0,msg:""}});{let _=w.Msg||"\u8BF7\u68C0\u67E5\u8D26\u53F7\u5BC6\u7801";return a||F.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${_}`),{ok:!1,msg:_}}}catch(p){let m=p instanceof Error?p.message:String(p);return a||F.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${m}`),{ok:!1,msg:m}}finally{!n.automatic&&this._explicitLogins.get(g)===d&&this._explicitLogins.delete(g)}}async refreshAllTokens(){if(this._refreshInProgress)return;this._refreshInProgress=!0;let e=j.getInstance(),n=N.getInstance().getProfiles();try{for(let r of n){let i=this.profileEpoch(r);if(await this.isProfileLoggedOut(r)||!this.profileAuthCurrent(r,i))continue;let o=e.getTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork);if(!o){await this.reLoginForProfile(r);continue}try{let u=await e.request({method:"GET",path:z.GET_STATUS,apiBaseUrl:r.apiBaseUrl,osClient:r.osClient,osClientType:r.osClientType,osClientNetwork:r.osClientNetwork,allowAuthRetry:!1,silent:!0});if(!this.profileAuthCurrent(r,i)||Ot(u))continue;if(yn(u)){await e.clearTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork,o),await this.reLoginForProfile(r)||this.showAuthExpiredWarning(u.Msg||"\u5F53\u524D\u767B\u5F55\u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002");continue}}catch{}if(!this.profileAuthCurrent(r,i))continue;let a=this.readJwtClientClaims(o),c=String(a?.ClientType||"").trim(),l=c.toLowerCase()!=="vscode",g=!c||c.toLowerCase()==="empty";if(l&&(await this.reLoginForProfile(r)||!g)||!this.profileAuthCurrent(r,i))continue;let d=c.toLowerCase()==="vscode"&&!Sn(o);if(!(!l&&!d&&!this.shouldRefreshToken(o,a)))try{let u=await e.request({method:"POST",path:z.REFRESH_TOKEN,persistResponseToken:!1,body:{authorization:o,OsClient:r.osClient,_ClientType:"VSCode"},apiBaseUrl:r.apiBaseUrl,osClient:r.osClient,osClientType:r.osClientType,osClientNetwork:r.osClientNetwork,allowAuthRetry:!1,silent:!0});if(!this.profileAuthCurrent(r,i))continue;let m=u._headers?.authorization||"";u.Code===1&&m?await this.mutateProfile(r,async()=>{this.profileAuthCurrent(r,i)&&await e.setToken(m,r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork)}):(await e.clearTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork,o),await this.reLoginForProfile(r)||this.showAuthExpiredWarning(u.Msg||"\u5F53\u524D\u767B\u5F55\u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002"))}catch{await this.reLoginForProfile(r)}}}finally{this._isLoggedIn=e.hasToken,await at.executeCommand("setContext",ft,this._isLoggedIn),await this.writeMcpTokenFile(),this._refreshInProgress=!1}}showAuthExpiredWarning(e){let t=String(e||"\u5F53\u524D\u767B\u5F55\u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002"),n=Date.now();t===this._lastAuthWarning&&n-this._lastAuthWarningTime<60*1e3||(this._lastAuthWarning=t,this._lastAuthWarningTime=n,F.warn(`Microi: ${t}`))}readJwtClientClaims(e){try{let n=e.replace(/^Bearer\s+/i,"").trim().split(".");if(n.length<2)return null;let r=n[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(r,"base64").toString("utf-8"))}catch{return null}}shouldRefreshToken(e,t){let n=t??this.readJwtClientClaims(e),r=Number(n?.exp);if(!Number.isFinite(r)||r<=0)return!0;let i=Number(n?.MicroiTokenIssuedAt??n?.iat),o=Number.isFinite(i)&&i>0&&r>i?r-i:Os,a=Math.min(Os,Math.max(uo,Math.floor(o/10)));return r-Math.floor(Date.now()/1e3)<=a}async getCredentialsForProfile(e,t){if(!this._secretStorage)return null;let n=this.normalizeApiBaseUrl(e),r=this.normalizeOsClient(t),i=n?await this._secretStorage.get(this.serverSecretKey(ve,n,r)):void 0,o=n?await this._secretStorage.get(this.serverSecretKey(ke,n,r)):void 0;return(!i||!o)&&n&&this.canUseLegacyCredential(n,r)&&(i=i||await this._secretStorage.get(this.legacyServerSecretKey(ve,n)),o=o||await this._secretStorage.get(this.legacyServerSecretKey(ke,n))),(!i||!o)&&!n&&!r&&(i=i||await this._secretStorage.get(this.secretKey(ve)),o=o||await this._secretStorage.get(this.secretKey(ke))),!i||!o?null:{username:i,password:o}}async reLoginForProfile(e,t){if(!this._secretStorage||t?.()===!1)return!1;let n=this.profileEpoch(e);if(await this.isProfileLoggedOut(e)||!this.profileAuthCurrent(e,n)||t?.()===!1)return!1;let r=await this.getCredentialsForProfile(e.apiBaseUrl,e.osClient);return!r||await this.isProfileLoggedOut(e)||!this.profileAuthCurrent(e,n)||t?.()===!1?!1:(await this.login(r.username,r.password,{silent:!0,automatic:!0,isRequestCurrent:t,apiBaseUrl:e.apiBaseUrl,osClient:e.osClient,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork})).ok}async recoverProfileLogin(e){let t=await this.reLoginForProfile(e);return t&&(this._isLoggedIn=!0,await this.writeMcpTokenFile()),t}startTokenRefresh(){this.stopTokenRefresh(),this.startMcpAuthRecoveryWatcher(),this.refreshAllTokens(),this._refreshTimer=setInterval(()=>{this.refreshAllTokens()},lo),this._windowStateSubscription=we.onDidChangeWindowState(e=>{e.focused&&this.refreshAllTokens()})}stopTokenRefresh(){this._refreshTimer&&(clearInterval(this._refreshTimer),this._refreshTimer=void 0),this._windowStateSubscription&&(this._windowStateSubscription.dispose(),this._windowStateSubscription=void 0),this.stopMcpAuthRecoveryWatcher()}async logoutProfile(e){this._loggedOutProfiles.add(this.profileIdentity(e)),this.nextProfileEpoch(e),await this.mutateProfile(e,async()=>{await this._secretStorage?.store(this.logoutMarkerKey(e),"1"),await j.getInstance().clearTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork);let t=N.getInstance().getProfiles().some(n=>this.profileIdentity(n)!==this.profileIdentity(e)&&this.normalizeApiBaseUrl(n.apiBaseUrl)===this.normalizeApiBaseUrl(e.apiBaseUrl)&&this.normalizeOsClient(n.osClient)===this.normalizeOsClient(e.osClient));this._secretStorage&&!t&&(await this._secretStorage.delete(this.serverSecretKey(ve,e.apiBaseUrl,e.osClient)),await this._secretStorage.delete(this.serverSecretKey(ke,e.apiBaseUrl,e.osClient)),this.canUseLegacyCredential(e.apiBaseUrl,e.osClient)&&(await this._secretStorage.delete(this.legacyServerSecretKey(ve,e.apiBaseUrl)),await this._secretStorage.delete(this.legacyServerSecretKey(ke,e.apiBaseUrl)))),await this.writeMcpTokenFile(),this._isLoggedIn=j.getInstance().hasToken})}async logout(){this.stopTokenRefresh();let e=j.getInstance(),t=N.getInstance().getProfiles();for(let n of t)this._loggedOutProfiles.add(this.profileIdentity(n)),this.nextProfileEpoch(n);await this.mutateProfiles(t,async()=>{for(let n of t)await this._secretStorage?.store(this.logoutMarkerKey(n),"1");if(await e.clearToken(),this._secretStorage){await this._secretStorage.delete(this.secretKey(ve)),await this._secretStorage.delete(this.secretKey(ke));let n=N.getInstance().getProfiles();for(let r of n)await this._secretStorage.delete(this.serverSecretKey(ve,r.apiBaseUrl,r.osClient)),await this._secretStorage.delete(this.serverSecretKey(ke,r.apiBaseUrl,r.osClient)),await this._secretStorage.delete(this.legacyServerSecretKey(ve,r.apiBaseUrl)),await this._secretStorage.delete(this.legacyServerSecretKey(ke,r.apiBaseUrl))}this._isLoggedIn=!1,await at.executeCommand("setContext",ft,!1),F.info("Microi: \u5DF2\u9000\u51FA\u767B\u5F55")})}};var fo=/^\s*\*?\s*Version\s*:\s*(v\d+\.\d+\.\d+)\s*$/im,Bs=/^v(\d+)\.(\d+)\.(\d+)$/;function Pn(s){let e=(s||"").trim();if(!e)return null;let t=e.match(Bs);if(t)return`v${Number(t[1])}.${Number(t[2])}.${Number(t[3])}`;let n=e.match(fo);return n?Pn(n[1]):null}function Us(s){if(!s)return null;let e=s.match(Bs);return e?{major:Number(e[1]),minor:Number(e[2]),patch:Number(e[3])}:null}function ho(s,e){return s.major!==e.major?s.major-e.major:s.minor!==e.minor?s.minor-e.minor:s.patch-e.patch}function yo(s){let e=null;for(let t of s){let n=Us(t);n&&(!e||ho(n,e)>0)&&(e=n)}return e?`v${e.major}.${e.minor}.${e.patch}`:null}function So(s){let e=Us(s);if(!e)return"v1.0.0";let{major:t,minor:n,patch:r}=e;return r<9?`v${t}.${n}.${r+1}`:(r=0,n<9?`v${t}.${n+1}.${r}`:(n=0,t+=1,`v${t}.${n}.${r}`))}function Co(s){let e=(s||"").trim();return e?e.replace(/\r\n/g,`
|
|
35
|
+
`,"utf8"),h=i?this.getTokenForServer(g,i.osClient,i.osClientType,i.osClientNetwork):await this.loadToken(),y=u.protocol==="https:",w=y?Dn:Nn,k=u.pathname.replace(/\/+$/,""),b={hostname:u.hostname,port:u.port||(y?443:80),path:k+e,method:"POST",timeout:a,rejectUnauthorized:this._strictTlsHosts.has(u.hostname.toLowerCase()),headers:{Accept:"application/json",...h?{Authorization:`Bearer ${h}`}:{},did:this.getDeviceId(h),...i?.osClient?{OsClient:i.osClient}:{},"Content-Type":`multipart/form-data; boundary=${p}`,"Content-Length":S.length+l.size+C.length}};return new Promise((_,v)=>{let B=!1,F=T=>{B||(B=!0,v(T))},D=w.request(b,T=>{let I=[];T.on("data",x=>I.push(x)),T.on("end",async()=>{if(B)return;let x=Buffer.concat(I).toString("utf8"),Y;try{Y=JSON.parse(x)}catch{F(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u54CD\u5E94\u4E0D\u662F JSON\uFF08HTTP ${T.statusCode||0}\uFF09`));return}let Q=String(T.headers.authorization||"");Q&&d.current()&&await d.commit(Q),B=!0,_(Y)})});D.on("error",T=>F(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u5931\u8D25\uFF1A${$t(T)}`))),D.on("timeout",()=>{D.destroy(),F(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u8D85\u65F6\uFF08${a}ms\uFF09`))}),D.write(S);let L=Et.createReadStream(c);L.on("error",T=>{D.destroy(),F(new Error(`\u8BFB\u53D6\u672C\u5730\u53D1\u5E03\u8D44\u4EA7\u5931\u8D25\uFF1A${$t(T)}`))}),L.on("end",()=>D.end(C)),L.pipe(D,{end:!1})})}};var Tt=O(require("crypto")),q=O(require("fs")),Qt=O(require("path"));var ko=60*60*1e3,Eo=5*60,Ws=24*60*60,To=2*60*1e3,_o=60*1e3;function Po(s,e){let t=(e||"").trim();return t?Tt.publicEncrypt({key:t,padding:Tt.constants.RSA_PKCS1_PADDING},Buffer.from(s,"utf-8")).toString("base64"):s}var ke=class s{constructor(){this._isLoggedIn=!1;this._refreshInProgress=!1;this._mcpTokenFilePath="";this._mcpAuthRecoveryDirPath="";this._mcpAuthRecoveryInProgress=new Set;this._mcpAuthRecoveryFailureUntil=new Map;this._mcpAuthRecoveryPassInProgress=!1;this._lastAuthWarning="";this._lastAuthWarningTime=0;this._loggedOutProfiles=new Set;this._profileAuthEpochs=new Map;this._profileLoginIntents=new Map;this._explicitLogins=new Map;this._profileAuthMutations=new Map;this.protectedMcpTokenKeys=new Set}profileIdentity(e){return this.mcpRecoveryIdentity(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork)}logoutMarkerKey(e){return this.secretKey("microi.explicitLogout."+this.profileIdentity(e))}profileEpoch(e){return this._profileAuthEpochs.get(this.profileIdentity(e))||0}nextProfileEpoch(e){let t=this.profileEpoch(e)+1;return this._profileAuthEpochs.set(this.profileIdentity(e),t),t}async isProfileLoggedOut(e){let t=this.profileIdentity(e),n=this.profileEpoch(e);return this._loggedOutProfiles.has(t)?!0:(await this._secretStorage?.get(this.logoutMarkerKey(e))==="1"&&this.profileEpoch(e)===n&&this._loggedOutProfiles.add(t),this._loggedOutProfiles.has(t))}profileAuthCurrent(e,t){return this.profileEpoch(e)===t&&!this._loggedOutProfiles.has(this.profileIdentity(e))}mutateProfile(e,t){return this.mutateProfiles([e],t)}mutateProfiles(e,t){let n=Array.from(new Set(e.map(a=>this.profileIdentity(a)))),o=Promise.all(n.map(a=>this._profileAuthMutations.get(a)||Promise.resolve())).then(t,t),i=o.then(()=>{},()=>{});for(let a of n)this._profileAuthMutations.set(a,i);return i.then(()=>{for(let a of n)this._profileAuthMutations.get(a)===i&&this._profileAuthMutations.delete(a)}),o}static getInstance(){return s._instance||(s._instance=new s),s._instance}setSecretStorage(e){this._secretStorage=e,j.getInstance().setResponseTokenAdmission(t=>{let n=N.getInstance(),r=t.osClient||n.getOsClient()||"",o=n.getProfiles().filter(d=>this.normalizeApiBaseUrl(d.apiBaseUrl)===this.normalizeApiBaseUrl(t.apiBaseUrl)&&this.normalizeOsClient(d.osClient)===this.normalizeOsClient(r)&&(!t.osClientType||this.normalizeIdentityPart(d.osClientType)===this.normalizeIdentityPart(t.osClientType))&&(!t.osClientNetwork||this.normalizeIdentityPart(d.osClientNetwork)===this.normalizeIdentityPart(t.osClientNetwork))),i=o.length===1?o[0]:{label:"",...t,osClient:r},a=this.profileEpoch(i),c=this.profileIdentity(i),l=this._profileLoginIntents.get(c)||0,g=()=>t.isRequestCurrent?.()!==!1&&o.length<=1&&this.profileAuthCurrent(i,a)&&(this._profileLoginIntents.get(c)||0)===l;return{current:g,commit:d=>this.mutateProfile(i,async()=>g()?(await j.getInstance().setToken(d,t.apiBaseUrl,t.osClient,t.osClientType,t.osClientNetwork),g()):!1)}}),j.getInstance().setTokenStateChangedHandler(async()=>{await this.writeMcpTokenFile()}),j.getInstance().setAuthRecoveryHandler(async t=>{let n=N.getInstance(),r=this.normalizeApiBaseUrl(t.apiBaseUrl),o=this.normalizeOsClient(t.osClient),i=this.normalizeIdentityPart(t.osClientType),a=this.normalizeIdentityPart(t.osClientNetwork),c=n.getProfiles().filter(d=>this.normalizeApiBaseUrl(d.apiBaseUrl)===r&&this.normalizeOsClient(d.osClient)===o),l=c.find(d=>this.normalizeIdentityPart(d.osClientType)===i&&this.normalizeIdentityPart(d.osClientNetwork)===a);if(!l&&!i&&!a&&c.length===1&&(l=c[0]),!l&&c.length===0&&(l={label:t.osClient||t.apiBaseUrl,apiBaseUrl:t.apiBaseUrl,osClient:t.osClient||"",osClientType:t.osClientType,osClientNetwork:t.osClientNetwork}),!l)return this.showAuthExpiredWarning("\u68C0\u6D4B\u5230\u540C\u4E00\u670D\u52A1\u5668\u4E0E\u79DF\u6237\u5B58\u5728\u591A\u4E2A\u8FDE\u63A5\u73AF\u5883\uFF0C\u65E0\u6CD5\u5B89\u5168\u5224\u65AD\u5E94\u6062\u590D\u54EA\u4E00\u4E2A\u767B\u5F55\u8EAB\u4EFD\u3002"),!1;let g=await this.reLoginForProfile(l,t.isRequestCurrent);return t.isRequestCurrent?.()===!1?!1:(g&&(this._isLoggedIn=!0,await ut.executeCommand("setContext",Ct,!0)),await this.writeMcpTokenFile(),g)})}setMcpTokenFilePath(e){this._mcpTokenFilePath=e,this._mcpAuthRecoveryDirPath=e?`${e}.recovery`:""}enableProtectedMcpTokens(e){let t=this.normalizeApiBaseUrl(e.apiBaseUrl),n=this.normalizeOsClient(e.osClient);this.protectedMcpTokenKeys.add(this.mcpRecoveryIdentity(t,n,e.osClientType,e.osClientNetwork)),this.protectedMcpTokenKeys.add(n?`${t}|${n}`:t)}get mcpTokenFilePath(){return this._mcpTokenFilePath}get mcpAuthRecoveryDirPath(){return this._mcpAuthRecoveryDirPath}async loadMcpTokenFile(){if(!this._mcpTokenFilePath||!q.existsSync(this._mcpTokenFilePath))return 0;let e;try{let o=JSON.parse(q.readFileSync(this._mcpTokenFilePath,"utf-8"));if(!o||typeof o!="object"||Array.isArray(o))return 0;for(let[i,a]of Object.entries(o))qt(a)&&this.protectedMcpTokenKeys.add(i);e=Object.fromEntries(Object.entries(o).map(([i,a])=>[i,Tr(a)]))}catch{return 0}let t=j.getInstance(),n=N.getInstance().getProfiles(),r=[];for(let o of n){if(await this.isProfileLoggedOut(o))continue;let i=this.normalizeApiBaseUrl(o.apiBaseUrl),a=this.normalizeOsClient(o.osClient),c=this.mcpRecoveryIdentity(i,a,o.osClientType,o.osClientNetwork),g=n.filter(S=>this.normalizeApiBaseUrl(S.apiBaseUrl)===i&&this.normalizeOsClient(S.osClient)===a).length===1?[[i,a,o.osClientType,o.osClientNetwork].filter(Boolean).join("|"),[i,a,o.osClientType].filter(Boolean).join("|"),a?`${i}|${a}`:i]:[],d=typeof e[c]=="string"&&String(e[c]).trim()?String(e[c]).trim():"",u=g.map(S=>e[S]).find(S=>typeof S=="string"&&S.trim()),p=t.getTokenForServer(o.apiBaseUrl,o.osClient,o.osClientType,o.osClientNetwork),f=t.getExactTokenForServer(o.apiBaseUrl,o.osClient,o.osClientType,o.osClientNetwork),m=bt(p,d||u,!!d&&!f);!m||f===m||r.push({token:m,apiBaseUrl:o.apiBaseUrl,osClient:o.osClient,osClientType:o.osClientType,osClientNetwork:o.osClientNetwork,authEpoch:this.profileEpoch(o),profile:o})}return t.adoptTokensFromSharedFile(r.filter(o=>this.profileAuthCurrent(o.profile,o.authEpoch)))}get isLoggedIn(){return this._isLoggedIn}secretKey(e){return N.getInstance().getWorkspaceSecretKey(e)}normalizeApiBaseUrl(e){return(e||"").trim().replace(/\/+$/,"")}normalizeOsClient(e){return(e||"").trim()}normalizeIdentityPart(e){return(e||"").trim()}mcpRecoveryIdentity(e,t,n,r){return[this.normalizeApiBaseUrl(e),this.normalizeOsClient(t),this.normalizeIdentityPart(n),this.normalizeIdentityPart(r)].join("|")}serverSecretKey(e,t,n){return this.secretKey(`${e}.${this.normalizeApiBaseUrl(t)}|${this.normalizeOsClient(n)}`)}getCredentialSecretKeys(e){return{usernameKey:this.serverSecretKey(Te,e.apiBaseUrl,e.osClient),passwordKey:this.serverSecretKey(_e,e.apiBaseUrl,e.osClient)}}legacyServerSecretKey(e,t){return this.secretKey(`${e}.${this.normalizeApiBaseUrl(t)}`)}canUseLegacyCredential(e,t){let n=this.normalizeApiBaseUrl(e),r=this.normalizeOsClient(t);if(!n)return!1;let o=N.getInstance().getProfiles().filter(a=>this.normalizeApiBaseUrl(a.apiBaseUrl)===n);if(o.length===0)return!r;if(o.length===1)return!0;let i=o.filter(a=>this.normalizeOsClient(a.osClient)===r);return!!r&&i.length===o.length}async writeMcpTokenFile(){if(!this._mcpTokenFilePath)return;let e=j.getInstance(),t=N.getInstance(),n=t.getProfiles(),r=this._mcpTokenFilePath;if(!(n.some(m=>!!this.normalizeApiBaseUrl(m.apiBaseUrl)&&!!this.normalizeOsClient(m.osClient))||!!this.normalizeApiBaseUrl(t.getApiBaseUrl())&&!!this.normalizeOsClient(t.getOsClient()))&&!q.existsSync(r))return;let i={},a=new Set,c=[];for(let m of n){let S=this.normalizeApiBaseUrl(m.apiBaseUrl),C=this.normalizeOsClient(m.osClient),h=this.mcpRecoveryIdentity(S,C,m.osClientType,m.osClientNetwork);a.add(h);let y=n.filter(_=>this.normalizeApiBaseUrl(_.apiBaseUrl)===S&&this.normalizeOsClient(_.osClient)===C),w=C?`${S}|${C}`:S;y.length===1&&a.add(w);let b=await this.isProfileLoggedOut(m)?"":e.getTokenForServer(m.apiBaseUrl,m.osClient,m.osClientType,m.osClientNetwork);c.push({profile:m,exactKey:h,legacyKey:y.length===1?w:void 0,currentToken:b,currentExactToken:e.getExactTokenForServer(m.apiBaseUrl,m.osClient,m.osClientType,m.osClientNetwork)}),b&&(i[h]=b,y.length===1&&(i[w]=b))}let l=Qt.dirname(r);q.existsSync(l)||q.mkdirSync(l,{recursive:!0});let g=`${r}.lock`,d=Date.now()+3e3,u;for(;u===void 0;)try{u=q.openSync(g,"wx",384),q.writeFileSync(u,JSON.stringify({pid:process.pid,createdAt:Date.now()}),"utf-8")}catch(m){if(m.code!=="EEXIST")throw m;try{Date.now()-q.statSync(g).mtimeMs>3e4&&q.unlinkSync(g)}catch{}if(Date.now()>=d)throw new Error("Microi MCP Token \u6587\u4EF6\u6B63\u5728\u88AB CLI \u6216 VS Code \u63D2\u4EF6\u4FEE\u6539\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");await new Promise(S=>setTimeout(S,40))}let p=`${r}.${process.pid}.${Date.now()}.tmp`,f=[];try{let m={};if(q.existsSync(r)){let h=JSON.parse(q.readFileSync(r,"utf-8"));if(!h||typeof h!="object"||Array.isArray(h))throw new Error(`Microi MCP Token \u6587\u4EF6\u5FC5\u987B\u662F JSON \u5BF9\u8C61\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1A${r}`);for(let[y,w]of Object.entries(h))qt(w)&&this.protectedMcpTokenKeys.add(y);m=Object.fromEntries(Object.entries(h).filter(y=>typeof y[1]=="string"&&!!y[1]).map(([y,w])=>[y,Tr(w)]))}for(let h of c){if(h.legacyKey&&(this.protectedMcpTokenKeys.has(h.exactKey)||this.protectedMcpTokenKeys.has(h.legacyKey))&&(this.protectedMcpTokenKeys.add(h.exactKey),this.protectedMcpTokenKeys.add(h.legacyKey)),delete i[h.exactKey],h.legacyKey&&delete i[h.legacyKey],this._loggedOutProfiles.has(this.profileIdentity(h.profile)))continue;h.currentToken=e.getTokenForServer(h.profile.apiBaseUrl,h.profile.osClient,h.profile.osClientType,h.profile.osClientNetwork),h.currentExactToken=e.getExactTokenForServer(h.profile.apiBaseUrl,h.profile.osClient,h.profile.osClientType,h.profile.osClientNetwork);let y=m[h.exactKey]||"",w=h.legacyKey&&m[h.legacyKey]||"",k=bt(h.currentToken,y||w,!!y&&!h.currentExactToken);k&&(i[h.exactKey]=k,h.legacyKey&&(i[h.legacyKey]=k),k!==h.currentExactToken&&f.push({profile:h.profile,token:k,authEpoch:this.profileEpoch(h.profile)}))}for(let h of a)delete m[h];let S={...m,...i},C=Object.fromEntries(Object.entries(S).map(([h,y])=>[h,this.protectedMcpTokenKeys.has(h)?Ks(y):y]));q.writeFileSync(p,`${JSON.stringify(C,null,2)}
|
|
36
|
+
`,{encoding:"utf-8",mode:384});for(let h=0;;h++)try{q.renameSync(p,r);break}catch(y){let w=y.code;if(!["EPERM","EACCES","EBUSY"].includes(w||"")||h>=3)throw y;await new Promise(k=>setTimeout(k,20*2**h))}}finally{try{q.existsSync(p)&&q.unlinkSync(p)}catch{}try{q.closeSync(u)}catch{}try{q.unlinkSync(g)}catch{}}await e.adoptTokensFromSharedFile(f.filter(m=>this.profileAuthCurrent(m.profile,m.authEpoch)).map(m=>({token:m.token,apiBaseUrl:m.profile.apiBaseUrl,osClient:m.profile.osClient,osClientType:m.profile.osClientType,osClientNetwork:m.profile.osClientNetwork})))}tokenFingerprint(e){return Tt.createHash("sha256").update(String(e||"")).digest("hex")}deleteMcpAuthRecoveryRequests(e,t){let n=this._mcpAuthRecoveryDirPath;if(!n||!q.existsSync(n))return;let r=[];try{r=q.readdirSync(n).filter(o=>o.endsWith(".json")).slice(0,200)}catch{return}for(let o of r){let i=Qt.join(n,o);try{let a=JSON.parse(q.readFileSync(i,"utf-8")),c=this.normalizeApiBaseUrl(String(a.apiBaseUrl||"")),l=this.normalizeOsClient(String(a.osClient||"")),g=this.normalizeIdentityPart(String(a.osClientType||"")),d=this.normalizeIdentityPart(String(a.osClientNetwork||"")),u=this.mcpRecoveryIdentity(c,l,g,d);if(!g&&!d){let p=t.filter(f=>this.normalizeApiBaseUrl(f.apiBaseUrl)===c&&this.normalizeOsClient(f.osClient)===l);p.length===1&&(u=this.mcpRecoveryIdentity(p[0].apiBaseUrl,p[0].osClient,p[0].osClientType,p[0].osClientNetwork))}u===e&&q.unlinkSync(i)}catch{}}}async processMcpAuthRecoveryRequests(){let e=this._mcpAuthRecoveryDirPath;if(!(!e||!q.existsSync(e)||this._mcpAuthRecoveryPassInProgress)){this._mcpAuthRecoveryPassInProgress=!0;try{let t=[];try{t=q.readdirSync(e).filter(i=>i.endsWith(".json")).slice(0,100)}catch{return}let r=N.getInstance().getProfiles(),o=j.getInstance();for(let i of t){let a=Qt.join(e,i),c={};try{c=JSON.parse(q.readFileSync(a,"utf-8"))}catch{try{q.unlinkSync(a)}catch{}continue}let l=Number(c.requestedAt||0),g=this.normalizeApiBaseUrl(String(c.apiBaseUrl||"")),d=this.normalizeOsClient(String(c.osClient||"")),u=this.normalizeIdentityPart(String(c.osClientType||"")),p=this.normalizeIdentityPart(String(c.osClientNetwork||"")),f=String(c.failedTokenHash||"").trim().toLowerCase();if(Number(c.version)!==1||!g||!l||Math.abs(Date.now()-l)>To||!Vs(f)){try{q.unlinkSync(a)}catch{}continue}let m=r.filter(h=>this.normalizeApiBaseUrl(h.apiBaseUrl)===g&&this.normalizeOsClient(h.osClient)===d),S=u||p?m.find(h=>this.normalizeIdentityPart(h.osClientType)===u&&this.normalizeIdentityPart(h.osClientNetwork)===p):m.length===1?m[0]:void 0;if(!S){try{q.unlinkSync(a)}catch{}continue}let C=this.mcpRecoveryIdentity(S.apiBaseUrl,S.osClient,S.osClientType,S.osClientNetwork);if(await this.isProfileLoggedOut(S)){this.deleteMcpAuthRecoveryRequests(C,r);continue}if(!this._mcpAuthRecoveryInProgress.has(C)){if((this._mcpAuthRecoveryFailureUntil.get(C)||0)>Date.now()){this.deleteMcpAuthRecoveryRequests(C,r);continue}this._mcpAuthRecoveryInProgress.add(C);try{let h=o.getTokenForServer(S.apiBaseUrl,S.osClient,S.osClientType,S.osClientNetwork);h&&this.tokenFingerprint(h)!==f?(this._mcpAuthRecoveryFailureUntil.delete(C),await this.writeMcpTokenFile()):(h&&await o.clearTokenForServer(S.apiBaseUrl,S.osClient,S.osClientType,S.osClientNetwork,h),await this.reLoginForProfile(S)?this._mcpAuthRecoveryFailureUntil.delete(C):(this._mcpAuthRecoveryFailureUntil.set(C,Date.now()+_o),this.showAuthExpiredWarning("MCP \u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u4FDD\u5B58\u7684\u51ED\u636E\u65E0\u6CD5\u9759\u9ED8\u6062\u590D\uFF1B\u82E5\u670D\u52A1\u5668\u542F\u7528\u4E86\u9A8C\u8BC1\u7801\uFF0C\u8BF7\u5728\u63D2\u4EF6\u914D\u7F6E\u4E2D\u4EA4\u4E92\u5F0F\u91CD\u65B0\u767B\u5F55\u3002")))}finally{this._mcpAuthRecoveryInProgress.delete(C),this.deleteMcpAuthRecoveryRequests(C,r)}}}}finally{this._mcpAuthRecoveryPassInProgress=!1}}}startMcpAuthRecoveryWatcher(){this._mcpAuthRecoveryTimer||!this._mcpAuthRecoveryDirPath||(this._mcpAuthRecoveryTimer=setInterval(()=>{this.processMcpAuthRecoveryRequests()},1e3),this.processMcpAuthRecoveryRequests())}stopMcpAuthRecoveryWatcher(){this._mcpAuthRecoveryTimer&&(clearInterval(this._mcpAuthRecoveryTimer),this._mcpAuthRecoveryTimer=void 0)}async tryAutoLogin(){let e=j.getInstance(),n=N.getInstance().getProfiles(),r=!1,o=await e.loadToken(),i=await this.loadMcpTokenFile();r=!!o||i>0||e.hasToken;let a=n.filter(d=>!e.getTokenForServer(d.apiBaseUrl,d.osClient,d.osClientType,d.osClientNetwork)),c=0,l=async()=>{for(;c<a.length;){let d=a[c++];await this.reLoginForProfile(d)&&(r=!0)}},g=Math.min(4,a.length);return await Promise.all(Array.from({length:g},()=>l())),r&&(this._isLoggedIn=!0,await ut.executeCommand("setContext",Ct,!0),await this.writeMcpTokenFile()),r}async getSysConfig(e,t,n,r=!1,o){let i=j.getInstance(),a=N.getInstance();try{let c=await i.request({method:"POST",path:z.GET_SYS_CONFIG,body:{_SearchEqual:{IsEnable:1},OsClient:t||a.getOsClient()||void 0},apiBaseUrl:e,osClient:t,allowAuthRetry:!1,silent:r,timeout:o?.timeout,signal:o?.signal});if(c.Code===1&&c.Data)return c.Data;n&&(n.message=c.Code!==1?`\u670D\u52A1\u5668\u8FD4\u56DE\u9519\u8BEF (Code: ${c.Code})${c.Msg?"\uFF1A"+c.Msg:""}\uFF0C\u8BF7\u68C0\u67E5 OsClient \u662F\u5426\u6B63\u786E`:"\u670D\u52A1\u5668\u672A\u8FD4\u56DE\u914D\u7F6E\u6570\u636E")}catch(c){n&&(n.message=c instanceof Error?c.message:String(c))}return null}async getCaptcha(e,t){let n=j.getInstance(),r=N.getInstance();try{let o=await n.getRaw(z.GET_CAPTCHA,{OsClient:t||r.getOsClient()||""},e);if(o.data&&o.captchaId){let i=o.data.toString("base64");return{captchaId:o.captchaId,imageBase64:`data:image/png;base64,${i}`}}}catch{}return null}async login(e,t,n={}){let r=j.getInstance(),o=N.getInstance(),i=n.osClient||o.getOsClient(),a=n.silent??!1,c={label:i||"",apiBaseUrl:n.apiBaseUrl||o.getApiBaseUrl(),osClient:i,osClientType:n.osClientType,osClientNetwork:n.osClientNetwork},l=this.profileEpoch(c),g=this.profileIdentity(c);if(n.automatic&&this._explicitLogins.has(g))return{ok:!1,msg:"\u7528\u6237\u6B63\u5728\u767B\u5F55\uFF0C\u540E\u53F0\u6062\u590D\u5DF2\u8DF3\u8FC7\u3002"};let d=(this._profileLoginIntents.get(g)||0)+1;this._profileLoginIntents.set(g,d),n.automatic||this._explicitLogins.set(g,d);let u=()=>{if(n.signal?.aborted||n.isRequestCurrent?.()===!1)throw new Error("\u767B\u5F55\u5DF2\u53D6\u6D88\uFF1B\u5982\u66FE\u63D0\u4EA4\u8BF7\u5148\u5237\u65B0\u5F53\u524D\u8FDE\u63A5\u72B6\u6001\u3002");if(this.profileEpoch(c)!==l||this._profileLoginIntents.get(g)!==d)throw new Error("\u8BE5\u8FDE\u63A5\u5DF2\u9000\u51FA\u6216\u88AB\u65B0\u7684\u767B\u5F55\u66FF\u6362\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002")};try{n.onProgress?.("configuration");let p={},f=await this.getSysConfig(n.apiBaseUrl,i,p,a,n);if(u(),!f&&n.signal)return{ok:!1,msg:p.message||"\u8BFB\u53D6\u767B\u5F55\u914D\u7F6E\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5\u3002"};let m=f?.EnableCaptcha;if((m===!0||m===1||String(m||"").trim().toLowerCase()==="true")&&(!n.captchaId||!n.captchaValue)){let _="\u670D\u52A1\u5668\u5DF2\u5F00\u542F\u56FE\u5F62\u9A8C\u8BC1\u7801\uFF0C\u8BF7\u5728\u63D2\u4EF6\u914D\u7F6E\u4E2D\u4EA4\u4E92\u5F0F\u767B\u5F55\u3002";return a||V.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${_}`),{ok:!1,msg:_}}let C=typeof f?.LoginRsaPublicKey=="string"&&f.LoginRsaPublicKey.trim()?f.LoginRsaPublicKey:ds,h=Po(t,C),y={Account:e,Pwd:h,OsClient:i||void 0,_ClientType:"VSCode"};n.captchaId&&n.captchaValue&&(y._CaptchaId=n.captchaId,y._CaptchaValue=n.captchaValue),n.onProgress?.("authentication");let w=await r.request({method:"POST",path:z.LOGIN,persistResponseToken:!1,body:y,bodyFormat:"form",apiBaseUrl:n.apiBaseUrl,osClient:n.osClient,osClientType:n.osClientType,osClientNetwork:n.osClientNetwork,allowAuthRetry:!1,silent:a,timeout:n.timeout,signal:n.signal});u();let b=w._headers?.authorization||"";if(w.Code===1)return await this.mutateProfile(c,async()=>{if(u(),n.onProgress?.("credentials"),await this.isProfileLoggedOut(c)&&!b)throw new Error("\u767B\u5F55\u54CD\u5E94\u7F3A\u5C11\u65B0\u4F1A\u8BDD\uFF0C\u4FDD\u6301\u5DF2\u9000\u51FA\u72B6\u6001\u3002");return u(),l=this.nextProfileEpoch(c),await this._secretStorage?.delete(this.logoutMarkerKey(c)),u(),this._loggedOutProfiles.delete(this.profileIdentity(c)),b&&(await r.setToken(b,n.apiBaseUrl,n.osClient,n.osClientType,n.osClientNetwork),u()),this._secretStorage&&(n.apiBaseUrl?(await Jt(this._secretStorage,{[this.serverSecretKey(Te,n.apiBaseUrl,i)]:e,[this.serverSecretKey(_e,n.apiBaseUrl,i)]:t},u),u()):(await Jt(this._secretStorage,{[this.secretKey(Te)]:e,[this.secretKey(_e)]:t},u),u())),w.Data?.OsClient&&!i&&await o.updateSettings({osClient:w.Data.OsClient}),u(),this._isLoggedIn=!0,await ut.executeCommand("setContext",Ct,!0),u(),n.onProgress?.("synchronization"),await this.writeMcpTokenFile(),u(),a||V.info(`Microi: \u767B\u5F55\u6210\u529F\uFF0C\u6B22\u8FCE ${w.Data?.Name||w.Data?.Account||e}`),{ok:!0,msg:""}});{let _=w.Msg||"\u8BF7\u68C0\u67E5\u8D26\u53F7\u5BC6\u7801";return a||V.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${_}`),{ok:!1,msg:_}}}catch(p){let f=p instanceof Error?p.message:String(p);return a||V.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${f}`),{ok:!1,msg:f}}finally{!n.automatic&&this._explicitLogins.get(g)===d&&this._explicitLogins.delete(g)}}async refreshAllTokens(){if(this._refreshInProgress)return;this._refreshInProgress=!0;let e=j.getInstance(),n=N.getInstance().getProfiles();try{for(let r of n){let o=this.profileEpoch(r);if(await this.isProfileLoggedOut(r)||!this.profileAuthCurrent(r,o))continue;let i=e.getTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork);if(!i){await this.reLoginForProfile(r);continue}try{let u=await e.request({method:"GET",path:z.GET_STATUS,apiBaseUrl:r.apiBaseUrl,osClient:r.osClient,osClientType:r.osClientType,osClientNetwork:r.osClientNetwork,allowAuthRetry:!1,silent:!0});if(!this.profileAuthCurrent(r,o)||Ut(u))continue;if(vn(u)){await e.clearTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork,i),await this.reLoginForProfile(r)||this.showAuthExpiredWarning(u.Msg||"\u5F53\u524D\u767B\u5F55\u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002");continue}}catch{}if(!this.profileAuthCurrent(r,o))continue;let a=this.readJwtClientClaims(i),c=String(a?.ClientType||"").trim(),l=c.toLowerCase()!=="vscode",g=!c||c.toLowerCase()==="empty";if(l&&(await this.reLoginForProfile(r)||!g)||!this.profileAuthCurrent(r,o))continue;let d=c.toLowerCase()==="vscode"&&!kn(i);if(!(!l&&!d&&!this.shouldRefreshToken(i,a)))try{let u=await e.request({method:"POST",path:z.REFRESH_TOKEN,persistResponseToken:!1,body:{authorization:i,OsClient:r.osClient,_ClientType:"VSCode"},apiBaseUrl:r.apiBaseUrl,osClient:r.osClient,osClientType:r.osClientType,osClientNetwork:r.osClientNetwork,allowAuthRetry:!1,silent:!0});if(!this.profileAuthCurrent(r,o))continue;let f=u._headers?.authorization||"";u.Code===1&&f?await this.mutateProfile(r,async()=>{this.profileAuthCurrent(r,o)&&await e.setToken(f,r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork)}):(await e.clearTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork,i),await this.reLoginForProfile(r)||this.showAuthExpiredWarning(u.Msg||"\u5F53\u524D\u767B\u5F55\u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002"))}catch{await this.reLoginForProfile(r)}}}finally{this._isLoggedIn=e.hasToken,await ut.executeCommand("setContext",Ct,this._isLoggedIn),await this.writeMcpTokenFile(),this._refreshInProgress=!1}}showAuthExpiredWarning(e){let t=String(e||"\u5F53\u524D\u767B\u5F55\u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002"),n=Date.now();t===this._lastAuthWarning&&n-this._lastAuthWarningTime<60*1e3||(this._lastAuthWarning=t,this._lastAuthWarningTime=n,V.warn(`Microi: ${t}`))}readJwtClientClaims(e){try{let n=e.replace(/^Bearer\s+/i,"").trim().split(".");if(n.length<2)return null;let r=n[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(r,"base64").toString("utf-8"))}catch{return null}}shouldRefreshToken(e,t){let n=t??this.readJwtClientClaims(e),r=Number(n?.exp);if(!Number.isFinite(r)||r<=0)return!0;let o=Number(n?.MicroiTokenIssuedAt??n?.iat),i=Number.isFinite(o)&&o>0&&r>o?r-o:Ws,a=Math.min(Ws,Math.max(Eo,Math.floor(i/10)));return r-Math.floor(Date.now()/1e3)<=a}async getCredentialsForProfile(e,t){if(!this._secretStorage)return null;let n=this.normalizeApiBaseUrl(e),r=this.normalizeOsClient(t),o=n?await this._secretStorage.get(this.serverSecretKey(Te,n,r)):void 0,i=n?await this._secretStorage.get(this.serverSecretKey(_e,n,r)):void 0;return(!o||!i)&&n&&this.canUseLegacyCredential(n,r)&&(o=o||await this._secretStorage.get(this.legacyServerSecretKey(Te,n)),i=i||await this._secretStorage.get(this.legacyServerSecretKey(_e,n))),(!o||!i)&&!n&&!r&&(o=o||await this._secretStorage.get(this.secretKey(Te)),i=i||await this._secretStorage.get(this.secretKey(_e))),!o||!i?null:{username:o,password:i}}async reLoginForProfile(e,t){if(!this._secretStorage||t?.()===!1)return!1;let n=this.profileEpoch(e);if(await this.isProfileLoggedOut(e)||!this.profileAuthCurrent(e,n)||t?.()===!1)return!1;let r=await this.getCredentialsForProfile(e.apiBaseUrl,e.osClient);return!r||await this.isProfileLoggedOut(e)||!this.profileAuthCurrent(e,n)||t?.()===!1?!1:(await this.login(r.username,r.password,{silent:!0,automatic:!0,isRequestCurrent:t,apiBaseUrl:e.apiBaseUrl,osClient:e.osClient,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork})).ok}async recoverProfileLogin(e){let t=await this.reLoginForProfile(e);return t&&(this._isLoggedIn=!0,await this.writeMcpTokenFile()),t}startTokenRefresh(){this.stopTokenRefresh(),this.startMcpAuthRecoveryWatcher(),this.refreshAllTokens(),this._refreshTimer=setInterval(()=>{this.refreshAllTokens()},ko),this._windowStateSubscription=ve.onDidChangeWindowState(e=>{e.focused&&this.refreshAllTokens()})}stopTokenRefresh(){this._refreshTimer&&(clearInterval(this._refreshTimer),this._refreshTimer=void 0),this._windowStateSubscription&&(this._windowStateSubscription.dispose(),this._windowStateSubscription=void 0),this.stopMcpAuthRecoveryWatcher()}async logoutProfile(e){this._loggedOutProfiles.add(this.profileIdentity(e)),this.nextProfileEpoch(e),await this.mutateProfile(e,async()=>{await this._secretStorage?.store(this.logoutMarkerKey(e),"1"),await j.getInstance().clearTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork);let t=N.getInstance().getProfiles().some(n=>this.profileIdentity(n)!==this.profileIdentity(e)&&this.normalizeApiBaseUrl(n.apiBaseUrl)===this.normalizeApiBaseUrl(e.apiBaseUrl)&&this.normalizeOsClient(n.osClient)===this.normalizeOsClient(e.osClient));this._secretStorage&&!t&&(await this._secretStorage.delete(this.serverSecretKey(Te,e.apiBaseUrl,e.osClient)),await this._secretStorage.delete(this.serverSecretKey(_e,e.apiBaseUrl,e.osClient)),this.canUseLegacyCredential(e.apiBaseUrl,e.osClient)&&(await this._secretStorage.delete(this.legacyServerSecretKey(Te,e.apiBaseUrl)),await this._secretStorage.delete(this.legacyServerSecretKey(_e,e.apiBaseUrl)))),await this.writeMcpTokenFile(),this._isLoggedIn=j.getInstance().hasToken})}async logout(){this.stopTokenRefresh();let e=j.getInstance(),t=N.getInstance().getProfiles();for(let n of t)this._loggedOutProfiles.add(this.profileIdentity(n)),this.nextProfileEpoch(n);await this.mutateProfiles(t,async()=>{for(let n of t)await this._secretStorage?.store(this.logoutMarkerKey(n),"1");if(await e.clearToken(),this._secretStorage){await this._secretStorage.delete(this.secretKey(Te)),await this._secretStorage.delete(this.secretKey(_e));let n=N.getInstance().getProfiles();for(let r of n)await this._secretStorage.delete(this.serverSecretKey(Te,r.apiBaseUrl,r.osClient)),await this._secretStorage.delete(this.serverSecretKey(_e,r.apiBaseUrl,r.osClient)),await this._secretStorage.delete(this.legacyServerSecretKey(Te,r.apiBaseUrl)),await this._secretStorage.delete(this.legacyServerSecretKey(_e,r.apiBaseUrl))}this._isLoggedIn=!1,await ut.executeCommand("setContext",Ct,!1),V.info("Microi: \u5DF2\u9000\u51FA\u767B\u5F55")})}};var Io=/^\s*\*?\s*Version\s*:\s*(v\d+\.\d+\.\d+)\s*$/im,Js=/^v(\d+)\.(\d+)\.(\d+)$/;function Mn(s){let e=(s||"").trim();if(!e)return null;let t=e.match(Js);if(t)return`v${Number(t[1])}.${Number(t[2])}.${Number(t[3])}`;let n=e.match(Io);return n?Mn(n[1]):null}function qs(s){if(!s)return null;let e=s.match(Js);return e?{major:Number(e[1]),minor:Number(e[2]),patch:Number(e[3])}:null}function Ro(s,e){return s.major!==e.major?s.major-e.major:s.minor!==e.minor?s.minor-e.minor:s.patch-e.patch}function Do(s){let e=null;for(let t of s){let n=qs(t);n&&(!e||Ro(n,e)>0)&&(e=n)}return e?`v${e.major}.${e.minor}.${e.patch}`:null}function No(s){let e=qs(s);if(!e)return"v1.0.0";let{major:t,minor:n,patch:r}=e;return r<9?`v${t}.${n}.${r+1}`:(r=0,n<9?`v${t}.${n+1}.${r}`:(n=0,t+=1,`v${t}.${n}.${r}`))}function Mo(s){let e=(s||"").trim();return e?e.replace(/\r\n/g,`
|
|
37
37
|
`).split(`
|
|
38
|
-
`).map(t=>t.trim()).filter(Boolean):["\u8BF7\u8865\u5145\u8BE5 V8 \u4EE3\u7801\u7684\u5B8C\u6574\u529F\u80FD\u8BF4\u660E\u3002"]}function
|
|
38
|
+
`).map(t=>t.trim()).filter(Boolean):["\u8BF7\u8865\u5145\u8BE5 V8 \u4EE3\u7801\u7684\u5B8C\u6574\u529F\u80FD\u8BF4\u660E\u3002"]}function Ao(s){let e=s.replace(/\r\n/g,`
|
|
39
39
|
`).split(`
|
|
40
|
-
`),t=[],n=!1;for(let r of e){let
|
|
41
|
-
`):void 0}function
|
|
40
|
+
`),t=[],n=!1;for(let r of e){let o=r.replace(/^\s*\/\*+\s?/,"").replace(/^\s*\*\/?\s?/,"").trim();if(/^(Function|功能说明)\s*[::]/i.test(o)){n=!0;let i=o.replace(/^(Function|功能说明)\s*[::]\s*/i,"").trim();i&&t.push(i.replace(/^[-*]\s*/,""));continue}if(/^(ChangeLog|修改记录|LastModified|Version|ApiEngineKey|TableKey|WorkflowKey|EventType)\s*[::]/i.test(o)){if(n)break;continue}n&&o&&o!=="*/"&&t.push(o.replace(/^[-*]\s*/,""))}return t.length?t.join(`
|
|
41
|
+
`):void 0}function _r(s){let e=s.match(/^\s*(\/\*[\s\S]*?\*\/)\s*/);return e?{comment:e[1],rest:s.slice(e[0].length)}:null}function Gs(s){return/^\/\*\s*OFFICIAL_(?:MANAGED|CREATE_IF_MISSING)_API_ENGINE_NOTICE_V1\b/i.test(s)}function zs(s){return/Microi\s+V8|V8\s+(?:ApiEngine|Event|Workflow)|Version\s*:|ChangeLog\s*:|TableKey\s*:|WorkflowKey\s*:/i.test(s)}function xo(s){let e=s.replace(/^\uFEFF/,""),t=_r(e);if(!t)return{body:e};if(Gs(t.comment)){let r=_r(t.rest);return r&&zs(r.comment)?{notice:t.comment,header:r.comment,body:r.rest}:{notice:t.comment,body:t.rest}}if(!zs(t.comment))return{body:e};let n=_r(t.rest);return n&&Gs(n.comment)?{notice:n.comment,header:t.comment,body:n.rest}:{header:t.comment,body:t.rest}}function Fo(s,e,t){let n=s.functionDescription||Ao(t||""),r=Mo(n),o=s.kind==="ApiEngine"?"V8 ApiEngine":s.kind==="V8Event"?"V8 Event":"V8 Workflow",i=s.kind==="ApiEngine"?"ApiEngineKey":s.kind==="V8Event"?"TableKey":"WorkflowKey",a=["/*",` * ${o}`,` * ${i}: ${s.key}`];s.eventType&&a.push(` * EventType: ${s.eventType}`),a.push(` * Version: ${e}`),a.push(" * Function:");for(let c of r)a.push(` * - ${c}`);return a.push(" */"),`${a.join(`
|
|
42
42
|
`)}
|
|
43
43
|
|
|
44
|
-
`}function
|
|
44
|
+
`}function Xt(s){let e=Mn(s.currentCode),t=Mn(s.remoteCode),n=Mn(s.remoteVersion),r=Do([e,t,n]),o=s.initial?r||"v1.0.0":No(r),{notice:i,header:a,body:c}=xo(s.currentCode||""),g=`${i?`${i.trim()}
|
|
45
45
|
|
|
46
|
-
`:""}${
|
|
47
|
-
`,"utf-8"),
|
|
48
|
-
`).trimEnd()}isLocalModified(e,t){try{if(!k.existsSync(e))return!1;let n=k.statSync(e),r=new Date(t);return isNaN(r.getTime())?!1:n.mtime.getTime()>r.getTime()+1e3}catch{return!1}}getLocalModifiedTime(e,t){try{if(!k.existsSync(e))return null;let n=k.statSync(e),r=new Date(t);return isNaN(r.getTime())?null:n.mtime.getTime()>r.getTime()+1e3?Te(n.mtime):null}catch{return null}}touchSyncedFile(e,t){let n=new Date(t),r=isNaN(n.getTime())?new Date:n;try{k.utimesSync(e,r,r)}catch{}}ensureSyncGitExcludes(e){try{let t=e||N.getInstance().getSyncRootDir();ht(t),Ke(t,[".backups/","**/.backups/",".microi-mcp-tokens.json","**/.microi-mcp-tokens.json"])}catch{}}shortBackupKey(e){return require("crypto").createHash("sha1").update(e||"").digest("hex").slice(0,10)}getMenuButtonMetaKey(e,t,n,r){return`${e}__${t}__${n}__${r}`}getMenuScriptMetaKey(e,t){return`${e}__${t}`}sourceHash(e){return require("crypto").createHash("sha256").update(this.normalizeCode(e||"")).digest("hex")}extractTrailingKey(e){let t=e.match(/[((]([^))]+)[))]\s*$/);return t?t[1]:e}getServerDirs(){try{let e=N.getInstance().getSyncRootDir();return k.existsSync(e)?k.readdirSync(e,{withFileTypes:!0}).filter(t=>t.isDirectory()).filter(t=>!t.name.startsWith(".")).map(t=>t.name):[]}catch{return[]}}getLocalChangeSummary(){let e={engines:0,events:0,fields:0,menuButtons:0,menuScripts:0,workflowNodeEvents:0,total:0};for(let t of this.getLocalChangeItems())t.kind==="engine"?e.engines+=1:t.kind==="event"?e.events+=1:t.kind==="field"?e.fields+=1:t.kind==="menuButton"?e.menuButtons+=1:t.kind==="menuScript"?e.menuScripts+=1:t.kind==="workflow"&&(e.workflowNodeEvents+=1);return e.total=e.engines+e.events+e.fields+e.menuButtons+e.menuScripts+e.workflowNodeEvents,e}getLocalChangeItems(){let e=[],t=(n,r,i,o,a)=>{let c=this.getWorkspaceFilePath(a.filePath);if(!c)return;let l=this.getLocalModifiedTime(c,a.updateTime);l&&e.push({kind:r,key:i,name:o,serverDir:n,filePath:c,updateTime:a.updateTime,modifiedTime:l})};for(let n of this.getServerDirs()){let r=this.loadMeta(n);for(let[i,o]of Object.entries(r.engines))t(n,"engine",i,o.apiName||i,o);for(let[i,o]of Object.entries(r.events))t(n,"event",i,`${o.description||o.formEngineKey}/${o.eventType}`,o);for(let[i,o]of Object.entries(r.fields||{}))t(n,"field",i,`${o.tableName}.${o.fieldName}/${o.v8Key}`,o);for(let[i,o]of Object.entries(r.menuButtons||{}))t(n,"menuButton",i,`${o.moduleName}/${o.btnName}/${o.v8SubField}`,o);for(let[i,o]of Object.entries(r.menuScripts||{}))t(n,"menuScript",i,`${o.moduleName}/${o.scriptField}`,o);for(let[i,o]of Object.entries(r.workflowNodeEvents||{}))t(n,"workflow",i,`${o.flowName}/${o.nodeName}/${o.eventType}`,o)}return e}async checkRemoteDifferences(e,t="all",n){let r=e?[e]:N.getInstance().getProfiles(),i=[];for(let o of r){let a=N.getInstance().buildServerDirName(o.label,o.apiBaseUrl),c=this.loadMeta(a),l=n?this.getTargetSyncKind(c,n):null;if(n&&!l)throw new Error(`\u540C\u6B65\u76EE\u6807\u4E0D\u5728\u672C\u5730\u57FA\u7EBF\u4E2D: ${n}`);(t==="all"||t==="api")&&(!n||l==="engine")&&await this.collectEngineDifferences(o,a,c,i,n),(t==="all"||t==="form")&&(!n||l==="event")&&await this.collectEventDifferences(o,a,c,i,n),(t==="all"||t==="form")&&(!n||l==="field")&&await this.collectFieldDifferences(o,a,c,i,n),(t==="all"||t==="module")&&(!n||l==="menuButton")&&await this.collectMenuButtonDifferences(o,a,c,i,n),(t==="all"||t==="module")&&(!n||l==="menuScript")&&await this.collectMenuScriptDifferences(o,a,c,i,n),(t==="all"||t==="workflow")&&(!n||l==="workflow")&&await this.collectWorkflowDifferences(o,a,c,i,n)}return i}matchesTargetFile(e,t){if(!t)return!0;let n=this.getWorkspaceFilePath(e);return!!n&&P.resolve(n).toLowerCase()===P.resolve(t).toLowerCase()}getTargetSyncKind(e,t){let n=[["engine",e.engines],["event",e.events],["field",e.fields||{}],["menuButton",e.menuButtons||{}],["menuScript",e.menuScripts||{}],["workflow",e.workflowNodeEvents||{}]];for(let[r,i]of n)if(Object.values(i).some(o=>this.matchesTargetFile(o.filePath,t)))return r;return null}classifyDifference(e,t,n,r){return n===r?null:e&&t?"conflict":e?"localModified":"remoteModified"}classifyRemoteDeletion(e,t){return this.isLocalModified(e,t)?"conflict":"remoteDeleted"}createRemoteDeletedItem(e,t,n,r,i,o){return!i||!k.existsSync(i)?null:{kind:e,status:this.classifyRemoteDeletion(i,o),name:t,key:n,serverDir:r,filePath:i,localCode:this.normalizeCode(k.readFileSync(i,"utf-8")),remoteCode:"",localUpdateTime:o,remoteUpdateTime:""}}isRemoteNewer(e,t){let n=new Date(e||"").getTime(),r=new Date(t||"").getTime();return isNaN(n)||isNaN(r)?!1:n>r+1e3}getRemoteOnlyPlaceholderPath(e,t,n,r){let i=N.getInstance(),o=n==="api"?dt:n==="form"?je:n==="module"?qe:gt;return P.join(i.getSyncRootDir(),t,i.buildOsClientDirName(e.osClient,e.osClientType,e.osClientNetwork),o,"\u670D\u52A1\u5668\u65B0\u589E\u5F85\u62C9\u53D6",`${Z(r)}.js`)}async collectEngineDifferences(e,t,n,r,i){let a=await j.getInstance().get(z.GET_ENGINE_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(a.Code!==1||!Array.isArray(a.Data?.List))throw new Error(`\u83B7\u53D6\u63A5\u53E3\u5F15\u64CE\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${a.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map(a.Data.List.map(d=>[d.ApiEngineKey,d])),l=!1;for(let[d,u]of Object.entries(n.engines)){if(!this.matchesTargetFile(u.filePath,i))continue;let p=c.get(d),m=this.getWorkspaceFilePath(u.filePath);if(!m||!k.existsSync(m))continue;if(!p){let w=this.createRemoteDeletedItem("engine",u.apiName||d,d,t,m,u.updateTime);w&&r.push(w);continue}let f=this.normalizeCode(k.readFileSync(m,"utf-8")),y=this.normalizeCode(p.ApiV8Code||""),C=this.isLocalModified(m,u.updateTime),h=this.isRemoteNewer(p.UpdateTime,u.updateTime);if(f===y){(C||h)&&p.UpdateTime&&(u.updateTime=p.UpdateTime,this.touchSyncedFile(m,p.UpdateTime),l=!0);continue}let S=this.classifyDifference(C,h,f,y);S&&r.push({kind:"engine",status:S,name:p.ApiName||u.apiName||d,key:d,serverDir:t,filePath:m,localCode:f,remoteCode:y,localUpdateTime:u.updateTime,remoteUpdateTime:p.UpdateTime})}if(l&&this.saveMeta(n,t),i)return;let g=new Set(Object.keys(n.engines).map(d=>d.toLowerCase()));for(let d of a.Data.List)!String(d.ApiV8Code||"").trim()||g.has(d.ApiEngineKey.toLowerCase())||r.push({kind:"engine",status:"remoteModified",name:d.ApiName||d.ApiEngineKey,key:d.ApiEngineKey,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"api",d.ApiEngineKey),localCode:"",remoteCode:this.normalizeCode(d.ApiV8Code||""),localUpdateTime:"",remoteUpdateTime:d.UpdateTime})}async collectEventDifferences(e,t,n,r,i){let a=await j.getInstance().get(z.GET_EVENT_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(a.Code!==1||!Array.isArray(a.Data?.List))throw new Error(`\u83B7\u53D6\u8868\u5355\u4E8B\u4EF6\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${a.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map;for(let d of a.Data.List){let u=`${d.FormEngineKey}__${d.EventType}`;c.set(u,d),c.set(u.toLowerCase(),d)}let l=!1;for(let[d,u]of Object.entries(n.events)){if(!this.matchesTargetFile(u.filePath,i))continue;let p=c.get(d)||c.get(d.toLowerCase()),m=this.getWorkspaceFilePath(u.filePath);if(!m||!k.existsSync(m))continue;if(!p){let w=this.createRemoteDeletedItem("event",`${u.description||u.formEngineKey}/${u.eventType}`,d,t,m,u.updateTime);w&&r.push(w);continue}let f=this.normalizeCode(k.readFileSync(m,"utf-8")),y=this.normalizeCode(p.V8Code||""),C=this.isLocalModified(m,u.updateTime),h=this.isRemoteNewer(p.UpdateTime,u.updateTime);if(f===y){(C||h)&&p.UpdateTime&&(u.updateTime=p.UpdateTime,this.touchSyncedFile(m,p.UpdateTime),l=!0);continue}let S=this.classifyDifference(C,h,f,y);S&&r.push({kind:"event",status:S,name:`${p.Description||u.formEngineKey}/${u.eventType}`,key:d,serverDir:t,filePath:m,localCode:f,remoteCode:y,localUpdateTime:u.updateTime,remoteUpdateTime:p.UpdateTime})}if(l&&this.saveMeta(n,t),i)return;let g=new Set(Object.keys(n.events).map(d=>d.toLowerCase()));for(let d of a.Data.List){let u=`${d.FormEngineKey}__${d.EventType}`;!String(d.V8Code||"").trim()||g.has(u.toLowerCase())||r.push({kind:"event",status:"remoteModified",name:`${d.Description||d.FormEngineKey}/${d.EventType}`,key:u,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"form",u),localCode:"",remoteCode:this.normalizeCode(d.V8Code||""),localUpdateTime:"",remoteUpdateTime:d.UpdateTime})}}async collectFieldDifferences(e,t,n,r,i){let o=j.getInstance(),a=new Map;for(let l of Object.entries(n.fields||{})){if(!this.matchesTargetFile(l[1].filePath,i))continue;let g=a.get(l[1].tableId||l[1].tableName)||[];g.push(l),a.set(l[1].tableId||l[1].tableName,g)}let c=!1;await this.runInBatches([...a.values()],i?1:2,async l=>{let g=l[0][1],d=await o.get(z.GET_FIELD_LIST,{osClient:e.osClient,tableId:g.tableId,tableName:g.tableName},e.apiBaseUrl,e);if(d.Code!==1||!Array.isArray(d.Data?.List))throw new Error(`\u83B7\u53D6\u5B57\u6BB5\u540C\u6B65\u72B6\u6001\u5931\u8D25[${g.tableName}]: ${d.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let u=new Map(d.Data.List.map(p=>[String(p.Name||"").toLowerCase(),p]));for(let[p,m]of l){let f=u.get(m.fieldName.toLowerCase()),y=this.getWorkspaceFilePath(m.filePath);if(!y||!k.existsSync(y))continue;if(!f||!String(f[m.v8Key]||"").trim()){let _=this.createRemoteDeletedItem("field",`${m.tableName}.${m.fieldName}/${m.v8Key}`,p,t,y,m.updateTime);_&&r.push(_);continue}let C=this.normalizeCode(k.readFileSync(y,"utf-8")),h=this.normalizeCode(String(f[m.v8Key]||"")),S=String(f.UpdateTime||""),w=this.isLocalModified(y,m.updateTime),v=this.isRemoteNewer(S,m.updateTime);if(C===h){(w||v)&&S&&(m.updateTime=S,this.touchSyncedFile(y,S),c=!0);continue}let b=this.classifyDifference(w,v,C,h);b&&r.push({kind:"field",status:b,name:`${m.tableName}.${m.fieldName}/${m.v8Key}`,key:p,serverDir:t,filePath:y,localCode:C,remoteCode:h,localUpdateTime:m.updateTime,remoteUpdateTime:S})}}),c&&this.saveMeta(n,t)}async collectMenuButtonDifferences(e,t,n,r,i){let o=j.getInstance(),a=new Map;if(!i)for(let u of Object.keys(n.menus||{}))a.set(u,[]);for(let u of Object.entries(n.menuButtons||{})){if(!this.matchesTargetFile(u[1].filePath,i))continue;let p=a.get(u[1].moduleId)||[];p.push(u),a.set(u[1].moduleId,p)}let c=[];if(!i){let u=await o.get(z.LIST_MODULES,{osClient:e.osClient},e.apiBaseUrl,e);if(u.Code!==1||!Array.isArray(u.Data?.List))throw new Error(`\u83B7\u53D6\u6A21\u5757\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${u.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);c=u.Data.List}let l=new Set(c.map(u=>String(u.ParentId||"")).filter(Boolean)),g=new Map(c.map(u=>[u.Id,u]));for(let u of c){if(l.has(u.Id)||n.menus?.[u.Id])continue;let p=u.Label||u.Name||u.Id;r.push({kind:"menuButton",status:"remoteModified",name:`${p}/\u670D\u52A1\u5668\u65B0\u589E\u6A21\u5757`,key:u.Id,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"module",u.Id),localCode:"",remoteCode:JSON.stringify(u,null,2),localUpdateTime:"",remoteUpdateTime:String(u.UpdateTime||"")})}let d=!1;await this.runInBatches([...a.entries()],i?1:2,async([u,p])=>{let m=()=>{for(let[v,b]of p){let _=this.getWorkspaceFilePath(b.filePath);if(!_)continue;let E=this.createRemoteDeletedItem("menuButton",`${b.moduleName}/${b.btnName}/${b.v8SubField}`,v,t,_,b.updateTime);E&&r.push(E)}};if(!i&&!g.has(u)){m();return}let f=await o.get(z.GET_MODULE,{osClient:e.osClient,moduleId:u},e.apiBaseUrl,e);if(f.Code!==1||!f.Data){if(/不存在|not\s*found/i.test(String(f.Msg||""))){m();return}throw new Error(`\u83B7\u53D6\u6A21\u5757\u6309\u94AE\u540C\u6B65\u72B6\u6001\u5931\u8D25[${u}]: ${f.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`)}let y=f.Data,C=String(y.UpdateTime||""),h=new Map;for(let v of Object.keys(pt)){let b=[];try{let _=y[v];b=typeof _=="string"?JSON.parse(_):Array.isArray(_)?_:[],Array.isArray(b)||(b=[])}catch{b=[]}h.set(v,new Map(b.map(_=>[String(_.Id||""),_])))}for(let[v,b]of p){let _=h.get(b.btnField)?.get(b.btnId),E=this.getWorkspaceFilePath(b.filePath);if(!E||!k.existsSync(E))continue;if(!_||!String(_[b.v8SubField]||"").trim()){let I=this.createRemoteDeletedItem("menuButton",`${b.moduleName}/${b.btnName}/${b.v8SubField}`,v,t,E,b.updateTime);I&&r.push(I);continue}let O=this.normalizeCode(k.readFileSync(E,"utf-8")),V=this.normalizeCode(String(_[b.v8SubField]||"")),R=this.isLocalModified(E,b.updateTime),L=this.isRemoteNewer(C,b.updateTime);if(O===V){(R||L)&&C&&(b.updateTime=C,this.touchSyncedFile(E,C),d=!0);continue}let T=this.classifyDifference(R,L,O,V);T&&r.push({kind:"menuButton",status:T,name:`${b.moduleName}/${b.btnName}/${b.v8SubField}`,key:v,serverDir:t,filePath:E,localCode:O,remoteCode:V,localUpdateTime:b.updateTime,remoteUpdateTime:C})}if(i)return;let S=new Set(p.map(([v])=>v)),w=n.menus?.[u]?.moduleName||g.get(u)?.Label||g.get(u)?.Name||u;for(let[v,b]of h)for(let[_,E]of b){if(!_)continue;let O=String(E.Name||_);for(let V of["V8Code","V8CodeShow"]){let R=String(E[V]||""),L=this.getMenuButtonMetaKey(u,v,_,V);!R.trim()||S.has(L)||r.push({kind:"menuButton",status:"remoteModified",name:`${w}/${O}/${V}`,key:L,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"module",L),localCode:"",remoteCode:this.normalizeCode(R),localUpdateTime:"",remoteUpdateTime:C})}}}),d&&this.saveMeta(n,t)}async collectMenuScriptDifferences(e,t,n,r,i){let o=j.getInstance(),a=Object.entries(n.menuScripts||{}).filter(([,l])=>this.matchesTargetFile(l.filePath,i)),c=!1;await this.runInBatches(a,i?1:2,async([l,g])=>{let d=this.getWorkspaceFilePath(g.filePath);if(!d||!k.existsSync(d))return;let u=await o.get(z.GET_MODULE,{osClient:e.osClient,moduleId:g.moduleId},e.apiBaseUrl,e);if(u.Code!==1||!u.Data){if(/不存在|not\s*found/i.test(String(u.Msg||""))){let w=this.createRemoteDeletedItem("menuScript",`${g.moduleName}/${g.scriptField}`,l,t,d,g.updateTime);w&&r.push(w);return}throw new Error(`\u83B7\u53D6\u6A21\u5757 Join/Where \u540C\u6B65\u72B6\u6001\u5931\u8D25[${g.moduleId}]: ${u.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`)}let p=u.Data,m=this.normalizeCode(String(p[g.scriptField]||"")),f=this.normalizeCode(k.readFileSync(d,"utf-8")),y=String(p.UpdateTime||""),C=this.isLocalModified(d,g.updateTime),h=this.sourceHash(m)!==g.codeHash;if(f===m){(C||h||y&&y!==g.updateTime)&&(g.codeHash=this.sourceHash(m),g.updateTime=y||g.updateTime,this.touchSyncedFile(d,g.updateTime),c=!0);return}let S=this.classifyDifference(C,h,f,m);S&&r.push({kind:"menuScript",status:S,name:`${g.moduleName}/${g.scriptField}`,key:l,serverDir:t,filePath:d,localCode:f,remoteCode:m,localUpdateTime:g.updateTime,remoteUpdateTime:y})}),c&&this.saveMeta(n,t)}async runInBatches(e,t,n){for(let r=0;r<e.length;r+=t)await Promise.all(e.slice(r,r+t).map(i=>n(i))),r+t<e.length&&await new Promise(i=>setTimeout(i,120))}async collectWorkflowDifferences(e,t,n,r,i){let a=await j.getInstance().get(z.GET_WORKFLOW_V8_EVENT_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(a.Code!==1||!Array.isArray(a.Data?.List))throw new Error(`\u83B7\u53D6\u6D41\u7A0B\u4E8B\u4EF6\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${a.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map(a.Data.List.map(d=>[`${d.FlowDesignId}__${d.NodeId}__${d.EventType}`,d])),l=!1;for(let[d,u]of Object.entries(n.workflowNodeEvents||{})){if(!this.matchesTargetFile(u.filePath,i))continue;let p=c.get(d),m=this.getWorkspaceFilePath(u.filePath);if(!m||!k.existsSync(m))continue;if(!p||!String(p.V8Code||p.Code||"").trim()){let w=this.createRemoteDeletedItem("workflow",`${u.flowName}/${u.nodeName}/${u.eventType}`,d,t,m,u.updateTime);w&&r.push(w);continue}let f=this.normalizeCode(k.readFileSync(m,"utf-8")),y=this.normalizeCode(p.V8Code||p.Code||""),C=this.isLocalModified(m,u.updateTime),h=this.isRemoteNewer(p.UpdateTime,u.updateTime);if(f===y){(C||h)&&p.UpdateTime&&(u.updateTime=p.UpdateTime,this.touchSyncedFile(m,p.UpdateTime),l=!0);continue}let S=this.classifyDifference(C,h,f,y);if(S){let w=`${p.FlowName||u.flowName}/${p.NodeName||u.nodeName}/${p.EventType||u.eventType}`;r.push({kind:"workflow",status:S,name:w,key:d,serverDir:t,filePath:m,localCode:f,remoteCode:y,localUpdateTime:u.updateTime,remoteUpdateTime:p.UpdateTime})}}if(l&&this.saveMeta(n,t),i)return;let g=new Set(Object.keys(n.workflowNodeEvents||{}));for(let d of a.Data.List){let u=`${d.FlowDesignId}__${d.NodeId}__${d.EventType}`,p=d.V8Code||d.Code||"";if(!p.trim()||g.has(u))continue;let m=`${d.FlowName||d.FlowDesignId}/${d.NodeName||d.NodeId}/${d.EventType}`;r.push({kind:"workflow",status:"remoteModified",name:m,key:u,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"workflow",u),localCode:"",remoteCode:this.normalizeCode(p),localUpdateTime:"",remoteUpdateTime:d.UpdateTime})}}migrateFromFlatMeta(e){let t=N.getInstance();try{let n=t.getSyncRootDir(),r=P.join(n,ut);if(!k.existsSync(r))return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};let i=t.getWorkspaceRoot();if(!i)return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};let o=JSON.parse(k.readFileSync(r,"utf-8")),a=o.engines||{},c=o.events||{},l={engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};for(let[g,d]of Object.entries(a)){let u=d;if(u.filePath){let p=P.join(i,u.filePath);P.relative(n,p).split(P.sep)[0]===e&&(l.engines[g]=u)}}for(let[g,d]of Object.entries(c)){let u=d;if(u.filePath){let p=P.join(i,u.filePath);P.relative(n,p).split(P.sep)[0]===e&&(l.events[g]=u)}}return(Object.keys(l.engines).length>0||Object.keys(l.events).length>0)&&this.saveMeta(l,e),l}catch{return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}}}}async pullEngines(e){if(!e){let t=N.getInstance().getProfiles();if(t.length===0){F.warn("Microi: \u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u670D\u52A1\u5668\uFF0C\u8BF7\u5148\u5728\u8BBE\u7F6E\u4E2D\u6DFB\u52A0\u8FDE\u63A5\u5E76\u767B\u5F55");return}for(let n of t)try{await this.pullEnginesForProfile(n)}catch(r){let i=r instanceof Error?r.message:String(r);this.log(`\u62C9\u53D6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${i}`),F.error(`Microi: \u62C9\u53D6 [${n.label||n.apiBaseUrl}] \u5931\u8D25 - ${i}`)}return}await this.pullEnginesForProfile(e)}async pullEnginesForProfile(e){let t=N.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE\u4EE3\u7801 [${e.label||r}]...`),await we.withProgress({location:ct.Notification,title:`Microi: \u62C9\u53D6\u63A5\u53E3\u5F15\u64CE [${e.label||r}]`,cancellable:!1},async o=>{o.report({message:"\u68C0\u67E5\u540E\u7AEF\u72B6\u6001..."});let a=await n.get(z.GET_STATUS,void 0,r,e);if(a.Code!==1){let T=a.Code===1001||a.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u540E\u7AEF\u72B6\u6001\u5F02\u5E38: ${a.Msg||"Code="+a.Code}${T}`)}o.report({message:"\u83B7\u53D6\u7CFB\u7EDF\u914D\u7F6E..."});let l=await be.getInstance().getSysConfig(r,i),g=l?.SysShortTitle||"",d=l?.SysTitle||"",u=g||d||l?.CompanyName||e.label||"";u&&(u!==e.label||g!==e.sysShortTitle||d!==e.sysTitle)&&await t.addProfile({...e,label:u,sysShortTitle:g,sysTitle:d}),o.report({message:"\u83B7\u53D6\u63A5\u53E3\u5F15\u64CE\u5217\u8868..."});let p=await n.get(z.GET_ENGINE_LIST,{osClient:i},r,e);if(p.Code!==1){let T=p.Code===1001||p.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u5217\u8868\u5931\u8D25: ${p.Msg||"Code="+p.Code}${T}`)}let{OsClient:m,OsClientType:f,OsClientNetwork:y,List:C,Total:h}=p.Data;if(this.log(`\u83B7\u53D6\u5230 ${h} \u4E2A\u63A5\u53E3\u5F15\u64CE (OsClient: ${m})`),!f||!y)throw new Error(`\u540E\u7AEF\u672A\u8FD4\u56DE\u5B8C\u6574\u7684 OsClientType/OsClientNetwork (OsClient: ${m}, Type: ${f||"\u7A7A"}, Network: ${y||"\u7A7A"})\uFF0C\u65E0\u6CD5\u62C9\u53D6\u4EE3\u7801`);if(f||y){let T={...e,osClientType:f,osClientNetwork:y};await t.addProfile(T)}let S=t.getSyncRootDir(),w=t.buildServerDirName(u,r),v=this.loadMeta(w),b=0,_=0,E=[],O=new Set,V=new Set,R=t.buildOsClientDirName(m,f,y);for(let T of C)try{let I=Z(T.Category||"\u672A\u5206\u7C7B"),x=Z(T.ApiName||T.ApiEngineKey),Y=P.join(S,w,R,dt,I),Q=Z(`${x}(${lr(T.ApiEngineKey)}).js`),me=P.join(Y,Q),G=ur(T.ApiV8Code||"");if(!G.trim()){_++,k.existsSync(me)&&this.backupAndDeleteSyncFile(me,w,"remote-deleted-api"),delete v.engines[T.ApiEngineKey];continue}O.add(T.ApiEngineKey),Se(Y),k.writeFileSync(me,G,"utf-8");let ne=new Date(T.UpdateTime);isNaN(ne.getTime())||k.utimesSync(me,ne,ne),v.engines[T.ApiEngineKey]={id:T.Id,apiName:T.ApiName,category:I,apiAddress:T.ApiAddress,apiRoutes:T.ApiRoutes||"",updateTime:T.UpdateTime,filePath:P.relative(t.getWorkspaceRoot(),me)},b++,o.report({message:`${b}/${h} ${T.ApiEngineKey}`,increment:1/h*100})}catch(I){let x=I instanceof Error?I.message:String(I);V.add(T.ApiEngineKey),E.push(`${T.ApiEngineKey}: ${x}`),this.log(`\u63A5\u53E3\u5F15\u64CE\u6587\u4EF6\u5199\u5165\u5931\u8D25\uFF0C\u7EE7\u7EED\u4E0B\u4E00\u9879 [${T.ApiEngineKey}]: ${x}`)}for(let[T,I]of Object.entries(v.engines)){if(O.has(T)||V.has(T))continue;let x=this.getWorkspaceFilePath(I.filePath);x&&this.backupAndDeleteSyncFile(x,w,"remote-deleted-api"),delete v.engines[T]}this.saveMeta(v,w);let L=u||e.label||r;this.log(`[${L}] \u62C9\u53D6\u5B8C\u6210: ${b} \u4E2A\u63A5\u53E3\u5F15\u64CE\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${_} \u9879\uFF0C\u5931\u8D25 ${E.length} \u9879`),E.length>0?F.warn(`Microi: [${L}] \u5DF2\u62C9\u53D6 ${b} \u4E2A\u63A5\u53E3\u5F15\u64CE\uFF0C${E.length} \u4E2A\u6587\u4EF6\u5931\u8D25\uFF1B\u5931\u8D25\u660E\u7EC6\u5DF2\u5199\u5165 Microi \u8F93\u51FA\u3002`):F.info(`Microi: [${L}] \u6210\u529F\u62C9\u53D6 ${b} \u4E2A\u63A5\u53E3\u5F15\u64CE${_>0?`\uFF08\u8DF3\u8FC7 ${_} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)})}async pullEvents(e){if(!e){let t=N.getInstance().getProfiles();if(t.length===0)return;for(let n of t)try{await this.pullEventsForProfile(n)}catch(r){let i=r instanceof Error?r.message:String(r);this.log(`\u62C9\u53D6V8\u4E8B\u4EF6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${i}`)}return}await this.pullEventsForProfile(e)}async pullEventsForProfile(e){let t=N.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6V8\u4E8B\u4EF6\u4EE3\u7801 [${e.label||r}]...`),await we.withProgress({location:ct.Notification,title:`Microi: \u62C9\u53D6V8\u4E8B\u4EF6 [${e.label||r}]`,cancellable:!1},async o=>{o.report({message:"\u83B7\u53D6V8\u4E8B\u4EF6\u5217\u8868..."});let a=await n.get(z.GET_EVENT_LIST,{osClient:i},r,e);if(a.Code!==1){let R=a.Code===1001||a.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6V8\u4E8B\u4EF6\u5217\u8868\u5931\u8D25: ${a.Msg||"Code="+a.Code}${R}`)}let{List:c,Total:l}=a.Data;this.log(`\u83B7\u53D6\u5230 ${l} \u4E2AV8\u4E8B\u4EF6`);let d=await be.getInstance().getSysConfig(r,i),u=d?.SysShortTitle||"",p=d?.SysTitle||"",m=u||p||d?.CompanyName||e.label||"";m&&(m!==e.label||u!==e.sysShortTitle||p!==e.sysTitle)&&await t.addProfile({...e,label:m,sysShortTitle:u,sysTitle:p});let f=t.getSyncRootDir(),y=t.buildServerDirName(m,r),C=this.loadMeta(y),h=0,S=0,w=0,v=new Set(c.map(R=>`${R.FormEngineKey}__${R.EventType}`)),_=t.getProfiles().find(R=>R.apiBaseUrl===e.apiBaseUrl&&R.osClient===e.osClient)||e;if(!_.osClientType||!_.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE\u4EE5\u83B7\u53D6\u5B8C\u6574\u914D\u7F6E");let E=t.buildOsClientDirName(i,_.osClientType,_.osClientNetwork),O={SubmitBeforeServerV8:"\u540E\u7AEF\u63D0\u4EA4\u524DV8\u4E8B\u4EF6",SubmitAfterServerV8:"\u540E\u7AEF\u63D0\u4EA4\u540EV8\u4E8B\u4EF6",SubmitFormV8:"\u524D\u7AEF\u8868\u5355\u63D0\u4EA4V8\u4E8B\u4EF6",OutFormV8:"\u524D\u7AEF\u8868\u5355\u9000\u51FAV8\u4E8B\u4EF6",ServerDataV8:"\u540E\u7AEF\u6570\u636EV8\u4E8B\u4EF6"};for(let R of c){let L=R.V8Code||"",T=Z(R.Description?`${R.Description}\uFF08${R.FormEngineKey}\uFF09`:R.FormEngineKey),I=es[R.EventType]||R.EventType,x=Z(`${I}\uFF08${R.EventType}\uFF09`)+".js",Y=P.join(f,y,E,je,T,gn);Se(Y);let Q=P.join(Y,x),me=O[R.EventType];if(me){let le=Z(`${me}\uFF08${R.EventType}\uFF09`)+".js",se=P.join(Y,le);se!==Q&&k.existsSync(se)&&!this.isLocalModified(se,R.UpdateTime)&&(k.existsSync(Q)?k.unlinkSync(se):k.renameSync(se,Q))}let G=`${R.FormEngineKey}__${R.EventType}`;if(C.events[G]={id:R.Id,formEngineKey:R.FormEngineKey,description:R.Description||"",eventType:R.EventType,updateTime:R.UpdateTime,filePath:P.relative(t.getWorkspaceRoot(),Q)},!L.trim()){k.existsSync(Q)&&this.backupAndDeleteSyncFile(Q,y,"remote-deleted-form-event"),w++,h++,o.report({message:`${h}/${l}`,increment:l>0?1/l*100:void 0});continue}k.writeFileSync(Q,L,"utf-8");let ne=new Date(R.UpdateTime);isNaN(ne.getTime())||k.utimesSync(Q,ne,ne),S++,h++,o.report({message:`${h}/${l}`,increment:l>0?1/l*100:void 0})}for(let[R,L]of Object.entries(C.events)){if(v.has(R))continue;let T=this.getWorkspaceFilePath(L.filePath);T&&this.backupAndDeleteSyncFile(T,y,"remote-deleted-form-event"),delete C.events[R]}this.saveMeta(C,y);let V=m||e.label||r;this.log(`[${V}] \u62C9\u53D6\u5B8C\u6210: ${S} \u4E2AV8\u4E8B\u4EF6\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${w} \u9879`),F.info(`Microi: [${V}] \u6210\u529F\u62C9\u53D6 ${S} \u4E2AV8\u4E8B\u4EF6\u6587\u4EF6${w>0?`\uFF08\u8DF3\u8FC7 ${w} \u4E2A\u7A7A\u4EE3\u7801\u4E8B\u4EF6\uFF09`:""}`)})}async pullWorkflows(e){if(!e){let t=N.getInstance().getProfiles();if(t.length===0)return;for(let n of t)try{await this.pullWorkflowsForProfile(n)}catch(r){let i=r instanceof Error?r.message:String(r);this.log(`\u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${i}`)}return}await this.pullWorkflowsForProfile(e)}async pullWorkflowsForProfile(e){let t=N.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE\u8282\u70B9 V8 [${e.label||r}]...`),await we.withProgress({location:ct.Notification,title:`Microi: \u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE [${e.label||r}]`,cancellable:!1},async o=>{o.report({message:"\u83B7\u53D6\u6D41\u7A0B\u8282\u70B9V8\u5217\u8868..."});let a=await n.get(z.GET_WORKFLOW_V8_EVENT_LIST,{osClient:i},r,e);if(a.Code!==1){let I=a.Code===1001||a.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u6D41\u7A0B\u8282\u70B9V8\u5217\u8868\u5931\u8D25: ${a.Msg||"Code="+a.Code}${I}`)}let l=await be.getInstance().getSysConfig(r,i),g=l?.SysShortTitle||"",d=l?.SysTitle||"",u=g||d||l?.CompanyName||e.label||"";u&&(u!==e.label||g!==e.sysShortTitle||d!==e.sysTitle)&&await t.addProfile({...e,label:u,sysShortTitle:g,sysTitle:d});let m=t.getProfiles().find(I=>I.apiBaseUrl===e.apiBaseUrl&&I.osClient===e.osClient)||e;if(!m.osClientType||!m.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let f=a.Data.OsClient||i,y=t.buildServerDirName(u,r),C=t.buildOsClientDirName(f,m.osClientType,m.osClientNetwork),h=t.getSyncRootDir(),S=this.loadMeta(y);S.workflows||(S.workflows={}),S.workflowNodeEvents||(S.workflowNodeEvents={});let w=a.Data.Flows||[],v=a.Data.Nodes||[],b=a.Data.Lines||[],_=a.Data.List||[],E=new Map(w.map(I=>[String(I.Id||""),I])),O=new Set(w.map(I=>String(I.Id||"")).filter(Boolean)),V=new Set(_.filter(I=>String(I.V8Code||I.Code||"").trim()).map(I=>`${I.FlowDesignId}__${I.NodeId}__${I.EventType}`)),R=0,L=0;for(let I of w){let x=String(I.Id||"");if(!x)continue;let Y=String(I.FlowName||x),Q=String(I.UpdateTime||Te()),me=P.join(h,y,C,gt,Z(`${Y}\uFF08${x}\uFF09`));Se(me);let G=v.filter(se=>String(se.FlowDesignId||"")===x),ne=b.filter(se=>String(se.FlowDesignId||"")===x),le=P.join(me,"\u6D41\u7A0B\u8BBE\u8BA1\u56FE\uFF08WF_FlowDesign\uFF09.json");k.writeFileSync(le,JSON.stringify({FlowDesign:I,Nodes:G,Lines:ne},null,2),"utf-8"),this.touchSyncedFile(le,Q),S.workflows[x]={flowDesignId:x,flowName:Y,updateTime:Q,filePath:P.relative(t.getWorkspaceRoot(),le)}}for(let I of _){let x=String(I.FlowDesignId||""),Y=String(I.NodeId||""),Q=String(I.EventType||"");if(!x||!Y||!Q)continue;let me=E.get(x),G=String(I.FlowName||me?.FlowName||x),ne=String(I.NodeName||Y),le=ts[Q]||I.EventName||Q,se=P.join(h,y,C,gt,Z(`${G}\uFF08${x}\uFF09`),pn,Z(`${ne}\uFF08${Y}\uFF09`));Se(se);let M=P.join(se,Z(`${le}\uFF08${Q}\uFF09`)+".js"),ie=I.V8Code||I.Code||"",re=String(I.UpdateTime||me?.UpdateTime||Te());if(S.workflowNodeEvents[`${x}__${Y}__${Q}`]={flowDesignId:x,flowName:G,nodeId:Y,nodeName:ne,eventType:Q,updateTime:re,filePath:P.relative(t.getWorkspaceRoot(),M)},!ie.trim()){k.existsSync(M)&&this.backupAndDeleteSyncFile(M,y,"remote-deleted-workflow-event"),L++,o.report({message:`${R}/${_.length} ${G}/${ne}`});continue}k.writeFileSync(M,ie,"utf-8"),this.touchSyncedFile(M,re),R++,o.report({message:`${R}/${_.length} ${G}/${ne}`})}for(let[I,x]of Object.entries(S.workflowNodeEvents)){if(V.has(I))continue;let Y=this.getWorkspaceFilePath(x.filePath);Y&&this.backupAndDeleteSyncFile(Y,y,"remote-deleted-workflow-event"),delete S.workflowNodeEvents[I]}for(let[I,x]of Object.entries(S.workflows)){if(O.has(I))continue;let Y=this.getWorkspaceFilePath(x.filePath);Y&&this.backupAndDeleteSyncFile(Y,y,"remote-deleted-workflow"),delete S.workflows[I]}this.saveMeta(S,y);let T=u||e.label||r;this.log(`[${T}] \u6D41\u7A0B\u5F15\u64CE\u62C9\u53D6\u5B8C\u6210: ${w.length} \u4E2A\u6D41\u7A0B\uFF0C${R} \u4E2A\u8282\u70B9V8\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${L} \u9879`),F.info(`Microi: [${T}] \u6210\u529F\u62C9\u53D6 ${w.length} \u4E2A\u6D41\u7A0B\u3001${R} \u4E2A\u6D41\u7A0B\u8282\u70B9V8\u6587\u4EF6${L>0?`\uFF08\u8DF3\u8FC7 ${L} \u4E2A\u7A7A\u4EE3\u7801\u4E8B\u4EF6\uFF09`:""}`)})}findProfileByServerDir(e){let t=N.getInstance(),n=t.getProfiles();for(let r of n)if(t.buildServerDirName(r.label,r.apiBaseUrl)===e)return r}hasSyncBaseline(e,t){let n=P.resolve(e).toLowerCase(),r=this.loadMeta(t);return[r.engines,r.events,r.fields||{},r.menuButtons||{},r.menuScripts||{},r.workflowNodeEvents||{}].some(o=>Object.values(o).some(a=>{let c=this.getWorkspaceFilePath(a.filePath);return!!c&&P.resolve(c).toLowerCase()===n}))}async runPushPreflight(e,t,n,r){if(!n){let i=`\u65E0\u6CD5\u8BC6\u522B\u6587\u4EF6\u6240\u5C5E\u670D\u52A1\u5668\u914D\u7F6E\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\uFF1A${e}`;return this.log(i),F.error(`Microi: ${i}`),!1}if(!this.hasSyncBaseline(e,t)){let i=`\u6587\u4EF6\u6CA1\u6709\u540C\u6B65\u57FA\u7EBF\uFF0C\u65E0\u6CD5\u786E\u8BA4\u670D\u52A1\u5668\u7AEF\u662F\u5426\u66F4\u65B0\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\u3002\u8BF7\u5148\u62C9\u53D6\u5BF9\u5E94\u5F15\u64CE\uFF1A${e}`;return this.log(i),F.error(`Microi: ${i}`),!1}try{let i=await this.checkRemoteDifferences(n,r,e),o=P.resolve(e).toLowerCase(),a=i.find(g=>P.resolve(g.filePath).toLowerCase()===o);if(!a||a.status==="localModified")return!0;let l=`${a.status==="conflict"?"\u672C\u5730\u4E0E\u670D\u52A1\u5668\u5747\u5DF2\u4FEE\u6539":a.status==="remoteDeleted"?"\u670D\u52A1\u5668\u7AEF\u8D44\u6E90\u5DF2\u5220\u9664":"\u670D\u52A1\u5668\u4EE3\u7801\u8F83\u65B0"}\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\u4EE5\u907F\u514D\u8986\u76D6\u3002\u8BF7\u5728\u201C\u540C\u6B65\u7ED3\u679C\u201D\u4E2D\u67E5\u770B\u5DEE\u5F02\u5E76\u62C9\u53D6\u6216\u5408\u5E76\uFF1A${a.name}`;return this.log(l),F.error(`Microi: ${l}`),!1}catch(i){let o=i instanceof Error?i.message:String(i);return this.log(`\u63A8\u9001\u524D\u540C\u6B65\u72B6\u6001\u68C0\u6D4B\u5931\u8D25\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\uFF1A${o}`),F.error(`Microi: \u63A8\u9001\u524D\u540C\u6B65\u72B6\u6001\u68C0\u6D4B\u5931\u8D25\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001 - ${o}`),!1}}async pushFile(e,t={}){let r=N.getInstance().getSyncRootDir();if(P.extname(e).toLowerCase()===".js"&&k.existsSync(e)){let d=ds(Oe(k.readFileSync(e,"utf-8")));if(d.length>0){let u=d[0],p=`\u68C0\u6D4B\u5230 AI/\u7EC8\u7AEF\u5DE5\u5177\u8F93\u51FA\u6C61\u67D3\uFF08\u7B2C ${u.line} \u884C: ${u.marker}\uFF09\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\u3002\u8BF7\u6062\u590D\u5B8C\u6574\u6E90\u7801\u540E\u518D\u8BD5\uFF1A${e}`;return this.log(p),F.error(`Microi: ${p}`),!1}}let i=os(e,r);if(i){let d=this.findProfileByServerDir(i.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,i.serverDir,d,"api")?!1:this.pushEngineFile(e,i,d)}let o=as(e,r);if(o){let d=this.findProfileByServerDir(o.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,o.serverDir,d,"form")?!1:this.pushEventFile(e,o,d)}let a=cs(e,r);if(a){let d=this.findProfileByServerDir(a.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,a.serverDir,d,"form")?!1:this.pushFieldFile(e,a,d)}let c=ls(e,r);if(c){let d=this.findProfileByServerDir(c.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,c.serverDir,d,"module")?!1:this.pushMenuButtonFile(e,c,d)}let l=us(e,r);if(l){let d=this.findProfileByServerDir(l.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,l.serverDir,d,"module")?!1:this.pushMenuScriptFile(e,l,d)}let g=gs(e,r);if(g){let d=this.findProfileByServerDir(g.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,g.serverDir,d,"workflow")?!1:this.pushWorkflowNodeFile(e,g,d)}return this.log(`\u65E0\u6CD5\u89E3\u6790\u6587\u4EF6\u8DEF\u5F84: ${e}`),!1}async pushEngineFile(e,t,n){let r=j.getInstance(),i=k.readFileSync(e,"utf-8"),o=Oe(i);this.log(`\u63A8\u9001\u63A5\u53E3\u5F15\u64CE: ${t.apiEngineKey}...`);try{let a="",c="";try{let p=await r.post(z.GET_ENGINE_CODE,{OsClient:t.osClient,ApiEngineKey:t.apiEngineKey},void 0,n?.apiBaseUrl,n);p.Code===1&&p.Data&&(a=p.Data.ApiV8Code||p.Data.Code||"",c=p.Data.Version||"")}catch{a="",c=""}let l=!o.trim(),g=l?{code:"",version:c,changeHistory:""}:Jt({kind:"ApiEngine",key:t.apiEngineKey,currentCode:o,remoteCode:a,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001\u63A5\u53E3\u5F15\u64CE ${t.apiEngineKey}`}),d={OsClient:t.osClient,ApiEngineKey:t.apiEngineKey,ApiV8CodeBase64:Buffer.from(g.code,"utf8").toString("base64")};l||(d.Version=g.version,d.ChangeSummary=g.changeHistory);let u=await r.post(z.UPDATE_ENGINE_CODE,d,void 0,n?.apiBaseUrl,n);if(u.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.apiEngineKey}`);let p=u.Data?.UpdateTime||Te(),m=this.loadMeta(t.serverDir);if(l?delete m.engines[t.apiEngineKey]:m.engines[t.apiEngineKey]&&(m.engines[t.apiEngineKey].updateTime=p),this.saveMeta(m,t.serverDir),l)k.existsSync(e)&&k.unlinkSync(e);else{k.writeFileSync(e,g.code,"utf-8");let f=new Date(p);isNaN(f.getTime())||k.utimesSync(e,f,f)}return!0}else return this.log(`\u63A8\u9001\u5931\u8D25: ${t.apiEngineKey} - ${u.Msg}`),F.error(`Microi: \u63A8\u9001\u5931\u8D25 - ${u.Msg}`),!1}catch(a){let c=a instanceof Error?a.message:String(a);return this.log(`\u63A8\u9001\u5F02\u5E38: ${t.apiEngineKey} - ${c}`),F.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async pushEventFile(e,t,n){let r=j.getInstance(),i=k.readFileSync(e,"utf-8"),o=Oe(i);this.log(`\u63A8\u9001V8\u4E8B\u4EF6: ${t.formEngineKey}/${t.eventType}...`);try{let a="",c="";try{let p=await r.post(z.GET_EVENT_CODE,{OsClient:t.osClient,FormEngineKey:t.formEngineKey,EventType:t.eventType},void 0,n?.apiBaseUrl,n);p.Code===1&&p.Data&&(a=p.Data.V8Code||p.Data.Code||"",c=p.Data.Version||"")}catch{a="",c=""}let l=!o.trim(),g=l?{code:"",version:c,changeHistory:""}:Jt({kind:"V8Event",key:t.formEngineKey,eventType:t.eventType,currentCode:o,remoteCode:a,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001 V8 \u4E8B\u4EF6 ${t.formEngineKey}/${t.eventType}`}),d={OsClient:t.osClient,FormEngineKey:t.formEngineKey,EventType:t.eventType,V8Code:g.code};l||(d.Version=g.version,d.ChangeHistory=g.changeHistory);let u=await r.post(z.UPDATE_EVENT_CODE,d,void 0,n?.apiBaseUrl,n);if(u.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.formEngineKey}/${t.eventType}`);let p=u.Data?.UpdateTime||Te(),m=this.loadMeta(t.serverDir),f=`${t.formEngineKey}__${t.eventType}`;if(l)delete m.events[f];else{let y=m.events[f];m.events[f]={id:y?.id||"",formEngineKey:t.formEngineKey,description:y?.description||"",eventType:t.eventType,updateTime:p,filePath:P.relative(N.getInstance().getWorkspaceRoot(),e)}}if(this.saveMeta(m,t.serverDir),l)k.existsSync(e)&&k.unlinkSync(e);else{k.writeFileSync(e,g.code,"utf-8");let y=new Date(p);isNaN(y.getTime())||k.utimesSync(e,y,y)}return!0}else return this.log(`\u63A8\u9001\u5931\u8D25: ${t.formEngineKey}/${t.eventType} - ${u.Msg}`),F.error(`Microi: \u63A8\u9001\u5931\u8D25 - ${u.Msg}`),!1}catch(a){let c=a instanceof Error?a.message:String(a);return this.log(`\u63A8\u9001\u5F02\u5E38: ${t.formEngineKey}/${t.eventType} - ${c}`),F.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async createEngine(e){let t=j.getInstance(),n=N.getInstance();this.log(`\u521B\u5EFA\u63A5\u53E3\u5F15\u64CE: ${e.apiEngineKey}...`);try{let r=Jt({kind:"ApiEngine",key:e.apiEngineKey,currentCode:"",functionDescription:`\u63A5\u53E3\u5F15\u64CE ${e.apiName} \u7684\u5B8C\u6574\u4E1A\u52A1\u903B\u8F91\u3002`,changeSummary:`\u901A\u8FC7 VS Code \u521B\u5EFA\u63A5\u53E3\u5F15\u64CE ${e.apiEngineKey}`,initial:!0}),i=await t.post(z.CREATE_ENGINE,{OsClient:e.profile.osClient,ApiName:e.apiName,ApiEngineKey:e.apiEngineKey,ApiAddress:e.apiAddress||"",ApiRoutes:e.apiRoutes||"",ApiRemark:e.apiRemark||"",Lock:e.lock?1:0,LockKey:e.lockKey||"",AllowAnonymous:e.allowAnonymous?1:0,V8Limit:e.v8Limit?1:0,IsEnable:e.isEnable!==!1?1:0,ApiRole:e.apiRole||"",Category:e.category||"\u672A\u5206\u7C7B",ApiV8CodeBase64:Buffer.from(r.code,"utf8").toString("base64"),Version:r.version,ChangeSummary:r.changeHistory},void 0,e.profile.apiBaseUrl,e.profile);if(i.Code===1){let o=n.getSyncRootDir(),a=n.buildServerDirName(e.profile.label,e.profile.apiBaseUrl),c=n.buildOsClientDirName(e.profile.osClient,e.profile.osClientType,e.profile.osClientNetwork),l=Z(e.category||"\u672A\u5206\u7C7B"),g=Z(e.apiName||e.apiEngineKey),d=P.join(o,a,c,dt,l);Se(d);let u=P.join(d,Z(`${g}(${lr(e.apiEngineKey)}).js`));k.writeFileSync(u,r.code,"utf-8");let p=this.loadMeta(a);return p.engines[e.apiEngineKey]={id:"",apiName:e.apiName,category:l,apiAddress:e.apiAddress||"",apiRoutes:e.apiRoutes||"",updateTime:Te(),filePath:P.relative(n.getWorkspaceRoot(),u)},this.saveMeta(p,a),this.log(`\u521B\u5EFA\u6210\u529F: ${e.apiEngineKey}`),F.info(`Microi: \u63A5\u53E3\u5F15\u64CE [${e.apiEngineKey}] \u521B\u5EFA\u6210\u529F`),await we.showTextDocument(Yr.file(u)),!0}else return this.log(`\u521B\u5EFA\u5931\u8D25: ${e.apiEngineKey} - ${i.Msg}`),F.error(`Microi: \u521B\u5EFA\u5931\u8D25 - ${i.Msg}`),!1}catch(r){let i=r instanceof Error?r.message:String(r);return this.log(`\u521B\u5EFA\u5F02\u5E38: ${e.apiEngineKey} - ${i}`),F.error(`Microi: \u521B\u5EFA\u5F02\u5E38 - ${i}`),!1}}async pullFields(e){if(!e){let t=N.getInstance().getProfiles();for(let n of t)try{await this.pullFieldsForProfile(n)}catch(r){this.log(`\u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${r instanceof Error?r.message:String(r)}`)}return}await this.pullFieldsForProfile(e)}async pullFieldsForTableFolder(e){let n=N.getInstance().getSyncRootDir(),r=P.relative(n,e).split(P.sep);if(r.length<4||r[2]!==je){F.warn("Microi: \u8BF7\u5728\u201C\u8868\u5355\u5F15\u64CE\u201D\u4E0B\u7684\u8868\u76EE\u5F55\u6267\u884C\u5B57\u6BB5 V8 \u4E8B\u4EF6\u62C9\u53D6");return}let i=a=>{let c=a.match(/[((]([^))]+)[))]\s*$/);return c?c[1]:a},o=this.findProfileByServerDir(r[0]);if(!o){F.error(`Microi: \u672A\u627E\u5230\u4E0E\u76EE\u5F55 "${r[0]}" \u5339\u914D\u7684\u670D\u52A1\u5668\u8FDE\u63A5`);return}await this.pullFieldsForTable(o,i(r[3]),e,r[0])}async pullFieldsForTable(e,t,n,r){let i=N.getInstance(),o=j.getInstance(),a=this.loadMeta(r);a.fields||(a.fields={}),this.log(`\u62C9\u53D6\u8868\u5B57\u6BB5V8\u4E8B\u4EF6: ${t}...`);let c=await o.get(z.GET_FIELD_LIST,{osClient:e.osClient,tableName:t},e.apiBaseUrl,e);if(c.Code!==1){F.error(`Microi: \u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 - ${c.Msg}`);return}let l=c.Data.List||[],g=["V8Code","KeyupV8Code","V8TmpEngineTable","V8TmpEngineForm"],d=0,u=0;for(let p of l){let m=Z(p.Label?`${p.Label}\uFF08${p.Name}\uFF09`:p.Name),f=P.join(n,Mt,m);for(let y of g){let C=(p[y]||"").toString(),h=Xn[y]||y,S=Z(`${h}\uFF08${y}\uFF09`)+".js",w=P.join(f,S),v=`${t}__${p.Name}__${y}`;if(!C.trim()){u++,k.existsSync(w)&&k.unlinkSync(w),delete a.fields[v];continue}Se(f),k.writeFileSync(w,C,"utf-8");let b=new Date(p.UpdateTime);isNaN(b.getTime())||k.utimesSync(w,b,b),a.fields[v]={fieldId:p.Id,tableId:p.TableId,tableName:t,fieldName:p.Name,fieldLabel:p.Label||"",v8Key:y,updateTime:p.UpdateTime,filePath:P.relative(i.getWorkspaceRoot(),w)},d++}}this.saveMeta(a,r),F.info(`Microi: \u5DF2\u62C9\u53D6 ${t} \u7684 ${d} \u4E2A\u5B57\u6BB5V8\u4E8B\u4EF6\u6587\u4EF6${u>0?`\uFF08\u8DF3\u8FC7 ${u} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)}async pullFieldsForProfile(e){let t=N.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6 [${e.label||r}]...`),await we.withProgress({location:ct.Notification,title:`Microi: \u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6 [${e.label||r}]`,cancellable:!1},async o=>{o.report({message:"\u83B7\u53D6\u8868\u5217\u8868..."});let a=await n.get(z.GET_DB_SCHEMA,{osClient:i},r,e);if(a.Code!==1)throw new Error(`\u83B7\u53D6\u8868\u5217\u8868\u5931\u8D25: ${a.Msg||"Code="+a.Code}`);let c=a.Data.Tables||[],g=await be.getInstance().getSysConfig(r,i),d=g?.SysShortTitle||"",u=g?.SysTitle||"",p=d||u||e.label||"",m=t.buildServerDirName(p,r),f=this.loadMeta(m);f.fields||(f.fields={});let C=t.getProfiles().find(V=>V.apiBaseUrl===e.apiBaseUrl&&V.osClient===e.osClient)||e;if(!C.osClientType||!C.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let h=t.buildOsClientDirName(i,C.osClientType,C.osClientNetwork),S=t.getSyncRootDir(),w=["V8Code","KeyupV8Code","V8TmpEngineTable","V8TmpEngineForm"],v=0,b=0,_=0,E=new Set,O=new Set;for(let V of c){_++,o.report({message:`[${_}/${c.length}] ${V.Name}`});let R=await n.get(z.GET_FIELD_LIST,{osClient:i,tableId:V.Id},r,e);if(R.Code!==1){O.add(V.Name.toLowerCase()),this.log(` \u8DF3\u8FC7\u8868 ${V.Name}: ${R.Msg}`);continue}let L=R.Data.List||[],T=Z(V.Description?`${V.Description}\uFF08${V.Name}\uFF09`:V.Name);for(let I of L)for(let x of w){let Y=(I[x]||"").toString();if(!Y.trim()){b++;continue}let Q=Z(I.Label?`${I.Label}\uFF08${I.Name}\uFF09`:I.Name),me=Xn[x]||x,G=Z(`${me}\uFF08${x}\uFF09`)+".js",ne=P.join(S,m,h,je,T,Mt,Q);Se(ne);let le=P.join(ne,G);k.writeFileSync(le,Y,"utf-8");let se=new Date(I.UpdateTime);isNaN(se.getTime())||k.utimesSync(le,se,se);let M=`${V.Name}__${I.Name}__${x}`;E.add(M),f.fields[M]={fieldId:I.Id,tableId:I.TableId,tableName:V.Name,fieldName:I.Name,fieldLabel:I.Label||"",v8Key:x,updateTime:I.UpdateTime,filePath:P.relative(t.getWorkspaceRoot(),le)},v++}}for(let[V,R]of Object.entries(f.fields)){if(E.has(V)||O.has(R.tableName.toLowerCase()))continue;let L=this.getWorkspaceFilePath(R.filePath);L&&this.backupAndDeleteSyncFile(L,m,"remote-deleted-field-event"),delete f.fields[V]}this.saveMeta(f,m),this.log(`\u5B57\u6BB5V8\u4E8B\u4EF6\u62C9\u53D6\u5B8C\u6210: ${v} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${b} \u9879`),F.info(`Microi: \u6210\u529F\u62C9\u53D6 ${v} \u4E2A\u5B57\u6BB5V8\u4E8B\u4EF6${b>0?`\uFF08\u8DF3\u8FC7 ${b} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)})}async pushFieldFile(e,t,n){let r=j.getInstance(),i=Oe(k.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u5B57\u6BB5V8\u4E8B\u4EF6: ${t.tableName}/${t.fieldName}/${t.v8Key}...`);try{let o=await r.post(z.UPDATE_FIELD,{OsClient:t.osClient,TableName:t.tableName,Name:t.fieldName,[t.v8Key]:i},void 0,n?.apiBaseUrl,n);if(o.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.tableName}/${t.fieldName}/${t.v8Key}`);let a=this.loadMeta(t.serverDir),c=`${t.tableName}__${t.fieldName}__${t.v8Key}`;a.fields||(a.fields={});let l=o.Data?.UpdateTime||Te();return i.trim()?a.fields[c]={fieldId:a.fields[c]?.fieldId||"",tableId:a.fields[c]?.tableId||"",tableName:t.tableName,fieldName:t.fieldName,fieldLabel:a.fields[c]?.fieldLabel||"",v8Key:t.v8Key,updateTime:l,filePath:P.relative(N.getInstance().getWorkspaceRoot(),e)}:delete a.fields[c],this.saveMeta(a,t.serverDir),i.trim()?this.touchSyncedFile(e,l):k.existsSync(e)&&k.unlinkSync(e),!0}return this.log(`\u63A8\u9001\u5931\u8D25: ${o.Msg}`),F.error(`Microi: \u63A8\u9001\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 - ${o.Msg}`),!1}catch(o){let a=o instanceof Error?o.message:String(o);return this.log(`\u63A8\u9001\u5F02\u5E38: ${a}`),F.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${a}`),!1}}async pullMenuButtons(e){if(!e){let t=N.getInstance().getProfiles();for(let n of t)try{await this.pullMenuButtonsForProfile(n)}catch(r){this.log(`\u62C9\u53D6\u83DC\u5355\u6309\u94AE\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${r instanceof Error?r.message:String(r)}`)}return}await this.pullMenuButtonsForProfile(e)}async pullMenuButtonsForModuleFolder(e){let n=N.getInstance().getSyncRootDir(),r=P.relative(n,e).split(P.sep);if(r.length<4||r[2]!==qe){F.warn("Microi: \u8BF7\u5728\u201C\u6A21\u5757\u5F15\u64CE\u201D\u4E0B\u7684\u6A21\u5757\u76EE\u5F55\u6267\u884C\u62C9\u53D6");return}let i=this.findProfileByServerDir(r[0]);if(!i){F.error(`Microi: \u672A\u627E\u5230\u4E0E\u76EE\u5F55 "${r[0]}" \u5339\u914D\u7684\u670D\u52A1\u5668\u8FDE\u63A5`);return}let o=this.extractTrailingKey(P.basename(e));await this.pullMenuButtonsForProfile(i,o,r[0],r[1],e)}async pullMenuButtonsForProfile(e,t,n,r,i){let o=N.getInstance(),a=j.getInstance(),c=e.apiBaseUrl,l=e.osClient;this.log(`\u5F00\u59CB\u62C9\u53D6\u6A21\u5757 Join/Where \u4E0E\u6309\u94AE V8 \u4EE3\u7801 [${e.label||c}]...`),await we.withProgress({location:ct.Notification,title:`Microi: \u62C9\u53D6\u6A21\u5757\u4EE3\u7801 [${e.label||c}]`,cancellable:!1},async g=>{let d=await a.get(z.LIST_MODULES,{osClient:l},c,e);if(d.Code!==1)throw new Error(`\u83B7\u53D6\u6A21\u5757\u5217\u8868\u5931\u8D25: ${d.Msg}`);let u=d.Data.List||[],m=await be.getInstance().getSysConfig(c,l),f=m?.SysShortTitle||"",y=m?.SysTitle||"",C=f||y||e.label||"",h=n||o.buildServerDirName(C,c),S=this.loadMeta(h);S.menus||(S.menus={}),S.menuButtons||(S.menuButtons={}),S.menuScripts||(S.menuScripts={});let v=o.getProfiles().find(M=>M.apiBaseUrl===e.apiBaseUrl&&M.osClient===e.osClient)||e;if(!v.osClientType||!v.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let b=r||o.buildOsClientDirName(l,v.osClientType,v.osClientNetwork),_=o.getSyncRootDir(),E=P.join(_,h,b,qe),O=Object.keys(pt),V=Object.keys(At),R=0,L=0,T=0,I=0,x=0,Y=new Map(u.map(M=>[M.Id,M])),Q=new Map,me=M=>M||"";for(let M of u){let ie=me(M.ParentId);Q.has(ie)||Q.set(ie,[]),Q.get(ie).push(M)}let G=M=>M.sort((ie,re)=>{let fe=typeof ie.Sort=="number"?ie.Sort:0,De=typeof re.Sort=="number"?re.Sort:0;return fe!==De?fe-De:String(ie.Name||ie.Label||"").localeCompare(String(re.Name||re.Label||""))}),ne=t?Y.get(t)?[Y.get(t)]:[]:G(u.filter(M=>!M.ParentId||!Y.has(M.ParentId)));if(t&&ne.length===0)throw new Error(`\u627E\u4E0D\u5230\u6A21\u5757 Id=${t}`);let le=t?i||P.join(E,Z(`${ne[0].Label||ne[0].Name||ne[0].Id}\uFF08${ne[0].Id}\uFF09`)):E;if(this.backupExistingTree(le,h,t?"module-subtree":"module-engine"),!t)S.menus={},S.menuButtons={},S.menuScripts={};else{let M=new Set,ie=re=>{if(!M.has(re)){M.add(re);for(let fe of Q.get(re)||[])ie(fe.Id)}};ie(t);for(let re of M)delete S.menus[re];for(let[re,fe]of Object.entries(S.menuButtons))M.has(fe.moduleId)&&delete S.menuButtons[re];for(let[re,fe]of Object.entries(S.menuScripts))M.has(fe.moduleId)&&delete S.menuScripts[re]}let se=async(M,ie)=>{I++,g.report({message:`[${I}/${u.length}] ${M.Name||M.Label}`});let re=M.Label||M.Name||M.Id,fe=P.join(ie,Z(`${re}\uFF08${M.Id}\uFF09`));Se(fe);let De=G(Q.get(M.Id)||[]);if(De.length>0){for(let he of De)await se(he,fe);return}let Dt=await a.get(z.GET_MODULE,{osClient:l,moduleId:M.Id},c,e);if(Dt.Code!==1){this.log(` \u8DF3\u8FC7\u6A21\u5757 ${M.Name}: ${Dt.Msg}`);return}let zn=Dt.Data,ze=String(zn.UpdateTime||Te()),Kr={};for(let he of V){let an=String(zn[he]||""),Jn=At[he]||he,Je=P.join(fe,Z(`${Jn}\uFF08${he}\uFF09`)+".js");k.writeFileSync(Je,an,"utf-8"),this.touchSyncedFile(Je,ze),S.menuScripts[this.getMenuScriptMetaKey(M.Id,he)]={moduleId:M.Id,moduleName:re,scriptField:he,codeHash:this.sourceHash(an),updateTime:ze,filePath:P.relative(o.getWorkspaceRoot(),Je)},T++}for(let he of O){let an=pt[he]||he,Jn=Z(`${an}\uFF08${he}\uFF09`),Je=P.join(fe,Jn);Se(Je),L++;let cn=zn[he],it=[];if(cn)try{it=typeof cn=="string"?JSON.parse(cn):cn,Array.isArray(it)||(it=[])}catch{this.log(` \u6309\u94AE JSON \u89E3\u6790\u5931\u8D25 ${M.Name}.${he}`),it=[]}let Vi=[...it].sort((ot,Re)=>String(ot.Id||"").localeCompare(String(Re.Id||"")));Kr[he]=require("crypto").createHash("sha1").update(JSON.stringify(Vi)).digest("hex");for(let ot of it){let Re=String(ot.Id||""),ln=String(ot.Name||Re||"Unknown");if(!Re)continue;let Hr=String(ot.V8Code||""),qn=P.join(Je,Z(`${ln}\uFF08${Re}\uFF09`)+".js");S.menuButtons[this.getMenuButtonMetaKey(M.Id,he,Re,"V8Code")]={moduleId:M.Id,moduleName:re,btnField:he,btnId:Re,btnName:ln,v8SubField:"V8Code",updateTime:ze,filePath:P.relative(o.getWorkspaceRoot(),qn)},Hr.trim()?(k.writeFileSync(qn,Hr,"utf-8"),this.touchSyncedFile(qn,ze),R++):x++;let Wr=String(ot.V8CodeShow||"");if(Wr.trim()){let Yn=P.join(Je,Z(`${ln}_\u663E\u9690\u5224\u65AD\uFF08${Re}\uFF09`)+".js");k.writeFileSync(Yn,Wr,"utf-8"),this.touchSyncedFile(Yn,ze),S.menuButtons[this.getMenuButtonMetaKey(M.Id,he,Re,"V8CodeShow")]={moduleId:M.Id,moduleName:re,btnField:he,btnId:Re,btnName:ln,v8SubField:"V8CodeShow",updateTime:ze,filePath:P.relative(o.getWorkspaceRoot(),Yn)},R++}else x++}}S.menus[M.Id]={moduleId:M.Id,moduleName:re,updateTime:ze,buttonHashes:Kr}};Se(E);for(let M of ne)await se(M,E);this.saveMeta(S,h),this.log(`\u6A21\u5757\u4EE3\u7801\u62C9\u53D6\u5B8C\u6210: ${R} \u4E2A\u6309\u94AEV8\u6587\u4EF6\uFF0C${T} \u4E2A Join/Where \u6587\u4EF6\uFF0C${L} \u4E2A\u6309\u94AE\u76EE\u5F55\uFF0C\u8DF3\u8FC7\u7A7A\u6309\u94AE\u4EE3\u7801 ${x} \u9879`),F.info(`Microi: \u6210\u529F\u62C9\u53D6 ${R} \u4E2A\u6309\u94AEV8\u6587\u4EF6\u548C ${T} \u4E2A Join/Where \u6587\u4EF6${x>0?`\uFF08\u8DF3\u8FC7 ${x} \u4E2A\u7A7A\u6309\u94AE\u4EE3\u7801\uFF09`:""}\uFF0C\u5DF2\u751F\u6210 ${L} \u4E2A\u6309\u94AE\u76EE\u5F55`)})}backupExistingTree(e,t,n){if(!k.existsSync(e))return;let i=N.getInstance().getSyncRootDir();this.ensureSyncGitExcludes(i);let o=P.join(i,".backups",n,this.shortBackupKey(t));Se(o);let a=P.join(o,`${Date.now()}-${this.shortBackupKey(P.basename(e))}`);k.renameSync(e,a)}backupAndDeleteSyncFile(e,t,n){if(!k.existsSync(e))return;let r=N.getInstance(),i=r.getSyncRootDir();this.ensureSyncGitExcludes(i);let o=r.getWorkspaceRoot()||i,c=P.relative(o,e).split(P.sep).filter(d=>d&&d!=="..").map(Z),l=P.join(i,".backups",n,this.shortBackupKey(t),String(Date.now())),g=P.join(l,...c.length?c:[Z(P.basename(e))]);Se(P.dirname(g)),k.copyFileSync(e,g),k.unlinkSync(e)}async pushMenuScriptFile(e,t,n){let r=j.getInstance(),i=Oe(k.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u6A21\u5757\u811A\u672C: ${t.moduleId}.${t.scriptField}...`);try{let o=await r.get(z.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n);if(o.Code!==1||!o.Data)return F.error(`Microi: \u63A8\u9001\u5931\u8D25 - \u62C9\u53D6\u6A21\u5757\u5931\u8D25 ${o.Msg}`),!1;let a=o.Data,c=String(a[t.scriptField]||""),l=N.getInstance(),g=l.getSyncRootDir();this.ensureSyncGitExcludes(g);let d=P.join(g,".backups","menu-script",this.shortBackupKey(t.serverDir),t.moduleId);Se(d),k.writeFileSync(P.join(d,`${t.scriptField}-${Date.now()}.js`),c,"utf-8");let u={OsClient:t.osClient,ModuleId:t.moduleId,[t.scriptField]:i},p=await r.post(z.UPDATE_MODULE,u,void 0,n?.apiBaseUrl,n);if(p.Code!==1)return F.error(`Microi: \u63A8\u9001\u6A21\u5757 ${t.scriptField} \u5931\u8D25 - ${p.Msg}`),!1;let m=await r.get(z.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n),f=m.Data;if(m.Code!==1||!f||this.normalizeCode(String(f[t.scriptField]||""))!==this.normalizeCode(i))return F.error(`Microi: ${t.scriptField} \u63A5\u53E3\u8FD4\u56DE\u6210\u529F\uFF0C\u4F46\u8FDC\u7AEF\u56DE\u8BFB\u4E0D\u4E00\u81F4\uFF1B\u5DF2\u4FDD\u7559\u672C\u5730\u4FEE\u6539\u548C\u8FDC\u7AEF\u5907\u4EFD`),!1;let y=String(f.UpdateTime||p.Data?.UpdateTime||Te()),C=this.loadMeta(t.serverDir);return C.menuScripts||(C.menuScripts={}),C.menuScripts[this.getMenuScriptMetaKey(t.moduleId,t.scriptField)]={moduleId:t.moduleId,moduleName:String(f.Label||f.Name||a.Label||a.Name||t.moduleId),scriptField:t.scriptField,codeHash:this.sourceHash(i),updateTime:y,filePath:P.relative(l.getWorkspaceRoot(),e)},C.menus||(C.menus={}),C.menus[t.moduleId]={moduleId:t.moduleId,moduleName:String(f.Label||f.Name||a.Label||a.Name||t.moduleId),updateTime:y,buttonHashes:C.menus[t.moduleId]?.buttonHashes||{}},this.saveMeta(C,t.serverDir),this.touchSyncedFile(e,y),this.log(`\u63A8\u9001\u5E76\u56DE\u8BFB\u6210\u529F: ${t.moduleId}.${t.scriptField}`),!0}catch(o){let a=o instanceof Error?o.message:String(o);return this.log(`\u63A8\u9001\u6A21\u5757\u811A\u672C\u5F02\u5E38: ${a}`),F.error(`Microi: \u63A8\u9001\u6A21\u5757\u811A\u672C\u5F02\u5E38 - ${a}`),!1}}async pushMenuButtonFile(e,t,n){let r=j.getInstance(),i=Oe(k.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u6309\u94AEV8\u4EE3\u7801: ${t.moduleId}.${t.btnField}.${t.btnId}.${t.v8SubField}...`);try{let o=await r.get(z.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n);if(o.Code!==1)return F.error(`Microi: \u63A8\u9001\u5931\u8D25 - \u62C9\u53D6\u6A21\u5757\u5931\u8D25 ${o.Msg}`),!1;let a=o.Data,c=[],l=a[t.btnField];if(l)try{c=typeof l=="string"?JSON.parse(l):l,Array.isArray(c)||(c=[])}catch{return F.error("Microi: \u63A8\u9001\u5931\u8D25 - \u6309\u94AE JSON \u89E3\u6790\u5931\u8D25"),!1}let d=N.getInstance().getSyncRootDir();this.ensureSyncGitExcludes(d);let u=P.join(d,".backups","menu-button-json",this.shortBackupKey(t.serverDir),t.moduleId);Se(u);let p=P.join(u,`${t.btnField}-${Date.now()}.json`);k.writeFileSync(p,JSON.stringify(c,null,2),"utf-8");let m=c.find(C=>String(C.Id||"")===t.btnId);if(!m){let C=c.map(h=>Number(h.Sort||0)).filter(h=>!isNaN(h));m={Id:t.btnId,Name:t.btnName||t.btnId,Sort:C.length>0?Math.max(...C)+1:c.length+1,IsVisible:!0,ShowRow:t.btnField==="MoreBtns"},c.push(m)}m[t.v8SubField]=i;let f={OsClient:t.osClient,ModuleId:t.moduleId};f[t.btnField]=JSON.stringify(c);let y=await r.post(z.UPDATE_MODULE,f,void 0,n?.apiBaseUrl,n);if(y.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.moduleId}.${t.btnField}.${t.btnId}.${t.v8SubField}`);let C=y.Data?.UpdateTime||Te(),h=this.loadMeta(t.serverDir);h.menuButtons||(h.menuButtons={});let S=this.getMenuButtonMetaKey(t.moduleId,t.btnField,t.btnId,t.v8SubField);return i.trim()?h.menuButtons[S]={moduleId:t.moduleId,moduleName:String(a.Name||a.Label||t.moduleId),btnField:t.btnField,btnId:t.btnId,btnName:String(m.Name||t.btnName||t.btnId),v8SubField:t.v8SubField,updateTime:C,filePath:P.relative(N.getInstance().getWorkspaceRoot(),e)}:delete h.menuButtons[S],h.menus||(h.menus={}),h.menus[t.moduleId]={moduleId:t.moduleId,moduleName:String(a.Name||a.Label||t.moduleId),updateTime:C,buttonHashes:h.menus[t.moduleId]?.buttonHashes||{}},this.saveMeta(h,t.serverDir),i.trim()?this.touchSyncedFile(e,C):k.existsSync(e)&&k.unlinkSync(e),!0}return F.error(`Microi: \u63A8\u9001\u6309\u94AE\u5931\u8D25 - ${y.Msg}`),!1}catch(o){let a=o instanceof Error?o.message:String(o);return this.log(`\u63A8\u9001\u5F02\u5E38: ${a}`),F.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${a}`),!1}}async pushWorkflowNodeFile(e,t,n){let r=j.getInstance(),i=k.readFileSync(e,"utf-8"),o=Oe(i);this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8: ${t.flowDesignId}/${t.nodeId}/${t.eventType}...`);try{let a="",c="";try{let p=await r.post(z.GET_WORKFLOW_V8_EVENT_CODE,{OsClient:t.osClient,FlowDesignId:t.flowDesignId,NodeId:t.nodeId,EventType:t.eventType},void 0,n?.apiBaseUrl,n);p.Code===1&&p.Data&&(a=p.Data.V8Code||p.Data.Code||"",c=p.Data.Version||"")}catch{a="",c=""}let l=!o.trim(),g=l?{code:"",version:c,changeHistory:""}:Jt({kind:"Workflow",key:`${t.flowDesignId}/${t.nodeId}`,eventType:t.eventType,currentCode:o,remoteCode:a,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001\u6D41\u7A0B\u8282\u70B9 V8 ${t.flowDesignId}/${t.nodeId}/${t.eventType}`}),d={OsClient:t.osClient,FlowDesignId:t.flowDesignId,NodeId:t.nodeId,EventType:t.eventType};l?d.V8Code="":(d.V8CodeBase64=Buffer.from(g.code,"utf8").toString("base64"),d.Version=g.version,d.ChangeHistory=g.changeHistory);let u=await r.post(z.UPDATE_WORKFLOW_V8_EVENT_CODE,d,void 0,n?.apiBaseUrl,n);if(u.Code===1){let p=u.Data?.UpdateTime||Te(),m=this.loadMeta(t.serverDir);m.workflowNodeEvents||(m.workflowNodeEvents={});let f=`${t.flowDesignId}__${t.nodeId}__${t.eventType}`;return l?delete m.workflowNodeEvents[f]:m.workflowNodeEvents[f]={flowDesignId:t.flowDesignId,flowName:m.workflowNodeEvents[f]?.flowName||t.flowDesignId,nodeId:t.nodeId,nodeName:m.workflowNodeEvents[f]?.nodeName||t.nodeId,eventType:t.eventType,updateTime:p,filePath:P.relative(N.getInstance().getWorkspaceRoot(),e)},this.saveMeta(m,t.serverDir),l?k.existsSync(e)&&k.unlinkSync(e):(k.writeFileSync(e,g.code,"utf-8"),this.touchSyncedFile(e,p)),this.log(`\u63A8\u9001\u6210\u529F: ${t.flowDesignId}/${t.nodeId}/${t.eventType}`),!0}return this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5931\u8D25: ${u.Msg}`),F.error(`Microi: \u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5931\u8D25 - ${u.Msg}`),!1}catch(a){let c=a instanceof Error?a.message:String(a);return this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5F02\u5E38: ${c}`),F.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async pullDbSchema(e){let t=N.getInstance(),n=j.getInstance();if(!e){let r=t.getProfiles();if(r.length===0){F.warn("Microi: \u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u670D\u52A1\u5668");return}for(let i of r)try{await this.pullDbSchemaForProfile(i)}catch(o){let a=o instanceof Error?o.message:String(o);this.log(`\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5931\u8D25 [${i.label||i.apiBaseUrl}]: ${a}`)}return}await this.pullDbSchemaForProfile(e)}async pullDbSchemaForProfile(e){let t=N.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784 [${e.label||r}]...`);let o=await n.get(z.GET_DB_SCHEMA,{osClient:i},r,e);if(o.Code!==1){let _=o.Code===1001||o.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5931\u8D25: ${o.Msg||"Code="+o.Code}${_}`)}let a=t.getSyncRootDir(),l=await be.getInstance().getSysConfig(r,i),g=l?.SysShortTitle||"",d=l?.SysTitle||"",u=g||d||l?.CompanyName||e.label||"";u&&(u!==e.label||g!==e.sysShortTitle||d!==e.sysTitle)&&await t.addProfile({...e,label:u,sysShortTitle:g,sysTitle:d});let p=t.buildServerDirName(u,r),f=t.getProfiles().find(_=>_.apiBaseUrl===e.apiBaseUrl&&_.osClient===e.osClient)||e,y=t.buildOsClientDirName(i,f.osClientType,f.osClientNetwork),C=P.join(a,p,y);Se(C);let h=P.join(C,mt);k.writeFileSync(h,JSON.stringify(o.Data,null,2),"utf-8");let S=P.join(C,Ye),w=this.formatDbSchemaMarkdown(o.Data,p,y);w&&k.writeFileSync(S,w,"utf-8");let v=o.Data.Tables?.length||0,b=u||e.label||r;this.log(`[${b}] \u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5B8C\u6210: ${v} \u5F20\u8868`),F.info(`Microi: [${b}] \u6210\u529F\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\uFF08${v} \u5F20\u8868\uFF09`)}formatDbSchemaMarkdown(e,t,n){let r=(e.Tables||[]).filter(c=>c.Name);if(!r.length)return"";let i=r.reduce((c,l)=>{let g=l._Fields||l.Fields||[];return c+g.length},0),o=e.Menus?.length||0,a=[];a.push(`# \u6570\u636E\u5E93\u7ED3\u6784 \u2014 ${t}/${n}
|
|
49
|
-
`),a.push("> \u6B64\u6587\u4EF6\u7531 Microi\u543E\u7801 VS Code \u63D2\u4EF6\u81EA\u52A8\u751F\u6210\uFF0C\u4F9B AI \u7F16\u5199 V8.FormEngine / V8.Db \u4EE3\u7801\u65F6\u53C2\u8003\u3002"),a.push(`> \u5171 ${r.length} \u5F20\u8868\uFF0C${
|
|
46
|
+
`:""}${Fo(s,o,a)}${c.replace(/^\s+/,"")}`,d=(s.changeSummary||"\u540C\u6B65 V8 \u4EE3\u7801").trim();return{code:g,version:o,changeHistory:`${o} ${d}`}}var _t=class s{static getInstance(){return s._instance||(s._instance=new s),s._instance}constructor(){}get outputChannel(){return Se.channel}log(e){Se.log("\u540C\u6B65",e)}loadMeta(e){let t=N.getInstance(),n="";try{n=t.getSyncRootDir()}catch{}if(!n)return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};let r=P.join(n,e,ft);if(!E.existsSync(r))return this.migrateFromFlatMeta(e);try{let o=JSON.parse(E.readFileSync(r,"utf-8"));if(!o||typeof o!="object"||Array.isArray(o))throw new Error("\u9876\u5C42\u5FC5\u987B\u662F JSON \u5BF9\u8C61");let i=o;return{...i,engines:i.engines||{},events:i.events||{},fields:i.fields||{},menus:i.menus||{},menuButtons:i.menuButtons||{},menuScripts:i.menuScripts||{},workflows:i.workflows||{},workflowNodeEvents:i.workflowNodeEvents||{}}}catch(o){throw new Error(`Microi \u540C\u6B65\u5143\u6570\u636E\u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u5E76\u505C\u6B62\u5199\u5165\uFF1A${r}\uFF08${o instanceof Error?o.message:String(o)}\uFF09`)}}saveMeta(e,t){let n=N.getInstance();try{let r=n.getSyncRootDir();this.ensureSyncGitExcludes(r);let o=P.join(r,t);Ce(o);let i=P.join(o,ft),a=`${i}.${process.pid}.${Date.now()}.tmp`;try{E.writeFileSync(a,`${JSON.stringify(e,null,2)}
|
|
47
|
+
`,"utf-8"),E.renameSync(a,i)}finally{try{E.existsSync(a)&&E.unlinkSync(a)}catch{}}}catch{}}getWorkspaceFilePath(e){let t=N.getInstance().getWorkspaceRoot();return t?P.isAbsolute(e)?e:P.join(t,e):null}normalizeCode(e){return Ue(yr(e||"")).replace(/\r\n/g,`
|
|
48
|
+
`).trimEnd()}isLocalModified(e,t){try{if(!E.existsSync(e))return!1;let n=E.statSync(e),r=new Date(t);return isNaN(r.getTime())?!1:n.mtime.getTime()>r.getTime()+1e3}catch{return!1}}getLocalModifiedTime(e,t){try{if(!E.existsSync(e))return null;let n=E.statSync(e),r=new Date(t);return isNaN(r.getTime())?null:n.mtime.getTime()>r.getTime()+1e3?Pe(n.mtime):null}catch{return null}}touchSyncedFile(e,t){let n=new Date(t),r=isNaN(n.getTime())?new Date:n;try{E.utimesSync(e,r,r)}catch{}}ensureSyncGitExcludes(e){try{let t=e||N.getInstance().getSyncRootDir();wt(t),Je(t,[".backups/","**/.backups/",".microi-mcp-tokens.json","**/.microi-mcp-tokens.json"])}catch{}}shortBackupKey(e){return require("crypto").createHash("sha1").update(e||"").digest("hex").slice(0,10)}getMenuButtonMetaKey(e,t,n,r){return`${e}__${t}__${n}__${r}`}getMenuScriptMetaKey(e,t){return`${e}__${t}`}sourceHash(e){return require("crypto").createHash("sha256").update(this.normalizeCode(e||"")).digest("hex")}extractTrailingKey(e){let t=e.match(/[((]([^))]+)[))]\s*$/);return t?t[1]:e}getServerDirs(){try{let e=N.getInstance().getSyncRootDir();return E.existsSync(e)?E.readdirSync(e,{withFileTypes:!0}).filter(t=>t.isDirectory()).filter(t=>!t.name.startsWith(".")).map(t=>t.name):[]}catch{return[]}}getLocalChangeSummary(){let e={engines:0,events:0,fields:0,menuButtons:0,menuScripts:0,workflowNodeEvents:0,total:0};for(let t of this.getLocalChangeItems())t.kind==="engine"?e.engines+=1:t.kind==="event"?e.events+=1:t.kind==="field"?e.fields+=1:t.kind==="menuButton"?e.menuButtons+=1:t.kind==="menuScript"?e.menuScripts+=1:t.kind==="workflow"&&(e.workflowNodeEvents+=1);return e.total=e.engines+e.events+e.fields+e.menuButtons+e.menuScripts+e.workflowNodeEvents,e}getLocalChangeItems(){let e=[],t=(n,r,o,i,a)=>{let c=this.getWorkspaceFilePath(a.filePath);if(!c)return;let l=this.getLocalModifiedTime(c,a.updateTime);l&&e.push({kind:r,key:o,name:i,serverDir:n,filePath:c,updateTime:a.updateTime,modifiedTime:l})};for(let n of this.getServerDirs()){let r=this.loadMeta(n);for(let[o,i]of Object.entries(r.engines))t(n,"engine",o,i.apiName||o,i);for(let[o,i]of Object.entries(r.events))t(n,"event",o,`${i.description||i.formEngineKey}/${i.eventType}`,i);for(let[o,i]of Object.entries(r.fields||{}))t(n,"field",o,`${i.tableName}.${i.fieldName}/${i.v8Key}`,i);for(let[o,i]of Object.entries(r.menuButtons||{}))t(n,"menuButton",o,`${i.moduleName}/${i.btnName}/${i.v8SubField}`,i);for(let[o,i]of Object.entries(r.menuScripts||{}))t(n,"menuScript",o,`${i.moduleName}/${i.scriptField}`,i);for(let[o,i]of Object.entries(r.workflowNodeEvents||{}))t(n,"workflow",o,`${i.flowName}/${i.nodeName}/${i.eventType}`,i)}return e}async checkRemoteDifferences(e,t="all",n){let r=e?[e]:N.getInstance().getProfiles(),o=[];for(let i of r){let a=N.getInstance().buildServerDirName(i.label,i.apiBaseUrl),c=this.loadMeta(a),l=n?this.getTargetSyncKind(c,n):null;if(n&&!l)throw new Error(`\u540C\u6B65\u76EE\u6807\u4E0D\u5728\u672C\u5730\u57FA\u7EBF\u4E2D: ${n}`);(t==="all"||t==="api")&&(!n||l==="engine")&&await this.collectEngineDifferences(i,a,c,o,n),(t==="all"||t==="form")&&(!n||l==="event")&&await this.collectEventDifferences(i,a,c,o,n),(t==="all"||t==="form")&&(!n||l==="field")&&await this.collectFieldDifferences(i,a,c,o,n),(t==="all"||t==="module")&&(!n||l==="menuButton")&&await this.collectMenuButtonDifferences(i,a,c,o,n),(t==="all"||t==="module")&&(!n||l==="menuScript")&&await this.collectMenuScriptDifferences(i,a,c,o,n),(t==="all"||t==="workflow")&&(!n||l==="workflow")&&await this.collectWorkflowDifferences(i,a,c,o,n)}return o}matchesTargetFile(e,t){if(!t)return!0;let n=this.getWorkspaceFilePath(e);return!!n&&P.resolve(n).toLowerCase()===P.resolve(t).toLowerCase()}getTargetSyncKind(e,t){let n=[["engine",e.engines],["event",e.events],["field",e.fields||{}],["menuButton",e.menuButtons||{}],["menuScript",e.menuScripts||{}],["workflow",e.workflowNodeEvents||{}]];for(let[r,o]of n)if(Object.values(o).some(i=>this.matchesTargetFile(i.filePath,t)))return r;return null}classifyDifference(e,t,n,r){return n===r?null:e&&t?"conflict":e?"localModified":"remoteModified"}classifyRemoteDeletion(e,t){return this.isLocalModified(e,t)?"conflict":"remoteDeleted"}createRemoteDeletedItem(e,t,n,r,o,i){return!o||!E.existsSync(o)?null:{kind:e,status:this.classifyRemoteDeletion(o,i),name:t,key:n,serverDir:r,filePath:o,localCode:this.normalizeCode(E.readFileSync(o,"utf-8")),remoteCode:"",localUpdateTime:i,remoteUpdateTime:""}}isRemoteNewer(e,t){let n=new Date(e||"").getTime(),r=new Date(t||"").getTime();return isNaN(n)||isNaN(r)?!1:n>r+1e3}getRemoteOnlyPlaceholderPath(e,t,n,r){let o=N.getInstance(),i=n==="api"?mt:n==="form"?ze:n==="module"?tt:ht;return P.join(o.getSyncRootDir(),t,o.buildOsClientDirName(e.osClient,e.osClientType,e.osClientNetwork),i,"\u670D\u52A1\u5668\u65B0\u589E\u5F85\u62C9\u53D6",`${ee(r)}.js`)}async collectEngineDifferences(e,t,n,r,o){let a=await j.getInstance().get(z.GET_ENGINE_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(a.Code!==1||!Array.isArray(a.Data?.List))throw new Error(`\u83B7\u53D6\u63A5\u53E3\u5F15\u64CE\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${a.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map(a.Data.List.map(d=>[d.ApiEngineKey,d])),l=!1;for(let[d,u]of Object.entries(n.engines)){if(!this.matchesTargetFile(u.filePath,o))continue;let p=c.get(d),f=this.getWorkspaceFilePath(u.filePath);if(!f||!E.existsSync(f))continue;if(!p){let w=this.createRemoteDeletedItem("engine",u.apiName||d,d,t,f,u.updateTime);w&&r.push(w);continue}let m=this.normalizeCode(E.readFileSync(f,"utf-8")),S=this.normalizeCode(p.ApiV8Code||""),C=this.isLocalModified(f,u.updateTime),h=this.isRemoteNewer(p.UpdateTime,u.updateTime);if(m===S){(C||h)&&p.UpdateTime&&(u.updateTime=p.UpdateTime,this.touchSyncedFile(f,p.UpdateTime),l=!0);continue}let y=this.classifyDifference(C,h,m,S);y&&r.push({kind:"engine",status:y,name:p.ApiName||u.apiName||d,key:d,serverDir:t,filePath:f,localCode:m,remoteCode:S,localUpdateTime:u.updateTime,remoteUpdateTime:p.UpdateTime})}if(l&&this.saveMeta(n,t),o)return;let g=new Set(Object.keys(n.engines).map(d=>d.toLowerCase()));for(let d of a.Data.List)!String(d.ApiV8Code||"").trim()||g.has(d.ApiEngineKey.toLowerCase())||r.push({kind:"engine",status:"remoteModified",name:d.ApiName||d.ApiEngineKey,key:d.ApiEngineKey,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"api",d.ApiEngineKey),localCode:"",remoteCode:this.normalizeCode(d.ApiV8Code||""),localUpdateTime:"",remoteUpdateTime:d.UpdateTime})}async collectEventDifferences(e,t,n,r,o){let a=await j.getInstance().get(z.GET_EVENT_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(a.Code!==1||!Array.isArray(a.Data?.List))throw new Error(`\u83B7\u53D6\u8868\u5355\u4E8B\u4EF6\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${a.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map;for(let d of a.Data.List){let u=`${d.FormEngineKey}__${d.EventType}`;c.set(u,d),c.set(u.toLowerCase(),d)}let l=!1;for(let[d,u]of Object.entries(n.events)){if(!this.matchesTargetFile(u.filePath,o))continue;let p=c.get(d)||c.get(d.toLowerCase()),f=this.getWorkspaceFilePath(u.filePath);if(!f||!E.existsSync(f))continue;if(!p){let w=this.createRemoteDeletedItem("event",`${u.description||u.formEngineKey}/${u.eventType}`,d,t,f,u.updateTime);w&&r.push(w);continue}let m=this.normalizeCode(E.readFileSync(f,"utf-8")),S=this.normalizeCode(p.V8Code||""),C=this.isLocalModified(f,u.updateTime),h=this.isRemoteNewer(p.UpdateTime,u.updateTime);if(m===S){(C||h)&&p.UpdateTime&&(u.updateTime=p.UpdateTime,this.touchSyncedFile(f,p.UpdateTime),l=!0);continue}let y=this.classifyDifference(C,h,m,S);y&&r.push({kind:"event",status:y,name:`${p.Description||u.formEngineKey}/${u.eventType}`,key:d,serverDir:t,filePath:f,localCode:m,remoteCode:S,localUpdateTime:u.updateTime,remoteUpdateTime:p.UpdateTime})}if(l&&this.saveMeta(n,t),o)return;let g=new Set(Object.keys(n.events).map(d=>d.toLowerCase()));for(let d of a.Data.List){let u=`${d.FormEngineKey}__${d.EventType}`;!String(d.V8Code||"").trim()||g.has(u.toLowerCase())||r.push({kind:"event",status:"remoteModified",name:`${d.Description||d.FormEngineKey}/${d.EventType}`,key:u,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"form",u),localCode:"",remoteCode:this.normalizeCode(d.V8Code||""),localUpdateTime:"",remoteUpdateTime:d.UpdateTime})}}async collectFieldDifferences(e,t,n,r,o){let i=j.getInstance(),a=new Map;for(let l of Object.entries(n.fields||{})){if(!this.matchesTargetFile(l[1].filePath,o))continue;let g=a.get(l[1].tableId||l[1].tableName)||[];g.push(l),a.set(l[1].tableId||l[1].tableName,g)}let c=!1;await this.runInBatches([...a.values()],o?1:2,async l=>{let g=l[0][1],d=await i.get(z.GET_FIELD_LIST,{osClient:e.osClient,tableId:g.tableId,tableName:g.tableName},e.apiBaseUrl,e);if(d.Code!==1||!Array.isArray(d.Data?.List))throw new Error(`\u83B7\u53D6\u5B57\u6BB5\u540C\u6B65\u72B6\u6001\u5931\u8D25[${g.tableName}]: ${d.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let u=new Map(d.Data.List.map(p=>[String(p.Name||"").toLowerCase(),p]));for(let[p,f]of l){let m=u.get(f.fieldName.toLowerCase()),S=this.getWorkspaceFilePath(f.filePath);if(!S||!E.existsSync(S))continue;if(!m||!String(m[f.v8Key]||"").trim()){let _=this.createRemoteDeletedItem("field",`${f.tableName}.${f.fieldName}/${f.v8Key}`,p,t,S,f.updateTime);_&&r.push(_);continue}let C=this.normalizeCode(E.readFileSync(S,"utf-8")),h=this.normalizeCode(String(m[f.v8Key]||"")),y=String(m.UpdateTime||""),w=this.isLocalModified(S,f.updateTime),k=this.isRemoteNewer(y,f.updateTime);if(C===h){(w||k)&&y&&(f.updateTime=y,this.touchSyncedFile(S,y),c=!0);continue}let b=this.classifyDifference(w,k,C,h);b&&r.push({kind:"field",status:b,name:`${f.tableName}.${f.fieldName}/${f.v8Key}`,key:p,serverDir:t,filePath:S,localCode:C,remoteCode:h,localUpdateTime:f.updateTime,remoteUpdateTime:y})}}),c&&this.saveMeta(n,t)}async collectMenuButtonDifferences(e,t,n,r,o){let i=j.getInstance(),a=new Map;if(!o)for(let u of Object.keys(n.menus||{}))a.set(u,[]);for(let u of Object.entries(n.menuButtons||{})){if(!this.matchesTargetFile(u[1].filePath,o))continue;let p=a.get(u[1].moduleId)||[];p.push(u),a.set(u[1].moduleId,p)}let c=[];if(!o){let u=await i.get(z.LIST_MODULES,{osClient:e.osClient},e.apiBaseUrl,e);if(u.Code!==1||!Array.isArray(u.Data?.List))throw new Error(`\u83B7\u53D6\u6A21\u5757\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${u.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);c=u.Data.List}let l=new Set(c.map(u=>String(u.ParentId||"")).filter(Boolean)),g=new Map(c.map(u=>[u.Id,u]));for(let u of c){if(l.has(u.Id)||n.menus?.[u.Id])continue;let p=u.Label||u.Name||u.Id;r.push({kind:"menuButton",status:"remoteModified",name:`${p}/\u670D\u52A1\u5668\u65B0\u589E\u6A21\u5757`,key:u.Id,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"module",u.Id),localCode:"",remoteCode:JSON.stringify(u,null,2),localUpdateTime:"",remoteUpdateTime:String(u.UpdateTime||"")})}let d=!1;await this.runInBatches([...a.entries()],o?1:2,async([u,p])=>{let f=()=>{for(let[k,b]of p){let _=this.getWorkspaceFilePath(b.filePath);if(!_)continue;let v=this.createRemoteDeletedItem("menuButton",`${b.moduleName}/${b.btnName}/${b.v8SubField}`,k,t,_,b.updateTime);v&&r.push(v)}};if(!o&&!g.has(u)){f();return}let m=await i.get(z.GET_MODULE,{osClient:e.osClient,moduleId:u},e.apiBaseUrl,e);if(m.Code!==1||!m.Data){if(/不存在|not\s*found/i.test(String(m.Msg||""))){f();return}throw new Error(`\u83B7\u53D6\u6A21\u5757\u6309\u94AE\u540C\u6B65\u72B6\u6001\u5931\u8D25[${u}]: ${m.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`)}let S=m.Data,C=String(S.UpdateTime||""),h=new Map;for(let k of Object.keys(yt)){let b=[];try{let _=S[k];b=typeof _=="string"?JSON.parse(_):Array.isArray(_)?_:[],Array.isArray(b)||(b=[])}catch{b=[]}h.set(k,new Map(b.map(_=>[String(_.Id||""),_])))}for(let[k,b]of p){let _=h.get(b.btnField)?.get(b.btnId),v=this.getWorkspaceFilePath(b.filePath);if(!v||!E.existsSync(v))continue;if(!_||!String(_[b.v8SubField]||"").trim()){let I=this.createRemoteDeletedItem("menuButton",`${b.moduleName}/${b.btnName}/${b.v8SubField}`,k,t,v,b.updateTime);I&&r.push(I);continue}let B=this.normalizeCode(E.readFileSync(v,"utf-8")),F=this.normalizeCode(String(_[b.v8SubField]||"")),D=this.isLocalModified(v,b.updateTime),L=this.isRemoteNewer(C,b.updateTime);if(B===F){(D||L)&&C&&(b.updateTime=C,this.touchSyncedFile(v,C),d=!0);continue}let T=this.classifyDifference(D,L,B,F);T&&r.push({kind:"menuButton",status:T,name:`${b.moduleName}/${b.btnName}/${b.v8SubField}`,key:k,serverDir:t,filePath:v,localCode:B,remoteCode:F,localUpdateTime:b.updateTime,remoteUpdateTime:C})}if(o)return;let y=new Set(p.map(([k])=>k)),w=n.menus?.[u]?.moduleName||g.get(u)?.Label||g.get(u)?.Name||u;for(let[k,b]of h)for(let[_,v]of b){if(!_)continue;let B=String(v.Name||_);for(let F of["V8Code","V8CodeShow"]){let D=String(v[F]||""),L=this.getMenuButtonMetaKey(u,k,_,F);!D.trim()||y.has(L)||r.push({kind:"menuButton",status:"remoteModified",name:`${w}/${B}/${F}`,key:L,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"module",L),localCode:"",remoteCode:this.normalizeCode(D),localUpdateTime:"",remoteUpdateTime:C})}}}),d&&this.saveMeta(n,t)}async collectMenuScriptDifferences(e,t,n,r,o){let i=j.getInstance(),a=Object.entries(n.menuScripts||{}).filter(([,l])=>this.matchesTargetFile(l.filePath,o)),c=!1;await this.runInBatches(a,o?1:2,async([l,g])=>{let d=this.getWorkspaceFilePath(g.filePath);if(!d||!E.existsSync(d))return;let u=await i.get(z.GET_MODULE,{osClient:e.osClient,moduleId:g.moduleId},e.apiBaseUrl,e);if(u.Code!==1||!u.Data){if(/不存在|not\s*found/i.test(String(u.Msg||""))){let w=this.createRemoteDeletedItem("menuScript",`${g.moduleName}/${g.scriptField}`,l,t,d,g.updateTime);w&&r.push(w);return}throw new Error(`\u83B7\u53D6\u6A21\u5757 Join/Where \u540C\u6B65\u72B6\u6001\u5931\u8D25[${g.moduleId}]: ${u.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`)}let p=u.Data,f=this.normalizeCode(String(p[g.scriptField]||"")),m=this.normalizeCode(E.readFileSync(d,"utf-8")),S=String(p.UpdateTime||""),C=this.isLocalModified(d,g.updateTime),h=this.sourceHash(f)!==g.codeHash;if(m===f){(C||h||S&&S!==g.updateTime)&&(g.codeHash=this.sourceHash(f),g.updateTime=S||g.updateTime,this.touchSyncedFile(d,g.updateTime),c=!0);return}let y=this.classifyDifference(C,h,m,f);y&&r.push({kind:"menuScript",status:y,name:`${g.moduleName}/${g.scriptField}`,key:l,serverDir:t,filePath:d,localCode:m,remoteCode:f,localUpdateTime:g.updateTime,remoteUpdateTime:S})}),c&&this.saveMeta(n,t)}async runInBatches(e,t,n){for(let r=0;r<e.length;r+=t)await Promise.all(e.slice(r,r+t).map(o=>n(o))),r+t<e.length&&await new Promise(o=>setTimeout(o,120))}async collectWorkflowDifferences(e,t,n,r,o){let a=await j.getInstance().get(z.GET_WORKFLOW_V8_EVENT_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(a.Code!==1||!Array.isArray(a.Data?.List))throw new Error(`\u83B7\u53D6\u6D41\u7A0B\u4E8B\u4EF6\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${a.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map(a.Data.List.map(d=>[`${d.FlowDesignId}__${d.NodeId}__${d.EventType}`,d])),l=!1;for(let[d,u]of Object.entries(n.workflowNodeEvents||{})){if(!this.matchesTargetFile(u.filePath,o))continue;let p=c.get(d),f=this.getWorkspaceFilePath(u.filePath);if(!f||!E.existsSync(f))continue;if(!p||!String(p.V8Code||p.Code||"").trim()){let w=this.createRemoteDeletedItem("workflow",`${u.flowName}/${u.nodeName}/${u.eventType}`,d,t,f,u.updateTime);w&&r.push(w);continue}let m=this.normalizeCode(E.readFileSync(f,"utf-8")),S=this.normalizeCode(p.V8Code||p.Code||""),C=this.isLocalModified(f,u.updateTime),h=this.isRemoteNewer(p.UpdateTime,u.updateTime);if(m===S){(C||h)&&p.UpdateTime&&(u.updateTime=p.UpdateTime,this.touchSyncedFile(f,p.UpdateTime),l=!0);continue}let y=this.classifyDifference(C,h,m,S);if(y){let w=`${p.FlowName||u.flowName}/${p.NodeName||u.nodeName}/${p.EventType||u.eventType}`;r.push({kind:"workflow",status:y,name:w,key:d,serverDir:t,filePath:f,localCode:m,remoteCode:S,localUpdateTime:u.updateTime,remoteUpdateTime:p.UpdateTime})}}if(l&&this.saveMeta(n,t),o)return;let g=new Set(Object.keys(n.workflowNodeEvents||{}));for(let d of a.Data.List){let u=`${d.FlowDesignId}__${d.NodeId}__${d.EventType}`,p=d.V8Code||d.Code||"";if(!p.trim()||g.has(u))continue;let f=`${d.FlowName||d.FlowDesignId}/${d.NodeName||d.NodeId}/${d.EventType}`;r.push({kind:"workflow",status:"remoteModified",name:f,key:u,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"workflow",u),localCode:"",remoteCode:this.normalizeCode(p),localUpdateTime:"",remoteUpdateTime:d.UpdateTime})}}migrateFromFlatMeta(e){let t=N.getInstance();try{let n=t.getSyncRootDir(),r=P.join(n,ft);if(!E.existsSync(r))return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};let o=t.getWorkspaceRoot();if(!o)return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};let i=JSON.parse(E.readFileSync(r,"utf-8")),a=i.engines||{},c=i.events||{},l={engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};for(let[g,d]of Object.entries(a)){let u=d;if(u.filePath){let p=P.join(o,u.filePath);P.relative(n,p).split(P.sep)[0]===e&&(l.engines[g]=u)}}for(let[g,d]of Object.entries(c)){let u=d;if(u.filePath){let p=P.join(o,u.filePath);P.relative(n,p).split(P.sep)[0]===e&&(l.events[g]=u)}}return(Object.keys(l.engines).length>0||Object.keys(l.events).length>0)&&this.saveMeta(l,e),l}catch{return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}}}}async pullEngines(e){if(!e){let t=N.getInstance().getProfiles();if(t.length===0){V.warn("Microi: \u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u670D\u52A1\u5668\uFF0C\u8BF7\u5148\u5728\u8BBE\u7F6E\u4E2D\u6DFB\u52A0\u8FDE\u63A5\u5E76\u767B\u5F55");return}for(let n of t)try{await this.pullEnginesForProfile(n)}catch(r){let o=r instanceof Error?r.message:String(r);this.log(`\u62C9\u53D6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${o}`),V.error(`Microi: \u62C9\u53D6 [${n.label||n.apiBaseUrl}] \u5931\u8D25 - ${o}`)}return}await this.pullEnginesForProfile(e)}async pullEnginesForProfile(e){let t=N.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,o=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE\u4EE3\u7801 [${e.label||r}]...`),await ve.withProgress({location:gt.Notification,title:`Microi: \u62C9\u53D6\u63A5\u53E3\u5F15\u64CE [${e.label||r}]`,cancellable:!1},async i=>{i.report({message:"\u68C0\u67E5\u540E\u7AEF\u72B6\u6001..."});let a=await n.get(z.GET_STATUS,void 0,r,e);if(a.Code!==1){let T=a.Code===1001||a.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u540E\u7AEF\u72B6\u6001\u5F02\u5E38: ${a.Msg||"Code="+a.Code}${T}`)}i.report({message:"\u83B7\u53D6\u7CFB\u7EDF\u914D\u7F6E..."});let l=await ke.getInstance().getSysConfig(r,o),g=l?.SysShortTitle||"",d=l?.SysTitle||"",u=g||d||l?.CompanyName||e.label||"";u&&(u!==e.label||g!==e.sysShortTitle||d!==e.sysTitle)&&await t.addProfile({...e,label:u,sysShortTitle:g,sysTitle:d}),i.report({message:"\u83B7\u53D6\u63A5\u53E3\u5F15\u64CE\u5217\u8868..."});let p=await n.get(z.GET_ENGINE_LIST,{osClient:o},r,e);if(p.Code!==1){let T=p.Code===1001||p.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u5217\u8868\u5931\u8D25: ${p.Msg||"Code="+p.Code}${T}`)}let{OsClient:f,OsClientType:m,OsClientNetwork:S,List:C,Total:h}=p.Data;if(this.log(`\u83B7\u53D6\u5230 ${h} \u4E2A\u63A5\u53E3\u5F15\u64CE (OsClient: ${f})`),!m||!S)throw new Error(`\u540E\u7AEF\u672A\u8FD4\u56DE\u5B8C\u6574\u7684 OsClientType/OsClientNetwork (OsClient: ${f}, Type: ${m||"\u7A7A"}, Network: ${S||"\u7A7A"})\uFF0C\u65E0\u6CD5\u62C9\u53D6\u4EE3\u7801`);if(m||S){let T={...e,osClientType:m,osClientNetwork:S};await t.addProfile(T)}let y=t.getSyncRootDir(),w=t.buildServerDirName(u,r),k=this.loadMeta(w),b=0,_=0,v=[],B=new Set,F=new Set,D=t.buildOsClientDirName(f,m,S);for(let T of C)try{let I=ee(T.Category||"\u672A\u5206\u7C7B"),x=ee(T.ApiName||T.ApiEngineKey),Y=P.join(y,w,D,mt,I),Q=ee(`${x}(${hr(T.ApiEngineKey)}).js`),me=P.join(Y,Q),G=yr(T.ApiV8Code||"");if(!G.trim()){_++,E.existsSync(me)&&this.backupAndDeleteSyncFile(me,w,"remote-deleted-api"),delete k.engines[T.ApiEngineKey];continue}B.add(T.ApiEngineKey),Ce(Y),E.writeFileSync(me,G,"utf-8");let re=new Date(T.UpdateTime);isNaN(re.getTime())||E.utimesSync(me,re,re),k.engines[T.ApiEngineKey]={id:T.Id,apiName:T.ApiName,category:I,apiAddress:T.ApiAddress,apiRoutes:T.ApiRoutes||"",updateTime:T.UpdateTime,filePath:P.relative(t.getWorkspaceRoot(),me)},b++,i.report({message:`${b}/${h} ${T.ApiEngineKey}`,increment:1/h*100})}catch(I){let x=I instanceof Error?I.message:String(I);F.add(T.ApiEngineKey),v.push(`${T.ApiEngineKey}: ${x}`),this.log(`\u63A5\u53E3\u5F15\u64CE\u6587\u4EF6\u5199\u5165\u5931\u8D25\uFF0C\u7EE7\u7EED\u4E0B\u4E00\u9879 [${T.ApiEngineKey}]: ${x}`)}for(let[T,I]of Object.entries(k.engines)){if(B.has(T)||F.has(T))continue;let x=this.getWorkspaceFilePath(I.filePath);x&&this.backupAndDeleteSyncFile(x,w,"remote-deleted-api"),delete k.engines[T]}this.saveMeta(k,w);let L=u||e.label||r;this.log(`[${L}] \u62C9\u53D6\u5B8C\u6210: ${b} \u4E2A\u63A5\u53E3\u5F15\u64CE\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${_} \u9879\uFF0C\u5931\u8D25 ${v.length} \u9879`),v.length>0?V.warn(`Microi: [${L}] \u5DF2\u62C9\u53D6 ${b} \u4E2A\u63A5\u53E3\u5F15\u64CE\uFF0C${v.length} \u4E2A\u6587\u4EF6\u5931\u8D25\uFF1B\u5931\u8D25\u660E\u7EC6\u5DF2\u5199\u5165 Microi \u8F93\u51FA\u3002`):V.info(`Microi: [${L}] \u6210\u529F\u62C9\u53D6 ${b} \u4E2A\u63A5\u53E3\u5F15\u64CE${_>0?`\uFF08\u8DF3\u8FC7 ${_} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)})}async pullEvents(e){if(!e){let t=N.getInstance().getProfiles();if(t.length===0)return;for(let n of t)try{await this.pullEventsForProfile(n)}catch(r){let o=r instanceof Error?r.message:String(r);this.log(`\u62C9\u53D6V8\u4E8B\u4EF6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${o}`)}return}await this.pullEventsForProfile(e)}async pullEventsForProfile(e){let t=N.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,o=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6V8\u4E8B\u4EF6\u4EE3\u7801 [${e.label||r}]...`),await ve.withProgress({location:gt.Notification,title:`Microi: \u62C9\u53D6V8\u4E8B\u4EF6 [${e.label||r}]`,cancellable:!1},async i=>{i.report({message:"\u83B7\u53D6V8\u4E8B\u4EF6\u5217\u8868..."});let a=await n.get(z.GET_EVENT_LIST,{osClient:o},r,e);if(a.Code!==1){let D=a.Code===1001||a.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6V8\u4E8B\u4EF6\u5217\u8868\u5931\u8D25: ${a.Msg||"Code="+a.Code}${D}`)}let{List:c,Total:l}=a.Data;this.log(`\u83B7\u53D6\u5230 ${l} \u4E2AV8\u4E8B\u4EF6`);let d=await ke.getInstance().getSysConfig(r,o),u=d?.SysShortTitle||"",p=d?.SysTitle||"",f=u||p||d?.CompanyName||e.label||"";f&&(f!==e.label||u!==e.sysShortTitle||p!==e.sysTitle)&&await t.addProfile({...e,label:f,sysShortTitle:u,sysTitle:p});let m=t.getSyncRootDir(),S=t.buildServerDirName(f,r),C=this.loadMeta(S),h=0,y=0,w=0,k=new Set(c.map(D=>`${D.FormEngineKey}__${D.EventType}`)),_=t.getProfiles().find(D=>D.apiBaseUrl===e.apiBaseUrl&&D.osClient===e.osClient)||e;if(!_.osClientType||!_.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE\u4EE5\u83B7\u53D6\u5B8C\u6574\u914D\u7F6E");let v=t.buildOsClientDirName(o,_.osClientType,_.osClientNetwork),B={SubmitBeforeServerV8:"\u540E\u7AEF\u63D0\u4EA4\u524DV8\u4E8B\u4EF6",SubmitAfterServerV8:"\u540E\u7AEF\u63D0\u4EA4\u540EV8\u4E8B\u4EF6",SubmitFormV8:"\u524D\u7AEF\u8868\u5355\u63D0\u4EA4V8\u4E8B\u4EF6",OutFormV8:"\u524D\u7AEF\u8868\u5355\u9000\u51FAV8\u4E8B\u4EF6",ServerDataV8:"\u540E\u7AEF\u6570\u636EV8\u4E8B\u4EF6"};for(let D of c){let L=D.V8Code||"",T=ee(D.Description?`${D.Description}\uFF08${D.FormEngineKey}\uFF09`:D.FormEngineKey),I=cs[D.EventType]||D.EventType,x=ee(`${I}\uFF08${D.EventType}\uFF09`)+".js",Y=P.join(m,S,v,ze,T,yn);Ce(Y);let Q=P.join(Y,x),me=B[D.EventType];if(me){let le=ee(`${me}\uFF08${D.EventType}\uFF09`)+".js",ie=P.join(Y,le);ie!==Q&&E.existsSync(ie)&&!this.isLocalModified(ie,D.UpdateTime)&&(E.existsSync(Q)?E.unlinkSync(ie):E.renameSync(ie,Q))}let G=`${D.FormEngineKey}__${D.EventType}`;if(C.events[G]={id:D.Id,formEngineKey:D.FormEngineKey,description:D.Description||"",eventType:D.EventType,updateTime:D.UpdateTime,filePath:P.relative(t.getWorkspaceRoot(),Q)},!L.trim()){E.existsSync(Q)&&this.backupAndDeleteSyncFile(Q,S,"remote-deleted-form-event"),w++,h++,i.report({message:`${h}/${l}`,increment:l>0?1/l*100:void 0});continue}E.writeFileSync(Q,L,"utf-8");let re=new Date(D.UpdateTime);isNaN(re.getTime())||E.utimesSync(Q,re,re),y++,h++,i.report({message:`${h}/${l}`,increment:l>0?1/l*100:void 0})}for(let[D,L]of Object.entries(C.events)){if(k.has(D))continue;let T=this.getWorkspaceFilePath(L.filePath);T&&this.backupAndDeleteSyncFile(T,S,"remote-deleted-form-event"),delete C.events[D]}this.saveMeta(C,S);let F=f||e.label||r;this.log(`[${F}] \u62C9\u53D6\u5B8C\u6210: ${y} \u4E2AV8\u4E8B\u4EF6\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${w} \u9879`),V.info(`Microi: [${F}] \u6210\u529F\u62C9\u53D6 ${y} \u4E2AV8\u4E8B\u4EF6\u6587\u4EF6${w>0?`\uFF08\u8DF3\u8FC7 ${w} \u4E2A\u7A7A\u4EE3\u7801\u4E8B\u4EF6\uFF09`:""}`)})}async pullWorkflows(e){if(!e){let t=N.getInstance().getProfiles();if(t.length===0)return;for(let n of t)try{await this.pullWorkflowsForProfile(n)}catch(r){let o=r instanceof Error?r.message:String(r);this.log(`\u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${o}`)}return}await this.pullWorkflowsForProfile(e)}async pullWorkflowsForProfile(e){let t=N.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,o=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE\u8282\u70B9 V8 [${e.label||r}]...`),await ve.withProgress({location:gt.Notification,title:`Microi: \u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE [${e.label||r}]`,cancellable:!1},async i=>{i.report({message:"\u83B7\u53D6\u6D41\u7A0B\u8282\u70B9V8\u5217\u8868..."});let a=await n.get(z.GET_WORKFLOW_V8_EVENT_LIST,{osClient:o},r,e);if(a.Code!==1){let I=a.Code===1001||a.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u6D41\u7A0B\u8282\u70B9V8\u5217\u8868\u5931\u8D25: ${a.Msg||"Code="+a.Code}${I}`)}let l=await ke.getInstance().getSysConfig(r,o),g=l?.SysShortTitle||"",d=l?.SysTitle||"",u=g||d||l?.CompanyName||e.label||"";u&&(u!==e.label||g!==e.sysShortTitle||d!==e.sysTitle)&&await t.addProfile({...e,label:u,sysShortTitle:g,sysTitle:d});let f=t.getProfiles().find(I=>I.apiBaseUrl===e.apiBaseUrl&&I.osClient===e.osClient)||e;if(!f.osClientType||!f.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let m=a.Data.OsClient||o,S=t.buildServerDirName(u,r),C=t.buildOsClientDirName(m,f.osClientType,f.osClientNetwork),h=t.getSyncRootDir(),y=this.loadMeta(S);y.workflows||(y.workflows={}),y.workflowNodeEvents||(y.workflowNodeEvents={});let w=a.Data.Flows||[],k=a.Data.Nodes||[],b=a.Data.Lines||[],_=a.Data.List||[],v=new Map(w.map(I=>[String(I.Id||""),I])),B=new Set(w.map(I=>String(I.Id||"")).filter(Boolean)),F=new Set(_.filter(I=>String(I.V8Code||I.Code||"").trim()).map(I=>`${I.FlowDesignId}__${I.NodeId}__${I.EventType}`)),D=0,L=0;for(let I of w){let x=String(I.Id||"");if(!x)continue;let Y=String(I.FlowName||x),Q=String(I.UpdateTime||Pe()),me=P.join(h,S,C,ht,ee(`${Y}\uFF08${x}\uFF09`));Ce(me);let G=k.filter(ie=>String(ie.FlowDesignId||"")===x),re=b.filter(ie=>String(ie.FlowDesignId||"")===x),le=P.join(me,"\u6D41\u7A0B\u8BBE\u8BA1\u56FE\uFF08WF_FlowDesign\uFF09.json");E.writeFileSync(le,JSON.stringify({FlowDesign:I,Nodes:G,Lines:re},null,2),"utf-8"),this.touchSyncedFile(le,Q),y.workflows[x]={flowDesignId:x,flowName:Y,updateTime:Q,filePath:P.relative(t.getWorkspaceRoot(),le)}}for(let I of _){let x=String(I.FlowDesignId||""),Y=String(I.NodeId||""),Q=String(I.EventType||"");if(!x||!Y||!Q)continue;let me=v.get(x),G=String(I.FlowName||me?.FlowName||x),re=String(I.NodeName||Y),le=ls[Q]||I.EventName||Q,ie=P.join(h,S,C,ht,ee(`${G}\uFF08${x}\uFF09`),Sn,ee(`${re}\uFF08${Y}\uFF09`));Ce(ie);let M=P.join(ie,ee(`${le}\uFF08${Q}\uFF09`)+".js"),oe=I.V8Code||I.Code||"",se=String(I.UpdateTime||me?.UpdateTime||Pe());if(y.workflowNodeEvents[`${x}__${Y}__${Q}`]={flowDesignId:x,flowName:G,nodeId:Y,nodeName:re,eventType:Q,updateTime:se,filePath:P.relative(t.getWorkspaceRoot(),M)},!oe.trim()){E.existsSync(M)&&this.backupAndDeleteSyncFile(M,S,"remote-deleted-workflow-event"),L++,i.report({message:`${D}/${_.length} ${G}/${re}`});continue}E.writeFileSync(M,oe,"utf-8"),this.touchSyncedFile(M,se),D++,i.report({message:`${D}/${_.length} ${G}/${re}`})}for(let[I,x]of Object.entries(y.workflowNodeEvents)){if(F.has(I))continue;let Y=this.getWorkspaceFilePath(x.filePath);Y&&this.backupAndDeleteSyncFile(Y,S,"remote-deleted-workflow-event"),delete y.workflowNodeEvents[I]}for(let[I,x]of Object.entries(y.workflows)){if(B.has(I))continue;let Y=this.getWorkspaceFilePath(x.filePath);Y&&this.backupAndDeleteSyncFile(Y,S,"remote-deleted-workflow"),delete y.workflows[I]}this.saveMeta(y,S);let T=u||e.label||r;this.log(`[${T}] \u6D41\u7A0B\u5F15\u64CE\u62C9\u53D6\u5B8C\u6210: ${w.length} \u4E2A\u6D41\u7A0B\uFF0C${D} \u4E2A\u8282\u70B9V8\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${L} \u9879`),V.info(`Microi: [${T}] \u6210\u529F\u62C9\u53D6 ${w.length} \u4E2A\u6D41\u7A0B\u3001${D} \u4E2A\u6D41\u7A0B\u8282\u70B9V8\u6587\u4EF6${L>0?`\uFF08\u8DF3\u8FC7 ${L} \u4E2A\u7A7A\u4EE3\u7801\u4E8B\u4EF6\uFF09`:""}`)})}findProfileByServerDir(e){let t=N.getInstance(),n=t.getProfiles();for(let r of n)if(t.buildServerDirName(r.label,r.apiBaseUrl)===e)return r}hasSyncBaseline(e,t){let n=P.resolve(e).toLowerCase(),r=this.loadMeta(t);return[r.engines,r.events,r.fields||{},r.menuButtons||{},r.menuScripts||{},r.workflowNodeEvents||{}].some(i=>Object.values(i).some(a=>{let c=this.getWorkspaceFilePath(a.filePath);return!!c&&P.resolve(c).toLowerCase()===n}))}async runPushPreflight(e,t,n,r){if(!n){let o=`\u65E0\u6CD5\u8BC6\u522B\u6587\u4EF6\u6240\u5C5E\u670D\u52A1\u5668\u914D\u7F6E\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\uFF1A${e}`;return this.log(o),V.error(`Microi: ${o}`),!1}if(!this.hasSyncBaseline(e,t)){let o=`\u6587\u4EF6\u6CA1\u6709\u540C\u6B65\u57FA\u7EBF\uFF0C\u65E0\u6CD5\u786E\u8BA4\u670D\u52A1\u5668\u7AEF\u662F\u5426\u66F4\u65B0\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\u3002\u8BF7\u5148\u62C9\u53D6\u5BF9\u5E94\u5F15\u64CE\uFF1A${e}`;return this.log(o),V.error(`Microi: ${o}`),!1}try{let o=await this.checkRemoteDifferences(n,r,e),i=P.resolve(e).toLowerCase(),a=o.find(g=>P.resolve(g.filePath).toLowerCase()===i);if(!a||a.status==="localModified")return!0;let l=`${a.status==="conflict"?"\u672C\u5730\u4E0E\u670D\u52A1\u5668\u5747\u5DF2\u4FEE\u6539":a.status==="remoteDeleted"?"\u670D\u52A1\u5668\u7AEF\u8D44\u6E90\u5DF2\u5220\u9664":"\u670D\u52A1\u5668\u4EE3\u7801\u8F83\u65B0"}\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\u4EE5\u907F\u514D\u8986\u76D6\u3002\u8BF7\u5728\u201C\u540C\u6B65\u7ED3\u679C\u201D\u4E2D\u67E5\u770B\u5DEE\u5F02\u5E76\u62C9\u53D6\u6216\u5408\u5E76\uFF1A${a.name}`;return this.log(l),V.error(`Microi: ${l}`),!1}catch(o){let i=o instanceof Error?o.message:String(o);return this.log(`\u63A8\u9001\u524D\u540C\u6B65\u72B6\u6001\u68C0\u6D4B\u5931\u8D25\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\uFF1A${i}`),V.error(`Microi: \u63A8\u9001\u524D\u540C\u6B65\u72B6\u6001\u68C0\u6D4B\u5931\u8D25\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001 - ${i}`),!1}}async pushFile(e,t={}){let r=N.getInstance().getSyncRootDir();if(P.extname(e).toLowerCase()===".js"&&E.existsSync(e)){let d=Cs(Ue(E.readFileSync(e,"utf-8")));if(d.length>0){let u=d[0],p=`\u68C0\u6D4B\u5230 AI/\u7EC8\u7AEF\u5DE5\u5177\u8F93\u51FA\u6C61\u67D3\uFF08\u7B2C ${u.line} \u884C: ${u.marker}\uFF09\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\u3002\u8BF7\u6062\u590D\u5B8C\u6574\u6E90\u7801\u540E\u518D\u8BD5\uFF1A${e}`;return this.log(p),V.error(`Microi: ${p}`),!1}}let o=fs(e,r);if(o){let d=this.findProfileByServerDir(o.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,o.serverDir,d,"api")?!1:this.pushEngineFile(e,o,d)}let i=ms(e,r);if(i){let d=this.findProfileByServerDir(i.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,i.serverDir,d,"form")?!1:this.pushEventFile(e,i,d)}let a=hs(e,r);if(a){let d=this.findProfileByServerDir(a.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,a.serverDir,d,"form")?!1:this.pushFieldFile(e,a,d)}let c=ys(e,r);if(c){let d=this.findProfileByServerDir(c.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,c.serverDir,d,"module")?!1:this.pushMenuButtonFile(e,c,d)}let l=Ss(e,r);if(l){let d=this.findProfileByServerDir(l.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,l.serverDir,d,"module")?!1:this.pushMenuScriptFile(e,l,d)}let g=ws(e,r);if(g){let d=this.findProfileByServerDir(g.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,g.serverDir,d,"workflow")?!1:this.pushWorkflowNodeFile(e,g,d)}return this.log(`\u65E0\u6CD5\u89E3\u6790\u6587\u4EF6\u8DEF\u5F84: ${e}`),!1}async pushEngineFile(e,t,n){let r=j.getInstance(),o=E.readFileSync(e,"utf-8"),i=Ue(o);this.log(`\u63A8\u9001\u63A5\u53E3\u5F15\u64CE: ${t.apiEngineKey}...`);try{let a="",c="";try{let p=await r.post(z.GET_ENGINE_CODE,{OsClient:t.osClient,ApiEngineKey:t.apiEngineKey},void 0,n?.apiBaseUrl,n);p.Code===1&&p.Data&&(a=p.Data.ApiV8Code||p.Data.Code||"",c=p.Data.Version||"")}catch{a="",c=""}let l=!i.trim(),g=l?{code:"",version:c,changeHistory:""}:Xt({kind:"ApiEngine",key:t.apiEngineKey,currentCode:i,remoteCode:a,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001\u63A5\u53E3\u5F15\u64CE ${t.apiEngineKey}`}),d={OsClient:t.osClient,ApiEngineKey:t.apiEngineKey,ApiV8CodeBase64:Buffer.from(g.code,"utf8").toString("base64")};l||(d.Version=g.version,d.ChangeSummary=g.changeHistory);let u=await r.post(z.UPDATE_ENGINE_CODE,d,void 0,n?.apiBaseUrl,n);if(u.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.apiEngineKey}`);let p=u.Data?.UpdateTime||Pe(),f=this.loadMeta(t.serverDir);if(l?delete f.engines[t.apiEngineKey]:f.engines[t.apiEngineKey]&&(f.engines[t.apiEngineKey].updateTime=p),this.saveMeta(f,t.serverDir),l)E.existsSync(e)&&E.unlinkSync(e);else{E.writeFileSync(e,g.code,"utf-8");let m=new Date(p);isNaN(m.getTime())||E.utimesSync(e,m,m)}return!0}else return this.log(`\u63A8\u9001\u5931\u8D25: ${t.apiEngineKey} - ${u.Msg}`),V.error(`Microi: \u63A8\u9001\u5931\u8D25 - ${u.Msg}`),!1}catch(a){let c=a instanceof Error?a.message:String(a);return this.log(`\u63A8\u9001\u5F02\u5E38: ${t.apiEngineKey} - ${c}`),V.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async pushEventFile(e,t,n){let r=j.getInstance(),o=E.readFileSync(e,"utf-8"),i=Ue(o);this.log(`\u63A8\u9001V8\u4E8B\u4EF6: ${t.formEngineKey}/${t.eventType}...`);try{let a="",c="";try{let p=await r.post(z.GET_EVENT_CODE,{OsClient:t.osClient,FormEngineKey:t.formEngineKey,EventType:t.eventType},void 0,n?.apiBaseUrl,n);p.Code===1&&p.Data&&(a=p.Data.V8Code||p.Data.Code||"",c=p.Data.Version||"")}catch{a="",c=""}let l=!i.trim(),g=l?{code:"",version:c,changeHistory:""}:Xt({kind:"V8Event",key:t.formEngineKey,eventType:t.eventType,currentCode:i,remoteCode:a,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001 V8 \u4E8B\u4EF6 ${t.formEngineKey}/${t.eventType}`}),d={OsClient:t.osClient,FormEngineKey:t.formEngineKey,EventType:t.eventType,V8Code:g.code};l||(d.Version=g.version,d.ChangeHistory=g.changeHistory);let u=await r.post(z.UPDATE_EVENT_CODE,d,void 0,n?.apiBaseUrl,n);if(u.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.formEngineKey}/${t.eventType}`);let p=u.Data?.UpdateTime||Pe(),f=this.loadMeta(t.serverDir),m=`${t.formEngineKey}__${t.eventType}`;if(l)delete f.events[m];else{let S=f.events[m];f.events[m]={id:S?.id||"",formEngineKey:t.formEngineKey,description:S?.description||"",eventType:t.eventType,updateTime:p,filePath:P.relative(N.getInstance().getWorkspaceRoot(),e)}}if(this.saveMeta(f,t.serverDir),l)E.existsSync(e)&&E.unlinkSync(e);else{E.writeFileSync(e,g.code,"utf-8");let S=new Date(p);isNaN(S.getTime())||E.utimesSync(e,S,S)}return!0}else return this.log(`\u63A8\u9001\u5931\u8D25: ${t.formEngineKey}/${t.eventType} - ${u.Msg}`),V.error(`Microi: \u63A8\u9001\u5931\u8D25 - ${u.Msg}`),!1}catch(a){let c=a instanceof Error?a.message:String(a);return this.log(`\u63A8\u9001\u5F02\u5E38: ${t.formEngineKey}/${t.eventType} - ${c}`),V.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async createEngine(e){let t=j.getInstance(),n=N.getInstance();this.log(`\u521B\u5EFA\u63A5\u53E3\u5F15\u64CE: ${e.apiEngineKey}...`);try{let r=Xt({kind:"ApiEngine",key:e.apiEngineKey,currentCode:"",functionDescription:`\u63A5\u53E3\u5F15\u64CE ${e.apiName} \u7684\u5B8C\u6574\u4E1A\u52A1\u903B\u8F91\u3002`,changeSummary:`\u901A\u8FC7 VS Code \u521B\u5EFA\u63A5\u53E3\u5F15\u64CE ${e.apiEngineKey}`,initial:!0}),o=await t.post(z.CREATE_ENGINE,{OsClient:e.profile.osClient,ApiName:e.apiName,ApiEngineKey:e.apiEngineKey,ApiAddress:e.apiAddress||"",ApiRoutes:e.apiRoutes||"",ApiRemark:e.apiRemark||"",Lock:e.lock?1:0,LockKey:e.lockKey||"",AllowAnonymous:e.allowAnonymous?1:0,V8Limit:e.v8Limit?1:0,IsEnable:e.isEnable!==!1?1:0,ApiRole:e.apiRole||"",Category:e.category||"\u672A\u5206\u7C7B",ApiV8CodeBase64:Buffer.from(r.code,"utf8").toString("base64"),Version:r.version,ChangeSummary:r.changeHistory},void 0,e.profile.apiBaseUrl,e.profile);if(o.Code===1){let i=n.getSyncRootDir(),a=n.buildServerDirName(e.profile.label,e.profile.apiBaseUrl),c=n.buildOsClientDirName(e.profile.osClient,e.profile.osClientType,e.profile.osClientNetwork),l=ee(e.category||"\u672A\u5206\u7C7B"),g=ee(e.apiName||e.apiEngineKey),d=P.join(i,a,c,mt,l);Ce(d);let u=P.join(d,ee(`${g}(${hr(e.apiEngineKey)}).js`));E.writeFileSync(u,r.code,"utf-8");let p=this.loadMeta(a);return p.engines[e.apiEngineKey]={id:"",apiName:e.apiName,category:l,apiAddress:e.apiAddress||"",apiRoutes:e.apiRoutes||"",updateTime:Pe(),filePath:P.relative(n.getWorkspaceRoot(),u)},this.saveMeta(p,a),this.log(`\u521B\u5EFA\u6210\u529F: ${e.apiEngineKey}`),V.info(`Microi: \u63A5\u53E3\u5F15\u64CE [${e.apiEngineKey}] \u521B\u5EFA\u6210\u529F`),await ve.showTextDocument(ss.file(u)),!0}else return this.log(`\u521B\u5EFA\u5931\u8D25: ${e.apiEngineKey} - ${o.Msg}`),V.error(`Microi: \u521B\u5EFA\u5931\u8D25 - ${o.Msg}`),!1}catch(r){let o=r instanceof Error?r.message:String(r);return this.log(`\u521B\u5EFA\u5F02\u5E38: ${e.apiEngineKey} - ${o}`),V.error(`Microi: \u521B\u5EFA\u5F02\u5E38 - ${o}`),!1}}async pullFields(e){if(!e){let t=N.getInstance().getProfiles();for(let n of t)try{await this.pullFieldsForProfile(n)}catch(r){this.log(`\u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${r instanceof Error?r.message:String(r)}`)}return}await this.pullFieldsForProfile(e)}async pullFieldsForTableFolder(e){let n=N.getInstance().getSyncRootDir(),r=P.relative(n,e).split(P.sep);if(r.length<4||r[2]!==ze){V.warn("Microi: \u8BF7\u5728\u201C\u8868\u5355\u5F15\u64CE\u201D\u4E0B\u7684\u8868\u76EE\u5F55\u6267\u884C\u5B57\u6BB5 V8 \u4E8B\u4EF6\u62C9\u53D6");return}let o=a=>{let c=a.match(/[((]([^))]+)[))]\s*$/);return c?c[1]:a},i=this.findProfileByServerDir(r[0]);if(!i){V.error(`Microi: \u672A\u627E\u5230\u4E0E\u76EE\u5F55 "${r[0]}" \u5339\u914D\u7684\u670D\u52A1\u5668\u8FDE\u63A5`);return}await this.pullFieldsForTable(i,o(r[3]),e,r[0])}async pullFieldsForTable(e,t,n,r){let o=N.getInstance(),i=j.getInstance(),a=this.loadMeta(r);a.fields||(a.fields={}),this.log(`\u62C9\u53D6\u8868\u5B57\u6BB5V8\u4E8B\u4EF6: ${t}...`);let c=await i.get(z.GET_FIELD_LIST,{osClient:e.osClient,tableName:t},e.apiBaseUrl,e);if(c.Code!==1){V.error(`Microi: \u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 - ${c.Msg}`);return}let l=c.Data.List||[],g=["V8Code","KeyupV8Code","V8TmpEngineTable","V8TmpEngineForm"],d=0,u=0;for(let p of l){let f=ee(p.Label?`${p.Label}\uFF08${p.Name}\uFF09`:p.Name),m=P.join(n,Ot,f);for(let S of g){let C=(p[S]||"").toString(),h=ir[S]||S,y=ee(`${h}\uFF08${S}\uFF09`)+".js",w=P.join(m,y),k=`${t}__${p.Name}__${S}`;if(!C.trim()){u++,E.existsSync(w)&&E.unlinkSync(w),delete a.fields[k];continue}Ce(m),E.writeFileSync(w,C,"utf-8");let b=new Date(p.UpdateTime);isNaN(b.getTime())||E.utimesSync(w,b,b),a.fields[k]={fieldId:p.Id,tableId:p.TableId,tableName:t,fieldName:p.Name,fieldLabel:p.Label||"",v8Key:S,updateTime:p.UpdateTime,filePath:P.relative(o.getWorkspaceRoot(),w)},d++}}this.saveMeta(a,r),V.info(`Microi: \u5DF2\u62C9\u53D6 ${t} \u7684 ${d} \u4E2A\u5B57\u6BB5V8\u4E8B\u4EF6\u6587\u4EF6${u>0?`\uFF08\u8DF3\u8FC7 ${u} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)}async pullFieldsForProfile(e){let t=N.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,o=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6 [${e.label||r}]...`),await ve.withProgress({location:gt.Notification,title:`Microi: \u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6 [${e.label||r}]`,cancellable:!1},async i=>{i.report({message:"\u83B7\u53D6\u8868\u5217\u8868..."});let a=await n.get(z.GET_DB_SCHEMA,{osClient:o},r,e);if(a.Code!==1)throw new Error(`\u83B7\u53D6\u8868\u5217\u8868\u5931\u8D25: ${a.Msg||"Code="+a.Code}`);let c=a.Data.Tables||[],g=await ke.getInstance().getSysConfig(r,o),d=g?.SysShortTitle||"",u=g?.SysTitle||"",p=d||u||e.label||"",f=t.buildServerDirName(p,r),m=this.loadMeta(f);m.fields||(m.fields={});let C=t.getProfiles().find(F=>F.apiBaseUrl===e.apiBaseUrl&&F.osClient===e.osClient)||e;if(!C.osClientType||!C.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let h=t.buildOsClientDirName(o,C.osClientType,C.osClientNetwork),y=t.getSyncRootDir(),w=["V8Code","KeyupV8Code","V8TmpEngineTable","V8TmpEngineForm"],k=0,b=0,_=0,v=new Set,B=new Set;for(let F of c){_++,i.report({message:`[${_}/${c.length}] ${F.Name}`});let D=await n.get(z.GET_FIELD_LIST,{osClient:o,tableId:F.Id},r,e);if(D.Code!==1){B.add(F.Name.toLowerCase()),this.log(` \u8DF3\u8FC7\u8868 ${F.Name}: ${D.Msg}`);continue}let L=D.Data.List||[],T=ee(F.Description?`${F.Description}\uFF08${F.Name}\uFF09`:F.Name);for(let I of L)for(let x of w){let Y=(I[x]||"").toString();if(!Y.trim()){b++;continue}let Q=ee(I.Label?`${I.Label}\uFF08${I.Name}\uFF09`:I.Name),me=ir[x]||x,G=ee(`${me}\uFF08${x}\uFF09`)+".js",re=P.join(y,f,h,ze,T,Ot,Q);Ce(re);let le=P.join(re,G);E.writeFileSync(le,Y,"utf-8");let ie=new Date(I.UpdateTime);isNaN(ie.getTime())||E.utimesSync(le,ie,ie);let M=`${F.Name}__${I.Name}__${x}`;v.add(M),m.fields[M]={fieldId:I.Id,tableId:I.TableId,tableName:F.Name,fieldName:I.Name,fieldLabel:I.Label||"",v8Key:x,updateTime:I.UpdateTime,filePath:P.relative(t.getWorkspaceRoot(),le)},k++}}for(let[F,D]of Object.entries(m.fields)){if(v.has(F)||B.has(D.tableName.toLowerCase()))continue;let L=this.getWorkspaceFilePath(D.filePath);L&&this.backupAndDeleteSyncFile(L,f,"remote-deleted-field-event"),delete m.fields[F]}this.saveMeta(m,f),this.log(`\u5B57\u6BB5V8\u4E8B\u4EF6\u62C9\u53D6\u5B8C\u6210: ${k} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${b} \u9879`),V.info(`Microi: \u6210\u529F\u62C9\u53D6 ${k} \u4E2A\u5B57\u6BB5V8\u4E8B\u4EF6${b>0?`\uFF08\u8DF3\u8FC7 ${b} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)})}async pushFieldFile(e,t,n){let r=j.getInstance(),o=Ue(E.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u5B57\u6BB5V8\u4E8B\u4EF6: ${t.tableName}/${t.fieldName}/${t.v8Key}...`);try{let i=await r.post(z.UPDATE_FIELD,{OsClient:t.osClient,TableName:t.tableName,Name:t.fieldName,[t.v8Key]:o},void 0,n?.apiBaseUrl,n);if(i.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.tableName}/${t.fieldName}/${t.v8Key}`);let a=this.loadMeta(t.serverDir),c=`${t.tableName}__${t.fieldName}__${t.v8Key}`;a.fields||(a.fields={});let l=i.Data?.UpdateTime||Pe();return o.trim()?a.fields[c]={fieldId:a.fields[c]?.fieldId||"",tableId:a.fields[c]?.tableId||"",tableName:t.tableName,fieldName:t.fieldName,fieldLabel:a.fields[c]?.fieldLabel||"",v8Key:t.v8Key,updateTime:l,filePath:P.relative(N.getInstance().getWorkspaceRoot(),e)}:delete a.fields[c],this.saveMeta(a,t.serverDir),o.trim()?this.touchSyncedFile(e,l):E.existsSync(e)&&E.unlinkSync(e),!0}return this.log(`\u63A8\u9001\u5931\u8D25: ${i.Msg}`),V.error(`Microi: \u63A8\u9001\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 - ${i.Msg}`),!1}catch(i){let a=i instanceof Error?i.message:String(i);return this.log(`\u63A8\u9001\u5F02\u5E38: ${a}`),V.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${a}`),!1}}async pullMenuButtons(e){if(!e){let t=N.getInstance().getProfiles();for(let n of t)try{await this.pullMenuButtonsForProfile(n)}catch(r){this.log(`\u62C9\u53D6\u83DC\u5355\u6309\u94AE\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${r instanceof Error?r.message:String(r)}`)}return}await this.pullMenuButtonsForProfile(e)}async pullMenuButtonsForModuleFolder(e){let n=N.getInstance().getSyncRootDir(),r=P.relative(n,e).split(P.sep);if(r.length<4||r[2]!==tt){V.warn("Microi: \u8BF7\u5728\u201C\u6A21\u5757\u5F15\u64CE\u201D\u4E0B\u7684\u6A21\u5757\u76EE\u5F55\u6267\u884C\u62C9\u53D6");return}let o=this.findProfileByServerDir(r[0]);if(!o){V.error(`Microi: \u672A\u627E\u5230\u4E0E\u76EE\u5F55 "${r[0]}" \u5339\u914D\u7684\u670D\u52A1\u5668\u8FDE\u63A5`);return}let i=this.extractTrailingKey(P.basename(e));await this.pullMenuButtonsForProfile(o,i,r[0],r[1],e)}async pullMenuButtonsForProfile(e,t,n,r,o){let i=N.getInstance(),a=j.getInstance(),c=e.apiBaseUrl,l=e.osClient;this.log(`\u5F00\u59CB\u62C9\u53D6\u6A21\u5757 Join/Where \u4E0E\u6309\u94AE V8 \u4EE3\u7801 [${e.label||c}]...`),await ve.withProgress({location:gt.Notification,title:`Microi: \u62C9\u53D6\u6A21\u5757\u4EE3\u7801 [${e.label||c}]`,cancellable:!1},async g=>{let d=await a.get(z.LIST_MODULES,{osClient:l},c,e);if(d.Code!==1)throw new Error(`\u83B7\u53D6\u6A21\u5757\u5217\u8868\u5931\u8D25: ${d.Msg}`);let u=d.Data.List||[],f=await ke.getInstance().getSysConfig(c,l),m=f?.SysShortTitle||"",S=f?.SysTitle||"",C=m||S||e.label||"",h=n||i.buildServerDirName(C,c),y=this.loadMeta(h);y.menus||(y.menus={}),y.menuButtons||(y.menuButtons={}),y.menuScripts||(y.menuScripts={});let k=i.getProfiles().find(M=>M.apiBaseUrl===e.apiBaseUrl&&M.osClient===e.osClient)||e;if(!k.osClientType||!k.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let b=r||i.buildOsClientDirName(l,k.osClientType,k.osClientNetwork),_=i.getSyncRootDir(),v=P.join(_,h,b,tt),B=Object.keys(yt),F=Object.keys(Vt),D=0,L=0,T=0,I=0,x=0,Y=new Map(u.map(M=>[M.Id,M])),Q=new Map,me=M=>M||"";for(let M of u){let oe=me(M.ParentId);Q.has(oe)||Q.set(oe,[]),Q.get(oe).push(M)}let G=M=>M.sort((oe,se)=>{let he=typeof oe.Sort=="number"?oe.Sort:0,Me=typeof se.Sort=="number"?se.Sort:0;return he!==Me?he-Me:String(oe.Name||oe.Label||"").localeCompare(String(se.Name||se.Label||""))}),re=t?Y.get(t)?[Y.get(t)]:[]:G(u.filter(M=>!M.ParentId||!Y.has(M.ParentId)));if(t&&re.length===0)throw new Error(`\u627E\u4E0D\u5230\u6A21\u5757 Id=${t}`);let le=t?o||P.join(v,ee(`${re[0].Label||re[0].Name||re[0].Id}\uFF08${re[0].Id}\uFF09`)):v;if(this.backupExistingTree(le,h,t?"module-subtree":"module-engine"),!t)y.menus={},y.menuButtons={},y.menuScripts={};else{let M=new Set,oe=se=>{if(!M.has(se)){M.add(se);for(let he of Q.get(se)||[])oe(he.Id)}};oe(t);for(let se of M)delete y.menus[se];for(let[se,he]of Object.entries(y.menuButtons))M.has(he.moduleId)&&delete y.menuButtons[se];for(let[se,he]of Object.entries(y.menuScripts))M.has(he.moduleId)&&delete y.menuScripts[se]}let ie=async(M,oe)=>{I++,g.report({message:`[${I}/${u.length}] ${M.Name||M.Label}`});let se=M.Label||M.Name||M.Id,he=P.join(oe,ee(`${se}\uFF08${M.Id}\uFF09`));Ce(he);let Me=G(Q.get(M.Id)||[]);if(Me.length>0){for(let ye of Me)await ie(ye,he);return}let At=await a.get(z.GET_MODULE,{osClient:l,moduleId:M.Id},c,e);if(At.Code!==1){this.log(` \u8DF3\u8FC7\u6A21\u5757 ${M.Name}: ${At.Msg}`);return}let er=At.Data,Ze=String(er.UpdateTime||Pe()),Qr={};for(let ye of F){let gn=String(er[ye]||""),tr=Vt[ye]||ye,et=P.join(he,ee(`${tr}\uFF08${ye}\uFF09`)+".js");E.writeFileSync(et,gn,"utf-8"),this.touchSyncedFile(et,Ze),y.menuScripts[this.getMenuScriptMetaKey(M.Id,ye)]={moduleId:M.Id,moduleName:se,scriptField:ye,codeHash:this.sourceHash(gn),updateTime:Ze,filePath:P.relative(i.getWorkspaceRoot(),et)},T++}for(let ye of B){let gn=yt[ye]||ye,tr=ee(`${gn}\uFF08${ye}\uFF09`),et=P.join(he,tr);Ce(et),L++;let pn=er[ye],lt=[];if(pn)try{lt=typeof pn=="string"?JSON.parse(pn):pn,Array.isArray(lt)||(lt=[])}catch{this.log(` \u6309\u94AE JSON \u89E3\u6790\u5931\u8D25 ${M.Name}.${ye}`),lt=[]}let Ji=[...lt].sort((dt,Ae)=>String(dt.Id||"").localeCompare(String(Ae.Id||"")));Qr[ye]=require("crypto").createHash("sha1").update(JSON.stringify(Ji)).digest("hex");for(let dt of lt){let Ae=String(dt.Id||""),fn=String(dt.Name||Ae||"Unknown");if(!Ae)continue;let Xr=String(dt.V8Code||""),nr=P.join(et,ee(`${fn}\uFF08${Ae}\uFF09`)+".js");y.menuButtons[this.getMenuButtonMetaKey(M.Id,ye,Ae,"V8Code")]={moduleId:M.Id,moduleName:se,btnField:ye,btnId:Ae,btnName:fn,v8SubField:"V8Code",updateTime:Ze,filePath:P.relative(i.getWorkspaceRoot(),nr)},Xr.trim()?(E.writeFileSync(nr,Xr,"utf-8"),this.touchSyncedFile(nr,Ze),D++):x++;let Zr=String(dt.V8CodeShow||"");if(Zr.trim()){let rr=P.join(et,ee(`${fn}_\u663E\u9690\u5224\u65AD\uFF08${Ae}\uFF09`)+".js");E.writeFileSync(rr,Zr,"utf-8"),this.touchSyncedFile(rr,Ze),y.menuButtons[this.getMenuButtonMetaKey(M.Id,ye,Ae,"V8CodeShow")]={moduleId:M.Id,moduleName:se,btnField:ye,btnId:Ae,btnName:fn,v8SubField:"V8CodeShow",updateTime:Ze,filePath:P.relative(i.getWorkspaceRoot(),rr)},D++}else x++}}y.menus[M.Id]={moduleId:M.Id,moduleName:se,updateTime:Ze,buttonHashes:Qr}};Ce(v);for(let M of re)await ie(M,v);this.saveMeta(y,h),this.log(`\u6A21\u5757\u4EE3\u7801\u62C9\u53D6\u5B8C\u6210: ${D} \u4E2A\u6309\u94AEV8\u6587\u4EF6\uFF0C${T} \u4E2A Join/Where \u6587\u4EF6\uFF0C${L} \u4E2A\u6309\u94AE\u76EE\u5F55\uFF0C\u8DF3\u8FC7\u7A7A\u6309\u94AE\u4EE3\u7801 ${x} \u9879`),V.info(`Microi: \u6210\u529F\u62C9\u53D6 ${D} \u4E2A\u6309\u94AEV8\u6587\u4EF6\u548C ${T} \u4E2A Join/Where \u6587\u4EF6${x>0?`\uFF08\u8DF3\u8FC7 ${x} \u4E2A\u7A7A\u6309\u94AE\u4EE3\u7801\uFF09`:""}\uFF0C\u5DF2\u751F\u6210 ${L} \u4E2A\u6309\u94AE\u76EE\u5F55`)})}backupExistingTree(e,t,n){if(!E.existsSync(e))return;let o=N.getInstance().getSyncRootDir();this.ensureSyncGitExcludes(o);let i=P.join(o,".backups",n,this.shortBackupKey(t));Ce(i);let a=P.join(i,`${Date.now()}-${this.shortBackupKey(P.basename(e))}`);E.renameSync(e,a)}backupAndDeleteSyncFile(e,t,n){if(!E.existsSync(e))return;let r=N.getInstance(),o=r.getSyncRootDir();this.ensureSyncGitExcludes(o);let i=r.getWorkspaceRoot()||o,c=P.relative(i,e).split(P.sep).filter(d=>d&&d!=="..").map(ee),l=P.join(o,".backups",n,this.shortBackupKey(t),String(Date.now())),g=P.join(l,...c.length?c:[ee(P.basename(e))]);Ce(P.dirname(g)),E.copyFileSync(e,g),E.unlinkSync(e)}async pushMenuScriptFile(e,t,n){let r=j.getInstance(),o=Ue(E.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u6A21\u5757\u811A\u672C: ${t.moduleId}.${t.scriptField}...`);try{let i=await r.get(z.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n);if(i.Code!==1||!i.Data)return V.error(`Microi: \u63A8\u9001\u5931\u8D25 - \u62C9\u53D6\u6A21\u5757\u5931\u8D25 ${i.Msg}`),!1;let a=i.Data,c=String(a[t.scriptField]||""),l=N.getInstance(),g=l.getSyncRootDir();this.ensureSyncGitExcludes(g);let d=P.join(g,".backups","menu-script",this.shortBackupKey(t.serverDir),t.moduleId);Ce(d),E.writeFileSync(P.join(d,`${t.scriptField}-${Date.now()}.js`),c,"utf-8");let u={OsClient:t.osClient,ModuleId:t.moduleId,[t.scriptField]:o},p=await r.post(z.UPDATE_MODULE,u,void 0,n?.apiBaseUrl,n);if(p.Code!==1)return V.error(`Microi: \u63A8\u9001\u6A21\u5757 ${t.scriptField} \u5931\u8D25 - ${p.Msg}`),!1;let f=await r.get(z.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n),m=f.Data;if(f.Code!==1||!m||this.normalizeCode(String(m[t.scriptField]||""))!==this.normalizeCode(o))return V.error(`Microi: ${t.scriptField} \u63A5\u53E3\u8FD4\u56DE\u6210\u529F\uFF0C\u4F46\u8FDC\u7AEF\u56DE\u8BFB\u4E0D\u4E00\u81F4\uFF1B\u5DF2\u4FDD\u7559\u672C\u5730\u4FEE\u6539\u548C\u8FDC\u7AEF\u5907\u4EFD`),!1;let S=String(m.UpdateTime||p.Data?.UpdateTime||Pe()),C=this.loadMeta(t.serverDir);return C.menuScripts||(C.menuScripts={}),C.menuScripts[this.getMenuScriptMetaKey(t.moduleId,t.scriptField)]={moduleId:t.moduleId,moduleName:String(m.Label||m.Name||a.Label||a.Name||t.moduleId),scriptField:t.scriptField,codeHash:this.sourceHash(o),updateTime:S,filePath:P.relative(l.getWorkspaceRoot(),e)},C.menus||(C.menus={}),C.menus[t.moduleId]={moduleId:t.moduleId,moduleName:String(m.Label||m.Name||a.Label||a.Name||t.moduleId),updateTime:S,buttonHashes:C.menus[t.moduleId]?.buttonHashes||{}},this.saveMeta(C,t.serverDir),this.touchSyncedFile(e,S),this.log(`\u63A8\u9001\u5E76\u56DE\u8BFB\u6210\u529F: ${t.moduleId}.${t.scriptField}`),!0}catch(i){let a=i instanceof Error?i.message:String(i);return this.log(`\u63A8\u9001\u6A21\u5757\u811A\u672C\u5F02\u5E38: ${a}`),V.error(`Microi: \u63A8\u9001\u6A21\u5757\u811A\u672C\u5F02\u5E38 - ${a}`),!1}}async pushMenuButtonFile(e,t,n){let r=j.getInstance(),o=Ue(E.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u6309\u94AEV8\u4EE3\u7801: ${t.moduleId}.${t.btnField}.${t.btnId}.${t.v8SubField}...`);try{let i=await r.get(z.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n);if(i.Code!==1)return V.error(`Microi: \u63A8\u9001\u5931\u8D25 - \u62C9\u53D6\u6A21\u5757\u5931\u8D25 ${i.Msg}`),!1;let a=i.Data,c=[],l=a[t.btnField];if(l)try{c=typeof l=="string"?JSON.parse(l):l,Array.isArray(c)||(c=[])}catch{return V.error("Microi: \u63A8\u9001\u5931\u8D25 - \u6309\u94AE JSON \u89E3\u6790\u5931\u8D25"),!1}let d=N.getInstance().getSyncRootDir();this.ensureSyncGitExcludes(d);let u=P.join(d,".backups","menu-button-json",this.shortBackupKey(t.serverDir),t.moduleId);Ce(u);let p=P.join(u,`${t.btnField}-${Date.now()}.json`);E.writeFileSync(p,JSON.stringify(c,null,2),"utf-8");let f=c.find(C=>String(C.Id||"")===t.btnId);if(!f){let C=c.map(h=>Number(h.Sort||0)).filter(h=>!isNaN(h));f={Id:t.btnId,Name:t.btnName||t.btnId,Sort:C.length>0?Math.max(...C)+1:c.length+1,IsVisible:!0,ShowRow:t.btnField==="MoreBtns"},c.push(f)}f[t.v8SubField]=o;let m={OsClient:t.osClient,ModuleId:t.moduleId};m[t.btnField]=JSON.stringify(c);let S=await r.post(z.UPDATE_MODULE,m,void 0,n?.apiBaseUrl,n);if(S.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.moduleId}.${t.btnField}.${t.btnId}.${t.v8SubField}`);let C=S.Data?.UpdateTime||Pe(),h=this.loadMeta(t.serverDir);h.menuButtons||(h.menuButtons={});let y=this.getMenuButtonMetaKey(t.moduleId,t.btnField,t.btnId,t.v8SubField);return o.trim()?h.menuButtons[y]={moduleId:t.moduleId,moduleName:String(a.Name||a.Label||t.moduleId),btnField:t.btnField,btnId:t.btnId,btnName:String(f.Name||t.btnName||t.btnId),v8SubField:t.v8SubField,updateTime:C,filePath:P.relative(N.getInstance().getWorkspaceRoot(),e)}:delete h.menuButtons[y],h.menus||(h.menus={}),h.menus[t.moduleId]={moduleId:t.moduleId,moduleName:String(a.Name||a.Label||t.moduleId),updateTime:C,buttonHashes:h.menus[t.moduleId]?.buttonHashes||{}},this.saveMeta(h,t.serverDir),o.trim()?this.touchSyncedFile(e,C):E.existsSync(e)&&E.unlinkSync(e),!0}return V.error(`Microi: \u63A8\u9001\u6309\u94AE\u5931\u8D25 - ${S.Msg}`),!1}catch(i){let a=i instanceof Error?i.message:String(i);return this.log(`\u63A8\u9001\u5F02\u5E38: ${a}`),V.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${a}`),!1}}async pushWorkflowNodeFile(e,t,n){let r=j.getInstance(),o=E.readFileSync(e,"utf-8"),i=Ue(o);this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8: ${t.flowDesignId}/${t.nodeId}/${t.eventType}...`);try{let a="",c="";try{let p=await r.post(z.GET_WORKFLOW_V8_EVENT_CODE,{OsClient:t.osClient,FlowDesignId:t.flowDesignId,NodeId:t.nodeId,EventType:t.eventType},void 0,n?.apiBaseUrl,n);p.Code===1&&p.Data&&(a=p.Data.V8Code||p.Data.Code||"",c=p.Data.Version||"")}catch{a="",c=""}let l=!i.trim(),g=l?{code:"",version:c,changeHistory:""}:Xt({kind:"Workflow",key:`${t.flowDesignId}/${t.nodeId}`,eventType:t.eventType,currentCode:i,remoteCode:a,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001\u6D41\u7A0B\u8282\u70B9 V8 ${t.flowDesignId}/${t.nodeId}/${t.eventType}`}),d={OsClient:t.osClient,FlowDesignId:t.flowDesignId,NodeId:t.nodeId,EventType:t.eventType};l?d.V8Code="":(d.V8CodeBase64=Buffer.from(g.code,"utf8").toString("base64"),d.Version=g.version,d.ChangeHistory=g.changeHistory);let u=await r.post(z.UPDATE_WORKFLOW_V8_EVENT_CODE,d,void 0,n?.apiBaseUrl,n);if(u.Code===1){let p=u.Data?.UpdateTime||Pe(),f=this.loadMeta(t.serverDir);f.workflowNodeEvents||(f.workflowNodeEvents={});let m=`${t.flowDesignId}__${t.nodeId}__${t.eventType}`;return l?delete f.workflowNodeEvents[m]:f.workflowNodeEvents[m]={flowDesignId:t.flowDesignId,flowName:f.workflowNodeEvents[m]?.flowName||t.flowDesignId,nodeId:t.nodeId,nodeName:f.workflowNodeEvents[m]?.nodeName||t.nodeId,eventType:t.eventType,updateTime:p,filePath:P.relative(N.getInstance().getWorkspaceRoot(),e)},this.saveMeta(f,t.serverDir),l?E.existsSync(e)&&E.unlinkSync(e):(E.writeFileSync(e,g.code,"utf-8"),this.touchSyncedFile(e,p)),this.log(`\u63A8\u9001\u6210\u529F: ${t.flowDesignId}/${t.nodeId}/${t.eventType}`),!0}return this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5931\u8D25: ${u.Msg}`),V.error(`Microi: \u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5931\u8D25 - ${u.Msg}`),!1}catch(a){let c=a instanceof Error?a.message:String(a);return this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5F02\u5E38: ${c}`),V.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async pullDbSchema(e){let t=N.getInstance(),n=j.getInstance();if(!e){let r=t.getProfiles();if(r.length===0){V.warn("Microi: \u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u670D\u52A1\u5668");return}for(let o of r)try{await this.pullDbSchemaForProfile(o)}catch(i){let a=i instanceof Error?i.message:String(i);this.log(`\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5931\u8D25 [${o.label||o.apiBaseUrl}]: ${a}`)}return}await this.pullDbSchemaForProfile(e)}async pullDbSchemaForProfile(e){let t=N.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,o=e.osClient;this.log(`\u5F00\u59CB\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784 [${e.label||r}]...`);let i=await n.get(z.GET_DB_SCHEMA,{osClient:o},r,e);if(i.Code!==1){let _=i.Code===1001||i.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5931\u8D25: ${i.Msg||"Code="+i.Code}${_}`)}let a=t.getSyncRootDir(),l=await ke.getInstance().getSysConfig(r,o),g=l?.SysShortTitle||"",d=l?.SysTitle||"",u=g||d||l?.CompanyName||e.label||"";u&&(u!==e.label||g!==e.sysShortTitle||d!==e.sysTitle)&&await t.addProfile({...e,label:u,sysShortTitle:g,sysTitle:d});let p=t.buildServerDirName(u,r),m=t.getProfiles().find(_=>_.apiBaseUrl===e.apiBaseUrl&&_.osClient===e.osClient)||e,S=t.buildOsClientDirName(o,m.osClientType,m.osClientNetwork),C=P.join(a,p,S);Ce(C);let h=P.join(C,St);E.writeFileSync(h,JSON.stringify(i.Data,null,2),"utf-8");let y=P.join(C,nt),w=this.formatDbSchemaMarkdown(i.Data,p,S);w&&E.writeFileSync(y,w,"utf-8");let k=i.Data.Tables?.length||0,b=u||e.label||r;this.log(`[${b}] \u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5B8C\u6210: ${k} \u5F20\u8868`),V.info(`Microi: [${b}] \u6210\u529F\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\uFF08${k} \u5F20\u8868\uFF09`)}formatDbSchemaMarkdown(e,t,n){let r=(e.Tables||[]).filter(c=>c.Name);if(!r.length)return"";let o=r.reduce((c,l)=>{let g=l._Fields||l.Fields||[];return c+g.length},0),i=e.Menus?.length||0,a=[];a.push(`# \u6570\u636E\u5E93\u7ED3\u6784 \u2014 ${t}/${n}
|
|
49
|
+
`),a.push("> \u6B64\u6587\u4EF6\u7531 Microi\u543E\u7801 VS Code \u63D2\u4EF6\u81EA\u52A8\u751F\u6210\uFF0C\u4F9B AI \u7F16\u5199 V8.FormEngine / V8.Db \u4EE3\u7801\u65F6\u53C2\u8003\u3002"),a.push(`> \u5171 ${r.length} \u5F20\u8868\uFF0C${o} \u4E2A\u5B57\u6BB5\uFF0C${i} \u4E2A\u83DC\u5355\u3002
|
|
50
50
|
`);for(let c of r){let l=c.Description?` \u2014 ${c.Description}`:"";a.push(`## ${c.Name}${l}
|
|
51
51
|
`);let g=c._Fields||c.Fields||[];if(!g.length){a.push(`_\u6682\u65E0\u5B57\u6BB5\u4FE1\u606F._
|
|
52
|
-
`);continue}a.push("| \u5B57\u6BB5 | \u6807\u7B7E/\u8BF4\u660E | \u7C7B\u578B | \u7EC4\u4EF6 | \u5FC5\u586B | \u5173\u8054 |"),a.push("|------|-----------|------|------|------|------|");for(let d of g){let u=d.Label||d.Description||"",p=d.Type||d.FieldType||"",
|
|
53
|
-
`)}dispose(){}};var D=$(require("fs")),A=$(require("path")),br=$(require("crypto")),Er=require("child_process");var In="<!-- microi-ai-routing:begin -->",qt="<!-- microi-ai-routing:end -->";function Dn(){return'## Microi \u5DE5\u4F5C\u533A\u5F3A\u5236\u89C4\u5219\u552F\u4E00\u6765\u6E90\n\n\u7528\u6237\u5728\u5DF2\u521D\u59CB\u5316\u543E\u7801\u5DE5\u4F5C\u533A\u4E2D\u76F4\u63A5\u63CF\u8FF0\u9700\u6C42\u5373\u53EF\uFF0C\u65E0\u9700\u7528\u6237\u6307\u5B9A Skill \u540D\u79F0\u3002\u8D28\u91CF\u548C\u6B63\u786E\u6027\u4F18\u5148\uFF1B\u8282\u7701 token \u53EA\u51CF\u5C11\u65E0\u5173\u8D44\u6599\u3001\u91CD\u590D\u8BFB\u53D6\u548C\u91CD\u590D\u56DE\u6267\uFF0C\u4E0D\u80FD\u7701\u7565\u5FC5\u8981\u5206\u6790\u3001\u5B9E\u73B0\u6216\u9A8C\u6536\u3002\n\n1. \u6BCF\u6B21\u65B0\u5BF9\u8BDD\u6216\u63A5\u7EED Microi \u4EFB\u52A1\uFF0C\u5148\u5B8C\u6574\u8BFB\u53D6 `microi.skills/workspace-conventions/SKILL.md`\uFF1B\u6267\u884C\u5176\u4E2D\u7684\u521B\u59CB\u4EBA\u8EAB\u4EFD\u8BC6\u522B\u3001\u5E73\u53F0\u529F\u80FD\u56DB\u9879\u540C\u6B65\u68C0\u67E5\uFF08\u5E94\u7528\u5546\u57CE\u3001\u5B98\u65B9\u6587\u6863\u3001Skills\u3001MCP\uFF09\u3001\u7248\u672C\u68C0\u67E5\u3001\u975E\u963B\u585E\u81EA\u52A8\u5347\u7EA7\u53CA\u8FDB\u5EA6\u64AD\u62A5\u3002\n2. \u968F\u540E\u8BFB\u53D6 `microi.skills/microi-system-delivery/SKILL.md` \u5224\u5B9A\u4EFB\u52A1\u8303\u56F4\u3002\u5B8C\u6574\u7CFB\u7EDF\u5FC5\u987B\u5B8C\u6574\u8BFB\u53D6 `microi.skills/microi-system-delivery/references/progressive-01-\u6807\u51C6\u5DE5\u4F5C\u6D41.md` \u4E2D\u7684\u539F 1\u20138 \u53CA\u540E\u7EED\u589E\u8865\uFF0C\u5E76\u6309\u603B\u63A7\u8DEF\u7531\u5B8C\u6574\u8BFB\u53D6\u76F8\u5173\u4E13\u9879 Skills\uFF1B\u5B8C\u6574\u7CFB\u7EDF\u9010\u9879\u6267\u884C\u5168\u90E8\u6E05\u5355\u548C\u589E\u8865\uFF0C\u4E0D\u80FD\u964D\u4E3A\u6837\u4F8B\u3001\u65B9\u6848\u6216\u5F85\u529E\u3002\u5C40\u90E8\u4FEE\u6539\u8BFB\u53D6\u8D28\u91CF\u89C4\u8303\u3001\u76F8\u5173\u6761\u76EE\u548C\u76EE\u6807\u4F9D\u8D56\u6D89\u53CA\u7684\u4E13\u9879\uFF1B\u8303\u56F4\u4E0D\u660E\u65F6\u6269\u5927\u8BFB\u53D6\uFF0C\u65E0\u6CD5\u6392\u9664\u65B0\u7CFB\u7EDF\u610F\u56FE\u65F6\u6309\u5B8C\u6574\u7CFB\u7EDF\u5904\u7406\u3002\u53EA\u8BFB\u5206\u6790\u4E0D\u521B\u5EFA\u3001\u5199\u5165\u6216\u53D1\u5E03\u8D44\u6E90\u3002\n3. \u5B9E\u73B0\u524D\u5148\u62A5\u544A\u5DF2\u8BFB\u53D6\u7684\u6587\u4EF6\u8DEF\u5F84\u53CA\u672C\u6B21\u9002\u7528\u7684\u4EA4\u4ED8\u6E05\u5355\uFF1B\u4E0A\u4E0B\u6587\u53D6\u820D\u8BFB\u53D6 `microi.skills/microi-system-delivery/references/context-quality.md`\u3002\u7F3A\u5C11\u5165\u53E3\u6216\u4E13\u9879 Skill \u65F6\u6309 `microi.skills/microi-codex-installer/SKILL.md` \u6062\u590D\uFF1B\u672A\u8BFB\u53D6\u5B8C\u6574\u6B63\u6587\u65F6\u4E0D\u80FD\u58F0\u79F0\u5DF2\u81EA\u52A8\u52A0\u8F7D\u3002\u9700\u8981\u67E5\u627E\u80FD\u529B\u65F6\u5148\u68C0\u7D22 `microi.skills/README.md`\uFF0C\u4E0D\u4E00\u6B21\u52A0\u8F7D\u6240\u6709 Skills\u3002\n4. \u9996\u6B21\u4EE5\u201CMicroi\u543E\u7801\u5F00\u53D1\u5DE5\u5177\u7248\u672C\u201D\u62A5\u544A\u5B9E\u9645\u4E0E\u5B98\u65B9\u7248\u672C\u3001\u81EA\u52A8\u66F4\u65B0\u548C\u540C\u6B65\u72B6\u6001\uFF1B\u5DF2\u6709 CLI \u65F6\u5FC5\u987B\u6295\u9012 `microi update --background --workspace "<\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84>" --json`\uFF0C\u4E0D\u7B49\u5F85\u66F4\u65B0\u5B8C\u6210\uFF0C\u4FDD\u6301\u5F53\u524D\u3001\u6B63\u5728\u8FDB\u884C\u548C\u65B0\u5EFA\u5DE5\u4F5C\u7EE7\u7EED\u6267\u884C\u3002\u7248\u672C\u67E5\u8BE2\u3001\u5931\u8D25\u5EF6\u540E\u53CA\u5B8C\u6574\u540C\u6B65\u8981\u6C42\u4EE5\u57FA\u7840\u89C4\u8303\u4E3A\u51C6\u3002\n5. **\u6BCF\u6B21\u4FEE\u6539\u5DF2\u6709\u5FAE\u670D\u52A1\u4E4B\u524D**\uFF08\u542B\u63A5\u7EED\u4EFB\u52A1\u548C\u7D27\u6025\u4FEE\u590D\uFF09\uFF0C\u5B8C\u6574\u8BFB\u53D6 `microi.skills/microi-microservice/SKILL.md`\uFF1B\u91CD\u65B0\u62C9\u53D6\u5F53\u524D\u79DF\u6237\u5168\u90E8\u79C1\u6709\u6E90\u7801\uFF0C\u4E0E\u672C\u5730\u9010\u6587\u4EF6\u6821\u9A8C\u5E76\u4E09\u65B9\u5408\u5E76\uFF0C\u6B63\u6587/\u54C8\u5E0C\u4E0D\u5168\u6216\u51B2\u7A81\u672A\u89E3\u51B3\u4E0D\u5F97\u7F16\u8F91\u3002\u8BB0\u5F55\u4FEE\u6539\u524D `SourceManifestHash`\uFF0C\u540C\u6B65\u663E\u5F0F\u4F20 `expectedSourceManifestHash`\uFF1B\u7981\u6B62\u53EA\u53D6\u65B0\u54C8\u5E0C\u91CD\u8BD5\u65E7\u4EE3\u7801\u3002\u53D1\u5E03\u524D\u518D\u6B21\u6838\u5BF9\uFF0C\u5E76\u4FDD\u7559\u5176\u5B83\u9875\u9762\u53CA\u517C\u5BB9\u7EC4\u4EF6\u8DEF\u5F84\u3002\n\n## \u5F53\u524D\u5BF9\u8BDD MCP \u5165\u53E3\n\n\u5148\u53D1\u73B0\u5BBF\u4E3B\u5B9E\u9645\u5DE5\u5177\uFF1A\u652F\u6301\u7EDF\u4E00\u5165\u53E3 `microi_codex`\uFF08\u5148 `profiles`\uFF0C\u518D\u56FA\u5B9A `profile`\uFF09\uFF0C\u4E5F\u652F\u6301\u539F\u59CB `microi_*`\uFF1B\u4E0D\u80FD\u4EC5\u51ED\u524D\u7F00\u7F3A\u5931\u8BA4\u5B9A\u672A\u6CE8\u518C\u3002\u914D\u7F6E\u5B58\u5728\u4E0D\u7B49\u4E8E\u5F53\u524D\u4F1A\u8BDD\u5DF2\u6CE8\u5165\uFF0C\u4E0D\u628A WorkBuddy \u8BEF\u79F0\u5343\u95EE\u5DE5\u4F5C\u52A9\u7406\u3002\u4EC5\u5F53\u4F1A\u8BDD\u6CA1\u6709\u53EF\u7528\u5165\u53E3\u4E14\u7EC8\u7AEF\u83B7\u51C6\u65F6\uFF0C\u8BFB\u53D6\u5B89\u88C5 Skill\uFF0C\u5E76\u5728\u5F53\u524D\u5BF9\u8BDD\u7EE7\u7EED\u4F7F\u7528\u5B98\u65B9 CLI\uFF1A`microi profile list --workspace "<\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84>" --json`\uFF0C\u6309\u5B8C\u6574\u79DF\u6237\u5750\u6807\u552F\u4E00\u9009\u53D6 `mcpName`\uFF1B`microi mcp tools --profile <mcpName> --workspace "<\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84>" --json`\uFF1B`microi mcp call microi_get_status --params-stdin --profile <mcpName> --workspace "<\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84>" --json`\uFF08\u6807\u51C6\u8F93\u5165 `{}`\uFF09\u3002\u540E\u7EED\u6309\u5B9E\u65F6 Schema \u8C03\u7528\u539F\u5DE5\u5177\uFF0C\u4FDD\u7559\u6743\u9650\u3001\u786E\u8BA4\u548C\u5199\u540E\u56DE\u8BFB\uFF1B\u4E0D\u624B\u5199 stdio \u6865\u63A5\u3001\u4E0D\u786C\u7F16\u7801\u5DE5\u5177\u6570\u91CF\u3001\u4E0D\u6539\u8D70 HTTP/SQL\u3002\u767B\u5F55\u5931\u8D25\u3001\u6743\u9650\u62D2\u7EDD\u6216\u5BBF\u4E3B\u660E\u786E\u7981\u6B62\u65F6\u4E0D\u5F97\u6362\u5165\u53E3\u7ED5\u8FC7\uFF1BCLI \u6210\u529F\u4E0D\u4EE3\u8868\u5BBF\u4E3B\u70ED\u52A0\u8F7D\uFF0C\u4E0D\u8981\u6C42\u7ACB\u5373\u65B0\u5F00\u4F1A\u8BDD\u624D\u80FD\u7EE7\u7EED\u3002\n\n## \u6309\u76EE\u6807\u4E0E\u4F9D\u8D56\u8BFB\u53D6\n\n- \u521B\u5EFA\u6216\u4FEE\u6539\u543E\u7801\u5FAE\u670D\u52A1\u9875\u9762\u6216\u79FB\u52A8\u7AEF\u9875\u9762\u65F6\uFF0C\u9ED8\u8BA4\u4F7F\u7528\u543E\u7801 UI Skills\uFF0C\u65E0\u9700\u7528\u6237\u6307\u5B9A Skill \u540D\u79F0\u3002\u5B9E\u73B0\u524D\u5B8C\u6574\u8BFB\u53D6 `microi.skills/microi-ui/SKILL.md` \u548C `microi.skills/ui-design/SKILL.md`\uFF0C\u6309\u9875\u9762\u4EFB\u52A1\u8BFB\u53D6\u5176\u4E2D\u7684\u8BBE\u8BA1\u5951\u7EA6\u3001\u4EA4\u4E92\u548C\u9A8C\u6536\u89C4\u8303\u3002\n- \u5FAE\u670D\u52A1\u9875\u9762\u53E6\u5B8C\u6574\u8BFB\u53D6 `microi.skills/microi-microservice/SKILL.md`\u3002\u79FB\u52A8\u7AEF\u9875\u9762\uFF08UniApp\u3001H5\u3001App\u3001\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F\uFF09\u53E6\u5B8C\u6574\u8BFB\u53D6 `microi.skills/microi-uniapp-frontend/SKILL.md` \u548C `microi.skills/microi-mobile-app-quality/SKILL.md`\u3002\n- \u5C40\u90E8\u4FEE\u6539\u5148\u786E\u8BA4\u76EE\u6807\u5E94\u7528\u3001\u6587\u4EF6\u3001\u8868\u6216\u63A5\u53E3\u53CA\u76F4\u63A5\u4F9D\u8D56\uFF1B\u5148\u53D6\u76EE\u5F55\u3001\u5143\u6570\u636E\u548C\u7248\u672C\uFF0C\u518D\u8BFB\u53D6\u76EE\u6807\u6B63\u6587\u4E0E\u53D7\u5F71\u54CD\u4F9D\u8D56\u3002\u8303\u56F4\u4E0D\u6E05\u3001\u8BC1\u636E\u4E0D\u8DB3\u3001\u6743\u9650\u6216\u5173\u8054\u5173\u7CFB\u590D\u6742\u65F6\u6269\u5927\u68C0\u7D22\u4E0E\u8BFB\u53D6\uFF0C\u4E0D\u80FD\u51ED\u731C\u6D4B\u4FEE\u6539\uFF0C\u4E5F\u4E0D\u80FD\u56E0\u9884\u7B97\u786C\u622A\u65AD\u5FC5\u8981\u4E0A\u4E0B\u6587\u3002\n- \u5B9A\u5236\u524D\u7AEF\u3001\u6E38\u620F\u3001\u7B97\u6CD5\u6216\u786C\u4EF6\u4EFB\u52A1\uFF0C\u6309\u9700\u8BFB\u53D6\u6700\u5C0F\u76F8\u5173 SDK\u3001\u811A\u624B\u67B6\u3001\u6A21\u677F\u548C\u534F\u8BAE\uFF1A\u524D\u7AEF\u4F18\u5148 `microi-frontend-sdk` / \u5BF9\u5E94\u5E94\u7528 Skill\uFF0CUnity \u4F7F\u7528 `unity-integration`\uFF0CTCP/\u6D88\u606F\u8BBE\u5907\u4F7F\u7528\u5BF9\u5E94\u96C6\u6210 Skill\uFF1B\u7531\u4F9D\u8D56\u5206\u6790\u51B3\u5B9A\u662F\u5426\u7EE7\u7EED\u8BFB\u53D6\u8868\u5355\u3001\u6A21\u5757\u3001V8\u3001\u6570\u636E\u5E93\u7B49\u5E73\u53F0\u77E5\u8BC6\u3002\n- V8 \u65B9\u6CD5\u548C\u7B7E\u540D\u6309\u9700\u8BFB\u53D6\u8D23\u4EFB Skill \u53CA\u540C\u6B65\u76EE\u5F55\u7684\u7C7B\u578B\u5B9A\u4E49\uFF1B\u6570\u636E\u5E93\u4EE5\u5F53\u524D\u79DF\u6237 MCP \u5B9E\u65F6\u7ED3\u6784\u4E3A\u51C6\uFF0C\u67E5\u8BE2\u65F6\u6536\u7A84\u5230\u76EE\u6807\u53CA\u4F9D\u8D56\uFF0C\u7ED3\u6784\u53D8\u5316\u540E\u91CD\u65B0\u56DE\u8BFB\u3002\u6E90\u7801\u6E05\u5355\u3001\u6458\u8981\u3001\u7F13\u5B58\u6216\u622A\u65AD\u8F93\u51FA\u4E0D\u80FD\u5192\u5145\u5DF2\u8BFB\u5B8C\u6574\u6B63\u6587\uFF1B\u4FEE\u6539\u524D\u5FC5\u987B\u8BFB\u5168\u88AB\u4FEE\u6539\u7684\u6E90\u7801\u5E76\u6838\u5BF9\u7248\u672C\u3002\n- \u9274\u6743\u3001\u79DF\u6237\u9694\u79BB\u3001\u6743\u9650\u3001\u4E8B\u52A1\u3001\u5E42\u7B49\u3001\u51B2\u7A81\u4FDD\u62A4\u3001\u771F\u5B9E\u4E1A\u52A1\u6D4B\u8BD5\u548C\u5199\u540E\u56DE\u8BFB\u59CB\u7EC8\u4FDD\u7559\uFF1B\u4E0D\u628A\u9ED8\u8BA4\u8BFB\u53D6\u6269\u5F20\u4E3A\u751F\u4EA7\u5199\u5165\u6216\u5BA2\u6237\u81EA\u52A8\u90E8\u7F72\u3002\u5DE5\u5177\u7ED3\u679C\u4E0D\u786E\u5B9A\u65F6\u5148\u56DE\u8BFB\uFF0C\u4E0D\u80FD\u76F2\u76EE\u91CD\u8BD5\u5199\u5165\u3002\n- \u8BE6\u7EC6\u89C4\u5219\u53EA\u7EF4\u62A4\u5728\u4E0A\u8FF0 Skills\uFF1B\u9ED8\u8BA4\u4F7F\u7528\u7B80\u4F53\u4E2D\u6587\uFF0C\u6700\u7EC8\u62A5\u544A\u5B9E\u9645\u6539\u52A8\u3001\u9A8C\u8BC1\u7ED3\u679C\u4E0E\u672A\u8986\u76D6\u8FB9\u754C\uFF0C\u907F\u514D\u91CD\u590D\u8F93\u51FA\u672A\u6539\u53D8\u7684\u5168\u6587\u3002\n'}function Rn(s){return`${In}
|
|
52
|
+
`);continue}a.push("| \u5B57\u6BB5 | \u6807\u7B7E/\u8BF4\u660E | \u7C7B\u578B | \u7EC4\u4EF6 | \u5FC5\u586B | \u5173\u8054 |"),a.push("|------|-----------|------|------|------|------|");for(let d of g){let u=d.Label||d.Description||"",p=d.Type||d.FieldType||"",f=d.Required===!0||d.NotEmpty===1?"\u662F":"",m=d.ChildTableId||d.ChildSysMenuId||"";a.push(`| ${d.Name} | ${u} | ${p} | ${d.Component||""} | ${f} | ${m} |`)}a.push("")}return a.join(`
|
|
53
|
+
`)}dispose(){}};var R=O(require("fs")),A=O(require("path")),Ir=O(require("crypto")),Rr=require("child_process");var An="<!-- microi-ai-routing:begin -->",Zt="<!-- microi-ai-routing:end -->";function xn(){return'## Microi \u5DE5\u4F5C\u533A\u5F3A\u5236\u89C4\u5219\u552F\u4E00\u6765\u6E90\n\n\u7528\u6237\u5728\u5DF2\u521D\u59CB\u5316\u543E\u7801\u5DE5\u4F5C\u533A\u4E2D\u76F4\u63A5\u63CF\u8FF0\u9700\u6C42\u5373\u53EF\uFF0C\u65E0\u9700\u7528\u6237\u6307\u5B9A Skill \u540D\u79F0\u3002\u8D28\u91CF\u548C\u6B63\u786E\u6027\u4F18\u5148\uFF1B\u8282\u7701 token \u53EA\u51CF\u5C11\u65E0\u5173\u8D44\u6599\u3001\u91CD\u590D\u8BFB\u53D6\u548C\u91CD\u590D\u56DE\u6267\uFF0C\u4E0D\u80FD\u7701\u7565\u5FC5\u8981\u5206\u6790\u3001\u5B9E\u73B0\u6216\u9A8C\u6536\u3002\n\n1. \u6BCF\u6B21\u65B0\u5BF9\u8BDD\u6216\u63A5\u7EED Microi \u4EFB\u52A1\uFF0C\u5148\u5B8C\u6574\u8BFB\u53D6 `microi.skills/workspace-conventions/SKILL.md`\uFF1B\u6267\u884C\u5176\u4E2D\u7684\u521B\u59CB\u4EBA\u8EAB\u4EFD\u8BC6\u522B\u3001\u5E73\u53F0\u529F\u80FD\u56DB\u9879\u540C\u6B65\u68C0\u67E5\uFF08\u5E94\u7528\u5546\u57CE\u3001\u5B98\u65B9\u6587\u6863\u3001Skills\u3001MCP\uFF09\u3001\u7248\u672C\u68C0\u67E5\u3001\u975E\u963B\u585E\u81EA\u52A8\u5347\u7EA7\u53CA\u8FDB\u5EA6\u64AD\u62A5\u3002\n2. \u968F\u540E\u8BFB\u53D6 `microi.skills/microi-system-delivery/SKILL.md` \u5224\u5B9A\u4EFB\u52A1\u8303\u56F4\u3002\u5B8C\u6574\u7CFB\u7EDF\u5FC5\u987B\u5B8C\u6574\u8BFB\u53D6 `microi.skills/microi-system-delivery/references/progressive-01-\u6807\u51C6\u5DE5\u4F5C\u6D41.md` \u4E2D\u7684\u539F 1\u20138 \u53CA\u540E\u7EED\u589E\u8865\uFF0C\u5E76\u6309\u603B\u63A7\u8DEF\u7531\u5B8C\u6574\u8BFB\u53D6\u76F8\u5173\u4E13\u9879 Skills\uFF1B\u5B8C\u6574\u7CFB\u7EDF\u9010\u9879\u6267\u884C\u5168\u90E8\u6E05\u5355\u548C\u589E\u8865\uFF0C\u4E0D\u80FD\u964D\u4E3A\u6837\u4F8B\u3001\u65B9\u6848\u6216\u5F85\u529E\u3002\u5C40\u90E8\u4FEE\u6539\u8BFB\u53D6\u8D28\u91CF\u89C4\u8303\u3001\u76F8\u5173\u6761\u76EE\u548C\u76EE\u6807\u4F9D\u8D56\u6D89\u53CA\u7684\u4E13\u9879\uFF1B\u8303\u56F4\u4E0D\u660E\u65F6\u6269\u5927\u8BFB\u53D6\uFF0C\u65E0\u6CD5\u6392\u9664\u65B0\u7CFB\u7EDF\u610F\u56FE\u65F6\u6309\u5B8C\u6574\u7CFB\u7EDF\u5904\u7406\u3002\u53EA\u8BFB\u5206\u6790\u4E0D\u521B\u5EFA\u3001\u5199\u5165\u6216\u53D1\u5E03\u8D44\u6E90\u3002\n3. \u5B9E\u73B0\u524D\u5148\u62A5\u544A\u5DF2\u8BFB\u53D6\u7684\u6587\u4EF6\u8DEF\u5F84\u53CA\u672C\u6B21\u9002\u7528\u7684\u4EA4\u4ED8\u6E05\u5355\uFF1B\u4E0A\u4E0B\u6587\u53D6\u820D\u8BFB\u53D6 `microi.skills/microi-system-delivery/references/context-quality.md`\u3002\u7F3A\u5C11\u5165\u53E3\u6216\u4E13\u9879 Skill \u65F6\u6309 `microi.skills/microi-codex-installer/SKILL.md` \u6062\u590D\uFF1B\u672A\u8BFB\u53D6\u5B8C\u6574\u6B63\u6587\u65F6\u4E0D\u80FD\u58F0\u79F0\u5DF2\u81EA\u52A8\u52A0\u8F7D\u3002\u9700\u8981\u67E5\u627E\u80FD\u529B\u65F6\u5148\u68C0\u7D22 `microi.skills/README.md`\uFF0C\u4E0D\u4E00\u6B21\u52A0\u8F7D\u6240\u6709 Skills\u3002\n4. \u9996\u6B21\u4EE5\u201CMicroi\u543E\u7801\u5F00\u53D1\u5DE5\u5177\u7248\u672C\u201D\u62A5\u544A\u5B9E\u9645\u4E0E\u5B98\u65B9\u7248\u672C\u3001\u81EA\u52A8\u66F4\u65B0\u548C\u540C\u6B65\u72B6\u6001\uFF1B\u5DF2\u6709 CLI \u65F6\u5FC5\u987B\u6295\u9012 `microi update --background --workspace "<\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84>" --json`\uFF0C\u4E0D\u7B49\u5F85\u66F4\u65B0\u5B8C\u6210\uFF0C\u4FDD\u6301\u5F53\u524D\u3001\u6B63\u5728\u8FDB\u884C\u548C\u65B0\u5EFA\u5DE5\u4F5C\u7EE7\u7EED\u6267\u884C\u3002\u7248\u672C\u67E5\u8BE2\u3001\u5931\u8D25\u5EF6\u540E\u53CA\u5B8C\u6574\u540C\u6B65\u8981\u6C42\u4EE5\u57FA\u7840\u89C4\u8303\u4E3A\u51C6\u3002\n5. **\u6BCF\u6B21\u4FEE\u6539\u5DF2\u6709\u5FAE\u670D\u52A1\u4E4B\u524D**\uFF08\u542B\u63A5\u7EED\u4EFB\u52A1\u548C\u7D27\u6025\u4FEE\u590D\uFF09\uFF0C\u5B8C\u6574\u8BFB\u53D6 `microi.skills/microi-microservice/SKILL.md`\uFF1B\u91CD\u65B0\u62C9\u53D6\u5F53\u524D\u79DF\u6237\u5168\u90E8\u79C1\u6709\u6E90\u7801\uFF0C\u4E0E\u672C\u5730\u9010\u6587\u4EF6\u6821\u9A8C\u5E76\u4E09\u65B9\u5408\u5E76\uFF0C\u6B63\u6587/\u54C8\u5E0C\u4E0D\u5168\u6216\u51B2\u7A81\u672A\u89E3\u51B3\u4E0D\u5F97\u7F16\u8F91\u3002\u8BB0\u5F55\u4FEE\u6539\u524D `SourceManifestHash`\uFF0C\u540C\u6B65\u663E\u5F0F\u4F20 `expectedSourceManifestHash`\uFF1B\u7981\u6B62\u53EA\u53D6\u65B0\u54C8\u5E0C\u91CD\u8BD5\u65E7\u4EE3\u7801\u3002\u53D1\u5E03\u524D\u518D\u6B21\u6838\u5BF9\uFF0C\u5E76\u4FDD\u7559\u5176\u5B83\u9875\u9762\u53CA\u517C\u5BB9\u7EC4\u4EF6\u8DEF\u5F84\u3002\n\n## \u5F53\u524D\u5BF9\u8BDD MCP \u5165\u53E3\n\nWorkBuddy \u539F\u751F\u63A5\u5165\u5148\u6309\u5B8C\u6574\u79DF\u6237\u5750\u6807\u9009\u5B9A `mcpName`\uFF0C\u6267\u884C `microi ai init --host workbuddy --profile <mcpName> --workspace "<\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84>" --json` \u548C `microi doctor --host workbuddy --profile <mcpName> --workspace "<\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84>" --json`\u3002\u53EA\u6CE8\u518C\u9009\u5B9A\u8FDE\u63A5\uFF0C\u4FDD\u7559\u5176\u5B83\u8FDE\u63A5\u548C\u7981\u7528\u72B6\u6001\uFF1B\u5206\u522B\u6838\u9A8C\u539F\u751F\u914D\u7F6E\u3001\u4FE1\u4EFB/\u542F\u7528\u548C\u5F53\u524D\u5DE5\u5177\u8C03\u7528\u3002\u901A\u7528 doctor \u6216 CLI \u6210\u529F\u53EA\u80FD\u8BF4\u660E CLI \u901A\u9053\u53EF\u7528\u3001\u539F\u751F\u63A5\u5165\u5C1A\u672A\u786E\u8BA4\uFF1B`mcp-tool-list.json` \u662F\u7F13\u5B58\uFF0C\u4E0D\u53EF\u4F5C\u4E3A\u63A5\u5165\u8BC1\u660E\uFF0C\u4E0D\u4E3A\u4E0D\u5B58\u5728\u7684\u8FDE\u63A5\u8981\u6C42\u70B9\u4FE1\u4EFB\uFF0C\u4E0D\u6539\u5199\u5BBF\u4E3B\u5BA1\u6279\u8BB0\u5F55\u3002\n\n\u5148\u53D1\u73B0\u5BBF\u4E3B\u5B9E\u9645\u5DE5\u5177\uFF1A\u652F\u6301\u7EDF\u4E00\u5165\u53E3 `microi_codex`\uFF08\u5148 `profiles`\uFF0C\u518D\u56FA\u5B9A `profile`\uFF09\uFF0C\u4E5F\u652F\u6301\u539F\u59CB `microi_*`\uFF1B\u4E0D\u80FD\u4EC5\u51ED\u524D\u7F00\u7F3A\u5931\u8BA4\u5B9A\u672A\u6CE8\u518C\u3002\u914D\u7F6E\u5B58\u5728\u4E0D\u7B49\u4E8E\u5F53\u524D\u4F1A\u8BDD\u5DF2\u6CE8\u5165\uFF0C\u4E0D\u628A WorkBuddy \u8BEF\u79F0\u5343\u95EE\u5DE5\u4F5C\u52A9\u7406\u3002\u4EC5\u5F53\u4F1A\u8BDD\u6CA1\u6709\u53EF\u7528\u5165\u53E3\u4E14\u7EC8\u7AEF\u83B7\u51C6\u65F6\uFF0C\u8BFB\u53D6\u5B89\u88C5 Skill\uFF0C\u5E76\u5728\u5F53\u524D\u5BF9\u8BDD\u7EE7\u7EED\u4F7F\u7528\u5B98\u65B9 CLI\uFF1A`microi profile list --workspace "<\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84>" --json`\uFF0C\u6309\u5B8C\u6574\u79DF\u6237\u5750\u6807\u552F\u4E00\u9009\u53D6 `mcpName`\uFF1B`microi mcp tools --profile <mcpName> --workspace "<\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84>" --json`\uFF1B`microi mcp call microi_get_status --params-stdin --profile <mcpName> --workspace "<\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84>" --json`\uFF08\u6807\u51C6\u8F93\u5165 `{}`\uFF09\u3002\u540E\u7EED\u6309\u5B9E\u65F6 Schema \u8C03\u7528\u539F\u5DE5\u5177\uFF0C\u4FDD\u7559\u6743\u9650\u3001\u786E\u8BA4\u548C\u5199\u540E\u56DE\u8BFB\uFF1B\u4E0D\u624B\u5199 stdio \u6865\u63A5\u3001\u4E0D\u786C\u7F16\u7801\u5DE5\u5177\u6570\u91CF\u3001\u4E0D\u6539\u8D70 HTTP/SQL\u3002\u767B\u5F55\u5931\u8D25\u3001\u6743\u9650\u62D2\u7EDD\u6216\u5BBF\u4E3B\u660E\u786E\u7981\u6B62\u65F6\u4E0D\u5F97\u6362\u5165\u53E3\u7ED5\u8FC7\uFF1BCLI \u6210\u529F\u4E0D\u4EE3\u8868\u5BBF\u4E3B\u70ED\u52A0\u8F7D\uFF0C\u4E0D\u8981\u6C42\u7ACB\u5373\u65B0\u5F00\u4F1A\u8BDD\u624D\u80FD\u7EE7\u7EED\u3002\n\n## \u6309\u76EE\u6807\u4E0E\u4F9D\u8D56\u8BFB\u53D6\n\n- \u521B\u5EFA\u6216\u4FEE\u6539\u543E\u7801\u5FAE\u670D\u52A1\u9875\u9762\u6216\u79FB\u52A8\u7AEF\u9875\u9762\u65F6\uFF0C\u9ED8\u8BA4\u4F7F\u7528\u543E\u7801 UI Skills\uFF0C\u65E0\u9700\u7528\u6237\u6307\u5B9A Skill \u540D\u79F0\u3002\u5B9E\u73B0\u524D\u5B8C\u6574\u8BFB\u53D6 `microi.skills/microi-ui/SKILL.md` \u548C `microi.skills/ui-design/SKILL.md`\uFF0C\u6309\u9875\u9762\u4EFB\u52A1\u8BFB\u53D6\u5176\u4E2D\u7684\u8BBE\u8BA1\u5951\u7EA6\u3001\u4EA4\u4E92\u548C\u9A8C\u6536\u89C4\u8303\u3002\n- \u5FAE\u670D\u52A1\u9875\u9762\u53E6\u5B8C\u6574\u8BFB\u53D6 `microi.skills/microi-microservice/SKILL.md`\u3002\u79FB\u52A8\u7AEF\u9875\u9762\uFF08UniApp\u3001H5\u3001App\u3001\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F\uFF09\u53E6\u5B8C\u6574\u8BFB\u53D6 `microi.skills/microi-uniapp-frontend/SKILL.md` \u548C `microi.skills/microi-mobile-app-quality/SKILL.md`\u3002\n- \u5C40\u90E8\u4FEE\u6539\u5148\u786E\u8BA4\u76EE\u6807\u5E94\u7528\u3001\u6587\u4EF6\u3001\u8868\u6216\u63A5\u53E3\u53CA\u76F4\u63A5\u4F9D\u8D56\uFF1B\u5148\u53D6\u76EE\u5F55\u3001\u5143\u6570\u636E\u548C\u7248\u672C\uFF0C\u518D\u8BFB\u53D6\u76EE\u6807\u6B63\u6587\u4E0E\u53D7\u5F71\u54CD\u4F9D\u8D56\u3002\u8303\u56F4\u4E0D\u6E05\u3001\u8BC1\u636E\u4E0D\u8DB3\u3001\u6743\u9650\u6216\u5173\u8054\u5173\u7CFB\u590D\u6742\u65F6\u6269\u5927\u68C0\u7D22\u4E0E\u8BFB\u53D6\uFF0C\u4E0D\u80FD\u51ED\u731C\u6D4B\u4FEE\u6539\uFF0C\u4E5F\u4E0D\u80FD\u56E0\u9884\u7B97\u786C\u622A\u65AD\u5FC5\u8981\u4E0A\u4E0B\u6587\u3002\n- \u5B9A\u5236\u524D\u7AEF\u3001\u6E38\u620F\u3001\u7B97\u6CD5\u6216\u786C\u4EF6\u4EFB\u52A1\uFF0C\u6309\u9700\u8BFB\u53D6\u6700\u5C0F\u76F8\u5173 SDK\u3001\u811A\u624B\u67B6\u3001\u6A21\u677F\u548C\u534F\u8BAE\uFF1A\u524D\u7AEF\u4F18\u5148 `microi-frontend-sdk` / \u5BF9\u5E94\u5E94\u7528 Skill\uFF0CUnity \u4F7F\u7528 `unity-integration`\uFF0CTCP/\u6D88\u606F\u8BBE\u5907\u4F7F\u7528\u5BF9\u5E94\u96C6\u6210 Skill\uFF1B\u7531\u4F9D\u8D56\u5206\u6790\u51B3\u5B9A\u662F\u5426\u7EE7\u7EED\u8BFB\u53D6\u8868\u5355\u3001\u6A21\u5757\u3001V8\u3001\u6570\u636E\u5E93\u7B49\u5E73\u53F0\u77E5\u8BC6\u3002\n- V8 \u65B9\u6CD5\u548C\u7B7E\u540D\u6309\u9700\u8BFB\u53D6\u8D23\u4EFB Skill \u53CA\u540C\u6B65\u76EE\u5F55\u7684\u7C7B\u578B\u5B9A\u4E49\uFF1B\u6570\u636E\u5E93\u4EE5\u5F53\u524D\u79DF\u6237 MCP \u5B9E\u65F6\u7ED3\u6784\u4E3A\u51C6\uFF0C\u67E5\u8BE2\u65F6\u6536\u7A84\u5230\u76EE\u6807\u53CA\u4F9D\u8D56\uFF0C\u7ED3\u6784\u53D8\u5316\u540E\u91CD\u65B0\u56DE\u8BFB\u3002\u6E90\u7801\u6E05\u5355\u3001\u6458\u8981\u3001\u7F13\u5B58\u6216\u622A\u65AD\u8F93\u51FA\u4E0D\u80FD\u5192\u5145\u5DF2\u8BFB\u5B8C\u6574\u6B63\u6587\uFF1B\u4FEE\u6539\u524D\u5FC5\u987B\u8BFB\u5168\u88AB\u4FEE\u6539\u7684\u6E90\u7801\u5E76\u6838\u5BF9\u7248\u672C\u3002\n- \u9274\u6743\u3001\u79DF\u6237\u9694\u79BB\u3001\u6743\u9650\u3001\u4E8B\u52A1\u3001\u5E42\u7B49\u3001\u51B2\u7A81\u4FDD\u62A4\u3001\u771F\u5B9E\u4E1A\u52A1\u6D4B\u8BD5\u548C\u5199\u540E\u56DE\u8BFB\u59CB\u7EC8\u4FDD\u7559\uFF1B\u4E0D\u628A\u9ED8\u8BA4\u8BFB\u53D6\u6269\u5F20\u4E3A\u751F\u4EA7\u5199\u5165\u6216\u5BA2\u6237\u81EA\u52A8\u90E8\u7F72\u3002\u5DE5\u5177\u7ED3\u679C\u4E0D\u786E\u5B9A\u65F6\u5148\u56DE\u8BFB\uFF0C\u4E0D\u80FD\u76F2\u76EE\u91CD\u8BD5\u5199\u5165\u3002\n- \u8BE6\u7EC6\u89C4\u5219\u53EA\u7EF4\u62A4\u5728\u4E0A\u8FF0 Skills\uFF1B\u9ED8\u8BA4\u4F7F\u7528\u7B80\u4F53\u4E2D\u6587\uFF0C\u6700\u7EC8\u62A5\u544A\u5B9E\u9645\u6539\u52A8\u3001\u9A8C\u8BC1\u7ED3\u679C\u4E0E\u672A\u8986\u76D6\u8FB9\u754C\uFF0C\u907F\u514D\u91CD\u590D\u8F93\u51FA\u672A\u6539\u53D8\u7684\u5168\u6587\u3002\n'}function Fn(s){return`${An}
|
|
54
54
|
${s.trim()}
|
|
55
|
-
${
|
|
56
|
-
`}function
|
|
55
|
+
${Zt}
|
|
56
|
+
`}function On(s){let e=s.indexOf(An),t=s.indexOf(Zt);if(e<0||t<e||s.indexOf(An,e+An.length)>=0||s.indexOf(Zt,t+Zt.length)>=0)return;let n=t+Zt.length;return{start:e,end:n,text:s.slice(e,n)}}var Oo=`/**
|
|
57
57
|
* Microi V8\u5F15\u64CE API \u7C7B\u578B\u5B9A\u4E49
|
|
58
58
|
* \u6B64\u6587\u4EF6\u7531 Microi\u543E\u7801 VS Code \u63D2\u4EF6\u81EA\u52A8\u751F\u6210\uFF0C\u8BF7\u52FF\u624B\u52A8\u4FEE\u6539
|
|
59
59
|
* \u6587\u6863\u53C2\u8003\uFF1Aapi-engine.md, form-engine.md, v8-server.md, where.md
|
|
@@ -1337,10 +1337,10 @@ declare function DateAdd(date: any, unit: string, amount: number, format?: strin
|
|
|
1337
1337
|
declare function JSON_Encode(obj: any): string;
|
|
1338
1338
|
/** JSON \u53CD\u5E8F\u5217\u5316 */
|
|
1339
1339
|
declare function JSON_Decode(json: string): any;
|
|
1340
|
-
`,
|
|
1341
|
-
`;var
|
|
1342
|
-
`,"utf-8"),
|
|
1343
|
-
`,"utf-8")}
|
|
1340
|
+
`,Ys="microi.skills",Pr=".microi-skills-manifest.json",Vo="microi-skills.meta.json",Vn=".microi-ai-docs-manifest.json",Bo="microi-ai-doc-guard:",Qs=[".codebuddy/skills/microi/SKILL.md",".qoder/skills/microi/SKILL.md",".agents/skills/microi/SKILL.md",".comate/skills/microi/SKILL.md"],Xs=".codebuddy/rules/microi.md";var ot=`<!-- Generated by Microi\u543E\u7801 VSCode Extension - DO NOT REMOVE THIS LINE -->
|
|
1341
|
+
`;var Bn=class s{static getInstance(){return s._instance||(s._instance=new s),s._instance}inject(e={}){let t=N.getInstance();if(!t.getWorkspaceRoot())return;let r;try{r=t.getSyncRootDir()}catch{return}let o=A.join(r,Bt);R.existsSync(o)||R.mkdirSync(o,{recursive:!0});let i=A.join(o,Cn);R.writeFileSync(i,Oo,"utf-8"),this.injectAiDocs(r,e.strictAiDocs===!0),this.ensureJsConfig(r,o)}injectAiDocs(e,t=!1){try{this.generatePerOsClientSchemaDocs(e);let n=N.getInstance().getWorkspaceRoot();if(!n)return;this.ensureLocalRuntimeFilesIgnored(n,e),this.syncBundledSkills(n,t);let r=this.collectSkillEntries(n),o=Fn(xn()),i=[{relativePath:`${or}/${ar}`,content:ot+o},{relativePath:cr,content:ot+o},{relativePath:lr,content:ot+o},{relativePath:dr,content:ot+o}];if(r.length>0){i.push({relativePath:`${ur}/${gr}`,content:this.buildCursorSkillRule(r)});let a=this.buildPortableAiSkill(r);for(let c of Qs)i.push({relativePath:c,content:a});i.push({relativePath:Xs,content:this.buildCodeBuddyRule()})}this.syncGeneratedAiDocs(n,i)}catch(n){if(t)throw new Error(`MICROI_SKILLS_SYNC_FAILED: ${n instanceof Error?n.message:String(n)}`);console.warn("Microi AI/Skills \u521D\u59CB\u5316\u672A\u5B8C\u6210\uFF0C\u5C06\u5728\u540E\u7EED\u91CD\u8BD5\u3002",n instanceof Error?n.message:String(n))}}ensureLocalRuntimeFilesIgnored(e,t){let n=[".vscode/mcp.json",`.vscode/${Vn}`,".cursor/mcp.json",".trae/mcp.json",".workbuddy/mcp.json",".comate/mcp.json",is,".claude/settings.local.json"],r=A.relative(e,t);if(r&&!r.startsWith("..")&&!A.isAbsolute(r)){let o=r.replace(/\\/g,"/");n.push(`${o}/**/${St}`,`${o}/**/${nt}`,`${o}/**/${ft}`,`${o}/${Ft}`,`${o}/**/${Ft}`,`${o}/.backups/`,`${o}/**/.backups/`,`${o}/${Bt}/`)}wt(e),Je(e,n)}getBundledSkillsDir(){let e=A.join(__dirname,"microi.skills");if(R.existsSync(e))return e;let t=A.resolve(__dirname,"..","skills");return R.existsSync(t)?t:e}syncBundledSkills(e,t=!1){let n=this.getBundledSkillsDir();if(!R.existsSync(n)){if(t)throw new Error("\u5185\u7F6E Skills \u76EE\u5F55\u7F3A\u5931");return}let r=A.join(e,Ys),o=A.join(r,Pr),i=this.readSkillManifest(o),a=this.readBundledSkillsMeta(),c=a.skills?.version;if(t){let p=a.files;if(!c||!/^\d+\.\d+\.\d+$/.test(c)||!Array.isArray(p)||!p.length||new Set(p).size!==p.length||a.output?.files!==p.length||!a.fileHashes||!a.fileVersions)throw new Error("\u5185\u7F6E Skills \u6E05\u5355\u65E0\u6548\u6216\u7F3A\u5931");let f=[];if(this.walkSkillSource(n,(m,S)=>{f.push(S)}),JSON.stringify([...p].sort())!==JSON.stringify(f.sort()))throw new Error("\u5185\u7F6E Skills \u6587\u4EF6\u6E05\u5355\u4E0D\u5B8C\u6574");for(let m of p){if(m.includes("\\")||m.startsWith("/")||m.split("/").some(C=>!C||C==="."||C===".."))throw new Error("\u5185\u7F6E Skills \u8DEF\u5F84\u65E0\u6548");let S=A.resolve(n,m);if(!S.startsWith(A.resolve(n)+A.sep)||R.lstatSync(S).isSymbolicLink()||!R.statSync(S).isFile()||a.fileVersions[m]!==c||Ir.createHash("sha256").update(R.readFileSync(S)).digest("hex")!==a.fileHashes[m])throw new Error(`\u5185\u7F6E Skills \u6587\u4EF6\u6458\u8981\u6216\u7248\u672C\u4E0D\u7B26\uFF1A${m}`)}}let l=this.compareMicroiVersions(c,i.bundleVersion)<0,g={version:1,generatedBy:"Microi\u543E\u7801 VSCode Extension",bundleVersion:l?i.bundleVersion:c||i.bundleVersion,bundleBuiltAt:l?i.bundleBuiltAt:a.builtAt||i.bundleBuiltAt,fileVersions:{...i.fileVersions||{}},files:{...i.files}},d=[];this.walkSkillSource(n,(p,f)=>{let m=A.join(r,f),S=R.readFileSync(p,"utf-8"),C=this.hashText(S),h=i.files[f],y=a.fileVersions?.[f]||c,w=i.fileVersions?.[f]||i.bundleVersion,k=this.compareMicroiVersions(y,w)<0,b=!1;if(!R.existsSync(m))b=!k;else if(h)try{b=this.hashText(R.readFileSync(m,"utf-8"))===h&&!k}catch{b=!1}if(b){let _=A.dirname(m);R.existsSync(_)||R.mkdirSync(_,{recursive:!0}),R.writeFileSync(m,S,"utf-8"),d.push(f)}if(b)g.files[f]=C,y&&(g.fileVersions[f]=y);else try{if(this.hashText(R.readFileSync(m,"utf-8"))===C){g.files[f]=C;let v=this.pickNewerMicroiVersion(y,i.fileVersions?.[f]);v&&(g.fileVersions[f]=v)}else h?(g.files[f]=h,i.fileVersions?.[f]&&(g.fileVersions[f]=i.fileVersions[f])):(delete g.files[f],delete g.fileVersions[f])}catch{h&&(g.files[f]=h,i.fileVersions?.[f]&&(g.fileVersions[f]=i.fileVersions[f]))}});let u=JSON.stringify(g)!==JSON.stringify(i);(d.length>0||u||!R.existsSync(o))&&(R.existsSync(r)||R.mkdirSync(r,{recursive:!0}),R.writeFileSync(o,JSON.stringify(g,null,2)+`
|
|
1342
|
+
`,"utf-8"),Je(e,[`${Ys}/${Pr}`]))}readSkillManifest(e){if(!R.existsSync(e))return{version:1,generatedBy:"Microi\u543E\u7801 VSCode Extension",files:{}};try{let t=JSON.parse(R.readFileSync(e,"utf-8"));return{version:typeof t.version=="number"?t.version:1,generatedBy:t.generatedBy||"Microi\u543E\u7801 VSCode Extension",bundleVersion:typeof t.bundleVersion=="string"?t.bundleVersion:void 0,bundleBuiltAt:typeof t.bundleBuiltAt=="string"?t.bundleBuiltAt:void 0,fileVersions:t.fileVersions&&typeof t.fileVersions=="object"?t.fileVersions:{},files:t.files&&typeof t.files=="object"?t.files:{}}}catch{return{version:1,generatedBy:"Microi\u543E\u7801 VSCode Extension",files:{}}}}readBundledSkillsMeta(){let e=A.join(__dirname,Vo);if(!R.existsSync(e))return{};try{let t=JSON.parse(R.readFileSync(e,"utf-8"));return t&&typeof t=="object"?t:{}}catch{return{}}}walkSkillSource(e,t){let n=r=>{for(let o of R.readdirSync(r,{withFileTypes:!0})){if(o.name===".git"||o.name==="node_modules"||o.name===Pr)continue;let i=A.join(r,o.name);if(o.isDirectory())n(i);else if(o.isFile()){let a=A.relative(e,i).replace(/\\/g,"/");t(i,a)}}};n(e)}hashText(e){return Ir.createHash("sha256").update(e,"utf-8").digest("hex")}compareMicroiVersions(e,t){let n=i=>{if(!(!i||!/^\d+(?:\.\d+){2}$/.test(i)))return i.split(".").map(a=>Number(a))},r=n(e),o=n(t);if(!r||!o)return 0;for(let i=0;i<3;i++)if(r[i]!==o[i])return r[i]>o[i]?1:-1;return 0}pickNewerMicroiVersion(e,t){return e?t?this.compareMicroiVersions(e,t)>=0?e:t:e:t}syncGeneratedAiDocs(e,t){let n=t.map(u=>u.relativePath.replace(/\\/g,"/")),r=n.map(u=>this.normalizeRelativePath(u)),o=this.getGitTrackedWorkspaceFiles(e,n);if(o===void 0)return;let i=A.join(e,".vscode",Vn),a=this.readAiDocsManifest(i),c=this.readBundledSkillsMeta().skills?.version,l=this.pickNewerMicroiVersion(c,a.bundleVersion),g={version:2,generatedBy:"Microi\u543E\u7801 AI\u5F00\u53D1\u5DE5\u5177",bundleVersion:l,fileVersions:{...a.fileVersions||{}},fileHashes:{...a.fileHashes||{}},routingBlockHashes:{...a.routingBlockHashes||{}},files:{...a.files}},d=new Set(r);for(let u of Object.keys(g.files))d.has(this.normalizeRelativePath(u))||(delete g.files[u],delete g.fileHashes[u],delete g.fileVersions[u],delete g.routingBlockHashes[u]);for(let u of Object.keys(g.fileHashes))d.has(this.normalizeRelativePath(u))||(delete g.fileHashes[u],delete g.fileVersions[u],delete g.files[u],delete g.routingBlockHashes[u]);for(let u of t){let p=this.normalizeRelativePath(u.relativePath);if(o.has(p)){delete g.files[p],delete g.fileHashes[p],delete g.fileVersions[p],delete g.routingBlockHashes[p];continue}let f=A.join(e,p),m=this.hashText(u.content),S=a.files[p],C=a.fileHashes?.[p]||(/^[a-f0-9]{64}$/i.test(S||"")?S:void 0),h=a.fileVersions?.[p]||a.bundleVersion,y=this.compareMicroiVersions(c,h)<0,w=!R.existsSync(f)&&!y,k="",b=u.content;if(R.existsSync(f))try{let v=R.readFileSync(f,"utf-8");k=this.hashText(v),w=!!C&&k===C&&!y;let B=On(v),F=On(u.content),D=a.routingBlockHashes?.[p];!w&&!y&&B&&F&&D&&this.hashText(B.text)===D&&(b=v.slice(0,B.start)+F.text+v.slice(B.end),w=!0)}catch{w=!1}if(w){let v=A.dirname(f);R.existsSync(v)||R.mkdirSync(v,{recursive:!0}),R.writeFileSync(f,b,"utf-8"),k=this.hashText(b),g.fileHashes[p]=m,c&&(g.fileVersions[p]=c)}else if(k===m){g.fileHashes[p]=m;let v=this.pickNewerMicroiVersion(c,h);v&&(g.fileVersions[p]=v)}else C?(g.fileHashes[p]=C,h&&(g.fileVersions[p]=h)):g.fileHashes[p]||delete g.fileVersions[p];if(w||k===m){let v=On(u.content);v?g.routingBlockHashes[p]=this.hashText(v.text):delete g.routingBlockHashes[p]}let _=g.fileHashes[p];if(_){let v=g.fileVersions[p]||l||"unknown";g.files[p]=`${Bo}${v}:${_}`}else delete g.files[p]}if(JSON.stringify(g)!==JSON.stringify(a)||!R.existsSync(i)){let u=A.dirname(i);R.existsSync(u)||R.mkdirSync(u,{recursive:!0}),R.writeFileSync(i,JSON.stringify(g,null,2)+`
|
|
1343
|
+
`,"utf-8")}Je(e,[`.vscode/${Vn}`])}readAiDocsManifest(e){if(!R.existsSync(e))return{version:2,generatedBy:"Microi\u543E\u7801 AI\u5F00\u53D1\u5DE5\u5177",files:{},fileHashes:{},fileVersions:{},routingBlockHashes:{}};try{let t=JSON.parse(R.readFileSync(e,"utf-8"));return{version:typeof t.version=="number"?t.version:1,generatedBy:t.generatedBy||"Microi\u543E\u7801 AI\u5F00\u53D1\u5DE5\u5177",bundleVersion:typeof t.bundleVersion=="string"?t.bundleVersion:void 0,fileVersions:t.fileVersions&&typeof t.fileVersions=="object"?t.fileVersions:{},fileHashes:t.fileHashes&&typeof t.fileHashes=="object"?t.fileHashes:{},routingBlockHashes:t.routingBlockHashes&&typeof t.routingBlockHashes=="object"?t.routingBlockHashes:{},files:t.files&&typeof t.files=="object"?t.files:{}}}catch{return{version:2,generatedBy:"Microi\u543E\u7801 AI\u5F00\u53D1\u5DE5\u5177",files:{},fileHashes:{},fileVersions:{},routingBlockHashes:{}}}}normalizeRelativePath(e){let t=e.replace(/\\/g,"/").replace(/^\.\//,"");return process.platform==="win32"?t.toLowerCase():t}getGitTrackedWorkspaceFiles(e,t){let n=(0,Rr.spawnSync)("git",["-C",e,"rev-parse","--show-toplevel"],{encoding:"utf-8",windowsHide:!0,timeout:3e3});if(n.error)return this.hasGitMetadata(e)?void 0:new Set;if(n.status!==0)return new Set;let r=String(n.stdout||"").trim();if(!r)return;let o=new Map,i=[];for(let l of t){let g=A.relative(r,A.join(e,l));g.startsWith("..")||A.isAbsolute(g)||(i.push(g.replace(/\\/g,"/")),o.set(this.normalizeRelativePath(g),this.normalizeRelativePath(l)))}if(i.length===0)return new Set;let a=(0,Rr.spawnSync)("git",["-C",r,"ls-files","-z","--",...i],{encoding:"utf-8",windowsHide:!0,timeout:3e3,maxBuffer:1024*1024});if(a.error||a.status!==0)return;let c=new Set;for(let l of String(a.stdout||"").split("\0").filter(Boolean)){let g=o.get(this.normalizeRelativePath(l));g&&c.add(g)}return c}hasGitMetadata(e){let t=A.resolve(e);for(;;){if(R.existsSync(A.join(t,".git")))return!0;let n=A.dirname(t);if(n===t)return!1;t=n}}canRemoveGeneratedAiDoc(e,t){if(!R.existsSync(t))return!1;let n=A.relative(e,t).replace(/\\/g,"/"),r=this.normalizeRelativePath(n),o=this.getGitTrackedWorkspaceFiles(e,[n]);if(o===void 0||o.has(r))return!1;let i=this.readAiDocsManifest(A.join(e,".vscode",Vn)),a=i.files[r],c=i.fileHashes?.[r]||(/^[a-f0-9]{64}$/i.test(a||"")?a:void 0);if(!c)return!1;try{return this.hashText(R.readFileSync(t,"utf-8"))===c}catch{return!1}}collectSkillEntries(e){let t=A.join(e,"microi.skills");if(!R.existsSync(t))return[];let n=new Map,r=A.join(t,"README.md");if(R.existsSync(r))try{let a=R.readFileSync(r,"utf-8").matchAll(/`([^`]+\/SKILL\.md)`/g),c=0;for(let l of a){let g=l[1].split(/[\\/]/)[0];g&&!n.has(g)&&n.set(g,c++)}}catch{}let o=[];try{for(let i of R.readdirSync(t,{withFileTypes:!0})){if(!i.isDirectory())continue;let a=A.join(t,i.name,"SKILL.md");R.existsSync(a)&&o.push({name:i.name,relativePath:`microi.skills/${i.name}/SKILL.md`,description:this.readSkillDescription(a,i.name)})}}catch{}return o.sort((i,a)=>{let c=n.get(i.name),l=n.get(a.name);return c!==void 0&&l!==void 0?c-l:c!==void 0?-1:l!==void 0?1:i.name.localeCompare(a.name)})}readSkillDescription(e,t){try{let r=R.readFileSync(e,"utf-8").split(/\r?\n/).find(o=>o.startsWith("# "));if(r)return r.replace(/^#\s+/,"").trim()}catch{}return t}buildSkillsReference(e){if(!e.length)return"";let t=e.map(n=>`- \`${n.relativePath}\` \u2014 ${n.description}`).join(`
|
|
1344
1344
|
`);return`
|
|
1345
1345
|
|
|
1346
1346
|
---
|
|
@@ -1354,35 +1354,36 @@ description: Microi\u543E\u7801\u6309\u4EFB\u52A1\u8303\u56F4\u8BFB\u53D6\u89C4\
|
|
|
1354
1354
|
globs: ["**/*.{vue,js,ts,jsx,tsx,css,scss,json,md,mdc,cs,csproj,xml,yml,yaml}", "Microi-V8-Engine/**/*.js", "microi-v8-engine/**/*.js", "microi.skills/**/*.md"]
|
|
1355
1355
|
alwaysApply: true
|
|
1356
1356
|
---
|
|
1357
|
-
${
|
|
1357
|
+
${ot}${Fn(xn())}`}buildPortableAiSkill(e){return`---
|
|
1358
1358
|
name: microi
|
|
1359
1359
|
description: \u5B89\u88C5\u6216\u521D\u59CB\u5316 @microi.net/cli\u3001\u914D\u7F6E Microi\u543E\u7801\u670D\u52A1\u5668\u8FDE\u63A5\u4E0E MCP\u3001\u6309\u8FDE\u63A5\u62C9\u53D6\u5168\u90E8 V8 \u4EE3\u7801\uFF0C\u5E76\u5904\u7406\u543E\u7801\u4F4E\u4EE3\u7801\u5E73\u53F0\u4EFB\u52A1\u3002\u7528\u6237\u63D0\u5230\u201C\u5B89\u88C5\u543E\u7801\u63D2\u4EF6\u201D\u201C\u521D\u59CB\u5316 Microi\u201D\u201C\u6DFB\u52A0\u670D\u52A1\u5668/MCP\u201D\u201C\u62C9\u53D6\u67D0\u8FDE\u63A5\u7684\u6240\u6709 V8\u201D\u6216\u5DF2\u521D\u59CB\u5316\u543E\u7801\u5DE5\u4F5C\u533A\u4E2D\u76F4\u63A5\u63CF\u8FF0\u4E1A\u52A1\u5F00\u53D1\u9700\u6C42\u65F6\u4F7F\u7528\uFF0C\u65E0\u9700\u6307\u5B9A\u6280\u80FD\u540D\u79F0\u3002
|
|
1360
1360
|
---
|
|
1361
1361
|
|
|
1362
1362
|
# Microi\u543E\u7801 AI \u5F00\u53D1\u8DEF\u7531
|
|
1363
1363
|
|
|
1364
|
-
${
|
|
1364
|
+
${ot}${Fn("## \u5B89\u88C5\u4E0E\u8FDE\u63A5\n\n\u5C1A\u672A\u521D\u59CB\u5316\u3001\u9700\u8981\u5B89\u88C5 CLI\u3001\u8FDE\u63A5\u670D\u52A1\u5668\u3001\u767B\u5F55\u6216\u62C9\u53D6 V8 \u65F6\uFF0C\u5148\u8BFB\u53D6\u53EF\u7528\u7684 `microi-codex-installer/SKILL.md`\uFF08\u5DE5\u4F5C\u533A `microi.skills/` \u6216\u5F53\u524D\u63D2\u4EF6 `skills/`\uFF09\uFF0C\u6309\u5F53\u524D\u7B7E\u540D\u64CD\u4F5C\u3002\u7528\u6237\u660E\u786E\u8981\u6C42\u5B89\u88C5\u65F6\u4F7F\u7528 npm \u5B98\u65B9 latest\uFF1B\u5DF2\u6709\u8FDE\u63A5\u5148\u5217\u51FA\u5E76\u552F\u4E00\u5339\u914D\uFF0C\u5BC6\u7801\u3001Token \u4E0D\u8FDB\u5165\u63D0\u793A\u8BCD\u3001\u547D\u4EE4\u5386\u53F2\u6216\u65E5\u5FD7\u3002\u521D\u59CB\u5316\u540E\u8FD0\u884C doctor \u5E76\u7EE7\u7EED\u5F53\u524D\u4EFB\u52A1\uFF0C\u4E0D\u4EE5\u5BBF\u4E3B\u5C1A\u672A\u70ED\u52A0\u8F7D\u4E3A\u7531\u505C\u6B62\u5DE5\u4F5C\u3002\n\n"+xn())}
|
|
1365
1365
|
`}buildCodeBuddyRule(){return`---
|
|
1366
1366
|
description: Microi\u543E\u7801\u521D\u59CB\u5316\u3001\u670D\u52A1\u5668/MCP \u8FDE\u63A5\u3001\u5168\u90E8 V8 \u62C9\u53D6\u53CA\u4F4E\u4EE3\u7801\u5F00\u53D1\u5165\u53E3
|
|
1367
1367
|
alwaysApply: true
|
|
1368
1368
|
---
|
|
1369
1369
|
|
|
1370
|
-
${
|
|
1370
|
+
${ot}
|
|
1371
1371
|
# Microi\u543E\u7801\u5165\u53E3
|
|
1372
1372
|
|
|
1373
1373
|
\u5728\u5DF2\u521D\u59CB\u5316\u543E\u7801\u5DE5\u4F5C\u533A\u4E2D\u76F4\u63A5\u63CF\u8FF0\u4E1A\u52A1\u9700\u6C42\uFF0C\u6216\u9047\u5230 Microi\u3001\u543E\u7801\u3001\`@microi.net/cli\`\u3001\u670D\u52A1\u5668\u8FDE\u63A5\u3001MCP \u6216 V8 \u62C9\u53D6\u4EFB\u52A1\u65F6\uFF0C\u7ACB\u5373\u8BFB\u53D6 \`.codebuddy/skills/microi/SKILL.md\` \u5E76\u6309\u5176\u4E2D\u6D41\u7A0B\u6267\u884C\u3002\u5B8C\u6574\u89C4\u8303\u4F4D\u4E8E\u5DE5\u4F5C\u533A \`microi.skills/\`\uFF0C\u4E0D\u8981\u51ED\u7A7A\u731C\u6D4B\u547D\u4EE4\u3001\u670D\u52A1\u5668\u6216\u6570\u636E\u7ED3\u6784\u3002
|
|
1374
|
-
`}generatePerOsClientSchemaDocs(e){let t=[];if(!
|
|
1374
|
+
`}generatePerOsClientSchemaDocs(e){let t=[];if(!R.existsSync(e))return t;let n=r=>{try{for(let o of R.readdirSync(r)){if(o.startsWith(".")&&o!==St)continue;let i=A.join(r,o);if(o===St)try{let a=JSON.parse(R.readFileSync(i,"utf-8")),c=this.formatDbSchemaFull(a,A.relative(e,r));if(c){let l=A.join(r,nt);R.writeFileSync(l,c,"utf-8"),t.push(l)}}catch{}else try{R.statSync(i).isDirectory()&&n(i)}catch{}}}catch{}};return n(e),t}formatDbSchemaFull(e,t){if(!e.Tables||e.Tables.length===0)return"";let n=e.Tables.filter(o=>o.Name);if(n.length===0)return"";let r=[];r.push(`# \u6570\u636E\u5E93\u7ED3\u6784 \u2014 ${t}
|
|
1375
1375
|
`),r.push("> \u6B64\u6587\u4EF6\u7531 Microi\u543E\u7801 VS Code \u63D2\u4EF6\u81EA\u52A8\u751F\u6210\uFF0C\u5305\u542B\u8BE5\u5E94\u7528\u7684\u6240\u6709\u6570\u636E\u5E93\u8868\u548C\u5B57\u6BB5\u4FE1\u606F\u3002"),r.push(`> \u5171 ${n.length} \u5F20\u8868\u3002
|
|
1376
|
-
`);for(let
|
|
1377
|
-
`);let a=
|
|
1378
|
-
`)}ensureJsConfig(e,t){let n=A.join(e,"jsconfig.json"),r=e,
|
|
1379
|
-
`).trim()}function
|
|
1380
|
-
`)}}function
|
|
1381
|
-
${
|
|
1382
|
-
`,expectedVersion:n.version,pluginRoot:n.root}}function
|
|
1383
|
-
${
|
|
1384
|
-
`)}}function
|
|
1385
|
-
`).trim().slice(0,5e3)}function
|
|
1376
|
+
`);for(let o of n){let i=o.Description?` \u2014 ${o.Description}`:"";r.push(`## ${o.Name}${i}
|
|
1377
|
+
`);let a=o._Fields||o.Fields;if(a&&a.length>0){r.push("| \u5B57\u6BB5 | \u8BF4\u660E | \u7C7B\u578B |"),r.push("|------|------|------|");for(let c of a){let l=c.Description||c.Label||"",g=c.Type||c.FieldType||"";r.push(`| ${c.Name} | ${l} | ${g} |`)}r.push("")}}return r.join(`
|
|
1378
|
+
`)}ensureJsConfig(e,t){let n=A.join(e,"jsconfig.json"),r=e,o=e,i;if(R.existsSync(n))try{i=JSON.parse(R.readFileSync(n,"utf-8"))}catch{i={}}else i={};let a=i.compilerOptions||{};a.target=a.target||"ES2020",a.module=a.module||"CommonJS",a.checkJs=!0;let c=A.relative(e,t),l=a.typeRoots||[];l.includes(`./${c}`)||l.push(`./${c}`),a.typeRoots=l,i.compilerOptions=a;let g=i.include||[],d=A.relative(e,r),u=A.relative(e,o),p=`${c}/**/*`;for(let m of[`${d}/**/*`,`${u}/**/*`,p])g.includes(m)||g.push(m);i.include=g;let f=i.exclude||[];f.includes("node_modules")||f.push("node_modules"),i.exclude=f,R.writeFileSync(n,JSON.stringify(i,null,2),"utf-8")}cleanup(){let e=N.getInstance(),t=e.getWorkspaceRoot();if(!t)return;let n=e.getSyncRootDir(),r=A.join(n,Bt),o=A.join(r,Cn);R.existsSync(o)&&R.unlinkSync(o);let i=A.join(t,Bt),a=A.join(i,Cn);if(R.existsSync(a)&&R.unlinkSync(a),A.resolve(n)!==A.resolve(t)){let c=A.join(t,or,ar),l=A.join(t,cr),g=A.join(t,lr),d=A.join(t,dr),u=A.join(t,ur,gr),p=Qs.map(m=>A.join(t,m)),f=A.join(t,Xs);if(this.canRemoveGeneratedAiDoc(t,c))try{R.unlinkSync(c)}catch{}if(this.canRemoveGeneratedAiDoc(t,l))try{R.unlinkSync(l)}catch{}if(this.canRemoveGeneratedAiDoc(t,g))try{R.unlinkSync(g)}catch{}if(this.canRemoveGeneratedAiDoc(t,d))try{R.unlinkSync(d)}catch{}if(this.canRemoveGeneratedAiDoc(t,u))try{R.unlinkSync(u)}catch{}for(let m of p)if(this.canRemoveGeneratedAiDoc(t,m))try{R.unlinkSync(m)}catch{}if(this.canRemoveGeneratedAiDoc(t,f))try{R.unlinkSync(f)}catch{}}this.cleanupSchemaDocs(n)}cleanupSchemaDocs(e){try{for(let t of R.readdirSync(e)){if(t.startsWith(".")&&t!==nt)continue;let n=A.join(e,t);if(t===nt)try{R.unlinkSync(n)}catch{}else try{R.statSync(n).isDirectory()&&this.cleanupSchemaDocs(n)}catch{}}}catch{}}};function tn(s,e){let t=o=>{if(!(!o||!/^\d+(?:\.\d+){2}$/.test(o)))return o.split(".").map(i=>Number(i))},n=t(s),r=t(e);if(!n||!r)return 0;for(let o=0;o<3;o+=1)if(n[o]!==r[o])return n[o]>r[o]?1:-1;return 0}function en(s){let e=s.env,t=String(e?.MICROI_TOOL_VERSION||"").trim();return/^\d+(?:\.\d+){2}$/.test(t)?t:""}function Ln(s){let e=s.env||{},t=s.headers||{},r=(i=>i.trim().replace(/\/+$/,"").toLowerCase())(String(e.MICROI_API_URL||s.url||"")),o=String(e.MICROI_OS_CLIENT||t["X-Microi-OsClient"]||"").trim().toLowerCase();return`${r}|${o}`}function Zs(s,e,t){let n={...s},r={},o=new Set,i=[];for(let[c,l]of Object.entries(e)){let g=Ln(l),d=en(l),u=Object.entries(n).filter(([f,m])=>{if(!t.isManaged(f,m))return!1;let S=Ln(m);return f===c||g!=="|"&&S===g}),p=u.find(([,f])=>tn(en(f),d)>0);if(p){let f=en(p[1]);for(let[m]of u)o.add(m);i.push({name:p[0],version:f});continue}r[c]=l}let a=new Set(Object.values(r).map(Ln).filter(c=>c!=="|"));for(let[c,l]of Object.entries(n)){if(!t.isManaged(c,l)||o.has(c))continue;if(Object.prototype.hasOwnProperty.call(r,c)){delete n[c];continue}let g=Ln(l);if(a.has(g)){delete n[c];continue}(t.removeManagedNotInNext||t.isStableName&&!t.isStableName(c))&&delete n[c]}return Object.assign(n,r),{servers:n,skippedNewerProviders:i}}var xr=O(require("child_process")),Nr=O(require("crypto")),$=O(require("fs")),ei=O(require("os")),K=O(require("path")),Ye="microi-net",Be="microi",Ve=`${Be}@${Ye}`,Kn="@microi.net/cli",ti="@microi.net/codex-plugin",rn="microi-official",$n=`${Be}@${rn}`;function Mr(s){return[s.stderr,s.stdout].filter(Boolean).join(`
|
|
1379
|
+
`).trim()}function Pt(s,e){if(!/^\d+\.\d+\.\d+$/.test(s)||!/^\d+\.\d+\.\d+$/.test(e))return;let t=s.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<3;r++)if(t[r]!==n[r])return t[r]-n[r];return 0}function Fr(s,e){let t=(n,r)=>{for(let o of[n,r]){let i=$.lstatSync(o);if(!i.isDirectory()||i.isSymbolicLink())throw new Error("\u63D2\u4EF6\u76EE\u5F55\u5305\u542B\u94FE\u63A5\u6216\u975E\u5E38\u89C4\u76EE\u5F55")}for(let o of $.readdirSync(n,{withFileTypes:!0})){let i=K.join(n,o.name),a=K.join(r,o.name);if(o.isSymbolicLink())throw new Error("\u5305\u6B63\u6587\u5305\u542B\u94FE\u63A5");if(o.isDirectory())t(i,a);else if(o.isFile()){let c=$.lstatSync(a);if(!c.isFile()||c.isSymbolicLink()||!$.readFileSync(i).equals($.readFileSync(a)))throw new Error(`\u63D2\u4EF6\u6587\u4EF6\u7F3A\u5931\u6216\u6B63\u6587\u4E0D\u4E00\u81F4\uFF1A${K.relative(s,i).replace(/\\/g,"/")}`)}else throw new Error("\u5305\u6B63\u6587\u5305\u542B\u975E\u5E38\u89C4\u6587\u4EF6")}};t(K.resolve(s),K.resolve(e))}function ni(s,e,t=3e4){let n=xr.spawnSync(s.command,[...s.prefixArgs,...e],{encoding:"utf8",windowsHide:!0,timeout:t,maxBuffer:16777216});return{status:typeof n.status=="number"?n.status:1,stdout:String(n.stdout||""),stderr:[n.error?.message,n.stderr].filter(Boolean).join(`
|
|
1380
|
+
`)}}function Lo(s){let e=K.extname(s).toLowerCase();return e===".js"||e===".cjs"||e===".mjs"?{command:process.execPath,prefixArgs:[s],displayPath:s}:process.platform==="win32"&&(e===".cmd"||e===".bat")?{command:process.env.ComSpec||"cmd.exe",prefixArgs:["/d","/s","/c",s],displayPath:s}:{command:s,prefixArgs:[],displayPath:s}}function $o(){let s=String(process.env.MICROI_CODEX_PATH||"").trim();if(s){let r=K.resolve(s);if(!$.existsSync(r))throw new Error(`MICROI_CODEX_PATH \u6307\u5411\u7684\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${r}`);return[r]}let e=process.platform==="win32"?[["where.exe",["codex.exe"]],["where.exe",["codex"]]]:[["which",["codex"]]],t=[];for(let[r,o]of e){let i=xr.spawnSync(r,o,{encoding:"utf8",windowsHide:!0,timeout:3e3});i.status===0&&t.push(...String(i.stdout||"").split(/\r?\n/).map(a=>a.trim()).filter(Boolean))}return process.platform!=="win32"&&t.push("codex"),[...new Map(t.map(r=>[process.platform==="win32"?r.toLowerCase():r,r])).values()].sort((r,o)=>{let i=K.extname(r).toLowerCase()===".exe"?0:1,a=K.extname(o).toLowerCase()===".exe"?0:1;return i-a})}function ri(){for(let s of $o()){if(K.isAbsolute(s)&&!$.existsSync(s))continue;let e=Lo(s),t=ni(e,["--version"],5e3);if(t.status!==0)continue;let n=t.stdout.trim()||t.stderr.trim();if(/codex/i.test(n))return{...e,version:n}}}function Oe(s,e,t=!1){let n=ni(s,["-c",'model_reasoning_effort="high"',...e]);if(!t&&n.status!==0)throw new Error(`Codex CLI \u6267\u884C\u5931\u8D25\uFF1Acodex ${e.join(" ")}
|
|
1381
|
+
${Mr(n)}`.trim());return n}function Uo(s){let e=[];for(let t of s.split(/\r?\n/)){let n=t.trim().split(/\s{2,}/);n.length<2||n[0]==="MARKETPLACE"||e.push({name:n[0],root:n.slice(1).join(" ")})}return e}function jo(s){let e=[];for(let t of s.split(/\r?\n/)){let n=t.trim().split(/\s{2,}/);if(n.length<2||n[0]==="PLUGIN"||!n[0].includes("@"))continue;let r=/^not installed$/i.test(n[1]||"");e.push({selector:n[0],status:n[1]||"",version:r?"":n[2]||"",pluginPath:r?n.slice(2).join(" "):n.slice(3).join(" ")})}return e}function Ko(){let e=[K.join(__dirname,"codex-marketplace.json"),K.resolve(__dirname,"..","..","codex","marketplace.npm.json")].find(t=>$.existsSync(t));if(!e)throw new Error("CLI \u7F3A\u5C11 codex-marketplace.json\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\u6700\u65B0\u7248 @microi.net/cli");return e}function Ar(s,e){let t=K.join(s,".codex-plugin","plugin.json"),n=K.join(s,"package.json"),r,o;try{r=JSON.parse($.readFileSync(t,"utf8")),o=JSON.parse($.readFileSync(n,"utf8"))}catch(i){throw new Error(`${e}\u8EAB\u4EFD\u6587\u4EF6\u65E0\u6CD5\u89E3\u6790\uFF1A${i instanceof Error?i.message:String(i)}`)}return{name:String(r.name||""),version:String(r.version||""),packageName:String(o.name||"")}}function Ho(){let s=[K.resolve(__dirname,".."),K.resolve(__dirname,"..","..","plugins",Be)];for(let e of s){if(!$.existsSync(K.join(e,".codex-plugin","plugin.json"))||!$.existsSync(K.join(e,"package.json")))continue;let t=Ar(e,"\u5185\u7F6E Microi Agentx \u63D2\u4EF6");if(t.name===Be&&t.packageName===Kn&&t.version)return{root:e,version:t.version}}throw new Error("CLI \u7F3A\u5C11\u5B8C\u6574\u7684 Microi Agentx \u63D2\u4EF6\u6587\u4EF6\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\u6700\u65B0\u7248 @microi.net/cli")}function Wo(s){if(!s||s.name!==Be)return!1;if(s.source?.source==="local")return String(s.source.path||"").replace(/\\/g,"/").replace(/^\.\//,"")==="plugins/microi";let e=[Kn,ti];return s.source?.source==="npm"&&e.includes(s.source.package||"")}function si(){let s=$.readFileSync(Ko(),"utf8"),e;try{e=JSON.parse(s)}catch(r){throw new Error(`Codex marketplace \u6A21\u677F\u65E0\u6CD5\u89E3\u6790\uFF1A${r instanceof Error?r.message:String(r)}`)}let t=e.plugins?.find(r=>r.name===Be);if(e.name!==Ye||t?.source?.source!=="local"||String(t.source.path||"").replace(/\\/g,"/").replace(/^\.\//,"")!=="plugins/microi")throw new Error("Codex marketplace \u6A21\u677F\u8EAB\u4EFD\u4E0D\u5408\u6CD5\uFF0C\u62D2\u7EDD\u5199\u5165\u5168\u5C40\u914D\u7F6E");let n=Ho();return{manifest:e,content:`${JSON.stringify(e,null,2)}
|
|
1382
|
+
`,expectedVersion:n.version,pluginRoot:n.root}}function Go(s,e){let t=`${s}.${process.pid}.${Date.now()}.tmp`;try{$.writeFileSync(t,e,"utf8"),$.renameSync(t,s)}finally{try{$.existsSync(t)&&$.unlinkSync(t)}catch{}}}function ii(){return K.resolve(process.env.CODEX_HOME||K.join(ei.homedir(),".codex"))}function je(s,e){return Object.assign(new Error(e),{code:s})}function qe(s){let e=$.lstatSync(s,{bigint:!0});if(!e.isDirectory()||e.isSymbolicLink())throw je("EOWNER","Codex \u63D2\u4EF6\u53D1\u5E03\u76EE\u5F55\u5F52\u5C5E\u5DF2\u53D8\u5316");return`${e.dev}:${e.ino}:${e.birthtimeNs}`}function nn(s){let e=Nr.createHash("sha256"),t=n=>{let r=qe(n);e.update(`${K.relative(s,n)}\0${r}\0`);for(let o of $.readdirSync(n).sort()){let i=K.join(n,o),a=$.lstatSync(i,{bigint:!0});if(a.isSymbolicLink())throw je("EOWNER","Codex \u63D2\u4EF6\u53D1\u5E03\u76EE\u5F55\u5305\u542B\u7B26\u53F7\u94FE\u63A5");if(a.isDirectory())t(i);else if(a.isFile()){let c=$.readFileSync(i),l=$.lstatSync(i,{bigint:!0});if(`${a.dev}:${a.ino}:${a.birthtimeNs}:${a.size}:${a.mtimeNs}:${a.ctimeNs}`!=`${l.dev}:${l.ino}:${l.birthtimeNs}:${l.size}:${l.mtimeNs}:${l.ctimeNs}`)throw je("EOWNER","Codex \u63D2\u4EF6\u6587\u4EF6\u5728\u6821\u9A8C\u671F\u95F4\u53D1\u751F\u53D8\u5316");e.update(`${K.relative(s,i)}\0${l.dev}:${l.ino}:${l.birthtimeNs}\0`),e.update(Nr.createHash("sha256").update(c).digest())}else throw je("EOWNER","Codex \u63D2\u4EF6\u53D1\u5E03\u76EE\u5F55\u5305\u542B\u975E\u5E38\u89C4\u6587\u4EF6")}if(qe(n)!==r)throw je("EOWNER","Codex \u63D2\u4EF6\u76EE\u5F55\u5728\u6821\u9A8C\u671F\u95F4\u53D1\u751F\u53D8\u5316")};return t(s),e.digest("hex")}function Un(s){try{return $.lstatSync(s),!1}catch(e){if(e.code==="ENOENT")return!0;throw e}}function Dr(s,e,t,n){for(let r=0;r<6;r+=1){if(qe(K.dirname(e))!==n||nn(s)!==t)throw je("EOWNER","Codex \u63D2\u4EF6\u53D1\u5E03\u5F52\u5C5E\u5DF2\u53D8\u5316\uFF0C\u4FDD\u7559\u539F\u76EE\u5F55");if(!Un(e))throw je("EEXIST","Codex \u63D2\u4EF6\u53D1\u5E03\u76EE\u6807\u5DF2\u88AB\u5360\u7528\uFF0C\u62D2\u7EDD\u8986\u76D6");try{$.renameSync(s,e);return}catch(o){let i=o.code;if(process.platform!=="win32"||i!=="EPERM"&&i!=="EBUSY"||r===5)throw o;Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,40*(r+1))}}}function zo(s,e,t){let n=K.resolve(s),r=K.resolve(e),o=K.relative(n,r);if(!o||!o.startsWith("..")&&!K.isAbsolute(o))throw new Error(`Codex \u63D2\u4EF6\u76EE\u6807\u76EE\u5F55\u4E0D\u80FD\u4F4D\u4E8E npm \u5305\u5185\u90E8\uFF1A${r}`);let i;if(!Un(r)){let p=Ar(r,"\u73B0\u6709 Microi Agentx \u63D2\u4EF6"),f=[Kn,ti];if(p.name!==Be||!f.includes(p.packageName))throw new Error(`\u76EE\u6807\u76EE\u5F55\u5305\u542B\u975E Microi \u7BA1\u7406\u7684\u63D2\u4EF6\uFF0C\u62D2\u7EDD\u8986\u76D6\uFF1A${r}`);if((Pt(p.version,t)??0)>0)throw new Error(`MICROI_CODEX_NEWER_PLUGIN_PRESERVED: \u5DF2\u4FDD\u7559\u8F83\u65B0\u63D2\u4EF6 ${p.version}\uFF0C\u62D2\u7EDD\u5199\u5165 ${t}`);i=nn(r)}let a=K.dirname(r);$.mkdirSync(a,{recursive:!0});let c=qe(a),l=$.mkdtempSync(K.join(a,".microi-staging-")),g=qe(l),d=`${l}.backup`,u=!1;try{for(let m of $.readdirSync(n)){if(qe(l)!==g)throw je("EOWNER","Codex \u63D2\u4EF6\u6682\u5B58\u76EE\u5F55\u5F52\u5C5E\u5DF2\u53D8\u5316");$.cpSync(K.join(n,m),K.join(l,m),{recursive:!0,errorOnExist:!0,force:!1})}let p=Ar(l,"\u5F85\u5B89\u88C5 Microi Agentx \u63D2\u4EF6");if(p.name!==Be||p.packageName!==Kn||p.version!==t)throw new Error("\u5F85\u5B89\u88C5\u7684 Microi Agentx \u63D2\u4EF6\u8EAB\u4EFD\u6216\u7248\u672C\u4E0D\u4E00\u81F4");let f=nn(l);if(i!==void 0)Dr(r,d,i,c),u=!0;else if(!Un(r))throw je("EEXIST","Codex \u63D2\u4EF6\u53D1\u5E03\u76EE\u6807\u5DF2\u88AB\u5360\u7528\uFF0C\u62D2\u7EDD\u8986\u76D6");Dr(l,r,f,c)}catch(p){if(Un(r)&&u&&i!==void 0)try{Dr(d,r,i,c)}catch{}let f=[];try{qe(l)===g&&f.push(l)}catch{}try{i&&nn(d)===i&&f.push(d)}catch{}throw p instanceof Error&&f.length&&(p.message+=`\uFF1B\u5DF2\u4FDD\u7559\u53EF\u6062\u590D\u76EE\u5F55\uFF1A${f.join("\u3001")}`),p}try{u&&qe(a)===c&&nn(d)===i&&$.rmSync(d,{recursive:!0,force:!0})}catch{}}function Jo(s,e,t){let n=ii(),r=K.join(n,"microi-net-marketplace"),o=K.join(r,".agents","plugins","marketplace.json"),i=K.join(r,"plugins",Be);if($.mkdirSync(K.dirname(o),{recursive:!0}),$.existsSync(o)){let a;try{a=JSON.parse($.readFileSync(o,"utf8"))}catch(l){throw new Error(`\u5DF2\u5B58\u5728\u7684 Microi marketplace \u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1A${o}\uFF08${l instanceof Error?l.message:String(l)}\uFF09`)}let c=a.plugins?.find(l=>l.name===Be);if(a.name!==Ye||!Wo(c))throw new Error(`\u76EE\u6807\u76EE\u5F55\u5305\u542B\u975E Microi \u7BA1\u7406\u7684 marketplace\uFF0C\u62D2\u7EDD\u8986\u76D6\uFF1A${o}`)}return zo(e,i,t),(!$.existsSync(o)||$.readFileSync(o,"utf8")!==s)&&Go(o,s),r}function qo(s){let e=s.trim();if(!e||/[\r\n]/.test(e))throw new Error("Codex marketplace source \u65E0\u6548");let t=K.resolve(e);if($.existsSync(t))return t;if(K.isAbsolute(e)||e.startsWith("."))throw new Error(`Codex marketplace \u672C\u5730\u8DEF\u5F84\u4E0D\u5B58\u5728\uFF1A${t}`);return e}function jn(s,e,t){let n=Uo(Oe(s,["plugin","marketplace","list"]).stdout),r=jo(Oe(s,["plugin","list"]).stdout),o=n.find(S=>S.name===Ye),i=r.find(S=>S.selector===Ve),a=n.some(S=>S.name===rn),c=r.some(S=>S.selector===$n&&/^installed\b/i.test(S.status)),l=!!(i&&/^installed\b/i.test(i.status)),g=!!(i&&/enabled/i.test(i.status)),d=(Pt(i?.version||"",e)??0)>0,u=!e||i?.version===e||d,p,f;if(l&&t&&i?.version===e)try{Fr(t,i.pluginPath),p=!0}catch(S){p=!1,f=S instanceof Error?S.message:String(S)}let m=l?g?!u||p===!1?"update":"none":"enable":"install";return{ok:l&&g&&u&&p!==!1,codex:{found:!0,command:s.displayPath,version:s.version},marketplace:{name:Ye,configured:!!o,root:o?.root||""},plugin:{selector:Ve,installed:l,enabled:g,version:i?.version||"",expectedVersion:e,contentMatches:p,contentError:f},legacy:{marketplaceConfigured:a,pluginInstalled:c},action:m}}function oi(){let{expectedVersion:s,pluginRoot:e}=si(),t=ri();return t?jn(t,s,e):{ok:!1,codex:{found:!1,command:"",version:""},marketplace:{name:Ye,configured:!1,root:""},plugin:{selector:Ve,installed:!1,enabled:!1,version:"",expectedVersion:s},legacy:{marketplaceConfigured:!1,pluginInstalled:!1},action:"install-codex"}}function ai(s={}){let{content:e,expectedVersion:t,pluginRoot:n}=si(),r=ri();if(!r)throw new Error("\u672A\u627E\u5230\u53EF\u6267\u884C\u7684 Codex CLI\u3002\u8BF7\u5148\u5B89\u88C5\u6216\u66F4\u65B0 Codex\uFF0C\u518D\u6267\u884C microi codex install --yes");$.mkdirSync(ii(),{recursive:!0});let o=jn(r,t,n);if(o.plugin.installed&&(Pt(o.plugin.version,t)??0)>0){if(!o.plugin.enabled)throw new Error(`MICROI_CODEX_NEWER_PLUGIN_PRESERVED: \u5DF2\u4FDD\u7559\u8F83\u65B0\u63D2\u4EF6 ${o.plugin.version}\uFF1B\u5176\u5F53\u524D\u672A\u542F\u7528\uFF0C\u8BF7\u901A\u8FC7\u76F8\u5E94\u65B0\u7248 CLI \u6216\u5BBF\u4E3B\u542F\u7528\u3002`);return{installed:!0,changed:!1,selector:Ve,version:o.plugin.version,reason:"newer-plugin-preserved",restartRequired:!1}}if(o.plugin.contentMatches===!1&&!s.force)throw new Error(`MICROI_CODEX_PLUGIN_CONTENT_MISMATCH: ${o.plugin.contentError}\uFF1B\u5DF2\u4FDD\u7559\u5F53\u524D\u63D2\u4EF6\uFF0C\u672A\u8986\u76D6\u672C\u5730\u6B63\u6587\u3002`);if(o.ok&&!s.force){o.legacy.pluginInstalled&&Oe(r,["plugin","remove",$n]),o.legacy.marketplaceConfigured&&Oe(r,["plugin","marketplace","remove",rn]);let d=o.legacy.pluginInstalled||o.legacy.marketplaceConfigured;return{installed:!0,changed:d,selector:Ve,version:o.plugin.version,migratedFrom:d?rn:void 0,restartRequired:d}}let i=s.marketplaceSource?qo(s.marketplaceSource):Jo(e,n,t);o.marketplace.configured||Oe(r,["plugin","marketplace","add",i]);let a=jn(r,t,n);if(!a.marketplace.configured)throw new Error(`Codex \u672A\u80FD\u6CE8\u518C marketplace ${Ye}`);let c;s.force&&a.plugin.installed?(Oe(r,["plugin","remove",Ve]),c=Oe(r,["plugin","add",Ve],!0)):c=Oe(r,["plugin","add",Ve],!0);let l=jn(r,t,n);if(!l.plugin.installed||!l.plugin.enabled){let d=s.force?"--force \u5DF2\u6267\u884C\u663E\u5F0F\u91CD\u88C5\uFF0C\u8BF7\u68C0\u67E5\u4E0A\u65B9\u9519\u8BEF\u540E\u91CD\u8BD5\u3002":"\u539F\u6709\u63D2\u4EF6\u672A\u88AB\u5220\u9664\u3002";throw new Error(`\u5B89\u88C5 ${Ve} \u5931\u8D25\uFF0C${d}${Mr(c)?`
|
|
1383
|
+
${Mr(c)}`:""}`.trim())}if(l.plugin.version!==t)throw new Error(`\u5F53\u524D\u5DF2\u5B89\u88C5 ${l.plugin.version||"\u672A\u77E5\u7248\u672C"}\uFF0C\u76EE\u6807\u63D2\u4EF6\u5FEB\u7167\u4E3A ${t}\u3002\u8BF7\u4F7F\u7528 --force \u663E\u5F0F\u91CD\u88C5\u3002`);if(l.plugin.contentMatches!==!0)throw new Error(`MICROI_CODEX_PLUGIN_CONTENT_MISMATCH: ${l.plugin.contentError||"\u65E0\u6CD5\u786E\u8BA4\u5DF2\u5B89\u88C5\u63D2\u4EF6\u7684\u5B8C\u6574\u6B63\u6587"}\uFF1B\u5B89\u88C5\u72B6\u6001\u672A\u8BA1\u4E3A\u6210\u529F\u3002`);let g=o.legacy.pluginInstalled?$n:"";return o.legacy.pluginInstalled&&Oe(r,["plugin","remove",$n]),o.legacy.marketplaceConfigured&&Oe(r,["plugin","marketplace","remove",rn]),{installed:!0,changed:!0,selector:Ve,version:l.plugin.version,marketplace:Ye,marketplaceSource:i,migratedFrom:g||void 0,restartRequired:!0,next:"\u65B0\u5EFA Codex \u4EFB\u52A1\u6216\u91CD\u8F7D Codex\uFF0C\u4F7F\u63D2\u4EF6 Skills \u4E0E MCP \u751F\u6548\u3002"}}var Br=O(require("child_process")),De=O(require("fs")),Hn=O(require("os")),ae=O(require("path"));var He="@microi.net/cli",Yo=["web","headless"],Qo="https://registry.npmjs.org/";function Wn(s){try{let e=JSON.parse(De.readFileSync(s,"utf8"));return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}catch{return}}function Ke(s){return s&&typeof s=="object"&&!Array.isArray(s)?s:void 0}function ci(){let s=[ae.resolve(__dirname,".."),ae.resolve(__dirname,"..","..","plugins","microi")];for(let e of s){let t=Wn(ae.join(e,"package.json")),n=Ke(t?.dsh),r=Ke(n?.bundle),o=String(r?.patch||""),i=String(t?.version||"");if(!(t?.name!==He||!i||o!=="./cordis.patch.yml")&&De.existsSync(ae.join(e,"cordis.patch.yml")))return{root:e,version:i,patch:o}}throw new Error("CLI \u7F3A\u5C11\u5B8C\u6574\u7684 Microi DeepSeek Harness bundle\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\u6700\u65B0\u7248 @microi.net/cli")}function Xo(s){let e=ae.extname(s).toLowerCase();return e===".js"||e===".cjs"||e===".mjs"?{command:process.execPath,prefixArgs:[s],displayPath:s}:process.platform==="win32"&&(e===".cmd"||e===".bat")?{command:process.env.ComSpec||"cmd.exe",prefixArgs:["/d","/s","/c",s],displayPath:s}:{command:s,prefixArgs:[],displayPath:s}}function li(s,e,t=3e4){let n=Br.spawnSync(s.command,[...s.prefixArgs,...e],{cwd:process.cwd(),encoding:"utf8",windowsHide:!0,timeout:t,maxBuffer:33554432,env:{...process.env}});return{status:typeof n.status=="number"?n.status:1,stdout:String(n.stdout||""),stderr:[n.error?.message,n.stderr].filter(Boolean).join(`
|
|
1384
|
+
`)}}function Zo(){let s=String(process.env.MICROI_DSH_PATH||"").trim();if(s){let n=ae.resolve(s);if(!De.existsSync(n))throw new Error(`MICROI_DSH_PATH \u6307\u5411\u7684\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${n}`);return[n]}let e=process.platform==="win32"?[["where.exe",["dsh.exe"]],["where.exe",["dsh.cmd"]],["where.exe",["dsh"]]]:[["which",["dsh"]]],t=[];for(let[n,r]of e){let o=Br.spawnSync(n,r,{encoding:"utf8",windowsHide:!0,timeout:3e3});o.status===0&&t.push(...String(o.stdout||"").split(/\r?\n/).map(i=>i.trim()).filter(Boolean))}return process.platform!=="win32"&&t.push("dsh"),[...new Map(t.map(n=>[process.platform==="win32"?n.toLowerCase():n,n])).values()]}function di(){for(let s of Zo()){if(ae.isAbsolute(s)&&!De.existsSync(s))continue;let e=Xo(s),t=li(e,["--version"],5e3);if(t.status!==0)continue;let n=t.stdout.trim()||t.stderr.trim();if(n)return{...e,version:n}}}function ea(s){return s==="~"?Hn.homedir():s.startsWith("~/")||s.startsWith("~\\")?ae.join(Hn.homedir(),s.slice(2)):s}function Or(){let s=String(process.env.DSH_HOME||"").trim();return ae.resolve(ea(s||ae.join(Hn.homedir(),".dsh")))}function ta(s){let e=s.trim();if(!e||e==="."||e===".."||e==="node_modules"||/[/\\]/.test(e))throw new Error(`DeepSeek Harness profile \u540D\u79F0\u65E0\u6548\uFF1A${JSON.stringify(s)}`);return e}function ui(s){return s?[ta(s)]:[...Yo]}function na(s,e){if(!e)return;let t=ae.resolve(s,e),n=ae.relative(s,t);if(!(!n||n.startsWith("..")||ae.isAbsolute(n)))return t}function Vr(s,e,t,n){let r=ae.join(s,"profiles",e),o=Wn(ae.join(r,"package.json")),i=Ke(o?.dependencies),a=Ke(o?.dsh),c=Ke(a?.profile),l=Array.isArray(c?.bundles)?c?.bundles.map(String):[],g=ae.join(r,"node_modules","@microi.net","cli"),d=Wn(ae.join(g,"package.json")),u=Ke(d?.dsh),p=Ke(u?.bundle),f=String(p?.patch||""),m=na(g,f),S=!!o,C=typeof i?.[He]=="string",h=d?.name===He,y=h?String(d?.version||""):"",w=l.includes(He),k=f==="./cordis.patch.yml"&&!!(m&&De.existsSync(m)),b=(Pt(y,t)??0)>0,_=y===t||b,v,B;if(h&&y===t&&n)try{Fr(n,g),v=!0}catch(L){v=!1,B=L instanceof Error?L.message:String(L)}return{profile:e,profileDir:r,initialized:S,dependencyDeclared:C,installed:h,active:w,installedVersion:y,expectedVersion:t,bundlePatch:f,bundlePatchExists:k,contentMatches:v,contentError:B,ok:S&&C&&h&&w&&k&&_&&v!==!1,action:!h||!C?"install":!_||!k||v===!1?"update":w?"none":"activate"}}function ra(s,e){let t=ci(),n=Or(),r=e.map(i=>Vr(n,i,t.version,t.root)),o=s?r.some(i=>i.action==="install")?"install":r.some(i=>i.action==="update")?"update":r.some(i=>i.action==="activate")?"activate":"none":"install-dsh";return{ok:!!s&&r.every(i=>i.ok),dsh:{found:!!s,command:s?.displayPath||"",version:s?.version||"",home:n},package:{name:He,expectedVersion:t.version,bundlePatch:t.patch},profiles:r,action:o,requiresNewSession:o!=="none"&&o!=="install-dsh"}}function gi(s){return ra(di(),ui(s))}function sa(s){let e=ae.resolve(s);if(!De.existsSync(e))throw new Error(`DeepSeek Harness bundle \u672C\u5730\u6765\u6E90\u4E0D\u5B58\u5728\uFF1A${e}`);if(!De.statSync(e).isDirectory()){if(!/\.(?:tgz|tar\.gz)$/i.test(e))throw new Error("DeepSeek Harness bundle --source \u53EA\u63A5\u53D7\u672C\u5730\u76EE\u5F55\u6216 .tgz/.tar.gz");return e}let t=[e,ae.join(e,"plugins","microi")];for(let n of t){let r=Wn(ae.join(n,"package.json")),o=Ke(r?.dsh),i=Ke(o?.bundle);if(r?.name===He&&i?.patch==="./cordis.patch.yml"&&De.existsSync(ae.join(n,"cordis.patch.yml")))return n}throw new Error(`\u672C\u5730\u6765\u6E90\u4E0D\u662F\u5B8C\u6574\u7684 ${He} DeepSeek Harness bundle\uFF1A${e}`)}function ia(s){return[s.stderr,s.stdout].filter(Boolean).join(`
|
|
1385
|
+
`).trim().slice(0,5e3)}function pi(s={}){let e=di();if(!e)throw new Error("\u672A\u68C0\u6D4B\u5230 DeepSeek Harness dsh CLI\uFF1B\u8BF7\u5148\u6267\u884C npm install -g @deepseek-ai/dsh\uFF0C\u518D\u91CD\u8BD5 microi dsh install");let t=ci(),n=ui(s.profile),r=s.source?sa(s.source):"",o=r||`${He}@${t.version}`,i=[];for(let c of n){let l=Vr(Or(),c,t.version,t.root);if((Pt(l.installedVersion,t.version)??0)>0){if(!l.ok)throw new Error(`MICROI_DSH_NEWER_BUNDLE_PRESERVED: profile ${c} \u5DF2\u4FDD\u7559\u8F83\u65B0\u7248\u672C ${l.installedVersion}\uFF0C\u8BF7\u7528\u76F8\u5E94\u65B0\u7248 CLI \u4FEE\u590D\u5176\u6FC0\u6D3B\u72B6\u6001\u3002`);i.push({...l,changed:!1});continue}if(l.contentMatches===!1&&!s.force)throw new Error(`MICROI_DSH_BUNDLE_CONTENT_MISMATCH: profile ${c} ${l.contentError}\uFF1B\u5DF2\u4FDD\u7559\u672C\u5730\u6B63\u6587\u3002`);if(l.ok&&!s.force){i.push({...l,changed:!1});continue}let g=["plugin","--profile",c,"add",o,"--save-exact",...r?[]:[`--registry=${Qo}`]],d=li(e,g,5*6e4);if(d.status!==0)throw new Error(`DeepSeek Harness profile ${c} \u5B89\u88C5 Microi bundle \u5931\u8D25\uFF1A${ia(d)||`exit ${d.status}`}`);let u=Vr(Or(),c,t.version,t.root);if(!u.ok)throw new Error(`DeepSeek Harness profile ${c} \u5B89\u88C5\u540E\u6821\u9A8C\u5931\u8D25\uFF08action=${u.action}\uFF0Cversion=${u.installedVersion||"missing"}\uFF09`);i.push({...u,changed:!0})}let a=i.some(c=>c.changed);return{ok:!0,package:`${He}@${t.version}`,source:o,profiles:i,requiresNewSession:a,message:a?"Microi\u543E\u7801\u5DF2\u5B89\u88C5\u4E3A DeepSeek Harness profile bundle\uFF1B\u8BF7\u65B0\u5EFA DSH \u4F1A\u8BDD\u52A0\u8F7D\u65B0\u589E MCP \u5DE5\u5177\uFF0C\u5F53\u524D\u4F1A\u8BDD\u4E0D\u4F1A\u88AB\u7EC8\u6B62\u3002":"DeepSeek Harness \u4E2D\u7684 Microi\u543E\u7801 bundle \u5DF2\u662F\u5F53\u524D\u7248\u672C\uFF0C\u65E0\u9700\u6539\u52A8\u3002"}}var zn=O(require("crypto")),W=O(require("fs")),cn=O(require("os")),H=O(require("path"));function Lr(s){return s.normalize("NFKD").replace(/[^\x00-\x7F]/g,"").replace(/[^A-Za-z0-9_]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"").toLowerCase().slice(0,48)}function mi(s){try{return Lr(new URL(s.apiBaseUrl.trim().replace(/\/+$/,"")).host)}catch{return Lr(s.apiBaseUrl)}}function fi(s){return Lr(s.osClient||s.sysShortTitle||s.sysTitle||s.label||"")||mi(s)||"default"}function We(s){let e=new Map;for(let r of s){let o=fi(r);e.set(o,(e.get(o)||0)+1)}let t=new Set(Array.from(e).filter(([,r])=>r>1).map(([r])=>r)),n=new Set;return s.map(r=>{let o=mi(r),i=fi(r),a=`microi_${i}`,c=t.has(i)&&o&&o!==i?`${a}_${o}`:a;n.has(c)&&o&&(c=`${a}_${o}`);let l=2;for(;n.has(c);)c=`${a}_${l++}`;return n.add(c),{profile:r,mcpName:c}})}var sn=O(require("crypto")),ue=O(require("fs")),hi=O(require("os")),Ne=O(require("path")),yi=require("util");function Si(s=process.env,e=hi.homedir()){let t=String(s.WORKBUDDY_CONFIG_DIR||"").trim(),n=Ne.resolve(t||Ne.join(e,".workbuddy"));return{configRoot:n,configPath:Ne.join(n,"mcp.json"),configSource:t?"WORKBUDDY_CONFIG_DIR":"user-home",pathVerification:"cli-resolved-not-confirmed-by-host",pathNote:"\u8DEF\u5F84\u6309\u5F53\u524D CLI \u73AF\u5883\u4E0E\u7528\u6237\u76EE\u5F55\u89E3\u6790\uFF1BWorkBuddy \u8FDB\u7A0B\u53EF\u80FD\u4F7F\u7528\u4E0D\u540C\u73AF\u5883\u6216\u8FD0\u884C\u65F6 configDir\uFF0C\u4ECD\u9700\u5728\u539F\u751F\u5BA2\u6237\u7AEF\u6838\u5BF9\u5B9E\u9645\u76EE\u5F55"}}function be(s){return!!s&&typeof s=="object"&&!Array.isArray(s)}function Ci(s){if(!ue.existsSync(s))return{encoding:"missing",document:{}};let e=ue.readFileSync(s),t="utf8",n;try{e[0]===255&&e[1]===254?(t="utf16le",n=e.subarray(2).toString("utf16le")):e[0]===254&&e[1]===255?(t="utf16be",n=Buffer.from(e.subarray(2)).swap16().toString("utf16le")):(e[0]===239&&e[1]===187&&e[2]===191&&(t="utf8-bom"),n=new yi.TextDecoder("utf-8",{fatal:!0}).decode(e))}catch{return{encoding:"invalid",error:"\u539F\u751F\u914D\u7F6E\u4E0D\u662F\u6709\u6548\u7684 UTF-8 JSON\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6"}}let r;try{r=JSON.parse(n.replace(/^\uFEFF/,""))}catch{return{encoding:t,error:"\u539F\u751F\u914D\u7F6E JSON \u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1B\u89E3\u6790\u9519\u8BEF\u6B63\u6587\u4E0D\u56DE\u663E\u4EE5\u4FDD\u62A4\u79D8\u5BC6"}}return!be(r)||r.mcpServers!==void 0&&!be(r.mcpServers)?{encoding:t,error:"\u539F\u751F\u914D\u7F6E\u5FC5\u987B\u4E3A\u5305\u542B mcpServers \u5BF9\u8C61\u7684 JSON"}:{encoding:t,raw:e,document:r}}function Gn(s){let e=be(s.env)?s.env:{};return["MICROI_API_URL","MICROI_OS_CLIENT","MICROI_OS_CLIENT_TYPE","MICROI_OS_CLIENT_NETWORK"].map(t=>t==="MICROI_API_URL"?String(e[t]||"").trim().replace(/\/+$/,""):String(e[t]||"").trim()).join("|")}function $r(s){let e=be(s.env)?s.env:{},t=String(e.MICROI_WORKSPACE_ROOT||"").trim(),n=t?Ne.resolve(t).replace(/\\/g,"/"):"";return process.platform==="win32"?n.toLowerCase():n}function It(s,e){return Gn(s)!=="|||"&&Gn(s)===Gn(e)&&$r(s)===$r(e)}function oa(s,e,t){if(be(s[e])&&It(s[e],t))return e;let n=Object.entries(s).find(([,o])=>be(o)&&It(o,t));if(n)return n[0];if(!Object.prototype.hasOwnProperty.call(s,e))return e;let r=sn.createHash("sha256").update(`${Gn(t)}|${$r(t)}`).digest("hex");for(let o of[8,12,20]){let i=`${e}_${r.slice(0,o)}`;if(!Object.prototype.hasOwnProperty.call(s,i)||be(s[i])&&It(s[i],t))return i}throw new Error("WorkBuddy \u539F\u751F MCP \u540D\u79F0\u53D1\u751F\u51B2\u7A81\uFF0C\u5DF2\u4FDD\u7559\u73B0\u6709\u8FDE\u63A5")}function aa(s){let e=String(s.command||""),t=Array.isArray(s.args)?s.args.map(String).sort().join(","):"",n=Object.keys(be(s.env)?s.env:{}).sort().join(","),r=typeof s.cwd=="string"&&s.cwd.trim()?s.cwd:"";return sn.createHash("sha256").update([e,t,n,...r?[r]:[]].join("|")).digest("hex")}function ca(s,e,t){let n=Ne.join(s,"mcp-approvals.json");if(!ue.existsSync(n))return"pending";try{let r=JSON.parse(ue.readFileSync(n,"utf8"));if(!be(r))return"unknown";let o=r[`${aa(t)}::${e}`];return typeof o=="number"&&Number.isFinite(o)?"approved":"pending"}catch{return"unknown"}}function Ur(s,e,t=Si()){let n=Ci(t.configPath),r={requested:!0,...t,encoding:n.encoding,configurationReady:!1,nativeRegistration:"not-configured",trust:"unknown",toolInjection:"unverified",connection:"not-tested",message:n.error||"\u5C1A\u672A\u5728 WorkBuddy \u539F\u751F\u7528\u6237\u914D\u7F6E\u4E2D\u627E\u5230\u672C\u5DE5\u4F5C\u533A\u7684\u8FDE\u63A5"};if(n.error||!n.document)return{...r,nativeRegistration:"unknown"};let o=n.document.mcpServers||{},i=Object.entries(o).find(([f,m])=>f===s&&be(m)&&It(m,e))?.[0]||Object.entries(o).find(([,f])=>be(f)&&It(f,e))?.[0];if(!i)return r;let a=o[i];if(typeof a.command!="string"||!a.command.trim()||a.args!==void 0&&(!Array.isArray(a.args)||!a.args.every(f=>typeof f=="string"))||a.env!==void 0&&(!be(a.env)||!Object.values(a.env).every(f=>["string","number","boolean"].includes(typeof f))))return{...r,serverName:i,nativeRegistration:"unknown",message:"\u672C\u8FDE\u63A5\u7684\u539F\u751F stdio \u914D\u7F6E Schema \u65E0\u6548\uFF0C\u4E0D\u80FD\u4F5C\u4E3A\u539F\u751F\u8FDE\u63A5\u6210\u529F"};let c=n.encoding==="utf8",l=Ne.isAbsolute(a.command),g=l&&ue.existsSync(a.command)&&ue.statSync(a.command).isFile()&&(!Array.isArray(a.args)||a.args.filter(f=>Ne.isAbsolute(String(f))).every(f=>ue.existsSync(String(f))))&&(typeof a.cwd!="string"||!a.cwd||ue.existsSync(a.cwd)&&ue.statSync(a.cwd).isDirectory()),d=l?g?"files-present":"files-missing":"relative-command-not-verified",u=a.disabled===!0,p=ca(t.configRoot,i,a);return{...r,serverName:i,disabled:u,trust:p,startupFilesReady:g,startupCheck:d,configurationReady:c&&g,nativeRegistration:c?"configured":"unknown",message:c?l?g?u?"\u8FDE\u63A5\u5DF2\u914D\u7F6E\u4F46\u88AB\u7528\u6237\u7981\u7528\uFF1B\u5B89\u88C5\u5668\u4FDD\u6301\u7981\u7528\u72B6\u6001":p==="approved"?"\u539F\u751F\u914D\u7F6E\u53CA\u73B0\u6709\u4FE1\u4EFB\u8BB0\u5F55\u5339\u914D\uFF1B\u4ECD\u987B\u5728\u5F53\u524D WorkBuddy \u5BF9\u8BDD\u9A8C\u8BC1\u5DE5\u5177\u6CE8\u5165":p==="pending"?"\u539F\u751F\u914D\u7F6E\u5DF2\u5199\u5165\uFF0CWorkBuddy \u5C1A\u65E0\u5339\u914D\u7684\u7528\u6237\u4FE1\u4EFB\u8BB0\u5F55":"\u539F\u751F\u914D\u7F6E\u5DF2\u5199\u5165\uFF0C\u539F\u751F\u4FE1\u4EFB\u72B6\u6001\u65E0\u6CD5\u6838\u5B9E":"\u539F\u751F\u914D\u7F6E\u5DF2\u627E\u5230\uFF0C\u4F46\u542F\u52A8\u547D\u4EE4\u3001\u7EDD\u5BF9\u53C2\u6570\u8DEF\u5F84\u6216\u5DE5\u4F5C\u76EE\u5F55\u7F3A\u5931\uFF0C\u9700\u8981\u4FEE\u590D\u542F\u52A8\u6587\u4EF6":"\u539F\u751F\u547D\u4EE4\u4F9D\u8D56 PATH\uFF1BCLI \u672A\u9A8C\u8BC1\u5176\u5B9E\u9645\u53EF\u6267\u884C\u6587\u4EF6\uFF0C\u4E0D\u80FD\u4F5C\u4E3A\u542F\u52A8\u6210\u529F":`\u539F\u751F\u914D\u7F6E\u7F16\u7801\u4E3A ${n.encoding}\uFF0C\u9700\u8981\u53D7\u63A7\u4FEE\u590D\u4E3A\u65E0 BOM \u7684 UTF-8`}}function wi(s,e,t={}){let n=t.location||Si(),r=Ci(n.configPath);if(r.error||!r.document)throw new Error(r.error||"WorkBuddy \u539F\u751F\u914D\u7F6E\u65E0\u6CD5\u8BFB\u53D6");let o=r.document,i=o.mcpServers||{};if(r.encoding!=="missing"&&r.encoding!=="utf8"){let d=Object.keys(o).every(u=>u==="mcpServers")&&Object.keys(i).length===1&&be(i[s])&&It(i[s],e);if(!t.repairEncoding||!d)throw new Error(`WorkBuddy \u539F\u751F\u914D\u7F6E\u7F16\u7801\u4E3A ${r.encoding}\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1B\u4EC5\u542B\u672C\u8FDE\u63A5\u65F6\u53EF\u663E\u5F0F\u52A0 --repair-workbuddy-encoding\uFF0C\u6DF7\u5408\u914D\u7F6E\u8BF7\u5728 WorkBuddy \u4E2D\u53E6\u5B58\u4E3A UTF-8`)}let a=oa(i,s,e),c=be(i[a])?i[a]:{};i[a]={...c,...e,env:{...be(c.env)?c.env:{},...be(e.env)?e.env:{}}},o.mcpServers=i;let l=`${JSON.stringify(o,null,2)}
|
|
1386
|
+
`,g=!ue.existsSync(n.configPath)||!ue.readFileSync(n.configPath).equals(Buffer.from(l));if(g){ue.mkdirSync(n.configRoot,{recursive:!0});let d=Ne.join(n.configRoot,`.microi-mcp-${process.pid}-${sn.randomBytes(6).toString("hex")}.tmp`);try{ue.writeFileSync(d,l,"utf8");let u=ue.existsSync(n.configPath)?ue.readFileSync(n.configPath):void 0;if(r.raw?!u?.equals(r.raw):u)throw new Error("WorkBuddy \u539F\u751F\u914D\u7F6E\u5DF2\u88AB\u5176\u5B83\u8FDB\u7A0B\u4FEE\u6539\uFF0C\u5DF2\u4FDD\u7559\u5176\u5185\u5BB9\uFF1B\u8BF7\u91CD\u65B0\u68C0\u67E5\u540E\u518D\u521D\u59CB\u5316");ue.renameSync(d,n.configPath)}finally{ue.existsSync(d)&&ue.unlinkSync(d)}}return{...Ur(a,e,n),changed:g}}var on="";function Qe(){if(on)return on;try{let s=JSON.parse(W.readFileSync(H.join(__dirname,"..","package.json"),"utf8"));on=/^\d+(?:\.\d+){2}$/.test(String(s.version||""))?String(s.version):"0.0.0"}catch{on="0.0.0"}return on}function la(s){return s.trim().replace(/\/+$/,"")}function da(){let s=`MCP:${cn.hostname()||"Unknown"}`;return/^[\x20-\x7E]{1,128}$/.test(s)?s:`MCP-${zn.createHash("sha256").update(s).digest("hex").slice(0,16)}`}function vi(s){let e=H.basename(s).toLowerCase();return!!process.versions.electron||["code.exe","code - insiders.exe","cursor.exe","windsurf.exe","trae.exe","electron.exe"].includes(e)}function ua(){return{command:process.execPath,isElectron:vi(process.execPath)}}function ga(s,e){let t=e.env;return/^microi(?:_|-|$)/i.test(s)||typeof t?.MICROI_API_URL=="string"}function ki(s,e){let t=`${s}.${process.pid}.${Date.now()}.tmp`;try{W.writeFileSync(t,e,"utf8"),W.renameSync(t,s)}finally{try{W.existsSync(t)&&W.unlinkSync(t)}catch{}}}function Le(s,e){if(W.existsSync(s)&&W.readFileSync(s).equals(e))return;W.mkdirSync(H.dirname(s),{recursive:!0});let t=`${process.pid}.${Date.now()}.${zn.randomBytes(4).toString("hex")}`,n=`${s}.${t}.stage`,r=`${s}.${t}.backup`,o=!1;try{W.writeFileSync(n,e),W.existsSync(s)&&(W.renameSync(s,r),o=!0),W.renameSync(n,s),o&&W.rmSync(r,{force:!0})}catch(i){if(!W.existsSync(s)&&o&&W.existsSync(r))try{W.renameSync(r,s)}catch{}throw i}finally{try{W.existsSync(n)&&W.rmSync(n,{force:!0})}catch{}}}function pa(){let s=Qe();if(!/^\d+(?:\.\d+){2}$/.test(s))throw new Error(`CLI \u7248\u672C\u4E0D\u5408\u6CD5\uFF0C\u65E0\u6CD5\u521B\u5EFA MCP \u8FD0\u884C\u65F6\uFF1A${s}`);let e={launcher:H.join(__dirname,"microi-cli-mcp.js"),server:H.join(__dirname,"mcp-server.js"),adapter:H.join(__dirname,"mcp-codex-stdio-adapter.js"),router:H.join(__dirname,"microi-codex-router.js"),broker:H.join(__dirname,"microi-codex-broker.js"),cli:H.join(__dirname,"microi-cli.js"),trae:H.join(__dirname,"mcp-trae-windows-launcher.cmd")},t=Object.values(e).filter(u=>!W.existsSync(u));if(t.length>0)throw new Error(`CLI \u5B89\u88C5\u5305\u7F3A\u5C11\u5185\u7F6E MCP \u8FD0\u884C\u6587\u4EF6\uFF1A${t.join(", ")}`);let n=H.resolve(process.env.MICROI_RUNTIME_HOME||H.join(cn.homedir(),".microi","runtime")),r=H.join(n,"versions"),o=H.join(r,s);W.mkdirSync(o,{recursive:!0}),Le(H.join(o,"microi-cli-mcp.js"),W.readFileSync(e.launcher)),Le(H.join(o,"mcp-server.js"),W.readFileSync(e.server)),Le(H.join(o,"microi-codex-router.js"),W.readFileSync(e.router)),Le(H.join(o,"microi-codex-broker.js"),W.readFileSync(e.broker)),Le(H.join(o,"microi-cli.js"),W.readFileSync(e.cli));let i=`#!/usr/bin/env node
|
|
1386
1387
|
'use strict';
|
|
1387
1388
|
const fs = require('node:fs');
|
|
1388
1389
|
const path = require('node:path');
|
|
@@ -1394,27 +1395,27 @@ const target = path.resolve(versionsRoot, pointer.version, 'microi-cli-mcp.js');
|
|
|
1394
1395
|
const relative = path.relative(versionsRoot, target);
|
|
1395
1396
|
if (!relative || relative.startsWith('..') || path.isAbsolute(relative)) throw new Error('Unsafe Microi MCP runtime target');
|
|
1396
1397
|
require(target);
|
|
1397
|
-
`,a=H.join(n,"microi-cli-mcp.js"),c=H.join(n,"mcp-codex-stdio-adapter.js"),l=H.join(n,"microi-codex-router.js"),g=H.join(n,"mcp-trae-windows-launcher.cmd");
|
|
1398
|
-
`,"utf8")),{root:n,launcherPath:a,adapterPath:c,routerPath:l,traeLauncherPath:g}}function
|
|
1399
|
-
`;(!W.existsSync(s)||W.readFileSync(s,"utf8")!==c)&&
|
|
1400
|
-
`);if(!(/^microi(?:_|-|$)/.test(l)||/\bMICROI_(?:API_URL|TOKEN_FILE|OS_CLIENT)\b/.test(g)))return!0;let u=g.match(/["']?MICROI_TOOL_VERSION["']?\s*=\s*["']([^"']+)["']/)?.[1]||"";return
|
|
1398
|
+
`,a=H.join(n,"microi-cli-mcp.js"),c=H.join(n,"mcp-codex-stdio-adapter.js"),l=H.join(n,"microi-codex-router.js"),g=H.join(n,"mcp-trae-windows-launcher.cmd");Le(a,Buffer.from(i,"utf8"));let d=i.replace(/microi-cli-mcp\.js/g,"microi-codex-router.js");return Le(l,Buffer.from(d,"utf8")),Le(c,W.readFileSync(e.adapter)),Le(g,W.readFileSync(e.trae)),Le(H.join(n,"current.json"),Buffer.from(`${JSON.stringify({version:s,activatedAt:new Date().toISOString()},null,2)}
|
|
1399
|
+
`,"utf8")),{root:n,launcherPath:a,adapterPath:c,routerPath:l,traeLauncherPath:g}}function Rt(s,e,t,n=!1){W.mkdirSync(H.dirname(s),{recursive:!0});let r={};if(W.existsSync(s))try{r=wn(W.readFileSync(s,"utf8"))}catch(l){throw new Error(`MCP \u914D\u7F6E\u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u4E14\u505C\u6B62\u5199\u5165\uFF1A${s}\uFF08${l instanceof Error?l.message:String(l)}\uFF09`)}let o=r[e]&&typeof r[e]=="object"?r[e]:{},i=Object.fromEntries(Object.entries(t).map(([l,g])=>[l,n?Object.fromEntries(Object.entries(g).filter(([d])=>["command","args","env","url","headers"].includes(d))):g])),a=Zs(o,i,{isManaged:ga,isStableName:l=>/^microi_[a-z0-9_]+$/.test(l),removeManagedNotInNext:!0});r[e]=a.servers;let c=`${JSON.stringify(r,null,2)}
|
|
1400
|
+
`;(!W.existsSync(s)||W.readFileSync(s,"utf8")!==c)&&ki(s,c)}function an(s){return JSON.stringify(String(s))}function fa(s){return`[${s.map(an).join(", ")}]`}function ma(s){return`{ ${Object.entries(s).filter(([,e])=>e!==""&&e!=null).map(([e,t])=>`${an(e)} = ${an(t)}`).join(", ")} }`}function ha(s,e){let t=[],n=[];for(let i of s.split(/\r?\n/))/^\s*\[[^\]]+\]\s*$/.test(i)&&n.length&&(t.push(n),n=[]),n.push(i);n.length&&t.push(n);let r=new Set;return{cleaned:t.filter(i=>{let c=i.find(p=>p.trim())?.match(/^\s*\[mcp_servers\.(?:"([^"]+)"|([A-Za-z0-9_-]+))(?:\.|\])/)||null;if(!c)return!0;let l=(c[1]||c[2]||"").toLowerCase(),g=i.join(`
|
|
1401
|
+
`);if(!(/^microi(?:_|-|$)/.test(l)||/\bMICROI_(?:API_URL|TOKEN_FILE|OS_CLIENT)\b/.test(g)))return!0;let u=g.match(/["']?MICROI_TOOL_VERSION["']?\s*=\s*["']([^"']+)["']/)?.[1]||"";return tn(u,e)>0?(r.add(l),!0):!1}).map(i=>i.join(`
|
|
1401
1402
|
`)).join(`
|
|
1402
1403
|
`).replace(/\n{3,}/g,`
|
|
1403
1404
|
|
|
1404
|
-
`).trimEnd(),preservedNames:r}}function
|
|
1405
|
-
`):"",
|
|
1405
|
+
`).trimEnd(),preservedNames:r}}function bi(s,e,t,n,r){W.mkdirSync(H.dirname(s),{recursive:!0});let o=W.existsSync(s)?W.readFileSync(s,"utf8"):"",i=Qe(),{cleaned:a,preservedNames:c}=ha(o,i),l=Object.values(e).find(m=>typeof m.command=="string"),g=String(l?.command||""),d={...l?.env||{}},u=Object.fromEntries(Object.entries(d).filter(([m])=>!m.startsWith("MICROI_")));g&&vi(g)&&(u.ELECTRON_RUN_AS_NODE="1");let p=l&&c.size===0?["[mcp_servers.microi_codex]",`command = ${an(g)}`,`args = ${fa([t,n])}`,`cwd = ${an(r)}`,`env = ${ma({...u,MICROI_CODEX_MODE:"1",MICROI_TOOL_SOURCE:"cli-codex-router",MICROI_TOOL_VERSION:i,MICROI_WORKSPACE_ROOT:r})}`,'enabled_tools = ["microi_codex"]','default_tools_approval_mode = "auto"'].join(`
|
|
1406
|
+
`):"",f=[a,p].filter(Boolean).join(`
|
|
1406
1407
|
|
|
1407
1408
|
`)+`
|
|
1408
|
-
`;(!W.existsSync(s)||
|
|
1409
|
-
`))>=0;){let w=c.slice(0,
|
|
1410
|
-
`)})},C=setTimeout(()=>
|
|
1411
|
-
`);let h=await
|
|
1412
|
-
`;s.workspace&&
|
|
1413
|
-
`,"utf8")}function
|
|
1414
|
-
`).trim()}}function
|
|
1415
|
-
`),U.closeSync(n),{token:e,release:()=>{try{JSON.parse(U.readFileSync(s.lock,"utf8")).token===e&&U.rmSync(s.lock,{force:!0})}catch{}}}}catch(n){if((n&&typeof n=="object"?n.code:"")!=="EEXIST")throw n;try{if(Date.now()-U.statSync(s.lock).mtimeMs<
|
|
1409
|
+
`;(!W.existsSync(s)||o!==f)&&ki(s,f)}function ya(s,e){let t=e.label||e.sysShortTitle||e.sysTitle||e.apiBaseUrl||"\u672A\u547D\u540D\u670D\u52A1\u5668";return H.join(s.getSyncRootDir(),s.buildServerDirName(t,e.apiBaseUrl),s.buildOsClientDirName(e.osClient,e.osClientType,e.osClientNetwork),as)}function Sa(s,e,t){let n={...s.env||{}},r=String(s.command||""),o=Array.isArray(s.args)?s.args.map(String):[];return process.platform==="win32"&&r&&o.length>0?{command:"cmd.exe",args:["/d","/s","/c","call",t,r,e,o[0]],env:n}:{command:r,args:o,env:n}}function Ca(s){return typeof s.url=="string"&&s.url.trim()?{url:s.url,...s.headers&&typeof s.headers=="object"?{headers:{...s.headers}}:{}}:{command:String(s.command||""),args:Array.isArray(s.args)?s.args.map(String):[],...s.env&&typeof s.env=="object"?{env:{...s.env}}:{}}}function wa(s){return typeof s.url=="string"&&s.url.trim()?{transportType:"streamableHttp",url:s.url,...s.headers&&typeof s.headers=="object"?{headers:{...s.headers}}:{}}:{transportType:"stdio",command:String(s.command||""),args:Array.isArray(s.args)?s.args.map(String):[],...s.env&&typeof s.env=="object"?{env:{...s.env}}:{},...typeof s.cwd=="string"&&s.cwd?{cwd:s.cwd}:{}}}function Jn(s,e){let t=N.getInstance(),n=ke.getInstance(),r=n.getCredentialSecretKeys(e),o=n.mcpTokenFilePath;return{MICROI_API_URL:la(e.apiBaseUrl),MICROI_TOKEN_FILE:o,MICROI_AUTH_RECOVERY_DIR:n.mcpAuthRecoveryDirPath,MICROI_WORKSPACE_CREDENTIAL_FILE:o?H.join(H.dirname(o),kt):"",MICROI_WORKSPACE_USERNAME_KEY:r.usernameKey,MICROI_WORKSPACE_PASSWORD_KEY:r.passwordKey,MICROI_OS_CLIENT:e.osClient||"",MICROI_OS_CLIENT_TYPE:e.osClientType||"",MICROI_OS_CLIENT_NETWORK:e.osClientNetwork||"",MICROI_WORKSPACE_ROOT:s,MICROI_SYNC_ROOT:t.getSyncRootDir(),MICROI_AI_APPLICATIONS_DIR:ya(t,e),MICROI_LABEL_BASE64:Buffer.from(e.label||"","utf8").toString("base64"),MICROI_MCP_DID:da(),MICROI_TOOL_SOURCE:"cli",MICROI_TOOL_VERSION:Qe()}}async function qn(s,e={}){let t=N.getInstance(),n=ke.getInstance(),r=j.getInstance(),o=t.getProfiles(),i=pa(),a=i.launcherPath,c=i.adapterPath,l=i.routerPath,g=i.traeLauncherPath,d=ua(),u={};for(let{profile:h,mcpName:y}of We(o)){let w=n.mcpTokenFilePath,k=w?H.join(H.dirname(w),kt):"",b=r.getTokenForServer(h.apiBaseUrl,h.osClient,h.osClientType,h.osClientNetwork);!w||!b&&!W.existsSync(k)||(u[y]={type:"stdio",command:d.command,args:[a],cwd:i.root,env:{...d.isElectron?{ELECTRON_RUN_AS_NODE:"1"}:{},...Jn(s,h)}})}await n.writeMcpTokenFile(),wt(s),Je(s,[".vscode/mcp.json",".cursor/mcp.json",".trae/mcp.json",".workbuddy/mcp.json",".comate/mcp.json",".mcp.json",".codex/config.toml","Microi-V8-Engine/.microi-mcp-tokens.json",`Microi-V8-Engine/${kt}`]),Rt(H.join(s,".vscode","mcp.json"),"servers",u),Rt(H.join(s,".cursor","mcp.json"),"mcpServers",u);let p=Object.fromEntries(Object.entries(u).map(([h,y])=>[h,Sa(y,c,g)]));Rt(H.join(s,".trae","mcp.json"),"mcpServers",p,!0);let f=Object.fromEntries(Object.entries(u).map(([h,y])=>[h,Ca(y)]));Rt(H.join(s,".workbuddy","mcp.json"),"mcpServers",f,!0);let m=Object.fromEntries(Object.entries(u).map(([h,y])=>[h,wa(y)]));Rt(H.join(s,".comate","mcp.json"),"mcpServers",m),Rt(H.join(s,".mcp.json"),"mcpServers",u,!0);let S=process.env.CODEX_HOME||H.join(cn.homedir(),".codex");e.globalCodex!==!1&&bi(H.join(S,"config.toml"),u,c,l,s),bi(H.join(s,".codex","config.toml"),u,c,l,s);let C={requested:!1,state:"not-requested"};if(e.workBuddyProfile){let h=e.workBuddyProfile,y=We(o).find(w=>w.profile.apiBaseUrl===h.apiBaseUrl&&w.profile.osClient===h.osClient&&w.profile.osClientType===h.osClientType&&w.profile.osClientNetwork===h.osClientNetwork);if(!y||!f[y.mcpName])throw new Error("\u6240\u9009\u8FDE\u63A5\u6CA1\u6709\u53EF\u6062\u590D\u7684\u767B\u5F55\u5F15\u7528\uFF0C\u672A\u5199\u5165 WorkBuddy \u539F\u751F\u7528\u6237\u914D\u7F6E");C=wi(y.mcpName,f[y.mcpName],{repairEncoding:e.repairWorkBuddyEncoding})}return{count:Object.keys(u).length,names:Object.keys(u),nativeWorkBuddy:C}}var Ei=require("child_process"),Ti=require("string_decoder"),ln=class extends Error{constructor(t){super("MCP \u8C03\u7528\u5DF2\u53D6\u6D88\uFF0C\u6267\u884C\u7ED3\u679C\u53EF\u80FD\u672A\u77E5\uFF1B\u8BF7\u5148\u56DE\u8BFB\u540E\u518D\u7EE7\u7EED");this.exitCode=t}};async function _i(s){let e="",t=new Ti.StringDecoder("utf8"),n=0;for await(let o of s){let i=typeof o=="string"?Buffer.from(o,"utf8"):o;if(n+=i.length,n>64*1024*1024)throw new Error("MCP \u53C2\u6570\u8D85\u8FC7 64 MiB\uFF0C\u8BF7\u4F7F\u7528\u5DE5\u5177\u652F\u6301\u7684\u6587\u4EF6/\u6D41\u5F0F\u53C2\u6570");e+=t.write(i)}e+=t.end();let r;try{r=JSON.parse(e.replace(/^\uFEFF/,""))}catch{throw new Error("MCP \u53C2\u6570\u683C\u5F0F\u65E0\u6548\uFF0C\u6807\u51C6\u8F93\u5165\u5FC5\u987B\u662F JSON \u5BF9\u8C61\uFF1B\u65E0\u53C2\u6570\u65F6\u4F20 {}")}if(!r||typeof r!="object"||Array.isArray(r))throw new Error("MCP \u53C2\u6570\u5FC5\u987B\u662F JSON \u5BF9\u8C61");return r}async function Pi(s,e,t="",n={},r=12e4,o){if(e==="call"&&!/^microi_[A-Za-z0-9_]+$/.test(t))throw new Error("\u8BF7\u63D0\u4F9B\u6709\u6548\u7684 microi_* \u5DE5\u5177\u540D\u79F0");if(!Number.isSafeInteger(r)||r<1e3||r>18e5)throw new Error("MCP \u8D85\u65F6\u5FC5\u987B\u4E3A 1000\u20131800000 \u6BEB\u79D2");let i=(0,Ei.spawn)(s.command,s.args,{cwd:s.cwd,env:s.env,windowsHide:!0,shell:!1,stdio:["pipe","pipe","pipe"]}),a=0,c="",l,g=!1,d,u,p=new Map,f=h=>{l||=h;for(let y of p.values())y.reject(h);p.clear()},m=["SIGINT","SIGTERM","SIGHUP"].map(h=>{let y=()=>{u||=new ln(h==="SIGINT"?130:h==="SIGTERM"?143:129),f(u)};return process.on(h,y),[h,y]});i.stderr.resume(),i.stdout.setEncoding("utf8"),i.stdout.on("data",h=>{if(c+=h,Buffer.byteLength(c,"utf8")>256*1024*1024){f(new Error("MCP \u54CD\u5E94\u8D85\u8FC7 256 MiB\uFF0C\u8BF7\u7F29\u5C0F\u67E5\u8BE2\u8303\u56F4"));return}let y;for(;(y=c.indexOf(`
|
|
1410
|
+
`))>=0;){let w=c.slice(0,y).trim();if(c=c.slice(y+1),!w)continue;let k;try{k=JSON.parse(w)}catch{f(new Error("MCP \u6807\u51C6\u8F93\u51FA\u5305\u542B\u65E0\u6548 JSON-RPC\uFF0C\u8BF7\u68C0\u67E5\u5B98\u65B9\u5B89\u88C5\u5305"));return}if(!k||typeof k!="object"||Array.isArray(k)||k.jsonrpc!=="2.0"){f(new Error("MCP \u6807\u51C6\u8F93\u51FA\u5305\u542B\u65E0\u6548 JSON-RPC\uFF0C\u8BF7\u68C0\u67E5\u5B98\u65B9\u5B89\u88C5\u5305"));return}if(k.id==null)continue;let b=p.get(k.id);b&&(p.delete(k.id),k.error?b.reject(new Error(`MCP \u8FD4\u56DE JSON-RPC \u534F\u8BAE\u9519\u8BEF\uFF08${Number.isInteger(k.error.code)?k.error.code:"unknown"}\uFF09\uFF1B\u672A\u81EA\u52A8\u91CD\u8BD5\uFF0C\u8BF7\u5148\u56DE\u8BFB\u7ED3\u679C`)):b.resolve(k.result))}}),i.on("error",()=>f(new Error("\u65E0\u6CD5\u542F\u52A8\u5B98\u65B9 MCP \u8FDB\u7A0B\uFF0C\u8BF7\u68C0\u67E5 CLI \u5B89\u88C5\u548C\u672C\u673A Node \u8FD0\u884C\u65F6"))),i.on("close",h=>{g=!0,f(new Error(`MCP \u8FDB\u7A0B\u5DF2\u9000\u51FA\uFF08${h??"signal"}\uFF09\uFF1B\u7ED3\u679C\u672A\u77E5\u65F6\u5148\u56DE\u8BFB\uFF0C\u4E0D\u81EA\u52A8\u91CD\u8BD5`))}),i.stdin.on("error",()=>f(new Error("MCP \u8F93\u5165\u901A\u9053\u5DF2\u5173\u95ED\uFF1B\u7ED3\u679C\u672A\u77E5\u65F6\u5148\u56DE\u8BFB")));let S=(h,y)=>{if(l)return Promise.reject(l);let w=++a;return new Promise((k,b)=>{p.set(w,{resolve:k,reject:b}),i.stdin.write(`${JSON.stringify({jsonrpc:"2.0",id:w,method:h,params:y})}
|
|
1411
|
+
`)})},C=setTimeout(()=>f(new Error("MCP \u8C03\u7528\u8D85\u65F6\uFF0C\u6267\u884C\u7ED3\u679C\u672A\u77E5\uFF1B\u8BF7\u5148\u4F7F\u7528\u53EA\u8BFB\u5DE5\u5177\u56DE\u8BFB\uFF0C\u7981\u6B62\u76F2\u76EE\u91CD\u8BD5\u5199\u5165")),r);try{await S("initialize",{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"microi-cli",version:s.env.MICROI_TOOL_VERSION||"0.0.0"}}),i.stdin.write(`${JSON.stringify({jsonrpc:"2.0",method:"notifications/initialized"})}
|
|
1412
|
+
`);let h=await S("tools/list",o?{cursor:o}:{});if(!h||!Array.isArray(h.tools))throw new Error("MCP \u5DE5\u5177\u76EE\u5F55\u683C\u5F0F\u65E0\u6548");if(e==="tools")return h;let y=h,w=new Set;for(;!y.tools.some(b=>b.name===t)&&y.nextCursor;){if(w.has(y.nextCursor))throw new Error("MCP \u5DE5\u5177\u76EE\u5F55\u5206\u9875\u6E38\u6807\u91CD\u590D");if(w.add(y.nextCursor),y=await S("tools/list",{cursor:y.nextCursor}),!y||!Array.isArray(y.tools))throw new Error("MCP \u5DE5\u5177\u76EE\u5F55\u683C\u5F0F\u65E0\u6548")}if(!y.tools.some(b=>b.name===t))throw new Error(`\u5F53\u524D\u5B98\u65B9 MCP \u672A\u66B4\u9732\u5DE5\u5177\uFF1A${t}`);let k=await S("tools/call",{name:t,arguments:n});if(!k||!Array.isArray(k.content))throw new Error("MCP \u5DE5\u5177\u56DE\u6267\u683C\u5F0F\u65E0\u6548\uFF0C\u4E0D\u80FD\u786E\u8BA4\u6267\u884C\u7ED3\u679C\uFF1B\u8BF7\u5148\u56DE\u8BFB");return k}catch(h){throw d=h instanceof Error?h:new Error(String(h)),d}finally{clearTimeout(C),i.stdin.end();let h=!1;g||await new Promise(y=>{let w=()=>{clearTimeout(k),clearTimeout(b),clearTimeout(_),y()},k=setTimeout(()=>{i.kill()},250),b=setTimeout(()=>{i.kill("SIGKILL")},750),_=setTimeout(()=>{h=!g,i.removeListener("close",w),w()},1750);i.once("close",w)}),i.stdout.destroy(),i.stderr.destroy();for(let[y,w]of m)process.removeListener(y,w);if(h){let y="\u672C\u6B21 MCP \u5B50\u8FDB\u7A0B\u672A\u80FD\u5728\u6E05\u7406\u671F\u9650\u5185\u9000\u51FA\uFF0C\u8BF7\u6838\u5BF9\u672C\u6B21 CLI \u5B50\u8FDB\u7A0B";if(d)d.message+=`\uFF1B${y}`;else throw new Error(y)}if(u&&!d)throw u}}var Yn=O(require("fs")),Dt=O(require("path"));async function Ii(s,e){let t=Dt.resolve(s);if(!Yn.existsSync(t)||!Yn.statSync(t).isDirectory())throw new Error(`\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u76EE\u5F55\uFF1A${t}`);rs(t);let n=N.getInstance(),r=j.getInstance(),o=ke.getInstance();if(!e&&!["win32","darwin","linux"].includes(process.platform))throw new Error("\u5F53\u524D CLI \u652F\u6301 Windows DPAPI\u3001macOS Keychain \u4E0E Linux Secret Service\uFF1B\u672A\u652F\u6301\u7684\u5E73\u53F0\u4E0D\u4F1A\u56DE\u9000\u660E\u6587\u51ED\u636E");let i=n.getWorkspaceStateFilePath(Ft),a=e||(process.platform==="darwin"?new Pn(i):process.platform==="linux"?new _n(i):new In(Dt.join(Dt.dirname(i),kt)));return r.setSecretStorage(a),o.setSecretStorage(a),o.setMcpTokenFilePath(i),await o.loadMcpTokenFile(),{root:t,config:n,api:r,auth:o}}function $e(s,e){let t=s.getProfiles();if(!t.length)throw new Error("\u5C1A\u672A\u6DFB\u52A0\u670D\u52A1\u5668\u8FDE\u63A5\uFF0C\u8BF7\u5148\u6267\u884C microi profile add");if(!e)return t[0];let n=Number(e);if(Number.isInteger(n)&&n>=1&&n<=t.length)return t[n-1];let r=e.toLowerCase(),o=t.filter(i=>i.osClient.toLowerCase()===r||i.label.toLowerCase()===r||`${i.apiBaseUrl}|${i.osClient}`.toLowerCase()===r);if(o.length===0){let i=We(t).filter(a=>a.mcpName.toLowerCase()===r).map(a=>a.profile);if(i.length===1)return i[0]}if(o.length!==1)throw new Error(`\u65E0\u6CD5\u552F\u4E00\u5B9A\u4F4D\u670D\u52A1\u5668\u8FDE\u63A5\uFF1A${e}`);return o[0]}function Xe(s,e){return!!s.api.getTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork)}var Zn=O(require("child_process")),Mt=O(require("crypto")),U=O(require("fs")),xi=O(require("os")),ne=O(require("path"));var Nt=O(require("fs")),Ri=O(require("os")),Z=O(require("path"));function Di(s={}){let e={...s.env??process.env},t=s.execPath??process.execPath,n=s.home??Ri.homedir(),o=(s.platform??process.platform)==="win32",i=o?";":":",a=o?Object.keys(e).find(f=>/^path$/i.test(f))??"Path":"PATH",c=o?"node.exe":"node",l=f=>{try{return Nt.statSync(f).isFile()}catch{return!1}},g=f=>{let m=Nt.realpathSync(f);if(/\.(?:c?m?js)$/i.test(m)){let S=Z.dirname(Z.dirname(m)),h=(o?[Z.dirname(S),Z.dirname(Z.dirname(S))]:[Z.resolve(S,"../../../bin")]).map(w=>Z.join(w,c)).find(l),y=h??t;return h||/^node(?:\.exe)?$/i.test(Z.basename(y))?delete e.ELECTRON_RUN_AS_NODE:e.ELECTRON_RUN_AS_NODE="1",e[a]=[Z.dirname(y),e[a]??""].filter(Boolean).join(i),{command:y,prefixArgs:[m],env:e,shell:!1}}return e[a]=[Z.dirname(m),e[a]??""].filter(Boolean).join(i),{command:m,prefixArgs:[],env:e,shell:o&&/\.(?:cmd|bat)$/i.test(m)}},d=String(e.MICROI_NPM_PATH??"").trim();if(d){let f=Z.resolve(d);if(!l(f))throw new Error("\u914D\u7F6E\u7684 npm \u5165\u53E3\u4E0D\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5 MICROI_NPM_PATH\u3002");return g(f)}let u=new Set;for(let f of String(e[a]??"").split(i))Z.isAbsolute(f)&&u.add(f);if(u.add(Z.dirname(t)),u.add(Z.join(n,".microi","nodejs",...o?[]:["bin"])),o){for(let f of[e.ProgramFiles,e["ProgramFiles(x86)"],e.LOCALAPPDATA])f&&Z.isAbsolute(f)&&u.add(Z.join(f,"nodejs"));e.APPDATA&&Z.isAbsolute(e.APPDATA)&&u.add(Z.join(e.APPDATA,"npm")),e.NVM_SYMLINK&&Z.isAbsolute(e.NVM_SYMLINK)&&u.add(e.NVM_SYMLINK)}else{for(let m of["/opt/homebrew/bin","/usr/local/bin","/usr/bin",Z.join(n,".volta","bin")])u.add(m);let f=Z.join(e.NVM_DIR&&Z.isAbsolute(e.NVM_DIR)?e.NVM_DIR:Z.join(n,".nvm"),"versions","node");try{for(let m of Nt.readdirSync(f).filter(S=>/^v\d+\.\d+\.\d+$/.test(S)).sort((S,C)=>C.localeCompare(S,void 0,{numeric:!0})).slice(0,8))u.add(Z.join(f,m,"bin"))}catch{}}let p=[];e.npm_execpath&&Z.isAbsolute(e.npm_execpath)&&p.push(e.npm_execpath);for(let f of u)p.push(Z.join(f,"../lib/node_modules/npm/bin/npm-cli.js")),p.push(Z.join(f,"node_modules/npm/bin/npm-cli.js")),p.push(Z.join(f,o?"npm.cmd":"npm"));for(let f of p)if(l(f))return g(f);throw new Error("\u672A\u627E\u5230\u672C\u673A Node.js/npm\uFF1B\u8BF7\u5B89\u88C5 Node.js \u6216\u5728 Microi\u543E\u7801\u8BBE\u7F6E\u4E2D\u5B89\u88C5\u672C\u5730 Node.js\u3002")}var Fi="https://registry.npmjs.org/",Wr="@microi.net/cli",ba=24*60*60*1e3,dn=15*60*1e3,Oi=30*60*1e3;function Qn(s){return typeof s=="string"&&s.trim().length>0}function va(s){if(!s||typeof s!="object"||Array.isArray(s))return!1;let e=s;return Array.isArray(e.profiles)&&e.profiles.some(t=>{if(!t||typeof t!="object"||Array.isArray(t))return!1;let n=t;return Qn(n.apiBaseUrl)&&Qn(n.osClient)})?!0:Qn(e.apiBaseUrl)&&Qn(e.osClient)}function ka(s){try{let e=ne.resolve(s);if(!U.existsSync(e)||!U.statSync(e).isDirectory())return!1;let t=new Set([ne.join(e,xe)]);for(let n of U.readdirSync(e,{withFileTypes:!0}))n.isDirectory()&&n.name.toLowerCase()===xe.toLowerCase()&&t.add(ne.join(e,n.name));for(let n of t){let r=ne.join(n,hn);if(!U.existsSync(r))continue;let o=U.statSync(r);if(!(!o.isFile()||o.size>2*1024*1024)&&va(JSON.parse(U.readFileSync(r,"utf8"))))return!0}}catch{}return!1}function ct(){let s=ne.resolve(process.env.MICROI_UPDATE_HOME||ne.join(xi.homedir(),".microi","updater"));return{root:s,status:ne.join(s,"status.json"),log:ne.join(s,"update.log"),lock:ne.join(s,"update.lock")}}function Hr(s,e){U.mkdirSync(ne.dirname(s),{recursive:!0});let t=`${s}.${process.pid}.${Date.now()}.${Mt.randomBytes(3).toString("hex")}.tmp`;try{U.writeFileSync(t,e),U.existsSync(s)&&U.rmSync(s,{force:!0}),U.renameSync(t,s)}finally{try{U.existsSync(t)&&U.rmSync(t,{force:!0})}catch{}}}function Vi(s){let e=ne.resolve(s),t=process.platform==="win32"?e.toLowerCase():e,n=Mt.createHash("sha256").update(t).digest("hex");return ne.join(ct().root,"workspaces",`${n}.json`)}function Ea(s){let e=`${JSON.stringify(s,null,2)}
|
|
1413
|
+
`;s.workspace&&Hr(Vi(s.workspace),e),Hr(ct().status,e)}function Ta(s){try{let e=s?Vi(s):void 0,t=e&&U.existsSync(e)?e:ct().status;return JSON.parse(U.readFileSync(t,"utf8"))}catch{return}}function Bi(s){let e=ct();U.mkdirSync(e.root,{recursive:!0}),U.appendFileSync(e.log,`[${new Date().toISOString()}] ${s}
|
|
1414
|
+
`,"utf8")}function at(s,e){try{Ea(s)}catch{}if(e)try{Bi(e)}catch{}}function Xn(s){let e=String(s||"").trim().match(/^(\d+)\.(\d+)\.(\d+)$/);return e?e.slice(1).map(Number):void 0}function Ni(s,e){let t=Xn(s),n=Xn(e);if(!t||!n)return s.localeCompare(e);for(let r=0;r<3;r+=1)if(t[r]!==n[r])return t[r]-n[r];return 0}var Gr;function Li(s,e,t=12e4,n=!1,r=Gr??process.env){let o=Zn.spawnSync(s,e,{encoding:"utf8",windowsHide:!0,timeout:t,maxBuffer:33554432,shell:n,env:r});return{ok:o.status===0,status:typeof o.status=="number"?o.status:1,stdout:String(o.stdout||""),stderr:[o.error?.message,o.stderr].filter(Boolean).join(`
|
|
1415
|
+
`).trim()}}function zr(s,e=12e4){let t=Di();return Gr=t.env,Li(t.command,[...t.prefixArgs,...s],e,t.shell,t.env)}function Mi(){let s=zr(["root","--global"],3e4);return s.ok?s.stdout.trim():""}function Ai(s){if(!s)return;let e=ne.join(s,"@microi.net","cli"),t=ne.join(e,"scripts","microi-cli.js"),n=ne.join(e,"package.json");try{let r=JSON.parse(U.readFileSync(n,"utf8")),o=String(r.version||"");return!U.existsSync(t)||!Xn(o)?void 0:{cliPath:t,version:o}}catch{return}}function Ge(s,e,t=12e4){return Li(process.execPath,[s,...e],t,!1,{...Gr??process.env,...process.env.ELECTRON_RUN_AS_NODE?{ELECTRON_RUN_AS_NODE:process.env.ELECTRON_RUN_AS_NODE}:{}})}function _a(){let s=zr(["view",Wr,"version","--json","--prefer-online",`--registry=${Fi}`],45e3);if(!s.ok)throw new Error(s.stderr||s.stdout||"npm registry query failed");let e=s.stdout.trim();try{e=String(JSON.parse(e))}catch{e=e.replace(/^"|"$/g,"")}if(!Xn(e))throw new Error(`npm registry returned invalid version: ${e}`);return e}function Pa(s){return zr(["install","--global",`${Wr}@${s}`,`--registry=${Fi}`,"--prefer-online","--no-audit","--no-fund"],5*6e4)}function Re(s){return(s.stderr||s.stdout||`exit ${s.status}`).trim().slice(0,2e3)}function jr(s){return/(?:未检测到|未找到|not found|cannot find).*Codex|Codex CLI.*(?:未检测到|未找到|not found|cannot find)/i.test(Re(s))}function Kr(s){return/(?:未检测到|未找到|not found|cannot find).*DeepSeek Harness|DeepSeek Harness.*(?:未检测到|未找到|not found|cannot find)/i.test(Re(s))}function Ia(s){let e=ne.resolve(ne.dirname(s),"..");try{let t=JSON.parse(U.readFileSync(ne.join(e,"package.json"),"utf8"));return t.name!==Wr||t.dsh?.bundle?.patch!=="./cordis.patch.yml"||!U.existsSync(ne.join(e,"cordis.patch.yml"))?void 0:e}catch{return}}function Ra(s,e,t){if(!s||s.currentVersion!==e)return!0;let n=i=>{if(!i)return"";let a=ne.resolve(i);return process.platform==="win32"?a.toLowerCase():a};if(n(s.workspace)!==n(t))return!0;let r=Date.parse(s.attemptedAt||"");if(!Number.isFinite(r))return!0;let o=Date.now()-r;return s.state==="completed"?o>=ba:s.state==="scheduled"||s.state==="running"?o>=Oi:o>=dn}function Jr(s){let e=ct(),t=ne.resolve(s.sourceCliPath||process.argv[1]||"");if(!U.existsSync(t))throw new Error(`\u65E0\u6CD5\u627E\u5230 Microi CLI \u66F4\u65B0\u5165\u53E3\uFF1A${t}`);let n=Ta(s.workspace);if(!s.force&&!Ra(n,s.currentVersion,s.workspace))return{scheduled:!1,reason:`recent-${n?.state||"unknown"}`,statusPath:e.status};U.mkdirSync(e.root,{recursive:!0});let r=s.currentVersion.replace(/[^0-9.]/g,"")||"unknown",o=ne.join(e.root,`microi-update-worker-${r}-${process.pid}-${Mt.randomBytes(4).toString("hex")}.js`);Hr(o,U.readFileSync(t));let i=new Date().toISOString();at({state:"scheduled",currentVersion:s.currentVersion,workspace:s.workspace,message:"\u540E\u53F0\u66F4\u65B0\u5DF2\u6392\u961F\uFF1B\u5F53\u524D\u5DE5\u4F5C\u7EE7\u7EED\u4F7F\u7528\u73B0\u6709\u7248\u672C\u3002",attemptedAt:i});let a=[o,"update","--worker","--current-version",s.currentVersion,"--source-cli",t,"--json",...s.workspace?["--workspace",ne.resolve(s.workspace)]:[]],c=Zn.spawn(process.execPath,a,{cwd:e.root,detached:!0,windowsHide:!0,stdio:"ignore",env:{...process.env}});return c.once("error",l=>{let g=new Date(Date.now()+dn).toISOString();at({state:"deferred",currentVersion:s.currentVersion,workspace:s.workspace,message:`\u540E\u53F0\u66F4\u65B0\u8FDB\u7A0B\u6682\u65F6\u65E0\u6CD5\u542F\u52A8\uFF1A${l.message}\uFF1B\u4E0D\u5F71\u54CD\u5F53\u524D\u5DE5\u4F5C\u3002`,attemptedAt:i,nextRetryAt:g})}),c.unref(),{scheduled:!0,reason:"scheduled",statusPath:e.status,workerPid:c.pid}}function Da(){let s=ct();U.mkdirSync(s.root,{recursive:!0});let e=`${process.pid}-${Date.now()}-${Mt.randomBytes(6).toString("hex")}`;for(let t=0;t<2;t+=1)try{let n=U.openSync(s.lock,"wx");return U.writeFileSync(n,`${JSON.stringify({token:e,pid:process.pid,startedAt:new Date().toISOString()})}
|
|
1416
|
+
`),U.closeSync(n),{token:e,release:()=>{try{JSON.parse(U.readFileSync(s.lock,"utf8")).token===e&&U.rmSync(s.lock,{force:!0})}catch{}}}}catch(n){if((n&&typeof n=="object"?n.code:"")!=="EEXIST")throw n;try{if(Date.now()-U.statSync(s.lock).mtimeMs<Oi)return;U.rmSync(s.lock,{force:!0})}catch{}}}function $i(s){let e=new Date().toISOString(),t;try{t=Da()}catch(a){let c={state:"deferred",currentVersion:s.currentVersion,workspace:s.workspace,message:`\u65E0\u6CD5\u521B\u5EFA\u540E\u53F0\u66F4\u65B0\u72B6\u6001\u76EE\u5F55\uFF1A${a instanceof Error?a.message:String(a)}\uFF1B\u4E0D\u5F71\u54CD\u5F53\u524D\u6216\u65B0\u5EFA\u5DE5\u4F5C\u3002`,attemptedAt:e,nextRetryAt:new Date(Date.now()+dn).toISOString()};return at(c,c.message),c}if(!t){let a={state:"deferred",currentVersion:s.currentVersion,workspace:s.workspace,message:"\u5DF2\u6709\u540E\u53F0\u66F4\u65B0\u6B63\u5728\u8FD0\u884C\uFF1B\u672C\u5DE5\u4F5C\u533A\u5DF2\u5EF6\u540E\u91CD\u8BD5\uFF0C\u5F53\u524D\u5DE5\u4F5C\u7EE7\u7EED\u4F7F\u7528\u73B0\u6709\u7248\u672C\u3002",attemptedAt:e,nextRetryAt:new Date(Date.now()+dn).toISOString()};return at(a),a}let n=[],r=s.workspace?ne.resolve(s.workspace):void 0,o=!!r&&ka(r),i=(a,c,l)=>{let g={state:"deferred",currentVersion:s.currentVersion,latestVersion:c,globalVersion:l,workspace:s.workspace,message:`${a}\uFF1B\u5DF2\u5EF6\u540E\u91CD\u8BD5\uFF0C\u4E0D\u5F71\u54CD\u5F53\u524D\u6216\u65B0\u5EFA\u5DE5\u4F5C\u3002`,warnings:n,attemptedAt:e,finishedAt:new Date().toISOString(),nextRetryAt:new Date(Date.now()+dn).toISOString()};return at(g,g.message),g};try{let a={state:"running",currentVersion:s.currentVersion,workspace:s.workspace,message:"\u6B63\u5728\u540E\u53F0\u68C0\u67E5\u5B98\u65B9\u66F4\u65B0\uFF1B\u5F53\u524D\u5DE5\u4F5C\u4E0D\u7B49\u5F85\u3002",attemptedAt:e,workerPid:process.pid};at(a,`update started from ${s.currentVersion}`);let c;try{c=_a()}catch(h){let y=h instanceof Error?h.message:String(h);return i(/npm 入口不存在|未找到本机 Node.js\/npm/.test(y)?y:`\u65E0\u6CD5\u8BBF\u95EE npm \u5B98\u65B9 registry\uFF1A${y}`)}let l=Mi(),g=Ai(l);if(!g||Ni(g.version,c)<0){let h=Pa(c);if(!h.ok){let y=Re(h),w=/\b(?:EBUSY|EPERM|EACCES)\b/i.test(y);if(w&&s.sourceCliPath&&U.existsSync(s.sourceCliPath)){let k=Ge(s.sourceCliPath,["codex","install","--yes","--json"],18e4);!k.ok&&!jr(k)&&n.push(`\u5F53\u524D Codex \u63D2\u4EF6\u5FEB\u7167\u6682\u672A\u9884\u7F6E\uFF1A${Re(k)}`);let b=Ia(s.sourceCliPath),_=Ge(s.sourceCliPath,["dsh","install",...b?["--source",b]:[],"--json"],5*6e4);if(!_.ok&&!Kr(_)&&n.push(`\u5F53\u524D DeepSeek Harness bundle \u5FEB\u7167\u6682\u672A\u9884\u7F6E\uFF1A${Re(_)}`),o&&r){let v=Ge(s.sourceCliPath,["ai","init","--workspace",r,"--json"],18e4);v.ok||n.push(`\u7248\u672C\u9694\u79BB MCP \u5165\u53E3\u6682\u672A\u9884\u7F6E\uFF1A${Re(v)}`)}}return i(w?"\u5168\u5C40 CLI \u6B63\u88AB\u8FD0\u884C\u4E2D\u7684\u65E7\u4EFB\u52A1\u5360\u7528\uFF0C\u5C06\u5728\u7A7A\u95F2\u540E\u91CD\u8BD5\uFF0C\u7EDD\u4E0D\u7EC8\u6B62\u65E7\u4EFB\u52A1":`\u5168\u5C40 CLI \u81EA\u52A8\u5B89\u88C5\u6682\u672A\u5B8C\u6210\uFF1A${y}`,c,g?.version)}l=Mi(),g=Ai(l)}if(!g)return i("\u5168\u5C40 CLI \u5B89\u88C5\u540E\u672A\u627E\u5230\u53EF\u6267\u884C\u6587\u4EF6",c);if(Ni(g.version,c)<0)return i("npm \u5B89\u88C5\u540E\u5168\u5C40 CLI \u4ECD\u4F4E\u4E8E\u672C\u6B21\u5B98\u65B9\u7248\u672C\uFF0C\u672A\u5C06\u5DE5\u4F5C\u533A\u540C\u6B65\u8BA1\u4E3A\u5B8C\u6210",c,g.version);let d=g.cliPath,u=Ge(d,["codex","install","--yes","--json"],3*6e4),p=u.ok||!jr(u);!u.ok&&p&&n.push(`Codex \u63D2\u4EF6\u7A0D\u540E\u91CD\u8BD5\uFF1A${Re(u)}`);let f=Ge(d,["dsh","install","--json"],5*6e4),m=f.ok||!Kr(f);if(!f.ok&&m&&n.push(`DeepSeek Harness bundle \u7A0D\u540E\u91CD\u8BD5\uFF1A${Re(f)}`),o&&r){let h=Ge(d,["ai","init","--workspace",r,"--json"],18e4);h.ok||n.push(`\u5DE5\u4F5C\u533A AI/MCP \u521D\u59CB\u5316\u7A0D\u540E\u91CD\u8BD5\uFF1A${Re(h)}`);let y=Ge(d,["doctor","--workspace",r,"--json"],2*6e4);if(!y.ok)try{Bi(`workspace doctor note: ${Re(y)}`)}catch{}}if(p){let h=Ge(d,["codex","status","--json"],6e4);!h.ok&&!jr(h)&&n.push(`Codex \u72B6\u6001\u5F85\u540E\u7EED\u786E\u8BA4\uFF1A${Re(h)}`)}if(m){let h=Ge(d,["dsh","status","--json"],6e4);!h.ok&&!Kr(h)&&n.push(`DeepSeek Harness \u72B6\u6001\u5F85\u540E\u7EED\u786E\u8BA4\uFF1A${Re(h)}`)}let C={state:n.length>0?"completed-with-warnings":"completed",currentVersion:s.currentVersion,latestVersion:c,globalVersion:g.version,workspace:s.workspace,message:n.length>0?"\u6838\u5FC3\u81EA\u52A8\u66F4\u65B0\u5DF2\u5B8C\u6210\uFF0C\u4E2A\u522B\u5BBF\u4E3B\u5C06\u5728\u4E0B\u6B21\u7A7A\u95F2\u6216\u542F\u52A8\u65F6\u7EE7\u7EED\uFF1B\u5F53\u524D\u5DE5\u4F5C\u672A\u88AB\u4E2D\u65AD\u3002":o?"CLI\u3001Codex/DeepSeek Harness \u63D2\u4EF6\u4E0E\u5DE5\u4F5C\u533A AI/MCP \u5DF2\u5728\u540E\u53F0\u66F4\u65B0\uFF1B\u5F53\u524D\u8FDB\u7A0B\u65E0\u9700\u5F3A\u5236\u91CD\u8F7D\u3002":"CLI\u3001Codex/DeepSeek Harness \u63D2\u4EF6\u5DF2\u5728\u540E\u53F0\u66F4\u65B0\uFF1B\u5F53\u524D\u5DE5\u4F5C\u533A\u672A\u914D\u7F6E\u543E\u7801\u670D\u52A1\u5668\uFF0C\u672A\u751F\u6210 AI/MCP \u6587\u4EF6\u3002",warnings:n,attemptedAt:e,finishedAt:new Date().toISOString()};return at(C,`${C.message} latest=${c} global=${g.version}`),C}catch(a){return i(`\u81EA\u52A8\u66F4\u65B0\u51FA\u73B0\u53EF\u6062\u590D\u9519\u8BEF\uFF1A${a instanceof Error?a.message:String(a)}`)}finally{t?.release();let a=ne.resolve(process.argv[1]||""),c=ct();if(ne.dirname(a)===c.root&&/^microi-update-worker-[\w.-]+\.js$/i.test(ne.basename(a)))try{U.rmSync(a,{force:!0})}catch{}}}function Ui(s){if(s.length>32768)throw new Error("\u767B\u5F55\u51ED\u636E\u8FC7\u957F");let e;try{e=JSON.parse(s.replace(/^\uFEFF/,"").trim())}catch{throw new Error("\u767B\u5F55\u51ED\u636E\u683C\u5F0F\u65E0\u6548\uFF1B\u6807\u51C6\u8F93\u5165\u987B\u4E3A\u5305\u542B Username\u3001Password \u7684 JSON")}let t=e;if(!t||typeof t!="object"||Array.isArray(t)||typeof t.Username!="string"||!t.Username.trim()||typeof t.Password!="string"||!t.Password)throw new Error("\u767B\u5F55\u51ED\u636E\u7F3A\u5C11 Username \u6216 Password");return{username:t.Username.trim(),password:t.Password}}function ji(s){if(s.length>32768)throw new Error("\u8FDE\u63A5\u4FE1\u606F\u8FC7\u957F");let e,t;try{if(e=JSON.parse(s.replace(/^\uFEFF/,"").trim()),!e||typeof e!="object"||Array.isArray(e))throw new Error;t=new URL(String(e.ApiBase||""))}catch{throw new Error("\u8FDE\u63A5\u4FE1\u606F\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u91CD\u65B0\u590D\u5236\u5B8C\u6574\u8FDE\u63A5\u4FE1\u606F")}if(!["https:","http:"].includes(t.protocol)||t.username||t.password||t.search||t.hash)throw new Error("ApiBase \u5FC5\u987B\u662F\u65E0\u51ED\u636E\u3001\u65E0\u67E5\u8BE2\u53C2\u6570\u7684 HTTP(S) \u5730\u5740");let n=String(e.OsClient||"").trim(),r=String(e.Token||"").trim().replace(/^Bearer\s+/i,"");if(!/^[A-Za-z0-9_.-]{1,100}$/.test(n)||!/^[\w-]+\.[\w-]+\.[\w-]+$/.test(r))throw new Error("\u8FDE\u63A5\u4FE1\u606F\u7F3A\u5C11\u6709\u6548 OsClient \u6216 Token");let o;try{o=JSON.parse(Buffer.from(r.split(".")[1],"base64url").toString("utf8"))}catch{throw new Error("Token \u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u8FDE\u63A5\u4FE1\u606F")}if(!o||typeof o!="object")throw new Error("Token \u683C\u5F0F\u65E0\u6548");if(String(o.OsClient||"").toLowerCase()!==n.toLowerCase()||!Number.isFinite(o.exp)||o.exp*1e3<=Date.now())throw new Error("Token \u5DF2\u8FC7\u671F\u6216\u4E0E\u76EE\u6807\u79DF\u6237\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u8FDE\u63A5\u4FE1\u606F");return{ApiBase:t.href.replace(/\/+$/,""),OsClient:n,Token:r,Did:String(e.Did||"")}}async function qr(s){let e="";for await(let t of s)if(e+=t.toString(),e.length>32768)throw new Error("\u8FDE\u63A5\u4FE1\u606F\u8FC7\u957F");return e}function Na(s){let e=[],t={};for(let n=0;n<s.length;n+=1){let r=s[n];if(!r.startsWith("--")){e.push(r);continue}let[o,i]=r.slice(2).split(/=(.*)/s,2);if(o.startsWith("no-")&&i===void 0){t[o.slice(3)]=!1;continue}if(i!==void 0){t[o]=i;continue}let a=s[n+1];a&&!a.startsWith("--")?(t[o]=a,n+=1):t[o]=!0}return{words:e,options:t}}function X(s,e){let t=s[e];return typeof t=="string"?t:void 0}function ge(s,e=!1){console.log(e||typeof s!="string"?JSON.stringify(s,null,2):s)}function un(s,e=""){let t=zi.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>t.question(`${s}${e?` (${e})`:""}: `,r=>{t.close(),n(r.trim()||e)}))}function Ma(s){if(!process.stdin.isTTY||!process.stdin.setRawMode)throw new Error("\u5F53\u524D\u8F93\u5165\u4E0D\u652F\u6301\u9690\u85CF\u5BC6\u7801\uFF1B\u8BF7\u4F7F\u7528 auth login --credentials-stdin \u4ECE\u53D7\u4FDD\u62A4\u7684\u6807\u51C6\u8F93\u5165\u63D0\u4F9B\u539F\u59CB\u51ED\u636E\uFF0C\u6216 auth import --session-stdin\u3002\u4E0D\u5F97\u628A\u5BC6\u7801\u5199\u5165\u547D\u4EE4\u884C\u6216\u804A\u5929\u8BB0\u5F55\u3002");return new Promise((e,t)=>{let n="";process.stdout.write(`${s}: `),process.stdin.setRawMode(!0),process.stdin.resume();let r=()=>{process.stdin.off("data",o),process.stdin.setRawMode(!1),process.stdin.pause()},o=i=>{let a=i.toString("utf8");if(a===""){r(),t(new Error("\u5DF2\u53D6\u6D88"));return}if(a==="\r"||a===`
|
|
1416
1417
|
`){process.stdout.write(`
|
|
1417
|
-
`),r(),e(n);return}if(a==="\x7F"||a==="\b"){n&&(n=n.slice(0,-1),process.stdout.write("\b \b"));return}/^[\x20-\x7E\u0080-\uFFFF]+$/.test(a)&&(n+=a,process.stdout.write("*".repeat([...a].length)))};process.stdin.on("data",
|
|
1418
|
+
`),r(),e(n);return}if(a==="\x7F"||a==="\b"){n&&(n=n.slice(0,-1),process.stdout.write("\b \b"));return}/^[\x20-\x7E\u0080-\uFFFF]+$/.test(a)&&(n+=a,process.stdout.write("*".repeat([...a].length)))};process.stdin.on("data",o)})}function Ki(){return`Microi\u543E\u7801 CLI
|
|
1418
1419
|
|
|
1419
1420
|
\u7528\u6CD5\uFF1Amicroi <\u547D\u4EE4> [\u9009\u9879]
|
|
1420
1421
|
|
|
@@ -1425,6 +1426,7 @@ require(target);
|
|
|
1425
1426
|
auth login --credentials-stdin \u4ECE\u53D7\u4FDD\u62A4\u6807\u51C6\u8F93\u5165\u8BFB\u53D6 Username\u3001Password JSON\uFF08\u5BBF\u4E3B\u987B\u63D0\u4F9B\u539F\u59CB\u51ED\u636E\uFF09
|
|
1426
1427
|
auth import --session-stdin \u4ECE\u6807\u51C6\u8F93\u5165\u5BFC\u5165\u72EC\u7ACB\u5F00\u53D1\u5DE5\u5177\u8FDE\u63A5\uFF0C\u65E0\u9700\u4FDD\u5B58\u8D26\u53F7\u5BC6\u7801
|
|
1427
1428
|
ai init [--no-mcp] \u6CE8\u5165\u5404 AI \u5BBF\u4E3B\u7684 AGENTS/Rules/Skills/typings
|
|
1429
|
+
ai init --host workbuddy --profile <\u8FDE\u63A5> \u5199\u5165 WorkBuddy \u539F\u751F\u7528\u6237\u7EA7 MCP\uFF08\u4FDD\u6301\u7528\u6237\u7981\u7528\u548C\u4FE1\u4EFB\u72B6\u6001\uFF09
|
|
1428
1430
|
mcp init \u914D\u7F6E\u5404\u5BBF\u4E3B MCP\uFF0C\u5E76\u540C\u6B65 AI \u5165\u53E3\u3001\u5B8C\u6574 Skills \u548C typings
|
|
1429
1431
|
mcp tools \u901A\u8FC7\u5B98\u65B9 MCP \u8BFB\u53D6\u5B9E\u65F6\u5DE5\u5177\u76EE\u5F55\u4E0E\u5B8C\u6574\u53C2\u6570 Schema
|
|
1430
1432
|
mcp call <microi_\u5DE5\u5177> --params-stdin \u5F53\u524D\u5BBF\u4E3B\u672A\u6CE8\u5165\u5DE5\u5177\u65F6\uFF0C\u4ECE stdin JSON \u8C03\u7528\u540C\u6E90 MCP
|
|
@@ -1437,8 +1439,8 @@ require(target);
|
|
|
1437
1439
|
pull [--scope all|api|form|module|workflow|schema]
|
|
1438
1440
|
push <file> \u663E\u5F0F\u63A8\u9001\u4E00\u4E2A\u5DF2\u62C9\u53D6\u7684 V8 \u6587\u4EF6
|
|
1439
1441
|
sync status [--scope ...] \u6BD4\u8F83\u672C\u5730\u4E0E\u8FDC\u7AEF\u5DEE\u5F02
|
|
1440
|
-
doctor
|
|
1442
|
+
doctor [--host workbuddy] \u68C0\u67E5\u8FDE\u63A5\u4E0E\u914D\u7F6E\uFF1BWorkBuddy \u5355\u72EC\u6838\u5BF9\u539F\u751F\u6587\u4EF6\u3001\u7F16\u7801\u548C\u4FE1\u4EFB\u8BB0\u5F55
|
|
1441
1443
|
|
|
1442
|
-
\u901A\u7528\u9009\u9879\uFF1A--workspace <\u76EE\u5F55>\uFF08\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55\uFF09\u3001--profile <\u5E8F\u53F7/OsClient/\u540D\u79F0/mcpName>\u3001--json`}async function Ni(s,e){let t=(ae(e,"api")||await on("API \u5730\u5740")).replace(/\/+$/,""),n=ae(e,"os-client")||await on("OsClient");if(!/^https?:\/\//i.test(t))throw new Error("API \u5730\u5740\u5FC5\u987B\u4EE5 http:// \u6216 https:// \u5F00\u5934");if(!n)throw new Error("OsClient \u4E0D\u80FD\u4E3A\u7A7A");let i={label:ae(e,"label")||await on("\u8FDE\u63A5\u540D\u79F0",n),apiBaseUrl:t,osClient:n,osClientType:ae(e,"type")||"",osClientNetwork:ae(e,"network")||""};return await s.config.addProfile(i),i}function ya(s){return s===!0||s===1||String(s||"").trim().toLowerCase()==="true"}async function Mi(s,e,t){if(t["credentials-stdin"]!==!0&&!process.stdin.isTTY)throw new Error("\u5F53\u524D\u8F93\u5165\u4E0D\u652F\u6301\u9690\u85CF\u5BC6\u7801\uFF1B\u8BF7\u4F7F\u7528 auth login --credentials-stdin \u6216 auth import --session-stdin\uFF1B\u5BBF\u4E3B\u987B\u5B89\u5168\u6CE8\u5165\u539F\u59CB\u51ED\u636E\uFF0C\u4EE3\u7406\u5360\u4F4D\u7B26\u4E0D\u80FD\u4EE3\u66FF\u5BC6\u7801\u3002");let n=t["credentials-stdin"]===!0?Ii(await Ur(process.stdin)):void 0,r=n?.username||ae(t,"account")||await on("\u5E10\u53F7"),i=n?.password??await ha("\u5BC6\u7801");s.auth.enableProtectedMcpTokens(e);let o=await s.auth.getSysConfig(e.apiBaseUrl,e.osClient),a,c,l="";if(ya(o?.EnableCaptcha)){if(!process.stdin.isTTY&&!ae(t,"captcha"))throw new Error("\u670D\u52A1\u5668\u8981\u6C42\u56FE\u5F62\u9A8C\u8BC1\u7801\uFF1B\u8BF7\u5728\u4EA4\u4E92\u7EC8\u7AEF\u767B\u5F55\uFF0C\u6216\u901A\u8FC7\u5DF2\u6388\u6743\u7684\u72EC\u7ACB\u5F00\u53D1\u5DE5\u5177\u4F1A\u8BDD\u5BFC\u5165\u3002\u6807\u51C6\u8F93\u5165\u51ED\u636E\u4E0D\u4F1A\u7ED5\u8FC7\u9A8C\u8BC1\u7801\u3002");let g=await s.auth.getCaptcha(e.apiBaseUrl,e.osClient);if(!g)throw new Error("\u670D\u52A1\u5668\u8981\u6C42\u9A8C\u8BC1\u7801\uFF0C\u4F46\u9A8C\u8BC1\u7801\u56FE\u7247\u83B7\u53D6\u5931\u8D25");l=pe.join(s.config.getSyncRootDir(),".microi-login-captcha.png"),ce.mkdirSync(pe.dirname(l),{recursive:!0}),ce.writeFileSync(l,Buffer.from(g.imageBase64.split(",")[1],"base64")),console.log(`\u9A8C\u8BC1\u7801\u56FE\u7247\uFF1A${l}`),a=g.captchaId,c=ae(t,"captcha")||await on("\u9A8C\u8BC1\u7801")}try{let g=await s.auth.login(r,i,{apiBaseUrl:e.apiBaseUrl,osClient:e.osClient,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork,captchaId:a,captchaValue:c});if(!g.ok)throw new Error(g.msg||"\u767B\u5F55\u5931\u8D25");let d=await s.auth.getSysConfig(e.apiBaseUrl,e.osClient,void 0,!0);d&&await s.config.addProfile({...e,label:String(d.SysShortTitle||d.SysTitle||e.label),sysShortTitle:String(d.SysShortTitle||""),sysTitle:String(d.SysTitle||"")})}finally{l&&ce.existsSync(l)&&ce.rmSync(l,{force:!0})}}async function jr(s,e){An.getInstance().inject({strictAiDocs:!0});let t=e?await jn(s.root):{count:0,names:[]};return{workspace:s.root,syncRoot:s.config.getSyncRootDir(),mcp:t}}async function Ai(s,e,t){if(!nt(s,e))throw new Error("\u8BE5\u8FDE\u63A5\u6CA1\u6709\u53EF\u7528 Token\uFF0C\u8BF7\u5148\u6267\u884C microi auth login");let n=Et.getInstance();(t==="all"||t==="api")&&await n.pullEngines(e),(t==="all"||t==="form")&&(await n.pullEvents(e),await n.pullFields(e)),(t==="all"||t==="module")&&await n.pullMenuButtons(e),(t==="all"||t==="workflow")&&await n.pullWorkflows(e),(t==="all"||t==="schema")&&await n.pullDbSchema(e)}async function Sa(){let{words:s,options:e}=fa(process.argv.slice(2)),t=e.json===!0;if(s[0]==="version"||e.version===!0){let a={package:"@microi.net/cli",version:Ge()};t?de(a,!0):console.log(a.version);return}if(!s.length||s[0]==="help"||e.help){console.log(Ri());return}let[n,r,i]=s;if(n==="update"){let a=ae(e,"current-version")||Ge();if(e.worker===!0){de(Pi({currentVersion:a,workspace:ae(e,"workspace"),sourceCliPath:ae(e,"source-cli")}),t);return}try{de(Br({currentVersion:a,workspace:ae(e,"workspace")||process.cwd(),sourceCliPath:process.argv[1],force:e.force===!0}),t)}catch(c){de({scheduled:!1,deferred:!0,message:`\u81EA\u52A8\u66F4\u65B0\u6682\u672A\u6295\u9012\uFF0C\u5C06\u5728\u540E\u7EED\u4F7F\u7528\u65F6\u91CD\u8BD5\uFF1B\u4E0D\u5F71\u54CD\u5F53\u524D\u6216\u65B0\u5EFA\u5DE5\u4F5C\uFF1A${c instanceof Error?c.message:String(c)}`},t)}return}if(process.env.MICROI_DISABLE_AUTO_UPDATE!=="1")try{Br({currentVersion:Ge(),workspace:ae(e,"workspace")||process.cwd(),sourceCliPath:process.argv[1]})}catch{}if(n==="plugin"&&r==="path"){let a=pe.resolve(__dirname,"..");de({package:"@microi.net/cli",packageRoot:a,codeBuddyManifest:pe.join(a,".codebuddy-plugin","plugin.json"),codeBuddyMarketplace:pe.join(a,".codebuddy-plugin","marketplace.json"),workBuddyManifest:pe.join(a,".workbuddy-plugin","plugin.json"),workBuddyMarketplace:pe.join(a,".workbuddy-plugin","marketplace.json"),dshBundle:pe.join(a,"cordis.patch.yml")},t);return}if(n==="codex"){if(r==="status"){let a=Xs();de(a,t),a.ok||(process.exitCode=2);return}if(r==="install"){de(Zs({force:e.force===!0,marketplaceSource:ae(e,"source")}),t);return}}if(n==="dsh"){let a=ae(e,"profile");if(r==="status"){let c=si(a);de(c,t),c.ok||(process.exitCode=2);return}if(r==="install"){de(ii({profile:a,source:ae(e,"source"),force:e.force===!0}),t);return}}let o=await fi(ae(e,"workspace")||process.cwd());if(n==="auth"&&r==="import"){if(e["session-stdin"]!==!0)throw new Error("\u8BF7\u4F7F\u7528 --session-stdin\uFF0C\u51ED\u636E\u4E0D\u5F97\u653E\u5165\u547D\u4EE4\u884C\u53C2\u6570");let a=Di(await Ur(process.stdin)),c=o.config.getProfiles().find(d=>d.apiBaseUrl.replace(/\/+$/,"")===a.ApiBase&&d.osClient.toLowerCase()===a.OsClient.toLowerCase()),l=c||{label:a.OsClient,apiBaseUrl:a.ApiBase,osClient:a.OsClient,osClientType:"",osClientNetwork:""};o.auth.enableProtectedMcpTokens(l);let g=o.api.getTokenForServer(l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork);try{await o.api.setToken(a.Token,l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork);let d=await o.api.request({method:"POST",path:"/apiengine/platform-current-user",body:{},apiBaseUrl:l.apiBaseUrl,osClient:l.osClient,osClientType:l.osClientType,osClientNetwork:l.osClientNetwork,allowAuthRetry:!1,silent:!0});if(d.Code!==1||!d.Data)throw new Error("\u670D\u52A1\u5668\u672A\u63A5\u53D7\u6B64\u8FDE\u63A5\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u5F00\u53D1\u5DE5\u5177 Token");c||await o.config.addProfile(l),await o.auth.writeMcpTokenFile(),de({imported:!0,ApiBase:l.apiBaseUrl,OsClient:l.osClient,Next:"microi ai init"},t)}catch(d){throw g?await o.api.setToken(g,l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork):await o.api.clearTokenForServer(l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork),d}return}if(n==="profile"){if(r==="list"){let a=tt(o.config.getProfiles()).map(({profile:c,mcpName:l},g)=>({index:g+1,mcpName:l,...c,loggedIn:nt(o,c)}));de(a,t);return}if(r==="add"){de(await Ni(o,e),t);return}if(r==="remove"){let a=_t(o.config,i||ae(e,"profile")),c=o.config.getProfiles().findIndex(l=>l.apiBaseUrl===a.apiBaseUrl&&l.osClient===a.osClient);await o.config.removeProfile(c),await o.auth.writeMcpTokenFile(),await jn(o.root),de({removed:!0,profile:a},t);return}}if(n==="auth"){let a=_t(o.config,ae(e,"profile"));if(r==="login"){await Mi(o,a,e),de({loggedIn:!0,profile:a.osClient},t);return}if(r==="repair"){if(!await o.auth.recoverProfileLogin(a))throw new Error("\u5F53\u524D\u5DE5\u4F5C\u533A\u6CA1\u6709\u8BE5\u8FDE\u63A5\u53EF\u7528\u7684 OS \u52A0\u5BC6\u5E10\u53F7\u5BC6\u7801\uFF0C\u9700\u5148\u6267\u884C\u4E00\u6B21 microi auth login");de({loggedIn:!0,repaired:!0,profile:a.osClient},t);return}if(r==="status"){de({loggedIn:nt(o,a),profile:a},t);return}if(r==="logout"){await o.api.clearTokenForServer(a.apiBaseUrl,a.osClient,a.osClientType,a.osClientNetwork),await o.auth.writeMcpTokenFile(),await jn(o.root),de({loggedIn:!1,profile:a.osClient},t);return}}if(n==="ai"&&r==="init"){de(await jr(o,e.mcp!==!1),t);return}if(n==="mcp"&&(r==="tools"||r==="call")){let a=ae(e,"profile");if(!a&&o.config.getProfiles().length>1)throw new Error("\u5B58\u5728\u591A\u4E2A\u543E\u7801\u8FDE\u63A5\uFF0C\u8BF7\u5148\u8FD0\u884C microi profile list --json\uFF0C\u518D\u663E\u5F0F\u4F20 --profile <mcpName>");let c=_t(o.config,a),l=tt(o.config.getProfiles()).find(m=>m.profile.apiBaseUrl===c.apiBaseUrl&&m.profile.osClient===c.osClient&&m.profile.osClientType===c.osClientType&&m.profile.osClientNetwork===c.osClientNetwork)?.mcpName;if(r==="call"&&e["params-stdin"]!==!0)throw new Error("MCP \u8C03\u7528\u5FC5\u987B\u4F7F\u7528 --params-stdin\uFF1B\u65E0\u53C2\u6570\u65F6\u4ECE\u6807\u51C6\u8F93\u5165\u4F20 {}\uFF0C\u4E0D\u8981\u5C06\u79D8\u5BC6\u653E\u5165\u547D\u4EE4\u884C");let g=r==="call"?await pi(process.stdin):{},d=pe.join(__dirname,"microi-cli-mcp.js");if(!ce.existsSync(d)||!ce.existsSync(pe.join(__dirname,"mcp-server.js")))throw new Error("CLI \u5B89\u88C5\u7F3A\u5C11\u5B98\u65B9 MCP\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5 @microi.net/cli");let u=Object.fromEntries(Object.entries(process.env).filter(([m])=>!/^MICROI_/i.test(m))),p=await mi({command:process.execPath,args:[d],cwd:o.root,env:{...u,...Ar(o.root,c),MCP_TRANSPORT:"stdio",MICROI_CODEX_MODE:"0"}},r,i||"",g,Number(ae(e,"timeout-ms")||12e4),ae(e,"cursor"));de({transport:"stdio",profile:l,...p},t),p?.isError&&(process.exitCode=2);return}if(n==="mcp"&&r==="init"){let a=await jr(o,!0);de(a.mcp,t);return}if(n==="init"){let a=o.config.getProfiles()[0];a||(a=await Ni(o,e)),nt(o,a)||await Mi(o,a,e);let c=await jr(o,!0);e.pull===!0&&await Ai(o,a,"all"),de({initialized:!0,pulled:e.pull===!0,details:c},t);return}if(n==="pull"){let a=_t(o.config,ae(e,"profile")),c=ae(e,"scope")||"all";if(!["all","api","form","module","workflow","schema"].includes(c))throw new Error(`\u4E0D\u652F\u6301\u7684\u62C9\u53D6\u8303\u56F4\uFF1A${c}`);await Ai(o,a,c),de({pulled:!0,scope:c,profile:a.osClient},t);return}if(n==="push"){let a=pe.resolve(r||"");if(!ce.existsSync(a))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${a}`);if(!await Et.getInstance().pushFile(a))throw new Error("\u63A8\u9001\u5931\u8D25\uFF0C\u8BF7\u67E5\u770B\u4E0A\u65B9 Microi \u65E5\u5FD7");de({pushed:!0,file:a},t);return}if(n==="sync"&&r==="status"){let a=_t(o.config,ae(e,"profile")),c=ae(e,"scope")||"all";if(!["all","api","form","module","workflow"].includes(c))throw new Error(`\u4E0D\u652F\u6301\u7684\u5DEE\u5F02\u8303\u56F4\uFF1A${c}`);let l=await Et.getInstance().checkRemoteDifferences(a,c);de({profile:a.osClient,scope:c,count:l.length,differences:l},t);return}if(n==="doctor"){let a=o.config.getProfiles(),c=Ge(),l=pe.join(o.root,".vscode","mcp.json"),g=[];if(ce.existsSync(l))try{let m=fn(ce.readFileSync(l,"utf-8")),f=m.servers&&typeof m.servers=="object"?m.servers:{};for(let[y,C]of Object.entries(f)){let h=C.env&&typeof C.env=="object"?C.env:{};if(!/^microi(?:_|-|$)/i.test(y)&&typeof h.MICROI_API_URL!="string")continue;let S=Yt(C),w=Qt(S,c);g.push({name:y,source:String(h.MICROI_TOOL_SOURCE||"legacy"),version:S||"legacy",compatibility:w>0?"newer-provider-preserved":w<0?"upgrade-available":"compatible"})}}catch(m){g.push({name:"(config)",source:"unknown",version:"unknown",compatibility:`invalid-json: ${m instanceof Error?m.message:String(m)}`})}let d=pe.join(o.root,".vscode",".microi-ai-docs-manifest.json"),u="";if(ce.existsSync(d))try{let m=JSON.parse(ce.readFileSync(d,"utf-8"));u=String(m.bundleVersion||"")}catch{u="invalid-json"}let p={ok:a.length>0&&a.some(m=>nt(o,m)),tool:{source:"cli",version:c},node:process.version,workspace:o.root,syncRoot:o.config.getSyncRootDir(),profiles:a.map(m=>({label:m.label,osClient:m.osClient,apiBaseUrl:m.apiBaseUrl,loggedIn:nt(o,m)})),files:{agents:ce.existsSync(pe.join(o.root,"AGENTS.md")),codeBuddySkill:ce.existsSync(pe.join(o.root,".codebuddy","skills","microi","SKILL.md")),qoderSkill:ce.existsSync(pe.join(o.root,".qoder","skills","microi","SKILL.md")),comateSkill:ce.existsSync(pe.join(o.root,".comate","skills","microi","SKILL.md")),vscodeMcp:ce.existsSync(l),workBuddyMcp:ce.existsSync(pe.join(o.root,".workbuddy","mcp.json")),portableMcp:ce.existsSync(pe.join(o.root,".mcp.json")),comateMcp:ce.existsSync(pe.join(o.root,".comate","mcp.json")),codexMcp:ce.existsSync(pe.join(o.root,".codex","config.toml")),tokenFile:ce.existsSync(o.auth.mcpTokenFilePath)},coexistence:{aiBundleVersion:u||"not-initialized",mcpProviders:g}};de(p,t),p.ok||(process.exitCode=2);return}throw new Error(`\u672A\u77E5\u547D\u4EE4\uFF1A${s.join(" ")}
|
|
1444
|
+
\u901A\u7528\u9009\u9879\uFF1A--workspace <\u76EE\u5F55>\uFF08\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55\uFF09\u3001--profile <\u5E8F\u53F7/OsClient/\u540D\u79F0/mcpName>\u3001--json`}async function Hi(s,e){let t=(X(e,"api")||await un("API \u5730\u5740")).replace(/\/+$/,""),n=X(e,"os-client")||await un("OsClient");if(!/^https?:\/\//i.test(t))throw new Error("API \u5730\u5740\u5FC5\u987B\u4EE5 http:// \u6216 https:// \u5F00\u5934");if(!n)throw new Error("OsClient \u4E0D\u80FD\u4E3A\u7A7A");let o={label:X(e,"label")||await un("\u8FDE\u63A5\u540D\u79F0",n),apiBaseUrl:t,osClient:n,osClientType:X(e,"type")||"",osClientNetwork:X(e,"network")||""};return await s.config.addProfile(o),o}function Aa(s){return s===!0||s===1||String(s||"").trim().toLowerCase()==="true"}async function Wi(s,e,t){if(t["credentials-stdin"]!==!0&&!process.stdin.isTTY)throw new Error("\u5F53\u524D\u8F93\u5165\u4E0D\u652F\u6301\u9690\u85CF\u5BC6\u7801\uFF1B\u8BF7\u4F7F\u7528 auth login --credentials-stdin \u6216 auth import --session-stdin\uFF1B\u5BBF\u4E3B\u987B\u5B89\u5168\u6CE8\u5165\u539F\u59CB\u51ED\u636E\uFF0C\u4EE3\u7406\u5360\u4F4D\u7B26\u4E0D\u80FD\u4EE3\u66FF\u5BC6\u7801\u3002");let n=t["credentials-stdin"]===!0?Ui(await qr(process.stdin)):void 0,r=n?.username||X(t,"account")||await un("\u5E10\u53F7"),o=n?.password??await Ma("\u5BC6\u7801");s.auth.enableProtectedMcpTokens(e);let i=await s.auth.getSysConfig(e.apiBaseUrl,e.osClient),a,c,l="";if(Aa(i?.EnableCaptcha)){if(!process.stdin.isTTY&&!X(t,"captcha"))throw new Error("\u670D\u52A1\u5668\u8981\u6C42\u56FE\u5F62\u9A8C\u8BC1\u7801\uFF1B\u8BF7\u5728\u4EA4\u4E92\u7EC8\u7AEF\u767B\u5F55\uFF0C\u6216\u901A\u8FC7\u5DF2\u6388\u6743\u7684\u72EC\u7ACB\u5F00\u53D1\u5DE5\u5177\u4F1A\u8BDD\u5BFC\u5165\u3002\u6807\u51C6\u8F93\u5165\u51ED\u636E\u4E0D\u4F1A\u7ED5\u8FC7\u9A8C\u8BC1\u7801\u3002");let g=await s.auth.getCaptcha(e.apiBaseUrl,e.osClient);if(!g)throw new Error("\u670D\u52A1\u5668\u8981\u6C42\u9A8C\u8BC1\u7801\uFF0C\u4F46\u9A8C\u8BC1\u7801\u56FE\u7247\u83B7\u53D6\u5931\u8D25");l=fe.join(s.config.getSyncRootDir(),".microi-login-captcha.png"),ce.mkdirSync(fe.dirname(l),{recursive:!0}),ce.writeFileSync(l,Buffer.from(g.imageBase64.split(",")[1],"base64")),console.log(`\u9A8C\u8BC1\u7801\u56FE\u7247\uFF1A${l}`),a=g.captchaId,c=X(t,"captcha")||await un("\u9A8C\u8BC1\u7801")}try{let g=await s.auth.login(r,o,{apiBaseUrl:e.apiBaseUrl,osClient:e.osClient,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork,captchaId:a,captchaValue:c});if(!g.ok)throw new Error(g.msg||"\u767B\u5F55\u5931\u8D25");let d=await s.auth.getSysConfig(e.apiBaseUrl,e.osClient,void 0,!0);d&&await s.config.addProfile({...e,label:String(d.SysShortTitle||d.SysTitle||e.label),sysShortTitle:String(d.SysShortTitle||""),sysTitle:String(d.SysTitle||"")})}finally{l&&ce.existsSync(l)&&ce.rmSync(l,{force:!0})}}async function Yr(s,e,t={}){let n=X(t,"host");if(n&&n!=="workbuddy")throw new Error("\u5F53\u524D\u539F\u751F\u5BBF\u4E3B\u53C2\u6570\u53EA\u652F\u6301 --host workbuddy");if(n&&!e)throw new Error("--host workbuddy \u9700\u8981 MCP \u521D\u59CB\u5316\uFF0C\u4E0D\u80FD\u540C\u65F6\u4F7F\u7528 --no-mcp");let r;if(n==="workbuddy"){let i=X(t,"profile");if(!i&&s.config.getProfiles().length>1)throw new Error("WorkBuddy \u539F\u751F\u521D\u59CB\u5316\u53EA\u5199\u5165\u6307\u5B9A\u8FDE\u63A5\uFF1B\u8BF7\u4F20 --profile <mcpName>");r=$e(s.config,i)}Bn.getInstance().inject({strictAiDocs:!0});let o=e?await qn(s.root,{workBuddyProfile:r,repairWorkBuddyEncoding:t["repair-workbuddy-encoding"]===!0}):{count:0,names:[],nativeWorkBuddy:{requested:!1,state:"not-requested"}};return{workspace:s.root,syncRoot:s.config.getSyncRootDir(),mcp:o}}async function Gi(s,e,t){if(!Xe(s,e))throw new Error("\u8BE5\u8FDE\u63A5\u6CA1\u6709\u53EF\u7528 Token\uFF0C\u8BF7\u5148\u6267\u884C microi auth login");let n=_t.getInstance();(t==="all"||t==="api")&&await n.pullEngines(e),(t==="all"||t==="form")&&(await n.pullEvents(e),await n.pullFields(e)),(t==="all"||t==="module")&&await n.pullMenuButtons(e),(t==="all"||t==="workflow")&&await n.pullWorkflows(e),(t==="all"||t==="schema")&&await n.pullDbSchema(e)}async function xa(){let{words:s,options:e}=Na(process.argv.slice(2)),t=e.json===!0;if(s[0]==="version"||e.version===!0){let a={package:"@microi.net/cli",version:Qe()};t?ge(a,!0):console.log(a.version);return}if(!s.length||s[0]==="help"||e.help){console.log(Ki());return}let[n,r,o]=s;if(n==="update"){let a=X(e,"current-version")||Qe();if(e.worker===!0){ge($i({currentVersion:a,workspace:X(e,"workspace"),sourceCliPath:X(e,"source-cli")}),t);return}try{ge(Jr({currentVersion:a,workspace:X(e,"workspace")||process.cwd(),sourceCliPath:process.argv[1],force:e.force===!0}),t)}catch(c){ge({scheduled:!1,deferred:!0,message:`\u81EA\u52A8\u66F4\u65B0\u6682\u672A\u6295\u9012\uFF0C\u5C06\u5728\u540E\u7EED\u4F7F\u7528\u65F6\u91CD\u8BD5\uFF1B\u4E0D\u5F71\u54CD\u5F53\u524D\u6216\u65B0\u5EFA\u5DE5\u4F5C\uFF1A${c instanceof Error?c.message:String(c)}`},t)}return}if(process.env.MICROI_DISABLE_AUTO_UPDATE!=="1")try{Jr({currentVersion:Qe(),workspace:X(e,"workspace")||process.cwd(),sourceCliPath:process.argv[1]})}catch{}if(n==="plugin"&&r==="path"){let a=fe.resolve(__dirname,"..");ge({package:"@microi.net/cli",packageRoot:a,codeBuddyManifest:fe.join(a,".codebuddy-plugin","plugin.json"),codeBuddyMarketplace:fe.join(a,".codebuddy-plugin","marketplace.json"),workBuddyManifest:fe.join(a,".workbuddy-plugin","plugin.json"),workBuddyMarketplace:fe.join(a,".workbuddy-plugin","marketplace.json"),dshBundle:fe.join(a,"cordis.patch.yml")},t);return}if(n==="codex"){if(r==="status"){let a=oi();ge(a,t),a.ok||(process.exitCode=2);return}if(r==="install"){ge(ai({force:e.force===!0,marketplaceSource:X(e,"source")}),t);return}}if(n==="dsh"){let a=X(e,"profile");if(r==="status"){let c=gi(a);ge(c,t),c.ok||(process.exitCode=2);return}if(r==="install"){ge(pi({profile:a,source:X(e,"source"),force:e.force===!0}),t);return}}let i=await Ii(X(e,"workspace")||process.cwd());if(n==="auth"&&r==="import"){if(e["session-stdin"]!==!0)throw new Error("\u8BF7\u4F7F\u7528 --session-stdin\uFF0C\u51ED\u636E\u4E0D\u5F97\u653E\u5165\u547D\u4EE4\u884C\u53C2\u6570");let a=ji(await qr(process.stdin)),c=i.config.getProfiles().find(d=>d.apiBaseUrl.replace(/\/+$/,"")===a.ApiBase&&d.osClient.toLowerCase()===a.OsClient.toLowerCase()),l=c||{label:a.OsClient,apiBaseUrl:a.ApiBase,osClient:a.OsClient,osClientType:"",osClientNetwork:""};i.auth.enableProtectedMcpTokens(l);let g=i.api.getTokenForServer(l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork);try{await i.api.setToken(a.Token,l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork);let d=await i.api.request({method:"POST",path:"/apiengine/platform-current-user",body:{},apiBaseUrl:l.apiBaseUrl,osClient:l.osClient,osClientType:l.osClientType,osClientNetwork:l.osClientNetwork,allowAuthRetry:!1,silent:!0});if(d.Code!==1||!d.Data)throw new Error("\u670D\u52A1\u5668\u672A\u63A5\u53D7\u6B64\u8FDE\u63A5\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u5F00\u53D1\u5DE5\u5177 Token");c||await i.config.addProfile(l),await i.auth.writeMcpTokenFile(),ge({imported:!0,ApiBase:l.apiBaseUrl,OsClient:l.osClient,Next:"microi ai init"},t)}catch(d){throw g?await i.api.setToken(g,l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork):await i.api.clearTokenForServer(l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork),d}return}if(n==="profile"){if(r==="list"){let a=We(i.config.getProfiles()).map(({profile:c,mcpName:l},g)=>({index:g+1,mcpName:l,...c,loggedIn:Xe(i,c)}));ge(a,t);return}if(r==="add"){ge(await Hi(i,e),t);return}if(r==="remove"){let a=$e(i.config,o||X(e,"profile")),c=i.config.getProfiles().findIndex(l=>l.apiBaseUrl===a.apiBaseUrl&&l.osClient===a.osClient);await i.config.removeProfile(c),await i.auth.writeMcpTokenFile(),await qn(i.root),ge({removed:!0,profile:a},t);return}}if(n==="auth"){let a=$e(i.config,X(e,"profile"));if(r==="login"){await Wi(i,a,e),ge({loggedIn:!0,profile:a.osClient},t);return}if(r==="repair"){if(!await i.auth.recoverProfileLogin(a))throw new Error("\u5F53\u524D\u5DE5\u4F5C\u533A\u6CA1\u6709\u8BE5\u8FDE\u63A5\u53EF\u7528\u7684 OS \u52A0\u5BC6\u5E10\u53F7\u5BC6\u7801\uFF0C\u9700\u5148\u6267\u884C\u4E00\u6B21 microi auth login");ge({loggedIn:!0,repaired:!0,profile:a.osClient},t);return}if(r==="status"){ge({loggedIn:Xe(i,a),profile:a},t);return}if(r==="logout"){await i.api.clearTokenForServer(a.apiBaseUrl,a.osClient,a.osClientType,a.osClientNetwork),await i.auth.writeMcpTokenFile(),await qn(i.root),ge({loggedIn:!1,profile:a.osClient},t);return}}if(n==="ai"&&r==="init"){ge(await Yr(i,e.mcp!==!1,e),t);return}if(n==="mcp"&&(r==="tools"||r==="call")){let a=X(e,"profile");if(!a&&i.config.getProfiles().length>1)throw new Error("\u5B58\u5728\u591A\u4E2A\u543E\u7801\u8FDE\u63A5\uFF0C\u8BF7\u5148\u8FD0\u884C microi profile list --json\uFF0C\u518D\u663E\u5F0F\u4F20 --profile <mcpName>");let c=$e(i.config,a),l=We(i.config.getProfiles()).find(f=>f.profile.apiBaseUrl===c.apiBaseUrl&&f.profile.osClient===c.osClient&&f.profile.osClientType===c.osClientType&&f.profile.osClientNetwork===c.osClientNetwork)?.mcpName;if(r==="call"&&e["params-stdin"]!==!0)throw new Error("MCP \u8C03\u7528\u5FC5\u987B\u4F7F\u7528 --params-stdin\uFF1B\u65E0\u53C2\u6570\u65F6\u4ECE\u6807\u51C6\u8F93\u5165\u4F20 {}\uFF0C\u4E0D\u8981\u5C06\u79D8\u5BC6\u653E\u5165\u547D\u4EE4\u884C");let g=r==="call"?await _i(process.stdin):{},d=fe.join(__dirname,"microi-cli-mcp.js");if(!ce.existsSync(d)||!ce.existsSync(fe.join(__dirname,"mcp-server.js")))throw new Error("CLI \u5B89\u88C5\u7F3A\u5C11\u5B98\u65B9 MCP\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5 @microi.net/cli");let u=Object.fromEntries(Object.entries(process.env).filter(([f])=>!/^MICROI_/i.test(f))),p=await Pi({command:process.execPath,args:[d],cwd:i.root,env:{...u,...Jn(i.root,c),MCP_TRANSPORT:"stdio",MICROI_CODEX_MODE:"0"}},r,o||"",g,Number(X(e,"timeout-ms")||12e4),X(e,"cursor"));ge({transport:"stdio",profile:l,...p},t),p?.isError&&(process.exitCode=2);return}if(n==="mcp"&&r==="init"){let a=await Yr(i,!0,e);ge(a.mcp,t);return}if(n==="init"){let a=X(e,"profile");if(X(e,"host")==="workbuddy"&&!a&&i.config.getProfiles().length>1)throw new Error("WorkBuddy \u539F\u751F\u521D\u59CB\u5316\u53EA\u5199\u5165\u6307\u5B9A\u8FDE\u63A5\uFF1B\u8BF7\u4F20 --profile <mcpName>");let c=a?$e(i.config,a):i.config.getProfiles()[0];c||(c=await Hi(i,e)),Xe(i,c)||await Wi(i,c,e);let l=await Yr(i,!0,e);e.pull===!0&&await Gi(i,c,"all"),ge({initialized:!0,pulled:e.pull===!0,details:l},t);return}if(n==="pull"){let a=$e(i.config,X(e,"profile")),c=X(e,"scope")||"all";if(!["all","api","form","module","workflow","schema"].includes(c))throw new Error(`\u4E0D\u652F\u6301\u7684\u62C9\u53D6\u8303\u56F4\uFF1A${c}`);await Gi(i,a,c),ge({pulled:!0,scope:c,profile:a.osClient},t);return}if(n==="push"){let a=fe.resolve(r||"");if(!ce.existsSync(a))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${a}`);if(!await _t.getInstance().pushFile(a))throw new Error("\u63A8\u9001\u5931\u8D25\uFF0C\u8BF7\u67E5\u770B\u4E0A\u65B9 Microi \u65E5\u5FD7");ge({pushed:!0,file:a},t);return}if(n==="sync"&&r==="status"){let a=$e(i.config,X(e,"profile")),c=X(e,"scope")||"all";if(!["all","api","form","module","workflow"].includes(c))throw new Error(`\u4E0D\u652F\u6301\u7684\u5DEE\u5F02\u8303\u56F4\uFF1A${c}`);let l=await _t.getInstance().checkRemoteDifferences(a,c);ge({profile:a.osClient,scope:c,count:l.length,differences:l},t);return}if(n==="doctor"){let a=X(e,"host");if(a&&a!=="workbuddy")throw new Error("\u5F53\u524D\u539F\u751F\u5BBF\u4E3B\u53C2\u6570\u53EA\u652F\u6301 --host workbuddy");if(a==="workbuddy"&&!X(e,"profile")&&i.config.getProfiles().length>1)throw new Error("WorkBuddy \u539F\u751F\u8BCA\u65AD\u9700\u8981 --profile <mcpName>\uFF0C\u907F\u514D\u8BEF\u5224\u5176\u5B83\u8FDE\u63A5");let c=i.config.getProfiles(),l=Qe(),g=fe.join(i.root,".vscode","mcp.json"),d=[];if(ce.existsSync(g))try{let C=wn(ce.readFileSync(g,"utf-8")),h=C.servers&&typeof C.servers=="object"?C.servers:{};for(let[y,w]of Object.entries(h)){let k=w.env&&typeof w.env=="object"?w.env:{};if(!/^microi(?:_|-|$)/i.test(y)&&typeof k.MICROI_API_URL!="string")continue;let b=en(w),_=tn(b,l);d.push({name:y,source:String(k.MICROI_TOOL_SOURCE||"legacy"),version:b||"legacy",compatibility:_>0?"newer-provider-preserved":_<0?"upgrade-available":"compatible"})}}catch(C){d.push({name:"(config)",source:"unknown",version:"unknown",compatibility:`invalid-json: ${C instanceof Error?C.message:String(C)}`})}let u=fe.join(i.root,".vscode",".microi-ai-docs-manifest.json"),p="";if(ce.existsSync(u))try{let C=JSON.parse(ce.readFileSync(u,"utf-8"));p=String(C.bundleVersion||"")}catch{p="invalid-json"}let f=a==="workbuddy"?Xe(i,$e(i.config,X(e,"profile"))):c.length>0&&c.some(C=>Xe(i,C)),m=a==="workbuddy"?(()=>{let C=$e(i.config,X(e,"profile")),h=We(c).find(y=>y.profile.apiBaseUrl===C.apiBaseUrl&&y.profile.osClient===C.osClient&&y.profile.osClientType===C.osClientType&&y.profile.osClientNetwork===C.osClientNetwork).mcpName;return Ur(h,{command:process.execPath,env:Jn(i.root,C)})})():void 0,S={ok:f&&(!m||m.configurationReady&&!m.disabled&&m.trust==="approved"),scope:a==="workbuddy"?"workbuddy-native-configuration-and-trust":"local-credentials-and-project-file-inventory",connectionReady:f,remoteConnection:"not-tested",toolInjection:"unverified",nativeWorkBuddy:m||{requested:!1,state:"not-requested"},tool:{source:"cli",version:l},node:process.version,workspace:i.root,syncRoot:i.config.getSyncRootDir(),profiles:c.map(C=>({label:C.label,osClient:C.osClient,apiBaseUrl:C.apiBaseUrl,loggedIn:Xe(i,C)})),files:{agents:ce.existsSync(fe.join(i.root,"AGENTS.md")),codeBuddySkill:ce.existsSync(fe.join(i.root,".codebuddy","skills","microi","SKILL.md")),qoderSkill:ce.existsSync(fe.join(i.root,".qoder","skills","microi","SKILL.md")),comateSkill:ce.existsSync(fe.join(i.root,".comate","skills","microi","SKILL.md")),vscodeMcp:ce.existsSync(g),workBuddyMcp:ce.existsSync(fe.join(i.root,".workbuddy","mcp.json")),portableMcp:ce.existsSync(fe.join(i.root,".mcp.json")),comateMcp:ce.existsSync(fe.join(i.root,".comate","mcp.json")),codexMcp:ce.existsSync(fe.join(i.root,".codex","config.toml")),tokenFile:ce.existsSync(i.auth.mcpTokenFilePath)},coexistence:{aiBundleVersion:p||"not-initialized",mcpProviders:d}};ge(S,t),S.ok||(process.exitCode=2);return}throw new Error(`\u672A\u77E5\u547D\u4EE4\uFF1A${s.join(" ")}
|
|
1443
1445
|
|
|
1444
|
-
${
|
|
1446
|
+
${Ki()}`)}xa().catch(s=>{console.error(`Microi CLI: ${s instanceof Error?s.message:String(s)}`),process.exitCode=s instanceof ln?s.exitCode:1});
|