@microi.net/cli 4.7.9 → 4.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/.codex-plugin/plugin.json +43 -0
  2. package/.mcp.json +11 -0
  3. package/LICENSE +21 -21
  4. package/README.md +18 -53
  5. package/assets/build-meta.json +16 -0
  6. package/assets/feature-matrix.json +129 -0
  7. package/assets/icon.png +0 -0
  8. package/assets/logo.svg +4 -0
  9. package/package.json +15 -9
  10. package/{dist → scripts}/codex-marketplace.json +2 -2
  11. package/{dist → scripts}/microi-cli.js +34 -34
  12. package/scripts/microi-codex-router.js +480 -0
  13. package/{dist → scripts}/microi-skills.meta.json +114 -114
  14. package/{dist/microi.skills → skills}/.microi-skills-version.json +2 -2
  15. package/skills/microi-codex/SKILL.md +39 -0
  16. package/{dist/microi.skills → skills}/microi-codex-installer/SKILL.md +21 -3
  17. package/{dist/microi.skills → skills}/microi-codex-installer/agents/openai.yaml +1 -1
  18. /package/{dist → scripts}/mcp-codex-stdio-adapter.js +0 -0
  19. /package/{dist → scripts}/mcp-server.js +0 -0
  20. /package/{dist → scripts}/mcp-trae-windows-launcher.cmd +0 -0
  21. /package/{dist → scripts}/microi-cli-mcp.js +0 -0
  22. /package/{dist/microi.skills → skills}/README.md +0 -0
  23. /package/{dist/microi.skills → skills}/ai-engine/SKILL.md +0 -0
  24. /package/{dist/microi.skills → skills}/ai-engine/agents/openai.yaml +0 -0
  25. /package/{dist/microi.skills → skills}/app-store/SKILL.md +0 -0
  26. /package/{dist/microi.skills → skills}/app-store/agents/openai.yaml +0 -0
  27. /package/{dist/microi.skills → skills}/business-blueprint/SKILL.md +0 -0
  28. /package/{dist/microi.skills → skills}/datasource-engine/SKILL.md +0 -0
  29. /package/{dist/microi.skills → skills}/datasource-engine/agents/openai.yaml +0 -0
  30. /package/{dist/microi.skills → skills}/dos-orm/SKILL.md +0 -0
  31. /package/{dist/microi.skills → skills}/dos-orm/references/api-reference.md +0 -0
  32. /package/{dist/microi.skills → skills}/job-engine/SKILL.md +0 -0
  33. /package/{dist/microi.skills → skills}/job-engine/agents/openai.yaml +0 -0
  34. /package/{dist/microi.skills → skills}/message-notification/SKILL.md +0 -0
  35. /package/{dist/microi.skills → skills}/message-notification/agents/openai.yaml +0 -0
  36. /package/{dist/microi.skills → skills}/message-notification/references/contracts.md +0 -0
  37. /package/{dist/microi.skills → skills}/microi-ai-app-auth.js +0 -0
  38. /package/{dist/microi.skills → skills}/microi-ai-application/SKILL.md +0 -0
  39. /package/{dist/microi.skills → skills}/microi-ai-application/agents/openai.yaml +0 -0
  40. /package/{dist/microi.skills → skills}/microi-ai-application/references/frontend-baseline.md +0 -0
  41. /package/{dist/microi.skills → skills}/microi-client-frontend/SKILL.md +0 -0
  42. /package/{dist/microi.skills → skills}/microi-datasource-mapping/SKILL.md +0 -0
  43. /package/{dist/microi.skills → skills}/microi-db-schema/SKILL.md +0 -0
  44. /package/{dist/microi.skills → skills}/microi-db-schema/agents/openai.yaml +0 -0
  45. /package/{dist/microi.skills → skills}/microi-db-schema/references/core-tables.md +0 -0
  46. /package/{dist/microi.skills → skills}/microi-db-schema/references/form-component-options.md +0 -0
  47. /package/{dist/microi.skills → skills}/microi-db-schema/references/schema-overview.md +0 -0
  48. /package/{dist/microi.skills → skills}/microi-db-schema/references/schema.md +0 -0
  49. /package/{dist/microi.skills → skills}/microi-db-schema/references/table-catalog.md +0 -0
  50. /package/{dist/microi.skills → skills}/microi-deployment/SKILL.md +0 -0
  51. /package/{dist/microi.skills → skills}/microi-deployment/references/deployment-matrix.md +0 -0
  52. /package/{dist/microi.skills → skills}/microi-docs-coverage/SKILL.md +0 -0
  53. /package/{dist/microi.skills → skills}/microi-docs-coverage/references/capability-map.md +0 -0
  54. /package/{dist/microi.skills → skills}/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +0 -0
  55. /package/{dist/microi.skills → skills}/microi-form-engine/SKILL.md +0 -0
  56. /package/{dist/microi.skills → skills}/microi-form-engine/references/component-catalog.md +0 -0
  57. /package/{dist/microi.skills → skills}/microi-form-engine/references/data-source-events.md +0 -0
  58. /package/{dist/microi.skills → skills}/microi-form-layout/SKILL.md +0 -0
  59. /package/{dist/microi.skills → skills}/microi-frontend-sdk/SKILL.md +0 -0
  60. /package/{dist/microi.skills → skills}/microi-left-right-layout/SKILL.md +0 -0
  61. /package/{dist/microi.skills → skills}/microi-microservice/SKILL.md +0 -0
  62. /package/{dist/microi.skills → skills}/microi-microservice/references/runtime-delivery.md +0 -0
  63. /package/{dist/microi.skills → skills}/microi-mobile-app-quality/SKILL.md +0 -0
  64. /package/{dist/microi.skills → skills}/microi-solution-quotation/SKILL.md +0 -0
  65. /package/{dist/microi.skills → skills}/microi-solution-quotation/agents/openai.yaml +0 -0
  66. /package/{dist/microi.skills → skills}/microi-solution-quotation/scripts/build_solution_quote.py +0 -0
  67. /package/{dist/microi.skills → skills}/microi-system-delivery/SKILL.md +0 -0
  68. /package/{dist/microi.skills → skills}/microi-ui/SKILL.md +0 -0
  69. /package/{dist/microi.skills → skills}/microi-uniapp-frontend/SKILL.md +0 -0
  70. /package/{dist/microi.skills → skills}/microi.v8.js +0 -0
  71. /package/{dist/microi.skills → skills}/module-engine/SKILL.md +0 -0
  72. /package/{dist/microi.skills → skills}/module-engine/references/module-config.md +0 -0
  73. /package/{dist/microi.skills → skills}/ocr-engine/SKILL.md +0 -0
  74. /package/{dist/microi.skills → skills}/ocr-engine/agents/openai.yaml +0 -0
  75. /package/{dist/microi.skills → skills}/page-engine/SKILL.md +0 -0
  76. /package/{dist/microi.skills → skills}/performance-testing/SKILL.md +0 -0
  77. /package/{dist/microi.skills → skills}/playwright-e2e/SKILL.md +0 -0
  78. /package/{dist/microi.skills → skills}/print-engine/SKILL.md +0 -0
  79. /package/{dist/microi.skills → skills}/production-readonly-audit/SKILL.md +0 -0
  80. /package/{dist/microi.skills → skills}/report-engine/SKILL.md +0 -0
  81. /package/{dist/microi.skills → skills}/report-engine/agents/openai.yaml +0 -0
  82. /package/{dist/microi.skills → skills}/search-engine/SKILL.md +0 -0
  83. /package/{dist/microi.skills → skills}/search-engine/agents/openai.yaml +0 -0
  84. /package/{dist/microi.skills → skills}/spider-engine/SKILL.md +0 -0
  85. /package/{dist/microi.skills → skills}/translate-engine/SKILL.md +0 -0
  86. /package/{dist/microi.skills → skills}/translate-engine/agents/openai.yaml +0 -0
  87. /package/{dist/microi.skills → skills}/ui-design/SKILL.md +0 -0
  88. /package/{dist/microi.skills → skills}/ui-design/assets/pattern-showcase/app.js +0 -0
  89. /package/{dist/microi.skills → skills}/ui-design/assets/pattern-showcase/index.html +0 -0
  90. /package/{dist/microi.skills → skills}/ui-design/assets/pattern-showcase/styles.css +0 -0
  91. /package/{dist/microi.skills → skills}/ui-design/assets/templates/MCI-DESIGN.md +0 -0
  92. /package/{dist/microi.skills → skills}/ui-design/references/design-pattern-library.md +0 -0
  93. /package/{dist/microi.skills → skills}/ui-design/references/mci-design-contract.md +0 -0
  94. /package/{dist/microi.skills → skills}/ui-design/references/motion-and-media.md +0 -0
  95. /package/{dist/microi.skills → skills}/ui-design/references/product-flow-recipes.md +0 -0
  96. /package/{dist/microi.skills → skills}/uniapp-mall-assets/SKILL.md +0 -0
  97. /package/{dist/microi.skills → skills}/v8-api-config/SKILL.md +0 -0
  98. /package/{dist/microi.skills → skills}/v8-cache-pattern/SKILL.md +0 -0
  99. /package/{dist/microi.skills → skills}/v8-crud-api/SKILL.md +0 -0
  100. /package/{dist/microi.skills → skills}/v8-debugging/SKILL.md +0 -0
  101. /package/{dist/microi.skills → skills}/v8-explorer-tree/SKILL.md +0 -0
  102. /package/{dist/microi.skills → skills}/v8-export-import/SKILL.md +0 -0
  103. /package/{dist/microi.skills → skills}/v8-file-upload/SKILL.md +0 -0
  104. /package/{dist/microi.skills → skills}/v8-formengine-http/SKILL.md +0 -0
  105. /package/{dist/microi.skills → skills}/v8-frontend-events/SKILL.md +0 -0
  106. /package/{dist/microi.skills → skills}/v8-frontend-events/references/bluetooth-print-api.md +0 -0
  107. /package/{dist/microi.skills → skills}/v8-frontend-events/references/bluetooth-print.md +0 -0
  108. /package/{dist/microi.skills → skills}/v8-http-integration/SKILL.md +0 -0
  109. /package/{dist/microi.skills → skills}/v8-image-processing/SKILL.md +0 -0
  110. /package/{dist/microi.skills → skills}/v8-image-processing/agents/openai.yaml +0 -0
  111. /package/{dist/microi.skills → skills}/v8-image-processing/references/api-reference.md +0 -0
  112. /package/{dist/microi.skills → skills}/v8-menu-buttons/SKILL.md +0 -0
  113. /package/{dist/microi.skills → skills}/v8-mongodb/SKILL.md +0 -0
  114. /package/{dist/microi.skills → skills}/v8-mq-mqtt/SKILL.md +0 -0
  115. /package/{dist/microi.skills → skills}/v8-saas-multi-tenant/SKILL.md +0 -0
  116. /package/{dist/microi.skills → skills}/v8-security/SKILL.md +0 -0
  117. /package/{dist/microi.skills → skills}/v8-sql-query/SKILL.md +0 -0
  118. /package/{dist/microi.skills → skills}/v8-table-event/SKILL.md +0 -0
  119. /package/{dist/microi.skills → skills}/v8-template-engine/SKILL.md +0 -0
  120. /package/{dist/microi.skills → skills}/v8-utilities/SKILL.md +0 -0
  121. /package/{dist/microi.skills → skills}/v8-utilities/references/client-api-index.md +0 -0
  122. /package/{dist/microi.skills → skills}/v8-utilities/references/platform-http-routes.md +0 -0
  123. /package/{dist/microi.skills → skills}/v8-utilities/references/server-api-index.md +0 -0
  124. /package/{dist/microi.skills → skills}/v8-workflow/SKILL.md +0 -0
  125. /package/{dist/microi.skills → skills}/workspace-conventions/SKILL.md +0 -0
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var Tr=Object.create;var hn=Object.defineProperty;var vr=Object.getOwnPropertyDescriptor;var wr=Object.getOwnPropertyNames;var Er=Object.getPrototypeOf,br=Object.prototype.hasOwnProperty;var kr=(a,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of wr(e))!br.call(a,r)&&r!==t&&hn(a,r,{get:()=>e[r],enumerable:!(n=vr(e,r))||n.enumerable});return a};var K=(a,e,t)=>(t=a!=null?Tr(Er(a)):{},kr(e||!a||!a.__esModule?hn(t,"default",{value:a,enumerable:!0}):t,a));var se=K(require("fs")),Ce=K(require("path")),Sr=K(require("readline"));var yn=K(require("os")),Sn=process.cwd();function Cn(a){Sn=a}var Dr={append:a=>process.stderr.write(a),appendLine:(a="")=>console.error(a),clear:()=>{},show:()=>{},hide:()=>{},replace:a=>process.stderr.write(a),dispose:()=>{},name:"Microi CLI"},Ye={get workspaceFolders(){return[{uri:{fsPath:Sn}}]},workspaceFile:void 0,findFiles:async()=>[]},Kt={machineId:yn.hostname()||"microi-cli",sessionId:`microi-cli-${process.pid}`},xe={executeCommand:async()=>{}},$e={Notification:15},Tn={file:a=>({fsPath:a})},le={createOutputChannel:()=>Dr,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 T=K(require("fs")),v=K(require("path"));var bt=K(require("https")),kt=K(require("http")),Dt=K(require("crypto")),ze=K(require("fs"));var he=K(require("path")),W=K(require("fs")),Ln=K(require("crypto"));var Be=".microi-meta.json",vn=".microi-config.json",Xe=".microi-mcp-tokens.json";var wn=".mcp.json";var Pe="Microi-V8-Engine";var Ue="\u63A5\u53E3\u5F15\u64CE",En="V8\u4E8B\u4EF6",be="\u8868\u5355\u5F15\u64CE",_e="\u6A21\u5757\u5F15\u64CE",je="\u6D41\u7A0B\u5F15\u64CE",bn="AI\u5E94\u7528",St="\u8868\u5355V8\u4E8B\u4EF6",Ze="\u5B57\u6BB5V8\u4E8B\u4EF6",Ct="\u8282\u70B9",kn={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"},Ht={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"},Ke={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"},et={SqlJoin:"Join\u5173\u8054",SqlWhere:"Where\u6761\u4EF6"},Dn={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"},tt=".microi-typings",Tt="v8-engine.d.ts",Wt=".github",Gt="copilot-instructions.md",zt="CLAUDE.md",Jt="AGENTS.md",qt=".cursorrules",Qt=".cursor/rules",Yt="microi-skills.mdc",L={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"},He=".microi-db-schema.json",Me=".microi-db-schema.md";var Xt=`\u26A0\uFE0F \u4FEE\u6539\u540E\u8BF7\u624B\u52A8\u63A8\u9001\u5230\u6570\u636E\u5E93
2
+ "use strict";var vr=Object.create;var hn=Object.defineProperty;var Er=Object.getOwnPropertyDescriptor;var wr=Object.getOwnPropertyNames;var br=Object.getPrototypeOf,kr=Object.prototype.hasOwnProperty;var Dr=(a,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of wr(e))!kr.call(a,r)&&r!==t&&hn(a,r,{get:()=>e[r],enumerable:!(n=Er(e,r))||n.enumerable});return a};var K=(a,e,t)=>(t=a!=null?vr(br(a)):{},Dr(e||!a||!a.__esModule?hn(t,"default",{value:a,enumerable:!0}):t,a));var se=K(require("fs")),Ce=K(require("path")),Cr=K(require("readline"));var yn=K(require("os")),Sn=process.cwd();function Cn(a){Sn=a}var Ir={append:a=>process.stderr.write(a),appendLine:(a="")=>console.error(a),clear:()=>{},show:()=>{},hide:()=>{},replace:a=>process.stderr.write(a),dispose:()=>{},name:"Microi CLI"},Ye={get workspaceFolders(){return[{uri:{fsPath:Sn}}]},workspaceFile:void 0,findFiles:async()=>[]},Kt={machineId:yn.hostname()||"microi-cli",sessionId:`microi-cli-${process.pid}`},xe={executeCommand:async()=>{}},$e={Notification:15},Tn={file:a=>({fsPath:a})},le={createOutputChannel:()=>Ir,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 T=K(require("fs")),v=K(require("path"));var bt=K(require("https")),kt=K(require("http")),Dt=K(require("crypto")),ze=K(require("fs"));var he=K(require("path")),W=K(require("fs")),Ln=K(require("crypto"));var Be=".microi-meta.json",vn=".microi-config.json",Xe=".microi-mcp-tokens.json";var En=".mcp.json";var Pe="Microi-V8-Engine";var Ue="\u63A5\u53E3\u5F15\u64CE",wn="V8\u4E8B\u4EF6",be="\u8868\u5355\u5F15\u64CE",_e="\u6A21\u5757\u5F15\u64CE",je="\u6D41\u7A0B\u5F15\u64CE",bn="AI\u5E94\u7528",St="\u8868\u5355V8\u4E8B\u4EF6",Ze="\u5B57\u6BB5V8\u4E8B\u4EF6",Ct="\u8282\u70B9",kn={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"},Ht={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"},Ke={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"},et={SqlJoin:"Join\u5173\u8054",SqlWhere:"Where\u6761\u4EF6"},Dn={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"},tt=".microi-typings",Tt="v8-engine.d.ts",Wt=".github",Gt="copilot-instructions.md",zt="CLAUDE.md",Jt="AGENTS.md",qt=".cursorrules",Qt=".cursor/rules",Yt="microi-skills.mdc",L={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"},He=".microi-db-schema.json",Me=".microi-db-schema.md";var Xt=`\u26A0\uFE0F \u4FEE\u6539\u540E\u8BF7\u624B\u52A8\u63A8\u9001\u5230\u6570\u636E\u5E93
3
3
  */
4
4
 
5
5
  `;var We="microi.isLoggedIn";var Zt="microi.authToken",Te="microi.username",ve="microi.password",In=`-----BEGIN PUBLIC KEY-----
@@ -13,12 +13,12 @@ XaFX8UgCFE4d4pvK6IvQsWunm+WfYqgrSzBMS1LH1fstmZB0wnVUX1uGROaZTKGZ
13
13
  `,l=`${u?`
14
14
  `:""}${g}${d.join(`
15
15
  `)}
16
- `;me.appendFileSync(r,l,"utf-8")}catch{}}function Ge(a){if(process.platform==="win32")try{let e=_n(a);if(!e)return;try{if((0,en.execFileSync)("git",["config","--get","core.longpaths"],{cwd:e.workTreeRoot,encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0}).trim().toLowerCase()==="true")return}catch{}(0,en.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 tn(a){return encodeURIComponent(String(a||"")).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function Ir(a){try{return decodeURIComponent(String(a||""))}catch{return String(a||"")}}function we(a){let e=a.indexOf(Xt);return e!==-1?a.substring(e+Xt.length):a}function Rr(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 nn(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 r=t.replace(/=+$/,""),i=Buffer.from(n,"utf8").toString("base64").replace(/=+$/,"");return r!==i?e:Rr(n)?n:e}catch{return e}}function Mn(a,e){let n=z.relative(e,a).split(z.sep);if(n.length>=5&&(n[2]===Ue||n[2]==="api-engine")){let r=n[1],i=r.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:r,osClient:i,category:n[3],apiEngineKey:Ir(o[1])}:{serverDir:n[0],osClientDir:r,osClient:i,category:n[3],apiEngineKey:s}}if(n.length>=6&&n[5]?.endsWith(".js"))return{serverDir:n[0],osClientDir:r,osClient:i,category:n[3],apiEngineKey:n[5].replace(".js","")}}return null}function Nn(a,e){let n=z.relative(e,a).split(z.sep),r=i=>{let s=i.match(/[((]([^))]+)[))]\s*$/);return s?s[1]:i};if(n.length>=6&&n[2]===be&&n[4]===St){let i=n[1],s=i.split(".")[0],o=r(n[3]),c=n[5].replace(/\.js$/i,""),d=r(c);return{serverDir:n[0],osClientDir:i,osClient:s,formEngineKey:o,eventType:d}}if(n.length>=5&&(n[2]===En||n[2]==="v8-event"||n[2]==="v8-events")){let i=n[1],s=i.split(".")[0],o=r(n[3]);return{serverDir:n[0],osClientDir:i,osClient:s,formEngineKey:o,eventType:n[4].replace(/\.js$/i,"")}}return null}function fe(a){return(a||new Date).toISOString().replace("T"," ").substring(0,19)}function An(a,e){let n=z.relative(e,a).split(z.sep);if(n.length<7||n[2]!==be||n[4]!==Ze)return null;let r=g=>{let l=g.match(/[((]([^))]+)[))]\s*$/);return l?l[1]:g},i=n[1],s=i.split(".")[0],o=r(n[3]),c=r(n[5]),d=n[6].replace(/\.js$/i,""),u=r(d);return{serverDir:n[0],osClientDir:i,osClient:s,tableName:o,fieldName:c,v8Key:u}}function Fn(a,e){let n=z.relative(e,a).split(z.sep);if(n[2]!==_e)return null;let r=g=>{let l=g.match(/[((]([^))]+)[))]\s*$/);return l?l[1]:g},i=g=>g.replace(/[((][^))]+[))]\s*$/,"").trim()||g,s=n[1],o=s.split(".")[0],c=n.findIndex((g,l)=>l>2&&Object.prototype.hasOwnProperty.call(Ke,r(g)));if(c<=3)return null;let d=r(n[c-1]),u=r(n[c]);if(n.length>c+1&&n[c+1].endsWith(".js")){let g=n[c+1].replace(/\.js$/i,""),l=r(g),m=i(g).replace(/_显隐判断$/,"")||i(g),p=g.includes("\u663E\u9690\u5224\u65AD")?"V8CodeShow":"V8Code";return{serverDir:n[0],osClientDir:s,osClient:o,moduleId:d,btnField:u,btnId:l,btnName:m,v8SubField:p}}if(n.length>c+2&&n[c+2].endsWith(".js")){let g=r(n[c+1]),l=i(n[c+1]),m=n[c+2].replace(/\.js$/i,""),p=r(m);return p!=="V8Code"&&p!=="V8CodeShow"?null:{serverDir:n[0],osClientDir:s,osClient:o,moduleId:d,btnField:u,btnId:g,btnName:l,v8SubField:p}}return null}function Vn(a,e){let n=z.relative(e,a).split(z.sep),r=n[n.length-1];if(n.length<5||n[2]!==_e||!r?.endsWith(".js"))return null;let i=d=>{let u=d.match(/[((]([^))]+)[))]\s*$/);return u?u[1]:d},s=i(r.replace(/\.js$/i,""));if(!Object.prototype.hasOwnProperty.call(et,s))return null;let o=i(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 On(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,`
16
+ `;me.appendFileSync(r,l,"utf-8")}catch{}}function Ge(a){if(process.platform==="win32")try{let e=_n(a);if(!e)return;try{if((0,en.execFileSync)("git",["config","--get","core.longpaths"],{cwd:e.workTreeRoot,encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0}).trim().toLowerCase()==="true")return}catch{}(0,en.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 tn(a){return encodeURIComponent(String(a||"")).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function Rr(a){try{return decodeURIComponent(String(a||""))}catch{return String(a||"")}}function Ee(a){let e=a.indexOf(Xt);return e!==-1?a.substring(e+Xt.length):a}function Pr(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 nn(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 r=t.replace(/=+$/,""),i=Buffer.from(n,"utf8").toString("base64").replace(/=+$/,"");return r!==i?e:Pr(n)?n:e}catch{return e}}function Mn(a,e){let n=z.relative(e,a).split(z.sep);if(n.length>=5&&(n[2]===Ue||n[2]==="api-engine")){let r=n[1],i=r.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:r,osClient:i,category:n[3],apiEngineKey:Rr(o[1])}:{serverDir:n[0],osClientDir:r,osClient:i,category:n[3],apiEngineKey:s}}if(n.length>=6&&n[5]?.endsWith(".js"))return{serverDir:n[0],osClientDir:r,osClient:i,category:n[3],apiEngineKey:n[5].replace(".js","")}}return null}function Nn(a,e){let n=z.relative(e,a).split(z.sep),r=i=>{let s=i.match(/[((]([^))]+)[))]\s*$/);return s?s[1]:i};if(n.length>=6&&n[2]===be&&n[4]===St){let i=n[1],s=i.split(".")[0],o=r(n[3]),c=n[5].replace(/\.js$/i,""),d=r(c);return{serverDir:n[0],osClientDir:i,osClient:s,formEngineKey:o,eventType:d}}if(n.length>=5&&(n[2]===wn||n[2]==="v8-event"||n[2]==="v8-events")){let i=n[1],s=i.split(".")[0],o=r(n[3]);return{serverDir:n[0],osClientDir:i,osClient:s,formEngineKey:o,eventType:n[4].replace(/\.js$/i,"")}}return null}function fe(a){return(a||new Date).toISOString().replace("T"," ").substring(0,19)}function An(a,e){let n=z.relative(e,a).split(z.sep);if(n.length<7||n[2]!==be||n[4]!==Ze)return null;let r=g=>{let l=g.match(/[((]([^))]+)[))]\s*$/);return l?l[1]:g},i=n[1],s=i.split(".")[0],o=r(n[3]),c=r(n[5]),d=n[6].replace(/\.js$/i,""),u=r(d);return{serverDir:n[0],osClientDir:i,osClient:s,tableName:o,fieldName:c,v8Key:u}}function Fn(a,e){let n=z.relative(e,a).split(z.sep);if(n[2]!==_e)return null;let r=g=>{let l=g.match(/[((]([^))]+)[))]\s*$/);return l?l[1]:g},i=g=>g.replace(/[((][^))]+[))]\s*$/,"").trim()||g,s=n[1],o=s.split(".")[0],c=n.findIndex((g,l)=>l>2&&Object.prototype.hasOwnProperty.call(Ke,r(g)));if(c<=3)return null;let d=r(n[c-1]),u=r(n[c]);if(n.length>c+1&&n[c+1].endsWith(".js")){let g=n[c+1].replace(/\.js$/i,""),l=r(g),m=i(g).replace(/_显隐判断$/,"")||i(g),p=g.includes("\u663E\u9690\u5224\u65AD")?"V8CodeShow":"V8Code";return{serverDir:n[0],osClientDir:s,osClient:o,moduleId:d,btnField:u,btnId:l,btnName:m,v8SubField:p}}if(n.length>c+2&&n[c+2].endsWith(".js")){let g=r(n[c+1]),l=i(n[c+1]),m=n[c+2].replace(/\.js$/i,""),p=r(m);return p!=="V8Code"&&p!=="V8CodeShow"?null:{serverDir:n[0],osClientDir:s,osClient:o,moduleId:d,btnField:u,btnId:g,btnName:l,v8SubField:p}}return null}function Vn(a,e){let n=z.relative(e,a).split(z.sep),r=n[n.length-1];if(n.length<5||n[2]!==_e||!r?.endsWith(".js"))return null;let i=d=>{let u=d.match(/[((]([^))]+)[))]\s*$/);return u?u[1]:d},s=i(r.replace(/\.js$/i,""));if(!Object.prototype.hasOwnProperty.call(et,s))return null;let o=i(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 On(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
18
  `).split(`
19
- `).forEach((n,r)=>{for(let i of t)if(i.regex.test(n)){e.push({line:r+1,marker:i.label});break}}),e}function xn(a,e){let n=z.relative(e,a).split(z.sep);if(n.length<7||n[2]!==je||n[4]!==Ct||!n[6]?.endsWith(".js"))return null;let r=u=>{let g=u.match(/[((]([^))]+)[))]\s*$/);return g?g[1]:u},i=n[1],s=i.split(".")[0],o=r(n[3]),c=r(n[5]),d=r(n[6].replace(/\.js$/i,""));return{serverDir:n[0],osClientDir:i,osClient:s,flowDesignId:o,nodeId:c,eventType:d}}function nt(a){return String(a).padStart(2,"0")}function $n(a=new Date){return`${a.getFullYear()}-${nt(a.getMonth()+1)}-${nt(a.getDate())} ${nt(a.getHours())}:${nt(a.getMinutes())}:${nt(a.getSeconds())}`}function Ne(a,e,t){let n=String(t??"").trim();!n||e.has(n)||(e.add(n),a.push(n))}function rt(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 Ne(t,n,e.message),Ne(t,n,e.code),Ne(t,n,e.syscall),e.address&&Ne(t,n,`address=${e.address}`),e.port!==void 0&&e.port!==null&&e.port!==""&&Ne(t,n,`port=${e.port}`),(Array.isArray(e.errors)?e.errors:[]).forEach(i=>Ne(t,n,rt(i))),t.length||Ne(t,n,e.name),t.join(" | ")||"\u672A\u77E5\u9519\u8BEF"}var Y=class a{static init(){a._channel||(a._channel=le.createOutputChannel("Microi \u543E\u7801"))}static get channel(){return a._channel}static log(e,t){a.init();let n=$n();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 Pr(a){return typeof a=="string"?a:a&&typeof a=="object"&&"title"in a?String(a.title||""):""}function rn(a,e){return a.then(t=>{let n=Pr(t);return n&&Y.log("\u901A\u77E5/\u64CD\u4F5C",`${e}\u901A\u77E5\u9009\u62E9\uFF1A${n}`),t})}var _=class{static info(e,...t){return Y.log("\u901A\u77E5/\u4FE1\u606F",e),rn(le.showInformationMessage(e,...t),"\u4FE1\u606F")}static warn(e,...t){return Y.log("\u901A\u77E5/\u8B66\u544A",e),rn(le.showWarningMessage(e,...t),"\u8B66\u544A")}static error(e,...t){return Y.log("\u901A\u77E5/\u9519\u8BEF",e),rn(le.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 he.join(this.getDefaultSyncRootDir(e),vn)}getWorkspaceStateFilePath(e){let t=this.getWorkspaceRoot();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");return he.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(he.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(he.dirname(t),{recursive:!0});let n=`${t}.lock`,r=Date.now()+3e3,i;for(;i===void 0;)try{i=W.openSync(n,"wx",384),W.writeFileSync(i,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()>=r)throw new Error("Microi \u914D\u7F6E\u6B63\u5728\u88AB CLI \u6216 VS Code \u63D2\u4EF6\u4FEE\u6539\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");await new Promise(c=>setTimeout(c,40))}try{let s=this.readWorkspaceConfigForUpdate(t),o=this.normalizeSettings(e(s));return this.writeWorkspaceConfig(t,o),this.normalizeSettings(o)}finally{try{W.closeSync(i)}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}findProfileByIdentity(e,t){let n=this.profileIdentity({apiBaseUrl:e,osClient:t});return this.getProfiles().find(r=>this.profileIdentity(r)===n)}async addProfile(e){await this.upsertProfiles([e])}async upsertProfiles(e){await this.mutateWorkspaceConfig(t=>{let n=Array.isArray(t.profiles)?[...t.profiles]:[];for(let r of e){let i=this.profileIdentity(r),s=n.findIndex(o=>this.profileIdentity(o)===i);if(s>=0){let o=n[s];n[s]={...o,...r,apiBaseUrl:o.apiBaseUrl,osClient:o.osClient}}else n.push(r)}return{...t,profiles:n}})}async removeProfile(e){let t=await this.mutateWorkspaceConfig(n=>{let r=Array.isArray(n.profiles)?[...n.profiles]:[];return r.splice(e,1),{...n,profiles:r}});this._activeProfileIndex>=t.profiles.length&&(this._activeProfileIndex=t.profiles.length-1)}profileIdentity(e){let t=String(e.apiBaseUrl||"").trim().replace(/\/+$/,""),n=t;try{let r=new URL(t);n=`${r.protocol.toLowerCase()}//${r.host.toLowerCase()}${r.pathname.replace(/\/+$/,"")}`}catch{n=t.toLowerCase()}return`${n}|${String(e.osClient||"").trim().toLowerCase()}`}setActiveProfile(e){this._activeProfileIndex=e}get activeProfileIndex(){return this._activeProfileIndex}getActiveProfile(){let e=this.getProfiles();if(this._activeProfileIndex>=0&&this._activeProfileIndex<e.length)return e[this._activeProfileIndex];let t=this.getSettings();return t.apiBaseUrl?{label:"",apiBaseUrl:t.apiBaseUrl,osClient:t.osClient}:e[0]}getWorkspaceRoot(){return Ye.workspaceFolders?.[0]?.uri.fsPath}getDefaultSyncRootDir(e){return this.ensureDefaultSyncDirCasing(e),he.join(e,Pe)}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===Pe))return;let n=t.find(o=>o.name.toLowerCase()===Pe.toLowerCase());if(!n)return;let r=he.join(e,n.name),i=he.join(e,Pe),s=he.join(e,`${Pe}.case-rename-${Date.now()}`);W.renameSync(r,s);try{W.renameSync(s,i)}catch(o){try{W.renameSync(s,r)}catch{}throw o}}catch{this._syncDirCasingWarningShown||(this._syncDirCasingWarningShown=!0,_.warn(`Microi: \u65E0\u6CD5\u5C06\u65E7\u540C\u6B65\u76EE\u5F55\u91CD\u547D\u540D\u4E3A ${Pe}\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=he.resolve(t).toLowerCase(),r=Ln.createHash("sha256").update(n).digest("hex").slice(0,16);return`${e}.workspace.${r}`}getSyncRootDir(){let e=this.getSettings();if(e.localDir)return e.localDir;let t=this.getWorkspaceRoot();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");return this.getDefaultSyncRootDir(t)}getEngineDir(){return this.getSyncRootDir()}getEventDir(){return this.getSyncRootDir()}buildServerDirName(e,t){let n=t;try{n=new URL(t).host}catch{}return 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 Un(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 it(a){if(!Un(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 Et(a){return Un(a)&&!it(a)}function jn(a){return/^[a-f0-9]{64}$/i.test(String(a||"").trim())}function Bn(a){try{let t=String(a||"").replace(/^Bearer\s+/i,"").trim().split(".");if(t.length<2)return;let n=t[1].replace(/-/g,"+").replace(/_/g,"/"),r=JSON.parse(Buffer.from(n,"base64").toString("utf-8")),i=Number(r.MicroiTokenIssuedAt??r.iat);return Number.isFinite(i)&&i>0?i:void 0}catch{return}}function sn(a,e,t=!1){let n=String(a||"").trim(),r=String(e||"").trim();if(!n)return r;if(!r||r===n)return n;let i=Bn(n),s=Bn(r);return i!==void 0&&s!==void 0&&i!==s?s>i?r:n:i===void 0&&s!==void 0?r:s===void 0&&i!==void 0?n:t?r:n}var wt=class{constructor(){this.inFlight=new Map}async run(e,t){let n=this.inFlight.get(e);if(n)return n;let r=Promise.resolve().then(t);this.inFlight.set(e,r);try{return await r}finally{this.inFlight.get(e)===r&&this.inFlight.delete(e)}}};var Kn="microi.authTokenMap",$=class a{constructor(){this._token="";this._tokenMap={};this._authRecoveryGate=new wt}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=Ye.workspaceFile?.fsPath||Ye.workspaceFolders?.map(n=>n.uri.fsPath).sort().join("|")||Kt.sessionId||"empty-window",t=Dt.createHash("sha256").update(e.toLowerCase()).digest("hex").slice(0,16);return`VSCode:${Kt.machineId||"Unknown"}:${t}`}tokenKey(e,t,n,r){return t?[e,t,n||"",r||""].join("|"):e}legacyCompactTokenKey(e,t,n,r){return[e,t,n,r].filter(Boolean).join("|")}legacyTokenScope(e,t){try{let n=e.trim().replace(/\/+$/,"").toLowerCase(),r=String(t||"").trim().toLowerCase(),i=I.getInstance().getProfiles().filter(o=>String(o.apiBaseUrl||"").trim().replace(/\/+$/,"").toLowerCase()===n);return{tenantKeyUnambiguous:i.filter(o=>String(o.osClient||"").trim().toLowerCase()===r).length<=1,apiKeyUnambiguous:i.length<=1}}catch{return{tenantKeyUnambiguous:!0,apiKeyUnambiguous:!0}}}tokenLookupKeys(e,t,n,r){let i=[],s=this.legacyTokenScope(e,t);if(t){let o=this.tokenKey(e,t,n,r),c=this.tokenKey(e,t,"",""),d=this.legacyCompactTokenKey(e,t,n,r);i.push(o),s.tenantKeyUnambiguous&&i.push(c),(d===o||s.tenantKeyUnambiguous)&&i.push(d),n&&s.tenantKeyUnambiguous&&i.push(this.legacyCompactTokenKey(e,t,n)),s.tenantKeyUnambiguous&&i.push(this.legacyCompactTokenKey(e,t))}return(!t||s.apiKeyUnambiguous)&&i.push(e),Array.from(new Set(i))}async persistTokens(){if(!this._secretStorage)return;let e=I.getInstance(),t=e.getWorkspaceSecretKey(Zt),n=e.getWorkspaceSecretKey(Kn);this._token?await this._secretStorage.store(t,this._token):await this._secretStorage.delete(t),Object.keys(this._tokenMap).length>0?await this._secretStorage.store(n,JSON.stringify(this._tokenMap)):await this._secretStorage.delete(n)}async setToken(e,t,n,r,i){this._token=e,t&&(this._tokenMap[this.tokenKey(t,n,r,i)]=e),await this.persistTokens(),await this.notifyTokenStateChanged()}async loadToken(){if(this._token)return this._token;if(this._secretStorage){let e=I.getInstance();this._token=await this._secretStorage.get(e.getWorkspaceSecretKey(Zt))||"";try{let t=await this._secretStorage.get(e.getWorkspaceSecretKey(Kn));t&&(this._tokenMap=JSON.parse(t))}catch{}}return this._token}getTokenForServer(e,t,n,r){for(let i of this.tokenLookupKeys(e,t,n,r))if(this._tokenMap[i])return this._tokenMap[i];return""}getExactTokenForServer(e,t,n,r){return this._tokenMap[this.tokenKey(e,t,n,r)]||""}async adoptTokenFromSharedFile(e,t,n,r,i){this._token=e,this._tokenMap[this.tokenKey(t,n,r,i)]=e,await this.persistTokens()}async clearTokenForServer(e,t,n,r,i){let s=!1;for(let o of this.tokenLookupKeys(e,t,n,r))this._tokenMap[o]&&(!i||this._tokenMap[o]===i)&&(delete this._tokenMap[o],s=!0);this._token&&(!i||this._token===i)&&(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 r=e?.Msg||"";return e?.Code!==1&&/无效.*Token|Token.*无效|Token.*过期|登录.*过期|租户.*不一致|invalid\s*token|token\s*invalid/i.test(r)}serializeRequestBody(e,t){if(t==="form"){let n=new URLSearchParams;if(e&&typeof e=="object"&&!Array.isArray(e))for(let[r,i]of Object.entries(e))i!=null&&n.append(r,typeof i=="object"?JSON.stringify(i):String(i));return n.toString()}return JSON.stringify(e)}maskSensitiveBody(e){if(!e||typeof e!="object")return e;if(Array.isArray(e))return e.map(n=>this.maskSensitiveBody(n));let t={};for(let[n,r]of Object.entries(e))/^(pwd|password|authorization|token)$/i.test(n)?t[n]="***":r&&typeof r=="object"?t[n]=this.maskSensitiveBody(r):t[n]=r;return t}async refreshTokenForRequest(e,t,n){if(!t)return!1;let r=I.getInstance(),i=e.osClient||r.getOsClient()||"",s=new URL(n),c=s.pathname.replace(/\/+$/,"")+L.REFRESH_TOKEN,d=s.protocol==="https:",u=d?bt:kt,g=JSON.stringify({authorization:t,OsClient:i||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),...i?{OsClient:i}:{}},timeout:e.timeout||3e4,rejectUnauthorized:!1};return Y.log("API",`\u{1F504} RefreshToken ${n}${c}`),new Promise(m=>{let p=u.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 C=h.headers,E=h.statusCode||0,R=C.authorization||"";if(S?.Code===1&&R){await this.setToken(R,e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork),Y.log("API","\u2705 Token \u5DF2\u4EE5\u65E7\u6362\u65B0"),m(!0);return}this.isInvalidRefreshToken(S,E)&&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)}`),m(!1)})});p.on("error",h=>{Y.log("API",`\u274C RefreshToken Error: ${h.message}`),m(!1)}),p.on("timeout",()=>{p.destroy(),m(!1)}),p.write(g),p.end()})}async recoverAuthForRequest(e,t){if(!this._authRecoveryHandler)return!1;let n=I.getInstance(),r={apiBaseUrl:e.apiBaseUrl||t,osClient:e.osClient||n.getOsClient()||void 0,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork},i=this.tokenKey(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork);return this._authRecoveryGate.run(i,()=>this._authRecoveryHandler(r))}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 r=new URL(n),s=r.pathname.replace(/\/+$/,"")+e.path;if(e.params){let f=new URLSearchParams;for(let[S,C]of Object.entries(e.params))C!==void 0&&C!==""&&f.append(S,C);let y=f.toString();y&&(s+=`?${y}`)}let o=r.protocol==="https:",c=o?bt:kt,d=e.bodyFormat||"json",u=e.body!==void 0?this.serializeRequestBody(e.body,d):void 0,g={hostname:r.hostname,port:r.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};u!==void 0&&(g.headers["Content-Length"]=Buffer.byteLength(u));let l=e.allowAuthRetry!==!1,m=e.osClient||t.getOsClient()||"";m&&(g.headers.OsClient=m);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,E=>{let R=[];E.on("data",w=>R.push(w)),E.on("end",async()=>{let w=Buffer.concat(R).toString("utf-8"),b=E.statusCode||0;if(!e.silent){Y.log("API",`\u2B05\uFE0F ${b} ${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[P,O]of Object.entries(E.headers))typeof O=="string"&&(U[P.toLowerCase()]=O);V._headers=U;let F=U.authorization||"";if(F&&F!==p&&await this.setToken(F,e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork),l&&it(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&&Et(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(A){y(A)}return}f(V)}else if(b===401||b===403){if(l&&(await this.refreshTokenForRequest(e,p,n)||await this.recoverAuthForRequest(e,n))){try{f(await this.request({...e,allowAuthRetry:!1}))}catch(P){y(P)}return}y(new Error(`\u8EAB\u4EFD\u9A8C\u8BC1\u5931\u8D25 (HTTP ${b})\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55`))}else if(b>=400){let U=w.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim().substring(0,120);y(new Error(`\u670D\u52A1\u5668\u9519\u8BEF (HTTP ${b}): ${U||"\u672A\u77E5\u9519\u8BEF"}`))}else y(new Error(`\u54CD\u5E94\u89E3\u6790\u5931\u8D25 (HTTP ${b}): ${w.substring(0,200)}`))})}),C=!1;S.on("error",E=>{if(C)return;let R=rt(E);e.silent||Y.log("API",`\u274C ${e.method} ${e.path} Error: ${R}`),y(new Error(`\u8BF7\u6C42\u5931\u8D25: ${R}`))}),S.on("timeout",()=>{C=!0,S.destroy(),e.silent||Y.log("API",`\u23F0 ${e.method} ${e.path} Timeout`),y(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),u!==void 0&&S.write(u),S.end()})}async get(e,t,n,r){return this.request({method:"GET",path:e,params:t,apiBaseUrl:n,osClient:r?.osClient,osClientType:r?.osClientType,osClientNetwork:r?.osClientNetwork})}async post(e,t,n,r,i,s,o){return this.request({method:"POST",path:e,body:t,params:n,apiBaseUrl:r,osClient:i?.osClient,osClientType:i?.osClientType,osClientNetwork:i?.osClientNetwork,timeout:s,silent:o})}async getRaw(e,t,n){let r=I.getInstance(),i=n||r.getApiBaseUrl();if(!i)throw new Error("\u672A\u914D\u7F6E API \u5730\u5740");let s=new URL(i),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 m=l.toString();m&&(c+=`?${m}`)}let d=s.protocol==="https:",u=d?bt:kt,g={hostname:s.hostname,port:s.port||(d?443:80),path:c,method:"GET",timeout:15e3,rejectUnauthorized:!1};return new Promise((l,m)=>{let p=u.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=>m(new Error(`\u8BF7\u6C42\u5931\u8D25: ${h.message}`))),p.on("timeout",()=>{p.destroy(),m(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),p.end()})}async postMultipartFile(e,t,n,r,i,s,o=30*60*1e3){let c=ze.realpathSync(n),d=ze.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(!r||/[\r\n"]/u.test(r))throw new Error("\u4E0A\u4F20\u6587\u4EF6\u540D\u4E0D\u5408\u6CD5");let u=String(i||"").replace(/\/+$/,""),g=new URL(u),l=`----microi-vscode-${Dt.randomBytes(24).toString("hex")}`,m=Object.entries(t).map(([w,b])=>Buffer.from(`--${l}\r
21
- Content-Disposition: form-data; name="${w}"\r
19
+ `).forEach((n,r)=>{for(let i of t)if(i.regex.test(n)){e.push({line:r+1,marker:i.label});break}}),e}function xn(a,e){let n=z.relative(e,a).split(z.sep);if(n.length<7||n[2]!==je||n[4]!==Ct||!n[6]?.endsWith(".js"))return null;let r=u=>{let g=u.match(/[((]([^))]+)[))]\s*$/);return g?g[1]:u},i=n[1],s=i.split(".")[0],o=r(n[3]),c=r(n[5]),d=r(n[6].replace(/\.js$/i,""));return{serverDir:n[0],osClientDir:i,osClient:s,flowDesignId:o,nodeId:c,eventType:d}}function nt(a){return String(a).padStart(2,"0")}function $n(a=new Date){return`${a.getFullYear()}-${nt(a.getMonth()+1)}-${nt(a.getDate())} ${nt(a.getHours())}:${nt(a.getMinutes())}:${nt(a.getSeconds())}`}function Ne(a,e,t){let n=String(t??"").trim();!n||e.has(n)||(e.add(n),a.push(n))}function rt(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 Ne(t,n,e.message),Ne(t,n,e.code),Ne(t,n,e.syscall),e.address&&Ne(t,n,`address=${e.address}`),e.port!==void 0&&e.port!==null&&e.port!==""&&Ne(t,n,`port=${e.port}`),(Array.isArray(e.errors)?e.errors:[]).forEach(i=>Ne(t,n,rt(i))),t.length||Ne(t,n,e.name),t.join(" | ")||"\u672A\u77E5\u9519\u8BEF"}var Y=class a{static init(){a._channel||(a._channel=le.createOutputChannel("Microi \u543E\u7801"))}static get channel(){return a._channel}static log(e,t){a.init();let n=$n();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 _r(a){return typeof a=="string"?a:a&&typeof a=="object"&&"title"in a?String(a.title||""):""}function rn(a,e){return a.then(t=>{let n=_r(t);return n&&Y.log("\u901A\u77E5/\u64CD\u4F5C",`${e}\u901A\u77E5\u9009\u62E9\uFF1A${n}`),t})}var _=class{static info(e,...t){return Y.log("\u901A\u77E5/\u4FE1\u606F",e),rn(le.showInformationMessage(e,...t),"\u4FE1\u606F")}static warn(e,...t){return Y.log("\u901A\u77E5/\u8B66\u544A",e),rn(le.showWarningMessage(e,...t),"\u8B66\u544A")}static error(e,...t){return Y.log("\u901A\u77E5/\u9519\u8BEF",e),rn(le.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 he.join(this.getDefaultSyncRootDir(e),vn)}getWorkspaceStateFilePath(e){let t=this.getWorkspaceRoot();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");return he.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(he.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(he.dirname(t),{recursive:!0});let n=`${t}.lock`,r=Date.now()+3e3,i;for(;i===void 0;)try{i=W.openSync(n,"wx",384),W.writeFileSync(i,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()>=r)throw new Error("Microi \u914D\u7F6E\u6B63\u5728\u88AB CLI \u6216 VS Code \u63D2\u4EF6\u4FEE\u6539\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");await new Promise(c=>setTimeout(c,40))}try{let s=this.readWorkspaceConfigForUpdate(t),o=this.normalizeSettings(e(s));return this.writeWorkspaceConfig(t,o),this.normalizeSettings(o)}finally{try{W.closeSync(i)}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}findProfileByIdentity(e,t){let n=this.profileIdentity({apiBaseUrl:e,osClient:t});return this.getProfiles().find(r=>this.profileIdentity(r)===n)}async addProfile(e){await this.upsertProfiles([e])}async upsertProfiles(e){await this.mutateWorkspaceConfig(t=>{let n=Array.isArray(t.profiles)?[...t.profiles]:[];for(let r of e){let i=this.profileIdentity(r),s=n.findIndex(o=>this.profileIdentity(o)===i);if(s>=0){let o=n[s];n[s]={...o,...r,apiBaseUrl:o.apiBaseUrl,osClient:o.osClient}}else n.push(r)}return{...t,profiles:n}})}async removeProfile(e){let t=await this.mutateWorkspaceConfig(n=>{let r=Array.isArray(n.profiles)?[...n.profiles]:[];return r.splice(e,1),{...n,profiles:r}});this._activeProfileIndex>=t.profiles.length&&(this._activeProfileIndex=t.profiles.length-1)}profileIdentity(e){let t=String(e.apiBaseUrl||"").trim().replace(/\/+$/,""),n=t;try{let r=new URL(t);n=`${r.protocol.toLowerCase()}//${r.host.toLowerCase()}${r.pathname.replace(/\/+$/,"")}`}catch{n=t.toLowerCase()}return`${n}|${String(e.osClient||"").trim().toLowerCase()}`}setActiveProfile(e){this._activeProfileIndex=e}get activeProfileIndex(){return this._activeProfileIndex}getActiveProfile(){let e=this.getProfiles();if(this._activeProfileIndex>=0&&this._activeProfileIndex<e.length)return e[this._activeProfileIndex];let t=this.getSettings();return t.apiBaseUrl?{label:"",apiBaseUrl:t.apiBaseUrl,osClient:t.osClient}:e[0]}getWorkspaceRoot(){return Ye.workspaceFolders?.[0]?.uri.fsPath}getDefaultSyncRootDir(e){return this.ensureDefaultSyncDirCasing(e),he.join(e,Pe)}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===Pe))return;let n=t.find(o=>o.name.toLowerCase()===Pe.toLowerCase());if(!n)return;let r=he.join(e,n.name),i=he.join(e,Pe),s=he.join(e,`${Pe}.case-rename-${Date.now()}`);W.renameSync(r,s);try{W.renameSync(s,i)}catch(o){try{W.renameSync(s,r)}catch{}throw o}}catch{this._syncDirCasingWarningShown||(this._syncDirCasingWarningShown=!0,_.warn(`Microi: \u65E0\u6CD5\u5C06\u65E7\u540C\u6B65\u76EE\u5F55\u91CD\u547D\u540D\u4E3A ${Pe}\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=he.resolve(t).toLowerCase(),r=Ln.createHash("sha256").update(n).digest("hex").slice(0,16);return`${e}.workspace.${r}`}getSyncRootDir(){let e=this.getSettings();if(e.localDir)return e.localDir;let t=this.getWorkspaceRoot();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");return this.getDefaultSyncRootDir(t)}getEngineDir(){return this.getSyncRootDir()}getEventDir(){return this.getSyncRootDir()}buildServerDirName(e,t){let n=t;try{n=new URL(t).host}catch{}return 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 Un(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 it(a){if(!Un(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 wt(a){return Un(a)&&!it(a)}function jn(a){return/^[a-f0-9]{64}$/i.test(String(a||"").trim())}function Bn(a){try{let t=String(a||"").replace(/^Bearer\s+/i,"").trim().split(".");if(t.length<2)return;let n=t[1].replace(/-/g,"+").replace(/_/g,"/"),r=JSON.parse(Buffer.from(n,"base64").toString("utf-8")),i=Number(r.MicroiTokenIssuedAt??r.iat);return Number.isFinite(i)&&i>0?i:void 0}catch{return}}function sn(a,e,t=!1){let n=String(a||"").trim(),r=String(e||"").trim();if(!n)return r;if(!r||r===n)return n;let i=Bn(n),s=Bn(r);return i!==void 0&&s!==void 0&&i!==s?s>i?r:n:i===void 0&&s!==void 0?r:s===void 0&&i!==void 0?n:t?r:n}var Et=class{constructor(){this.inFlight=new Map}async run(e,t){let n=this.inFlight.get(e);if(n)return n;let r=Promise.resolve().then(t);this.inFlight.set(e,r);try{return await r}finally{this.inFlight.get(e)===r&&this.inFlight.delete(e)}}};var Kn="microi.authTokenMap",$=class a{constructor(){this._token="";this._tokenMap={};this._authRecoveryGate=new Et}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=Ye.workspaceFile?.fsPath||Ye.workspaceFolders?.map(n=>n.uri.fsPath).sort().join("|")||Kt.sessionId||"empty-window",t=Dt.createHash("sha256").update(e.toLowerCase()).digest("hex").slice(0,16);return`VSCode:${Kt.machineId||"Unknown"}:${t}`}tokenKey(e,t,n,r){return t?[e,t,n||"",r||""].join("|"):e}legacyCompactTokenKey(e,t,n,r){return[e,t,n,r].filter(Boolean).join("|")}legacyTokenScope(e,t){try{let n=e.trim().replace(/\/+$/,"").toLowerCase(),r=String(t||"").trim().toLowerCase(),i=I.getInstance().getProfiles().filter(o=>String(o.apiBaseUrl||"").trim().replace(/\/+$/,"").toLowerCase()===n);return{tenantKeyUnambiguous:i.filter(o=>String(o.osClient||"").trim().toLowerCase()===r).length<=1,apiKeyUnambiguous:i.length<=1}}catch{return{tenantKeyUnambiguous:!0,apiKeyUnambiguous:!0}}}tokenLookupKeys(e,t,n,r){let i=[],s=this.legacyTokenScope(e,t);if(t){let o=this.tokenKey(e,t,n,r),c=this.tokenKey(e,t,"",""),d=this.legacyCompactTokenKey(e,t,n,r);i.push(o),s.tenantKeyUnambiguous&&i.push(c),(d===o||s.tenantKeyUnambiguous)&&i.push(d),n&&s.tenantKeyUnambiguous&&i.push(this.legacyCompactTokenKey(e,t,n)),s.tenantKeyUnambiguous&&i.push(this.legacyCompactTokenKey(e,t))}return(!t||s.apiKeyUnambiguous)&&i.push(e),Array.from(new Set(i))}async persistTokens(){if(!this._secretStorage)return;let e=I.getInstance(),t=e.getWorkspaceSecretKey(Zt),n=e.getWorkspaceSecretKey(Kn);this._token?await this._secretStorage.store(t,this._token):await this._secretStorage.delete(t),Object.keys(this._tokenMap).length>0?await this._secretStorage.store(n,JSON.stringify(this._tokenMap)):await this._secretStorage.delete(n)}async setToken(e,t,n,r,i){this._token=e,t&&(this._tokenMap[this.tokenKey(t,n,r,i)]=e),await this.persistTokens(),await this.notifyTokenStateChanged()}async loadToken(){if(this._token)return this._token;if(this._secretStorage){let e=I.getInstance();this._token=await this._secretStorage.get(e.getWorkspaceSecretKey(Zt))||"";try{let t=await this._secretStorage.get(e.getWorkspaceSecretKey(Kn));t&&(this._tokenMap=JSON.parse(t))}catch{}}return this._token}getTokenForServer(e,t,n,r){for(let i of this.tokenLookupKeys(e,t,n,r))if(this._tokenMap[i])return this._tokenMap[i];return""}getExactTokenForServer(e,t,n,r){return this._tokenMap[this.tokenKey(e,t,n,r)]||""}async adoptTokenFromSharedFile(e,t,n,r,i){this._token=e,this._tokenMap[this.tokenKey(t,n,r,i)]=e,await this.persistTokens()}async clearTokenForServer(e,t,n,r,i){let s=!1;for(let o of this.tokenLookupKeys(e,t,n,r))this._tokenMap[o]&&(!i||this._tokenMap[o]===i)&&(delete this._tokenMap[o],s=!0);this._token&&(!i||this._token===i)&&(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 r=e?.Msg||"";return e?.Code!==1&&/无效.*Token|Token.*无效|Token.*过期|登录.*过期|租户.*不一致|invalid\s*token|token\s*invalid/i.test(r)}serializeRequestBody(e,t){if(t==="form"){let n=new URLSearchParams;if(e&&typeof e=="object"&&!Array.isArray(e))for(let[r,i]of Object.entries(e))i!=null&&n.append(r,typeof i=="object"?JSON.stringify(i):String(i));return n.toString()}return JSON.stringify(e)}maskSensitiveBody(e){if(!e||typeof e!="object")return e;if(Array.isArray(e))return e.map(n=>this.maskSensitiveBody(n));let t={};for(let[n,r]of Object.entries(e))/^(pwd|password|authorization|token)$/i.test(n)?t[n]="***":r&&typeof r=="object"?t[n]=this.maskSensitiveBody(r):t[n]=r;return t}async refreshTokenForRequest(e,t,n){if(!t)return!1;let r=I.getInstance(),i=e.osClient||r.getOsClient()||"",s=new URL(n),c=s.pathname.replace(/\/+$/,"")+L.REFRESH_TOKEN,d=s.protocol==="https:",u=d?bt:kt,g=JSON.stringify({authorization:t,OsClient:i||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),...i?{OsClient:i}:{}},timeout:e.timeout||3e4,rejectUnauthorized:!1};return Y.log("API",`\u{1F504} RefreshToken ${n}${c}`),new Promise(m=>{let p=u.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 C=h.headers,w=h.statusCode||0,R=C.authorization||"";if(S?.Code===1&&R){await this.setToken(R,e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork),Y.log("API","\u2705 Token \u5DF2\u4EE5\u65E7\u6362\u65B0"),m(!0);return}this.isInvalidRefreshToken(S,w)&&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)}`),m(!1)})});p.on("error",h=>{Y.log("API",`\u274C RefreshToken Error: ${h.message}`),m(!1)}),p.on("timeout",()=>{p.destroy(),m(!1)}),p.write(g),p.end()})}async recoverAuthForRequest(e,t){if(!this._authRecoveryHandler)return!1;let n=I.getInstance(),r={apiBaseUrl:e.apiBaseUrl||t,osClient:e.osClient||n.getOsClient()||void 0,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork},i=this.tokenKey(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork);return this._authRecoveryGate.run(i,()=>this._authRecoveryHandler(r))}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 r=new URL(n),s=r.pathname.replace(/\/+$/,"")+e.path;if(e.params){let f=new URLSearchParams;for(let[S,C]of Object.entries(e.params))C!==void 0&&C!==""&&f.append(S,C);let y=f.toString();y&&(s+=`?${y}`)}let o=r.protocol==="https:",c=o?bt:kt,d=e.bodyFormat||"json",u=e.body!==void 0?this.serializeRequestBody(e.body,d):void 0,g={hostname:r.hostname,port:r.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};u!==void 0&&(g.headers["Content-Length"]=Buffer.byteLength(u));let l=e.allowAuthRetry!==!1,m=e.osClient||t.getOsClient()||"";m&&(g.headers.OsClient=m);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,w=>{let R=[];w.on("data",E=>R.push(E)),w.on("end",async()=>{let E=Buffer.concat(R).toString("utf-8"),b=w.statusCode||0;if(!e.silent){Y.log("API",`\u2B05\uFE0F ${b} ${e.method} ${e.path}`);let U=E.length>500?E.substring(0,500)+"...(truncated)":E;Y.appendLine(` Response: ${U}`)}let V;try{V=JSON.parse(E)}catch{}if(V){let U={};for(let[P,O]of Object.entries(w.headers))typeof O=="string"&&(U[P.toLowerCase()]=O);V._headers=U;let F=U.authorization||"";if(F&&F!==p&&await this.setToken(F,e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork),l&&it(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&&wt(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(A){y(A)}return}f(V)}else if(b===401||b===403){if(l&&(await this.refreshTokenForRequest(e,p,n)||await this.recoverAuthForRequest(e,n))){try{f(await this.request({...e,allowAuthRetry:!1}))}catch(P){y(P)}return}y(new Error(`\u8EAB\u4EFD\u9A8C\u8BC1\u5931\u8D25 (HTTP ${b})\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55`))}else if(b>=400){let U=E.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim().substring(0,120);y(new Error(`\u670D\u52A1\u5668\u9519\u8BEF (HTTP ${b}): ${U||"\u672A\u77E5\u9519\u8BEF"}`))}else y(new Error(`\u54CD\u5E94\u89E3\u6790\u5931\u8D25 (HTTP ${b}): ${E.substring(0,200)}`))})}),C=!1;S.on("error",w=>{if(C)return;let R=rt(w);e.silent||Y.log("API",`\u274C ${e.method} ${e.path} Error: ${R}`),y(new Error(`\u8BF7\u6C42\u5931\u8D25: ${R}`))}),S.on("timeout",()=>{C=!0,S.destroy(),e.silent||Y.log("API",`\u23F0 ${e.method} ${e.path} Timeout`),y(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),u!==void 0&&S.write(u),S.end()})}async get(e,t,n,r){return this.request({method:"GET",path:e,params:t,apiBaseUrl:n,osClient:r?.osClient,osClientType:r?.osClientType,osClientNetwork:r?.osClientNetwork})}async post(e,t,n,r,i,s,o){return this.request({method:"POST",path:e,body:t,params:n,apiBaseUrl:r,osClient:i?.osClient,osClientType:i?.osClientType,osClientNetwork:i?.osClientNetwork,timeout:s,silent:o})}async getRaw(e,t,n){let r=I.getInstance(),i=n||r.getApiBaseUrl();if(!i)throw new Error("\u672A\u914D\u7F6E API \u5730\u5740");let s=new URL(i),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 m=l.toString();m&&(c+=`?${m}`)}let d=s.protocol==="https:",u=d?bt:kt,g={hostname:s.hostname,port:s.port||(d?443:80),path:c,method:"GET",timeout:15e3,rejectUnauthorized:!1};return new Promise((l,m)=>{let p=u.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=>m(new Error(`\u8BF7\u6C42\u5931\u8D25: ${h.message}`))),p.on("timeout",()=>{p.destroy(),m(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),p.end()})}async postMultipartFile(e,t,n,r,i,s,o=30*60*1e3){let c=ze.realpathSync(n),d=ze.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(!r||/[\r\n"]/u.test(r))throw new Error("\u4E0A\u4F20\u6587\u4EF6\u540D\u4E0D\u5408\u6CD5");let u=String(i||"").replace(/\/+$/,""),g=new URL(u),l=`----microi-vscode-${Dt.randomBytes(24).toString("hex")}`,m=Object.entries(t).map(([E,b])=>Buffer.from(`--${l}\r
21
+ Content-Disposition: form-data; name="${E}"\r
22
22
  \r
23
23
  ${b}\r
24
24
  `,"utf8")),p=Buffer.from(`--${l}\r
@@ -27,23 +27,23 @@ Content-Type: application/octet-stream\r
27
27
  \r
28
28
  `,"utf8"),h=Buffer.concat([...m,p]),f=Buffer.from(`\r
29
29
  --${l}--\r
30
- `,"utf8"),y=s?this.getTokenForServer(u,s.osClient,s.osClientType,s.osClientNetwork):await this.loadToken(),S=g.protocol==="https:",C=S?bt:kt,E=g.pathname.replace(/\/+$/,""),R={hostname:g.hostname,port:g.port||(S?443:80),path:E+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,b)=>{let V=!1,U=O=>{V||(V=!0,b(O))},F=C.request(R,O=>{let A=[];O.on("data",k=>A.push(k)),O.on("end",async()=>{if(V)return;let k=Buffer.concat(A).toString("utf8"),x;try{x=JSON.parse(k)}catch{U(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u54CD\u5E94\u4E0D\u662F JSON\uFF08HTTP ${O.statusCode||0}\uFF09`));return}let j=String(O.headers.authorization||"");j&&await this.setToken(j,u,s?.osClient,s?.osClientType,s?.osClientNetwork),V=!0,w(x)})});F.on("error",O=>U(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u5931\u8D25\uFF1A${rt(O)}`))),F.on("timeout",()=>{F.destroy(),U(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u8D85\u65F6\uFF08${o}ms\uFF09`))}),F.write(h);let P=ze.createReadStream(c);P.on("error",O=>{F.destroy(),U(new Error(`\u8BFB\u53D6\u672C\u5730\u53D1\u5E03\u8D44\u4EA7\u5931\u8D25\uFF1A${rt(O)}`))}),P.on("end",()=>F.end(f)),P.pipe(F,{end:!1})})}};var Je=K(require("crypto")),B=K(require("fs")),st=K(require("path"));var _r=60*60*1e3,Mr=5*60,Hn=24*60*60,Nr=2*60*1e3,Ar=60*1e3;function Fr(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 pe=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,$.getInstance().setTokenStateChangedHandler(async()=>{await this.writeMcpTokenFile()}),$.getInstance().setAuthRecoveryHandler(async t=>{let n=I.getInstance(),r=this.normalizeApiBaseUrl(t.apiBaseUrl),i=this.normalizeOsClient(t.osClient),s=this.normalizeIdentityPart(t.osClientType),o=this.normalizeIdentityPart(t.osClientNetwork),c=n.getProfiles().filter(g=>this.normalizeApiBaseUrl(g.apiBaseUrl)===r&&this.normalizeOsClient(g.osClient)===i),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 u=await this.reLoginForProfile(d);return u&&(this._isLoggedIn=!0,await xe.executeCommand("setContext",We,!0)),await this.writeMcpTokenFile(),u})}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=$.getInstance(),n=I.getInstance().getProfiles(),r=0;for(let i of n){let s=this.normalizeApiBaseUrl(i.apiBaseUrl),o=this.normalizeOsClient(i.osClient),c=this.mcpRecoveryIdentity(s,o,i.osClientType,i.osClientNetwork),u=n.filter(f=>this.normalizeApiBaseUrl(f.apiBaseUrl)===s&&this.normalizeOsClient(f.osClient)===o).length===1?[[s,o,i.osClientType,i.osClientNetwork].filter(Boolean).join("|"),[s,o,i.osClientType].filter(Boolean).join("|"),o?`${s}|${o}`:s]:[],g=typeof e[c]=="string"&&String(e[c]).trim()?String(e[c]).trim():"",l=u.map(f=>e[f]).find(f=>typeof f=="string"&&f.trim()),m=t.getTokenForServer(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork),p=t.getExactTokenForServer(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork),h=sn(m,g||l,!!g&&!p);!h||p===h||(await t.adoptTokenFromSharedFile(h,i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork),r+=1)}return r}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,r){return[this.normalizeApiBaseUrl(e),this.normalizeOsClient(t),this.normalizeIdentityPart(n),this.normalizeIdentityPart(r)].join("|")}serverSecretKey(e,t,n){return this.secretKey(`${e}.${this.normalizeApiBaseUrl(t)}|${this.normalizeOsClient(n)}`)}legacyServerSecretKey(e,t){return this.secretKey(`${e}.${this.normalizeApiBaseUrl(t)}`)}canUseLegacyCredential(e,t){let n=this.normalizeApiBaseUrl(e),r=this.normalizeOsClient(t);if(!n)return!1;let i=I.getInstance().getProfiles().filter(o=>this.normalizeApiBaseUrl(o.apiBaseUrl)===n);if(i.length===0)return!r;if(i.length===1)return!0;let s=i.filter(o=>this.normalizeOsClient(o.osClient)===r);return!!r&&s.length===i.length}async writeMcpTokenFile(){if(!this._mcpTokenFilePath)return;let e=$.getInstance(),n=I.getInstance().getProfiles(),r={},i=new Set,s=[];for(let p of n){let h=this.normalizeApiBaseUrl(p.apiBaseUrl),f=this.normalizeOsClient(p.osClient),y=this.mcpRecoveryIdentity(h,f,p.osClientType,p.osClientNetwork);i.add(y);let S=n.filter(R=>this.normalizeApiBaseUrl(R.apiBaseUrl)===h&&this.normalizeOsClient(R.osClient)===f),C=f?`${h}|${f}`:h;S.length===1&&i.add(C);let E=e.getTokenForServer(p.apiBaseUrl,p.osClient,p.osClientType,p.osClientNetwork);s.push({profile:p,exactKey:y,legacyKey:S.length===1?C:void 0,currentToken:E,currentExactToken:e.getExactTokenForServer(p.apiBaseUrl,p.osClient,p.osClientType,p.osClientNetwork)}),E&&(r[y]=E,S.length===1&&(r[C]=E))}let o=this._mcpTokenFilePath,c=st.dirname(o);B.existsSync(c)||B.mkdirSync(c,{recursive:!0});let d=`${o}.lock`,u=Date.now()+3e3,g;for(;g===void 0;)try{g=B.openSync(d,"wx",384),B.writeFileSync(g,JSON.stringify({pid:process.pid,createdAt:Date.now()}),"utf-8")}catch(p){if(p.code!=="EEXIST")throw p;try{Date.now()-B.statSync(d).mtimeMs>3e4&&B.unlinkSync(d)}catch{}if(Date.now()>=u)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(h=>setTimeout(h,40))}let l=`${o}.${process.pid}.${Date.now()}.tmp`,m=[];try{let p={};if(B.existsSync(o)){let f=JSON.parse(B.readFileSync(o,"utf-8"));if(!f||typeof f!="object"||Array.isArray(f))throw new Error(`Microi MCP Token \u6587\u4EF6\u5FC5\u987B\u662F JSON \u5BF9\u8C61\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1A${o}`);p=Object.fromEntries(Object.entries(f).filter(y=>typeof y[1]=="string"&&!!y[1]))}for(let f of s){let y=p[f.exactKey]||"",S=f.legacyKey&&p[f.legacyKey]||"",C=sn(f.currentToken,y||S,!!y&&!f.currentExactToken);C&&(r[f.exactKey]=C,f.legacyKey&&(r[f.legacyKey]=C),C!==f.currentExactToken&&m.push({profile:f.profile,token:C}))}for(let f of i)delete p[f];let h={...p,...r};B.writeFileSync(l,`${JSON.stringify(h,null,2)}
31
- `,{encoding:"utf-8",mode:384}),B.renameSync(l,o)}finally{try{B.existsSync(l)&&B.unlinkSync(l)}catch{}try{B.closeSync(g)}catch{}try{B.unlinkSync(d)}catch{}}for(let p of m)await e.adoptTokenFromSharedFile(p.token,p.profile.apiBaseUrl,p.profile.osClient,p.profile.osClientType,p.profile.osClientNetwork)}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 r=[];try{r=B.readdirSync(n).filter(i=>i.endsWith(".json")).slice(0,200)}catch{return}for(let i of r){let s=st.join(n,i);try{let o=JSON.parse(B.readFileSync(s,"utf-8")),c=this.normalizeApiBaseUrl(String(o.apiBaseUrl||"")),d=this.normalizeOsClient(String(o.osClient||"")),u=this.normalizeIdentityPart(String(o.osClientType||"")),g=this.normalizeIdentityPart(String(o.osClientNetwork||"")),l=this.mcpRecoveryIdentity(c,d,u,g);if(!u&&!g){let m=t.filter(p=>this.normalizeApiBaseUrl(p.apiBaseUrl)===c&&this.normalizeOsClient(p.osClient)===d);m.length===1&&(l=this.mcpRecoveryIdentity(m[0].apiBaseUrl,m[0].osClient,m[0].osClientType,m[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 r=I.getInstance().getProfiles(),i=$.getInstance();for(let s of t){let o=st.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),u=this.normalizeApiBaseUrl(String(c.apiBaseUrl||"")),g=this.normalizeOsClient(String(c.osClient||"")),l=this.normalizeIdentityPart(String(c.osClientType||"")),m=this.normalizeIdentityPart(String(c.osClientNetwork||"")),p=String(c.failedTokenHash||"").trim().toLowerCase();if(Number(c.version)!==1||!u||!d||Math.abs(Date.now()-d)>Nr||!jn(p)){try{B.unlinkSync(o)}catch{}continue}let h=r.filter(S=>this.normalizeApiBaseUrl(S.apiBaseUrl)===u&&this.normalizeOsClient(S.osClient)===g),f=l||m?h.find(S=>this.normalizeIdentityPart(S.osClientType)===l&&this.normalizeIdentityPart(S.osClientNetwork)===m):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,r);continue}this._mcpAuthRecoveryInProgress.add(y);try{let S=i.getTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork);S&&this.tokenFingerprint(S)!==p?(this._mcpAuthRecoveryFailureUntil.delete(y),await this.writeMcpTokenFile()):(S&&await i.clearTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork,S),await this.reLoginForProfile(f)?this._mcpAuthRecoveryFailureUntil.delete(y):(this._mcpAuthRecoveryFailureUntil.set(y,Date.now()+Ar),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,r)}}}}finally{this._mcpAuthRecoveryPassInProgress=!1}}}startMcpAuthRecoveryWatcher(){this._mcpAuthRecoveryTimer||!this._mcpAuthRecoveryDirPath||(this._mcpAuthRecoveryTimer=setInterval(()=>{this.processMcpAuthRecoveryRequests()},1e3),this.processMcpAuthRecoveryRequests())}stopMcpAuthRecoveryWatcher(){this._mcpAuthRecoveryTimer&&(clearInterval(this._mcpAuthRecoveryTimer),this._mcpAuthRecoveryTimer=void 0)}async tryAutoLogin(){let e=$.getInstance(),n=I.getInstance().getProfiles(),r=!1,i=await e.loadToken(),s=await this.loadMcpTokenFile();r=!!i||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)&&(r=!0)}},u=Math.min(4,o.length);return await Promise.all(Array.from({length:u},()=>d())),r&&(this._isLoggedIn=!0,await xe.executeCommand("setContext",We,!0),await this.writeMcpTokenFile()),r}async getSysConfig(e,t,n,r=!1){let i=$.getInstance(),s=I.getInstance();try{let o=await i.request({method:"POST",path:L.GET_SYS_CONFIG,body:{_SearchEqual:{IsEnable:1},OsClient:t||s.getOsClient()||void 0},apiBaseUrl:e,osClient:t,allowAuthRetry:!1,silent:r});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=$.getInstance(),r=I.getInstance();try{let i=await n.getRaw(L.GET_CAPTCHA,{OsClient:t||r.getOsClient()||""},e);if(i.data&&i.captchaId){let s=i.data.toString("base64");return{captchaId:i.captchaId,imageBase64:`data:image/png;base64,${s}`}}}catch{}return null}async login(e,t,n={}){let r=$.getInstance(),i=I.getInstance(),s=n.osClient||i.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||_.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${y}`),{ok:!1,msg:y}}let g=typeof c?.LoginRsaPublicKey=="string"&&c.LoginRsaPublicKey.trim()?c.LoginRsaPublicKey:In,l=Fr(t,g),m={Account:e,Pwd:l,OsClient:s||void 0,_ClientType:"VSCode"};n.captchaId&&n.captchaValue&&(m._CaptchaId=n.captchaId,m._CaptchaValue=n.captchaValue);let p=await r.request({method:"POST",path:L.LOGIN,body:m,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 r.setToken(f,n.apiBaseUrl,n.osClient,n.osClientType,n.osClientNetwork),this._secretStorage&&(n.apiBaseUrl?(await this._secretStorage.store(this.serverSecretKey(Te,n.apiBaseUrl,s),e),await this._secretStorage.store(this.serverSecretKey(ve,n.apiBaseUrl,s),t)):(await this._secretStorage.store(this.secretKey(Te),e),await this._secretStorage.store(this.secretKey(ve),t))),p.Data?.OsClient&&!s&&await i.updateSettings({osClient:p.Data.OsClient}),this._isLoggedIn=!0,await xe.executeCommand("setContext",We,!0),await this.writeMcpTokenFile(),o||_.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||_.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${y}`),{ok:!1,msg:y}}}catch(c){let d=c instanceof Error?c.message:String(c);return o||_.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${d}`),{ok:!1,msg:d}}}async refreshAllTokens(){if(this._refreshInProgress)return;this._refreshInProgress=!0;let e=$.getInstance(),n=I.getInstance().getProfiles();try{for(let r of n){let i=e.getTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork);if(!i){await this.reLoginForProfile(r);continue}try{let l=await e.request({method:"GET",path:L.GET_STATUS,apiBaseUrl:r.apiBaseUrl,osClient:r.osClient,osClientType:r.osClientType,osClientNetwork:r.osClientNetwork,allowAuthRetry:!1,silent:!0});if(it(l))continue;if(Et(l)){await e.clearTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork,i),await this.reLoginForProfile(r)||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(i),o=String(s?.ClientType||"").trim(),c=o.toLowerCase()!=="vscode",d=!o||o.toLowerCase()==="empty";if(c&&(await this.reLoginForProfile(r)||!d))continue;let u=String(s?.Did||"").trim(),g=o.toLowerCase()==="vscode"&&u!==e.getDeviceId();if(!(!c&&!g&&!this.shouldRefreshToken(i,s)))try{let l=await e.request({method:"POST",path:L.REFRESH_TOKEN,body:{authorization:i,OsClient:r.osClient,_ClientType:"VSCode"},apiBaseUrl:r.apiBaseUrl,osClient:r.osClient,osClientType:r.osClientType,osClientNetwork:r.osClientNetwork,allowAuthRetry:!1,silent:!0}),p=l._headers?.authorization||"";l.Code===1&&p?await e.setToken(p,r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork):(await e.clearTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork,i),await this.reLoginForProfile(r)||this.showAuthExpiredWarning(l.Msg||"\u5F53\u524D\u767B\u5F55\u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002"))}catch{await this.reLoginForProfile(r)}}}finally{this._isLoggedIn=e.hasToken,await xe.executeCommand("setContext",We,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,_.warn(`Microi: ${t}`))}readJwtClientClaims(e){try{let n=e.replace(/^Bearer\s+/i,"").trim().split(".");if(n.length<2)return null;let r=n[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(r,"base64").toString("utf-8"))}catch{return null}}shouldRefreshToken(e,t){let n=t??this.readJwtClientClaims(e),r=Number(n?.exp);if(!Number.isFinite(r)||r<=0)return!0;let i=Number(n?.MicroiTokenIssuedAt??n?.iat),s=Number.isFinite(i)&&i>0&&r>i?r-i:Hn,o=Math.min(Hn,Math.max(Mr,Math.floor(s/10)));return r-Math.floor(Date.now()/1e3)<=o}async getCredentialsForProfile(e,t){if(!this._secretStorage)return null;let n=this.normalizeApiBaseUrl(e),r=this.normalizeOsClient(t),i=n?await this._secretStorage.get(this.serverSecretKey(Te,n,r)):void 0,s=n?await this._secretStorage.get(this.serverSecretKey(ve,n,r)):void 0;return(!i||!s)&&n&&this.canUseLegacyCredential(n,r)&&(i=i||await this._secretStorage.get(this.legacyServerSecretKey(Te,n)),s=s||await this._secretStorage.get(this.legacyServerSecretKey(ve,n))),(!i||!s)&&!n&&!r&&(i=i||await this._secretStorage.get(this.secretKey(Te)),s=s||await this._secretStorage.get(this.secretKey(ve))),!i||!s?null:{username:i,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()},_r),this._windowStateSubscription=le.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 $.getInstance().clearToken(),this._secretStorage){await this._secretStorage.delete(this.secretKey(Te)),await this._secretStorage.delete(this.secretKey(ve));let t=I.getInstance().getProfiles();for(let n of t)await this._secretStorage.delete(this.serverSecretKey(Te,n.apiBaseUrl,n.osClient)),await this._secretStorage.delete(this.serverSecretKey(ve,n.apiBaseUrl,n.osClient)),await this._secretStorage.delete(this.legacyServerSecretKey(Te,n.apiBaseUrl)),await this._secretStorage.delete(this.legacyServerSecretKey(ve,n.apiBaseUrl))}this._isLoggedIn=!1,await xe.executeCommand("setContext",We,!1),_.info("Microi: \u5DF2\u9000\u51FA\u767B\u5F55")}};var Vr=/^\s*\*?\s*Version\s*:\s*(v\d+\.\d+\.\d+)\s*$/im,Wn=/^v(\d+)\.(\d+)\.(\d+)$/;function It(a){let e=(a||"").trim();if(!e)return null;let t=e.match(Wn);if(t)return`v${Number(t[1])}.${Number(t[2])}.${Number(t[3])}`;let n=e.match(Vr);return n?It(n[1]):null}function Gn(a){if(!a)return null;let e=a.match(Wn);return e?{major:Number(e[1]),minor:Number(e[2]),patch:Number(e[3])}:null}function Or(a,e){return a.major!==e.major?a.major-e.major:a.minor!==e.minor?a.minor-e.minor:a.patch-e.patch}function xr(a){let e=null;for(let t of a){let n=Gn(t);n&&(!e||Or(n,e)>0)&&(e=n)}return e?`v${e.major}.${e.minor}.${e.patch}`:null}function $r(a){let e=Gn(a);if(!e)return"v1.0.0";let{major:t,minor:n,patch:r}=e;return r<9?`v${t}.${n}.${r+1}`:(r=0,n<9?`v${t}.${n+1}.${r}`:(n=0,t+=1,`v${t}.${n}.${r}`))}function Lr(a){let e=(a||"").trim();return e?e.replace(/\r\n/g,`
30
+ `,"utf8"),y=s?this.getTokenForServer(u,s.osClient,s.osClientType,s.osClientNetwork):await this.loadToken(),S=g.protocol==="https:",C=S?bt:kt,w=g.pathname.replace(/\/+$/,""),R={hostname:g.hostname,port:g.port||(S?443:80),path:w+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((E,b)=>{let V=!1,U=O=>{V||(V=!0,b(O))},F=C.request(R,O=>{let A=[];O.on("data",k=>A.push(k)),O.on("end",async()=>{if(V)return;let k=Buffer.concat(A).toString("utf8"),x;try{x=JSON.parse(k)}catch{U(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u54CD\u5E94\u4E0D\u662F JSON\uFF08HTTP ${O.statusCode||0}\uFF09`));return}let j=String(O.headers.authorization||"");j&&await this.setToken(j,u,s?.osClient,s?.osClientType,s?.osClientNetwork),V=!0,E(x)})});F.on("error",O=>U(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u5931\u8D25\uFF1A${rt(O)}`))),F.on("timeout",()=>{F.destroy(),U(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u8D85\u65F6\uFF08${o}ms\uFF09`))}),F.write(h);let P=ze.createReadStream(c);P.on("error",O=>{F.destroy(),U(new Error(`\u8BFB\u53D6\u672C\u5730\u53D1\u5E03\u8D44\u4EA7\u5931\u8D25\uFF1A${rt(O)}`))}),P.on("end",()=>F.end(f)),P.pipe(F,{end:!1})})}};var Je=K(require("crypto")),B=K(require("fs")),st=K(require("path"));var Mr=60*60*1e3,Nr=5*60,Hn=24*60*60,Ar=2*60*1e3,Fr=60*1e3;function Vr(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 pe=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,$.getInstance().setTokenStateChangedHandler(async()=>{await this.writeMcpTokenFile()}),$.getInstance().setAuthRecoveryHandler(async t=>{let n=I.getInstance(),r=this.normalizeApiBaseUrl(t.apiBaseUrl),i=this.normalizeOsClient(t.osClient),s=this.normalizeIdentityPart(t.osClientType),o=this.normalizeIdentityPart(t.osClientNetwork),c=n.getProfiles().filter(g=>this.normalizeApiBaseUrl(g.apiBaseUrl)===r&&this.normalizeOsClient(g.osClient)===i),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 u=await this.reLoginForProfile(d);return u&&(this._isLoggedIn=!0,await xe.executeCommand("setContext",We,!0)),await this.writeMcpTokenFile(),u})}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=$.getInstance(),n=I.getInstance().getProfiles(),r=0;for(let i of n){let s=this.normalizeApiBaseUrl(i.apiBaseUrl),o=this.normalizeOsClient(i.osClient),c=this.mcpRecoveryIdentity(s,o,i.osClientType,i.osClientNetwork),u=n.filter(f=>this.normalizeApiBaseUrl(f.apiBaseUrl)===s&&this.normalizeOsClient(f.osClient)===o).length===1?[[s,o,i.osClientType,i.osClientNetwork].filter(Boolean).join("|"),[s,o,i.osClientType].filter(Boolean).join("|"),o?`${s}|${o}`:s]:[],g=typeof e[c]=="string"&&String(e[c]).trim()?String(e[c]).trim():"",l=u.map(f=>e[f]).find(f=>typeof f=="string"&&f.trim()),m=t.getTokenForServer(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork),p=t.getExactTokenForServer(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork),h=sn(m,g||l,!!g&&!p);!h||p===h||(await t.adoptTokenFromSharedFile(h,i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork),r+=1)}return r}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,r){return[this.normalizeApiBaseUrl(e),this.normalizeOsClient(t),this.normalizeIdentityPart(n),this.normalizeIdentityPart(r)].join("|")}serverSecretKey(e,t,n){return this.secretKey(`${e}.${this.normalizeApiBaseUrl(t)}|${this.normalizeOsClient(n)}`)}legacyServerSecretKey(e,t){return this.secretKey(`${e}.${this.normalizeApiBaseUrl(t)}`)}canUseLegacyCredential(e,t){let n=this.normalizeApiBaseUrl(e),r=this.normalizeOsClient(t);if(!n)return!1;let i=I.getInstance().getProfiles().filter(o=>this.normalizeApiBaseUrl(o.apiBaseUrl)===n);if(i.length===0)return!r;if(i.length===1)return!0;let s=i.filter(o=>this.normalizeOsClient(o.osClient)===r);return!!r&&s.length===i.length}async writeMcpTokenFile(){if(!this._mcpTokenFilePath)return;let e=$.getInstance(),n=I.getInstance().getProfiles(),r={},i=new Set,s=[];for(let p of n){let h=this.normalizeApiBaseUrl(p.apiBaseUrl),f=this.normalizeOsClient(p.osClient),y=this.mcpRecoveryIdentity(h,f,p.osClientType,p.osClientNetwork);i.add(y);let S=n.filter(R=>this.normalizeApiBaseUrl(R.apiBaseUrl)===h&&this.normalizeOsClient(R.osClient)===f),C=f?`${h}|${f}`:h;S.length===1&&i.add(C);let w=e.getTokenForServer(p.apiBaseUrl,p.osClient,p.osClientType,p.osClientNetwork);s.push({profile:p,exactKey:y,legacyKey:S.length===1?C:void 0,currentToken:w,currentExactToken:e.getExactTokenForServer(p.apiBaseUrl,p.osClient,p.osClientType,p.osClientNetwork)}),w&&(r[y]=w,S.length===1&&(r[C]=w))}let o=this._mcpTokenFilePath,c=st.dirname(o);B.existsSync(c)||B.mkdirSync(c,{recursive:!0});let d=`${o}.lock`,u=Date.now()+3e3,g;for(;g===void 0;)try{g=B.openSync(d,"wx",384),B.writeFileSync(g,JSON.stringify({pid:process.pid,createdAt:Date.now()}),"utf-8")}catch(p){if(p.code!=="EEXIST")throw p;try{Date.now()-B.statSync(d).mtimeMs>3e4&&B.unlinkSync(d)}catch{}if(Date.now()>=u)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(h=>setTimeout(h,40))}let l=`${o}.${process.pid}.${Date.now()}.tmp`,m=[];try{let p={};if(B.existsSync(o)){let f=JSON.parse(B.readFileSync(o,"utf-8"));if(!f||typeof f!="object"||Array.isArray(f))throw new Error(`Microi MCP Token \u6587\u4EF6\u5FC5\u987B\u662F JSON \u5BF9\u8C61\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1A${o}`);p=Object.fromEntries(Object.entries(f).filter(y=>typeof y[1]=="string"&&!!y[1]))}for(let f of s){let y=p[f.exactKey]||"",S=f.legacyKey&&p[f.legacyKey]||"",C=sn(f.currentToken,y||S,!!y&&!f.currentExactToken);C&&(r[f.exactKey]=C,f.legacyKey&&(r[f.legacyKey]=C),C!==f.currentExactToken&&m.push({profile:f.profile,token:C}))}for(let f of i)delete p[f];let h={...p,...r};B.writeFileSync(l,`${JSON.stringify(h,null,2)}
31
+ `,{encoding:"utf-8",mode:384}),B.renameSync(l,o)}finally{try{B.existsSync(l)&&B.unlinkSync(l)}catch{}try{B.closeSync(g)}catch{}try{B.unlinkSync(d)}catch{}}for(let p of m)await e.adoptTokenFromSharedFile(p.token,p.profile.apiBaseUrl,p.profile.osClient,p.profile.osClientType,p.profile.osClientNetwork)}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 r=[];try{r=B.readdirSync(n).filter(i=>i.endsWith(".json")).slice(0,200)}catch{return}for(let i of r){let s=st.join(n,i);try{let o=JSON.parse(B.readFileSync(s,"utf-8")),c=this.normalizeApiBaseUrl(String(o.apiBaseUrl||"")),d=this.normalizeOsClient(String(o.osClient||"")),u=this.normalizeIdentityPart(String(o.osClientType||"")),g=this.normalizeIdentityPart(String(o.osClientNetwork||"")),l=this.mcpRecoveryIdentity(c,d,u,g);if(!u&&!g){let m=t.filter(p=>this.normalizeApiBaseUrl(p.apiBaseUrl)===c&&this.normalizeOsClient(p.osClient)===d);m.length===1&&(l=this.mcpRecoveryIdentity(m[0].apiBaseUrl,m[0].osClient,m[0].osClientType,m[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 r=I.getInstance().getProfiles(),i=$.getInstance();for(let s of t){let o=st.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),u=this.normalizeApiBaseUrl(String(c.apiBaseUrl||"")),g=this.normalizeOsClient(String(c.osClient||"")),l=this.normalizeIdentityPart(String(c.osClientType||"")),m=this.normalizeIdentityPart(String(c.osClientNetwork||"")),p=String(c.failedTokenHash||"").trim().toLowerCase();if(Number(c.version)!==1||!u||!d||Math.abs(Date.now()-d)>Ar||!jn(p)){try{B.unlinkSync(o)}catch{}continue}let h=r.filter(S=>this.normalizeApiBaseUrl(S.apiBaseUrl)===u&&this.normalizeOsClient(S.osClient)===g),f=l||m?h.find(S=>this.normalizeIdentityPart(S.osClientType)===l&&this.normalizeIdentityPart(S.osClientNetwork)===m):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,r);continue}this._mcpAuthRecoveryInProgress.add(y);try{let S=i.getTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork);S&&this.tokenFingerprint(S)!==p?(this._mcpAuthRecoveryFailureUntil.delete(y),await this.writeMcpTokenFile()):(S&&await i.clearTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork,S),await this.reLoginForProfile(f)?this._mcpAuthRecoveryFailureUntil.delete(y):(this._mcpAuthRecoveryFailureUntil.set(y,Date.now()+Fr),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,r)}}}}finally{this._mcpAuthRecoveryPassInProgress=!1}}}startMcpAuthRecoveryWatcher(){this._mcpAuthRecoveryTimer||!this._mcpAuthRecoveryDirPath||(this._mcpAuthRecoveryTimer=setInterval(()=>{this.processMcpAuthRecoveryRequests()},1e3),this.processMcpAuthRecoveryRequests())}stopMcpAuthRecoveryWatcher(){this._mcpAuthRecoveryTimer&&(clearInterval(this._mcpAuthRecoveryTimer),this._mcpAuthRecoveryTimer=void 0)}async tryAutoLogin(){let e=$.getInstance(),n=I.getInstance().getProfiles(),r=!1,i=await e.loadToken(),s=await this.loadMcpTokenFile();r=!!i||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)&&(r=!0)}},u=Math.min(4,o.length);return await Promise.all(Array.from({length:u},()=>d())),r&&(this._isLoggedIn=!0,await xe.executeCommand("setContext",We,!0),await this.writeMcpTokenFile()),r}async getSysConfig(e,t,n,r=!1){let i=$.getInstance(),s=I.getInstance();try{let o=await i.request({method:"POST",path:L.GET_SYS_CONFIG,body:{_SearchEqual:{IsEnable:1},OsClient:t||s.getOsClient()||void 0},apiBaseUrl:e,osClient:t,allowAuthRetry:!1,silent:r});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=$.getInstance(),r=I.getInstance();try{let i=await n.getRaw(L.GET_CAPTCHA,{OsClient:t||r.getOsClient()||""},e);if(i.data&&i.captchaId){let s=i.data.toString("base64");return{captchaId:i.captchaId,imageBase64:`data:image/png;base64,${s}`}}}catch{}return null}async login(e,t,n={}){let r=$.getInstance(),i=I.getInstance(),s=n.osClient||i.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||_.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${y}`),{ok:!1,msg:y}}let g=typeof c?.LoginRsaPublicKey=="string"&&c.LoginRsaPublicKey.trim()?c.LoginRsaPublicKey:In,l=Vr(t,g),m={Account:e,Pwd:l,OsClient:s||void 0,_ClientType:"VSCode"};n.captchaId&&n.captchaValue&&(m._CaptchaId=n.captchaId,m._CaptchaValue=n.captchaValue);let p=await r.request({method:"POST",path:L.LOGIN,body:m,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 r.setToken(f,n.apiBaseUrl,n.osClient,n.osClientType,n.osClientNetwork),this._secretStorage&&(n.apiBaseUrl?(await this._secretStorage.store(this.serverSecretKey(Te,n.apiBaseUrl,s),e),await this._secretStorage.store(this.serverSecretKey(ve,n.apiBaseUrl,s),t)):(await this._secretStorage.store(this.secretKey(Te),e),await this._secretStorage.store(this.secretKey(ve),t))),p.Data?.OsClient&&!s&&await i.updateSettings({osClient:p.Data.OsClient}),this._isLoggedIn=!0,await xe.executeCommand("setContext",We,!0),await this.writeMcpTokenFile(),o||_.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||_.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${y}`),{ok:!1,msg:y}}}catch(c){let d=c instanceof Error?c.message:String(c);return o||_.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${d}`),{ok:!1,msg:d}}}async refreshAllTokens(){if(this._refreshInProgress)return;this._refreshInProgress=!0;let e=$.getInstance(),n=I.getInstance().getProfiles();try{for(let r of n){let i=e.getTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork);if(!i){await this.reLoginForProfile(r);continue}try{let l=await e.request({method:"GET",path:L.GET_STATUS,apiBaseUrl:r.apiBaseUrl,osClient:r.osClient,osClientType:r.osClientType,osClientNetwork:r.osClientNetwork,allowAuthRetry:!1,silent:!0});if(it(l))continue;if(wt(l)){await e.clearTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork,i),await this.reLoginForProfile(r)||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(i),o=String(s?.ClientType||"").trim(),c=o.toLowerCase()!=="vscode",d=!o||o.toLowerCase()==="empty";if(c&&(await this.reLoginForProfile(r)||!d))continue;let u=String(s?.Did||"").trim(),g=o.toLowerCase()==="vscode"&&u!==e.getDeviceId();if(!(!c&&!g&&!this.shouldRefreshToken(i,s)))try{let l=await e.request({method:"POST",path:L.REFRESH_TOKEN,body:{authorization:i,OsClient:r.osClient,_ClientType:"VSCode"},apiBaseUrl:r.apiBaseUrl,osClient:r.osClient,osClientType:r.osClientType,osClientNetwork:r.osClientNetwork,allowAuthRetry:!1,silent:!0}),p=l._headers?.authorization||"";l.Code===1&&p?await e.setToken(p,r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork):(await e.clearTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork,i),await this.reLoginForProfile(r)||this.showAuthExpiredWarning(l.Msg||"\u5F53\u524D\u767B\u5F55\u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002"))}catch{await this.reLoginForProfile(r)}}}finally{this._isLoggedIn=e.hasToken,await xe.executeCommand("setContext",We,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,_.warn(`Microi: ${t}`))}readJwtClientClaims(e){try{let n=e.replace(/^Bearer\s+/i,"").trim().split(".");if(n.length<2)return null;let r=n[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(r,"base64").toString("utf-8"))}catch{return null}}shouldRefreshToken(e,t){let n=t??this.readJwtClientClaims(e),r=Number(n?.exp);if(!Number.isFinite(r)||r<=0)return!0;let i=Number(n?.MicroiTokenIssuedAt??n?.iat),s=Number.isFinite(i)&&i>0&&r>i?r-i:Hn,o=Math.min(Hn,Math.max(Nr,Math.floor(s/10)));return r-Math.floor(Date.now()/1e3)<=o}async getCredentialsForProfile(e,t){if(!this._secretStorage)return null;let n=this.normalizeApiBaseUrl(e),r=this.normalizeOsClient(t),i=n?await this._secretStorage.get(this.serverSecretKey(Te,n,r)):void 0,s=n?await this._secretStorage.get(this.serverSecretKey(ve,n,r)):void 0;return(!i||!s)&&n&&this.canUseLegacyCredential(n,r)&&(i=i||await this._secretStorage.get(this.legacyServerSecretKey(Te,n)),s=s||await this._secretStorage.get(this.legacyServerSecretKey(ve,n))),(!i||!s)&&!n&&!r&&(i=i||await this._secretStorage.get(this.secretKey(Te)),s=s||await this._secretStorage.get(this.secretKey(ve))),!i||!s?null:{username:i,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()},Mr),this._windowStateSubscription=le.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 $.getInstance().clearToken(),this._secretStorage){await this._secretStorage.delete(this.secretKey(Te)),await this._secretStorage.delete(this.secretKey(ve));let t=I.getInstance().getProfiles();for(let n of t)await this._secretStorage.delete(this.serverSecretKey(Te,n.apiBaseUrl,n.osClient)),await this._secretStorage.delete(this.serverSecretKey(ve,n.apiBaseUrl,n.osClient)),await this._secretStorage.delete(this.legacyServerSecretKey(Te,n.apiBaseUrl)),await this._secretStorage.delete(this.legacyServerSecretKey(ve,n.apiBaseUrl))}this._isLoggedIn=!1,await xe.executeCommand("setContext",We,!1),_.info("Microi: \u5DF2\u9000\u51FA\u767B\u5F55")}};var Or=/^\s*\*?\s*Version\s*:\s*(v\d+\.\d+\.\d+)\s*$/im,Wn=/^v(\d+)\.(\d+)\.(\d+)$/;function It(a){let e=(a||"").trim();if(!e)return null;let t=e.match(Wn);if(t)return`v${Number(t[1])}.${Number(t[2])}.${Number(t[3])}`;let n=e.match(Or);return n?It(n[1]):null}function Gn(a){if(!a)return null;let e=a.match(Wn);return e?{major:Number(e[1]),minor:Number(e[2]),patch:Number(e[3])}:null}function xr(a,e){return a.major!==e.major?a.major-e.major:a.minor!==e.minor?a.minor-e.minor:a.patch-e.patch}function $r(a){let e=null;for(let t of a){let n=Gn(t);n&&(!e||xr(n,e)>0)&&(e=n)}return e?`v${e.major}.${e.minor}.${e.patch}`:null}function Lr(a){let e=Gn(a);if(!e)return"v1.0.0";let{major:t,minor:n,patch:r}=e;return r<9?`v${t}.${n}.${r+1}`:(r=0,n<9?`v${t}.${n+1}.${r}`:(n=0,t+=1,`v${t}.${n}.${r}`))}function Br(a){let e=(a||"").trim();return e?e.replace(/\r\n/g,`
32
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 Br(a){let e=a.replace(/\r\n/g,`
33
+ `).map(t=>t.trim()).filter(Boolean):["\u8BF7\u8865\u5145\u8BE5 V8 \u4EE3\u7801\u7684\u5B8C\u6574\u529F\u80FD\u8BF4\u660E\u3002"]}function Ur(a){let e=a.replace(/\r\n/g,`
34
34
  `).split(`
35
35
  `),t=[],n=!1;for(let r of e){let i=r.replace(/^\s*\/\*+\s?/,"").replace(/^\s*\*\/?\s?/,"").trim();if(/^(Function|功能说明)\s*[::]/i.test(i)){n=!0;let s=i.replace(/^(Function|功能说明)\s*[::]\s*/i,"").trim();s&&t.push(s.replace(/^[-*]\s*/,""));continue}if(/^(ChangeLog|修改记录|LastModified|Version|ApiEngineKey|TableKey|WorkflowKey|EventType)\s*[::]/i.test(i)){if(n)break;continue}n&&i&&i!=="*/"&&t.push(i.replace(/^[-*]\s*/,""))}return t.length?t.join(`
36
- `):void 0}function Ur(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 jr(a,e,t){let n=a.functionDescription||Br(t||""),r=Lr(n),i=a.kind==="ApiEngine"?"V8 ApiEngine":a.kind==="V8Event"?"V8 Event":"V8 Workflow",s=a.kind==="ApiEngine"?"ApiEngineKey":a.kind==="V8Event"?"TableKey":"WorkflowKey",o=["/*",` * ${i}`,` * ${s}: ${a.key}`];a.eventType&&o.push(` * EventType: ${a.eventType}`),o.push(` * Version: ${e}`),o.push(" * Function:");for(let c of r)o.push(` * - ${c}`);return o.push(" */"),`${o.join(`
36
+ `):void 0}function jr(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 Kr(a,e,t){let n=a.functionDescription||Ur(t||""),r=Br(n),i=a.kind==="ApiEngine"?"V8 ApiEngine":a.kind==="V8Event"?"V8 Event":"V8 Workflow",s=a.kind==="ApiEngine"?"ApiEngineKey":a.kind==="V8Event"?"TableKey":"WorkflowKey",o=["/*",` * ${i}`,` * ${s}: ${a.key}`];a.eventType&&o.push(` * EventType: ${a.eventType}`),o.push(` * Version: ${e}`),o.push(" * Function:");for(let c of r)o.push(` * - ${c}`);return o.push(" */"),`${o.join(`
37
37
  `)}
38
38
 
39
- `}function ot(a){let e=It(a.currentCode),t=It(a.remoteCode),n=It(a.remoteVersion),r=xr([e,t,n]),i=a.initial?r||"v1.0.0":$r(r),{header:s,body:o}=Ur(a.currentCode||""),c=`${jr(a,i,s)}${o.replace(/^\s+/,"")}`,d=(a.changeSummary||"\u540C\u6B65 V8 \u4EE3\u7801").trim();return{code:c,version:i,changeHistory:`${i} ${d}`}}var qe=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 r=v.join(n,e,Be);if(!T.existsSync(r))return this.migrateFromFlatMeta(e);try{let i=JSON.parse(T.readFileSync(r,"utf-8"));if(!i||typeof i!="object"||Array.isArray(i))throw new Error("\u9876\u5C42\u5FC5\u987B\u662F JSON \u5BF9\u8C61");let s=i;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(i){throw new Error(`Microi \u540C\u6B65\u5143\u6570\u636E\u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u5E76\u505C\u6B62\u5199\u5165\uFF1A${r}\uFF08${i instanceof Error?i.message:String(i)}\uFF09`)}}saveMeta(e,t){let n=I.getInstance();try{let r=n.getSyncRootDir();this.ensureSyncGitExcludes(r);let i=v.join(r,t);re(i);let s=v.join(i,Be),o=`${s}.${process.pid}.${Date.now()}.tmp`;try{T.writeFileSync(o,`${JSON.stringify(e,null,2)}
40
- `,"utf-8"),T.renameSync(o,s)}finally{try{T.existsSync(o)&&T.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 we(nn(e||"")).replace(/\r\n/g,`
41
- `).trimEnd()}isLocalModified(e,t){try{if(!T.existsSync(e))return!1;let n=T.statSync(e),r=new Date(t);return isNaN(r.getTime())?!1:n.mtime.getTime()>r.getTime()+1e3}catch{return!1}}getLocalModifiedTime(e,t){try{if(!T.existsSync(e))return null;let n=T.statSync(e),r=new Date(t);return isNaN(r.getTime())?null:n.mtime.getTime()>r.getTime()+1e3?fe(n.mtime):null}catch{return null}}touchSyncedFile(e,t){let n=new Date(t),r=isNaN(n.getTime())?new Date:n;try{T.utimesSync(e,r,r)}catch{}}ensureSyncGitExcludes(e){try{let t=e||I.getInstance().getSyncRootDir();Ge(t),ke(t,[".backups/","**/.backups/",".microi-mcp-tokens.json","**/.microi-mcp-tokens.json"])}catch{}}shortBackupKey(e){return require("crypto").createHash("sha1").update(e||"").digest("hex").slice(0,10)}getMenuButtonMetaKey(e,t,n,r){return`${e}__${t}__${n}__${r}`}getMenuScriptMetaKey(e,t){return`${e}__${t}`}sourceHash(e){return require("crypto").createHash("sha256").update(this.normalizeCode(e||"")).digest("hex")}extractTrailingKey(e){let t=e.match(/[((]([^))]+)[))]\s*$/);return t?t[1]:e}getServerDirs(){try{let e=I.getInstance().getSyncRootDir();return T.existsSync(e)?T.readdirSync(e,{withFileTypes:!0}).filter(t=>t.isDirectory()).filter(t=>!t.name.startsWith(".")).map(t=>t.name):[]}catch{return[]}}getLocalChangeSummary(){let e={engines:0,events:0,fields:0,menuButtons:0,menuScripts:0,workflowNodeEvents:0,total:0};for(let t of this.getLocalChangeItems())t.kind==="engine"?e.engines+=1:t.kind==="event"?e.events+=1:t.kind==="field"?e.fields+=1:t.kind==="menuButton"?e.menuButtons+=1:t.kind==="menuScript"?e.menuScripts+=1:t.kind==="workflow"&&(e.workflowNodeEvents+=1);return e.total=e.engines+e.events+e.fields+e.menuButtons+e.menuScripts+e.workflowNodeEvents,e}getLocalChangeItems(){let e=[],t=(n,r,i,s,o)=>{let c=this.getWorkspaceFilePath(o.filePath);if(!c)return;let d=this.getLocalModifiedTime(c,o.updateTime);d&&e.push({kind:r,key:i,name:s,serverDir:n,filePath:c,updateTime:o.updateTime,modifiedTime:d})};for(let n of this.getServerDirs()){let r=this.loadMeta(n);for(let[i,s]of Object.entries(r.engines))t(n,"engine",i,s.apiName||i,s);for(let[i,s]of Object.entries(r.events))t(n,"event",i,`${s.description||s.formEngineKey}/${s.eventType}`,s);for(let[i,s]of Object.entries(r.fields||{}))t(n,"field",i,`${s.tableName}.${s.fieldName}/${s.v8Key}`,s);for(let[i,s]of Object.entries(r.menuButtons||{}))t(n,"menuButton",i,`${s.moduleName}/${s.btnName}/${s.v8SubField}`,s);for(let[i,s]of Object.entries(r.menuScripts||{}))t(n,"menuScript",i,`${s.moduleName}/${s.scriptField}`,s);for(let[i,s]of Object.entries(r.workflowNodeEvents||{}))t(n,"workflow",i,`${s.flowName}/${s.nodeName}/${s.eventType}`,s)}return e}async checkRemoteDifferences(e,t="all",n){let r=e?[e]:I.getInstance().getProfiles(),i=[];for(let s of r){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,i,n),(t==="all"||t==="form")&&(!n||d==="event")&&await this.collectEventDifferences(s,o,c,i,n),(t==="all"||t==="form")&&(!n||d==="field")&&await this.collectFieldDifferences(s,o,c,i,n),(t==="all"||t==="module")&&(!n||d==="menuButton")&&await this.collectMenuButtonDifferences(s,o,c,i,n),(t==="all"||t==="module")&&(!n||d==="menuScript")&&await this.collectMenuScriptDifferences(s,o,c,i,n),(t==="all"||t==="workflow")&&(!n||d==="workflow")&&await this.collectWorkflowDifferences(s,o,c,i,n)}return i}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[r,i]of n)if(Object.values(i).some(s=>this.matchesTargetFile(s.filePath,t)))return r;return null}classifyDifference(e,t,n,r){return n===r?null:e&&t?"conflict":e?"localModified":"remoteModified"}classifyRemoteDeletion(e,t){return this.isLocalModified(e,t)?"conflict":"remoteDeleted"}createRemoteDeletedItem(e,t,n,r,i,s){return!i||!T.existsSync(i)?null:{kind:e,status:this.classifyRemoteDeletion(i,s),name:t,key:n,serverDir:r,filePath:i,localCode:this.normalizeCode(T.readFileSync(i,"utf-8")),remoteCode:"",localUpdateTime:s,remoteUpdateTime:""}}isRemoteNewer(e,t){let n=new Date(e||"").getTime(),r=new Date(t||"").getTime();return isNaN(n)||isNaN(r)?!1:n>r+1e3}getRemoteOnlyPlaceholderPath(e,t,n,r){let i=I.getInstance(),s=n==="api"?Ue:n==="form"?be:n==="module"?_e:je;return v.join(i.getSyncRootDir(),t,i.buildOsClientDirName(e.osClient,e.osClientType,e.osClientNetwork),s,"\u670D\u52A1\u5668\u65B0\u589E\u5F85\u62C9\u53D6",`${H(r)}.js`)}async collectEngineDifferences(e,t,n,r,i){let o=await $.getInstance().get(L.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,i))continue;let m=c.get(g),p=this.getWorkspaceFilePath(l.filePath);if(!p||!T.existsSync(p))continue;if(!m){let E=this.createRemoteDeletedItem("engine",l.apiName||g,g,t,p,l.updateTime);E&&r.push(E);continue}let h=this.normalizeCode(T.readFileSync(p,"utf-8")),f=this.normalizeCode(m.ApiV8Code||""),y=this.isLocalModified(p,l.updateTime),S=this.isRemoteNewer(m.UpdateTime,l.updateTime);if(h===f){(y||S)&&m.UpdateTime&&(l.updateTime=m.UpdateTime,this.touchSyncedFile(p,m.UpdateTime),d=!0);continue}let C=this.classifyDifference(y,S,h,f);C&&r.push({kind:"engine",status:C,name:m.ApiName||l.apiName||g,key:g,serverDir:t,filePath:p,localCode:h,remoteCode:f,localUpdateTime:l.updateTime,remoteUpdateTime:m.UpdateTime})}if(d&&this.saveMeta(n,t),i)return;let u=new Set(Object.keys(n.engines).map(g=>g.toLowerCase()));for(let g of o.Data.List)!String(g.ApiV8Code||"").trim()||u.has(g.ApiEngineKey.toLowerCase())||r.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,r,i){let o=await $.getInstance().get(L.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,i))continue;let m=c.get(g)||c.get(g.toLowerCase()),p=this.getWorkspaceFilePath(l.filePath);if(!p||!T.existsSync(p))continue;if(!m){let E=this.createRemoteDeletedItem("event",`${l.description||l.formEngineKey}/${l.eventType}`,g,t,p,l.updateTime);E&&r.push(E);continue}let h=this.normalizeCode(T.readFileSync(p,"utf-8")),f=this.normalizeCode(m.V8Code||""),y=this.isLocalModified(p,l.updateTime),S=this.isRemoteNewer(m.UpdateTime,l.updateTime);if(h===f){(y||S)&&m.UpdateTime&&(l.updateTime=m.UpdateTime,this.touchSyncedFile(p,m.UpdateTime),d=!0);continue}let C=this.classifyDifference(y,S,h,f);C&&r.push({kind:"event",status:C,name:`${m.Description||l.formEngineKey}/${l.eventType}`,key:g,serverDir:t,filePath:p,localCode:h,remoteCode:f,localUpdateTime:l.updateTime,remoteUpdateTime:m.UpdateTime})}if(d&&this.saveMeta(n,t),i)return;let u=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()||u.has(l.toLowerCase())||r.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,r,i){let s=$.getInstance(),o=new Map;for(let d of Object.entries(n.fields||{})){if(!this.matchesTargetFile(d[1].filePath,i))continue;let u=o.get(d[1].tableId||d[1].tableName)||[];u.push(d),o.set(d[1].tableId||d[1].tableName,u)}let c=!1;await this.runInBatches([...o.values()],i?1:2,async d=>{let u=d[0][1],g=await s.get(L.GET_FIELD_LIST,{osClient:e.osClient,tableId:u.tableId,tableName:u.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[${u.tableName}]: ${g.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let l=new Map(g.Data.List.map(m=>[String(m.Name||"").toLowerCase(),m]));for(let[m,p]of d){let h=l.get(p.fieldName.toLowerCase()),f=this.getWorkspaceFilePath(p.filePath);if(!f||!T.existsSync(f))continue;if(!h||!String(h[p.v8Key]||"").trim()){let b=this.createRemoteDeletedItem("field",`${p.tableName}.${p.fieldName}/${p.v8Key}`,m,t,f,p.updateTime);b&&r.push(b);continue}let y=this.normalizeCode(T.readFileSync(f,"utf-8")),S=this.normalizeCode(String(h[p.v8Key]||"")),C=String(h.UpdateTime||""),E=this.isLocalModified(f,p.updateTime),R=this.isRemoteNewer(C,p.updateTime);if(y===S){(E||R)&&C&&(p.updateTime=C,this.touchSyncedFile(f,C),c=!0);continue}let w=this.classifyDifference(E,R,y,S);w&&r.push({kind:"field",status:w,name:`${p.tableName}.${p.fieldName}/${p.v8Key}`,key:m,serverDir:t,filePath:f,localCode:y,remoteCode:S,localUpdateTime:p.updateTime,remoteUpdateTime:C})}}),c&&this.saveMeta(n,t)}async collectMenuButtonDifferences(e,t,n,r,i){let s=$.getInstance(),o=new Map;if(!i)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,i))continue;let m=o.get(l[1].moduleId)||[];m.push(l),o.set(l[1].moduleId,m)}let c=[];if(!i){let l=await s.get(L.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)),u=new Map(c.map(l=>[l.Id,l]));for(let l of c){if(d.has(l.Id)||n.menus?.[l.Id])continue;let m=l.Label||l.Name||l.Id;r.push({kind:"menuButton",status:"remoteModified",name:`${m}/\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()],i?1:2,async([l,m])=>{let p=()=>{for(let[R,w]of m){let b=this.getWorkspaceFilePath(w.filePath);if(!b)continue;let V=this.createRemoteDeletedItem("menuButton",`${w.moduleName}/${w.btnName}/${w.v8SubField}`,R,t,b,w.updateTime);V&&r.push(V)}};if(!i&&!u.has(l)){p();return}let h=await s.get(L.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 R of Object.keys(Ke)){let w=[];try{let b=f[R];w=typeof b=="string"?JSON.parse(b):Array.isArray(b)?b:[],Array.isArray(w)||(w=[])}catch{w=[]}S.set(R,new Map(w.map(b=>[String(b.Id||""),b])))}for(let[R,w]of m){let b=S.get(w.btnField)?.get(w.btnId),V=this.getWorkspaceFilePath(w.filePath);if(!V||!T.existsSync(V))continue;if(!b||!String(b[w.v8SubField]||"").trim()){let k=this.createRemoteDeletedItem("menuButton",`${w.moduleName}/${w.btnName}/${w.v8SubField}`,R,t,V,w.updateTime);k&&r.push(k);continue}let U=this.normalizeCode(T.readFileSync(V,"utf-8")),F=this.normalizeCode(String(b[w.v8SubField]||"")),P=this.isLocalModified(V,w.updateTime),O=this.isRemoteNewer(y,w.updateTime);if(U===F){(P||O)&&y&&(w.updateTime=y,this.touchSyncedFile(V,y),g=!0);continue}let A=this.classifyDifference(P,O,U,F);A&&r.push({kind:"menuButton",status:A,name:`${w.moduleName}/${w.btnName}/${w.v8SubField}`,key:R,serverDir:t,filePath:V,localCode:U,remoteCode:F,localUpdateTime:w.updateTime,remoteUpdateTime:y})}if(i)return;let C=new Set(m.map(([R])=>R)),E=n.menus?.[l]?.moduleName||u.get(l)?.Label||u.get(l)?.Name||l;for(let[R,w]of S)for(let[b,V]of w){if(!b)continue;let U=String(V.Name||b);for(let F of["V8Code","V8CodeShow"]){let P=String(V[F]||""),O=this.getMenuButtonMetaKey(l,R,b,F);!P.trim()||C.has(O)||r.push({kind:"menuButton",status:"remoteModified",name:`${E}/${U}/${F}`,key:O,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"module",O),localCode:"",remoteCode:this.normalizeCode(P),localUpdateTime:"",remoteUpdateTime:y})}}}),g&&this.saveMeta(n,t)}async collectMenuScriptDifferences(e,t,n,r,i){let s=$.getInstance(),o=Object.entries(n.menuScripts||{}).filter(([,d])=>this.matchesTargetFile(d.filePath,i)),c=!1;await this.runInBatches(o,i?1:2,async([d,u])=>{let g=this.getWorkspaceFilePath(u.filePath);if(!g||!T.existsSync(g))return;let l=await s.get(L.GET_MODULE,{osClient:e.osClient,moduleId:u.moduleId},e.apiBaseUrl,e);if(l.Code!==1||!l.Data){if(/不存在|not\s*found/i.test(String(l.Msg||""))){let E=this.createRemoteDeletedItem("menuScript",`${u.moduleName}/${u.scriptField}`,d,t,g,u.updateTime);E&&r.push(E);return}throw new Error(`\u83B7\u53D6\u6A21\u5757 Join/Where \u540C\u6B65\u72B6\u6001\u5931\u8D25[${u.moduleId}]: ${l.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`)}let m=l.Data,p=this.normalizeCode(String(m[u.scriptField]||"")),h=this.normalizeCode(T.readFileSync(g,"utf-8")),f=String(m.UpdateTime||""),y=this.isLocalModified(g,u.updateTime),S=this.sourceHash(p)!==u.codeHash;if(h===p){(y||S||f&&f!==u.updateTime)&&(u.codeHash=this.sourceHash(p),u.updateTime=f||u.updateTime,this.touchSyncedFile(g,u.updateTime),c=!0);return}let C=this.classifyDifference(y,S,h,p);C&&r.push({kind:"menuScript",status:C,name:`${u.moduleName}/${u.scriptField}`,key:d,serverDir:t,filePath:g,localCode:h,remoteCode:p,localUpdateTime:u.updateTime,remoteUpdateTime:f})}),c&&this.saveMeta(n,t)}async runInBatches(e,t,n){for(let r=0;r<e.length;r+=t)await Promise.all(e.slice(r,r+t).map(i=>n(i))),r+t<e.length&&await new Promise(i=>setTimeout(i,120))}async collectWorkflowDifferences(e,t,n,r,i){let o=await $.getInstance().get(L.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,i))continue;let m=c.get(g),p=this.getWorkspaceFilePath(l.filePath);if(!p||!T.existsSync(p))continue;if(!m||!String(m.V8Code||m.Code||"").trim()){let E=this.createRemoteDeletedItem("workflow",`${l.flowName}/${l.nodeName}/${l.eventType}`,g,t,p,l.updateTime);E&&r.push(E);continue}let h=this.normalizeCode(T.readFileSync(p,"utf-8")),f=this.normalizeCode(m.V8Code||m.Code||""),y=this.isLocalModified(p,l.updateTime),S=this.isRemoteNewer(m.UpdateTime,l.updateTime);if(h===f){(y||S)&&m.UpdateTime&&(l.updateTime=m.UpdateTime,this.touchSyncedFile(p,m.UpdateTime),d=!0);continue}let C=this.classifyDifference(y,S,h,f);if(C){let E=`${m.FlowName||l.flowName}/${m.NodeName||l.nodeName}/${m.EventType||l.eventType}`;r.push({kind:"workflow",status:C,name:E,key:g,serverDir:t,filePath:p,localCode:h,remoteCode:f,localUpdateTime:l.updateTime,remoteUpdateTime:m.UpdateTime})}}if(d&&this.saveMeta(n,t),i)return;let u=new Set(Object.keys(n.workflowNodeEvents||{}));for(let g of o.Data.List){let l=`${g.FlowDesignId}__${g.NodeId}__${g.EventType}`,m=g.V8Code||g.Code||"";if(!m.trim()||u.has(l))continue;let p=`${g.FlowName||g.FlowDesignId}/${g.NodeName||g.NodeId}/${g.EventType}`;r.push({kind:"workflow",status:"remoteModified",name:p,key:l,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"workflow",l),localCode:"",remoteCode:this.normalizeCode(m),localUpdateTime:"",remoteUpdateTime:g.UpdateTime})}}migrateFromFlatMeta(e){let t=I.getInstance();try{let n=t.getSyncRootDir(),r=v.join(n,Be);if(!T.existsSync(r))return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};let i=t.getWorkspaceRoot();if(!i)return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};let s=JSON.parse(T.readFileSync(r,"utf-8")),o=s.engines||{},c=s.events||{},d={engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};for(let[u,g]of Object.entries(o)){let l=g;if(l.filePath){let m=v.join(i,l.filePath);v.relative(n,m).split(v.sep)[0]===e&&(d.engines[u]=l)}}for(let[u,g]of Object.entries(c)){let l=g;if(l.filePath){let m=v.join(i,l.filePath);v.relative(n,m).split(v.sep)[0]===e&&(d.events[u]=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){_.warn("Microi: \u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u670D\u52A1\u5668\uFF0C\u8BF7\u5148\u5728\u8BBE\u7F6E\u4E2D\u6DFB\u52A0\u8FDE\u63A5\u5E76\u767B\u5F55");return}for(let n of t)try{await this.pullEnginesForProfile(n)}catch(r){let i=r instanceof Error?r.message:String(r);this.log(`\u62C9\u53D6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${i}`),_.error(`Microi: \u62C9\u53D6 [${n.label||n.apiBaseUrl}] \u5931\u8D25 - ${i}`)}return}await this.pullEnginesForProfile(e)}async pullEnginesForProfile(e){let t=I.getInstance(),n=$.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE\u4EE3\u7801 [${e.label||r}]...`),await le.withProgress({location:$e.Notification,title:`Microi: \u62C9\u53D6\u63A5\u53E3\u5F15\u64CE [${e.label||r}]`,cancellable:!1},async s=>{s.report({message:"\u68C0\u67E5\u540E\u7AEF\u72B6\u6001..."});let o=await n.get(L.GET_STATUS,void 0,r,e);if(o.Code!==1){let A=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}${A}`)}s.report({message:"\u83B7\u53D6\u7CFB\u7EDF\u914D\u7F6E..."});let d=await pe.getInstance().getSysConfig(r,i),u=d?.SysShortTitle||"",g=d?.SysTitle||"",l=u||g||d?.CompanyName||e.label||"";l&&(l!==e.label||u!==e.sysShortTitle||g!==e.sysTitle)&&await t.addProfile({...e,label:l,sysShortTitle:u,sysTitle:g}),s.report({message:"\u83B7\u53D6\u63A5\u53E3\u5F15\u64CE\u5217\u8868..."});let m=await n.get(L.GET_ENGINE_LIST,{osClient:i},r,e);if(m.Code!==1){let A=m.Code===1001||m.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u5217\u8868\u5931\u8D25: ${m.Msg||"Code="+m.Code}${A}`)}let{OsClient:p,OsClientType:h,OsClientNetwork:f,List:y,Total:S}=m.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 A={...e,osClientType:h,osClientNetwork:f};await t.addProfile(A)}let C=t.getSyncRootDir(),E=t.buildServerDirName(l,r),R=this.loadMeta(E),w=0,b=0,V=[],U=new Set,F=new Set,P=t.buildOsClientDirName(p,h,f);for(let A of y)try{let k=H(A.Category||"\u672A\u5206\u7C7B"),x=H(A.ApiName||A.ApiEngineKey),j=v.join(C,E,P,Ue,k),G=H(`${x}(${tn(A.ApiEngineKey)}).js`),ne=v.join(j,G),oe=nn(A.ApiV8Code||"");if(!oe.trim()){b++,T.existsSync(ne)&&this.backupAndDeleteSyncFile(ne,E,"remote-deleted-api"),delete R.engines[A.ApiEngineKey];continue}U.add(A.ApiEngineKey),re(j),T.writeFileSync(ne,oe,"utf-8");let q=new Date(A.UpdateTime);isNaN(q.getTime())||T.utimesSync(ne,q,q),R.engines[A.ApiEngineKey]={id:A.Id,apiName:A.ApiName,category:k,apiAddress:A.ApiAddress,updateTime:A.UpdateTime,filePath:v.relative(t.getWorkspaceRoot(),ne)},w++,s.report({message:`${w}/${S} ${A.ApiEngineKey}`,increment:1/S*100})}catch(k){let x=k instanceof Error?k.message:String(k);F.add(A.ApiEngineKey),V.push(`${A.ApiEngineKey}: ${x}`),this.log(`\u63A5\u53E3\u5F15\u64CE\u6587\u4EF6\u5199\u5165\u5931\u8D25\uFF0C\u7EE7\u7EED\u4E0B\u4E00\u9879 [${A.ApiEngineKey}]: ${x}`)}for(let[A,k]of Object.entries(R.engines)){if(U.has(A)||F.has(A))continue;let x=this.getWorkspaceFilePath(k.filePath);x&&this.backupAndDeleteSyncFile(x,E,"remote-deleted-api"),delete R.engines[A]}this.saveMeta(R,E);let O=l||e.label||r;this.log(`[${O}] \u62C9\u53D6\u5B8C\u6210: ${w} \u4E2A\u63A5\u53E3\u5F15\u64CE\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${b} \u9879\uFF0C\u5931\u8D25 ${V.length} \u9879`),V.length>0?_.warn(`Microi: [${O}] \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`):_.info(`Microi: [${O}] \u6210\u529F\u62C9\u53D6 ${w} \u4E2A\u63A5\u53E3\u5F15\u64CE${b>0?`\uFF08\u8DF3\u8FC7 ${b} \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(r){let i=r instanceof Error?r.message:String(r);this.log(`\u62C9\u53D6V8\u4E8B\u4EF6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${i}`)}return}await this.pullEventsForProfile(e)}async pullEventsForProfile(e){let t=I.getInstance(),n=$.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6V8\u4E8B\u4EF6\u4EE3\u7801 [${e.label||r}]...`),await le.withProgress({location:$e.Notification,title:`Microi: \u62C9\u53D6V8\u4E8B\u4EF6 [${e.label||r}]`,cancellable:!1},async s=>{s.report({message:"\u83B7\u53D6V8\u4E8B\u4EF6\u5217\u8868..."});let o=await n.get(L.GET_EVENT_LIST,{osClient:i},r,e);if(o.Code!==1){let P=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}${P}`)}let{List:c,Total:d}=o.Data;this.log(`\u83B7\u53D6\u5230 ${d} \u4E2AV8\u4E8B\u4EF6`);let g=await pe.getInstance().getSysConfig(r,i),l=g?.SysShortTitle||"",m=g?.SysTitle||"",p=l||m||g?.CompanyName||e.label||"";p&&(p!==e.label||l!==e.sysShortTitle||m!==e.sysTitle)&&await t.addProfile({...e,label:p,sysShortTitle:l,sysTitle:m});let h=t.getSyncRootDir(),f=t.buildServerDirName(p,r),y=this.loadMeta(f),S=0,C=0,E=0,R=new Set(c.map(P=>`${P.FormEngineKey}__${P.EventType}`)),b=t.getProfiles().find(P=>P.apiBaseUrl===e.apiBaseUrl&&P.osClient===e.osClient)||e;if(!b.osClientType||!b.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(i,b.osClientType,b.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 P of c){let O=P.V8Code||"",A=H(P.Description?`${P.Description}\uFF08${P.FormEngineKey}\uFF09`:P.FormEngineKey),k=kn[P.EventType]||P.EventType,x=H(`${k}\uFF08${P.EventType}\uFF09`)+".js",j=v.join(h,f,V,be,A,St);re(j);let G=v.join(j,x),ne=U[P.EventType];if(ne){let ge=H(`${ne}\uFF08${P.EventType}\uFF09`)+".js",Z=v.join(j,ge);Z!==G&&T.existsSync(Z)&&!this.isLocalModified(Z,P.UpdateTime)&&(T.existsSync(G)?T.unlinkSync(Z):T.renameSync(Z,G))}let oe=`${P.FormEngineKey}__${P.EventType}`;if(y.events[oe]={id:P.Id,formEngineKey:P.FormEngineKey,description:P.Description||"",eventType:P.EventType,updateTime:P.UpdateTime,filePath:v.relative(t.getWorkspaceRoot(),G)},!O.trim()){T.existsSync(G)&&this.backupAndDeleteSyncFile(G,f,"remote-deleted-form-event"),E++,S++,s.report({message:`${S}/${d}`,increment:d>0?1/d*100:void 0});continue}T.writeFileSync(G,O,"utf-8");let q=new Date(P.UpdateTime);isNaN(q.getTime())||T.utimesSync(G,q,q),C++,S++,s.report({message:`${S}/${d}`,increment:d>0?1/d*100:void 0})}for(let[P,O]of Object.entries(y.events)){if(R.has(P))continue;let A=this.getWorkspaceFilePath(O.filePath);A&&this.backupAndDeleteSyncFile(A,f,"remote-deleted-form-event"),delete y.events[P]}this.saveMeta(y,f);let F=p||e.label||r;this.log(`[${F}] \u62C9\u53D6\u5B8C\u6210: ${C} \u4E2AV8\u4E8B\u4EF6\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${E} \u9879`),_.info(`Microi: [${F}] \u6210\u529F\u62C9\u53D6 ${C} \u4E2AV8\u4E8B\u4EF6\u6587\u4EF6${E>0?`\uFF08\u8DF3\u8FC7 ${E} \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(r){let i=r instanceof Error?r.message:String(r);this.log(`\u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${i}`)}return}await this.pullWorkflowsForProfile(e)}async pullWorkflowsForProfile(e){let t=I.getInstance(),n=$.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE\u8282\u70B9 V8 [${e.label||r}]...`),await le.withProgress({location:$e.Notification,title:`Microi: \u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE [${e.label||r}]`,cancellable:!1},async s=>{s.report({message:"\u83B7\u53D6\u6D41\u7A0B\u8282\u70B9V8\u5217\u8868..."});let o=await n.get(L.GET_WORKFLOW_V8_EVENT_LIST,{osClient:i},r,e);if(o.Code!==1){let k=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}${k}`)}let d=await pe.getInstance().getSysConfig(r,i),u=d?.SysShortTitle||"",g=d?.SysTitle||"",l=u||g||d?.CompanyName||e.label||"";l&&(l!==e.label||u!==e.sysShortTitle||g!==e.sysTitle)&&await t.addProfile({...e,label:l,sysShortTitle:u,sysTitle:g});let p=t.getProfiles().find(k=>k.apiBaseUrl===e.apiBaseUrl&&k.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||i,f=t.buildServerDirName(l,r),y=t.buildOsClientDirName(h,p.osClientType,p.osClientNetwork),S=t.getSyncRootDir(),C=this.loadMeta(f);C.workflows||(C.workflows={}),C.workflowNodeEvents||(C.workflowNodeEvents={});let E=o.Data.Flows||[],R=o.Data.Nodes||[],w=o.Data.Lines||[],b=o.Data.List||[],V=new Map(E.map(k=>[String(k.Id||""),k])),U=new Set(E.map(k=>String(k.Id||"")).filter(Boolean)),F=new Set(b.filter(k=>String(k.V8Code||k.Code||"").trim()).map(k=>`${k.FlowDesignId}__${k.NodeId}__${k.EventType}`)),P=0,O=0;for(let k of E){let x=String(k.Id||"");if(!x)continue;let j=String(k.FlowName||x),G=String(k.UpdateTime||fe()),ne=v.join(S,f,y,je,H(`${j}\uFF08${x}\uFF09`));re(ne);let oe=R.filter(Z=>String(Z.FlowDesignId||"")===x),q=w.filter(Z=>String(Z.FlowDesignId||"")===x),ge=v.join(ne,"\u6D41\u7A0B\u8BBE\u8BA1\u56FE\uFF08WF_FlowDesign\uFF09.json");T.writeFileSync(ge,JSON.stringify({FlowDesign:k,Nodes:oe,Lines:q},null,2),"utf-8"),this.touchSyncedFile(ge,G),C.workflows[x]={flowDesignId:x,flowName:j,updateTime:G,filePath:v.relative(t.getWorkspaceRoot(),ge)}}for(let k of b){let x=String(k.FlowDesignId||""),j=String(k.NodeId||""),G=String(k.EventType||"");if(!x||!j||!G)continue;let ne=V.get(x),oe=String(k.FlowName||ne?.FlowName||x),q=String(k.NodeName||j),ge=Dn[G]||k.EventName||G,Z=v.join(S,f,y,je,H(`${oe}\uFF08${x}\uFF09`),Ct,H(`${q}\uFF08${j}\uFF09`));re(Z);let M=v.join(Z,H(`${ge}\uFF08${G}\uFF09`)+".js"),ae=k.V8Code||k.Code||"",Q=String(k.UpdateTime||ne?.UpdateTime||fe());if(C.workflowNodeEvents[`${x}__${j}__${G}`]={flowDesignId:x,flowName:oe,nodeId:j,nodeName:q,eventType:G,updateTime:Q,filePath:v.relative(t.getWorkspaceRoot(),M)},!ae.trim()){T.existsSync(M)&&this.backupAndDeleteSyncFile(M,f,"remote-deleted-workflow-event"),O++,s.report({message:`${P}/${b.length} ${oe}/${q}`});continue}T.writeFileSync(M,ae,"utf-8"),this.touchSyncedFile(M,Q),P++,s.report({message:`${P}/${b.length} ${oe}/${q}`})}for(let[k,x]of Object.entries(C.workflowNodeEvents)){if(F.has(k))continue;let j=this.getWorkspaceFilePath(x.filePath);j&&this.backupAndDeleteSyncFile(j,f,"remote-deleted-workflow-event"),delete C.workflowNodeEvents[k]}for(let[k,x]of Object.entries(C.workflows)){if(U.has(k))continue;let j=this.getWorkspaceFilePath(x.filePath);j&&this.backupAndDeleteSyncFile(j,f,"remote-deleted-workflow"),delete C.workflows[k]}this.saveMeta(C,f);let A=l||e.label||r;this.log(`[${A}] \u6D41\u7A0B\u5F15\u64CE\u62C9\u53D6\u5B8C\u6210: ${E.length} \u4E2A\u6D41\u7A0B\uFF0C${P} \u4E2A\u8282\u70B9V8\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${O} \u9879`),_.info(`Microi: [${A}] \u6210\u529F\u62C9\u53D6 ${E.length} \u4E2A\u6D41\u7A0B\u3001${P} \u4E2A\u6D41\u7A0B\u8282\u70B9V8\u6587\u4EF6${O>0?`\uFF08\u8DF3\u8FC7 ${O} \u4E2A\u7A7A\u4EE3\u7801\u4E8B\u4EF6\uFF09`:""}`)})}findProfileByServerDir(e){let t=I.getInstance(),n=t.getProfiles();for(let r of n)if(t.buildServerDirName(r.label,r.apiBaseUrl)===e)return r}hasSyncBaseline(e,t){let n=v.resolve(e).toLowerCase(),r=this.loadMeta(t);return[r.engines,r.events,r.fields||{},r.menuButtons||{},r.menuScripts||{},r.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,r){if(!n){let i=`\u65E0\u6CD5\u8BC6\u522B\u6587\u4EF6\u6240\u5C5E\u670D\u52A1\u5668\u914D\u7F6E\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\uFF1A${e}`;return this.log(i),_.error(`Microi: ${i}`),!1}if(!this.hasSyncBaseline(e,t)){let i=`\u6587\u4EF6\u6CA1\u6709\u540C\u6B65\u57FA\u7EBF\uFF0C\u65E0\u6CD5\u786E\u8BA4\u670D\u52A1\u5668\u7AEF\u662F\u5426\u66F4\u65B0\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\u3002\u8BF7\u5148\u62C9\u53D6\u5BF9\u5E94\u5F15\u64CE\uFF1A${e}`;return this.log(i),_.error(`Microi: ${i}`),!1}try{let i=await this.checkRemoteDifferences(n,r,e),s=v.resolve(e).toLowerCase(),o=i.find(u=>v.resolve(u.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),_.error(`Microi: ${d}`),!1}catch(i){let s=i instanceof Error?i.message:String(i);return this.log(`\u63A8\u9001\u524D\u540C\u6B65\u72B6\u6001\u68C0\u6D4B\u5931\u8D25\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\uFF1A${s}`),_.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 r=I.getInstance().getSyncRootDir();if(v.extname(e).toLowerCase()===".js"&&T.existsSync(e)){let g=On(we(T.readFileSync(e,"utf-8")));if(g.length>0){let l=g[0],m=`\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(m),_.error(`Microi: ${m}`),!1}}let i=Mn(e,r);if(i){let g=this.findProfileByServerDir(i.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,i.serverDir,g,"api")?!1:this.pushEngineFile(e,i,g)}let s=Nn(e,r);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=An(e,r);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=Fn(e,r);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=Vn(e,r);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 u=xn(e,r);if(u){let g=this.findProfileByServerDir(u.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,u.serverDir,g,"workflow")?!1:this.pushWorkflowNodeFile(e,u,g)}return this.log(`\u65E0\u6CD5\u89E3\u6790\u6587\u4EF6\u8DEF\u5F84: ${e}`),!1}async pushEngineFile(e,t,n){let r=$.getInstance(),i=T.readFileSync(e,"utf-8"),s=we(i);this.log(`\u63A8\u9001\u63A5\u53E3\u5F15\u64CE: ${t.apiEngineKey}...`);try{let o="",c="";try{let m=await r.post(L.GET_ENGINE_CODE,{OsClient:t.osClient,ApiEngineKey:t.apiEngineKey},void 0,n?.apiBaseUrl,n);m.Code===1&&m.Data&&(o=m.Data.ApiV8Code||m.Data.Code||"",c=m.Data.Version||"")}catch{o="",c=""}let d=!s.trim(),u=d?{code:"",version:c,changeHistory:""}:ot({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(u.code,"utf8").toString("base64")};d||(g.Version=u.version,g.ChangeHistory=u.changeHistory);let l=await r.post(L.UPDATE_ENGINE_CODE,g,void 0,n?.apiBaseUrl,n);if(l.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.apiEngineKey}`);let m=l.Data?.UpdateTime||fe(),p=this.loadMeta(t.serverDir);if(d?delete p.engines[t.apiEngineKey]:p.engines[t.apiEngineKey]&&(p.engines[t.apiEngineKey].updateTime=m),this.saveMeta(p,t.serverDir),d)T.existsSync(e)&&T.unlinkSync(e);else{T.writeFileSync(e,u.code,"utf-8");let h=new Date(m);isNaN(h.getTime())||T.utimesSync(e,h,h)}return!0}else return this.log(`\u63A8\u9001\u5931\u8D25: ${t.apiEngineKey} - ${l.Msg}`),_.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}`),_.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async pushEventFile(e,t,n){let r=$.getInstance(),i=T.readFileSync(e,"utf-8"),s=we(i);this.log(`\u63A8\u9001V8\u4E8B\u4EF6: ${t.formEngineKey}/${t.eventType}...`);try{let o="",c="";try{let m=await r.post(L.GET_EVENT_CODE,{OsClient:t.osClient,FormEngineKey:t.formEngineKey,EventType:t.eventType},void 0,n?.apiBaseUrl,n);m.Code===1&&m.Data&&(o=m.Data.V8Code||m.Data.Code||"",c=m.Data.Version||"")}catch{o="",c=""}let d=!s.trim(),u=d?{code:"",version:c,changeHistory:""}:ot({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:u.code};d||(g.Version=u.version,g.ChangeHistory=u.changeHistory);let l=await r.post(L.UPDATE_EVENT_CODE,g,void 0,n?.apiBaseUrl,n);if(l.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.formEngineKey}/${t.eventType}`);let m=l.Data?.UpdateTime||fe(),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:m,filePath:v.relative(I.getInstance().getWorkspaceRoot(),e)}}if(this.saveMeta(p,t.serverDir),d)T.existsSync(e)&&T.unlinkSync(e);else{T.writeFileSync(e,u.code,"utf-8");let f=new Date(m);isNaN(f.getTime())||T.utimesSync(e,f,f)}return!0}else return this.log(`\u63A8\u9001\u5931\u8D25: ${t.formEngineKey}/${t.eventType} - ${l.Msg}`),_.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}`),_.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async createEngine(e){let t=$.getInstance(),n=I.getInstance();this.log(`\u521B\u5EFA\u63A5\u53E3\u5F15\u64CE: ${e.apiEngineKey}...`);try{let r=ot({kind:"ApiEngine",key:e.apiEngineKey,currentCode:"",functionDescription:`\u63A5\u53E3\u5F15\u64CE ${e.apiName} \u7684\u5B8C\u6574\u4E1A\u52A1\u903B\u8F91\u3002`,changeSummary:`\u901A\u8FC7 VS Code \u521B\u5EFA\u63A5\u53E3\u5F15\u64CE ${e.apiEngineKey}`,initial:!0}),i=await t.post(L.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(r.code,"utf8").toString("base64"),Version:r.version,ChangeHistory:r.changeHistory},void 0,e.profile.apiBaseUrl,e.profile);if(i.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"),u=H(e.apiName||e.apiEngineKey),g=v.join(s,o,c,Ue,d);re(g);let l=v.join(g,H(`${u}(${tn(e.apiEngineKey)}).js`));T.writeFileSync(l,r.code,"utf-8");let m=this.loadMeta(o);return m.engines[e.apiEngineKey]={id:"",apiName:e.apiName,category:d,apiAddress:e.apiAddress||"",updateTime:fe(),filePath:v.relative(n.getWorkspaceRoot(),l)},this.saveMeta(m,o),this.log(`\u521B\u5EFA\u6210\u529F: ${e.apiEngineKey}`),_.info(`Microi: \u63A5\u53E3\u5F15\u64CE [${e.apiEngineKey}] \u521B\u5EFA\u6210\u529F`),await le.showTextDocument(Tn.file(l)),!0}else return this.log(`\u521B\u5EFA\u5931\u8D25: ${e.apiEngineKey} - ${i.Msg}`),_.error(`Microi: \u521B\u5EFA\u5931\u8D25 - ${i.Msg}`),!1}catch(r){let i=r instanceof Error?r.message:String(r);return this.log(`\u521B\u5EFA\u5F02\u5E38: ${e.apiEngineKey} - ${i}`),_.error(`Microi: \u521B\u5EFA\u5F02\u5E38 - ${i}`),!1}}async pullFields(e){if(!e){let t=I.getInstance().getProfiles();for(let n of t)try{await this.pullFieldsForProfile(n)}catch(r){this.log(`\u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${r instanceof Error?r.message:String(r)}`)}return}await this.pullFieldsForProfile(e)}async pullFieldsForTableFolder(e){let n=I.getInstance().getSyncRootDir(),r=v.relative(n,e).split(v.sep);if(r.length<4||r[2]!==be){_.warn("Microi: \u8BF7\u5728\u201C\u8868\u5355\u5F15\u64CE\u201D\u4E0B\u7684\u8868\u76EE\u5F55\u6267\u884C\u5B57\u6BB5 V8 \u4E8B\u4EF6\u62C9\u53D6");return}let i=o=>{let c=o.match(/[((]([^))]+)[))]\s*$/);return c?c[1]:o},s=this.findProfileByServerDir(r[0]);if(!s){_.error(`Microi: \u672A\u627E\u5230\u4E0E\u76EE\u5F55 "${r[0]}" \u5339\u914D\u7684\u670D\u52A1\u5668\u8FDE\u63A5`);return}await this.pullFieldsForTable(s,i(r[3]),e,r[0])}async pullFieldsForTable(e,t,n,r){let i=I.getInstance(),s=$.getInstance(),o=this.loadMeta(r);o.fields||(o.fields={}),this.log(`\u62C9\u53D6\u8868\u5B57\u6BB5V8\u4E8B\u4EF6: ${t}...`);let c=await s.get(L.GET_FIELD_LIST,{osClient:e.osClient,tableName:t},e.apiBaseUrl,e);if(c.Code!==1){_.error(`Microi: \u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 - ${c.Msg}`);return}let d=c.Data.List||[],u=["V8Code","KeyupV8Code","V8TmpEngineTable","V8TmpEngineForm"],g=0,l=0;for(let m of d){let p=H(m.Label?`${m.Label}\uFF08${m.Name}\uFF09`:m.Name),h=v.join(n,Ze,p);for(let f of u){let y=(m[f]||"").toString(),S=Ht[f]||f,C=H(`${S}\uFF08${f}\uFF09`)+".js",E=v.join(h,C),R=`${t}__${m.Name}__${f}`;if(!y.trim()){l++,T.existsSync(E)&&T.unlinkSync(E),delete o.fields[R];continue}re(h),T.writeFileSync(E,y,"utf-8");let w=new Date(m.UpdateTime);isNaN(w.getTime())||T.utimesSync(E,w,w),o.fields[R]={fieldId:m.Id,tableId:m.TableId,tableName:t,fieldName:m.Name,fieldLabel:m.Label||"",v8Key:f,updateTime:m.UpdateTime,filePath:v.relative(i.getWorkspaceRoot(),E)},g++}}this.saveMeta(o,r),_.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=$.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6 [${e.label||r}]...`),await le.withProgress({location:$e.Notification,title:`Microi: \u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6 [${e.label||r}]`,cancellable:!1},async s=>{s.report({message:"\u83B7\u53D6\u8868\u5217\u8868..."});let o=await n.get(L.GET_DB_SCHEMA,{osClient:i},r,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||[],u=await pe.getInstance().getSysConfig(r,i),g=u?.SysShortTitle||"",l=u?.SysTitle||"",m=g||l||e.label||"",p=t.buildServerDirName(m,r),h=this.loadMeta(p);h.fields||(h.fields={});let y=t.getProfiles().find(F=>F.apiBaseUrl===e.apiBaseUrl&&F.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(i,y.osClientType,y.osClientNetwork),C=t.getSyncRootDir(),E=["V8Code","KeyupV8Code","V8TmpEngineTable","V8TmpEngineForm"],R=0,w=0,b=0,V=new Set,U=new Set;for(let F of c){b++,s.report({message:`[${b}/${c.length}] ${F.Name}`});let P=await n.get(L.GET_FIELD_LIST,{osClient:i,tableId:F.Id},r,e);if(P.Code!==1){U.add(F.Name.toLowerCase()),this.log(` \u8DF3\u8FC7\u8868 ${F.Name}: ${P.Msg}`);continue}let O=P.Data.List||[],A=H(F.Description?`${F.Description}\uFF08${F.Name}\uFF09`:F.Name);for(let k of O)for(let x of E){let j=(k[x]||"").toString();if(!j.trim()){w++;continue}let G=H(k.Label?`${k.Label}\uFF08${k.Name}\uFF09`:k.Name),ne=Ht[x]||x,oe=H(`${ne}\uFF08${x}\uFF09`)+".js",q=v.join(C,p,S,be,A,Ze,G);re(q);let ge=v.join(q,oe);T.writeFileSync(ge,j,"utf-8");let Z=new Date(k.UpdateTime);isNaN(Z.getTime())||T.utimesSync(ge,Z,Z);let M=`${F.Name}__${k.Name}__${x}`;V.add(M),h.fields[M]={fieldId:k.Id,tableId:k.TableId,tableName:F.Name,fieldName:k.Name,fieldLabel:k.Label||"",v8Key:x,updateTime:k.UpdateTime,filePath:v.relative(t.getWorkspaceRoot(),ge)},R++}}for(let[F,P]of Object.entries(h.fields)){if(V.has(F)||U.has(P.tableName.toLowerCase()))continue;let O=this.getWorkspaceFilePath(P.filePath);O&&this.backupAndDeleteSyncFile(O,p,"remote-deleted-field-event"),delete h.fields[F]}this.saveMeta(h,p),this.log(`\u5B57\u6BB5V8\u4E8B\u4EF6\u62C9\u53D6\u5B8C\u6210: ${R} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${w} \u9879`),_.info(`Microi: \u6210\u529F\u62C9\u53D6 ${R} \u4E2A\u5B57\u6BB5V8\u4E8B\u4EF6${w>0?`\uFF08\u8DF3\u8FC7 ${w} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)})}async pushFieldFile(e,t,n){let r=$.getInstance(),i=we(T.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u5B57\u6BB5V8\u4E8B\u4EF6: ${t.tableName}/${t.fieldName}/${t.v8Key}...`);try{let s=await r.post(L.UPDATE_FIELD,{OsClient:t.osClient,TableName:t.tableName,Name:t.fieldName,[t.v8Key]:i},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||fe();return i.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),i.trim()?this.touchSyncedFile(e,d):T.existsSync(e)&&T.unlinkSync(e),!0}return this.log(`\u63A8\u9001\u5931\u8D25: ${s.Msg}`),_.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}`),_.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(r){this.log(`\u62C9\u53D6\u83DC\u5355\u6309\u94AE\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${r instanceof Error?r.message:String(r)}`)}return}await this.pullMenuButtonsForProfile(e)}async pullMenuButtonsForModuleFolder(e){let n=I.getInstance().getSyncRootDir(),r=v.relative(n,e).split(v.sep);if(r.length<4||r[2]!==_e){_.warn("Microi: \u8BF7\u5728\u201C\u6A21\u5757\u5F15\u64CE\u201D\u4E0B\u7684\u6A21\u5757\u76EE\u5F55\u6267\u884C\u62C9\u53D6");return}let i=this.findProfileByServerDir(r[0]);if(!i){_.error(`Microi: \u672A\u627E\u5230\u4E0E\u76EE\u5F55 "${r[0]}" \u5339\u914D\u7684\u670D\u52A1\u5668\u8FDE\u63A5`);return}let s=this.extractTrailingKey(v.basename(e));await this.pullMenuButtonsForProfile(i,s,r[0],r[1],e)}async pullMenuButtonsForProfile(e,t,n,r,i){let s=I.getInstance(),o=$.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 le.withProgress({location:$e.Notification,title:`Microi: \u62C9\u53D6\u6A21\u5757\u4EE3\u7801 [${e.label||c}]`,cancellable:!1},async u=>{let g=await o.get(L.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 pe.getInstance().getSysConfig(c,d),h=p?.SysShortTitle||"",f=p?.SysTitle||"",y=h||f||e.label||"",S=n||s.buildServerDirName(y,c),C=this.loadMeta(S);C.menus||(C.menus={}),C.menuButtons||(C.menuButtons={}),C.menuScripts||(C.menuScripts={});let R=s.getProfiles().find(M=>M.apiBaseUrl===e.apiBaseUrl&&M.osClient===e.osClient)||e;if(!R.osClientType||!R.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let w=r||s.buildOsClientDirName(d,R.osClientType,R.osClientNetwork),b=s.getSyncRootDir(),V=v.join(b,S,w,_e),U=Object.keys(Ke),F=Object.keys(et),P=0,O=0,A=0,k=0,x=0,j=new Map(l.map(M=>[M.Id,M])),G=new Map,ne=M=>M||"";for(let M of l){let ae=ne(M.ParentId);G.has(ae)||G.set(ae,[]),G.get(ae).push(M)}let oe=M=>M.sort((ae,Q)=>{let ue=typeof ae.Sort=="number"?ae.Sort:0,Qe=typeof Q.Sort=="number"?Q.Sort:0;return ue!==Qe?ue-Qe:String(ae.Name||ae.Label||"").localeCompare(String(Q.Name||Q.Label||""))}),q=t?j.get(t)?[j.get(t)]:[]:oe(l.filter(M=>!M.ParentId||!j.has(M.ParentId)));if(t&&q.length===0)throw new Error(`\u627E\u4E0D\u5230\u6A21\u5757 Id=${t}`);let ge=t?i||v.join(V,H(`${q[0].Label||q[0].Name||q[0].Id}\uFF08${q[0].Id}\uFF09`)):V;if(this.backupExistingTree(ge,S,t?"module-subtree":"module-engine"),!t)C.menus={},C.menuButtons={},C.menuScripts={};else{let M=new Set,ae=Q=>{if(!M.has(Q)){M.add(Q);for(let ue of G.get(Q)||[])ae(ue.Id)}};ae(t);for(let Q of M)delete C.menus[Q];for(let[Q,ue]of Object.entries(C.menuButtons))M.has(ue.moduleId)&&delete C.menuButtons[Q];for(let[Q,ue]of Object.entries(C.menuScripts))M.has(ue.moduleId)&&delete C.menuScripts[Q]}let Z=async(M,ae)=>{k++,u.report({message:`[${k}/${l.length}] ${M.Name||M.Label}`});let Q=M.Label||M.Name||M.Id,ue=v.join(ae,H(`${Q}\uFF08${M.Id}\uFF09`));re(ue);let Qe=oe(G.get(M.Id)||[]);if(Qe.length>0){for(let ee of Qe)await Z(ee,ue);return}let $t=await o.get(L.GET_MODULE,{osClient:d,moduleId:M.Id},c,e);if($t.Code!==1){this.log(` \u8DF3\u8FC7\u6A21\u5757 ${M.Name}: ${$t.Msg}`);return}let Lt=$t.Data,Ie=String(Lt.UpdateTime||fe()),mn={};for(let ee of F){let ft=String(Lt[ee]||""),Bt=et[ee]||ee,Re=v.join(ue,H(`${Bt}\uFF08${ee}\uFF09`)+".js");T.writeFileSync(Re,ft,"utf-8"),this.touchSyncedFile(Re,Ie),C.menuScripts[this.getMenuScriptMetaKey(M.Id,ee)]={moduleId:M.Id,moduleName:Q,scriptField:ee,codeHash:this.sourceHash(ft),updateTime:Ie,filePath:v.relative(s.getWorkspaceRoot(),Re)},A++}for(let ee of U){let ft=Ke[ee]||ee,Bt=H(`${ft}\uFF08${ee}\uFF09`),Re=v.join(ue,Bt);re(Re),O++;let ht=Lt[ee],Ve=[];if(ht)try{Ve=typeof ht=="string"?JSON.parse(ht):ht,Array.isArray(Ve)||(Ve=[])}catch{this.log(` \u6309\u94AE JSON \u89E3\u6790\u5931\u8D25 ${M.Name}.${ee}`),Ve=[]}let Cr=[...Ve].sort((Oe,ye)=>String(Oe.Id||"").localeCompare(String(ye.Id||"")));mn[ee]=require("crypto").createHash("sha1").update(JSON.stringify(Cr)).digest("hex");for(let Oe of Ve){let ye=String(Oe.Id||""),yt=String(Oe.Name||ye||"Unknown");if(!ye)continue;let pn=String(Oe.V8Code||""),Ut=v.join(Re,H(`${yt}\uFF08${ye}\uFF09`)+".js");C.menuButtons[this.getMenuButtonMetaKey(M.Id,ee,ye,"V8Code")]={moduleId:M.Id,moduleName:Q,btnField:ee,btnId:ye,btnName:yt,v8SubField:"V8Code",updateTime:Ie,filePath:v.relative(s.getWorkspaceRoot(),Ut)},pn.trim()?(T.writeFileSync(Ut,pn,"utf-8"),this.touchSyncedFile(Ut,Ie),P++):x++;let fn=String(Oe.V8CodeShow||"");if(fn.trim()){let jt=v.join(Re,H(`${yt}_\u663E\u9690\u5224\u65AD\uFF08${ye}\uFF09`)+".js");T.writeFileSync(jt,fn,"utf-8"),this.touchSyncedFile(jt,Ie),C.menuButtons[this.getMenuButtonMetaKey(M.Id,ee,ye,"V8CodeShow")]={moduleId:M.Id,moduleName:Q,btnField:ee,btnId:ye,btnName:yt,v8SubField:"V8CodeShow",updateTime:Ie,filePath:v.relative(s.getWorkspaceRoot(),jt)},P++}else x++}}C.menus[M.Id]={moduleId:M.Id,moduleName:Q,updateTime:Ie,buttonHashes:mn}};re(V);for(let M of q)await Z(M,V);this.saveMeta(C,S),this.log(`\u6A21\u5757\u4EE3\u7801\u62C9\u53D6\u5B8C\u6210: ${P} \u4E2A\u6309\u94AEV8\u6587\u4EF6\uFF0C${A} \u4E2A Join/Where \u6587\u4EF6\uFF0C${O} \u4E2A\u6309\u94AE\u76EE\u5F55\uFF0C\u8DF3\u8FC7\u7A7A\u6309\u94AE\u4EE3\u7801 ${x} \u9879`),_.info(`Microi: \u6210\u529F\u62C9\u53D6 ${P} \u4E2A\u6309\u94AEV8\u6587\u4EF6\u548C ${A} \u4E2A Join/Where \u6587\u4EF6${x>0?`\uFF08\u8DF3\u8FC7 ${x} \u4E2A\u7A7A\u6309\u94AE\u4EE3\u7801\uFF09`:""}\uFF0C\u5DF2\u751F\u6210 ${O} \u4E2A\u6309\u94AE\u76EE\u5F55`)})}backupExistingTree(e,t,n){if(!T.existsSync(e))return;let i=I.getInstance().getSyncRootDir();this.ensureSyncGitExcludes(i);let s=v.join(i,".backups",n,this.shortBackupKey(t));re(s);let o=v.join(s,`${Date.now()}-${this.shortBackupKey(v.basename(e))}`);T.renameSync(e,o)}backupAndDeleteSyncFile(e,t,n){if(!T.existsSync(e))return;let r=I.getInstance(),i=r.getSyncRootDir();this.ensureSyncGitExcludes(i);let s=r.getWorkspaceRoot()||i,c=v.relative(s,e).split(v.sep).filter(g=>g&&g!=="..").map(H),d=v.join(i,".backups",n,this.shortBackupKey(t),String(Date.now())),u=v.join(d,...c.length?c:[H(v.basename(e))]);re(v.dirname(u)),T.copyFileSync(e,u),T.unlinkSync(e)}async pushMenuScriptFile(e,t,n){let r=$.getInstance(),i=we(T.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u6A21\u5757\u811A\u672C: ${t.moduleId}.${t.scriptField}...`);try{let s=await r.get(L.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n);if(s.Code!==1||!s.Data)return _.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(),u=d.getSyncRootDir();this.ensureSyncGitExcludes(u);let g=v.join(u,".backups","menu-script",this.shortBackupKey(t.serverDir),t.moduleId);re(g),T.writeFileSync(v.join(g,`${t.scriptField}-${Date.now()}.js`),c,"utf-8");let l={OsClient:t.osClient,ModuleId:t.moduleId,[t.scriptField]:i},m=await r.post(L.UPDATE_MODULE,l,void 0,n?.apiBaseUrl,n);if(m.Code!==1)return _.error(`Microi: \u63A8\u9001\u6A21\u5757 ${t.scriptField} \u5931\u8D25 - ${m.Msg}`),!1;let p=await r.get(L.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(i))return _.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||m.Data?.UpdateTime||fe()),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(i),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}`),_.error(`Microi: \u63A8\u9001\u6A21\u5757\u811A\u672C\u5F02\u5E38 - ${o}`),!1}}async pushMenuButtonFile(e,t,n){let r=$.getInstance(),i=we(T.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u6309\u94AEV8\u4EE3\u7801: ${t.moduleId}.${t.btnField}.${t.btnId}.${t.v8SubField}...`);try{let s=await r.get(L.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n);if(s.Code!==1)return _.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 _.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);re(l);let m=v.join(l,`${t.btnField}-${Date.now()}.json`);T.writeFileSync(m,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]=i;let h={OsClient:t.osClient,ModuleId:t.moduleId};h[t.btnField]=JSON.stringify(c);let f=await r.post(L.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||fe(),S=this.loadMeta(t.serverDir);S.menuButtons||(S.menuButtons={});let C=this.getMenuButtonMetaKey(t.moduleId,t.btnField,t.btnId,t.v8SubField);return i.trim()?S.menuButtons[C]={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[C],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),i.trim()?this.touchSyncedFile(e,y):T.existsSync(e)&&T.unlinkSync(e),!0}return _.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}`),_.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${o}`),!1}}async pushWorkflowNodeFile(e,t,n){let r=$.getInstance(),i=T.readFileSync(e,"utf-8"),s=we(i);this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8: ${t.flowDesignId}/${t.nodeId}/${t.eventType}...`);try{let o="",c="";try{let m=await r.post(L.GET_WORKFLOW_V8_EVENT_CODE,{OsClient:t.osClient,FlowDesignId:t.flowDesignId,NodeId:t.nodeId,EventType:t.eventType},void 0,n?.apiBaseUrl,n);m.Code===1&&m.Data&&(o=m.Data.V8Code||m.Data.Code||"",c=m.Data.Version||"")}catch{o="",c=""}let d=!s.trim(),u=d?{code:"",version:c,changeHistory:""}:ot({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(u.code,"utf8").toString("base64"),g.Version=u.version,g.ChangeHistory=u.changeHistory);let l=await r.post(L.UPDATE_WORKFLOW_V8_EVENT_CODE,g,void 0,n?.apiBaseUrl,n);if(l.Code===1){let m=l.Data?.UpdateTime||fe(),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:m,filePath:v.relative(I.getInstance().getWorkspaceRoot(),e)},this.saveMeta(p,t.serverDir),d?T.existsSync(e)&&T.unlinkSync(e):(T.writeFileSync(e,u.code,"utf-8"),this.touchSyncedFile(e,m)),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}`),_.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}`),_.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async pullDbSchema(e){let t=I.getInstance(),n=$.getInstance();if(!e){let r=t.getProfiles();if(r.length===0){_.warn("Microi: \u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u670D\u52A1\u5668");return}for(let i of r)try{await this.pullDbSchemaForProfile(i)}catch(s){let o=s instanceof Error?s.message:String(s);this.log(`\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5931\u8D25 [${i.label||i.apiBaseUrl}]: ${o}`)}return}await this.pullDbSchemaForProfile(e)}async pullDbSchemaForProfile(e){let t=I.getInstance(),n=$.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784 [${e.label||r}]...`);let s=await n.get(L.GET_DB_SCHEMA,{osClient:i},r,e);if(s.Code!==1){let b=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}${b}`)}let o=t.getSyncRootDir(),d=await pe.getInstance().getSysConfig(r,i),u=d?.SysShortTitle||"",g=d?.SysTitle||"",l=u||g||d?.CompanyName||e.label||"";l&&(l!==e.label||u!==e.sysShortTitle||g!==e.sysTitle)&&await t.addProfile({...e,label:l,sysShortTitle:u,sysTitle:g});let m=t.buildServerDirName(l,r),h=t.getProfiles().find(b=>b.apiBaseUrl===e.apiBaseUrl&&b.osClient===e.osClient)||e,f=t.buildOsClientDirName(i,h.osClientType,h.osClientNetwork),y=v.join(o,m,f);re(y);let S=v.join(y,He);T.writeFileSync(S,JSON.stringify(s.Data,null,2),"utf-8");let C=v.join(y,Me),E=this.formatDbSchemaMarkdown(s.Data,m,f);E&&T.writeFileSync(C,E,"utf-8");let R=s.Data.Tables?.length||0,w=l||e.label||r;this.log(`[${w}] \u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5B8C\u6210: ${R} \u5F20\u8868`),_.info(`Microi: [${w}] \u6210\u529F\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\uFF08${R} \u5F20\u8868\uFF09`)}formatDbSchemaMarkdown(e,t,n){let r=(e.Tables||[]).filter(c=>c.Name);if(!r.length)return"";let i=r.reduce((c,d)=>{let u=d._Fields||d.Fields||[];return c+u.length},0),s=e.Menus?.length||0,o=[];o.push(`# \u6570\u636E\u5E93\u7ED3\u6784 \u2014 ${t}/${n}
39
+ `}function ot(a){let e=It(a.currentCode),t=It(a.remoteCode),n=It(a.remoteVersion),r=$r([e,t,n]),i=a.initial?r||"v1.0.0":Lr(r),{header:s,body:o}=jr(a.currentCode||""),c=`${Kr(a,i,s)}${o.replace(/^\s+/,"")}`,d=(a.changeSummary||"\u540C\u6B65 V8 \u4EE3\u7801").trim();return{code:c,version:i,changeHistory:`${i} ${d}`}}var qe=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 r=v.join(n,e,Be);if(!T.existsSync(r))return this.migrateFromFlatMeta(e);try{let i=JSON.parse(T.readFileSync(r,"utf-8"));if(!i||typeof i!="object"||Array.isArray(i))throw new Error("\u9876\u5C42\u5FC5\u987B\u662F JSON \u5BF9\u8C61");let s=i;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(i){throw new Error(`Microi \u540C\u6B65\u5143\u6570\u636E\u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u5E76\u505C\u6B62\u5199\u5165\uFF1A${r}\uFF08${i instanceof Error?i.message:String(i)}\uFF09`)}}saveMeta(e,t){let n=I.getInstance();try{let r=n.getSyncRootDir();this.ensureSyncGitExcludes(r);let i=v.join(r,t);re(i);let s=v.join(i,Be),o=`${s}.${process.pid}.${Date.now()}.tmp`;try{T.writeFileSync(o,`${JSON.stringify(e,null,2)}
40
+ `,"utf-8"),T.renameSync(o,s)}finally{try{T.existsSync(o)&&T.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 Ee(nn(e||"")).replace(/\r\n/g,`
41
+ `).trimEnd()}isLocalModified(e,t){try{if(!T.existsSync(e))return!1;let n=T.statSync(e),r=new Date(t);return isNaN(r.getTime())?!1:n.mtime.getTime()>r.getTime()+1e3}catch{return!1}}getLocalModifiedTime(e,t){try{if(!T.existsSync(e))return null;let n=T.statSync(e),r=new Date(t);return isNaN(r.getTime())?null:n.mtime.getTime()>r.getTime()+1e3?fe(n.mtime):null}catch{return null}}touchSyncedFile(e,t){let n=new Date(t),r=isNaN(n.getTime())?new Date:n;try{T.utimesSync(e,r,r)}catch{}}ensureSyncGitExcludes(e){try{let t=e||I.getInstance().getSyncRootDir();Ge(t),ke(t,[".backups/","**/.backups/",".microi-mcp-tokens.json","**/.microi-mcp-tokens.json"])}catch{}}shortBackupKey(e){return require("crypto").createHash("sha1").update(e||"").digest("hex").slice(0,10)}getMenuButtonMetaKey(e,t,n,r){return`${e}__${t}__${n}__${r}`}getMenuScriptMetaKey(e,t){return`${e}__${t}`}sourceHash(e){return require("crypto").createHash("sha256").update(this.normalizeCode(e||"")).digest("hex")}extractTrailingKey(e){let t=e.match(/[((]([^))]+)[))]\s*$/);return t?t[1]:e}getServerDirs(){try{let e=I.getInstance().getSyncRootDir();return T.existsSync(e)?T.readdirSync(e,{withFileTypes:!0}).filter(t=>t.isDirectory()).filter(t=>!t.name.startsWith(".")).map(t=>t.name):[]}catch{return[]}}getLocalChangeSummary(){let e={engines:0,events:0,fields:0,menuButtons:0,menuScripts:0,workflowNodeEvents:0,total:0};for(let t of this.getLocalChangeItems())t.kind==="engine"?e.engines+=1:t.kind==="event"?e.events+=1:t.kind==="field"?e.fields+=1:t.kind==="menuButton"?e.menuButtons+=1:t.kind==="menuScript"?e.menuScripts+=1:t.kind==="workflow"&&(e.workflowNodeEvents+=1);return e.total=e.engines+e.events+e.fields+e.menuButtons+e.menuScripts+e.workflowNodeEvents,e}getLocalChangeItems(){let e=[],t=(n,r,i,s,o)=>{let c=this.getWorkspaceFilePath(o.filePath);if(!c)return;let d=this.getLocalModifiedTime(c,o.updateTime);d&&e.push({kind:r,key:i,name:s,serverDir:n,filePath:c,updateTime:o.updateTime,modifiedTime:d})};for(let n of this.getServerDirs()){let r=this.loadMeta(n);for(let[i,s]of Object.entries(r.engines))t(n,"engine",i,s.apiName||i,s);for(let[i,s]of Object.entries(r.events))t(n,"event",i,`${s.description||s.formEngineKey}/${s.eventType}`,s);for(let[i,s]of Object.entries(r.fields||{}))t(n,"field",i,`${s.tableName}.${s.fieldName}/${s.v8Key}`,s);for(let[i,s]of Object.entries(r.menuButtons||{}))t(n,"menuButton",i,`${s.moduleName}/${s.btnName}/${s.v8SubField}`,s);for(let[i,s]of Object.entries(r.menuScripts||{}))t(n,"menuScript",i,`${s.moduleName}/${s.scriptField}`,s);for(let[i,s]of Object.entries(r.workflowNodeEvents||{}))t(n,"workflow",i,`${s.flowName}/${s.nodeName}/${s.eventType}`,s)}return e}async checkRemoteDifferences(e,t="all",n){let r=e?[e]:I.getInstance().getProfiles(),i=[];for(let s of r){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,i,n),(t==="all"||t==="form")&&(!n||d==="event")&&await this.collectEventDifferences(s,o,c,i,n),(t==="all"||t==="form")&&(!n||d==="field")&&await this.collectFieldDifferences(s,o,c,i,n),(t==="all"||t==="module")&&(!n||d==="menuButton")&&await this.collectMenuButtonDifferences(s,o,c,i,n),(t==="all"||t==="module")&&(!n||d==="menuScript")&&await this.collectMenuScriptDifferences(s,o,c,i,n),(t==="all"||t==="workflow")&&(!n||d==="workflow")&&await this.collectWorkflowDifferences(s,o,c,i,n)}return i}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[r,i]of n)if(Object.values(i).some(s=>this.matchesTargetFile(s.filePath,t)))return r;return null}classifyDifference(e,t,n,r){return n===r?null:e&&t?"conflict":e?"localModified":"remoteModified"}classifyRemoteDeletion(e,t){return this.isLocalModified(e,t)?"conflict":"remoteDeleted"}createRemoteDeletedItem(e,t,n,r,i,s){return!i||!T.existsSync(i)?null:{kind:e,status:this.classifyRemoteDeletion(i,s),name:t,key:n,serverDir:r,filePath:i,localCode:this.normalizeCode(T.readFileSync(i,"utf-8")),remoteCode:"",localUpdateTime:s,remoteUpdateTime:""}}isRemoteNewer(e,t){let n=new Date(e||"").getTime(),r=new Date(t||"").getTime();return isNaN(n)||isNaN(r)?!1:n>r+1e3}getRemoteOnlyPlaceholderPath(e,t,n,r){let i=I.getInstance(),s=n==="api"?Ue:n==="form"?be:n==="module"?_e:je;return v.join(i.getSyncRootDir(),t,i.buildOsClientDirName(e.osClient,e.osClientType,e.osClientNetwork),s,"\u670D\u52A1\u5668\u65B0\u589E\u5F85\u62C9\u53D6",`${H(r)}.js`)}async collectEngineDifferences(e,t,n,r,i){let o=await $.getInstance().get(L.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,i))continue;let m=c.get(g),p=this.getWorkspaceFilePath(l.filePath);if(!p||!T.existsSync(p))continue;if(!m){let w=this.createRemoteDeletedItem("engine",l.apiName||g,g,t,p,l.updateTime);w&&r.push(w);continue}let h=this.normalizeCode(T.readFileSync(p,"utf-8")),f=this.normalizeCode(m.ApiV8Code||""),y=this.isLocalModified(p,l.updateTime),S=this.isRemoteNewer(m.UpdateTime,l.updateTime);if(h===f){(y||S)&&m.UpdateTime&&(l.updateTime=m.UpdateTime,this.touchSyncedFile(p,m.UpdateTime),d=!0);continue}let C=this.classifyDifference(y,S,h,f);C&&r.push({kind:"engine",status:C,name:m.ApiName||l.apiName||g,key:g,serverDir:t,filePath:p,localCode:h,remoteCode:f,localUpdateTime:l.updateTime,remoteUpdateTime:m.UpdateTime})}if(d&&this.saveMeta(n,t),i)return;let u=new Set(Object.keys(n.engines).map(g=>g.toLowerCase()));for(let g of o.Data.List)!String(g.ApiV8Code||"").trim()||u.has(g.ApiEngineKey.toLowerCase())||r.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,r,i){let o=await $.getInstance().get(L.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,i))continue;let m=c.get(g)||c.get(g.toLowerCase()),p=this.getWorkspaceFilePath(l.filePath);if(!p||!T.existsSync(p))continue;if(!m){let w=this.createRemoteDeletedItem("event",`${l.description||l.formEngineKey}/${l.eventType}`,g,t,p,l.updateTime);w&&r.push(w);continue}let h=this.normalizeCode(T.readFileSync(p,"utf-8")),f=this.normalizeCode(m.V8Code||""),y=this.isLocalModified(p,l.updateTime),S=this.isRemoteNewer(m.UpdateTime,l.updateTime);if(h===f){(y||S)&&m.UpdateTime&&(l.updateTime=m.UpdateTime,this.touchSyncedFile(p,m.UpdateTime),d=!0);continue}let C=this.classifyDifference(y,S,h,f);C&&r.push({kind:"event",status:C,name:`${m.Description||l.formEngineKey}/${l.eventType}`,key:g,serverDir:t,filePath:p,localCode:h,remoteCode:f,localUpdateTime:l.updateTime,remoteUpdateTime:m.UpdateTime})}if(d&&this.saveMeta(n,t),i)return;let u=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()||u.has(l.toLowerCase())||r.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,r,i){let s=$.getInstance(),o=new Map;for(let d of Object.entries(n.fields||{})){if(!this.matchesTargetFile(d[1].filePath,i))continue;let u=o.get(d[1].tableId||d[1].tableName)||[];u.push(d),o.set(d[1].tableId||d[1].tableName,u)}let c=!1;await this.runInBatches([...o.values()],i?1:2,async d=>{let u=d[0][1],g=await s.get(L.GET_FIELD_LIST,{osClient:e.osClient,tableId:u.tableId,tableName:u.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[${u.tableName}]: ${g.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let l=new Map(g.Data.List.map(m=>[String(m.Name||"").toLowerCase(),m]));for(let[m,p]of d){let h=l.get(p.fieldName.toLowerCase()),f=this.getWorkspaceFilePath(p.filePath);if(!f||!T.existsSync(f))continue;if(!h||!String(h[p.v8Key]||"").trim()){let b=this.createRemoteDeletedItem("field",`${p.tableName}.${p.fieldName}/${p.v8Key}`,m,t,f,p.updateTime);b&&r.push(b);continue}let y=this.normalizeCode(T.readFileSync(f,"utf-8")),S=this.normalizeCode(String(h[p.v8Key]||"")),C=String(h.UpdateTime||""),w=this.isLocalModified(f,p.updateTime),R=this.isRemoteNewer(C,p.updateTime);if(y===S){(w||R)&&C&&(p.updateTime=C,this.touchSyncedFile(f,C),c=!0);continue}let E=this.classifyDifference(w,R,y,S);E&&r.push({kind:"field",status:E,name:`${p.tableName}.${p.fieldName}/${p.v8Key}`,key:m,serverDir:t,filePath:f,localCode:y,remoteCode:S,localUpdateTime:p.updateTime,remoteUpdateTime:C})}}),c&&this.saveMeta(n,t)}async collectMenuButtonDifferences(e,t,n,r,i){let s=$.getInstance(),o=new Map;if(!i)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,i))continue;let m=o.get(l[1].moduleId)||[];m.push(l),o.set(l[1].moduleId,m)}let c=[];if(!i){let l=await s.get(L.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)),u=new Map(c.map(l=>[l.Id,l]));for(let l of c){if(d.has(l.Id)||n.menus?.[l.Id])continue;let m=l.Label||l.Name||l.Id;r.push({kind:"menuButton",status:"remoteModified",name:`${m}/\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()],i?1:2,async([l,m])=>{let p=()=>{for(let[R,E]of m){let b=this.getWorkspaceFilePath(E.filePath);if(!b)continue;let V=this.createRemoteDeletedItem("menuButton",`${E.moduleName}/${E.btnName}/${E.v8SubField}`,R,t,b,E.updateTime);V&&r.push(V)}};if(!i&&!u.has(l)){p();return}let h=await s.get(L.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 R of Object.keys(Ke)){let E=[];try{let b=f[R];E=typeof b=="string"?JSON.parse(b):Array.isArray(b)?b:[],Array.isArray(E)||(E=[])}catch{E=[]}S.set(R,new Map(E.map(b=>[String(b.Id||""),b])))}for(let[R,E]of m){let b=S.get(E.btnField)?.get(E.btnId),V=this.getWorkspaceFilePath(E.filePath);if(!V||!T.existsSync(V))continue;if(!b||!String(b[E.v8SubField]||"").trim()){let k=this.createRemoteDeletedItem("menuButton",`${E.moduleName}/${E.btnName}/${E.v8SubField}`,R,t,V,E.updateTime);k&&r.push(k);continue}let U=this.normalizeCode(T.readFileSync(V,"utf-8")),F=this.normalizeCode(String(b[E.v8SubField]||"")),P=this.isLocalModified(V,E.updateTime),O=this.isRemoteNewer(y,E.updateTime);if(U===F){(P||O)&&y&&(E.updateTime=y,this.touchSyncedFile(V,y),g=!0);continue}let A=this.classifyDifference(P,O,U,F);A&&r.push({kind:"menuButton",status:A,name:`${E.moduleName}/${E.btnName}/${E.v8SubField}`,key:R,serverDir:t,filePath:V,localCode:U,remoteCode:F,localUpdateTime:E.updateTime,remoteUpdateTime:y})}if(i)return;let C=new Set(m.map(([R])=>R)),w=n.menus?.[l]?.moduleName||u.get(l)?.Label||u.get(l)?.Name||l;for(let[R,E]of S)for(let[b,V]of E){if(!b)continue;let U=String(V.Name||b);for(let F of["V8Code","V8CodeShow"]){let P=String(V[F]||""),O=this.getMenuButtonMetaKey(l,R,b,F);!P.trim()||C.has(O)||r.push({kind:"menuButton",status:"remoteModified",name:`${w}/${U}/${F}`,key:O,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"module",O),localCode:"",remoteCode:this.normalizeCode(P),localUpdateTime:"",remoteUpdateTime:y})}}}),g&&this.saveMeta(n,t)}async collectMenuScriptDifferences(e,t,n,r,i){let s=$.getInstance(),o=Object.entries(n.menuScripts||{}).filter(([,d])=>this.matchesTargetFile(d.filePath,i)),c=!1;await this.runInBatches(o,i?1:2,async([d,u])=>{let g=this.getWorkspaceFilePath(u.filePath);if(!g||!T.existsSync(g))return;let l=await s.get(L.GET_MODULE,{osClient:e.osClient,moduleId:u.moduleId},e.apiBaseUrl,e);if(l.Code!==1||!l.Data){if(/不存在|not\s*found/i.test(String(l.Msg||""))){let w=this.createRemoteDeletedItem("menuScript",`${u.moduleName}/${u.scriptField}`,d,t,g,u.updateTime);w&&r.push(w);return}throw new Error(`\u83B7\u53D6\u6A21\u5757 Join/Where \u540C\u6B65\u72B6\u6001\u5931\u8D25[${u.moduleId}]: ${l.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`)}let m=l.Data,p=this.normalizeCode(String(m[u.scriptField]||"")),h=this.normalizeCode(T.readFileSync(g,"utf-8")),f=String(m.UpdateTime||""),y=this.isLocalModified(g,u.updateTime),S=this.sourceHash(p)!==u.codeHash;if(h===p){(y||S||f&&f!==u.updateTime)&&(u.codeHash=this.sourceHash(p),u.updateTime=f||u.updateTime,this.touchSyncedFile(g,u.updateTime),c=!0);return}let C=this.classifyDifference(y,S,h,p);C&&r.push({kind:"menuScript",status:C,name:`${u.moduleName}/${u.scriptField}`,key:d,serverDir:t,filePath:g,localCode:h,remoteCode:p,localUpdateTime:u.updateTime,remoteUpdateTime:f})}),c&&this.saveMeta(n,t)}async runInBatches(e,t,n){for(let r=0;r<e.length;r+=t)await Promise.all(e.slice(r,r+t).map(i=>n(i))),r+t<e.length&&await new Promise(i=>setTimeout(i,120))}async collectWorkflowDifferences(e,t,n,r,i){let o=await $.getInstance().get(L.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,i))continue;let m=c.get(g),p=this.getWorkspaceFilePath(l.filePath);if(!p||!T.existsSync(p))continue;if(!m||!String(m.V8Code||m.Code||"").trim()){let w=this.createRemoteDeletedItem("workflow",`${l.flowName}/${l.nodeName}/${l.eventType}`,g,t,p,l.updateTime);w&&r.push(w);continue}let h=this.normalizeCode(T.readFileSync(p,"utf-8")),f=this.normalizeCode(m.V8Code||m.Code||""),y=this.isLocalModified(p,l.updateTime),S=this.isRemoteNewer(m.UpdateTime,l.updateTime);if(h===f){(y||S)&&m.UpdateTime&&(l.updateTime=m.UpdateTime,this.touchSyncedFile(p,m.UpdateTime),d=!0);continue}let C=this.classifyDifference(y,S,h,f);if(C){let w=`${m.FlowName||l.flowName}/${m.NodeName||l.nodeName}/${m.EventType||l.eventType}`;r.push({kind:"workflow",status:C,name:w,key:g,serverDir:t,filePath:p,localCode:h,remoteCode:f,localUpdateTime:l.updateTime,remoteUpdateTime:m.UpdateTime})}}if(d&&this.saveMeta(n,t),i)return;let u=new Set(Object.keys(n.workflowNodeEvents||{}));for(let g of o.Data.List){let l=`${g.FlowDesignId}__${g.NodeId}__${g.EventType}`,m=g.V8Code||g.Code||"";if(!m.trim()||u.has(l))continue;let p=`${g.FlowName||g.FlowDesignId}/${g.NodeName||g.NodeId}/${g.EventType}`;r.push({kind:"workflow",status:"remoteModified",name:p,key:l,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"workflow",l),localCode:"",remoteCode:this.normalizeCode(m),localUpdateTime:"",remoteUpdateTime:g.UpdateTime})}}migrateFromFlatMeta(e){let t=I.getInstance();try{let n=t.getSyncRootDir(),r=v.join(n,Be);if(!T.existsSync(r))return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};let i=t.getWorkspaceRoot();if(!i)return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};let s=JSON.parse(T.readFileSync(r,"utf-8")),o=s.engines||{},c=s.events||{},d={engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};for(let[u,g]of Object.entries(o)){let l=g;if(l.filePath){let m=v.join(i,l.filePath);v.relative(n,m).split(v.sep)[0]===e&&(d.engines[u]=l)}}for(let[u,g]of Object.entries(c)){let l=g;if(l.filePath){let m=v.join(i,l.filePath);v.relative(n,m).split(v.sep)[0]===e&&(d.events[u]=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){_.warn("Microi: \u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u670D\u52A1\u5668\uFF0C\u8BF7\u5148\u5728\u8BBE\u7F6E\u4E2D\u6DFB\u52A0\u8FDE\u63A5\u5E76\u767B\u5F55");return}for(let n of t)try{await this.pullEnginesForProfile(n)}catch(r){let i=r instanceof Error?r.message:String(r);this.log(`\u62C9\u53D6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${i}`),_.error(`Microi: \u62C9\u53D6 [${n.label||n.apiBaseUrl}] \u5931\u8D25 - ${i}`)}return}await this.pullEnginesForProfile(e)}async pullEnginesForProfile(e){let t=I.getInstance(),n=$.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE\u4EE3\u7801 [${e.label||r}]...`),await le.withProgress({location:$e.Notification,title:`Microi: \u62C9\u53D6\u63A5\u53E3\u5F15\u64CE [${e.label||r}]`,cancellable:!1},async s=>{s.report({message:"\u68C0\u67E5\u540E\u7AEF\u72B6\u6001..."});let o=await n.get(L.GET_STATUS,void 0,r,e);if(o.Code!==1){let A=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}${A}`)}s.report({message:"\u83B7\u53D6\u7CFB\u7EDF\u914D\u7F6E..."});let d=await pe.getInstance().getSysConfig(r,i),u=d?.SysShortTitle||"",g=d?.SysTitle||"",l=u||g||d?.CompanyName||e.label||"";l&&(l!==e.label||u!==e.sysShortTitle||g!==e.sysTitle)&&await t.addProfile({...e,label:l,sysShortTitle:u,sysTitle:g}),s.report({message:"\u83B7\u53D6\u63A5\u53E3\u5F15\u64CE\u5217\u8868..."});let m=await n.get(L.GET_ENGINE_LIST,{osClient:i},r,e);if(m.Code!==1){let A=m.Code===1001||m.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u5217\u8868\u5931\u8D25: ${m.Msg||"Code="+m.Code}${A}`)}let{OsClient:p,OsClientType:h,OsClientNetwork:f,List:y,Total:S}=m.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 A={...e,osClientType:h,osClientNetwork:f};await t.addProfile(A)}let C=t.getSyncRootDir(),w=t.buildServerDirName(l,r),R=this.loadMeta(w),E=0,b=0,V=[],U=new Set,F=new Set,P=t.buildOsClientDirName(p,h,f);for(let A of y)try{let k=H(A.Category||"\u672A\u5206\u7C7B"),x=H(A.ApiName||A.ApiEngineKey),j=v.join(C,w,P,Ue,k),G=H(`${x}(${tn(A.ApiEngineKey)}).js`),ne=v.join(j,G),oe=nn(A.ApiV8Code||"");if(!oe.trim()){b++,T.existsSync(ne)&&this.backupAndDeleteSyncFile(ne,w,"remote-deleted-api"),delete R.engines[A.ApiEngineKey];continue}U.add(A.ApiEngineKey),re(j),T.writeFileSync(ne,oe,"utf-8");let q=new Date(A.UpdateTime);isNaN(q.getTime())||T.utimesSync(ne,q,q),R.engines[A.ApiEngineKey]={id:A.Id,apiName:A.ApiName,category:k,apiAddress:A.ApiAddress,updateTime:A.UpdateTime,filePath:v.relative(t.getWorkspaceRoot(),ne)},E++,s.report({message:`${E}/${S} ${A.ApiEngineKey}`,increment:1/S*100})}catch(k){let x=k instanceof Error?k.message:String(k);F.add(A.ApiEngineKey),V.push(`${A.ApiEngineKey}: ${x}`),this.log(`\u63A5\u53E3\u5F15\u64CE\u6587\u4EF6\u5199\u5165\u5931\u8D25\uFF0C\u7EE7\u7EED\u4E0B\u4E00\u9879 [${A.ApiEngineKey}]: ${x}`)}for(let[A,k]of Object.entries(R.engines)){if(U.has(A)||F.has(A))continue;let x=this.getWorkspaceFilePath(k.filePath);x&&this.backupAndDeleteSyncFile(x,w,"remote-deleted-api"),delete R.engines[A]}this.saveMeta(R,w);let O=l||e.label||r;this.log(`[${O}] \u62C9\u53D6\u5B8C\u6210: ${E} \u4E2A\u63A5\u53E3\u5F15\u64CE\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${b} \u9879\uFF0C\u5931\u8D25 ${V.length} \u9879`),V.length>0?_.warn(`Microi: [${O}] \u5DF2\u62C9\u53D6 ${E} \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`):_.info(`Microi: [${O}] \u6210\u529F\u62C9\u53D6 ${E} \u4E2A\u63A5\u53E3\u5F15\u64CE${b>0?`\uFF08\u8DF3\u8FC7 ${b} \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(r){let i=r instanceof Error?r.message:String(r);this.log(`\u62C9\u53D6V8\u4E8B\u4EF6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${i}`)}return}await this.pullEventsForProfile(e)}async pullEventsForProfile(e){let t=I.getInstance(),n=$.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6V8\u4E8B\u4EF6\u4EE3\u7801 [${e.label||r}]...`),await le.withProgress({location:$e.Notification,title:`Microi: \u62C9\u53D6V8\u4E8B\u4EF6 [${e.label||r}]`,cancellable:!1},async s=>{s.report({message:"\u83B7\u53D6V8\u4E8B\u4EF6\u5217\u8868..."});let o=await n.get(L.GET_EVENT_LIST,{osClient:i},r,e);if(o.Code!==1){let P=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}${P}`)}let{List:c,Total:d}=o.Data;this.log(`\u83B7\u53D6\u5230 ${d} \u4E2AV8\u4E8B\u4EF6`);let g=await pe.getInstance().getSysConfig(r,i),l=g?.SysShortTitle||"",m=g?.SysTitle||"",p=l||m||g?.CompanyName||e.label||"";p&&(p!==e.label||l!==e.sysShortTitle||m!==e.sysTitle)&&await t.addProfile({...e,label:p,sysShortTitle:l,sysTitle:m});let h=t.getSyncRootDir(),f=t.buildServerDirName(p,r),y=this.loadMeta(f),S=0,C=0,w=0,R=new Set(c.map(P=>`${P.FormEngineKey}__${P.EventType}`)),b=t.getProfiles().find(P=>P.apiBaseUrl===e.apiBaseUrl&&P.osClient===e.osClient)||e;if(!b.osClientType||!b.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(i,b.osClientType,b.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 P of c){let O=P.V8Code||"",A=H(P.Description?`${P.Description}\uFF08${P.FormEngineKey}\uFF09`:P.FormEngineKey),k=kn[P.EventType]||P.EventType,x=H(`${k}\uFF08${P.EventType}\uFF09`)+".js",j=v.join(h,f,V,be,A,St);re(j);let G=v.join(j,x),ne=U[P.EventType];if(ne){let ge=H(`${ne}\uFF08${P.EventType}\uFF09`)+".js",Z=v.join(j,ge);Z!==G&&T.existsSync(Z)&&!this.isLocalModified(Z,P.UpdateTime)&&(T.existsSync(G)?T.unlinkSync(Z):T.renameSync(Z,G))}let oe=`${P.FormEngineKey}__${P.EventType}`;if(y.events[oe]={id:P.Id,formEngineKey:P.FormEngineKey,description:P.Description||"",eventType:P.EventType,updateTime:P.UpdateTime,filePath:v.relative(t.getWorkspaceRoot(),G)},!O.trim()){T.existsSync(G)&&this.backupAndDeleteSyncFile(G,f,"remote-deleted-form-event"),w++,S++,s.report({message:`${S}/${d}`,increment:d>0?1/d*100:void 0});continue}T.writeFileSync(G,O,"utf-8");let q=new Date(P.UpdateTime);isNaN(q.getTime())||T.utimesSync(G,q,q),C++,S++,s.report({message:`${S}/${d}`,increment:d>0?1/d*100:void 0})}for(let[P,O]of Object.entries(y.events)){if(R.has(P))continue;let A=this.getWorkspaceFilePath(O.filePath);A&&this.backupAndDeleteSyncFile(A,f,"remote-deleted-form-event"),delete y.events[P]}this.saveMeta(y,f);let F=p||e.label||r;this.log(`[${F}] \u62C9\u53D6\u5B8C\u6210: ${C} \u4E2AV8\u4E8B\u4EF6\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${w} \u9879`),_.info(`Microi: [${F}] \u6210\u529F\u62C9\u53D6 ${C} \u4E2AV8\u4E8B\u4EF6\u6587\u4EF6${w>0?`\uFF08\u8DF3\u8FC7 ${w} \u4E2A\u7A7A\u4EE3\u7801\u4E8B\u4EF6\uFF09`:""}`)})}async pullWorkflows(e){if(!e){let t=I.getInstance().getProfiles();if(t.length===0)return;for(let n of t)try{await this.pullWorkflowsForProfile(n)}catch(r){let i=r instanceof Error?r.message:String(r);this.log(`\u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${i}`)}return}await this.pullWorkflowsForProfile(e)}async pullWorkflowsForProfile(e){let t=I.getInstance(),n=$.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE\u8282\u70B9 V8 [${e.label||r}]...`),await le.withProgress({location:$e.Notification,title:`Microi: \u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE [${e.label||r}]`,cancellable:!1},async s=>{s.report({message:"\u83B7\u53D6\u6D41\u7A0B\u8282\u70B9V8\u5217\u8868..."});let o=await n.get(L.GET_WORKFLOW_V8_EVENT_LIST,{osClient:i},r,e);if(o.Code!==1){let k=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}${k}`)}let d=await pe.getInstance().getSysConfig(r,i),u=d?.SysShortTitle||"",g=d?.SysTitle||"",l=u||g||d?.CompanyName||e.label||"";l&&(l!==e.label||u!==e.sysShortTitle||g!==e.sysTitle)&&await t.addProfile({...e,label:l,sysShortTitle:u,sysTitle:g});let p=t.getProfiles().find(k=>k.apiBaseUrl===e.apiBaseUrl&&k.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||i,f=t.buildServerDirName(l,r),y=t.buildOsClientDirName(h,p.osClientType,p.osClientNetwork),S=t.getSyncRootDir(),C=this.loadMeta(f);C.workflows||(C.workflows={}),C.workflowNodeEvents||(C.workflowNodeEvents={});let w=o.Data.Flows||[],R=o.Data.Nodes||[],E=o.Data.Lines||[],b=o.Data.List||[],V=new Map(w.map(k=>[String(k.Id||""),k])),U=new Set(w.map(k=>String(k.Id||"")).filter(Boolean)),F=new Set(b.filter(k=>String(k.V8Code||k.Code||"").trim()).map(k=>`${k.FlowDesignId}__${k.NodeId}__${k.EventType}`)),P=0,O=0;for(let k of w){let x=String(k.Id||"");if(!x)continue;let j=String(k.FlowName||x),G=String(k.UpdateTime||fe()),ne=v.join(S,f,y,je,H(`${j}\uFF08${x}\uFF09`));re(ne);let oe=R.filter(Z=>String(Z.FlowDesignId||"")===x),q=E.filter(Z=>String(Z.FlowDesignId||"")===x),ge=v.join(ne,"\u6D41\u7A0B\u8BBE\u8BA1\u56FE\uFF08WF_FlowDesign\uFF09.json");T.writeFileSync(ge,JSON.stringify({FlowDesign:k,Nodes:oe,Lines:q},null,2),"utf-8"),this.touchSyncedFile(ge,G),C.workflows[x]={flowDesignId:x,flowName:j,updateTime:G,filePath:v.relative(t.getWorkspaceRoot(),ge)}}for(let k of b){let x=String(k.FlowDesignId||""),j=String(k.NodeId||""),G=String(k.EventType||"");if(!x||!j||!G)continue;let ne=V.get(x),oe=String(k.FlowName||ne?.FlowName||x),q=String(k.NodeName||j),ge=Dn[G]||k.EventName||G,Z=v.join(S,f,y,je,H(`${oe}\uFF08${x}\uFF09`),Ct,H(`${q}\uFF08${j}\uFF09`));re(Z);let N=v.join(Z,H(`${ge}\uFF08${G}\uFF09`)+".js"),ae=k.V8Code||k.Code||"",Q=String(k.UpdateTime||ne?.UpdateTime||fe());if(C.workflowNodeEvents[`${x}__${j}__${G}`]={flowDesignId:x,flowName:oe,nodeId:j,nodeName:q,eventType:G,updateTime:Q,filePath:v.relative(t.getWorkspaceRoot(),N)},!ae.trim()){T.existsSync(N)&&this.backupAndDeleteSyncFile(N,f,"remote-deleted-workflow-event"),O++,s.report({message:`${P}/${b.length} ${oe}/${q}`});continue}T.writeFileSync(N,ae,"utf-8"),this.touchSyncedFile(N,Q),P++,s.report({message:`${P}/${b.length} ${oe}/${q}`})}for(let[k,x]of Object.entries(C.workflowNodeEvents)){if(F.has(k))continue;let j=this.getWorkspaceFilePath(x.filePath);j&&this.backupAndDeleteSyncFile(j,f,"remote-deleted-workflow-event"),delete C.workflowNodeEvents[k]}for(let[k,x]of Object.entries(C.workflows)){if(U.has(k))continue;let j=this.getWorkspaceFilePath(x.filePath);j&&this.backupAndDeleteSyncFile(j,f,"remote-deleted-workflow"),delete C.workflows[k]}this.saveMeta(C,f);let A=l||e.label||r;this.log(`[${A}] \u6D41\u7A0B\u5F15\u64CE\u62C9\u53D6\u5B8C\u6210: ${w.length} \u4E2A\u6D41\u7A0B\uFF0C${P} \u4E2A\u8282\u70B9V8\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${O} \u9879`),_.info(`Microi: [${A}] \u6210\u529F\u62C9\u53D6 ${w.length} \u4E2A\u6D41\u7A0B\u3001${P} \u4E2A\u6D41\u7A0B\u8282\u70B9V8\u6587\u4EF6${O>0?`\uFF08\u8DF3\u8FC7 ${O} \u4E2A\u7A7A\u4EE3\u7801\u4E8B\u4EF6\uFF09`:""}`)})}findProfileByServerDir(e){let t=I.getInstance(),n=t.getProfiles();for(let r of n)if(t.buildServerDirName(r.label,r.apiBaseUrl)===e)return r}hasSyncBaseline(e,t){let n=v.resolve(e).toLowerCase(),r=this.loadMeta(t);return[r.engines,r.events,r.fields||{},r.menuButtons||{},r.menuScripts||{},r.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,r){if(!n){let i=`\u65E0\u6CD5\u8BC6\u522B\u6587\u4EF6\u6240\u5C5E\u670D\u52A1\u5668\u914D\u7F6E\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\uFF1A${e}`;return this.log(i),_.error(`Microi: ${i}`),!1}if(!this.hasSyncBaseline(e,t)){let i=`\u6587\u4EF6\u6CA1\u6709\u540C\u6B65\u57FA\u7EBF\uFF0C\u65E0\u6CD5\u786E\u8BA4\u670D\u52A1\u5668\u7AEF\u662F\u5426\u66F4\u65B0\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\u3002\u8BF7\u5148\u62C9\u53D6\u5BF9\u5E94\u5F15\u64CE\uFF1A${e}`;return this.log(i),_.error(`Microi: ${i}`),!1}try{let i=await this.checkRemoteDifferences(n,r,e),s=v.resolve(e).toLowerCase(),o=i.find(u=>v.resolve(u.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),_.error(`Microi: ${d}`),!1}catch(i){let s=i instanceof Error?i.message:String(i);return this.log(`\u63A8\u9001\u524D\u540C\u6B65\u72B6\u6001\u68C0\u6D4B\u5931\u8D25\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\uFF1A${s}`),_.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 r=I.getInstance().getSyncRootDir();if(v.extname(e).toLowerCase()===".js"&&T.existsSync(e)){let g=On(Ee(T.readFileSync(e,"utf-8")));if(g.length>0){let l=g[0],m=`\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(m),_.error(`Microi: ${m}`),!1}}let i=Mn(e,r);if(i){let g=this.findProfileByServerDir(i.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,i.serverDir,g,"api")?!1:this.pushEngineFile(e,i,g)}let s=Nn(e,r);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=An(e,r);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=Fn(e,r);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=Vn(e,r);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 u=xn(e,r);if(u){let g=this.findProfileByServerDir(u.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,u.serverDir,g,"workflow")?!1:this.pushWorkflowNodeFile(e,u,g)}return this.log(`\u65E0\u6CD5\u89E3\u6790\u6587\u4EF6\u8DEF\u5F84: ${e}`),!1}async pushEngineFile(e,t,n){let r=$.getInstance(),i=T.readFileSync(e,"utf-8"),s=Ee(i);this.log(`\u63A8\u9001\u63A5\u53E3\u5F15\u64CE: ${t.apiEngineKey}...`);try{let o="",c="";try{let m=await r.post(L.GET_ENGINE_CODE,{OsClient:t.osClient,ApiEngineKey:t.apiEngineKey},void 0,n?.apiBaseUrl,n);m.Code===1&&m.Data&&(o=m.Data.ApiV8Code||m.Data.Code||"",c=m.Data.Version||"")}catch{o="",c=""}let d=!s.trim(),u=d?{code:"",version:c,changeHistory:""}:ot({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(u.code,"utf8").toString("base64")};d||(g.Version=u.version,g.ChangeHistory=u.changeHistory);let l=await r.post(L.UPDATE_ENGINE_CODE,g,void 0,n?.apiBaseUrl,n);if(l.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.apiEngineKey}`);let m=l.Data?.UpdateTime||fe(),p=this.loadMeta(t.serverDir);if(d?delete p.engines[t.apiEngineKey]:p.engines[t.apiEngineKey]&&(p.engines[t.apiEngineKey].updateTime=m),this.saveMeta(p,t.serverDir),d)T.existsSync(e)&&T.unlinkSync(e);else{T.writeFileSync(e,u.code,"utf-8");let h=new Date(m);isNaN(h.getTime())||T.utimesSync(e,h,h)}return!0}else return this.log(`\u63A8\u9001\u5931\u8D25: ${t.apiEngineKey} - ${l.Msg}`),_.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}`),_.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async pushEventFile(e,t,n){let r=$.getInstance(),i=T.readFileSync(e,"utf-8"),s=Ee(i);this.log(`\u63A8\u9001V8\u4E8B\u4EF6: ${t.formEngineKey}/${t.eventType}...`);try{let o="",c="";try{let m=await r.post(L.GET_EVENT_CODE,{OsClient:t.osClient,FormEngineKey:t.formEngineKey,EventType:t.eventType},void 0,n?.apiBaseUrl,n);m.Code===1&&m.Data&&(o=m.Data.V8Code||m.Data.Code||"",c=m.Data.Version||"")}catch{o="",c=""}let d=!s.trim(),u=d?{code:"",version:c,changeHistory:""}:ot({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:u.code};d||(g.Version=u.version,g.ChangeHistory=u.changeHistory);let l=await r.post(L.UPDATE_EVENT_CODE,g,void 0,n?.apiBaseUrl,n);if(l.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.formEngineKey}/${t.eventType}`);let m=l.Data?.UpdateTime||fe(),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:m,filePath:v.relative(I.getInstance().getWorkspaceRoot(),e)}}if(this.saveMeta(p,t.serverDir),d)T.existsSync(e)&&T.unlinkSync(e);else{T.writeFileSync(e,u.code,"utf-8");let f=new Date(m);isNaN(f.getTime())||T.utimesSync(e,f,f)}return!0}else return this.log(`\u63A8\u9001\u5931\u8D25: ${t.formEngineKey}/${t.eventType} - ${l.Msg}`),_.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}`),_.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async createEngine(e){let t=$.getInstance(),n=I.getInstance();this.log(`\u521B\u5EFA\u63A5\u53E3\u5F15\u64CE: ${e.apiEngineKey}...`);try{let r=ot({kind:"ApiEngine",key:e.apiEngineKey,currentCode:"",functionDescription:`\u63A5\u53E3\u5F15\u64CE ${e.apiName} \u7684\u5B8C\u6574\u4E1A\u52A1\u903B\u8F91\u3002`,changeSummary:`\u901A\u8FC7 VS Code \u521B\u5EFA\u63A5\u53E3\u5F15\u64CE ${e.apiEngineKey}`,initial:!0}),i=await t.post(L.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(r.code,"utf8").toString("base64"),Version:r.version,ChangeHistory:r.changeHistory},void 0,e.profile.apiBaseUrl,e.profile);if(i.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"),u=H(e.apiName||e.apiEngineKey),g=v.join(s,o,c,Ue,d);re(g);let l=v.join(g,H(`${u}(${tn(e.apiEngineKey)}).js`));T.writeFileSync(l,r.code,"utf-8");let m=this.loadMeta(o);return m.engines[e.apiEngineKey]={id:"",apiName:e.apiName,category:d,apiAddress:e.apiAddress||"",updateTime:fe(),filePath:v.relative(n.getWorkspaceRoot(),l)},this.saveMeta(m,o),this.log(`\u521B\u5EFA\u6210\u529F: ${e.apiEngineKey}`),_.info(`Microi: \u63A5\u53E3\u5F15\u64CE [${e.apiEngineKey}] \u521B\u5EFA\u6210\u529F`),await le.showTextDocument(Tn.file(l)),!0}else return this.log(`\u521B\u5EFA\u5931\u8D25: ${e.apiEngineKey} - ${i.Msg}`),_.error(`Microi: \u521B\u5EFA\u5931\u8D25 - ${i.Msg}`),!1}catch(r){let i=r instanceof Error?r.message:String(r);return this.log(`\u521B\u5EFA\u5F02\u5E38: ${e.apiEngineKey} - ${i}`),_.error(`Microi: \u521B\u5EFA\u5F02\u5E38 - ${i}`),!1}}async pullFields(e){if(!e){let t=I.getInstance().getProfiles();for(let n of t)try{await this.pullFieldsForProfile(n)}catch(r){this.log(`\u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${r instanceof Error?r.message:String(r)}`)}return}await this.pullFieldsForProfile(e)}async pullFieldsForTableFolder(e){let n=I.getInstance().getSyncRootDir(),r=v.relative(n,e).split(v.sep);if(r.length<4||r[2]!==be){_.warn("Microi: \u8BF7\u5728\u201C\u8868\u5355\u5F15\u64CE\u201D\u4E0B\u7684\u8868\u76EE\u5F55\u6267\u884C\u5B57\u6BB5 V8 \u4E8B\u4EF6\u62C9\u53D6");return}let i=o=>{let c=o.match(/[((]([^))]+)[))]\s*$/);return c?c[1]:o},s=this.findProfileByServerDir(r[0]);if(!s){_.error(`Microi: \u672A\u627E\u5230\u4E0E\u76EE\u5F55 "${r[0]}" \u5339\u914D\u7684\u670D\u52A1\u5668\u8FDE\u63A5`);return}await this.pullFieldsForTable(s,i(r[3]),e,r[0])}async pullFieldsForTable(e,t,n,r){let i=I.getInstance(),s=$.getInstance(),o=this.loadMeta(r);o.fields||(o.fields={}),this.log(`\u62C9\u53D6\u8868\u5B57\u6BB5V8\u4E8B\u4EF6: ${t}...`);let c=await s.get(L.GET_FIELD_LIST,{osClient:e.osClient,tableName:t},e.apiBaseUrl,e);if(c.Code!==1){_.error(`Microi: \u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 - ${c.Msg}`);return}let d=c.Data.List||[],u=["V8Code","KeyupV8Code","V8TmpEngineTable","V8TmpEngineForm"],g=0,l=0;for(let m of d){let p=H(m.Label?`${m.Label}\uFF08${m.Name}\uFF09`:m.Name),h=v.join(n,Ze,p);for(let f of u){let y=(m[f]||"").toString(),S=Ht[f]||f,C=H(`${S}\uFF08${f}\uFF09`)+".js",w=v.join(h,C),R=`${t}__${m.Name}__${f}`;if(!y.trim()){l++,T.existsSync(w)&&T.unlinkSync(w),delete o.fields[R];continue}re(h),T.writeFileSync(w,y,"utf-8");let E=new Date(m.UpdateTime);isNaN(E.getTime())||T.utimesSync(w,E,E),o.fields[R]={fieldId:m.Id,tableId:m.TableId,tableName:t,fieldName:m.Name,fieldLabel:m.Label||"",v8Key:f,updateTime:m.UpdateTime,filePath:v.relative(i.getWorkspaceRoot(),w)},g++}}this.saveMeta(o,r),_.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=$.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6 [${e.label||r}]...`),await le.withProgress({location:$e.Notification,title:`Microi: \u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6 [${e.label||r}]`,cancellable:!1},async s=>{s.report({message:"\u83B7\u53D6\u8868\u5217\u8868..."});let o=await n.get(L.GET_DB_SCHEMA,{osClient:i},r,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||[],u=await pe.getInstance().getSysConfig(r,i),g=u?.SysShortTitle||"",l=u?.SysTitle||"",m=g||l||e.label||"",p=t.buildServerDirName(m,r),h=this.loadMeta(p);h.fields||(h.fields={});let y=t.getProfiles().find(F=>F.apiBaseUrl===e.apiBaseUrl&&F.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(i,y.osClientType,y.osClientNetwork),C=t.getSyncRootDir(),w=["V8Code","KeyupV8Code","V8TmpEngineTable","V8TmpEngineForm"],R=0,E=0,b=0,V=new Set,U=new Set;for(let F of c){b++,s.report({message:`[${b}/${c.length}] ${F.Name}`});let P=await n.get(L.GET_FIELD_LIST,{osClient:i,tableId:F.Id},r,e);if(P.Code!==1){U.add(F.Name.toLowerCase()),this.log(` \u8DF3\u8FC7\u8868 ${F.Name}: ${P.Msg}`);continue}let O=P.Data.List||[],A=H(F.Description?`${F.Description}\uFF08${F.Name}\uFF09`:F.Name);for(let k of O)for(let x of w){let j=(k[x]||"").toString();if(!j.trim()){E++;continue}let G=H(k.Label?`${k.Label}\uFF08${k.Name}\uFF09`:k.Name),ne=Ht[x]||x,oe=H(`${ne}\uFF08${x}\uFF09`)+".js",q=v.join(C,p,S,be,A,Ze,G);re(q);let ge=v.join(q,oe);T.writeFileSync(ge,j,"utf-8");let Z=new Date(k.UpdateTime);isNaN(Z.getTime())||T.utimesSync(ge,Z,Z);let N=`${F.Name}__${k.Name}__${x}`;V.add(N),h.fields[N]={fieldId:k.Id,tableId:k.TableId,tableName:F.Name,fieldName:k.Name,fieldLabel:k.Label||"",v8Key:x,updateTime:k.UpdateTime,filePath:v.relative(t.getWorkspaceRoot(),ge)},R++}}for(let[F,P]of Object.entries(h.fields)){if(V.has(F)||U.has(P.tableName.toLowerCase()))continue;let O=this.getWorkspaceFilePath(P.filePath);O&&this.backupAndDeleteSyncFile(O,p,"remote-deleted-field-event"),delete h.fields[F]}this.saveMeta(h,p),this.log(`\u5B57\u6BB5V8\u4E8B\u4EF6\u62C9\u53D6\u5B8C\u6210: ${R} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${E} \u9879`),_.info(`Microi: \u6210\u529F\u62C9\u53D6 ${R} \u4E2A\u5B57\u6BB5V8\u4E8B\u4EF6${E>0?`\uFF08\u8DF3\u8FC7 ${E} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)})}async pushFieldFile(e,t,n){let r=$.getInstance(),i=Ee(T.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u5B57\u6BB5V8\u4E8B\u4EF6: ${t.tableName}/${t.fieldName}/${t.v8Key}...`);try{let s=await r.post(L.UPDATE_FIELD,{OsClient:t.osClient,TableName:t.tableName,Name:t.fieldName,[t.v8Key]:i},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||fe();return i.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),i.trim()?this.touchSyncedFile(e,d):T.existsSync(e)&&T.unlinkSync(e),!0}return this.log(`\u63A8\u9001\u5931\u8D25: ${s.Msg}`),_.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}`),_.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(r){this.log(`\u62C9\u53D6\u83DC\u5355\u6309\u94AE\u5931\u8D25 [${n.label||n.apiBaseUrl}]: ${r instanceof Error?r.message:String(r)}`)}return}await this.pullMenuButtonsForProfile(e)}async pullMenuButtonsForModuleFolder(e){let n=I.getInstance().getSyncRootDir(),r=v.relative(n,e).split(v.sep);if(r.length<4||r[2]!==_e){_.warn("Microi: \u8BF7\u5728\u201C\u6A21\u5757\u5F15\u64CE\u201D\u4E0B\u7684\u6A21\u5757\u76EE\u5F55\u6267\u884C\u62C9\u53D6");return}let i=this.findProfileByServerDir(r[0]);if(!i){_.error(`Microi: \u672A\u627E\u5230\u4E0E\u76EE\u5F55 "${r[0]}" \u5339\u914D\u7684\u670D\u52A1\u5668\u8FDE\u63A5`);return}let s=this.extractTrailingKey(v.basename(e));await this.pullMenuButtonsForProfile(i,s,r[0],r[1],e)}async pullMenuButtonsForProfile(e,t,n,r,i){let s=I.getInstance(),o=$.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 le.withProgress({location:$e.Notification,title:`Microi: \u62C9\u53D6\u6A21\u5757\u4EE3\u7801 [${e.label||c}]`,cancellable:!1},async u=>{let g=await o.get(L.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 pe.getInstance().getSysConfig(c,d),h=p?.SysShortTitle||"",f=p?.SysTitle||"",y=h||f||e.label||"",S=n||s.buildServerDirName(y,c),C=this.loadMeta(S);C.menus||(C.menus={}),C.menuButtons||(C.menuButtons={}),C.menuScripts||(C.menuScripts={});let R=s.getProfiles().find(N=>N.apiBaseUrl===e.apiBaseUrl&&N.osClient===e.osClient)||e;if(!R.osClientType||!R.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let E=r||s.buildOsClientDirName(d,R.osClientType,R.osClientNetwork),b=s.getSyncRootDir(),V=v.join(b,S,E,_e),U=Object.keys(Ke),F=Object.keys(et),P=0,O=0,A=0,k=0,x=0,j=new Map(l.map(N=>[N.Id,N])),G=new Map,ne=N=>N||"";for(let N of l){let ae=ne(N.ParentId);G.has(ae)||G.set(ae,[]),G.get(ae).push(N)}let oe=N=>N.sort((ae,Q)=>{let ue=typeof ae.Sort=="number"?ae.Sort:0,Qe=typeof Q.Sort=="number"?Q.Sort:0;return ue!==Qe?ue-Qe:String(ae.Name||ae.Label||"").localeCompare(String(Q.Name||Q.Label||""))}),q=t?j.get(t)?[j.get(t)]:[]:oe(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 ge=t?i||v.join(V,H(`${q[0].Label||q[0].Name||q[0].Id}\uFF08${q[0].Id}\uFF09`)):V;if(this.backupExistingTree(ge,S,t?"module-subtree":"module-engine"),!t)C.menus={},C.menuButtons={},C.menuScripts={};else{let N=new Set,ae=Q=>{if(!N.has(Q)){N.add(Q);for(let ue of G.get(Q)||[])ae(ue.Id)}};ae(t);for(let Q of N)delete C.menus[Q];for(let[Q,ue]of Object.entries(C.menuButtons))N.has(ue.moduleId)&&delete C.menuButtons[Q];for(let[Q,ue]of Object.entries(C.menuScripts))N.has(ue.moduleId)&&delete C.menuScripts[Q]}let Z=async(N,ae)=>{k++,u.report({message:`[${k}/${l.length}] ${N.Name||N.Label}`});let Q=N.Label||N.Name||N.Id,ue=v.join(ae,H(`${Q}\uFF08${N.Id}\uFF09`));re(ue);let Qe=oe(G.get(N.Id)||[]);if(Qe.length>0){for(let ee of Qe)await Z(ee,ue);return}let $t=await o.get(L.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 Lt=$t.Data,Ie=String(Lt.UpdateTime||fe()),mn={};for(let ee of F){let ft=String(Lt[ee]||""),Bt=et[ee]||ee,Re=v.join(ue,H(`${Bt}\uFF08${ee}\uFF09`)+".js");T.writeFileSync(Re,ft,"utf-8"),this.touchSyncedFile(Re,Ie),C.menuScripts[this.getMenuScriptMetaKey(N.Id,ee)]={moduleId:N.Id,moduleName:Q,scriptField:ee,codeHash:this.sourceHash(ft),updateTime:Ie,filePath:v.relative(s.getWorkspaceRoot(),Re)},A++}for(let ee of U){let ft=Ke[ee]||ee,Bt=H(`${ft}\uFF08${ee}\uFF09`),Re=v.join(ue,Bt);re(Re),O++;let ht=Lt[ee],Ve=[];if(ht)try{Ve=typeof ht=="string"?JSON.parse(ht):ht,Array.isArray(Ve)||(Ve=[])}catch{this.log(` \u6309\u94AE JSON \u89E3\u6790\u5931\u8D25 ${N.Name}.${ee}`),Ve=[]}let Tr=[...Ve].sort((Oe,ye)=>String(Oe.Id||"").localeCompare(String(ye.Id||"")));mn[ee]=require("crypto").createHash("sha1").update(JSON.stringify(Tr)).digest("hex");for(let Oe of Ve){let ye=String(Oe.Id||""),yt=String(Oe.Name||ye||"Unknown");if(!ye)continue;let pn=String(Oe.V8Code||""),Ut=v.join(Re,H(`${yt}\uFF08${ye}\uFF09`)+".js");C.menuButtons[this.getMenuButtonMetaKey(N.Id,ee,ye,"V8Code")]={moduleId:N.Id,moduleName:Q,btnField:ee,btnId:ye,btnName:yt,v8SubField:"V8Code",updateTime:Ie,filePath:v.relative(s.getWorkspaceRoot(),Ut)},pn.trim()?(T.writeFileSync(Ut,pn,"utf-8"),this.touchSyncedFile(Ut,Ie),P++):x++;let fn=String(Oe.V8CodeShow||"");if(fn.trim()){let jt=v.join(Re,H(`${yt}_\u663E\u9690\u5224\u65AD\uFF08${ye}\uFF09`)+".js");T.writeFileSync(jt,fn,"utf-8"),this.touchSyncedFile(jt,Ie),C.menuButtons[this.getMenuButtonMetaKey(N.Id,ee,ye,"V8CodeShow")]={moduleId:N.Id,moduleName:Q,btnField:ee,btnId:ye,btnName:yt,v8SubField:"V8CodeShow",updateTime:Ie,filePath:v.relative(s.getWorkspaceRoot(),jt)},P++}else x++}}C.menus[N.Id]={moduleId:N.Id,moduleName:Q,updateTime:Ie,buttonHashes:mn}};re(V);for(let N of q)await Z(N,V);this.saveMeta(C,S),this.log(`\u6A21\u5757\u4EE3\u7801\u62C9\u53D6\u5B8C\u6210: ${P} \u4E2A\u6309\u94AEV8\u6587\u4EF6\uFF0C${A} \u4E2A Join/Where \u6587\u4EF6\uFF0C${O} \u4E2A\u6309\u94AE\u76EE\u5F55\uFF0C\u8DF3\u8FC7\u7A7A\u6309\u94AE\u4EE3\u7801 ${x} \u9879`),_.info(`Microi: \u6210\u529F\u62C9\u53D6 ${P} \u4E2A\u6309\u94AEV8\u6587\u4EF6\u548C ${A} \u4E2A Join/Where \u6587\u4EF6${x>0?`\uFF08\u8DF3\u8FC7 ${x} \u4E2A\u7A7A\u6309\u94AE\u4EE3\u7801\uFF09`:""}\uFF0C\u5DF2\u751F\u6210 ${O} \u4E2A\u6309\u94AE\u76EE\u5F55`)})}backupExistingTree(e,t,n){if(!T.existsSync(e))return;let i=I.getInstance().getSyncRootDir();this.ensureSyncGitExcludes(i);let s=v.join(i,".backups",n,this.shortBackupKey(t));re(s);let o=v.join(s,`${Date.now()}-${this.shortBackupKey(v.basename(e))}`);T.renameSync(e,o)}backupAndDeleteSyncFile(e,t,n){if(!T.existsSync(e))return;let r=I.getInstance(),i=r.getSyncRootDir();this.ensureSyncGitExcludes(i);let s=r.getWorkspaceRoot()||i,c=v.relative(s,e).split(v.sep).filter(g=>g&&g!=="..").map(H),d=v.join(i,".backups",n,this.shortBackupKey(t),String(Date.now())),u=v.join(d,...c.length?c:[H(v.basename(e))]);re(v.dirname(u)),T.copyFileSync(e,u),T.unlinkSync(e)}async pushMenuScriptFile(e,t,n){let r=$.getInstance(),i=Ee(T.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u6A21\u5757\u811A\u672C: ${t.moduleId}.${t.scriptField}...`);try{let s=await r.get(L.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n);if(s.Code!==1||!s.Data)return _.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(),u=d.getSyncRootDir();this.ensureSyncGitExcludes(u);let g=v.join(u,".backups","menu-script",this.shortBackupKey(t.serverDir),t.moduleId);re(g),T.writeFileSync(v.join(g,`${t.scriptField}-${Date.now()}.js`),c,"utf-8");let l={OsClient:t.osClient,ModuleId:t.moduleId,[t.scriptField]:i},m=await r.post(L.UPDATE_MODULE,l,void 0,n?.apiBaseUrl,n);if(m.Code!==1)return _.error(`Microi: \u63A8\u9001\u6A21\u5757 ${t.scriptField} \u5931\u8D25 - ${m.Msg}`),!1;let p=await r.get(L.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(i))return _.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||m.Data?.UpdateTime||fe()),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(i),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}`),_.error(`Microi: \u63A8\u9001\u6A21\u5757\u811A\u672C\u5F02\u5E38 - ${o}`),!1}}async pushMenuButtonFile(e,t,n){let r=$.getInstance(),i=Ee(T.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u6309\u94AEV8\u4EE3\u7801: ${t.moduleId}.${t.btnField}.${t.btnId}.${t.v8SubField}...`);try{let s=await r.get(L.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n);if(s.Code!==1)return _.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 _.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);re(l);let m=v.join(l,`${t.btnField}-${Date.now()}.json`);T.writeFileSync(m,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]=i;let h={OsClient:t.osClient,ModuleId:t.moduleId};h[t.btnField]=JSON.stringify(c);let f=await r.post(L.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||fe(),S=this.loadMeta(t.serverDir);S.menuButtons||(S.menuButtons={});let C=this.getMenuButtonMetaKey(t.moduleId,t.btnField,t.btnId,t.v8SubField);return i.trim()?S.menuButtons[C]={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[C],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),i.trim()?this.touchSyncedFile(e,y):T.existsSync(e)&&T.unlinkSync(e),!0}return _.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}`),_.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${o}`),!1}}async pushWorkflowNodeFile(e,t,n){let r=$.getInstance(),i=T.readFileSync(e,"utf-8"),s=Ee(i);this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8: ${t.flowDesignId}/${t.nodeId}/${t.eventType}...`);try{let o="",c="";try{let m=await r.post(L.GET_WORKFLOW_V8_EVENT_CODE,{OsClient:t.osClient,FlowDesignId:t.flowDesignId,NodeId:t.nodeId,EventType:t.eventType},void 0,n?.apiBaseUrl,n);m.Code===1&&m.Data&&(o=m.Data.V8Code||m.Data.Code||"",c=m.Data.Version||"")}catch{o="",c=""}let d=!s.trim(),u=d?{code:"",version:c,changeHistory:""}:ot({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(u.code,"utf8").toString("base64"),g.Version=u.version,g.ChangeHistory=u.changeHistory);let l=await r.post(L.UPDATE_WORKFLOW_V8_EVENT_CODE,g,void 0,n?.apiBaseUrl,n);if(l.Code===1){let m=l.Data?.UpdateTime||fe(),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:m,filePath:v.relative(I.getInstance().getWorkspaceRoot(),e)},this.saveMeta(p,t.serverDir),d?T.existsSync(e)&&T.unlinkSync(e):(T.writeFileSync(e,u.code,"utf-8"),this.touchSyncedFile(e,m)),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}`),_.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}`),_.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async pullDbSchema(e){let t=I.getInstance(),n=$.getInstance();if(!e){let r=t.getProfiles();if(r.length===0){_.warn("Microi: \u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u670D\u52A1\u5668");return}for(let i of r)try{await this.pullDbSchemaForProfile(i)}catch(s){let o=s instanceof Error?s.message:String(s);this.log(`\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5931\u8D25 [${i.label||i.apiBaseUrl}]: ${o}`)}return}await this.pullDbSchemaForProfile(e)}async pullDbSchemaForProfile(e){let t=I.getInstance(),n=$.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784 [${e.label||r}]...`);let s=await n.get(L.GET_DB_SCHEMA,{osClient:i},r,e);if(s.Code!==1){let b=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}${b}`)}let o=t.getSyncRootDir(),d=await pe.getInstance().getSysConfig(r,i),u=d?.SysShortTitle||"",g=d?.SysTitle||"",l=u||g||d?.CompanyName||e.label||"";l&&(l!==e.label||u!==e.sysShortTitle||g!==e.sysTitle)&&await t.addProfile({...e,label:l,sysShortTitle:u,sysTitle:g});let m=t.buildServerDirName(l,r),h=t.getProfiles().find(b=>b.apiBaseUrl===e.apiBaseUrl&&b.osClient===e.osClient)||e,f=t.buildOsClientDirName(i,h.osClientType,h.osClientNetwork),y=v.join(o,m,f);re(y);let S=v.join(y,He);T.writeFileSync(S,JSON.stringify(s.Data,null,2),"utf-8");let C=v.join(y,Me),w=this.formatDbSchemaMarkdown(s.Data,m,f);w&&T.writeFileSync(C,w,"utf-8");let R=s.Data.Tables?.length||0,E=l||e.label||r;this.log(`[${E}] \u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5B8C\u6210: ${R} \u5F20\u8868`),_.info(`Microi: [${E}] \u6210\u529F\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\uFF08${R} \u5F20\u8868\uFF09`)}formatDbSchemaMarkdown(e,t,n){let r=(e.Tables||[]).filter(c=>c.Name);if(!r.length)return"";let i=r.reduce((c,d)=>{let u=d._Fields||d.Fields||[];return c+u.length},0),s=e.Menus?.length||0,o=[];o.push(`# \u6570\u636E\u5E93\u7ED3\u6784 \u2014 ${t}/${n}
42
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 ${r.length} \u5F20\u8868\uFF0C${i} \u4E2A\u5B57\u6BB5\uFF0C${s} \u4E2A\u83DC\u5355\u3002
43
43
  `);for(let c of r){let d=c.Description?` \u2014 ${c.Description}`:"";o.push(`## ${c.Name}${d}
44
44
  `);let u=c._Fields||c.Fields||[];if(!u.length){o.push(`_\u6682\u65E0\u5B57\u6BB5\u4FE1\u606F._
45
45
  `);continue}o.push("| \u5B57\u6BB5 | \u6807\u7B7E/\u8BF4\u660E | \u7C7B\u578B | \u7EC4\u4EF6 | \u5FC5\u586B | \u5173\u8054 |"),o.push("|------|-----------|------|------|------|------|");for(let g of u){let l=g.Label||g.Description||"",m=g.Type||g.FieldType||"",p=g.Required===!0||g.NotEmpty===1?"\u662F":"",h=g.ChildTableId||g.ChildSysMenuId||"";o.push(`| ${g.Name} | ${l} | ${m} | ${g.Component||""} | ${p} | ${h} |`)}o.push("")}return o.join(`
46
- `)}dispose(){}};var D=K(require("fs")),N=K(require("path")),Xn=K(require("crypto")),an=require("child_process");var Kr=`/**
46
+ `)}dispose(){}};var D=K(require("fs")),M=K(require("path")),Xn=K(require("crypto")),an=require("child_process");var Hr=`/**
47
47
  * Microi V8\u5F15\u64CE API \u7C7B\u578B\u5B9A\u4E49
48
48
  * \u6B64\u6587\u4EF6\u7531 Microi\u543E\u7801 VS Code \u63D2\u4EF6\u81EA\u52A8\u751F\u6210\uFF0C\u8BF7\u52FF\u624B\u52A8\u4FEE\u6539
49
49
  * \u6587\u6863\u53C2\u8003\uFF1Aapi-engine.md, form-engine.md, v8-server.md, where.md
@@ -1150,8 +1150,8 @@ declare function DateAdd(date: any, unit: string, amount: number, format?: strin
1150
1150
  declare function JSON_Encode(obj: any): string;
1151
1151
  /** JSON \u53CD\u5E8F\u5217\u5316 */
1152
1152
  declare function JSON_Decode(json: string): any;
1153
- `,zn="microi.skills",on=".microi-skills-manifest.json",Hr="microi-skills.meta.json",Rt=".microi-ai-docs-manifest.json",Wr="microi-ai-doc-guard:",Jn="\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",at=`<!-- Generated by Microi\u543E\u7801 VSCode Extension - DO NOT REMOVE THIS LINE -->
1154
- `,qn="\n\n## \u63A5\u53E3\u5F15\u64CE\u4E0E\u5E94\u7528\u5546\u57CE\u4F18\u5148\u89C4\u8303\uFF08\u5F3A\u5236\uFF09\n\n- \u65B0\u589E\u4E1A\u52A1\u903B\u8F91\u5148\u5224\u65AD\u73B0\u6709\u4F4E\u4EE3\u7801 CRUD/\u8868\u5355\u4E8B\u4EF6\u80FD\u5426\u5B8C\u6210\uFF1B\u5176\u6B21\u4F7F\u7528\u63A5\u53E3\u5F15\u64CE\u3002\u53EA\u6709\u7F3A\u5C11\u53EF\u590D\u7528\u5E95\u5C42\u539F\u5B50\u80FD\u529B\u65F6\u624D\u6269\u5C55 V8\uFF0C\u5E76\u7EE7\u7EED\u7531\u63A5\u53E3\u5F15\u64CE\u7F16\u6392\uFF1B\u5E73\u53F0\u534F\u8BAE\u3001\u53EF\u4FE1\u9274\u6743\u3001\u5BC6\u94A5\u9694\u79BB\u3001\u5B58\u50A8/\u7F51\u7EDC\u8FB9\u754C\u548C\u8FD0\u884C\u65F6\u5185\u6838\u624D\u5141\u8BB8\u76F4\u63A5\u5199 C# Controller/Service\u3002\n- \u4FEE\u6539 `Microi.Server` \u524D\u5FC5\u987B\u8BF4\u660E\u4E3A\u4EC0\u4E48\u4E0D\u80FD\u4F7F\u7528\u63A5\u53E3\u5F15\u64CE\u3002\u7B2C\u4E09\u65B9 HTTP \u96C6\u6210\u9ED8\u8BA4\u4F7F\u7528 `V8.Http`\uFF1B\u5BC6\u94A5\u4E0D\u80FD\u66B4\u9732\u7ED9\u53EF\u7F16\u8F91 V8 \u65F6\uFF0C\u53EA\u5728 C# \u63D0\u4F9B\u6700\u5C0F\u3001\u79DF\u6237\u9694\u79BB\u4E14\u4E0D\u53EF\u8986\u76D6\u5BC6\u94A5\u7684\u5B89\u5168\u539F\u5B50\u65B9\u6CD5\u3002\u7B2C\u4E09\u65B9\u56DE\u8C03\u91C7\u7528\u201CC# \u6700\u5C0F\u534F\u8BAE\u7F51\u5173 + `Managed` \u6838\u5FC3\u63A5\u53E3\u5F15\u64CE + `CreateIfMissing` \u79DF\u6237 Hook\u201D\uFF0CC# \u4E0D\u627F\u8F7D\u65E5\u5FD7\u3001\u5199\u8868\u3001\u901A\u77E5\u7B49\u4E1A\u52A1\u3002\n- \u7B2C\u4E09\u65B9\u4E0D\u652F\u6301 QueryString \u65F6\u4F7F\u7528 `/path--OsClient--{OsClient}--`\uFF1B\u652F\u6301 Query \u65F6\u56FA\u5B9A\u4F7F\u7528 `?OsClient=`\uFF0C\u7981\u6B62 `?o=`\u3002\u8DEF\u5F84\u4E0E Query \u540C\u65F6\u51FA\u73B0\u65F6\u5FC5\u987B\u4E00\u81F4\u3002\n- \u8868\u3001\u5B57\u6BB5\u3001Tab\u3001\u83DC\u5355\u3001\u6743\u9650\u3001\u63A5\u53E3\u5F15\u64CE\u3001\u4E8B\u4EF6\u3001\u6570\u636E\u6E90\u3001\u9875\u9762\u3001\u6253\u5370\u3001\u5DE5\u4F5C\u6D41\u3001\u4EFB\u52A1\u548C\u53EF\u5E42\u7B49\u79CD\u5B50\u6570\u636E\u5FC5\u987B\u4F18\u5148\u901A\u8FC7\u5E94\u7528\u5546\u57CE\u5347\u7EA7\uFF0C\u4E0D\u5F97\u4E3A\u8FD9\u4E9B\u8D44\u6E90\u5728 `Microi.Server/Microi.Upgrade/` \u65B0\u589E\u5B9A\u5236 .NET \u8FC1\u79FB\u3002\n- \u5E94\u7528\u5305\u63A5\u53E3\u5F15\u64CE\u5FC5\u987B\u58F0\u660E `ResourcePolicies.ApiEngines`\u3002\u5B98\u65B9\u6838\u5FC3\u4F7F\u7528 `Managed`\uFF0C\u4EC5\u5F53\u76EE\u6807\u7AEF `Local == Base` \u624D\u66F4\u65B0\uFF1B\u79DF\u6237\u6269\u5C55\u4F7F\u7528 `CreateIfMissing`\uFF0C\u9996\u6B21\u521B\u5EFA\u540E\u6C38\u4E0D\u8986\u76D6\uFF0C\u540C\u4E00 Key \u540E\u7EED\u4E5F\u7981\u6B62\u6539\u56DE `Managed`\uFF0C\u786E\u9700\u5B98\u65B9\u63A5\u7BA1\u65F6\u53D1\u5E03\u65B0 Key\u3002\u53D1\u73B0\u6838\u5FC3\u88AB\u5BA2\u6237\u4FEE\u6539\u65F6\u6574\u5305\u51B2\u7A81\u56DE\u6EDA\uFF0C\u4E0D\u81EA\u52A8\u5408\u5E76\u53EF\u6267\u884C\u4EE3\u7801\u3002\n- \u6709\u5B98\u65B9\u6743\u9650\u65F6\u4F7F\u7528\u7ED1\u5B9A `https://api.itdos.com`\u3001`OsClient=iTdos` \u7684 `microi_itdos` \u66F4\u65B0\u5E76\u53D1\u5E03\u5B98\u65B9\u5E94\u7528\uFF0C\u518D\u7531\u76EE\u6807\u79DF\u6237 MCP \u5B89\u88C5/\u66F4\u65B0\u548C\u56DE\u8BFB\uFF1B\u65E0\u5B98\u65B9\u6743\u9650\u65F6\u53EA\u901A\u8FC7\u5F53\u524D\u7528\u6237\u81EA\u5DF1\u7684 MCP/Manifest \u5347\u7EA7\u5176\u6570\u636E\u5E93\u3002\n- `Microi.Upgrade` \u53EA\u4FDD\u7559\u5E94\u7528\u5546\u57CE\u8FD0\u884C\u524D\u5FC5\u9700\u7684\u6838\u5FC3\u7269\u7406\u517C\u5BB9/\u534F\u8BAE\u8FC1\u79FB\uFF0C\u5E76\u8981\u6C42\u7248\u672C\u95E8\u3001\u5171\u4EAB\u79DF\u7EA6\u3001\u5E42\u7B49\u548C\u5931\u8D25\u4E0D\u63A8\u8FDB\u7248\u672C\u3002\u7981\u6B62\u6BCF\u6B21\u542F\u52A8\u6309\u79DF\u6237\u91CD\u8DD1\u4E0D\u65AD\u589E\u957F\u7684\u5386\u53F2\u8FC1\u79FB\u6E05\u5355\u3002\u8BE6\u7EC6\u89C4\u5219\u8BFB\u53D6 `microi.skills/workspace-conventions/SKILL.md` \u4E0E `microi.skills/app-store/SKILL.md`\u3002\n",Gr="\n\n## \u540E\u7AEF API \u914D\u7F6E\u767D\u540D\u5355\u4E0E SaaS \u5355\u4E00\u4E8B\u5B9E\u6E90\uFF08\u5F3A\u5236\uFF09\n\n- `Microi.net.Api` \u7684 `AppSettings` \u4E0E\u540C\u540D\u5BB9\u5668\u73AF\u5883\u53D8\u91CF\u53EA\u5141\u8BB8\uFF1A`OsClient`\u3001`OsClientType`\u3001`OsClientNetwork`\u3001`OsClientDbType`\u3001`OsClientDbConn`\u3001`OsClientRedisHost`\u3001`OsClientRedisPort`\u3001`OsClientRedisPwd`\u3001`OsClientRedisDataBase`\u3001`OsClientDbMongoConn`\u3002\n- \u9664\u4E0A\u8FF0\u5341\u9879\u5916\uFF0C\u4E1A\u52A1\u5F00\u5173\u3001\u91CD\u8BD5\u3001\u8D85\u65F6\u3001\u9650\u989D\u3001\u5B89\u5168\u7B56\u7565\u3001\u5BC6\u94A5\u548C\u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84\u5FC5\u987B\u8FDB\u5165 SaaS \u5F15\u64CE `sys_osclients` \u7684\u5408\u9002 Tab\uFF1B\u7981\u6B62\u65B0\u589E `MICROI_*`\u3001`DOS_ORM_*`\u3001\u989D\u5916 `AppSettings` \u8282\u70B9\u6216\u52A8\u6001\u73AF\u5883\u53D8\u91CF\u8BFB\u53D6\u3002\n- `ASPNETCORE_*`\u3001`DOTNET_*` \u53EA\u5C5E\u4E8E .NET \u5BBF\u4E3B\uFF1B\u6D4B\u8BD5\u3001\u6784\u5EFA\u3001\u5B89\u88C5\u3001MCP \u548C\u53D1\u5E03\u811A\u672C\u53EF\u4F7F\u7528\u81EA\u8EAB\u8FDB\u7A0B\u53D8\u91CF\uFF0C\u4F46\u751F\u4EA7 API \u4E0D\u5F97\u8BFB\u53D6\u5B83\u4EEC\u63A7\u5236\u4E1A\u52A1\u884C\u4E3A\u3002\n- \u65B0\u914D\u7F6E\u5FC5\u987B\u914D\u5957\u5E42\u7B49\u5347\u7EA7\u3001\u9ED8\u8BA4\u503C\u3001\u7F13\u5B58\u5237\u65B0\u3001\u654F\u611F\u5B57\u6BB5\u8131\u654F\u3001\u5B50\u79DF\u6237\u9694\u79BB\u3001\u6587\u6863\u548C\u6E90\u7801\u626B\u63CF\u6D4B\u8BD5\uFF1B\u9A8C\u6536\u9700\u626B\u63CF\u751F\u4EA7\u6E90\u7801\u3001API \u914D\u7F6E\u53CA\u5728\u7EBF/\u79BB\u7EBF Compose\u3002\n",Qn=`
1153
+ `,zn="microi.skills",on=".microi-skills-manifest.json",Wr="microi-skills.meta.json",Rt=".microi-ai-docs-manifest.json",Gr="microi-ai-doc-guard:",Jn="\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",at=`<!-- Generated by Microi\u543E\u7801 VSCode Extension - DO NOT REMOVE THIS LINE -->
1154
+ `,qn="\n\n## \u63A5\u53E3\u5F15\u64CE\u4E0E\u5E94\u7528\u5546\u57CE\u4F18\u5148\u89C4\u8303\uFF08\u5F3A\u5236\uFF09\n\n- \u65B0\u589E\u4E1A\u52A1\u903B\u8F91\u5148\u5224\u65AD\u73B0\u6709\u4F4E\u4EE3\u7801 CRUD/\u8868\u5355\u4E8B\u4EF6\u80FD\u5426\u5B8C\u6210\uFF1B\u5176\u6B21\u4F7F\u7528\u63A5\u53E3\u5F15\u64CE\u3002\u53EA\u6709\u7F3A\u5C11\u53EF\u590D\u7528\u5E95\u5C42\u539F\u5B50\u80FD\u529B\u65F6\u624D\u6269\u5C55 V8\uFF0C\u5E76\u7EE7\u7EED\u7531\u63A5\u53E3\u5F15\u64CE\u7F16\u6392\uFF1B\u5E73\u53F0\u534F\u8BAE\u3001\u53EF\u4FE1\u9274\u6743\u3001\u5BC6\u94A5\u9694\u79BB\u3001\u5B58\u50A8/\u7F51\u7EDC\u8FB9\u754C\u548C\u8FD0\u884C\u65F6\u5185\u6838\u624D\u5141\u8BB8\u76F4\u63A5\u5199 C# Controller/Service\u3002\n- \u4FEE\u6539 `Microi.Server` \u524D\u5FC5\u987B\u8BF4\u660E\u4E3A\u4EC0\u4E48\u4E0D\u80FD\u4F7F\u7528\u63A5\u53E3\u5F15\u64CE\u3002\u7B2C\u4E09\u65B9 HTTP \u96C6\u6210\u9ED8\u8BA4\u4F7F\u7528 `V8.Http`\uFF1B\u5BC6\u94A5\u4E0D\u80FD\u66B4\u9732\u7ED9\u53EF\u7F16\u8F91 V8 \u65F6\uFF0C\u53EA\u5728 C# \u63D0\u4F9B\u6700\u5C0F\u3001\u79DF\u6237\u9694\u79BB\u4E14\u4E0D\u53EF\u8986\u76D6\u5BC6\u94A5\u7684\u5B89\u5168\u539F\u5B50\u65B9\u6CD5\u3002\u7B2C\u4E09\u65B9\u56DE\u8C03\u91C7\u7528\u201CC# \u6700\u5C0F\u534F\u8BAE\u7F51\u5173 + `Managed` \u6838\u5FC3\u63A5\u53E3\u5F15\u64CE + `CreateIfMissing` \u79DF\u6237 Hook\u201D\uFF0CC# \u4E0D\u627F\u8F7D\u65E5\u5FD7\u3001\u5199\u8868\u3001\u901A\u77E5\u7B49\u4E1A\u52A1\u3002\n- \u7B2C\u4E09\u65B9\u4E0D\u652F\u6301 QueryString \u65F6\u4F7F\u7528 `/path--OsClient--{OsClient}--`\uFF1B\u652F\u6301 Query \u65F6\u56FA\u5B9A\u4F7F\u7528 `?OsClient=`\uFF0C\u7981\u6B62 `?o=`\u3002\u8DEF\u5F84\u4E0E Query \u540C\u65F6\u51FA\u73B0\u65F6\u5FC5\u987B\u4E00\u81F4\u3002\n- \u8868\u3001\u5B57\u6BB5\u3001Tab\u3001\u83DC\u5355\u3001\u6743\u9650\u3001\u63A5\u53E3\u5F15\u64CE\u3001\u4E8B\u4EF6\u3001\u6570\u636E\u6E90\u3001\u9875\u9762\u3001\u6253\u5370\u3001\u5DE5\u4F5C\u6D41\u3001\u4EFB\u52A1\u548C\u53EF\u5E42\u7B49\u79CD\u5B50\u6570\u636E\u5FC5\u987B\u4F18\u5148\u901A\u8FC7\u5E94\u7528\u5546\u57CE\u5347\u7EA7\uFF0C\u4E0D\u5F97\u4E3A\u8FD9\u4E9B\u8D44\u6E90\u5728 `Microi.Server/Microi.Upgrade/` \u65B0\u589E\u5B9A\u5236 .NET \u8FC1\u79FB\u3002\n- \u5E94\u7528\u5305\u63A5\u53E3\u5F15\u64CE\u5FC5\u987B\u58F0\u660E `ResourcePolicies.ApiEngines`\u3002\u5B98\u65B9\u6838\u5FC3\u4F7F\u7528 `Managed`\uFF0C\u4EC5\u5F53\u76EE\u6807\u7AEF `Local == Base` \u624D\u66F4\u65B0\uFF1B\u79DF\u6237\u6269\u5C55\u4F7F\u7528 `CreateIfMissing`\uFF0C\u9996\u6B21\u521B\u5EFA\u540E\u6C38\u4E0D\u8986\u76D6\uFF0C\u540C\u4E00 Key \u540E\u7EED\u4E5F\u7981\u6B62\u6539\u56DE `Managed`\uFF0C\u786E\u9700\u5B98\u65B9\u63A5\u7BA1\u65F6\u53D1\u5E03\u65B0 Key\u3002\u53D1\u73B0\u6838\u5FC3\u88AB\u5BA2\u6237\u4FEE\u6539\u65F6\u6574\u5305\u51B2\u7A81\u56DE\u6EDA\uFF0C\u4E0D\u81EA\u52A8\u5408\u5E76\u53EF\u6267\u884C\u4EE3\u7801\u3002\n- \u6709\u5B98\u65B9\u6743\u9650\u65F6\u4F7F\u7528\u7ED1\u5B9A `https://api.itdos.com`\u3001`OsClient=iTdos` \u7684 `microi_itdos` \u66F4\u65B0\u5E76\u53D1\u5E03\u5B98\u65B9\u5E94\u7528\uFF0C\u518D\u7531\u76EE\u6807\u79DF\u6237 MCP \u5B89\u88C5/\u66F4\u65B0\u548C\u56DE\u8BFB\uFF1B\u65E0\u5B98\u65B9\u6743\u9650\u65F6\u53EA\u901A\u8FC7\u5F53\u524D\u7528\u6237\u81EA\u5DF1\u7684 MCP/Manifest \u5347\u7EA7\u5176\u6570\u636E\u5E93\u3002\n- `Microi.Upgrade` \u53EA\u4FDD\u7559\u5E94\u7528\u5546\u57CE\u8FD0\u884C\u524D\u5FC5\u9700\u7684\u6838\u5FC3\u7269\u7406\u517C\u5BB9/\u534F\u8BAE\u8FC1\u79FB\uFF0C\u5E76\u8981\u6C42\u7248\u672C\u95E8\u3001\u5171\u4EAB\u79DF\u7EA6\u3001\u5E42\u7B49\u548C\u5931\u8D25\u4E0D\u63A8\u8FDB\u7248\u672C\u3002\u7981\u6B62\u6BCF\u6B21\u542F\u52A8\u6309\u79DF\u6237\u91CD\u8DD1\u4E0D\u65AD\u589E\u957F\u7684\u5386\u53F2\u8FC1\u79FB\u6E05\u5355\u3002\u8BE6\u7EC6\u89C4\u5219\u8BFB\u53D6 `microi.skills/workspace-conventions/SKILL.md` \u4E0E `microi.skills/app-store/SKILL.md`\u3002\n",zr="\n\n## \u540E\u7AEF API \u914D\u7F6E\u767D\u540D\u5355\u4E0E SaaS \u5355\u4E00\u4E8B\u5B9E\u6E90\uFF08\u5F3A\u5236\uFF09\n\n- `Microi.net.Api` \u7684 `AppSettings` \u4E0E\u540C\u540D\u5BB9\u5668\u73AF\u5883\u53D8\u91CF\u53EA\u5141\u8BB8\uFF1A`OsClient`\u3001`OsClientType`\u3001`OsClientNetwork`\u3001`OsClientDbType`\u3001`OsClientDbConn`\u3001`OsClientRedisHost`\u3001`OsClientRedisPort`\u3001`OsClientRedisPwd`\u3001`OsClientRedisDataBase`\u3001`OsClientDbMongoConn`\u3002\n- \u9664\u4E0A\u8FF0\u5341\u9879\u5916\uFF0C\u4E1A\u52A1\u5F00\u5173\u3001\u91CD\u8BD5\u3001\u8D85\u65F6\u3001\u9650\u989D\u3001\u5B89\u5168\u7B56\u7565\u3001\u5BC6\u94A5\u548C\u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84\u5FC5\u987B\u8FDB\u5165 SaaS \u5F15\u64CE `sys_osclients` \u7684\u5408\u9002 Tab\uFF1B\u7981\u6B62\u65B0\u589E `MICROI_*`\u3001`DOS_ORM_*`\u3001\u989D\u5916 `AppSettings` \u8282\u70B9\u6216\u52A8\u6001\u73AF\u5883\u53D8\u91CF\u8BFB\u53D6\u3002\n- `ASPNETCORE_*`\u3001`DOTNET_*` \u53EA\u5C5E\u4E8E .NET \u5BBF\u4E3B\uFF1B\u6D4B\u8BD5\u3001\u6784\u5EFA\u3001\u5B89\u88C5\u3001MCP \u548C\u53D1\u5E03\u811A\u672C\u53EF\u4F7F\u7528\u81EA\u8EAB\u8FDB\u7A0B\u53D8\u91CF\uFF0C\u4F46\u751F\u4EA7 API \u4E0D\u5F97\u8BFB\u53D6\u5B83\u4EEC\u63A7\u5236\u4E1A\u52A1\u884C\u4E3A\u3002\n- \u65B0\u914D\u7F6E\u5FC5\u987B\u914D\u5957\u5E42\u7B49\u5347\u7EA7\u3001\u9ED8\u8BA4\u503C\u3001\u7F13\u5B58\u5237\u65B0\u3001\u654F\u611F\u5B57\u6BB5\u8131\u654F\u3001\u5B50\u79DF\u6237\u9694\u79BB\u3001\u6587\u6863\u548C\u6E90\u7801\u626B\u63CF\u6D4B\u8BD5\uFF1B\u9A8C\u6536\u9700\u626B\u63CF\u751F\u4EA7\u6E90\u7801\u3001API \u914D\u7F6E\u53CA\u5728\u7EBF/\u79BB\u7EBF Compose\u3002\n",Qn=`
1155
1155
 
1156
1156
  ---
1157
1157
 
@@ -1184,14 +1184,14 @@ AI \u5728\u7528\u6237\u672C\u673A\u542F\u52A8 Node.js\u3001Vite\u3001Webpack\u30
1184
1184
  - \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
1185
1185
  - \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
1186
1186
  - \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
1187
- `,zr="\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",Jr="\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",qr="\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",Qr="\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",Yr="\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",Xr="\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",Zr="\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",ei=`
1187
+ `,Jr="\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",qr="\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",Qr="\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",Yr="\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",Xr="\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",Zr="\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",ei="\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",ti=`
1188
1188
 
1189
1189
  ## MicroService \u53D1\u5E03\u540E\u8FD0\u884C\u63A2\u6D4B\u4E0E 502 \u6062\u590D\u89C4\u5219
1190
1190
 
1191
1191
  - \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
1192
1192
  - \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
1193
1193
  - \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
1194
- `,ti=`# Microi\u543E\u7801 V8\u5F15\u64CE API \u77E5\u8BC6\u5E93
1194
+ `,ni=`# Microi\u543E\u7801 V8\u5F15\u64CE API \u77E5\u8BC6\u5E93
1195
1195
 
1196
1196
  > \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
1197
1197
 
@@ -1738,9 +1738,9 @@ console.log('\u8C03\u8BD5\u4FE1\u606F') // \u63
1738
1738
  - \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
1739
1739
  - \`_InvokeType: 'Client'\`\uFF1AFormEngine\u8C03\u7528\u65F6\u89E6\u53D1\u8868\u5355V8\u4E8B\u4EF6\uFF08\u9ED8\u8BA4Server\u6A21\u5F0F\u4E0D\u89E6\u53D1\uFF09
1740
1740
  - \u540E\u7AEF\u53EF\u4FE1V8\u8C03\u7528FormEngine\u4E0D\u8981\u6C42 \`_SysMenuId\`\uFF1B\u6D4F\u89C8\u5668\u4E0D\u80FD\u901A\u8FC7 \`_InvokeType\` \u4F2A\u9020\u4FE1\u4EFB
1741
- `,ni="\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",Pt=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 r=N.join(n,tt);D.existsSync(r)||D.mkdirSync(r,{recursive:!0});let i=N.join(r,Tt);D.writeFileSync(i,Kr,"utf-8"),this.injectAiDocs(n),this.ensureJsConfig(n,r)}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),r=this.buildSkillsReference(n),i=ti+qn+Qn+Jn+Yn+Gr+zr+Jr+qr+Qr+Yr+Xr+ni+ei+Zr+r,s=[{relativePath:`${Wt}/${Gt}`,content:at+i},{relativePath:zt,content:at+i},{relativePath:Jt,content:at+i},{relativePath:qt,content:at+i}];n.length>0&&s.push({relativePath:`${Qt}/${Yt}`,content:this.buildCursorSkillRule(n)}),this.syncGeneratedAiDocs(t,s)}catch{}}ensureLocalRuntimeFilesIgnored(e,t){let n=[".vscode/mcp.json",`.vscode/${Rt}`,".cursor/mcp.json",wn,".claude/settings.local.json"],r=N.relative(e,t);if(r&&!r.startsWith("..")&&!N.isAbsolute(r)){let i=r.replace(/\\/g,"/");n.push(`${i}/**/${He}`,`${i}/**/${Me}`,`${i}/**/${Be}`,`${i}/${Xe}`,`${i}/**/${Xe}`,`${i}/.backups/`,`${i}/**/.backups/`,`${i}/${tt}/`)}Ge(e),ke(e,n)}getBundledSkillsDir(){return N.join(__dirname,"microi.skills")}syncBundledSkills(e){let t=this.getBundledSkillsDir();if(!D.existsSync(t))return;let n=N.join(e,zn),r=N.join(n,on),i=this.readSkillManifest(r),s=this.readBundledSkillsMeta(),o=s.skills?.version,c=this.compareMicroiVersions(o,i.bundleVersion)<0,d={version:1,generatedBy:"Microi\u543E\u7801 VSCode Extension",bundleVersion:c?i.bundleVersion:o||i.bundleVersion,bundleBuiltAt:c?i.bundleBuiltAt:s.builtAt||i.bundleBuiltAt,fileVersions:{...i.fileVersions||{}},files:{...i.files}},u=[];this.walkSkillSource(t,(l,m)=>{let p=N.join(n,m),h=D.readFileSync(l,"utf-8"),f=this.hashText(h),y=i.files[m],S=s.fileVersions?.[m]||o,C=i.fileVersions?.[m]||i.bundleVersion,E=this.compareMicroiVersions(S,C)<0,R=!1;if(!D.existsSync(p))R=!E;else if(y)try{R=this.hashText(D.readFileSync(p,"utf-8"))===y&&!E}catch{R=!1}if(R){let w=N.dirname(p);D.existsSync(w)||D.mkdirSync(w,{recursive:!0}),D.writeFileSync(p,h,"utf-8"),u.push(m)}if(R)d.files[m]=f,S&&(d.fileVersions[m]=S);else try{if(this.hashText(D.readFileSync(p,"utf-8"))===f){d.files[m]=f;let b=this.pickNewerMicroiVersion(S,i.fileVersions?.[m]);b&&(d.fileVersions[m]=b)}else y?(d.files[m]=y,i.fileVersions?.[m]&&(d.fileVersions[m]=i.fileVersions[m])):(delete d.files[m],delete d.fileVersions[m])}catch{y&&(d.files[m]=y,i.fileVersions?.[m]&&(d.fileVersions[m]=i.fileVersions[m]))}});let g=JSON.stringify(d)!==JSON.stringify(i);(u.length>0||g||!D.existsSync(r))&&(D.existsSync(n)||D.mkdirSync(n,{recursive:!0}),D.writeFileSync(r,JSON.stringify(d,null,2)+`
1742
- `,"utf-8"),ke(e,[`${zn}/${on}`]))}readSkillManifest(e){if(!D.existsSync(e))return{version:1,generatedBy:"Microi\u543E\u7801 VSCode Extension",files:{}};try{let t=JSON.parse(D.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=N.join(__dirname,Hr);if(!D.existsSync(e))return{};try{let t=JSON.parse(D.readFileSync(e,"utf-8"));return t&&typeof t=="object"?t:{}}catch{return{}}}walkSkillSource(e,t){let n=r=>{for(let i of D.readdirSync(r,{withFileTypes:!0})){if(i.name===".git"||i.name==="node_modules"||i.name===on)continue;let s=N.join(r,i.name);if(i.isDirectory())n(s);else if(i.isFile()){let o=N.relative(e,s).replace(/\\/g,"/");t(s,o)}}};n(e)}hashText(e){return Xn.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))},r=n(e),i=n(t);if(!r||!i)return 0;for(let s=0;s<3;s++)if(r[s]!==i[s])return r[s]>i[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,"/")),r=n.map(l=>this.normalizeRelativePath(l)),i=this.getGitTrackedWorkspaceFiles(e,n);if(i===void 0)return;let s=N.join(e,".vscode",Rt),o=this.readAiDocsManifest(s),c=this.readBundledSkillsMeta().skills?.version,d=this.pickNewerMicroiVersion(c,o.bundleVersion),u={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(r);for(let l of Object.keys(u.files))g.has(this.normalizeRelativePath(l))||(delete u.files[l],delete u.fileHashes[l],delete u.fileVersions[l]);for(let l of Object.keys(u.fileHashes))g.has(this.normalizeRelativePath(l))||(delete u.fileHashes[l],delete u.fileVersions[l],delete u.files[l]);for(let l of t){let m=this.normalizeRelativePath(l.relativePath);if(i.has(m)){delete u.files[m],delete u.fileHashes[m],delete u.fileVersions[m];continue}let p=N.join(e,m),h=this.hashText(l.content),f=o.files[m],y=o.fileHashes?.[m]||(/^[a-f0-9]{64}$/i.test(f||"")?f:void 0),S=o.fileVersions?.[m]||o.bundleVersion,C=this.compareMicroiVersions(c,S)<0,E=!D.existsSync(p)&&!C,R="";if(D.existsSync(p))try{let b=D.readFileSync(p,"utf-8");R=this.hashText(b),E=!!y&&R===y&&!C,!y&&b.includes("Generated by Microi\u543E\u7801 VSCode Extension")&&(u.fileHashes[m]=R,S&&(u.fileVersions[m]=S))}catch{E=!1}if(E){let b=N.dirname(p);D.existsSync(b)||D.mkdirSync(b,{recursive:!0}),D.writeFileSync(p,l.content,"utf-8"),R=h,u.fileHashes[m]=h,c&&(u.fileVersions[m]=c)}else if(R===h){u.fileHashes[m]=h;let b=this.pickNewerMicroiVersion(c,S);b&&(u.fileVersions[m]=b)}else y?(u.fileHashes[m]=y,S&&(u.fileVersions[m]=S)):u.fileHashes[m]||delete u.fileVersions[m];let w=u.fileHashes[m];if(w){let b=u.fileVersions[m]||d||"unknown";u.files[m]=`${Wr}${b}:${w}`}else delete u.files[m]}if(JSON.stringify(u)!==JSON.stringify(o)||!D.existsSync(s)){let l=N.dirname(s);D.existsSync(l)||D.mkdirSync(l,{recursive:!0}),D.writeFileSync(s,JSON.stringify(u,null,2)+`
1743
- `,"utf-8")}ke(e,[`.vscode/${Rt}`])}readAiDocsManifest(e){if(!D.existsSync(e))return{version:2,generatedBy:"Microi\u543E\u7801 AI\u5F00\u53D1\u5DE5\u5177",files:{},fileHashes:{},fileVersions:{}};try{let t=JSON.parse(D.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,an.spawnSync)("git",["-C",e,"rev-parse","--show-toplevel"],{encoding:"utf-8",windowsHide:!0,timeout:3e3});if(n.error)return this.hasGitMetadata(e)?void 0:new Set;if(n.status!==0)return new Set;let r=String(n.stdout||"").trim();if(!r)return;let i=new Map,s=[];for(let d of t){let u=N.relative(r,N.join(e,d));u.startsWith("..")||N.isAbsolute(u)||(s.push(u.replace(/\\/g,"/")),i.set(this.normalizeRelativePath(u),this.normalizeRelativePath(d)))}if(s.length===0)return new Set;let o=(0,an.spawnSync)("git",["-C",r,"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 u=i.get(this.normalizeRelativePath(d));u&&c.add(u)}return c}hasGitMetadata(e){let t=N.resolve(e);for(;;){if(D.existsSync(N.join(t,".git")))return!0;let n=N.dirname(t);if(n===t)return!1;t=n}}canRemoveGeneratedAiDoc(e,t){if(!D.existsSync(t))return!1;let n=N.relative(e,t).replace(/\\/g,"/"),r=this.normalizeRelativePath(n),i=this.getGitTrackedWorkspaceFiles(e,[n]);if(i===void 0||i.has(r))return!1;let s=this.readAiDocsManifest(N.join(e,".vscode",Rt)),o=s.files[r],c=s.fileHashes?.[r]||(/^[a-f0-9]{64}$/i.test(o||"")?o:void 0);if(!c)return!1;try{return this.hashText(D.readFileSync(t,"utf-8"))===c}catch{return!1}}collectSkillEntries(e){let t=N.join(e,"microi.skills");if(!D.existsSync(t))return[];let n=new Map,r=N.join(t,"README.md");if(D.existsSync(r))try{let o=D.readFileSync(r,"utf-8").matchAll(/`([^`]+\/SKILL\.md)`/g),c=0;for(let d of o){let u=d[1].split(/[\\/]/)[0];u&&!n.has(u)&&n.set(u,c++)}}catch{}let i=[];try{for(let s of D.readdirSync(t,{withFileTypes:!0})){if(!s.isDirectory())continue;let o=N.join(t,s.name,"SKILL.md");D.existsSync(o)&&i.push({name:s.name,relativePath:`microi.skills/${s.name}/SKILL.md`,description:this.readSkillDescription(o,s.name)})}}catch{}return i.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 r=D.readFileSync(e,"utf-8").split(/\r?\n/).find(i=>i.startsWith("# "));if(r)return r.replace(/^#\s+/,"").trim()}catch{}return t}buildSkillsReference(e){if(!e.length)return"";let t=e.map(n=>`- \`${n.relativePath}\` \u2014 ${n.description}`).join(`
1741
+ `,ri="\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",Pt=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 r=M.join(n,tt);D.existsSync(r)||D.mkdirSync(r,{recursive:!0});let i=M.join(r,Tt);D.writeFileSync(i,Hr,"utf-8"),this.injectAiDocs(n),this.ensureJsConfig(n,r)}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),r=this.buildSkillsReference(n),i=ni+qn+Qn+Jn+Yn+zr+Jr+qr+Qr+Yr+Xr+Zr+ri+ti+ei+r,s=[{relativePath:`${Wt}/${Gt}`,content:at+i},{relativePath:zt,content:at+i},{relativePath:Jt,content:at+i},{relativePath:qt,content:at+i}];n.length>0&&s.push({relativePath:`${Qt}/${Yt}`,content:this.buildCursorSkillRule(n)}),this.syncGeneratedAiDocs(t,s)}catch{}}ensureLocalRuntimeFilesIgnored(e,t){let n=[".vscode/mcp.json",`.vscode/${Rt}`,".cursor/mcp.json",En,".claude/settings.local.json"],r=M.relative(e,t);if(r&&!r.startsWith("..")&&!M.isAbsolute(r)){let i=r.replace(/\\/g,"/");n.push(`${i}/**/${He}`,`${i}/**/${Me}`,`${i}/**/${Be}`,`${i}/${Xe}`,`${i}/**/${Xe}`,`${i}/.backups/`,`${i}/**/.backups/`,`${i}/${tt}/`)}Ge(e),ke(e,n)}getBundledSkillsDir(){let e=M.join(__dirname,"microi.skills");if(D.existsSync(e))return e;let t=M.resolve(__dirname,"..","skills");return D.existsSync(t)?t:e}syncBundledSkills(e){let t=this.getBundledSkillsDir();if(!D.existsSync(t))return;let n=M.join(e,zn),r=M.join(n,on),i=this.readSkillManifest(r),s=this.readBundledSkillsMeta(),o=s.skills?.version,c=this.compareMicroiVersions(o,i.bundleVersion)<0,d={version:1,generatedBy:"Microi\u543E\u7801 VSCode Extension",bundleVersion:c?i.bundleVersion:o||i.bundleVersion,bundleBuiltAt:c?i.bundleBuiltAt:s.builtAt||i.bundleBuiltAt,fileVersions:{...i.fileVersions||{}},files:{...i.files}},u=[];this.walkSkillSource(t,(l,m)=>{let p=M.join(n,m),h=D.readFileSync(l,"utf-8"),f=this.hashText(h),y=i.files[m],S=s.fileVersions?.[m]||o,C=i.fileVersions?.[m]||i.bundleVersion,w=this.compareMicroiVersions(S,C)<0,R=!1;if(!D.existsSync(p))R=!w;else if(y)try{R=this.hashText(D.readFileSync(p,"utf-8"))===y&&!w}catch{R=!1}if(R){let E=M.dirname(p);D.existsSync(E)||D.mkdirSync(E,{recursive:!0}),D.writeFileSync(p,h,"utf-8"),u.push(m)}if(R)d.files[m]=f,S&&(d.fileVersions[m]=S);else try{if(this.hashText(D.readFileSync(p,"utf-8"))===f){d.files[m]=f;let b=this.pickNewerMicroiVersion(S,i.fileVersions?.[m]);b&&(d.fileVersions[m]=b)}else y?(d.files[m]=y,i.fileVersions?.[m]&&(d.fileVersions[m]=i.fileVersions[m])):(delete d.files[m],delete d.fileVersions[m])}catch{y&&(d.files[m]=y,i.fileVersions?.[m]&&(d.fileVersions[m]=i.fileVersions[m]))}});let g=JSON.stringify(d)!==JSON.stringify(i);(u.length>0||g||!D.existsSync(r))&&(D.existsSync(n)||D.mkdirSync(n,{recursive:!0}),D.writeFileSync(r,JSON.stringify(d,null,2)+`
1742
+ `,"utf-8"),ke(e,[`${zn}/${on}`]))}readSkillManifest(e){if(!D.existsSync(e))return{version:1,generatedBy:"Microi\u543E\u7801 VSCode Extension",files:{}};try{let t=JSON.parse(D.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,Wr);if(!D.existsSync(e))return{};try{let t=JSON.parse(D.readFileSync(e,"utf-8"));return t&&typeof t=="object"?t:{}}catch{return{}}}walkSkillSource(e,t){let n=r=>{for(let i of D.readdirSync(r,{withFileTypes:!0})){if(i.name===".git"||i.name==="node_modules"||i.name===on)continue;let s=M.join(r,i.name);if(i.isDirectory())n(s);else if(i.isFile()){let o=M.relative(e,s).replace(/\\/g,"/");t(s,o)}}};n(e)}hashText(e){return Xn.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))},r=n(e),i=n(t);if(!r||!i)return 0;for(let s=0;s<3;s++)if(r[s]!==i[s])return r[s]>i[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,"/")),r=n.map(l=>this.normalizeRelativePath(l)),i=this.getGitTrackedWorkspaceFiles(e,n);if(i===void 0)return;let s=M.join(e,".vscode",Rt),o=this.readAiDocsManifest(s),c=this.readBundledSkillsMeta().skills?.version,d=this.pickNewerMicroiVersion(c,o.bundleVersion),u={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(r);for(let l of Object.keys(u.files))g.has(this.normalizeRelativePath(l))||(delete u.files[l],delete u.fileHashes[l],delete u.fileVersions[l]);for(let l of Object.keys(u.fileHashes))g.has(this.normalizeRelativePath(l))||(delete u.fileHashes[l],delete u.fileVersions[l],delete u.files[l]);for(let l of t){let m=this.normalizeRelativePath(l.relativePath);if(i.has(m)){delete u.files[m],delete u.fileHashes[m],delete u.fileVersions[m];continue}let p=M.join(e,m),h=this.hashText(l.content),f=o.files[m],y=o.fileHashes?.[m]||(/^[a-f0-9]{64}$/i.test(f||"")?f:void 0),S=o.fileVersions?.[m]||o.bundleVersion,C=this.compareMicroiVersions(c,S)<0,w=!D.existsSync(p)&&!C,R="";if(D.existsSync(p))try{let b=D.readFileSync(p,"utf-8");R=this.hashText(b),w=!!y&&R===y&&!C,!y&&b.includes("Generated by Microi\u543E\u7801 VSCode Extension")&&(u.fileHashes[m]=R,S&&(u.fileVersions[m]=S))}catch{w=!1}if(w){let b=M.dirname(p);D.existsSync(b)||D.mkdirSync(b,{recursive:!0}),D.writeFileSync(p,l.content,"utf-8"),R=h,u.fileHashes[m]=h,c&&(u.fileVersions[m]=c)}else if(R===h){u.fileHashes[m]=h;let b=this.pickNewerMicroiVersion(c,S);b&&(u.fileVersions[m]=b)}else y?(u.fileHashes[m]=y,S&&(u.fileVersions[m]=S)):u.fileHashes[m]||delete u.fileVersions[m];let E=u.fileHashes[m];if(E){let b=u.fileVersions[m]||d||"unknown";u.files[m]=`${Gr}${b}:${E}`}else delete u.files[m]}if(JSON.stringify(u)!==JSON.stringify(o)||!D.existsSync(s)){let l=M.dirname(s);D.existsSync(l)||D.mkdirSync(l,{recursive:!0}),D.writeFileSync(s,JSON.stringify(u,null,2)+`
1743
+ `,"utf-8")}ke(e,[`.vscode/${Rt}`])}readAiDocsManifest(e){if(!D.existsSync(e))return{version:2,generatedBy:"Microi\u543E\u7801 AI\u5F00\u53D1\u5DE5\u5177",files:{},fileHashes:{},fileVersions:{}};try{let t=JSON.parse(D.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,an.spawnSync)("git",["-C",e,"rev-parse","--show-toplevel"],{encoding:"utf-8",windowsHide:!0,timeout:3e3});if(n.error)return this.hasGitMetadata(e)?void 0:new Set;if(n.status!==0)return new Set;let r=String(n.stdout||"").trim();if(!r)return;let i=new Map,s=[];for(let d of t){let u=M.relative(r,M.join(e,d));u.startsWith("..")||M.isAbsolute(u)||(s.push(u.replace(/\\/g,"/")),i.set(this.normalizeRelativePath(u),this.normalizeRelativePath(d)))}if(s.length===0)return new Set;let o=(0,an.spawnSync)("git",["-C",r,"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 u=i.get(this.normalizeRelativePath(d));u&&c.add(u)}return c}hasGitMetadata(e){let t=M.resolve(e);for(;;){if(D.existsSync(M.join(t,".git")))return!0;let n=M.dirname(t);if(n===t)return!1;t=n}}canRemoveGeneratedAiDoc(e,t){if(!D.existsSync(t))return!1;let n=M.relative(e,t).replace(/\\/g,"/"),r=this.normalizeRelativePath(n),i=this.getGitTrackedWorkspaceFiles(e,[n]);if(i===void 0||i.has(r))return!1;let s=this.readAiDocsManifest(M.join(e,".vscode",Rt)),o=s.files[r],c=s.fileHashes?.[r]||(/^[a-f0-9]{64}$/i.test(o||"")?o:void 0);if(!c)return!1;try{return this.hashText(D.readFileSync(t,"utf-8"))===c}catch{return!1}}collectSkillEntries(e){let t=M.join(e,"microi.skills");if(!D.existsSync(t))return[];let n=new Map,r=M.join(t,"README.md");if(D.existsSync(r))try{let o=D.readFileSync(r,"utf-8").matchAll(/`([^`]+\/SKILL\.md)`/g),c=0;for(let d of o){let u=d[1].split(/[\\/]/)[0];u&&!n.has(u)&&n.set(u,c++)}}catch{}let i=[];try{for(let s of D.readdirSync(t,{withFileTypes:!0})){if(!s.isDirectory())continue;let o=M.join(t,s.name,"SKILL.md");D.existsSync(o)&&i.push({name:s.name,relativePath:`microi.skills/${s.name}/SKILL.md`,description:this.readSkillDescription(o,s.name)})}}catch{}return i.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 r=D.readFileSync(e,"utf-8").split(/\r?\n/).find(i=>i.startsWith("# "));if(r)return r.replace(/^#\s+/,"").trim()}catch{}return t}buildSkillsReference(e){if(!e.length)return"";let t=e.map(n=>`- \`${n.relativePath}\` \u2014 ${n.description}`).join(`
1744
1744
  `);return`
1745
1745
 
1746
1746
  ---
@@ -1759,30 +1759,30 @@ ${at}
1759
1759
 
1760
1760
  \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
1761
1761
  ${t}${qn}${Qn}${Jn}${Yn}
1762
- `}generatePerOsClientSchemaDocs(e){let t=[];if(!D.existsSync(e))return t;let n=r=>{try{for(let i of D.readdirSync(r)){if(i.startsWith(".")&&i!==He)continue;let s=N.join(r,i);if(i===He)try{let o=JSON.parse(D.readFileSync(s,"utf-8")),c=this.formatDbSchemaFull(o,N.relative(e,r));if(c){let d=N.join(r,Me);D.writeFileSync(d,c,"utf-8"),t.push(d)}}catch{}else try{D.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(i=>i.Name);if(n.length===0)return"";let r=[];r.push(`# \u6570\u636E\u5E93\u7ED3\u6784 \u2014 ${t}
1762
+ `}generatePerOsClientSchemaDocs(e){let t=[];if(!D.existsSync(e))return t;let n=r=>{try{for(let i of D.readdirSync(r)){if(i.startsWith(".")&&i!==He)continue;let s=M.join(r,i);if(i===He)try{let o=JSON.parse(D.readFileSync(s,"utf-8")),c=this.formatDbSchemaFull(o,M.relative(e,r));if(c){let d=M.join(r,Me);D.writeFileSync(d,c,"utf-8"),t.push(d)}}catch{}else try{D.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(i=>i.Name);if(n.length===0)return"";let r=[];r.push(`# \u6570\u636E\u5E93\u7ED3\u6784 \u2014 ${t}
1763
1763
  `),r.push("> \u6B64\u6587\u4EF6\u7531 Microi\u543E\u7801 VS Code \u63D2\u4EF6\u81EA\u52A8\u751F\u6210\uFF0C\u5305\u542B\u8BE5\u5E94\u7528\u7684\u6240\u6709\u6570\u636E\u5E93\u8868\u548C\u5B57\u6BB5\u4FE1\u606F\u3002"),r.push(`> \u5171 ${n.length} \u5F20\u8868\u3002
1764
1764
  `);for(let i of n){let s=i.Description?` \u2014 ${i.Description}`:"";r.push(`## ${i.Name}${s}
1765
1765
  `);let o=i._Fields||i.Fields;if(o&&o.length>0){r.push("| \u5B57\u6BB5 | \u8BF4\u660E | \u7C7B\u578B |"),r.push("|------|------|------|");for(let c of o){let d=c.Description||c.Label||"",u=c.Type||c.FieldType||"";r.push(`| ${c.Name} | ${d} | ${u} |`)}r.push("")}}return r.join(`
1766
- `)}ensureJsConfig(e,t){let n=N.join(e,"jsconfig.json"),r=e,i=e,s;if(D.existsSync(n))try{s=JSON.parse(D.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=N.relative(e,t),d=o.typeRoots||[];d.includes(`./${c}`)||d.push(`./${c}`),o.typeRoots=d,s.compilerOptions=o;let u=s.include||[],g=N.relative(e,r),l=N.relative(e,i),m=`${c}/**/*`;for(let h of[`${g}/**/*`,`${l}/**/*`,m])u.includes(h)||u.push(h);s.include=u;let p=s.exclude||[];p.includes("node_modules")||p.push("node_modules"),s.exclude=p,D.writeFileSync(n,JSON.stringify(s,null,2),"utf-8")}cleanup(){let e=I.getInstance(),t=e.getWorkspaceRoot();if(!t)return;let n=e.getSyncRootDir(),r=N.join(n,tt),i=N.join(r,Tt);D.existsSync(i)&&D.unlinkSync(i);let s=N.join(t,tt),o=N.join(s,Tt);if(D.existsSync(o)&&D.unlinkSync(o),N.resolve(n)!==N.resolve(t)){let c=N.join(t,Wt,Gt),d=N.join(t,zt),u=N.join(t,Jt),g=N.join(t,qt),l=N.join(t,Qt,Yt);if(this.canRemoveGeneratedAiDoc(t,c))try{D.unlinkSync(c)}catch{}if(this.canRemoveGeneratedAiDoc(t,d))try{D.unlinkSync(d)}catch{}if(this.canRemoveGeneratedAiDoc(t,u))try{D.unlinkSync(u)}catch{}if(this.canRemoveGeneratedAiDoc(t,g))try{D.unlinkSync(g)}catch{}if(this.canRemoveGeneratedAiDoc(t,l))try{D.unlinkSync(l)}catch{}}this.cleanupSchemaDocs(n)}cleanupSchemaDocs(e){try{for(let t of D.readdirSync(e)){if(t.startsWith(".")&&t!==Me)continue;let n=N.join(e,t);if(t===Me)try{D.unlinkSync(n)}catch{}else try{D.statSync(n).isDirectory()&&this.cleanupSchemaDocs(n)}catch{}}}catch{}}};function lt(a,e){let t=i=>{if(!(!i||!/^\d+(?:\.\d+){2}$/.test(i)))return i.split(".").map(s=>Number(s))},n=t(a),r=t(e);if(!n||!r)return 0;for(let i=0;i<3;i+=1)if(n[i]!==r[i])return n[i]>r[i]?1:-1;return 0}function ct(a){let e=a.env,t=String(e?.MICROI_TOOL_VERSION||"").trim();return/^\d+(?:\.\d+){2}$/.test(t)?t:""}function _t(a){let e=a.env||{},t=a.headers||{},r=(s=>s.trim().replace(/\/+$/,"").toLowerCase())(String(e.MICROI_API_URL||a.url||"")),i=String(e.MICROI_OS_CLIENT||t["X-Microi-OsClient"]||"").trim().toLowerCase();return`${r}|${i}`}function Zn(a,e,t){let n={...a},r={},i=new Set,s=[];for(let[c,d]of Object.entries(e)){let u=_t(d),g=ct(d),l=Object.entries(n).filter(([p,h])=>{if(!t.isManaged(p,h))return!1;let f=_t(h);return p===c||u!=="|"&&f===u}),m=l.find(([,p])=>lt(ct(p),g)>0);if(m){let p=ct(m[1]);for(let[h]of l)i.add(h);s.push({name:m[0],version:p});continue}r[c]=d}let o=new Set(Object.values(r).map(_t).filter(c=>c!=="|"));for(let[c,d]of Object.entries(n)){if(!t.isManaged(c,d)||i.has(c))continue;if(Object.prototype.hasOwnProperty.call(r,c)){delete n[c];continue}let u=_t(d);if(o.has(u)){delete n[c];continue}(t.removeManagedNotInNext||t.isStableName&&!t.isStableName(c))&&delete n[c]}return Object.assign(n,r),{servers:n,skippedNewerProviders:s}}var ln=K(require("child_process")),X=K(require("fs")),er=K(require("os")),te=K(require("path")),De="microi-net",At="microi",Ee=`${At}@${De}`,dt="microi-official",Mt=`${At}@${dt}`;function cn(a){return[a.stderr,a.stdout].filter(Boolean).join(`
1767
- `).trim()}function tr(a,e,t=3e4){let n=ln.spawnSync(a.command,[...a.prefixArgs,...e],{encoding:"utf8",windowsHide:!0,timeout:t,maxBuffer:16777216});return{status:typeof n.status=="number"?n.status:1,stdout:String(n.stdout||""),stderr:[n.error?.message,n.stderr].filter(Boolean).join(`
1768
- `)}}function ri(a){let e=te.extname(a).toLowerCase();return e===".js"||e===".cjs"||e===".mjs"?{command:process.execPath,prefixArgs:[a],displayPath:a}:process.platform==="win32"&&(e===".cmd"||e===".bat")?{command:process.env.ComSpec||"cmd.exe",prefixArgs:["/d","/s","/c",a],displayPath:a}:{command:a,prefixArgs:[],displayPath:a}}function ii(){let a=String(process.env.MICROI_CODEX_PATH||"").trim();if(a){let r=te.resolve(a);if(!X.existsSync(r))throw new Error(`MICROI_CODEX_PATH \u6307\u5411\u7684\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${r}`);return[r]}let e=process.platform==="win32"?[["where.exe",["codex.exe"]],["where.exe",["codex"]]]:[["which",["codex"]]],t=[];for(let[r,i]of e){let s=ln.spawnSync(r,i,{encoding:"utf8",windowsHide:!0,timeout:3e3});s.status===0&&t.push(...String(s.stdout||"").split(/\r?\n/).map(o=>o.trim()).filter(Boolean))}return process.platform!=="win32"&&t.push("codex"),[...new Map(t.map(r=>[process.platform==="win32"?r.toLowerCase():r,r])).values()].sort((r,i)=>{let s=te.extname(r).toLowerCase()===".exe"?0:1,o=te.extname(i).toLowerCase()===".exe"?0:1;return s-o})}function nr(){for(let a of ii()){if(te.isAbsolute(a)&&!X.existsSync(a))continue;let e=ri(a),t=tr(e,["--version"],5e3);if(t.status!==0)continue;let n=t.stdout.trim()||t.stderr.trim();if(/codex/i.test(n))return{...e,version:n}}}function Se(a,e,t=!1){let n=tr(a,["-c",'model_reasoning_effort="high"',...e]);if(!t&&n.status!==0)throw new Error(`Codex CLI \u6267\u884C\u5931\u8D25\uFF1Acodex ${e.join(" ")}
1769
- ${cn(n)}`.trim());return n}function si(a){let e=[];for(let t of a.split(/\r?\n/)){let n=t.trim().split(/\s{2,}/);n.length<2||n[0]==="MARKETPLACE"||e.push({name:n[0],root:n.slice(1).join(" ")})}return e}function oi(a){let e=[];for(let t of a.split(/\r?\n/)){let n=t.trim().split(/\s{2,}/);if(n.length<2||n[0]==="PLUGIN"||!n[0].includes("@"))continue;let r=/^not installed$/i.test(n[1]||"");e.push({selector:n[0],status:n[1]||"",version:r?"":n[2]||"",pluginPath:r?n.slice(2).join(" "):n.slice(3).join(" ")})}return e}function ai(){let e=[te.join(__dirname,"codex-marketplace.json"),te.resolve(__dirname,"..","..","codex","marketplace.npm.json")].find(t=>X.existsSync(t));if(!e)throw new Error("CLI \u7F3A\u5C11 codex-marketplace.json\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\u6700\u65B0\u7248 @microi.net/cli");return e}function rr(){let a=X.readFileSync(ai(),"utf8"),e;try{e=JSON.parse(a)}catch(n){throw new Error(`Codex marketplace \u6A21\u677F\u65E0\u6CD5\u89E3\u6790\uFF1A${n instanceof Error?n.message:String(n)}`)}let t=e.plugins?.find(n=>n.name===At);if(e.name!==De||t?.source?.source!=="npm"||t.source.package!=="@microi.net/codex-plugin"||!t.source.version)throw new Error("Codex marketplace \u6A21\u677F\u8EAB\u4EFD\u4E0D\u5408\u6CD5\uFF0C\u62D2\u7EDD\u5199\u5165\u5168\u5C40\u914D\u7F6E");return{manifest:e,content:`${JSON.stringify(e,null,2)}
1770
- `,expectedVersion:t.source.version}}function ci(a,e){let t=`${a}.${process.pid}.${Date.now()}.tmp`;try{X.writeFileSync(t,e,"utf8"),X.renameSync(t,a)}finally{try{X.existsSync(t)&&X.unlinkSync(t)}catch{}}}function li(a){let e=te.resolve(process.env.CODEX_HOME||te.join(er.homedir(),".codex")),t=te.join(e,"microi-net-marketplace"),n=te.join(t,".agents","plugins","marketplace.json");if(X.mkdirSync(te.dirname(n),{recursive:!0}),X.existsSync(n)){let r;try{r=JSON.parse(X.readFileSync(n,"utf8"))}catch(s){throw new Error(`\u5DF2\u5B58\u5728\u7684 Microi marketplace \u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1A${n}\uFF08${s instanceof Error?s.message:String(s)}\uFF09`)}let i=r.plugins?.find(s=>s.name===At);if(r.name!==De||i?.source?.package!=="@microi.net/codex-plugin")throw new Error(`\u76EE\u6807\u76EE\u5F55\u5305\u542B\u975E Microi \u7BA1\u7406\u7684 marketplace\uFF0C\u62D2\u7EDD\u8986\u76D6\uFF1A${n}`)}return(!X.existsSync(n)||X.readFileSync(n,"utf8")!==a)&&ci(n,a),t}function di(a){let e=a.trim();if(!e||/[\r\n]/.test(e))throw new Error("Codex marketplace source \u65E0\u6548");let t=te.resolve(e);if(X.existsSync(t))return t;if(te.isAbsolute(e)||e.startsWith("."))throw new Error(`Codex marketplace \u672C\u5730\u8DEF\u5F84\u4E0D\u5B58\u5728\uFF1A${t}`);return e}function Nt(a,e){let t=si(Se(a,["plugin","marketplace","list"]).stdout),n=oi(Se(a,["plugin","list"]).stdout),r=t.find(l=>l.name===De),i=n.find(l=>l.selector===Ee),s=t.some(l=>l.name===dt),o=n.some(l=>l.selector===Mt&&/^installed\b/i.test(l.status)),c=!!(i&&/^installed\b/i.test(i.status)),d=!!(i&&/enabled/i.test(i.status)),u=!e||i?.version===e,g=c?d?u?"none":"update":"enable":"install";return{ok:c&&d&&u,codex:{found:!0,command:a.displayPath,version:a.version},marketplace:{name:De,configured:!!r,root:r?.root||""},plugin:{selector:Ee,installed:c,enabled:d,version:i?.version||"",expectedVersion:e},legacy:{marketplaceConfigured:s,pluginInstalled:o},action:g}}function ir(){let{expectedVersion:a}=rr(),e=nr();return e?Nt(e,a):{ok:!1,codex:{found:!1,command:"",version:""},marketplace:{name:De,configured:!1,root:""},plugin:{selector:Ee,installed:!1,enabled:!1,version:"",expectedVersion:a},legacy:{marketplaceConfigured:!1,pluginInstalled:!1},action:"install-codex"}}function sr(a={}){let{content:e,expectedVersion:t}=rr(),n=nr();if(!n)throw new Error("\u672A\u627E\u5230\u53EF\u6267\u884C\u7684 Codex CLI\u3002\u8BF7\u5148\u5B89\u88C5\u6216\u66F4\u65B0 Codex\uFF0C\u518D\u6267\u884C microi codex install --yes");let r=Nt(n,t);if(r.ok&&!a.force){r.legacy.pluginInstalled&&Se(n,["plugin","remove",Mt]),r.legacy.marketplaceConfigured&&Se(n,["plugin","marketplace","remove",dt]);let u=r.legacy.pluginInstalled||r.legacy.marketplaceConfigured;return{installed:!0,changed:u,selector:Ee,version:r.plugin.version,migratedFrom:u?dt:void 0,restartRequired:u}}let i=a.marketplaceSource?di(a.marketplaceSource):li(e);r.marketplace.configured||Se(n,["plugin","marketplace","add",i]);let s=Nt(n,t);if(!s.marketplace.configured)throw new Error(`Codex \u672A\u80FD\u6CE8\u518C marketplace ${De}`);let o;a.force&&s.plugin.installed?(Se(n,["plugin","remove",Ee]),o=Se(n,["plugin","add",Ee],!0)):o=Se(n,["plugin","add",Ee],!0);let c=Nt(n,t);if(!c.plugin.installed||!c.plugin.enabled){let u=a.force?"--force \u5DF2\u6267\u884C\u663E\u5F0F\u91CD\u88C5\uFF0C\u8BF7\u68C0\u67E5\u4E0A\u65B9\u9519\u8BEF\u540E\u91CD\u8BD5\u3002":"\u539F\u6709\u63D2\u4EF6\u672A\u88AB\u5220\u9664\u3002";throw new Error(`\u5B89\u88C5 ${Ee} \u5931\u8D25\uFF0C${u}${cn(o)?`
1771
- ${cn(o)}`:""}`.trim())}if(c.plugin.version!==t)throw new Error(`\u5F53\u524D\u5DF2\u5B89\u88C5 ${c.plugin.version||"\u672A\u77E5\u7248\u672C"}\uFF0C\u76EE\u6807\u4E3A ${t}\u3002\u786E\u8BA4 npm \u5305\u5DF2\u53D1\u5E03\u540E\u4F7F\u7528 --force \u663E\u5F0F\u91CD\u88C5\u3002`);let d=r.legacy.pluginInstalled?Mt:"";return r.legacy.pluginInstalled&&Se(n,["plugin","remove",Mt]),r.legacy.marketplaceConfigured&&Se(n,["plugin","marketplace","remove",dt]),{installed:!0,changed:!0,selector:Ee,version:c.plugin.version,marketplace:De,marketplaceSource:i,migratedFrom:d||void 0,restartRequired:!0,next:"\u65B0\u5EFA Codex \u4EFB\u52A1\u6216\u91CD\u8F7D Codex\uFF0C\u4F7F\u63D2\u4EF6 Skills \u4E0E MCP \u751F\u6548\u3002"}}var ar=K(require("crypto")),J=K(require("fs")),Vt=K(require("os")),ie=K(require("path"));var gt="";function Ot(){if(gt)return gt;try{let a=JSON.parse(J.readFileSync(ie.join(__dirname,"..","package.json"),"utf8"));gt=/^\d+(?:\.\d+){2}$/.test(String(a.version||""))?String(a.version):"0.0.0"}catch{gt="0.0.0"}return gt}function cr(a){return a.trim().replace(/\/+$/,"")}function dn(a){return a.normalize("NFKD").replace(/[^\x00-\x7F]/g,"").replace(/[^A-Za-z0-9_]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"").toLowerCase().slice(0,48)}function lr(a){let e="";try{e=dn(new URL(cr(a.apiBaseUrl)).host)}catch{e=dn(a.apiBaseUrl)}return e}function gn(a){return dn(a.osClient||a.sysShortTitle||a.sysTitle||a.label||"")||lr(a)||"default"}function gi(a,e,t){let n=lr(a),r=gn(a),i=`microi_${r}`,s=t.has(r)&&n&&n!==r?`${i}_${n}`:i;e.has(s)&&n&&(s=`${i}_${n}`);let o=2;for(;e.has(s);)s=`${i}_${o++}`;return e.add(s),s}function ui(){let a=`MCP:${Vt.hostname()||"Unknown"}`;return/^[\x20-\x7E]{1,128}$/.test(a)?a:`MCP-${ar.createHash("sha256").update(a).digest("hex").slice(0,16)}`}function mi(a,e){let t=e.env;return/^microi(?:_|-|$)/i.test(a)||typeof t?.MICROI_API_URL=="string"}function dr(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 Ft(a,e,t,n=!1){J.mkdirSync(ie.dirname(a),{recursive:!0});let r={};if(J.existsSync(a))try{r=vt(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 i=r[e]&&typeof r[e]=="object"?r[e]:{},s=Object.fromEntries(Object.entries(t).map(([d,u])=>[d,n?Object.fromEntries(Object.entries(u).filter(([g])=>["command","args","env","url","headers"].includes(g))):u])),o=Zn(i,s,{isManaged:mi,isStableName:d=>/^microi_[a-z0-9_]+$/.test(d),removeManagedNotInNext:!0});r[e]=o.servers;let c=`${JSON.stringify(r,null,2)}
1772
- `;(!J.existsSync(a)||J.readFileSync(a,"utf8")!==c)&&dr(a,c)}function ut(a){return JSON.stringify(String(a))}function pi(a){return`[${a.map(ut).join(", ")}]`}function fi(a){return`{ ${Object.entries(a).filter(([,e])=>e!==""&&e!=null).map(([e,t])=>`${ut(e)} = ${ut(t)}`).join(", ")} }`}function hi(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 r=new Set;return{cleaned:t.filter(s=>{let c=s.find(m=>m.trim())?.match(/^\s*\[mcp_servers\.(?:"([^"]+)"|([A-Za-z0-9_-]+))(?:\.|\])/)||null;if(!c)return!0;let d=(c[1]||c[2]||"").toLowerCase(),u=s.join(`
1766
+ `)}ensureJsConfig(e,t){let n=M.join(e,"jsconfig.json"),r=e,i=e,s;if(D.existsSync(n))try{s=JSON.parse(D.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 u=s.include||[],g=M.relative(e,r),l=M.relative(e,i),m=`${c}/**/*`;for(let h of[`${g}/**/*`,`${l}/**/*`,m])u.includes(h)||u.push(h);s.include=u;let p=s.exclude||[];p.includes("node_modules")||p.push("node_modules"),s.exclude=p,D.writeFileSync(n,JSON.stringify(s,null,2),"utf-8")}cleanup(){let e=I.getInstance(),t=e.getWorkspaceRoot();if(!t)return;let n=e.getSyncRootDir(),r=M.join(n,tt),i=M.join(r,Tt);D.existsSync(i)&&D.unlinkSync(i);let s=M.join(t,tt),o=M.join(s,Tt);if(D.existsSync(o)&&D.unlinkSync(o),M.resolve(n)!==M.resolve(t)){let c=M.join(t,Wt,Gt),d=M.join(t,zt),u=M.join(t,Jt),g=M.join(t,qt),l=M.join(t,Qt,Yt);if(this.canRemoveGeneratedAiDoc(t,c))try{D.unlinkSync(c)}catch{}if(this.canRemoveGeneratedAiDoc(t,d))try{D.unlinkSync(d)}catch{}if(this.canRemoveGeneratedAiDoc(t,u))try{D.unlinkSync(u)}catch{}if(this.canRemoveGeneratedAiDoc(t,g))try{D.unlinkSync(g)}catch{}if(this.canRemoveGeneratedAiDoc(t,l))try{D.unlinkSync(l)}catch{}}this.cleanupSchemaDocs(n)}cleanupSchemaDocs(e){try{for(let t of D.readdirSync(e)){if(t.startsWith(".")&&t!==Me)continue;let n=M.join(e,t);if(t===Me)try{D.unlinkSync(n)}catch{}else try{D.statSync(n).isDirectory()&&this.cleanupSchemaDocs(n)}catch{}}}catch{}}};function lt(a,e){let t=i=>{if(!(!i||!/^\d+(?:\.\d+){2}$/.test(i)))return i.split(".").map(s=>Number(s))},n=t(a),r=t(e);if(!n||!r)return 0;for(let i=0;i<3;i+=1)if(n[i]!==r[i])return n[i]>r[i]?1:-1;return 0}function ct(a){let e=a.env,t=String(e?.MICROI_TOOL_VERSION||"").trim();return/^\d+(?:\.\d+){2}$/.test(t)?t:""}function _t(a){let e=a.env||{},t=a.headers||{},r=(s=>s.trim().replace(/\/+$/,"").toLowerCase())(String(e.MICROI_API_URL||a.url||"")),i=String(e.MICROI_OS_CLIENT||t["X-Microi-OsClient"]||"").trim().toLowerCase();return`${r}|${i}`}function Zn(a,e,t){let n={...a},r={},i=new Set,s=[];for(let[c,d]of Object.entries(e)){let u=_t(d),g=ct(d),l=Object.entries(n).filter(([p,h])=>{if(!t.isManaged(p,h))return!1;let f=_t(h);return p===c||u!=="|"&&f===u}),m=l.find(([,p])=>lt(ct(p),g)>0);if(m){let p=ct(m[1]);for(let[h]of l)i.add(h);s.push({name:m[0],version:p});continue}r[c]=d}let o=new Set(Object.values(r).map(_t).filter(c=>c!=="|"));for(let[c,d]of Object.entries(n)){if(!t.isManaged(c,d)||i.has(c))continue;if(Object.prototype.hasOwnProperty.call(r,c)){delete n[c];continue}let u=_t(d);if(o.has(u)){delete n[c];continue}(t.removeManagedNotInNext||t.isStableName&&!t.isStableName(c))&&delete n[c]}return Object.assign(n,r),{servers:n,skippedNewerProviders:s}}var ln=K(require("child_process")),X=K(require("fs")),er=K(require("os")),te=K(require("path")),De="microi-net",At="microi",we=`${At}@${De}`,tr="@microi.net/cli",ii="@microi.net/codex-plugin",dt="microi-official",Mt=`${At}@${dt}`;function cn(a){return[a.stderr,a.stdout].filter(Boolean).join(`
1767
+ `).trim()}function nr(a,e,t=3e4){let n=ln.spawnSync(a.command,[...a.prefixArgs,...e],{encoding:"utf8",windowsHide:!0,timeout:t,maxBuffer:16777216});return{status:typeof n.status=="number"?n.status:1,stdout:String(n.stdout||""),stderr:[n.error?.message,n.stderr].filter(Boolean).join(`
1768
+ `)}}function si(a){let e=te.extname(a).toLowerCase();return e===".js"||e===".cjs"||e===".mjs"?{command:process.execPath,prefixArgs:[a],displayPath:a}:process.platform==="win32"&&(e===".cmd"||e===".bat")?{command:process.env.ComSpec||"cmd.exe",prefixArgs:["/d","/s","/c",a],displayPath:a}:{command:a,prefixArgs:[],displayPath:a}}function oi(){let a=String(process.env.MICROI_CODEX_PATH||"").trim();if(a){let r=te.resolve(a);if(!X.existsSync(r))throw new Error(`MICROI_CODEX_PATH \u6307\u5411\u7684\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${r}`);return[r]}let e=process.platform==="win32"?[["where.exe",["codex.exe"]],["where.exe",["codex"]]]:[["which",["codex"]]],t=[];for(let[r,i]of e){let s=ln.spawnSync(r,i,{encoding:"utf8",windowsHide:!0,timeout:3e3});s.status===0&&t.push(...String(s.stdout||"").split(/\r?\n/).map(o=>o.trim()).filter(Boolean))}return process.platform!=="win32"&&t.push("codex"),[...new Map(t.map(r=>[process.platform==="win32"?r.toLowerCase():r,r])).values()].sort((r,i)=>{let s=te.extname(r).toLowerCase()===".exe"?0:1,o=te.extname(i).toLowerCase()===".exe"?0:1;return s-o})}function rr(){for(let a of oi()){if(te.isAbsolute(a)&&!X.existsSync(a))continue;let e=si(a),t=nr(e,["--version"],5e3);if(t.status!==0)continue;let n=t.stdout.trim()||t.stderr.trim();if(/codex/i.test(n))return{...e,version:n}}}function Se(a,e,t=!1){let n=nr(a,["-c",'model_reasoning_effort="high"',...e]);if(!t&&n.status!==0)throw new Error(`Codex CLI \u6267\u884C\u5931\u8D25\uFF1Acodex ${e.join(" ")}
1769
+ ${cn(n)}`.trim());return n}function ai(a){let e=[];for(let t of a.split(/\r?\n/)){let n=t.trim().split(/\s{2,}/);n.length<2||n[0]==="MARKETPLACE"||e.push({name:n[0],root:n.slice(1).join(" ")})}return e}function ci(a){let e=[];for(let t of a.split(/\r?\n/)){let n=t.trim().split(/\s{2,}/);if(n.length<2||n[0]==="PLUGIN"||!n[0].includes("@"))continue;let r=/^not installed$/i.test(n[1]||"");e.push({selector:n[0],status:n[1]||"",version:r?"":n[2]||"",pluginPath:r?n.slice(2).join(" "):n.slice(3).join(" ")})}return e}function li(){let e=[te.join(__dirname,"codex-marketplace.json"),te.resolve(__dirname,"..","..","codex","marketplace.npm.json")].find(t=>X.existsSync(t));if(!e)throw new Error("CLI \u7F3A\u5C11 codex-marketplace.json\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\u6700\u65B0\u7248 @microi.net/cli");return e}function ir(){let a=X.readFileSync(li(),"utf8"),e;try{e=JSON.parse(a)}catch(n){throw new Error(`Codex marketplace \u6A21\u677F\u65E0\u6CD5\u89E3\u6790\uFF1A${n instanceof Error?n.message:String(n)}`)}let t=e.plugins?.find(n=>n.name===At);if(e.name!==De||t?.source?.source!=="npm"||t.source.package!==tr||!t.source.version)throw new Error("Codex marketplace \u6A21\u677F\u8EAB\u4EFD\u4E0D\u5408\u6CD5\uFF0C\u62D2\u7EDD\u5199\u5165\u5168\u5C40\u914D\u7F6E");return{manifest:e,content:`${JSON.stringify(e,null,2)}
1770
+ `,expectedVersion:t.source.version}}function di(a,e){let t=`${a}.${process.pid}.${Date.now()}.tmp`;try{X.writeFileSync(t,e,"utf8"),X.renameSync(t,a)}finally{try{X.existsSync(t)&&X.unlinkSync(t)}catch{}}}function gi(a){let e=te.resolve(process.env.CODEX_HOME||te.join(er.homedir(),".codex")),t=te.join(e,"microi-net-marketplace"),n=te.join(t,".agents","plugins","marketplace.json");if(X.mkdirSync(te.dirname(n),{recursive:!0}),X.existsSync(n)){let r;try{r=JSON.parse(X.readFileSync(n,"utf8"))}catch(o){throw new Error(`\u5DF2\u5B58\u5728\u7684 Microi marketplace \u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1A${n}\uFF08${o instanceof Error?o.message:String(o)}\uFF09`)}let i=r.plugins?.find(o=>o.name===At),s=[tr,ii];if(r.name!==De||!s.includes(i?.source?.package||""))throw new Error(`\u76EE\u6807\u76EE\u5F55\u5305\u542B\u975E Microi \u7BA1\u7406\u7684 marketplace\uFF0C\u62D2\u7EDD\u8986\u76D6\uFF1A${n}`)}return(!X.existsSync(n)||X.readFileSync(n,"utf8")!==a)&&di(n,a),t}function ui(a){let e=a.trim();if(!e||/[\r\n]/.test(e))throw new Error("Codex marketplace source \u65E0\u6548");let t=te.resolve(e);if(X.existsSync(t))return t;if(te.isAbsolute(e)||e.startsWith("."))throw new Error(`Codex marketplace \u672C\u5730\u8DEF\u5F84\u4E0D\u5B58\u5728\uFF1A${t}`);return e}function Nt(a,e){let t=ai(Se(a,["plugin","marketplace","list"]).stdout),n=ci(Se(a,["plugin","list"]).stdout),r=t.find(l=>l.name===De),i=n.find(l=>l.selector===we),s=t.some(l=>l.name===dt),o=n.some(l=>l.selector===Mt&&/^installed\b/i.test(l.status)),c=!!(i&&/^installed\b/i.test(i.status)),d=!!(i&&/enabled/i.test(i.status)),u=!e||i?.version===e,g=c?d?u?"none":"update":"enable":"install";return{ok:c&&d&&u,codex:{found:!0,command:a.displayPath,version:a.version},marketplace:{name:De,configured:!!r,root:r?.root||""},plugin:{selector:we,installed:c,enabled:d,version:i?.version||"",expectedVersion:e},legacy:{marketplaceConfigured:s,pluginInstalled:o},action:g}}function sr(){let{expectedVersion:a}=ir(),e=rr();return e?Nt(e,a):{ok:!1,codex:{found:!1,command:"",version:""},marketplace:{name:De,configured:!1,root:""},plugin:{selector:we,installed:!1,enabled:!1,version:"",expectedVersion:a},legacy:{marketplaceConfigured:!1,pluginInstalled:!1},action:"install-codex"}}function or(a={}){let{content:e,expectedVersion:t}=ir(),n=rr();if(!n)throw new Error("\u672A\u627E\u5230\u53EF\u6267\u884C\u7684 Codex CLI\u3002\u8BF7\u5148\u5B89\u88C5\u6216\u66F4\u65B0 Codex\uFF0C\u518D\u6267\u884C microi codex install --yes");let r=Nt(n,t);if(r.ok&&!a.force){r.legacy.pluginInstalled&&Se(n,["plugin","remove",Mt]),r.legacy.marketplaceConfigured&&Se(n,["plugin","marketplace","remove",dt]);let u=r.legacy.pluginInstalled||r.legacy.marketplaceConfigured;return{installed:!0,changed:u,selector:we,version:r.plugin.version,migratedFrom:u?dt:void 0,restartRequired:u}}let i=a.marketplaceSource?ui(a.marketplaceSource):gi(e);r.marketplace.configured||Se(n,["plugin","marketplace","add",i]);let s=Nt(n,t);if(!s.marketplace.configured)throw new Error(`Codex \u672A\u80FD\u6CE8\u518C marketplace ${De}`);let o;a.force&&s.plugin.installed?(Se(n,["plugin","remove",we]),o=Se(n,["plugin","add",we],!0)):o=Se(n,["plugin","add",we],!0);let c=Nt(n,t);if(!c.plugin.installed||!c.plugin.enabled){let u=a.force?"--force \u5DF2\u6267\u884C\u663E\u5F0F\u91CD\u88C5\uFF0C\u8BF7\u68C0\u67E5\u4E0A\u65B9\u9519\u8BEF\u540E\u91CD\u8BD5\u3002":"\u539F\u6709\u63D2\u4EF6\u672A\u88AB\u5220\u9664\u3002";throw new Error(`\u5B89\u88C5 ${we} \u5931\u8D25\uFF0C${u}${cn(o)?`
1771
+ ${cn(o)}`:""}`.trim())}if(c.plugin.version!==t)throw new Error(`\u5F53\u524D\u5DF2\u5B89\u88C5 ${c.plugin.version||"\u672A\u77E5\u7248\u672C"}\uFF0C\u76EE\u6807\u4E3A ${t}\u3002\u786E\u8BA4 npm \u5305\u5DF2\u53D1\u5E03\u540E\u4F7F\u7528 --force \u663E\u5F0F\u91CD\u88C5\u3002`);let d=r.legacy.pluginInstalled?Mt:"";return r.legacy.pluginInstalled&&Se(n,["plugin","remove",Mt]),r.legacy.marketplaceConfigured&&Se(n,["plugin","marketplace","remove",dt]),{installed:!0,changed:!0,selector:we,version:c.plugin.version,marketplace:De,marketplaceSource:i,migratedFrom:d||void 0,restartRequired:!0,next:"\u65B0\u5EFA Codex \u4EFB\u52A1\u6216\u91CD\u8F7D Codex\uFF0C\u4F7F\u63D2\u4EF6 Skills \u4E0E MCP \u751F\u6548\u3002"}}var cr=K(require("crypto")),J=K(require("fs")),Vt=K(require("os")),ie=K(require("path"));var gt="";function Ot(){if(gt)return gt;try{let a=JSON.parse(J.readFileSync(ie.join(__dirname,"..","package.json"),"utf8"));gt=/^\d+(?:\.\d+){2}$/.test(String(a.version||""))?String(a.version):"0.0.0"}catch{gt="0.0.0"}return gt}function lr(a){return a.trim().replace(/\/+$/,"")}function dn(a){return a.normalize("NFKD").replace(/[^\x00-\x7F]/g,"").replace(/[^A-Za-z0-9_]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"").toLowerCase().slice(0,48)}function dr(a){let e="";try{e=dn(new URL(lr(a.apiBaseUrl)).host)}catch{e=dn(a.apiBaseUrl)}return e}function gn(a){return dn(a.osClient||a.sysShortTitle||a.sysTitle||a.label||"")||dr(a)||"default"}function mi(a,e,t){let n=dr(a),r=gn(a),i=`microi_${r}`,s=t.has(r)&&n&&n!==r?`${i}_${n}`:i;e.has(s)&&n&&(s=`${i}_${n}`);let o=2;for(;e.has(s);)s=`${i}_${o++}`;return e.add(s),s}function pi(){let a=`MCP:${Vt.hostname()||"Unknown"}`;return/^[\x20-\x7E]{1,128}$/.test(a)?a:`MCP-${cr.createHash("sha256").update(a).digest("hex").slice(0,16)}`}function fi(a,e){let t=e.env;return/^microi(?:_|-|$)/i.test(a)||typeof t?.MICROI_API_URL=="string"}function gr(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 Ft(a,e,t,n=!1){J.mkdirSync(ie.dirname(a),{recursive:!0});let r={};if(J.existsSync(a))try{r=vt(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 i=r[e]&&typeof r[e]=="object"?r[e]:{},s=Object.fromEntries(Object.entries(t).map(([d,u])=>[d,n?Object.fromEntries(Object.entries(u).filter(([g])=>["command","args","env","url","headers"].includes(g))):u])),o=Zn(i,s,{isManaged:fi,isStableName:d=>/^microi_[a-z0-9_]+$/.test(d),removeManagedNotInNext:!0});r[e]=o.servers;let c=`${JSON.stringify(r,null,2)}
1772
+ `;(!J.existsSync(a)||J.readFileSync(a,"utf8")!==c)&&gr(a,c)}function ut(a){return JSON.stringify(String(a))}function hi(a){return`[${a.map(ut).join(", ")}]`}function yi(a){return`{ ${Object.entries(a).filter(([,e])=>e!==""&&e!=null).map(([e,t])=>`${ut(e)} = ${ut(t)}`).join(", ")} }`}function Si(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 r=new Set;return{cleaned:t.filter(s=>{let c=s.find(m=>m.trim())?.match(/^\s*\[mcp_servers\.(?:"([^"]+)"|([A-Za-z0-9_-]+))(?:\.|\])/)||null;if(!c)return!0;let d=(c[1]||c[2]||"").toLowerCase(),u=s.join(`
1773
1773
  `);if(!(/^microi(?:_|-|$)/.test(d)||/\bMICROI_(?:API_URL|TOKEN_FILE|OS_CLIENT)\b/.test(u)))return!0;let l=u.match(/["']?MICROI_TOOL_VERSION["']?\s*=\s*["']([^"']+)["']/)?.[1]||"";return lt(l,e)>0?(r.add(d),!0):!1}).map(s=>s.join(`
1774
1774
  `)).join(`
1775
1775
  `).replace(/\n{3,}/g,`
1776
1776
 
1777
- `).trimEnd(),preservedNames:r}}function or(a,e,t){J.mkdirSync(ie.dirname(a),{recursive:!0});let n=J.existsSync(a)?J.readFileSync(a,"utf8"):"",r=Ot(),{cleaned:i,preservedNames:s}=hi(n,r),o=Object.entries(e).filter(([d])=>!s.has(d.toLowerCase())).map(([d,u])=>{let g=[t,...u.args||[]],l={...u.env||{},MICROI_CODEX_MODE:"1"};return delete l.MICROI_TOKEN,[`[mcp_servers.${d}]`,`command = ${ut(u.command)}`,`args = ${pi(g)}`,...u.cwd?[`cwd = ${ut(u.cwd)}`]:[],`env = ${fi(l)}`,'enabled_tools = ["microi_codex"]','default_tools_approval_mode = "auto"'].join(`
1777
+ `).trimEnd(),preservedNames:r}}function ar(a,e,t){J.mkdirSync(ie.dirname(a),{recursive:!0});let n=J.existsSync(a)?J.readFileSync(a,"utf8"):"",r=Ot(),{cleaned:i,preservedNames:s}=Si(n,r),o=Object.entries(e).filter(([d])=>!s.has(d.toLowerCase())).map(([d,u])=>{let g=[t,...u.args||[]],l={...u.env||{},MICROI_CODEX_MODE:"1"};return delete l.MICROI_TOKEN,[`[mcp_servers.${d}]`,`command = ${ut(u.command)}`,`args = ${hi(g)}`,...u.cwd?[`cwd = ${ut(u.cwd)}`]:[],`env = ${yi(l)}`,'enabled_tools = ["microi_codex"]','default_tools_approval_mode = "auto"'].join(`
1778
1778
  `)}),c=[i,o.join(`
1779
1779
 
1780
1780
  `)].filter(Boolean).join(`
1781
1781
 
1782
1782
  `)+`
1783
- `;(!J.existsSync(a)||n!==c)&&dr(a,c)}function yi(a,e){let t=e.label||e.sysShortTitle||e.sysTitle||e.apiBaseUrl||"\u672A\u547D\u540D\u670D\u52A1\u5668";return ie.join(a.getSyncRootDir(),a.buildServerDirName(t,e.apiBaseUrl),a.buildOsClientDirName(e.osClient,e.osClientType,e.osClientNetwork),bn)}function Si(a,e,t){let n={...a.env||{}},r=String(a.command||""),i=Array.isArray(a.args)?a.args.map(String):[];return process.platform==="win32"&&r&&i.length>0?{command:"cmd.exe",args:["/d","/s","/c","call",t,r,e,i[0]],env:n}:{command:r,args:i,env:n}}async function mt(a){let e=I.getInstance(),t=pe.getInstance(),n=$.getInstance(),r=e.getProfiles(),i=Ot(),s=ie.join(__dirname,"mcp-server.js"),o=ie.join(__dirname,"microi-cli-mcp.js"),c=ie.join(__dirname,"mcp-codex-stdio-adapter.js"),d=ie.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 u={},g=new Set,l=new Map;for(let f of r)l.set(gn(f),(l.get(gn(f))||0)+1);let m=new Set(Array.from(l).filter(([,f])=>f>1).map(([f])=>f));for(let f of r){let y=t.mcpTokenFilePath,S=n.getTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork);if(!y||!J.existsSync(y)||!S)continue;let C=gi(f,g,m);u[C]={type:"stdio",command:process.execPath,args:[o],cwd:ie.dirname(__dirname),env:{MICROI_API_URL:cr(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:yi(e,f),MICROI_LABEL_BASE64:Buffer.from(f.label||"","utf8").toString("base64"),MICROI_MCP_DID:ui(),MICROI_TOOL_SOURCE:"cli",MICROI_TOOL_VERSION:i}}}await t.writeMcpTokenFile(),Ge(a),ke(a,[".vscode/mcp.json",".cursor/mcp.json",".trae/mcp.json",".mcp.json",".codex/config.toml","Microi-V8-Engine/.microi-mcp-tokens.json"]),Ft(ie.join(a,".vscode","mcp.json"),"servers",u),Ft(ie.join(a,".cursor","mcp.json"),"mcpServers",u);let p=Object.fromEntries(Object.entries(u).map(([f,y])=>[f,Si(y,c,d)]));Ft(ie.join(a,".trae","mcp.json"),"mcpServers",p,!0),Ft(ie.join(a,".mcp.json"),"mcpServers",u,!0);let h=process.env.CODEX_HOME||ie.join(Vt.homedir(),".codex");return or(ie.join(h,"config.toml"),u,c),or(ie.join(a,".codex","config.toml"),u,c),{count:Object.keys(u).length,names:Object.keys(u)}}var xt=K(require("fs")),gr=K(require("path"));var un=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 ur(a){let e=gr.resolve(a);if(!xt.existsSync(e)||!xt.statSync(e).isDirectory())throw new Error(`\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u76EE\u5F55\uFF1A${e}`);Cn(e);let t=I.getInstance(),n=$.getInstance(),r=pe.getInstance(),i=new un;n.setSecretStorage(i),r.setSecretStorage(i);let s=t.getWorkspaceStateFilePath(Xe);return r.setMcpTokenFilePath(s),await r.loadMcpTokenFile(),{root:e,config:t,api:n,auth:r}}function pt(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 r=e.toLowerCase(),i=t.filter(s=>s.osClient.toLowerCase()===r||s.label.toLowerCase()===r||`${s.apiBaseUrl}|${s.osClient}`.toLowerCase()===r);if(i.length!==1)throw new Error(`\u65E0\u6CD5\u552F\u4E00\u5B9A\u4F4D\u670D\u52A1\u5668\u8FDE\u63A5\uFF1A${e}`);return i[0]}function Ae(a,e){return!!a.api.getTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork)}function Ci(a){let e=[],t={};for(let n=0;n<a.length;n+=1){let r=a[n];if(!r.startsWith("--")){e.push(r);continue}let[i,s]=r.slice(2).split(/=(.*)/s,2);if(i.startsWith("no-")&&s===void 0){t[i.slice(3)]=!1;continue}if(s!==void 0){t[i]=s;continue}let o=a[n+1];o&&!o.startsWith("--")?(t[i]=o,n+=1):t[i]=!0}return{words:e,options:t}}function de(a,e){let t=a[e];return typeof t=="string"?t:void 0}function ce(a,e=!1){console.log(e||typeof a!="string"?JSON.stringify(a,null,2):a)}function Fe(a,e=""){let t=Sr.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>t.question(`${a}${e?` (${e})`:""}: `,r=>{t.close(),n(r.trim()||e)}))}function Ti(a){return!process.stdin.isTTY||!process.stdin.setRawMode?Fe(a):new Promise((e,t)=>{let n="";process.stdout.write(`${a}: `),process.stdin.setRawMode(!0),process.stdin.resume();let r=()=>{process.stdin.off("data",i),process.stdin.setRawMode(!1),process.stdin.pause()},i=s=>{let o=s.toString("utf8");if(o===""){r(),t(new Error("\u5DF2\u53D6\u6D88"));return}if(o==="\r"||o===`
1783
+ `;(!J.existsSync(a)||n!==c)&&gr(a,c)}function Ci(a,e){let t=e.label||e.sysShortTitle||e.sysTitle||e.apiBaseUrl||"\u672A\u547D\u540D\u670D\u52A1\u5668";return ie.join(a.getSyncRootDir(),a.buildServerDirName(t,e.apiBaseUrl),a.buildOsClientDirName(e.osClient,e.osClientType,e.osClientNetwork),bn)}function Ti(a,e,t){let n={...a.env||{}},r=String(a.command||""),i=Array.isArray(a.args)?a.args.map(String):[];return process.platform==="win32"&&r&&i.length>0?{command:"cmd.exe",args:["/d","/s","/c","call",t,r,e,i[0]],env:n}:{command:r,args:i,env:n}}async function mt(a){let e=I.getInstance(),t=pe.getInstance(),n=$.getInstance(),r=e.getProfiles(),i=Ot(),s=ie.join(__dirname,"mcp-server.js"),o=ie.join(__dirname,"microi-cli-mcp.js"),c=ie.join(__dirname,"mcp-codex-stdio-adapter.js"),d=ie.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 u={},g=new Set,l=new Map;for(let f of r)l.set(gn(f),(l.get(gn(f))||0)+1);let m=new Set(Array.from(l).filter(([,f])=>f>1).map(([f])=>f));for(let f of r){let y=t.mcpTokenFilePath,S=n.getTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork);if(!y||!J.existsSync(y)||!S)continue;let C=mi(f,g,m);u[C]={type:"stdio",command:process.execPath,args:[o],cwd:ie.dirname(__dirname),env:{MICROI_API_URL:lr(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:Ci(e,f),MICROI_LABEL_BASE64:Buffer.from(f.label||"","utf8").toString("base64"),MICROI_MCP_DID:pi(),MICROI_TOOL_SOURCE:"cli",MICROI_TOOL_VERSION:i}}}await t.writeMcpTokenFile(),Ge(a),ke(a,[".vscode/mcp.json",".cursor/mcp.json",".trae/mcp.json",".mcp.json",".codex/config.toml","Microi-V8-Engine/.microi-mcp-tokens.json"]),Ft(ie.join(a,".vscode","mcp.json"),"servers",u),Ft(ie.join(a,".cursor","mcp.json"),"mcpServers",u);let p=Object.fromEntries(Object.entries(u).map(([f,y])=>[f,Ti(y,c,d)]));Ft(ie.join(a,".trae","mcp.json"),"mcpServers",p,!0),Ft(ie.join(a,".mcp.json"),"mcpServers",u,!0);let h=process.env.CODEX_HOME||ie.join(Vt.homedir(),".codex");return ar(ie.join(h,"config.toml"),u,c),ar(ie.join(a,".codex","config.toml"),u,c),{count:Object.keys(u).length,names:Object.keys(u)}}var xt=K(require("fs")),ur=K(require("path"));var un=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 mr(a){let e=ur.resolve(a);if(!xt.existsSync(e)||!xt.statSync(e).isDirectory())throw new Error(`\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u76EE\u5F55\uFF1A${e}`);Cn(e);let t=I.getInstance(),n=$.getInstance(),r=pe.getInstance(),i=new un;n.setSecretStorage(i),r.setSecretStorage(i);let s=t.getWorkspaceStateFilePath(Xe);return r.setMcpTokenFilePath(s),await r.loadMcpTokenFile(),{root:e,config:t,api:n,auth:r}}function pt(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 r=e.toLowerCase(),i=t.filter(s=>s.osClient.toLowerCase()===r||s.label.toLowerCase()===r||`${s.apiBaseUrl}|${s.osClient}`.toLowerCase()===r);if(i.length!==1)throw new Error(`\u65E0\u6CD5\u552F\u4E00\u5B9A\u4F4D\u670D\u52A1\u5668\u8FDE\u63A5\uFF1A${e}`);return i[0]}function Ae(a,e){return!!a.api.getTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork)}function vi(a){let e=[],t={};for(let n=0;n<a.length;n+=1){let r=a[n];if(!r.startsWith("--")){e.push(r);continue}let[i,s]=r.slice(2).split(/=(.*)/s,2);if(i.startsWith("no-")&&s===void 0){t[i.slice(3)]=!1;continue}if(s!==void 0){t[i]=s;continue}let o=a[n+1];o&&!o.startsWith("--")?(t[i]=o,n+=1):t[i]=!0}return{words:e,options:t}}function de(a,e){let t=a[e];return typeof t=="string"?t:void 0}function ce(a,e=!1){console.log(e||typeof a!="string"?JSON.stringify(a,null,2):a)}function Fe(a,e=""){let t=Cr.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>t.question(`${a}${e?` (${e})`:""}: `,r=>{t.close(),n(r.trim()||e)}))}function Ei(a){return!process.stdin.isTTY||!process.stdin.setRawMode?Fe(a):new Promise((e,t)=>{let n="";process.stdout.write(`${a}: `),process.stdin.setRawMode(!0),process.stdin.resume();let r=()=>{process.stdin.off("data",i),process.stdin.setRawMode(!1),process.stdin.pause()},i=s=>{let o=s.toString("utf8");if(o===""){r(),t(new Error("\u5DF2\u53D6\u6D88"));return}if(o==="\r"||o===`
1784
1784
  `){process.stdout.write(`
1785
- `),r(),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",i)})}function mr(){return`Microi\u543E\u7801 CLI
1785
+ `),r(),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",i)})}function pr(){return`Microi\u543E\u7801 CLI
1786
1786
 
1787
1787
  \u7528\u6CD5\uFF1Amicroi <\u547D\u4EE4> [\u9009\u9879]
1788
1788
 
@@ -1798,6 +1798,6 @@ ${cn(o)}`:""}`.trim())}if(c.plugin.version!==t)throw new Error(`\u5F53\u524D\u5D
1798
1798
  sync status [--scope ...] \u6BD4\u8F83\u672C\u5730\u4E0E\u8FDC\u7AEF\u5DEE\u5F02
1799
1799
  doctor \u68C0\u67E5\u8FDE\u63A5\u3001Token\u3001AI \u4E0E MCP \u914D\u7F6E
1800
1800
 
1801
- \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 pr(a,e){let t=(de(e,"api")||await Fe("API \u5730\u5740")).replace(/\/+$/,""),n=de(e,"os-client")||await Fe("OsClient");if(!/^https?:\/\//i.test(t))throw new Error("API \u5730\u5740\u5FC5\u987B\u4EE5 http:// \u6216 https:// \u5F00\u5934");if(!n)throw new Error("OsClient \u4E0D\u80FD\u4E3A\u7A7A");let i={label:de(e,"label")||await Fe("\u8FDE\u63A5\u540D\u79F0",n),apiBaseUrl:t,osClient:n,osClientType:de(e,"type")||"",osClientNetwork:de(e,"network")||""};return await a.config.addProfile(i),i}function vi(a){return a===!0||a===1||String(a||"").trim().toLowerCase()==="true"}async function fr(a,e,t){let n=de(t,"account")||await Fe("\u5E10\u53F7"),r=await Ti("\u5BC6\u7801"),i=await a.auth.getSysConfig(e.apiBaseUrl,e.osClient),s,o,c="";if(vi(i?.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=Ce.join(a.config.getSyncRootDir(),".microi-login-captcha.png"),se.mkdirSync(Ce.dirname(c),{recursive:!0}),se.writeFileSync(c,Buffer.from(d.imageBase64.split(",")[1],"base64")),console.log(`\u9A8C\u8BC1\u7801\u56FE\u7247\uFF1A${c}`),s=d.captchaId,o=de(t,"captcha")||await Fe("\u9A8C\u8BC1\u7801")}try{let d=await a.auth.login(n,r,{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 u=await a.auth.getSysConfig(e.apiBaseUrl,e.osClient,void 0,!0);u&&await a.config.addProfile({...e,label:String(u.SysShortTitle||u.SysTitle||e.label),sysShortTitle:String(u.SysShortTitle||""),sysTitle:String(u.SysTitle||"")})}finally{c&&se.existsSync(c)&&se.rmSync(c,{force:!0})}}async function hr(a,e){Pt.getInstance().inject();let t=e?await mt(a.root):{count:0,names:[]};return{workspace:a.root,syncRoot:a.config.getSyncRootDir(),mcp:t}}async function yr(a,e,t){if(!Ae(a,e))throw new Error("\u8BE5\u8FDE\u63A5\u6CA1\u6709\u53EF\u7528 Token\uFF0C\u8BF7\u5148\u6267\u884C microi auth login");let n=qe.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 wi(){let{words:a,options:e}=Ci(process.argv.slice(2));if(!a.length||a[0]==="help"||e.help){console.log(mr());return}let t=e.json===!0,[n,r,i]=a;if(n==="codex"){if(r==="status"){let o=ir();ce(o,t),o.ok||(process.exitCode=2);return}if(r==="install"){if(e.yes!==!0){if(!process.stdin.isTTY)throw new Error("\u5B89\u88C5\u4F1A\u4FEE\u6539 Codex \u5168\u5C40 marketplace \u4E0E\u63D2\u4EF6\u914D\u7F6E\uFF1B\u65E0\u4EBA\u503C\u5B88\u6267\u884C\u5FC5\u987B\u5728\u7528\u6237\u6388\u6743\u540E\u663E\u5F0F\u4F20\u5165 --yes");let o=await Fe("\u5B89\u88C5 Microi\u543E\u7801 Codex \u63D2\u4EF6\u5E76\u4FEE\u6539\u5168\u5C40 Codex \u914D\u7F6E\uFF1F\u8F93\u5165 yes \u786E\u8BA4","no");if(!/^y(?:es)?$/i.test(o)){ce({installed:!1,cancelled:!0},t);return}}ce(sr({force:e.force===!0,marketplaceSource:de(e,"source")}),t);return}}let s=await ur(de(e,"workspace")||process.cwd());if(n==="profile"){if(r==="list"){let o=s.config.getProfiles().map((c,d)=>({index:d+1,...c,loggedIn:Ae(s,c)}));ce(o,t);return}if(r==="add"){ce(await pr(s,e),t);return}if(r==="remove"){let o=pt(s.config,i||de(e,"profile")),c=s.config.getProfiles().findIndex(d=>d.apiBaseUrl===o.apiBaseUrl&&d.osClient===o.osClient);await s.config.removeProfile(c),await s.auth.writeMcpTokenFile(),await mt(s.root),ce({removed:!0,profile:o},t);return}}if(n==="auth"){let o=pt(s.config,de(e,"profile"));if(r==="login"){await fr(s,o,e),ce({loggedIn:!0,profile:o.osClient},t);return}if(r==="status"){ce({loggedIn:Ae(s,o),profile:o},t);return}if(r==="logout"){await s.api.clearTokenForServer(o.apiBaseUrl,o.osClient,o.osClientType,o.osClientNetwork),await s.auth.writeMcpTokenFile(),await mt(s.root),ce({loggedIn:!1,profile:o.osClient},t);return}}if(n==="ai"&&r==="init"){ce(await hr(s,e.mcp!==!1),t);return}if(n==="mcp"&&r==="init"){ce(await mt(s.root),t);return}if(n==="init"){let o=s.config.getProfiles()[0];o||(o=await pr(s,e)),Ae(s,o)||await fr(s,o,e);let c=await hr(s,!0);e.pull===!0&&await yr(s,o,"all"),ce({initialized:!0,pulled:e.pull===!0,details:c},t);return}if(n==="pull"){let o=pt(s.config,de(e,"profile")),c=de(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 yr(s,o,c),ce({pulled:!0,scope:c,profile:o.osClient},t);return}if(n==="push"){let o=Ce.resolve(r||"");if(!se.existsSync(o))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${o}`);if(!await qe.getInstance().pushFile(o))throw new Error("\u63A8\u9001\u5931\u8D25\uFF0C\u8BF7\u67E5\u770B\u4E0A\u65B9 Microi \u65E5\u5FD7");ce({pushed:!0,file:o},t);return}if(n==="sync"&&r==="status"){let o=pt(s.config,de(e,"profile")),c=de(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 qe.getInstance().checkRemoteDifferences(o,c);ce({profile:o.osClient,scope:c,count:d.length,differences:d},t);return}if(n==="doctor"){let o=s.config.getProfiles(),c=Ot(),d=Ce.join(s.root,".vscode","mcp.json"),u=[];if(se.existsSync(d))try{let p=vt(se.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 C=ct(y),E=lt(C,c);u.push({name:f,source:String(S.MICROI_TOOL_SOURCE||"legacy"),version:C||"legacy",compatibility:E>0?"newer-provider-preserved":E<0?"upgrade-available":"compatible"})}}catch(p){u.push({name:"(config)",source:"unknown",version:"unknown",compatibility:`invalid-json: ${p instanceof Error?p.message:String(p)}`})}let g=Ce.join(s.root,".vscode",".microi-ai-docs-manifest.json"),l="";if(se.existsSync(g))try{let p=JSON.parse(se.readFileSync(g,"utf-8"));l=String(p.bundleVersion||"")}catch{l="invalid-json"}let m={ok:o.length>0&&o.some(p=>Ae(s,p)),tool:{source:"cli",version:c},node:process.version,workspace:s.root,syncRoot:s.config.getSyncRootDir(),profiles:o.map(p=>({label:p.label,osClient:p.osClient,apiBaseUrl:p.apiBaseUrl,loggedIn:Ae(s,p)})),files:{agents:se.existsSync(Ce.join(s.root,"AGENTS.md")),vscodeMcp:se.existsSync(d),codexMcp:se.existsSync(Ce.join(s.root,".codex","config.toml")),tokenFile:se.existsSync(s.auth.mcpTokenFilePath)},coexistence:{aiBundleVersion:l||"not-initialized",mcpProviders:u}};ce(m,t),m.ok||(process.exitCode=2);return}throw new Error(`\u672A\u77E5\u547D\u4EE4\uFF1A${a.join(" ")}
1801
+ \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 fr(a,e){let t=(de(e,"api")||await Fe("API \u5730\u5740")).replace(/\/+$/,""),n=de(e,"os-client")||await Fe("OsClient");if(!/^https?:\/\//i.test(t))throw new Error("API \u5730\u5740\u5FC5\u987B\u4EE5 http:// \u6216 https:// \u5F00\u5934");if(!n)throw new Error("OsClient \u4E0D\u80FD\u4E3A\u7A7A");let i={label:de(e,"label")||await Fe("\u8FDE\u63A5\u540D\u79F0",n),apiBaseUrl:t,osClient:n,osClientType:de(e,"type")||"",osClientNetwork:de(e,"network")||""};return await a.config.addProfile(i),i}function wi(a){return a===!0||a===1||String(a||"").trim().toLowerCase()==="true"}async function hr(a,e,t){let n=de(t,"account")||await Fe("\u5E10\u53F7"),r=await Ei("\u5BC6\u7801"),i=await a.auth.getSysConfig(e.apiBaseUrl,e.osClient),s,o,c="";if(wi(i?.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=Ce.join(a.config.getSyncRootDir(),".microi-login-captcha.png"),se.mkdirSync(Ce.dirname(c),{recursive:!0}),se.writeFileSync(c,Buffer.from(d.imageBase64.split(",")[1],"base64")),console.log(`\u9A8C\u8BC1\u7801\u56FE\u7247\uFF1A${c}`),s=d.captchaId,o=de(t,"captcha")||await Fe("\u9A8C\u8BC1\u7801")}try{let d=await a.auth.login(n,r,{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 u=await a.auth.getSysConfig(e.apiBaseUrl,e.osClient,void 0,!0);u&&await a.config.addProfile({...e,label:String(u.SysShortTitle||u.SysTitle||e.label),sysShortTitle:String(u.SysShortTitle||""),sysTitle:String(u.SysTitle||"")})}finally{c&&se.existsSync(c)&&se.rmSync(c,{force:!0})}}async function yr(a,e){Pt.getInstance().inject();let t=e?await mt(a.root):{count:0,names:[]};return{workspace:a.root,syncRoot:a.config.getSyncRootDir(),mcp:t}}async function Sr(a,e,t){if(!Ae(a,e))throw new Error("\u8BE5\u8FDE\u63A5\u6CA1\u6709\u53EF\u7528 Token\uFF0C\u8BF7\u5148\u6267\u884C microi auth login");let n=qe.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 bi(){let{words:a,options:e}=vi(process.argv.slice(2));if(!a.length||a[0]==="help"||e.help){console.log(pr());return}let t=e.json===!0,[n,r,i]=a;if(n==="codex"){if(r==="status"){let o=sr();ce(o,t),o.ok||(process.exitCode=2);return}if(r==="install"){if(e.yes!==!0){if(!process.stdin.isTTY)throw new Error("\u5B89\u88C5\u4F1A\u4FEE\u6539 Codex \u5168\u5C40 marketplace \u4E0E\u63D2\u4EF6\u914D\u7F6E\uFF1B\u65E0\u4EBA\u503C\u5B88\u6267\u884C\u5FC5\u987B\u5728\u7528\u6237\u6388\u6743\u540E\u663E\u5F0F\u4F20\u5165 --yes");let o=await Fe("\u5B89\u88C5 Microi\u543E\u7801 Codex \u63D2\u4EF6\u5E76\u4FEE\u6539\u5168\u5C40 Codex \u914D\u7F6E\uFF1F\u8F93\u5165 yes \u786E\u8BA4","no");if(!/^y(?:es)?$/i.test(o)){ce({installed:!1,cancelled:!0},t);return}}ce(or({force:e.force===!0,marketplaceSource:de(e,"source")}),t);return}}let s=await mr(de(e,"workspace")||process.cwd());if(n==="profile"){if(r==="list"){let o=s.config.getProfiles().map((c,d)=>({index:d+1,...c,loggedIn:Ae(s,c)}));ce(o,t);return}if(r==="add"){ce(await fr(s,e),t);return}if(r==="remove"){let o=pt(s.config,i||de(e,"profile")),c=s.config.getProfiles().findIndex(d=>d.apiBaseUrl===o.apiBaseUrl&&d.osClient===o.osClient);await s.config.removeProfile(c),await s.auth.writeMcpTokenFile(),await mt(s.root),ce({removed:!0,profile:o},t);return}}if(n==="auth"){let o=pt(s.config,de(e,"profile"));if(r==="login"){await hr(s,o,e),ce({loggedIn:!0,profile:o.osClient},t);return}if(r==="status"){ce({loggedIn:Ae(s,o),profile:o},t);return}if(r==="logout"){await s.api.clearTokenForServer(o.apiBaseUrl,o.osClient,o.osClientType,o.osClientNetwork),await s.auth.writeMcpTokenFile(),await mt(s.root),ce({loggedIn:!1,profile:o.osClient},t);return}}if(n==="ai"&&r==="init"){ce(await yr(s,e.mcp!==!1),t);return}if(n==="mcp"&&r==="init"){ce(await mt(s.root),t);return}if(n==="init"){let o=s.config.getProfiles()[0];o||(o=await fr(s,e)),Ae(s,o)||await hr(s,o,e);let c=await yr(s,!0);e.pull===!0&&await Sr(s,o,"all"),ce({initialized:!0,pulled:e.pull===!0,details:c},t);return}if(n==="pull"){let o=pt(s.config,de(e,"profile")),c=de(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 Sr(s,o,c),ce({pulled:!0,scope:c,profile:o.osClient},t);return}if(n==="push"){let o=Ce.resolve(r||"");if(!se.existsSync(o))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${o}`);if(!await qe.getInstance().pushFile(o))throw new Error("\u63A8\u9001\u5931\u8D25\uFF0C\u8BF7\u67E5\u770B\u4E0A\u65B9 Microi \u65E5\u5FD7");ce({pushed:!0,file:o},t);return}if(n==="sync"&&r==="status"){let o=pt(s.config,de(e,"profile")),c=de(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 qe.getInstance().checkRemoteDifferences(o,c);ce({profile:o.osClient,scope:c,count:d.length,differences:d},t);return}if(n==="doctor"){let o=s.config.getProfiles(),c=Ot(),d=Ce.join(s.root,".vscode","mcp.json"),u=[];if(se.existsSync(d))try{let p=vt(se.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 C=ct(y),w=lt(C,c);u.push({name:f,source:String(S.MICROI_TOOL_SOURCE||"legacy"),version:C||"legacy",compatibility:w>0?"newer-provider-preserved":w<0?"upgrade-available":"compatible"})}}catch(p){u.push({name:"(config)",source:"unknown",version:"unknown",compatibility:`invalid-json: ${p instanceof Error?p.message:String(p)}`})}let g=Ce.join(s.root,".vscode",".microi-ai-docs-manifest.json"),l="";if(se.existsSync(g))try{let p=JSON.parse(se.readFileSync(g,"utf-8"));l=String(p.bundleVersion||"")}catch{l="invalid-json"}let m={ok:o.length>0&&o.some(p=>Ae(s,p)),tool:{source:"cli",version:c},node:process.version,workspace:s.root,syncRoot:s.config.getSyncRootDir(),profiles:o.map(p=>({label:p.label,osClient:p.osClient,apiBaseUrl:p.apiBaseUrl,loggedIn:Ae(s,p)})),files:{agents:se.existsSync(Ce.join(s.root,"AGENTS.md")),vscodeMcp:se.existsSync(d),codexMcp:se.existsSync(Ce.join(s.root,".codex","config.toml")),tokenFile:se.existsSync(s.auth.mcpTokenFilePath)},coexistence:{aiBundleVersion:l||"not-initialized",mcpProviders:u}};ce(m,t),m.ok||(process.exitCode=2);return}throw new Error(`\u672A\u77E5\u547D\u4EE4\uFF1A${a.join(" ")}
1802
1802
 
1803
- ${mr()}`)}wi().catch(a=>{console.error(`Microi CLI: ${a instanceof Error?a.message:String(a)}`),process.exitCode=1});
1803
+ ${pr()}`)}bi().catch(a=>{console.error(`Microi CLI: ${a instanceof Error?a.message:String(a)}`),process.exitCode=1});