@microi.net/cli 4.6.2
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/LICENSE +21 -0
- package/README.md +66 -0
- package/dist/mcp-codex-stdio-adapter.js +189 -0
- package/dist/mcp-server.js +972 -0
- package/dist/mcp-trae-windows-launcher.cmd +21 -0
- package/dist/microi-cli-mcp.js +7 -0
- package/dist/microi-cli.js +1645 -0
- package/dist/microi-skills.meta.json +335 -0
- package/dist/microi.skills/.microi-skills-version.json +6 -0
- package/dist/microi.skills/README.md +276 -0
- package/dist/microi.skills/ai-engine/SKILL.md +140 -0
- package/dist/microi.skills/ai-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/app-store/SKILL.md +105 -0
- package/dist/microi.skills/app-store/agents/openai.yaml +4 -0
- package/dist/microi.skills/business-blueprint/SKILL.md +184 -0
- package/dist/microi.skills/datasource-engine/SKILL.md +89 -0
- package/dist/microi.skills/datasource-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/dos-orm/SKILL.md +76 -0
- package/dist/microi.skills/dos-orm/references/api-reference.md +229 -0
- package/dist/microi.skills/job-engine/SKILL.md +141 -0
- package/dist/microi.skills/job-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/message-notification/SKILL.md +113 -0
- package/dist/microi.skills/message-notification/agents/openai.yaml +6 -0
- package/dist/microi.skills/message-notification/references/contracts.md +99 -0
- package/dist/microi.skills/microi-ai-app-auth.js +651 -0
- package/dist/microi.skills/microi-ai-application/SKILL.md +80 -0
- package/dist/microi.skills/microi-ai-application/agents/openai.yaml +4 -0
- package/dist/microi.skills/microi-ai-application/references/frontend-baseline.md +164 -0
- package/dist/microi.skills/microi-client-frontend/SKILL.md +562 -0
- package/dist/microi.skills/microi-datasource-mapping/SKILL.md +108 -0
- package/dist/microi.skills/microi-db-schema/SKILL.md +170 -0
- package/dist/microi.skills/microi-db-schema/agents/openai.yaml +4 -0
- package/dist/microi.skills/microi-db-schema/references/core-tables.md +695 -0
- package/dist/microi.skills/microi-db-schema/references/form-component-options.md +256 -0
- package/dist/microi.skills/microi-db-schema/references/schema-overview.md +203 -0
- package/dist/microi.skills/microi-db-schema/references/schema.md +647 -0
- package/dist/microi.skills/microi-db-schema/references/table-catalog.md +1607 -0
- package/dist/microi.skills/microi-deployment/SKILL.md +117 -0
- package/dist/microi.skills/microi-deployment/references/deployment-matrix.md +94 -0
- package/dist/microi.skills/microi-docs-coverage/SKILL.md +91 -0
- package/dist/microi.skills/microi-docs-coverage/references/capability-map.md +65 -0
- package/dist/microi.skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +887 -0
- package/dist/microi.skills/microi-form-engine/SKILL.md +159 -0
- package/dist/microi.skills/microi-form-engine/references/component-catalog.md +116 -0
- package/dist/microi.skills/microi-form-engine/references/data-source-events.md +117 -0
- package/dist/microi.skills/microi-form-layout/SKILL.md +373 -0
- package/dist/microi.skills/microi-frontend-sdk/SKILL.md +304 -0
- package/dist/microi.skills/microi-left-right-layout/SKILL.md +132 -0
- package/dist/microi.skills/microi-microservice/SKILL.md +115 -0
- package/dist/microi.skills/microi-microservice/references/runtime-delivery.md +145 -0
- package/dist/microi.skills/microi-mobile-app-quality/SKILL.md +436 -0
- package/dist/microi.skills/microi-solution-quotation/SKILL.md +76 -0
- package/dist/microi.skills/microi-solution-quotation/agents/openai.yaml +4 -0
- package/dist/microi.skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -0
- package/dist/microi.skills/microi-system-delivery/SKILL.md +446 -0
- package/dist/microi.skills/microi-ui/SKILL.md +321 -0
- package/dist/microi.skills/microi-uniapp-frontend/SKILL.md +483 -0
- package/dist/microi.skills/microi.v8.js +1758 -0
- package/dist/microi.skills/module-engine/SKILL.md +131 -0
- package/dist/microi.skills/module-engine/references/module-config.md +174 -0
- package/dist/microi.skills/page-engine/SKILL.md +397 -0
- package/dist/microi.skills/performance-testing/SKILL.md +207 -0
- package/dist/microi.skills/playwright-e2e/SKILL.md +769 -0
- package/dist/microi.skills/print-engine/SKILL.md +237 -0
- package/dist/microi.skills/production-readonly-audit/SKILL.md +39 -0
- package/dist/microi.skills/report-engine/SKILL.md +69 -0
- package/dist/microi.skills/report-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/search-engine/SKILL.md +73 -0
- package/dist/microi.skills/search-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/spider-engine/SKILL.md +188 -0
- package/dist/microi.skills/translate-engine/SKILL.md +91 -0
- package/dist/microi.skills/translate-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/ui-design/SKILL.md +1575 -0
- package/dist/microi.skills/ui-design/assets/pattern-showcase/app.js +54 -0
- package/dist/microi.skills/ui-design/assets/pattern-showcase/index.html +163 -0
- package/dist/microi.skills/ui-design/assets/pattern-showcase/styles.css +311 -0
- package/dist/microi.skills/ui-design/assets/templates/MCI-DESIGN.md +98 -0
- package/dist/microi.skills/ui-design/references/design-pattern-library.md +171 -0
- package/dist/microi.skills/ui-design/references/mci-design-contract.md +84 -0
- package/dist/microi.skills/ui-design/references/motion-and-media.md +71 -0
- package/dist/microi.skills/ui-design/references/product-flow-recipes.md +94 -0
- package/dist/microi.skills/uniapp-mall-assets/SKILL.md +105 -0
- package/dist/microi.skills/v8-api-config/SKILL.md +272 -0
- package/dist/microi.skills/v8-cache-pattern/SKILL.md +286 -0
- package/dist/microi.skills/v8-crud-api/SKILL.md +398 -0
- package/dist/microi.skills/v8-debugging/SKILL.md +279 -0
- package/dist/microi.skills/v8-explorer-tree/SKILL.md +224 -0
- package/dist/microi.skills/v8-export-import/SKILL.md +590 -0
- package/dist/microi.skills/v8-file-upload/SKILL.md +497 -0
- package/dist/microi.skills/v8-formengine-http/SKILL.md +218 -0
- package/dist/microi.skills/v8-frontend-events/SKILL.md +349 -0
- package/dist/microi.skills/v8-frontend-events/references/bluetooth-print-api.md +107 -0
- package/dist/microi.skills/v8-frontend-events/references/bluetooth-print.md +185 -0
- package/dist/microi.skills/v8-http-integration/SKILL.md +379 -0
- package/dist/microi.skills/v8-image-processing/SKILL.md +187 -0
- package/dist/microi.skills/v8-image-processing/agents/openai.yaml +4 -0
- package/dist/microi.skills/v8-image-processing/references/api-reference.md +620 -0
- package/dist/microi.skills/v8-menu-buttons/SKILL.md +661 -0
- package/dist/microi.skills/v8-mongodb/SKILL.md +149 -0
- package/dist/microi.skills/v8-mq-mqtt/SKILL.md +227 -0
- package/dist/microi.skills/v8-saas-multi-tenant/SKILL.md +193 -0
- package/dist/microi.skills/v8-security/SKILL.md +417 -0
- package/dist/microi.skills/v8-sql-query/SKILL.md +290 -0
- package/dist/microi.skills/v8-table-event/SKILL.md +385 -0
- package/dist/microi.skills/v8-template-engine/SKILL.md +165 -0
- package/dist/microi.skills/v8-utilities/SKILL.md +79 -0
- package/dist/microi.skills/v8-utilities/references/client-api-index.md +136 -0
- package/dist/microi.skills/v8-utilities/references/platform-http-routes.md +80 -0
- package/dist/microi.skills/v8-utilities/references/server-api-index.md +129 -0
- package/dist/microi.skills/v8-workflow/SKILL.md +322 -0
- package/dist/microi.skills/workspace-conventions/SKILL.md +479 -0
- package/package.json +40 -0
|
@@ -0,0 +1,1645 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";var ei=Object.create;var rn=Object.defineProperty;var ti=Object.getOwnPropertyDescriptor;var ni=Object.getOwnPropertyNames;var ii=Object.getPrototypeOf,ri=Object.prototype.hasOwnProperty;var si=(a,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of ni(e))!ri.call(a,i)&&i!==t&&rn(a,i,{get:()=>e[i],enumerable:!(n=ti(e,i))||n.enumerable});return a};var G=(a,e,t)=>(t=a!=null?ei(ii(a)):{},si(e||!a||!a.__esModule?rn(t,"default",{value:a,enumerable:!0}):t,a));var ie=G(require("fs")),he=G(require("path")),Xn=G(require("readline"));var sn=G(require("os")),on=process.cwd();function an(a){on=a}var oi={append:a=>process.stderr.write(a),appendLine:(a="")=>console.error(a),clear:()=>{},show:()=>{},hide:()=>{},replace:a=>process.stderr.write(a),dispose:()=>{},name:"Microi CLI"},Ge={get workspaceFolders(){return[{uri:{fsPath:on}}]},workspaceFile:void 0,findFiles:async()=>[]},At={machineId:sn.hostname()||"microi-cli",sessionId:`microi-cli-${process.pid}`},Ne={executeCommand:async()=>{}},Me={Notification:15},cn={file:a=>({fsPath:a})},oe={createOutputChannel:()=>oi,showInformationMessage:async()=>{},showWarningMessage:async()=>{},showErrorMessage:async()=>{},showTextDocument:async()=>{},onDidChangeWindowState:()=>({dispose:()=>{}}),withProgress:async(a,e)=>e({report:({message:t})=>t&&console.error(t)},{isCancellationRequested:!1,onCancellationRequested:()=>({dispose:()=>{}})})};var C=G(require("fs")),v=G(require("path"));var St=G(require("https")),Ct=G(require("http")),Tt=G(require("crypto")),Ue=G(require("fs"));var pe=G(require("path")),W=G(require("fs")),In=G(require("crypto"));var Ae=".microi-meta.json",ln=".microi-config.json",ze=".microi-mcp-tokens.json";var dn=".mcp.json";var be="Microi-V8-Engine";var Ve="\u63A5\u53E3\u5F15\u64CE",gn="V8\u4E8B\u4EF6",Te="\u8868\u5355\u5F15\u64CE",De="\u6A21\u5757\u5F15\u64CE",$e="\u6D41\u7A0B\u5F15\u64CE",un="AI\u5E94\u7528",ut="\u8868\u5355V8\u4E8B\u4EF6",Je="\u5B57\u6BB5V8\u4E8B\u4EF6",mt="\u8282\u70B9",mn={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"},Vt={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"},Oe={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"},qe={SqlJoin:"Join\u5173\u8054",SqlWhere:"Where\u6761\u4EF6"},pn={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"},Qe=".microi-typings",pt="v8-engine.d.ts",$t=".github",Ot="copilot-instructions.md",Lt="CLAUDE.md",xt="AGENTS.md",Bt=".cursorrules",Ut=".cursor/rules",jt="microi-skills.mdc",x={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",SYNC_MICRO_SERVICE_SOURCE:"/api/V8Debug/SyncMicroServiceSource",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"},Le=".microi-db-schema.json",ke=".microi-db-schema.md";var Ht=`\u26A0\uFE0F \u4FEE\u6539\u540E\u8BF7\u624B\u52A8\u63A8\u9001\u5230\u6570\u636E\u5E93
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
`;var xe="microi.isLoggedIn";var Wt="microi.authToken",ye="microi.username",Se="microi.password",fn=`-----BEGIN PUBLIC KEY-----
|
|
6
|
+
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7q21EG3HiSFNO9XFUJoMeyz2R
|
|
7
|
+
XaFX8UgCFE4d4pvK6IvQsWunm+WfYqgrSzBMS1LH1fstmZB0wnVUX1uGROaZTKGZ
|
|
8
|
+
1rS/MVn4i6CsPgP9Q7nFV6dZvbxro1byH/E3CV/Q1CgCDeue9FzQUlWQ+UZld8Jg
|
|
9
|
+
1DsI9VJ7gTHGL3R7sQIDAQAB
|
|
10
|
+
-----END PUBLIC KEY-----`;var de=G(require("fs")),z=G(require("path")),Kt=require("child_process");var hn="# Microi VS Code extension local runtime files";function ft(a){let e="",t=0;for(;t<a.length;)if(a[t]==='"'){let n=t;for(t++;t<a.length&&a[t]!=='"';)a[t]==="\\"&&t++,t++;t++,e+=a.slice(n,t)}else if(a[t]==="/"&&a[t+1]==="/")for(;t<a.length&&a[t]!==`
|
|
11
|
+
`;)t++;else if(a[t]==="/"&&a[t+1]==="*"){for(t+=2;t<a.length&&!(a[t]==="*"&&a[t+1]==="/");)t++;t+=2}else e+=a[t],t++;return JSON.parse(e)}function te(a){de.existsSync(a)||de.mkdirSync(a,{recursive:!0})}function yn(a){return a.replace(/\\/g,"/").replace(/^\.\//,"")}function Sn(a){let e=a;for(;;){let t=z.join(e,".git");if(de.existsSync(t))try{let i=de.statSync(t);if(i.isDirectory())return{gitDir:t,workTreeRoot:e};if(i.isFile()){let s=de.readFileSync(t,"utf-8").match(/^gitdir:\s*(.+)$/m);if(s?.[1])return{gitDir:z.isAbsolute(s[1])?s[1]:z.resolve(e,s[1]),workTreeRoot:e}}}catch{return null}let n=z.dirname(e);if(n===e)return null;e=n}}function ve(a,e){try{let t=Sn(a);if(!t)return;let n=z.join(t.gitDir,"info");te(n);let i=z.join(n,"exclude"),r=yn(z.relative(t.workTreeRoot,a)),s=e.map(u=>u.trim()).filter(Boolean).map(u=>yn(u.replace(/^\/+/,""))).map(u=>r?`${r}/${u}`:u),o=de.existsSync(i)?de.readFileSync(i,"utf-8"):"",c=new Set(o.split(/\r?\n/).map(u=>u.trim())),d=s.filter(u=>!c.has(u));if(!d.length)return;let m=o.length>0&&!o.endsWith(`
|
|
12
|
+
`),g=o.includes(hn)?"":`${hn}
|
|
13
|
+
`,l=`${m?`
|
|
14
|
+
`:""}${g}${d.join(`
|
|
15
|
+
`)}
|
|
16
|
+
`;de.appendFileSync(i,l,"utf-8")}catch{}}function Be(a){if(process.platform==="win32")try{let e=Sn(a);if(!e)return;try{if((0,Kt.execFileSync)("git",["config","--get","core.longpaths"],{cwd:e.workTreeRoot,encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0}).trim().toLowerCase()==="true")return}catch{}(0,Kt.execFileSync)("git",["config","core.longpaths","true"],{cwd:e.workTreeRoot,stdio:"ignore",windowsHide:!0})}catch{}}function H(a){let e=String(a||"").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 Gt(a){return encodeURIComponent(String(a||"")).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function ai(a){try{return decodeURIComponent(String(a||""))}catch{return String(a||"")}}function Ce(a){let e=a.indexOf(Ht);return e!==-1?a.substring(e+Ht.length):a}function ci(a){let e=a||"";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(`
|
|
17
|
+
`)}function zt(a){let e=a||"",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 i=t.replace(/=+$/,""),r=Buffer.from(n,"utf8").toString("base64").replace(/=+$/,"");return i!==r?e:ci(n)?n:e}catch{return e}}function Cn(a,e){let n=z.relative(e,a).split(z.sep);if(n.length>=5&&(n[2]===Ve||n[2]==="api-engine")){let i=n[1],r=i.split(".")[0];if(n.length===5&&n[4]?.endsWith(".js")){let s=n[4].replace(".js",""),o=s.match(/\(([^)]+)\)$/);return o?{serverDir:n[0],osClientDir:i,osClient:r,category:n[3],apiEngineKey:ai(o[1])}:{serverDir:n[0],osClientDir:i,osClient:r,category:n[3],apiEngineKey:s}}if(n.length>=6&&n[5]?.endsWith(".js"))return{serverDir:n[0],osClientDir:i,osClient:r,category:n[3],apiEngineKey:n[5].replace(".js","")}}return null}function Tn(a,e){let n=z.relative(e,a).split(z.sep),i=r=>{let s=r.match(/[((]([^))]+)[))]\s*$/);return s?s[1]:r};if(n.length>=6&&n[2]===Te&&n[4]===ut){let r=n[1],s=r.split(".")[0],o=i(n[3]),c=n[5].replace(/\.js$/i,""),d=i(c);return{serverDir:n[0],osClientDir:r,osClient:s,formEngineKey:o,eventType:d}}if(n.length>=5&&(n[2]===gn||n[2]==="v8-event"||n[2]==="v8-events")){let r=n[1],s=r.split(".")[0],o=i(n[3]);return{serverDir:n[0],osClientDir:r,osClient:s,formEngineKey:o,eventType:n[4].replace(/\.js$/i,"")}}return null}function me(a){return(a||new Date).toISOString().replace("T"," ").substring(0,19)}function vn(a,e){let n=z.relative(e,a).split(z.sep);if(n.length<7||n[2]!==Te||n[4]!==Je)return null;let i=g=>{let l=g.match(/[((]([^))]+)[))]\s*$/);return l?l[1]:g},r=n[1],s=r.split(".")[0],o=i(n[3]),c=i(n[5]),d=n[6].replace(/\.js$/i,""),m=i(d);return{serverDir:n[0],osClientDir:r,osClient:s,tableName:o,fieldName:c,v8Key:m}}function wn(a,e){let n=z.relative(e,a).split(z.sep);if(n[2]!==De)return null;let i=g=>{let l=g.match(/[((]([^))]+)[))]\s*$/);return l?l[1]:g},r=g=>g.replace(/[((][^))]+[))]\s*$/,"").trim()||g,s=n[1],o=s.split(".")[0],c=n.findIndex((g,l)=>l>2&&Object.prototype.hasOwnProperty.call(Oe,i(g)));if(c<=3)return null;let d=i(n[c-1]),m=i(n[c]);if(n.length>c+1&&n[c+1].endsWith(".js")){let g=n[c+1].replace(/\.js$/i,""),l=i(g),u=r(g).replace(/_显隐判断$/,"")||r(g),p=g.includes("\u663E\u9690\u5224\u65AD")?"V8CodeShow":"V8Code";return{serverDir:n[0],osClientDir:s,osClient:o,moduleId:d,btnField:m,btnId:l,btnName:u,v8SubField:p}}if(n.length>c+2&&n[c+2].endsWith(".js")){let g=i(n[c+1]),l=r(n[c+1]),u=n[c+2].replace(/\.js$/i,""),p=i(u);return p!=="V8Code"&&p!=="V8CodeShow"?null:{serverDir:n[0],osClientDir:s,osClient:o,moduleId:d,btnField:m,btnId:g,btnName:l,v8SubField:p}}return null}function En(a,e){let n=z.relative(e,a).split(z.sep),i=n[n.length-1];if(n.length<5||n[2]!==De||!i?.endsWith(".js"))return null;let r=d=>{let m=d.match(/[((]([^))]+)[))]\s*$/);return m?m[1]:d},s=r(i.replace(/\.js$/i,""));if(!Object.prototype.hasOwnProperty.call(qe,s))return null;let o=r(n[n.length-2]);if(!o)return null;let c=n[1];return{serverDir:n[0],osClientDir:c,osClient:c.split(".")[0],moduleId:o,scriptField:s}}function bn(a){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 a.replace(/\r\n/g,`
|
|
18
|
+
`).split(`
|
|
19
|
+
`).forEach((n,i)=>{for(let r of t)if(r.regex.test(n)){e.push({line:i+1,marker:r.label});break}}),e}function Dn(a,e){let n=z.relative(e,a).split(z.sep);if(n.length<7||n[2]!==$e||n[4]!==mt||!n[6]?.endsWith(".js"))return null;let i=m=>{let g=m.match(/[((]([^))]+)[))]\s*$/);return g?g[1]:m},r=n[1],s=r.split(".")[0],o=i(n[3]),c=i(n[5]),d=i(n[6].replace(/\.js$/i,""));return{serverDir:n[0],osClientDir:r,osClient:s,flowDesignId:o,nodeId:c,eventType:d}}function Ye(a){return String(a).padStart(2,"0")}function kn(a=new Date){return`${a.getFullYear()}-${Ye(a.getMonth()+1)}-${Ye(a.getDate())} ${Ye(a.getHours())}:${Ye(a.getMinutes())}:${Ye(a.getSeconds())}`}function Ie(a,e,t){let n=String(t??"").trim();!n||e.has(n)||(e.add(n),a.push(n))}function Xe(a){if(typeof a=="string")return a.trim()||"\u672A\u77E5\u9519\u8BEF";if(!a||typeof a!="object")return String(a??"\u672A\u77E5\u9519\u8BEF");let e=a,t=[],n=new Set;return Ie(t,n,e.message),Ie(t,n,e.code),Ie(t,n,e.syscall),e.address&&Ie(t,n,`address=${e.address}`),e.port!==void 0&&e.port!==null&&e.port!==""&&Ie(t,n,`port=${e.port}`),(Array.isArray(e.errors)?e.errors:[]).forEach(r=>Ie(t,n,Xe(r))),t.length||Ie(t,n,e.name),t.join(" | ")||"\u672A\u77E5\u9519\u8BEF"}var Y=class a{static init(){a._channel||(a._channel=oe.createOutputChannel("Microi \u543E\u7801"))}static get channel(){return a._channel}static log(e,t){a.init();let n=kn();a._channel.appendLine(`[${n}] [${e}] ${t}`)}static appendLine(e){a.init(),a._channel.appendLine(e)}static show(e){a._channel.show(e)}static dispose(){a._channel?.dispose()}};function li(a){return typeof a=="string"?a:a&&typeof a=="object"&&"title"in a?String(a.title||""):""}function Jt(a,e){return a.then(t=>{let n=li(t);return n&&Y.log("\u901A\u77E5/\u64CD\u4F5C",`${e}\u901A\u77E5\u9009\u62E9\uFF1A${n}`),t})}var P=class{static info(e,...t){return Y.log("\u901A\u77E5/\u4FE1\u606F",e),Jt(oe.showInformationMessage(e,...t),"\u4FE1\u606F")}static warn(e,...t){return Y.log("\u901A\u77E5/\u8B66\u544A",e),Jt(oe.showWarningMessage(e,...t),"\u8B66\u544A")}static error(e,...t){return Y.log("\u901A\u77E5/\u9519\u8BEF",e),Jt(oe.showErrorMessage(e,...t),"\u9519\u8BEF")}};var I=class a{constructor(){this._activeProfileIndex=-1;this._syncDirCasingWarningShown=!1;this.defaultSettings={apiBaseUrl:"",osClient:"",localDir:"",showConsoleOnExecute:!0,profiles:[]}}static getInstance(){return a._instance||(a._instance=new a),a._instance}getWorkspaceConfigPath(){let e=this.getWorkspaceRoot();if(e)return pe.join(this.getDefaultSyncRootDir(e),ln)}getWorkspaceStateFilePath(e){let t=this.getWorkspaceRoot();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");return pe.join(this.getDefaultSyncRootDir(t),e)}readWorkspaceConfig(){let e=this.getWorkspaceConfigPath();if(!e||!W.existsSync(e))return{};try{let t=JSON.parse(W.readFileSync(e,"utf-8"));return t&&typeof t=="object"?t:{}}catch{return{}}}readWorkspaceConfigForUpdate(e){if(!W.existsSync(e))return{};let t;try{t=JSON.parse(W.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){W.mkdirSync(pe.dirname(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;try{W.writeFileSync(n,`${JSON.stringify(t,null,2)}
|
|
20
|
+
`,"utf-8"),W.renameSync(n,e)}finally{try{W.existsSync(n)&&W.unlinkSync(n)}catch{}}}async mutateWorkspaceConfig(e){let t=this.getWorkspaceConfigPath();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");W.mkdirSync(pe.dirname(t),{recursive:!0});let n=`${t}.lock`,i=Date.now()+3e3,r;for(;r===void 0;)try{r=W.openSync(n,"wx",384),W.writeFileSync(r,JSON.stringify({pid:process.pid,createdAt:Date.now()}),"utf-8")}catch(s){if(s.code!=="EEXIST")throw s;try{Date.now()-W.statSync(n).mtimeMs>3e4&&W.unlinkSync(n)}catch{}if(Date.now()>=i)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 s=this.readWorkspaceConfigForUpdate(t),o=this.normalizeSettings(e(s));return this.writeWorkspaceConfig(t,o),this.normalizeSettings(o)}finally{try{W.closeSync(r)}catch{}try{W.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}async addProfile(e){await this.upsertProfiles([e])}async upsertProfiles(e){await this.mutateWorkspaceConfig(t=>{let n=Array.isArray(t.profiles)?[...t.profiles]:[];for(let i of e){let r=this.profileIdentity(i),s=n.findIndex(o=>this.profileIdentity(o)===r);if(s>=0){let o=n[s];n[s]={...o,...i,apiBaseUrl:o.apiBaseUrl,osClient:o.osClient}}else n.push(i)}return{...t,profiles:n}})}async removeProfile(e){let t=await this.mutateWorkspaceConfig(n=>{let i=Array.isArray(n.profiles)?[...n.profiles]:[];return i.splice(e,1),{...n,profiles:i}});this._activeProfileIndex>=t.profiles.length&&(this._activeProfileIndex=t.profiles.length-1)}profileIdentity(e){let t=String(e.apiBaseUrl||"").trim().replace(/\/+$/,""),n=t;try{let i=new URL(t);n=`${i.protocol.toLowerCase()}//${i.host.toLowerCase()}${i.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 Ge.workspaceFolders?.[0]?.uri.fsPath}getDefaultSyncRootDir(e){return this.ensureDefaultSyncDirCasing(e),pe.join(e,be)}ensureDefaultSyncDirCasing(e){try{if(!W.existsSync(e))return;let t=W.readdirSync(e,{withFileTypes:!0}).filter(o=>o.isDirectory());if(t.some(o=>o.name===be))return;let n=t.find(o=>o.name.toLowerCase()===be.toLowerCase());if(!n)return;let i=pe.join(e,n.name),r=pe.join(e,be),s=pe.join(e,`${be}.case-rename-${Date.now()}`);W.renameSync(i,s);try{W.renameSync(s,r)}catch(o){try{W.renameSync(s,i)}catch{}throw o}}catch{this._syncDirCasingWarningShown||(this._syncDirCasingWarningShown=!0,P.warn(`Microi: \u65E0\u6CD5\u5C06\u65E7\u540C\u6B65\u76EE\u5F55\u91CD\u547D\u540D\u4E3A ${be}\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=pe.resolve(t).toLowerCase(),i=In.createHash("sha256").update(n).digest("hex").slice(0,16);return`${e}.workspace.${i}`}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 H(`${e||"\u672A\u547D\u540D"} (${n})`)}buildOsClientDirName(e,t,n){return H([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||""}};function Rn(a){if(a?.Code===1001||a?.Code===1002)return!0;let e=String(a?.DataAppend?.ReasonCode||"").trim();if(/^(MissingToken|MalformedToken|MissingClaims|TenantMismatch|AuthVersionChanged|JwtExpired|SessionExpired|SessionMissing|TokenReplaced|SignatureMismatch)$/i.test(e))return!0;let t=[a?.Msg,a?.DataAppend?.UserMessage,a?.DataAppend?.AppendMsg].filter(Boolean).join(" ");return/Token签名|Token.*(无效|失效|过期)|登录.*(无效|失效|过期)|invalid\s*token|token\s*invalid|signature\s*mismatch/i.test(t)}function Ze(a){if(!Rn(a))return!1;let e=String(a?.DataAppend?.ReasonCode||"").trim();if(/^(InvalidTenant|InvalidOsClient|TenantNotFound|TenantDisabled)$/i.test(e))return!0;let t=[a?.Msg,a?.DataAppend?.UserMessage,a?.DataAppend?.Hint].filter(Boolean).join(" ");return/无效的租户标识|租户不存在|租户.*未启用|invalid\s+(tenant|osclient)|tenant\s+not\s+found|unknown\s+tenant/i.test(t)}function yt(a){return Rn(a)&&!Ze(a)}function _n(a){return/^[a-f0-9]{64}$/i.test(String(a||"").trim())}var ht=class{constructor(){this.inFlight=new Map}async run(e,t){let n=this.inFlight.get(e);if(n)return n;let i=Promise.resolve().then(t);this.inFlight.set(e,i);try{return await i}finally{this.inFlight.get(e)===i&&this.inFlight.delete(e)}}};var Pn="microi.authTokenMap",L=class a{constructor(){this._token="";this._tokenMap={};this._authRecoveryGate=new ht}static getInstance(){return a._instance||(a._instance=new a),a._instance}setSecretStorage(e){this._secretStorage=e}setAuthRecoveryHandler(e){this._authRecoveryHandler=e}setTokenStateChangedHandler(e){this._tokenStateChangedHandler=e}async notifyTokenStateChanged(){if(this._tokenStateChangedHandler)try{await this._tokenStateChangedHandler()}catch{}}getDeviceId(){let e=Ge.workspaceFile?.fsPath||Ge.workspaceFolders?.map(n=>n.uri.fsPath).sort().join("|")||At.sessionId||"empty-window",t=Tt.createHash("sha256").update(e.toLowerCase()).digest("hex").slice(0,16);return`VSCode:${At.machineId||"Unknown"}:${t}`}tokenKey(e,t,n,i){let r=[e];return t&&r.push(t),n&&r.push(n),i&&r.push(i),r.join("|")}tokenLookupKeys(e,t,n,i){let r=[];return t&&(r.push(this.tokenKey(e,t,n,i)),n&&r.push(this.tokenKey(e,t,n)),r.push(this.tokenKey(e,t))),r.push(e),Array.from(new Set(r))}async persistTokens(){if(!this._secretStorage)return;let e=I.getInstance(),t=e.getWorkspaceSecretKey(Wt),n=e.getWorkspaceSecretKey(Pn);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,i,r){this._token=e,t&&(this._tokenMap[this.tokenKey(t,n,i,r)]=e),await this.persistTokens(),await this.notifyTokenStateChanged()}async loadToken(){if(this._token)return this._token;if(this._secretStorage){let e=I.getInstance();this._token=await this._secretStorage.get(e.getWorkspaceSecretKey(Wt))||"";try{let t=await this._secretStorage.get(e.getWorkspaceSecretKey(Pn));t&&(this._tokenMap=JSON.parse(t))}catch{}}return this._token}getTokenForServer(e,t,n,i){for(let r of this.tokenLookupKeys(e,t,n,i))if(this._tokenMap[r])return this._tokenMap[r];return""}async clearTokenForServer(e,t,n,i,r){let s=!1;for(let o of this.tokenLookupKeys(e,t,n,i))this._tokenMap[o]&&(!r||this._tokenMap[o]===r)&&(delete this._tokenMap[o],s=!0);this._token&&(!r||this._token===r)&&(this._token="",s=!0),s&&(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 i=e?.Msg||"";return e?.Code!==1&&/无效.*Token|Token.*无效|Token.*过期|登录.*过期|租户.*不一致|invalid\s*token|token\s*invalid/i.test(i)}serializeRequestBody(e,t){if(t==="form"){let n=new URLSearchParams;if(e&&typeof e=="object"&&!Array.isArray(e))for(let[i,r]of Object.entries(e))r!=null&&n.append(i,typeof r=="object"?JSON.stringify(r):String(r));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,i]of Object.entries(e))/^(pwd|password|authorization|token)$/i.test(n)?t[n]="***":i&&typeof i=="object"?t[n]=this.maskSensitiveBody(i):t[n]=i;return t}async refreshTokenForRequest(e,t,n){if(!t)return!1;let i=I.getInstance(),r=e.osClient||i.getOsClient()||"",s=new URL(n),c=s.pathname.replace(/\/+$/,"")+x.REFRESH_TOKEN,d=s.protocol==="https:",m=d?St:Ct,g=JSON.stringify({authorization:t,OsClient:r||void 0,_ClientType:"VSCode"}),l={hostname:s.hostname,port:s.port||(d?443:80),path:c,method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json",Authorization:`Bearer ${t}`,did:this.getDeviceId(),"Content-Length":Buffer.byteLength(g),...r?{OsClient:r}:{}},timeout:e.timeout||3e4,rejectUnauthorized:!1};return Y.log("API",`\u{1F504} RefreshToken ${n}${c}`),new Promise(u=>{let p=m.request(l,h=>{let f=[];h.on("data",y=>f.push(y)),h.on("end",async()=>{let y=Buffer.concat(f).toString("utf-8"),S;try{S=JSON.parse(y)}catch{}let T=h.headers,D=h.statusCode||0,_=T.authorization||"";if(S?.Code===1&&_){await this.setToken(_,e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork),Y.log("API","\u2705 Token \u5DF2\u4EE5\u65E7\u6362\u65B0"),u(!0);return}this.isInvalidRefreshToken(S,D)&&await this.clearTokenForServer(e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork,t),Y.log("API",`\u26A0\uFE0F RefreshToken \u5931\u8D25: ${S?.Msg||y.slice(0,120)}`),u(!1)})});p.on("error",h=>{Y.log("API",`\u274C RefreshToken Error: ${h.message}`),u(!1)}),p.on("timeout",()=>{p.destroy(),u(!1)}),p.write(g),p.end()})}async recoverAuthForRequest(e,t){if(!this._authRecoveryHandler)return!1;let n=I.getInstance(),i={apiBaseUrl:e.apiBaseUrl||t,osClient:e.osClient||n.getOsClient()||void 0,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork},r=this.tokenKey(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork);return this._authRecoveryGate.run(r,()=>this._authRecoveryHandler(i))}async request(e){let t=I.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 i=new URL(n),s=i.pathname.replace(/\/+$/,"")+e.path;if(e.params){let f=new URLSearchParams;for(let[S,T]of Object.entries(e.params))T!==void 0&&T!==""&&f.append(S,T);let y=f.toString();y&&(s+=`?${y}`)}let o=i.protocol==="https:",c=o?St:Ct,d=e.bodyFormat||"json",m=e.body!==void 0?this.serializeRequestBody(e.body,d):void 0,g={hostname:i.hostname,port:i.port||(o?443:80),path:s,method:e.method,headers:{"Content-Type":d==="form"?"application/x-www-form-urlencoded":"application/json",Accept:"application/json",did:this.getDeviceId()},timeout:e.timeout||3e4,rejectUnauthorized:!1};m!==void 0&&(g.headers["Content-Length"]=Buffer.byteLength(m));let l=e.allowAuthRetry!==!1,u=e.osClient||t.getOsClient()||"";u&&(g.headers.OsClient=u);let p=e.apiBaseUrl?this.getTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork):await this.loadToken();p&&(g.headers.Authorization=`Bearer ${p}`);let h=`${n}${s}`;if(e.silent||Y.log("API",`\u27A1\uFE0F ${e.method} ${h}`),e.body&&!e.silent){let f=JSON.stringify(this.maskSensitiveBody(e.body));Y.appendLine(` Body: ${f.length>500?f.substring(0,500)+"...(truncated)":f}`)}return new Promise((f,y)=>{let S=c.request(g,D=>{let _=[];D.on("data",w=>_.push(w)),D.on("end",async()=>{let w=Buffer.concat(_).toString("utf-8"),E=D.statusCode||0;if(!e.silent){Y.log("API",`\u2B05\uFE0F ${E} ${e.method} ${e.path}`);let U=w.length>500?w.substring(0,500)+"...(truncated)":w;Y.appendLine(` Response: ${U}`)}let V;try{V=JSON.parse(w)}catch{}if(V){let U={};for(let[R,$]of Object.entries(D.headers))typeof $=="string"&&(U[R.toLowerCase()]=$);V._headers=U;let A=U.authorization||"";if(A&&A!==p&&await this.setToken(A,e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork),l&&Ze(V))Y.log("API",`\u26A0\uFE0F \u79DF\u6237\u8FDE\u63A5\u914D\u7F6E\u65E0\u6548\uFF0C\u5DF2\u505C\u6B62 token \u5237\u65B0\u4E0E\u9759\u9ED8\u91CD\u767B: ${V.Msg||""}`);else if(l&&yt(V)&&(Y.log("API",`\u{1F510} \u8EAB\u4EFD\u5DF2\u8FC7\u671F\uFF0C\u5C1D\u8BD5\u4F7F\u7528\u65E7 token \u5237\u65B0\u540E\u91CD\u8BD5: ${V.Msg||""}`),await this.refreshTokenForRequest(e,p,n)||await this.recoverAuthForRequest(e,n))){try{f(await this.request({...e,allowAuthRetry:!1}))}catch(F){y(F)}return}f(V)}else if(E===401||E===403){if(l&&(await this.refreshTokenForRequest(e,p,n)||await this.recoverAuthForRequest(e,n))){try{f(await this.request({...e,allowAuthRetry:!1}))}catch(R){y(R)}return}y(new Error(`\u8EAB\u4EFD\u9A8C\u8BC1\u5931\u8D25 (HTTP ${E})\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55`))}else if(E>=400){let U=w.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim().substring(0,120);y(new Error(`\u670D\u52A1\u5668\u9519\u8BEF (HTTP ${E}): ${U||"\u672A\u77E5\u9519\u8BEF"}`))}else y(new Error(`\u54CD\u5E94\u89E3\u6790\u5931\u8D25 (HTTP ${E}): ${w.substring(0,200)}`))})}),T=!1;S.on("error",D=>{if(T)return;let _=Xe(D);e.silent||Y.log("API",`\u274C ${e.method} ${e.path} Error: ${_}`),y(new Error(`\u8BF7\u6C42\u5931\u8D25: ${_}`))}),S.on("timeout",()=>{T=!0,S.destroy(),e.silent||Y.log("API",`\u23F0 ${e.method} ${e.path} Timeout`),y(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),m!==void 0&&S.write(m),S.end()})}async get(e,t,n,i){return this.request({method:"GET",path:e,params:t,apiBaseUrl:n,osClient:i?.osClient,osClientType:i?.osClientType,osClientNetwork:i?.osClientNetwork})}async post(e,t,n,i,r,s,o){return this.request({method:"POST",path:e,body:t,params:n,apiBaseUrl:i,osClient:r?.osClient,osClientType:r?.osClientType,osClientNetwork:r?.osClientNetwork,timeout:s,silent:o})}async getRaw(e,t,n){let i=I.getInstance(),r=n||i.getApiBaseUrl();if(!r)throw new Error("\u672A\u914D\u7F6E API \u5730\u5740");let s=new URL(r),c=s.pathname.replace(/\/+$/,"")+e;if(t){let l=new URLSearchParams;for(let[p,h]of Object.entries(t))h!==void 0&&h!==""&&l.append(p,h);let u=l.toString();u&&(c+=`?${u}`)}let d=s.protocol==="https:",m=d?St:Ct,g={hostname:s.hostname,port:s.port||(d?443:80),path:c,method:"GET",timeout:15e3,rejectUnauthorized:!1};return new Promise((l,u)=>{let p=m.request(g,h=>{let f=[];h.on("data",y=>f.push(y)),h.on("end",()=>{let y=Buffer.concat(f),S=h.headers.captchaid||"";l({data:y,captchaId:S,statusCode:h.statusCode||0,contentType:String(h.headers["content-type"]||"")})})});p.on("error",h=>u(new Error(`\u8BF7\u6C42\u5931\u8D25: ${h.message}`))),p.on("timeout",()=>{p.destroy(),u(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),p.end()})}async postMultipartFile(e,t,n,i,r,s,o=30*60*1e3){let c=Ue.realpathSync(n),d=Ue.lstatSync(c);if(!d.isFile()||d.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(!i||/[\r\n"]/u.test(i))throw new Error("\u4E0A\u4F20\u6587\u4EF6\u540D\u4E0D\u5408\u6CD5");let m=String(r||"").replace(/\/+$/,""),g=new URL(m),l=`----microi-vscode-${Tt.randomBytes(24).toString("hex")}`,u=Object.entries(t).map(([w,E])=>Buffer.from(`--${l}\r
|
|
21
|
+
Content-Disposition: form-data; name="${w}"\r
|
|
22
|
+
\r
|
|
23
|
+
${E}\r
|
|
24
|
+
`,"utf8")),p=Buffer.from(`--${l}\r
|
|
25
|
+
Content-Disposition: form-data; name="file"; filename="${i}"\r
|
|
26
|
+
Content-Type: application/octet-stream\r
|
|
27
|
+
\r
|
|
28
|
+
`,"utf8"),h=Buffer.concat([...u,p]),f=Buffer.from(`\r
|
|
29
|
+
--${l}--\r
|
|
30
|
+
`,"utf8"),y=s?this.getTokenForServer(m,s.osClient,s.osClientType,s.osClientNetwork):await this.loadToken(),S=g.protocol==="https:",T=S?St:Ct,D=g.pathname.replace(/\/+$/,""),_={hostname:g.hostname,port:g.port||(S?443:80),path:D+e,method:"POST",timeout:o,rejectUnauthorized:!1,headers:{Accept:"application/json",...y?{Authorization:`Bearer ${y}`}:{},did:this.getDeviceId(),...s?.osClient?{OsClient:s.osClient}:{},"Content-Type":`multipart/form-data; boundary=${l}`,"Content-Length":h.length+d.size+f.length}};return new Promise((w,E)=>{let V=!1,U=$=>{V||(V=!0,E($))},A=T.request(_,$=>{let F=[];$.on("data",b=>F.push(b)),$.on("end",async()=>{if(V)return;let b=Buffer.concat(F).toString("utf8"),O;try{O=JSON.parse(b)}catch{U(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u54CD\u5E94\u4E0D\u662F JSON\uFF08HTTP ${$.statusCode||0}\uFF09`));return}let j=String($.headers.authorization||"");j&&await this.setToken(j,m,s?.osClient,s?.osClientType,s?.osClientNetwork),V=!0,w(O)})});A.on("error",$=>U(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u5931\u8D25\uFF1A${Xe($)}`))),A.on("timeout",()=>{A.destroy(),U(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u8D85\u65F6\uFF08${o}ms\uFF09`))}),A.write(h);let R=Ue.createReadStream(c);R.on("error",$=>{A.destroy(),U(new Error(`\u8BFB\u53D6\u672C\u5730\u53D1\u5E03\u8D44\u4EA7\u5931\u8D25\uFF1A${Xe($)}`))}),R.on("end",()=>A.end(f)),R.pipe(A,{end:!1})})}};var je=G(require("crypto")),B=G(require("fs")),et=G(require("path"));var di=60*60*1e3,gi=5*60,Nn=24*60*60,ui=2*60*1e3,mi=60*1e3;function pi(a,e){let t=(e||"").trim();return t?je.publicEncrypt({key:t,padding:je.constants.RSA_PKCS1_PADDING},Buffer.from(a,"utf-8")).toString("base64"):a}var ge=class a{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}static getInstance(){return a._instance||(a._instance=new a),a._instance}setSecretStorage(e){this._secretStorage=e,L.getInstance().setTokenStateChangedHandler(async()=>{await this.writeMcpTokenFile()}),L.getInstance().setAuthRecoveryHandler(async t=>{let n=I.getInstance(),i=this.normalizeApiBaseUrl(t.apiBaseUrl),r=this.normalizeOsClient(t.osClient),s=this.normalizeIdentityPart(t.osClientType),o=this.normalizeIdentityPart(t.osClientNetwork),c=n.getProfiles().filter(g=>this.normalizeApiBaseUrl(g.apiBaseUrl)===i&&this.normalizeOsClient(g.osClient)===r),d=c.find(g=>this.normalizeIdentityPart(g.osClientType)===s&&this.normalizeIdentityPart(g.osClientNetwork)===o);if(!d&&!s&&!o&&c.length===1&&(d=c[0]),!d&&c.length===0&&(d={label:t.osClient||t.apiBaseUrl,apiBaseUrl:t.apiBaseUrl,osClient:t.osClient||"",osClientType:t.osClientType,osClientNetwork:t.osClientNetwork}),!d)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 m=await this.reLoginForProfile(d);return m&&(this._isLoggedIn=!0,await Ne.executeCommand("setContext",xe,!0)),await this.writeMcpTokenFile(),m})}setMcpTokenFilePath(e){this._mcpTokenFilePath=e,this._mcpAuthRecoveryDirPath=e?`${e}.recovery`:""}get mcpTokenFilePath(){return this._mcpTokenFilePath}get mcpAuthRecoveryDirPath(){return this._mcpAuthRecoveryDirPath}async loadMcpTokenFile(){if(!this._mcpTokenFilePath||!B.existsSync(this._mcpTokenFilePath))return 0;let e;try{let i=JSON.parse(B.readFileSync(this._mcpTokenFilePath,"utf-8"));if(!i||typeof i!="object"||Array.isArray(i))return 0;e=i}catch{return 0}let t=L.getInstance(),n=0;for(let i of I.getInstance().getProfiles()){if(t.getTokenForServer(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork))continue;let r=this.normalizeApiBaseUrl(i.apiBaseUrl),s=this.normalizeOsClient(i.osClient),c=[this.mcpRecoveryIdentity(r,s,i.osClientType,i.osClientNetwork),this.mcpRecoveryIdentity(r,s,i.osClientType),s?`${r}|${s}`:r].map(d=>e[d]).find(d=>typeof d=="string"&&d.trim());c&&(await t.setToken(c,i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork),n+=1)}return n}get isLoggedIn(){return this._isLoggedIn}secretKey(e){return I.getInstance().getWorkspaceSecretKey(e)}normalizeApiBaseUrl(e){return(e||"").trim().replace(/\/+$/,"")}normalizeOsClient(e){return(e||"").trim()}normalizeIdentityPart(e){return(e||"").trim()}mcpRecoveryIdentity(e,t,n,i){return[this.normalizeApiBaseUrl(e),this.normalizeOsClient(t),this.normalizeIdentityPart(n),this.normalizeIdentityPart(i)].join("|")}serverSecretKey(e,t,n){return this.secretKey(`${e}.${this.normalizeApiBaseUrl(t)}|${this.normalizeOsClient(n)}`)}legacyServerSecretKey(e,t){return this.secretKey(`${e}.${this.normalizeApiBaseUrl(t)}`)}canUseLegacyCredential(e,t){let n=this.normalizeApiBaseUrl(e),i=this.normalizeOsClient(t);if(!n)return!1;let r=I.getInstance().getProfiles().filter(o=>this.normalizeApiBaseUrl(o.apiBaseUrl)===n);if(r.length===0)return!i;if(r.length===1)return!0;let s=r.filter(o=>this.normalizeOsClient(o.osClient)===i);return!!i&&s.length===r.length}async writeMcpTokenFile(){if(!this._mcpTokenFilePath)return;let e=L.getInstance(),n=I.getInstance().getProfiles(),i={},r=new Set;for(let l of n){let u=this.normalizeApiBaseUrl(l.apiBaseUrl),p=this.normalizeOsClient(l.osClient),h=this.mcpRecoveryIdentity(u,p,l.osClientType,l.osClientNetwork);r.add(h);let f=n.filter(T=>this.normalizeApiBaseUrl(T.apiBaseUrl)===u&&this.normalizeOsClient(T.osClient)===p),y=p?`${u}|${p}`:u;f.length===1&&r.add(y);let S=e.getTokenForServer(l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork);S&&(i[h]=S,f.length===1&&(i[y]=S))}let s=this._mcpTokenFilePath,o=et.dirname(s);B.existsSync(o)||B.mkdirSync(o,{recursive:!0});let c=`${s}.lock`,d=Date.now()+3e3,m;for(;m===void 0;)try{m=B.openSync(c,"wx",384),B.writeFileSync(m,JSON.stringify({pid:process.pid,createdAt:Date.now()}),"utf-8")}catch(l){if(l.code!=="EEXIST")throw l;try{Date.now()-B.statSync(c).mtimeMs>3e4&&B.unlinkSync(c)}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(u=>setTimeout(u,40))}let g=`${s}.${process.pid}.${Date.now()}.tmp`;try{let l={};if(B.existsSync(s)){let p=JSON.parse(B.readFileSync(s,"utf-8"));if(!p||typeof p!="object"||Array.isArray(p))throw new Error(`Microi MCP Token \u6587\u4EF6\u5FC5\u987B\u662F JSON \u5BF9\u8C61\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1A${s}`);l=Object.fromEntries(Object.entries(p).filter(h=>typeof h[1]=="string"&&!!h[1]))}for(let p of r)delete l[p];let u={...l,...i};B.writeFileSync(g,`${JSON.stringify(u,null,2)}
|
|
31
|
+
`,{encoding:"utf-8",mode:384}),B.renameSync(g,s)}finally{try{B.existsSync(g)&&B.unlinkSync(g)}catch{}try{B.closeSync(m)}catch{}try{B.unlinkSync(c)}catch{}}}tokenFingerprint(e){return je.createHash("sha256").update(String(e||"")).digest("hex")}deleteMcpAuthRecoveryRequests(e,t){let n=this._mcpAuthRecoveryDirPath;if(!n||!B.existsSync(n))return;let i=[];try{i=B.readdirSync(n).filter(r=>r.endsWith(".json")).slice(0,200)}catch{return}for(let r of i){let s=et.join(n,r);try{let o=JSON.parse(B.readFileSync(s,"utf-8")),c=this.normalizeApiBaseUrl(String(o.apiBaseUrl||"")),d=this.normalizeOsClient(String(o.osClient||"")),m=this.normalizeIdentityPart(String(o.osClientType||"")),g=this.normalizeIdentityPart(String(o.osClientNetwork||"")),l=this.mcpRecoveryIdentity(c,d,m,g);if(!m&&!g){let u=t.filter(p=>this.normalizeApiBaseUrl(p.apiBaseUrl)===c&&this.normalizeOsClient(p.osClient)===d);u.length===1&&(l=this.mcpRecoveryIdentity(u[0].apiBaseUrl,u[0].osClient,u[0].osClientType,u[0].osClientNetwork))}l===e&&B.unlinkSync(s)}catch{}}}async processMcpAuthRecoveryRequests(){let e=this._mcpAuthRecoveryDirPath;if(!(!e||!B.existsSync(e)||this._mcpAuthRecoveryPassInProgress)){this._mcpAuthRecoveryPassInProgress=!0;try{let t=[];try{t=B.readdirSync(e).filter(s=>s.endsWith(".json")).slice(0,100)}catch{return}let i=I.getInstance().getProfiles(),r=L.getInstance();for(let s of t){let o=et.join(e,s),c={};try{c=JSON.parse(B.readFileSync(o,"utf-8"))}catch{try{B.unlinkSync(o)}catch{}continue}let d=Number(c.requestedAt||0),m=this.normalizeApiBaseUrl(String(c.apiBaseUrl||"")),g=this.normalizeOsClient(String(c.osClient||"")),l=this.normalizeIdentityPart(String(c.osClientType||"")),u=this.normalizeIdentityPart(String(c.osClientNetwork||"")),p=String(c.failedTokenHash||"").trim().toLowerCase();if(Number(c.version)!==1||!m||!d||Math.abs(Date.now()-d)>ui||!_n(p)){try{B.unlinkSync(o)}catch{}continue}let h=i.filter(S=>this.normalizeApiBaseUrl(S.apiBaseUrl)===m&&this.normalizeOsClient(S.osClient)===g),f=l||u?h.find(S=>this.normalizeIdentityPart(S.osClientType)===l&&this.normalizeIdentityPart(S.osClientNetwork)===u):h.length===1?h[0]:void 0;if(!f){try{B.unlinkSync(o)}catch{}continue}let y=this.mcpRecoveryIdentity(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork);if(!this._mcpAuthRecoveryInProgress.has(y)){if((this._mcpAuthRecoveryFailureUntil.get(y)||0)>Date.now()){this.deleteMcpAuthRecoveryRequests(y,i);continue}this._mcpAuthRecoveryInProgress.add(y);try{let S=r.getTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork);S&&this.tokenFingerprint(S)!==p?(this._mcpAuthRecoveryFailureUntil.delete(y),await this.writeMcpTokenFile()):(S&&await r.clearTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork,S),await this.reLoginForProfile(f)?this._mcpAuthRecoveryFailureUntil.delete(y):(this._mcpAuthRecoveryFailureUntil.set(y,Date.now()+mi),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(y),this.deleteMcpAuthRecoveryRequests(y,i)}}}}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=L.getInstance(),n=I.getInstance().getProfiles(),i=!1,r=await e.loadToken(),s=await this.loadMcpTokenFile();i=!!r||s>0||e.hasToken;let o=n.filter(g=>!e.getTokenForServer(g.apiBaseUrl,g.osClient,g.osClientType,g.osClientNetwork)),c=0,d=async()=>{for(;c<o.length;){let g=o[c++];await this.reLoginForProfile(g)&&(i=!0)}},m=Math.min(4,o.length);return await Promise.all(Array.from({length:m},()=>d())),i&&(this._isLoggedIn=!0,await Ne.executeCommand("setContext",xe,!0),await this.writeMcpTokenFile()),i}async getSysConfig(e,t,n,i=!1){let r=L.getInstance(),s=I.getInstance();try{let o=await r.request({method:"POST",path:x.GET_SYS_CONFIG,body:{_SearchEqual:{IsEnable:1},OsClient:t||s.getOsClient()||void 0},apiBaseUrl:e,osClient:t,allowAuthRetry:!1,silent:i});if(o.Code===1&&o.Data)return o.Data;n&&(n.message=o.Code!==1?`\u670D\u52A1\u5668\u8FD4\u56DE\u9519\u8BEF (Code: ${o.Code})${o.Msg?"\uFF1A"+o.Msg:""}\uFF0C\u8BF7\u68C0\u67E5 OsClient \u662F\u5426\u6B63\u786E`:"\u670D\u52A1\u5668\u672A\u8FD4\u56DE\u914D\u7F6E\u6570\u636E")}catch(o){n&&(n.message=o instanceof Error?o.message:String(o))}return null}async getCaptcha(e,t){let n=L.getInstance(),i=I.getInstance();try{let r=await n.getRaw(x.GET_CAPTCHA,{OsClient:t||i.getOsClient()||""},e);if(r.data&&r.captchaId){let s=r.data.toString("base64");return{captchaId:r.captchaId,imageBase64:`data:image/png;base64,${s}`}}}catch{}return null}async login(e,t,n={}){let i=L.getInstance(),r=I.getInstance(),s=n.osClient||r.getOsClient(),o=n.silent??!1;try{let c=await this.getSysConfig(n.apiBaseUrl,s,void 0,o),d=c?.EnableCaptcha;if((d===!0||d===1||String(d||"").trim().toLowerCase()==="true")&&(!n.captchaId||!n.captchaValue)){let y="\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 o||P.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${y}`),{ok:!1,msg:y}}let g=typeof c?.LoginRsaPublicKey=="string"&&c.LoginRsaPublicKey.trim()?c.LoginRsaPublicKey:fn,l=pi(t,g),u={Account:e,Pwd:l,OsClient:s||void 0,_ClientType:"VSCode"};n.captchaId&&n.captchaValue&&(u._CaptchaId=n.captchaId,u._CaptchaValue=n.captchaValue);let p=await i.request({method:"POST",path:x.LOGIN,body:u,bodyFormat:"form",apiBaseUrl:n.apiBaseUrl,osClient:n.osClient,osClientType:n.osClientType,osClientNetwork:n.osClientNetwork,allowAuthRetry:!1,silent:o}),f=p._headers?.authorization||"";if(p.Code===1)return f&&await i.setToken(f,n.apiBaseUrl,n.osClient,n.osClientType,n.osClientNetwork),this._secretStorage&&(n.apiBaseUrl?(await this._secretStorage.store(this.serverSecretKey(ye,n.apiBaseUrl,s),e),await this._secretStorage.store(this.serverSecretKey(Se,n.apiBaseUrl,s),t)):(await this._secretStorage.store(this.secretKey(ye),e),await this._secretStorage.store(this.secretKey(Se),t))),p.Data?.OsClient&&!s&&await r.updateSettings({osClient:p.Data.OsClient}),this._isLoggedIn=!0,await Ne.executeCommand("setContext",xe,!0),await this.writeMcpTokenFile(),o||P.info(`Microi: \u767B\u5F55\u6210\u529F\uFF0C\u6B22\u8FCE ${p.Data?.Name||p.Data?.Account||e}`),{ok:!0,msg:""};{let y=p.Msg||"\u8BF7\u68C0\u67E5\u8D26\u53F7\u5BC6\u7801";return o||P.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${y}`),{ok:!1,msg:y}}}catch(c){let d=c instanceof Error?c.message:String(c);return o||P.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${d}`),{ok:!1,msg:d}}}async refreshAllTokens(){if(this._refreshInProgress)return;this._refreshInProgress=!0;let e=L.getInstance(),n=I.getInstance().getProfiles();try{for(let i of n){let r=e.getTokenForServer(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork);if(!r){await this.reLoginForProfile(i);continue}try{let l=await e.request({method:"GET",path:x.GET_STATUS,apiBaseUrl:i.apiBaseUrl,osClient:i.osClient,osClientType:i.osClientType,osClientNetwork:i.osClientNetwork,allowAuthRetry:!1,silent:!0});if(Ze(l))continue;if(yt(l)){await e.clearTokenForServer(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork,r),await this.reLoginForProfile(i)||this.showAuthExpiredWarning(l.Msg||"\u5F53\u524D\u767B\u5F55\u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002");continue}}catch{}let s=this.readJwtClientClaims(r),o=String(s?.ClientType||"").trim(),c=o.toLowerCase()!=="vscode",d=!o||o.toLowerCase()==="empty";if(c&&(await this.reLoginForProfile(i)||!d))continue;let m=String(s?.Did||"").trim(),g=o.toLowerCase()==="vscode"&&m!==e.getDeviceId();if(!(!c&&!g&&!this.shouldRefreshToken(r,s)))try{let l=await e.request({method:"POST",path:x.REFRESH_TOKEN,body:{authorization:r,OsClient:i.osClient,_ClientType:"VSCode"},apiBaseUrl:i.apiBaseUrl,osClient:i.osClient,osClientType:i.osClientType,osClientNetwork:i.osClientNetwork,allowAuthRetry:!1,silent:!0}),p=l._headers?.authorization||"";l.Code===1&&p?await e.setToken(p,i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork):(await e.clearTokenForServer(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork,r),await this.reLoginForProfile(i)||this.showAuthExpiredWarning(l.Msg||"\u5F53\u524D\u767B\u5F55\u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002"))}catch{await this.reLoginForProfile(i)}}}finally{this._isLoggedIn=e.hasToken,await Ne.executeCommand("setContext",xe,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,P.warn(`Microi: ${t}`))}readJwtClientClaims(e){try{let n=e.replace(/^Bearer\s+/i,"").trim().split(".");if(n.length<2)return null;let i=n[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(i,"base64").toString("utf-8"))}catch{return null}}shouldRefreshToken(e,t){let n=t??this.readJwtClientClaims(e),i=Number(n?.exp);if(!Number.isFinite(i)||i<=0)return!0;let r=Number(n?.MicroiTokenIssuedAt??n?.iat),s=Number.isFinite(r)&&r>0&&i>r?i-r:Nn,o=Math.min(Nn,Math.max(gi,Math.floor(s/10)));return i-Math.floor(Date.now()/1e3)<=o}async getCredentialsForProfile(e,t){if(!this._secretStorage)return null;let n=this.normalizeApiBaseUrl(e),i=this.normalizeOsClient(t),r=n?await this._secretStorage.get(this.serverSecretKey(ye,n,i)):void 0,s=n?await this._secretStorage.get(this.serverSecretKey(Se,n,i)):void 0;return(!r||!s)&&n&&this.canUseLegacyCredential(n,i)&&(r=r||await this._secretStorage.get(this.legacyServerSecretKey(ye,n)),s=s||await this._secretStorage.get(this.legacyServerSecretKey(Se,n))),(!r||!s)&&!n&&!i&&(r=r||await this._secretStorage.get(this.secretKey(ye)),s=s||await this._secretStorage.get(this.secretKey(Se))),!r||!s?null:{username:r,password:s}}async reLoginForProfile(e){if(!this._secretStorage)return!1;let t=await this.getCredentialsForProfile(e.apiBaseUrl,e.osClient);return t?(await this.login(t.username,t.password,{silent:!0,apiBaseUrl:e.apiBaseUrl,osClient:e.osClient,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork})).ok:!1}startTokenRefresh(){this.stopTokenRefresh(),this.startMcpAuthRecoveryWatcher(),this.refreshAllTokens(),this._refreshTimer=setInterval(()=>{this.refreshAllTokens()},di),this._windowStateSubscription=oe.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 logout(){if(this.stopTokenRefresh(),await L.getInstance().clearToken(),this._secretStorage){await this._secretStorage.delete(this.secretKey(ye)),await this._secretStorage.delete(this.secretKey(Se));let t=I.getInstance().getProfiles();for(let n of t)await this._secretStorage.delete(this.serverSecretKey(ye,n.apiBaseUrl,n.osClient)),await this._secretStorage.delete(this.serverSecretKey(Se,n.apiBaseUrl,n.osClient)),await this._secretStorage.delete(this.legacyServerSecretKey(ye,n.apiBaseUrl)),await this._secretStorage.delete(this.legacyServerSecretKey(Se,n.apiBaseUrl))}this._isLoggedIn=!1,await Ne.executeCommand("setContext",xe,!1),P.info("Microi: \u5DF2\u9000\u51FA\u767B\u5F55")}};var fi=/^\s*\*?\s*Version\s*:\s*(v\d+\.\d+\.\d+)\s*$/im,Mn=/^v(\d+)\.(\d+)\.(\d+)$/;function vt(a){let e=(a||"").trim();if(!e)return null;let t=e.match(Mn);if(t)return`v${Number(t[1])}.${Number(t[2])}.${Number(t[3])}`;let n=e.match(fi);return n?vt(n[1]):null}function Fn(a){if(!a)return null;let e=a.match(Mn);return e?{major:Number(e[1]),minor:Number(e[2]),patch:Number(e[3])}:null}function hi(a,e){return a.major!==e.major?a.major-e.major:a.minor!==e.minor?a.minor-e.minor:a.patch-e.patch}function yi(a){let e=null;for(let t of a){let n=Fn(t);n&&(!e||hi(n,e)>0)&&(e=n)}return e?`v${e.major}.${e.minor}.${e.patch}`:null}function Si(a){let e=Fn(a);if(!e)return"v1.0.0";let{major:t,minor:n,patch:i}=e;return i<9?`v${t}.${n}.${i+1}`:(i=0,n<9?`v${t}.${n+1}.${i}`:(n=0,t+=1,`v${t}.${n}.${i}`))}function Ci(a){let e=(a||"").trim();return e?e.replace(/\r\n/g,`
|
|
32
|
+
`).split(`
|
|
33
|
+
`).map(t=>t.trim()).filter(Boolean):["\u8BF7\u8865\u5145\u8BE5 V8 \u4EE3\u7801\u7684\u5B8C\u6574\u529F\u80FD\u8BF4\u660E\u3002"]}function Ti(a){let e=a.replace(/\r\n/g,`
|
|
34
|
+
`).split(`
|
|
35
|
+
`),t=[],n=!1;for(let i of e){let r=i.replace(/^\s*\/\*+\s?/,"").replace(/^\s*\*\/?\s?/,"").trim();if(/^(Function|功能说明)\s*[::]/i.test(r)){n=!0;let s=r.replace(/^(Function|功能说明)\s*[::]\s*/i,"").trim();s&&t.push(s.replace(/^[-*]\s*/,""));continue}if(/^(ChangeLog|修改记录|LastModified|Version|ApiEngineKey|TableKey|WorkflowKey|EventType)\s*[::]/i.test(r)){if(n)break;continue}n&&r&&r!=="*/"&&t.push(r.replace(/^[-*]\s*/,""))}return t.length?t.join(`
|
|
36
|
+
`):void 0}function vi(a){let e=a.replace(/^\uFEFF/,""),t=e.match(/^\s*\/\*[\s\S]*?\*\/\s*/);if(!t)return{body:e};let n=t[0];return/Microi\s+V8|Version\s*:|ChangeLog\s*:|ApiEngineKey\s*:|TableKey\s*:|WorkflowKey\s*:/i.test(n)?{header:n,body:e.slice(n.length)}:{body:e}}function wi(a,e,t){let n=a.functionDescription||Ti(t||""),i=Ci(n),r=a.kind==="ApiEngine"?"V8 ApiEngine":a.kind==="V8Event"?"V8 Event":"V8 Workflow",s=a.kind==="ApiEngine"?"ApiEngineKey":a.kind==="V8Event"?"TableKey":"WorkflowKey",o=["/*",` * ${r}`,` * ${s}: ${a.key}`];a.eventType&&o.push(` * EventType: ${a.eventType}`),o.push(` * Version: ${e}`),o.push(" * Function:");for(let c of i)o.push(` * - ${c}`);return o.push(" */"),`${o.join(`
|
|
37
|
+
`)}
|
|
38
|
+
|
|
39
|
+
`}function tt(a){let e=vt(a.currentCode),t=vt(a.remoteCode),n=vt(a.remoteVersion),i=yi([e,t,n]),r=a.initial?i||"v1.0.0":Si(i),{header:s,body:o}=vi(a.currentCode||""),c=`${wi(a,r,s)}${o.replace(/^\s+/,"")}`,d=(a.changeSummary||"\u540C\u6B65 V8 \u4EE3\u7801").trim();return{code:c,version:r,changeHistory:`${r} ${d}`}}var He=class a{static getInstance(){return a._instance||(a._instance=new a),a._instance}constructor(){}get outputChannel(){return Y.channel}log(e){Y.log("\u540C\u6B65",e)}loadMeta(e){let t=I.getInstance(),n="";try{n=t.getSyncRootDir()}catch{}if(!n)return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};let i=v.join(n,e,Ae);if(!C.existsSync(i))return this.migrateFromFlatMeta(e);try{let r=JSON.parse(C.readFileSync(i,"utf-8"));if(!r||typeof r!="object"||Array.isArray(r))throw new Error("\u9876\u5C42\u5FC5\u987B\u662F JSON \u5BF9\u8C61");let s=r;return{...s,engines:s.engines||{},events:s.events||{},fields:s.fields||{},menus:s.menus||{},menuButtons:s.menuButtons||{},menuScripts:s.menuScripts||{},workflows:s.workflows||{},workflowNodeEvents:s.workflowNodeEvents||{}}}catch(r){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${i}\uFF08${r instanceof Error?r.message:String(r)}\uFF09`)}}saveMeta(e,t){let n=I.getInstance();try{let i=n.getSyncRootDir();this.ensureSyncGitExcludes(i);let r=v.join(i,t);te(r);let s=v.join(r,Ae),o=`${s}.${process.pid}.${Date.now()}.tmp`;try{C.writeFileSync(o,`${JSON.stringify(e,null,2)}
|
|
40
|
+
`,"utf-8"),C.renameSync(o,s)}finally{try{C.existsSync(o)&&C.unlinkSync(o)}catch{}}}catch{}}getWorkspaceFilePath(e){let t=I.getInstance().getWorkspaceRoot();return t?v.isAbsolute(e)?e:v.join(t,e):null}normalizeCode(e){return Ce(zt(e||"")).replace(/\r\n/g,`
|
|
41
|
+
`).trimEnd()}isLocalModified(e,t){try{if(!C.existsSync(e))return!1;let n=C.statSync(e),i=new Date(t);return isNaN(i.getTime())?!1:n.mtime.getTime()>i.getTime()+1e3}catch{return!1}}getLocalModifiedTime(e,t){try{if(!C.existsSync(e))return null;let n=C.statSync(e),i=new Date(t);return isNaN(i.getTime())?null:n.mtime.getTime()>i.getTime()+1e3?me(n.mtime):null}catch{return null}}touchSyncedFile(e,t){let n=new Date(t),i=isNaN(n.getTime())?new Date:n;try{C.utimesSync(e,i,i)}catch{}}ensureSyncGitExcludes(e){try{let t=e||I.getInstance().getSyncRootDir();Be(t),ve(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,i){return`${e}__${t}__${n}__${i}`}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=I.getInstance().getSyncRootDir();return C.existsSync(e)?C.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,i,r,s,o)=>{let c=this.getWorkspaceFilePath(o.filePath);if(!c)return;let d=this.getLocalModifiedTime(c,o.updateTime);d&&e.push({kind:i,key:r,name:s,serverDir:n,filePath:c,updateTime:o.updateTime,modifiedTime:d})};for(let n of this.getServerDirs()){let i=this.loadMeta(n);for(let[r,s]of Object.entries(i.engines))t(n,"engine",r,s.apiName||r,s);for(let[r,s]of Object.entries(i.events))t(n,"event",r,`${s.description||s.formEngineKey}/${s.eventType}`,s);for(let[r,s]of Object.entries(i.fields||{}))t(n,"field",r,`${s.tableName}.${s.fieldName}/${s.v8Key}`,s);for(let[r,s]of Object.entries(i.menuButtons||{}))t(n,"menuButton",r,`${s.moduleName}/${s.btnName}/${s.v8SubField}`,s);for(let[r,s]of Object.entries(i.menuScripts||{}))t(n,"menuScript",r,`${s.moduleName}/${s.scriptField}`,s);for(let[r,s]of Object.entries(i.workflowNodeEvents||{}))t(n,"workflow",r,`${s.flowName}/${s.nodeName}/${s.eventType}`,s)}return e}async checkRemoteDifferences(e,t="all",n){let i=e?[e]:I.getInstance().getProfiles(),r=[];for(let s of i){let o=I.getInstance().buildServerDirName(s.label,s.apiBaseUrl),c=this.loadMeta(o),d=n?this.getTargetSyncKind(c,n):null;if(n&&!d)throw new Error(`\u540C\u6B65\u76EE\u6807\u4E0D\u5728\u672C\u5730\u57FA\u7EBF\u4E2D: ${n}`);(t==="all"||t==="api")&&(!n||d==="engine")&&await this.collectEngineDifferences(s,o,c,r,n),(t==="all"||t==="form")&&(!n||d==="event")&&await this.collectEventDifferences(s,o,c,r,n),(t==="all"||t==="form")&&(!n||d==="field")&&await this.collectFieldDifferences(s,o,c,r,n),(t==="all"||t==="module")&&(!n||d==="menuButton")&&await this.collectMenuButtonDifferences(s,o,c,r,n),(t==="all"||t==="module")&&(!n||d==="menuScript")&&await this.collectMenuScriptDifferences(s,o,c,r,n),(t==="all"||t==="workflow")&&(!n||d==="workflow")&&await this.collectWorkflowDifferences(s,o,c,r,n)}return r}matchesTargetFile(e,t){if(!t)return!0;let n=this.getWorkspaceFilePath(e);return!!n&&v.resolve(n).toLowerCase()===v.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[i,r]of n)if(Object.values(r).some(s=>this.matchesTargetFile(s.filePath,t)))return i;return null}classifyDifference(e,t,n,i){return n===i?null:e&&t?"conflict":e?"localModified":"remoteModified"}classifyRemoteDeletion(e,t){return this.isLocalModified(e,t)?"conflict":"remoteDeleted"}createRemoteDeletedItem(e,t,n,i,r,s){return!r||!C.existsSync(r)?null:{kind:e,status:this.classifyRemoteDeletion(r,s),name:t,key:n,serverDir:i,filePath:r,localCode:this.normalizeCode(C.readFileSync(r,"utf-8")),remoteCode:"",localUpdateTime:s,remoteUpdateTime:""}}isRemoteNewer(e,t){let n=new Date(e||"").getTime(),i=new Date(t||"").getTime();return isNaN(n)||isNaN(i)?!1:n>i+1e3}getRemoteOnlyPlaceholderPath(e,t,n,i){let r=I.getInstance(),s=n==="api"?Ve:n==="form"?Te:n==="module"?De:$e;return v.join(r.getSyncRootDir(),t,r.buildOsClientDirName(e.osClient,e.osClientType,e.osClientNetwork),s,"\u670D\u52A1\u5668\u65B0\u589E\u5F85\u62C9\u53D6",`${H(i)}.js`)}async collectEngineDifferences(e,t,n,i,r){let o=await L.getInstance().get(x.GET_ENGINE_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(o.Code!==1||!Array.isArray(o.Data?.List))throw new Error(`\u83B7\u53D6\u63A5\u53E3\u5F15\u64CE\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${o.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map(o.Data.List.map(g=>[g.ApiEngineKey,g])),d=!1;for(let[g,l]of Object.entries(n.engines)){if(!this.matchesTargetFile(l.filePath,r))continue;let u=c.get(g),p=this.getWorkspaceFilePath(l.filePath);if(!p||!C.existsSync(p))continue;if(!u){let D=this.createRemoteDeletedItem("engine",l.apiName||g,g,t,p,l.updateTime);D&&i.push(D);continue}let h=this.normalizeCode(C.readFileSync(p,"utf-8")),f=this.normalizeCode(u.ApiV8Code||""),y=this.isLocalModified(p,l.updateTime),S=this.isRemoteNewer(u.UpdateTime,l.updateTime);if(h===f){(y||S)&&u.UpdateTime&&(l.updateTime=u.UpdateTime,this.touchSyncedFile(p,u.UpdateTime),d=!0);continue}let T=this.classifyDifference(y,S,h,f);T&&i.push({kind:"engine",status:T,name:u.ApiName||l.apiName||g,key:g,serverDir:t,filePath:p,localCode:h,remoteCode:f,localUpdateTime:l.updateTime,remoteUpdateTime:u.UpdateTime})}if(d&&this.saveMeta(n,t),r)return;let m=new Set(Object.keys(n.engines).map(g=>g.toLowerCase()));for(let g of o.Data.List)!String(g.ApiV8Code||"").trim()||m.has(g.ApiEngineKey.toLowerCase())||i.push({kind:"engine",status:"remoteModified",name:g.ApiName||g.ApiEngineKey,key:g.ApiEngineKey,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"api",g.ApiEngineKey),localCode:"",remoteCode:this.normalizeCode(g.ApiV8Code||""),localUpdateTime:"",remoteUpdateTime:g.UpdateTime})}async collectEventDifferences(e,t,n,i,r){let o=await L.getInstance().get(x.GET_EVENT_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(o.Code!==1||!Array.isArray(o.Data?.List))throw new Error(`\u83B7\u53D6\u8868\u5355\u4E8B\u4EF6\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${o.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map;for(let g of o.Data.List){let l=`${g.FormEngineKey}__${g.EventType}`;c.set(l,g),c.set(l.toLowerCase(),g)}let d=!1;for(let[g,l]of Object.entries(n.events)){if(!this.matchesTargetFile(l.filePath,r))continue;let u=c.get(g)||c.get(g.toLowerCase()),p=this.getWorkspaceFilePath(l.filePath);if(!p||!C.existsSync(p))continue;if(!u){let D=this.createRemoteDeletedItem("event",`${l.description||l.formEngineKey}/${l.eventType}`,g,t,p,l.updateTime);D&&i.push(D);continue}let h=this.normalizeCode(C.readFileSync(p,"utf-8")),f=this.normalizeCode(u.V8Code||""),y=this.isLocalModified(p,l.updateTime),S=this.isRemoteNewer(u.UpdateTime,l.updateTime);if(h===f){(y||S)&&u.UpdateTime&&(l.updateTime=u.UpdateTime,this.touchSyncedFile(p,u.UpdateTime),d=!0);continue}let T=this.classifyDifference(y,S,h,f);T&&i.push({kind:"event",status:T,name:`${u.Description||l.formEngineKey}/${l.eventType}`,key:g,serverDir:t,filePath:p,localCode:h,remoteCode:f,localUpdateTime:l.updateTime,remoteUpdateTime:u.UpdateTime})}if(d&&this.saveMeta(n,t),r)return;let m=new Set(Object.keys(n.events).map(g=>g.toLowerCase()));for(let g of o.Data.List){let l=`${g.FormEngineKey}__${g.EventType}`;!String(g.V8Code||"").trim()||m.has(l.toLowerCase())||i.push({kind:"event",status:"remoteModified",name:`${g.Description||g.FormEngineKey}/${g.EventType}`,key:l,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"form",l),localCode:"",remoteCode:this.normalizeCode(g.V8Code||""),localUpdateTime:"",remoteUpdateTime:g.UpdateTime})}}async collectFieldDifferences(e,t,n,i,r){let s=L.getInstance(),o=new Map;for(let d of Object.entries(n.fields||{})){if(!this.matchesTargetFile(d[1].filePath,r))continue;let m=o.get(d[1].tableId||d[1].tableName)||[];m.push(d),o.set(d[1].tableId||d[1].tableName,m)}let c=!1;await this.runInBatches([...o.values()],r?1:2,async d=>{let m=d[0][1],g=await s.get(x.GET_FIELD_LIST,{osClient:e.osClient,tableId:m.tableId,tableName:m.tableName},e.apiBaseUrl,e);if(g.Code!==1||!Array.isArray(g.Data?.List))throw new Error(`\u83B7\u53D6\u5B57\u6BB5\u540C\u6B65\u72B6\u6001\u5931\u8D25[${m.tableName}]: ${g.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let l=new Map(g.Data.List.map(u=>[String(u.Name||"").toLowerCase(),u]));for(let[u,p]of d){let h=l.get(p.fieldName.toLowerCase()),f=this.getWorkspaceFilePath(p.filePath);if(!f||!C.existsSync(f))continue;if(!h||!String(h[p.v8Key]||"").trim()){let E=this.createRemoteDeletedItem("field",`${p.tableName}.${p.fieldName}/${p.v8Key}`,u,t,f,p.updateTime);E&&i.push(E);continue}let y=this.normalizeCode(C.readFileSync(f,"utf-8")),S=this.normalizeCode(String(h[p.v8Key]||"")),T=String(h.UpdateTime||""),D=this.isLocalModified(f,p.updateTime),_=this.isRemoteNewer(T,p.updateTime);if(y===S){(D||_)&&T&&(p.updateTime=T,this.touchSyncedFile(f,T),c=!0);continue}let w=this.classifyDifference(D,_,y,S);w&&i.push({kind:"field",status:w,name:`${p.tableName}.${p.fieldName}/${p.v8Key}`,key:u,serverDir:t,filePath:f,localCode:y,remoteCode:S,localUpdateTime:p.updateTime,remoteUpdateTime:T})}}),c&&this.saveMeta(n,t)}async collectMenuButtonDifferences(e,t,n,i,r){let s=L.getInstance(),o=new Map;if(!r)for(let l of Object.keys(n.menus||{}))o.set(l,[]);for(let l of Object.entries(n.menuButtons||{})){if(!this.matchesTargetFile(l[1].filePath,r))continue;let u=o.get(l[1].moduleId)||[];u.push(l),o.set(l[1].moduleId,u)}let c=[];if(!r){let l=await s.get(x.LIST_MODULES,{osClient:e.osClient},e.apiBaseUrl,e);if(l.Code!==1||!Array.isArray(l.Data?.List))throw new Error(`\u83B7\u53D6\u6A21\u5757\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${l.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);c=l.Data.List}let d=new Set(c.map(l=>String(l.ParentId||"")).filter(Boolean)),m=new Map(c.map(l=>[l.Id,l]));for(let l of c){if(d.has(l.Id)||n.menus?.[l.Id])continue;let u=l.Label||l.Name||l.Id;i.push({kind:"menuButton",status:"remoteModified",name:`${u}/\u670D\u52A1\u5668\u65B0\u589E\u6A21\u5757`,key:l.Id,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"module",l.Id),localCode:"",remoteCode:JSON.stringify(l,null,2),localUpdateTime:"",remoteUpdateTime:String(l.UpdateTime||"")})}let g=!1;await this.runInBatches([...o.entries()],r?1:2,async([l,u])=>{let p=()=>{for(let[_,w]of u){let E=this.getWorkspaceFilePath(w.filePath);if(!E)continue;let V=this.createRemoteDeletedItem("menuButton",`${w.moduleName}/${w.btnName}/${w.v8SubField}`,_,t,E,w.updateTime);V&&i.push(V)}};if(!r&&!m.has(l)){p();return}let h=await s.get(x.GET_MODULE,{osClient:e.osClient,moduleId:l},e.apiBaseUrl,e);if(h.Code!==1||!h.Data){if(/不存在|not\s*found/i.test(String(h.Msg||""))){p();return}throw new Error(`\u83B7\u53D6\u6A21\u5757\u6309\u94AE\u540C\u6B65\u72B6\u6001\u5931\u8D25[${l}]: ${h.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`)}let f=h.Data,y=String(f.UpdateTime||""),S=new Map;for(let _ of Object.keys(Oe)){let w=[];try{let E=f[_];w=typeof E=="string"?JSON.parse(E):Array.isArray(E)?E:[],Array.isArray(w)||(w=[])}catch{w=[]}S.set(_,new Map(w.map(E=>[String(E.Id||""),E])))}for(let[_,w]of u){let E=S.get(w.btnField)?.get(w.btnId),V=this.getWorkspaceFilePath(w.filePath);if(!V||!C.existsSync(V))continue;if(!E||!String(E[w.v8SubField]||"").trim()){let b=this.createRemoteDeletedItem("menuButton",`${w.moduleName}/${w.btnName}/${w.v8SubField}`,_,t,V,w.updateTime);b&&i.push(b);continue}let U=this.normalizeCode(C.readFileSync(V,"utf-8")),A=this.normalizeCode(String(E[w.v8SubField]||"")),R=this.isLocalModified(V,w.updateTime),$=this.isRemoteNewer(y,w.updateTime);if(U===A){(R||$)&&y&&(w.updateTime=y,this.touchSyncedFile(V,y),g=!0);continue}let F=this.classifyDifference(R,$,U,A);F&&i.push({kind:"menuButton",status:F,name:`${w.moduleName}/${w.btnName}/${w.v8SubField}`,key:_,serverDir:t,filePath:V,localCode:U,remoteCode:A,localUpdateTime:w.updateTime,remoteUpdateTime:y})}if(r)return;let T=new Set(u.map(([_])=>_)),D=n.menus?.[l]?.moduleName||m.get(l)?.Label||m.get(l)?.Name||l;for(let[_,w]of S)for(let[E,V]of w){if(!E)continue;let U=String(V.Name||E);for(let A of["V8Code","V8CodeShow"]){let R=String(V[A]||""),$=this.getMenuButtonMetaKey(l,_,E,A);!R.trim()||T.has($)||i.push({kind:"menuButton",status:"remoteModified",name:`${D}/${U}/${A}`,key:$,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"module",$),localCode:"",remoteCode:this.normalizeCode(R),localUpdateTime:"",remoteUpdateTime:y})}}}),g&&this.saveMeta(n,t)}async collectMenuScriptDifferences(e,t,n,i,r){let s=L.getInstance(),o=Object.entries(n.menuScripts||{}).filter(([,d])=>this.matchesTargetFile(d.filePath,r)),c=!1;await this.runInBatches(o,r?1:2,async([d,m])=>{let g=this.getWorkspaceFilePath(m.filePath);if(!g||!C.existsSync(g))return;let l=await s.get(x.GET_MODULE,{osClient:e.osClient,moduleId:m.moduleId},e.apiBaseUrl,e);if(l.Code!==1||!l.Data){if(/不存在|not\s*found/i.test(String(l.Msg||""))){let D=this.createRemoteDeletedItem("menuScript",`${m.moduleName}/${m.scriptField}`,d,t,g,m.updateTime);D&&i.push(D);return}throw new Error(`\u83B7\u53D6\u6A21\u5757 Join/Where \u540C\u6B65\u72B6\u6001\u5931\u8D25[${m.moduleId}]: ${l.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`)}let u=l.Data,p=this.normalizeCode(String(u[m.scriptField]||"")),h=this.normalizeCode(C.readFileSync(g,"utf-8")),f=String(u.UpdateTime||""),y=this.isLocalModified(g,m.updateTime),S=this.sourceHash(p)!==m.codeHash;if(h===p){(y||S||f&&f!==m.updateTime)&&(m.codeHash=this.sourceHash(p),m.updateTime=f||m.updateTime,this.touchSyncedFile(g,m.updateTime),c=!0);return}let T=this.classifyDifference(y,S,h,p);T&&i.push({kind:"menuScript",status:T,name:`${m.moduleName}/${m.scriptField}`,key:d,serverDir:t,filePath:g,localCode:h,remoteCode:p,localUpdateTime:m.updateTime,remoteUpdateTime:f})}),c&&this.saveMeta(n,t)}async runInBatches(e,t,n){for(let i=0;i<e.length;i+=t)await Promise.all(e.slice(i,i+t).map(r=>n(r))),i+t<e.length&&await new Promise(r=>setTimeout(r,120))}async collectWorkflowDifferences(e,t,n,i,r){let o=await L.getInstance().get(x.GET_WORKFLOW_V8_EVENT_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(o.Code!==1||!Array.isArray(o.Data?.List))throw new Error(`\u83B7\u53D6\u6D41\u7A0B\u4E8B\u4EF6\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${o.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map(o.Data.List.map(g=>[`${g.FlowDesignId}__${g.NodeId}__${g.EventType}`,g])),d=!1;for(let[g,l]of Object.entries(n.workflowNodeEvents||{})){if(!this.matchesTargetFile(l.filePath,r))continue;let u=c.get(g),p=this.getWorkspaceFilePath(l.filePath);if(!p||!C.existsSync(p))continue;if(!u||!String(u.V8Code||u.Code||"").trim()){let D=this.createRemoteDeletedItem("workflow",`${l.flowName}/${l.nodeName}/${l.eventType}`,g,t,p,l.updateTime);D&&i.push(D);continue}let h=this.normalizeCode(C.readFileSync(p,"utf-8")),f=this.normalizeCode(u.V8Code||u.Code||""),y=this.isLocalModified(p,l.updateTime),S=this.isRemoteNewer(u.UpdateTime,l.updateTime);if(h===f){(y||S)&&u.UpdateTime&&(l.updateTime=u.UpdateTime,this.touchSyncedFile(p,u.UpdateTime),d=!0);continue}let T=this.classifyDifference(y,S,h,f);if(T){let D=`${u.FlowName||l.flowName}/${u.NodeName||l.nodeName}/${u.EventType||l.eventType}`;i.push({kind:"workflow",status:T,name:D,key:g,serverDir:t,filePath:p,localCode:h,remoteCode:f,localUpdateTime:l.updateTime,remoteUpdateTime:u.UpdateTime})}}if(d&&this.saveMeta(n,t),r)return;let m=new Set(Object.keys(n.workflowNodeEvents||{}));for(let g of o.Data.List){let l=`${g.FlowDesignId}__${g.NodeId}__${g.EventType}`,u=g.V8Code||g.Code||"";if(!u.trim()||m.has(l))continue;let p=`${g.FlowName||g.FlowDesignId}/${g.NodeName||g.NodeId}/${g.EventType}`;i.push({kind:"workflow",status:"remoteModified",name:p,key:l,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"workflow",l),localCode:"",remoteCode:this.normalizeCode(u),localUpdateTime:"",remoteUpdateTime:g.UpdateTime})}}migrateFromFlatMeta(e){let t=I.getInstance();try{let n=t.getSyncRootDir(),i=v.join(n,Ae);if(!C.existsSync(i))return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};let r=t.getWorkspaceRoot();if(!r)return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};let s=JSON.parse(C.readFileSync(i,"utf-8")),o=s.engines||{},c=s.events||{},d={engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};for(let[m,g]of Object.entries(o)){let l=g;if(l.filePath){let u=v.join(r,l.filePath);v.relative(n,u).split(v.sep)[0]===e&&(d.engines[m]=l)}}for(let[m,g]of Object.entries(c)){let l=g;if(l.filePath){let u=v.join(r,l.filePath);v.relative(n,u).split(v.sep)[0]===e&&(d.events[m]=l)}}return(Object.keys(d.engines).length>0||Object.keys(d.events).length>0)&&this.saveMeta(d,e),d}catch{return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}}}}async pullEngines(e){if(!e){let t=I.getInstance().getProfiles();if(t.length===0){P.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(i){let r=i instanceof Error?i.message:String(i);this.log(`\u62C9\u53D6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${r}`),P.error(`Microi: \u62C9\u53D6 [${n.label||n.apiBaseUrl}] \u5931\u8D25 - ${r}`)}return}await this.pullEnginesForProfile(e)}async pullEnginesForProfile(e){let t=I.getInstance(),n=L.getInstance(),i=e.apiBaseUrl,r=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE\u4EE3\u7801 [${e.label||i}]...`),await oe.withProgress({location:Me.Notification,title:`Microi: \u62C9\u53D6\u63A5\u53E3\u5F15\u64CE [${e.label||i}]`,cancellable:!1},async s=>{s.report({message:"\u68C0\u67E5\u540E\u7AEF\u72B6\u6001..."});let o=await n.get(x.GET_STATUS,void 0,i,e);if(o.Code!==1){let F=o.Code===1001||o.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u540E\u7AEF\u72B6\u6001\u5F02\u5E38: ${o.Msg||"Code="+o.Code}${F}`)}s.report({message:"\u83B7\u53D6\u7CFB\u7EDF\u914D\u7F6E..."});let d=await ge.getInstance().getSysConfig(i,r),m=d?.SysShortTitle||"",g=d?.SysTitle||"",l=m||g||d?.CompanyName||e.label||"";l&&(l!==e.label||m!==e.sysShortTitle||g!==e.sysTitle)&&await t.addProfile({...e,label:l,sysShortTitle:m,sysTitle:g}),s.report({message:"\u83B7\u53D6\u63A5\u53E3\u5F15\u64CE\u5217\u8868..."});let u=await n.get(x.GET_ENGINE_LIST,{osClient:r},i,e);if(u.Code!==1){let F=u.Code===1001||u.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u5217\u8868\u5931\u8D25: ${u.Msg||"Code="+u.Code}${F}`)}let{OsClient:p,OsClientType:h,OsClientNetwork:f,List:y,Total:S}=u.Data;if(this.log(`\u83B7\u53D6\u5230 ${S} \u4E2A\u63A5\u53E3\u5F15\u64CE (OsClient: ${p})`),!h||!f)throw new Error(`\u540E\u7AEF\u672A\u8FD4\u56DE\u5B8C\u6574\u7684 OsClientType/OsClientNetwork (OsClient: ${p}, Type: ${h||"\u7A7A"}, Network: ${f||"\u7A7A"})\uFF0C\u65E0\u6CD5\u62C9\u53D6\u4EE3\u7801`);if(h||f){let F={...e,osClientType:h,osClientNetwork:f};await t.addProfile(F)}let T=t.getSyncRootDir(),D=t.buildServerDirName(l,i),_=this.loadMeta(D),w=0,E=0,V=[],U=new Set,A=new Set,R=t.buildOsClientDirName(p,h,f);for(let F of y)try{let b=H(F.Category||"\u672A\u5206\u7C7B"),O=H(F.ApiName||F.ApiEngineKey),j=v.join(T,D,R,Ve,b),K=H(`${O}(${Gt(F.ApiEngineKey)}).js`),ee=v.join(j,K),re=zt(F.ApiV8Code||"");if(!re.trim()){E++,C.existsSync(ee)&&this.backupAndDeleteSyncFile(ee,D,"remote-deleted-api"),delete _.engines[F.ApiEngineKey];continue}U.add(F.ApiEngineKey),te(j),C.writeFileSync(ee,re,"utf-8");let q=new Date(F.UpdateTime);isNaN(q.getTime())||C.utimesSync(ee,q,q),_.engines[F.ApiEngineKey]={id:F.Id,apiName:F.ApiName,category:b,apiAddress:F.ApiAddress,updateTime:F.UpdateTime,filePath:v.relative(t.getWorkspaceRoot(),ee)},w++,s.report({message:`${w}/${S} ${F.ApiEngineKey}`,increment:1/S*100})}catch(b){let O=b instanceof Error?b.message:String(b);A.add(F.ApiEngineKey),V.push(`${F.ApiEngineKey}: ${O}`),this.log(`\u63A5\u53E3\u5F15\u64CE\u6587\u4EF6\u5199\u5165\u5931\u8D25\uFF0C\u7EE7\u7EED\u4E0B\u4E00\u9879 [${F.ApiEngineKey}]: ${O}`)}for(let[F,b]of Object.entries(_.engines)){if(U.has(F)||A.has(F))continue;let O=this.getWorkspaceFilePath(b.filePath);O&&this.backupAndDeleteSyncFile(O,D,"remote-deleted-api"),delete _.engines[F]}this.saveMeta(_,D);let $=l||e.label||i;this.log(`[${$}] \u62C9\u53D6\u5B8C\u6210: ${w} \u4E2A\u63A5\u53E3\u5F15\u64CE\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${E} \u9879\uFF0C\u5931\u8D25 ${V.length} \u9879`),V.length>0?P.warn(`Microi: [${$}] \u5DF2\u62C9\u53D6 ${w} \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`):P.info(`Microi: [${$}] \u6210\u529F\u62C9\u53D6 ${w} \u4E2A\u63A5\u53E3\u5F15\u64CE${E>0?`\uFF08\u8DF3\u8FC7 ${E} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)})}async pullEvents(e){if(!e){let t=I.getInstance().getProfiles();if(t.length===0)return;for(let n of t)try{await this.pullEventsForProfile(n)}catch(i){let r=i instanceof Error?i.message:String(i);this.log(`\u62C9\u53D6V8\u4E8B\u4EF6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${r}`)}return}await this.pullEventsForProfile(e)}async pullEventsForProfile(e){let t=I.getInstance(),n=L.getInstance(),i=e.apiBaseUrl,r=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6V8\u4E8B\u4EF6\u4EE3\u7801 [${e.label||i}]...`),await oe.withProgress({location:Me.Notification,title:`Microi: \u62C9\u53D6V8\u4E8B\u4EF6 [${e.label||i}]`,cancellable:!1},async s=>{s.report({message:"\u83B7\u53D6V8\u4E8B\u4EF6\u5217\u8868..."});let o=await n.get(x.GET_EVENT_LIST,{osClient:r},i,e);if(o.Code!==1){let R=o.Code===1001||o.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6V8\u4E8B\u4EF6\u5217\u8868\u5931\u8D25: ${o.Msg||"Code="+o.Code}${R}`)}let{List:c,Total:d}=o.Data;this.log(`\u83B7\u53D6\u5230 ${d} \u4E2AV8\u4E8B\u4EF6`);let g=await ge.getInstance().getSysConfig(i,r),l=g?.SysShortTitle||"",u=g?.SysTitle||"",p=l||u||g?.CompanyName||e.label||"";p&&(p!==e.label||l!==e.sysShortTitle||u!==e.sysTitle)&&await t.addProfile({...e,label:p,sysShortTitle:l,sysTitle:u});let h=t.getSyncRootDir(),f=t.buildServerDirName(p,i),y=this.loadMeta(f),S=0,T=0,D=0,_=new Set(c.map(R=>`${R.FormEngineKey}__${R.EventType}`)),E=t.getProfiles().find(R=>R.apiBaseUrl===e.apiBaseUrl&&R.osClient===e.osClient)||e;if(!E.osClientType||!E.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(r,E.osClientType,E.osClientNetwork),U={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 $=R.V8Code||"",F=H(R.Description?`${R.Description}\uFF08${R.FormEngineKey}\uFF09`:R.FormEngineKey),b=mn[R.EventType]||R.EventType,O=H(`${b}\uFF08${R.EventType}\uFF09`)+".js",j=v.join(h,f,V,Te,F,ut);te(j);let K=v.join(j,O),ee=U[R.EventType];if(ee){let ce=H(`${ee}\uFF08${R.EventType}\uFF09`)+".js",X=v.join(j,ce);X!==K&&C.existsSync(X)&&!this.isLocalModified(X,R.UpdateTime)&&(C.existsSync(K)?C.unlinkSync(X):C.renameSync(X,K))}let re=`${R.FormEngineKey}__${R.EventType}`;if(y.events[re]={id:R.Id,formEngineKey:R.FormEngineKey,description:R.Description||"",eventType:R.EventType,updateTime:R.UpdateTime,filePath:v.relative(t.getWorkspaceRoot(),K)},!$.trim()){C.existsSync(K)&&this.backupAndDeleteSyncFile(K,f,"remote-deleted-form-event"),D++,S++,s.report({message:`${S}/${d}`,increment:d>0?1/d*100:void 0});continue}C.writeFileSync(K,$,"utf-8");let q=new Date(R.UpdateTime);isNaN(q.getTime())||C.utimesSync(K,q,q),T++,S++,s.report({message:`${S}/${d}`,increment:d>0?1/d*100:void 0})}for(let[R,$]of Object.entries(y.events)){if(_.has(R))continue;let F=this.getWorkspaceFilePath($.filePath);F&&this.backupAndDeleteSyncFile(F,f,"remote-deleted-form-event"),delete y.events[R]}this.saveMeta(y,f);let A=p||e.label||i;this.log(`[${A}] \u62C9\u53D6\u5B8C\u6210: ${T} \u4E2AV8\u4E8B\u4EF6\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${D} \u9879`),P.info(`Microi: [${A}] \u6210\u529F\u62C9\u53D6 ${T} \u4E2AV8\u4E8B\u4EF6\u6587\u4EF6${D>0?`\uFF08\u8DF3\u8FC7 ${D} \u4E2A\u7A7A\u4EE3\u7801\u4E8B\u4EF6\uFF09`:""}`)})}async pullWorkflows(e){if(!e){let t=I.getInstance().getProfiles();if(t.length===0)return;for(let n of t)try{await this.pullWorkflowsForProfile(n)}catch(i){let r=i instanceof Error?i.message:String(i);this.log(`\u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${r}`)}return}await this.pullWorkflowsForProfile(e)}async pullWorkflowsForProfile(e){let t=I.getInstance(),n=L.getInstance(),i=e.apiBaseUrl,r=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE\u8282\u70B9 V8 [${e.label||i}]...`),await oe.withProgress({location:Me.Notification,title:`Microi: \u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE [${e.label||i}]`,cancellable:!1},async s=>{s.report({message:"\u83B7\u53D6\u6D41\u7A0B\u8282\u70B9V8\u5217\u8868..."});let o=await n.get(x.GET_WORKFLOW_V8_EVENT_LIST,{osClient:r},i,e);if(o.Code!==1){let b=o.Code===1001||o.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u6D41\u7A0B\u8282\u70B9V8\u5217\u8868\u5931\u8D25: ${o.Msg||"Code="+o.Code}${b}`)}let d=await ge.getInstance().getSysConfig(i,r),m=d?.SysShortTitle||"",g=d?.SysTitle||"",l=m||g||d?.CompanyName||e.label||"";l&&(l!==e.label||m!==e.sysShortTitle||g!==e.sysTitle)&&await t.addProfile({...e,label:l,sysShortTitle:m,sysTitle:g});let p=t.getProfiles().find(b=>b.apiBaseUrl===e.apiBaseUrl&&b.osClient===e.osClient)||e;if(!p.osClientType||!p.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let h=o.Data.OsClient||r,f=t.buildServerDirName(l,i),y=t.buildOsClientDirName(h,p.osClientType,p.osClientNetwork),S=t.getSyncRootDir(),T=this.loadMeta(f);T.workflows||(T.workflows={}),T.workflowNodeEvents||(T.workflowNodeEvents={});let D=o.Data.Flows||[],_=o.Data.Nodes||[],w=o.Data.Lines||[],E=o.Data.List||[],V=new Map(D.map(b=>[String(b.Id||""),b])),U=new Set(D.map(b=>String(b.Id||"")).filter(Boolean)),A=new Set(E.filter(b=>String(b.V8Code||b.Code||"").trim()).map(b=>`${b.FlowDesignId}__${b.NodeId}__${b.EventType}`)),R=0,$=0;for(let b of D){let O=String(b.Id||"");if(!O)continue;let j=String(b.FlowName||O),K=String(b.UpdateTime||me()),ee=v.join(S,f,y,$e,H(`${j}\uFF08${O}\uFF09`));te(ee);let re=_.filter(X=>String(X.FlowDesignId||"")===O),q=w.filter(X=>String(X.FlowDesignId||"")===O),ce=v.join(ee,"\u6D41\u7A0B\u8BBE\u8BA1\u56FE\uFF08WF_FlowDesign\uFF09.json");C.writeFileSync(ce,JSON.stringify({FlowDesign:b,Nodes:re,Lines:q},null,2),"utf-8"),this.touchSyncedFile(ce,K),T.workflows[O]={flowDesignId:O,flowName:j,updateTime:K,filePath:v.relative(t.getWorkspaceRoot(),ce)}}for(let b of E){let O=String(b.FlowDesignId||""),j=String(b.NodeId||""),K=String(b.EventType||"");if(!O||!j||!K)continue;let ee=V.get(O),re=String(b.FlowName||ee?.FlowName||O),q=String(b.NodeName||j),ce=pn[K]||b.EventName||K,X=v.join(S,f,y,$e,H(`${re}\uFF08${O}\uFF09`),mt,H(`${q}\uFF08${j}\uFF09`));te(X);let N=v.join(X,H(`${ce}\uFF08${K}\uFF09`)+".js"),se=b.V8Code||b.Code||"",Q=String(b.UpdateTime||ee?.UpdateTime||me());if(T.workflowNodeEvents[`${O}__${j}__${K}`]={flowDesignId:O,flowName:re,nodeId:j,nodeName:q,eventType:K,updateTime:Q,filePath:v.relative(t.getWorkspaceRoot(),N)},!se.trim()){C.existsSync(N)&&this.backupAndDeleteSyncFile(N,f,"remote-deleted-workflow-event"),$++,s.report({message:`${R}/${E.length} ${re}/${q}`});continue}C.writeFileSync(N,se,"utf-8"),this.touchSyncedFile(N,Q),R++,s.report({message:`${R}/${E.length} ${re}/${q}`})}for(let[b,O]of Object.entries(T.workflowNodeEvents)){if(A.has(b))continue;let j=this.getWorkspaceFilePath(O.filePath);j&&this.backupAndDeleteSyncFile(j,f,"remote-deleted-workflow-event"),delete T.workflowNodeEvents[b]}for(let[b,O]of Object.entries(T.workflows)){if(U.has(b))continue;let j=this.getWorkspaceFilePath(O.filePath);j&&this.backupAndDeleteSyncFile(j,f,"remote-deleted-workflow"),delete T.workflows[b]}this.saveMeta(T,f);let F=l||e.label||i;this.log(`[${F}] \u6D41\u7A0B\u5F15\u64CE\u62C9\u53D6\u5B8C\u6210: ${D.length} \u4E2A\u6D41\u7A0B\uFF0C${R} \u4E2A\u8282\u70B9V8\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${$} \u9879`),P.info(`Microi: [${F}] \u6210\u529F\u62C9\u53D6 ${D.length} \u4E2A\u6D41\u7A0B\u3001${R} \u4E2A\u6D41\u7A0B\u8282\u70B9V8\u6587\u4EF6${$>0?`\uFF08\u8DF3\u8FC7 ${$} \u4E2A\u7A7A\u4EE3\u7801\u4E8B\u4EF6\uFF09`:""}`)})}findProfileByServerDir(e){let t=I.getInstance(),n=t.getProfiles();for(let i of n)if(t.buildServerDirName(i.label,i.apiBaseUrl)===e)return i}hasSyncBaseline(e,t){let n=v.resolve(e).toLowerCase(),i=this.loadMeta(t);return[i.engines,i.events,i.fields||{},i.menuButtons||{},i.menuScripts||{},i.workflowNodeEvents||{}].some(s=>Object.values(s).some(o=>{let c=this.getWorkspaceFilePath(o.filePath);return!!c&&v.resolve(c).toLowerCase()===n}))}async runPushPreflight(e,t,n,i){if(!n){let r=`\u65E0\u6CD5\u8BC6\u522B\u6587\u4EF6\u6240\u5C5E\u670D\u52A1\u5668\u914D\u7F6E\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\uFF1A${e}`;return this.log(r),P.error(`Microi: ${r}`),!1}if(!this.hasSyncBaseline(e,t)){let r=`\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(r),P.error(`Microi: ${r}`),!1}try{let r=await this.checkRemoteDifferences(n,i,e),s=v.resolve(e).toLowerCase(),o=r.find(m=>v.resolve(m.filePath).toLowerCase()===s);if(!o||o.status==="localModified")return!0;let d=`${o.status==="conflict"?"\u672C\u5730\u4E0E\u670D\u52A1\u5668\u5747\u5DF2\u4FEE\u6539":o.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${o.name}`;return this.log(d),P.error(`Microi: ${d}`),!1}catch(r){let s=r instanceof Error?r.message:String(r);return this.log(`\u63A8\u9001\u524D\u540C\u6B65\u72B6\u6001\u68C0\u6D4B\u5931\u8D25\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\uFF1A${s}`),P.error(`Microi: \u63A8\u9001\u524D\u540C\u6B65\u72B6\u6001\u68C0\u6D4B\u5931\u8D25\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001 - ${s}`),!1}}async pushFile(e,t={}){let i=I.getInstance().getSyncRootDir();if(v.extname(e).toLowerCase()===".js"&&C.existsSync(e)){let g=bn(Ce(C.readFileSync(e,"utf-8")));if(g.length>0){let l=g[0],u=`\u68C0\u6D4B\u5230 AI/\u7EC8\u7AEF\u5DE5\u5177\u8F93\u51FA\u6C61\u67D3\uFF08\u7B2C ${l.line} \u884C: ${l.marker}\uFF09\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\u3002\u8BF7\u6062\u590D\u5B8C\u6574\u6E90\u7801\u540E\u518D\u8BD5\uFF1A${e}`;return this.log(u),P.error(`Microi: ${u}`),!1}}let r=Cn(e,i);if(r){let g=this.findProfileByServerDir(r.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,r.serverDir,g,"api")?!1:this.pushEngineFile(e,r,g)}let s=Tn(e,i);if(s){let g=this.findProfileByServerDir(s.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,s.serverDir,g,"form")?!1:this.pushEventFile(e,s,g)}let o=vn(e,i);if(o){let g=this.findProfileByServerDir(o.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,o.serverDir,g,"form")?!1:this.pushFieldFile(e,o,g)}let c=wn(e,i);if(c){let g=this.findProfileByServerDir(c.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,c.serverDir,g,"module")?!1:this.pushMenuButtonFile(e,c,g)}let d=En(e,i);if(d){let g=this.findProfileByServerDir(d.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,d.serverDir,g,"module")?!1:this.pushMenuScriptFile(e,d,g)}let m=Dn(e,i);if(m){let g=this.findProfileByServerDir(m.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,m.serverDir,g,"workflow")?!1:this.pushWorkflowNodeFile(e,m,g)}return this.log(`\u65E0\u6CD5\u89E3\u6790\u6587\u4EF6\u8DEF\u5F84: ${e}`),!1}async pushEngineFile(e,t,n){let i=L.getInstance(),r=C.readFileSync(e,"utf-8"),s=Ce(r);this.log(`\u63A8\u9001\u63A5\u53E3\u5F15\u64CE: ${t.apiEngineKey}...`);try{let o="",c="";try{let u=await i.post(x.GET_ENGINE_CODE,{OsClient:t.osClient,ApiEngineKey:t.apiEngineKey},void 0,n?.apiBaseUrl,n);u.Code===1&&u.Data&&(o=u.Data.ApiV8Code||u.Data.Code||"",c=u.Data.Version||"")}catch{o="",c=""}let d=!s.trim(),m=d?{code:"",version:c,changeHistory:""}:tt({kind:"ApiEngine",key:t.apiEngineKey,currentCode:s,remoteCode:o,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001\u63A5\u53E3\u5F15\u64CE ${t.apiEngineKey}`}),g={OsClient:t.osClient,ApiEngineKey:t.apiEngineKey,ApiV8CodeBase64:Buffer.from(m.code,"utf8").toString("base64")};d||(g.Version=m.version,g.ChangeHistory=m.changeHistory);let l=await i.post(x.UPDATE_ENGINE_CODE,g,void 0,n?.apiBaseUrl,n);if(l.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.apiEngineKey}`);let u=l.Data?.UpdateTime||me(),p=this.loadMeta(t.serverDir);if(d?delete p.engines[t.apiEngineKey]:p.engines[t.apiEngineKey]&&(p.engines[t.apiEngineKey].updateTime=u),this.saveMeta(p,t.serverDir),d)C.existsSync(e)&&C.unlinkSync(e);else{C.writeFileSync(e,m.code,"utf-8");let h=new Date(u);isNaN(h.getTime())||C.utimesSync(e,h,h)}return!0}else return this.log(`\u63A8\u9001\u5931\u8D25: ${t.apiEngineKey} - ${l.Msg}`),P.error(`Microi: \u63A8\u9001\u5931\u8D25 - ${l.Msg}`),!1}catch(o){let c=o instanceof Error?o.message:String(o);return this.log(`\u63A8\u9001\u5F02\u5E38: ${t.apiEngineKey} - ${c}`),P.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async pushEventFile(e,t,n){let i=L.getInstance(),r=C.readFileSync(e,"utf-8"),s=Ce(r);this.log(`\u63A8\u9001V8\u4E8B\u4EF6: ${t.formEngineKey}/${t.eventType}...`);try{let o="",c="";try{let u=await i.post(x.GET_EVENT_CODE,{OsClient:t.osClient,FormEngineKey:t.formEngineKey,EventType:t.eventType},void 0,n?.apiBaseUrl,n);u.Code===1&&u.Data&&(o=u.Data.V8Code||u.Data.Code||"",c=u.Data.Version||"")}catch{o="",c=""}let d=!s.trim(),m=d?{code:"",version:c,changeHistory:""}:tt({kind:"V8Event",key:t.formEngineKey,eventType:t.eventType,currentCode:s,remoteCode:o,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001 V8 \u4E8B\u4EF6 ${t.formEngineKey}/${t.eventType}`}),g={OsClient:t.osClient,FormEngineKey:t.formEngineKey,EventType:t.eventType,V8Code:m.code};d||(g.Version=m.version,g.ChangeHistory=m.changeHistory);let l=await i.post(x.UPDATE_EVENT_CODE,g,void 0,n?.apiBaseUrl,n);if(l.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.formEngineKey}/${t.eventType}`);let u=l.Data?.UpdateTime||me(),p=this.loadMeta(t.serverDir),h=`${t.formEngineKey}__${t.eventType}`;if(d)delete p.events[h];else{let f=p.events[h];p.events[h]={id:f?.id||"",formEngineKey:t.formEngineKey,description:f?.description||"",eventType:t.eventType,updateTime:u,filePath:v.relative(I.getInstance().getWorkspaceRoot(),e)}}if(this.saveMeta(p,t.serverDir),d)C.existsSync(e)&&C.unlinkSync(e);else{C.writeFileSync(e,m.code,"utf-8");let f=new Date(u);isNaN(f.getTime())||C.utimesSync(e,f,f)}return!0}else return this.log(`\u63A8\u9001\u5931\u8D25: ${t.formEngineKey}/${t.eventType} - ${l.Msg}`),P.error(`Microi: \u63A8\u9001\u5931\u8D25 - ${l.Msg}`),!1}catch(o){let c=o instanceof Error?o.message:String(o);return this.log(`\u63A8\u9001\u5F02\u5E38: ${t.formEngineKey}/${t.eventType} - ${c}`),P.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async createEngine(e){let t=L.getInstance(),n=I.getInstance();this.log(`\u521B\u5EFA\u63A5\u53E3\u5F15\u64CE: ${e.apiEngineKey}...`);try{let i=tt({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}),r=await t.post(x.CREATE_ENGINE,{OsClient:e.profile.osClient,ApiName:e.apiName,ApiEngineKey:e.apiEngineKey,ApiAddress:e.apiAddress||"",ApiRemark:e.apiRemark||"",Lock:e.lock?1:0,LockKey:e.lockKey||"",AllowAnonymous:e.allowAnonymous?1:0,V8Unlimited:e.v8Unlimited?1:0,IsEnable:e.isEnable!==!1?1:0,ApiRole:e.apiRole||"",Category:e.category||"\u672A\u5206\u7C7B",ApiV8CodeBase64:Buffer.from(i.code,"utf8").toString("base64"),Version:i.version,ChangeHistory:i.changeHistory},void 0,e.profile.apiBaseUrl,e.profile);if(r.Code===1){let s=n.getSyncRootDir(),o=n.buildServerDirName(e.profile.label,e.profile.apiBaseUrl),c=n.buildOsClientDirName(e.profile.osClient,e.profile.osClientType,e.profile.osClientNetwork),d=H(e.category||"\u672A\u5206\u7C7B"),m=H(e.apiName||e.apiEngineKey),g=v.join(s,o,c,Ve,d);te(g);let l=v.join(g,H(`${m}(${Gt(e.apiEngineKey)}).js`));C.writeFileSync(l,i.code,"utf-8");let u=this.loadMeta(o);return u.engines[e.apiEngineKey]={id:"",apiName:e.apiName,category:d,apiAddress:e.apiAddress||"",updateTime:me(),filePath:v.relative(n.getWorkspaceRoot(),l)},this.saveMeta(u,o),this.log(`\u521B\u5EFA\u6210\u529F: ${e.apiEngineKey}`),P.info(`Microi: \u63A5\u53E3\u5F15\u64CE [${e.apiEngineKey}] \u521B\u5EFA\u6210\u529F`),await oe.showTextDocument(cn.file(l)),!0}else return this.log(`\u521B\u5EFA\u5931\u8D25: ${e.apiEngineKey} - ${r.Msg}`),P.error(`Microi: \u521B\u5EFA\u5931\u8D25 - ${r.Msg}`),!1}catch(i){let r=i instanceof Error?i.message:String(i);return this.log(`\u521B\u5EFA\u5F02\u5E38: ${e.apiEngineKey} - ${r}`),P.error(`Microi: \u521B\u5EFA\u5F02\u5E38 - ${r}`),!1}}async pullFields(e){if(!e){let t=I.getInstance().getProfiles();for(let n of t)try{await this.pullFieldsForProfile(n)}catch(i){this.log(`\u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${i instanceof Error?i.message:String(i)}`)}return}await this.pullFieldsForProfile(e)}async pullFieldsForTableFolder(e){let n=I.getInstance().getSyncRootDir(),i=v.relative(n,e).split(v.sep);if(i.length<4||i[2]!==Te){P.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 r=o=>{let c=o.match(/[((]([^))]+)[))]\s*$/);return c?c[1]:o},s=this.findProfileByServerDir(i[0]);if(!s){P.error(`Microi: \u672A\u627E\u5230\u4E0E\u76EE\u5F55 "${i[0]}" \u5339\u914D\u7684\u670D\u52A1\u5668\u8FDE\u63A5`);return}await this.pullFieldsForTable(s,r(i[3]),e,i[0])}async pullFieldsForTable(e,t,n,i){let r=I.getInstance(),s=L.getInstance(),o=this.loadMeta(i);o.fields||(o.fields={}),this.log(`\u62C9\u53D6\u8868\u5B57\u6BB5V8\u4E8B\u4EF6: ${t}...`);let c=await s.get(x.GET_FIELD_LIST,{osClient:e.osClient,tableName:t},e.apiBaseUrl,e);if(c.Code!==1){P.error(`Microi: \u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 - ${c.Msg}`);return}let d=c.Data.List||[],m=["V8Code","KeyupV8Code","V8TmpEngineTable","V8TmpEngineForm"],g=0,l=0;for(let u of d){let p=H(u.Label?`${u.Label}\uFF08${u.Name}\uFF09`:u.Name),h=v.join(n,Je,p);for(let f of m){let y=(u[f]||"").toString(),S=Vt[f]||f,T=H(`${S}\uFF08${f}\uFF09`)+".js",D=v.join(h,T),_=`${t}__${u.Name}__${f}`;if(!y.trim()){l++,C.existsSync(D)&&C.unlinkSync(D),delete o.fields[_];continue}te(h),C.writeFileSync(D,y,"utf-8");let w=new Date(u.UpdateTime);isNaN(w.getTime())||C.utimesSync(D,w,w),o.fields[_]={fieldId:u.Id,tableId:u.TableId,tableName:t,fieldName:u.Name,fieldLabel:u.Label||"",v8Key:f,updateTime:u.UpdateTime,filePath:v.relative(r.getWorkspaceRoot(),D)},g++}}this.saveMeta(o,i),P.info(`Microi: \u5DF2\u62C9\u53D6 ${t} \u7684 ${g} \u4E2A\u5B57\u6BB5V8\u4E8B\u4EF6\u6587\u4EF6${l>0?`\uFF08\u8DF3\u8FC7 ${l} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)}async pullFieldsForProfile(e){let t=I.getInstance(),n=L.getInstance(),i=e.apiBaseUrl,r=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6 [${e.label||i}]...`),await oe.withProgress({location:Me.Notification,title:`Microi: \u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6 [${e.label||i}]`,cancellable:!1},async s=>{s.report({message:"\u83B7\u53D6\u8868\u5217\u8868..."});let o=await n.get(x.GET_DB_SCHEMA,{osClient:r},i,e);if(o.Code!==1)throw new Error(`\u83B7\u53D6\u8868\u5217\u8868\u5931\u8D25: ${o.Msg||"Code="+o.Code}`);let c=o.Data.Tables||[],m=await ge.getInstance().getSysConfig(i,r),g=m?.SysShortTitle||"",l=m?.SysTitle||"",u=g||l||e.label||"",p=t.buildServerDirName(u,i),h=this.loadMeta(p);h.fields||(h.fields={});let y=t.getProfiles().find(A=>A.apiBaseUrl===e.apiBaseUrl&&A.osClient===e.osClient)||e;if(!y.osClientType||!y.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let S=t.buildOsClientDirName(r,y.osClientType,y.osClientNetwork),T=t.getSyncRootDir(),D=["V8Code","KeyupV8Code","V8TmpEngineTable","V8TmpEngineForm"],_=0,w=0,E=0,V=new Set,U=new Set;for(let A of c){E++,s.report({message:`[${E}/${c.length}] ${A.Name}`});let R=await n.get(x.GET_FIELD_LIST,{osClient:r,tableId:A.Id},i,e);if(R.Code!==1){U.add(A.Name.toLowerCase()),this.log(` \u8DF3\u8FC7\u8868 ${A.Name}: ${R.Msg}`);continue}let $=R.Data.List||[],F=H(A.Description?`${A.Description}\uFF08${A.Name}\uFF09`:A.Name);for(let b of $)for(let O of D){let j=(b[O]||"").toString();if(!j.trim()){w++;continue}let K=H(b.Label?`${b.Label}\uFF08${b.Name}\uFF09`:b.Name),ee=Vt[O]||O,re=H(`${ee}\uFF08${O}\uFF09`)+".js",q=v.join(T,p,S,Te,F,Je,K);te(q);let ce=v.join(q,re);C.writeFileSync(ce,j,"utf-8");let X=new Date(b.UpdateTime);isNaN(X.getTime())||C.utimesSync(ce,X,X);let N=`${A.Name}__${b.Name}__${O}`;V.add(N),h.fields[N]={fieldId:b.Id,tableId:b.TableId,tableName:A.Name,fieldName:b.Name,fieldLabel:b.Label||"",v8Key:O,updateTime:b.UpdateTime,filePath:v.relative(t.getWorkspaceRoot(),ce)},_++}}for(let[A,R]of Object.entries(h.fields)){if(V.has(A)||U.has(R.tableName.toLowerCase()))continue;let $=this.getWorkspaceFilePath(R.filePath);$&&this.backupAndDeleteSyncFile($,p,"remote-deleted-field-event"),delete h.fields[A]}this.saveMeta(h,p),this.log(`\u5B57\u6BB5V8\u4E8B\u4EF6\u62C9\u53D6\u5B8C\u6210: ${_} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${w} \u9879`),P.info(`Microi: \u6210\u529F\u62C9\u53D6 ${_} \u4E2A\u5B57\u6BB5V8\u4E8B\u4EF6${w>0?`\uFF08\u8DF3\u8FC7 ${w} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)})}async pushFieldFile(e,t,n){let i=L.getInstance(),r=Ce(C.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u5B57\u6BB5V8\u4E8B\u4EF6: ${t.tableName}/${t.fieldName}/${t.v8Key}...`);try{let s=await i.post(x.UPDATE_FIELD,{OsClient:t.osClient,TableName:t.tableName,Name:t.fieldName,[t.v8Key]:r},void 0,n?.apiBaseUrl,n);if(s.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.tableName}/${t.fieldName}/${t.v8Key}`);let o=this.loadMeta(t.serverDir),c=`${t.tableName}__${t.fieldName}__${t.v8Key}`;o.fields||(o.fields={});let d=s.Data?.UpdateTime||me();return r.trim()?o.fields[c]={fieldId:o.fields[c]?.fieldId||"",tableId:o.fields[c]?.tableId||"",tableName:t.tableName,fieldName:t.fieldName,fieldLabel:o.fields[c]?.fieldLabel||"",v8Key:t.v8Key,updateTime:d,filePath:v.relative(I.getInstance().getWorkspaceRoot(),e)}:delete o.fields[c],this.saveMeta(o,t.serverDir),r.trim()?this.touchSyncedFile(e,d):C.existsSync(e)&&C.unlinkSync(e),!0}return this.log(`\u63A8\u9001\u5931\u8D25: ${s.Msg}`),P.error(`Microi: \u63A8\u9001\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 - ${s.Msg}`),!1}catch(s){let o=s instanceof Error?s.message:String(s);return this.log(`\u63A8\u9001\u5F02\u5E38: ${o}`),P.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${o}`),!1}}async pullMenuButtons(e){if(!e){let t=I.getInstance().getProfiles();for(let n of t)try{await this.pullMenuButtonsForProfile(n)}catch(i){this.log(`\u62C9\u53D6\u83DC\u5355\u6309\u94AE\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${i instanceof Error?i.message:String(i)}`)}return}await this.pullMenuButtonsForProfile(e)}async pullMenuButtonsForModuleFolder(e){let n=I.getInstance().getSyncRootDir(),i=v.relative(n,e).split(v.sep);if(i.length<4||i[2]!==De){P.warn("Microi: \u8BF7\u5728\u201C\u6A21\u5757\u5F15\u64CE\u201D\u4E0B\u7684\u6A21\u5757\u76EE\u5F55\u6267\u884C\u62C9\u53D6");return}let r=this.findProfileByServerDir(i[0]);if(!r){P.error(`Microi: \u672A\u627E\u5230\u4E0E\u76EE\u5F55 "${i[0]}" \u5339\u914D\u7684\u670D\u52A1\u5668\u8FDE\u63A5`);return}let s=this.extractTrailingKey(v.basename(e));await this.pullMenuButtonsForProfile(r,s,i[0],i[1],e)}async pullMenuButtonsForProfile(e,t,n,i,r){let s=I.getInstance(),o=L.getInstance(),c=e.apiBaseUrl,d=e.osClient;this.log(`\u5F00\u59CB\u62C9\u53D6\u6A21\u5757 Join/Where \u4E0E\u6309\u94AE V8 \u4EE3\u7801 [${e.label||c}]...`),await oe.withProgress({location:Me.Notification,title:`Microi: \u62C9\u53D6\u6A21\u5757\u4EE3\u7801 [${e.label||c}]`,cancellable:!1},async m=>{let g=await o.get(x.LIST_MODULES,{osClient:d},c,e);if(g.Code!==1)throw new Error(`\u83B7\u53D6\u6A21\u5757\u5217\u8868\u5931\u8D25: ${g.Msg}`);let l=g.Data.List||[],p=await ge.getInstance().getSysConfig(c,d),h=p?.SysShortTitle||"",f=p?.SysTitle||"",y=h||f||e.label||"",S=n||s.buildServerDirName(y,c),T=this.loadMeta(S);T.menus||(T.menus={}),T.menuButtons||(T.menuButtons={}),T.menuScripts||(T.menuScripts={});let _=s.getProfiles().find(N=>N.apiBaseUrl===e.apiBaseUrl&&N.osClient===e.osClient)||e;if(!_.osClientType||!_.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let w=i||s.buildOsClientDirName(d,_.osClientType,_.osClientNetwork),E=s.getSyncRootDir(),V=v.join(E,S,w,De),U=Object.keys(Oe),A=Object.keys(qe),R=0,$=0,F=0,b=0,O=0,j=new Map(l.map(N=>[N.Id,N])),K=new Map,ee=N=>N||"";for(let N of l){let se=ee(N.ParentId);K.has(se)||K.set(se,[]),K.get(se).push(N)}let re=N=>N.sort((se,Q)=>{let le=typeof se.Sort=="number"?se.Sort:0,Ke=typeof Q.Sort=="number"?Q.Sort:0;return le!==Ke?le-Ke:String(se.Name||se.Label||"").localeCompare(String(Q.Name||Q.Label||""))}),q=t?j.get(t)?[j.get(t)]:[]:re(l.filter(N=>!N.ParentId||!j.has(N.ParentId)));if(t&&q.length===0)throw new Error(`\u627E\u4E0D\u5230\u6A21\u5757 Id=${t}`);let ce=t?r||v.join(V,H(`${q[0].Label||q[0].Name||q[0].Id}\uFF08${q[0].Id}\uFF09`)):V;if(this.backupExistingTree(ce,S,t?"module-subtree":"module-engine"),!t)T.menus={},T.menuButtons={},T.menuScripts={};else{let N=new Set,se=Q=>{if(!N.has(Q)){N.add(Q);for(let le of K.get(Q)||[])se(le.Id)}};se(t);for(let Q of N)delete T.menus[Q];for(let[Q,le]of Object.entries(T.menuButtons))N.has(le.moduleId)&&delete T.menuButtons[Q];for(let[Q,le]of Object.entries(T.menuScripts))N.has(le.moduleId)&&delete T.menuScripts[Q]}let X=async(N,se)=>{b++,m.report({message:`[${b}/${l.length}] ${N.Name||N.Label}`});let Q=N.Label||N.Name||N.Id,le=v.join(se,H(`${Q}\uFF08${N.Id}\uFF09`));te(le);let Ke=re(K.get(N.Id)||[]);if(Ke.length>0){for(let Z of Ke)await X(Z,le);return}let _t=await o.get(x.GET_MODULE,{osClient:d,moduleId:N.Id},c,e);if(_t.Code!==1){this.log(` \u8DF3\u8FC7\u6A21\u5757 ${N.Name}: ${_t.Msg}`);return}let Pt=_t.Data,we=String(Pt.UpdateTime||me()),en={};for(let Z of A){let lt=String(Pt[Z]||""),Nt=qe[Z]||Z,Ee=v.join(le,H(`${Nt}\uFF08${Z}\uFF09`)+".js");C.writeFileSync(Ee,lt,"utf-8"),this.touchSyncedFile(Ee,we),T.menuScripts[this.getMenuScriptMetaKey(N.Id,Z)]={moduleId:N.Id,moduleName:Q,scriptField:Z,codeHash:this.sourceHash(lt),updateTime:we,filePath:v.relative(s.getWorkspaceRoot(),Ee)},F++}for(let Z of U){let lt=Oe[Z]||Z,Nt=H(`${lt}\uFF08${Z}\uFF09`),Ee=v.join(le,Nt);te(Ee),$++;let dt=Pt[Z],_e=[];if(dt)try{_e=typeof dt=="string"?JSON.parse(dt):dt,Array.isArray(_e)||(_e=[])}catch{this.log(` \u6309\u94AE JSON \u89E3\u6790\u5931\u8D25 ${N.Name}.${Z}`),_e=[]}let Zn=[..._e].sort((Pe,fe)=>String(Pe.Id||"").localeCompare(String(fe.Id||"")));en[Z]=require("crypto").createHash("sha1").update(JSON.stringify(Zn)).digest("hex");for(let Pe of _e){let fe=String(Pe.Id||""),gt=String(Pe.Name||fe||"Unknown");if(!fe)continue;let tn=String(Pe.V8Code||""),Mt=v.join(Ee,H(`${gt}\uFF08${fe}\uFF09`)+".js");T.menuButtons[this.getMenuButtonMetaKey(N.Id,Z,fe,"V8Code")]={moduleId:N.Id,moduleName:Q,btnField:Z,btnId:fe,btnName:gt,v8SubField:"V8Code",updateTime:we,filePath:v.relative(s.getWorkspaceRoot(),Mt)},tn.trim()?(C.writeFileSync(Mt,tn,"utf-8"),this.touchSyncedFile(Mt,we),R++):O++;let nn=String(Pe.V8CodeShow||"");if(nn.trim()){let Ft=v.join(Ee,H(`${gt}_\u663E\u9690\u5224\u65AD\uFF08${fe}\uFF09`)+".js");C.writeFileSync(Ft,nn,"utf-8"),this.touchSyncedFile(Ft,we),T.menuButtons[this.getMenuButtonMetaKey(N.Id,Z,fe,"V8CodeShow")]={moduleId:N.Id,moduleName:Q,btnField:Z,btnId:fe,btnName:gt,v8SubField:"V8CodeShow",updateTime:we,filePath:v.relative(s.getWorkspaceRoot(),Ft)},R++}else O++}}T.menus[N.Id]={moduleId:N.Id,moduleName:Q,updateTime:we,buttonHashes:en}};te(V);for(let N of q)await X(N,V);this.saveMeta(T,S),this.log(`\u6A21\u5757\u4EE3\u7801\u62C9\u53D6\u5B8C\u6210: ${R} \u4E2A\u6309\u94AEV8\u6587\u4EF6\uFF0C${F} \u4E2A Join/Where \u6587\u4EF6\uFF0C${$} \u4E2A\u6309\u94AE\u76EE\u5F55\uFF0C\u8DF3\u8FC7\u7A7A\u6309\u94AE\u4EE3\u7801 ${O} \u9879`),P.info(`Microi: \u6210\u529F\u62C9\u53D6 ${R} \u4E2A\u6309\u94AEV8\u6587\u4EF6\u548C ${F} \u4E2A Join/Where \u6587\u4EF6${O>0?`\uFF08\u8DF3\u8FC7 ${O} \u4E2A\u7A7A\u6309\u94AE\u4EE3\u7801\uFF09`:""}\uFF0C\u5DF2\u751F\u6210 ${$} \u4E2A\u6309\u94AE\u76EE\u5F55`)})}backupExistingTree(e,t,n){if(!C.existsSync(e))return;let r=I.getInstance().getSyncRootDir();this.ensureSyncGitExcludes(r);let s=v.join(r,".backups",n,this.shortBackupKey(t));te(s);let o=v.join(s,`${Date.now()}-${this.shortBackupKey(v.basename(e))}`);C.renameSync(e,o)}backupAndDeleteSyncFile(e,t,n){if(!C.existsSync(e))return;let i=I.getInstance(),r=i.getSyncRootDir();this.ensureSyncGitExcludes(r);let s=i.getWorkspaceRoot()||r,c=v.relative(s,e).split(v.sep).filter(g=>g&&g!=="..").map(H),d=v.join(r,".backups",n,this.shortBackupKey(t),String(Date.now())),m=v.join(d,...c.length?c:[H(v.basename(e))]);te(v.dirname(m)),C.copyFileSync(e,m),C.unlinkSync(e)}async pushMenuScriptFile(e,t,n){let i=L.getInstance(),r=Ce(C.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u6A21\u5757\u811A\u672C: ${t.moduleId}.${t.scriptField}...`);try{let s=await i.get(x.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n);if(s.Code!==1||!s.Data)return P.error(`Microi: \u63A8\u9001\u5931\u8D25 - \u62C9\u53D6\u6A21\u5757\u5931\u8D25 ${s.Msg}`),!1;let o=s.Data,c=String(o[t.scriptField]||""),d=I.getInstance(),m=d.getSyncRootDir();this.ensureSyncGitExcludes(m);let g=v.join(m,".backups","menu-script",this.shortBackupKey(t.serverDir),t.moduleId);te(g),C.writeFileSync(v.join(g,`${t.scriptField}-${Date.now()}.js`),c,"utf-8");let l={OsClient:t.osClient,ModuleId:t.moduleId,[t.scriptField]:r},u=await i.post(x.UPDATE_MODULE,l,void 0,n?.apiBaseUrl,n);if(u.Code!==1)return P.error(`Microi: \u63A8\u9001\u6A21\u5757 ${t.scriptField} \u5931\u8D25 - ${u.Msg}`),!1;let p=await i.get(x.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n),h=p.Data;if(p.Code!==1||!h||this.normalizeCode(String(h[t.scriptField]||""))!==this.normalizeCode(r))return P.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 f=String(h.UpdateTime||u.Data?.UpdateTime||me()),y=this.loadMeta(t.serverDir);return y.menuScripts||(y.menuScripts={}),y.menuScripts[this.getMenuScriptMetaKey(t.moduleId,t.scriptField)]={moduleId:t.moduleId,moduleName:String(h.Label||h.Name||o.Label||o.Name||t.moduleId),scriptField:t.scriptField,codeHash:this.sourceHash(r),updateTime:f,filePath:v.relative(d.getWorkspaceRoot(),e)},y.menus||(y.menus={}),y.menus[t.moduleId]={moduleId:t.moduleId,moduleName:String(h.Label||h.Name||o.Label||o.Name||t.moduleId),updateTime:f,buttonHashes:y.menus[t.moduleId]?.buttonHashes||{}},this.saveMeta(y,t.serverDir),this.touchSyncedFile(e,f),this.log(`\u63A8\u9001\u5E76\u56DE\u8BFB\u6210\u529F: ${t.moduleId}.${t.scriptField}`),!0}catch(s){let o=s instanceof Error?s.message:String(s);return this.log(`\u63A8\u9001\u6A21\u5757\u811A\u672C\u5F02\u5E38: ${o}`),P.error(`Microi: \u63A8\u9001\u6A21\u5757\u811A\u672C\u5F02\u5E38 - ${o}`),!1}}async pushMenuButtonFile(e,t,n){let i=L.getInstance(),r=Ce(C.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u6309\u94AEV8\u4EE3\u7801: ${t.moduleId}.${t.btnField}.${t.btnId}.${t.v8SubField}...`);try{let s=await i.get(x.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n);if(s.Code!==1)return P.error(`Microi: \u63A8\u9001\u5931\u8D25 - \u62C9\u53D6\u6A21\u5757\u5931\u8D25 ${s.Msg}`),!1;let o=s.Data,c=[],d=o[t.btnField];if(d)try{c=typeof d=="string"?JSON.parse(d):d,Array.isArray(c)||(c=[])}catch{return P.error("Microi: \u63A8\u9001\u5931\u8D25 - \u6309\u94AE JSON \u89E3\u6790\u5931\u8D25"),!1}let g=I.getInstance().getSyncRootDir();this.ensureSyncGitExcludes(g);let l=v.join(g,".backups","menu-button-json",this.shortBackupKey(t.serverDir),t.moduleId);te(l);let u=v.join(l,`${t.btnField}-${Date.now()}.json`);C.writeFileSync(u,JSON.stringify(c,null,2),"utf-8");let p=c.find(y=>String(y.Id||"")===t.btnId);if(!p){let y=c.map(S=>Number(S.Sort||0)).filter(S=>!isNaN(S));p={Id:t.btnId,Name:t.btnName||t.btnId,Sort:y.length>0?Math.max(...y)+1:c.length+1,IsVisible:!0,ShowRow:t.btnField==="MoreBtns"},c.push(p)}p[t.v8SubField]=r;let h={OsClient:t.osClient,ModuleId:t.moduleId};h[t.btnField]=JSON.stringify(c);let f=await i.post(x.UPDATE_MODULE,h,void 0,n?.apiBaseUrl,n);if(f.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.moduleId}.${t.btnField}.${t.btnId}.${t.v8SubField}`);let y=f.Data?.UpdateTime||me(),S=this.loadMeta(t.serverDir);S.menuButtons||(S.menuButtons={});let T=this.getMenuButtonMetaKey(t.moduleId,t.btnField,t.btnId,t.v8SubField);return r.trim()?S.menuButtons[T]={moduleId:t.moduleId,moduleName:String(o.Name||o.Label||t.moduleId),btnField:t.btnField,btnId:t.btnId,btnName:String(p.Name||t.btnName||t.btnId),v8SubField:t.v8SubField,updateTime:y,filePath:v.relative(I.getInstance().getWorkspaceRoot(),e)}:delete S.menuButtons[T],S.menus||(S.menus={}),S.menus[t.moduleId]={moduleId:t.moduleId,moduleName:String(o.Name||o.Label||t.moduleId),updateTime:y,buttonHashes:S.menus[t.moduleId]?.buttonHashes||{}},this.saveMeta(S,t.serverDir),r.trim()?this.touchSyncedFile(e,y):C.existsSync(e)&&C.unlinkSync(e),!0}return P.error(`Microi: \u63A8\u9001\u6309\u94AE\u5931\u8D25 - ${f.Msg}`),!1}catch(s){let o=s instanceof Error?s.message:String(s);return this.log(`\u63A8\u9001\u5F02\u5E38: ${o}`),P.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${o}`),!1}}async pushWorkflowNodeFile(e,t,n){let i=L.getInstance(),r=C.readFileSync(e,"utf-8"),s=Ce(r);this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8: ${t.flowDesignId}/${t.nodeId}/${t.eventType}...`);try{let o="",c="";try{let u=await i.post(x.GET_WORKFLOW_V8_EVENT_CODE,{OsClient:t.osClient,FlowDesignId:t.flowDesignId,NodeId:t.nodeId,EventType:t.eventType},void 0,n?.apiBaseUrl,n);u.Code===1&&u.Data&&(o=u.Data.V8Code||u.Data.Code||"",c=u.Data.Version||"")}catch{o="",c=""}let d=!s.trim(),m=d?{code:"",version:c,changeHistory:""}:tt({kind:"Workflow",key:`${t.flowDesignId}/${t.nodeId}`,eventType:t.eventType,currentCode:s,remoteCode:o,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001\u6D41\u7A0B\u8282\u70B9 V8 ${t.flowDesignId}/${t.nodeId}/${t.eventType}`}),g={OsClient:t.osClient,FlowDesignId:t.flowDesignId,NodeId:t.nodeId,EventType:t.eventType};d?g.V8Code="":(g.V8CodeBase64=Buffer.from(m.code,"utf8").toString("base64"),g.Version=m.version,g.ChangeHistory=m.changeHistory);let l=await i.post(x.UPDATE_WORKFLOW_V8_EVENT_CODE,g,void 0,n?.apiBaseUrl,n);if(l.Code===1){let u=l.Data?.UpdateTime||me(),p=this.loadMeta(t.serverDir);p.workflowNodeEvents||(p.workflowNodeEvents={});let h=`${t.flowDesignId}__${t.nodeId}__${t.eventType}`;return d?delete p.workflowNodeEvents[h]:p.workflowNodeEvents[h]={flowDesignId:t.flowDesignId,flowName:p.workflowNodeEvents[h]?.flowName||t.flowDesignId,nodeId:t.nodeId,nodeName:p.workflowNodeEvents[h]?.nodeName||t.nodeId,eventType:t.eventType,updateTime:u,filePath:v.relative(I.getInstance().getWorkspaceRoot(),e)},this.saveMeta(p,t.serverDir),d?C.existsSync(e)&&C.unlinkSync(e):(C.writeFileSync(e,m.code,"utf-8"),this.touchSyncedFile(e,u)),this.log(`\u63A8\u9001\u6210\u529F: ${t.flowDesignId}/${t.nodeId}/${t.eventType}`),!0}return this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5931\u8D25: ${l.Msg}`),P.error(`Microi: \u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5931\u8D25 - ${l.Msg}`),!1}catch(o){let c=o instanceof Error?o.message:String(o);return this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5F02\u5E38: ${c}`),P.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async pullDbSchema(e){let t=I.getInstance(),n=L.getInstance();if(!e){let i=t.getProfiles();if(i.length===0){P.warn("Microi: \u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u670D\u52A1\u5668");return}for(let r of i)try{await this.pullDbSchemaForProfile(r)}catch(s){let o=s instanceof Error?s.message:String(s);this.log(`\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5931\u8D25 [${r.label||r.apiBaseUrl}]: ${o}`)}return}await this.pullDbSchemaForProfile(e)}async pullDbSchemaForProfile(e){let t=I.getInstance(),n=L.getInstance(),i=e.apiBaseUrl,r=e.osClient;this.log(`\u5F00\u59CB\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784 [${e.label||i}]...`);let s=await n.get(x.GET_DB_SCHEMA,{osClient:r},i,e);if(s.Code!==1){let E=s.Code===1001||s.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5931\u8D25: ${s.Msg||"Code="+s.Code}${E}`)}let o=t.getSyncRootDir(),d=await ge.getInstance().getSysConfig(i,r),m=d?.SysShortTitle||"",g=d?.SysTitle||"",l=m||g||d?.CompanyName||e.label||"";l&&(l!==e.label||m!==e.sysShortTitle||g!==e.sysTitle)&&await t.addProfile({...e,label:l,sysShortTitle:m,sysTitle:g});let u=t.buildServerDirName(l,i),h=t.getProfiles().find(E=>E.apiBaseUrl===e.apiBaseUrl&&E.osClient===e.osClient)||e,f=t.buildOsClientDirName(r,h.osClientType,h.osClientNetwork),y=v.join(o,u,f);te(y);let S=v.join(y,Le);C.writeFileSync(S,JSON.stringify(s.Data,null,2),"utf-8");let T=v.join(y,ke),D=this.formatDbSchemaMarkdown(s.Data,u,f);D&&C.writeFileSync(T,D,"utf-8");let _=s.Data.Tables?.length||0,w=l||e.label||i;this.log(`[${w}] \u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5B8C\u6210: ${_} \u5F20\u8868`),P.info(`Microi: [${w}] \u6210\u529F\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\uFF08${_} \u5F20\u8868\uFF09`)}formatDbSchemaMarkdown(e,t,n){let i=(e.Tables||[]).filter(c=>c.Name);if(!i.length)return"";let r=i.reduce((c,d)=>{let m=d._Fields||d.Fields||[];return c+m.length},0),s=e.Menus?.length||0,o=[];o.push(`# \u6570\u636E\u5E93\u7ED3\u6784 \u2014 ${t}/${n}
|
|
42
|
+
`),o.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"),o.push(`> \u5171 ${i.length} \u5F20\u8868\uFF0C${r} \u4E2A\u5B57\u6BB5\uFF0C${s} \u4E2A\u83DC\u5355\u3002
|
|
43
|
+
`);for(let c of i){let d=c.Description?` \u2014 ${c.Description}`:"";o.push(`## ${c.Name}${d}
|
|
44
|
+
`);let m=c._Fields||c.Fields||[];if(!m.length){o.push(`_\u6682\u65E0\u5B57\u6BB5\u4FE1\u606F._
|
|
45
|
+
`);continue}o.push("| \u5B57\u6BB5 | \u6807\u7B7E/\u8BF4\u660E | \u7C7B\u578B | \u7EC4\u4EF6 | \u5FC5\u586B | \u5173\u8054 |"),o.push("|------|-----------|------|------|------|------|");for(let g of m){let l=g.Label||g.Description||"",u=g.Type||g.FieldType||"",p=g.Required===!0||g.NotEmpty===1?"\u662F":"",h=g.ChildTableId||g.ChildSysMenuId||"";o.push(`| ${g.Name} | ${l} | ${u} | ${g.Component||""} | ${p} | ${h} |`)}o.push("")}return o.join(`
|
|
46
|
+
`)}dispose(){}};var k=G(require("fs")),M=G(require("path")),Ln=G(require("crypto")),Qt=require("child_process");var Ei=`/**
|
|
47
|
+
* Microi V8\u5F15\u64CE API \u7C7B\u578B\u5B9A\u4E49
|
|
48
|
+
* \u6B64\u6587\u4EF6\u7531 Microi\u543E\u7801 VS Code \u63D2\u4EF6\u81EA\u52A8\u751F\u6210\uFF0C\u8BF7\u52FF\u624B\u52A8\u4FEE\u6539
|
|
49
|
+
* \u6587\u6863\u53C2\u8003\uFF1Aapi-engine.md, form-engine.md, v8-server.md, where.md
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
// ============ _Where \u6761\u4EF6 ============
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* _Where \u65B0\u7248\u6570\u7EC4\u683C\u5F0F\u6761\u4EF6\u9879
|
|
56
|
+
* \u683C\u5F0F\uFF1A[\u5B57\u6BB5, \u64CD\u4F5C\u7B26, \u503C] \u6216 [AndOr, \u5B57\u6BB5, \u64CD\u4F5C\u7B26, \u503C]
|
|
57
|
+
* \u652F\u6301\u5206\u7EC4\uFF1A['AND', '(', \u5B57\u6BB5, \u64CD\u4F5C\u7B26, \u503C] \u548C [\u5B57\u6BB5, \u64CD\u4F5C\u7B26, \u503C, ')']
|
|
58
|
+
* @example
|
|
59
|
+
* _Where: [
|
|
60
|
+
* ['Account', '=', 'test'],
|
|
61
|
+
* ['OR', 'Account', 'Like', 'VK'],
|
|
62
|
+
* ['AND', '(', 'Age', '>', 18],
|
|
63
|
+
* ['OR', 'Status', 'In', [1,2,3], ')']
|
|
64
|
+
* ]
|
|
65
|
+
*/
|
|
66
|
+
type WhereCondition = (string | number | boolean | null | any[])[];
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* _Where \u65E7\u7248\u5BF9\u8C61\u683C\u5F0F\uFF08\u4ECD\u517C\u5BB9\uFF09
|
|
70
|
+
*/
|
|
71
|
+
interface DiyWhere {
|
|
72
|
+
Name: string;
|
|
73
|
+
Value: any;
|
|
74
|
+
/** \u6761\u4EF6\u64CD\u4F5C\u7B26 */
|
|
75
|
+
Type: '=' | '==' | 'Equal' | '<>' | '!=' | 'NotEqual' | '>' | '>=' | '<' | '<=' | 'Like' | 'NotLike' | 'StartLike' | 'NotStartLike' | 'EndLike' | 'NotEndLike' | 'In' | 'NotIn';
|
|
76
|
+
AndOr?: 'AND' | 'OR';
|
|
77
|
+
GroupStart?: boolean;
|
|
78
|
+
GroupEnd?: boolean;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ============ \u901A\u7528\u7ED3\u679C\u7C7B\u578B ============
|
|
82
|
+
|
|
83
|
+
interface DosResult<T = any> {
|
|
84
|
+
Code: number;
|
|
85
|
+
Data: T;
|
|
86
|
+
Msg: string;
|
|
87
|
+
/** \u5217\u8868\u603B\u6570\uFF08Microi \u6807\u51C6\u5B57\u6BB5\uFF09 */
|
|
88
|
+
DataCount?: number;
|
|
89
|
+
/** \u517C\u5BB9\u90E8\u5206\u5305\u88C5\u63A5\u53E3 */
|
|
90
|
+
Total?: number;
|
|
91
|
+
DataAppend?: any;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ============ FormEngine \u53C2\u6570 ============
|
|
95
|
+
|
|
96
|
+
interface FormEngineQueryParams {
|
|
97
|
+
/** _Where \u6761\u4EF6\uFF08\u65B0\u7248\u6570\u7EC4\u683C\u5F0F\u6216\u65E7\u7248\u5BF9\u8C61\u683C\u5F0F\uFF09 */
|
|
98
|
+
_Where?: WhereCondition[] | DiyWhere[];
|
|
99
|
+
/** \u6307\u5B9A\u67E5\u8BE2\u5B57\u6BB5 */
|
|
100
|
+
_SelectFields?: string[];
|
|
101
|
+
/** \u6392\u5E8F\u5B57\u6BB5 */
|
|
102
|
+
_OrderBy?: string;
|
|
103
|
+
/** \u6392\u5E8F\u65B9\u5F0F */
|
|
104
|
+
_OrderByType?: 'ASC' | 'DESC';
|
|
105
|
+
/** \u9875\u7801\uFF08\u4ECE1\u5F00\u59CB\uFF09 */
|
|
106
|
+
_PageIndex?: number;
|
|
107
|
+
/** \u6BCF\u9875\u6761\u6570 */
|
|
108
|
+
_PageSize?: number;
|
|
109
|
+
/** \u517C\u5BB9\u65E7\u5199\u6CD5\uFF0C\u63A8\u8350\u4F7F\u7528 _PageIndex */
|
|
110
|
+
PageIndex?: number;
|
|
111
|
+
/** \u517C\u5BB9\u65E7\u5199\u6CD5\uFF0C\u63A8\u8350\u4F7F\u7528 _PageSize */
|
|
112
|
+
PageSize?: number;
|
|
113
|
+
/** \u5F53\u524D\u83DC\u5355 Id/Key\u3002\u6D4F\u89C8\u5668\u663E\u5F0F\u4F20\u5165\u65F6\u4F1A\u4E25\u683C\u6821\u9A8C\uFF1B\u540E\u7AEF\u53EF\u4FE1 V8 \u4E0D\u8981\u6C42 */
|
|
114
|
+
_SysMenuId?: string;
|
|
115
|
+
/** Client=\u4E3B\u52A8\u89E6\u53D1\u8868\u5355V8\u4E8B\u4EF6\uFF1BServer/\u7701\u7565=\u4E0D\u91CD\u65B0\u89E6\u53D1\u3002\u5B83\u4E0D\u662F\u4FE1\u4EFB\u6216\u6388\u6743\u6807\u8BB0 */
|
|
116
|
+
_InvokeType?: 'Client' | 'Server';
|
|
117
|
+
[key: string]: any;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// ============ FormEngine \u8868\u5355\u5F15\u64CE ============
|
|
121
|
+
|
|
122
|
+
interface V8FormEngine {
|
|
123
|
+
/** \u83B7\u53D6\u5355\u6761\u8868\u5355\u6570\u636E */
|
|
124
|
+
GetFormData(tableNameOrKey: string, params?: FormEngineQueryParams): DosResult<any>;
|
|
125
|
+
/** \u83B7\u53D6\u5217\u8868\u6570\u636E\uFF08\u5206\u9875\uFF09 */
|
|
126
|
+
GetTableData(tableNameOrKey: string, params?: FormEngineQueryParams): DosResult<any[]>;
|
|
127
|
+
/** \u83B7\u53D6\u5217\u8868\u6570\u636E\uFF08\u533F\u540D\uFF0C\u65E0\u9700\u767B\u5F55\uFF09 */
|
|
128
|
+
GetTableDataAnonymous(tableNameOrKey: string, params?: FormEngineQueryParams): DosResult<any[]>;
|
|
129
|
+
/** \u83B7\u53D6\u5217\u8868\u6570\u636E\u603B\u6570 */
|
|
130
|
+
GetTableDataCount(tableNameOrKey: string, params?: FormEngineQueryParams): DosResult<number>;
|
|
131
|
+
/** \u83B7\u53D6\u6811\u5F62\u7ED3\u6784\u6570\u636E */
|
|
132
|
+
GetTableDataTree(tableNameOrKey: string, params?: FormEngineQueryParams): DosResult<any[]>;
|
|
133
|
+
/** \u65B0\u589E\u8868\u5355\u6570\u636E */
|
|
134
|
+
AddFormData(tableNameOrKey: string, data: Record<string, any>): DosResult<any>;
|
|
135
|
+
/** \u533F\u540D\u65B0\u589E\u8868\u5355\u6570\u636E */
|
|
136
|
+
AddFormDataAnonymous(tableNameOrKey: string, data: Record<string, any>): DosResult<any>;
|
|
137
|
+
/** \u6279\u91CF\u65B0\u589E\uFF1A\u6BCF\u884C\u9700\u5305\u542B FormEngineKey */
|
|
138
|
+
AddTableData(dataList: Array<Record<string, any> & { FormEngineKey?: string }>): DosResult<any>;
|
|
139
|
+
/** \u517C\u5BB9\u65E7\u5199\u6CD5 */
|
|
140
|
+
AddTableData(tableNameOrKey: string, dataList: Record<string, any>[]): DosResult<any>;
|
|
141
|
+
/** \u66F4\u65B0\u8868\u5355\u6570\u636E\uFF08\u9700\u4F20\u5165Id\uFF09 */
|
|
142
|
+
UptFormData(tableNameOrKey: string, data: Record<string, any>): DosResult<any>;
|
|
143
|
+
/** \u6309\u6761\u4EF6\u66F4\u65B0\u8868\u5355\u6570\u636E */
|
|
144
|
+
UptFormDataByWhere(tableNameOrKey: string, data: Record<string, any>): DosResult<any>;
|
|
145
|
+
/** \u66F4\u65B0\u5217\u8868\u884C\u6570\u636E */
|
|
146
|
+
UptTableData(tableNameOrKey: string, dataList: Record<string, any>[]): DosResult<any>;
|
|
147
|
+
/** \u5220\u9664\u8868\u5355\u6570\u636E */
|
|
148
|
+
DelFormData(tableNameOrKey: string, data: { Id?: string; Ids?: string[]; [key: string]: any }): DosResult<any>;
|
|
149
|
+
/** \u5220\u9664\u5217\u8868\u884C\u6570\u636E */
|
|
150
|
+
DelTableData(tableNameOrKey: string, dataList: Array<{ Id?: string; Ids?: string[]; [key: string]: any }>): DosResult<any>;
|
|
151
|
+
/** \u6309\u6761\u4EF6\u5220\u9664\u8868\u5355\u6570\u636E */
|
|
152
|
+
DelFormDataByWhere(tableNameOrKey: string, data: Record<string, any>): DosResult<any>;
|
|
153
|
+
/** \u65B0\u589E\u8868\uFF08FormEngineKey/TableName/Description\u7B49\uFF09 */
|
|
154
|
+
AddTable(params: Record<string, any>): DosResult<any>;
|
|
155
|
+
/** \u65B0\u589E\u5B57\u6BB5\uFF08FormEngineKey/Name/Description/FieldType\u7B49\uFF09 */
|
|
156
|
+
AddField(params: Record<string, any>): DosResult<any>;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// ============ Cache \u7F13\u5B58\uFF08Redis\uFF09 ============
|
|
160
|
+
|
|
161
|
+
interface V8Cache {
|
|
162
|
+
/** \u83B7\u53D6\u7F13\u5B58\u503C */
|
|
163
|
+
Get(key: string): string | null;
|
|
164
|
+
/** \u8BBE\u7F6E\u5F53\u524D\u79DF\u6237\u7F13\u5B58\uFF08\u53EF\u9009\u8FC7\u671F\u79D2\u6570\u6216 d.HH:mm:ss\uFF09 */
|
|
165
|
+
Set(key: string, value: any, expiresIn?: number | string): boolean;
|
|
166
|
+
/** \u79FB\u9664\u7F13\u5B58 */
|
|
167
|
+
Remove(key: string): boolean;
|
|
168
|
+
/** \u5220\u9664\u7F13\u5B58\uFF08\u540CRemove\uFF09 */
|
|
169
|
+
Delete(key: string): boolean;
|
|
170
|
+
/** \u5220\u9664\u7F13\u5B58\uFF08\u540CRemove\uFF09 */
|
|
171
|
+
Del(key: string): boolean;
|
|
172
|
+
/** \u5224\u65AD\u7F13\u5B58\u662F\u5426\u5B58\u5728 */
|
|
173
|
+
Exists(key: string): boolean;
|
|
174
|
+
/** \u5224\u65AD\u7F13\u5B58\u662F\u5426\u5B58\u5728\uFF08\u771F\u5B9E\u63A5\u53E3\u540D\uFF09 */
|
|
175
|
+
KeyExist(key: string): boolean;
|
|
176
|
+
/** Redis Hash \u8BBE\u7F6E\u5B57\u6BB5 */
|
|
177
|
+
HashSet<T = any>(key: string, field: string, value: T): boolean;
|
|
178
|
+
/** Redis Hash \u83B7\u53D6\u5B57\u6BB5 */
|
|
179
|
+
HashGet<T = any>(key: string, field: string): T;
|
|
180
|
+
/** Redis Hash \u83B7\u53D6\u5168\u90E8\u5B57\u6BB5 */
|
|
181
|
+
HashGetAll(key: string): any;
|
|
182
|
+
/** Redis Hash \u83B7\u53D6\u5168\u90E8\u5B57\u6BB5\u540D */
|
|
183
|
+
HashGetAllKeys(key: string): string[];
|
|
184
|
+
/** Redis Hash \u5220\u9664\u5B57\u6BB5 */
|
|
185
|
+
HashDelete(key: string, field: string | string[]): boolean | number;
|
|
186
|
+
/** Redis Hash \u5224\u65AD\u5B57\u6BB5\u662F\u5426\u5B58\u5728 */
|
|
187
|
+
HashExists(key: string, field: string): boolean;
|
|
188
|
+
/** Redis Hash \u5B57\u6BB5\u6570\u91CF */
|
|
189
|
+
HashLength(key: string): number;
|
|
190
|
+
/** Redis Hash \u539F\u5B50\u589E\u91CF */
|
|
191
|
+
HashIncrement(key: string, field: string, incrementValue: number): number;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// ============ Http \u8BF7\u6C42 ============
|
|
195
|
+
|
|
196
|
+
interface V8HttpBaseParams {
|
|
197
|
+
/** \u8BF7\u6C42\u5730\u5740\uFF0C\u5FC5\u4F20 */
|
|
198
|
+
Url: string;
|
|
199
|
+
/** URL \u67E5\u8BE2\u53C2\u6570\uFF0CGET\u3001POST\u3001PATCH \u5747\u53EF\u4F7F\u7528 */
|
|
200
|
+
GetParam?: Record<string, any>;
|
|
201
|
+
/** \u8BF7\u6C42\u4F53\u7C7B\u578B\uFF0C\u9ED8\u8BA4 form */
|
|
202
|
+
ParamType?: 'json' | 'form' | 'xml' | 'binary';
|
|
203
|
+
/** \u8D85\u65F6\u79D2\u6570\uFF0C\u9ED8\u8BA4 600 \u79D2\uFF0810 \u5206\u949F\uFF09 */
|
|
204
|
+
Timeout?: number;
|
|
205
|
+
/** Timeout \u7684\u517C\u5BB9\u53C2\u6570\u540D */
|
|
206
|
+
TimeOut?: number;
|
|
207
|
+
/** \u54CD\u5E94\u6587\u672C\u7F16\u7801 */
|
|
208
|
+
Encoding?: string;
|
|
209
|
+
/** \u8BF7\u6C42\u5934 */
|
|
210
|
+
Headers?: Record<string, string>;
|
|
211
|
+
/** Headers \u7684\u517C\u5BB9\u53C2\u6570\u540D */
|
|
212
|
+
Header?: Record<string, string>;
|
|
213
|
+
/** Base64 \u6587\u4EF6\u5BF9\u8C61\uFF0C\u952E\u540C\u65F6\u4F5C\u4E3A\u5B57\u6BB5\u540D\u548C\u6587\u4EF6\u540D */
|
|
214
|
+
FilesByteBase64?: Record<string, string>;
|
|
215
|
+
/** \u5B57\u7B26\u4E32\u6587\u4EF6\u5BF9\u8C61 */
|
|
216
|
+
FilesByteString?: Record<string, string>;
|
|
217
|
+
/** \u5B57\u8282\u6587\u4EF6\u5BF9\u8C61 */
|
|
218
|
+
FilesByte?: Record<string, any>;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
interface V8HttpResponse {
|
|
222
|
+
Content: string;
|
|
223
|
+
Headers: Array<{ Name: string; Value: any }>;
|
|
224
|
+
StatusCode: number;
|
|
225
|
+
RawBytes: any;
|
|
226
|
+
ErrorMessage: string;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
interface V8Http {
|
|
230
|
+
/** GET \u8BF7\u6C42\uFF0C\u5FC5\u987B\u4F7F\u7528\u5BF9\u8C61\u53C2\u6570\u683C\u5F0F */
|
|
231
|
+
Get(params: V8HttpBaseParams): string;
|
|
232
|
+
/** GET \u8BF7\u6C42\u5E76\u8FD4\u56DE\u5B8C\u6574\u54CD\u5E94 */
|
|
233
|
+
GetResponse(params: V8HttpBaseParams): V8HttpResponse;
|
|
234
|
+
/** \u8BF7\u6C42\u5185\u5F02\u6B65 GET\uFF1B\u4E0D\u80FD\u4EE3\u66FF\u540E\u53F0\u4EFB\u52A1 */
|
|
235
|
+
GetAsync(params: V8HttpBaseParams): Promise<string>;
|
|
236
|
+
GetResponseAsync(params: V8HttpBaseParams): Promise<V8HttpResponse>;
|
|
237
|
+
/** POST \u8BF7\u6C42\uFF0C\u8FD4\u56DE\u54CD\u5E94\u5185\u5BB9\u5B57\u7B26\u4E32 */
|
|
238
|
+
Post(params: V8HttpBaseParams & { PostParam?: any; PostParamString?: string }): string;
|
|
239
|
+
/** POST \u8BF7\u6C42\u5E76\u8FD4\u56DE\u5B8C\u6574\u54CD\u5E94 */
|
|
240
|
+
PostResponse(params: V8HttpBaseParams & { PostParam?: any; PostParamString?: string }): V8HttpResponse;
|
|
241
|
+
PostAsync(params: V8HttpBaseParams & { PostParam?: any; PostParamString?: string }): Promise<string>;
|
|
242
|
+
PostResponseAsync(params: V8HttpBaseParams & { PostParam?: any; PostParamString?: string }): Promise<V8HttpResponse>;
|
|
243
|
+
/** PATCH \u8BF7\u6C42\uFF0C\u8FD4\u56DE\u54CD\u5E94\u5185\u5BB9\u5B57\u7B26\u4E32 */
|
|
244
|
+
Patch(params: V8HttpBaseParams & { PatchParam?: any; PatchParamString?: string }): string;
|
|
245
|
+
/** PATCH \u8BF7\u6C42\u5E76\u8FD4\u56DE\u5B8C\u6574\u54CD\u5E94 */
|
|
246
|
+
PatchResponse(params: V8HttpBaseParams & { PatchParam?: any; PatchParamString?: string }): V8HttpResponse;
|
|
247
|
+
PatchAsync(params: V8HttpBaseParams & { PatchParam?: any; PatchParamString?: string }): Promise<string>;
|
|
248
|
+
PatchResponseAsync(params: V8HttpBaseParams & { PatchParam?: any; PatchParamString?: string }): Promise<V8HttpResponse>;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// ============ Db \u6570\u636E\u5E93\uFF08ORM\uFF09 ============
|
|
252
|
+
|
|
253
|
+
type MicroiDatabaseType = 'MySql' | 'SqlServer' | 'Oracle' | 'PostgreSql' | 'DaMeng' | 'KingBase';
|
|
254
|
+
|
|
255
|
+
interface V8Db {
|
|
256
|
+
/** SQL \u67E5\u8BE2\uFF0C\u52A8\u6001\u503C\u4F7F\u7528\u94FE\u5F0F AddInParameter \u7ED1\u5B9A\uFF0C\u4E0D\u8981\u7ED9 FromSql \u4F20\u7B2C\u4E8C\u4E2A\u53C2\u6570 */
|
|
257
|
+
FromSql(sql: string): {
|
|
258
|
+
/** \u7ED1\u5B9A SQL \u5165\u53C2\uFF0C\u5982 .AddInParameter("@p0", value) */
|
|
259
|
+
AddInParameter(name: string, value: any): ReturnType<V8Db['FromSql']>;
|
|
260
|
+
/** \u67E5\u8BE2\u5217\u8868 */
|
|
261
|
+
ToArray(): any[];
|
|
262
|
+
/** \u67E5\u8BE2\u5217\u8868\uFF08\u522B\u540D\uFF09 */
|
|
263
|
+
ToList(): any[];
|
|
264
|
+
/** \u67E5\u8BE2\u5355\u6761 */
|
|
265
|
+
First(): any;
|
|
266
|
+
/** \u67E5\u8BE2\u5355\u6761\uFF08\u522B\u540D\uFF09 */
|
|
267
|
+
ToModel(): any;
|
|
268
|
+
/** \u6267\u884C\u975E\u67E5\u8BE2\uFF08INSERT/UPDATE/DELETE\uFF09\uFF0C\u8FD4\u56DE\u53D7\u5F71\u54CD\u884C\u6570 */
|
|
269
|
+
ExecuteNonQuery(): number;
|
|
270
|
+
/** \u6267\u884C\u6807\u91CF\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u7B2C\u4E00\u884C\u7B2C\u4E00\u5217 */
|
|
271
|
+
ToScalar(): any;
|
|
272
|
+
/** \u6267\u884C\u6807\u91CF\u67E5\u8BE2\uFF08\u522B\u540D\uFF09 */
|
|
273
|
+
ExecuteScalar(): any;
|
|
274
|
+
};
|
|
275
|
+
/** \u6269\u5C55\u5E93\u72EC\u7ACB\u4E8B\u52A1 */
|
|
276
|
+
BeginTransaction(): V8DbTrans & { Close(): void };
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// ============ DbTrans \u4E8B\u52A1 ============
|
|
280
|
+
|
|
281
|
+
interface V8DbTrans {
|
|
282
|
+
/** SQL\uFF08\u4E8B\u52A1\u5185\uFF09\uFF0C\u52A8\u6001\u503C\u4F7F\u7528\u94FE\u5F0F AddInParameter \u7ED1\u5B9A\uFF0C\u4E0D\u8981\u7ED9 FromSql \u4F20\u7B2C\u4E8C\u4E2A\u53C2\u6570 */
|
|
283
|
+
FromSql(sql: string): {
|
|
284
|
+
AddInParameter(name: string, value: any): ReturnType<V8DbTrans['FromSql']>;
|
|
285
|
+
ToList(): any[];
|
|
286
|
+
ToArray(): any[];
|
|
287
|
+
ToModel(): any;
|
|
288
|
+
First(): any;
|
|
289
|
+
ExecuteNonQuery(): number;
|
|
290
|
+
ExecuteScalar(): any;
|
|
291
|
+
ToScalar(): any;
|
|
292
|
+
};
|
|
293
|
+
/** \u63D0\u4EA4\u4E8B\u52A1 */
|
|
294
|
+
Commit(): void;
|
|
295
|
+
/** \u56DE\u6EDA\u4E8B\u52A1 */
|
|
296
|
+
Rollback(): void;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// ============ ApiEngine \u63A5\u53E3\u5F15\u64CE ============
|
|
300
|
+
|
|
301
|
+
interface V8BackgroundTaskOptions {
|
|
302
|
+
/** \u8DE8\u8282\u70B9/\u91CD\u8BD5\u7A33\u5B9A\u4E0D\u53D8\uFF1B\u5199\u4EFB\u52A1\u5FC5\u987B\u914D\u7F6E */
|
|
303
|
+
IdempotencyKey?: string;
|
|
304
|
+
/** \u9700\u8981\u5168\u5C40\u4E32\u884C\u7684\u4EFB\u52A1\u5206\u7EC4\uFF0C\u4F8B\u5982\u540C\u79DF\u6237DDL\u5BFC\u5165 */
|
|
305
|
+
ConcurrencyKey?: string;
|
|
306
|
+
MaxAttempts?: number;
|
|
307
|
+
RetryOnFailure?: boolean;
|
|
308
|
+
BusinessTable?: string;
|
|
309
|
+
BusinessId?: string;
|
|
310
|
+
BusinessStatusField?: string;
|
|
311
|
+
BusinessTaskIdField?: string;
|
|
312
|
+
BusinessProgressField?: string;
|
|
313
|
+
BusinessEtaField?: string;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
interface V8BackgroundTaskProgress {
|
|
317
|
+
_BackgroundTaskId?: string;
|
|
318
|
+
TaskId?: string;
|
|
319
|
+
/** \u5DF2\u63D0\u4EA4/\u53EF\u786E\u8BA4\u7684\u771F\u5B9E\u5DE5\u4F5C\u91CF */
|
|
320
|
+
Current?: number;
|
|
321
|
+
/** \u603B\u5DE5\u4F5C\u91CF\uFF1B\u672A\u77E5\u65F6\u4E0D\u8981\u4F20\uFF0C\u5E73\u53F0\u663E\u793A\u4E0D\u5B9A\u8FDB\u5EA6 */
|
|
322
|
+
Total?: number;
|
|
323
|
+
/** \u4EC5\u65E0\u81EA\u7136\u5355\u4F4D\u65F6\u4F7F\u7528\uFF1B\u8FD0\u884C\u4E2D\u6700\u592799 */
|
|
324
|
+
Progress?: number;
|
|
325
|
+
Msg?: string;
|
|
326
|
+
Message?: string;
|
|
327
|
+
/** \u8FFD\u52A0\u5230\u901A\u77E5\u4E2D\u5FC3\u4EFB\u52A1\u8BE6\u60C5\uFF1B\u4E0D\u5F97\u8BB0\u5F55\u5BC6\u7801\u3001Token \u6216\u5BC6\u94A5 */
|
|
328
|
+
Log?: string;
|
|
329
|
+
AppendLog?: string;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
interface V8ExecutionLimits {
|
|
333
|
+
/** \u5F53\u524D\u6267\u884C\u662F\u5426\u7531\u670D\u52A1\u7AEF\u53EF\u4FE1\u5143\u6570\u636E\u5F00\u542F V8Unlimited\uFF1B\u8BF7\u6C42\u53C2\u6570\u4E0D\u80FD\u4F2A\u9020 */
|
|
334
|
+
UnlimitedRuntime: boolean;
|
|
335
|
+
/** \u5F53\u524D\u6267\u884C\u7247\u6BB5\u8D85\u65F6\uFF1B\u540E\u53F0\u4EFB\u52A1\u603B\u65F6\u957F\u53EF\u8D85\u8FC7\u5B83 */
|
|
336
|
+
TimeoutSeconds: number;
|
|
337
|
+
/** \u5F53\u524D\u5355\u4E2AJint\u5F15\u64CE\u8BED\u53E5\u9884\u7B97 */
|
|
338
|
+
MaxStatements: number;
|
|
339
|
+
/** \u5F53\u524D\u5355\u5C42\u7D2F\u8BA1\u6258\u7BA1\u5206\u914D\u9884\u7B97\uFF0C\u4E0D\u662F\u5B9E\u65F6\u5185\u5B58 */
|
|
340
|
+
LimitMemoryMB: number;
|
|
341
|
+
/** \u6839\u63A5\u53E3\u53CA\u5168\u90E8\u5D4C\u5957\u63A5\u53E3\u7684\u7D2F\u8BA1\u5206\u914D\u603B\u9884\u7B97 */
|
|
342
|
+
CallTreeLimitMemoryMB: number;
|
|
343
|
+
/** JavaScript\u51FD\u6570\u9012\u5F52\u6DF1\u5EA6\uFF0C\u4E0D\u7B49\u540C\u4E8E\u63A5\u53E3\u5D4C\u5957 */
|
|
344
|
+
LimitRecursion: number;
|
|
345
|
+
NestedApiDepthLimit: number;
|
|
346
|
+
CurrentDepth: number;
|
|
347
|
+
IsBackgroundTask: boolean;
|
|
348
|
+
IsolateNestedApiMemory: boolean;
|
|
349
|
+
MemoryAccounting: 'PerEngineExclusivePlusRootCallTree' | 'CumulativeAllocatedBytes' | 'ProcessResidentMemoryGuardOnly' | string;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
interface V8ApiEngine {
|
|
353
|
+
/** \u8C03\u7528\u53E6\u4E00\u4E2A\u63A5\u53E3\u5F15\u64CE\uFF0C\u53EF\u4F20\u5165\u53C2\u6570 */
|
|
354
|
+
Run(apiEngineKey: string, params?: Record<string, any>): any;
|
|
355
|
+
/** \u8868\u5355 V8 \u4E8B\u4EF6\u4E2D\u53EF\u4F20\u5165\u5171\u4EAB\u4E8B\u52A1 */
|
|
356
|
+
Run(apiEngineKey: string, params: Record<string, any>, dbTrans: V8DbTrans): any;
|
|
357
|
+
/** \u8BF7\u6C42\u5185\u5F02\u6B65\u8C03\u7528\uFF1B\u53EF\u9760\u540E\u53F0\u4EFB\u52A1\u5E94\u4F7F\u7528\u540E\u53F0\u4EFB\u52A1/Job/MQ/outbox */
|
|
358
|
+
RunAsync(apiEngineKey: string, params?: Record<string, any>): Promise<any>;
|
|
359
|
+
/** \u524D\u7AEFV8\uFF1A\u63D0\u4EA4\u6301\u4E45\u5316\u540E\u53F0\u4EFB\u52A1\uFF1B\u5927\u4EFB\u52A1\u5FC5\u987B\u914D\u7F6E\u5E42\u7B49\u952E\u548C\u4E1A\u52A1\u72B6\u6001\u5B57\u6BB5 */
|
|
360
|
+
RunBackground(apiEngineKey: string, params?: Record<string, any>, title?: string, options?: V8BackgroundTaskOptions): Promise<any>;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// ============ DataSourceEngine \u6570\u636E\u6E90\u5F15\u64CE ============
|
|
364
|
+
|
|
365
|
+
interface V8DataSourceEngine {
|
|
366
|
+
/** \u8FD0\u884C\u5F53\u524D\u79DF\u6237\u7684\u6570\u636E\u6E90 */
|
|
367
|
+
Run(dataSourceKey: string, params?: Record<string, any>): any;
|
|
368
|
+
/** \u8FD0\u884C\u5F53\u524D\u79DF\u6237\u7684\u6570\u636E\u6E90 */
|
|
369
|
+
Run(params: Record<string, any>): any;
|
|
370
|
+
/** \u8BF7\u6C42\u5185\u5F02\u6B65\u8FD0\u884C\u5F53\u524D\u79DF\u6237\u7684\u6570\u636E\u6E90 */
|
|
371
|
+
RunAsync(params: Record<string, any>): Promise<any>;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// ============ Method \u5185\u7F6E\u65B9\u6CD5 ============
|
|
375
|
+
|
|
376
|
+
interface V8Method {
|
|
377
|
+
/** \u83B7\u53D6\u5F53\u524D\u767B\u5F55\u7528\u6237 Token \u4FE1\u606F */
|
|
378
|
+
GetCurrentToken(token?: string, osClient?: string): any;
|
|
379
|
+
/** \u5237\u65B0\u6307\u5B9A\u7528\u6237\u7684\u767B\u5F55\u7F13\u5B58 */
|
|
380
|
+
RefreshLoginUser(userId: string, osClient?: string): DosResult<any>;
|
|
381
|
+
/** \u6E05\u9664\u6307\u5B9A\u7528\u6237\u5168\u90E8\u7EC8\u7AEF\u7684\u767B\u5F55\u4FE1\u606F\u5E76\u7ACB\u5373\u540A\u9500\u6240\u6709 Token\uFF0C\u4EC5\u7CFB\u7EDF\u7BA1\u7406\u5458\u53EF\u8C03\u7528 */
|
|
382
|
+
ClearUserLoginInfo(userId: string, osClient?: string): DosResult<any>;
|
|
383
|
+
/** \u83B7\u53D6\u79C1\u6709\u6587\u4EF6\u7684\u4E34\u65F6\u8BBF\u95EEURL */
|
|
384
|
+
GetPrivateFileUrl(params: { FilePathName: string; [key: string]: any }): DosResult<any>;
|
|
385
|
+
/** \u4E0A\u4F20\u6587\u4EF6\u5230 HDFS/\u5BF9\u8C61\u5B58\u50A8 */
|
|
386
|
+
Upload(params: { FilesByteBase64?: any; Limit?: boolean; Preview?: boolean; Path?: string; OsClient?: string; [key: string]: any }): DosResult<any>;
|
|
387
|
+
/** \u83B7\u53D6\u8BBF\u95EE Token */
|
|
388
|
+
GetAccessToken(params: Record<string, any>): DosResult<any>;
|
|
389
|
+
/** \u83B7\u53D6\u5F53\u524D\u5BA2\u6237\u7AEF IP */
|
|
390
|
+
GetClientIP(): DosResult<string>;
|
|
391
|
+
/** \u91CD\u65B0\u52A0\u8F7D\u79DF\u6237\u914D\u7F6E */
|
|
392
|
+
ReloadOsClient(osClient: string): DosResult<any>;
|
|
393
|
+
/** \u5728\u5F53\u524D\u4E8B\u52A1\u63D0\u4EA4\u540E\u5237\u65B0\u5168\u90E8\u8282\u70B9\u7684\u6269\u5C55\u6570\u636E\u5E93\u7F13\u5B58\uFF1B\u65E0\u4E8B\u52A1\u65F6\u7ACB\u5373\u5237\u65B0 */
|
|
394
|
+
RefreshExtensionDatabases(osClient?: string): DosResult<any>;
|
|
395
|
+
/** \u5199\u5165\u7CFB\u7EDF\u65E5\u5FD7 */
|
|
396
|
+
AddSysLog(params: { Type?: string; Title?: string; Content?: string; Level?: number; [key: string]: any }): DosResult<any>;
|
|
397
|
+
/** \u540E\u53F0\u63A5\u53E3\u5F15\u64CE\uFF1A\u4E0A\u62A5\u771F\u5B9E\u5355\u4F4D\u8FDB\u5EA6\uFF0C\u5E73\u53F0\u636E\u6B64\u8BA1\u7B97 ETA */
|
|
398
|
+
UpdateBackgroundTask(params: V8BackgroundTaskProgress): DosResult<any>;
|
|
399
|
+
/** \u5C06\u65B0\u7248 _Where \u8F6C\u6362\u6210\u65E7\u7248\u683C\u5F0F */
|
|
400
|
+
ParseWhere(where: WhereCondition[]): DiyWhere[];
|
|
401
|
+
/** \u751F\u6210\u65B0\u7684 GUID */
|
|
402
|
+
NewGuid(): string;
|
|
403
|
+
/** \u751F\u6210\u65B0\u7684 ULID */
|
|
404
|
+
NewUlid(): string;
|
|
405
|
+
/** \u83B7\u53D6 Unix \u79D2\u7EA7\u65F6\u95F4\u6233 */
|
|
406
|
+
GetTimestamp(): number;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// ============ Action \u5F15\u64CE\u52A8\u4F5C ============
|
|
410
|
+
|
|
411
|
+
interface V8Action {
|
|
412
|
+
/** \u83B7\u53D6\u5F53\u524D\u65E5\u671F\u65F6\u95F4\u5B57\u7B26\u4E32 */
|
|
413
|
+
GetDateTimeNow(): string;
|
|
414
|
+
/** \u83B7\u53D6\u5F53\u524D\u65F6\u95F4\u6233 */
|
|
415
|
+
GetTimestamp(): number;
|
|
416
|
+
/** \u7EBF\u7A0B\u4F11\u7720\uFF08\u6BEB\u79D2\uFF09 */
|
|
417
|
+
Sleep(ms: number): void;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// ============ EncryptHelper \u52A0\u5BC6 ============
|
|
421
|
+
|
|
422
|
+
interface V8EncryptHelper {
|
|
423
|
+
/** MD5 \u517C\u5BB9\u6458\u8981\uFF08\u4E0D\u662F\u52A0\u5BC6\uFF0C\u7981\u6B62\u7528\u4E8E\u65B0\u5BC6\u7801\u5B58\u50A8\uFF09 */
|
|
424
|
+
MD5Encrypt(text: string): string;
|
|
425
|
+
/** SHA1 \u517C\u5BB9\u6458\u8981\uFF08\u7981\u6B62\u7528\u4E8E\u65B0\u5BC6\u7801\u5B58\u50A8\uFF09 */
|
|
426
|
+
SHA1(text: string): string;
|
|
427
|
+
/** SHA256 \u6458\u8981 */
|
|
428
|
+
SHA256(text: string): string;
|
|
429
|
+
/** SHA512 \u6458\u8981 */
|
|
430
|
+
SHA512(text: string): string;
|
|
431
|
+
/** SHA256 Hex \u7F16\u7801 */
|
|
432
|
+
Sha256Hex(str: string): string;
|
|
433
|
+
/** HMAC-SHA256 \u7B7E\u540D */
|
|
434
|
+
HmacSha256(key: any, data: any): any;
|
|
435
|
+
/** DES \u52A0\u5BC6 */
|
|
436
|
+
DESEncode(text: string): string;
|
|
437
|
+
/** DES \u89E3\u5BC6 */
|
|
438
|
+
DESDecode(cipherText: string): string;
|
|
439
|
+
/** AES \u52A0\u5BC6 */
|
|
440
|
+
AESEncrypt(text: string, key: string): string;
|
|
441
|
+
/** AES \u89E3\u5BC6 */
|
|
442
|
+
AESDecrypt(cipherText: string, key: string): string;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// ============ Base64 \u7F16\u89E3\u7801 ============
|
|
446
|
+
|
|
447
|
+
interface V8Base64 {
|
|
448
|
+
/** Base64 \u7F16\u7801 */
|
|
449
|
+
StringToBase64(text: string): string;
|
|
450
|
+
/** Base64 \u89E3\u7801 */
|
|
451
|
+
Base64ToString(base64: string): string;
|
|
452
|
+
/** Base64 \u7F16\u7801\uFF08\u522B\u540D\uFF09 */
|
|
453
|
+
Encode(text: string): string;
|
|
454
|
+
/** Base64 \u89E3\u7801\uFF08\u522B\u540D\uFF09 */
|
|
455
|
+
Decode(base64: string): string;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// ============ MongoDB ============
|
|
459
|
+
|
|
460
|
+
interface V8MongoDB {
|
|
461
|
+
/** \u751F\u6210 MongoDB ObjectId */
|
|
462
|
+
NewId(): string;
|
|
463
|
+
/** \u65B0\u589E\u6587\u6863 { DbName, TableName, _FormData } */
|
|
464
|
+
AddFormData(params: { DbName: string; TableName: string; _FormData: Record<string, any>; [key: string]: any }): DosResult<any>;
|
|
465
|
+
/** \u4FEE\u6539\u6587\u6863 { DbName, TableName, Id, _FormData } */
|
|
466
|
+
UptFormData(params: { DbName: string; TableName: string; Id: string; _FormData: Record<string, any>; [key: string]: any }): DosResult<any>;
|
|
467
|
+
/** \u5220\u9664\u6587\u6863 { DbName, TableName, Id } */
|
|
468
|
+
DelFormData(params: { DbName: string; TableName: string; Id: string; [key: string]: any }): DosResult<any>;
|
|
469
|
+
/** \u67E5\u8BE2\u5217\u8868 { DbName, TableName, _Where } */
|
|
470
|
+
GetTableData(params: { DbName: string; TableName: string; _Where?: WhereCondition[]; [key: string]: any }): DosResult<any[]>;
|
|
471
|
+
/** \u67E5\u8BE2\u5355\u6761 { DbName, TableName, Id } */
|
|
472
|
+
GetFormData(params: { DbName: string; TableName: string; Id: string; [key: string]: any }): DosResult<any>;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// ============ MQ \u6D88\u606F\u961F\u5217 (RabbitMQ) ============
|
|
476
|
+
|
|
477
|
+
interface V8MQ {
|
|
478
|
+
/** \u53D1\u9001\u6D88\u606F\u5230\u6307\u5B9A\u961F\u5217 */
|
|
479
|
+
SendMsg(queueName: string, message: any): void;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// ============ WF \u5DE5\u4F5C\u6D41 ============
|
|
483
|
+
|
|
484
|
+
interface V8WF {
|
|
485
|
+
/** \u5BA1\u6279\u7C7B\u578B\uFF1AAgree/Disagree/Recall/Auto */
|
|
486
|
+
ApprovalType: string;
|
|
487
|
+
/** \u5BA1\u6279\u610F\u89C1 */
|
|
488
|
+
ApprovalIdea: string;
|
|
489
|
+
/** \u5F53\u524D\u8282\u70B9 */
|
|
490
|
+
CurrentNode: any;
|
|
491
|
+
/** \u4E0B\u4E00\u8282\u70B9 */
|
|
492
|
+
NextNode: any;
|
|
493
|
+
/** \u63A5\u6536\u4EBA */
|
|
494
|
+
NextTodoUsers: any;
|
|
495
|
+
/** \u5F3A\u5236\u6307\u5B9A\u5BA1\u6279\u4EBA */
|
|
496
|
+
ForceSelectUsers: any;
|
|
497
|
+
/** \u6D41\u7A0B\u6267\u884C\u7ED3\u679C */
|
|
498
|
+
WorkResult: any;
|
|
499
|
+
/** \u53D1\u8D77\u6D41\u7A0B */
|
|
500
|
+
StartWork(params: any, callback?: (result: any) => void): any;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
interface V8WFEngine {
|
|
504
|
+
StartWork(params: Record<string, any>, dbTrans?: V8DbTrans): Promise<DosResult<any>>;
|
|
505
|
+
SendWork(params: Record<string, any>, dbTrans?: V8DbTrans): Promise<DosResult<any>>;
|
|
506
|
+
HandOverWork(params: Record<string, any>): Promise<DosResult<any>>;
|
|
507
|
+
RecallWork(params: Record<string, any>): Promise<DosResult<any>>;
|
|
508
|
+
CancelFlow(params: Record<string, any>): Promise<DosResult<any>>;
|
|
509
|
+
GetNextNodeConfirmUsers(params: Record<string, any>): Promise<DosResult<any>>;
|
|
510
|
+
GetStartWFNode(params: Record<string, any>): Promise<DosResult<any>>;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// ============ Office \u6587\u6863 ============
|
|
514
|
+
|
|
515
|
+
interface V8ExcelCellStyle {
|
|
516
|
+
FontName?: string;
|
|
517
|
+
FontSize?: number;
|
|
518
|
+
FontColor?: string;
|
|
519
|
+
Bold?: boolean;
|
|
520
|
+
Italic?: boolean;
|
|
521
|
+
Underline?: boolean;
|
|
522
|
+
BackgroundColor?: string;
|
|
523
|
+
HorizontalAlignment?: 'Left' | 'Center' | 'Right' | 'Justify' | string;
|
|
524
|
+
VerticalAlignment?: 'Top' | 'Center' | 'Bottom' | string;
|
|
525
|
+
WrapText?: boolean;
|
|
526
|
+
ShrinkToFit?: boolean;
|
|
527
|
+
Rotation?: number;
|
|
528
|
+
NumberFormat?: string;
|
|
529
|
+
BorderStyle?: string;
|
|
530
|
+
BorderColor?: string;
|
|
531
|
+
BorderTopStyle?: string;
|
|
532
|
+
BorderTopColor?: string;
|
|
533
|
+
BorderRightStyle?: string;
|
|
534
|
+
BorderRightColor?: string;
|
|
535
|
+
BorderBottomStyle?: string;
|
|
536
|
+
BorderBottomColor?: string;
|
|
537
|
+
BorderLeftStyle?: string;
|
|
538
|
+
BorderLeftColor?: string;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
interface V8ExcelOptions {
|
|
542
|
+
SheetName?: string;
|
|
543
|
+
/** Excel \u5B57\u7B26\u5BBD\u5EA6\uFF0C\u8303\u56F4 0.1~255 */
|
|
544
|
+
DefaultColumnWidth?: number;
|
|
545
|
+
/** \u9ED8\u8BA4\u884C\u9AD8\uFF0C\u5355\u4F4D\u4E3A\u78C5\uFF08pt\uFF09 */
|
|
546
|
+
DefaultRowHeight?: number;
|
|
547
|
+
/** \u78C5\uFF08pt\uFF09\uFF0C\u6700\u5927 409.5 */
|
|
548
|
+
HeaderRowHeight?: number;
|
|
549
|
+
/** \u78C5\uFF08pt\uFF09\uFF0C\u6700\u5927 409.5 */
|
|
550
|
+
DataRowHeight?: number;
|
|
551
|
+
FreezeHeader?: boolean;
|
|
552
|
+
FreezeRows?: number;
|
|
553
|
+
FreezeColumns?: number;
|
|
554
|
+
AutoFilter?: boolean;
|
|
555
|
+
AutoFilterRange?: string;
|
|
556
|
+
AutoSizeColumns?: boolean;
|
|
557
|
+
ShowGridLines?: boolean;
|
|
558
|
+
Zoom?: number;
|
|
559
|
+
PrintOrientation?: 'Portrait' | 'Landscape' | string;
|
|
560
|
+
PaperSize?: 'A3' | 'A4' | 'A5' | 'Letter' | 'Legal' | string;
|
|
561
|
+
FitToWidth?: number;
|
|
562
|
+
FitToHeight?: number;
|
|
563
|
+
PrintArea?: string;
|
|
564
|
+
MarginTop?: number;
|
|
565
|
+
MarginRight?: number;
|
|
566
|
+
MarginBottom?: number;
|
|
567
|
+
MarginLeft?: number;
|
|
568
|
+
CenterHorizontally?: boolean;
|
|
569
|
+
CenterVertically?: boolean;
|
|
570
|
+
HeaderText?: string;
|
|
571
|
+
FooterText?: string;
|
|
572
|
+
ShowPageNumber?: boolean;
|
|
573
|
+
HeaderStyle?: V8ExcelCellStyle;
|
|
574
|
+
CellStyle?: V8ExcelCellStyle;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
interface V8ExcelLayoutCell {
|
|
578
|
+
/** A1 \u6216 A1:K10\uFF1B\u6837\u5F0F\u4F5C\u7528\u4E8E\u6574\u4E2A\u8303\u56F4\uFF0C\u503C/\u516C\u5F0F\u5199\u5165\u5DE6\u4E0A\u89D2 */
|
|
579
|
+
Range: string;
|
|
580
|
+
Value?: any;
|
|
581
|
+
Formula?: string;
|
|
582
|
+
DataType?: 'String' | 'Number' | 'Boolean' | 'DateTime' | 'Blank' | string;
|
|
583
|
+
Merge?: boolean;
|
|
584
|
+
Style?: V8ExcelCellStyle;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
interface V8ExcelLayoutColumn {
|
|
588
|
+
/** Excel \u5217\u5B57\u6BCD\uFF0C\u5982 A\u3001AA\uFF1B\u4E5F\u53EF\u7528\u4ECE 1 \u5F00\u59CB\u7684 Index */
|
|
589
|
+
Column?: string;
|
|
590
|
+
Index?: number;
|
|
591
|
+
Width?: number;
|
|
592
|
+
Hidden?: boolean;
|
|
593
|
+
AutoSize?: boolean;
|
|
594
|
+
MinWidth?: number;
|
|
595
|
+
MaxWidth?: number;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
interface V8ExcelLayoutRow {
|
|
599
|
+
/** \u4ECE 1 \u5F00\u59CB\u7684\u884C\u53F7 */
|
|
600
|
+
Row: number;
|
|
601
|
+
Height?: number;
|
|
602
|
+
Hidden?: boolean;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
interface V8ExcelLayoutRowGroup {
|
|
606
|
+
/** \u4ECE 1 \u5F00\u59CB\uFF0C\u751F\u6210 Excel \u539F\u751F\u53EF\u5C55\u5F00/\u6298\u53E0\u884C\u7EC4 */
|
|
607
|
+
StartRow: number;
|
|
608
|
+
EndRow: number;
|
|
609
|
+
Collapsed?: boolean;
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
interface V8ExcelLayout {
|
|
613
|
+
Cells?: V8ExcelLayoutCell[];
|
|
614
|
+
MergedRanges?: string[];
|
|
615
|
+
Columns?: V8ExcelLayoutColumn[];
|
|
616
|
+
Rows?: V8ExcelLayoutRow[];
|
|
617
|
+
RowGroups?: V8ExcelLayoutRowGroup[];
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
interface V8ExcelHeader {
|
|
621
|
+
Name: string;
|
|
622
|
+
Label: string;
|
|
623
|
+
Component?: string;
|
|
624
|
+
Type?: string;
|
|
625
|
+
Config?: string | Record<string, any>;
|
|
626
|
+
/** Excel \u5B57\u7B26\u5BBD\u5EA6 */
|
|
627
|
+
Width?: number;
|
|
628
|
+
ColumnWidth?: number;
|
|
629
|
+
AutoSize?: boolean;
|
|
630
|
+
MinWidth?: number;
|
|
631
|
+
MaxWidth?: number;
|
|
632
|
+
Hidden?: boolean;
|
|
633
|
+
/** \u78C5\uFF08pt\uFF09 */
|
|
634
|
+
HeaderHeight?: number;
|
|
635
|
+
/** \u78C5\uFF08pt\uFF09 */
|
|
636
|
+
RowHeight?: number;
|
|
637
|
+
NumberFormat?: string;
|
|
638
|
+
HeaderStyle?: V8ExcelCellStyle;
|
|
639
|
+
Style?: V8ExcelCellStyle;
|
|
640
|
+
[key: string]: any;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
interface V8ExcelSheetParam {
|
|
644
|
+
SheetName?: string;
|
|
645
|
+
ExcelData?: any[];
|
|
646
|
+
ExcelHeader?: V8ExcelHeader[];
|
|
647
|
+
ExcelLayout?: V8ExcelLayout;
|
|
648
|
+
ExcelOptions?: V8ExcelOptions;
|
|
649
|
+
FormEngineKey?: string;
|
|
650
|
+
TableId?: string;
|
|
651
|
+
_Where?: WhereCondition[];
|
|
652
|
+
[key: string]: any;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
interface V8OfficeImageParam {
|
|
656
|
+
FileByteBase64: string;
|
|
657
|
+
FileName?: string;
|
|
658
|
+
ContentType?: string;
|
|
659
|
+
Width?: number;
|
|
660
|
+
Height?: number;
|
|
661
|
+
X?: number;
|
|
662
|
+
Y?: number;
|
|
663
|
+
Alignment?: 'Left' | 'Center' | 'Right' | string;
|
|
664
|
+
Caption?: string;
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
interface V8OfficeWordParagraphParam {
|
|
668
|
+
Text: string;
|
|
669
|
+
Alignment?: 'Left' | 'Center' | 'Right' | 'Justify' | string;
|
|
670
|
+
Bold?: boolean;
|
|
671
|
+
Italic?: boolean;
|
|
672
|
+
Underline?: boolean;
|
|
673
|
+
FontFamily?: string;
|
|
674
|
+
FontSize?: number;
|
|
675
|
+
FontColor?: string;
|
|
676
|
+
SpacingBefore?: number;
|
|
677
|
+
SpacingAfter?: number;
|
|
678
|
+
LineSpacing?: number;
|
|
679
|
+
FirstLineIndent?: number;
|
|
680
|
+
PageBreakBefore?: boolean;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
interface V8OfficeTableParam {
|
|
684
|
+
Title?: string;
|
|
685
|
+
Headers?: string[];
|
|
686
|
+
Rows?: any[][];
|
|
687
|
+
ColumnWidths?: number[];
|
|
688
|
+
Alignment?: string;
|
|
689
|
+
HeaderBold?: boolean;
|
|
690
|
+
HeaderBackgroundColor?: string;
|
|
691
|
+
HeaderFontColor?: string;
|
|
692
|
+
BorderColor?: string;
|
|
693
|
+
FontSize?: number;
|
|
694
|
+
X?: number;
|
|
695
|
+
Y?: number;
|
|
696
|
+
Width?: number;
|
|
697
|
+
Height?: number;
|
|
698
|
+
CellBackgroundColor?: string;
|
|
699
|
+
CellFontColor?: string;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
interface V8Office {
|
|
703
|
+
/** \u53D1\u9001\u90AE\u4EF6 */
|
|
704
|
+
SendEmail(params: any): DosResult<any>;
|
|
705
|
+
/** \u5BFC\u51FA\u6807\u51C6\u8868\u683C\u6216\u9AD8\u7EA7\u81EA\u7531\u5E03\u5C40 Excel\uFF1B\u591A Sheet \u4F7F\u7528 ExcelSheets\uFF08Sheets \u4E3A\u517C\u5BB9\u522B\u540D\uFF09 */
|
|
706
|
+
ExportExcel(params: {
|
|
707
|
+
OsClient?: string;
|
|
708
|
+
ExcelData?: any[];
|
|
709
|
+
ExcelHeader?: V8ExcelHeader[];
|
|
710
|
+
ExcelLayout?: V8ExcelLayout;
|
|
711
|
+
ExcelOptions?: V8ExcelOptions;
|
|
712
|
+
ExcelSheets?: V8ExcelSheetParam[];
|
|
713
|
+
Sheets?: V8ExcelSheetParam[];
|
|
714
|
+
[key: string]: any;
|
|
715
|
+
}): DosResult<any>;
|
|
716
|
+
/** Excel \u5B57\u8282\u8F6C\u5217\u8868 */
|
|
717
|
+
ExcelToList(params: { FileByteBase64: string; SheetIndex?: number; [key: string]: any }): DosResult<any[]>;
|
|
718
|
+
/** \u517C\u5BB9\u65E7\u7248\u7EAF\u6587\u672C Word \u5BFC\u51FA */
|
|
719
|
+
ExportWordText(params: { Title?: string; Content?: string; Lines?: string[]; [key: string]: any }): DosResult<any>;
|
|
720
|
+
/** \u5BFC\u51FA\u5BCC\u6587\u672C Word\uFF08\u6BB5\u843D\u3001\u7AE0\u8282\u3001\u8868\u683C\u3001\u56FE\u7247\u3001\u9875\u7709\u9875\u811A\u3001\u9875\u7801\uFF09 */
|
|
721
|
+
ExportWord(params: {
|
|
722
|
+
Title?: string;
|
|
723
|
+
Subtitle?: string;
|
|
724
|
+
Content?: string;
|
|
725
|
+
Lines?: string[];
|
|
726
|
+
Paragraphs?: V8OfficeWordParagraphParam[];
|
|
727
|
+
Sections?: Array<{
|
|
728
|
+
Heading?: string;
|
|
729
|
+
HeadingLevel?: number;
|
|
730
|
+
Content?: string;
|
|
731
|
+
Paragraphs?: V8OfficeWordParagraphParam[];
|
|
732
|
+
Tables?: V8OfficeTableParam[];
|
|
733
|
+
Images?: V8OfficeImageParam[];
|
|
734
|
+
PageBreakBefore?: boolean;
|
|
735
|
+
}>;
|
|
736
|
+
Tables?: V8OfficeTableParam[];
|
|
737
|
+
Images?: V8OfficeImageParam[];
|
|
738
|
+
HeaderText?: string;
|
|
739
|
+
FooterText?: string;
|
|
740
|
+
ShowPageNumber?: boolean;
|
|
741
|
+
[key: string]: any;
|
|
742
|
+
}): DosResult<any>;
|
|
743
|
+
/** \u5BFC\u51FA PowerPoint\uFF08\u591A\u9875\u3001\u6587\u672C\u3001\u9879\u76EE\u7B26\u53F7\u3001\u8868\u683C\u3001\u56FE\u7247\u3001\u4E3B\u9898\u3001\u9875\u7801\uFF09 */
|
|
744
|
+
ExportPowerPoint(params: {
|
|
745
|
+
Title?: string;
|
|
746
|
+
Author?: string;
|
|
747
|
+
Subject?: string;
|
|
748
|
+
Keywords?: string;
|
|
749
|
+
Company?: string;
|
|
750
|
+
SlideWidth?: number;
|
|
751
|
+
SlideHeight?: number;
|
|
752
|
+
FontFamily?: string;
|
|
753
|
+
BackgroundColor?: string;
|
|
754
|
+
TitleColor?: string;
|
|
755
|
+
TextColor?: string;
|
|
756
|
+
TitleFontSize?: number;
|
|
757
|
+
BodyFontSize?: number;
|
|
758
|
+
ShowSlideNumber?: boolean;
|
|
759
|
+
Slides?: Array<{
|
|
760
|
+
Layout?: 'TitleSlide' | 'TitleAndContent' | string;
|
|
761
|
+
Title?: string;
|
|
762
|
+
Subtitle?: string;
|
|
763
|
+
Content?: string;
|
|
764
|
+
Bullets?: string[];
|
|
765
|
+
TextItems?: Array<{ Text: string; Level?: number; Bullet?: boolean; Bold?: boolean; Italic?: boolean; FontSize?: number; FontColor?: string; Alignment?: string }>;
|
|
766
|
+
Images?: V8OfficeImageParam[];
|
|
767
|
+
Tables?: V8OfficeTableParam[];
|
|
768
|
+
[key: string]: any;
|
|
769
|
+
}>;
|
|
770
|
+
[key: string]: any;
|
|
771
|
+
}): DosResult<any>;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
// ============ HDFS \u5206\u5E03\u5F0F\u6587\u4EF6 ============
|
|
775
|
+
|
|
776
|
+
interface V8HDFS {
|
|
777
|
+
Upload(params: Record<string, any>): Promise<DosResult<any>>;
|
|
778
|
+
GetPrivateFileUrl(params: Record<string, any>): Promise<DosResult<any>>;
|
|
779
|
+
/** \u53EF\u4FE1\u7BA1\u7406\u80FD\u529B\uFF0C\u4E0D\u8981\u76F4\u63A5\u66B4\u9732\u7ED9\u666E\u901A\u6216\u533F\u540D\u63A5\u53E3 */
|
|
780
|
+
GetPrivateFileByte(params: Record<string, any>): Promise<DosResult<any>>;
|
|
781
|
+
/** \u53EF\u4FE1\u7BA1\u7406\u80FD\u529B\uFF0C\u4E0D\u8981\u76F4\u63A5\u66B4\u9732\u7ED9\u666E\u901A\u6216\u533F\u540D\u63A5\u53E3 */
|
|
782
|
+
ListObjects(params: Record<string, any>): Promise<DosResult<any>>;
|
|
783
|
+
/** \u53EF\u4FE1\u7BA1\u7406\u80FD\u529B\uFF0C\u4E0D\u8981\u76F4\u63A5\u66B4\u9732\u7ED9\u666E\u901A\u6216\u533F\u540D\u63A5\u53E3 */
|
|
784
|
+
DeleteObject(params: Record<string, any>): Promise<DosResult<any>>;
|
|
785
|
+
CreateFolder(params: Record<string, any>): Promise<DosResult<any>>;
|
|
786
|
+
RenameObject(params: Record<string, any>): Promise<DosResult<any>>;
|
|
787
|
+
MoveObject(params: Record<string, any>): Promise<DosResult<any>>;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
// ============ ModuleEngine \u591A\u8868\u8054\u67E5 ============
|
|
791
|
+
|
|
792
|
+
interface V8ModuleEngine {
|
|
793
|
+
/** \u5F53\u524D\u7528\u6237\u53EF\u89C1\u6A21\u5757\u7684\u6570\u636E\u5217\u8868 */
|
|
794
|
+
GetTableData(params: Record<string, any>): DosResult<any[]>;
|
|
795
|
+
GetTableDataAsync(params: Record<string, any>): Promise<DosResult<any[]>>;
|
|
796
|
+
GetTableDataCount(params: Record<string, any>): DosResult<any[]>;
|
|
797
|
+
GetTableDataCountAsync(params: Record<string, any>): Promise<DosResult<any[]>>;
|
|
798
|
+
GetTableDataTree(params: Record<string, any>): DosResult<any[]>;
|
|
799
|
+
GetTableDataTreeAsync(params: Record<string, any>): Promise<DosResult<any[]>>;
|
|
800
|
+
GetModuleModel(params: { Id?: string; ModuleEngineKey?: string; [key: string]: any }): Promise<DosResult<any>>;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
// ============ Sms \u77ED\u4FE1 ============
|
|
804
|
+
|
|
805
|
+
interface V8Sms {
|
|
806
|
+
Send(phone: string, templateCode: string, params: any): DosResult<any>;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
// ============ TranslateEngine \u7FFB\u8BD1 ============
|
|
810
|
+
|
|
811
|
+
interface V8TranslateEngine {
|
|
812
|
+
/** \u4F7F\u7528\u5F53\u524D\u79DF\u6237\u914D\u7F6E\u7FFB\u8BD1\u6587\u672C */
|
|
813
|
+
Translate(text: string, to: string, from?: string): DosResult<any>;
|
|
814
|
+
Translate(params: Record<string, any>): DosResult<any>;
|
|
815
|
+
/** \u4ECE diy_lang \u7F13\u5B58\u83B7\u53D6\u8BED\u8A00\u6587\u672C */
|
|
816
|
+
GetLang(key: string, lang?: string): string;
|
|
817
|
+
GetLangData(key: string): Record<string, any>;
|
|
818
|
+
/** \u83B7\u53D6\u8BED\u8A00\u4EE3\u7801 */
|
|
819
|
+
GetLangCode(key: string): string;
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
// ============ Spider \u722C\u866B ============
|
|
823
|
+
|
|
824
|
+
interface V8Spider {
|
|
825
|
+
/** \u9AD8\u98CE\u9669Worker\u80FD\u529B\uFF1A\u76EE\u6807\u5730\u5740\u3001\u79DF\u6237\u4F1A\u8BDD\u3001\u5E76\u53D1\u548C\u8FD0\u884C\u65F6\u95F4\u5FC5\u987B\u53D7\u9650 */
|
|
826
|
+
GetRenderHtml(params: Record<string, any>): Promise<DosResult<any>>;
|
|
827
|
+
OpenSession(params: Record<string, any>): Promise<DosResult<any>>;
|
|
828
|
+
GetSession(params: Record<string, any>): Promise<DosResult<any>>;
|
|
829
|
+
CloseSession(params: Record<string, any>): Promise<DosResult<any>>;
|
|
830
|
+
RunRecipe(params: Record<string, any>): Promise<DosResult<any>>;
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
// ============ System \u547D\u540D\u7A7A\u95F4\uFF08.NET \u4E92\u64CD\u4F5C\uFF09 ============
|
|
834
|
+
|
|
835
|
+
declare namespace System {
|
|
836
|
+
namespace DateTime {
|
|
837
|
+
/** \u5F53\u524D\u65E5\u671F\u65F6\u95F4 */
|
|
838
|
+
const Now: { ToString(format?: string): string; Ticks: number };
|
|
839
|
+
const UtcNow: { ToString(format?: string): string; Ticks: number };
|
|
840
|
+
function Parse(dateString: string): any;
|
|
841
|
+
}
|
|
842
|
+
namespace Guid {
|
|
843
|
+
/** \u751F\u6210\u65B0 GUID */
|
|
844
|
+
function NewGuid(): { ToString(format?: string): string };
|
|
845
|
+
}
|
|
846
|
+
namespace Convert {
|
|
847
|
+
function ToInt32(value: any): number;
|
|
848
|
+
function ToDouble(value: any): number;
|
|
849
|
+
function ToString(value: any): string;
|
|
850
|
+
function ToBase64String(bytes: any): string;
|
|
851
|
+
function FromBase64String(base64: string): any;
|
|
852
|
+
}
|
|
853
|
+
namespace Math {
|
|
854
|
+
function Abs(value: number): number;
|
|
855
|
+
function Round(value: number, digits?: number): number;
|
|
856
|
+
function Floor(value: number): number;
|
|
857
|
+
function Ceiling(value: number): number;
|
|
858
|
+
function Max(a: number, b: number): number;
|
|
859
|
+
function Min(a: number, b: number): number;
|
|
860
|
+
}
|
|
861
|
+
namespace Threading {
|
|
862
|
+
namespace Thread {
|
|
863
|
+
function Sleep(ms: number): void;
|
|
864
|
+
}
|
|
865
|
+
namespace Tasks {
|
|
866
|
+
namespace Task {
|
|
867
|
+
/** @deprecated V8Engine.Run \u8FD4\u56DE\u540E\u4E0A\u4E0B\u6587\u4F1A\u91CA\u653E\uFF1B\u8BF7\u4F7F\u7528 await \u6216\u540E\u53F0\u4EFB\u52A1/Job/MQ/outbox */
|
|
868
|
+
function Run(action: () => void): void;
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
// ============ V8 \u4E3B\u5BF9\u8C61 ============
|
|
875
|
+
|
|
876
|
+
declare const V8: {
|
|
877
|
+
/** \u5F53\u524D\u5E94\u7528\u6807\u8BC6 */
|
|
878
|
+
OsClient: string;
|
|
879
|
+
/** \u5F53\u524D\u7528\u6237ID */
|
|
880
|
+
UserId: string;
|
|
881
|
+
/** \u5F53\u524D\u7528\u6237\u540D */
|
|
882
|
+
UserName: string;
|
|
883
|
+
/** \u5F53\u524D\u767B\u5F55\u7528\u6237\u4FE1\u606F */
|
|
884
|
+
CurrentUser: {
|
|
885
|
+
Id: string;
|
|
886
|
+
Account: string;
|
|
887
|
+
Name: string;
|
|
888
|
+
RoleIds: string;
|
|
889
|
+
RoleName: string;
|
|
890
|
+
DeptId: string;
|
|
891
|
+
DeptIds: string;
|
|
892
|
+
DeptName: string;
|
|
893
|
+
Level: number;
|
|
894
|
+
OsClient: string;
|
|
895
|
+
[key: string]: any;
|
|
896
|
+
};
|
|
897
|
+
/** \u5F53\u524D\u79DF\u6237\u975E\u654F\u611F\u7CFB\u7EDF\u914D\u7F6E\u7684\u8131\u654F\u526F\u672C\uFF1B\u5BC6\u7801\u3001Token\u3001Key\u3001Secret\u3001Connection\u7B49\u5B57\u6BB5\u4E0D\u4F1A\u6CE8\u5165 */
|
|
898
|
+
SysConfig: Record<string, any>;
|
|
899
|
+
/** \u5F53\u524DV8\u7247\u6BB5\u7684\u6709\u6548\u8D44\u6E90\u9884\u7B97\u4E0E\u5D4C\u5957\u6DF1\u5EA6\uFF1B\u5185\u5B58\u5B57\u6BB5\u8868\u793A\u7D2F\u8BA1\u5206\u914D\uFF0C\u4E0D\u662F\u5B9E\u65F6\u5806 */
|
|
900
|
+
Limits: V8ExecutionLimits;
|
|
901
|
+
/** \u8BF7\u6C42\u53C2\u6570\uFF08\u524D\u7AEF\u4F20\u5165\u7684\u53C2\u6570\u3001URL\u53C2\u6570\u7B49\uFF09 */
|
|
902
|
+
Param: Record<string, any> & {
|
|
903
|
+
_Where?: WhereCondition[] | DiyWhere[];
|
|
904
|
+
[key: string]: any;
|
|
905
|
+
};
|
|
906
|
+
/** \u8BF7\u6C42\u5934 */
|
|
907
|
+
Header: Record<string, string>;
|
|
908
|
+
/** \u5F53\u524D\u8868\u5355\u6570\u636E\uFF08\u8868\u5355\u5F15\u64CEV8\u4E8B\u4EF6\u4E2D\u53EF\u7528\uFF09 */
|
|
909
|
+
Form: Record<string, any>;
|
|
910
|
+
/** \u63D0\u4EA4\u524D\u7684\u65E7\u8868\u5355\u6570\u636E\uFF08\u8868\u5355\u5F15\u64CEV8\u4E8B\u4EF6\u4E2D\u53EF\u7528\uFF09 */
|
|
911
|
+
OldForm: Record<string, any>;
|
|
912
|
+
/** \u8868\u6A21\u578B\u4FE1\u606F\uFF08\u4EC5\u5728\u8868\u5355\u5F15\u64CEV8\u4E8B\u4EF6\u4E2D\u53EF\u7528\uFF09 */
|
|
913
|
+
TableModel: any;
|
|
914
|
+
/** \u5173\u8054\u8868\u683C\u6570\u636E\uFF08\u8868\u5355\u5F15\u64CEV8\u4E8B\u4EF6\u4E2D\u53EF\u7528\uFF09 */
|
|
915
|
+
TableData: any[];
|
|
916
|
+
/** \u5F53\u524D\u884C\u7D22\u5F15 */
|
|
917
|
+
RowIndex: number;
|
|
918
|
+
/** V8\u4EE3\u7801\u8FD4\u56DE\u503C\uFF0C\u8D4B\u503C\u540E\u4F5C\u4E3A\u63A5\u53E3\u8FD4\u56DE\u5185\u5BB9 */
|
|
919
|
+
Result: any;
|
|
920
|
+
/** \u8868\u5355\u63D0\u4EA4\u52A8\u4F5C\uFF08Insert/Update/Delete\uFF0C\u4EC5\u8868\u5355\u5F15\u64CEV8\u4E8B\u4EF6\u4E2D\u53EF\u7528\uFF09 */
|
|
921
|
+
FormSubmitAction: 'Insert' | 'Update' | 'Delete';
|
|
922
|
+
/** \u4E8B\u4EF6\u540D\u79F0\uFF08\u4EC5\u8868\u5355\u5F15\u64CEV8\u4E8B\u4EF6\u4E2D\u53EF\u7528\uFF09 */
|
|
923
|
+
EventName: string;
|
|
924
|
+
/** \u8C03\u7528\u7C7B\u578B\uFF08Server=\u540E\u7AEF / Client=\u524D\u7AEF\uFF09 */
|
|
925
|
+
InvokeType: 'Server' | 'Client';
|
|
926
|
+
/** \u5F53\u524D\u79DF\u6237SaaS\u914D\u7F6E\u7684\u8131\u654F\u526F\u672C\uFF1B\u57FA\u7840\u8BBE\u65BD\u8FDE\u63A5\u4E0E\u8BA4\u8BC1\u5BC6\u94A5\u4E0D\u4F1A\u6CE8\u5165 */
|
|
927
|
+
OsClientModel: Record<string, any>;
|
|
928
|
+
|
|
929
|
+
/** \u8868\u5355\u5F15\u64CE\uFF08CRUD \u64CD\u4F5C\uFF09 */
|
|
930
|
+
FormEngine: V8FormEngine;
|
|
931
|
+
/** \u63A5\u53E3\u5F15\u64CE\uFF08\u8C03\u7528\u5176\u4ED6\u63A5\u53E3\uFF09 */
|
|
932
|
+
ApiEngine: V8ApiEngine;
|
|
933
|
+
/** \u6570\u636E\u6E90\u5F15\u64CE\uFF08\u5F3A\u5236\u5F53\u524D\u79DF\u6237\uFF09 */
|
|
934
|
+
DataSourceEngine: V8DataSourceEngine;
|
|
935
|
+
/** \u6A21\u5757\u5F15\u64CE\uFF08\u591A\u8868\u8054\u67E5\uFF09 */
|
|
936
|
+
ModuleEngine: V8ModuleEngine;
|
|
937
|
+
/** Redis \u7F13\u5B58 */
|
|
938
|
+
Cache: V8Cache;
|
|
939
|
+
/** HTTP \u8BF7\u6C42 */
|
|
940
|
+
Http: V8Http;
|
|
941
|
+
/** \u4E3B\u6570\u636E\u5E93\uFF08\u8BFB\u5199\uFF09 */
|
|
942
|
+
Db: V8Db;
|
|
943
|
+
/** \u4ECE\u6570\u636E\u5E93\uFF08\u53EA\u8BFB\uFF09 */
|
|
944
|
+
DbRead: V8Db;
|
|
945
|
+
/** \u6570\u636E\u5E93\u4E8B\u52A1 */
|
|
946
|
+
DbTrans: V8DbTrans;
|
|
947
|
+
/** \u5F53\u524D\u79DF\u6237\u5DF2\u914D\u7F6E\u7684\u6269\u5C55\u6570\u636E\u5E93\uFF1B\u4E5F\u53EF\u7528 V8.Dbs.Open \u4E34\u65F6\u76F4\u8FDE\uFF1B\u4E0D\u80FD\u901A\u8FC7OsClient\u8DE8\u79DF\u6237\u53D6\u8FDE\u63A5 */
|
|
948
|
+
Dbs: Record<string, V8Db> & {
|
|
949
|
+
/** \u6309\u7C7B\u578B\u548C\u8FDE\u63A5\u5B57\u7B26\u4E32\u521B\u5EFA\u4EC5\u5F53\u524D\u8BF7\u6C42\u4F7F\u7528\u7684\u4E34\u65F6\u6570\u636E\u5E93\u4F1A\u8BDD */
|
|
950
|
+
Open(databaseType: MicroiDatabaseType, connectionString: string): V8Db;
|
|
951
|
+
};
|
|
952
|
+
/** \u5185\u7F6E\u65B9\u6CD5 */
|
|
953
|
+
Method: V8Method;
|
|
954
|
+
/** \u52A8\u4F5C */
|
|
955
|
+
Action: V8Action;
|
|
956
|
+
/** \u52A0\u5BC6\u52A9\u624B */
|
|
957
|
+
EncryptHelper: V8EncryptHelper;
|
|
958
|
+
/** Base64 \u7F16\u89E3\u7801 */
|
|
959
|
+
Base64: V8Base64;
|
|
960
|
+
/** MongoDB */
|
|
961
|
+
MongoDb: V8MongoDB;
|
|
962
|
+
/** \u6D88\u606F\u961F\u5217 */
|
|
963
|
+
MQ: V8MQ;
|
|
964
|
+
/** \u5DE5\u4F5C\u6D41\u5F15\u64CE */
|
|
965
|
+
WF: V8WF;
|
|
966
|
+
/** \u5DE5\u4F5C\u6D41\u64CD\u4F5C\u5F15\u64CE\uFF08\u5F3A\u5236\u5F53\u524D\u79DF\u6237\u548C\u5F53\u524D\u7528\u6237\u8303\u56F4\uFF09 */
|
|
967
|
+
WFEngine: V8WFEngine;
|
|
968
|
+
/** \u77ED\u4FE1 */
|
|
969
|
+
Sms: V8Sms;
|
|
970
|
+
/** \u7FFB\u8BD1\u5F15\u64CE */
|
|
971
|
+
TranslateEngine: V8TranslateEngine;
|
|
972
|
+
/** \u5206\u5E03\u5F0F\u6587\u4EF6 */
|
|
973
|
+
HDFS: V8HDFS;
|
|
974
|
+
/** Office \u6587\u6863\u64CD\u4F5C */
|
|
975
|
+
Office: V8Office;
|
|
976
|
+
/** \u722C\u866B */
|
|
977
|
+
Spider: V8Spider;
|
|
978
|
+
/** IP \u5DE5\u5177 */
|
|
979
|
+
IPHelper: {
|
|
980
|
+
GetClientIP(): string;
|
|
981
|
+
};
|
|
982
|
+
/** \u65E5\u5FD7 */
|
|
983
|
+
Log: {
|
|
984
|
+
Info(msg: string): void;
|
|
985
|
+
Warn(msg: string): void;
|
|
986
|
+
Error(msg: string): void;
|
|
987
|
+
Debug(msg: string): void;
|
|
988
|
+
};
|
|
989
|
+
/** \u63A5\u6536\u4E0A\u4F20\u7684\u6587\u4EF6\u6570\u636E */
|
|
990
|
+
FilesByteBase64: any;
|
|
991
|
+
/** \u6307\u5B9A\u4E0D\u4FDD\u5B58\u7684\u5B57\u6BB5\uFF08\u6570\u636E\u8131\u654F\uFF0CV8\u4E8B\u4EF6\u4E2D\uFF09 */
|
|
992
|
+
NotSaveField: string[];
|
|
993
|
+
/** DataFilter\u4E8B\u4EF6\u4E2D\u7684\u7F13\u5B58\u6570\u636E */
|
|
994
|
+
CacheData: any;
|
|
995
|
+
/** \u6D41\u7A0B\u6761\u4EF6\u5224\u65ADV8\u4E2D\u8BBE\u7F6E\u6D41\u8F6C\u65B9\u5411 */
|
|
996
|
+
LineValue: any;
|
|
997
|
+
/** \u6D41\u7A0B\u6761\u4EF6\u5224\u65ADV8\u4E2D\u76F4\u63A5\u6307\u5B9A\u4E0B\u4E00\u8282\u70B9Id */
|
|
998
|
+
NextNodeId: string;
|
|
999
|
+
/** MQTT\u4E0A\u4E0B\u6587\uFF08MQTT\u4E8B\u4EF6\u4E2D\u53EF\u7528\uFF09 */
|
|
1000
|
+
MQTT: {
|
|
1001
|
+
ClientId: string;
|
|
1002
|
+
Topic: string;
|
|
1003
|
+
Payload: string;
|
|
1004
|
+
};
|
|
1005
|
+
};
|
|
1006
|
+
|
|
1007
|
+
// ============ console ============
|
|
1008
|
+
|
|
1009
|
+
declare const console: {
|
|
1010
|
+
log(...args: any[]): void;
|
|
1011
|
+
error(...args: any[]): void;
|
|
1012
|
+
warn(...args: any[]): void;
|
|
1013
|
+
info(...args: any[]): void;
|
|
1014
|
+
};
|
|
1015
|
+
|
|
1016
|
+
// ============ \u5168\u5C40\u51FD\u6570 ============
|
|
1017
|
+
|
|
1018
|
+
/** @deprecated \u4E0D\u80FD\u4FDD\u8BC1\u8BF7\u6C42\u8FD4\u56DE\u540E\u6267\u884C\uFF1B\u8BF7\u4F7F\u7528 await \u6216\u540E\u53F0\u4EFB\u52A1/Job/MQ/outbox */
|
|
1019
|
+
declare function setTimeout(callback: () => void, delay: number): number;
|
|
1020
|
+
declare function clearTimeout(timerId: number): void;
|
|
1021
|
+
/** \u83B7\u53D6\u5F53\u524D\u65E5\u671F\u65F6\u95F4\u5B57\u7B26\u4E32 */
|
|
1022
|
+
declare function DateNow(format?: string): string;
|
|
1023
|
+
/** \u65E5\u671F\u683C\u5F0F\u5316 */
|
|
1024
|
+
declare function DateFormat(date: any, format: string): string;
|
|
1025
|
+
/** \u65E5\u671F\u52A0\u51CF\uFF08unit: s/m/h/d/w/q/M/y\uFF0Camount \u4E3A\u6B63\u8D1F\u6574\u6570\uFF09 */
|
|
1026
|
+
declare function DateAdd(date: any, unit: string, amount: number, format?: string): string;
|
|
1027
|
+
/** JSON \u5E8F\u5217\u5316 */
|
|
1028
|
+
declare function JSON_Encode(obj: any): string;
|
|
1029
|
+
/** JSON \u53CD\u5E8F\u5217\u5316 */
|
|
1030
|
+
declare function JSON_Decode(json: string): any;
|
|
1031
|
+
`,An="microi.skills",qt=".microi-skills-manifest.json",bi="microi-skills.meta.json",wt=".microi-ai-docs-manifest.json",Di="microi-ai-doc-guard:",Vn="\n\n## \u5206\u5E03\u5F0F\u90E8\u7F72\u4E0E\u91CD\u542F\u5B89\u5168\u89C4\u8303\uFF08\u5F3A\u5236\uFF09\n\nMicroi \u5E73\u53F0\u540E\u7AEF\u529F\u80FD\u5FC5\u987B\u9ED8\u8BA4\u6309\u591A\u8282\u70B9\u90E8\u7F72\u8BBE\u8BA1\uFF1A\u591A\u4E2A API/Worker \u8282\u70B9\u4F4D\u4E8E\u540C\u4E00\u8D1F\u8F7D\u5747\u8861\u5165\u53E3\u4E4B\u540E\uFF0C\u5171\u4EAB\u4E1A\u52A1\u6570\u636E\u5E93\u3001MongoDB \u548C Redis\uFF0C\u5E76\u53EF\u80FD\u5728\u8BF7\u6C42\u6267\u884C\u8FC7\u7A0B\u4E2D\u6EDA\u52A8\u53D1\u5E03\u3001\u786C\u91CD\u542F\u6216\u53D1\u751F\u7F51\u7EDC\u5206\u533A\u3002\u4E0D\u5F97\u5148\u6309\u5355\u673A\u5B9E\u73B0\u3001\u4E0A\u7EBF\u540E\u518D\u8865\u5206\u5E03\u5F0F\u4FDD\u62A4\u3002\n\n- \u8FDB\u7A0B\u5185 `static`\u3001\u5355\u4F8B\u3001\u5185\u5B58\u5B57\u5178\u3001\u672C\u673A\u5B9A\u65F6\u5668\u548C\u672C\u5730\u6587\u4EF6\u53EA\u80FD\u7528\u4E8E\u5355\u8282\u70B9\u4F18\u5316\u3001\u7F13\u51B2\u6216\u8BCA\u65AD\uFF0C\u4E0D\u80FD\u4F5C\u4E3A\u5168\u5C40\u552F\u4E00\u72B6\u6001\u3001\u5168\u5C40\u9501\u3001\u4EFB\u52A1\u662F\u5426\u6267\u884C\u8FC7\u6216\u4E1A\u52A1\u5B8C\u6210\u7684\u4E8B\u5B9E\u6E90\u3002\u4F1A\u8DE8\u8BF7\u6C42\u3001\u8DE8\u8282\u70B9\u6216\u8DE8\u91CD\u542F\u4F7F\u7528\u7684\u72B6\u6001\u5FC5\u987B\u8FDB\u5165\u5171\u4EAB\u6570\u636E\u5E93\u3001Redis \u6216\u53EF\u9760\u6D88\u606F\u7CFB\u7EDF\uFF0C\u5E76\u6309 `OsClient` \u9694\u79BB\u3002\n- `Microi.Job`\u3001\u5B9A\u65F6\u626B\u63CF\u3001\u6D88\u606F\u6D88\u8D39\u3001\u8865\u507F\u4EFB\u52A1\u548C\u542F\u52A8\u521D\u59CB\u5316\u7B49\u53EF\u80FD\u88AB\u6BCF\u4E2A\u8282\u70B9\u540C\u65F6\u89E6\u53D1\u7684\u903B\u8F91\uFF0C\u5FC5\u987B\u4F7F\u7528\u5E26\u79DF\u7EA6\u548C\u8D85\u65F6\u7684\u5206\u5E03\u5F0F\u9501\u6216\u6570\u636E\u5E93\u62A2\u5360\uFF1B\u9501 Key \u81F3\u5C11\u5305\u542B\u79DF\u6237\u548C\u4EFB\u52A1\u552F\u4E00\u6807\u8BC6\u3002\u9501\u5FC5\u987B\u6709\u552F\u4E00\u6301\u6709\u8005\u4EE4\u724C\u3001\u7EED\u79DF\u3001\u8D85\u65F6\u81EA\u52A8\u91CA\u653E\u548C\u201C\u4EC5\u6301\u6709\u8005\u53EF\u91CA\u653E\u201D\u8BED\u4E49\uFF0C\u5FC5\u8981\u65F6\u589E\u52A0 fencing token\uFF0C\u7981\u6B62\u53EA\u7528 `static bool`\u3001\u666E\u901A `lock` \u6216\u4E0D\u5E26\u8FC7\u671F\u65F6\u95F4\u7684 Redis Key\u3002\n- \u5206\u5E03\u5F0F\u9501\u53EA\u80FD\u51CF\u5C11\u5E76\u53D1\u6267\u884C\uFF0C\u4E0D\u80FD\u4EE3\u66FF\u4E1A\u52A1\u5E42\u7B49\u3002\u4EFB\u52A1\u3001\u63A5\u53E3\u91CD\u8BD5\u3001\u6D88\u606F\u91CD\u6295\u548C\u8DE8\u8282\u70B9\u6545\u969C\u8F6C\u79FB\u5FC5\u987B\u540C\u65F6\u4F7F\u7528\u7A33\u5B9A\u5E42\u7B49\u952E\u3001\u6570\u636E\u5E93\u552F\u4E00\u7EA6\u675F/\u6761\u4EF6\u66F4\u65B0\u3001\u72B6\u6001\u673A\u6216 outbox/inbox\uFF1B\u6263\u6B3E\u3001\u5E93\u5B58\u3001\u79EF\u5206\u3001\u6D41\u6C34\u7B49\u526F\u4F5C\u7528\u4E0D\u5F97\u56E0\u4E3A\u9501\u8FC7\u671F\u3001\u8282\u70B9\u6682\u505C\u6216\u91CD\u8BD5\u800C\u6267\u884C\u4E24\u6B21\u3002\n- \u7528\u6237\u4F1A\u8BDD\u3001\u4E34\u65F6\u7968\u636E\u3001\u53BB\u91CD\u7A97\u53E3\u3001\u8FDB\u5EA6\u548C\u4EFB\u52A1\u79DF\u7EA6\u9ED8\u8BA4\u653E\u5171\u4EAB Redis/\u6570\u636E\u5E93\uFF1B\u672C\u673A\u7F13\u5B58\u5FC5\u987B\u5141\u8BB8\u4E22\u5931\uFF0C\u5E76\u901A\u8FC7\u7248\u672C\u53F7\u3001\u77ED TTL\u3001\u53D1\u5E03\u8BA2\u9605\u5931\u6548\u6216\u6570\u636E\u5E93\u56DE\u6E90\u5BB9\u5FCD\u8282\u70B9\u95F4\u4E0D\u4E00\u81F4\u3002\u7981\u6B62\u628A\u7528\u6237\u56FA\u5B9A\u7ED1\u5B9A\u5230\u67D0\u8282\u70B9\u624D\u80FD\u4FDD\u8BC1\u6B63\u786E\u6027\u3002\n- \u6BCF\u4E2A\u8282\u70B9\u53EF\u4EE5\u4FDD\u7559\u72EC\u7ACB\u5F02\u6B65\u961F\u5217\uFF0C\u4F46\u4E8B\u4EF6\u5FC5\u987B\u5728\u4EA7\u751F\u65F6\u5206\u914D\u5168\u5C40\u552F\u4E00 `EventId`\uFF0C\u6D88\u8D39\u7AEF\u6309\u8BE5 Id \u5E42\u7B49\u5199\u5165\u3002\u6545\u969C spool/WAL \u5FC5\u987B\u4F7F\u7528\u6301\u4E45\u5377\uFF0C\u8BBE\u7F6E\u7A33\u5B9A\u4E14\u552F\u4E00\u7684 `MICROI_NODE_ID`\uFF0C\u6587\u4EF6\u540D\u5305\u542B\u8282\u70B9\u6807\u8BC6\uFF1B\u5171\u4EAB\u76EE\u5F55\u4E5F\u5FC5\u987B\u5141\u8BB8\u591A\u4E2A\u8282\u70B9\u5E76\u53D1\u91CD\u653E\u4E14\u4E0D\u4EA7\u751F\u91CD\u590D\u4E1A\u52A1\u7ED3\u679C\u3002\n- \u670D\u52A1\u505C\u673A\u8981\u5148\u505C\u6B62\u63A5\u6536\u65B0\u5DE5\u4F5C\uFF0C\u518D\u5728\u6709\u4E0A\u9650\u7684\u5BBD\u9650\u671F\u5185\u6392\u7A7A\u6216\u6301\u4E45\u5316\u5DF2\u63A5\u6536\u5DE5\u4F5C\uFF1B\u91CD\u542F\u540E\u81EA\u52A8\u626B\u63CF\u5E76\u5E42\u7B49\u6062\u590D\u672A\u5B8C\u6210\u4EFB\u52A1\u3001\u4E34\u65F6\u6587\u4EF6\u548C outbox\u3002\u542F\u52A8\u8FC1\u79FB\u3001\u5EFA\u7D22\u5F15\u3001\u79CD\u5B50\u6570\u636E\u548C\u7F13\u5B58\u9884\u70ED\u5FC5\u987B\u53EF\u91CD\u590D\u8FD0\u884C\uFF0C\u591A\u8282\u70B9\u540C\u65F6\u542F\u52A8\u4E0D\u80FD\u62A5\u9519\u6216\u4EA7\u751F\u91CD\u590D\u6570\u636E\u3002\n- \u53D1\u5E03\u671F\u95F4\u65B0\u65E7\u7248\u672C\u4F1A\u77ED\u6682\u5E76\u5B58\u3002\u6570\u636E\u5E93\u3001\u7F13\u5B58\u503C\u3001\u6D88\u606F\u548C API \u5408\u7EA6\u5FC5\u987B\u9075\u5B88\u201C\u5148\u6269\u5C55\u3001\u540E\u8FC1\u79FB\u3001\u518D\u6536\u7F29\u201D\u7684\u5411\u524D/\u5411\u540E\u517C\u5BB9\u987A\u5E8F\uFF0C\u4E0D\u80FD\u8981\u6C42\u6240\u6709\u8282\u70B9\u540C\u4E00\u65F6\u523B\u5347\u7EA7\u5B8C\u6210\u3002\n- \u5065\u5EB7\u68C0\u67E5\u5FC5\u987B\u533A\u5206 liveness\u3001readiness \u548C\u4F9D\u8D56\u964D\u7EA7\uFF1B\u8282\u70B9\u672A\u5B8C\u6210\u6062\u590D\u6216\u6B63\u5728\u6392\u7A7A\u65F6\u5E94\u9000\u51FA\u6D41\u91CF\uFF0C\u800C\u4E0D\u662F\u7EE7\u7EED\u63A5\u5355\u540E\u786C\u7EC8\u6B62\u3002\u5355\u4E2A\u8282\u70B9\u7684\u7194\u65AD\u3001\u8BA1\u6570\u548C\u544A\u8B66\u53EA\u4EE3\u8868\u672C\u8282\u70B9\uFF0C\u5E73\u53F0\u7EA7\u5224\u65AD\u5FC5\u987B\u805A\u5408\u5168\u90E8\u8282\u70B9\u3002\n- \u9A8C\u6536\u81F3\u5C11\u542F\u52A8 2 \u4E2A\u8282\u70B9\u8FDE\u63A5\u540C\u4E00\u7EC4 Redis/\u6570\u636E\u5E93\uFF0C\u5E76\u8986\u76D6\uFF1A\u540C\u4E00\u5B9A\u65F6\u4EFB\u52A1\u540C\u65F6\u5230\u70B9\u3001\u540C\u4E00\u8BF7\u6C42/\u6D88\u606F\u91CD\u590D\u6295\u9012\u3001\u9501\u6301\u6709\u8005\u4E2D\u9014\u9000\u51FA\u3001MongoDB/Redis \u77ED\u6682\u6545\u969C\u3001\u5199\u5165\u540E\u54CD\u5E94\u524D\u91CD\u542F\u3001\u6EDA\u52A8\u5347\u7EA7\u548C\u672A\u6392\u7A7A\u65F6\u5F3A\u5236\u7ED3\u675F\u3002\u6700\u7EC8\u65AD\u8A00\u5E94\u5305\u62EC\u4E1A\u52A1\u526F\u4F5C\u7528\u4EC5\u4E00\u6B21\u3001\u65E5\u5FD7/\u6D88\u606F\u53EF\u5E42\u7B49\u6062\u590D\u3001\u65E0\u6C38\u4E45\u6B7B\u9501\u3001\u65E0\u91CD\u590D\u521D\u59CB\u5316\u3001\u65E7\u65B0\u7248\u672C\u53EF\u5171\u5B58\u3002\n- \u82E5\u8981\u6C42\u5BBF\u4E3B\u673A\u6389\u7535\u6216 `kill -9` \u7A97\u53E3\u5185\u4E5F\u7EDD\u5BF9\u96F6\u4E22\u5931\uFF0C\u5FC5\u987B\u5728\u8FD4\u56DE\u4E1A\u52A1\u6210\u529F\u524D\u53D6\u5F97\u5916\u90E8\u6301\u4E45\u6D88\u606F\u961F\u5217\u3001\u5171\u4EAB outbox \u6216\u540C\u6B65 WAL \u7684\u6301\u4E45\u5316\u786E\u8BA4\uFF1B\u201C\u5185\u5B58\u961F\u5217\u968F\u540E\u5F02\u6B65\u843D\u76D8\u201D\u4E0D\u80FD\u5BA3\u79F0\u8986\u76D6\u5C1A\u672A\u6301\u4E45\u5316\u7684\u5F3A\u6740\u7A97\u53E3\u3002\n",nt=`<!-- Generated by Microi\u543E\u7801 VSCode Extension - DO NOT REMOVE THIS LINE -->
|
|
1032
|
+
`,$n=`
|
|
1033
|
+
|
|
1034
|
+
---
|
|
1035
|
+
|
|
1036
|
+
## Microi\u543E\u7801\u5DE5\u4F5C\u8FDB\u5EA6\u64AD\u62A5\u89C4\u8303\uFF08\u5F3A\u5236\uFF09
|
|
1037
|
+
|
|
1038
|
+
AI \u5728\u4EFB\u4F55\u65B0\u5EFA\u6216\u5DF2\u6709\u5BF9\u8BDD\u4E2D\u5904\u7406 Microi\u543E\u7801\u4EFB\u52A1\u5E76\u5411\u7528\u6237\u8F93\u51FA\u5DE5\u4F5C\u8FC7\u7A0B\u8BB0\u5F55\u65F6\uFF0C\u5FC5\u987B\u9ED8\u8BA4\u6267\u884C\u672C\u89C4\u8303\uFF0C\u65E0\u9700\u7528\u6237\u518D\u6B21\u63D0\u9192\uFF1A
|
|
1039
|
+
|
|
1040
|
+
- \u6BCF\u7D2F\u8BA1\u8F93\u51FA 3-5 \u6B21\u9762\u5411\u7528\u6237\u7684\u5DE5\u4F5C\u8FC7\u7A0B\u8BB0\u5F55\uFF0C\u6839\u636E\u4EFB\u52A1\u590D\u6742\u5EA6\u548C\u5B9E\u9645\u9636\u6BB5\u9009\u62E9\u5408\u9002\u65F6\u673A\uFF0C\u8FFD\u52A0\u4E00\u6B21\u8FDB\u5EA6\u64AD\u62A5\uFF1B\u9996\u6B21\u64AD\u62A5\u4E0D\u5F97\u665A\u4E8E\u7B2C 5 \u6B21\u5DE5\u4F5C\u8FC7\u7A0B\u8BB0\u5F55\u3002\u5DE5\u5177\u8C03\u7528\u7ED3\u679C\u3001\u7CFB\u7EDF\u6D88\u606F\u548C\u6700\u7EC8\u7B54\u590D\u4E0D\u8BA1\u5165\u6B21\u6570\u3002
|
|
1041
|
+
- \u64AD\u62A5\u5FC5\u987B\u4EE5\u201CMicroi\u543E\u7801\u672C\u6B21\u5DE5\u4F5C\u8FDB\u5EA6\u201D\u5F00\u5934\uFF0C\u8BA9\u7528\u6237\u660E\u786E\u77E5\u9053\u8FD9\u662F\u3010Microi\u543E\u7801\u3011\u89C4\u8303\uFF1B\u4E0D\u5F97\u6539\u6210\u542B\u4E49\u6A21\u7CCA\u7684\u201C\u5F53\u524D\u8FDB\u5EA6\u201D\uFF0C\u4E5F\u4E0D\u5F97\u63CF\u8FF0\u4E3A AI \u81EA\u5E26\u529F\u80FD\u3002
|
|
1042
|
+
- \u6BCF\u6B21\u64AD\u62A5\u5FC5\u987B\u540C\u65F6\u5305\u542B\u56DB\u9879\u5FEB\u901F\u4F30\u7B97\uFF1A\u5DF2\u5B8C\u6210\u8FDB\u5EA6\u767E\u5206\u6BD4\u3001\u9884\u8BA1\u8FD8\u9700\u8981\u591A\u957F\u65F6\u95F4\u7ED3\u675F\u3001\u76EE\u524D\u5927\u6982\u5DF2\u6D88\u8017\u591A\u5C11 token\u3001\u9884\u8BA1\u603B\u5171\u9700\u8981\u6D88\u8017\u591A\u5C11 token\u3002
|
|
1043
|
+
- \u9884\u8BA1\u5269\u4F59\u65F6\u95F4\u4E0D\u8DB3 60 \u5206\u949F\u65F6\u4F7F\u7528\u5206\u949F\uFF1B\u8FBE\u5230 60 \u5206\u949F\u540E\u6362\u7B97\u4E3A\u201CX\u5C0F\u65F6Y\u5206\u949F\u201D\uFF1B\u8FBE\u5230 24 \u5C0F\u65F6\u540E\u6362\u7B97\u4E3A\u201CX\u5929Y\u5C0F\u65F6Z\u5206\u949F\u201D\u3002\u4E3A 0 \u7684\u4F4E\u4F4D\u5355\u4F4D\u53EF\u4EE5\u7701\u7565\uFF0C\u7981\u6B62\u7EE7\u7EED\u53EA\u663E\u793A\u7D2F\u8BA1\u5206\u949F\u6570\u3002
|
|
1044
|
+
- \u8FDB\u5EA6\u3001\u65F6\u95F4\u548C token \u53EA\u9700\u5FEB\u901F\u4F30\u7B97\uFF0C\u4E0D\u5F97\u4E3A\u4E86\u63D0\u9AD8\u4F30\u7B97\u7CBE\u5EA6\u4E2D\u65AD\u4E3B\u8981\u5DE5\u4F5C\uFF0C\u4E5F\u4E0D\u5F97\u58F0\u79F0\u8FD9\u4E9B\u6570\u636E\u6765\u81EA\u5E73\u53F0\u7CBE\u786E\u8BA1\u91CF\u3002token \u8F83\u591A\u65F6\u53EF\u7528 \`k\` \u7B80\u5199\u3002
|
|
1045
|
+
- \u63A8\u8350\u4F7F\u7528\u7D27\u51D1\u683C\u5F0F\uFF1A\`Microi\u543E\u7801\u672C\u6B21\u5DE5\u4F5C\u8FDB\u5EA6\uFF1A\u7EA6 55%\uFF1B\u9884\u8BA1\u8FD8\u9700 12 \u5206\u949F\uFF1B\u76EE\u524D\u5DF2\u6D88\u8017\u7EA6 8k tokens\uFF1B\u9884\u8BA1\u603B\u8BA1\u7EA6 15k tokens\u3002\u4EE5\u4E0A\u4E3A\u5FEB\u901F\u4F30\u7B97\u3002\`
|
|
1046
|
+
- \u77ED\u4EFB\u52A1\u82E5\u5728\u4E0D\u8DB3 3 \u6B21\u5DE5\u4F5C\u8FC7\u7A0B\u8BB0\u5F55\u65F6\u5DF2\u7ECF\u5B8C\u6210\uFF0C\u4E0D\u5F97\u4E3A\u4E86\u51D1\u6B21\u6570\u62C6\u5206\u65E0\u610F\u4E49\u6D88\u606F\uFF1B\u53EF\u76F4\u63A5\u5728\u6700\u7EC8\u4EA4\u4ED8\u4E2D\u7B80\u8981\u6C47\u603B\u3002
|
|
1047
|
+
`,On=`
|
|
1048
|
+
|
|
1049
|
+
## \u672C\u5730\u8D44\u6E90\u4E0E OOM \u4FDD\u62A4\u89C4\u8303\uFF08\u5F3A\u5236\uFF09
|
|
1050
|
+
|
|
1051
|
+
AI \u5728\u7528\u6237\u672C\u673A\u542F\u52A8 Node.js\u3001Vite\u3001Webpack\u3001dotnet build\u3001Java\u3001Docker build\u3001\u6D4F\u89C8\u5668\u81EA\u52A8\u5316\u3001\u538B\u529B\u6D4B\u8BD5\u6216\u5176\u4ED6\u53EF\u80FD\u957F\u65F6\u95F4\u5360\u7528 CPU/\u5185\u5B58\u7684\u8FDB\u7A0B\u524D\uFF0C\u5FC5\u987B\u5148\u8BC4\u4F30\u8D44\u6E90\uFF0C\u4E0D\u5F97\u4E3A\u4E86\u201C\u8BA9\u6784\u5EFA\u8DD1\u8FC7\u201D\u65E0\u9650\u62AC\u9AD8\u5806\u5185\u5B58\u6216 Worker \u6570\u3002
|
|
1052
|
+
|
|
1053
|
+
- \u542F\u52A8\u524D\u68C0\u67E5\u7269\u7406\u5185\u5B58\u603B\u91CF\u3001\u5F53\u524D\u5360\u7528\u7387\u3001\u53EF\u7528\u5185\u5B58\uFF0C\u5E76\u68C0\u67E5\u662F\u5426\u5DF2\u6709\u540C\u7C7B dev server/\u6784\u5EFA\u8FDB\u7A0B\u3002\u5DF2\u6709\u53EF\u590D\u7528\u670D\u52A1\u65F6\u7981\u6B62\u91CD\u590D\u542F\u52A8\u3002
|
|
1054
|
+
- \u9ED8\u8BA4\u53EA\u5141\u8BB8\u4E00\u4E2A\u9AD8\u8D44\u6E90\u4EFB\u52A1\u8FD0\u884C\uFF1B\u663E\u5F0F\u9650\u5236 Worker/\u5E76\u53D1\u6570\uFF0C\u4F18\u5148\u6309\u9879\u76EE\u3001\u5305\u3001\u6A21\u5757\u3001\u6D4B\u8BD5\u5206\u7EC4\u6216\u6587\u4EF6\u5206\u7247\u6267\u884C\uFF0C\u4E0D\u5F97\u5E76\u884C\u542F\u52A8\u591A\u4E2A\u5168\u91CF\u6784\u5EFA\u3002
|
|
1055
|
+
- \u542F\u52A8\u91CD\u4EFB\u52A1\u65F6\u4ECD\u4EE5\u4FDD\u7559\u81F3\u5C11 \`max(6 GB, \u7269\u7406\u5185\u5B58\u7684 20%)\` \u7ED9 VS Code\u3001Codex \u548C\u64CD\u4F5C\u7CFB\u7EDF\u4E3A\u89C4\u5212\u76EE\u6807\uFF1B\u4F4E\u4E8E\u8BE5\u76EE\u6807\u65F6\u5E94\u505C\u6B62\u65B0\u589E\u5E76\u53D1\u91CD\u4EFB\u52A1\u3001\u4F18\u5148\u964D\u7EA7\u4E3A\u5B9A\u5411\u9A8C\u8BC1\uFF0C\u4F46\u4E0D\u518D\u628A\u5B83\u4F5C\u4E3A\u5F3A\u5236\u7EC8\u6B62\u5DF2\u542F\u52A8\u4EFB\u52A1\u7684\u786C\u95E8\u9650\u3002\u673A\u5668\u603B\u5185\u5B58\u5360\u7528\u8FBE\u5230 95% \u65F6\uFF0C\u7ACB\u5373\u7EC8\u6B62 AI \u542F\u52A8\u7684\u91CD\u4EFB\u52A1\u53CA\u5176\u5B50\u8FDB\u7A0B\uFF0C\u4E0D\u5F97\u7B49\u5F85 OOM\u3002
|
|
1056
|
+
- \u7981\u6B62\u5C06 \`--max-old-space-size\`\u3001JVM heap\u3001Docker memory \u6216\u7C7B\u4F3C\u4E0A\u9650\u8BBE\u4E3A\u63A5\u8FD1\u7269\u7406\u5185\u5B58\u603B\u91CF\u3002\u9664\u975E\u7528\u6237\u660E\u786E\u6388\u6743\u72EC\u5360\u6784\u5EFA\u7A97\u53E3\uFF0C\u5355\u4E2A AI \u542F\u52A8\u7684\u8FDB\u7A0B\u6811\u4E0D\u5F97\u6301\u7EED\u5360\u7528\u8D85\u8FC7\u7269\u7406\u5185\u5B58\u7684 25%\u3002
|
|
1057
|
+
- \u540E\u53F0/\u957F\u4EFB\u52A1\u5FC5\u987B\u8BB0\u5F55\u6839 PID\u3001\u5B50\u8FDB\u7A0B\u3001\u542F\u52A8\u65F6\u95F4\u548C\u72EC\u7ACB\u65E5\u5FD7\uFF0C\u6BCF 15-30 \u79D2\u76D1\u6D4B\u4E00\u6B21\u8FDB\u7A0B\u6811\u5185\u5B58\u4E0E\u5168\u673A\u53EF\u7528\u5185\u5B58\u3002\u4EFB\u52A1\u5931\u8D25\u3001\u4E2D\u65AD\u6216\u8FBE\u9608\u503C\u65F6\u5FC5\u987B\u505C\u6B62\u6574\u4E2A\u5B50\u8FDB\u7A0B\u6811\uFF0C\u4E0D\u5F97\u9057\u7559\u5B64\u513F Node/dotnet/Java \u8FDB\u7A0B\u3002
|
|
1058
|
+
- \u5168\u91CF\u6784\u5EFA\u65E0\u6CD5\u5728\u4E0A\u8FF0\u9608\u503C\u5185\u5B8C\u6210\u65F6\uFF0C\u5148\u505C\u6B62\u5E76\u6539\u7528\u5B9A\u5411 lint\u3001\u7C7B\u578B\u68C0\u67E5\u3001\u6309\u6A21\u5757\u6784\u5EFA\u6216\u6309\u6D4B\u8BD5\u6587\u4EF6\u9A8C\u8BC1\u3002\u5982\u4ECD\u5FC5\u987B\u8FDB\u884C\u5168\u91CF\u9A8C\u6536\uFF0C\u5E94\u660E\u786E\u62A5\u544A\u8D44\u6E90\u74F6\u9888\uFF0C\u4EA4\u7531 CI/\u4E13\u7528\u6784\u5EFA\u673A\u6216\u7ECF\u7528\u6237\u660E\u786E\u540C\u610F\u7684\u72EC\u5360\u65F6\u6BB5\u6267\u884C\uFF0C\u7981\u6B62\u5728\u7528\u6237\u6B63\u5728\u4F7F\u7528\u7684 VS Code \u4F1A\u8BDD\u91CC\u786C\u8DD1\u3002
|
|
1059
|
+
|
|
1060
|
+
## \u7248\u672C\u66F4\u65B0\u65E5\u5FD7\u4FDD\u62A4\u89C4\u5219\uFF08\u5F3A\u5236\uFF09
|
|
1061
|
+
|
|
1062
|
+
- \u65E5\u5E38\u529F\u80FD\u5F00\u53D1\u3001\u7F3A\u9677\u4FEE\u590D\u3001\u6D4B\u8BD5\u3001\u666E\u901A\u6587\u6863\u8865\u5145\u3001Skill \u5B8C\u5584\u548C\u4EE3\u7801\u91CD\u6784\u671F\u95F4\uFF0C\u4E0D\u5F97\u4FEE\u6539 \`microi.doc/docs/doc/about/update-log.md\`\u3002
|
|
1063
|
+
- \u53EA\u6709\u7528\u6237\u660E\u786E\u63D0\u51FA\u201C\u53D1\u5E03\u7248\u672C\u201D\u201C\u51C6\u5907\u53D1\u7248\u201D\u201C\u66F4\u65B0\u7248\u672C\u65E5\u5FD7\u201D\u6216\u76F4\u63A5\u70B9\u540D\u8981\u6C42\u4FEE\u6539\u8BE5\u6587\u4EF6\u65F6\uFF0C\u624D\u5141\u8BB8\u7F16\u8F91\u66F4\u65B0\u65E5\u5FD7\uFF1B\u201C\u5B8C\u5584\u6587\u6863\u201D\u6216\u201C\u8865\u5145\u5B98\u7F51\u8BF4\u660E\u201D\u4E0D\u7B49\u4E8E\u6388\u6743\u4FEE\u6539\u7248\u672C\u65E5\u5FD7\u3002
|
|
1064
|
+
- \u5982\u679C\u672C\u8F6E\u8BEF\u6539\u4E86\u66F4\u65B0\u65E5\u5FD7\uFF0C\u6536\u5C3E\u524D\u53EA\u64A4\u56DE\u672C\u8F6E\u7531 AI \u65B0\u589E\u7684\u6539\u52A8\uFF1B\u5FC5\u987B\u4FDD\u7559\u7528\u6237\u6216\u5176\u5B83\u4EFB\u52A1\u5DF2\u6709\u7684\u672A\u63D0\u4EA4\u5185\u5BB9\uFF0C\u4E0D\u5F97\u6574\u6587\u4EF6\u8986\u76D6\u6216\u56DE\u9000\u3002
|
|
1065
|
+
`,ki="\n\n---\n\n## \u6570\u636E\u5E93\u7ED3\u6784\n\n\u6570\u636E\u5E93\u7ED3\u6784\u4E0D\u4F1A\u5199\u5165\u672C\u57FA\u7840\u77E5\u8BC6\u5E93\u6587\u4EF6\uFF0C\u907F\u514D\u4E0D\u540C\u5F00\u53D1\u8005\u8FDE\u63A5\u4E0D\u540C\u670D\u52A1\u5668\u540E\u4EA7\u751F\u63D0\u4EA4\u51B2\u7A81\u3002\n\n\u7F16\u5199 `V8.FormEngine` \u6216 `V8.Db` \u4EE3\u7801\u65F6\uFF1A\n- \u4F18\u5148\u901A\u8FC7 MCP \u5DE5\u5177 `microi_get_db_schema` \u83B7\u53D6\u5F53\u524D\u670D\u52A1\u5668\u7684\u5B9E\u65F6\u8868\u7ED3\u6784\u3002\n- \u5982\u9700\u8BFB\u53D6\u672C\u5730\u5FEB\u7167\uFF0C\u8BF7\u67E5\u770B\u5F53\u524D\u5F15\u64CE\u6587\u4EF6\u6240\u5C5E OsClient \u76EE\u5F55\u4E0B\u7684 `.microi-db-schema.md`\u3002\n\n\u4ECE\u81EA\u7136\u8BED\u8A00\u9700\u6C42\u521B\u5EFA\u5B8C\u6574 Microi \u4F4E\u4EE3\u7801\u7CFB\u7EDF\u65F6\uFF1A\n- \u5148\u8C03\u7528 `microi_get_db_schema` \u4E86\u89E3\u5DF2\u6709\u8868\u3001\u83DC\u5355\u3001\u5B57\u6BB5\uFF0C\u907F\u514D\u91CD\u590D\u5EFA\u6A21\u3002\n- \u518D\u8C03\u7528 `microi_get_manifest_schema` \u83B7\u53D6\u5B8C\u6574 Manifest \u534F\u8BAE\u548C\u793A\u4F8B\u3002\n- \u5C06\u9700\u6C42\u6574\u7406\u4E3A Manifest\uFF0C\u6A21\u5757\u914D\u7F6E\u4F18\u5148\u5199\u5B57\u6BB5\u540D\uFF1A`listFields`\u3001`searchFields`\u3001`sortFields`\u3001`hiddenFields`\u3001`mobileFields`\u3001`cardTitleFields`\u3001`cardBottomFields`\u3002MCP \u4F1A\u81EA\u52A8\u89E3\u6790\u4E3A `diy_field.Id`\u3001`SelectFields`\u3001`SearchFieldIds` \u7B49 `sys_menu` \u6240\u9700\u683C\u5F0F\u3002\n- \u521B\u5EFA\u7ED1\u5B9A `diyTableId` \u7684\u540E\u53F0\u83DC\u5355\u65F6\uFF0C\u5FC5\u987B\u914D\u7F6E\u6216\u5141\u8BB8 MCP/\u540E\u7AEF\u81EA\u52A8\u63A8\u65AD `TableDiyFieldIds`\u3001`SelectFields`\u3001`SearchFieldIds`\u3001`SortFieldIds`\u3001`NotShowFields`\u3001`StatisticsFields`\u3001`MobileListFields`\u3001`CardTitleTagFields`\u3001`CardBottomTagFields`\u3001`DefaultOrderBy`\u3002\n- `NotShowFields` \u9ED8\u8BA4\u9690\u85CF Id/\u5916\u952E/\u7CFB\u7EDF\u5B57\u6BB5/\u5E03\u5C40\u63A7\u4EF6/\u4E0A\u4F20\u5BCC\u6587\u672C\u5730\u56FE\u5B50\u8868\u7B49\u91CD\u5B57\u6BB5\uFF1B`SearchFieldIds` \u9ED8\u8BA4\u9009\u62E9\u540D\u79F0\u3001\u6807\u9898\u3001\u7F16\u53F7\u3001\u72B6\u6001\u3001\u5206\u7C7B\u3001\u8D1F\u8D23\u4EBA\u3001\u65F6\u95F4\u7B49\u5E38\u7528\u7B5B\u9009\uFF1B`StatisticsFields` \u9ED8\u8BA4\u9009\u62E9\u91D1\u989D\u3001\u4EF7\u683C\u3001\u6570\u91CF\u3001\u79EF\u5206\u3001\u4F59\u989D\u7B49\u6570\u503C\u5B57\u6BB5\uFF1B\u79FB\u52A8\u7AEF/\u5361\u7247\u5217\u9ED8\u8BA4\u4FDD\u7559 3-4 \u4E2A\u6838\u5FC3\u53EF\u8BFB\u5B57\u6BB5\u3002\n- \u8868\u5355\u63A7\u4EF6\u4EE5 `Microi.Client/src/views/form-engine/diy-field-component/diy-component-list.json` \u4E3A\u4E8B\u5B9E\u6E90\u3002\u5B57\u6BB5\u8F83\u591A\u65F6\u4F18\u5148\u4F7F\u7528 `diy_table.Tabs` \u548C\u5B57\u6BB5 `Tab` \u5206\u7EC4\uFF0C\u5C40\u90E8\u590D\u6742\u533A\u57DF\u518D\u7528 `CollapseGroup` \u6216\u5B57\u6BB5\u7EA7 `Tabs` \u63A7\u4EF6\u6298\u53E0/\u5206\u6BB5\u3002\n- \u751F\u6210\u6216\u65B0\u589E\u5B57\u6BB5\u65F6\uFF0C\u666E\u901A\u5B57\u6BB5\u9ED8\u8BA4\u4E0D\u8981\u8BBE\u7F6E `diy_field.FormWidth`\uFF08\u4FDD\u6301 null/\u7701\u7565\uFF09\uFF1B\u53EA\u6709 `CodeEditor`\u3001`Textarea`\u3001`RichText`\u3001\u4E0A\u4F20\u3001\u5B50\u8868\u3001\u5730\u56FE/\u5E03\u5C40/\u81EA\u5B9A\u4E49\u7B49\u9700\u8981\u72EC\u5360\u6574\u884C\u7684\u63A7\u4EF6\u624D\u8BBE\u7F6E\u4E3A `24`\u3002\n- \u751F\u6210\u5BA1\u6279\u6D41\u65F6\uFF0CManifest \u7684 workflows \u9700\u5305\u542B FlowDesign\u3001Nodes\u3001Lines\uFF1B\u8FDE\u7EBF\u6807\u9898\u9ED8\u8BA4\u4F7F\u7528 `{\u8D77\u70B9\u8282\u70B9} \u5230 {\u7EC8\u70B9\u8282\u70B9}`\uFF0C\u591A\u8DEF\u7EBF\u8282\u70B9\u4F18\u5148\u751F\u6210\u8BBE\u7F6E `V8.NextNodeId` \u7684 `LineValueV8`\u3002\n- \u4FDD\u5B58\u5DE5\u4F5C\u6D41\u524D\u8C03\u7528 `microi_check_workflow_package` \u68C0\u67E5\u62D3\u6251\uFF0C\u5FC5\u8981\u65F6\u7528 `microi_test_workflow_condition` \u5E26\u6837\u4F8B\u8868\u5355\u6570\u636E\u6D4B\u8BD5\u56FE\u5F62\u6761\u4EF6\u8DEF\u7EBF\u3002\n- \u8C03\u7528 `microi_plan_system` \u505A\u672C\u5730\u7ED3\u6784\u68C0\u67E5\uFF0C\u518D\u8C03\u7528 `microi_generate_system` \u4E14\u4FDD\u6301 `dryRun:true`\u3002\n- \u53EA\u6709\u7528\u6237\u660E\u786E\u540C\u610F\u5199\u5165\u65F6\uFF0C\u624D\u7528 `dryRun:false` \u5E76\u4F20 `confirmExecution`\uFF0C\u968F\u540E\u8C03\u7528 `microi_validate_system` \u9A8C\u6536\u3002\n",Ii="\n\n## \u6570\u636E\u5E93\u7D22\u5F15 MCP \u89C4\u8303\uFF08\u5F3A\u5236\uFF09\n\n- \u9700\u6C42\u3001\u84DD\u56FE\u3001\u63A5\u53E3\u3001Job \u6216\u8BC4\u5BA1\u4E00\u65E6\u660E\u786E\u67D0\u8868\u5B57\u6BB5\u9700\u8981\u7D22\u5F15\uFF0C\u5FC5\u987B\u5199\u5165 Manifest `tables[].indexes`\uFF0C\u5E76\u8C03\u7528 `microi_create_table_index`\uFF1B\u7981\u6B62\u5728 V8\u3001\u63A5\u53E3\u5F15\u64CE\u3001FormEngine \u6216\u4E00\u6B21\u6027 SQL \u4E2D\u624B\u5199 CREATE/DROP INDEX\u3002\n- \u521B\u5EFA\u524D\u540E\u8C03\u7528 `microi_get_table_indexes` \u56DE\u8BFB\u771F\u5B9E\u7269\u7406\u7D22\u5F15\u3002\u5220\u9664\u53EA\u80FD\u7528 `microi_drop_table_index`\uFF0C\u4E3B\u952E\u7D22\u5F15\u7981\u6B62\u5220\u9664\u3002\n- \u79DF\u6237\u4E1A\u52A1\u7EC4\u5408\u7D22\u5F15\u901A\u5E38\u4EE5 `OsClient` \u5F00\u5934\uFF1B\u4E1A\u52A1\u552F\u4E00\u952E\u3001\u5E42\u7B49\u952E\u7528\u79DF\u6237\u8303\u56F4\u552F\u4E00\u7D22\u5F15\uFF1B\u5916\u952E\u3001\u5B50\u8868\u3001Job/outbox/\u5F85\u529E\u626B\u63CF\u6309\u771F\u5B9E WHERE/JOIN/ORDER BY \u8BBE\u8BA1\u3002\n- \u4E0D\u5F97\u628A SearchFieldIds\u3001SortFieldIds\u3001StatisticsFields \u673A\u68B0\u8F6C\u6362\u6210\u4E00\u6279\u5355\u5217\u7D22\u5F15\uFF1B\u4F4E\u57FA\u6570\u5B57\u6BB5\u3001LIKE '%keyword%' \u548C\u957F\u6587\u672C\u4E0D\u80FD\u6EE5\u7528\u666E\u901A B-tree \u7D22\u5F15\u3002\n- DIY \u8868\u7D22\u5F15\u56DE\u8BFB\u540E\u8FD8\u5FC5\u987B\u80FD\u5728 Microi.Client \u201C\u5F00\u53D1\u8BBE\u8BA1 \u2192 \u7D22\u5F15\u7BA1\u7406\u201D\u770B\u5230\u76F8\u540C\u540D\u79F0\u3001\u6709\u5E8F\u5B57\u6BB5\u4E0E\u552F\u4E00\u6027\u3002\n",Ri="\n\n## MCP \u9ED8\u8BA4\u663E\u9690\u89C4\u5219\n\n- \u521B\u5EFA `sys_menu` \u83DC\u5355\u6A21\u5757\u65F6\uFF0C\u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u9690\u85CF\uFF0C\u5426\u5219 `Display` \u548C `AppDisplay` \u9ED8\u8BA4\u8BBE\u4E3A `1`\u3002\n- \u7ED1\u5B9A `diyTableId` \u7684\u83DC\u5355\u9ED8\u8BA4\u8865\u9F50\u5217\u8868\u5217\u3001\u641C\u7D22\u5217\u3001\u9690\u85CF\u5217\u3001\u6392\u5E8F\u5217\u3001\u7EDF\u8BA1\u5217\u3001\u79FB\u52A8\u7AEF/\u5361\u7247\u5217\u548C\u9ED8\u8BA4\u6392\u5E8F\uFF1B\u7528\u6237\u663E\u5F0F\u4F20\u5165\u7684 `sys_menu` JSON \u4F18\u5148\u3002\n- \u521B\u5EFA `diy_field` \u5B57\u6BB5\u65F6\uFF0C\u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u9690\u85CF\uFF0C\u5426\u5219 `Visible` \u548C `AppVisible` \u9ED8\u8BA4\u8BBE\u4E3A `1`\u3002\n- \u5B57\u6BB5\u8F83\u591A\u7684\u8868\u5355\u9ED8\u8BA4\u4F18\u5148\u751F\u6210 `diy_table.Tabs`\uFF0C\u5E76\u7ED9\u5B57\u6BB5\u5199\u5165 `Tab`\uFF1B\u6574\u884C\u63A7\u4EF6\u624D\u4F7F\u7528 `FormWidth=24`\u3002\n",_i="\n\n## MCP \u5199\u5165\u8D85\u65F6\u3001\u6E90\u7801\u5B8C\u6574\u6027\u4E0E\u56DE\u8BFB\u89C4\u5219\n\n- \u4F18\u5148\u4F7F\u7528\u8BED\u4E49\u660E\u786E\u7684\u6807\u51C6 MCP \u5DE5\u5177\uFF1A\u63A5\u53E3\u5F15\u64CE\u4EE3\u7801\u7528 `microi_save_engine_code`\uFF0C\u8868\u5355\u4E8B\u4EF6\u7528 `microi_save_event_code`\uFF0C\u83DC\u5355\u6309\u94AE\u3001Tab\u3001SqlJoin\u3001SqlWhere \u7528 `microi_update_module`\u3002\u4E0D\u8981\u5148\u7ED5\u5230\u539F\u751F HTTP\u3001FormEngine \u6216 SQL\u3002\n- MCP \u5199\u8BF7\u6C42\u8D85\u65F6\u53EA\u8868\u793A\u5BA2\u6237\u7AEF\u672A\u53CA\u65F6\u6536\u5230\u54CD\u5E94\uFF0C\u4E0D\u8868\u793A\u670D\u52A1\u5668\u4E00\u5B9A\u6CA1\u6709\u5199\u5165\u3002\u4E0A\u8FF0\u6807\u51C6\u5199\u5DE5\u5177\u4EE5\u53CA `microi_create_engine` \u4F1A\u81EA\u52A8\u77ED\u8D85\u65F6\u56DE\u8BFB\uFF1B\u8FD4\u56DE `RecoveredAfterTransportError:true` \u65F6\u5E94\u89C6\u4E3A\u5DF2\u786E\u8BA4\u6210\u529F\u3002\n- \u6062\u590D\u6027\u56DE\u8BFB\u5FC5\u987B\u4F7F\u7528\u72EC\u7ACB\u77ED\u8D85\u65F6\uFF0C\u4E0D\u80FD\u6CBF\u7528\u666E\u901A\u67E5\u8BE2\u957F\u8D85\u65F6\u5E76\u957F\u671F\u505C\u7559\u5728\u201C\u7B49\u5F85\u8FDC\u7AEF\u56DE\u8BFB\u201D\u3002\u5982\u679C\u6807\u51C6\u5DE5\u5177\u8FD4\u56DE\u201C\u5199\u5165\u7ED3\u679C\u4E0D\u786E\u5B9A\u201D\uFF0C\u53EA\u7528\u5BF9\u5E94 get \u5DE5\u5177\u7EE7\u7EED\u56DE\u8BFB\u4E00\u6B21\u5E76\u62A5\u544A\u771F\u5B9E\u5DEE\u5F02\u3002\n- `\u2026N tokens truncated\u2026`\u3001`Exit code:`\u3001`Chunk ID:`\u3001`Wall time:` \u662F AI/\u7EC8\u7AEF\u5DE5\u5177\u5305\u88C5\u6587\u672C\uFF0C\u4E0D\u662F V8 \u6E90\u7801\u3002\u8BFB\u53D6\u957F\u6E90\u7801\u5FC5\u987B\u6309 MCP \u8FD4\u56DE\u7684\u5B57\u7B26\u533A\u95F4\u53D6\u5B8C\u5E76\u6838\u5BF9 SHA-256\uFF1B\u63D2\u4EF6\u63A8\u9001\u548C MCP \u5199\u5DE5\u5177\u68C0\u6D4B\u5230\u8FD9\u4E9B\u6807\u8BB0\u65F6\u5FC5\u987B\u62D2\u7EDD\u5199\u5165\u3002\u8FDC\u7AEF\u6E90\u7801\u4E0D\u5C11\u4E8E 8000 \u5B57\u7B26\u4E14\u65B0\u6E90\u7801\u7A81\u7136\u51CF\u5C11\u8D85\u8FC7 15% \u65F6\uFF0C\u672A\u6838\u5BF9\u5B8C\u6574\u6E90\u7801\u524D\u4E0D\u5F97\u786E\u8BA4\u5927\u5E45\u5220\u51CF\u3002\n- \u7981\u6B62\u56E0\u4E3A\u8D85\u65F6\u91CD\u590D\u5EFA\u8868\u3001\u91CD\u590D\u52A0\u5B57\u6BB5\u3001\u91CD\u590D\u521B\u5EFA\u63A5\u53E3\u5F15\u64CE\uFF0C\u6216\u65B0\u5EFA\u4E00\u6B21\u6027\u7EF4\u62A4\u5F15\u64CE\u7ED5\u8FC7\u539F\u64CD\u4F5C\u3002\u521B\u5EFA\u63A5\u53E3\u5F15\u64CE\u6570\u636E\u5E93\u5165\u5E93\u6210\u529F\u4F46\u8DEF\u7531\u7F13\u5B58\u5237\u65B0\u8D85\u65F6\u65F6\uFF0C\u5E94\u4FDD\u7559\u6210\u529F\u7ED3\u679C\u5E76\u68C0\u67E5 `CacheRefresh`\uFF0C\u4E0D\u80FD\u5F53\u4F5C\u521B\u5EFA\u5931\u8D25\u91CD\u590D\u63D0\u4EA4\u3002\n- `MoreBtns`\u3001`FormBtns`\u3001`PageTabs`\u3001`BatchSelectMoreBtns` \u7B49\u83DC\u5355\u5B57\u6BB5\u59CB\u7EC8\u5411 MCP \u4F20\u660E\u6587 JSON \u6570\u7EC4\u3002\u79DF\u6237\u8868\u5355\u4E8B\u4EF6\u4E2D\u7684 Base64 \u517C\u5BB9\u903B\u8F91\u5C5E\u4E8E\u5E73\u53F0\u5185\u90E8\u7EC6\u8282\uFF0CAI \u4E0D\u5F97\u81EA\u884C\u7F16\u7801\u3002\n- VS Code \u8BBE\u7F6E\u91CC\u663E\u793A MCP \u5DF2\u542F\u7528\u53EA\u4EE3\u8868\u914D\u7F6E\u5B58\u5728\u3002\u63D2\u4EF6\u201C\u8BCA\u65AD MCP \u53EF\u8C03\u7528\u6027\u201D\u5FC5\u987B\u5B8C\u6210 `initialize`\u3001`tools/list` \u548C\u771F\u5B9E `microi_get_status`\u3002\n- \u9047\u5230 `ByteString` \u6216 `greater than 255` \u65F6\uFF0C\u5148\u6309\u5F02\u5E38\u5B57\u7B26\u7D22\u5F15\u68C0\u67E5 HTTP Header\u3002Microi MCP \u7684\u8BBE\u5907\u6807\u8BC6\u6765\u81EA `did` / `MICROI_MCP_DID`\uFF1B\u4E2D\u6587 Windows \u4E3B\u673A\u540D\u4F1A\u4ECE `MCP:` \u540E\u7B2C 4 \u4E2A\u5B57\u7B26\u89E6\u53D1\u9519\u8BEF\u3002`MICROI_LABEL_BASE64` \u53EA\u7528\u4E8E\u663E\u793A\uFF0C\u4E0D\u662F\u8BF7\u6C42 Header\uFF0C\u4E0D\u5F97\u5148\u731C\u6D4B\u6216\u6539\u5199\u4E2D\u6587 Label\u3002\u8FDE\u63A5\u6062\u590D\u524D\u7981\u6B62\u8FDC\u7AEF\u5199\u5165\uFF0C\u6062\u590D\u540E\u5148\u505A\u53EA\u8BFB\u57FA\u7EBF\u76D8\u70B9\u3002\n- Codex \u672A\u6CE8\u5165\u666E\u901A MCP \u5DE5\u5177\u65F6\uFF0C\u5148\u8C03\u7528 `list_mcp_resources` \u5E76\u8BFB\u53D6 `microi://codex/status`\uFF1B\u901A\u7528\u8C03\u7528\u4F7F\u7528 `list_mcp_resource_templates` \u53D1\u73B0 `microi://codex/action/{action}/{params}`\uFF0C\u5176\u4E2D params \u662F URI \u7F16\u7801 JSON\u3002\u8BE5\u8D44\u6E90\u6A21\u677F\u4ECD\u590D\u7528\u539F\u5DE5\u5177\u7684 schema\u3001\u786E\u8BA4\u53E3\u4EE4\u3001\u5BA1\u8BA1\u548C\u56DE\u8BFB\u89C4\u5219\uFF0C\u4E0D\u5F97\u6539\u8D70\u539F\u751F HTTP/SQL\u3002\n",Pi="\n\n## V8 \u6E90\u7801\u540C\u6B65\u4FDD\u62A4\u89C4\u5219\uFF08\u5F3A\u5236\uFF09\n\n- \u591A\u4EBA\u5F00\u53D1\u65F6\uFF0C\u6BCF\u6B21\u51C6\u5907\u63A8\u9001\u63A5\u53E3\u5F15\u64CE\u3001\u8868\u5355/\u5B57\u6BB5 V8\u3001\u6A21\u5757\u6309\u94AE\u3001\u6A21\u5757 SqlJoin/SqlWhere \u6216\u6D41\u7A0B\u8282\u70B9 V8 \u524D\uFF0C\u5FC5\u987B\u5148\u6309\u5F53\u524D\u670D\u52A1\u5668\u548C\u5F15\u64CE\u5206\u7C7B\u68C0\u67E5\u540C\u6B65\u72B6\u6001\u3002\u4E0D\u5F97\u51ED\u672C\u5730\u6587\u4EF6\u65F6\u95F4\u6216\u4E0A\u6B21\u5BF9\u8BDD\u7ED3\u8BBA\u76F4\u63A5\u8986\u76D6\u8FDC\u7AEF\u3002\n- \u53EA\u6709 `localModified` \u53EF\u4EE5\u63A8\u9001\uFF1B`remoteModified` \u5FC5\u987B\u5148\u62C9\u53D6\uFF1B`remoteDeleted` \u8868\u793A\u670D\u52A1\u5668\u5DF2\u5220\u9664\u4E14\u672C\u5730\u672A\u6539\uFF0C\u62C9\u53D6\u65F6\u5148\u5907\u4EFD\u518D\u6E05\u7406\uFF1B\u670D\u52A1\u5668\u5DF2\u5220\u9664\u4F46\u672C\u5730\u4E5F\u4FEE\u6539\u65F6\u6309 `conflict` \u5904\u7406\uFF1B`conflict` \u5FC5\u987B\u6BD4\u8F83\u540C\u6B65\u57FA\u7EBF\u3001\u672C\u5730\u548C\u8FDC\u7AEF\u540E\u5408\u5E76\u3002\u65E0\u540C\u6B65\u57FA\u7EBF\u6216\u9884\u68C0\u5931\u8D25\u65F6\u505C\u6B62\u63A8\u9001\u3002\n- \u63D2\u4EF6\u201C\u63A8\u9001\u5F53\u524D\u6587\u4EF6\u201D\u5FC5\u987B\u81EA\u52A8\u6267\u884C\u4E0A\u8FF0\u9884\u68C0\uFF1B\u4E00\u952E\u540C\u6B65\u53EF\u4EE5\u590D\u7528\u521A\u5B8C\u6210\u4E14\u65E0\u51B2\u7A81\u7684\u5B8C\u6574\u5FEB\u7167\uFF0C\u5E76\u8986\u76D6\u63A5\u53E3\u5F15\u64CE\u3001\u8868\u5355\u4E8B\u4EF6\u3001\u5B57\u6BB5 V8\u3001\u6A21\u5757\u6309\u94AE\u3001\u6A21\u5757 SqlJoin/SqlWhere \u548C\u6D41\u7A0B\u8282\u70B9\u3002\u6B63\u6587\u4E00\u81F4\u4EC5 meta/mtime \u4E0D\u4E00\u81F4\u65F6\u81EA\u52A8\u6821\u51C6\u3002\n- AI \u901A\u8FC7 MCP \u76F4\u63A5\u5199\u8FDC\u7AEF\u540E\uFF0C\u8981\u56DE\u8BFB\u751F\u6548\u4EE3\u7801\u5E76\u540C\u6B65\u672C\u5730\u6587\u4EF6\u3001`.microi-meta.json` \u548C mtime\u3002\u5DE5\u4F5C\u7ED3\u675F\u524D\u518D\u6B21\u68C0\u67E5\uFF0C\u5E76\u62A5\u544A\u672C\u5730\u672A\u63A8\u9001\u3001\u8FDC\u7AEF\u8F83\u65B0\u3001\u670D\u52A1\u5668\u5DF2\u5220\u9664\u3001\u51B2\u7A81\u662F\u5426\u4E3A 0\u3002\n",Ni="\n\n## MCP \u5728\u7EBF\u5E94\u7528\u9ED8\u8BA4\u53D1\u73B0\u4E0E\u590D\u6742\u9875\u9762\u89C4\u5219\n\n- \u5904\u7406 Web\u3001UniApp\u3001MicroService\u3001\u5B9A\u5236\u5F39\u7A97\u6216\u590D\u6742\u9875\u9762\u524D\uFF0C\u5148\u8C03\u7528 `microi_list_applications` \u83B7\u53D6\u5F53\u524D\u79DF\u6237\u6240\u6709\u5728\u7EBF\u5E94\u7528\u53CA\u5B8C\u6574\u6587\u4EF6\u6E05\u5355\uFF0C\u518D\u5BF9\u76EE\u6807\u5E94\u7528\u8C03\u7528 `microi_get_application_context`\uFF08\u9ED8\u8BA4\u8BFB\u53D6\u5168\u90E8\u6E90\u7801\u5185\u5BB9\uFF09\uFF1B\u5355\u6587\u4EF6\u6309\u9700\u4F7F\u7528 `microi_get_application_file`\u3002\u8FD4\u56DE\u6E05\u5355\u540E\u8FD8\u5FC5\u987B\u68C0\u67E5 `ContentsComplete/ContentErrorCount` \u548C\u9010\u6587\u4EF6 `ContentReadError`\uFF0C\u4E0D\u80FD\u628A\u201C\u6709\u6E05\u5355\u201D\u8BEF\u62A5\u6210\u201C\u6E90\u7801\u5B8C\u6574\u53EF\u8BFB\u201D\u3002\n- \u5DF2\u6709\u5408\u9002 MicroService \u65F6\u4F18\u5148\u65B0\u589E\u9875\u9762/\u8DEF\u7531\uFF1B\u6CA1\u6709\u65F6\u5148\u7528 `microi_scaffold_vue_microservice` \u5728\u5F53\u524D\u79DF\u6237 `AI\u5E94\u7528/{appKey}` \u76EE\u5F55\u9884\u6F14\u5E76\u786E\u8BA4\u751F\u6210 Vue \u811A\u624B\u67B6\uFF0C\u518D\u4F9D\u6B21\u8C03\u7528 `microi_create_microservice`\u3001`microi_sync_microservice_source`\u3001`microi_publish_application_directory_stream`\u3002\n- \u6D41\u5F0F\u53D1\u5E03\u5931\u8D25\u65F6\u5FC5\u987B\u8BFB\u53D6 `uploadedCount/retrySafe`\uFF1B\u53EA\u6709\u5C1A\u672A\u4E0A\u4F20\u4EFB\u4F55\u6587\u4EF6\u3001\u660E\u786E\u53EF\u5B89\u5168\u91CD\u8BD5\u4E14\u7F16\u8BD1\u4EA7\u7269\u8F83\u5C0F\u65F6\uFF0C\u624D\u53EF\u4E34\u65F6\u56DE\u9000 `microi_publish_microservice`\uFF0C\u5E76\u5728\u7ED3\u8BBA\u4E2D\u8BB0\u5F55\u8FDC\u7AEF\u7248\u672C\u7F3A\u53E3\u3002\n- \u6BCF\u4E2A\u5FAE\u670D\u52A1\u9875\u9762\u83DC\u5355\u5FC5\u987B\u901A\u8FC7 `microi_create_module` \u7ED1\u5B9A `MicroServiceId/MicroServicePageId/MicroServiceRoutePath/MicroServiceKey`\uFF0C\u968F\u540E\u7528 `microi_get_module` \u56DE\u8BFB\uFF1B\u666E\u901A URL \u83DC\u5355\u6210\u529F\u4E0D\u7B49\u4E8E\u5FAE\u670D\u52A1\u83DC\u5355\u5DF2\u4EA4\u4ED8\u3002\n- \u62C9\u53D6\u5DF2\u6709 MicroService \u6E90\u7801\u524D\u5FC5\u987B\u6BD4\u8F83\u4E0A\u6B21\u540C\u6B65\u57FA\u7EBF\u3001\u672C\u5730\u6587\u4EF6\u548C\u79C1\u6709 HDFS \u6E90\u7801\uFF0C\u5148\u5C55\u793A\u4EC5\u672C\u5730\u3001\u4EC5\u8FDC\u7AEF\u548C\u51B2\u7A81\u6587\u4EF6\uFF1B\u7528\u6237\u660E\u786E\u786E\u8BA4\u540E\u624D\u80FD\u5F3A\u5236\u8986\u76D6\u3002\n- \u6784\u5EFA\u5E76\u63A8\u9001 MicroService \u65F6\u5FC5\u987B\u5148\u6210\u529F\u540C\u6B65\u5B8C\u6574\u6E90\u7801\u5230\u5F53\u524D\u79DF\u6237\u79C1\u6709 HDFS\uFF0C\u518D\u53D1\u5E03\u516C\u6709\u7F16\u8BD1\u4EA7\u7269\uFF1B\u6E90\u7801\u5931\u8D25\u65F6\u7981\u6B62\u7EE7\u7EED\u53D1\u5E03\u3002\n- `V8.ConfirmTips` \u53EA\u7528\u4E8E\u7EAF\u6587\u672C\u786E\u8BA4\u6216\u6781\u5C11\u91CF\u4E00\u6B21\u6027\u8F93\u5165\u3002\u4E09\u4E2A\u4EE5\u4E0A\u5B57\u6BB5\u3001\u8054\u52A8\u6821\u9A8C\u3001\u4E0A\u4F20\u3001\u8868\u683C\u3001Tab\u3001\u6B65\u9AA4\u6761\u3001\u4EE3\u7801\u7F16\u8F91\u5668\u6216\u9700\u957F\u671F\u7EF4\u62A4\u7684\u5F39\u7A97\uFF0C\u5FC5\u987B\u4F7F\u7528\u5FAE\u670D\u52A1\u9875\u9762\u5E76\u901A\u8FC7 `V8.OpenAppDialog` \u6253\u5F00\uFF0C\u7981\u6B62\u5728 V8 \u4EE3\u7801\u91CC\u62FC\u63A5\u5927\u6BB5 HTML\u3002\n- \u5E94\u7528\u5546\u57CE\u5386\u53F2\u5B57\u6BB5 `AppType` \u8868\u793A\u5B98\u65B9/\u793E\u533A\u5206\u7C7B\uFF1B\u8FD0\u884C\u5E94\u7528\u7C7B\u578B\u4F7F\u7528 `ApplicationType`\uFF0C\u503C\u4E3A `Regular / MicroService / UniApp / Web`\u3002\n",Mi="\n\n## \u5B98\u65B9\u6587\u6863\u539F\u4F4D\u589E\u8865\u4E0E\u4E2D\u6587\u5355\u6E90\u89C4\u5219\n\n- \u4FEE\u6539\u5B98\u65B9\u6587\u6863\u524D\u5148\u641C\u7D22\u5DF2\u6709\u9875\u9762\u5E76\u539F\u4F4D\u8865\u5145\uFF1B\u9664\u975E\u786E\u6709\u957F\u671F\u72EC\u7ACB\u4E3B\u9898\uFF0C\u4E0D\u5F97\u65B0\u5EFA\u76F8\u8FD1 Markdown \u9875\u9762\u3001\u5BFC\u822A\u9879\u6216\u9875\u9762\u8DEF\u7531\u3002\n- \u524D\u7AEF V8 API \u56FA\u5B9A\u7EF4\u62A4 `microi.doc/docs/doc/v8-engine/v8-client.md`\uFF0C\u540E\u7AEF V8 / \u63A5\u53E3\u5F15\u64CE API \u56FA\u5B9A\u7EF4\u62A4 `microi.doc/docs/doc/v8-engine/v8-server.md`\u3002\n- \u65E5\u5E38\u529F\u80FD\u5F00\u53D1\u53EA\u7EF4\u62A4 `microi.doc/docs/doc/` \u4E2D\u6587\u6587\u6863\uFF1B`microi.doc/docs/en/` \u7531\u5B98\u7F51\u7EDF\u4E00\u7FFB\u8BD1\u751F\u6210\uFF0C\u4E0D\u624B\u5DE5\u91CD\u590D\u7F16\u5199\u82F1\u6587\u7248\u3002\n- \u524D\u7AEF\u65B0 HTTP \u4EE3\u7801\u4F18\u5148\u4F7F\u7528\u4E0E\u540E\u7AEF\u53C2\u6570\u57FA\u672C\u4E00\u81F4\u7684 `V8.Http`\uFF1B\u65E7 `V8.Post/Get` \u53EA\u4F5C\u517C\u5BB9\u4FDD\u7559\u3002\n",Fi=`
|
|
1066
|
+
|
|
1067
|
+
## MicroService \u53D1\u5E03\u540E\u8FD0\u884C\u63A2\u6D4B\u4E0E 502 \u6062\u590D\u89C4\u5219
|
|
1068
|
+
|
|
1069
|
+
- \u53D1\u5E03\u56DE\u8BFB\u540E\u8FD8\u5FC5\u987B\u76F4\u63A5\u63A2\u6D4B\u7A33\u5B9A\u5165\u53E3\u3001\u7248\u672C\u5165\u53E3\u548C\u6E05\u5355\u5185 JS/CSS\uFF1B\u5143\u6570\u636E\u3001\u9875\u9762\u8DEF\u7531\u548C\u83DC\u5355\u5B58\u5728\u4E0D\u80FD\u8BC1\u660E\u9875\u9762\u53EF\u8FD0\u884C\u3002
|
|
1070
|
+
- \u82E5\u7A33\u5B9A\u5165\u53E3\u8FD4\u56DE 502\uFF0C\u4F18\u5148\u68C0\u67E5 API \u8282\u70B9\u901A\u8FC7\u79DF\u6237 MinIO \u5185\u7F51\u7AEF\u70B9\u8BFB\u53D6\u516C\u6709\u6876\u7684\u94FE\u8DEF\uFF0C\u7981\u6B62\u7528\u91CD\u590D\u53D1\u5E03\u63A9\u76D6\u5B58\u50A8\u8BFB\u53D6\u6545\u969C\u3002
|
|
1071
|
+
- \u670D\u52A1\u5668\u6682\u672A\u90E8\u7F72\u4FEE\u590D\u4E14\u4EA7\u7269\u5F88\u5C0F\u65F6\uFF0C\u53EF\u77ED\u671F\u4F7F\u7528\u6570\u636E\u5E93\u5185\u8054\u8D44\u6E90\u6062\u590D\uFF1B\u4FEE\u590D\u90E8\u7F72\u540E\u5FC5\u987B\u91CD\u65B0\u6D41\u5F0F\u53D1\u5E03\u5E76\u6062\u590D HDFS\uFF0C\u7981\u6B62\u957F\u671F\u628A\u5927 JS/CSS \u653E\u5728\u6570\u636E\u5E93 JSON\u3002
|
|
1072
|
+
`,Ai=`# Microi\u543E\u7801 V8\u5F15\u64CE API \u77E5\u8BC6\u5E93
|
|
1073
|
+
|
|
1074
|
+
> \u6B64\u6587\u4EF6\u7531 Microi\u543E\u7801 VS Code \u63D2\u4EF6\u81EA\u52A8\u751F\u6210\uFF0C\u4E3A AI \u7F16\u7A0B\u52A9\u624B\u63D0\u4F9B V8 \u5F15\u64CE API \u4E0A\u4E0B\u6587\u3002
|
|
1075
|
+
|
|
1076
|
+
## \u6982\u8FF0
|
|
1077
|
+
|
|
1078
|
+
Microi\u543E\u7801\u662F\u4E00\u4E2A\u5F00\u6E90 AI \u4F4E\u4EE3\u7801\u5E73\u53F0\uFF08.NET10 + Vue3 + Redis\uFF09\uFF0CV8\u5F15\u64CE\uFF08\u57FA\u4E8E Jint\uFF0C.NET \u4E0A\u7684 JavaScript \u89E3\u91CA\u5668\uFF09\u662F\u5176\u6838\u5FC3\u811A\u672C\u5F15\u64CE\u3002
|
|
1079
|
+
\u7528\u6237\u5728"\u63A5\u53E3\u5F15\u64CE"\u548C"\u8868\u5355\u5F15\u64CEV8\u4E8B\u4EF6"\u4E2D\u7F16\u5199 JavaScript \u4EE3\u7801\uFF0C\u901A\u8FC7\u5168\u5C40\u5BF9\u8C61 \`V8\` \u8BBF\u95EE\u540E\u7AEF\u80FD\u529B\u3002
|
|
1080
|
+
|
|
1081
|
+
## \u63A5\u53E3\u5F15\u64CE
|
|
1082
|
+
|
|
1083
|
+
\u63A5\u53E3\u5F15\u64CE\u5141\u8BB8\u7528\u6237\u7528 JavaScript \u7F16\u5199\u540E\u7AEF API \u903B\u8F91\u3002\u6BCF\u4E2A\u63A5\u53E3\u5F15\u64CE\u6709\u552F\u4E00\u7684 \`ApiEngineKey\`\u3002
|
|
1084
|
+
\u5728\u7EBF\u7F16\u5199\uFF0C\u4FDD\u5B58\u5373\u751F\u6548\uFF0C\u652F\u6301 Get/Post \u8BF7\u6C42\uFF0C\u652F\u6301 form/json/url \u4E09\u79CD\u53C2\u6570\u683C\u5F0F\u3002
|
|
1085
|
+
|
|
1086
|
+
**\u8FD4\u56DE\u503C\u65B9\u5F0F\uFF1A**
|
|
1087
|
+
\`\`\`js
|
|
1088
|
+
return { Code: 1, Data: [1,2,3] }; // \u5E26Code\u5BF9\u8C61\u4EC5Code=1\u63D0\u4EA4\uFF0C\u5176\u4ED6\u503C\u56DE\u6EDA
|
|
1089
|
+
return '\u5B57\u7B26\u4E32'; // \u76F4\u63A5\u8FD4\u56DE\u5B57\u7B26\u4E32
|
|
1090
|
+
return '<html>...</html>'; // \u8FD4\u56DEHTML
|
|
1091
|
+
// \u8FD4\u56DE\u6587\u4EF6\uFF08\u9700\u5F00\u542F"\u54CD\u5E94\u6587\u4EF6"\uFF09
|
|
1092
|
+
return { Code:1, Data:{ FileName:'a.png', ContentType:'image/png', FileByteBase64: base64 } };
|
|
1093
|
+
\`\`\`
|
|
1094
|
+
|
|
1095
|
+
**\u914D\u7F6E\u9879\uFF1A** StopHttp\uFF08\u7981\u6B62\u5916\u90E8\u8C03\u7528\uFF09\u3001ApiAddress\uFF08\u81EA\u5B9A\u4E49\u5730\u5740\uFF09\u3001\u5206\u5E03\u5F0F\u9501\u3001\u5141\u8BB8\u533F\u540D\u8C03\u7528\u3001\u54CD\u5E94\u6587\u4EF6
|
|
1096
|
+
|
|
1097
|
+
**\u5F02\u6B65\u4E0E\u540E\u53F0\u4EFB\u52A1\uFF1A** \u8BF7\u6C42\u5185\u5F02\u6B65\u65B9\u6CD5\u4F7F\u7528 \`await\`\uFF1B\`setTimeout\` / \`Task.Run\` \u4E0D\u80FD\u4FDD\u8BC1\u8BF7\u6C42\u8FD4\u56DE\u540E\u7EE7\u7EED\u5DE5\u4F5C\uFF0C\u56E0\u4E3A Engine\u3001\u79DF\u6237\u4E0A\u4E0B\u6587\u548C\u4E8B\u52A1\u4F1A\u88AB\u91CA\u653E\u3002\u9884\u8BA1\u8D85\u8FC7 2 \u5206\u949F\u3001500 \u6761\u30011000 \u4E2A\u6247\u51FA\u5B50\u64CD\u4F5C\u3001100 \u6B21\u5916\u90E8\u8C03\u7528\u6216\u5B89\u88C5/\u521D\u59CB\u5316/\u8FC1\u79FB/\u5907\u4EFD\u7C7B\u5DE5\u4F5C\uFF0C\u4F7F\u7528 \`V8.ApiEngine.RunBackground\` \u5E76\u914D\u7F6E\u7A33\u5B9A \`IdempotencyKey\`\u3002\u4E1A\u52A1\u8BB0\u5F55\u81F3\u5C11\u5199\u201C\u5904\u7406\u4E2D\u201D\u72B6\u6001\u548C \`BackgroundTaskId\`\uFF1B\u901A\u8FC7 \`V8.Method.UpdateBackgroundTask({Current,Total,Msg})\` \u4E0A\u62A5\u771F\u5B9E\u5355\u4F4D\uFF0C\u5E73\u53F0\u6839\u636E\u5B9E\u9645\u541E\u5410\u4F30\u7B97\u7ED3\u675F\u65F6\u95F4\u3002\u603B\u91CF\u672A\u77E5\u65F6\u4E0D\u8981\u4F2A\u9020\u767E\u5206\u6BD4\uFF1B\u8D85\u8FC7 10 \u5206\u949F\u7684\u5DE5\u4F5C\u5FC5\u987B\u6309 checkpoint \u5206\u7247\u3001\u6BCF\u7247\u72EC\u7ACB\u4E8B\u52A1\u3002
|
|
1098
|
+
|
|
1099
|
+
**Jint\u9884\u7B97\u4E0E\u5D4C\u5957\uFF1A** \`LimitMemory\` \u662F\u5355\u5C42Jint\u6267\u884C\u671F\u95F4\u7684\u7D2F\u8BA1\u6258\u7BA1\u5206\u914D\uFF0C\u4E0D\u662F\u5B9E\u65F6\u5806\u6216\u9884\u7559\u5185\u5B58\u3002\`V8.ApiEngine.Run\` \u591A\u5C42\u8C03\u7528\u662F\u6B63\u5E38\u80FD\u529B\uFF1B\u65B0\u7248\u9ED8\u8BA4\u9694\u79BB\u7236\u5B50\u5355\u5C42\u9884\u7B97\uFF0C\u5E76\u4FDD\u7559\u6839\u8C03\u7528\u6811\u603B\u9884\u7B97\u3002\u63A5\u53E3\u5D4C\u5957\u4E0EJavaScript\u51FD\u6570\u9012\u5F52\u662F\u4E24\u79CD\u9650\u5236\u3002\u7528 \`V8.Limits\` \u67E5\u770B\u672C\u7247\u6709\u6548\u9884\u7B97\uFF1B\u540E\u53F0\u4EFB\u52A1\u603B\u65F6\u957F\u53EF\u8D85\u8FC710/30\u5206\u949F\uFF0C\u4F46\u6BCF\u7247\u4ECD\u53D7\u8D85\u65F6\u3001\u8BED\u53E5\u548C\u7D2F\u8BA1\u5206\u914D\u9884\u7B97\uFF0C\u5FC5\u987B\u7528 \`HasMore + Checkpoint\` \u7EED\u8DD1\u3002\u53EA\u6709\u4E1A\u52A1\u660E\u786E\u8981\u6C42\u8DE8\u5B8C\u6574\u4E1A\u52A1\u94FE\u4FDD\u6301\u4E00\u4E2A\u6570\u636E\u5E93\u4E8B\u52A1\u3001\u65E0\u6CD5\u5B89\u5168\u5206\u7247\u65F6\uFF0C\u624D\u53EF\u901A\u8FC7 MCP/Manifest \u663E\u5F0F\u8BBE\u7F6E \`v8Unlimited:true\`\u3002\u5B83\u53EA\u53D6\u6D88\u8BE5\u63A5\u53E3\u6216\u8BE5\u8868\u540E\u7AEF V8 \u4E8B\u4EF6\u7684\u5355\u6B21 Jint \u8D85\u65F6\u3001\u8BED\u53E5\u3001\u9012\u5F52\u3001\u7D2F\u8BA1\u5206\u914D\u4E0E Promise \u56FA\u5B9A\u7B49\u5F85\u9650\u5236\uFF0C\u8FDB\u7A0B\u5E38\u9A7B\u5185\u5B58\u4FDD\u62A4\u3001\u8BF7\u6C42\u53D6\u6D88\u3001\u5E76\u53D1\u3001\u5D4C\u5957\u6DF1\u5EA6\u4E0E\u5B89\u5168\u8FB9\u754C\u4ECD\u751F\u6548\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u4F20\u7ED9\u5D4C\u5957\u63A5\u53E3\u3002AI \u4E0D\u5F97\u4EC5\u56E0\u6570\u636E\u91CF\u5927\u800C\u81EA\u52A8\u5F00\u542F\uFF0C\u5F00\u542F\u524D\u5FC5\u987B\u63D0\u793A\u6570\u636E\u5E93\u9501\u3001\u4E8B\u52A1\u65E5\u5FD7/undo\u3001\u56DE\u6EDA\u65F6\u95F4\u3001\u8FDE\u63A5\u8D85\u65F6\u548C\u8FDB\u7A0B\u5185\u5B58\u98CE\u9669\u3002
|
|
1100
|
+
|
|
1101
|
+
---
|
|
1102
|
+
|
|
1103
|
+
## V8.FormEngine \u2014 \u8868\u5355\u5F15\u64CE CRUD
|
|
1104
|
+
|
|
1105
|
+
\u6240\u6709\u65B9\u6CD5\u7B2C\u4E00\u4E2A\u53C2\u6570\u4E3A\u8868\u540D\u6216\u8868Key\uFF08\u4E0D\u533A\u5206\u5927\u5C0F\u5199\uFF09\uFF0C\u7B2C\u4E8C\u4E2A\u53C2\u6570\u4E3A\u67E5\u8BE2/\u64CD\u4F5C\u6761\u4EF6\u5BF9\u8C61\u3002\u540E\u7AEF\u53EF\u4FE1 V8 \u8C03\u7528\u4E0D\u8981\u6C42 \`_SysMenuId\`\uFF1B\u6D4F\u89C8\u5668 HTTP \u5FC5\u987B\u901A\u8FC7\u771F\u5B9E\u83DC\u5355\u3001\u5386\u53F2\u6388\u6743\u63A8\u65AD\u3001\u76F4\u63A5\u8868\u6743\u9650\u6216\u53D7\u63A7 TableChild \u59D4\u6258\u3002\u5916\u90E8 JSON \u4E0D\u80FD\u4F2A\u9020\u53EF\u4FE1\u8C03\u7528\uFF0C\`_InvokeType\` \u4E5F\u4E0D\u662F\u6388\u6743\u6807\u8BB0\u3002
|
|
1106
|
+
|
|
1107
|
+
\`\`\`js
|
|
1108
|
+
// \u83B7\u53D6\u5355\u6761\u6570\u636E\uFF08Code=2\u8868\u793A\u6570\u636E\u4E0D\u5B58\u5728\uFF09
|
|
1109
|
+
var result = V8.FormEngine.GetFormData('Sys_User', {
|
|
1110
|
+
_Where: [['Account', '=', 'admin']],
|
|
1111
|
+
_SelectFields: ['Id', 'Account', 'Name']
|
|
1112
|
+
});
|
|
1113
|
+
|
|
1114
|
+
// \u83B7\u53D6\u5217\u8868\uFF08\u5206\u9875\uFF09
|
|
1115
|
+
var result = V8.FormEngine.GetTableData('Sys_User', {
|
|
1116
|
+
Ids: [1,2,3], // \u6309Id\u5217\u8868\u67E5
|
|
1117
|
+
_Where: [['Status', '=', 1]],
|
|
1118
|
+
_SelectFields: ['Id', 'Account', 'Name'],
|
|
1119
|
+
_OrderBy: 'CreateTime',
|
|
1120
|
+
_OrderByType: 'DESC',
|
|
1121
|
+
_OrderBys: { 'Account':'asc', 'Phone':'desc' }, // \u591A\u5B57\u6BB5\u6392\u5E8F
|
|
1122
|
+
_PageIndex: 1,
|
|
1123
|
+
_PageSize: 20
|
|
1124
|
+
});
|
|
1125
|
+
|
|
1126
|
+
// \u533F\u540D\u67E5\u8BE2\uFF08\u65E0\u9700\u767B\u5F55\uFF09
|
|
1127
|
+
var result = V8.FormEngine.GetTableDataAnonymous('Article', { _PageSize: 10 });
|
|
1128
|
+
|
|
1129
|
+
// \u533F\u540D\u65B0\u589E\uFF08\u65E0\u9700\u767B\u5F55\uFF0C\u9700\u8C28\u614E\u5F00\u653E\uFF09
|
|
1130
|
+
var result = V8.FormEngine.AddFormDataAnonymous('Feedback', { Title: '\u610F\u89C1', Content: '...' });
|
|
1131
|
+
|
|
1132
|
+
// \u83B7\u53D6\u603B\u6570
|
|
1133
|
+
var result = V8.FormEngine.GetTableDataCount('Sys_User', { _Where: [['Status', '=', 1]] });
|
|
1134
|
+
|
|
1135
|
+
// \u83B7\u53D6\u6811\u5F62\u6570\u636E
|
|
1136
|
+
var result = V8.FormEngine.GetTableDataTree('Department', {});
|
|
1137
|
+
|
|
1138
|
+
// \u65B0\u589E\u6570\u636E
|
|
1139
|
+
var result = V8.FormEngine.AddFormData('Sys_User', { Account: 'test', Name: '\u6D4B\u8BD5' });
|
|
1140
|
+
|
|
1141
|
+
// \u6279\u91CF\u65B0\u589E
|
|
1142
|
+
var addList = [{ FormEngineKey:'\u8868\u540D', Age:18 }, { FormEngineKey:'\u8868\u540D', Age:20 }];
|
|
1143
|
+
V8.FormEngine.AddTableData(addList);
|
|
1144
|
+
|
|
1145
|
+
// \u6279\u91CF\u66F4\u65B0 / \u6279\u91CF\u5220\u9664
|
|
1146
|
+
V8.FormEngine.UptTableData('Sys_User', [{ Id:'id1', Status:1 }, { Id:'id2', Status:0 }]);
|
|
1147
|
+
V8.FormEngine.DelTableData('Sys_User', [{ Id:'id1' }, { Id:'id2' }]);
|
|
1148
|
+
|
|
1149
|
+
// \u66F4\u65B0\u6570\u636E\uFF08\u9700\u4F20Id\uFF09
|
|
1150
|
+
var result = V8.FormEngine.UptFormData('Sys_User', {
|
|
1151
|
+
Id: 'xxx', Name: '\u65B0\u540D\u5B57',
|
|
1152
|
+
_NotSaveField: ['\u5B57\u6BB51'], // \u5FFD\u7565\u5B57\u6BB5\u4E0D\u66F4\u65B0
|
|
1153
|
+
_NoLineForAdd: true, // \u4E0D\u5B58\u5728\u5219\u65B0\u589E
|
|
1154
|
+
_ForceUpt: true // \u5F3A\u5236\u4FEE\u6539\u81EA\u52A8\u7F16\u53F7\u5B57\u6BB5
|
|
1155
|
+
});
|
|
1156
|
+
|
|
1157
|
+
// \u6309\u6761\u4EF6\u66F4\u65B0
|
|
1158
|
+
var result = V8.FormEngine.UptFormDataByWhere('Sys_User', {
|
|
1159
|
+
_Where: [['Account', '=', 'test']],
|
|
1160
|
+
Status: 0
|
|
1161
|
+
});
|
|
1162
|
+
|
|
1163
|
+
// \u5220\u9664\uFF08\u5355\u6761 / \u6279\u91CF\uFF09
|
|
1164
|
+
var result = V8.FormEngine.DelFormData('Sys_User', { Id: 'xxx' });
|
|
1165
|
+
var result = V8.FormEngine.DelFormData('Sys_User', { Ids: [1,2,3] });
|
|
1166
|
+
|
|
1167
|
+
// \u6309\u6761\u4EF6\u5220\u9664
|
|
1168
|
+
var result = V8.FormEngine.DelFormDataByWhere('Sys_User', {
|
|
1169
|
+
_Where: [['Status', '=', 0]]
|
|
1170
|
+
});
|
|
1171
|
+
|
|
1172
|
+
// \u4EC5\u5728\u786E\u5B9E\u5E0C\u671B\u518D\u6B21\u89E6\u53D1\u8868\u5355V8\u4E8B\u4EF6\u65F6\u4F7F\u7528Client\uFF1B\u7701\u7565/Server\u4E0D\u4F1A\u91CD\u65B0\u89E6\u53D1
|
|
1173
|
+
var result = V8.FormEngine.UptFormData('TableName', { Id: 'x', Field: 'val', _InvokeType: 'Client' });
|
|
1174
|
+
|
|
1175
|
+
// \u65B0\u589E\u5B57\u6BB5\uFF08\u52A8\u6001\u5EFA\u8868\uFF09
|
|
1176
|
+
V8.FormEngine.AddField({
|
|
1177
|
+
TableName:'Diy_Test', Name:'Age', Type:'int',
|
|
1178
|
+
Label:'\u5E74\u9F84', Component:'NumberText', TableWidth:'100', Visible:1
|
|
1179
|
+
});
|
|
1180
|
+
\`\`\`
|
|
1181
|
+
|
|
1182
|
+
---
|
|
1183
|
+
|
|
1184
|
+
## _Where \u6761\u4EF6\u8BED\u6CD5
|
|
1185
|
+
|
|
1186
|
+
\u53C2\u6570\u5316\u67E5\u8BE2\uFF0C\u65E0 SQL \u6CE8\u5165\u98CE\u9669\u3002\u652F\u6301 MySQL\u3001Oracle\u3001SqlServer\u3002
|
|
1187
|
+
|
|
1188
|
+
\`\`\`js
|
|
1189
|
+
// \u57FA\u672C\u7528\u6CD5\uFF1A[\u5B57\u6BB5, \u64CD\u4F5C\u7B26, \u503C]
|
|
1190
|
+
_Where: [['Account', '=', 'test']]
|
|
1191
|
+
|
|
1192
|
+
// AND/OR \u6761\u4EF6\uFF1A[AndOr, \u5B57\u6BB5, \u64CD\u4F5C\u7B26, \u503C]
|
|
1193
|
+
_Where: [['Account', '=', 'test'], ['OR', 'Name', 'Like', '\u5F20']]
|
|
1194
|
+
|
|
1195
|
+
// \u5206\u7EC4\uFF08\u62EC\u53F7\uFF09
|
|
1196
|
+
_Where: [
|
|
1197
|
+
['Name', 'Like', '\u5F20'],
|
|
1198
|
+
['AND', '(', 'Age', '>', 18],
|
|
1199
|
+
['OR', 'Status', '=', 'active', ')']
|
|
1200
|
+
]
|
|
1201
|
+
|
|
1202
|
+
// In \u67E5\u8BE2
|
|
1203
|
+
_Where: [['Id', 'In', ['id1', 'id2', 'id3']]]
|
|
1204
|
+
|
|
1205
|
+
// NULL \u5224\u65AD
|
|
1206
|
+
_Where: [['Field', '=', null]] // IS NULL
|
|
1207
|
+
_Where: [['Field', '<>', null]] // IS NOT NULL
|
|
1208
|
+
|
|
1209
|
+
// \u65E5\u671F\u67E5\u8BE2
|
|
1210
|
+
_Where: [['CreateTime', '>', DateFormat(new Date(), 'yyyy-MM-dd HH:mm:ss')]]
|
|
1211
|
+
\`\`\`
|
|
1212
|
+
|
|
1213
|
+
**\u652F\u6301\u7684\u64CD\u4F5C\u7B26\uFF1A** \`=\`, \`==\`, \`Equal\`, \`<>\`, \`!=\`, \`NotEqual\`, \`>\`, \`>=\`, \`<\`, \`<=\`, \`Like\`, \`NotLike\`, \`StartLike\`, \`EndLike\`, \`NotStartLike\`, \`NotEndLike\`, \`In\`, \`NotIn\`
|
|
1214
|
+
|
|
1215
|
+
---
|
|
1216
|
+
|
|
1217
|
+
## V8.Db / V8.DbRead \u2014 \u6570\u636E\u5E93\u64CD\u4F5C
|
|
1218
|
+
|
|
1219
|
+
\`V8.Db\` \u4E3A\u4E3B\u5E93\uFF08\u8BFB\u5199\uFF09\uFF0C\`V8.DbRead\` \u4E3A\u4ECE\u5E93\uFF08\u53EA\u8BFB\uFF09\u3002\`FromSql\` \u53EA\u4F20 SQL \u5B57\u7B26\u4E32\uFF1B\u52A8\u6001\u503C\u5FC5\u987B\u7528 \`.AddInParameter('@p0', value)\` \u94FE\u5F0F\u7ED1\u5B9A\u3002\u666E\u901A\u5355\u8868\u67E5\u8BE2\u4F18\u5148\u4F7F\u7528 \`V8.FormEngine.GetTableData + _Where\`\u3002
|
|
1220
|
+
|
|
1221
|
+
\`\`\`js
|
|
1222
|
+
// \u67E5\u8BE2\u5217\u8868
|
|
1223
|
+
var list = V8.Db.FromSql('SELECT * FROM Sys_User WHERE Status = @p0')
|
|
1224
|
+
.AddInParameter('@p0', 1)
|
|
1225
|
+
.ToArray();
|
|
1226
|
+
|
|
1227
|
+
// \u67E5\u8BE2\u5355\u6761
|
|
1228
|
+
var user = V8.Db.FromSql('SELECT * FROM Sys_User WHERE Id = @p0')
|
|
1229
|
+
.AddInParameter('@p0', userId)
|
|
1230
|
+
.First();
|
|
1231
|
+
|
|
1232
|
+
// \u6267\u884C\u975E\u67E5\u8BE2
|
|
1233
|
+
var affected = V8.Db.FromSql('UPDATE Sys_User SET Status = @p0 WHERE Id = @p1')
|
|
1234
|
+
.AddInParameter('@p0', 0)
|
|
1235
|
+
.AddInParameter('@p1', userId)
|
|
1236
|
+
.ExecuteNonQuery();
|
|
1237
|
+
|
|
1238
|
+
// \u6267\u884C\u6807\u91CF
|
|
1239
|
+
var count = V8.Db.FromSql('SELECT COUNT(*) FROM Sys_User').ToScalar();
|
|
1240
|
+
|
|
1241
|
+
// \u4E8B\u52A1\uFF1A\u63A5\u53E3\u5F15\u64CE\u4E2D return Code=1 \u81EA\u52A8\u63D0\u4EA4\uFF0CCode\u22601 \u81EA\u52A8\u56DE\u6EDA\uFF0C\u7981\u6B62\u624B\u52A8 Commit/Rollback
|
|
1242
|
+
// \u8868\u5355V8\u4E8B\u4EF6\u4E2D\uFF1A\u53EF\u5171\u4EAB\u4E8B\u52A1
|
|
1243
|
+
var result = V8.FormEngine.GetFormData('table', { Id: V8.Form.Id }, V8.DbTrans);
|
|
1244
|
+
|
|
1245
|
+
// \u8DE8\u6570\u636E\u5E93\uFF08\u6269\u5C55\u5E93\uFF09
|
|
1246
|
+
var dataList = V8.Dbs.OracleDB1.FromSql('SELECT * FROM table').ToArray();
|
|
1247
|
+
// microi_database \u7684\u540E\u7AEF\u63D0\u4EA4\u540E\u4E8B\u4EF6\u8C03\u7528\u6B64\u65B9\u6CD5\uFF1B\u4E8B\u52A1\u63D0\u4EA4\u540E\u5237\u65B0\u5168\u90E8\u8282\u70B9
|
|
1248
|
+
V8.Method.RefreshExtensionDatabases();
|
|
1249
|
+
// \u4E34\u65F6\u76F4\u8FDE\uFF08\u53EA\u5728\u5F53\u524D\u8BF7\u6C42\u5185\u6709\u6548\uFF1B\u8FDE\u63A5\u5B57\u7B26\u4E32\u5FC5\u987B\u6765\u81EA\u53EF\u4FE1\u670D\u52A1\u7AEF\u914D\u7F6E\uFF0C\u7981\u6B62\u76F4\u63A5\u4F7F\u7528 V8.Param\uFF09
|
|
1250
|
+
var tempDb = V8.Dbs.Open('SqlServer', 'Server=127.0.0.1,1433;Database=app;User Id=user;Password=***;TrustServerCertificate=True;');
|
|
1251
|
+
var tempList = tempDb.FromSql('SELECT * FROM Users WHERE Status = @p0')
|
|
1252
|
+
.AddInParameter('@p0', 1)
|
|
1253
|
+
.ToArray();
|
|
1254
|
+
// \u6269\u5C55\u5E93\u72EC\u7ACB\u4E8B\u52A1
|
|
1255
|
+
var exTrans = V8.Dbs.EmptyEx.BeginTransaction();
|
|
1256
|
+
exTrans.FromSql("DELETE FROM table WHERE Id = @p0")
|
|
1257
|
+
.AddInParameter('@p0', id)
|
|
1258
|
+
.ExecuteNonQuery();
|
|
1259
|
+
exTrans.Commit();
|
|
1260
|
+
exTrans.Close();
|
|
1261
|
+
\`\`\`
|
|
1262
|
+
|
|
1263
|
+
---
|
|
1264
|
+
|
|
1265
|
+
## V8.Cache \u2014 Redis \u7F13\u5B58
|
|
1266
|
+
|
|
1267
|
+
\`\`\`js
|
|
1268
|
+
V8.Cache.Set('key', 'value', 3600); // \u79D2\u6570\u8FC7\u671F
|
|
1269
|
+
V8.Cache.Set('key', 'value', '0.00:00:59'); // d.HH:mm:ss \u683C\u5F0F
|
|
1270
|
+
var val = V8.Cache.Get('key');
|
|
1271
|
+
V8.Cache.Remove('key');
|
|
1272
|
+
var exists = V8.Cache.Exists('key');
|
|
1273
|
+
var exists2 = V8.Cache.KeyExist('key'); // \u771F\u5B9E\u63A5\u53E3\u540D
|
|
1274
|
+
V8.Cache.HashSet('hashKey', 'field1', 'value');
|
|
1275
|
+
var hashVal = V8.Cache.HashGet('hashKey', 'field1');
|
|
1276
|
+
var hashAll = V8.Cache.HashGetAll('hashKey');
|
|
1277
|
+
V8.Cache.HashDelete('hashKey', 'field1');
|
|
1278
|
+
// Key\u547D\u540D\u89C4\u8303\uFF1AMicroi:\${V8.OsClient}:{\u5206\u7C7B}:{Key}
|
|
1279
|
+
\`\`\`
|
|
1280
|
+
|
|
1281
|
+
---
|
|
1282
|
+
|
|
1283
|
+
## V8.Http \u2014 HTTP \u8BF7\u6C42
|
|
1284
|
+
|
|
1285
|
+
\`\`\`js
|
|
1286
|
+
// GET\uFF1A\u5FC5\u987B\u4F7F\u7528\u5BF9\u8C61\u53C2\u6570\u683C\u5F0F
|
|
1287
|
+
var result = V8.Http.Get({
|
|
1288
|
+
Url: 'https://api.example.com/data',
|
|
1289
|
+
GetParam: { page: 1 },
|
|
1290
|
+
Timeout: 600, // \u79D2\uFF0C\u9ED8\u8BA4 10 \u5206\u949F
|
|
1291
|
+
Headers: { token: 'xxx' }
|
|
1292
|
+
});
|
|
1293
|
+
|
|
1294
|
+
// POST
|
|
1295
|
+
var result = V8.Http.Post({
|
|
1296
|
+
Url: 'https://api.example.com/data',
|
|
1297
|
+
PostParam: { key: 'value' },
|
|
1298
|
+
ParamType: 'json', // 'json' | 'form' | 'xml' | 'binary'
|
|
1299
|
+
Timeout: 600, // \u79D2\uFF0C\u9ED8\u8BA4 10 \u5206\u949F
|
|
1300
|
+
Headers: { token: 'xxx' },
|
|
1301
|
+
FilesByteBase64: {} // \u4E0A\u4F20\u6587\u4EF6
|
|
1302
|
+
});
|
|
1303
|
+
|
|
1304
|
+
// PATCH\uFF1A\u4E0E POST \u5BF9\u79F0\uFF0C\u4F7F\u7528 PatchParam / PatchParamString
|
|
1305
|
+
var result = V8.Http.Patch({
|
|
1306
|
+
Url: 'https://api.example.com/data/1',
|
|
1307
|
+
PatchParamString: JSON.stringify({ nested: { enabled: true } }),
|
|
1308
|
+
ParamType: 'json'
|
|
1309
|
+
});
|
|
1310
|
+
|
|
1311
|
+
// \u5B8C\u6574\u54CD\u5E94\uFF1AGetResponse / PostResponse / PatchResponse
|
|
1312
|
+
var resp = V8.Http.PatchResponse({
|
|
1313
|
+
Url: 'https://api.example.com/data/1',
|
|
1314
|
+
PatchParam: { enabled: true },
|
|
1315
|
+
ParamType: 'json'
|
|
1316
|
+
});
|
|
1317
|
+
// resp.Content, resp.Headers, resp.RawBytes, resp.StatusCode, resp.ErrorMessage
|
|
1318
|
+
\`\`\`
|
|
1319
|
+
|
|
1320
|
+
---
|
|
1321
|
+
|
|
1322
|
+
## V8.ApiEngine \u2014 \u8C03\u7528\u5176\u4ED6\u63A5\u53E3\u5F15\u64CE
|
|
1323
|
+
|
|
1324
|
+
\`\`\`js
|
|
1325
|
+
var result = V8.ApiEngine.Run('otherApiEngineKey', { param1: 'value1' });
|
|
1326
|
+
// \u5171\u4EAB\u4E8B\u52A1\uFF08\u5728\u8868\u5355V8\u4E8B\u4EF6\u4E2D\uFF09
|
|
1327
|
+
var result = V8.ApiEngine.Run('key', { Form: V8.Form }, V8.DbTrans);
|
|
1328
|
+
\`\`\`
|
|
1329
|
+
|
|
1330
|
+
---
|
|
1331
|
+
|
|
1332
|
+
## V8.MongoDb \u2014 MongoDB \u64CD\u4F5C
|
|
1333
|
+
|
|
1334
|
+
\u53C2\u6570\u683C\u5F0F\u4E3A\u5BF9\u8C61\uFF0C\u5305\u542B DbName\u3001TableName \u5B57\u6BB5\u3002
|
|
1335
|
+
|
|
1336
|
+
\`\`\`js
|
|
1337
|
+
V8.MongoDb.AddFormData({ DbName:'mydb', TableName:'users', _FormData:{ name:'\u5F20\u4E09', age:25 } });
|
|
1338
|
+
var doc = V8.MongoDb.GetFormData({ DbName:'mydb', TableName:'users', Id:'xxx' });
|
|
1339
|
+
var docs = V8.MongoDb.GetTableData({ DbName:'mydb', TableName:'users', _Where:[['age','>',18]] });
|
|
1340
|
+
V8.MongoDb.UptFormData({ DbName:'mydb', TableName:'users', Id:'xxx', _FormData:{ age:26 } });
|
|
1341
|
+
V8.MongoDb.DelFormData({ DbName:'mydb', TableName:'users', Id:'xxx' });
|
|
1342
|
+
\`\`\`
|
|
1343
|
+
|
|
1344
|
+
---
|
|
1345
|
+
|
|
1346
|
+
## V8.Method \u2014 \u5185\u7F6E\u65B9\u6CD5
|
|
1347
|
+
|
|
1348
|
+
\`\`\`js
|
|
1349
|
+
var token = V8.Method.GetCurrentToken(token, osClient); // \u8FD4\u56DE {OsClient,CurrentUser,Token}
|
|
1350
|
+
V8.Method.RefreshLoginUser(userId, osClient);
|
|
1351
|
+
V8.Method.ClearUserLoginInfo(userId, osClient); // \u7BA1\u7406\u5458\u6E05\u9664\u5168\u90E8\u7EC8\u7AEF\u767B\u5F55\u4FE1\u606F\u5E76\u540A\u9500\u6240\u6709Token
|
|
1352
|
+
V8.Method.RefreshExtensionDatabases(); // \u4E8B\u52A1\u63D0\u4EA4\u540E\u5237\u65B0\u5168\u90E8\u8282\u70B9\u7684 V8.Dbs \u7F13\u5B58
|
|
1353
|
+
var url = V8.Method.GetPrivateFileUrl({ FilePathName:'...' });
|
|
1354
|
+
V8.Method.AddSysLog({ Type:'', Title:'', Content:'', Level:1 });
|
|
1355
|
+
var guid = V8.Method.NewGuid();
|
|
1356
|
+
var ulid = V8.Method.NewUlid();
|
|
1357
|
+
var ts = V8.Method.GetTimestamp(); // Unix\u79D2\u7EA7\u65F6\u95F4\u6233
|
|
1358
|
+
var oldWhere = V8.Method.ParseWhere(V8.Param._Where); // \u65B0\u7248\u2192\u65E7\u7248Where\u8F6C\u6362
|
|
1359
|
+
// \u6587\u4EF6\u4E0A\u4F20
|
|
1360
|
+
var upResult = V8.Method.Upload({
|
|
1361
|
+
FilesByteBase64: V8.FilesByteBase64,
|
|
1362
|
+
Limit: false, Preview: false, Path: '/test-upload', OsClient: V8.OsClient
|
|
1363
|
+
});
|
|
1364
|
+
\`\`\`
|
|
1365
|
+
|
|
1366
|
+
---
|
|
1367
|
+
|
|
1368
|
+
## V8.EncryptHelper \u2014 \u52A0\u5BC6
|
|
1369
|
+
|
|
1370
|
+
\`\`\`js
|
|
1371
|
+
V8.EncryptHelper.MD5Encrypt('text');
|
|
1372
|
+
V8.EncryptHelper.SHA256('text');
|
|
1373
|
+
V8.EncryptHelper.SHA1('text');
|
|
1374
|
+
V8.EncryptHelper.SHA512('text');
|
|
1375
|
+
V8.EncryptHelper.Sha256Hex('text');
|
|
1376
|
+
V8.EncryptHelper.HmacSha256(key, data);
|
|
1377
|
+
V8.EncryptHelper.AESEncrypt('text', 'key');
|
|
1378
|
+
V8.EncryptHelper.AESDecrypt(encrypted, 'key');
|
|
1379
|
+
V8.EncryptHelper.DESEncode('text'); // DES\u52A0\u5BC6
|
|
1380
|
+
V8.EncryptHelper.DESDecode('cipher'); // DES\u89E3\u5BC6
|
|
1381
|
+
\`\`\`
|
|
1382
|
+
|
|
1383
|
+
---
|
|
1384
|
+
|
|
1385
|
+
## V8.Base64
|
|
1386
|
+
|
|
1387
|
+
\`\`\`js
|
|
1388
|
+
V8.Base64.StringToBase64('Hello'); // \u7F16\u7801
|
|
1389
|
+
V8.Base64.Base64ToString('SGVsbG8='); // \u89E3\u7801
|
|
1390
|
+
\`\`\`
|
|
1391
|
+
|
|
1392
|
+
---
|
|
1393
|
+
|
|
1394
|
+
## V8.Office
|
|
1395
|
+
|
|
1396
|
+
\`\`\`js
|
|
1397
|
+
V8.Office.SendEmail({
|
|
1398
|
+
SmtpServer:'smtp.qq.com', SmtpPort:587, EnableSSL:true,
|
|
1399
|
+
SystemEmail:'admin@itdos.com', SystemEmailPwd:'...',
|
|
1400
|
+
EmailSubject:'\u6807\u9898', EmailBody:'<b>HTML\u5185\u5BB9</b>',
|
|
1401
|
+
Receivers:['a@qq.com']
|
|
1402
|
+
});
|
|
1403
|
+
// \u591A Sheet Excel\uFF1A\u6807\u51C6\u8868\u683C\u4E0E\u9AD8\u7EA7 ExcelLayout \u53EF\u4EE5\u6DF7\u7528
|
|
1404
|
+
var excelResult = V8.Office.ExportExcel({
|
|
1405
|
+
OsClient: V8.OsClient,
|
|
1406
|
+
ExcelOptions: { DefaultColumnWidth:14, HeaderRowHeight:28, FreezeHeader:true, AutoFilter:true },
|
|
1407
|
+
ExcelSheets: [
|
|
1408
|
+
{ SheetName:'\u5BA1\u6279\u5355', ExcelLayout:{
|
|
1409
|
+
Cells:[
|
|
1410
|
+
{Range:'A1:H1',Value:'\u76D8\u76C8\u4E8F\u53CA\u62A5\u5E9F\u7533\u8BF7\u8868',Merge:true,Style:{Bold:true,FontSize:18,HorizontalAlignment:'Center',BorderStyle:'Thin'}},
|
|
1411
|
+
{Range:'A2:H8',Style:{BorderStyle:'Thin',BorderColor:'7F8C9A'}},
|
|
1412
|
+
{Range:'A8:G8',Value:'\u5408\u8BA1',Merge:true},{Range:'H8',Formula:'SUM(H3:H7)',Style:{NumberFormat:'#,##0.00'}}
|
|
1413
|
+
],
|
|
1414
|
+
Columns:[{Column:'A',Width:10},{Column:'H',Width:16}], Rows:[{Row:1,Height:42}]
|
|
1415
|
+
},ExcelOptions:{FreezeRows:2,PrintOrientation:'Landscape',PrintArea:'A1:H8'}},
|
|
1416
|
+
{ SheetName:'\u5BA2\u6237', ExcelData:customerList, ExcelHeader:[{Name:'Name',Label:'\u5BA2\u6237\u540D\u79F0',Component:'Text',Width:24}], ExcelOptions:{DataRowHeight:22} }
|
|
1417
|
+
]
|
|
1418
|
+
});
|
|
1419
|
+
var rows = V8.Office.ExcelToList({ FileByteBase64: base64, SheetIndex: 0 });
|
|
1420
|
+
|
|
1421
|
+
// \u5BCC\u6587\u672C Word\uFF1BExportWordText \u7EE7\u7EED\u517C\u5BB9\u65E7\u7248\u7EAF\u6587\u672C
|
|
1422
|
+
var wordResult = V8.Office.ExportWord({
|
|
1423
|
+
Title:'\u6708\u5EA6\u62A5\u544A', HeaderText:'\u543E\u7801', FooterText:'\u5185\u90E8\u8D44\u6599', ShowPageNumber:true,
|
|
1424
|
+
Paragraphs:[{Text:'\u6B63\u6587',FirstLineIndent:0.74}],
|
|
1425
|
+
Tables:[{Headers:['\u6307\u6807','\u503C'],Rows:[['\u9500\u552E\u989D',1280000]]}]
|
|
1426
|
+
});
|
|
1427
|
+
|
|
1428
|
+
// PowerPoint \u591A\u9875\u5BFC\u51FA
|
|
1429
|
+
var pptResult = V8.Office.ExportPowerPoint({
|
|
1430
|
+
Title:'\u5B63\u5EA6\u6C47\u62A5', ShowSlideNumber:true,
|
|
1431
|
+
Slides:[
|
|
1432
|
+
{Layout:'TitleSlide',Title:'\u5B63\u5EA6\u6C47\u62A5',Subtitle:DateNow('yyyy-MM-dd')},
|
|
1433
|
+
{Title:'\u6838\u5FC3\u7ED3\u8BBA',Bullets:['\u6536\u5165\u589E\u957F','\u7EED\u7EA6\u7A33\u5B9A']}
|
|
1434
|
+
]
|
|
1435
|
+
});
|
|
1436
|
+
\`\`\`
|
|
1437
|
+
|
|
1438
|
+
---
|
|
1439
|
+
|
|
1440
|
+
## V8.MQ \u2014 \u6D88\u606F\u961F\u5217 (RabbitMQ)
|
|
1441
|
+
|
|
1442
|
+
\`\`\`js
|
|
1443
|
+
V8.MQ.SendMsg('queue_name', { ProductId:'123', Count:2 });
|
|
1444
|
+
// \u6D88\u8D39\u8005\u63A5\u53E3\u5F15\u64CE\u4E2D\uFF1A
|
|
1445
|
+
var message = V8.Param.Message; // object\u7C7B\u578B
|
|
1446
|
+
\`\`\`
|
|
1447
|
+
|
|
1448
|
+
---
|
|
1449
|
+
|
|
1450
|
+
## V8.TranslateEngine \u2014 \u7FFB\u8BD1\u5F15\u64CE
|
|
1451
|
+
|
|
1452
|
+
\`\`\`js
|
|
1453
|
+
V8.TranslateEngine.Translate('\u5F20\u4E09', 'en'); // \u7FFB\u8BD1\u4E3A\u82F1\u6587
|
|
1454
|
+
V8.TranslateEngine.Translate('love', 'cn', 'en'); // \u82F1\u2192\u4E2D
|
|
1455
|
+
V8.TranslateEngine.GetLang('NoAuth'); // \u4ECEdiy_lang\u7F13\u5B58\u83B7\u53D6
|
|
1456
|
+
\`\`\`
|
|
1457
|
+
|
|
1458
|
+
---
|
|
1459
|
+
|
|
1460
|
+
## MQTT \u5F15\u64CE
|
|
1461
|
+
|
|
1462
|
+
\`\`\`js
|
|
1463
|
+
var eventName = V8.EventName;
|
|
1464
|
+
// StartServer / Connected / Disconnected / MessageReceived / StopServer
|
|
1465
|
+
if (eventName == 'MessageReceived') {
|
|
1466
|
+
var clientId = V8.MQTT.ClientId;
|
|
1467
|
+
var topic = V8.MQTT.Topic;
|
|
1468
|
+
var payload = V8.MQTT.Payload;
|
|
1469
|
+
}
|
|
1470
|
+
\`\`\`
|
|
1471
|
+
|
|
1472
|
+
---
|
|
1473
|
+
|
|
1474
|
+
## \u8868\u5355V8\u4E8B\u4EF6\u4F53\u7CFB
|
|
1475
|
+
|
|
1476
|
+
### V8\u4E8B\u4EF6\u7C7B\u578B\u53CA\u6267\u884C\u987A\u5E8F
|
|
1477
|
+
|
|
1478
|
+
| \u4E8B\u4EF6\u6587\u4EF6 | \u8FD0\u884C\u7AEF | \u89E6\u53D1\u65F6\u673A | \u8BF4\u660E |
|
|
1479
|
+
|----------|--------|---------|------|
|
|
1480
|
+
| \`InFormV8.js\` | \u524D\u7AEF | \u8868\u5355\u6253\u5F00\u65F6 | \u521D\u59CB\u5316\u5B57\u6BB5\u663E\u9690\u3001\u9ED8\u8BA4\u503C |
|
|
1481
|
+
| \`SubmitFormV8.js\` | \u524D\u7AEF | \u8868\u5355\u63D0\u4EA4\u524D | \u524D\u7AEF\u6821\u9A8C\uFF08Postman\u4E0D\u89E6\u53D1\uFF09 |
|
|
1482
|
+
| \`SubmitBeforeServerV8.js\` | \u540E\u7AEF | \u6570\u636E\u5199\u5165DB\u524D\uFF08\u4E8B\u52A1\u4E2D\uFF09 | \u540E\u7AEF\u6821\u9A8C\u3001\u6570\u636E\u52A0\u5DE5 |
|
|
1483
|
+
| \`SubmitAfterServerV8.js\` | \u540E\u7AEF | \u6570\u636E\u5199\u5165DB\u540E\uFF08\u4ECD\u5728\u4E8B\u52A1\u4E2D\uFF09 | \u89E6\u53D1\u901A\u77E5\u3001\u540C\u6B65\u5176\u5B83\u8868 |
|
|
1484
|
+
| \`OutFormV8.js\` | \u524D\u7AEF | \u8868\u5355\u63D0\u4EA4\u540E/\u5173\u95ED\u540E | \u5237\u65B0\u5217\u8868\u3001\u8DF3\u8F6C |
|
|
1485
|
+
| \`DataFilterV8.js\` | \u540E\u7AEF | \u83B7\u53D6\u6570\u636E\u540E\u6BCF\u884C\u6267\u884C | \u6570\u636E\u8131\u654F\u3001\u5B57\u6BB5\u52A0\u5DE5 |
|
|
1486
|
+
|
|
1487
|
+
VS Code \u672C\u5730\u8D44\u6E90\u6587\u4EF6\u540D\u4F7F\u7528\u5B9E\u65F6 \`diy_field.Label\`\uFF1A\`\u524D\u7AEF\u8868\u5355\u63D0\u4EA4\u524DV8\u4E8B\u4EF6\uFF08SubmitFormV8\uFF09.js\`\u3001\`\u524D\u7AEF\u8868\u5355\u63D0\u4EA4\u540EV8\u4E8B\u4EF6\uFF08OutFormV8\uFF09.js\`\u3002\u4E0D\u8981\u7EE7\u7EED\u751F\u6210\u65E7\u540D\u201C\u524D\u7AEF\u8868\u5355\u63D0\u4EA4V8\u4E8B\u4EF6/\u524D\u7AEF\u8868\u5355\u9000\u51FAV8\u4E8B\u4EF6\u201D\u3002
|
|
1488
|
+
|
|
1489
|
+
### \u540E\u7AEFV8\u4E8B\u4EF6\u7279\u6709\u53D8\u91CF
|
|
1490
|
+
- \`V8.Form\` \u2014 \u5373\u5C06\u5199\u5165\u7684\u6570\u636E
|
|
1491
|
+
- \`V8.OldForm\` \u2014 \u4FEE\u6539\u524D\u7684\u65E7\u6570\u636E
|
|
1492
|
+
- \`V8.FormSubmitAction\` \u2014 'Insert' / 'Update' / 'Delete'
|
|
1493
|
+
- \`V8.DbTrans\` \u2014 \u5171\u4EAB\u4E8B\u52A1\uFF08\u63D0\u4EA4\u524D/\u540E\u4E8B\u4EF6\u90FD\u53EF\u7528\uFF09
|
|
1494
|
+
- \`V8.NotSaveField\` \u2014 \u6307\u5B9A\u4E0D\u4FDD\u5B58\u7684\u5B57\u6BB5\uFF08\u6570\u636E\u8131\u654F\uFF09
|
|
1495
|
+
- \`V8.CacheData\` \u2014 DataFilter\u4E2D\u7684\u7F13\u5B58\u6570\u636E
|
|
1496
|
+
- \`V8.RowIndex\` \u2014 \u5F53\u524D\u884C\u7D22\u5F15
|
|
1497
|
+
|
|
1498
|
+
### \u540E\u7AEF\u4E8B\u4EF6\u4E2D\u963B\u6B62\u63D0\u4EA4\uFF08\u81EA\u52A8\u56DE\u6EDA\u4E8B\u52A1\uFF09
|
|
1499
|
+
\`\`\`js
|
|
1500
|
+
return { Code: 0, Msg: '\u9519\u8BEF\u4FE1\u606F\uFF01' };
|
|
1501
|
+
\`\`\`
|
|
1502
|
+
|
|
1503
|
+
### \u540E\u7AEF\u4E8B\u4EF6\u4E2D\u5171\u4EAB\u4E8B\u52A1\u64CD\u4F5C\u5176\u5B83\u8868
|
|
1504
|
+
\`\`\`js
|
|
1505
|
+
V8.FormEngine.UptFormData('other_table', { Id:'x', Field:'val' }, V8.DbTrans);
|
|
1506
|
+
V8.ApiEngine.Run('key', { Form: V8.Form }, V8.DbTrans);
|
|
1507
|
+
V8.FormEngine.GetFormData('this_table', { Id: V8.Form.Id }, V8.DbTrans);
|
|
1508
|
+
\`\`\`
|
|
1509
|
+
|
|
1510
|
+
### \u5DE5\u4F5C\u6D41V8\u4E8B\u4EF6
|
|
1511
|
+
\`\`\`js
|
|
1512
|
+
// \u6761\u4EF6\u5224\u65ADV8\uFF08\u51B3\u5B9A\u6D41\u7A0B\u8D70\u5411\uFF09
|
|
1513
|
+
if (V8.Form.Money <= 100) { V8.NextNodeId = 'node_id_1'; } else { V8.LineValue = 2; }
|
|
1514
|
+
// \u8282\u70B9V8\u4E2D\u53EF\u7528
|
|
1515
|
+
V8.WF.ApprovalType // Agree/Disagree/Recall/Auto
|
|
1516
|
+
V8.WF.ApprovalIdea // \u5BA1\u6279\u610F\u89C1
|
|
1517
|
+
V8.WF.CurrentNode // \u5F53\u524D\u8282\u70B9
|
|
1518
|
+
V8.WF.NextNode // \u4E0B\u4E00\u8282\u70B9
|
|
1519
|
+
V8.WF.NextTodoUsers // \u63A5\u6536\u4EBA
|
|
1520
|
+
\`\`\`
|
|
1521
|
+
|
|
1522
|
+
---
|
|
1523
|
+
|
|
1524
|
+
## \u4E0A\u4E0B\u6587\u53D8\u91CF
|
|
1525
|
+
|
|
1526
|
+
| \u53D8\u91CF | \u8BF4\u660E |
|
|
1527
|
+
|------|------|
|
|
1528
|
+
| \`V8.Param\` | \u524D\u7AEF\u4F20\u5165\u7684\u8BF7\u6C42\u53C2\u6570\uFF08\u7EDF\u4E00\u63A5\u6536form/json/url\u4E09\u79CD\uFF09 |
|
|
1529
|
+
| \`V8.Header\` | \u8BF7\u6C42\u5934 |
|
|
1530
|
+
| \`V8.CurrentUser\` | \u5F53\u524D\u7528\u6237\uFF08Id, Account, Name, RoleIds, RoleName, DeptId, DeptIds, DeptName, Level\uFF09 |
|
|
1531
|
+
| \`V8.OsClient\` | \u5F53\u524D\u5E94\u7528\u6807\u8BC6 |
|
|
1532
|
+
| \`V8.SysConfig\` | \u5F53\u524D\u79DF\u6237\u975E\u654F\u611F\u7CFB\u7EDF\u914D\u7F6E\u7684\u8131\u654F\u526F\u672C |
|
|
1533
|
+
| \`V8.Limits\` | \u5F53\u524D\u6267\u884C\u7247\u6BB5\u7684\u8D85\u65F6\u3001\u8BED\u53E5\u3001\u5355\u5C42/\u8C03\u7528\u6811\u7D2F\u8BA1\u5206\u914D\u3001\u9012\u5F52\u548C\u63A5\u53E3\u5D4C\u5957\u9884\u7B97 |
|
|
1534
|
+
| \`V8.OsClientModel\` | \u5F53\u524D\u79DF\u6237SaaS\u914D\u7F6E\u7684\u8131\u654F\u526F\u672C\uFF1B\u6570\u636E\u5E93\u3001\u8BA4\u8BC1\u3001Redis\u3001\u5B58\u50A8\u3001MQ\u7B49\u673A\u5BC6\u4E0D\u4F1A\u6CE8\u5165 |
|
|
1535
|
+
| \`V8.Form\` | \u5F53\u524D\u8868\u5355\u6570\u636E\uFF08V8\u4E8B\u4EF6\u4E2D\uFF09 |
|
|
1536
|
+
| \`V8.OldForm\` | \u63D0\u4EA4\u524D\u7684\u65E7\u6570\u636E\uFF08V8\u4E8B\u4EF6\u4E2D\uFF09 |
|
|
1537
|
+
| \`V8.TableModel\` | \u5F53\u524Ddiy_table\u4FE1\u606F\uFF08V8\u4E8B\u4EF6\u4E2D\uFF09 |
|
|
1538
|
+
| \`V8.FormSubmitAction\` | \u63D0\u4EA4\u52A8\u4F5C\uFF1AInsert / Update / Delete |
|
|
1539
|
+
| \`V8.EventName\` | \u4E8B\u4EF6\u540D\u79F0 |
|
|
1540
|
+
| \`V8.InvokeType\` | \u8C03\u7528\u7C7B\u578B\uFF1AServer / Client |
|
|
1541
|
+
| \`V8.Result\` | \u8D4B\u503C\u540E\u4F5C\u4E3A\u63A5\u53E3\u8FD4\u56DE\u503C |
|
|
1542
|
+
| \`V8.Action\` | GetDateTimeNow(), GetTimestamp(), Sleep(ms) |
|
|
1543
|
+
| \`V8.FilesByteBase64\` | \u63A5\u6536\u4E0A\u4F20\u7684\u6587\u4EF6\u6570\u636E |
|
|
1544
|
+
|
|
1545
|
+
---
|
|
1546
|
+
|
|
1547
|
+
## DosResult \u6807\u51C6\u8FD4\u56DE\u683C\u5F0F
|
|
1548
|
+
|
|
1549
|
+
\`\`\`js
|
|
1550
|
+
{ Code: 1, Data: {}, DataCount: 0, Msg: '', DataAppend: {} }
|
|
1551
|
+
// Code: 1=\u6210\u529F, 0=\u5931\u8D25, 2=GetFormData\u6570\u636E\u4E0D\u5B58\u5728, 1001=Token\u5931\u6548, 1002=\u8EAB\u4EFD\u9A8C\u8BC1\u5931\u8D25
|
|
1552
|
+
\`\`\`
|
|
1553
|
+
|
|
1554
|
+
---
|
|
1555
|
+
|
|
1556
|
+
## SaaS\u5F15\u64CE \u2014 \u4E09\u53C2\u6570\u6A21\u578B
|
|
1557
|
+
|
|
1558
|
+
\u63A5\u53E3\u5F15\u64CE\u533A\u5206\u79DF\u6237\uFF1A
|
|
1559
|
+
\`\`\`js
|
|
1560
|
+
// \u65B9\u5F0F1\uFF1A\u4F20token\u81EA\u52A8\u8BC6\u522B
|
|
1561
|
+
// \u65B9\u5F0F2\uFF1AURL\u53C2\u6570 /apiengine/test?OsClient=veken
|
|
1562
|
+
// \u65B9\u5F0F3\uFF1A\u7279\u6B8A\u683C\u5F0F /apiengine/test--OsClient--veken--
|
|
1563
|
+
\`\`\`
|
|
1564
|
+
|
|
1565
|
+
---
|
|
1566
|
+
|
|
1567
|
+
## .NET \u4E92\u64CD\u4F5C
|
|
1568
|
+
|
|
1569
|
+
\u65B0\u4EE3\u7801\u4F18\u5148\u4F7F\u7528 \`V8.*\`\u3001\`DateNow\`\u3001\`V8.Method.NewUlid\` \u548C \`V8.Base64\`\u3002\u4E0D\u8981\u4F9D\u8D56\u4EFB\u610F CLR \u7C7B\u578B\uFF1B\u5E73\u53F0\u540C\u65F6\u63D0\u4F9B \`V8.System\` \u4E3B\u673A\u76D1\u63A7\u6269\u5C55\uFF0C\u5168\u5C40 \`System\` \u53EF\u80FD\u53D1\u751F\u540D\u79F0\u51B2\u7A81\uFF0C\u4E14\u5371\u9669 CLR \u7C7B\u578B\u4F1A\u88AB\u7981\u7528\u3002
|
|
1570
|
+
|
|
1571
|
+
---
|
|
1572
|
+
|
|
1573
|
+
## \u5168\u5C40\u51FD\u6570
|
|
1574
|
+
|
|
1575
|
+
\`\`\`js
|
|
1576
|
+
DateNow('yyyy-MM-dd HH:mm:ss') // \u5F53\u524D\u65E5\u671F\u65F6\u95F4
|
|
1577
|
+
DateFormat(dateObj, 'yyyy-MM-dd') // \u65E5\u671F\u683C\u5F0F\u5316
|
|
1578
|
+
DateAdd(date, 'd', 1, 'yyyy-MM-dd') // \u65E5\u671F\u52A0\u51CF\uFF08\u652F\u6301s/m/h/d/w/q/M/y\uFF09
|
|
1579
|
+
console.log('\u8C03\u8BD5\u4FE1\u606F') // \u63A7\u5236\u53F0\u8F93\u51FA\uFF08docker logs\u67E5\u770B\uFF09
|
|
1580
|
+
\`\`\`
|
|
1581
|
+
|
|
1582
|
+
---
|
|
1583
|
+
|
|
1584
|
+
## \u63A5\u53E3\u5F15\u64CE\u6CE8\u610F\u4E8B\u9879
|
|
1585
|
+
|
|
1586
|
+
- \u6570\u7EC4\u53C2\u6570\uFF1A\`Array.isArray(V8.Param.arr)\` \u8FD4\u56DE false\uFF0C\u4F46 \`arr.length\` \u548C \`arr[0]\` \u6B63\u5E38
|
|
1587
|
+
- \u4E8B\u52A1\u7BA1\u7406\uFF1A\u5E73\u53F0\u4E8B\u52A1\u7981\u6B62\u624B\u52A8 Commit/Rollback\uFF1B\u5E26Code\u5BF9\u8C61\u4EC5Code=1\u63D0\u4EA4\u3001\u65E0Code\u5BF9\u8C61\u56DE\u6EDA\uFF0C\u539F\u59CB\u503C\u65E0\u5F02\u5E38\u65F6\u63D0\u4EA4
|
|
1588
|
+
- \`_InvokeType: 'Client'\`\uFF1AFormEngine\u8C03\u7528\u65F6\u89E6\u53D1\u8868\u5355V8\u4E8B\u4EF6\uFF08\u9ED8\u8BA4Server\u6A21\u5F0F\u4E0D\u89E6\u53D1\uFF09
|
|
1589
|
+
- \u540E\u7AEF\u53EF\u4FE1V8\u8C03\u7528FormEngine\u4E0D\u8981\u6C42 \`_SysMenuId\`\uFF1B\u6D4F\u89C8\u5668\u4E0D\u80FD\u901A\u8FC7 \`_InvokeType\` \u4F2A\u9020\u4FE1\u4EFB
|
|
1590
|
+
`,Vi="\n\n## MicroService \u5927\u578B\u4EA7\u7269\u4E0E\u4E0A\u4E0B\u6587\u89C4\u5219\uFF08\u8986\u76D6\u65E7\u517C\u5BB9\u8BF4\u660E\uFF09\n\n- `microi_get_application_context` \u9ED8\u8BA4\u53EA\u8BFB\u5143\u6570\u636E\u3001\u54C8\u5E0C\u3001\u8FD0\u884C\u65F6\u548C\u9875\u9762\uFF1B\u5C11\u91CF\u6B63\u6587\u663E\u5F0F\u5F00\u542F\u5185\u5BB9\u8BFB\u53D6\uFF0C\u5355\u6587\u4EF6\u4F7F\u7528 `microi_get_application_file`\u3002\n- \u771F\u5B9E\u7F16\u8BD1\u76EE\u5F55\u4E00\u5F8B\u9010\u6587\u4EF6\u6D41\u5F0F\u53D1\u5E03\uFF0C\u652F\u6301\u6700\u591A 20,000 \u6587\u4EF6/\u603B\u8BA1 20GB\uFF1B\u51E0\u767E MB\u30011GB \u7EA7\u9879\u76EE\u4E0D\u5F97\u56DE\u9000 Base64\u3002\n- `StorageMode=db` \u7684 256 \u6587\u4EF6/5MB \u4EC5\u7528\u4E8E\u663E\u5F0F\u5C0F\u578B\u5E94\u6025\u6062\u590D\uFF0C\u4E0D\u662F\u6B63\u5E38\u53D1\u5E03\u5BB9\u91CF\u3002\n- \u6D41\u5F0F\u5931\u8D25\u8BFB\u53D6 `uploadedCount/retrySafe` \u5E76\u6309\u540C\u7248\u672C\u5E42\u7B49\u91CD\u8BD5\uFF1B\u7981\u6B62\u56E0\u5927\u6587\u4EF6\u81EA\u52A8\u6539\u8D70 `microi_publish_microservice`\u3002\n- \u5B50\u79DF\u6237\u6240\u6709\u6E90\u7801\u3001\u8D44\u4EA7\u3001\u56DE\u8BFB\u9A8C\u7B7E\u3001\u9875\u9762\u548C\u7F13\u5B58\u5FC5\u987B\u7ED1\u5B9A\u5F53\u524D Token \u7684 OsClient\uFF0C\u4E0D\u5F97\u56DE\u9000\u4E3B\u79DF\u6237\u9ED8\u8BA4\u914D\u7F6E\u3002\n",Et=class a{static getInstance(){return a._instance||(a._instance=new a),a._instance}inject(){let e=I.getInstance();if(!e.getWorkspaceRoot())return;let n;try{n=e.getSyncRootDir()}catch{return}let i=M.join(n,Qe);k.existsSync(i)||k.mkdirSync(i,{recursive:!0});let r=M.join(i,pt);k.writeFileSync(r,Ei,"utf-8"),this.injectAiDocs(n),this.ensureJsConfig(n,i)}injectAiDocs(e){try{this.generatePerOsClientSchemaDocs(e);let t=I.getInstance().getWorkspaceRoot();if(!t)return;this.ensureLocalRuntimeFilesIgnored(t,e),this.syncBundledSkills(t);let n=this.collectSkillEntries(t),i=this.buildSkillsReference(n),r=Ai+$n+Vn+On+ki+Ii+Ri+_i+Pi+Ni+Vi+Fi+Mi+i,s=[{relativePath:`${$t}/${Ot}`,content:nt+r},{relativePath:Lt,content:nt+r},{relativePath:xt,content:nt+r},{relativePath:Bt,content:nt+r}];n.length>0&&s.push({relativePath:`${Ut}/${jt}`,content:this.buildCursorSkillRule(n)}),this.syncGeneratedAiDocs(t,s)}catch{}}ensureLocalRuntimeFilesIgnored(e,t){let n=[".vscode/mcp.json",`.vscode/${wt}`,".cursor/mcp.json",dn,".claude/settings.local.json"],i=M.relative(e,t);if(i&&!i.startsWith("..")&&!M.isAbsolute(i)){let r=i.replace(/\\/g,"/");n.push(`${r}/**/${Le}`,`${r}/**/${ke}`,`${r}/**/${Ae}`,`${r}/${ze}`,`${r}/**/${ze}`,`${r}/.backups/`,`${r}/**/.backups/`,`${r}/${Qe}/`)}Be(e),ve(e,n)}getBundledSkillsDir(){return M.join(__dirname,"microi.skills")}syncBundledSkills(e){let t=this.getBundledSkillsDir();if(!k.existsSync(t))return;let n=M.join(e,An),i=M.join(n,qt),r=this.readSkillManifest(i),s=this.readBundledSkillsMeta(),o=s.skills?.version,c=this.compareMicroiVersions(o,r.bundleVersion)<0,d={version:1,generatedBy:"Microi\u543E\u7801 VSCode Extension",bundleVersion:c?r.bundleVersion:o||r.bundleVersion,bundleBuiltAt:c?r.bundleBuiltAt:s.builtAt||r.bundleBuiltAt,fileVersions:{...r.fileVersions||{}},files:{...r.files}},m=[];this.walkSkillSource(t,(l,u)=>{let p=M.join(n,u),h=k.readFileSync(l,"utf-8"),f=this.hashText(h),y=r.files[u],S=s.fileVersions?.[u]||o,T=r.fileVersions?.[u]||r.bundleVersion,D=this.compareMicroiVersions(S,T)<0,_=!1;if(!k.existsSync(p))_=!D;else if(y)try{_=this.hashText(k.readFileSync(p,"utf-8"))===y&&!D}catch{_=!1}if(_){let w=M.dirname(p);k.existsSync(w)||k.mkdirSync(w,{recursive:!0}),k.writeFileSync(p,h,"utf-8"),m.push(u)}if(_)d.files[u]=f,S&&(d.fileVersions[u]=S);else try{if(this.hashText(k.readFileSync(p,"utf-8"))===f){d.files[u]=f;let E=this.pickNewerMicroiVersion(S,r.fileVersions?.[u]);E&&(d.fileVersions[u]=E)}else y?(d.files[u]=y,r.fileVersions?.[u]&&(d.fileVersions[u]=r.fileVersions[u])):(delete d.files[u],delete d.fileVersions[u])}catch{y&&(d.files[u]=y,r.fileVersions?.[u]&&(d.fileVersions[u]=r.fileVersions[u]))}});let g=JSON.stringify(d)!==JSON.stringify(r);(m.length>0||g||!k.existsSync(i))&&(k.existsSync(n)||k.mkdirSync(n,{recursive:!0}),k.writeFileSync(i,JSON.stringify(d,null,2)+`
|
|
1591
|
+
`,"utf-8"),ve(e,[`${An}/${qt}`]))}readSkillManifest(e){if(!k.existsSync(e))return{version:1,generatedBy:"Microi\u543E\u7801 VSCode Extension",files:{}};try{let t=JSON.parse(k.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=M.join(__dirname,bi);if(!k.existsSync(e))return{};try{let t=JSON.parse(k.readFileSync(e,"utf-8"));return t&&typeof t=="object"?t:{}}catch{return{}}}walkSkillSource(e,t){let n=i=>{for(let r of k.readdirSync(i,{withFileTypes:!0})){if(r.name===".git"||r.name==="node_modules"||r.name===qt)continue;let s=M.join(i,r.name);if(r.isDirectory())n(s);else if(r.isFile()){let o=M.relative(e,s).replace(/\\/g,"/");t(s,o)}}};n(e)}hashText(e){return Ln.createHash("sha256").update(e,"utf-8").digest("hex")}compareMicroiVersions(e,t){let n=s=>{if(!(!s||!/^\d+(?:\.\d+){2}$/.test(s)))return s.split(".").map(o=>Number(o))},i=n(e),r=n(t);if(!i||!r)return 0;for(let s=0;s<3;s++)if(i[s]!==r[s])return i[s]>r[s]?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(l=>l.relativePath.replace(/\\/g,"/")),i=n.map(l=>this.normalizeRelativePath(l)),r=this.getGitTrackedWorkspaceFiles(e,n);if(r===void 0)return;let s=M.join(e,".vscode",wt),o=this.readAiDocsManifest(s),c=this.readBundledSkillsMeta().skills?.version,d=this.pickNewerMicroiVersion(c,o.bundleVersion),m={version:2,generatedBy:"Microi\u543E\u7801 AI\u5F00\u53D1\u5DE5\u5177",bundleVersion:d,fileVersions:{...o.fileVersions||{}},fileHashes:{...o.fileHashes||{}},files:{...o.files}},g=new Set(i);for(let l of Object.keys(m.files))g.has(this.normalizeRelativePath(l))||(delete m.files[l],delete m.fileHashes[l],delete m.fileVersions[l]);for(let l of Object.keys(m.fileHashes))g.has(this.normalizeRelativePath(l))||(delete m.fileHashes[l],delete m.fileVersions[l],delete m.files[l]);for(let l of t){let u=this.normalizeRelativePath(l.relativePath);if(r.has(u)){delete m.files[u],delete m.fileHashes[u],delete m.fileVersions[u];continue}let p=M.join(e,u),h=this.hashText(l.content),f=o.files[u],y=o.fileHashes?.[u]||(/^[a-f0-9]{64}$/i.test(f||"")?f:void 0),S=o.fileVersions?.[u]||o.bundleVersion,T=this.compareMicroiVersions(c,S)<0,D=!k.existsSync(p)&&!T,_="";if(k.existsSync(p))try{let E=k.readFileSync(p,"utf-8");_=this.hashText(E),D=!!y&&_===y&&!T,!y&&E.includes("Generated by Microi\u543E\u7801 VSCode Extension")&&(m.fileHashes[u]=_,S&&(m.fileVersions[u]=S))}catch{D=!1}if(D){let E=M.dirname(p);k.existsSync(E)||k.mkdirSync(E,{recursive:!0}),k.writeFileSync(p,l.content,"utf-8"),_=h,m.fileHashes[u]=h,c&&(m.fileVersions[u]=c)}else if(_===h){m.fileHashes[u]=h;let E=this.pickNewerMicroiVersion(c,S);E&&(m.fileVersions[u]=E)}else y?(m.fileHashes[u]=y,S&&(m.fileVersions[u]=S)):m.fileHashes[u]||delete m.fileVersions[u];let w=m.fileHashes[u];if(w){let E=m.fileVersions[u]||d||"unknown";m.files[u]=`${Di}${E}:${w}`}else delete m.files[u]}if(JSON.stringify(m)!==JSON.stringify(o)||!k.existsSync(s)){let l=M.dirname(s);k.existsSync(l)||k.mkdirSync(l,{recursive:!0}),k.writeFileSync(s,JSON.stringify(m,null,2)+`
|
|
1592
|
+
`,"utf-8")}ve(e,[`.vscode/${wt}`])}readAiDocsManifest(e){if(!k.existsSync(e))return{version:2,generatedBy:"Microi\u543E\u7801 AI\u5F00\u53D1\u5DE5\u5177",files:{},fileHashes:{},fileVersions:{}};try{let t=JSON.parse(k.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:{},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:{}}}}normalizeRelativePath(e){let t=e.replace(/\\/g,"/").replace(/^\.\//,"");return process.platform==="win32"?t.toLowerCase():t}getGitTrackedWorkspaceFiles(e,t){let n=(0,Qt.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 i=String(n.stdout||"").trim();if(!i)return;let r=new Map,s=[];for(let d of t){let m=M.relative(i,M.join(e,d));m.startsWith("..")||M.isAbsolute(m)||(s.push(m.replace(/\\/g,"/")),r.set(this.normalizeRelativePath(m),this.normalizeRelativePath(d)))}if(s.length===0)return new Set;let o=(0,Qt.spawnSync)("git",["-C",i,"ls-files","-z","--",...s],{encoding:"utf-8",windowsHide:!0,timeout:3e3,maxBuffer:1024*1024});if(o.error||o.status!==0)return;let c=new Set;for(let d of String(o.stdout||"").split("\0").filter(Boolean)){let m=r.get(this.normalizeRelativePath(d));m&&c.add(m)}return c}hasGitMetadata(e){let t=M.resolve(e);for(;;){if(k.existsSync(M.join(t,".git")))return!0;let n=M.dirname(t);if(n===t)return!1;t=n}}canRemoveGeneratedAiDoc(e,t){if(!k.existsSync(t))return!1;let n=M.relative(e,t).replace(/\\/g,"/"),i=this.normalizeRelativePath(n),r=this.getGitTrackedWorkspaceFiles(e,[n]);if(r===void 0||r.has(i))return!1;let s=this.readAiDocsManifest(M.join(e,".vscode",wt)),o=s.files[i],c=s.fileHashes?.[i]||(/^[a-f0-9]{64}$/i.test(o||"")?o:void 0);if(!c)return!1;try{return this.hashText(k.readFileSync(t,"utf-8"))===c}catch{return!1}}collectSkillEntries(e){let t=M.join(e,"microi.skills");if(!k.existsSync(t))return[];let n=new Map,i=M.join(t,"README.md");if(k.existsSync(i))try{let o=k.readFileSync(i,"utf-8").matchAll(/`([^`]+\/SKILL\.md)`/g),c=0;for(let d of o){let m=d[1].split(/[\\/]/)[0];m&&!n.has(m)&&n.set(m,c++)}}catch{}let r=[];try{for(let s of k.readdirSync(t,{withFileTypes:!0})){if(!s.isDirectory())continue;let o=M.join(t,s.name,"SKILL.md");k.existsSync(o)&&r.push({name:s.name,relativePath:`microi.skills/${s.name}/SKILL.md`,description:this.readSkillDescription(o,s.name)})}}catch{}return r.sort((s,o)=>{let c=n.get(s.name),d=n.get(o.name);return c!==void 0&&d!==void 0?c-d:c!==void 0?-1:d!==void 0?1:s.name.localeCompare(o.name)})}readSkillDescription(e,t){try{let i=k.readFileSync(e,"utf-8").split(/\r?\n/).find(r=>r.startsWith("# "));if(i)return i.replace(/^#\s+/,"").trim()}catch{}return t}buildSkillsReference(e){if(!e.length)return"";let t=e.map(n=>`- \`${n.relativePath}\` \u2014 ${n.description}`).join(`
|
|
1593
|
+
`);return`
|
|
1594
|
+
|
|
1595
|
+
---
|
|
1596
|
+
|
|
1597
|
+
## Microi \u9879\u76EE\u6280\u80FD\u89C4\u8303
|
|
1598
|
+
|
|
1599
|
+
\u5904\u7406 Microi \u4F4E\u4EE3\u7801\u7CFB\u7EDF\u3001V8 \u5F15\u64CE\u3001PC \u524D\u7AEF\u3001UniApp/H5/\u5C0F\u7A0B\u5E8F\u3001Microi.UI\u3001MCP \u5EFA\u6A21\u3001\u81EA\u52A8\u5316\u6D4B\u8BD5\u6216\u4EA4\u4ED8\u590D\u76D8\u65F6\uFF0C\u5FC5\u987B\u5148\u6309\u4EFB\u52A1\u7C7B\u578B\u8BFB\u53D6\u76F8\u5173 skill \u6587\u4EF6\uFF1B\u4E0D\u8981\u53EA\u5728\u7F16\u5199 V8 \u4EE3\u7801\u65F6\u624D\u53C2\u8003 skills\uFF08\u5171 ${e.length} \u4E2A\uFF09\u3002\u666E\u901A\u7528\u6237\u5728\u7A7A\u5DE5\u4F5C\u533A\u5B89\u88C5\u63D2\u4EF6\u540E\uFF0C\u53EA\u8981\u901A\u8FC7\u63D2\u4EF6\u6267\u884C\u521D\u59CB\u5316\u6216\u62C9\u53D6\uFF0CAI \u5C31\u5E94\u81EA\u52A8\u8BC6\u522B\u8FD9\u4E9B\u89C4\u5219\uFF0C\u4E0D\u9700\u8981\u518D\u624B\u52A8\u8981\u6C42\u201C\u4E25\u683C\u9075\u5FAA skills\u201D\uFF1A
|
|
1600
|
+
${t}
|
|
1601
|
+
`}buildCursorSkillRule(e){let t=e.map(n=>`- @${n.relativePath} \u2014 ${n.description}`).join(`
|
|
1602
|
+
`);return`---
|
|
1603
|
+
description: Microi \u9879\u76EE\u6280\u80FD\u89C4\u8303\uFF0C\u8986\u76D6\u4F4E\u4EE3\u7801\u5EFA\u6A21\u3001V8 \u5F15\u64CE\u3001PC \u524D\u7AEF\u3001UniApp/H5/\u5C0F\u7A0B\u5E8F\u3001Microi.UI\u3001MCP\u3001\u6D4B\u8BD5\u4E0E\u4EA4\u4ED8
|
|
1604
|
+
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"]
|
|
1605
|
+
---
|
|
1606
|
+
${nt}
|
|
1607
|
+
# Microi\u543E\u7801\u9879\u76EE\u6280\u80FD\u89C4\u8303
|
|
1608
|
+
|
|
1609
|
+
\u5904\u7406 Microi \u4F4E\u4EE3\u7801\u7CFB\u7EDF\u3001V8 \u5F15\u64CE\u3001PC \u524D\u7AEF\u3001UniApp/H5/\u5C0F\u7A0B\u5E8F\u3001Microi.UI\u3001MCP \u5EFA\u6A21\u3001\u81EA\u52A8\u5316\u6D4B\u8BD5\u6216\u4EA4\u4ED8\u590D\u76D8\u65F6\uFF0C\u4F18\u5148\u53C2\u8003\u4E0B\u5217 skill \u6587\u4EF6\u83B7\u53D6\u6A21\u677F\u3001\u7EA6\u675F\u548C\u9A8C\u6536\u89C4\u8303\u3002\u666E\u901A\u7528\u6237\u5728\u7A7A\u5DE5\u4F5C\u533A\u5B89\u88C5\u63D2\u4EF6\u540E\uFF0C\u53EA\u8981\u901A\u8FC7\u63D2\u4EF6\u6267\u884C\u521D\u59CB\u5316\u6216\u62C9\u53D6\uFF0CAI \u5C31\u5E94\u81EA\u52A8\u8BC6\u522B\u8FD9\u4E9B\u89C4\u5219\uFF0C\u4E0D\u9700\u8981\u518D\u624B\u52A8\u8981\u6C42\u201C\u4E25\u683C\u9075\u5FAA skills\u201D\uFF1A
|
|
1610
|
+
${t}${$n}${Vn}${On}
|
|
1611
|
+
`}generatePerOsClientSchemaDocs(e){let t=[];if(!k.existsSync(e))return t;let n=i=>{try{for(let r of k.readdirSync(i)){if(r.startsWith(".")&&r!==Le)continue;let s=M.join(i,r);if(r===Le)try{let o=JSON.parse(k.readFileSync(s,"utf-8")),c=this.formatDbSchemaFull(o,M.relative(e,i));if(c){let d=M.join(i,ke);k.writeFileSync(d,c,"utf-8"),t.push(d)}}catch{}else try{k.statSync(s).isDirectory()&&n(s)}catch{}}}catch{}};return n(e),t}formatDbSchemaFull(e,t){if(!e.Tables||e.Tables.length===0)return"";let n=e.Tables.filter(r=>r.Name);if(n.length===0)return"";let i=[];i.push(`# \u6570\u636E\u5E93\u7ED3\u6784 \u2014 ${t}
|
|
1612
|
+
`),i.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"),i.push(`> \u5171 ${n.length} \u5F20\u8868\u3002
|
|
1613
|
+
`);for(let r of n){let s=r.Description?` \u2014 ${r.Description}`:"";i.push(`## ${r.Name}${s}
|
|
1614
|
+
`);let o=r._Fields||r.Fields;if(o&&o.length>0){i.push("| \u5B57\u6BB5 | \u8BF4\u660E | \u7C7B\u578B |"),i.push("|------|------|------|");for(let c of o){let d=c.Description||c.Label||"",m=c.Type||c.FieldType||"";i.push(`| ${c.Name} | ${d} | ${m} |`)}i.push("")}}return i.join(`
|
|
1615
|
+
`)}ensureJsConfig(e,t){let n=M.join(e,"jsconfig.json"),i=e,r=e,s;if(k.existsSync(n))try{s=JSON.parse(k.readFileSync(n,"utf-8"))}catch{s={}}else s={};let o=s.compilerOptions||{};o.target=o.target||"ES2020",o.module=o.module||"CommonJS",o.checkJs=!0;let c=M.relative(e,t),d=o.typeRoots||[];d.includes(`./${c}`)||d.push(`./${c}`),o.typeRoots=d,s.compilerOptions=o;let m=s.include||[],g=M.relative(e,i),l=M.relative(e,r),u=`${c}/**/*`;for(let h of[`${g}/**/*`,`${l}/**/*`,u])m.includes(h)||m.push(h);s.include=m;let p=s.exclude||[];p.includes("node_modules")||p.push("node_modules"),s.exclude=p,k.writeFileSync(n,JSON.stringify(s,null,2),"utf-8")}cleanup(){let e=I.getInstance(),t=e.getWorkspaceRoot();if(!t)return;let n=e.getSyncRootDir(),i=M.join(n,Qe),r=M.join(i,pt);k.existsSync(r)&&k.unlinkSync(r);let s=M.join(t,Qe),o=M.join(s,pt);if(k.existsSync(o)&&k.unlinkSync(o),M.resolve(n)!==M.resolve(t)){let c=M.join(t,$t,Ot),d=M.join(t,Lt),m=M.join(t,xt),g=M.join(t,Bt),l=M.join(t,Ut,jt);if(this.canRemoveGeneratedAiDoc(t,c))try{k.unlinkSync(c)}catch{}if(this.canRemoveGeneratedAiDoc(t,d))try{k.unlinkSync(d)}catch{}if(this.canRemoveGeneratedAiDoc(t,m))try{k.unlinkSync(m)}catch{}if(this.canRemoveGeneratedAiDoc(t,g))try{k.unlinkSync(g)}catch{}if(this.canRemoveGeneratedAiDoc(t,l))try{k.unlinkSync(l)}catch{}}this.cleanupSchemaDocs(n)}cleanupSchemaDocs(e){try{for(let t of k.readdirSync(e)){if(t.startsWith(".")&&t!==ke)continue;let n=M.join(e,t);if(t===ke)try{k.unlinkSync(n)}catch{}else try{k.statSync(n).isDirectory()&&this.cleanupSchemaDocs(n)}catch{}}}catch{}}};function rt(a,e){let t=r=>{if(!(!r||!/^\d+(?:\.\d+){2}$/.test(r)))return r.split(".").map(s=>Number(s))},n=t(a),i=t(e);if(!n||!i)return 0;for(let r=0;r<3;r+=1)if(n[r]!==i[r])return n[r]>i[r]?1:-1;return 0}function it(a){let e=a.env,t=String(e?.MICROI_TOOL_VERSION||"").trim();return/^\d+(?:\.\d+){2}$/.test(t)?t:""}function bt(a){let e=a.env||{},t=a.headers||{},i=(s=>s.trim().replace(/\/+$/,"").toLowerCase())(String(e.MICROI_API_URL||a.url||"")),r=String(e.MICROI_OS_CLIENT||t["X-Microi-OsClient"]||"").trim().toLowerCase();return`${i}|${r}`}function xn(a,e,t){let n={...a},i={},r=new Set,s=[];for(let[c,d]of Object.entries(e)){let m=bt(d),g=it(d),l=Object.entries(n).filter(([p,h])=>{if(!t.isManaged(p,h))return!1;let f=bt(h);return p===c||m!=="|"&&f===m}),u=l.find(([,p])=>rt(it(p),g)>0);if(u){let p=it(u[1]);for(let[h]of l)r.add(h);s.push({name:u[0],version:p});continue}i[c]=d}let o=new Set(Object.values(i).map(bt).filter(c=>c!=="|"));for(let[c,d]of Object.entries(n)){if(!t.isManaged(c,d)||r.has(c))continue;if(Object.prototype.hasOwnProperty.call(i,c)){delete n[c];continue}let m=bt(d);if(o.has(m)){delete n[c];continue}(t.removeManagedNotInNext||t.isStableName&&!t.isStableName(c))&&delete n[c]}return Object.assign(n,i),{servers:n,skippedNewerProviders:s}}var Un=G(require("crypto")),J=G(require("fs")),kt=G(require("os")),ne=G(require("path"));var st="";function It(){if(st)return st;try{let a=JSON.parse(J.readFileSync(ne.join(__dirname,"..","package.json"),"utf8"));st=/^\d+(?:\.\d+){2}$/.test(String(a.version||""))?String(a.version):"0.0.0"}catch{st="0.0.0"}return st}function jn(a){return a.trim().replace(/\/+$/,"")}function Yt(a){return a.normalize("NFKD").replace(/[^\x00-\x7F]/g,"").replace(/[^A-Za-z0-9_]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"").toLowerCase().slice(0,48)}function Hn(a){let e="";try{e=Yt(new URL(jn(a.apiBaseUrl)).host)}catch{e=Yt(a.apiBaseUrl)}return e}function Xt(a){return Yt(a.osClient||a.sysShortTitle||a.sysTitle||a.label||"")||Hn(a)||"default"}function $i(a,e,t){let n=Hn(a),i=Xt(a),r=`microi_${i}`,s=t.has(i)&&n&&n!==i?`${r}_${n}`:r;e.has(s)&&n&&(s=`${r}_${n}`);let o=2;for(;e.has(s);)s=`${r}_${o++}`;return e.add(s),s}function Oi(){let a=`MCP:${kt.hostname()||"Unknown"}`;return/^[\x20-\x7E]{1,128}$/.test(a)?a:`MCP-${Un.createHash("sha256").update(a).digest("hex").slice(0,16)}`}function Li(a,e){let t=e.env;return/^microi(?:_|-|$)/i.test(a)||typeof t?.MICROI_API_URL=="string"}function Wn(a,e){let t=`${a}.${process.pid}.${Date.now()}.tmp`;try{J.writeFileSync(t,e,"utf8"),J.renameSync(t,a)}finally{try{J.existsSync(t)&&J.unlinkSync(t)}catch{}}}function Dt(a,e,t,n=!1){J.mkdirSync(ne.dirname(a),{recursive:!0});let i={};if(J.existsSync(a))try{i=ft(J.readFileSync(a,"utf8"))}catch(d){throw new Error(`MCP \u914D\u7F6E\u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u4E14\u505C\u6B62\u5199\u5165\uFF1A${a}\uFF08${d instanceof Error?d.message:String(d)}\uFF09`)}let r=i[e]&&typeof i[e]=="object"?i[e]:{},s=Object.fromEntries(Object.entries(t).map(([d,m])=>[d,n?Object.fromEntries(Object.entries(m).filter(([g])=>["command","args","env","url","headers"].includes(g))):m])),o=xn(r,s,{isManaged:Li,isStableName:d=>/^microi_[a-z0-9_]+$/.test(d),removeManagedNotInNext:!0});i[e]=o.servers;let c=`${JSON.stringify(i,null,2)}
|
|
1616
|
+
`;(!J.existsSync(a)||J.readFileSync(a,"utf8")!==c)&&Wn(a,c)}function ot(a){return JSON.stringify(String(a))}function xi(a){return`[${a.map(ot).join(", ")}]`}function Bi(a){return`{ ${Object.entries(a).filter(([,e])=>e!==""&&e!=null).map(([e,t])=>`${ot(e)} = ${ot(t)}`).join(", ")} }`}function Ui(a,e){let t=[],n=[];for(let s of a.split(/\r?\n/))/^\s*\[[^\]]+\]\s*$/.test(s)&&n.length&&(t.push(n),n=[]),n.push(s);n.length&&t.push(n);let i=new Set;return{cleaned:t.filter(s=>{let c=s.find(u=>u.trim())?.match(/^\s*\[mcp_servers\.(?:"([^"]+)"|([A-Za-z0-9_-]+))(?:\.|\])/)||null;if(!c)return!0;let d=(c[1]||c[2]||"").toLowerCase(),m=s.join(`
|
|
1617
|
+
`);if(!(/^microi(?:_|-|$)/.test(d)||/\bMICROI_(?:API_URL|TOKEN_FILE|OS_CLIENT)\b/.test(m)))return!0;let l=m.match(/["']?MICROI_TOOL_VERSION["']?\s*=\s*["']([^"']+)["']/)?.[1]||"";return rt(l,e)>0?(i.add(d),!0):!1}).map(s=>s.join(`
|
|
1618
|
+
`)).join(`
|
|
1619
|
+
`).replace(/\n{3,}/g,`
|
|
1620
|
+
|
|
1621
|
+
`).trimEnd(),preservedNames:i}}function Bn(a,e,t){J.mkdirSync(ne.dirname(a),{recursive:!0});let n=J.existsSync(a)?J.readFileSync(a,"utf8"):"",i=It(),{cleaned:r,preservedNames:s}=Ui(n,i),o=Object.entries(e).filter(([d])=>!s.has(d.toLowerCase())).map(([d,m])=>{let g=[t,...m.args||[]],l={...m.env||{},MICROI_CODEX_MODE:"1"};return delete l.MICROI_TOKEN,[`[mcp_servers.${d}]`,`command = ${ot(m.command)}`,`args = ${xi(g)}`,...m.cwd?[`cwd = ${ot(m.cwd)}`]:[],`env = ${Bi(l)}`,'enabled_tools = ["microi_codex"]','default_tools_approval_mode = "auto"'].join(`
|
|
1622
|
+
`)}),c=[r,o.join(`
|
|
1623
|
+
|
|
1624
|
+
`)].filter(Boolean).join(`
|
|
1625
|
+
|
|
1626
|
+
`)+`
|
|
1627
|
+
`;(!J.existsSync(a)||n!==c)&&Wn(a,c)}function ji(a,e){let t=e.label||e.sysShortTitle||e.sysTitle||e.apiBaseUrl||"\u672A\u547D\u540D\u670D\u52A1\u5668";return ne.join(a.getSyncRootDir(),a.buildServerDirName(t,e.apiBaseUrl),a.buildOsClientDirName(e.osClient,e.osClientType,e.osClientNetwork),un)}function Hi(a,e,t){let n={...a.env||{}},i=String(a.command||""),r=Array.isArray(a.args)?a.args.map(String):[];return process.platform==="win32"&&i&&r.length>0?{command:"cmd.exe",args:["/d","/s","/c","call",t,i,e,r[0]],env:n}:{command:i,args:r,env:n}}async function at(a){let e=I.getInstance(),t=ge.getInstance(),n=L.getInstance(),i=e.getProfiles(),r=It(),s=ne.join(__dirname,"mcp-server.js"),o=ne.join(__dirname,"microi-cli-mcp.js"),c=ne.join(__dirname,"mcp-codex-stdio-adapter.js"),d=ne.join(__dirname,"mcp-trae-windows-launcher.cmd");if(!J.existsSync(s)||!J.existsSync(o)||!J.existsSync(c)||process.platform==="win32"&&!J.existsSync(d))throw new Error("CLI \u5B89\u88C5\u5305\u7F3A\u5C11\u5185\u7F6E MCP Server\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5 @microi.net/cli");let m={},g=new Set,l=new Map;for(let f of i)l.set(Xt(f),(l.get(Xt(f))||0)+1);let u=new Set(Array.from(l).filter(([,f])=>f>1).map(([f])=>f));for(let f of i){let y=t.mcpTokenFilePath,S=n.getTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork);if(!y||!J.existsSync(y)||!S)continue;let T=$i(f,g,u);m[T]={type:"stdio",command:process.execPath,args:[o],cwd:ne.dirname(__dirname),env:{MICROI_API_URL:jn(f.apiBaseUrl),MICROI_TOKEN_FILE:y,MICROI_AUTH_RECOVERY_DIR:t.mcpAuthRecoveryDirPath,MICROI_OS_CLIENT:f.osClient||"",MICROI_OS_CLIENT_TYPE:f.osClientType||"",MICROI_OS_CLIENT_NETWORK:f.osClientNetwork||"",MICROI_WORKSPACE_ROOT:a,MICROI_SYNC_ROOT:e.getSyncRootDir(),MICROI_AI_APPLICATIONS_DIR:ji(e,f),MICROI_LABEL_BASE64:Buffer.from(f.label||"","utf8").toString("base64"),MICROI_MCP_DID:Oi(),MICROI_TOOL_SOURCE:"cli",MICROI_TOOL_VERSION:r}}}await t.writeMcpTokenFile(),Be(a),ve(a,[".vscode/mcp.json",".cursor/mcp.json",".trae/mcp.json",".mcp.json",".codex/config.toml","Microi-V8-Engine/.microi-mcp-tokens.json"]),Dt(ne.join(a,".vscode","mcp.json"),"servers",m),Dt(ne.join(a,".cursor","mcp.json"),"mcpServers",m);let p=Object.fromEntries(Object.entries(m).map(([f,y])=>[f,Hi(y,c,d)]));Dt(ne.join(a,".trae","mcp.json"),"mcpServers",p,!0),Dt(ne.join(a,".mcp.json"),"mcpServers",m,!0);let h=process.env.CODEX_HOME||ne.join(kt.homedir(),".codex");return Bn(ne.join(h,"config.toml"),m,c),Bn(ne.join(a,".codex","config.toml"),m,c),{count:Object.keys(m).length,names:Object.keys(m)}}var Rt=G(require("fs")),Kn=G(require("path"));var Zt=class{constructor(){this.values=new Map;this.onDidChange=()=>({dispose:()=>{}})}async get(e){return this.values.get(e)}async store(e,t){this.values.set(e,t)}async delete(e){this.values.delete(e)}};async function Gn(a){let e=Kn.resolve(a);if(!Rt.existsSync(e)||!Rt.statSync(e).isDirectory())throw new Error(`\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u76EE\u5F55\uFF1A${e}`);an(e);let t=I.getInstance(),n=L.getInstance(),i=ge.getInstance(),r=new Zt;n.setSecretStorage(r),i.setSecretStorage(r);let s=t.getWorkspaceStateFilePath(ze);return i.setMcpTokenFilePath(s),await i.loadMcpTokenFile(),{root:e,config:t,api:n,auth:i}}function ct(a,e){let t=a.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 i=e.toLowerCase(),r=t.filter(s=>s.osClient.toLowerCase()===i||s.label.toLowerCase()===i||`${s.apiBaseUrl}|${s.osClient}`.toLowerCase()===i);if(r.length!==1)throw new Error(`\u65E0\u6CD5\u552F\u4E00\u5B9A\u4F4D\u670D\u52A1\u5668\u8FDE\u63A5\uFF1A${e}`);return r[0]}function Re(a,e){return!!a.api.getTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork)}function Wi(a){let e=[],t={};for(let n=0;n<a.length;n+=1){let i=a[n];if(!i.startsWith("--")){e.push(i);continue}let[r,s]=i.slice(2).split(/=(.*)/s,2);if(r.startsWith("no-")&&s===void 0){t[r.slice(3)]=!1;continue}if(s!==void 0){t[r]=s;continue}let o=a[n+1];o&&!o.startsWith("--")?(t[r]=o,n+=1):t[r]=!0}return{words:e,options:t}}function ae(a,e){let t=a[e];return typeof t=="string"?t:void 0}function ue(a,e=!1){console.log(e||typeof a!="string"?JSON.stringify(a,null,2):a)}function We(a,e=""){let t=Xn.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>t.question(`${a}${e?` (${e})`:""}: `,i=>{t.close(),n(i.trim()||e)}))}function Ki(a){return!process.stdin.isTTY||!process.stdin.setRawMode?We(a):new Promise((e,t)=>{let n="";process.stdout.write(`${a}: `),process.stdin.setRawMode(!0),process.stdin.resume();let i=()=>{process.stdin.off("data",r),process.stdin.setRawMode(!1),process.stdin.pause()},r=s=>{let o=s.toString("utf8");if(o===""){i(),t(new Error("\u5DF2\u53D6\u6D88"));return}if(o==="\r"||o===`
|
|
1628
|
+
`){process.stdout.write(`
|
|
1629
|
+
`),i(),e(n);return}if(o==="\x7F"||o==="\b"){n&&(n=n.slice(0,-1),process.stdout.write("\b \b"));return}/^[\x20-\x7E\u0080-\uFFFF]+$/.test(o)&&(n+=o,process.stdout.write("*".repeat([...o].length)))};process.stdin.on("data",r)})}function zn(){return`Microi\u543E\u7801 CLI
|
|
1630
|
+
|
|
1631
|
+
\u7528\u6CD5\uFF1Amicroi <\u547D\u4EE4> [\u9009\u9879]
|
|
1632
|
+
|
|
1633
|
+
init [--pull] \u5F15\u5BFC\u8FDE\u63A5\u3001\u767B\u5F55\u5E76\u521D\u59CB\u5316 AI/MCP
|
|
1634
|
+
profile list|add|remove \u7BA1\u7406\u670D\u52A1\u5668\u8FDE\u63A5
|
|
1635
|
+
auth login|status|logout \u7BA1\u7406\u767B\u5F55 Token\uFF08\u4E0D\u843D\u76D8\u4FDD\u5B58\u5BC6\u7801\uFF09
|
|
1636
|
+
ai init [--no-mcp] \u6CE8\u5165 AGENTS/Skills/typings/jsconfig
|
|
1637
|
+
mcp init \u914D\u7F6E Codex\u3001VS Code\u3001Cursor\u3001Trae\u3001Claude MCP
|
|
1638
|
+
pull [--scope all|api|form|module|workflow|schema]
|
|
1639
|
+
push <file> \u663E\u5F0F\u63A8\u9001\u4E00\u4E2A\u5DF2\u62C9\u53D6\u7684 V8 \u6587\u4EF6
|
|
1640
|
+
sync status [--scope ...] \u6BD4\u8F83\u672C\u5730\u4E0E\u8FDC\u7AEF\u5DEE\u5F02
|
|
1641
|
+
doctor \u68C0\u67E5\u8FDE\u63A5\u3001Token\u3001AI \u4E0E MCP \u914D\u7F6E
|
|
1642
|
+
|
|
1643
|
+
\u901A\u7528\u9009\u9879\uFF1A--workspace <\u76EE\u5F55>\uFF08\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55\uFF09\u3001--profile <\u5E8F\u53F7/OsClient/\u540D\u79F0>\u3001--json`}async function Jn(a,e){let t=(ae(e,"api")||await We("API \u5730\u5740")).replace(/\/+$/,""),n=ae(e,"os-client")||await We("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 r={label:ae(e,"label")||await We("\u8FDE\u63A5\u540D\u79F0",n),apiBaseUrl:t,osClient:n,osClientType:ae(e,"type")||"",osClientNetwork:ae(e,"network")||""};return await a.config.addProfile(r),r}function Gi(a){return a===!0||a===1||String(a||"").trim().toLowerCase()==="true"}async function qn(a,e,t){let n=ae(t,"account")||await We("\u5E10\u53F7"),i=await Ki("\u5BC6\u7801"),r=await a.auth.getSysConfig(e.apiBaseUrl,e.osClient),s,o,c="";if(Gi(r?.EnableCaptcha)){let d=await a.auth.getCaptcha(e.apiBaseUrl,e.osClient);if(!d)throw new Error("\u670D\u52A1\u5668\u8981\u6C42\u9A8C\u8BC1\u7801\uFF0C\u4F46\u9A8C\u8BC1\u7801\u56FE\u7247\u83B7\u53D6\u5931\u8D25");c=he.join(a.config.getSyncRootDir(),".microi-login-captcha.png"),ie.mkdirSync(he.dirname(c),{recursive:!0}),ie.writeFileSync(c,Buffer.from(d.imageBase64.split(",")[1],"base64")),console.log(`\u9A8C\u8BC1\u7801\u56FE\u7247\uFF1A${c}`),s=d.captchaId,o=ae(t,"captcha")||await We("\u9A8C\u8BC1\u7801")}try{let d=await a.auth.login(n,i,{apiBaseUrl:e.apiBaseUrl,osClient:e.osClient,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork,captchaId:s,captchaValue:o});if(!d.ok)throw new Error(d.msg||"\u767B\u5F55\u5931\u8D25");let m=await a.auth.getSysConfig(e.apiBaseUrl,e.osClient,void 0,!0);m&&await a.config.addProfile({...e,label:String(m.SysShortTitle||m.SysTitle||e.label),sysShortTitle:String(m.SysShortTitle||""),sysTitle:String(m.SysTitle||"")})}finally{c&&ie.existsSync(c)&&ie.rmSync(c,{force:!0})}}async function Qn(a,e){Et.getInstance().inject();let t=e?await at(a.root):{count:0,names:[]};return{workspace:a.root,syncRoot:a.config.getSyncRootDir(),mcp:t}}async function Yn(a,e,t){if(!Re(a,e))throw new Error("\u8BE5\u8FDE\u63A5\u6CA1\u6709\u53EF\u7528 Token\uFF0C\u8BF7\u5148\u6267\u884C microi auth login");let n=He.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 zi(){let{words:a,options:e}=Wi(process.argv.slice(2));if(!a.length||a[0]==="help"||e.help){console.log(zn());return}let t=e.json===!0,n=await Gn(ae(e,"workspace")||process.cwd()),[i,r,s]=a;if(i==="profile"){if(r==="list"){let o=n.config.getProfiles().map((c,d)=>({index:d+1,...c,loggedIn:Re(n,c)}));ue(o,t);return}if(r==="add"){ue(await Jn(n,e),t);return}if(r==="remove"){let o=ct(n.config,s||ae(e,"profile")),c=n.config.getProfiles().findIndex(d=>d.apiBaseUrl===o.apiBaseUrl&&d.osClient===o.osClient);await n.config.removeProfile(c),await n.auth.writeMcpTokenFile(),await at(n.root),ue({removed:!0,profile:o},t);return}}if(i==="auth"){let o=ct(n.config,ae(e,"profile"));if(r==="login"){await qn(n,o,e),ue({loggedIn:!0,profile:o.osClient},t);return}if(r==="status"){ue({loggedIn:Re(n,o),profile:o},t);return}if(r==="logout"){await n.api.clearTokenForServer(o.apiBaseUrl,o.osClient,o.osClientType,o.osClientNetwork),await n.auth.writeMcpTokenFile(),await at(n.root),ue({loggedIn:!1,profile:o.osClient},t);return}}if(i==="ai"&&r==="init"){ue(await Qn(n,e.mcp!==!1),t);return}if(i==="mcp"&&r==="init"){ue(await at(n.root),t);return}if(i==="init"){let o=n.config.getProfiles()[0];o||(o=await Jn(n,e)),Re(n,o)||await qn(n,o,e);let c=await Qn(n,!0);e.pull===!0&&await Yn(n,o,"all"),ue({initialized:!0,pulled:e.pull===!0,details:c},t);return}if(i==="pull"){let o=ct(n.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 Yn(n,o,c),ue({pulled:!0,scope:c,profile:o.osClient},t);return}if(i==="push"){let o=he.resolve(r||"");if(!ie.existsSync(o))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${o}`);if(!await He.getInstance().pushFile(o))throw new Error("\u63A8\u9001\u5931\u8D25\uFF0C\u8BF7\u67E5\u770B\u4E0A\u65B9 Microi \u65E5\u5FD7");ue({pushed:!0,file:o},t);return}if(i==="sync"&&r==="status"){let o=ct(n.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 d=await He.getInstance().checkRemoteDifferences(o,c);ue({profile:o.osClient,scope:c,count:d.length,differences:d},t);return}if(i==="doctor"){let o=n.config.getProfiles(),c=It(),d=he.join(n.root,".vscode","mcp.json"),m=[];if(ie.existsSync(d))try{let p=ft(ie.readFileSync(d,"utf-8")),h=p.servers&&typeof p.servers=="object"?p.servers:{};for(let[f,y]of Object.entries(h)){let S=y.env&&typeof y.env=="object"?y.env:{};if(!/^microi(?:_|-|$)/i.test(f)&&typeof S.MICROI_API_URL!="string")continue;let T=it(y),D=rt(T,c);m.push({name:f,source:String(S.MICROI_TOOL_SOURCE||"legacy"),version:T||"legacy",compatibility:D>0?"newer-provider-preserved":D<0?"upgrade-available":"compatible"})}}catch(p){m.push({name:"(config)",source:"unknown",version:"unknown",compatibility:`invalid-json: ${p instanceof Error?p.message:String(p)}`})}let g=he.join(n.root,".vscode",".microi-ai-docs-manifest.json"),l="";if(ie.existsSync(g))try{let p=JSON.parse(ie.readFileSync(g,"utf-8"));l=String(p.bundleVersion||"")}catch{l="invalid-json"}let u={ok:o.length>0&&o.some(p=>Re(n,p)),tool:{source:"cli",version:c},node:process.version,workspace:n.root,syncRoot:n.config.getSyncRootDir(),profiles:o.map(p=>({label:p.label,osClient:p.osClient,apiBaseUrl:p.apiBaseUrl,loggedIn:Re(n,p)})),files:{agents:ie.existsSync(he.join(n.root,"AGENTS.md")),vscodeMcp:ie.existsSync(d),codexMcp:ie.existsSync(he.join(n.root,".codex","config.toml")),tokenFile:ie.existsSync(n.auth.mcpTokenFilePath)},coexistence:{aiBundleVersion:l||"not-initialized",mcpProviders:m}};ue(u,t),u.ok||(process.exitCode=2);return}throw new Error(`\u672A\u77E5\u547D\u4EE4\uFF1A${a.join(" ")}
|
|
1644
|
+
|
|
1645
|
+
${zn()}`)}zi().catch(a=>{console.error(`Microi CLI: ${a instanceof Error?a.message:String(a)}`),process.exitCode=1});
|