@microi.net/cli 5.7.8 → 5.8.0

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 (189) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.workbuddy-plugin/marketplace.json +2 -2
  5. package/.workbuddy-plugin/plugin.json +1 -1
  6. package/LICENSE +21 -21
  7. package/README.md +71 -71
  8. package/assets/build-meta.json +6 -6
  9. package/assets/feature-matrix.json +138 -138
  10. package/assets/logo.svg +4 -4
  11. package/cordis.patch.yml +1 -1
  12. package/package.json +1 -1
  13. package/scripts/mcp-codex-stdio-adapter.js +0 -0
  14. package/scripts/mcp-server.js +113 -112
  15. package/scripts/microi-cli.js +57 -57
  16. package/scripts/microi-codex-broker.js +450 -450
  17. package/scripts/microi-codex-router.js +0 -0
  18. package/scripts/microi-skills.meta.json +364 -364
  19. package/skills/.microi-skills-version.json +2 -2
  20. package/skills/README.md +286 -286
  21. package/skills/ai-engine/SKILL.md +265 -265
  22. package/skills/ai-engine/agents/openai.yaml +4 -4
  23. package/skills/ai-platform-governance/SKILL.md +177 -177
  24. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  25. package/skills/app-store/SKILL.md +396 -396
  26. package/skills/app-store/agents/openai.yaml +4 -4
  27. package/skills/business-blueprint/SKILL.md +193 -193
  28. package/skills/datasource-engine/SKILL.md +90 -90
  29. package/skills/datasource-engine/agents/openai.yaml +4 -4
  30. package/skills/dos-orm/references/api-reference.md +229 -229
  31. package/skills/email-engine/SKILL.md +78 -78
  32. package/skills/email-engine/references/v8-email.md +34 -34
  33. package/skills/job-engine/SKILL.md +172 -172
  34. package/skills/job-engine/agents/openai.yaml +4 -4
  35. package/skills/message-notification/SKILL.md +156 -156
  36. package/skills/message-notification/agents/openai.yaml +5 -5
  37. package/skills/message-notification/references/contracts.md +102 -102
  38. package/skills/microi-ai-app-auth.js +652 -652
  39. package/skills/microi-ai-application/SKILL.md +106 -106
  40. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  41. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  42. package/skills/microi-client-frontend/SKILL.md +237 -237
  43. package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +144 -144
  44. package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +196 -196
  45. package/skills/microi-client-frontend/references/progressive-03-vue3-/345/211/215/347/253/257/345/276/256/346/234/215/345/212/241/345/256/277/344/270/273/350/247/204/345/210/231.md +167 -167
  46. package/skills/microi-codex/SKILL.md +72 -70
  47. package/skills/microi-codex-installer/SKILL.md +225 -223
  48. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  49. package/skills/microi-datasource-mapping/SKILL.md +108 -108
  50. package/skills/microi-db-schema/SKILL.md +175 -175
  51. package/skills/microi-db-schema/agents/openai.yaml +4 -4
  52. package/skills/microi-db-schema/references/core-tables.md +695 -695
  53. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  54. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  55. package/skills/microi-db-schema/references/schema.md +646 -646
  56. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  57. package/skills/microi-deployment/references/deployment-matrix.md +101 -101
  58. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  59. package/skills/microi-form-engine/SKILL.md +226 -226
  60. package/skills/microi-form-engine/references/component-catalog.md +216 -216
  61. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  62. package/skills/microi-form-layout/SKILL.md +205 -205
  63. package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +235 -235
  64. package/skills/microi-frontend-sdk/SKILL.md +188 -188
  65. package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +176 -176
  66. package/skills/microi-left-right-layout/SKILL.md +141 -141
  67. package/skills/microi-microservice/SKILL.md +323 -323
  68. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  69. package/skills/microi-mobile-app-quality/SKILL.md +181 -181
  70. package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +213 -213
  71. package/skills/microi-mobile-app-quality/references/progressive-02-9-/344/270/273/351/242/230/345/210/207/346/215/242/345/277/205/351/241/273/347/234/237/345/256/236/344/270/224/345/205/250/345/261/200/347/224/237/346/225/210.md +128 -128
  72. package/skills/microi-solution-quotation/SKILL.md +78 -78
  73. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  74. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  75. package/skills/microi-sso/references/acceptance.md +49 -49
  76. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  77. package/skills/microi-sso/references/inbound.md +53 -53
  78. package/skills/microi-sso/references/outbound.md +39 -39
  79. package/skills/microi-system-delivery/SKILL.md +134 -134
  80. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +193 -193
  81. package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +189 -189
  82. package/skills/microi-ui/SKILL.md +174 -174
  83. package/skills/microi-ui/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/234/272/346/231/257/350/223/235/345/233/276.md +183 -183
  84. package/skills/microi-uniapp-frontend/SKILL.md +193 -193
  85. package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +225 -225
  86. package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +154 -154
  87. package/skills/microi.v8.js +1921 -1921
  88. package/skills/module-engine/SKILL.md +250 -250
  89. package/skills/module-engine/references/module-config.md +204 -204
  90. package/skills/ocr-engine/SKILL.md +113 -113
  91. package/skills/ocr-engine/agents/openai.yaml +4 -4
  92. package/skills/page-engine/SKILL.md +182 -182
  93. package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +234 -234
  94. package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +60 -60
  95. package/skills/performance-testing/SKILL.md +221 -221
  96. package/skills/playwright-e2e/SKILL.md +197 -197
  97. package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +173 -173
  98. package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +183 -183
  99. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
  100. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
  101. package/skills/print-engine/SKILL.md +259 -259
  102. package/skills/production-readonly-audit/SKILL.md +41 -41
  103. package/skills/report-engine/SKILL.md +71 -71
  104. package/skills/report-engine/agents/openai.yaml +4 -4
  105. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  106. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  107. package/skills/search-engine/SKILL.md +75 -75
  108. package/skills/search-engine/agents/openai.yaml +4 -4
  109. package/skills/spider-engine/SKILL.md +190 -190
  110. package/skills/system-observability/SKILL.md +238 -238
  111. package/skills/system-observability/references/memory-incident-triage.md +70 -70
  112. package/skills/translate-engine/SKILL.md +140 -140
  113. package/skills/translate-engine/agents/openai.yaml +4 -4
  114. package/skills/ui-design/SKILL.md +191 -191
  115. package/skills/ui-design/assets/templates/MCI-DESIGN.md +198 -198
  116. package/skills/ui-design/references/design-pattern-library.md +184 -184
  117. package/skills/ui-design/references/mci-design-contract.md +163 -163
  118. package/skills/ui-design/references/progressive-01-/351/242/234/350/211/262/344/275/223/347/263/273-css-variables-/346/224/257/346/214/201/344/270/273/351/242/230/345/210/207/346/215/242.md +218 -218
  119. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +137 -137
  120. package/skills/ui-design/references/progressive-03-/345/212/250/346/225/210/350/247/204/350/214/203-/344/270/260/345/257/214/344/275/206/344/270/215/345/215/241.md +235 -235
  121. package/skills/ui-design/references/progressive-04-/347/273/204/344/273/266/351/243/216/346/240/274/351/200/237/346/237/245.md +152 -152
  122. package/skills/ui-design/references/progressive-05-/347/247/273/345/212/250/347/253/257/344/270/223/347/224/250/350/247/204/350/214/203.md +238 -238
  123. package/skills/ui-design/references/progressive-06-/344/270/273/351/242/230/345/210/207/346/215/242/345/256/236/347/216/260.md +194 -194
  124. package/skills/ui-design/references/progressive-07-/351/200/237/346/237/245-/344/273/216/345/244/264/346/220/255/345/273/272/344/270/200/344/270/252/347/247/273/345/212/250/347/253/257/351/241/265/351/235/242.md +207 -207
  125. package/skills/ui-design/references/progressive-08-/350/241/250/345/215/225/345/210/206/347/273/204/350/247/204/350/214/203-tabs-vs-collapsegroup-/345/274/272/345/210/266.md +117 -117
  126. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  127. package/skills/unity-integration/SKILL.md +155 -155
  128. package/skills/unity-integration/agents/openai.yaml +4 -4
  129. package/skills/unity-integration/references/ai-app-delivery.md +103 -103
  130. package/skills/unity-integration/references/sdk-api.md +82 -82
  131. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  132. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  133. package/skills/v8-cache-pattern/SKILL.md +306 -306
  134. package/skills/v8-crud-api/SKILL.md +175 -175
  135. package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +226 -226
  136. package/skills/v8-crud-api/references/progressive-02-where-/346/235/241/344/273/266/350/257/255/346/263/225/351/200/237/346/237/245.md +49 -49
  137. package/skills/v8-debugging/SKILL.md +284 -284
  138. package/skills/v8-explorer-tree/SKILL.md +228 -228
  139. package/skills/v8-export-import/SKILL.md +209 -209
  140. package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +211 -211
  141. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
  142. package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +42 -42
  143. package/skills/v8-file-upload/SKILL.md +263 -263
  144. package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +101 -101
  145. package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +150 -150
  146. package/skills/v8-formengine-http/SKILL.md +219 -219
  147. package/skills/v8-frontend-events/SKILL.md +178 -178
  148. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  149. package/skills/v8-frontend-events/references/bluetooth-print.md +246 -246
  150. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
  151. package/skills/v8-http-integration/SKILL.md +182 -182
  152. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
  153. package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +44 -44
  154. package/skills/v8-image-processing/SKILL.md +190 -190
  155. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  156. package/skills/v8-image-processing/references/api-reference.md +623 -623
  157. package/skills/v8-menu-buttons/SKILL.md +180 -180
  158. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +222 -222
  159. package/skills/v8-menu-buttons/references/progressive-02-8-/346/250/241/345/274/217-f-/345/220/216/345/217/260/344/273/273/345/212/241/346/214/211/351/222/256-/351/225/277/344/273/273/345/212/241.md +228 -228
  160. package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +104 -104
  161. package/skills/v8-mongodb/SKILL.md +192 -192
  162. package/skills/v8-mq-mqtt/SKILL.md +176 -176
  163. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  164. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -181
  165. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  166. package/skills/v8-saas-multi-tenant/SKILL.md +219 -219
  167. package/skills/v8-security/SKILL.md +168 -168
  168. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +198 -198
  169. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +158 -158
  170. package/skills/v8-sql-query/SKILL.md +302 -302
  171. package/skills/v8-table-event/SKILL.md +144 -144
  172. package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +197 -197
  173. package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +46 -46
  174. package/skills/v8-tcp-integration/SKILL.md +147 -147
  175. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  176. package/skills/v8-template-engine/SKILL.md +167 -167
  177. package/skills/v8-utilities/SKILL.md +90 -90
  178. package/skills/v8-utilities/references/client-api-index.md +143 -143
  179. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  180. package/skills/v8-utilities/references/server-api-index.md +188 -188
  181. package/skills/v8-workflow/SKILL.md +243 -243
  182. package/skills/v8-workflow/references/progressive-01-/350/212/202/347/202/271/345/274/200/345/247/213-v8-/344/272/213/344/273/266.md +180 -180
  183. package/skills/vision-engine/SKILL.md +159 -159
  184. package/skills/vision-engine/agents/openai.yaml +4 -4
  185. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  186. package/skills/workspace-conventions/SKILL.md +261 -261
  187. package/skills/workspace-conventions/references/progressive-01-/347/211/210/346/234/254/346/233/264/346/226/260/346/227/245/345/277/227/344/277/235/346/212/244/350/247/204/345/210/231-/345/274/272/345/210/266.md +208 -208
  188. package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +216 -216
  189. package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +27 -27
@@ -1,23 +1,23 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var Bs=Object.create;var gr=Object.defineProperty;var Us=Object.getOwnPropertyDescriptor;var js=Object.getOwnPropertyNames;var Ks=Object.getPrototypeOf,Hs=Object.prototype.hasOwnProperty;var Ws=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of js(e))!Hs.call(s,r)&&r!==t&&gr(s,r,{get:()=>e[r],enumerable:!(n=Us(e,r))||n.enumerable});return s};var B=(s,e,t)=>(t=s!=null?Bs(Ks(s)):{},Ws(e||!s||!s.__esModule?gr(t,"default",{value:s,enumerable:!0}):t,s));var se=B(require("fs")),ae=B(require("path")),$s=B(require("readline"));var pr=B(require("os")),mr=process.cwd();function fr(s){mr=s}var Gs={append:s=>process.stderr.write(s),appendLine:(s="")=>console.error(s),clear:()=>{},show:()=>{},hide:()=>{},replace:s=>process.stderr.write(s),dispose:()=>{},name:"Microi CLI"},ht={get workspaceFolders(){return[{uri:{fsPath:mr}}]},workspaceFile:void 0,findFiles:async()=>[]},Pn={machineId:pr.hostname()||"microi-cli",sessionId:`microi-cli-${process.pid}`},Je={executeCommand:async()=>{}},qe={Notification:15},hr={file:s=>({fsPath:s})},fe={createOutputChannel:()=>Gs,showInformationMessage:async()=>{},showWarningMessage:async()=>{},showErrorMessage:async()=>{},showTextDocument:async()=>{},onDidChangeWindowState:()=>({dispose:()=>{}}),withProgress:async(s,e)=>e({report:({message:t})=>t&&console.error(t)},{isCancellationRequested:!1,onCancellationRequested:()=>({dispose:()=>{}})})};var w=B(require("fs")),E=B(require("path"));var Qt=B(require("https")),Yt=B(require("http")),Xt=B(require("crypto")),it=B(require("fs"));var Ee=B(require("path")),q=B(require("fs")),Fr=B(require("crypto"));var Ye=".microi-meta.json",Kt=".microi-config.json",yt=".microi-mcp-tokens.json";var yr=".mcp.json";var De="Microi-V8-Engine";var Xe="\u63A5\u53E3\u5F15\u64CE",Sr="V8\u4E8B\u4EF6",xe="\u8868\u5355\u5F15\u64CE",je="\u6A21\u5757\u5F15\u64CE",Ze="\u6D41\u7A0B\u5F15\u64CE",Cr="AI\u5E94\u7528",Ht="\u8868\u5355V8\u4E8B\u4EF6",St="\u5B57\u6BB5V8\u4E8B\u4EF6",Wt="\u8282\u70B9",wr={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"},Dn={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"},et={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"},Ct={SqlJoin:"Join\u5173\u8054",SqlWhere:"Where\u6761\u4EF6"},Tr={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"},wt=".microi-typings",Gt="v8-engine.d.ts",Rn=".github",In="copilot-instructions.md",_n="CLAUDE.md",Mn="AGENTS.md",An=".cursorrules",Nn=".cursor/rules",Fn="microi-skills.mdc",H={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",STAGE_MICRO_SERVICE_SOURCE_FILE:"/api/V8Debug/StageMicroServiceSourceFile",FINALIZE_MICRO_SERVICE_SOURCE_MANIFEST:"/api/V8Debug/FinalizeMicroServiceSourceManifest",UPLOAD_APPLICATION_ASSET_STREAM:"/api/V8Debug/UploadApplicationAssetStream",FINALIZE_APPLICATION_STREAM_PUBLISH:"/api/V8Debug/FinalizeApplicationStreamPublish",GET_EVENT_LIST:"/api/V8Debug/GetV8EventList",GET_EVENT_CODE:"/api/V8Debug/GetV8EventCode",UPDATE_EVENT_CODE:"/api/V8Debug/UpdateV8EventCode",EXECUTE_EVENT:"/api/V8Debug/ExecuteV8Event",GET_WORKFLOW_V8_EVENT_LIST:"/api/V8Debug/GetWorkflowV8EventList",GET_WORKFLOW_V8_EVENT_CODE:"/api/V8Debug/GetWorkflowV8EventCode",UPDATE_WORKFLOW_V8_EVENT_CODE:"/api/V8Debug/UpdateWorkflowV8EventCode",GET_ENGINE_CODE:"/api/V8Debug/GetApiEngineCode",CREATE_ENGINE:"/api/V8Debug/CreateApiEngine",REFRESH_TOKEN:"/api/SysUser/RefreshToken",GET_DB_SCHEMA:"/api/V8Debug/GetDbSchema",LIST_MODULES:"/api/V8Debug/ListModules",GET_MODULE:"/api/V8Debug/GetModule",UPDATE_MODULE:"/api/V8Debug/UpdateModule",GET_FIELD_LIST:"/api/V8Debug/GetFieldList",UPDATE_FIELD:"/api/V8Debug/UpdateField",GET_PLAYWRIGHT_CONTEXT:"/api/V8Debug/GetPlaywrightContext",FORM_GET_DATA:"/api/FormEngine/GetFormData",FORM_GET_LIST:"/api/FormEngine/GetTableData",FORM_ADD:"/api/FormEngine/AddFormData",FORM_UPDATE:"/api/FormEngine/UptFormData",FORM_UPDATE_BY_WHERE:"/api/FormEngine/UptFormDataByWhere",FORM_DELETE_BY_WHERE:"/api/FormEngine/DelFormDataByWhere",DEBUG_WS:"/api/V8Debug/ws"},tt=".microi-db-schema.json",Ke=".microi-db-schema.md";var Vn=`\u26A0\uFE0F \u4FEE\u6539\u540E\u8BF7\u624B\u52A8\u63A8\u9001\u5230\u6570\u636E\u5E93
2
+ "use strict";var Ws=Object.create;var mr=Object.defineProperty;var Gs=Object.getOwnPropertyDescriptor;var zs=Object.getOwnPropertyNames;var Js=Object.getPrototypeOf,qs=Object.prototype.hasOwnProperty;var Qs=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of zs(e))!qs.call(s,r)&&r!==t&&mr(s,r,{get:()=>e[r],enumerable:!(n=Gs(e,r))||n.enumerable});return s};var O=(s,e,t)=>(t=s!=null?Ws(Js(s)):{},Qs(e||!s||!s.__esModule?mr(t,"default",{value:s,enumerable:!0}):t,s));var ie=O(require("fs")),ce=O(require("path")),Ks=O(require("readline"));var fr=O(require("os")),hr=process.cwd();function yr(s){hr=s}var Ys={append:s=>process.stderr.write(s),appendLine:(s="")=>console.error(s),clear:()=>{},show:()=>{},hide:()=>{},replace:s=>process.stderr.write(s),dispose:()=>{},name:"Microi CLI"},St={get workspaceFolders(){return[{uri:{fsPath:hr}}]},workspaceFile:void 0,findFiles:async()=>[]},Dn={machineId:fr.hostname()||"microi-cli",sessionId:`microi-cli-${process.pid}`},qe={executeCommand:async()=>{}},Qe={Notification:15},Sr={file:s=>({fsPath:s})},he={createOutputChannel:()=>Ys,showInformationMessage:async()=>{},showWarningMessage:async()=>{},showErrorMessage:async()=>{},showTextDocument:async()=>{},onDidChangeWindowState:()=>({dispose:()=>{}}),withProgress:async(s,e)=>e({report:({message:t})=>t&&console.error(t)},{isCancellationRequested:!1,onCancellationRequested:()=>({dispose:()=>{}})})};var T=O(require("fs")),E=O(require("path"));var Xt=O(require("https")),Zt=O(require("http")),en=O(require("crypto")),ot=O(require("fs"));var be=O(require("path")),Q=O(require("fs")),xr=O(require("crypto"));var Xe=".microi-meta.json",Wt=".microi-config.json",Ct=".microi-mcp-tokens.json";var Cr=".mcp.json";var Re="Microi-V8-Engine";var Ze="\u63A5\u53E3\u5F15\u64CE",wr="V8\u4E8B\u4EF6",Oe="\u8868\u5355\u5F15\u64CE",Ke="\u6A21\u5757\u5F15\u64CE",et="\u6D41\u7A0B\u5F15\u64CE",Tr="AI\u5E94\u7528",Gt="\u8868\u5355V8\u4E8B\u4EF6",wt="\u5B57\u6BB5V8\u4E8B\u4EF6",zt="\u8282\u70B9",vr={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"},Rn={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"},tt={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"},Tt={SqlJoin:"Join\u5173\u8054",SqlWhere:"Where\u6761\u4EF6"},Er={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"},vt=".microi-typings",Jt="v8-engine.d.ts",In=".github",_n="copilot-instructions.md",Mn="CLAUDE.md",An="AGENTS.md",Nn=".cursorrules",Fn=".cursor/rules",Vn="microi-skills.mdc",H={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",STAGE_MICRO_SERVICE_SOURCE_FILE:"/api/V8Debug/StageMicroServiceSourceFile",FINALIZE_MICRO_SERVICE_SOURCE_MANIFEST:"/api/V8Debug/FinalizeMicroServiceSourceManifest",UPLOAD_APPLICATION_ASSET_STREAM:"/api/V8Debug/UploadApplicationAssetStream",FINALIZE_APPLICATION_STREAM_PUBLISH:"/api/V8Debug/FinalizeApplicationStreamPublish",GET_EVENT_LIST:"/api/V8Debug/GetV8EventList",GET_EVENT_CODE:"/api/V8Debug/GetV8EventCode",UPDATE_EVENT_CODE:"/api/V8Debug/UpdateV8EventCode",EXECUTE_EVENT:"/api/V8Debug/ExecuteV8Event",GET_WORKFLOW_V8_EVENT_LIST:"/api/V8Debug/GetWorkflowV8EventList",GET_WORKFLOW_V8_EVENT_CODE:"/api/V8Debug/GetWorkflowV8EventCode",UPDATE_WORKFLOW_V8_EVENT_CODE:"/api/V8Debug/UpdateWorkflowV8EventCode",GET_ENGINE_CODE:"/api/V8Debug/GetApiEngineCode",CREATE_ENGINE:"/api/V8Debug/CreateApiEngine",REFRESH_TOKEN:"/api/SysUser/RefreshToken",GET_DB_SCHEMA:"/api/V8Debug/GetDbSchema",LIST_MODULES:"/api/V8Debug/ListModules",GET_MODULE:"/api/V8Debug/GetModule",UPDATE_MODULE:"/api/V8Debug/UpdateModule",GET_FIELD_LIST:"/api/V8Debug/GetFieldList",UPDATE_FIELD:"/api/V8Debug/UpdateField",GET_PLAYWRIGHT_CONTEXT:"/api/V8Debug/GetPlaywrightContext",FORM_GET_DATA:"/api/FormEngine/GetFormData",FORM_GET_LIST:"/api/FormEngine/GetTableData",FORM_ADD:"/api/FormEngine/AddFormData",FORM_UPDATE:"/api/FormEngine/UptFormData",FORM_UPDATE_BY_WHERE:"/api/FormEngine/UptFormDataByWhere",FORM_DELETE_BY_WHERE:"/api/FormEngine/DelFormDataByWhere",DEBUG_WS:"/api/V8Debug/ws"},nt=".microi-db-schema.json",He=".microi-db-schema.md";var xn=`\u26A0\uFE0F \u4FEE\u6539\u540E\u8BF7\u624B\u52A8\u63A8\u9001\u5230\u6570\u636E\u5E93
3
3
  */
4
4
 
5
- `;var nt="microi.isLoggedIn";var xn="microi.authToken",we="microi.username",Te="microi.password",vr=`-----BEGIN PUBLIC KEY-----
5
+ `;var rt="microi.isLoggedIn";var On="microi.authToken",Te="microi.username",ve="microi.password",br=`-----BEGIN PUBLIC KEY-----
6
6
  MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7q21EG3HiSFNO9XFUJoMeyz2R
7
7
  XaFX8UgCFE4d4pvK6IvQsWunm+WfYqgrSzBMS1LH1fstmZB0wnVUX1uGROaZTKGZ
8
8
  1rS/MVn4i6CsPgP9Q7nFV6dZvbxro1byH/E3CV/Q1CgCDeue9FzQUlWQ+UZld8Jg
9
9
  1DsI9VJ7gTHGL3R7sQIDAQAB
10
- -----END PUBLIC KEY-----`;var Se=B(require("fs")),ee=B(require("path")),On=require("child_process");var Er="# Microi VS Code extension local runtime files";function zt(s){let e="",t=0;for(;t<s.length;)if(s[t]==='"'){let n=t;for(t++;t<s.length&&s[t]!=='"';)s[t]==="\\"&&t++,t++;t++,e+=s.slice(n,t)}else if(s[t]==="/"&&s[t+1]==="/")for(;t<s.length&&s[t]!==`
11
- `;)t++;else if(s[t]==="/"&&s[t+1]==="*"){for(t+=2;t<s.length&&!(s[t]==="*"&&s[t+1]==="/");)t++;t+=2}else e+=s[t],t++;return JSON.parse(e)}function ge(s){Se.existsSync(s)||Se.mkdirSync(s,{recursive:!0})}function br(s){return s.replace(/\\/g,"/").replace(/^\.\//,"")}function kr(s){let e=s;for(;;){let t=ee.join(e,".git");if(Se.existsSync(t))try{let r=Se.statSync(t);if(r.isDirectory())return{gitDir:t,workTreeRoot:e};if(r.isFile()){let o=Se.readFileSync(t,"utf-8").match(/^gitdir:\s*(.+)$/m);if(o?.[1])return{gitDir:ee.isAbsolute(o[1])?o[1]:ee.resolve(e,o[1]),workTreeRoot:e}}}catch{return null}let n=ee.dirname(e);if(n===e)return null;e=n}}function Oe(s,e){try{let t=kr(s);if(!t)return;let n=ee.join(t.gitDir,"info");ge(n);let r=ee.join(n,"exclude"),i=br(ee.relative(t.workTreeRoot,s)),o=e.map(p=>p.trim()).filter(Boolean).map(p=>br(p.replace(/^\/+/,""))).map(p=>i?`${i}/${p}`:p),a=Se.existsSync(r)?Se.readFileSync(r,"utf-8"):"",c=new Set(a.split(/\r?\n/).map(p=>p.trim())),l=o.filter(p=>!c.has(p));if(!l.length)return;let g=a.length>0&&!a.endsWith(`
12
- `),d=a.includes(Er)?"":`${Er}
10
+ -----END PUBLIC KEY-----`;var Ce=O(require("fs")),te=O(require("path")),$n=require("child_process");var kr="# Microi VS Code extension local runtime files";function qt(s){let e="",t=0;for(;t<s.length;)if(s[t]==='"'){let n=t;for(t++;t<s.length&&s[t]!=='"';)s[t]==="\\"&&t++,t++;t++,e+=s.slice(n,t)}else if(s[t]==="/"&&s[t+1]==="/")for(;t<s.length&&s[t]!==`
11
+ `;)t++;else if(s[t]==="/"&&s[t+1]==="*"){for(t+=2;t<s.length&&!(s[t]==="*"&&s[t+1]==="/");)t++;t+=2}else e+=s[t],t++;return JSON.parse(e)}function pe(s){Ce.existsSync(s)||Ce.mkdirSync(s,{recursive:!0})}function Pr(s){return s.replace(/\\/g,"/").replace(/^\.\//,"")}function Dr(s){let e=s;for(;;){let t=te.join(e,".git");if(Ce.existsSync(t))try{let r=Ce.statSync(t);if(r.isDirectory())return{gitDir:t,workTreeRoot:e};if(r.isFile()){let o=Ce.readFileSync(t,"utf-8").match(/^gitdir:\s*(.+)$/m);if(o?.[1])return{gitDir:te.isAbsolute(o[1])?o[1]:te.resolve(e,o[1]),workTreeRoot:e}}}catch{return null}let n=te.dirname(e);if(n===e)return null;e=n}}function $e(s,e){try{let t=Dr(s);if(!t)return;let n=te.join(t.gitDir,"info");pe(n);let r=te.join(n,"exclude"),i=Pr(te.relative(t.workTreeRoot,s)),o=e.map(p=>p.trim()).filter(Boolean).map(p=>Pr(p.replace(/^\/+/,""))).map(p=>i?`${i}/${p}`:p),a=Ce.existsSync(r)?Ce.readFileSync(r,"utf-8"):"",c=new Set(a.split(/\r?\n/).map(p=>p.trim())),l=o.filter(p=>!c.has(p));if(!l.length)return;let g=a.length>0&&!a.endsWith(`
12
+ `),d=a.includes(kr)?"":`${kr}
13
13
  `,u=`${g?`
14
14
  `:""}${d}${l.join(`
15
15
  `)}
16
- `;Se.appendFileSync(r,u,"utf-8")}catch{}}function rt(s){if(process.platform==="win32")try{let e=kr(s);if(!e)return;try{if((0,On.execFileSync)("git",["config","--get","core.longpaths"],{cwd:e.workTreeRoot,encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0}).trim().toLowerCase()==="true")return}catch{}(0,On.execFileSync)("git",["config","core.longpaths","true"],{cwd:e.workTreeRoot,stdio:"ignore",windowsHide:!0})}catch{}}function J(s){let e=String(s||"").replace(/[<>:"/\\|?*\x00-\x1F]/g,"_").replace(/[. ]+$/g,""),t=!e||e==="."||e===".."?"_":e;return/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/i.test(t)?`_${t}`:t}function $n(s){return encodeURIComponent(String(s||"")).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function zs(s){try{return decodeURIComponent(String(s||""))}catch{return String(s||"")}}function Me(s){let e=s.indexOf(Vn);return e!==-1?s.substring(e+Vn.length):s}function Js(s){let e=s||"";if(!e.trim())return!1;let t=e.trimStart();return t.startsWith("var ")||t.startsWith("let ")||t.startsWith("const ")||t.startsWith("function")||t.startsWith("return")||t.startsWith("//")||t.startsWith("/*")||e.includes("V8.")||e.includes("return ")||e.includes("=>")||e.includes("console.")||e.includes(";")||e.includes("{")||e.includes(`
17
- `)}function Ln(s){let e=s||"",t=e.trim();if(!t||t.length%4!==0||!/^[A-Za-z0-9+/]+={0,2}$/.test(t))return e;try{let n=Buffer.from(t,"base64").toString("utf8");if(!n||n.includes("\uFFFD"))return e;let r=t.replace(/=+$/,""),i=Buffer.from(n,"utf8").toString("base64").replace(/=+$/,"");return r!==i?e:Js(n)?n:e}catch{return e}}function Pr(s,e){let n=ee.relative(e,s).split(ee.sep);if(n.length>=5&&(n[2]===Xe||n[2]==="api-engine")){let r=n[1],i=r.split(".")[0];if(n.length===5&&n[4]?.endsWith(".js")){let o=n[4].replace(".js",""),a=o.match(/\(([^)]+)\)$/);return a?{serverDir:n[0],osClientDir:r,osClient:i,category:n[3],apiEngineKey:zs(a[1])}:{serverDir:n[0],osClientDir:r,osClient:i,category:n[3],apiEngineKey:o}}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 Dr(s,e){let n=ee.relative(e,s).split(ee.sep),r=i=>{let o=i.match(/[((]([^))]+)[))]\s*$/);return o?o[1]:i};if(n.length>=6&&n[2]===xe&&n[4]===Ht){let i=n[1],o=i.split(".")[0],a=r(n[3]),c=n[5].replace(/\.js$/i,""),l=r(c);return{serverDir:n[0],osClientDir:i,osClient:o,formEngineKey:a,eventType:l}}if(n.length>=5&&(n[2]===Sr||n[2]==="v8-event"||n[2]==="v8-events")){let i=n[1],o=i.split(".")[0],a=r(n[3]);return{serverDir:n[0],osClientDir:i,osClient:o,formEngineKey:a,eventType:n[4].replace(/\.js$/i,"")}}return null}function ve(s){return(s||new Date).toISOString().replace("T"," ").substring(0,19)}function Rr(s,e){let n=ee.relative(e,s).split(ee.sep);if(n.length<7||n[2]!==xe||n[4]!==St)return null;let r=d=>{let u=d.match(/[((]([^))]+)[))]\s*$/);return u?u[1]:d},i=n[1],o=i.split(".")[0],a=r(n[3]),c=r(n[5]),l=n[6].replace(/\.js$/i,""),g=r(l);return{serverDir:n[0],osClientDir:i,osClient:o,tableName:a,fieldName:c,v8Key:g}}function Ir(s,e){let n=ee.relative(e,s).split(ee.sep);if(n[2]!==je)return null;let r=d=>{let u=d.match(/[((]([^))]+)[))]\s*$/);return u?u[1]:d},i=d=>d.replace(/[((][^))]+[))]\s*$/,"").trim()||d,o=n[1],a=o.split(".")[0],c=n.findIndex((d,u)=>u>2&&Object.prototype.hasOwnProperty.call(et,r(d)));if(c<=3)return null;let l=r(n[c-1]),g=r(n[c]);if(n.length>c+1&&n[c+1].endsWith(".js")){let d=n[c+1].replace(/\.js$/i,""),u=r(d),p=i(d).replace(/_显隐判断$/,"")||i(d),m=d.includes("\u663E\u9690\u5224\u65AD")?"V8CodeShow":"V8Code";return{serverDir:n[0],osClientDir:o,osClient:a,moduleId:l,btnField:g,btnId:u,btnName:p,v8SubField:m}}if(n.length>c+2&&n[c+2].endsWith(".js")){let d=r(n[c+1]),u=i(n[c+1]),p=n[c+2].replace(/\.js$/i,""),m=r(p);return m!=="V8Code"&&m!=="V8CodeShow"?null:{serverDir:n[0],osClientDir:o,osClient:a,moduleId:l,btnField:g,btnId:d,btnName:u,v8SubField:m}}return null}function _r(s,e){let n=ee.relative(e,s).split(ee.sep),r=n[n.length-1];if(n.length<5||n[2]!==je||!r?.endsWith(".js"))return null;let i=l=>{let g=l.match(/[((]([^))]+)[))]\s*$/);return g?g[1]:l},o=i(r.replace(/\.js$/i,""));if(!Object.prototype.hasOwnProperty.call(Ct,o))return null;let a=i(n[n.length-2]);if(!a)return null;let c=n[1];return{serverDir:n[0],osClientDir:c,osClient:c.split(".")[0],moduleId:a,scriptField:o}}function Mr(s){let e=[],t=[{label:"tokens truncated",regex:/(?:\.\.\.|…)\s*[\d,.]+\s+tokens?\s+truncated\s*(?:\.\.\.|…)/i},{label:"Exit code",regex:/^\s*Exit code:\s*-?\d+\s*$/i},{label:"Process exited with code",regex:/^\s*Process exited with code\s+-?\d+\s*$/i},{label:"Chunk ID",regex:/^\s*Chunk ID:\s*\S+\s*$/i},{label:"Wall time",regex:/^\s*Wall time:\s*[\d.]+\s*(?:s|sec(?:ond)?s?)\s*$/i}];return s.replace(/\r\n/g,`
16
+ `;Ce.appendFileSync(r,u,"utf-8")}catch{}}function st(s){if(process.platform==="win32")try{let e=Dr(s);if(!e)return;try{if((0,$n.execFileSync)("git",["config","--get","core.longpaths"],{cwd:e.workTreeRoot,encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0}).trim().toLowerCase()==="true")return}catch{}(0,$n.execFileSync)("git",["config","core.longpaths","true"],{cwd:e.workTreeRoot,stdio:"ignore",windowsHide:!0})}catch{}}function q(s){let e=String(s||"").replace(/[<>:"/\\|?*\x00-\x1F]/g,"_").replace(/[. ]+$/g,""),t=!e||e==="."||e===".."?"_":e;return/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/i.test(t)?`_${t}`:t}function Ln(s){return encodeURIComponent(String(s||"")).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function Xs(s){try{return decodeURIComponent(String(s||""))}catch{return String(s||"")}}function Ae(s){let e=s.indexOf(xn);return e!==-1?s.substring(e+xn.length):s}function Zs(s){let e=s||"";if(!e.trim())return!1;let t=e.trimStart();return t.startsWith("var ")||t.startsWith("let ")||t.startsWith("const ")||t.startsWith("function")||t.startsWith("return")||t.startsWith("//")||t.startsWith("/*")||e.includes("V8.")||e.includes("return ")||e.includes("=>")||e.includes("console.")||e.includes(";")||e.includes("{")||e.includes(`
17
+ `)}function Bn(s){let e=s||"",t=e.trim();if(!t||t.length%4!==0||!/^[A-Za-z0-9+/]+={0,2}$/.test(t))return e;try{let n=Buffer.from(t,"base64").toString("utf8");if(!n||n.includes("\uFFFD"))return e;let r=t.replace(/=+$/,""),i=Buffer.from(n,"utf8").toString("base64").replace(/=+$/,"");return r!==i?e:Zs(n)?n:e}catch{return e}}function Rr(s,e){let n=te.relative(e,s).split(te.sep);if(n.length>=5&&(n[2]===Ze||n[2]==="api-engine")){let r=n[1],i=r.split(".")[0];if(n.length===5&&n[4]?.endsWith(".js")){let o=n[4].replace(".js",""),a=o.match(/\(([^)]+)\)$/);return a?{serverDir:n[0],osClientDir:r,osClient:i,category:n[3],apiEngineKey:Xs(a[1])}:{serverDir:n[0],osClientDir:r,osClient:i,category:n[3],apiEngineKey:o}}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 Ir(s,e){let n=te.relative(e,s).split(te.sep),r=i=>{let o=i.match(/[((]([^))]+)[))]\s*$/);return o?o[1]:i};if(n.length>=6&&n[2]===Oe&&n[4]===Gt){let i=n[1],o=i.split(".")[0],a=r(n[3]),c=n[5].replace(/\.js$/i,""),l=r(c);return{serverDir:n[0],osClientDir:i,osClient:o,formEngineKey:a,eventType:l}}if(n.length>=5&&(n[2]===wr||n[2]==="v8-event"||n[2]==="v8-events")){let i=n[1],o=i.split(".")[0],a=r(n[3]);return{serverDir:n[0],osClientDir:i,osClient:o,formEngineKey:a,eventType:n[4].replace(/\.js$/i,"")}}return null}function Ee(s){return(s||new Date).toISOString().replace("T"," ").substring(0,19)}function _r(s,e){let n=te.relative(e,s).split(te.sep);if(n.length<7||n[2]!==Oe||n[4]!==wt)return null;let r=d=>{let u=d.match(/[((]([^))]+)[))]\s*$/);return u?u[1]:d},i=n[1],o=i.split(".")[0],a=r(n[3]),c=r(n[5]),l=n[6].replace(/\.js$/i,""),g=r(l);return{serverDir:n[0],osClientDir:i,osClient:o,tableName:a,fieldName:c,v8Key:g}}function Mr(s,e){let n=te.relative(e,s).split(te.sep);if(n[2]!==Ke)return null;let r=d=>{let u=d.match(/[((]([^))]+)[))]\s*$/);return u?u[1]:d},i=d=>d.replace(/[((][^))]+[))]\s*$/,"").trim()||d,o=n[1],a=o.split(".")[0],c=n.findIndex((d,u)=>u>2&&Object.prototype.hasOwnProperty.call(tt,r(d)));if(c<=3)return null;let l=r(n[c-1]),g=r(n[c]);if(n.length>c+1&&n[c+1].endsWith(".js")){let d=n[c+1].replace(/\.js$/i,""),u=r(d),p=i(d).replace(/_显隐判断$/,"")||i(d),m=d.includes("\u663E\u9690\u5224\u65AD")?"V8CodeShow":"V8Code";return{serverDir:n[0],osClientDir:o,osClient:a,moduleId:l,btnField:g,btnId:u,btnName:p,v8SubField:m}}if(n.length>c+2&&n[c+2].endsWith(".js")){let d=r(n[c+1]),u=i(n[c+1]),p=n[c+2].replace(/\.js$/i,""),m=r(p);return m!=="V8Code"&&m!=="V8CodeShow"?null:{serverDir:n[0],osClientDir:o,osClient:a,moduleId:l,btnField:g,btnId:d,btnName:u,v8SubField:m}}return null}function Ar(s,e){let n=te.relative(e,s).split(te.sep),r=n[n.length-1];if(n.length<5||n[2]!==Ke||!r?.endsWith(".js"))return null;let i=l=>{let g=l.match(/[((]([^))]+)[))]\s*$/);return g?g[1]:l},o=i(r.replace(/\.js$/i,""));if(!Object.prototype.hasOwnProperty.call(Tt,o))return null;let a=i(n[n.length-2]);if(!a)return null;let c=n[1];return{serverDir:n[0],osClientDir:c,osClient:c.split(".")[0],moduleId:a,scriptField:o}}function Nr(s){let e=[],t=[{label:"tokens truncated",regex:/(?:\.\.\.|…)\s*[\d,.]+\s+tokens?\s+truncated\s*(?:\.\.\.|…)/i},{label:"Exit code",regex:/^\s*Exit code:\s*-?\d+\s*$/i},{label:"Process exited with code",regex:/^\s*Process exited with code\s+-?\d+\s*$/i},{label:"Chunk ID",regex:/^\s*Chunk ID:\s*\S+\s*$/i},{label:"Wall time",regex:/^\s*Wall time:\s*[\d.]+\s*(?:s|sec(?:ond)?s?)\s*$/i}];return s.replace(/\r\n/g,`
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 Ar(s,e){let n=ee.relative(e,s).split(ee.sep);if(n.length<7||n[2]!==Ze||n[4]!==Wt||!n[6]?.endsWith(".js"))return null;let r=g=>{let d=g.match(/[((]([^))]+)[))]\s*$/);return d?d[1]:g},i=n[1],o=i.split(".")[0],a=r(n[3]),c=r(n[5]),l=r(n[6].replace(/\.js$/i,""));return{serverDir:n[0],osClientDir:i,osClient:o,flowDesignId:a,nodeId:c,eventType:l}}function Tt(s){return String(s).padStart(2,"0")}function Nr(s=new Date){return`${s.getFullYear()}-${Tt(s.getMonth()+1)}-${Tt(s.getDate())} ${Tt(s.getHours())}:${Tt(s.getMinutes())}:${Tt(s.getSeconds())}`}function He(s,e,t){let n=String(t??"").trim();!n||e.has(n)||(e.add(n),s.push(n))}function vt(s){if(typeof s=="string")return s.trim()||"\u672A\u77E5\u9519\u8BEF";if(!s||typeof s!="object")return String(s??"\u672A\u77E5\u9519\u8BEF");let e=s,t=[],n=new Set;return He(t,n,e.message),He(t,n,e.code),He(t,n,e.syscall),e.address&&He(t,n,`address=${e.address}`),e.port!==void 0&&e.port!==null&&e.port!==""&&He(t,n,`port=${e.port}`),(Array.isArray(e.errors)?e.errors:[]).forEach(i=>He(t,n,vt(i))),t.length||He(t,n,e.name),t.join(" | ")||"\u672A\u77E5\u9519\u8BEF"}var oe=class s{static init(){s._channel||(s._channel=fe.createOutputChannel("Microi \u543E\u7801"))}static get channel(){return s._channel}static log(e,t){s.init();let n=Nr();s._channel.appendLine(`[${n}] [${e}] ${t}`)}static appendLine(e){s.init(),s._channel.appendLine(e)}static show(e){s._channel.show(e)}static dispose(){s._channel?.dispose()}};function qs(s){return typeof s=="string"?s:s&&typeof s=="object"&&"title"in s?String(s.title||""):""}function Bn(s,e){return s.then(t=>{let n=qs(t);return n&&oe.log("\u901A\u77E5/\u64CD\u4F5C",`${e}\u901A\u77E5\u9009\u62E9\uFF1A${n}`),t})}var A=class{static info(e,...t){return oe.log("\u901A\u77E5/\u4FE1\u606F",e),Bn(fe.showInformationMessage(e,...t),"\u4FE1\u606F")}static warn(e,...t){return oe.log("\u901A\u77E5/\u8B66\u544A",e),Bn(fe.showWarningMessage(e,...t),"\u8B66\u544A")}static error(e,...t){return oe.log("\u901A\u77E5/\u9519\u8BEF",e),Bn(fe.showErrorMessage(e,...t),"\u9519\u8BEF")}};var I=class s{constructor(){this._activeProfileIndex=-1;this._syncDirCasingWarningShown=!1;this.defaultSettings={apiBaseUrl:"",osClient:"",localDir:"",showConsoleOnExecute:!0,profiles:[]}}static getInstance(){return s._instance||(s._instance=new s),s._instance}getWorkspaceConfigPath(){let e=this.getWorkspaceRoot();if(e)return Ee.join(this.getDefaultSyncRootDir(e),Kt)}getWorkspaceStateFilePath(e){let t=this.getWorkspaceRoot();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");return Ee.join(this.getDefaultSyncRootDir(t),e)}readWorkspaceConfig(){let e=this.getWorkspaceConfigPath();if(!e||!q.existsSync(e))return{};try{let t=JSON.parse(q.readFileSync(e,"utf-8"));return t&&typeof t=="object"?t:{}}catch{return{}}}readWorkspaceConfigForUpdate(e){if(!q.existsSync(e))return{};let t;try{t=JSON.parse(q.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){q.mkdirSync(Ee.dirname(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;try{q.writeFileSync(n,`${JSON.stringify(t,null,2)}
20
- `,"utf-8"),q.renameSync(n,e)}finally{try{q.existsSync(n)&&q.unlinkSync(n)}catch{}}}async mutateWorkspaceConfig(e){let t=this.getWorkspaceConfigPath();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");q.mkdirSync(Ee.dirname(t),{recursive:!0});let n=`${t}.lock`,r=Date.now()+3e3,i;for(;i===void 0;)try{i=q.openSync(n,"wx",384),q.writeFileSync(i,JSON.stringify({pid:process.pid,createdAt:Date.now()}),"utf-8")}catch(o){if(o.code!=="EEXIST")throw o;try{Date.now()-q.statSync(n).mtimeMs>3e4&&q.unlinkSync(n)}catch{}if(Date.now()>=r)throw new Error("Microi \u914D\u7F6E\u6B63\u5728\u88AB CLI \u6216 VS Code \u63D2\u4EF6\u4FEE\u6539\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");await new Promise(c=>setTimeout(c,40))}try{let o=this.readWorkspaceConfigForUpdate(t),a=this.normalizeSettings(e(o));return this.writeWorkspaceConfig(t,a),this.normalizeSettings(a)}finally{try{q.closeSync(i)}catch{}try{q.unlinkSync(n)}catch{}}}normalizeSettings(e){return{...this.defaultSettings,...e,profiles:Array.isArray(e.profiles)?e.profiles:[],showConsoleOnExecute:e.showConsoleOnExecute??this.defaultSettings.showConsoleOnExecute}}getSettings(){return this.normalizeSettings(this.readWorkspaceConfig())}async updateSettings(e){await this.mutateWorkspaceConfig(t=>({...t,...e}))}getProfiles(){return this.getSettings().profiles}findProfileByIdentity(e,t){let n=this.profileIdentity({apiBaseUrl:e,osClient:t});return this.getProfiles().find(r=>this.profileIdentity(r)===n)}async addProfile(e){await this.upsertProfiles([e])}async upsertProfiles(e){await this.mutateWorkspaceConfig(t=>{let n=Array.isArray(t.profiles)?[...t.profiles]:[];for(let r of e){let i=this.profileIdentity(r),o=n.findIndex(a=>this.profileIdentity(a)===i);if(o>=0){let a=n[o];n[o]={...a,...r,apiBaseUrl:a.apiBaseUrl,osClient:a.osClient}}else n.push(r)}return{...t,profiles:n}})}async removeProfile(e){let t=await this.mutateWorkspaceConfig(n=>{let r=Array.isArray(n.profiles)?[...n.profiles]:[];return r.splice(e,1),{...n,profiles:r}});this._activeProfileIndex>=t.profiles.length&&(this._activeProfileIndex=t.profiles.length-1)}profileIdentity(e){let t=String(e.apiBaseUrl||"").trim().replace(/\/+$/,""),n=t;try{let r=new URL(t);n=`${r.protocol.toLowerCase()}//${r.host.toLowerCase()}${r.pathname.replace(/\/+$/,"")}`}catch{n=t.toLowerCase()}return`${n}|${String(e.osClient||"").trim().toLowerCase()}`}setActiveProfile(e){this._activeProfileIndex=e}get activeProfileIndex(){return this._activeProfileIndex}getActiveProfile(){let e=this.getProfiles();if(this._activeProfileIndex>=0&&this._activeProfileIndex<e.length)return e[this._activeProfileIndex];let t=this.getSettings();return t.apiBaseUrl?{label:"",apiBaseUrl:t.apiBaseUrl,osClient:t.osClient}:e[0]}getWorkspaceRoot(){return ht.workspaceFolders?.[0]?.uri.fsPath}getDefaultSyncRootDir(e){return this.ensureDefaultSyncDirCasing(e),Ee.join(e,De)}ensureDefaultSyncDirCasing(e){try{if(!q.existsSync(e))return;let t=q.readdirSync(e,{withFileTypes:!0}).filter(a=>a.isDirectory());if(t.some(a=>a.name===De))return;let n=t.find(a=>a.name.toLowerCase()===De.toLowerCase());if(!n)return;let r=Ee.join(e,n.name),i=Ee.join(e,De),o=Ee.join(e,`${De}.case-rename-${Date.now()}`);q.renameSync(r,o);try{q.renameSync(o,i)}catch(a){try{q.renameSync(o,r)}catch{}throw a}}catch{this._syncDirCasingWarningShown||(this._syncDirCasingWarningShown=!0,A.warn(`Microi: \u65E0\u6CD5\u5C06\u65E7\u540C\u6B65\u76EE\u5F55\u91CD\u547D\u540D\u4E3A ${De}\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=Ee.resolve(t).toLowerCase(),r=Fr.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 J(`${e||"\u672A\u547D\u540D"} (${n})`)}buildOsClientDirName(e,t,n){return J([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 xr(s){if(s?.Code===1001||s?.Code===1002)return!0;let e=String(s?.DataAppend?.ReasonCode||"").trim();if(/^(MissingToken|MalformedToken|MissingClaims|TenantMismatch|AuthVersionChanged|JwtExpired|SessionExpired|SessionMissing|TokenReplaced|SignatureMismatch)$/i.test(e))return!0;let t=[s?.Msg,s?.DataAppend?.UserMessage,s?.DataAppend?.AppendMsg].filter(Boolean).join(" ");return/Token签名|Token.*(无效|失效|过期)|登录.*(无效|失效|过期)|invalid\s*token|token\s*invalid|signature\s*mismatch/i.test(t)}function Et(s){if(!xr(s))return!1;let e=String(s?.DataAppend?.ReasonCode||"").trim();if(/^(InvalidTenant|InvalidOsClient|TenantNotFound|TenantDisabled)$/i.test(e))return!0;let t=[s?.Msg,s?.DataAppend?.UserMessage,s?.DataAppend?.Hint].filter(Boolean).join(" ");return/无效的租户标识|租户不存在|租户.*未启用|invalid\s+(tenant|osclient)|tenant\s+not\s+found|unknown\s+tenant/i.test(t)}function qt(s){return xr(s)&&!Et(s)}function Or(s){return/^[a-f0-9]{64}$/i.test(String(s||"").trim())}function Vr(s){try{let t=String(s||"").replace(/^Bearer\s+/i,"").trim().split(".");if(t.length<2)return;let n=t[1].replace(/-/g,"+").replace(/_/g,"/"),r=JSON.parse(Buffer.from(n,"base64").toString("utf-8")),i=Number(r.MicroiTokenIssuedAt??r.iat);return Number.isFinite(i)&&i>0?i:void 0}catch{return}}function st(s,e,t=!1){let n=String(s||"").trim(),r=String(e||"").trim();if(!n)return r;if(!r||r===n)return n;let i=Vr(n),o=Vr(r);return i!==void 0&&o!==void 0&&i!==o?o>i?r:n:i===void 0&&o!==void 0?r:o===void 0&&i!==void 0?n:t?r:n}var Jt=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 $r="microi.authTokenMap",Qs=64*1024;function Ys(s){return new Promise((e,t)=>{let n=!1,r=()=>{s.removeListener("drain",o),s.removeListener("error",a),s.removeListener("close",c)},i=l=>{n||(n=!0,r(),l())},o=()=>i(e),a=l=>i(()=>t(l)),c=()=>i(()=>t(new Error("\u8BF7\u6C42\u8FDE\u63A5\u5728\u5199\u5165\u5B8C\u6210\u524D\u5173\u95ED")));s.once("drain",o),s.once("error",a),s.once("close",c)})}async function Xs(s,e,t){let n=Buffer.isBuffer(e)?e:Buffer.from(e,"utf8"),r=0;for(;r<n.length;){let i=Math.min(r+Qs,n.length),o=s.write(n.subarray(r,i));r=i,t?.(r),o||await Ys(s)}return s.end(),r}var j=class s{constructor(){this._strictTlsHosts=new Set;this._token="";this._tokenMap={};this._authRecoveryGate=new Jt}setStrictTlsHosts(e){this._strictTlsHosts=new Set(e.map(t=>t.toLowerCase()))}static getInstance(){return s._instance||(s._instance=new s),s._instance}setSecretStorage(e){this._secretStorage=e}setAuthRecoveryHandler(e){this._authRecoveryHandler=e}setTokenStateChangedHandler(e){this._tokenStateChangedHandler=e}async notifyTokenStateChanged(){if(this._tokenStateChangedHandler)try{await this._tokenStateChangedHandler()}catch{}}getDeviceId(){let e=ht.workspaceFile?.fsPath||ht.workspaceFolders?.map(n=>n.uri.fsPath).sort().join("|")||Pn.sessionId||"empty-window",t=Xt.createHash("sha256").update(e.toLowerCase()).digest("hex").slice(0,16);return`VSCode:${Pn.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(a=>String(a.apiBaseUrl||"").trim().replace(/\/+$/,"").toLowerCase()===n);return{tenantKeyUnambiguous:i.filter(a=>String(a.osClient||"").trim().toLowerCase()===r).length<=1,apiKeyUnambiguous:i.length<=1}}catch{return{tenantKeyUnambiguous:!0,apiKeyUnambiguous:!0}}}tokenLookupKeys(e,t,n,r){let i=[],o=this.legacyTokenScope(e,t);if(t){let a=this.tokenKey(e,t,n,r),c=this.tokenKey(e,t,"",""),l=this.legacyCompactTokenKey(e,t,n,r);i.push(a),o.tenantKeyUnambiguous&&i.push(c),(l===a||o.tenantKeyUnambiguous)&&i.push(l),n&&o.tenantKeyUnambiguous&&i.push(this.legacyCompactTokenKey(e,t,n)),o.tenantKeyUnambiguous&&i.push(this.legacyCompactTokenKey(e,t))}return(!t||o.apiKeyUnambiguous)&&i.push(e),Array.from(new Set(i))}async persistTokens(){if(!this._secretStorage)return;let e=I.getInstance(),t=e.getWorkspaceSecretKey(xn),n=e.getWorkspaceSecretKey($r);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(xn))||"";try{let t=await this._secretStorage.get(e.getWorkspaceSecretKey($r));t&&(this._tokenMap=JSON.parse(t))}catch{}}return this._token}getTokenForServer(e,t,n,r){let i=this.tokenLookupKeys(e,t,n,r),o="";for(let a of i)t&&a===e||(o=st(o,this._tokenMap[a]));return o||i.includes(e)&&this._tokenMap[e]||""}getExactTokenForServer(e,t,n,r){return this._tokenMap[this.tokenKey(e,t,n,r)]||""}async adoptTokenFromSharedFile(e,t,n,r,i){await this.adoptTokensFromSharedFile([{token:e,apiBaseUrl:t,osClient:n,osClientType:r,osClientNetwork:i}])}async adoptTokensFromSharedFile(e){let t=0,n=!1;for(let r of e){let i=String(r.token||"").trim();if(!i)continue;let o=this.tokenKey(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork);this._tokenMap[o]!==i&&(this._tokenMap[o]=i,t+=1,n=!0);let a=st(this._token,i);a!==this._token&&(this._token=a,n=!0)}return n&&await this.persistTokens(),t}async clearTokenForServer(e,t,n,r,i){let o=!1;for(let a of this.tokenLookupKeys(e,t,n,r))this._tokenMap[a]&&(!i||this._tokenMap[a]===i)&&(delete this._tokenMap[a],o=!0);this._token&&(!i||this._token===i)&&(this._token="",o=!0),o&&(await this.persistTokens(),await this.notifyTokenStateChanged())}async clearToken(){this._token="",this._tokenMap={},await this.persistTokens(),await this.notifyTokenStateChanged()}get hasToken(){return!!this._token||Object.keys(this._tokenMap).length>0}isInvalidRefreshToken(e,t){if(t===401||t===403)return!0;let n=String(e?.DataAppend?.ReasonCode||"");if(/^(MissingToken|MalformedToken|MissingClaims|TenantMismatch|AuthVersionChanged|JwtExpired|SessionExpired|SessionMissing|TokenReplaced)$/i.test(n))return!0;let r=e?.Msg||"";return e?.Code!==1&&/无效.*Token|Token.*无效|Token.*过期|登录.*过期|租户.*不一致|invalid\s*token|token\s*invalid/i.test(r)}serializeRequestBody(e,t){if(t==="form"){let n=new URLSearchParams;if(e&&typeof e=="object"&&!Array.isArray(e))for(let[r,i]of Object.entries(e))i!=null&&n.append(r,typeof i=="object"?JSON.stringify(i):String(i));return n.toString()}return JSON.stringify(e)}maskSensitiveBody(e){if(!e||typeof e!="object")return e;if(Array.isArray(e))return e.map(n=>this.maskSensitiveBody(n));let t={};for(let[n,r]of Object.entries(e))/^(pwd|password|authorization|token)$/i.test(n)?t[n]="***":r&&typeof r=="object"?t[n]=this.maskSensitiveBody(r):t[n]=r;return t}async refreshTokenForRequest(e,t,n){if(!t)return!1;let r=I.getInstance(),i=e.osClient||r.getOsClient()||"",o=new URL(n),c=o.pathname.replace(/\/+$/,"")+H.REFRESH_TOKEN,l=o.protocol==="https:",g=l?Qt:Yt,d=JSON.stringify({authorization:t,OsClient:i||void 0,_ClientType:"VSCode"}),u={hostname:o.hostname,port:o.port||(l?443:80),path:c,method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json",Authorization:`Bearer ${t}`,did:this.getDeviceId(),"Content-Length":Buffer.byteLength(d),...i?{OsClient:i}:{}},timeout:e.timeout||3e4,rejectUnauthorized:this._strictTlsHosts.has(o.hostname.toLowerCase())};return oe.log("API",`\u{1F504} RefreshToken ${n}${c}`),new Promise(p=>{let m=g.request(u,f=>{let y=[];f.on("data",S=>y.push(S)),f.on("end",async()=>{let S=Buffer.concat(y).toString("utf-8"),h;try{h=JSON.parse(S)}catch{}let C=f.headers,T=f.statusCode||0,b=C.authorization||"";if(h?.Code===1&&b){await this.setToken(b,e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork),oe.log("API","\u2705 Token \u5DF2\u4EE5\u65E7\u6362\u65B0"),p(!0);return}this.isInvalidRefreshToken(h,T)&&await this.clearTokenForServer(e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork,t),oe.log("API",`\u26A0\uFE0F RefreshToken \u5931\u8D25: ${h?.Msg||S.slice(0,120)}`),p(!1)})});m.on("error",f=>{oe.log("API",`\u274C RefreshToken Error: ${f.message}`),p(!1)}),m.on("timeout",()=>{m.destroy(),p(!1)}),m.write(d),m.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),o=r.pathname.replace(/\/+$/,"")+e.path;if(e.params){let y=new URLSearchParams;for(let[h,C]of Object.entries(e.params))C!==void 0&&C!==""&&y.append(h,C);let S=y.toString();S&&(o+=`?${S}`)}let a=r.protocol==="https:",c=a?Qt:Yt,l=e.bodyFormat||"json",g=e.body!==void 0?this.serializeRequestBody(e.body,l):void 0,d={hostname:r.hostname,port:r.port||(a?443:80),path:o,method:e.method,headers:{"Content-Type":l==="form"?"application/x-www-form-urlencoded":"application/json",Accept:"application/json",did:this.getDeviceId()},timeout:e.timeout||3e4,rejectUnauthorized:this._strictTlsHosts.has(r.hostname.toLowerCase())};g!==void 0&&(d.headers["Content-Length"]=Buffer.byteLength(g));let u=e.allowAuthRetry!==!1,p=e.osClient||t.getOsClient()||"";p&&(d.headers.OsClient=p);let m=e.apiBaseUrl?this.getTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork):await this.loadToken();m&&(d.headers.Authorization=`Bearer ${m}`);let f=`${n}${o}`;if(e.silent||oe.log("API",`\u27A1\uFE0F ${e.method} ${f}`),e.body&&!e.silent){let y=JSON.stringify(this.maskSensitiveBody(e.body));oe.appendLine(` Body: ${y.length>500?y.substring(0,500)+"...(truncated)":y}`)}return new Promise((y,S)=>{let h=g===void 0?0:Buffer.byteLength(g),C=0,T=c.request(d,v=>{let k=[];v.on("data",V=>k.push(V)),v.on("end",async()=>{let V=Buffer.concat(k).toString("utf-8"),Q=v.statusCode||0;if(!e.silent){oe.log("API",`\u2B05\uFE0F ${Q} ${e.method} ${e.path}`);let R=V.length>500?V.substring(0,500)+"...(truncated)":V;oe.appendLine(` Response: ${R}`)}let N;try{N=JSON.parse(V)}catch{}if(N){let R={};for(let[M,P]of Object.entries(v.headers))typeof P=="string"&&(R[M.toLowerCase()]=P);N._headers=R;let O=R.authorization||"";if(O&&O!==m&&await this.setToken(O,e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork),u&&Et(N))oe.log("API",`\u26A0\uFE0F \u79DF\u6237\u8FDE\u63A5\u914D\u7F6E\u65E0\u6548\uFF0C\u5DF2\u505C\u6B62 token \u5237\u65B0\u4E0E\u9759\u9ED8\u91CD\u767B: ${N.Msg||""}`);else if(u&&qt(N)&&(oe.log("API",`\u{1F510} \u8EAB\u4EFD\u5DF2\u8FC7\u671F\uFF0C\u5C1D\u8BD5\u4F7F\u7528\u65E7 token \u5237\u65B0\u540E\u91CD\u8BD5: ${N.Msg||""}`),await this.refreshTokenForRequest(e,m,n)||await this.recoverAuthForRequest(e,n))){try{y(await this.request({...e,allowAuthRetry:!1}))}catch(x){S(x)}return}y(N)}else if(Q===401||Q===403){if(u&&(await this.refreshTokenForRequest(e,m,n)||await this.recoverAuthForRequest(e,n))){try{y(await this.request({...e,allowAuthRetry:!1}))}catch(M){S(M)}return}S(new Error(`\u8EAB\u4EFD\u9A8C\u8BC1\u5931\u8D25 (HTTP ${Q})\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55`))}else if(Q>=400){let R=V.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim().substring(0,120);S(new Error(`\u670D\u52A1\u5668\u9519\u8BEF (HTTP ${Q}): ${R||"\u672A\u77E5\u9519\u8BEF"}`))}else S(new Error(`\u54CD\u5E94\u89E3\u6790\u5931\u8D25 (HTTP ${Q}): ${V.substring(0,200)}`))})}),b=!1;T.on("error",v=>{if(b)return;let k=vt(v),V=h>0?`\uFF1B\u8BF7\u6C42\u4F53\u5DF2\u5206\u7247\u6392\u961F ${C}/${h} bytes\uFF0C\u670D\u52A1\u7AEF\u662F\u5426\u5DF2\u63D0\u4EA4\u672A\u77E5\uFF0C\u63D2\u4EF6\u4E0D\u4F1A\u76F2\u76EE\u91CD\u653E\u975E\u5E42\u7B49\u8BF7\u6C42`:"";e.silent||oe.log("API",`\u274C ${e.method} ${e.path} Error: ${k}${V}`),S(new Error(`\u8BF7\u6C42\u5931\u8D25: ${k}${V}`))}),T.on("timeout",()=>{b=!0,T.destroy(),e.silent||oe.log("API",`\u23F0 ${e.method} ${e.path} Timeout`),S(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),g!==void 0?Xs(T,g,v=>{C=v}).catch(v=>{!b&&!T.destroyed&&T.destroy(v instanceof Error?v:new Error(String(v)))}):T.end()})}async get(e,t,n,r){return this.request({method:"GET",path:e,params:t,apiBaseUrl:n,osClient:r?.osClient,osClientType:r?.osClientType,osClientNetwork:r?.osClientNetwork})}async post(e,t,n,r,i,o,a){return this.request({method:"POST",path:e,body:t,params:n,apiBaseUrl:r,osClient:i?.osClient,osClientType:i?.osClientType,osClientNetwork:i?.osClientNetwork,timeout:o,silent:a})}async getRaw(e,t,n){let r=I.getInstance(),i=n||r.getApiBaseUrl();if(!i)throw new Error("\u672A\u914D\u7F6E API \u5730\u5740");let o=new URL(i),c=o.pathname.replace(/\/+$/,"")+e;if(t){let u=new URLSearchParams;for(let[m,f]of Object.entries(t))f!==void 0&&f!==""&&u.append(m,f);let p=u.toString();p&&(c+=`?${p}`)}let l=o.protocol==="https:",g=l?Qt:Yt,d={hostname:o.hostname,port:o.port||(l?443:80),path:c,method:"GET",timeout:15e3,rejectUnauthorized:this._strictTlsHosts.has(o.hostname.toLowerCase())};return new Promise((u,p)=>{let m=g.request(d,f=>{let y=[];f.on("data",S=>y.push(S)),f.on("end",()=>{let S=Buffer.concat(y),h=f.headers.captchaid||"";u({data:S,captchaId:h,statusCode:f.statusCode||0,contentType:String(f.headers["content-type"]||"")})})});m.on("error",f=>p(new Error(`\u8BF7\u6C42\u5931\u8D25: ${f.message}`))),m.on("timeout",()=>{m.destroy(),p(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),m.end()})}async postMultipartFile(e,t,n,r,i,o,a=30*60*1e3){let c=it.realpathSync(n),l=it.lstatSync(c);if(!l.isFile()||l.isSymbolicLink())throw new Error(`\u4E0A\u4F20\u8D44\u4EA7\u5FC5\u987B\u662F\u666E\u901A\u6587\u4EF6\u4E14\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\uFF1A${n}`);if(!r||/[\r\n"]/u.test(r))throw new Error("\u4E0A\u4F20\u6587\u4EF6\u540D\u4E0D\u5408\u6CD5");let g=String(i||"").replace(/\/+$/,""),d=new URL(g),u=`----microi-vscode-${Xt.randomBytes(24).toString("hex")}`,p=Object.entries(t).map(([v,k])=>Buffer.from(`--${u}\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 Fr(s,e){let n=te.relative(e,s).split(te.sep);if(n.length<7||n[2]!==et||n[4]!==zt||!n[6]?.endsWith(".js"))return null;let r=g=>{let d=g.match(/[((]([^))]+)[))]\s*$/);return d?d[1]:g},i=n[1],o=i.split(".")[0],a=r(n[3]),c=r(n[5]),l=r(n[6].replace(/\.js$/i,""));return{serverDir:n[0],osClientDir:i,osClient:o,flowDesignId:a,nodeId:c,eventType:l}}function Et(s){return String(s).padStart(2,"0")}function Vr(s=new Date){return`${s.getFullYear()}-${Et(s.getMonth()+1)}-${Et(s.getDate())} ${Et(s.getHours())}:${Et(s.getMinutes())}:${Et(s.getSeconds())}`}function We(s,e,t){let n=String(t??"").trim();!n||e.has(n)||(e.add(n),s.push(n))}function bt(s){if(typeof s=="string")return s.trim()||"\u672A\u77E5\u9519\u8BEF";if(!s||typeof s!="object")return String(s??"\u672A\u77E5\u9519\u8BEF");let e=s,t=[],n=new Set;return We(t,n,e.message),We(t,n,e.code),We(t,n,e.syscall),e.address&&We(t,n,`address=${e.address}`),e.port!==void 0&&e.port!==null&&e.port!==""&&We(t,n,`port=${e.port}`),(Array.isArray(e.errors)?e.errors:[]).forEach(i=>We(t,n,bt(i))),t.length||We(t,n,e.name),t.join(" | ")||"\u672A\u77E5\u9519\u8BEF"}var ae=class s{static init(){s._channel||(s._channel=he.createOutputChannel("Microi \u543E\u7801"))}static get channel(){return s._channel}static log(e,t){s.init();let n=Vr();s._channel.appendLine(`[${n}] [${e}] ${t}`)}static appendLine(e){s.init(),s._channel.appendLine(e)}static show(e){s._channel.show(e)}static dispose(){s._channel?.dispose()}};function ei(s){return typeof s=="string"?s:s&&typeof s=="object"&&"title"in s?String(s.title||""):""}function Un(s,e){return s.then(t=>{let n=ei(t);return n&&ae.log("\u901A\u77E5/\u64CD\u4F5C",`${e}\u901A\u77E5\u9009\u62E9\uFF1A${n}`),t})}var A=class{static info(e,...t){return ae.log("\u901A\u77E5/\u4FE1\u606F",e),Un(he.showInformationMessage(e,...t),"\u4FE1\u606F")}static warn(e,...t){return ae.log("\u901A\u77E5/\u8B66\u544A",e),Un(he.showWarningMessage(e,...t),"\u8B66\u544A")}static error(e,...t){return ae.log("\u901A\u77E5/\u9519\u8BEF",e),Un(he.showErrorMessage(e,...t),"\u9519\u8BEF")}};var I=class s{constructor(){this._activeProfileIndex=-1;this._syncDirCasingWarningShown=!1;this.defaultSettings={apiBaseUrl:"",osClient:"",localDir:"",showConsoleOnExecute:!0,profiles:[]}}static getInstance(){return s._instance||(s._instance=new s),s._instance}getWorkspaceConfigPath(){let e=this.getWorkspaceRoot();if(e)return be.join(this.getDefaultSyncRootDir(e),Wt)}getWorkspaceStateFilePath(e){let t=this.getWorkspaceRoot();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");return be.join(this.getDefaultSyncRootDir(t),e)}readWorkspaceConfig(){let e=this.getWorkspaceConfigPath();if(!e||!Q.existsSync(e))return{};try{let t=JSON.parse(Q.readFileSync(e,"utf-8"));return t&&typeof t=="object"?t:{}}catch{return{}}}readWorkspaceConfigForUpdate(e){if(!Q.existsSync(e))return{};let t;try{t=JSON.parse(Q.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){Q.mkdirSync(be.dirname(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;try{Q.writeFileSync(n,`${JSON.stringify(t,null,2)}
20
+ `,"utf-8"),Q.renameSync(n,e)}finally{try{Q.existsSync(n)&&Q.unlinkSync(n)}catch{}}}async mutateWorkspaceConfig(e){let t=this.getWorkspaceConfigPath();if(!t)throw new Error("\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A");Q.mkdirSync(be.dirname(t),{recursive:!0});let n=`${t}.lock`,r=Date.now()+3e3,i;for(;i===void 0;)try{i=Q.openSync(n,"wx",384),Q.writeFileSync(i,JSON.stringify({pid:process.pid,createdAt:Date.now()}),"utf-8")}catch(o){if(o.code!=="EEXIST")throw o;try{Date.now()-Q.statSync(n).mtimeMs>3e4&&Q.unlinkSync(n)}catch{}if(Date.now()>=r)throw new Error("Microi \u914D\u7F6E\u6B63\u5728\u88AB CLI \u6216 VS Code \u63D2\u4EF6\u4FEE\u6539\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");await new Promise(c=>setTimeout(c,40))}try{let o=this.readWorkspaceConfigForUpdate(t),a=this.normalizeSettings(e(o));return this.writeWorkspaceConfig(t,a),this.normalizeSettings(a)}finally{try{Q.closeSync(i)}catch{}try{Q.unlinkSync(n)}catch{}}}normalizeSettings(e){return{...this.defaultSettings,...e,profiles:Array.isArray(e.profiles)?e.profiles:[],showConsoleOnExecute:e.showConsoleOnExecute??this.defaultSettings.showConsoleOnExecute}}getSettings(){return this.normalizeSettings(this.readWorkspaceConfig())}async updateSettings(e){await this.mutateWorkspaceConfig(t=>({...t,...e}))}getProfiles(){return this.getSettings().profiles}findProfileByIdentity(e,t){let n=this.profileIdentity({apiBaseUrl:e,osClient:t});return this.getProfiles().find(r=>this.profileIdentity(r)===n)}async addProfile(e){await this.upsertProfiles([e])}async upsertProfiles(e){await this.mutateWorkspaceConfig(t=>{let n=Array.isArray(t.profiles)?[...t.profiles]:[];for(let r of e){let i=this.profileIdentity(r),o=n.findIndex(a=>this.profileIdentity(a)===i);if(o>=0){let a=n[o];n[o]={...a,...r,apiBaseUrl:a.apiBaseUrl,osClient:a.osClient}}else n.push(r)}return{...t,profiles:n}})}async removeProfile(e){let t=await this.mutateWorkspaceConfig(n=>{let r=Array.isArray(n.profiles)?[...n.profiles]:[];return r.splice(e,1),{...n,profiles:r}});this._activeProfileIndex>=t.profiles.length&&(this._activeProfileIndex=t.profiles.length-1)}profileIdentity(e){let t=String(e.apiBaseUrl||"").trim().replace(/\/+$/,""),n=t;try{let r=new URL(t);n=`${r.protocol.toLowerCase()}//${r.host.toLowerCase()}${r.pathname.replace(/\/+$/,"")}`}catch{n=t.toLowerCase()}return`${n}|${String(e.osClient||"").trim().toLowerCase()}`}setActiveProfile(e){this._activeProfileIndex=e}get activeProfileIndex(){return this._activeProfileIndex}getActiveProfile(){let e=this.getProfiles();if(this._activeProfileIndex>=0&&this._activeProfileIndex<e.length)return e[this._activeProfileIndex];let t=this.getSettings();return t.apiBaseUrl?{label:"",apiBaseUrl:t.apiBaseUrl,osClient:t.osClient}:e[0]}getWorkspaceRoot(){return St.workspaceFolders?.[0]?.uri.fsPath}getDefaultSyncRootDir(e){return this.ensureDefaultSyncDirCasing(e),be.join(e,Re)}ensureDefaultSyncDirCasing(e){try{if(!Q.existsSync(e))return;let t=Q.readdirSync(e,{withFileTypes:!0}).filter(a=>a.isDirectory());if(t.some(a=>a.name===Re))return;let n=t.find(a=>a.name.toLowerCase()===Re.toLowerCase());if(!n)return;let r=be.join(e,n.name),i=be.join(e,Re),o=be.join(e,`${Re}.case-rename-${Date.now()}`);Q.renameSync(r,o);try{Q.renameSync(o,i)}catch(a){try{Q.renameSync(o,r)}catch{}throw a}}catch{this._syncDirCasingWarningShown||(this._syncDirCasingWarningShown=!0,A.warn(`Microi: \u65E0\u6CD5\u5C06\u65E7\u540C\u6B65\u76EE\u5F55\u91CD\u547D\u540D\u4E3A ${Re}\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=be.resolve(t).toLowerCase(),r=xr.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 q(`${e||"\u672A\u547D\u540D"} (${n})`)}buildOsClientDirName(e,t,n){return q([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 $r(s){if(s?.Code===1001||s?.Code===1002)return!0;let e=String(s?.DataAppend?.ReasonCode||"").trim();if(/^(MissingToken|MalformedToken|MissingClaims|TenantMismatch|AuthVersionChanged|JwtExpired|SessionExpired|SessionMissing|TokenReplaced|SignatureMismatch)$/i.test(e))return!0;let t=[s?.Msg,s?.DataAppend?.UserMessage,s?.DataAppend?.AppendMsg].filter(Boolean).join(" ");return/Token签名|Token.*(无效|失效|过期)|登录.*(无效|失效|过期)|invalid\s*token|token\s*invalid|signature\s*mismatch/i.test(t)}function kt(s){if(!$r(s))return!1;let e=String(s?.DataAppend?.ReasonCode||"").trim();if(/^(InvalidTenant|InvalidOsClient|TenantNotFound|TenantDisabled)$/i.test(e))return!0;let t=[s?.Msg,s?.DataAppend?.UserMessage,s?.DataAppend?.Hint].filter(Boolean).join(" ");return/无效的租户标识|租户不存在|租户.*未启用|invalid\s+(tenant|osclient)|tenant\s+not\s+found|unknown\s+tenant/i.test(t)}function Yt(s){return $r(s)&&!kt(s)}function Lr(s){return/^[a-f0-9]{64}$/i.test(String(s||"").trim())}function Or(s){try{let t=String(s||"").replace(/^Bearer\s+/i,"").trim().split(".");if(t.length<2)return;let n=t[1].replace(/-/g,"+").replace(/_/g,"/"),r=JSON.parse(Buffer.from(n,"base64").toString("utf-8")),i=Number(r.MicroiTokenIssuedAt??r.iat);return Number.isFinite(i)&&i>0?i:void 0}catch{return}}function it(s,e,t=!1){let n=String(s||"").trim(),r=String(e||"").trim();if(!n)return r;if(!r||r===n)return n;let i=Or(n),o=Or(r);return i!==void 0&&o!==void 0&&i!==o?o>i?r:n:i===void 0&&o!==void 0?r:o===void 0&&i!==void 0?n:t?r:n}var Qt=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 Br="microi.authTokenMap",ti=64*1024;function ni(s){return new Promise((e,t)=>{let n=!1,r=()=>{s.removeListener("drain",o),s.removeListener("error",a),s.removeListener("close",c)},i=l=>{n||(n=!0,r(),l())},o=()=>i(e),a=l=>i(()=>t(l)),c=()=>i(()=>t(new Error("\u8BF7\u6C42\u8FDE\u63A5\u5728\u5199\u5165\u5B8C\u6210\u524D\u5173\u95ED")));s.once("drain",o),s.once("error",a),s.once("close",c)})}async function ri(s,e,t){let n=Buffer.isBuffer(e)?e:Buffer.from(e,"utf8"),r=0;for(;r<n.length;){let i=Math.min(r+ti,n.length),o=s.write(n.subarray(r,i));r=i,t?.(r),o||await ni(s)}return s.end(),r}var j=class s{constructor(){this._strictTlsHosts=new Set;this._token="";this._tokenMap={};this._authRecoveryGate=new Qt}setStrictTlsHosts(e){this._strictTlsHosts=new Set(e.map(t=>t.toLowerCase()))}static getInstance(){return s._instance||(s._instance=new s),s._instance}setSecretStorage(e){this._secretStorage=e}setAuthRecoveryHandler(e){this._authRecoveryHandler=e}setTokenStateChangedHandler(e){this._tokenStateChangedHandler=e}async notifyTokenStateChanged(){if(this._tokenStateChangedHandler)try{await this._tokenStateChangedHandler()}catch{}}getDeviceId(){let e=St.workspaceFile?.fsPath||St.workspaceFolders?.map(n=>n.uri.fsPath).sort().join("|")||Dn.sessionId||"empty-window",t=en.createHash("sha256").update(e.toLowerCase()).digest("hex").slice(0,16);return`VSCode:${Dn.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(a=>String(a.apiBaseUrl||"").trim().replace(/\/+$/,"").toLowerCase()===n);return{tenantKeyUnambiguous:i.filter(a=>String(a.osClient||"").trim().toLowerCase()===r).length<=1,apiKeyUnambiguous:i.length<=1}}catch{return{tenantKeyUnambiguous:!0,apiKeyUnambiguous:!0}}}tokenLookupKeys(e,t,n,r){let i=[],o=this.legacyTokenScope(e,t);if(t){let a=this.tokenKey(e,t,n,r),c=this.tokenKey(e,t,"",""),l=this.legacyCompactTokenKey(e,t,n,r);i.push(a),o.tenantKeyUnambiguous&&i.push(c),(l===a||o.tenantKeyUnambiguous)&&i.push(l),n&&o.tenantKeyUnambiguous&&i.push(this.legacyCompactTokenKey(e,t,n)),o.tenantKeyUnambiguous&&i.push(this.legacyCompactTokenKey(e,t))}return(!t||o.apiKeyUnambiguous)&&i.push(e),Array.from(new Set(i))}async persistTokens(){if(!this._secretStorage)return;let e=I.getInstance(),t=e.getWorkspaceSecretKey(On),n=e.getWorkspaceSecretKey(Br);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(On))||"";try{let t=await this._secretStorage.get(e.getWorkspaceSecretKey(Br));t&&(this._tokenMap=JSON.parse(t))}catch{}}return this._token}getTokenForServer(e,t,n,r){let i=this.tokenLookupKeys(e,t,n,r),o="";for(let a of i)t&&a===e||(o=it(o,this._tokenMap[a]));return o||i.includes(e)&&this._tokenMap[e]||""}getExactTokenForServer(e,t,n,r){return this._tokenMap[this.tokenKey(e,t,n,r)]||""}async adoptTokenFromSharedFile(e,t,n,r,i){await this.adoptTokensFromSharedFile([{token:e,apiBaseUrl:t,osClient:n,osClientType:r,osClientNetwork:i}])}async adoptTokensFromSharedFile(e){let t=0,n=!1;for(let r of e){let i=String(r.token||"").trim();if(!i)continue;let o=this.tokenKey(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork);this._tokenMap[o]!==i&&(this._tokenMap[o]=i,t+=1,n=!0);let a=it(this._token,i);a!==this._token&&(this._token=a,n=!0)}return n&&await this.persistTokens(),t}async clearTokenForServer(e,t,n,r,i){let o=!1;for(let a of this.tokenLookupKeys(e,t,n,r))this._tokenMap[a]&&(!i||this._tokenMap[a]===i)&&(delete this._tokenMap[a],o=!0);this._token&&(!i||this._token===i)&&(this._token="",o=!0),o&&(await this.persistTokens(),await this.notifyTokenStateChanged())}async clearToken(){this._token="",this._tokenMap={},await this.persistTokens(),await this.notifyTokenStateChanged()}get hasToken(){return!!this._token||Object.keys(this._tokenMap).length>0}isInvalidRefreshToken(e,t){if(t===401||t===403)return!0;let n=String(e?.DataAppend?.ReasonCode||"");if(/^(MissingToken|MalformedToken|MissingClaims|TenantMismatch|AuthVersionChanged|JwtExpired|SessionExpired|SessionMissing|TokenReplaced)$/i.test(n))return!0;let r=e?.Msg||"";return e?.Code!==1&&/无效.*Token|Token.*无效|Token.*过期|登录.*过期|租户.*不一致|invalid\s*token|token\s*invalid/i.test(r)}serializeRequestBody(e,t){if(t==="form"){let n=new URLSearchParams;if(e&&typeof e=="object"&&!Array.isArray(e))for(let[r,i]of Object.entries(e))i!=null&&n.append(r,typeof i=="object"?JSON.stringify(i):String(i));return n.toString()}return JSON.stringify(e)}maskSensitiveBody(e){if(!e||typeof e!="object")return e;if(Array.isArray(e))return e.map(n=>this.maskSensitiveBody(n));let t={};for(let[n,r]of Object.entries(e))/^(pwd|password|authorization|token)$/i.test(n)?t[n]="***":r&&typeof r=="object"?t[n]=this.maskSensitiveBody(r):t[n]=r;return t}async refreshTokenForRequest(e,t,n){if(!t)return!1;let r=I.getInstance(),i=e.osClient||r.getOsClient()||"",o=new URL(n),c=o.pathname.replace(/\/+$/,"")+H.REFRESH_TOKEN,l=o.protocol==="https:",g=l?Xt:Zt,d=JSON.stringify({authorization:t,OsClient:i||void 0,_ClientType:"VSCode"}),u={hostname:o.hostname,port:o.port||(l?443:80),path:c,method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json",Authorization:`Bearer ${t}`,did:this.getDeviceId(),"Content-Length":Buffer.byteLength(d),...i?{OsClient:i}:{}},timeout:e.timeout||3e4,rejectUnauthorized:this._strictTlsHosts.has(o.hostname.toLowerCase())};return ae.log("API",`\u{1F504} RefreshToken ${n}${c}`),new Promise(p=>{let m=g.request(u,f=>{let y=[];f.on("data",S=>y.push(S)),f.on("end",async()=>{let S=Buffer.concat(y).toString("utf-8"),h;try{h=JSON.parse(S)}catch{}let C=f.headers,w=f.statusCode||0,b=C.authorization||"";if(h?.Code===1&&b){await this.setToken(b,e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork),ae.log("API","\u2705 Token \u5DF2\u4EE5\u65E7\u6362\u65B0"),p(!0);return}this.isInvalidRefreshToken(h,w)&&await this.clearTokenForServer(e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork,t),ae.log("API",`\u26A0\uFE0F RefreshToken \u5931\u8D25: ${h?.Msg||S.slice(0,120)}`),p(!1)})});m.on("error",f=>{ae.log("API",`\u274C RefreshToken Error: ${f.message}`),p(!1)}),m.on("timeout",()=>{m.destroy(),p(!1)}),m.write(d),m.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),o=r.pathname.replace(/\/+$/,"")+e.path;if(e.params){let y=new URLSearchParams;for(let[h,C]of Object.entries(e.params))C!==void 0&&C!==""&&y.append(h,C);let S=y.toString();S&&(o+=`?${S}`)}let a=r.protocol==="https:",c=a?Xt:Zt,l=e.bodyFormat||"json",g=e.body!==void 0?this.serializeRequestBody(e.body,l):void 0,d={hostname:r.hostname,port:r.port||(a?443:80),path:o,method:e.method,headers:{"Content-Type":l==="form"?"application/x-www-form-urlencoded":"application/json",Accept:"application/json",did:this.getDeviceId()},timeout:e.timeout||3e4,rejectUnauthorized:this._strictTlsHosts.has(r.hostname.toLowerCase())};g!==void 0&&(d.headers["Content-Length"]=Buffer.byteLength(g));let u=e.allowAuthRetry!==!1,p=e.osClient||t.getOsClient()||"";p&&(d.headers.OsClient=p);let m=e.apiBaseUrl?this.getTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork):await this.loadToken();m&&(d.headers.Authorization=`Bearer ${m}`);let f=`${n}${o}`;if(e.silent||ae.log("API",`\u27A1\uFE0F ${e.method} ${f}`),e.body&&!e.silent){let y=JSON.stringify(this.maskSensitiveBody(e.body));ae.appendLine(` Body: ${y.length>500?y.substring(0,500)+"...(truncated)":y}`)}return new Promise((y,S)=>{let h=g===void 0?0:Buffer.byteLength(g),C=0,w=c.request(d,v=>{let k=[];v.on("data",V=>k.push(V)),v.on("end",async()=>{let V=Buffer.concat(k).toString("utf-8"),Y=v.statusCode||0;if(!e.silent){ae.log("API",`\u2B05\uFE0F ${Y} ${e.method} ${e.path}`);let R=V.length>500?V.substring(0,500)+"...(truncated)":V;ae.appendLine(` Response: ${R}`)}let N;try{N=JSON.parse(V)}catch{}if(N){let R={};for(let[M,P]of Object.entries(v.headers))typeof P=="string"&&(R[M.toLowerCase()]=P);N._headers=R;let $=R.authorization||"";if($&&$!==m&&await this.setToken($,e.apiBaseUrl||n,e.osClient,e.osClientType,e.osClientNetwork),u&&kt(N))ae.log("API",`\u26A0\uFE0F \u79DF\u6237\u8FDE\u63A5\u914D\u7F6E\u65E0\u6548\uFF0C\u5DF2\u505C\u6B62 token \u5237\u65B0\u4E0E\u9759\u9ED8\u91CD\u767B: ${N.Msg||""}`);else if(u&&Yt(N)&&(ae.log("API",`\u{1F510} \u8EAB\u4EFD\u5DF2\u8FC7\u671F\uFF0C\u5C1D\u8BD5\u4F7F\u7528\u65E7 token \u5237\u65B0\u540E\u91CD\u8BD5: ${N.Msg||""}`),await this.refreshTokenForRequest(e,m,n)||await this.recoverAuthForRequest(e,n))){try{y(await this.request({...e,allowAuthRetry:!1}))}catch(x){S(x)}return}y(N)}else if(Y===401||Y===403){if(u&&(await this.refreshTokenForRequest(e,m,n)||await this.recoverAuthForRequest(e,n))){try{y(await this.request({...e,allowAuthRetry:!1}))}catch(M){S(M)}return}S(new Error(`\u8EAB\u4EFD\u9A8C\u8BC1\u5931\u8D25 (HTTP ${Y})\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55`))}else if(Y>=400){let R=V.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim().substring(0,120);S(new Error(`\u670D\u52A1\u5668\u9519\u8BEF (HTTP ${Y}): ${R||"\u672A\u77E5\u9519\u8BEF"}`))}else S(new Error(`\u54CD\u5E94\u89E3\u6790\u5931\u8D25 (HTTP ${Y}): ${V.substring(0,200)}`))})}),b=!1;w.on("error",v=>{if(b)return;let k=bt(v),V=h>0?`\uFF1B\u8BF7\u6C42\u4F53\u5DF2\u5206\u7247\u6392\u961F ${C}/${h} bytes\uFF0C\u670D\u52A1\u7AEF\u662F\u5426\u5DF2\u63D0\u4EA4\u672A\u77E5\uFF0C\u63D2\u4EF6\u4E0D\u4F1A\u76F2\u76EE\u91CD\u653E\u975E\u5E42\u7B49\u8BF7\u6C42`:"";e.silent||ae.log("API",`\u274C ${e.method} ${e.path} Error: ${k}${V}`),S(new Error(`\u8BF7\u6C42\u5931\u8D25: ${k}${V}`))}),w.on("timeout",()=>{b=!0,w.destroy(),e.silent||ae.log("API",`\u23F0 ${e.method} ${e.path} Timeout`),S(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),g!==void 0?ri(w,g,v=>{C=v}).catch(v=>{!b&&!w.destroyed&&w.destroy(v instanceof Error?v:new Error(String(v)))}):w.end()})}async get(e,t,n,r){return this.request({method:"GET",path:e,params:t,apiBaseUrl:n,osClient:r?.osClient,osClientType:r?.osClientType,osClientNetwork:r?.osClientNetwork})}async post(e,t,n,r,i,o,a){return this.request({method:"POST",path:e,body:t,params:n,apiBaseUrl:r,osClient:i?.osClient,osClientType:i?.osClientType,osClientNetwork:i?.osClientNetwork,timeout:o,silent:a})}async getRaw(e,t,n){let r=I.getInstance(),i=n||r.getApiBaseUrl();if(!i)throw new Error("\u672A\u914D\u7F6E API \u5730\u5740");let o=new URL(i),c=o.pathname.replace(/\/+$/,"")+e;if(t){let u=new URLSearchParams;for(let[m,f]of Object.entries(t))f!==void 0&&f!==""&&u.append(m,f);let p=u.toString();p&&(c+=`?${p}`)}let l=o.protocol==="https:",g=l?Xt:Zt,d={hostname:o.hostname,port:o.port||(l?443:80),path:c,method:"GET",timeout:15e3,rejectUnauthorized:this._strictTlsHosts.has(o.hostname.toLowerCase())};return new Promise((u,p)=>{let m=g.request(d,f=>{let y=[];f.on("data",S=>y.push(S)),f.on("end",()=>{let S=Buffer.concat(y),h=f.headers.captchaid||"";u({data:S,captchaId:h,statusCode:f.statusCode||0,contentType:String(f.headers["content-type"]||"")})})});m.on("error",f=>p(new Error(`\u8BF7\u6C42\u5931\u8D25: ${f.message}`))),m.on("timeout",()=>{m.destroy(),p(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),m.end()})}async postMultipartFile(e,t,n,r,i,o,a=30*60*1e3){let c=ot.realpathSync(n),l=ot.lstatSync(c);if(!l.isFile()||l.isSymbolicLink())throw new Error(`\u4E0A\u4F20\u8D44\u4EA7\u5FC5\u987B\u662F\u666E\u901A\u6587\u4EF6\u4E14\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\uFF1A${n}`);if(!r||/[\r\n"]/u.test(r))throw new Error("\u4E0A\u4F20\u6587\u4EF6\u540D\u4E0D\u5408\u6CD5");let g=String(i||"").replace(/\/+$/,""),d=new URL(g),u=`----microi-vscode-${en.randomBytes(24).toString("hex")}`,p=Object.entries(t).map(([v,k])=>Buffer.from(`--${u}\r
21
21
  Content-Disposition: form-data; name="${v}"\r
22
22
  \r
23
23
  ${k}\r
@@ -27,28 +27,28 @@ Content-Type: application/octet-stream\r
27
27
  \r
28
28
  `,"utf8"),f=Buffer.concat([...p,m]),y=Buffer.from(`\r
29
29
  --${u}--\r
30
- `,"utf8"),S=o?this.getTokenForServer(g,o.osClient,o.osClientType,o.osClientNetwork):await this.loadToken(),h=d.protocol==="https:",C=h?Qt:Yt,T=d.pathname.replace(/\/+$/,""),b={hostname:d.hostname,port:d.port||(h?443:80),path:T+e,method:"POST",timeout:a,rejectUnauthorized:this._strictTlsHosts.has(d.hostname.toLowerCase()),headers:{Accept:"application/json",...S?{Authorization:`Bearer ${S}`}:{},did:this.getDeviceId(),...o?.osClient?{OsClient:o.osClient}:{},"Content-Type":`multipart/form-data; boundary=${u}`,"Content-Length":f.length+l.size+y.length}};return new Promise((v,k)=>{let V=!1,Q=O=>{V||(V=!0,k(O))},N=C.request(b,O=>{let M=[];O.on("data",P=>M.push(P)),O.on("end",async()=>{if(V)return;let P=Buffer.concat(M).toString("utf8"),x;try{x=JSON.parse(P)}catch{Q(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u54CD\u5E94\u4E0D\u662F JSON\uFF08HTTP ${O.statusCode||0}\uFF09`));return}let z=String(O.headers.authorization||"");z&&await this.setToken(z,g,o?.osClient,o?.osClientType,o?.osClientNetwork),V=!0,v(x)})});N.on("error",O=>Q(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u5931\u8D25\uFF1A${vt(O)}`))),N.on("timeout",()=>{N.destroy(),Q(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u8D85\u65F6\uFF08${a}ms\uFF09`))}),N.write(f);let R=it.createReadStream(c);R.on("error",O=>{N.destroy(),Q(new Error(`\u8BFB\u53D6\u672C\u5730\u53D1\u5E03\u8D44\u4EA7\u5931\u8D25\uFF1A${vt(O)}`))}),R.on("end",()=>N.end(y)),R.pipe(N,{end:!1})})}};var ot=B(require("crypto")),W=B(require("fs")),_t=B(require("path"));var Dt=B(require("child_process")),Lr=require("crypto"),ne=B(require("fs")),nn=B(require("path")),Rt=".microi-workspace-secrets.dpapi.json",Br=["$ErrorActionPreference = 'Stop';","Add-Type -AssemblyName System.Security;","$inputBase64 = [Console]::In.ReadToEnd().Trim();","$plain = [Convert]::FromBase64String($inputBase64);","$cipher = [Security.Cryptography.ProtectedData]::Protect($plain, $null, [Security.Cryptography.DataProtectionScope]::CurrentUser);","[Console]::Out.Write([Convert]::ToBase64String($cipher));"].join(" "),Ur=["$ErrorActionPreference = 'Stop';","Add-Type -AssemblyName System.Security;","$inputBase64 = [Console]::In.ReadToEnd().Trim();","$cipher = [Convert]::FromBase64String($inputBase64);","$plain = [Security.Cryptography.ProtectedData]::Unprotect($cipher, $null, [Security.Cryptography.DataProtectionScope]::CurrentUser);","[Console]::Out.Write([Convert]::ToBase64String($plain));"].join(" ");function Zt(s,e){if(process.platform!=="win32")throw new Error("\u5F53\u524D\u64CD\u4F5C\u7CFB\u7EDF\u4E0D\u652F\u6301 Windows DPAPI \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93");let t=process.env.SystemRoot||"C:\\Windows",n=nn.join(t,"System32","WindowsPowerShell","v1.0","powershell.exe"),r=Dt.spawnSync(n,["-NoLogo","-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-Command",s],{input:e.toString("base64"),encoding:"utf8",windowsHide:!0,maxBuffer:4*1024*1024,timeout:15e3}),i=String(r.stdout||"").trim();if(r.error||r.status!==0||!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(i))throw new Error("Windows DPAPI \u64CD\u4F5C\u5931\u8D25\uFF1B\u51ED\u636E\u672A\u5199\u5165\u660E\u6587\u6587\u4EF6");return Buffer.from(i,"base64")}function Zs(s){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,s)}var jn="dpapi-session-v1:",Pt="keychain-session-v1:",Un="net.microi.cli.workspace.v1",jr="net.microi.cli.session.v1",Kr=s=>(0,Lr.createHash)("sha256").update(s).digest("hex");function Kn(s,e){if(process.platform!=="darwin")throw new Error("macOS Keychain is unavailable on this platform");let t=Dt.spawnSync("/usr/bin/security",["find-generic-password","-s",s,"-a",e,"-w"],{encoding:"utf8",timeout:15e3,maxBuffer:4*1024*1024});if(t.status===44)return;if(t.error||t.status!==0)throw new Error("macOS Keychain \u8BFB\u53D6\u5931\u8D25\uFF1B\u51ED\u636E\u672A\u5199\u5165\u660E\u6587\u6587\u4EF6");let n=String(t.stdout||"").trim();if(!/^[A-Za-z0-9+/]+={0,2}$/.test(n))throw new Error("macOS Keychain \u51ED\u636E\u683C\u5F0F\u65E0\u6548");return Buffer.from(n,"base64").toString("utf8")}function Hr(s,e,t){if(process.platform!=="darwin")throw new Error("macOS Keychain is unavailable on this platform");let n=Buffer.from(t,"utf8").toString("base64"),r=`add-generic-password -U -s ${s} -a ${e} -w ${n}
31
- `,i=Dt.spawnSync("/usr/bin/security",["-q","-i"],{input:r,encoding:"utf8",timeout:15e3,maxBuffer:4*1024*1024});if(i.error||i.status!==0||Kn(s,e)!==t)throw new Error("macOS Keychain \u5199\u5165\u6216\u56DE\u8BFB\u5931\u8D25\uFF1B\u51ED\u636E\u672A\u5199\u5165\u660E\u6587\u6587\u4EF6")}function ei(s,e){if(process.platform!=="darwin")throw new Error("macOS Keychain is unavailable on this platform");let t=Dt.spawnSync("/usr/bin/security",["delete-generic-password","-s",s,"-a",e],{encoding:"utf8",timeout:15e3,maxBuffer:4*1024*1024});if(t.error||t.status!==0&&t.status!==44)throw new Error("macOS Keychain \u5220\u9664\u5931\u8D25")}var en=class{constructor(e){this.workspaceTokenFile=e;this.onDidChange=()=>({dispose:()=>{}})}account(e){return Kr(`${this.workspaceTokenFile}\0${e}`)}async get(e){return Kn(Un,this.account(e))}async store(e,t){Hr(Un,this.account(e),t)}async delete(e){ei(Un,this.account(e))}},bt=new Map,kt=new Map;function It(s){return typeof s=="string"&&(s.startsWith(jn)||s.startsWith(Pt))}function Wr(s){if(!s||It(s))return s;if(process.platform==="darwin"){let e=Pt+Kr(s);return Hr(jr,e.slice(Pt.length),s),e}return kt.has(s)||(kt.size>256&&kt.clear(),kt.set(s,jn+Zt(Br,Buffer.from(s,"utf8")).toString("base64"))),kt.get(s)}function Hn(s){if(typeof s!="string")return"";if(!It(s))return s;if(s.startsWith(Pt)){let e=s.slice(Pt.length);if(!/^[a-f0-9]{64}$/.test(e))throw new Error("macOS Keychain Token \u5F15\u7528\u683C\u5F0F\u65E0\u6548");let t=Kn(jr,e);if(!t)throw new Error("macOS Keychain Token \u5F15\u7528\u4E0D\u5B58\u5728");return t}return bt.has(s)||(bt.size>256&&bt.clear(),bt.set(s,Zt(Ur,Buffer.from(s.slice(jn.length),"base64")).toString("utf8"))),bt.get(s)}function ti(s){if(!Number.isInteger(s)||s<=1)return!1;try{return process.kill(s,0),!0}catch(e){return e.code==="EPERM"}}function ni(s){try{let e=JSON.parse(ne.readFileSync(s,"utf8"));return ti(Number(e?.pid))}catch{return!1}}var tn=class{constructor(e,t){this.filePath=e;this.onDidChange=()=>({dispose:()=>{}});this.protect=t?.protect||(n=>Zt(Br,n)),this.unprotect=t?.unprotect||(n=>Zt(Ur,n))}async get(e){return this.readDocument().values[e]}async store(e,t){this.mutate(n=>{n.values[e]=t})}async delete(e){this.mutate(t=>{delete t.values[e]})}mutate(e){ne.mkdirSync(nn.dirname(this.filePath),{recursive:!0});let t=`${this.filePath}.lock`,n=Date.now()+3e3,r;for(;r===void 0;)try{r=ne.openSync(t,"wx",384),ne.writeFileSync(r,`${JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()})}
32
- `,"utf8")}catch(o){if(o.code!=="EEXIST")throw o;try{let a=Date.now()-ne.statSync(t).mtimeMs>3e4;(!ni(t)||a)&&ne.unlinkSync(t)}catch{}if(Date.now()>=n)throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u6B63\u88AB\u53E6\u4E00\u8FDB\u7A0B\u66F4\u65B0\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");Zs(40)}let i=`${this.filePath}.${process.pid}.${Date.now()}.tmp`;try{let o=this.readDocument();e(o);let a=Buffer.from(JSON.stringify(o),"utf8"),c={version:1,protection:"windows-dpapi-current-user",ciphertext:this.protect(a).toString("base64")};if(!this.unprotect(Buffer.from(c.ciphertext,"base64")).equals(a))throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u52A0\u5BC6\u56DE\u8BFB\u4E0D\u4E00\u81F4\uFF0C\u5DF2\u4FDD\u7559\u539F\u4FDD\u9669\u5E93");ne.writeFileSync(i,`${JSON.stringify(c,null,2)}
33
- `,{encoding:"utf8",mode:384}),ne.renameSync(i,this.filePath)}finally{try{ne.existsSync(i)&&ne.unlinkSync(i)}catch{}try{ne.closeSync(r)}catch{}try{ne.unlinkSync(t)}catch{}}}readDocument(){if(!ne.existsSync(this.filePath))return{version:1,values:{}};if(ne.statSync(this.filePath).size>2*1024*1024)throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u8D85\u8FC7\u5B89\u5168\u5927\u5C0F\u9650\u5236\uFF0C\u5DF2\u62D2\u7EDD\u8BFB\u53D6");let e;try{e=JSON.parse(ne.readFileSync(this.filePath,"utf8"))}catch{throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u4E14\u505C\u6B62\u8986\u76D6")}if(e.version!==1||e.protection!=="windows-dpapi-current-user"||typeof e.ciphertext!="string"||!e.ciphertext)throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u683C\u5F0F\u65E0\u6548\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u4E14\u505C\u6B62\u8986\u76D6");try{let t=this.unprotect(Buffer.from(e.ciphertext,"base64"));if(t.length===0)return{version:1,values:{}};let n=JSON.parse(t.toString("utf8"));if(n.version!==1||!n.values||typeof n.values!="object")throw new Error("invalid document");return n.values=Object.fromEntries(Object.entries(n.values).filter(r=>typeof r[0]=="string"&&typeof r[1]=="string")),n}catch{throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u65E0\u6CD5\u7531\u5F53\u524D Windows \u7528\u6237\u89E3\u5BC6\uFF0C\u5DF2\u505C\u6B62\u8986\u76D6")}}};var ri=60*60*1e3,si=5*60,Gr=24*60*60,ii=2*60*1e3,oi=60*1e3;function ai(s,e){let t=(e||"").trim();return t?ot.publicEncrypt({key:t,padding:ot.constants.RSA_PKCS1_PADDING},Buffer.from(s,"utf-8")).toString("base64"):s}var Ce=class s{constructor(){this._isLoggedIn=!1;this._refreshInProgress=!1;this._mcpTokenFilePath="";this._mcpAuthRecoveryDirPath="";this._mcpAuthRecoveryInProgress=new Set;this._mcpAuthRecoveryFailureUntil=new Map;this._mcpAuthRecoveryPassInProgress=!1;this._lastAuthWarning="";this._lastAuthWarningTime=0;this.protectedMcpTokenKeys=new Set}static getInstance(){return s._instance||(s._instance=new s),s._instance}setSecretStorage(e){this._secretStorage=e,j.getInstance().setTokenStateChangedHandler(async()=>{await this.writeMcpTokenFile()}),j.getInstance().setAuthRecoveryHandler(async t=>{let n=I.getInstance(),r=this.normalizeApiBaseUrl(t.apiBaseUrl),i=this.normalizeOsClient(t.osClient),o=this.normalizeIdentityPart(t.osClientType),a=this.normalizeIdentityPart(t.osClientNetwork),c=n.getProfiles().filter(d=>this.normalizeApiBaseUrl(d.apiBaseUrl)===r&&this.normalizeOsClient(d.osClient)===i),l=c.find(d=>this.normalizeIdentityPart(d.osClientType)===o&&this.normalizeIdentityPart(d.osClientNetwork)===a);if(!l&&!o&&!a&&c.length===1&&(l=c[0]),!l&&c.length===0&&(l={label:t.osClient||t.apiBaseUrl,apiBaseUrl:t.apiBaseUrl,osClient:t.osClient||"",osClientType:t.osClientType,osClientNetwork:t.osClientNetwork}),!l)return this.showAuthExpiredWarning("\u68C0\u6D4B\u5230\u540C\u4E00\u670D\u52A1\u5668\u4E0E\u79DF\u6237\u5B58\u5728\u591A\u4E2A\u8FDE\u63A5\u73AF\u5883\uFF0C\u65E0\u6CD5\u5B89\u5168\u5224\u65AD\u5E94\u6062\u590D\u54EA\u4E00\u4E2A\u767B\u5F55\u8EAB\u4EFD\u3002"),!1;let g=await this.reLoginForProfile(l);return g&&(this._isLoggedIn=!0,await Je.executeCommand("setContext",nt,!0)),await this.writeMcpTokenFile(),g})}setMcpTokenFilePath(e){this._mcpTokenFilePath=e,this._mcpAuthRecoveryDirPath=e?`${e}.recovery`:""}enableProtectedMcpTokens(e){let t=this.normalizeApiBaseUrl(e.apiBaseUrl),n=this.normalizeOsClient(e.osClient);this.protectedMcpTokenKeys.add(this.mcpRecoveryIdentity(t,n,e.osClientType,e.osClientNetwork)),this.protectedMcpTokenKeys.add(n?`${t}|${n}`:t)}get mcpTokenFilePath(){return this._mcpTokenFilePath}get mcpAuthRecoveryDirPath(){return this._mcpAuthRecoveryDirPath}async loadMcpTokenFile(){if(!this._mcpTokenFilePath||!W.existsSync(this._mcpTokenFilePath))return 0;let e;try{let i=JSON.parse(W.readFileSync(this._mcpTokenFilePath,"utf-8"));if(!i||typeof i!="object"||Array.isArray(i))return 0;for(let[o,a]of Object.entries(i))It(a)&&this.protectedMcpTokenKeys.add(o);e=Object.fromEntries(Object.entries(i).map(([o,a])=>[o,Hn(a)]))}catch{return 0}let t=j.getInstance(),n=I.getInstance().getProfiles(),r=[];for(let i of n){let o=this.normalizeApiBaseUrl(i.apiBaseUrl),a=this.normalizeOsClient(i.osClient),c=this.mcpRecoveryIdentity(o,a,i.osClientType,i.osClientNetwork),g=n.filter(y=>this.normalizeApiBaseUrl(y.apiBaseUrl)===o&&this.normalizeOsClient(y.osClient)===a).length===1?[[o,a,i.osClientType,i.osClientNetwork].filter(Boolean).join("|"),[o,a,i.osClientType].filter(Boolean).join("|"),a?`${o}|${a}`:o]:[],d=typeof e[c]=="string"&&String(e[c]).trim()?String(e[c]).trim():"",u=g.map(y=>e[y]).find(y=>typeof y=="string"&&y.trim()),p=t.getTokenForServer(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork),m=t.getExactTokenForServer(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork),f=st(p,d||u,!!d&&!m);!f||m===f||r.push({token:f,apiBaseUrl:i.apiBaseUrl,osClient:i.osClient,osClientType:i.osClientType,osClientNetwork:i.osClientNetwork})}return t.adoptTokensFromSharedFile(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)}`)}getCredentialSecretKeys(e){return{usernameKey:this.serverSecretKey(we,e.apiBaseUrl,e.osClient),passwordKey:this.serverSecretKey(Te,e.apiBaseUrl,e.osClient)}}legacyServerSecretKey(e,t){return this.secretKey(`${e}.${this.normalizeApiBaseUrl(t)}`)}canUseLegacyCredential(e,t){let n=this.normalizeApiBaseUrl(e),r=this.normalizeOsClient(t);if(!n)return!1;let i=I.getInstance().getProfiles().filter(a=>this.normalizeApiBaseUrl(a.apiBaseUrl)===n);if(i.length===0)return!r;if(i.length===1)return!0;let o=i.filter(a=>this.normalizeOsClient(a.osClient)===r);return!!r&&o.length===i.length}async writeMcpTokenFile(){if(!this._mcpTokenFilePath)return;let e=j.getInstance(),t=I.getInstance(),n=t.getProfiles(),r=this._mcpTokenFilePath;if(!(n.some(f=>!!this.normalizeApiBaseUrl(f.apiBaseUrl)&&!!this.normalizeOsClient(f.osClient))||!!this.normalizeApiBaseUrl(t.getApiBaseUrl())&&!!this.normalizeOsClient(t.getOsClient()))&&!W.existsSync(r))return;let o={},a=new Set,c=[];for(let f of n){let y=this.normalizeApiBaseUrl(f.apiBaseUrl),S=this.normalizeOsClient(f.osClient),h=this.mcpRecoveryIdentity(y,S,f.osClientType,f.osClientNetwork);a.add(h);let C=n.filter(v=>this.normalizeApiBaseUrl(v.apiBaseUrl)===y&&this.normalizeOsClient(v.osClient)===S),T=S?`${y}|${S}`:y;C.length===1&&a.add(T);let b=e.getTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork);c.push({profile:f,exactKey:h,legacyKey:C.length===1?T:void 0,currentToken:b,currentExactToken:e.getExactTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork)}),b&&(o[h]=b,C.length===1&&(o[T]=b))}let l=_t.dirname(r);W.existsSync(l)||W.mkdirSync(l,{recursive:!0});let g=`${r}.lock`,d=Date.now()+3e3,u;for(;u===void 0;)try{u=W.openSync(g,"wx",384),W.writeFileSync(u,JSON.stringify({pid:process.pid,createdAt:Date.now()}),"utf-8")}catch(f){if(f.code!=="EEXIST")throw f;try{Date.now()-W.statSync(g).mtimeMs>3e4&&W.unlinkSync(g)}catch{}if(Date.now()>=d)throw new Error("Microi MCP Token \u6587\u4EF6\u6B63\u5728\u88AB CLI \u6216 VS Code \u63D2\u4EF6\u4FEE\u6539\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");await new Promise(y=>setTimeout(y,40))}let p=`${r}.${process.pid}.${Date.now()}.tmp`,m=[];try{let f={};if(W.existsSync(r)){let h=JSON.parse(W.readFileSync(r,"utf-8"));if(!h||typeof h!="object"||Array.isArray(h))throw new Error(`Microi MCP Token \u6587\u4EF6\u5FC5\u987B\u662F JSON \u5BF9\u8C61\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1A${r}`);for(let[C,T]of Object.entries(h))It(T)&&this.protectedMcpTokenKeys.add(C);f=Object.fromEntries(Object.entries(h).filter(C=>typeof C[1]=="string"&&!!C[1]).map(([C,T])=>[C,Hn(T)]))}for(let h of c){let C=f[h.exactKey]||"",T=h.legacyKey&&f[h.legacyKey]||"",b=st(h.currentToken,C||T,!!C&&!h.currentExactToken);b&&(o[h.exactKey]=b,h.legacyKey&&(o[h.legacyKey]=b),b!==h.currentExactToken&&m.push({profile:h.profile,token:b}))}for(let h of a)delete f[h];let y={...f,...o},S=Object.fromEntries(Object.entries(y).map(([h,C])=>[h,this.protectedMcpTokenKeys.has(h)?Wr(C):C]));W.writeFileSync(p,`${JSON.stringify(S,null,2)}
34
- `,{encoding:"utf-8",mode:384}),W.renameSync(p,r)}finally{try{W.existsSync(p)&&W.unlinkSync(p)}catch{}try{W.closeSync(u)}catch{}try{W.unlinkSync(g)}catch{}}await e.adoptTokensFromSharedFile(m.map(f=>({token:f.token,apiBaseUrl:f.profile.apiBaseUrl,osClient:f.profile.osClient,osClientType:f.profile.osClientType,osClientNetwork:f.profile.osClientNetwork})))}tokenFingerprint(e){return ot.createHash("sha256").update(String(e||"")).digest("hex")}deleteMcpAuthRecoveryRequests(e,t){let n=this._mcpAuthRecoveryDirPath;if(!n||!W.existsSync(n))return;let r=[];try{r=W.readdirSync(n).filter(i=>i.endsWith(".json")).slice(0,200)}catch{return}for(let i of r){let o=_t.join(n,i);try{let a=JSON.parse(W.readFileSync(o,"utf-8")),c=this.normalizeApiBaseUrl(String(a.apiBaseUrl||"")),l=this.normalizeOsClient(String(a.osClient||"")),g=this.normalizeIdentityPart(String(a.osClientType||"")),d=this.normalizeIdentityPart(String(a.osClientNetwork||"")),u=this.mcpRecoveryIdentity(c,l,g,d);if(!g&&!d){let p=t.filter(m=>this.normalizeApiBaseUrl(m.apiBaseUrl)===c&&this.normalizeOsClient(m.osClient)===l);p.length===1&&(u=this.mcpRecoveryIdentity(p[0].apiBaseUrl,p[0].osClient,p[0].osClientType,p[0].osClientNetwork))}u===e&&W.unlinkSync(o)}catch{}}}async processMcpAuthRecoveryRequests(){let e=this._mcpAuthRecoveryDirPath;if(!(!e||!W.existsSync(e)||this._mcpAuthRecoveryPassInProgress)){this._mcpAuthRecoveryPassInProgress=!0;try{let t=[];try{t=W.readdirSync(e).filter(o=>o.endsWith(".json")).slice(0,100)}catch{return}let r=I.getInstance().getProfiles(),i=j.getInstance();for(let o of t){let a=_t.join(e,o),c={};try{c=JSON.parse(W.readFileSync(a,"utf-8"))}catch{try{W.unlinkSync(a)}catch{}continue}let l=Number(c.requestedAt||0),g=this.normalizeApiBaseUrl(String(c.apiBaseUrl||"")),d=this.normalizeOsClient(String(c.osClient||"")),u=this.normalizeIdentityPart(String(c.osClientType||"")),p=this.normalizeIdentityPart(String(c.osClientNetwork||"")),m=String(c.failedTokenHash||"").trim().toLowerCase();if(Number(c.version)!==1||!g||!l||Math.abs(Date.now()-l)>ii||!Or(m)){try{W.unlinkSync(a)}catch{}continue}let f=r.filter(h=>this.normalizeApiBaseUrl(h.apiBaseUrl)===g&&this.normalizeOsClient(h.osClient)===d),y=u||p?f.find(h=>this.normalizeIdentityPart(h.osClientType)===u&&this.normalizeIdentityPart(h.osClientNetwork)===p):f.length===1?f[0]:void 0;if(!y){try{W.unlinkSync(a)}catch{}continue}let S=this.mcpRecoveryIdentity(y.apiBaseUrl,y.osClient,y.osClientType,y.osClientNetwork);if(!this._mcpAuthRecoveryInProgress.has(S)){if((this._mcpAuthRecoveryFailureUntil.get(S)||0)>Date.now()){this.deleteMcpAuthRecoveryRequests(S,r);continue}this._mcpAuthRecoveryInProgress.add(S);try{let h=i.getTokenForServer(y.apiBaseUrl,y.osClient,y.osClientType,y.osClientNetwork);h&&this.tokenFingerprint(h)!==m?(this._mcpAuthRecoveryFailureUntil.delete(S),await this.writeMcpTokenFile()):(h&&await i.clearTokenForServer(y.apiBaseUrl,y.osClient,y.osClientType,y.osClientNetwork,h),await this.reLoginForProfile(y)?this._mcpAuthRecoveryFailureUntil.delete(S):(this._mcpAuthRecoveryFailureUntil.set(S,Date.now()+oi),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(S),this.deleteMcpAuthRecoveryRequests(S,r)}}}}finally{this._mcpAuthRecoveryPassInProgress=!1}}}startMcpAuthRecoveryWatcher(){this._mcpAuthRecoveryTimer||!this._mcpAuthRecoveryDirPath||(this._mcpAuthRecoveryTimer=setInterval(()=>{this.processMcpAuthRecoveryRequests()},1e3),this.processMcpAuthRecoveryRequests())}stopMcpAuthRecoveryWatcher(){this._mcpAuthRecoveryTimer&&(clearInterval(this._mcpAuthRecoveryTimer),this._mcpAuthRecoveryTimer=void 0)}async tryAutoLogin(){let e=j.getInstance(),n=I.getInstance().getProfiles(),r=!1,i=await e.loadToken(),o=await this.loadMcpTokenFile();r=!!i||o>0||e.hasToken;let a=n.filter(d=>!e.getTokenForServer(d.apiBaseUrl,d.osClient,d.osClientType,d.osClientNetwork)),c=0,l=async()=>{for(;c<a.length;){let d=a[c++];await this.reLoginForProfile(d)&&(r=!0)}},g=Math.min(4,a.length);return await Promise.all(Array.from({length:g},()=>l())),r&&(this._isLoggedIn=!0,await Je.executeCommand("setContext",nt,!0),await this.writeMcpTokenFile()),r}async getSysConfig(e,t,n,r=!1){let i=j.getInstance(),o=I.getInstance();try{let a=await i.request({method:"POST",path:H.GET_SYS_CONFIG,body:{_SearchEqual:{IsEnable:1},OsClient:t||o.getOsClient()||void 0},apiBaseUrl:e,osClient:t,allowAuthRetry:!1,silent:r});if(a.Code===1&&a.Data)return a.Data;n&&(n.message=a.Code!==1?`\u670D\u52A1\u5668\u8FD4\u56DE\u9519\u8BEF (Code: ${a.Code})${a.Msg?"\uFF1A"+a.Msg:""}\uFF0C\u8BF7\u68C0\u67E5 OsClient \u662F\u5426\u6B63\u786E`:"\u670D\u52A1\u5668\u672A\u8FD4\u56DE\u914D\u7F6E\u6570\u636E")}catch(a){n&&(n.message=a instanceof Error?a.message:String(a))}return null}async getCaptcha(e,t){let n=j.getInstance(),r=I.getInstance();try{let i=await n.getRaw(H.GET_CAPTCHA,{OsClient:t||r.getOsClient()||""},e);if(i.data&&i.captchaId){let o=i.data.toString("base64");return{captchaId:i.captchaId,imageBase64:`data:image/png;base64,${o}`}}}catch{}return null}async login(e,t,n={}){let r=j.getInstance(),i=I.getInstance(),o=n.osClient||i.getOsClient(),a=n.silent??!1;try{let c=await this.getSysConfig(n.apiBaseUrl,o,void 0,a),l=c?.EnableCaptcha;if((l===!0||l===1||String(l||"").trim().toLowerCase()==="true")&&(!n.captchaId||!n.captchaValue)){let S="\u670D\u52A1\u5668\u5DF2\u5F00\u542F\u56FE\u5F62\u9A8C\u8BC1\u7801\uFF0C\u8BF7\u5728\u63D2\u4EF6\u914D\u7F6E\u4E2D\u4EA4\u4E92\u5F0F\u767B\u5F55\u3002";return a||A.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${S}`),{ok:!1,msg:S}}let d=typeof c?.LoginRsaPublicKey=="string"&&c.LoginRsaPublicKey.trim()?c.LoginRsaPublicKey:vr,u=ai(t,d),p={Account:e,Pwd:u,OsClient:o||void 0,_ClientType:"VSCode"};n.captchaId&&n.captchaValue&&(p._CaptchaId=n.captchaId,p._CaptchaValue=n.captchaValue);let m=await r.request({method:"POST",path:H.LOGIN,body:p,bodyFormat:"form",apiBaseUrl:n.apiBaseUrl,osClient:n.osClient,osClientType:n.osClientType,osClientNetwork:n.osClientNetwork,allowAuthRetry:!1,silent:a}),y=m._headers?.authorization||"";if(m.Code===1)return y&&await r.setToken(y,n.apiBaseUrl,n.osClient,n.osClientType,n.osClientNetwork),this._secretStorage&&(n.apiBaseUrl?(await this._secretStorage.store(this.serverSecretKey(we,n.apiBaseUrl,o),e),await this._secretStorage.store(this.serverSecretKey(Te,n.apiBaseUrl,o),t)):(await this._secretStorage.store(this.secretKey(we),e),await this._secretStorage.store(this.secretKey(Te),t))),m.Data?.OsClient&&!o&&await i.updateSettings({osClient:m.Data.OsClient}),this._isLoggedIn=!0,await Je.executeCommand("setContext",nt,!0),await this.writeMcpTokenFile(),a||A.info(`Microi: \u767B\u5F55\u6210\u529F\uFF0C\u6B22\u8FCE ${m.Data?.Name||m.Data?.Account||e}`),{ok:!0,msg:""};{let S=m.Msg||"\u8BF7\u68C0\u67E5\u8D26\u53F7\u5BC6\u7801";return a||A.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${S}`),{ok:!1,msg:S}}}catch(c){let l=c instanceof Error?c.message:String(c);return a||A.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${l}`),{ok:!1,msg:l}}}async refreshAllTokens(){if(this._refreshInProgress)return;this._refreshInProgress=!0;let e=j.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 u=await e.request({method:"GET",path:H.GET_STATUS,apiBaseUrl:r.apiBaseUrl,osClient:r.osClient,osClientType:r.osClientType,osClientNetwork:r.osClientNetwork,allowAuthRetry:!1,silent:!0});if(Et(u))continue;if(qt(u)){await e.clearTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork,i),await this.reLoginForProfile(r)||this.showAuthExpiredWarning(u.Msg||"\u5F53\u524D\u767B\u5F55\u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002");continue}}catch{}let o=this.readJwtClientClaims(i),a=String(o?.ClientType||"").trim(),c=a.toLowerCase()!=="vscode",l=!a||a.toLowerCase()==="empty";if(c&&(await this.reLoginForProfile(r)||!l))continue;let g=String(o?.Did||"").trim(),d=a.toLowerCase()==="vscode"&&g!==e.getDeviceId();if(!(!c&&!d&&!this.shouldRefreshToken(i,o)))try{let u=await e.request({method:"POST",path:H.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}),m=u._headers?.authorization||"";u.Code===1&&m?await e.setToken(m,r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork):(await e.clearTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork,i),await this.reLoginForProfile(r)||this.showAuthExpiredWarning(u.Msg||"\u5F53\u524D\u767B\u5F55\u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002"))}catch{await this.reLoginForProfile(r)}}}finally{this._isLoggedIn=e.hasToken,await Je.executeCommand("setContext",nt,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,A.warn(`Microi: ${t}`))}readJwtClientClaims(e){try{let n=e.replace(/^Bearer\s+/i,"").trim().split(".");if(n.length<2)return null;let r=n[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(r,"base64").toString("utf-8"))}catch{return null}}shouldRefreshToken(e,t){let n=t??this.readJwtClientClaims(e),r=Number(n?.exp);if(!Number.isFinite(r)||r<=0)return!0;let i=Number(n?.MicroiTokenIssuedAt??n?.iat),o=Number.isFinite(i)&&i>0&&r>i?r-i:Gr,a=Math.min(Gr,Math.max(si,Math.floor(o/10)));return r-Math.floor(Date.now()/1e3)<=a}async getCredentialsForProfile(e,t){if(!this._secretStorage)return null;let n=this.normalizeApiBaseUrl(e),r=this.normalizeOsClient(t),i=n?await this._secretStorage.get(this.serverSecretKey(we,n,r)):void 0,o=n?await this._secretStorage.get(this.serverSecretKey(Te,n,r)):void 0;return(!i||!o)&&n&&this.canUseLegacyCredential(n,r)&&(i=i||await this._secretStorage.get(this.legacyServerSecretKey(we,n)),o=o||await this._secretStorage.get(this.legacyServerSecretKey(Te,n))),(!i||!o)&&!n&&!r&&(i=i||await this._secretStorage.get(this.secretKey(we)),o=o||await this._secretStorage.get(this.secretKey(Te))),!i||!o?null:{username:i,password:o}}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}async recoverProfileLogin(e){let t=await this.reLoginForProfile(e);return t&&(this._isLoggedIn=!0,await this.writeMcpTokenFile()),t}startTokenRefresh(){this.stopTokenRefresh(),this.startMcpAuthRecoveryWatcher(),this.refreshAllTokens(),this._refreshTimer=setInterval(()=>{this.refreshAllTokens()},ri),this._windowStateSubscription=fe.onDidChangeWindowState(e=>{e.focused&&this.refreshAllTokens()})}stopTokenRefresh(){this._refreshTimer&&(clearInterval(this._refreshTimer),this._refreshTimer=void 0),this._windowStateSubscription&&(this._windowStateSubscription.dispose(),this._windowStateSubscription=void 0),this.stopMcpAuthRecoveryWatcher()}async logoutProfile(e){await j.getInstance().clearTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork),this._secretStorage&&(await this._secretStorage.delete(this.serverSecretKey(we,e.apiBaseUrl,e.osClient)),await this._secretStorage.delete(this.serverSecretKey(Te,e.apiBaseUrl,e.osClient)),this.canUseLegacyCredential(e.apiBaseUrl,e.osClient)&&(await this._secretStorage.delete(this.legacyServerSecretKey(we,e.apiBaseUrl)),await this._secretStorage.delete(this.legacyServerSecretKey(Te,e.apiBaseUrl)))),await this.writeMcpTokenFile()}async logout(){if(this.stopTokenRefresh(),await j.getInstance().clearToken(),this._secretStorage){await this._secretStorage.delete(this.secretKey(we)),await this._secretStorage.delete(this.secretKey(Te));let t=I.getInstance().getProfiles();for(let n of t)await this._secretStorage.delete(this.serverSecretKey(we,n.apiBaseUrl,n.osClient)),await this._secretStorage.delete(this.serverSecretKey(Te,n.apiBaseUrl,n.osClient)),await this._secretStorage.delete(this.legacyServerSecretKey(we,n.apiBaseUrl)),await this._secretStorage.delete(this.legacyServerSecretKey(Te,n.apiBaseUrl))}this._isLoggedIn=!1,await Je.executeCommand("setContext",nt,!1),A.info("Microi: \u5DF2\u9000\u51FA\u767B\u5F55")}};var ci=/^\s*\*?\s*Version\s*:\s*(v\d+\.\d+\.\d+)\s*$/im,qr=/^v(\d+)\.(\d+)\.(\d+)$/;function rn(s){let e=(s||"").trim();if(!e)return null;let t=e.match(qr);if(t)return`v${Number(t[1])}.${Number(t[2])}.${Number(t[3])}`;let n=e.match(ci);return n?rn(n[1]):null}function Qr(s){if(!s)return null;let e=s.match(qr);return e?{major:Number(e[1]),minor:Number(e[2]),patch:Number(e[3])}:null}function li(s,e){return s.major!==e.major?s.major-e.major:s.minor!==e.minor?s.minor-e.minor:s.patch-e.patch}function di(s){let e=null;for(let t of s){let n=Qr(t);n&&(!e||li(n,e)>0)&&(e=n)}return e?`v${e.major}.${e.minor}.${e.patch}`:null}function ui(s){let e=Qr(s);if(!e)return"v1.0.0";let{major:t,minor:n,patch:r}=e;return r<9?`v${t}.${n}.${r+1}`:(r=0,n<9?`v${t}.${n+1}.${r}`:(n=0,t+=1,`v${t}.${n}.${r}`))}function gi(s){let e=(s||"").trim();return e?e.replace(/\r\n/g,`
30
+ `,"utf8"),S=o?this.getTokenForServer(g,o.osClient,o.osClientType,o.osClientNetwork):await this.loadToken(),h=d.protocol==="https:",C=h?Xt:Zt,w=d.pathname.replace(/\/+$/,""),b={hostname:d.hostname,port:d.port||(h?443:80),path:w+e,method:"POST",timeout:a,rejectUnauthorized:this._strictTlsHosts.has(d.hostname.toLowerCase()),headers:{Accept:"application/json",...S?{Authorization:`Bearer ${S}`}:{},did:this.getDeviceId(),...o?.osClient?{OsClient:o.osClient}:{},"Content-Type":`multipart/form-data; boundary=${u}`,"Content-Length":f.length+l.size+y.length}};return new Promise((v,k)=>{let V=!1,Y=$=>{V||(V=!0,k($))},N=C.request(b,$=>{let M=[];$.on("data",P=>M.push(P)),$.on("end",async()=>{if(V)return;let P=Buffer.concat(M).toString("utf8"),x;try{x=JSON.parse(P)}catch{Y(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u54CD\u5E94\u4E0D\u662F JSON\uFF08HTTP ${$.statusCode||0}\uFF09`));return}let J=String($.headers.authorization||"");J&&await this.setToken(J,g,o?.osClient,o?.osClientType,o?.osClientNetwork),V=!0,v(x)})});N.on("error",$=>Y(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u5931\u8D25\uFF1A${bt($)}`))),N.on("timeout",()=>{N.destroy(),Y(new Error(`\u6D41\u5F0F\u4E0A\u4F20\u8D85\u65F6\uFF08${a}ms\uFF09`))}),N.write(f);let R=ot.createReadStream(c);R.on("error",$=>{N.destroy(),Y(new Error(`\u8BFB\u53D6\u672C\u5730\u53D1\u5E03\u8D44\u4EA7\u5931\u8D25\uFF1A${bt($)}`))}),R.on("end",()=>N.end(y)),R.pipe(N,{end:!1})})}};var at=O(require("crypto")),W=O(require("fs")),At=O(require("path"));var It=O(require("child_process")),Ur=require("crypto"),re=O(require("fs")),sn=O(require("path")),_t=".microi-workspace-secrets.dpapi.json",jr=["$ErrorActionPreference = 'Stop';","Add-Type -AssemblyName System.Security;","$inputBase64 = [Console]::In.ReadToEnd().Trim();","$plain = [Convert]::FromBase64String($inputBase64);","$cipher = [Security.Cryptography.ProtectedData]::Protect($plain, $null, [Security.Cryptography.DataProtectionScope]::CurrentUser);","[Console]::Out.Write([Convert]::ToBase64String($cipher));"].join(" "),Kr=["$ErrorActionPreference = 'Stop';","Add-Type -AssemblyName System.Security;","$inputBase64 = [Console]::In.ReadToEnd().Trim();","$cipher = [Convert]::FromBase64String($inputBase64);","$plain = [Security.Cryptography.ProtectedData]::Unprotect($cipher, $null, [Security.Cryptography.DataProtectionScope]::CurrentUser);","[Console]::Out.Write([Convert]::ToBase64String($plain));"].join(" ");function tn(s,e){if(process.platform!=="win32")throw new Error("\u5F53\u524D\u64CD\u4F5C\u7CFB\u7EDF\u4E0D\u652F\u6301 Windows DPAPI \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93");let t=process.env.SystemRoot||"C:\\Windows",n=sn.join(t,"System32","WindowsPowerShell","v1.0","powershell.exe"),r=It.spawnSync(n,["-NoLogo","-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-Command",s],{input:e.toString("base64"),encoding:"utf8",windowsHide:!0,maxBuffer:4*1024*1024,timeout:15e3}),i=String(r.stdout||"").trim();if(r.error||r.status!==0||!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(i))throw new Error("Windows DPAPI \u64CD\u4F5C\u5931\u8D25\uFF1B\u51ED\u636E\u672A\u5199\u5165\u660E\u6587\u6587\u4EF6");return Buffer.from(i,"base64")}function si(s){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,s)}var Kn="dpapi-session-v1:",Rt="keychain-session-v1:",jn="net.microi.cli.workspace.v1",Hr="net.microi.cli.session.v1",Wr=s=>(0,Ur.createHash)("sha256").update(s).digest("hex");function Hn(s,e){if(process.platform!=="darwin")throw new Error("macOS Keychain is unavailable on this platform");let t=It.spawnSync("/usr/bin/security",["find-generic-password","-s",s,"-a",e,"-w"],{encoding:"utf8",timeout:15e3,maxBuffer:4*1024*1024});if(t.status===44)return;if(t.error||t.status!==0)throw new Error("macOS Keychain \u8BFB\u53D6\u5931\u8D25\uFF1B\u51ED\u636E\u672A\u5199\u5165\u660E\u6587\u6587\u4EF6");let n=String(t.stdout||"").trim();if(!/^[A-Za-z0-9+/]+={0,2}$/.test(n))throw new Error("macOS Keychain \u51ED\u636E\u683C\u5F0F\u65E0\u6548");return Buffer.from(n,"base64").toString("utf8")}function Gr(s,e,t){if(process.platform!=="darwin")throw new Error("macOS Keychain is unavailable on this platform");let n=Buffer.from(t,"utf8").toString("base64"),r=`add-generic-password -U -s ${s} -a ${e} -w ${n}
31
+ `,i=It.spawnSync("/usr/bin/security",["-q","-i"],{input:r,encoding:"utf8",timeout:15e3,maxBuffer:4*1024*1024});if(i.error||i.status!==0||Hn(s,e)!==t)throw new Error("macOS Keychain \u5199\u5165\u6216\u56DE\u8BFB\u5931\u8D25\uFF1B\u51ED\u636E\u672A\u5199\u5165\u660E\u6587\u6587\u4EF6")}function ii(s,e){if(process.platform!=="darwin")throw new Error("macOS Keychain is unavailable on this platform");let t=It.spawnSync("/usr/bin/security",["delete-generic-password","-s",s,"-a",e],{encoding:"utf8",timeout:15e3,maxBuffer:4*1024*1024});if(t.error||t.status!==0&&t.status!==44)throw new Error("macOS Keychain \u5220\u9664\u5931\u8D25")}var nn=class{constructor(e){this.workspaceTokenFile=e;this.onDidChange=()=>({dispose:()=>{}})}account(e){return Wr(`${this.workspaceTokenFile}\0${e}`)}async get(e){return Hn(jn,this.account(e))}async store(e,t){Gr(jn,this.account(e),t)}async delete(e){ii(jn,this.account(e))}},Pt=new Map,Dt=new Map;function Mt(s){return typeof s=="string"&&(s.startsWith(Kn)||s.startsWith(Rt))}function zr(s){if(!s||Mt(s))return s;if(process.platform==="darwin"){let e=Rt+Wr(s);return Gr(Hr,e.slice(Rt.length),s),e}return Dt.has(s)||(Dt.size>256&&Dt.clear(),Dt.set(s,Kn+tn(jr,Buffer.from(s,"utf8")).toString("base64"))),Dt.get(s)}function Wn(s){if(typeof s!="string")return"";if(!Mt(s))return s;if(s.startsWith(Rt)){let e=s.slice(Rt.length);if(!/^[a-f0-9]{64}$/.test(e))throw new Error("macOS Keychain Token \u5F15\u7528\u683C\u5F0F\u65E0\u6548");let t=Hn(Hr,e);if(!t)throw new Error("macOS Keychain Token \u5F15\u7528\u4E0D\u5B58\u5728");return t}return Pt.has(s)||(Pt.size>256&&Pt.clear(),Pt.set(s,tn(Kr,Buffer.from(s.slice(Kn.length),"base64")).toString("utf8"))),Pt.get(s)}function oi(s){if(!Number.isInteger(s)||s<=1)return!1;try{return process.kill(s,0),!0}catch(e){return e.code==="EPERM"}}function ai(s){try{let e=JSON.parse(re.readFileSync(s,"utf8"));return oi(Number(e?.pid))}catch{return!1}}var rn=class{constructor(e,t){this.filePath=e;this.onDidChange=()=>({dispose:()=>{}});this.protect=t?.protect||(n=>tn(jr,n)),this.unprotect=t?.unprotect||(n=>tn(Kr,n))}async get(e){return this.readDocument().values[e]}async store(e,t){this.mutate(n=>{n.values[e]=t})}async delete(e){this.mutate(t=>{delete t.values[e]})}mutate(e){re.mkdirSync(sn.dirname(this.filePath),{recursive:!0});let t=`${this.filePath}.lock`,n=Date.now()+3e3,r;for(;r===void 0;)try{r=re.openSync(t,"wx",384),re.writeFileSync(r,`${JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()})}
32
+ `,"utf8")}catch(o){if(o.code!=="EEXIST")throw o;try{let a=Date.now()-re.statSync(t).mtimeMs>3e4;(!ai(t)||a)&&re.unlinkSync(t)}catch{}if(Date.now()>=n)throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u6B63\u88AB\u53E6\u4E00\u8FDB\u7A0B\u66F4\u65B0\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");si(40)}let i=`${this.filePath}.${process.pid}.${Date.now()}.tmp`;try{let o=this.readDocument();e(o);let a=Buffer.from(JSON.stringify(o),"utf8"),c={version:1,protection:"windows-dpapi-current-user",ciphertext:this.protect(a).toString("base64")};if(!this.unprotect(Buffer.from(c.ciphertext,"base64")).equals(a))throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u52A0\u5BC6\u56DE\u8BFB\u4E0D\u4E00\u81F4\uFF0C\u5DF2\u4FDD\u7559\u539F\u4FDD\u9669\u5E93");re.writeFileSync(i,`${JSON.stringify(c,null,2)}
33
+ `,{encoding:"utf8",mode:384}),re.renameSync(i,this.filePath)}finally{try{re.existsSync(i)&&re.unlinkSync(i)}catch{}try{re.closeSync(r)}catch{}try{re.unlinkSync(t)}catch{}}}readDocument(){if(!re.existsSync(this.filePath))return{version:1,values:{}};if(re.statSync(this.filePath).size>2*1024*1024)throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u8D85\u8FC7\u5B89\u5168\u5927\u5C0F\u9650\u5236\uFF0C\u5DF2\u62D2\u7EDD\u8BFB\u53D6");let e;try{e=JSON.parse(re.readFileSync(this.filePath,"utf8"))}catch{throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u4E14\u505C\u6B62\u8986\u76D6")}if(e.version!==1||e.protection!=="windows-dpapi-current-user"||typeof e.ciphertext!="string"||!e.ciphertext)throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u683C\u5F0F\u65E0\u6548\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u4E14\u505C\u6B62\u8986\u76D6");try{let t=this.unprotect(Buffer.from(e.ciphertext,"base64"));if(t.length===0)return{version:1,values:{}};let n=JSON.parse(t.toString("utf8"));if(n.version!==1||!n.values||typeof n.values!="object")throw new Error("invalid document");return n.values=Object.fromEntries(Object.entries(n.values).filter(r=>typeof r[0]=="string"&&typeof r[1]=="string")),n}catch{throw new Error("Microi \u5DE5\u4F5C\u533A\u51ED\u636E\u4FDD\u9669\u5E93\u65E0\u6CD5\u7531\u5F53\u524D Windows \u7528\u6237\u89E3\u5BC6\uFF0C\u5DF2\u505C\u6B62\u8986\u76D6")}}};var ci=60*60*1e3,li=5*60,Jr=24*60*60,di=2*60*1e3,ui=60*1e3;function gi(s,e){let t=(e||"").trim();return t?at.publicEncrypt({key:t,padding:at.constants.RSA_PKCS1_PADDING},Buffer.from(s,"utf-8")).toString("base64"):s}var we=class s{constructor(){this._isLoggedIn=!1;this._refreshInProgress=!1;this._mcpTokenFilePath="";this._mcpAuthRecoveryDirPath="";this._mcpAuthRecoveryInProgress=new Set;this._mcpAuthRecoveryFailureUntil=new Map;this._mcpAuthRecoveryPassInProgress=!1;this._lastAuthWarning="";this._lastAuthWarningTime=0;this.protectedMcpTokenKeys=new Set}static getInstance(){return s._instance||(s._instance=new s),s._instance}setSecretStorage(e){this._secretStorage=e,j.getInstance().setTokenStateChangedHandler(async()=>{await this.writeMcpTokenFile()}),j.getInstance().setAuthRecoveryHandler(async t=>{let n=I.getInstance(),r=this.normalizeApiBaseUrl(t.apiBaseUrl),i=this.normalizeOsClient(t.osClient),o=this.normalizeIdentityPart(t.osClientType),a=this.normalizeIdentityPart(t.osClientNetwork),c=n.getProfiles().filter(d=>this.normalizeApiBaseUrl(d.apiBaseUrl)===r&&this.normalizeOsClient(d.osClient)===i),l=c.find(d=>this.normalizeIdentityPart(d.osClientType)===o&&this.normalizeIdentityPart(d.osClientNetwork)===a);if(!l&&!o&&!a&&c.length===1&&(l=c[0]),!l&&c.length===0&&(l={label:t.osClient||t.apiBaseUrl,apiBaseUrl:t.apiBaseUrl,osClient:t.osClient||"",osClientType:t.osClientType,osClientNetwork:t.osClientNetwork}),!l)return this.showAuthExpiredWarning("\u68C0\u6D4B\u5230\u540C\u4E00\u670D\u52A1\u5668\u4E0E\u79DF\u6237\u5B58\u5728\u591A\u4E2A\u8FDE\u63A5\u73AF\u5883\uFF0C\u65E0\u6CD5\u5B89\u5168\u5224\u65AD\u5E94\u6062\u590D\u54EA\u4E00\u4E2A\u767B\u5F55\u8EAB\u4EFD\u3002"),!1;let g=await this.reLoginForProfile(l);return g&&(this._isLoggedIn=!0,await qe.executeCommand("setContext",rt,!0)),await this.writeMcpTokenFile(),g})}setMcpTokenFilePath(e){this._mcpTokenFilePath=e,this._mcpAuthRecoveryDirPath=e?`${e}.recovery`:""}enableProtectedMcpTokens(e){let t=this.normalizeApiBaseUrl(e.apiBaseUrl),n=this.normalizeOsClient(e.osClient);this.protectedMcpTokenKeys.add(this.mcpRecoveryIdentity(t,n,e.osClientType,e.osClientNetwork)),this.protectedMcpTokenKeys.add(n?`${t}|${n}`:t)}get mcpTokenFilePath(){return this._mcpTokenFilePath}get mcpAuthRecoveryDirPath(){return this._mcpAuthRecoveryDirPath}async loadMcpTokenFile(){if(!this._mcpTokenFilePath||!W.existsSync(this._mcpTokenFilePath))return 0;let e;try{let i=JSON.parse(W.readFileSync(this._mcpTokenFilePath,"utf-8"));if(!i||typeof i!="object"||Array.isArray(i))return 0;for(let[o,a]of Object.entries(i))Mt(a)&&this.protectedMcpTokenKeys.add(o);e=Object.fromEntries(Object.entries(i).map(([o,a])=>[o,Wn(a)]))}catch{return 0}let t=j.getInstance(),n=I.getInstance().getProfiles(),r=[];for(let i of n){let o=this.normalizeApiBaseUrl(i.apiBaseUrl),a=this.normalizeOsClient(i.osClient),c=this.mcpRecoveryIdentity(o,a,i.osClientType,i.osClientNetwork),g=n.filter(y=>this.normalizeApiBaseUrl(y.apiBaseUrl)===o&&this.normalizeOsClient(y.osClient)===a).length===1?[[o,a,i.osClientType,i.osClientNetwork].filter(Boolean).join("|"),[o,a,i.osClientType].filter(Boolean).join("|"),a?`${o}|${a}`:o]:[],d=typeof e[c]=="string"&&String(e[c]).trim()?String(e[c]).trim():"",u=g.map(y=>e[y]).find(y=>typeof y=="string"&&y.trim()),p=t.getTokenForServer(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork),m=t.getExactTokenForServer(i.apiBaseUrl,i.osClient,i.osClientType,i.osClientNetwork),f=it(p,d||u,!!d&&!m);!f||m===f||r.push({token:f,apiBaseUrl:i.apiBaseUrl,osClient:i.osClient,osClientType:i.osClientType,osClientNetwork:i.osClientNetwork})}return t.adoptTokensFromSharedFile(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)}`)}getCredentialSecretKeys(e){return{usernameKey:this.serverSecretKey(Te,e.apiBaseUrl,e.osClient),passwordKey:this.serverSecretKey(ve,e.apiBaseUrl,e.osClient)}}legacyServerSecretKey(e,t){return this.secretKey(`${e}.${this.normalizeApiBaseUrl(t)}`)}canUseLegacyCredential(e,t){let n=this.normalizeApiBaseUrl(e),r=this.normalizeOsClient(t);if(!n)return!1;let i=I.getInstance().getProfiles().filter(a=>this.normalizeApiBaseUrl(a.apiBaseUrl)===n);if(i.length===0)return!r;if(i.length===1)return!0;let o=i.filter(a=>this.normalizeOsClient(a.osClient)===r);return!!r&&o.length===i.length}async writeMcpTokenFile(){if(!this._mcpTokenFilePath)return;let e=j.getInstance(),t=I.getInstance(),n=t.getProfiles(),r=this._mcpTokenFilePath;if(!(n.some(f=>!!this.normalizeApiBaseUrl(f.apiBaseUrl)&&!!this.normalizeOsClient(f.osClient))||!!this.normalizeApiBaseUrl(t.getApiBaseUrl())&&!!this.normalizeOsClient(t.getOsClient()))&&!W.existsSync(r))return;let o={},a=new Set,c=[];for(let f of n){let y=this.normalizeApiBaseUrl(f.apiBaseUrl),S=this.normalizeOsClient(f.osClient),h=this.mcpRecoveryIdentity(y,S,f.osClientType,f.osClientNetwork);a.add(h);let C=n.filter(v=>this.normalizeApiBaseUrl(v.apiBaseUrl)===y&&this.normalizeOsClient(v.osClient)===S),w=S?`${y}|${S}`:y;C.length===1&&a.add(w);let b=e.getTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork);c.push({profile:f,exactKey:h,legacyKey:C.length===1?w:void 0,currentToken:b,currentExactToken:e.getExactTokenForServer(f.apiBaseUrl,f.osClient,f.osClientType,f.osClientNetwork)}),b&&(o[h]=b,C.length===1&&(o[w]=b))}let l=At.dirname(r);W.existsSync(l)||W.mkdirSync(l,{recursive:!0});let g=`${r}.lock`,d=Date.now()+3e3,u;for(;u===void 0;)try{u=W.openSync(g,"wx",384),W.writeFileSync(u,JSON.stringify({pid:process.pid,createdAt:Date.now()}),"utf-8")}catch(f){if(f.code!=="EEXIST")throw f;try{Date.now()-W.statSync(g).mtimeMs>3e4&&W.unlinkSync(g)}catch{}if(Date.now()>=d)throw new Error("Microi MCP Token \u6587\u4EF6\u6B63\u5728\u88AB CLI \u6216 VS Code \u63D2\u4EF6\u4FEE\u6539\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");await new Promise(y=>setTimeout(y,40))}let p=`${r}.${process.pid}.${Date.now()}.tmp`,m=[];try{let f={};if(W.existsSync(r)){let h=JSON.parse(W.readFileSync(r,"utf-8"));if(!h||typeof h!="object"||Array.isArray(h))throw new Error(`Microi MCP Token \u6587\u4EF6\u5FC5\u987B\u662F JSON \u5BF9\u8C61\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1A${r}`);for(let[C,w]of Object.entries(h))Mt(w)&&this.protectedMcpTokenKeys.add(C);f=Object.fromEntries(Object.entries(h).filter(C=>typeof C[1]=="string"&&!!C[1]).map(([C,w])=>[C,Wn(w)]))}for(let h of c){let C=f[h.exactKey]||"",w=h.legacyKey&&f[h.legacyKey]||"",b=it(h.currentToken,C||w,!!C&&!h.currentExactToken);b&&(o[h.exactKey]=b,h.legacyKey&&(o[h.legacyKey]=b),b!==h.currentExactToken&&m.push({profile:h.profile,token:b}))}for(let h of a)delete f[h];let y={...f,...o},S=Object.fromEntries(Object.entries(y).map(([h,C])=>[h,this.protectedMcpTokenKeys.has(h)?zr(C):C]));W.writeFileSync(p,`${JSON.stringify(S,null,2)}
34
+ `,{encoding:"utf-8",mode:384}),W.renameSync(p,r)}finally{try{W.existsSync(p)&&W.unlinkSync(p)}catch{}try{W.closeSync(u)}catch{}try{W.unlinkSync(g)}catch{}}await e.adoptTokensFromSharedFile(m.map(f=>({token:f.token,apiBaseUrl:f.profile.apiBaseUrl,osClient:f.profile.osClient,osClientType:f.profile.osClientType,osClientNetwork:f.profile.osClientNetwork})))}tokenFingerprint(e){return at.createHash("sha256").update(String(e||"")).digest("hex")}deleteMcpAuthRecoveryRequests(e,t){let n=this._mcpAuthRecoveryDirPath;if(!n||!W.existsSync(n))return;let r=[];try{r=W.readdirSync(n).filter(i=>i.endsWith(".json")).slice(0,200)}catch{return}for(let i of r){let o=At.join(n,i);try{let a=JSON.parse(W.readFileSync(o,"utf-8")),c=this.normalizeApiBaseUrl(String(a.apiBaseUrl||"")),l=this.normalizeOsClient(String(a.osClient||"")),g=this.normalizeIdentityPart(String(a.osClientType||"")),d=this.normalizeIdentityPart(String(a.osClientNetwork||"")),u=this.mcpRecoveryIdentity(c,l,g,d);if(!g&&!d){let p=t.filter(m=>this.normalizeApiBaseUrl(m.apiBaseUrl)===c&&this.normalizeOsClient(m.osClient)===l);p.length===1&&(u=this.mcpRecoveryIdentity(p[0].apiBaseUrl,p[0].osClient,p[0].osClientType,p[0].osClientNetwork))}u===e&&W.unlinkSync(o)}catch{}}}async processMcpAuthRecoveryRequests(){let e=this._mcpAuthRecoveryDirPath;if(!(!e||!W.existsSync(e)||this._mcpAuthRecoveryPassInProgress)){this._mcpAuthRecoveryPassInProgress=!0;try{let t=[];try{t=W.readdirSync(e).filter(o=>o.endsWith(".json")).slice(0,100)}catch{return}let r=I.getInstance().getProfiles(),i=j.getInstance();for(let o of t){let a=At.join(e,o),c={};try{c=JSON.parse(W.readFileSync(a,"utf-8"))}catch{try{W.unlinkSync(a)}catch{}continue}let l=Number(c.requestedAt||0),g=this.normalizeApiBaseUrl(String(c.apiBaseUrl||"")),d=this.normalizeOsClient(String(c.osClient||"")),u=this.normalizeIdentityPart(String(c.osClientType||"")),p=this.normalizeIdentityPart(String(c.osClientNetwork||"")),m=String(c.failedTokenHash||"").trim().toLowerCase();if(Number(c.version)!==1||!g||!l||Math.abs(Date.now()-l)>di||!Lr(m)){try{W.unlinkSync(a)}catch{}continue}let f=r.filter(h=>this.normalizeApiBaseUrl(h.apiBaseUrl)===g&&this.normalizeOsClient(h.osClient)===d),y=u||p?f.find(h=>this.normalizeIdentityPart(h.osClientType)===u&&this.normalizeIdentityPart(h.osClientNetwork)===p):f.length===1?f[0]:void 0;if(!y){try{W.unlinkSync(a)}catch{}continue}let S=this.mcpRecoveryIdentity(y.apiBaseUrl,y.osClient,y.osClientType,y.osClientNetwork);if(!this._mcpAuthRecoveryInProgress.has(S)){if((this._mcpAuthRecoveryFailureUntil.get(S)||0)>Date.now()){this.deleteMcpAuthRecoveryRequests(S,r);continue}this._mcpAuthRecoveryInProgress.add(S);try{let h=i.getTokenForServer(y.apiBaseUrl,y.osClient,y.osClientType,y.osClientNetwork);h&&this.tokenFingerprint(h)!==m?(this._mcpAuthRecoveryFailureUntil.delete(S),await this.writeMcpTokenFile()):(h&&await i.clearTokenForServer(y.apiBaseUrl,y.osClient,y.osClientType,y.osClientNetwork,h),await this.reLoginForProfile(y)?this._mcpAuthRecoveryFailureUntil.delete(S):(this._mcpAuthRecoveryFailureUntil.set(S,Date.now()+ui),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(S),this.deleteMcpAuthRecoveryRequests(S,r)}}}}finally{this._mcpAuthRecoveryPassInProgress=!1}}}startMcpAuthRecoveryWatcher(){this._mcpAuthRecoveryTimer||!this._mcpAuthRecoveryDirPath||(this._mcpAuthRecoveryTimer=setInterval(()=>{this.processMcpAuthRecoveryRequests()},1e3),this.processMcpAuthRecoveryRequests())}stopMcpAuthRecoveryWatcher(){this._mcpAuthRecoveryTimer&&(clearInterval(this._mcpAuthRecoveryTimer),this._mcpAuthRecoveryTimer=void 0)}async tryAutoLogin(){let e=j.getInstance(),n=I.getInstance().getProfiles(),r=!1,i=await e.loadToken(),o=await this.loadMcpTokenFile();r=!!i||o>0||e.hasToken;let a=n.filter(d=>!e.getTokenForServer(d.apiBaseUrl,d.osClient,d.osClientType,d.osClientNetwork)),c=0,l=async()=>{for(;c<a.length;){let d=a[c++];await this.reLoginForProfile(d)&&(r=!0)}},g=Math.min(4,a.length);return await Promise.all(Array.from({length:g},()=>l())),r&&(this._isLoggedIn=!0,await qe.executeCommand("setContext",rt,!0),await this.writeMcpTokenFile()),r}async getSysConfig(e,t,n,r=!1){let i=j.getInstance(),o=I.getInstance();try{let a=await i.request({method:"POST",path:H.GET_SYS_CONFIG,body:{_SearchEqual:{IsEnable:1},OsClient:t||o.getOsClient()||void 0},apiBaseUrl:e,osClient:t,allowAuthRetry:!1,silent:r});if(a.Code===1&&a.Data)return a.Data;n&&(n.message=a.Code!==1?`\u670D\u52A1\u5668\u8FD4\u56DE\u9519\u8BEF (Code: ${a.Code})${a.Msg?"\uFF1A"+a.Msg:""}\uFF0C\u8BF7\u68C0\u67E5 OsClient \u662F\u5426\u6B63\u786E`:"\u670D\u52A1\u5668\u672A\u8FD4\u56DE\u914D\u7F6E\u6570\u636E")}catch(a){n&&(n.message=a instanceof Error?a.message:String(a))}return null}async getCaptcha(e,t){let n=j.getInstance(),r=I.getInstance();try{let i=await n.getRaw(H.GET_CAPTCHA,{OsClient:t||r.getOsClient()||""},e);if(i.data&&i.captchaId){let o=i.data.toString("base64");return{captchaId:i.captchaId,imageBase64:`data:image/png;base64,${o}`}}}catch{}return null}async login(e,t,n={}){let r=j.getInstance(),i=I.getInstance(),o=n.osClient||i.getOsClient(),a=n.silent??!1;try{let c=await this.getSysConfig(n.apiBaseUrl,o,void 0,a),l=c?.EnableCaptcha;if((l===!0||l===1||String(l||"").trim().toLowerCase()==="true")&&(!n.captchaId||!n.captchaValue)){let S="\u670D\u52A1\u5668\u5DF2\u5F00\u542F\u56FE\u5F62\u9A8C\u8BC1\u7801\uFF0C\u8BF7\u5728\u63D2\u4EF6\u914D\u7F6E\u4E2D\u4EA4\u4E92\u5F0F\u767B\u5F55\u3002";return a||A.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${S}`),{ok:!1,msg:S}}let d=typeof c?.LoginRsaPublicKey=="string"&&c.LoginRsaPublicKey.trim()?c.LoginRsaPublicKey:br,u=gi(t,d),p={Account:e,Pwd:u,OsClient:o||void 0,_ClientType:"VSCode"};n.captchaId&&n.captchaValue&&(p._CaptchaId=n.captchaId,p._CaptchaValue=n.captchaValue);let m=await r.request({method:"POST",path:H.LOGIN,body:p,bodyFormat:"form",apiBaseUrl:n.apiBaseUrl,osClient:n.osClient,osClientType:n.osClientType,osClientNetwork:n.osClientNetwork,allowAuthRetry:!1,silent:a}),y=m._headers?.authorization||"";if(m.Code===1)return y&&await r.setToken(y,n.apiBaseUrl,n.osClient,n.osClientType,n.osClientNetwork),this._secretStorage&&(n.apiBaseUrl?(await this._secretStorage.store(this.serverSecretKey(Te,n.apiBaseUrl,o),e),await this._secretStorage.store(this.serverSecretKey(ve,n.apiBaseUrl,o),t)):(await this._secretStorage.store(this.secretKey(Te),e),await this._secretStorage.store(this.secretKey(ve),t))),m.Data?.OsClient&&!o&&await i.updateSettings({osClient:m.Data.OsClient}),this._isLoggedIn=!0,await qe.executeCommand("setContext",rt,!0),await this.writeMcpTokenFile(),a||A.info(`Microi: \u767B\u5F55\u6210\u529F\uFF0C\u6B22\u8FCE ${m.Data?.Name||m.Data?.Account||e}`),{ok:!0,msg:""};{let S=m.Msg||"\u8BF7\u68C0\u67E5\u8D26\u53F7\u5BC6\u7801";return a||A.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${S}`),{ok:!1,msg:S}}}catch(c){let l=c instanceof Error?c.message:String(c);return a||A.error(`Microi: \u767B\u5F55\u5931\u8D25 - ${l}`),{ok:!1,msg:l}}}async refreshAllTokens(){if(this._refreshInProgress)return;this._refreshInProgress=!0;let e=j.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 u=await e.request({method:"GET",path:H.GET_STATUS,apiBaseUrl:r.apiBaseUrl,osClient:r.osClient,osClientType:r.osClientType,osClientNetwork:r.osClientNetwork,allowAuthRetry:!1,silent:!0});if(kt(u))continue;if(Yt(u)){await e.clearTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork,i),await this.reLoginForProfile(r)||this.showAuthExpiredWarning(u.Msg||"\u5F53\u524D\u767B\u5F55\u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002");continue}}catch{}let o=this.readJwtClientClaims(i),a=String(o?.ClientType||"").trim(),c=a.toLowerCase()!=="vscode",l=!a||a.toLowerCase()==="empty";if(c&&(await this.reLoginForProfile(r)||!l))continue;let g=String(o?.Did||"").trim(),d=a.toLowerCase()==="vscode"&&g!==e.getDeviceId();if(!(!c&&!d&&!this.shouldRefreshToken(i,o)))try{let u=await e.request({method:"POST",path:H.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}),m=u._headers?.authorization||"";u.Code===1&&m?await e.setToken(m,r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork):(await e.clearTokenForServer(r.apiBaseUrl,r.osClient,r.osClientType,r.osClientNetwork,i),await this.reLoginForProfile(r)||this.showAuthExpiredWarning(u.Msg||"\u5F53\u524D\u767B\u5F55\u8EAB\u4EFD\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u3002"))}catch{await this.reLoginForProfile(r)}}}finally{this._isLoggedIn=e.hasToken,await qe.executeCommand("setContext",rt,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,A.warn(`Microi: ${t}`))}readJwtClientClaims(e){try{let n=e.replace(/^Bearer\s+/i,"").trim().split(".");if(n.length<2)return null;let r=n[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(Buffer.from(r,"base64").toString("utf-8"))}catch{return null}}shouldRefreshToken(e,t){let n=t??this.readJwtClientClaims(e),r=Number(n?.exp);if(!Number.isFinite(r)||r<=0)return!0;let i=Number(n?.MicroiTokenIssuedAt??n?.iat),o=Number.isFinite(i)&&i>0&&r>i?r-i:Jr,a=Math.min(Jr,Math.max(li,Math.floor(o/10)));return r-Math.floor(Date.now()/1e3)<=a}async getCredentialsForProfile(e,t){if(!this._secretStorage)return null;let n=this.normalizeApiBaseUrl(e),r=this.normalizeOsClient(t),i=n?await this._secretStorage.get(this.serverSecretKey(Te,n,r)):void 0,o=n?await this._secretStorage.get(this.serverSecretKey(ve,n,r)):void 0;return(!i||!o)&&n&&this.canUseLegacyCredential(n,r)&&(i=i||await this._secretStorage.get(this.legacyServerSecretKey(Te,n)),o=o||await this._secretStorage.get(this.legacyServerSecretKey(ve,n))),(!i||!o)&&!n&&!r&&(i=i||await this._secretStorage.get(this.secretKey(Te)),o=o||await this._secretStorage.get(this.secretKey(ve))),!i||!o?null:{username:i,password:o}}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}async recoverProfileLogin(e){let t=await this.reLoginForProfile(e);return t&&(this._isLoggedIn=!0,await this.writeMcpTokenFile()),t}startTokenRefresh(){this.stopTokenRefresh(),this.startMcpAuthRecoveryWatcher(),this.refreshAllTokens(),this._refreshTimer=setInterval(()=>{this.refreshAllTokens()},ci),this._windowStateSubscription=he.onDidChangeWindowState(e=>{e.focused&&this.refreshAllTokens()})}stopTokenRefresh(){this._refreshTimer&&(clearInterval(this._refreshTimer),this._refreshTimer=void 0),this._windowStateSubscription&&(this._windowStateSubscription.dispose(),this._windowStateSubscription=void 0),this.stopMcpAuthRecoveryWatcher()}async logoutProfile(e){await j.getInstance().clearTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork),this._secretStorage&&(await this._secretStorage.delete(this.serverSecretKey(Te,e.apiBaseUrl,e.osClient)),await this._secretStorage.delete(this.serverSecretKey(ve,e.apiBaseUrl,e.osClient)),this.canUseLegacyCredential(e.apiBaseUrl,e.osClient)&&(await this._secretStorage.delete(this.legacyServerSecretKey(Te,e.apiBaseUrl)),await this._secretStorage.delete(this.legacyServerSecretKey(ve,e.apiBaseUrl)))),await this.writeMcpTokenFile()}async logout(){if(this.stopTokenRefresh(),await j.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 qe.executeCommand("setContext",rt,!1),A.info("Microi: \u5DF2\u9000\u51FA\u767B\u5F55")}};var pi=/^\s*\*?\s*Version\s*:\s*(v\d+\.\d+\.\d+)\s*$/im,Yr=/^v(\d+)\.(\d+)\.(\d+)$/;function on(s){let e=(s||"").trim();if(!e)return null;let t=e.match(Yr);if(t)return`v${Number(t[1])}.${Number(t[2])}.${Number(t[3])}`;let n=e.match(pi);return n?on(n[1]):null}function Xr(s){if(!s)return null;let e=s.match(Yr);return e?{major:Number(e[1]),minor:Number(e[2]),patch:Number(e[3])}:null}function mi(s,e){return s.major!==e.major?s.major-e.major:s.minor!==e.minor?s.minor-e.minor:s.patch-e.patch}function fi(s){let e=null;for(let t of s){let n=Xr(t);n&&(!e||mi(n,e)>0)&&(e=n)}return e?`v${e.major}.${e.minor}.${e.patch}`:null}function hi(s){let e=Xr(s);if(!e)return"v1.0.0";let{major:t,minor:n,patch:r}=e;return r<9?`v${t}.${n}.${r+1}`:(r=0,n<9?`v${t}.${n+1}.${r}`:(n=0,t+=1,`v${t}.${n}.${r}`))}function yi(s){let e=(s||"").trim();return e?e.replace(/\r\n/g,`
35
35
  `).split(`
36
- `).map(t=>t.trim()).filter(Boolean):["\u8BF7\u8865\u5145\u8BE5 V8 \u4EE3\u7801\u7684\u5B8C\u6574\u529F\u80FD\u8BF4\u660E\u3002"]}function pi(s){let e=s.replace(/\r\n/g,`
36
+ `).map(t=>t.trim()).filter(Boolean):["\u8BF7\u8865\u5145\u8BE5 V8 \u4EE3\u7801\u7684\u5B8C\u6574\u529F\u80FD\u8BF4\u660E\u3002"]}function Si(s){let e=s.replace(/\r\n/g,`
37
37
  `).split(`
38
38
  `),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 o=i.replace(/^(Function|功能说明)\s*[::]\s*/i,"").trim();o&&t.push(o.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(`
39
- `):void 0}function Wn(s){let e=s.match(/^\s*(\/\*[\s\S]*?\*\/)\s*/);return e?{comment:e[1],rest:s.slice(e[0].length)}:null}function zr(s){return/^\/\*\s*OFFICIAL_(?:MANAGED|CREATE_IF_MISSING)_API_ENGINE_NOTICE_V1\b/i.test(s)}function Jr(s){return/Microi\s+V8|V8\s+(?:ApiEngine|Event|Workflow)|Version\s*:|ChangeLog\s*:|TableKey\s*:|WorkflowKey\s*:/i.test(s)}function mi(s){let e=s.replace(/^\uFEFF/,""),t=Wn(e);if(!t)return{body:e};if(zr(t.comment)){let r=Wn(t.rest);return r&&Jr(r.comment)?{notice:t.comment,header:r.comment,body:r.rest}:{notice:t.comment,body:t.rest}}if(!Jr(t.comment))return{body:e};let n=Wn(t.rest);return n&&zr(n.comment)?{notice:n.comment,header:t.comment,body:n.rest}:{header:t.comment,body:t.rest}}function fi(s,e,t){let n=s.functionDescription||pi(t||""),r=gi(n),i=s.kind==="ApiEngine"?"V8 ApiEngine":s.kind==="V8Event"?"V8 Event":"V8 Workflow",o=s.kind==="ApiEngine"?"ApiEngineKey":s.kind==="V8Event"?"TableKey":"WorkflowKey",a=["/*",` * ${i}`,` * ${o}: ${s.key}`];s.eventType&&a.push(` * EventType: ${s.eventType}`),a.push(` * Version: ${e}`),a.push(" * Function:");for(let c of r)a.push(` * - ${c}`);return a.push(" */"),`${a.join(`
39
+ `):void 0}function Gn(s){let e=s.match(/^\s*(\/\*[\s\S]*?\*\/)\s*/);return e?{comment:e[1],rest:s.slice(e[0].length)}:null}function qr(s){return/^\/\*\s*OFFICIAL_(?:MANAGED|CREATE_IF_MISSING)_API_ENGINE_NOTICE_V1\b/i.test(s)}function Qr(s){return/Microi\s+V8|V8\s+(?:ApiEngine|Event|Workflow)|Version\s*:|ChangeLog\s*:|TableKey\s*:|WorkflowKey\s*:/i.test(s)}function Ci(s){let e=s.replace(/^\uFEFF/,""),t=Gn(e);if(!t)return{body:e};if(qr(t.comment)){let r=Gn(t.rest);return r&&Qr(r.comment)?{notice:t.comment,header:r.comment,body:r.rest}:{notice:t.comment,body:t.rest}}if(!Qr(t.comment))return{body:e};let n=Gn(t.rest);return n&&qr(n.comment)?{notice:n.comment,header:t.comment,body:n.rest}:{header:t.comment,body:t.rest}}function wi(s,e,t){let n=s.functionDescription||Si(t||""),r=yi(n),i=s.kind==="ApiEngine"?"V8 ApiEngine":s.kind==="V8Event"?"V8 Event":"V8 Workflow",o=s.kind==="ApiEngine"?"ApiEngineKey":s.kind==="V8Event"?"TableKey":"WorkflowKey",a=["/*",` * ${i}`,` * ${o}: ${s.key}`];s.eventType&&a.push(` * EventType: ${s.eventType}`),a.push(` * Version: ${e}`),a.push(" * Function:");for(let c of r)a.push(` * - ${c}`);return a.push(" */"),`${a.join(`
40
40
  `)}
41
41
 
42
- `}function Mt(s){let e=rn(s.currentCode),t=rn(s.remoteCode),n=rn(s.remoteVersion),r=di([e,t,n]),i=s.initial?r||"v1.0.0":ui(r),{notice:o,header:a,body:c}=mi(s.currentCode||""),g=`${o?`${o.trim()}
42
+ `}function Nt(s){let e=on(s.currentCode),t=on(s.remoteCode),n=on(s.remoteVersion),r=fi([e,t,n]),i=s.initial?r||"v1.0.0":hi(r),{notice:o,header:a,body:c}=Ci(s.currentCode||""),g=`${o?`${o.trim()}
43
43
 
44
- `:""}${fi(s,i,a)}${c.replace(/^\s+/,"")}`,d=(s.changeSummary||"\u540C\u6B65 V8 \u4EE3\u7801").trim();return{code:g,version:i,changeHistory:`${i} ${d}`}}var at=class s{static getInstance(){return s._instance||(s._instance=new s),s._instance}constructor(){}get outputChannel(){return oe.channel}log(e){oe.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=E.join(n,e,Ye);if(!w.existsSync(r))return this.migrateFromFlatMeta(e);try{let i=JSON.parse(w.readFileSync(r,"utf-8"));if(!i||typeof i!="object"||Array.isArray(i))throw new Error("\u9876\u5C42\u5FC5\u987B\u662F JSON \u5BF9\u8C61");let o=i;return{...o,engines:o.engines||{},events:o.events||{},fields:o.fields||{},menus:o.menus||{},menuButtons:o.menuButtons||{},menuScripts:o.menuScripts||{},workflows:o.workflows||{},workflowNodeEvents:o.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=E.join(r,t);ge(i);let o=E.join(i,Ye),a=`${o}.${process.pid}.${Date.now()}.tmp`;try{w.writeFileSync(a,`${JSON.stringify(e,null,2)}
45
- `,"utf-8"),w.renameSync(a,o)}finally{try{w.existsSync(a)&&w.unlinkSync(a)}catch{}}}catch{}}getWorkspaceFilePath(e){let t=I.getInstance().getWorkspaceRoot();return t?E.isAbsolute(e)?e:E.join(t,e):null}normalizeCode(e){return Me(Ln(e||"")).replace(/\r\n/g,`
46
- `).trimEnd()}isLocalModified(e,t){try{if(!w.existsSync(e))return!1;let n=w.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(!w.existsSync(e))return null;let n=w.statSync(e),r=new Date(t);return isNaN(r.getTime())?null:n.mtime.getTime()>r.getTime()+1e3?ve(n.mtime):null}catch{return null}}touchSyncedFile(e,t){let n=new Date(t),r=isNaN(n.getTime())?new Date:n;try{w.utimesSync(e,r,r)}catch{}}ensureSyncGitExcludes(e){try{let t=e||I.getInstance().getSyncRootDir();rt(t),Oe(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 w.existsSync(e)?w.readdirSync(e,{withFileTypes:!0}).filter(t=>t.isDirectory()).filter(t=>!t.name.startsWith(".")).map(t=>t.name):[]}catch{return[]}}getLocalChangeSummary(){let e={engines:0,events:0,fields:0,menuButtons:0,menuScripts:0,workflowNodeEvents:0,total:0};for(let t of this.getLocalChangeItems())t.kind==="engine"?e.engines+=1:t.kind==="event"?e.events+=1:t.kind==="field"?e.fields+=1:t.kind==="menuButton"?e.menuButtons+=1:t.kind==="menuScript"?e.menuScripts+=1:t.kind==="workflow"&&(e.workflowNodeEvents+=1);return e.total=e.engines+e.events+e.fields+e.menuButtons+e.menuScripts+e.workflowNodeEvents,e}getLocalChangeItems(){let e=[],t=(n,r,i,o,a)=>{let c=this.getWorkspaceFilePath(a.filePath);if(!c)return;let l=this.getLocalModifiedTime(c,a.updateTime);l&&e.push({kind:r,key:i,name:o,serverDir:n,filePath:c,updateTime:a.updateTime,modifiedTime:l})};for(let n of this.getServerDirs()){let r=this.loadMeta(n);for(let[i,o]of Object.entries(r.engines))t(n,"engine",i,o.apiName||i,o);for(let[i,o]of Object.entries(r.events))t(n,"event",i,`${o.description||o.formEngineKey}/${o.eventType}`,o);for(let[i,o]of Object.entries(r.fields||{}))t(n,"field",i,`${o.tableName}.${o.fieldName}/${o.v8Key}`,o);for(let[i,o]of Object.entries(r.menuButtons||{}))t(n,"menuButton",i,`${o.moduleName}/${o.btnName}/${o.v8SubField}`,o);for(let[i,o]of Object.entries(r.menuScripts||{}))t(n,"menuScript",i,`${o.moduleName}/${o.scriptField}`,o);for(let[i,o]of Object.entries(r.workflowNodeEvents||{}))t(n,"workflow",i,`${o.flowName}/${o.nodeName}/${o.eventType}`,o)}return e}async checkRemoteDifferences(e,t="all",n){let r=e?[e]:I.getInstance().getProfiles(),i=[];for(let o of r){let a=I.getInstance().buildServerDirName(o.label,o.apiBaseUrl),c=this.loadMeta(a),l=n?this.getTargetSyncKind(c,n):null;if(n&&!l)throw new Error(`\u540C\u6B65\u76EE\u6807\u4E0D\u5728\u672C\u5730\u57FA\u7EBF\u4E2D: ${n}`);(t==="all"||t==="api")&&(!n||l==="engine")&&await this.collectEngineDifferences(o,a,c,i,n),(t==="all"||t==="form")&&(!n||l==="event")&&await this.collectEventDifferences(o,a,c,i,n),(t==="all"||t==="form")&&(!n||l==="field")&&await this.collectFieldDifferences(o,a,c,i,n),(t==="all"||t==="module")&&(!n||l==="menuButton")&&await this.collectMenuButtonDifferences(o,a,c,i,n),(t==="all"||t==="module")&&(!n||l==="menuScript")&&await this.collectMenuScriptDifferences(o,a,c,i,n),(t==="all"||t==="workflow")&&(!n||l==="workflow")&&await this.collectWorkflowDifferences(o,a,c,i,n)}return i}matchesTargetFile(e,t){if(!t)return!0;let n=this.getWorkspaceFilePath(e);return!!n&&E.resolve(n).toLowerCase()===E.resolve(t).toLowerCase()}getTargetSyncKind(e,t){let n=[["engine",e.engines],["event",e.events],["field",e.fields||{}],["menuButton",e.menuButtons||{}],["menuScript",e.menuScripts||{}],["workflow",e.workflowNodeEvents||{}]];for(let[r,i]of n)if(Object.values(i).some(o=>this.matchesTargetFile(o.filePath,t)))return r;return null}classifyDifference(e,t,n,r){return n===r?null:e&&t?"conflict":e?"localModified":"remoteModified"}classifyRemoteDeletion(e,t){return this.isLocalModified(e,t)?"conflict":"remoteDeleted"}createRemoteDeletedItem(e,t,n,r,i,o){return!i||!w.existsSync(i)?null:{kind:e,status:this.classifyRemoteDeletion(i,o),name:t,key:n,serverDir:r,filePath:i,localCode:this.normalizeCode(w.readFileSync(i,"utf-8")),remoteCode:"",localUpdateTime:o,remoteUpdateTime:""}}isRemoteNewer(e,t){let n=new Date(e||"").getTime(),r=new Date(t||"").getTime();return isNaN(n)||isNaN(r)?!1:n>r+1e3}getRemoteOnlyPlaceholderPath(e,t,n,r){let i=I.getInstance(),o=n==="api"?Xe:n==="form"?xe:n==="module"?je:Ze;return E.join(i.getSyncRootDir(),t,i.buildOsClientDirName(e.osClient,e.osClientType,e.osClientNetwork),o,"\u670D\u52A1\u5668\u65B0\u589E\u5F85\u62C9\u53D6",`${J(r)}.js`)}async collectEngineDifferences(e,t,n,r,i){let a=await j.getInstance().get(H.GET_ENGINE_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(a.Code!==1||!Array.isArray(a.Data?.List))throw new Error(`\u83B7\u53D6\u63A5\u53E3\u5F15\u64CE\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${a.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map(a.Data.List.map(d=>[d.ApiEngineKey,d])),l=!1;for(let[d,u]of Object.entries(n.engines)){if(!this.matchesTargetFile(u.filePath,i))continue;let p=c.get(d),m=this.getWorkspaceFilePath(u.filePath);if(!m||!w.existsSync(m))continue;if(!p){let T=this.createRemoteDeletedItem("engine",u.apiName||d,d,t,m,u.updateTime);T&&r.push(T);continue}let f=this.normalizeCode(w.readFileSync(m,"utf-8")),y=this.normalizeCode(p.ApiV8Code||""),S=this.isLocalModified(m,u.updateTime),h=this.isRemoteNewer(p.UpdateTime,u.updateTime);if(f===y){(S||h)&&p.UpdateTime&&(u.updateTime=p.UpdateTime,this.touchSyncedFile(m,p.UpdateTime),l=!0);continue}let C=this.classifyDifference(S,h,f,y);C&&r.push({kind:"engine",status:C,name:p.ApiName||u.apiName||d,key:d,serverDir:t,filePath:m,localCode:f,remoteCode:y,localUpdateTime:u.updateTime,remoteUpdateTime:p.UpdateTime})}if(l&&this.saveMeta(n,t),i)return;let g=new Set(Object.keys(n.engines).map(d=>d.toLowerCase()));for(let d of a.Data.List)!String(d.ApiV8Code||"").trim()||g.has(d.ApiEngineKey.toLowerCase())||r.push({kind:"engine",status:"remoteModified",name:d.ApiName||d.ApiEngineKey,key:d.ApiEngineKey,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"api",d.ApiEngineKey),localCode:"",remoteCode:this.normalizeCode(d.ApiV8Code||""),localUpdateTime:"",remoteUpdateTime:d.UpdateTime})}async collectEventDifferences(e,t,n,r,i){let a=await j.getInstance().get(H.GET_EVENT_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(a.Code!==1||!Array.isArray(a.Data?.List))throw new Error(`\u83B7\u53D6\u8868\u5355\u4E8B\u4EF6\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${a.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map;for(let d of a.Data.List){let u=`${d.FormEngineKey}__${d.EventType}`;c.set(u,d),c.set(u.toLowerCase(),d)}let l=!1;for(let[d,u]of Object.entries(n.events)){if(!this.matchesTargetFile(u.filePath,i))continue;let p=c.get(d)||c.get(d.toLowerCase()),m=this.getWorkspaceFilePath(u.filePath);if(!m||!w.existsSync(m))continue;if(!p){let T=this.createRemoteDeletedItem("event",`${u.description||u.formEngineKey}/${u.eventType}`,d,t,m,u.updateTime);T&&r.push(T);continue}let f=this.normalizeCode(w.readFileSync(m,"utf-8")),y=this.normalizeCode(p.V8Code||""),S=this.isLocalModified(m,u.updateTime),h=this.isRemoteNewer(p.UpdateTime,u.updateTime);if(f===y){(S||h)&&p.UpdateTime&&(u.updateTime=p.UpdateTime,this.touchSyncedFile(m,p.UpdateTime),l=!0);continue}let C=this.classifyDifference(S,h,f,y);C&&r.push({kind:"event",status:C,name:`${p.Description||u.formEngineKey}/${u.eventType}`,key:d,serverDir:t,filePath:m,localCode:f,remoteCode:y,localUpdateTime:u.updateTime,remoteUpdateTime:p.UpdateTime})}if(l&&this.saveMeta(n,t),i)return;let g=new Set(Object.keys(n.events).map(d=>d.toLowerCase()));for(let d of a.Data.List){let u=`${d.FormEngineKey}__${d.EventType}`;!String(d.V8Code||"").trim()||g.has(u.toLowerCase())||r.push({kind:"event",status:"remoteModified",name:`${d.Description||d.FormEngineKey}/${d.EventType}`,key:u,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"form",u),localCode:"",remoteCode:this.normalizeCode(d.V8Code||""),localUpdateTime:"",remoteUpdateTime:d.UpdateTime})}}async collectFieldDifferences(e,t,n,r,i){let o=j.getInstance(),a=new Map;for(let l of Object.entries(n.fields||{})){if(!this.matchesTargetFile(l[1].filePath,i))continue;let g=a.get(l[1].tableId||l[1].tableName)||[];g.push(l),a.set(l[1].tableId||l[1].tableName,g)}let c=!1;await this.runInBatches([...a.values()],i?1:2,async l=>{let g=l[0][1],d=await o.get(H.GET_FIELD_LIST,{osClient:e.osClient,tableId:g.tableId,tableName:g.tableName},e.apiBaseUrl,e);if(d.Code!==1||!Array.isArray(d.Data?.List))throw new Error(`\u83B7\u53D6\u5B57\u6BB5\u540C\u6B65\u72B6\u6001\u5931\u8D25[${g.tableName}]: ${d.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let u=new Map(d.Data.List.map(p=>[String(p.Name||"").toLowerCase(),p]));for(let[p,m]of l){let f=u.get(m.fieldName.toLowerCase()),y=this.getWorkspaceFilePath(m.filePath);if(!y||!w.existsSync(y))continue;if(!f||!String(f[m.v8Key]||"").trim()){let k=this.createRemoteDeletedItem("field",`${m.tableName}.${m.fieldName}/${m.v8Key}`,p,t,y,m.updateTime);k&&r.push(k);continue}let S=this.normalizeCode(w.readFileSync(y,"utf-8")),h=this.normalizeCode(String(f[m.v8Key]||"")),C=String(f.UpdateTime||""),T=this.isLocalModified(y,m.updateTime),b=this.isRemoteNewer(C,m.updateTime);if(S===h){(T||b)&&C&&(m.updateTime=C,this.touchSyncedFile(y,C),c=!0);continue}let v=this.classifyDifference(T,b,S,h);v&&r.push({kind:"field",status:v,name:`${m.tableName}.${m.fieldName}/${m.v8Key}`,key:p,serverDir:t,filePath:y,localCode:S,remoteCode:h,localUpdateTime:m.updateTime,remoteUpdateTime:C})}}),c&&this.saveMeta(n,t)}async collectMenuButtonDifferences(e,t,n,r,i){let o=j.getInstance(),a=new Map;if(!i)for(let u of Object.keys(n.menus||{}))a.set(u,[]);for(let u of Object.entries(n.menuButtons||{})){if(!this.matchesTargetFile(u[1].filePath,i))continue;let p=a.get(u[1].moduleId)||[];p.push(u),a.set(u[1].moduleId,p)}let c=[];if(!i){let u=await o.get(H.LIST_MODULES,{osClient:e.osClient},e.apiBaseUrl,e);if(u.Code!==1||!Array.isArray(u.Data?.List))throw new Error(`\u83B7\u53D6\u6A21\u5757\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${u.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);c=u.Data.List}let l=new Set(c.map(u=>String(u.ParentId||"")).filter(Boolean)),g=new Map(c.map(u=>[u.Id,u]));for(let u of c){if(l.has(u.Id)||n.menus?.[u.Id])continue;let p=u.Label||u.Name||u.Id;r.push({kind:"menuButton",status:"remoteModified",name:`${p}/\u670D\u52A1\u5668\u65B0\u589E\u6A21\u5757`,key:u.Id,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"module",u.Id),localCode:"",remoteCode:JSON.stringify(u,null,2),localUpdateTime:"",remoteUpdateTime:String(u.UpdateTime||"")})}let d=!1;await this.runInBatches([...a.entries()],i?1:2,async([u,p])=>{let m=()=>{for(let[b,v]of p){let k=this.getWorkspaceFilePath(v.filePath);if(!k)continue;let V=this.createRemoteDeletedItem("menuButton",`${v.moduleName}/${v.btnName}/${v.v8SubField}`,b,t,k,v.updateTime);V&&r.push(V)}};if(!i&&!g.has(u)){m();return}let f=await o.get(H.GET_MODULE,{osClient:e.osClient,moduleId:u},e.apiBaseUrl,e);if(f.Code!==1||!f.Data){if(/不存在|not\s*found/i.test(String(f.Msg||""))){m();return}throw new Error(`\u83B7\u53D6\u6A21\u5757\u6309\u94AE\u540C\u6B65\u72B6\u6001\u5931\u8D25[${u}]: ${f.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`)}let y=f.Data,S=String(y.UpdateTime||""),h=new Map;for(let b of Object.keys(et)){let v=[];try{let k=y[b];v=typeof k=="string"?JSON.parse(k):Array.isArray(k)?k:[],Array.isArray(v)||(v=[])}catch{v=[]}h.set(b,new Map(v.map(k=>[String(k.Id||""),k])))}for(let[b,v]of p){let k=h.get(v.btnField)?.get(v.btnId),V=this.getWorkspaceFilePath(v.filePath);if(!V||!w.existsSync(V))continue;if(!k||!String(k[v.v8SubField]||"").trim()){let P=this.createRemoteDeletedItem("menuButton",`${v.moduleName}/${v.btnName}/${v.v8SubField}`,b,t,V,v.updateTime);P&&r.push(P);continue}let Q=this.normalizeCode(w.readFileSync(V,"utf-8")),N=this.normalizeCode(String(k[v.v8SubField]||"")),R=this.isLocalModified(V,v.updateTime),O=this.isRemoteNewer(S,v.updateTime);if(Q===N){(R||O)&&S&&(v.updateTime=S,this.touchSyncedFile(V,S),d=!0);continue}let M=this.classifyDifference(R,O,Q,N);M&&r.push({kind:"menuButton",status:M,name:`${v.moduleName}/${v.btnName}/${v.v8SubField}`,key:b,serverDir:t,filePath:V,localCode:Q,remoteCode:N,localUpdateTime:v.updateTime,remoteUpdateTime:S})}if(i)return;let C=new Set(p.map(([b])=>b)),T=n.menus?.[u]?.moduleName||g.get(u)?.Label||g.get(u)?.Name||u;for(let[b,v]of h)for(let[k,V]of v){if(!k)continue;let Q=String(V.Name||k);for(let N of["V8Code","V8CodeShow"]){let R=String(V[N]||""),O=this.getMenuButtonMetaKey(u,b,k,N);!R.trim()||C.has(O)||r.push({kind:"menuButton",status:"remoteModified",name:`${T}/${Q}/${N}`,key:O,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"module",O),localCode:"",remoteCode:this.normalizeCode(R),localUpdateTime:"",remoteUpdateTime:S})}}}),d&&this.saveMeta(n,t)}async collectMenuScriptDifferences(e,t,n,r,i){let o=j.getInstance(),a=Object.entries(n.menuScripts||{}).filter(([,l])=>this.matchesTargetFile(l.filePath,i)),c=!1;await this.runInBatches(a,i?1:2,async([l,g])=>{let d=this.getWorkspaceFilePath(g.filePath);if(!d||!w.existsSync(d))return;let u=await o.get(H.GET_MODULE,{osClient:e.osClient,moduleId:g.moduleId},e.apiBaseUrl,e);if(u.Code!==1||!u.Data){if(/不存在|not\s*found/i.test(String(u.Msg||""))){let T=this.createRemoteDeletedItem("menuScript",`${g.moduleName}/${g.scriptField}`,l,t,d,g.updateTime);T&&r.push(T);return}throw new Error(`\u83B7\u53D6\u6A21\u5757 Join/Where \u540C\u6B65\u72B6\u6001\u5931\u8D25[${g.moduleId}]: ${u.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`)}let p=u.Data,m=this.normalizeCode(String(p[g.scriptField]||"")),f=this.normalizeCode(w.readFileSync(d,"utf-8")),y=String(p.UpdateTime||""),S=this.isLocalModified(d,g.updateTime),h=this.sourceHash(m)!==g.codeHash;if(f===m){(S||h||y&&y!==g.updateTime)&&(g.codeHash=this.sourceHash(m),g.updateTime=y||g.updateTime,this.touchSyncedFile(d,g.updateTime),c=!0);return}let C=this.classifyDifference(S,h,f,m);C&&r.push({kind:"menuScript",status:C,name:`${g.moduleName}/${g.scriptField}`,key:l,serverDir:t,filePath:d,localCode:f,remoteCode:m,localUpdateTime:g.updateTime,remoteUpdateTime:y})}),c&&this.saveMeta(n,t)}async runInBatches(e,t,n){for(let r=0;r<e.length;r+=t)await Promise.all(e.slice(r,r+t).map(i=>n(i))),r+t<e.length&&await new Promise(i=>setTimeout(i,120))}async collectWorkflowDifferences(e,t,n,r,i){let a=await j.getInstance().get(H.GET_WORKFLOW_V8_EVENT_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(a.Code!==1||!Array.isArray(a.Data?.List))throw new Error(`\u83B7\u53D6\u6D41\u7A0B\u4E8B\u4EF6\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${a.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map(a.Data.List.map(d=>[`${d.FlowDesignId}__${d.NodeId}__${d.EventType}`,d])),l=!1;for(let[d,u]of Object.entries(n.workflowNodeEvents||{})){if(!this.matchesTargetFile(u.filePath,i))continue;let p=c.get(d),m=this.getWorkspaceFilePath(u.filePath);if(!m||!w.existsSync(m))continue;if(!p||!String(p.V8Code||p.Code||"").trim()){let T=this.createRemoteDeletedItem("workflow",`${u.flowName}/${u.nodeName}/${u.eventType}`,d,t,m,u.updateTime);T&&r.push(T);continue}let f=this.normalizeCode(w.readFileSync(m,"utf-8")),y=this.normalizeCode(p.V8Code||p.Code||""),S=this.isLocalModified(m,u.updateTime),h=this.isRemoteNewer(p.UpdateTime,u.updateTime);if(f===y){(S||h)&&p.UpdateTime&&(u.updateTime=p.UpdateTime,this.touchSyncedFile(m,p.UpdateTime),l=!0);continue}let C=this.classifyDifference(S,h,f,y);if(C){let T=`${p.FlowName||u.flowName}/${p.NodeName||u.nodeName}/${p.EventType||u.eventType}`;r.push({kind:"workflow",status:C,name:T,key:d,serverDir:t,filePath:m,localCode:f,remoteCode:y,localUpdateTime:u.updateTime,remoteUpdateTime:p.UpdateTime})}}if(l&&this.saveMeta(n,t),i)return;let g=new Set(Object.keys(n.workflowNodeEvents||{}));for(let d of a.Data.List){let u=`${d.FlowDesignId}__${d.NodeId}__${d.EventType}`,p=d.V8Code||d.Code||"";if(!p.trim()||g.has(u))continue;let m=`${d.FlowName||d.FlowDesignId}/${d.NodeName||d.NodeId}/${d.EventType}`;r.push({kind:"workflow",status:"remoteModified",name:m,key:u,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"workflow",u),localCode:"",remoteCode:this.normalizeCode(p),localUpdateTime:"",remoteUpdateTime:d.UpdateTime})}}migrateFromFlatMeta(e){let t=I.getInstance();try{let n=t.getSyncRootDir(),r=E.join(n,Ye);if(!w.existsSync(r))return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};let i=t.getWorkspaceRoot();if(!i)return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};let o=JSON.parse(w.readFileSync(r,"utf-8")),a=o.engines||{},c=o.events||{},l={engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};for(let[g,d]of Object.entries(a)){let u=d;if(u.filePath){let p=E.join(i,u.filePath);E.relative(n,p).split(E.sep)[0]===e&&(l.engines[g]=u)}}for(let[g,d]of Object.entries(c)){let u=d;if(u.filePath){let p=E.join(i,u.filePath);E.relative(n,p).split(E.sep)[0]===e&&(l.events[g]=u)}}return(Object.keys(l.engines).length>0||Object.keys(l.events).length>0)&&this.saveMeta(l,e),l}catch{return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}}}}async pullEngines(e){if(!e){let t=I.getInstance().getProfiles();if(t.length===0){A.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}`),A.error(`Microi: \u62C9\u53D6 [${n.label||n.apiBaseUrl}] \u5931\u8D25 - ${i}`)}return}await this.pullEnginesForProfile(e)}async pullEnginesForProfile(e){let t=I.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE\u4EE3\u7801 [${e.label||r}]...`),await fe.withProgress({location:qe.Notification,title:`Microi: \u62C9\u53D6\u63A5\u53E3\u5F15\u64CE [${e.label||r}]`,cancellable:!1},async o=>{o.report({message:"\u68C0\u67E5\u540E\u7AEF\u72B6\u6001..."});let a=await n.get(H.GET_STATUS,void 0,r,e);if(a.Code!==1){let M=a.Code===1001||a.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u540E\u7AEF\u72B6\u6001\u5F02\u5E38: ${a.Msg||"Code="+a.Code}${M}`)}o.report({message:"\u83B7\u53D6\u7CFB\u7EDF\u914D\u7F6E..."});let l=await Ce.getInstance().getSysConfig(r,i),g=l?.SysShortTitle||"",d=l?.SysTitle||"",u=g||d||l?.CompanyName||e.label||"";u&&(u!==e.label||g!==e.sysShortTitle||d!==e.sysTitle)&&await t.addProfile({...e,label:u,sysShortTitle:g,sysTitle:d}),o.report({message:"\u83B7\u53D6\u63A5\u53E3\u5F15\u64CE\u5217\u8868..."});let p=await n.get(H.GET_ENGINE_LIST,{osClient:i},r,e);if(p.Code!==1){let M=p.Code===1001||p.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u5217\u8868\u5931\u8D25: ${p.Msg||"Code="+p.Code}${M}`)}let{OsClient:m,OsClientType:f,OsClientNetwork:y,List:S,Total:h}=p.Data;if(this.log(`\u83B7\u53D6\u5230 ${h} \u4E2A\u63A5\u53E3\u5F15\u64CE (OsClient: ${m})`),!f||!y)throw new Error(`\u540E\u7AEF\u672A\u8FD4\u56DE\u5B8C\u6574\u7684 OsClientType/OsClientNetwork (OsClient: ${m}, Type: ${f||"\u7A7A"}, Network: ${y||"\u7A7A"})\uFF0C\u65E0\u6CD5\u62C9\u53D6\u4EE3\u7801`);if(f||y){let M={...e,osClientType:f,osClientNetwork:y};await t.addProfile(M)}let C=t.getSyncRootDir(),T=t.buildServerDirName(u,r),b=this.loadMeta(T),v=0,k=0,V=[],Q=new Set,N=new Set,R=t.buildOsClientDirName(m,f,y);for(let M of S)try{let P=J(M.Category||"\u672A\u5206\u7C7B"),x=J(M.ApiName||M.ApiEngineKey),z=E.join(C,T,R,Xe,P),X=J(`${x}(${$n(M.ApiEngineKey)}).js`),ue=E.join(z,X),pe=Ln(M.ApiV8Code||"");if(!pe.trim()){k++,w.existsSync(ue)&&this.backupAndDeleteSyncFile(ue,T,"remote-deleted-api"),delete b.engines[M.ApiEngineKey];continue}Q.add(M.ApiEngineKey),ge(z),w.writeFileSync(ue,pe,"utf-8");let te=new Date(M.UpdateTime);isNaN(te.getTime())||w.utimesSync(ue,te,te),b.engines[M.ApiEngineKey]={id:M.Id,apiName:M.ApiName,category:P,apiAddress:M.ApiAddress,apiRoutes:M.ApiRoutes||"",updateTime:M.UpdateTime,filePath:E.relative(t.getWorkspaceRoot(),ue)},v++,o.report({message:`${v}/${h} ${M.ApiEngineKey}`,increment:1/h*100})}catch(P){let x=P instanceof Error?P.message:String(P);N.add(M.ApiEngineKey),V.push(`${M.ApiEngineKey}: ${x}`),this.log(`\u63A5\u53E3\u5F15\u64CE\u6587\u4EF6\u5199\u5165\u5931\u8D25\uFF0C\u7EE7\u7EED\u4E0B\u4E00\u9879 [${M.ApiEngineKey}]: ${x}`)}for(let[M,P]of Object.entries(b.engines)){if(Q.has(M)||N.has(M))continue;let x=this.getWorkspaceFilePath(P.filePath);x&&this.backupAndDeleteSyncFile(x,T,"remote-deleted-api"),delete b.engines[M]}this.saveMeta(b,T);let O=u||e.label||r;this.log(`[${O}] \u62C9\u53D6\u5B8C\u6210: ${v} \u4E2A\u63A5\u53E3\u5F15\u64CE\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${k} \u9879\uFF0C\u5931\u8D25 ${V.length} \u9879`),V.length>0?A.warn(`Microi: [${O}] \u5DF2\u62C9\u53D6 ${v} \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`):A.info(`Microi: [${O}] \u6210\u529F\u62C9\u53D6 ${v} \u4E2A\u63A5\u53E3\u5F15\u64CE${k>0?`\uFF08\u8DF3\u8FC7 ${k} \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=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6V8\u4E8B\u4EF6\u4EE3\u7801 [${e.label||r}]...`),await fe.withProgress({location:qe.Notification,title:`Microi: \u62C9\u53D6V8\u4E8B\u4EF6 [${e.label||r}]`,cancellable:!1},async o=>{o.report({message:"\u83B7\u53D6V8\u4E8B\u4EF6\u5217\u8868..."});let a=await n.get(H.GET_EVENT_LIST,{osClient:i},r,e);if(a.Code!==1){let R=a.Code===1001||a.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6V8\u4E8B\u4EF6\u5217\u8868\u5931\u8D25: ${a.Msg||"Code="+a.Code}${R}`)}let{List:c,Total:l}=a.Data;this.log(`\u83B7\u53D6\u5230 ${l} \u4E2AV8\u4E8B\u4EF6`);let d=await Ce.getInstance().getSysConfig(r,i),u=d?.SysShortTitle||"",p=d?.SysTitle||"",m=u||p||d?.CompanyName||e.label||"";m&&(m!==e.label||u!==e.sysShortTitle||p!==e.sysTitle)&&await t.addProfile({...e,label:m,sysShortTitle:u,sysTitle:p});let f=t.getSyncRootDir(),y=t.buildServerDirName(m,r),S=this.loadMeta(y),h=0,C=0,T=0,b=new Set(c.map(R=>`${R.FormEngineKey}__${R.EventType}`)),k=t.getProfiles().find(R=>R.apiBaseUrl===e.apiBaseUrl&&R.osClient===e.osClient)||e;if(!k.osClientType||!k.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE\u4EE5\u83B7\u53D6\u5B8C\u6574\u914D\u7F6E");let V=t.buildOsClientDirName(i,k.osClientType,k.osClientNetwork),Q={SubmitBeforeServerV8:"\u540E\u7AEF\u63D0\u4EA4\u524DV8\u4E8B\u4EF6",SubmitAfterServerV8:"\u540E\u7AEF\u63D0\u4EA4\u540EV8\u4E8B\u4EF6",SubmitFormV8:"\u524D\u7AEF\u8868\u5355\u63D0\u4EA4V8\u4E8B\u4EF6",OutFormV8:"\u524D\u7AEF\u8868\u5355\u9000\u51FAV8\u4E8B\u4EF6",ServerDataV8:"\u540E\u7AEF\u6570\u636EV8\u4E8B\u4EF6"};for(let R of c){let O=R.V8Code||"",M=J(R.Description?`${R.Description}\uFF08${R.FormEngineKey}\uFF09`:R.FormEngineKey),P=wr[R.EventType]||R.EventType,x=J(`${P}\uFF08${R.EventType}\uFF09`)+".js",z=E.join(f,y,V,xe,M,Ht);ge(z);let X=E.join(z,x),ue=Q[R.EventType];if(ue){let he=J(`${ue}\uFF08${R.EventType}\uFF09`)+".js",le=E.join(z,he);le!==X&&w.existsSync(le)&&!this.isLocalModified(le,R.UpdateTime)&&(w.existsSync(X)?w.unlinkSync(le):w.renameSync(le,X))}let pe=`${R.FormEngineKey}__${R.EventType}`;if(S.events[pe]={id:R.Id,formEngineKey:R.FormEngineKey,description:R.Description||"",eventType:R.EventType,updateTime:R.UpdateTime,filePath:E.relative(t.getWorkspaceRoot(),X)},!O.trim()){w.existsSync(X)&&this.backupAndDeleteSyncFile(X,y,"remote-deleted-form-event"),T++,h++,o.report({message:`${h}/${l}`,increment:l>0?1/l*100:void 0});continue}w.writeFileSync(X,O,"utf-8");let te=new Date(R.UpdateTime);isNaN(te.getTime())||w.utimesSync(X,te,te),C++,h++,o.report({message:`${h}/${l}`,increment:l>0?1/l*100:void 0})}for(let[R,O]of Object.entries(S.events)){if(b.has(R))continue;let M=this.getWorkspaceFilePath(O.filePath);M&&this.backupAndDeleteSyncFile(M,y,"remote-deleted-form-event"),delete S.events[R]}this.saveMeta(S,y);let N=m||e.label||r;this.log(`[${N}] \u62C9\u53D6\u5B8C\u6210: ${C} \u4E2AV8\u4E8B\u4EF6\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${T} \u9879`),A.info(`Microi: [${N}] \u6210\u529F\u62C9\u53D6 ${C} \u4E2AV8\u4E8B\u4EF6\u6587\u4EF6${T>0?`\uFF08\u8DF3\u8FC7 ${T} \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=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE\u8282\u70B9 V8 [${e.label||r}]...`),await fe.withProgress({location:qe.Notification,title:`Microi: \u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE [${e.label||r}]`,cancellable:!1},async o=>{o.report({message:"\u83B7\u53D6\u6D41\u7A0B\u8282\u70B9V8\u5217\u8868..."});let a=await n.get(H.GET_WORKFLOW_V8_EVENT_LIST,{osClient:i},r,e);if(a.Code!==1){let P=a.Code===1001||a.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u6D41\u7A0B\u8282\u70B9V8\u5217\u8868\u5931\u8D25: ${a.Msg||"Code="+a.Code}${P}`)}let l=await Ce.getInstance().getSysConfig(r,i),g=l?.SysShortTitle||"",d=l?.SysTitle||"",u=g||d||l?.CompanyName||e.label||"";u&&(u!==e.label||g!==e.sysShortTitle||d!==e.sysTitle)&&await t.addProfile({...e,label:u,sysShortTitle:g,sysTitle:d});let m=t.getProfiles().find(P=>P.apiBaseUrl===e.apiBaseUrl&&P.osClient===e.osClient)||e;if(!m.osClientType||!m.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let f=a.Data.OsClient||i,y=t.buildServerDirName(u,r),S=t.buildOsClientDirName(f,m.osClientType,m.osClientNetwork),h=t.getSyncRootDir(),C=this.loadMeta(y);C.workflows||(C.workflows={}),C.workflowNodeEvents||(C.workflowNodeEvents={});let T=a.Data.Flows||[],b=a.Data.Nodes||[],v=a.Data.Lines||[],k=a.Data.List||[],V=new Map(T.map(P=>[String(P.Id||""),P])),Q=new Set(T.map(P=>String(P.Id||"")).filter(Boolean)),N=new Set(k.filter(P=>String(P.V8Code||P.Code||"").trim()).map(P=>`${P.FlowDesignId}__${P.NodeId}__${P.EventType}`)),R=0,O=0;for(let P of T){let x=String(P.Id||"");if(!x)continue;let z=String(P.FlowName||x),X=String(P.UpdateTime||ve()),ue=E.join(h,y,S,Ze,J(`${z}\uFF08${x}\uFF09`));ge(ue);let pe=b.filter(le=>String(le.FlowDesignId||"")===x),te=v.filter(le=>String(le.FlowDesignId||"")===x),he=E.join(ue,"\u6D41\u7A0B\u8BBE\u8BA1\u56FE\uFF08WF_FlowDesign\uFF09.json");w.writeFileSync(he,JSON.stringify({FlowDesign:P,Nodes:pe,Lines:te},null,2),"utf-8"),this.touchSyncedFile(he,X),C.workflows[x]={flowDesignId:x,flowName:z,updateTime:X,filePath:E.relative(t.getWorkspaceRoot(),he)}}for(let P of k){let x=String(P.FlowDesignId||""),z=String(P.NodeId||""),X=String(P.EventType||"");if(!x||!z||!X)continue;let ue=V.get(x),pe=String(P.FlowName||ue?.FlowName||x),te=String(P.NodeName||z),he=Tr[X]||P.EventName||X,le=E.join(h,y,S,Ze,J(`${pe}\uFF08${x}\uFF09`),Wt,J(`${te}\uFF08${z}\uFF09`));ge(le);let F=E.join(le,J(`${he}\uFF08${X}\uFF09`)+".js"),me=P.V8Code||P.Code||"",ie=String(P.UpdateTime||ue?.UpdateTime||ve());if(C.workflowNodeEvents[`${x}__${z}__${X}`]={flowDesignId:x,flowName:pe,nodeId:z,nodeName:te,eventType:X,updateTime:ie,filePath:E.relative(t.getWorkspaceRoot(),F)},!me.trim()){w.existsSync(F)&&this.backupAndDeleteSyncFile(F,y,"remote-deleted-workflow-event"),O++,o.report({message:`${R}/${k.length} ${pe}/${te}`});continue}w.writeFileSync(F,me,"utf-8"),this.touchSyncedFile(F,ie),R++,o.report({message:`${R}/${k.length} ${pe}/${te}`})}for(let[P,x]of Object.entries(C.workflowNodeEvents)){if(N.has(P))continue;let z=this.getWorkspaceFilePath(x.filePath);z&&this.backupAndDeleteSyncFile(z,y,"remote-deleted-workflow-event"),delete C.workflowNodeEvents[P]}for(let[P,x]of Object.entries(C.workflows)){if(Q.has(P))continue;let z=this.getWorkspaceFilePath(x.filePath);z&&this.backupAndDeleteSyncFile(z,y,"remote-deleted-workflow"),delete C.workflows[P]}this.saveMeta(C,y);let M=u||e.label||r;this.log(`[${M}] \u6D41\u7A0B\u5F15\u64CE\u62C9\u53D6\u5B8C\u6210: ${T.length} \u4E2A\u6D41\u7A0B\uFF0C${R} \u4E2A\u8282\u70B9V8\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${O} \u9879`),A.info(`Microi: [${M}] \u6210\u529F\u62C9\u53D6 ${T.length} \u4E2A\u6D41\u7A0B\u3001${R} \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=E.resolve(e).toLowerCase(),r=this.loadMeta(t);return[r.engines,r.events,r.fields||{},r.menuButtons||{},r.menuScripts||{},r.workflowNodeEvents||{}].some(o=>Object.values(o).some(a=>{let c=this.getWorkspaceFilePath(a.filePath);return!!c&&E.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),A.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),A.error(`Microi: ${i}`),!1}try{let i=await this.checkRemoteDifferences(n,r,e),o=E.resolve(e).toLowerCase(),a=i.find(g=>E.resolve(g.filePath).toLowerCase()===o);if(!a||a.status==="localModified")return!0;let l=`${a.status==="conflict"?"\u672C\u5730\u4E0E\u670D\u52A1\u5668\u5747\u5DF2\u4FEE\u6539":a.status==="remoteDeleted"?"\u670D\u52A1\u5668\u7AEF\u8D44\u6E90\u5DF2\u5220\u9664":"\u670D\u52A1\u5668\u4EE3\u7801\u8F83\u65B0"}\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\u4EE5\u907F\u514D\u8986\u76D6\u3002\u8BF7\u5728\u201C\u540C\u6B65\u7ED3\u679C\u201D\u4E2D\u67E5\u770B\u5DEE\u5F02\u5E76\u62C9\u53D6\u6216\u5408\u5E76\uFF1A${a.name}`;return this.log(l),A.error(`Microi: ${l}`),!1}catch(i){let o=i instanceof Error?i.message:String(i);return this.log(`\u63A8\u9001\u524D\u540C\u6B65\u72B6\u6001\u68C0\u6D4B\u5931\u8D25\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\uFF1A${o}`),A.error(`Microi: \u63A8\u9001\u524D\u540C\u6B65\u72B6\u6001\u68C0\u6D4B\u5931\u8D25\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001 - ${o}`),!1}}async pushFile(e,t={}){let r=I.getInstance().getSyncRootDir();if(E.extname(e).toLowerCase()===".js"&&w.existsSync(e)){let d=Mr(Me(w.readFileSync(e,"utf-8")));if(d.length>0){let u=d[0],p=`\u68C0\u6D4B\u5230 AI/\u7EC8\u7AEF\u5DE5\u5177\u8F93\u51FA\u6C61\u67D3\uFF08\u7B2C ${u.line} \u884C: ${u.marker}\uFF09\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\u3002\u8BF7\u6062\u590D\u5B8C\u6574\u6E90\u7801\u540E\u518D\u8BD5\uFF1A${e}`;return this.log(p),A.error(`Microi: ${p}`),!1}}let i=Pr(e,r);if(i){let d=this.findProfileByServerDir(i.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,i.serverDir,d,"api")?!1:this.pushEngineFile(e,i,d)}let o=Dr(e,r);if(o){let d=this.findProfileByServerDir(o.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,o.serverDir,d,"form")?!1:this.pushEventFile(e,o,d)}let a=Rr(e,r);if(a){let d=this.findProfileByServerDir(a.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,a.serverDir,d,"form")?!1:this.pushFieldFile(e,a,d)}let c=Ir(e,r);if(c){let d=this.findProfileByServerDir(c.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,c.serverDir,d,"module")?!1:this.pushMenuButtonFile(e,c,d)}let l=_r(e,r);if(l){let d=this.findProfileByServerDir(l.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,l.serverDir,d,"module")?!1:this.pushMenuScriptFile(e,l,d)}let g=Ar(e,r);if(g){let d=this.findProfileByServerDir(g.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,g.serverDir,d,"workflow")?!1:this.pushWorkflowNodeFile(e,g,d)}return this.log(`\u65E0\u6CD5\u89E3\u6790\u6587\u4EF6\u8DEF\u5F84: ${e}`),!1}async pushEngineFile(e,t,n){let r=j.getInstance(),i=w.readFileSync(e,"utf-8"),o=Me(i);this.log(`\u63A8\u9001\u63A5\u53E3\u5F15\u64CE: ${t.apiEngineKey}...`);try{let a="",c="";try{let p=await r.post(H.GET_ENGINE_CODE,{OsClient:t.osClient,ApiEngineKey:t.apiEngineKey},void 0,n?.apiBaseUrl,n);p.Code===1&&p.Data&&(a=p.Data.ApiV8Code||p.Data.Code||"",c=p.Data.Version||"")}catch{a="",c=""}let l=!o.trim(),g=l?{code:"",version:c,changeHistory:""}:Mt({kind:"ApiEngine",key:t.apiEngineKey,currentCode:o,remoteCode:a,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001\u63A5\u53E3\u5F15\u64CE ${t.apiEngineKey}`}),d={OsClient:t.osClient,ApiEngineKey:t.apiEngineKey,ApiV8CodeBase64:Buffer.from(g.code,"utf8").toString("base64")};l||(d.Version=g.version,d.ChangeSummary=g.changeHistory);let u=await r.post(H.UPDATE_ENGINE_CODE,d,void 0,n?.apiBaseUrl,n);if(u.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.apiEngineKey}`);let p=u.Data?.UpdateTime||ve(),m=this.loadMeta(t.serverDir);if(l?delete m.engines[t.apiEngineKey]:m.engines[t.apiEngineKey]&&(m.engines[t.apiEngineKey].updateTime=p),this.saveMeta(m,t.serverDir),l)w.existsSync(e)&&w.unlinkSync(e);else{w.writeFileSync(e,g.code,"utf-8");let f=new Date(p);isNaN(f.getTime())||w.utimesSync(e,f,f)}return!0}else return this.log(`\u63A8\u9001\u5931\u8D25: ${t.apiEngineKey} - ${u.Msg}`),A.error(`Microi: \u63A8\u9001\u5931\u8D25 - ${u.Msg}`),!1}catch(a){let c=a instanceof Error?a.message:String(a);return this.log(`\u63A8\u9001\u5F02\u5E38: ${t.apiEngineKey} - ${c}`),A.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async pushEventFile(e,t,n){let r=j.getInstance(),i=w.readFileSync(e,"utf-8"),o=Me(i);this.log(`\u63A8\u9001V8\u4E8B\u4EF6: ${t.formEngineKey}/${t.eventType}...`);try{let a="",c="";try{let p=await r.post(H.GET_EVENT_CODE,{OsClient:t.osClient,FormEngineKey:t.formEngineKey,EventType:t.eventType},void 0,n?.apiBaseUrl,n);p.Code===1&&p.Data&&(a=p.Data.V8Code||p.Data.Code||"",c=p.Data.Version||"")}catch{a="",c=""}let l=!o.trim(),g=l?{code:"",version:c,changeHistory:""}:Mt({kind:"V8Event",key:t.formEngineKey,eventType:t.eventType,currentCode:o,remoteCode:a,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001 V8 \u4E8B\u4EF6 ${t.formEngineKey}/${t.eventType}`}),d={OsClient:t.osClient,FormEngineKey:t.formEngineKey,EventType:t.eventType,V8Code:g.code};l||(d.Version=g.version,d.ChangeHistory=g.changeHistory);let u=await r.post(H.UPDATE_EVENT_CODE,d,void 0,n?.apiBaseUrl,n);if(u.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.formEngineKey}/${t.eventType}`);let p=u.Data?.UpdateTime||ve(),m=this.loadMeta(t.serverDir),f=`${t.formEngineKey}__${t.eventType}`;if(l)delete m.events[f];else{let y=m.events[f];m.events[f]={id:y?.id||"",formEngineKey:t.formEngineKey,description:y?.description||"",eventType:t.eventType,updateTime:p,filePath:E.relative(I.getInstance().getWorkspaceRoot(),e)}}if(this.saveMeta(m,t.serverDir),l)w.existsSync(e)&&w.unlinkSync(e);else{w.writeFileSync(e,g.code,"utf-8");let y=new Date(p);isNaN(y.getTime())||w.utimesSync(e,y,y)}return!0}else return this.log(`\u63A8\u9001\u5931\u8D25: ${t.formEngineKey}/${t.eventType} - ${u.Msg}`),A.error(`Microi: \u63A8\u9001\u5931\u8D25 - ${u.Msg}`),!1}catch(a){let c=a instanceof Error?a.message:String(a);return this.log(`\u63A8\u9001\u5F02\u5E38: ${t.formEngineKey}/${t.eventType} - ${c}`),A.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async createEngine(e){let t=j.getInstance(),n=I.getInstance();this.log(`\u521B\u5EFA\u63A5\u53E3\u5F15\u64CE: ${e.apiEngineKey}...`);try{let r=Mt({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(H.CREATE_ENGINE,{OsClient:e.profile.osClient,ApiName:e.apiName,ApiEngineKey:e.apiEngineKey,ApiAddress:e.apiAddress||"",ApiRoutes:e.apiRoutes||"",ApiRemark:e.apiRemark||"",Lock:e.lock?1:0,LockKey:e.lockKey||"",AllowAnonymous:e.allowAnonymous?1:0,V8Limit:e.v8Limit?1:0,IsEnable:e.isEnable!==!1?1:0,ApiRole:e.apiRole||"",Category:e.category||"\u672A\u5206\u7C7B",ApiV8CodeBase64:Buffer.from(r.code,"utf8").toString("base64"),Version:r.version,ChangeSummary:r.changeHistory},void 0,e.profile.apiBaseUrl,e.profile);if(i.Code===1){let o=n.getSyncRootDir(),a=n.buildServerDirName(e.profile.label,e.profile.apiBaseUrl),c=n.buildOsClientDirName(e.profile.osClient,e.profile.osClientType,e.profile.osClientNetwork),l=J(e.category||"\u672A\u5206\u7C7B"),g=J(e.apiName||e.apiEngineKey),d=E.join(o,a,c,Xe,l);ge(d);let u=E.join(d,J(`${g}(${$n(e.apiEngineKey)}).js`));w.writeFileSync(u,r.code,"utf-8");let p=this.loadMeta(a);return p.engines[e.apiEngineKey]={id:"",apiName:e.apiName,category:l,apiAddress:e.apiAddress||"",apiRoutes:e.apiRoutes||"",updateTime:ve(),filePath:E.relative(n.getWorkspaceRoot(),u)},this.saveMeta(p,a),this.log(`\u521B\u5EFA\u6210\u529F: ${e.apiEngineKey}`),A.info(`Microi: \u63A5\u53E3\u5F15\u64CE [${e.apiEngineKey}] \u521B\u5EFA\u6210\u529F`),await fe.showTextDocument(hr.file(u)),!0}else return this.log(`\u521B\u5EFA\u5931\u8D25: ${e.apiEngineKey} - ${i.Msg}`),A.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}`),A.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=E.relative(n,e).split(E.sep);if(r.length<4||r[2]!==xe){A.warn("Microi: \u8BF7\u5728\u201C\u8868\u5355\u5F15\u64CE\u201D\u4E0B\u7684\u8868\u76EE\u5F55\u6267\u884C\u5B57\u6BB5 V8 \u4E8B\u4EF6\u62C9\u53D6");return}let i=a=>{let c=a.match(/[((]([^))]+)[))]\s*$/);return c?c[1]:a},o=this.findProfileByServerDir(r[0]);if(!o){A.error(`Microi: \u672A\u627E\u5230\u4E0E\u76EE\u5F55 "${r[0]}" \u5339\u914D\u7684\u670D\u52A1\u5668\u8FDE\u63A5`);return}await this.pullFieldsForTable(o,i(r[3]),e,r[0])}async pullFieldsForTable(e,t,n,r){let i=I.getInstance(),o=j.getInstance(),a=this.loadMeta(r);a.fields||(a.fields={}),this.log(`\u62C9\u53D6\u8868\u5B57\u6BB5V8\u4E8B\u4EF6: ${t}...`);let c=await o.get(H.GET_FIELD_LIST,{osClient:e.osClient,tableName:t},e.apiBaseUrl,e);if(c.Code!==1){A.error(`Microi: \u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 - ${c.Msg}`);return}let l=c.Data.List||[],g=["V8Code","KeyupV8Code","V8TmpEngineTable","V8TmpEngineForm"],d=0,u=0;for(let p of l){let m=J(p.Label?`${p.Label}\uFF08${p.Name}\uFF09`:p.Name),f=E.join(n,St,m);for(let y of g){let S=(p[y]||"").toString(),h=Dn[y]||y,C=J(`${h}\uFF08${y}\uFF09`)+".js",T=E.join(f,C),b=`${t}__${p.Name}__${y}`;if(!S.trim()){u++,w.existsSync(T)&&w.unlinkSync(T),delete a.fields[b];continue}ge(f),w.writeFileSync(T,S,"utf-8");let v=new Date(p.UpdateTime);isNaN(v.getTime())||w.utimesSync(T,v,v),a.fields[b]={fieldId:p.Id,tableId:p.TableId,tableName:t,fieldName:p.Name,fieldLabel:p.Label||"",v8Key:y,updateTime:p.UpdateTime,filePath:E.relative(i.getWorkspaceRoot(),T)},d++}}this.saveMeta(a,r),A.info(`Microi: \u5DF2\u62C9\u53D6 ${t} \u7684 ${d} \u4E2A\u5B57\u6BB5V8\u4E8B\u4EF6\u6587\u4EF6${u>0?`\uFF08\u8DF3\u8FC7 ${u} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)}async pullFieldsForProfile(e){let t=I.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6 [${e.label||r}]...`),await fe.withProgress({location:qe.Notification,title:`Microi: \u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6 [${e.label||r}]`,cancellable:!1},async o=>{o.report({message:"\u83B7\u53D6\u8868\u5217\u8868..."});let a=await n.get(H.GET_DB_SCHEMA,{osClient:i},r,e);if(a.Code!==1)throw new Error(`\u83B7\u53D6\u8868\u5217\u8868\u5931\u8D25: ${a.Msg||"Code="+a.Code}`);let c=a.Data.Tables||[],g=await Ce.getInstance().getSysConfig(r,i),d=g?.SysShortTitle||"",u=g?.SysTitle||"",p=d||u||e.label||"",m=t.buildServerDirName(p,r),f=this.loadMeta(m);f.fields||(f.fields={});let S=t.getProfiles().find(N=>N.apiBaseUrl===e.apiBaseUrl&&N.osClient===e.osClient)||e;if(!S.osClientType||!S.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let h=t.buildOsClientDirName(i,S.osClientType,S.osClientNetwork),C=t.getSyncRootDir(),T=["V8Code","KeyupV8Code","V8TmpEngineTable","V8TmpEngineForm"],b=0,v=0,k=0,V=new Set,Q=new Set;for(let N of c){k++,o.report({message:`[${k}/${c.length}] ${N.Name}`});let R=await n.get(H.GET_FIELD_LIST,{osClient:i,tableId:N.Id},r,e);if(R.Code!==1){Q.add(N.Name.toLowerCase()),this.log(` \u8DF3\u8FC7\u8868 ${N.Name}: ${R.Msg}`);continue}let O=R.Data.List||[],M=J(N.Description?`${N.Description}\uFF08${N.Name}\uFF09`:N.Name);for(let P of O)for(let x of T){let z=(P[x]||"").toString();if(!z.trim()){v++;continue}let X=J(P.Label?`${P.Label}\uFF08${P.Name}\uFF09`:P.Name),ue=Dn[x]||x,pe=J(`${ue}\uFF08${x}\uFF09`)+".js",te=E.join(C,m,h,xe,M,St,X);ge(te);let he=E.join(te,pe);w.writeFileSync(he,z,"utf-8");let le=new Date(P.UpdateTime);isNaN(le.getTime())||w.utimesSync(he,le,le);let F=`${N.Name}__${P.Name}__${x}`;V.add(F),f.fields[F]={fieldId:P.Id,tableId:P.TableId,tableName:N.Name,fieldName:P.Name,fieldLabel:P.Label||"",v8Key:x,updateTime:P.UpdateTime,filePath:E.relative(t.getWorkspaceRoot(),he)},b++}}for(let[N,R]of Object.entries(f.fields)){if(V.has(N)||Q.has(R.tableName.toLowerCase()))continue;let O=this.getWorkspaceFilePath(R.filePath);O&&this.backupAndDeleteSyncFile(O,m,"remote-deleted-field-event"),delete f.fields[N]}this.saveMeta(f,m),this.log(`\u5B57\u6BB5V8\u4E8B\u4EF6\u62C9\u53D6\u5B8C\u6210: ${b} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${v} \u9879`),A.info(`Microi: \u6210\u529F\u62C9\u53D6 ${b} \u4E2A\u5B57\u6BB5V8\u4E8B\u4EF6${v>0?`\uFF08\u8DF3\u8FC7 ${v} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)})}async pushFieldFile(e,t,n){let r=j.getInstance(),i=Me(w.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u5B57\u6BB5V8\u4E8B\u4EF6: ${t.tableName}/${t.fieldName}/${t.v8Key}...`);try{let o=await r.post(H.UPDATE_FIELD,{OsClient:t.osClient,TableName:t.tableName,Name:t.fieldName,[t.v8Key]:i},void 0,n?.apiBaseUrl,n);if(o.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.tableName}/${t.fieldName}/${t.v8Key}`);let a=this.loadMeta(t.serverDir),c=`${t.tableName}__${t.fieldName}__${t.v8Key}`;a.fields||(a.fields={});let l=o.Data?.UpdateTime||ve();return i.trim()?a.fields[c]={fieldId:a.fields[c]?.fieldId||"",tableId:a.fields[c]?.tableId||"",tableName:t.tableName,fieldName:t.fieldName,fieldLabel:a.fields[c]?.fieldLabel||"",v8Key:t.v8Key,updateTime:l,filePath:E.relative(I.getInstance().getWorkspaceRoot(),e)}:delete a.fields[c],this.saveMeta(a,t.serverDir),i.trim()?this.touchSyncedFile(e,l):w.existsSync(e)&&w.unlinkSync(e),!0}return this.log(`\u63A8\u9001\u5931\u8D25: ${o.Msg}`),A.error(`Microi: \u63A8\u9001\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 - ${o.Msg}`),!1}catch(o){let a=o instanceof Error?o.message:String(o);return this.log(`\u63A8\u9001\u5F02\u5E38: ${a}`),A.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${a}`),!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=E.relative(n,e).split(E.sep);if(r.length<4||r[2]!==je){A.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){A.error(`Microi: \u672A\u627E\u5230\u4E0E\u76EE\u5F55 "${r[0]}" \u5339\u914D\u7684\u670D\u52A1\u5668\u8FDE\u63A5`);return}let o=this.extractTrailingKey(E.basename(e));await this.pullMenuButtonsForProfile(i,o,r[0],r[1],e)}async pullMenuButtonsForProfile(e,t,n,r,i){let o=I.getInstance(),a=j.getInstance(),c=e.apiBaseUrl,l=e.osClient;this.log(`\u5F00\u59CB\u62C9\u53D6\u6A21\u5757 Join/Where \u4E0E\u6309\u94AE V8 \u4EE3\u7801 [${e.label||c}]...`),await fe.withProgress({location:qe.Notification,title:`Microi: \u62C9\u53D6\u6A21\u5757\u4EE3\u7801 [${e.label||c}]`,cancellable:!1},async g=>{let d=await a.get(H.LIST_MODULES,{osClient:l},c,e);if(d.Code!==1)throw new Error(`\u83B7\u53D6\u6A21\u5757\u5217\u8868\u5931\u8D25: ${d.Msg}`);let u=d.Data.List||[],m=await Ce.getInstance().getSysConfig(c,l),f=m?.SysShortTitle||"",y=m?.SysTitle||"",S=f||y||e.label||"",h=n||o.buildServerDirName(S,c),C=this.loadMeta(h);C.menus||(C.menus={}),C.menuButtons||(C.menuButtons={}),C.menuScripts||(C.menuScripts={});let b=o.getProfiles().find(F=>F.apiBaseUrl===e.apiBaseUrl&&F.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");let v=r||o.buildOsClientDirName(l,b.osClientType,b.osClientNetwork),k=o.getSyncRootDir(),V=E.join(k,h,v,je),Q=Object.keys(et),N=Object.keys(Ct),R=0,O=0,M=0,P=0,x=0,z=new Map(u.map(F=>[F.Id,F])),X=new Map,ue=F=>F||"";for(let F of u){let me=ue(F.ParentId);X.has(me)||X.set(me,[]),X.get(me).push(F)}let pe=F=>F.sort((me,ie)=>{let ye=typeof me.Sort=="number"?me.Sort:0,ft=typeof ie.Sort=="number"?ie.Sort:0;return ye!==ft?ye-ft:String(me.Name||me.Label||"").localeCompare(String(ie.Name||ie.Label||""))}),te=t?z.get(t)?[z.get(t)]:[]:pe(u.filter(F=>!F.ParentId||!z.has(F.ParentId)));if(t&&te.length===0)throw new Error(`\u627E\u4E0D\u5230\u6A21\u5757 Id=${t}`);let he=t?i||E.join(V,J(`${te[0].Label||te[0].Name||te[0].Id}\uFF08${te[0].Id}\uFF09`)):V;if(this.backupExistingTree(he,h,t?"module-subtree":"module-engine"),!t)C.menus={},C.menuButtons={},C.menuScripts={};else{let F=new Set,me=ie=>{if(!F.has(ie)){F.add(ie);for(let ye of X.get(ie)||[])me(ye.Id)}};me(t);for(let ie of F)delete C.menus[ie];for(let[ie,ye]of Object.entries(C.menuButtons))F.has(ye.moduleId)&&delete C.menuButtons[ie];for(let[ie,ye]of Object.entries(C.menuScripts))F.has(ye.moduleId)&&delete C.menuScripts[ie]}let le=async(F,me)=>{P++,g.report({message:`[${P}/${u.length}] ${F.Name||F.Label}`});let ie=F.Label||F.Name||F.Id,ye=E.join(me,J(`${ie}\uFF08${F.Id}\uFF09`));ge(ye);let ft=pe(X.get(F.Id)||[]);if(ft.length>0){for(let de of ft)await le(de,ye);return}let Tn=await a.get(H.GET_MODULE,{osClient:l,moduleId:F.Id},c,e);if(Tn.Code!==1){this.log(` \u8DF3\u8FC7\u6A21\u5757 ${F.Name}: ${Tn.Msg}`);return}let vn=Tn.Data,Be=String(vn.UpdateTime||ve()),lr={};for(let de of N){let Bt=String(vn[de]||""),En=Ct[de]||de,Ue=E.join(ye,J(`${En}\uFF08${de}\uFF09`)+".js");w.writeFileSync(Ue,Bt,"utf-8"),this.touchSyncedFile(Ue,Be),C.menuScripts[this.getMenuScriptMetaKey(F.Id,de)]={moduleId:F.Id,moduleName:ie,scriptField:de,codeHash:this.sourceHash(Bt),updateTime:Be,filePath:E.relative(o.getWorkspaceRoot(),Ue)},M++}for(let de of Q){let Bt=et[de]||de,En=J(`${Bt}\uFF08${de}\uFF09`),Ue=E.join(ye,En);ge(Ue),O++;let Ut=vn[de],Ge=[];if(Ut)try{Ge=typeof Ut=="string"?JSON.parse(Ut):Ut,Array.isArray(Ge)||(Ge=[])}catch{this.log(` \u6309\u94AE JSON \u89E3\u6790\u5931\u8D25 ${F.Name}.${de}`),Ge=[]}let Ls=[...Ge].sort((ze,Pe)=>String(ze.Id||"").localeCompare(String(Pe.Id||"")));lr[de]=require("crypto").createHash("sha1").update(JSON.stringify(Ls)).digest("hex");for(let ze of Ge){let Pe=String(ze.Id||""),jt=String(ze.Name||Pe||"Unknown");if(!Pe)continue;let dr=String(ze.V8Code||""),bn=E.join(Ue,J(`${jt}\uFF08${Pe}\uFF09`)+".js");C.menuButtons[this.getMenuButtonMetaKey(F.Id,de,Pe,"V8Code")]={moduleId:F.Id,moduleName:ie,btnField:de,btnId:Pe,btnName:jt,v8SubField:"V8Code",updateTime:Be,filePath:E.relative(o.getWorkspaceRoot(),bn)},dr.trim()?(w.writeFileSync(bn,dr,"utf-8"),this.touchSyncedFile(bn,Be),R++):x++;let ur=String(ze.V8CodeShow||"");if(ur.trim()){let kn=E.join(Ue,J(`${jt}_\u663E\u9690\u5224\u65AD\uFF08${Pe}\uFF09`)+".js");w.writeFileSync(kn,ur,"utf-8"),this.touchSyncedFile(kn,Be),C.menuButtons[this.getMenuButtonMetaKey(F.Id,de,Pe,"V8CodeShow")]={moduleId:F.Id,moduleName:ie,btnField:de,btnId:Pe,btnName:jt,v8SubField:"V8CodeShow",updateTime:Be,filePath:E.relative(o.getWorkspaceRoot(),kn)},R++}else x++}}C.menus[F.Id]={moduleId:F.Id,moduleName:ie,updateTime:Be,buttonHashes:lr}};ge(V);for(let F of te)await le(F,V);this.saveMeta(C,h),this.log(`\u6A21\u5757\u4EE3\u7801\u62C9\u53D6\u5B8C\u6210: ${R} \u4E2A\u6309\u94AEV8\u6587\u4EF6\uFF0C${M} \u4E2A Join/Where \u6587\u4EF6\uFF0C${O} \u4E2A\u6309\u94AE\u76EE\u5F55\uFF0C\u8DF3\u8FC7\u7A7A\u6309\u94AE\u4EE3\u7801 ${x} \u9879`),A.info(`Microi: \u6210\u529F\u62C9\u53D6 ${R} \u4E2A\u6309\u94AEV8\u6587\u4EF6\u548C ${M} \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(!w.existsSync(e))return;let i=I.getInstance().getSyncRootDir();this.ensureSyncGitExcludes(i);let o=E.join(i,".backups",n,this.shortBackupKey(t));ge(o);let a=E.join(o,`${Date.now()}-${this.shortBackupKey(E.basename(e))}`);w.renameSync(e,a)}backupAndDeleteSyncFile(e,t,n){if(!w.existsSync(e))return;let r=I.getInstance(),i=r.getSyncRootDir();this.ensureSyncGitExcludes(i);let o=r.getWorkspaceRoot()||i,c=E.relative(o,e).split(E.sep).filter(d=>d&&d!=="..").map(J),l=E.join(i,".backups",n,this.shortBackupKey(t),String(Date.now())),g=E.join(l,...c.length?c:[J(E.basename(e))]);ge(E.dirname(g)),w.copyFileSync(e,g),w.unlinkSync(e)}async pushMenuScriptFile(e,t,n){let r=j.getInstance(),i=Me(w.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u6A21\u5757\u811A\u672C: ${t.moduleId}.${t.scriptField}...`);try{let o=await r.get(H.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n);if(o.Code!==1||!o.Data)return A.error(`Microi: \u63A8\u9001\u5931\u8D25 - \u62C9\u53D6\u6A21\u5757\u5931\u8D25 ${o.Msg}`),!1;let a=o.Data,c=String(a[t.scriptField]||""),l=I.getInstance(),g=l.getSyncRootDir();this.ensureSyncGitExcludes(g);let d=E.join(g,".backups","menu-script",this.shortBackupKey(t.serverDir),t.moduleId);ge(d),w.writeFileSync(E.join(d,`${t.scriptField}-${Date.now()}.js`),c,"utf-8");let u={OsClient:t.osClient,ModuleId:t.moduleId,[t.scriptField]:i},p=await r.post(H.UPDATE_MODULE,u,void 0,n?.apiBaseUrl,n);if(p.Code!==1)return A.error(`Microi: \u63A8\u9001\u6A21\u5757 ${t.scriptField} \u5931\u8D25 - ${p.Msg}`),!1;let m=await r.get(H.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n),f=m.Data;if(m.Code!==1||!f||this.normalizeCode(String(f[t.scriptField]||""))!==this.normalizeCode(i))return A.error(`Microi: ${t.scriptField} \u63A5\u53E3\u8FD4\u56DE\u6210\u529F\uFF0C\u4F46\u8FDC\u7AEF\u56DE\u8BFB\u4E0D\u4E00\u81F4\uFF1B\u5DF2\u4FDD\u7559\u672C\u5730\u4FEE\u6539\u548C\u8FDC\u7AEF\u5907\u4EFD`),!1;let y=String(f.UpdateTime||p.Data?.UpdateTime||ve()),S=this.loadMeta(t.serverDir);return S.menuScripts||(S.menuScripts={}),S.menuScripts[this.getMenuScriptMetaKey(t.moduleId,t.scriptField)]={moduleId:t.moduleId,moduleName:String(f.Label||f.Name||a.Label||a.Name||t.moduleId),scriptField:t.scriptField,codeHash:this.sourceHash(i),updateTime:y,filePath:E.relative(l.getWorkspaceRoot(),e)},S.menus||(S.menus={}),S.menus[t.moduleId]={moduleId:t.moduleId,moduleName:String(f.Label||f.Name||a.Label||a.Name||t.moduleId),updateTime:y,buttonHashes:S.menus[t.moduleId]?.buttonHashes||{}},this.saveMeta(S,t.serverDir),this.touchSyncedFile(e,y),this.log(`\u63A8\u9001\u5E76\u56DE\u8BFB\u6210\u529F: ${t.moduleId}.${t.scriptField}`),!0}catch(o){let a=o instanceof Error?o.message:String(o);return this.log(`\u63A8\u9001\u6A21\u5757\u811A\u672C\u5F02\u5E38: ${a}`),A.error(`Microi: \u63A8\u9001\u6A21\u5757\u811A\u672C\u5F02\u5E38 - ${a}`),!1}}async pushMenuButtonFile(e,t,n){let r=j.getInstance(),i=Me(w.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u6309\u94AEV8\u4EE3\u7801: ${t.moduleId}.${t.btnField}.${t.btnId}.${t.v8SubField}...`);try{let o=await r.get(H.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n);if(o.Code!==1)return A.error(`Microi: \u63A8\u9001\u5931\u8D25 - \u62C9\u53D6\u6A21\u5757\u5931\u8D25 ${o.Msg}`),!1;let a=o.Data,c=[],l=a[t.btnField];if(l)try{c=typeof l=="string"?JSON.parse(l):l,Array.isArray(c)||(c=[])}catch{return A.error("Microi: \u63A8\u9001\u5931\u8D25 - \u6309\u94AE JSON \u89E3\u6790\u5931\u8D25"),!1}let d=I.getInstance().getSyncRootDir();this.ensureSyncGitExcludes(d);let u=E.join(d,".backups","menu-button-json",this.shortBackupKey(t.serverDir),t.moduleId);ge(u);let p=E.join(u,`${t.btnField}-${Date.now()}.json`);w.writeFileSync(p,JSON.stringify(c,null,2),"utf-8");let m=c.find(S=>String(S.Id||"")===t.btnId);if(!m){let S=c.map(h=>Number(h.Sort||0)).filter(h=>!isNaN(h));m={Id:t.btnId,Name:t.btnName||t.btnId,Sort:S.length>0?Math.max(...S)+1:c.length+1,IsVisible:!0,ShowRow:t.btnField==="MoreBtns"},c.push(m)}m[t.v8SubField]=i;let f={OsClient:t.osClient,ModuleId:t.moduleId};f[t.btnField]=JSON.stringify(c);let y=await r.post(H.UPDATE_MODULE,f,void 0,n?.apiBaseUrl,n);if(y.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.moduleId}.${t.btnField}.${t.btnId}.${t.v8SubField}`);let S=y.Data?.UpdateTime||ve(),h=this.loadMeta(t.serverDir);h.menuButtons||(h.menuButtons={});let C=this.getMenuButtonMetaKey(t.moduleId,t.btnField,t.btnId,t.v8SubField);return i.trim()?h.menuButtons[C]={moduleId:t.moduleId,moduleName:String(a.Name||a.Label||t.moduleId),btnField:t.btnField,btnId:t.btnId,btnName:String(m.Name||t.btnName||t.btnId),v8SubField:t.v8SubField,updateTime:S,filePath:E.relative(I.getInstance().getWorkspaceRoot(),e)}:delete h.menuButtons[C],h.menus||(h.menus={}),h.menus[t.moduleId]={moduleId:t.moduleId,moduleName:String(a.Name||a.Label||t.moduleId),updateTime:S,buttonHashes:h.menus[t.moduleId]?.buttonHashes||{}},this.saveMeta(h,t.serverDir),i.trim()?this.touchSyncedFile(e,S):w.existsSync(e)&&w.unlinkSync(e),!0}return A.error(`Microi: \u63A8\u9001\u6309\u94AE\u5931\u8D25 - ${y.Msg}`),!1}catch(o){let a=o instanceof Error?o.message:String(o);return this.log(`\u63A8\u9001\u5F02\u5E38: ${a}`),A.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${a}`),!1}}async pushWorkflowNodeFile(e,t,n){let r=j.getInstance(),i=w.readFileSync(e,"utf-8"),o=Me(i);this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8: ${t.flowDesignId}/${t.nodeId}/${t.eventType}...`);try{let a="",c="";try{let p=await r.post(H.GET_WORKFLOW_V8_EVENT_CODE,{OsClient:t.osClient,FlowDesignId:t.flowDesignId,NodeId:t.nodeId,EventType:t.eventType},void 0,n?.apiBaseUrl,n);p.Code===1&&p.Data&&(a=p.Data.V8Code||p.Data.Code||"",c=p.Data.Version||"")}catch{a="",c=""}let l=!o.trim(),g=l?{code:"",version:c,changeHistory:""}:Mt({kind:"Workflow",key:`${t.flowDesignId}/${t.nodeId}`,eventType:t.eventType,currentCode:o,remoteCode:a,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001\u6D41\u7A0B\u8282\u70B9 V8 ${t.flowDesignId}/${t.nodeId}/${t.eventType}`}),d={OsClient:t.osClient,FlowDesignId:t.flowDesignId,NodeId:t.nodeId,EventType:t.eventType};l?d.V8Code="":(d.V8CodeBase64=Buffer.from(g.code,"utf8").toString("base64"),d.Version=g.version,d.ChangeHistory=g.changeHistory);let u=await r.post(H.UPDATE_WORKFLOW_V8_EVENT_CODE,d,void 0,n?.apiBaseUrl,n);if(u.Code===1){let p=u.Data?.UpdateTime||ve(),m=this.loadMeta(t.serverDir);m.workflowNodeEvents||(m.workflowNodeEvents={});let f=`${t.flowDesignId}__${t.nodeId}__${t.eventType}`;return l?delete m.workflowNodeEvents[f]:m.workflowNodeEvents[f]={flowDesignId:t.flowDesignId,flowName:m.workflowNodeEvents[f]?.flowName||t.flowDesignId,nodeId:t.nodeId,nodeName:m.workflowNodeEvents[f]?.nodeName||t.nodeId,eventType:t.eventType,updateTime:p,filePath:E.relative(I.getInstance().getWorkspaceRoot(),e)},this.saveMeta(m,t.serverDir),l?w.existsSync(e)&&w.unlinkSync(e):(w.writeFileSync(e,g.code,"utf-8"),this.touchSyncedFile(e,p)),this.log(`\u63A8\u9001\u6210\u529F: ${t.flowDesignId}/${t.nodeId}/${t.eventType}`),!0}return this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5931\u8D25: ${u.Msg}`),A.error(`Microi: \u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5931\u8D25 - ${u.Msg}`),!1}catch(a){let c=a instanceof Error?a.message:String(a);return this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5F02\u5E38: ${c}`),A.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async pullDbSchema(e){let t=I.getInstance(),n=j.getInstance();if(!e){let r=t.getProfiles();if(r.length===0){A.warn("Microi: \u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u670D\u52A1\u5668");return}for(let i of r)try{await this.pullDbSchemaForProfile(i)}catch(o){let a=o instanceof Error?o.message:String(o);this.log(`\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5931\u8D25 [${i.label||i.apiBaseUrl}]: ${a}`)}return}await this.pullDbSchemaForProfile(e)}async pullDbSchemaForProfile(e){let t=I.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784 [${e.label||r}]...`);let o=await n.get(H.GET_DB_SCHEMA,{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\u6570\u636E\u5E93\u7ED3\u6784\u5931\u8D25: ${o.Msg||"Code="+o.Code}${k}`)}let a=t.getSyncRootDir(),l=await Ce.getInstance().getSysConfig(r,i),g=l?.SysShortTitle||"",d=l?.SysTitle||"",u=g||d||l?.CompanyName||e.label||"";u&&(u!==e.label||g!==e.sysShortTitle||d!==e.sysTitle)&&await t.addProfile({...e,label:u,sysShortTitle:g,sysTitle:d});let p=t.buildServerDirName(u,r),f=t.getProfiles().find(k=>k.apiBaseUrl===e.apiBaseUrl&&k.osClient===e.osClient)||e,y=t.buildOsClientDirName(i,f.osClientType,f.osClientNetwork),S=E.join(a,p,y);ge(S);let h=E.join(S,tt);w.writeFileSync(h,JSON.stringify(o.Data,null,2),"utf-8");let C=E.join(S,Ke),T=this.formatDbSchemaMarkdown(o.Data,p,y);T&&w.writeFileSync(C,T,"utf-8");let b=o.Data.Tables?.length||0,v=u||e.label||r;this.log(`[${v}] \u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5B8C\u6210: ${b} \u5F20\u8868`),A.info(`Microi: [${v}] \u6210\u529F\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\uFF08${b} \u5F20\u8868\uFF09`)}formatDbSchemaMarkdown(e,t,n){let r=(e.Tables||[]).filter(c=>c.Name);if(!r.length)return"";let i=r.reduce((c,l)=>{let g=l._Fields||l.Fields||[];return c+g.length},0),o=e.Menus?.length||0,a=[];a.push(`# \u6570\u636E\u5E93\u7ED3\u6784 \u2014 ${t}/${n}
44
+ `:""}${wi(s,i,a)}${c.replace(/^\s+/,"")}`,d=(s.changeSummary||"\u540C\u6B65 V8 \u4EE3\u7801").trim();return{code:g,version:i,changeHistory:`${i} ${d}`}}var ct=class s{static getInstance(){return s._instance||(s._instance=new s),s._instance}constructor(){}get outputChannel(){return ae.channel}log(e){ae.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=E.join(n,e,Xe);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 o=i;return{...o,engines:o.engines||{},events:o.events||{},fields:o.fields||{},menus:o.menus||{},menuButtons:o.menuButtons||{},menuScripts:o.menuScripts||{},workflows:o.workflows||{},workflowNodeEvents:o.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=E.join(r,t);pe(i);let o=E.join(i,Xe),a=`${o}.${process.pid}.${Date.now()}.tmp`;try{T.writeFileSync(a,`${JSON.stringify(e,null,2)}
45
+ `,"utf-8"),T.renameSync(a,o)}finally{try{T.existsSync(a)&&T.unlinkSync(a)}catch{}}}catch{}}getWorkspaceFilePath(e){let t=I.getInstance().getWorkspaceRoot();return t?E.isAbsolute(e)?e:E.join(t,e):null}normalizeCode(e){return Ae(Bn(e||"")).replace(/\r\n/g,`
46
+ `).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?Ee(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();st(t),$e(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,o,a)=>{let c=this.getWorkspaceFilePath(a.filePath);if(!c)return;let l=this.getLocalModifiedTime(c,a.updateTime);l&&e.push({kind:r,key:i,name:o,serverDir:n,filePath:c,updateTime:a.updateTime,modifiedTime:l})};for(let n of this.getServerDirs()){let r=this.loadMeta(n);for(let[i,o]of Object.entries(r.engines))t(n,"engine",i,o.apiName||i,o);for(let[i,o]of Object.entries(r.events))t(n,"event",i,`${o.description||o.formEngineKey}/${o.eventType}`,o);for(let[i,o]of Object.entries(r.fields||{}))t(n,"field",i,`${o.tableName}.${o.fieldName}/${o.v8Key}`,o);for(let[i,o]of Object.entries(r.menuButtons||{}))t(n,"menuButton",i,`${o.moduleName}/${o.btnName}/${o.v8SubField}`,o);for(let[i,o]of Object.entries(r.menuScripts||{}))t(n,"menuScript",i,`${o.moduleName}/${o.scriptField}`,o);for(let[i,o]of Object.entries(r.workflowNodeEvents||{}))t(n,"workflow",i,`${o.flowName}/${o.nodeName}/${o.eventType}`,o)}return e}async checkRemoteDifferences(e,t="all",n){let r=e?[e]:I.getInstance().getProfiles(),i=[];for(let o of r){let a=I.getInstance().buildServerDirName(o.label,o.apiBaseUrl),c=this.loadMeta(a),l=n?this.getTargetSyncKind(c,n):null;if(n&&!l)throw new Error(`\u540C\u6B65\u76EE\u6807\u4E0D\u5728\u672C\u5730\u57FA\u7EBF\u4E2D: ${n}`);(t==="all"||t==="api")&&(!n||l==="engine")&&await this.collectEngineDifferences(o,a,c,i,n),(t==="all"||t==="form")&&(!n||l==="event")&&await this.collectEventDifferences(o,a,c,i,n),(t==="all"||t==="form")&&(!n||l==="field")&&await this.collectFieldDifferences(o,a,c,i,n),(t==="all"||t==="module")&&(!n||l==="menuButton")&&await this.collectMenuButtonDifferences(o,a,c,i,n),(t==="all"||t==="module")&&(!n||l==="menuScript")&&await this.collectMenuScriptDifferences(o,a,c,i,n),(t==="all"||t==="workflow")&&(!n||l==="workflow")&&await this.collectWorkflowDifferences(o,a,c,i,n)}return i}matchesTargetFile(e,t){if(!t)return!0;let n=this.getWorkspaceFilePath(e);return!!n&&E.resolve(n).toLowerCase()===E.resolve(t).toLowerCase()}getTargetSyncKind(e,t){let n=[["engine",e.engines],["event",e.events],["field",e.fields||{}],["menuButton",e.menuButtons||{}],["menuScript",e.menuScripts||{}],["workflow",e.workflowNodeEvents||{}]];for(let[r,i]of n)if(Object.values(i).some(o=>this.matchesTargetFile(o.filePath,t)))return r;return null}classifyDifference(e,t,n,r){return n===r?null:e&&t?"conflict":e?"localModified":"remoteModified"}classifyRemoteDeletion(e,t){return this.isLocalModified(e,t)?"conflict":"remoteDeleted"}createRemoteDeletedItem(e,t,n,r,i,o){return!i||!T.existsSync(i)?null:{kind:e,status:this.classifyRemoteDeletion(i,o),name:t,key:n,serverDir:r,filePath:i,localCode:this.normalizeCode(T.readFileSync(i,"utf-8")),remoteCode:"",localUpdateTime:o,remoteUpdateTime:""}}isRemoteNewer(e,t){let n=new Date(e||"").getTime(),r=new Date(t||"").getTime();return isNaN(n)||isNaN(r)?!1:n>r+1e3}getRemoteOnlyPlaceholderPath(e,t,n,r){let i=I.getInstance(),o=n==="api"?Ze:n==="form"?Oe:n==="module"?Ke:et;return E.join(i.getSyncRootDir(),t,i.buildOsClientDirName(e.osClient,e.osClientType,e.osClientNetwork),o,"\u670D\u52A1\u5668\u65B0\u589E\u5F85\u62C9\u53D6",`${q(r)}.js`)}async collectEngineDifferences(e,t,n,r,i){let a=await j.getInstance().get(H.GET_ENGINE_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(a.Code!==1||!Array.isArray(a.Data?.List))throw new Error(`\u83B7\u53D6\u63A5\u53E3\u5F15\u64CE\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${a.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map(a.Data.List.map(d=>[d.ApiEngineKey,d])),l=!1;for(let[d,u]of Object.entries(n.engines)){if(!this.matchesTargetFile(u.filePath,i))continue;let p=c.get(d),m=this.getWorkspaceFilePath(u.filePath);if(!m||!T.existsSync(m))continue;if(!p){let w=this.createRemoteDeletedItem("engine",u.apiName||d,d,t,m,u.updateTime);w&&r.push(w);continue}let f=this.normalizeCode(T.readFileSync(m,"utf-8")),y=this.normalizeCode(p.ApiV8Code||""),S=this.isLocalModified(m,u.updateTime),h=this.isRemoteNewer(p.UpdateTime,u.updateTime);if(f===y){(S||h)&&p.UpdateTime&&(u.updateTime=p.UpdateTime,this.touchSyncedFile(m,p.UpdateTime),l=!0);continue}let C=this.classifyDifference(S,h,f,y);C&&r.push({kind:"engine",status:C,name:p.ApiName||u.apiName||d,key:d,serverDir:t,filePath:m,localCode:f,remoteCode:y,localUpdateTime:u.updateTime,remoteUpdateTime:p.UpdateTime})}if(l&&this.saveMeta(n,t),i)return;let g=new Set(Object.keys(n.engines).map(d=>d.toLowerCase()));for(let d of a.Data.List)!String(d.ApiV8Code||"").trim()||g.has(d.ApiEngineKey.toLowerCase())||r.push({kind:"engine",status:"remoteModified",name:d.ApiName||d.ApiEngineKey,key:d.ApiEngineKey,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"api",d.ApiEngineKey),localCode:"",remoteCode:this.normalizeCode(d.ApiV8Code||""),localUpdateTime:"",remoteUpdateTime:d.UpdateTime})}async collectEventDifferences(e,t,n,r,i){let a=await j.getInstance().get(H.GET_EVENT_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(a.Code!==1||!Array.isArray(a.Data?.List))throw new Error(`\u83B7\u53D6\u8868\u5355\u4E8B\u4EF6\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${a.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map;for(let d of a.Data.List){let u=`${d.FormEngineKey}__${d.EventType}`;c.set(u,d),c.set(u.toLowerCase(),d)}let l=!1;for(let[d,u]of Object.entries(n.events)){if(!this.matchesTargetFile(u.filePath,i))continue;let p=c.get(d)||c.get(d.toLowerCase()),m=this.getWorkspaceFilePath(u.filePath);if(!m||!T.existsSync(m))continue;if(!p){let w=this.createRemoteDeletedItem("event",`${u.description||u.formEngineKey}/${u.eventType}`,d,t,m,u.updateTime);w&&r.push(w);continue}let f=this.normalizeCode(T.readFileSync(m,"utf-8")),y=this.normalizeCode(p.V8Code||""),S=this.isLocalModified(m,u.updateTime),h=this.isRemoteNewer(p.UpdateTime,u.updateTime);if(f===y){(S||h)&&p.UpdateTime&&(u.updateTime=p.UpdateTime,this.touchSyncedFile(m,p.UpdateTime),l=!0);continue}let C=this.classifyDifference(S,h,f,y);C&&r.push({kind:"event",status:C,name:`${p.Description||u.formEngineKey}/${u.eventType}`,key:d,serverDir:t,filePath:m,localCode:f,remoteCode:y,localUpdateTime:u.updateTime,remoteUpdateTime:p.UpdateTime})}if(l&&this.saveMeta(n,t),i)return;let g=new Set(Object.keys(n.events).map(d=>d.toLowerCase()));for(let d of a.Data.List){let u=`${d.FormEngineKey}__${d.EventType}`;!String(d.V8Code||"").trim()||g.has(u.toLowerCase())||r.push({kind:"event",status:"remoteModified",name:`${d.Description||d.FormEngineKey}/${d.EventType}`,key:u,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"form",u),localCode:"",remoteCode:this.normalizeCode(d.V8Code||""),localUpdateTime:"",remoteUpdateTime:d.UpdateTime})}}async collectFieldDifferences(e,t,n,r,i){let o=j.getInstance(),a=new Map;for(let l of Object.entries(n.fields||{})){if(!this.matchesTargetFile(l[1].filePath,i))continue;let g=a.get(l[1].tableId||l[1].tableName)||[];g.push(l),a.set(l[1].tableId||l[1].tableName,g)}let c=!1;await this.runInBatches([...a.values()],i?1:2,async l=>{let g=l[0][1],d=await o.get(H.GET_FIELD_LIST,{osClient:e.osClient,tableId:g.tableId,tableName:g.tableName},e.apiBaseUrl,e);if(d.Code!==1||!Array.isArray(d.Data?.List))throw new Error(`\u83B7\u53D6\u5B57\u6BB5\u540C\u6B65\u72B6\u6001\u5931\u8D25[${g.tableName}]: ${d.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let u=new Map(d.Data.List.map(p=>[String(p.Name||"").toLowerCase(),p]));for(let[p,m]of l){let f=u.get(m.fieldName.toLowerCase()),y=this.getWorkspaceFilePath(m.filePath);if(!y||!T.existsSync(y))continue;if(!f||!String(f[m.v8Key]||"").trim()){let k=this.createRemoteDeletedItem("field",`${m.tableName}.${m.fieldName}/${m.v8Key}`,p,t,y,m.updateTime);k&&r.push(k);continue}let S=this.normalizeCode(T.readFileSync(y,"utf-8")),h=this.normalizeCode(String(f[m.v8Key]||"")),C=String(f.UpdateTime||""),w=this.isLocalModified(y,m.updateTime),b=this.isRemoteNewer(C,m.updateTime);if(S===h){(w||b)&&C&&(m.updateTime=C,this.touchSyncedFile(y,C),c=!0);continue}let v=this.classifyDifference(w,b,S,h);v&&r.push({kind:"field",status:v,name:`${m.tableName}.${m.fieldName}/${m.v8Key}`,key:p,serverDir:t,filePath:y,localCode:S,remoteCode:h,localUpdateTime:m.updateTime,remoteUpdateTime:C})}}),c&&this.saveMeta(n,t)}async collectMenuButtonDifferences(e,t,n,r,i){let o=j.getInstance(),a=new Map;if(!i)for(let u of Object.keys(n.menus||{}))a.set(u,[]);for(let u of Object.entries(n.menuButtons||{})){if(!this.matchesTargetFile(u[1].filePath,i))continue;let p=a.get(u[1].moduleId)||[];p.push(u),a.set(u[1].moduleId,p)}let c=[];if(!i){let u=await o.get(H.LIST_MODULES,{osClient:e.osClient},e.apiBaseUrl,e);if(u.Code!==1||!Array.isArray(u.Data?.List))throw new Error(`\u83B7\u53D6\u6A21\u5757\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${u.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);c=u.Data.List}let l=new Set(c.map(u=>String(u.ParentId||"")).filter(Boolean)),g=new Map(c.map(u=>[u.Id,u]));for(let u of c){if(l.has(u.Id)||n.menus?.[u.Id])continue;let p=u.Label||u.Name||u.Id;r.push({kind:"menuButton",status:"remoteModified",name:`${p}/\u670D\u52A1\u5668\u65B0\u589E\u6A21\u5757`,key:u.Id,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"module",u.Id),localCode:"",remoteCode:JSON.stringify(u,null,2),localUpdateTime:"",remoteUpdateTime:String(u.UpdateTime||"")})}let d=!1;await this.runInBatches([...a.entries()],i?1:2,async([u,p])=>{let m=()=>{for(let[b,v]of p){let k=this.getWorkspaceFilePath(v.filePath);if(!k)continue;let V=this.createRemoteDeletedItem("menuButton",`${v.moduleName}/${v.btnName}/${v.v8SubField}`,b,t,k,v.updateTime);V&&r.push(V)}};if(!i&&!g.has(u)){m();return}let f=await o.get(H.GET_MODULE,{osClient:e.osClient,moduleId:u},e.apiBaseUrl,e);if(f.Code!==1||!f.Data){if(/不存在|not\s*found/i.test(String(f.Msg||""))){m();return}throw new Error(`\u83B7\u53D6\u6A21\u5757\u6309\u94AE\u540C\u6B65\u72B6\u6001\u5931\u8D25[${u}]: ${f.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`)}let y=f.Data,S=String(y.UpdateTime||""),h=new Map;for(let b of Object.keys(tt)){let v=[];try{let k=y[b];v=typeof k=="string"?JSON.parse(k):Array.isArray(k)?k:[],Array.isArray(v)||(v=[])}catch{v=[]}h.set(b,new Map(v.map(k=>[String(k.Id||""),k])))}for(let[b,v]of p){let k=h.get(v.btnField)?.get(v.btnId),V=this.getWorkspaceFilePath(v.filePath);if(!V||!T.existsSync(V))continue;if(!k||!String(k[v.v8SubField]||"").trim()){let P=this.createRemoteDeletedItem("menuButton",`${v.moduleName}/${v.btnName}/${v.v8SubField}`,b,t,V,v.updateTime);P&&r.push(P);continue}let Y=this.normalizeCode(T.readFileSync(V,"utf-8")),N=this.normalizeCode(String(k[v.v8SubField]||"")),R=this.isLocalModified(V,v.updateTime),$=this.isRemoteNewer(S,v.updateTime);if(Y===N){(R||$)&&S&&(v.updateTime=S,this.touchSyncedFile(V,S),d=!0);continue}let M=this.classifyDifference(R,$,Y,N);M&&r.push({kind:"menuButton",status:M,name:`${v.moduleName}/${v.btnName}/${v.v8SubField}`,key:b,serverDir:t,filePath:V,localCode:Y,remoteCode:N,localUpdateTime:v.updateTime,remoteUpdateTime:S})}if(i)return;let C=new Set(p.map(([b])=>b)),w=n.menus?.[u]?.moduleName||g.get(u)?.Label||g.get(u)?.Name||u;for(let[b,v]of h)for(let[k,V]of v){if(!k)continue;let Y=String(V.Name||k);for(let N of["V8Code","V8CodeShow"]){let R=String(V[N]||""),$=this.getMenuButtonMetaKey(u,b,k,N);!R.trim()||C.has($)||r.push({kind:"menuButton",status:"remoteModified",name:`${w}/${Y}/${N}`,key:$,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"module",$),localCode:"",remoteCode:this.normalizeCode(R),localUpdateTime:"",remoteUpdateTime:S})}}}),d&&this.saveMeta(n,t)}async collectMenuScriptDifferences(e,t,n,r,i){let o=j.getInstance(),a=Object.entries(n.menuScripts||{}).filter(([,l])=>this.matchesTargetFile(l.filePath,i)),c=!1;await this.runInBatches(a,i?1:2,async([l,g])=>{let d=this.getWorkspaceFilePath(g.filePath);if(!d||!T.existsSync(d))return;let u=await o.get(H.GET_MODULE,{osClient:e.osClient,moduleId:g.moduleId},e.apiBaseUrl,e);if(u.Code!==1||!u.Data){if(/不存在|not\s*found/i.test(String(u.Msg||""))){let w=this.createRemoteDeletedItem("menuScript",`${g.moduleName}/${g.scriptField}`,l,t,d,g.updateTime);w&&r.push(w);return}throw new Error(`\u83B7\u53D6\u6A21\u5757 Join/Where \u540C\u6B65\u72B6\u6001\u5931\u8D25[${g.moduleId}]: ${u.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`)}let p=u.Data,m=this.normalizeCode(String(p[g.scriptField]||"")),f=this.normalizeCode(T.readFileSync(d,"utf-8")),y=String(p.UpdateTime||""),S=this.isLocalModified(d,g.updateTime),h=this.sourceHash(m)!==g.codeHash;if(f===m){(S||h||y&&y!==g.updateTime)&&(g.codeHash=this.sourceHash(m),g.updateTime=y||g.updateTime,this.touchSyncedFile(d,g.updateTime),c=!0);return}let C=this.classifyDifference(S,h,f,m);C&&r.push({kind:"menuScript",status:C,name:`${g.moduleName}/${g.scriptField}`,key:l,serverDir:t,filePath:d,localCode:f,remoteCode:m,localUpdateTime:g.updateTime,remoteUpdateTime:y})}),c&&this.saveMeta(n,t)}async runInBatches(e,t,n){for(let r=0;r<e.length;r+=t)await Promise.all(e.slice(r,r+t).map(i=>n(i))),r+t<e.length&&await new Promise(i=>setTimeout(i,120))}async collectWorkflowDifferences(e,t,n,r,i){let a=await j.getInstance().get(H.GET_WORKFLOW_V8_EVENT_LIST,{osClient:e.osClient},e.apiBaseUrl,e);if(a.Code!==1||!Array.isArray(a.Data?.List))throw new Error(`\u83B7\u53D6\u6D41\u7A0B\u4E8B\u4EF6\u540C\u6B65\u72B6\u6001\u5931\u8D25: ${a.Msg||"\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u4E0D\u6B63\u786E"}`);let c=new Map(a.Data.List.map(d=>[`${d.FlowDesignId}__${d.NodeId}__${d.EventType}`,d])),l=!1;for(let[d,u]of Object.entries(n.workflowNodeEvents||{})){if(!this.matchesTargetFile(u.filePath,i))continue;let p=c.get(d),m=this.getWorkspaceFilePath(u.filePath);if(!m||!T.existsSync(m))continue;if(!p||!String(p.V8Code||p.Code||"").trim()){let w=this.createRemoteDeletedItem("workflow",`${u.flowName}/${u.nodeName}/${u.eventType}`,d,t,m,u.updateTime);w&&r.push(w);continue}let f=this.normalizeCode(T.readFileSync(m,"utf-8")),y=this.normalizeCode(p.V8Code||p.Code||""),S=this.isLocalModified(m,u.updateTime),h=this.isRemoteNewer(p.UpdateTime,u.updateTime);if(f===y){(S||h)&&p.UpdateTime&&(u.updateTime=p.UpdateTime,this.touchSyncedFile(m,p.UpdateTime),l=!0);continue}let C=this.classifyDifference(S,h,f,y);if(C){let w=`${p.FlowName||u.flowName}/${p.NodeName||u.nodeName}/${p.EventType||u.eventType}`;r.push({kind:"workflow",status:C,name:w,key:d,serverDir:t,filePath:m,localCode:f,remoteCode:y,localUpdateTime:u.updateTime,remoteUpdateTime:p.UpdateTime})}}if(l&&this.saveMeta(n,t),i)return;let g=new Set(Object.keys(n.workflowNodeEvents||{}));for(let d of a.Data.List){let u=`${d.FlowDesignId}__${d.NodeId}__${d.EventType}`,p=d.V8Code||d.Code||"";if(!p.trim()||g.has(u))continue;let m=`${d.FlowName||d.FlowDesignId}/${d.NodeName||d.NodeId}/${d.EventType}`;r.push({kind:"workflow",status:"remoteModified",name:m,key:u,serverDir:t,filePath:this.getRemoteOnlyPlaceholderPath(e,t,"workflow",u),localCode:"",remoteCode:this.normalizeCode(p),localUpdateTime:"",remoteUpdateTime:d.UpdateTime})}}migrateFromFlatMeta(e){let t=I.getInstance();try{let n=t.getSyncRootDir(),r=E.join(n,Xe);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 o=JSON.parse(T.readFileSync(r,"utf-8")),a=o.engines||{},c=o.events||{},l={engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}};for(let[g,d]of Object.entries(a)){let u=d;if(u.filePath){let p=E.join(i,u.filePath);E.relative(n,p).split(E.sep)[0]===e&&(l.engines[g]=u)}}for(let[g,d]of Object.entries(c)){let u=d;if(u.filePath){let p=E.join(i,u.filePath);E.relative(n,p).split(E.sep)[0]===e&&(l.events[g]=u)}}return(Object.keys(l.engines).length>0||Object.keys(l.events).length>0)&&this.saveMeta(l,e),l}catch{return{engines:{},events:{},fields:{},menus:{},menuButtons:{},menuScripts:{},workflows:{},workflowNodeEvents:{}}}}async pullEngines(e){if(!e){let t=I.getInstance().getProfiles();if(t.length===0){A.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}`),A.error(`Microi: \u62C9\u53D6 [${n.label||n.apiBaseUrl}] \u5931\u8D25 - ${i}`)}return}await this.pullEnginesForProfile(e)}async pullEnginesForProfile(e){let t=I.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE\u4EE3\u7801 [${e.label||r}]...`),await he.withProgress({location:Qe.Notification,title:`Microi: \u62C9\u53D6\u63A5\u53E3\u5F15\u64CE [${e.label||r}]`,cancellable:!1},async o=>{o.report({message:"\u68C0\u67E5\u540E\u7AEF\u72B6\u6001..."});let a=await n.get(H.GET_STATUS,void 0,r,e);if(a.Code!==1){let M=a.Code===1001||a.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u540E\u7AEF\u72B6\u6001\u5F02\u5E38: ${a.Msg||"Code="+a.Code}${M}`)}o.report({message:"\u83B7\u53D6\u7CFB\u7EDF\u914D\u7F6E..."});let l=await we.getInstance().getSysConfig(r,i),g=l?.SysShortTitle||"",d=l?.SysTitle||"",u=g||d||l?.CompanyName||e.label||"";u&&(u!==e.label||g!==e.sysShortTitle||d!==e.sysTitle)&&await t.addProfile({...e,label:u,sysShortTitle:g,sysTitle:d}),o.report({message:"\u83B7\u53D6\u63A5\u53E3\u5F15\u64CE\u5217\u8868..."});let p=await n.get(H.GET_ENGINE_LIST,{osClient:i},r,e);if(p.Code!==1){let M=p.Code===1001||p.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u5217\u8868\u5931\u8D25: ${p.Msg||"Code="+p.Code}${M}`)}let{OsClient:m,OsClientType:f,OsClientNetwork:y,List:S,Total:h}=p.Data;if(this.log(`\u83B7\u53D6\u5230 ${h} \u4E2A\u63A5\u53E3\u5F15\u64CE (OsClient: ${m})`),!f||!y)throw new Error(`\u540E\u7AEF\u672A\u8FD4\u56DE\u5B8C\u6574\u7684 OsClientType/OsClientNetwork (OsClient: ${m}, Type: ${f||"\u7A7A"}, Network: ${y||"\u7A7A"})\uFF0C\u65E0\u6CD5\u62C9\u53D6\u4EE3\u7801`);if(f||y){let M={...e,osClientType:f,osClientNetwork:y};await t.addProfile(M)}let C=t.getSyncRootDir(),w=t.buildServerDirName(u,r),b=this.loadMeta(w),v=0,k=0,V=[],Y=new Set,N=new Set,R=t.buildOsClientDirName(m,f,y);for(let M of S)try{let P=q(M.Category||"\u672A\u5206\u7C7B"),x=q(M.ApiName||M.ApiEngineKey),J=E.join(C,w,R,Ze,P),X=q(`${x}(${Ln(M.ApiEngineKey)}).js`),ge=E.join(J,X),me=Bn(M.ApiV8Code||"");if(!me.trim()){k++,T.existsSync(ge)&&this.backupAndDeleteSyncFile(ge,w,"remote-deleted-api"),delete b.engines[M.ApiEngineKey];continue}Y.add(M.ApiEngineKey),pe(J),T.writeFileSync(ge,me,"utf-8");let ne=new Date(M.UpdateTime);isNaN(ne.getTime())||T.utimesSync(ge,ne,ne),b.engines[M.ApiEngineKey]={id:M.Id,apiName:M.ApiName,category:P,apiAddress:M.ApiAddress,apiRoutes:M.ApiRoutes||"",updateTime:M.UpdateTime,filePath:E.relative(t.getWorkspaceRoot(),ge)},v++,o.report({message:`${v}/${h} ${M.ApiEngineKey}`,increment:1/h*100})}catch(P){let x=P instanceof Error?P.message:String(P);N.add(M.ApiEngineKey),V.push(`${M.ApiEngineKey}: ${x}`),this.log(`\u63A5\u53E3\u5F15\u64CE\u6587\u4EF6\u5199\u5165\u5931\u8D25\uFF0C\u7EE7\u7EED\u4E0B\u4E00\u9879 [${M.ApiEngineKey}]: ${x}`)}for(let[M,P]of Object.entries(b.engines)){if(Y.has(M)||N.has(M))continue;let x=this.getWorkspaceFilePath(P.filePath);x&&this.backupAndDeleteSyncFile(x,w,"remote-deleted-api"),delete b.engines[M]}this.saveMeta(b,w);let $=u||e.label||r;this.log(`[${$}] \u62C9\u53D6\u5B8C\u6210: ${v} \u4E2A\u63A5\u53E3\u5F15\u64CE\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${k} \u9879\uFF0C\u5931\u8D25 ${V.length} \u9879`),V.length>0?A.warn(`Microi: [${$}] \u5DF2\u62C9\u53D6 ${v} \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`):A.info(`Microi: [${$}] \u6210\u529F\u62C9\u53D6 ${v} \u4E2A\u63A5\u53E3\u5F15\u64CE${k>0?`\uFF08\u8DF3\u8FC7 ${k} \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=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6V8\u4E8B\u4EF6\u4EE3\u7801 [${e.label||r}]...`),await he.withProgress({location:Qe.Notification,title:`Microi: \u62C9\u53D6V8\u4E8B\u4EF6 [${e.label||r}]`,cancellable:!1},async o=>{o.report({message:"\u83B7\u53D6V8\u4E8B\u4EF6\u5217\u8868..."});let a=await n.get(H.GET_EVENT_LIST,{osClient:i},r,e);if(a.Code!==1){let R=a.Code===1001||a.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6V8\u4E8B\u4EF6\u5217\u8868\u5931\u8D25: ${a.Msg||"Code="+a.Code}${R}`)}let{List:c,Total:l}=a.Data;this.log(`\u83B7\u53D6\u5230 ${l} \u4E2AV8\u4E8B\u4EF6`);let d=await we.getInstance().getSysConfig(r,i),u=d?.SysShortTitle||"",p=d?.SysTitle||"",m=u||p||d?.CompanyName||e.label||"";m&&(m!==e.label||u!==e.sysShortTitle||p!==e.sysTitle)&&await t.addProfile({...e,label:m,sysShortTitle:u,sysTitle:p});let f=t.getSyncRootDir(),y=t.buildServerDirName(m,r),S=this.loadMeta(y),h=0,C=0,w=0,b=new Set(c.map(R=>`${R.FormEngineKey}__${R.EventType}`)),k=t.getProfiles().find(R=>R.apiBaseUrl===e.apiBaseUrl&&R.osClient===e.osClient)||e;if(!k.osClientType||!k.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE\u4EE5\u83B7\u53D6\u5B8C\u6574\u914D\u7F6E");let V=t.buildOsClientDirName(i,k.osClientType,k.osClientNetwork),Y={SubmitBeforeServerV8:"\u540E\u7AEF\u63D0\u4EA4\u524DV8\u4E8B\u4EF6",SubmitAfterServerV8:"\u540E\u7AEF\u63D0\u4EA4\u540EV8\u4E8B\u4EF6",SubmitFormV8:"\u524D\u7AEF\u8868\u5355\u63D0\u4EA4V8\u4E8B\u4EF6",OutFormV8:"\u524D\u7AEF\u8868\u5355\u9000\u51FAV8\u4E8B\u4EF6",ServerDataV8:"\u540E\u7AEF\u6570\u636EV8\u4E8B\u4EF6"};for(let R of c){let $=R.V8Code||"",M=q(R.Description?`${R.Description}\uFF08${R.FormEngineKey}\uFF09`:R.FormEngineKey),P=vr[R.EventType]||R.EventType,x=q(`${P}\uFF08${R.EventType}\uFF09`)+".js",J=E.join(f,y,V,Oe,M,Gt);pe(J);let X=E.join(J,x),ge=Y[R.EventType];if(ge){let ye=q(`${ge}\uFF08${R.EventType}\uFF09`)+".js",de=E.join(J,ye);de!==X&&T.existsSync(de)&&!this.isLocalModified(de,R.UpdateTime)&&(T.existsSync(X)?T.unlinkSync(de):T.renameSync(de,X))}let me=`${R.FormEngineKey}__${R.EventType}`;if(S.events[me]={id:R.Id,formEngineKey:R.FormEngineKey,description:R.Description||"",eventType:R.EventType,updateTime:R.UpdateTime,filePath:E.relative(t.getWorkspaceRoot(),X)},!$.trim()){T.existsSync(X)&&this.backupAndDeleteSyncFile(X,y,"remote-deleted-form-event"),w++,h++,o.report({message:`${h}/${l}`,increment:l>0?1/l*100:void 0});continue}T.writeFileSync(X,$,"utf-8");let ne=new Date(R.UpdateTime);isNaN(ne.getTime())||T.utimesSync(X,ne,ne),C++,h++,o.report({message:`${h}/${l}`,increment:l>0?1/l*100:void 0})}for(let[R,$]of Object.entries(S.events)){if(b.has(R))continue;let M=this.getWorkspaceFilePath($.filePath);M&&this.backupAndDeleteSyncFile(M,y,"remote-deleted-form-event"),delete S.events[R]}this.saveMeta(S,y);let N=m||e.label||r;this.log(`[${N}] \u62C9\u53D6\u5B8C\u6210: ${C} \u4E2AV8\u4E8B\u4EF6\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${w} \u9879`),A.info(`Microi: [${N}] \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=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE\u8282\u70B9 V8 [${e.label||r}]...`),await he.withProgress({location:Qe.Notification,title:`Microi: \u62C9\u53D6\u6D41\u7A0B\u5F15\u64CE [${e.label||r}]`,cancellable:!1},async o=>{o.report({message:"\u83B7\u53D6\u6D41\u7A0B\u8282\u70B9V8\u5217\u8868..."});let a=await n.get(H.GET_WORKFLOW_V8_EVENT_LIST,{osClient:i},r,e);if(a.Code!==1){let P=a.Code===1001||a.Code===1002?"\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55":"";throw new Error(`\u83B7\u53D6\u6D41\u7A0B\u8282\u70B9V8\u5217\u8868\u5931\u8D25: ${a.Msg||"Code="+a.Code}${P}`)}let l=await we.getInstance().getSysConfig(r,i),g=l?.SysShortTitle||"",d=l?.SysTitle||"",u=g||d||l?.CompanyName||e.label||"";u&&(u!==e.label||g!==e.sysShortTitle||d!==e.sysTitle)&&await t.addProfile({...e,label:u,sysShortTitle:g,sysTitle:d});let m=t.getProfiles().find(P=>P.apiBaseUrl===e.apiBaseUrl&&P.osClient===e.osClient)||e;if(!m.osClientType||!m.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let f=a.Data.OsClient||i,y=t.buildServerDirName(u,r),S=t.buildOsClientDirName(f,m.osClientType,m.osClientNetwork),h=t.getSyncRootDir(),C=this.loadMeta(y);C.workflows||(C.workflows={}),C.workflowNodeEvents||(C.workflowNodeEvents={});let w=a.Data.Flows||[],b=a.Data.Nodes||[],v=a.Data.Lines||[],k=a.Data.List||[],V=new Map(w.map(P=>[String(P.Id||""),P])),Y=new Set(w.map(P=>String(P.Id||"")).filter(Boolean)),N=new Set(k.filter(P=>String(P.V8Code||P.Code||"").trim()).map(P=>`${P.FlowDesignId}__${P.NodeId}__${P.EventType}`)),R=0,$=0;for(let P of w){let x=String(P.Id||"");if(!x)continue;let J=String(P.FlowName||x),X=String(P.UpdateTime||Ee()),ge=E.join(h,y,S,et,q(`${J}\uFF08${x}\uFF09`));pe(ge);let me=b.filter(de=>String(de.FlowDesignId||"")===x),ne=v.filter(de=>String(de.FlowDesignId||"")===x),ye=E.join(ge,"\u6D41\u7A0B\u8BBE\u8BA1\u56FE\uFF08WF_FlowDesign\uFF09.json");T.writeFileSync(ye,JSON.stringify({FlowDesign:P,Nodes:me,Lines:ne},null,2),"utf-8"),this.touchSyncedFile(ye,X),C.workflows[x]={flowDesignId:x,flowName:J,updateTime:X,filePath:E.relative(t.getWorkspaceRoot(),ye)}}for(let P of k){let x=String(P.FlowDesignId||""),J=String(P.NodeId||""),X=String(P.EventType||"");if(!x||!J||!X)continue;let ge=V.get(x),me=String(P.FlowName||ge?.FlowName||x),ne=String(P.NodeName||J),ye=Er[X]||P.EventName||X,de=E.join(h,y,S,et,q(`${me}\uFF08${x}\uFF09`),zt,q(`${ne}\uFF08${J}\uFF09`));pe(de);let F=E.join(de,q(`${ye}\uFF08${X}\uFF09`)+".js"),fe=P.V8Code||P.Code||"",oe=String(P.UpdateTime||ge?.UpdateTime||Ee());if(C.workflowNodeEvents[`${x}__${J}__${X}`]={flowDesignId:x,flowName:me,nodeId:J,nodeName:ne,eventType:X,updateTime:oe,filePath:E.relative(t.getWorkspaceRoot(),F)},!fe.trim()){T.existsSync(F)&&this.backupAndDeleteSyncFile(F,y,"remote-deleted-workflow-event"),$++,o.report({message:`${R}/${k.length} ${me}/${ne}`});continue}T.writeFileSync(F,fe,"utf-8"),this.touchSyncedFile(F,oe),R++,o.report({message:`${R}/${k.length} ${me}/${ne}`})}for(let[P,x]of Object.entries(C.workflowNodeEvents)){if(N.has(P))continue;let J=this.getWorkspaceFilePath(x.filePath);J&&this.backupAndDeleteSyncFile(J,y,"remote-deleted-workflow-event"),delete C.workflowNodeEvents[P]}for(let[P,x]of Object.entries(C.workflows)){if(Y.has(P))continue;let J=this.getWorkspaceFilePath(x.filePath);J&&this.backupAndDeleteSyncFile(J,y,"remote-deleted-workflow"),delete C.workflows[P]}this.saveMeta(C,y);let M=u||e.label||r;this.log(`[${M}] \u6D41\u7A0B\u5F15\u64CE\u62C9\u53D6\u5B8C\u6210: ${w.length} \u4E2A\u6D41\u7A0B\uFF0C${R} \u4E2A\u8282\u70B9V8\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${$} \u9879`),A.info(`Microi: [${M}] \u6210\u529F\u62C9\u53D6 ${w.length} \u4E2A\u6D41\u7A0B\u3001${R} \u4E2A\u6D41\u7A0B\u8282\u70B9V8\u6587\u4EF6${$>0?`\uFF08\u8DF3\u8FC7 ${$} \u4E2A\u7A7A\u4EE3\u7801\u4E8B\u4EF6\uFF09`:""}`)})}findProfileByServerDir(e){let t=I.getInstance(),n=t.getProfiles();for(let r of n)if(t.buildServerDirName(r.label,r.apiBaseUrl)===e)return r}hasSyncBaseline(e,t){let n=E.resolve(e).toLowerCase(),r=this.loadMeta(t);return[r.engines,r.events,r.fields||{},r.menuButtons||{},r.menuScripts||{},r.workflowNodeEvents||{}].some(o=>Object.values(o).some(a=>{let c=this.getWorkspaceFilePath(a.filePath);return!!c&&E.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),A.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),A.error(`Microi: ${i}`),!1}try{let i=await this.checkRemoteDifferences(n,r,e),o=E.resolve(e).toLowerCase(),a=i.find(g=>E.resolve(g.filePath).toLowerCase()===o);if(!a||a.status==="localModified")return!0;let l=`${a.status==="conflict"?"\u672C\u5730\u4E0E\u670D\u52A1\u5668\u5747\u5DF2\u4FEE\u6539":a.status==="remoteDeleted"?"\u670D\u52A1\u5668\u7AEF\u8D44\u6E90\u5DF2\u5220\u9664":"\u670D\u52A1\u5668\u4EE3\u7801\u8F83\u65B0"}\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\u4EE5\u907F\u514D\u8986\u76D6\u3002\u8BF7\u5728\u201C\u540C\u6B65\u7ED3\u679C\u201D\u4E2D\u67E5\u770B\u5DEE\u5F02\u5E76\u62C9\u53D6\u6216\u5408\u5E76\uFF1A${a.name}`;return this.log(l),A.error(`Microi: ${l}`),!1}catch(i){let o=i instanceof Error?i.message:String(i);return this.log(`\u63A8\u9001\u524D\u540C\u6B65\u72B6\u6001\u68C0\u6D4B\u5931\u8D25\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\uFF1A${o}`),A.error(`Microi: \u63A8\u9001\u524D\u540C\u6B65\u72B6\u6001\u68C0\u6D4B\u5931\u8D25\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001 - ${o}`),!1}}async pushFile(e,t={}){let r=I.getInstance().getSyncRootDir();if(E.extname(e).toLowerCase()===".js"&&T.existsSync(e)){let d=Nr(Ae(T.readFileSync(e,"utf-8")));if(d.length>0){let u=d[0],p=`\u68C0\u6D4B\u5230 AI/\u7EC8\u7AEF\u5DE5\u5177\u8F93\u51FA\u6C61\u67D3\uFF08\u7B2C ${u.line} \u884C: ${u.marker}\uFF09\uFF0C\u5DF2\u505C\u6B62\u63A8\u9001\u3002\u8BF7\u6062\u590D\u5B8C\u6574\u6E90\u7801\u540E\u518D\u8BD5\uFF1A${e}`;return this.log(p),A.error(`Microi: ${p}`),!1}}let i=Rr(e,r);if(i){let d=this.findProfileByServerDir(i.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,i.serverDir,d,"api")?!1:this.pushEngineFile(e,i,d)}let o=Ir(e,r);if(o){let d=this.findProfileByServerDir(o.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,o.serverDir,d,"form")?!1:this.pushEventFile(e,o,d)}let a=_r(e,r);if(a){let d=this.findProfileByServerDir(a.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,a.serverDir,d,"form")?!1:this.pushFieldFile(e,a,d)}let c=Mr(e,r);if(c){let d=this.findProfileByServerDir(c.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,c.serverDir,d,"module")?!1:this.pushMenuButtonFile(e,c,d)}let l=Ar(e,r);if(l){let d=this.findProfileByServerDir(l.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,l.serverDir,d,"module")?!1:this.pushMenuScriptFile(e,l,d)}let g=Fr(e,r);if(g){let d=this.findProfileByServerDir(g.serverDir);return!t.skipPreflight&&!await this.runPushPreflight(e,g.serverDir,d,"workflow")?!1:this.pushWorkflowNodeFile(e,g,d)}return this.log(`\u65E0\u6CD5\u89E3\u6790\u6587\u4EF6\u8DEF\u5F84: ${e}`),!1}async pushEngineFile(e,t,n){let r=j.getInstance(),i=T.readFileSync(e,"utf-8"),o=Ae(i);this.log(`\u63A8\u9001\u63A5\u53E3\u5F15\u64CE: ${t.apiEngineKey}...`);try{let a="",c="";try{let p=await r.post(H.GET_ENGINE_CODE,{OsClient:t.osClient,ApiEngineKey:t.apiEngineKey},void 0,n?.apiBaseUrl,n);p.Code===1&&p.Data&&(a=p.Data.ApiV8Code||p.Data.Code||"",c=p.Data.Version||"")}catch{a="",c=""}let l=!o.trim(),g=l?{code:"",version:c,changeHistory:""}:Nt({kind:"ApiEngine",key:t.apiEngineKey,currentCode:o,remoteCode:a,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001\u63A5\u53E3\u5F15\u64CE ${t.apiEngineKey}`}),d={OsClient:t.osClient,ApiEngineKey:t.apiEngineKey,ApiV8CodeBase64:Buffer.from(g.code,"utf8").toString("base64")};l||(d.Version=g.version,d.ChangeSummary=g.changeHistory);let u=await r.post(H.UPDATE_ENGINE_CODE,d,void 0,n?.apiBaseUrl,n);if(u.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.apiEngineKey}`);let p=u.Data?.UpdateTime||Ee(),m=this.loadMeta(t.serverDir);if(l?delete m.engines[t.apiEngineKey]:m.engines[t.apiEngineKey]&&(m.engines[t.apiEngineKey].updateTime=p),this.saveMeta(m,t.serverDir),l)T.existsSync(e)&&T.unlinkSync(e);else{T.writeFileSync(e,g.code,"utf-8");let f=new Date(p);isNaN(f.getTime())||T.utimesSync(e,f,f)}return!0}else return this.log(`\u63A8\u9001\u5931\u8D25: ${t.apiEngineKey} - ${u.Msg}`),A.error(`Microi: \u63A8\u9001\u5931\u8D25 - ${u.Msg}`),!1}catch(a){let c=a instanceof Error?a.message:String(a);return this.log(`\u63A8\u9001\u5F02\u5E38: ${t.apiEngineKey} - ${c}`),A.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async pushEventFile(e,t,n){let r=j.getInstance(),i=T.readFileSync(e,"utf-8"),o=Ae(i);this.log(`\u63A8\u9001V8\u4E8B\u4EF6: ${t.formEngineKey}/${t.eventType}...`);try{let a="",c="";try{let p=await r.post(H.GET_EVENT_CODE,{OsClient:t.osClient,FormEngineKey:t.formEngineKey,EventType:t.eventType},void 0,n?.apiBaseUrl,n);p.Code===1&&p.Data&&(a=p.Data.V8Code||p.Data.Code||"",c=p.Data.Version||"")}catch{a="",c=""}let l=!o.trim(),g=l?{code:"",version:c,changeHistory:""}:Nt({kind:"V8Event",key:t.formEngineKey,eventType:t.eventType,currentCode:o,remoteCode:a,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001 V8 \u4E8B\u4EF6 ${t.formEngineKey}/${t.eventType}`}),d={OsClient:t.osClient,FormEngineKey:t.formEngineKey,EventType:t.eventType,V8Code:g.code};l||(d.Version=g.version,d.ChangeHistory=g.changeHistory);let u=await r.post(H.UPDATE_EVENT_CODE,d,void 0,n?.apiBaseUrl,n);if(u.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.formEngineKey}/${t.eventType}`);let p=u.Data?.UpdateTime||Ee(),m=this.loadMeta(t.serverDir),f=`${t.formEngineKey}__${t.eventType}`;if(l)delete m.events[f];else{let y=m.events[f];m.events[f]={id:y?.id||"",formEngineKey:t.formEngineKey,description:y?.description||"",eventType:t.eventType,updateTime:p,filePath:E.relative(I.getInstance().getWorkspaceRoot(),e)}}if(this.saveMeta(m,t.serverDir),l)T.existsSync(e)&&T.unlinkSync(e);else{T.writeFileSync(e,g.code,"utf-8");let y=new Date(p);isNaN(y.getTime())||T.utimesSync(e,y,y)}return!0}else return this.log(`\u63A8\u9001\u5931\u8D25: ${t.formEngineKey}/${t.eventType} - ${u.Msg}`),A.error(`Microi: \u63A8\u9001\u5931\u8D25 - ${u.Msg}`),!1}catch(a){let c=a instanceof Error?a.message:String(a);return this.log(`\u63A8\u9001\u5F02\u5E38: ${t.formEngineKey}/${t.eventType} - ${c}`),A.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async createEngine(e){let t=j.getInstance(),n=I.getInstance();this.log(`\u521B\u5EFA\u63A5\u53E3\u5F15\u64CE: ${e.apiEngineKey}...`);try{let r=Nt({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(H.CREATE_ENGINE,{OsClient:e.profile.osClient,ApiName:e.apiName,ApiEngineKey:e.apiEngineKey,ApiAddress:e.apiAddress||"",ApiRoutes:e.apiRoutes||"",ApiRemark:e.apiRemark||"",Lock:e.lock?1:0,LockKey:e.lockKey||"",AllowAnonymous:e.allowAnonymous?1:0,V8Limit:e.v8Limit?1:0,IsEnable:e.isEnable!==!1?1:0,ApiRole:e.apiRole||"",Category:e.category||"\u672A\u5206\u7C7B",ApiV8CodeBase64:Buffer.from(r.code,"utf8").toString("base64"),Version:r.version,ChangeSummary:r.changeHistory},void 0,e.profile.apiBaseUrl,e.profile);if(i.Code===1){let o=n.getSyncRootDir(),a=n.buildServerDirName(e.profile.label,e.profile.apiBaseUrl),c=n.buildOsClientDirName(e.profile.osClient,e.profile.osClientType,e.profile.osClientNetwork),l=q(e.category||"\u672A\u5206\u7C7B"),g=q(e.apiName||e.apiEngineKey),d=E.join(o,a,c,Ze,l);pe(d);let u=E.join(d,q(`${g}(${Ln(e.apiEngineKey)}).js`));T.writeFileSync(u,r.code,"utf-8");let p=this.loadMeta(a);return p.engines[e.apiEngineKey]={id:"",apiName:e.apiName,category:l,apiAddress:e.apiAddress||"",apiRoutes:e.apiRoutes||"",updateTime:Ee(),filePath:E.relative(n.getWorkspaceRoot(),u)},this.saveMeta(p,a),this.log(`\u521B\u5EFA\u6210\u529F: ${e.apiEngineKey}`),A.info(`Microi: \u63A5\u53E3\u5F15\u64CE [${e.apiEngineKey}] \u521B\u5EFA\u6210\u529F`),await he.showTextDocument(Sr.file(u)),!0}else return this.log(`\u521B\u5EFA\u5931\u8D25: ${e.apiEngineKey} - ${i.Msg}`),A.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}`),A.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=E.relative(n,e).split(E.sep);if(r.length<4||r[2]!==Oe){A.warn("Microi: \u8BF7\u5728\u201C\u8868\u5355\u5F15\u64CE\u201D\u4E0B\u7684\u8868\u76EE\u5F55\u6267\u884C\u5B57\u6BB5 V8 \u4E8B\u4EF6\u62C9\u53D6");return}let i=a=>{let c=a.match(/[((]([^))]+)[))]\s*$/);return c?c[1]:a},o=this.findProfileByServerDir(r[0]);if(!o){A.error(`Microi: \u672A\u627E\u5230\u4E0E\u76EE\u5F55 "${r[0]}" \u5339\u914D\u7684\u670D\u52A1\u5668\u8FDE\u63A5`);return}await this.pullFieldsForTable(o,i(r[3]),e,r[0])}async pullFieldsForTable(e,t,n,r){let i=I.getInstance(),o=j.getInstance(),a=this.loadMeta(r);a.fields||(a.fields={}),this.log(`\u62C9\u53D6\u8868\u5B57\u6BB5V8\u4E8B\u4EF6: ${t}...`);let c=await o.get(H.GET_FIELD_LIST,{osClient:e.osClient,tableName:t},e.apiBaseUrl,e);if(c.Code!==1){A.error(`Microi: \u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 - ${c.Msg}`);return}let l=c.Data.List||[],g=["V8Code","KeyupV8Code","V8TmpEngineTable","V8TmpEngineForm"],d=0,u=0;for(let p of l){let m=q(p.Label?`${p.Label}\uFF08${p.Name}\uFF09`:p.Name),f=E.join(n,wt,m);for(let y of g){let S=(p[y]||"").toString(),h=Rn[y]||y,C=q(`${h}\uFF08${y}\uFF09`)+".js",w=E.join(f,C),b=`${t}__${p.Name}__${y}`;if(!S.trim()){u++,T.existsSync(w)&&T.unlinkSync(w),delete a.fields[b];continue}pe(f),T.writeFileSync(w,S,"utf-8");let v=new Date(p.UpdateTime);isNaN(v.getTime())||T.utimesSync(w,v,v),a.fields[b]={fieldId:p.Id,tableId:p.TableId,tableName:t,fieldName:p.Name,fieldLabel:p.Label||"",v8Key:y,updateTime:p.UpdateTime,filePath:E.relative(i.getWorkspaceRoot(),w)},d++}}this.saveMeta(a,r),A.info(`Microi: \u5DF2\u62C9\u53D6 ${t} \u7684 ${d} \u4E2A\u5B57\u6BB5V8\u4E8B\u4EF6\u6587\u4EF6${u>0?`\uFF08\u8DF3\u8FC7 ${u} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)}async pullFieldsForProfile(e){let t=I.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u5168\u91CF\u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6 [${e.label||r}]...`),await he.withProgress({location:Qe.Notification,title:`Microi: \u62C9\u53D6\u5B57\u6BB5V8\u4E8B\u4EF6 [${e.label||r}]`,cancellable:!1},async o=>{o.report({message:"\u83B7\u53D6\u8868\u5217\u8868..."});let a=await n.get(H.GET_DB_SCHEMA,{osClient:i},r,e);if(a.Code!==1)throw new Error(`\u83B7\u53D6\u8868\u5217\u8868\u5931\u8D25: ${a.Msg||"Code="+a.Code}`);let c=a.Data.Tables||[],g=await we.getInstance().getSysConfig(r,i),d=g?.SysShortTitle||"",u=g?.SysTitle||"",p=d||u||e.label||"",m=t.buildServerDirName(p,r),f=this.loadMeta(m);f.fields||(f.fields={});let S=t.getProfiles().find(N=>N.apiBaseUrl===e.apiBaseUrl&&N.osClient===e.osClient)||e;if(!S.osClientType||!S.osClientNetwork)throw new Error("\u7F3A\u5C11 OsClientType/OsClientNetwork\uFF0C\u8BF7\u5148\u62C9\u53D6\u63A5\u53E3\u5F15\u64CE");let h=t.buildOsClientDirName(i,S.osClientType,S.osClientNetwork),C=t.getSyncRootDir(),w=["V8Code","KeyupV8Code","V8TmpEngineTable","V8TmpEngineForm"],b=0,v=0,k=0,V=new Set,Y=new Set;for(let N of c){k++,o.report({message:`[${k}/${c.length}] ${N.Name}`});let R=await n.get(H.GET_FIELD_LIST,{osClient:i,tableId:N.Id},r,e);if(R.Code!==1){Y.add(N.Name.toLowerCase()),this.log(` \u8DF3\u8FC7\u8868 ${N.Name}: ${R.Msg}`);continue}let $=R.Data.List||[],M=q(N.Description?`${N.Description}\uFF08${N.Name}\uFF09`:N.Name);for(let P of $)for(let x of w){let J=(P[x]||"").toString();if(!J.trim()){v++;continue}let X=q(P.Label?`${P.Label}\uFF08${P.Name}\uFF09`:P.Name),ge=Rn[x]||x,me=q(`${ge}\uFF08${x}\uFF09`)+".js",ne=E.join(C,m,h,Oe,M,wt,X);pe(ne);let ye=E.join(ne,me);T.writeFileSync(ye,J,"utf-8");let de=new Date(P.UpdateTime);isNaN(de.getTime())||T.utimesSync(ye,de,de);let F=`${N.Name}__${P.Name}__${x}`;V.add(F),f.fields[F]={fieldId:P.Id,tableId:P.TableId,tableName:N.Name,fieldName:P.Name,fieldLabel:P.Label||"",v8Key:x,updateTime:P.UpdateTime,filePath:E.relative(t.getWorkspaceRoot(),ye)},b++}}for(let[N,R]of Object.entries(f.fields)){if(V.has(N)||Y.has(R.tableName.toLowerCase()))continue;let $=this.getWorkspaceFilePath(R.filePath);$&&this.backupAndDeleteSyncFile($,m,"remote-deleted-field-event"),delete f.fields[N]}this.saveMeta(f,m),this.log(`\u5B57\u6BB5V8\u4E8B\u4EF6\u62C9\u53D6\u5B8C\u6210: ${b} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u7A7A\u4EE3\u7801 ${v} \u9879`),A.info(`Microi: \u6210\u529F\u62C9\u53D6 ${b} \u4E2A\u5B57\u6BB5V8\u4E8B\u4EF6${v>0?`\uFF08\u8DF3\u8FC7 ${v} \u4E2A\u7A7A\u4EE3\u7801\uFF09`:""}`)})}async pushFieldFile(e,t,n){let r=j.getInstance(),i=Ae(T.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u5B57\u6BB5V8\u4E8B\u4EF6: ${t.tableName}/${t.fieldName}/${t.v8Key}...`);try{let o=await r.post(H.UPDATE_FIELD,{OsClient:t.osClient,TableName:t.tableName,Name:t.fieldName,[t.v8Key]:i},void 0,n?.apiBaseUrl,n);if(o.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.tableName}/${t.fieldName}/${t.v8Key}`);let a=this.loadMeta(t.serverDir),c=`${t.tableName}__${t.fieldName}__${t.v8Key}`;a.fields||(a.fields={});let l=o.Data?.UpdateTime||Ee();return i.trim()?a.fields[c]={fieldId:a.fields[c]?.fieldId||"",tableId:a.fields[c]?.tableId||"",tableName:t.tableName,fieldName:t.fieldName,fieldLabel:a.fields[c]?.fieldLabel||"",v8Key:t.v8Key,updateTime:l,filePath:E.relative(I.getInstance().getWorkspaceRoot(),e)}:delete a.fields[c],this.saveMeta(a,t.serverDir),i.trim()?this.touchSyncedFile(e,l):T.existsSync(e)&&T.unlinkSync(e),!0}return this.log(`\u63A8\u9001\u5931\u8D25: ${o.Msg}`),A.error(`Microi: \u63A8\u9001\u5B57\u6BB5V8\u4E8B\u4EF6\u5931\u8D25 - ${o.Msg}`),!1}catch(o){let a=o instanceof Error?o.message:String(o);return this.log(`\u63A8\u9001\u5F02\u5E38: ${a}`),A.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${a}`),!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=E.relative(n,e).split(E.sep);if(r.length<4||r[2]!==Ke){A.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){A.error(`Microi: \u672A\u627E\u5230\u4E0E\u76EE\u5F55 "${r[0]}" \u5339\u914D\u7684\u670D\u52A1\u5668\u8FDE\u63A5`);return}let o=this.extractTrailingKey(E.basename(e));await this.pullMenuButtonsForProfile(i,o,r[0],r[1],e)}async pullMenuButtonsForProfile(e,t,n,r,i){let o=I.getInstance(),a=j.getInstance(),c=e.apiBaseUrl,l=e.osClient;this.log(`\u5F00\u59CB\u62C9\u53D6\u6A21\u5757 Join/Where \u4E0E\u6309\u94AE V8 \u4EE3\u7801 [${e.label||c}]...`),await he.withProgress({location:Qe.Notification,title:`Microi: \u62C9\u53D6\u6A21\u5757\u4EE3\u7801 [${e.label||c}]`,cancellable:!1},async g=>{let d=await a.get(H.LIST_MODULES,{osClient:l},c,e);if(d.Code!==1)throw new Error(`\u83B7\u53D6\u6A21\u5757\u5217\u8868\u5931\u8D25: ${d.Msg}`);let u=d.Data.List||[],m=await we.getInstance().getSysConfig(c,l),f=m?.SysShortTitle||"",y=m?.SysTitle||"",S=f||y||e.label||"",h=n||o.buildServerDirName(S,c),C=this.loadMeta(h);C.menus||(C.menus={}),C.menuButtons||(C.menuButtons={}),C.menuScripts||(C.menuScripts={});let b=o.getProfiles().find(F=>F.apiBaseUrl===e.apiBaseUrl&&F.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");let v=r||o.buildOsClientDirName(l,b.osClientType,b.osClientNetwork),k=o.getSyncRootDir(),V=E.join(k,h,v,Ke),Y=Object.keys(tt),N=Object.keys(Tt),R=0,$=0,M=0,P=0,x=0,J=new Map(u.map(F=>[F.Id,F])),X=new Map,ge=F=>F||"";for(let F of u){let fe=ge(F.ParentId);X.has(fe)||X.set(fe,[]),X.get(fe).push(F)}let me=F=>F.sort((fe,oe)=>{let Se=typeof fe.Sort=="number"?fe.Sort:0,yt=typeof oe.Sort=="number"?oe.Sort:0;return Se!==yt?Se-yt:String(fe.Name||fe.Label||"").localeCompare(String(oe.Name||oe.Label||""))}),ne=t?J.get(t)?[J.get(t)]:[]:me(u.filter(F=>!F.ParentId||!J.has(F.ParentId)));if(t&&ne.length===0)throw new Error(`\u627E\u4E0D\u5230\u6A21\u5757 Id=${t}`);let ye=t?i||E.join(V,q(`${ne[0].Label||ne[0].Name||ne[0].Id}\uFF08${ne[0].Id}\uFF09`)):V;if(this.backupExistingTree(ye,h,t?"module-subtree":"module-engine"),!t)C.menus={},C.menuButtons={},C.menuScripts={};else{let F=new Set,fe=oe=>{if(!F.has(oe)){F.add(oe);for(let Se of X.get(oe)||[])fe(Se.Id)}};fe(t);for(let oe of F)delete C.menus[oe];for(let[oe,Se]of Object.entries(C.menuButtons))F.has(Se.moduleId)&&delete C.menuButtons[oe];for(let[oe,Se]of Object.entries(C.menuScripts))F.has(Se.moduleId)&&delete C.menuScripts[oe]}let de=async(F,fe)=>{P++,g.report({message:`[${P}/${u.length}] ${F.Name||F.Label}`});let oe=F.Label||F.Name||F.Id,Se=E.join(fe,q(`${oe}\uFF08${F.Id}\uFF09`));pe(Se);let yt=me(X.get(F.Id)||[]);if(yt.length>0){for(let ue of yt)await de(ue,Se);return}let vn=await a.get(H.GET_MODULE,{osClient:l,moduleId:F.Id},c,e);if(vn.Code!==1){this.log(` \u8DF3\u8FC7\u6A21\u5757 ${F.Name}: ${vn.Msg}`);return}let En=vn.Data,Ue=String(En.UpdateTime||Ee()),ur={};for(let ue of N){let jt=String(En[ue]||""),bn=Tt[ue]||ue,je=E.join(Se,q(`${bn}\uFF08${ue}\uFF09`)+".js");T.writeFileSync(je,jt,"utf-8"),this.touchSyncedFile(je,Ue),C.menuScripts[this.getMenuScriptMetaKey(F.Id,ue)]={moduleId:F.Id,moduleName:oe,scriptField:ue,codeHash:this.sourceHash(jt),updateTime:Ue,filePath:E.relative(o.getWorkspaceRoot(),je)},M++}for(let ue of Y){let jt=tt[ue]||ue,bn=q(`${jt}\uFF08${ue}\uFF09`),je=E.join(Se,bn);pe(je),$++;let Kt=En[ue],ze=[];if(Kt)try{ze=typeof Kt=="string"?JSON.parse(Kt):Kt,Array.isArray(ze)||(ze=[])}catch{this.log(` \u6309\u94AE JSON \u89E3\u6790\u5931\u8D25 ${F.Name}.${ue}`),ze=[]}let Hs=[...ze].sort((Je,De)=>String(Je.Id||"").localeCompare(String(De.Id||"")));ur[ue]=require("crypto").createHash("sha1").update(JSON.stringify(Hs)).digest("hex");for(let Je of ze){let De=String(Je.Id||""),Ht=String(Je.Name||De||"Unknown");if(!De)continue;let gr=String(Je.V8Code||""),kn=E.join(je,q(`${Ht}\uFF08${De}\uFF09`)+".js");C.menuButtons[this.getMenuButtonMetaKey(F.Id,ue,De,"V8Code")]={moduleId:F.Id,moduleName:oe,btnField:ue,btnId:De,btnName:Ht,v8SubField:"V8Code",updateTime:Ue,filePath:E.relative(o.getWorkspaceRoot(),kn)},gr.trim()?(T.writeFileSync(kn,gr,"utf-8"),this.touchSyncedFile(kn,Ue),R++):x++;let pr=String(Je.V8CodeShow||"");if(pr.trim()){let Pn=E.join(je,q(`${Ht}_\u663E\u9690\u5224\u65AD\uFF08${De}\uFF09`)+".js");T.writeFileSync(Pn,pr,"utf-8"),this.touchSyncedFile(Pn,Ue),C.menuButtons[this.getMenuButtonMetaKey(F.Id,ue,De,"V8CodeShow")]={moduleId:F.Id,moduleName:oe,btnField:ue,btnId:De,btnName:Ht,v8SubField:"V8CodeShow",updateTime:Ue,filePath:E.relative(o.getWorkspaceRoot(),Pn)},R++}else x++}}C.menus[F.Id]={moduleId:F.Id,moduleName:oe,updateTime:Ue,buttonHashes:ur}};pe(V);for(let F of ne)await de(F,V);this.saveMeta(C,h),this.log(`\u6A21\u5757\u4EE3\u7801\u62C9\u53D6\u5B8C\u6210: ${R} \u4E2A\u6309\u94AEV8\u6587\u4EF6\uFF0C${M} \u4E2A Join/Where \u6587\u4EF6\uFF0C${$} \u4E2A\u6309\u94AE\u76EE\u5F55\uFF0C\u8DF3\u8FC7\u7A7A\u6309\u94AE\u4EE3\u7801 ${x} \u9879`),A.info(`Microi: \u6210\u529F\u62C9\u53D6 ${R} \u4E2A\u6309\u94AEV8\u6587\u4EF6\u548C ${M} \u4E2A Join/Where \u6587\u4EF6${x>0?`\uFF08\u8DF3\u8FC7 ${x} \u4E2A\u7A7A\u6309\u94AE\u4EE3\u7801\uFF09`:""}\uFF0C\u5DF2\u751F\u6210 ${$} \u4E2A\u6309\u94AE\u76EE\u5F55`)})}backupExistingTree(e,t,n){if(!T.existsSync(e))return;let i=I.getInstance().getSyncRootDir();this.ensureSyncGitExcludes(i);let o=E.join(i,".backups",n,this.shortBackupKey(t));pe(o);let a=E.join(o,`${Date.now()}-${this.shortBackupKey(E.basename(e))}`);T.renameSync(e,a)}backupAndDeleteSyncFile(e,t,n){if(!T.existsSync(e))return;let r=I.getInstance(),i=r.getSyncRootDir();this.ensureSyncGitExcludes(i);let o=r.getWorkspaceRoot()||i,c=E.relative(o,e).split(E.sep).filter(d=>d&&d!=="..").map(q),l=E.join(i,".backups",n,this.shortBackupKey(t),String(Date.now())),g=E.join(l,...c.length?c:[q(E.basename(e))]);pe(E.dirname(g)),T.copyFileSync(e,g),T.unlinkSync(e)}async pushMenuScriptFile(e,t,n){let r=j.getInstance(),i=Ae(T.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u6A21\u5757\u811A\u672C: ${t.moduleId}.${t.scriptField}...`);try{let o=await r.get(H.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n);if(o.Code!==1||!o.Data)return A.error(`Microi: \u63A8\u9001\u5931\u8D25 - \u62C9\u53D6\u6A21\u5757\u5931\u8D25 ${o.Msg}`),!1;let a=o.Data,c=String(a[t.scriptField]||""),l=I.getInstance(),g=l.getSyncRootDir();this.ensureSyncGitExcludes(g);let d=E.join(g,".backups","menu-script",this.shortBackupKey(t.serverDir),t.moduleId);pe(d),T.writeFileSync(E.join(d,`${t.scriptField}-${Date.now()}.js`),c,"utf-8");let u={OsClient:t.osClient,ModuleId:t.moduleId,[t.scriptField]:i},p=await r.post(H.UPDATE_MODULE,u,void 0,n?.apiBaseUrl,n);if(p.Code!==1)return A.error(`Microi: \u63A8\u9001\u6A21\u5757 ${t.scriptField} \u5931\u8D25 - ${p.Msg}`),!1;let m=await r.get(H.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n),f=m.Data;if(m.Code!==1||!f||this.normalizeCode(String(f[t.scriptField]||""))!==this.normalizeCode(i))return A.error(`Microi: ${t.scriptField} \u63A5\u53E3\u8FD4\u56DE\u6210\u529F\uFF0C\u4F46\u8FDC\u7AEF\u56DE\u8BFB\u4E0D\u4E00\u81F4\uFF1B\u5DF2\u4FDD\u7559\u672C\u5730\u4FEE\u6539\u548C\u8FDC\u7AEF\u5907\u4EFD`),!1;let y=String(f.UpdateTime||p.Data?.UpdateTime||Ee()),S=this.loadMeta(t.serverDir);return S.menuScripts||(S.menuScripts={}),S.menuScripts[this.getMenuScriptMetaKey(t.moduleId,t.scriptField)]={moduleId:t.moduleId,moduleName:String(f.Label||f.Name||a.Label||a.Name||t.moduleId),scriptField:t.scriptField,codeHash:this.sourceHash(i),updateTime:y,filePath:E.relative(l.getWorkspaceRoot(),e)},S.menus||(S.menus={}),S.menus[t.moduleId]={moduleId:t.moduleId,moduleName:String(f.Label||f.Name||a.Label||a.Name||t.moduleId),updateTime:y,buttonHashes:S.menus[t.moduleId]?.buttonHashes||{}},this.saveMeta(S,t.serverDir),this.touchSyncedFile(e,y),this.log(`\u63A8\u9001\u5E76\u56DE\u8BFB\u6210\u529F: ${t.moduleId}.${t.scriptField}`),!0}catch(o){let a=o instanceof Error?o.message:String(o);return this.log(`\u63A8\u9001\u6A21\u5757\u811A\u672C\u5F02\u5E38: ${a}`),A.error(`Microi: \u63A8\u9001\u6A21\u5757\u811A\u672C\u5F02\u5E38 - ${a}`),!1}}async pushMenuButtonFile(e,t,n){let r=j.getInstance(),i=Ae(T.readFileSync(e,"utf-8"));this.log(`\u63A8\u9001\u6309\u94AEV8\u4EE3\u7801: ${t.moduleId}.${t.btnField}.${t.btnId}.${t.v8SubField}...`);try{let o=await r.get(H.GET_MODULE,{osClient:t.osClient,moduleId:t.moduleId},n?.apiBaseUrl,n);if(o.Code!==1)return A.error(`Microi: \u63A8\u9001\u5931\u8D25 - \u62C9\u53D6\u6A21\u5757\u5931\u8D25 ${o.Msg}`),!1;let a=o.Data,c=[],l=a[t.btnField];if(l)try{c=typeof l=="string"?JSON.parse(l):l,Array.isArray(c)||(c=[])}catch{return A.error("Microi: \u63A8\u9001\u5931\u8D25 - \u6309\u94AE JSON \u89E3\u6790\u5931\u8D25"),!1}let d=I.getInstance().getSyncRootDir();this.ensureSyncGitExcludes(d);let u=E.join(d,".backups","menu-button-json",this.shortBackupKey(t.serverDir),t.moduleId);pe(u);let p=E.join(u,`${t.btnField}-${Date.now()}.json`);T.writeFileSync(p,JSON.stringify(c,null,2),"utf-8");let m=c.find(S=>String(S.Id||"")===t.btnId);if(!m){let S=c.map(h=>Number(h.Sort||0)).filter(h=>!isNaN(h));m={Id:t.btnId,Name:t.btnName||t.btnId,Sort:S.length>0?Math.max(...S)+1:c.length+1,IsVisible:!0,ShowRow:t.btnField==="MoreBtns"},c.push(m)}m[t.v8SubField]=i;let f={OsClient:t.osClient,ModuleId:t.moduleId};f[t.btnField]=JSON.stringify(c);let y=await r.post(H.UPDATE_MODULE,f,void 0,n?.apiBaseUrl,n);if(y.Code===1){this.log(`\u63A8\u9001\u6210\u529F: ${t.moduleId}.${t.btnField}.${t.btnId}.${t.v8SubField}`);let S=y.Data?.UpdateTime||Ee(),h=this.loadMeta(t.serverDir);h.menuButtons||(h.menuButtons={});let C=this.getMenuButtonMetaKey(t.moduleId,t.btnField,t.btnId,t.v8SubField);return i.trim()?h.menuButtons[C]={moduleId:t.moduleId,moduleName:String(a.Name||a.Label||t.moduleId),btnField:t.btnField,btnId:t.btnId,btnName:String(m.Name||t.btnName||t.btnId),v8SubField:t.v8SubField,updateTime:S,filePath:E.relative(I.getInstance().getWorkspaceRoot(),e)}:delete h.menuButtons[C],h.menus||(h.menus={}),h.menus[t.moduleId]={moduleId:t.moduleId,moduleName:String(a.Name||a.Label||t.moduleId),updateTime:S,buttonHashes:h.menus[t.moduleId]?.buttonHashes||{}},this.saveMeta(h,t.serverDir),i.trim()?this.touchSyncedFile(e,S):T.existsSync(e)&&T.unlinkSync(e),!0}return A.error(`Microi: \u63A8\u9001\u6309\u94AE\u5931\u8D25 - ${y.Msg}`),!1}catch(o){let a=o instanceof Error?o.message:String(o);return this.log(`\u63A8\u9001\u5F02\u5E38: ${a}`),A.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${a}`),!1}}async pushWorkflowNodeFile(e,t,n){let r=j.getInstance(),i=T.readFileSync(e,"utf-8"),o=Ae(i);this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8: ${t.flowDesignId}/${t.nodeId}/${t.eventType}...`);try{let a="",c="";try{let p=await r.post(H.GET_WORKFLOW_V8_EVENT_CODE,{OsClient:t.osClient,FlowDesignId:t.flowDesignId,NodeId:t.nodeId,EventType:t.eventType},void 0,n?.apiBaseUrl,n);p.Code===1&&p.Data&&(a=p.Data.V8Code||p.Data.Code||"",c=p.Data.Version||"")}catch{a="",c=""}let l=!o.trim(),g=l?{code:"",version:c,changeHistory:""}:Nt({kind:"Workflow",key:`${t.flowDesignId}/${t.nodeId}`,eventType:t.eventType,currentCode:o,remoteCode:a,remoteVersion:c,changeSummary:`\u901A\u8FC7 VS Code \u63A8\u9001\u6D41\u7A0B\u8282\u70B9 V8 ${t.flowDesignId}/${t.nodeId}/${t.eventType}`}),d={OsClient:t.osClient,FlowDesignId:t.flowDesignId,NodeId:t.nodeId,EventType:t.eventType};l?d.V8Code="":(d.V8CodeBase64=Buffer.from(g.code,"utf8").toString("base64"),d.Version=g.version,d.ChangeHistory=g.changeHistory);let u=await r.post(H.UPDATE_WORKFLOW_V8_EVENT_CODE,d,void 0,n?.apiBaseUrl,n);if(u.Code===1){let p=u.Data?.UpdateTime||Ee(),m=this.loadMeta(t.serverDir);m.workflowNodeEvents||(m.workflowNodeEvents={});let f=`${t.flowDesignId}__${t.nodeId}__${t.eventType}`;return l?delete m.workflowNodeEvents[f]:m.workflowNodeEvents[f]={flowDesignId:t.flowDesignId,flowName:m.workflowNodeEvents[f]?.flowName||t.flowDesignId,nodeId:t.nodeId,nodeName:m.workflowNodeEvents[f]?.nodeName||t.nodeId,eventType:t.eventType,updateTime:p,filePath:E.relative(I.getInstance().getWorkspaceRoot(),e)},this.saveMeta(m,t.serverDir),l?T.existsSync(e)&&T.unlinkSync(e):(T.writeFileSync(e,g.code,"utf-8"),this.touchSyncedFile(e,p)),this.log(`\u63A8\u9001\u6210\u529F: ${t.flowDesignId}/${t.nodeId}/${t.eventType}`),!0}return this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5931\u8D25: ${u.Msg}`),A.error(`Microi: \u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5931\u8D25 - ${u.Msg}`),!1}catch(a){let c=a instanceof Error?a.message:String(a);return this.log(`\u63A8\u9001\u6D41\u7A0B\u8282\u70B9V8\u5F02\u5E38: ${c}`),A.error(`Microi: \u63A8\u9001\u5F02\u5E38 - ${c}`),!1}}async pullDbSchema(e){let t=I.getInstance(),n=j.getInstance();if(!e){let r=t.getProfiles();if(r.length===0){A.warn("Microi: \u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u670D\u52A1\u5668");return}for(let i of r)try{await this.pullDbSchemaForProfile(i)}catch(o){let a=o instanceof Error?o.message:String(o);this.log(`\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5931\u8D25 [${i.label||i.apiBaseUrl}]: ${a}`)}return}await this.pullDbSchemaForProfile(e)}async pullDbSchemaForProfile(e){let t=I.getInstance(),n=j.getInstance(),r=e.apiBaseUrl,i=e.osClient;this.log(`\u5F00\u59CB\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784 [${e.label||r}]...`);let o=await n.get(H.GET_DB_SCHEMA,{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\u6570\u636E\u5E93\u7ED3\u6784\u5931\u8D25: ${o.Msg||"Code="+o.Code}${k}`)}let a=t.getSyncRootDir(),l=await we.getInstance().getSysConfig(r,i),g=l?.SysShortTitle||"",d=l?.SysTitle||"",u=g||d||l?.CompanyName||e.label||"";u&&(u!==e.label||g!==e.sysShortTitle||d!==e.sysTitle)&&await t.addProfile({...e,label:u,sysShortTitle:g,sysTitle:d});let p=t.buildServerDirName(u,r),f=t.getProfiles().find(k=>k.apiBaseUrl===e.apiBaseUrl&&k.osClient===e.osClient)||e,y=t.buildOsClientDirName(i,f.osClientType,f.osClientNetwork),S=E.join(a,p,y);pe(S);let h=E.join(S,nt);T.writeFileSync(h,JSON.stringify(o.Data,null,2),"utf-8");let C=E.join(S,He),w=this.formatDbSchemaMarkdown(o.Data,p,y);w&&T.writeFileSync(C,w,"utf-8");let b=o.Data.Tables?.length||0,v=u||e.label||r;this.log(`[${v}] \u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\u5B8C\u6210: ${b} \u5F20\u8868`),A.info(`Microi: [${v}] \u6210\u529F\u62C9\u53D6\u6570\u636E\u5E93\u7ED3\u6784\uFF08${b} \u5F20\u8868\uFF09`)}formatDbSchemaMarkdown(e,t,n){let r=(e.Tables||[]).filter(c=>c.Name);if(!r.length)return"";let i=r.reduce((c,l)=>{let g=l._Fields||l.Fields||[];return c+g.length},0),o=e.Menus?.length||0,a=[];a.push(`# \u6570\u636E\u5E93\u7ED3\u6784 \u2014 ${t}/${n}
47
47
  `),a.push("> \u6B64\u6587\u4EF6\u7531 Microi\u543E\u7801 VS Code \u63D2\u4EF6\u81EA\u52A8\u751F\u6210\uFF0C\u4F9B AI \u7F16\u5199 V8.FormEngine / V8.Db \u4EE3\u7801\u65F6\u53C2\u8003\u3002"),a.push(`> \u5171 ${r.length} \u5F20\u8868\uFF0C${i} \u4E2A\u5B57\u6BB5\uFF0C${o} \u4E2A\u83DC\u5355\u3002
48
48
  `);for(let c of r){let l=c.Description?` \u2014 ${c.Description}`:"";a.push(`## ${c.Name}${l}
49
49
  `);let g=c._Fields||c.Fields||[];if(!g.length){a.push(`_\u6682\u65E0\u5B57\u6BB5\u4FE1\u606F._
50
50
  `);continue}a.push("| \u5B57\u6BB5 | \u6807\u7B7E/\u8BF4\u660E | \u7C7B\u578B | \u7EC4\u4EF6 | \u5FC5\u586B | \u5173\u8054 |"),a.push("|------|-----------|------|------|------|------|");for(let d of g){let u=d.Label||d.Description||"",p=d.Type||d.FieldType||"",m=d.Required===!0||d.NotEmpty===1?"\u662F":"",f=d.ChildTableId||d.ChildSysMenuId||"";a.push(`| ${d.Name} | ${u} | ${p} | ${d.Component||""} | ${m} | ${f} |`)}a.push("")}return a.join(`
51
- `)}dispose(){}};var D=B(require("fs")),_=B(require("path")),ts=B(require("crypto")),Qn=require("child_process");var hi=`/**
51
+ `)}dispose(){}};var D=O(require("fs")),_=O(require("path")),rs=O(require("crypto")),Yn=require("child_process");var Ti=`/**
52
52
  * Microi V8\u5F15\u64CE API \u7C7B\u578B\u5B9A\u4E49
53
53
  * \u6B64\u6587\u4EF6\u7531 Microi\u543E\u7801 VS Code \u63D2\u4EF6\u81EA\u52A8\u751F\u6210\uFF0C\u8BF7\u52FF\u624B\u52A8\u4FEE\u6539
54
54
  * \u6587\u6863\u53C2\u8003\uFF1Aapi-engine.md, form-engine.md, v8-server.md, where.md
@@ -1332,20 +1332,20 @@ declare function DateAdd(date: any, unit: string, amount: number, format?: strin
1332
1332
  declare function JSON_Encode(obj: any): string;
1333
1333
  /** JSON \u53CD\u5E8F\u5217\u5316 */
1334
1334
  declare function JSON_Decode(json: string): any;
1335
- `,Yr="microi.skills",Gn=".microi-skills-manifest.json",yi="microi-skills.meta.json",sn=".microi-ai-docs-manifest.json",Si="microi-ai-doc-guard:",Xr=[".codebuddy/skills/microi/SKILL.md",".qoder/skills/microi/SKILL.md",".agents/skills/microi/SKILL.md",".comate/skills/microi/SKILL.md"],Zr=".codebuddy/rules/microi.md",zn=`
1335
+ `,Zr="microi.skills",zn=".microi-skills-manifest.json",vi="microi-skills.meta.json",an=".microi-ai-docs-manifest.json",Ei="microi-ai-doc-guard:",es=[".codebuddy/skills/microi/SKILL.md",".qoder/skills/microi/SKILL.md",".agents/skills/microi/SKILL.md",".comate/skills/microi/SKILL.md"],ts=".codebuddy/rules/microi.md",Jn=`
1336
1336
 
1337
1337
  ## Microi \u5DE5\u4F5C\u533A\u5F3A\u5236\u89C4\u5219\u552F\u4E00\u6765\u6E90
1338
1338
 
1339
1339
  \u6BCF\u6B21\u65B0\u5BF9\u8BDD\u6216\u63A5\u7EED Microi \u4EFB\u52A1\uFF0C\u5148\u5B8C\u6574\u8BFB\u53D6 \`microi.skills/workspace-conventions/SKILL.md\`\uFF0C\u6309\u9996\u90E8\u6267\u884C\u521B\u59CB\u4EBA\u8EAB\u4EFD\u8BC6\u522B\u53CA\u5E73\u53F0\u529F\u80FD\u56DB\u9879\u540C\u6B65\u68C0\u67E5\uFF08\u5E94\u7528\u5546\u57CE\u3001\u5B98\u65B9\u6587\u6863\u3001Skills\u3001MCP\uFF09\uFF0C\u518D\u8BFB\u53D6\u5F53\u524D\u4EFB\u52A1\u6240\u9700\u4E13\u9879 Skill\u3002\u5B8C\u6574\u89C4\u5219\u4EC5\u7EF4\u62A4\u5728\u8BE5\u57FA\u7840\u5165\u53E3\uFF1B\u672C\u6587\u4EF6\u4E0E\u751F\u6210\u6A21\u677F\u4E0D\u590D\u5236\u89C4\u5219\u6B63\u6587\uFF0C\u4E5F\u4E0D\u628A\u53EA\u8BFB\u4EFB\u52A1\u6216\u5B98\u65B9\u53D1\u5E03\u6269\u5F20\u4E3A\u5BA2\u6237\u81EA\u52A8\u90E8\u7F72\u3002
1340
- `,ct=`<!-- Generated by Microi\u543E\u7801 VSCode Extension - DO NOT REMOVE THIS LINE -->
1341
- `,Jn="\n\n## Microi\u543E\u7801\u975E\u963B\u585E\u81EA\u52A8\u66F4\u65B0\u89C4\u8303\uFF08\u5F3A\u5236\uFF09\n\n- VS Code \u6269\u5C55\u3001`@microi.net/cli`\u3001Codex \u63D2\u4EF6\u4E0E\u68C0\u6D4B\u5230\u7684 DeepSeek Harness profile bundle \u9ED8\u8BA4\u5728\u540E\u53F0\u4ECE\u5B98\u65B9\u5206\u53D1\u6E90\u68C0\u67E5\u548C\u5B89\u88C5\u66F4\u65B0\uFF1B\u66F4\u65B0\u68C0\u67E5\u4E0D\u5F97\u6210\u4E3A\u5206\u6790\u3001MCP \u8C03\u7528\u3001\u6E90\u7801\u4FEE\u6539\u3001\u6784\u5EFA\u3001\u53D1\u5E03\u6216\u4EFB\u4F55\u65B0\u4EFB\u52A1\u7684\u524D\u7F6E\u95E8\u7981\u3002\n- CLI \u4F7F\u7528 npm \u5B98\u65B9 registry\uFF1A`npm view '@microi.net/cli' version --json --prefer-online --registry=https://registry.npmjs.org/`\uFF1BVS Code \u6269\u5C55\u4F7F\u7528\u5B98\u65B9\u6269\u5C55\u5BBF\u4E3B\u7684\u5B89\u88C5/\u81EA\u52A8\u66F4\u65B0\u80FD\u529B\u3002\u7981\u6B62\u7528\u7B2C\u4E09\u65B9 registry \u6216\u4E0D\u660E\u955C\u50CF\u5192\u5145\u5B98\u65B9\u66F4\u65B0\u3002\n- \u81EA\u52A8\u66F4\u65B0\u7531 `microi update --background --workspace \"<\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84>\" --json` \u6295\u9012\u3002\u5B83\u4F1A\u5728\u540E\u53F0\u5347\u7EA7\u5168\u5C40 CLI\u3001\u66F4\u65B0 Codex \u63D2\u4EF6\u4E0E DeepSeek Harness bundle\uFF1B\u4EC5\u5F53\u5DE5\u4F5C\u533A\u5DF2\u6709\u6709\u6548 Microi \u670D\u52A1\u5668\u8FDE\u63A5\u65F6\uFF0C\u624D\u5E42\u7B49\u6267\u884C `microi ai init` \u4E0E `microi doctor`\uFF0C\u968F\u540E\u6267\u884C `microi codex status` \u4E0E `microi dsh status`\uFF1B\u672A\u68C0\u6D4B\u5230 DSH \u65F6\u5B89\u9759\u8DF3\u8FC7\u3002`codex install --yes` \u4E2D\u7684 `--yes` \u53EA\u4E3A\u517C\u5BB9\u65E7\u811A\u672C\uFF0C\u4E0D\u518D\u4EE3\u8868\u5DE5\u4F5C\u6388\u6743\u95E8\u69DB\u3002\n- \u5F53\u524D\u8FD0\u884C\u4E2D\u7684\u6269\u5C55\u3001CLI\u3001Codex Router\u3001DSH \u4F1A\u8BDD\u548C MCP \u7EE7\u7EED\u4F7F\u7528\u5DF2\u52A0\u8F7D\u7248\u672C\uFF1B\u4E0D\u5F97\u4E3A\u4E86\u5347\u7EA7\u6740\u8FDB\u7A0B\u3001\u5F3A\u5236\u91CD\u8F7D\u7A97\u53E3\u3001\u7EC8\u6B62\u5BF9\u8BDD\u6216\u6682\u505C\u7528\u6237\u4EFB\u52A1\u3002\u65B0\u7248\u672C\u53EA\u5728\u540E\u7EED\u65B0\u8FDB\u7A0B\u6216\u5BBF\u4E3B\u81EA\u7136\u91CD\u542F\u65F6\u63A5\u7BA1\u3002\n- registry \u4E0D\u53EF\u7528\u3001\u6743\u9650\u4E0D\u8DB3\u3001\u6587\u4EF6\u88AB\u8FD0\u884C\u4E2D\u4EFB\u52A1\u5360\u7528\u3001\u5B89\u88C5\u5931\u8D25\u6216\u5BBF\u4E3B\u6682\u4E0D\u652F\u6301\u70ED\u66F4\u65B0\u65F6\uFF0C\u8BB0\u5F55\u53EF\u8BCA\u65AD\u72B6\u6001\u5E76\u5728\u540E\u53F0\u5EF6\u540E\u91CD\u8BD5\uFF1B\u53EF\u4EE5\u975E\u6A21\u6001\u63D0\u793A\u7528\u6237\u201C\u7ACB\u5373\u91CD\u8BD5/\u67E5\u770B\u65E5\u5FD7\u201D\uFF0C\u4F46\u65E0\u8BBA\u7528\u6237\u662F\u5426\u5904\u7406\uFF0C\u90FD\u5FC5\u987B\u5141\u8BB8\u5F53\u524D\u3001\u6B63\u5728\u8FDB\u884C\u548C\u65B0\u5EFA\u5DE5\u4F5C\u7EE7\u7EED\u3002\n",es="\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",Ci="\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",wi="\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",Ti='\n\n## JoinForm \u4E0E TableChild \u5173\u7CFB\u95E8\u7981\uFF08\u5F3A\u5236\uFF09\n\n- \u5148\u786E\u5B9A\u5173\u7CFB\u57FA\u6570\uFF1A`JoinForm` \u53EA\u5141\u8BB8 1:1/N:1\uFF0C\u76EE\u6807\u8868\u5FC5\u987B\u4E0E\u5F53\u524D\u8868\u4E0D\u540C\uFF0C`joinFieldName` \u5FC5\u987B\u662F\u5F53\u524D\u4E3B\u8868\u4E2D\u5DF2\u5B58\u5728\u4E14\u771F\u5B9E\u4FDD\u5B58\u76EE\u6807\u8BB0\u5F55 Id \u7684\u5B57\u6BB5\uFF1B\u7981\u6B62\u9ED8\u8BA4\u5199\u6210 `Name`\u3002\n- \u201C\u5B50\u8868\u3001\u660E\u7EC6\u3001\u6E05\u5355\u3001\u6761\u76EE\u3001\u884C\u9879\u76EE\u3001\u591A\u4E2A\u8BB0\u5F55\u201D\u9ED8\u8BA4\u662F 1:N\uFF0C\u5FC5\u987B\u4F7F\u7528 `TableChild`\u3002\u5728\u72EC\u7ACB\u5B50\u8868\u521B\u5EFA\u771F\u5B9E\u7236\u7EA7\u5916\u952E\u548C\u4EE5 `(OsClient, FK)` \u5F00\u5934\u7684\u7EC4\u5408\u7D22\u5F15\uFF0C\u5E76\u521B\u5EFA\u7ED1\u5B9A\u5B50\u8868\u4E14 `display=0\u3001appDisplay=0\u3001hasChild=0` \u7684\u9690\u85CF\u6A21\u5757\u3002\n- \u5B8C\u6574\u7CFB\u7EDF Manifest \u7684\u5173\u7CFB\u5B57\u6BB5\u5FC5\u987B\u5199\u53EF\u79FB\u690D `relation`\uFF1AJoinForm \u4F7F\u7528 `{cardinality:"N:1",targetTable,joinFieldName}`\uFF1BTableChild \u4F7F\u7528 `{cardinality:"1:N",targetTable,childForeignKey,childModule,primaryTableFieldName:"Id"}`\u3002\u7981\u6B62\u5728 Manifest \u4E2D\u7F16\u9020 `diy_table.Id` \u6216 `sys_menu.Id`\u3002\n- `microi_plan_system` / `microi_generate_system` \u4F1A\u5728\u4EFB\u4F55\u5199\u5165\u524D\u62D2\u7EDD\u81EA\u5173\u8054\u3001\u57FA\u6570/\u7EC4\u4EF6\u4E0D\u7B26\u3001\u7F3A\u5916\u952E\u3001\u7F3A\u9690\u85CF\u5B50\u83DC\u5355\u6216\u7F3A\u56DE\u67E5\u7D22\u5F15\uFF1B\u751F\u6210\u5668\u4F1A\u5728\u8868\u3001\u666E\u901A\u5B57\u6BB5\u548C\u83DC\u5355\u5C31\u7EEA\u540E\u624D\u89E3\u6790\u5F53\u524D\u79DF\u6237\u771F\u5B9E Id \u5E76\u5199\u5173\u7CFB\u5B57\u6BB5\u3002\u4E0D\u5F97\u6539\u7528\u5355\u5B57\u6BB5\u5DE5\u5177\u7ED5\u8FC7\uFF1B\u540E\u7AEF MCP \u8FB9\u754C\u4F1A\u518D\u6B21\u6821\u9A8C\u3002\n',vi="\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",Ei="\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",qn="\n\n## AI \u83DC\u5355\u6A21\u5757\u89C6\u89C9\u4EA4\u4ED8\u95E8\u7981\uFF08\u5F3A\u5236\uFF09\n\n- \u6BCF\u4E2A\u53EF\u89C1\u3001\u7ED1\u5B9A\u8868\u7684\u6A21\u5757\u90FD\u5FC5\u987B\u914D\u7F6E\u7D27\u51D1 Hero \u6807\u9898\u3001\u4E1A\u52A1\u526F\u6807\u9898\u548C 2-4 \u4E2A\u771F\u5B9E\u52A8\u6001\u6307\u6807\u3002\u6307\u6807\u4F18\u5148\u9009\u62E9\u91D1\u989D\u3001\u6570\u91CF\u3001\u4F59\u989D\u3001\u8FDB\u5EA6\u3001\u903E\u671F\u3001\u5F85\u5904\u7406\u7B49\u4E1A\u52A1\u805A\u5408\uFF1B\u6CA1\u6709\u5408\u9002\u6570\u503C\u5B57\u6BB5\u65F6\u4F7F\u7528\u771F\u5B9E `DataCount`\u3001`PageCount` \u6216\u771F\u5B9E\u72B6\u6001\u5206\u5E03\u515C\u5E95\u3002\u7981\u6B62\u968F\u673A\u6570\u3001\u56FA\u5B9A\u6F14\u793A\u6570\u3001\u4F2A\u7EDF\u8BA1\u6216\u53EA\u5199\u6BEB\u65E0\u4E1A\u52A1\u610F\u4E49\u7684\u603B\u6570\u3002\n- \u6BCF\u4E2A\u5217\u8868\u5B57\u6BB5\u90FD\u8981\u6309\u5B57\u6BB5\u8BED\u4E49\u8BBE\u7F6E\u5408\u7406 `TableWidth`\u3002PC \u590D\u5408\u5217\u5FC5\u987B\u7ED9\u8DB3 `MinWidth`\uFF0C\u7EC4\u7EC7\u4E3B\u5B57\u6BB5\u3001\u591A\u884C\u526F\u5B57\u6BB5\u3001\u53F3\u4FA7\u56FE\u6807/\u72B6\u6001\uFF0C\u5E76\u4ECE\u666E\u901A\u5217\u4E2D\u6392\u9664\u5DF2\u7ECF\u5C55\u793A\u7684\u91CD\u590D\u5B57\u6BB5\uFF0C\u540C\u65F6\u4FDD\u7559\u67E5\u8BE2\u4F9D\u8D56\u5B57\u6BB5\u3002\n- \u79FB\u52A8\u7AEF\u5361\u7247\u5E94\u6309\u771F\u5B9E\u4E1A\u52A1\u5B57\u6BB5\u8BBE\u8BA1\u56FE\u7247\u3001\u6807\u9898\u3001\u526F\u6807\u9898\u3001\u9876\u90E8\u6807\u7B7E\u3001\u53F3\u4FA7\u91D1\u989D/\u72B6\u6001\u3001\u5185\u5BB9\u3001Meta \u4E0E\u5E95\u90E8\u5B57\u6BB5\uFF1B\u540C\u4E00\u5B57\u6BB5\u4E0D\u5F97\u8DE8\u533A\u57DF\u91CD\u590D\u5806\u53E0\u3002\n- \u83DC\u5355\u52A8\u6001\u7EDF\u8BA1\u89D2\u6807\u53EA\u7528\u4E8E\u5C11\u6570\u9AD8\u4EF7\u503C\u5F85\u529E/\u5F02\u5E38/\u672A\u8BFB\u5165\u53E3\uFF1B\u9875\u9762\u591A Tab \u548C\u66F4\u591A V8 \u6309\u94AE\u6709\u771F\u5B9E\u4E1A\u52A1\u8BA1\u6570\u65F6\u4E5F\u5E94\u914D\u7F6E\u89D2\u6807\u3002\u6279\u91CF\u89D2\u6807\u5FC5\u987B\u907F\u514D N+1 \u67E5\u8BE2\u5E76\u63D0\u4F9B\u5B89\u5168\u964D\u7EA7\u3002\n- \u6A21\u5757\u8BBE\u8BA1\u5668\u56FA\u5B9A\u63D0\u4F9B\u201C\u6A21\u5757\u6807\u9898\u4E0E\u7EDF\u8BA1\u3001PC \u590D\u5408\u5217\u3001\u79FB\u52A8\u7AEF\u5361\u7247\u3001\u81EA\u5B9A\u4E49\u8868\u5355\u3001\u9AD8\u7EA7 JSON\u201D\u4E94\u4E2A\u5165\u53E3\u3002`EnableViewSchema` \u53EA\u63A7\u5236 Detail/Edit \u81EA\u5B9A\u4E49\u8868\u5355\uFF1B\u5173\u95ED\u540E\u7D27\u51D1\u6807\u9898\u3001\u52A8\u6001\u6307\u6807\u3001\u5217\u8868\u5BC6\u5EA6\u3001PC \u590D\u5408\u5217\u548C\u79FB\u52A8\u7AEF\u5361\u7247\u4ECD\u7136\u751F\u6548\u3002\n- \u5E73\u53F0\u81EA\u52A8\u751F\u6210\u7684 List/Card \u4E0E\u771F\u5B9E\u6570\u636E\u515C\u5E95\u53EA\u662F\u6700\u4F4E\u4FDD\u969C\u3002AI \u4EA4\u4ED8\u65F6\u4ECD\u987B\u6839\u636E\u4E1A\u52A1\u8BED\u4E49\u4E3B\u52A8\u5B8C\u5584\u5E76\u56DE\u8BFB\u9A8C\u8BC1\uFF0C\u4E0D\u5F97\u56E0\u4E3A\u5E73\u53F0\u5DF2\u6709\u9ED8\u8BA4\u503C\u800C\u7701\u7565\u8BBE\u8BA1\u3002\n",bi="\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",ki="\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",Pi="\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` \u8BFB\u53D6\u5143\u6570\u636E\u3001\u54C8\u5E0C\u3001\u8FD0\u884C\u65F6\u548C\u5FC5\u8981\u7684\u5C0F\u6587\u4EF6\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",Di="\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",Ri=`
1340
+ `,lt=`<!-- Generated by Microi\u543E\u7801 VSCode Extension - DO NOT REMOVE THIS LINE -->
1341
+ `,qn="\n\n## Microi\u543E\u7801\u975E\u963B\u585E\u81EA\u52A8\u66F4\u65B0\u89C4\u8303\uFF08\u5F3A\u5236\uFF09\n\n- VS Code \u6269\u5C55\u3001`@microi.net/cli`\u3001Codex \u63D2\u4EF6\u4E0E\u68C0\u6D4B\u5230\u7684 DeepSeek Harness profile bundle \u9ED8\u8BA4\u5728\u540E\u53F0\u4ECE\u5B98\u65B9\u5206\u53D1\u6E90\u68C0\u67E5\u548C\u5B89\u88C5\u66F4\u65B0\uFF1B\u66F4\u65B0\u68C0\u67E5\u4E0D\u5F97\u6210\u4E3A\u5206\u6790\u3001MCP \u8C03\u7528\u3001\u6E90\u7801\u4FEE\u6539\u3001\u6784\u5EFA\u3001\u53D1\u5E03\u6216\u4EFB\u4F55\u65B0\u4EFB\u52A1\u7684\u524D\u7F6E\u95E8\u7981\u3002\n- CLI \u4F7F\u7528 npm \u5B98\u65B9 registry\uFF1A`npm view '@microi.net/cli' version --json --prefer-online --registry=https://registry.npmjs.org/`\uFF1BVS Code \u6269\u5C55\u4F7F\u7528\u5B98\u65B9\u6269\u5C55\u5BBF\u4E3B\u7684\u5B89\u88C5/\u81EA\u52A8\u66F4\u65B0\u80FD\u529B\u3002\u7981\u6B62\u7528\u7B2C\u4E09\u65B9 registry \u6216\u4E0D\u660E\u955C\u50CF\u5192\u5145\u5B98\u65B9\u66F4\u65B0\u3002\n- \u81EA\u52A8\u66F4\u65B0\u7531 `microi update --background --workspace \"<\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84>\" --json` \u6295\u9012\u3002\u5B83\u4F1A\u5728\u540E\u53F0\u5347\u7EA7\u5168\u5C40 CLI\u3001\u66F4\u65B0 Codex \u63D2\u4EF6\u4E0E DeepSeek Harness bundle\uFF1B\u4EC5\u5F53\u5DE5\u4F5C\u533A\u5DF2\u6709\u6709\u6548 Microi \u670D\u52A1\u5668\u8FDE\u63A5\u65F6\uFF0C\u624D\u5E42\u7B49\u6267\u884C `microi ai init` \u4E0E `microi doctor`\uFF0C\u968F\u540E\u6267\u884C `microi codex status` \u4E0E `microi dsh status`\uFF1B\u672A\u68C0\u6D4B\u5230 DSH \u65F6\u5B89\u9759\u8DF3\u8FC7\u3002`codex install --yes` \u4E2D\u7684 `--yes` \u53EA\u4E3A\u517C\u5BB9\u65E7\u811A\u672C\uFF0C\u4E0D\u518D\u4EE3\u8868\u5DE5\u4F5C\u6388\u6743\u95E8\u69DB\u3002\n- \u5F53\u524D\u8FD0\u884C\u4E2D\u7684\u6269\u5C55\u3001CLI\u3001Codex Router\u3001DSH \u4F1A\u8BDD\u548C MCP \u7EE7\u7EED\u4F7F\u7528\u5DF2\u52A0\u8F7D\u7248\u672C\uFF1B\u4E0D\u5F97\u4E3A\u4E86\u5347\u7EA7\u6740\u8FDB\u7A0B\u3001\u5F3A\u5236\u91CD\u8F7D\u7A97\u53E3\u3001\u7EC8\u6B62\u5BF9\u8BDD\u6216\u6682\u505C\u7528\u6237\u4EFB\u52A1\u3002\u65B0\u7248\u672C\u53EA\u5728\u540E\u7EED\u65B0\u8FDB\u7A0B\u6216\u5BBF\u4E3B\u81EA\u7136\u91CD\u542F\u65F6\u63A5\u7BA1\u3002\n- registry \u4E0D\u53EF\u7528\u3001\u6743\u9650\u4E0D\u8DB3\u3001\u6587\u4EF6\u88AB\u8FD0\u884C\u4E2D\u4EFB\u52A1\u5360\u7528\u3001\u5B89\u88C5\u5931\u8D25\u6216\u5BBF\u4E3B\u6682\u4E0D\u652F\u6301\u70ED\u66F4\u65B0\u65F6\uFF0C\u8BB0\u5F55\u53EF\u8BCA\u65AD\u72B6\u6001\u5E76\u5728\u540E\u53F0\u5EF6\u540E\u91CD\u8BD5\uFF1B\u53EF\u4EE5\u975E\u6A21\u6001\u63D0\u793A\u7528\u6237\u201C\u7ACB\u5373\u91CD\u8BD5/\u67E5\u770B\u65E5\u5FD7\u201D\uFF0C\u4F46\u65E0\u8BBA\u7528\u6237\u662F\u5426\u5904\u7406\uFF0C\u90FD\u5FC5\u987B\u5141\u8BB8\u5F53\u524D\u3001\u6B63\u5728\u8FDB\u884C\u548C\u65B0\u5EFA\u5DE5\u4F5C\u7EE7\u7EED\u3002\n",ns="\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",bi="\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",ki="\n\n---\n\n## \u6570\u636E\u5E93\u7ED3\u6784\n\n\u6570\u636E\u5E93\u7ED3\u6784\u4E0D\u4F1A\u5199\u5165\u672C\u57FA\u7840\u77E5\u8BC6\u5E93\u6587\u4EF6\uFF0C\u907F\u514D\u4E0D\u540C\u5F00\u53D1\u8005\u8FDE\u63A5\u4E0D\u540C\u670D\u52A1\u5668\u540E\u4EA7\u751F\u63D0\u4EA4\u51B2\u7A81\u3002\n\n\u7F16\u5199 `V8.FormEngine` \u6216 `V8.Db` \u4EE3\u7801\u65F6\uFF1A\n- \u4F18\u5148\u901A\u8FC7 MCP \u5DE5\u5177 `microi_get_db_schema` \u83B7\u53D6\u5F53\u524D\u670D\u52A1\u5668\u7684\u5B9E\u65F6\u8868\u7ED3\u6784\u3002\n- \u5982\u9700\u8BFB\u53D6\u672C\u5730\u5FEB\u7167\uFF0C\u8BF7\u67E5\u770B\u5F53\u524D\u5F15\u64CE\u6587\u4EF6\u6240\u5C5E OsClient \u76EE\u5F55\u4E0B\u7684 `.microi-db-schema.md`\u3002\n\n\u4ECE\u81EA\u7136\u8BED\u8A00\u9700\u6C42\u521B\u5EFA\u5B8C\u6574 Microi \u4F4E\u4EE3\u7801\u7CFB\u7EDF\u65F6\uFF1A\n- \u5148\u8C03\u7528 `microi_get_db_schema` \u4E86\u89E3\u5DF2\u6709\u8868\u3001\u83DC\u5355\u3001\u5B57\u6BB5\uFF0C\u907F\u514D\u91CD\u590D\u5EFA\u6A21\u3002\n- \u518D\u8C03\u7528 `microi_get_manifest_schema` \u83B7\u53D6\u5B8C\u6574 Manifest \u534F\u8BAE\u548C\u793A\u4F8B\u3002\n- \u5C06\u9700\u6C42\u6574\u7406\u4E3A Manifest\uFF0C\u6A21\u5757\u914D\u7F6E\u4F18\u5148\u5199\u5B57\u6BB5\u540D\uFF1A`listFields`\u3001`searchFields`\u3001`sortFields`\u3001`hiddenFields`\u3001`mobileFields`\u3001`cardTitleFields`\u3001`cardBottomFields`\u3002MCP \u4F1A\u81EA\u52A8\u89E3\u6790\u4E3A `diy_field.Id`\u3001`SelectFields`\u3001`SearchFieldIds` \u7B49 `sys_menu` \u6240\u9700\u683C\u5F0F\u3002\n- \u521B\u5EFA\u7ED1\u5B9A `diyTableId` \u7684\u540E\u53F0\u83DC\u5355\u65F6\uFF0C\u5FC5\u987B\u914D\u7F6E\u6216\u5141\u8BB8 MCP/\u540E\u7AEF\u81EA\u52A8\u63A8\u65AD `TableDiyFieldIds`\u3001`SelectFields`\u3001`SearchFieldIds`\u3001`SortFieldIds`\u3001`NotShowFields`\u3001`StatisticsFields`\u3001`MobileListFields`\u3001`CardTitleTagFields`\u3001`CardBottomTagFields`\u3001`DefaultOrderBy`\u3002\n- `NotShowFields` \u9ED8\u8BA4\u9690\u85CF Id/\u5916\u952E/\u7CFB\u7EDF\u5B57\u6BB5/\u5E03\u5C40\u63A7\u4EF6/\u4E0A\u4F20\u5BCC\u6587\u672C\u5730\u56FE\u5B50\u8868\u7B49\u91CD\u5B57\u6BB5\uFF1B`SearchFieldIds` \u9ED8\u8BA4\u9009\u62E9\u540D\u79F0\u3001\u6807\u9898\u3001\u7F16\u53F7\u3001\u72B6\u6001\u3001\u5206\u7C7B\u3001\u8D1F\u8D23\u4EBA\u3001\u65F6\u95F4\u7B49\u5E38\u7528\u7B5B\u9009\uFF1B`StatisticsFields` \u9ED8\u8BA4\u9009\u62E9\u91D1\u989D\u3001\u4EF7\u683C\u3001\u6570\u91CF\u3001\u79EF\u5206\u3001\u4F59\u989D\u7B49\u6570\u503C\u5B57\u6BB5\uFF1B\u79FB\u52A8\u7AEF/\u5361\u7247\u5217\u9ED8\u8BA4\u4FDD\u7559 3-4 \u4E2A\u6838\u5FC3\u53EF\u8BFB\u5B57\u6BB5\u3002\n- \u8868\u5355\u63A7\u4EF6\u4EE5 `Microi.Client/src/views/form-engine/diy-field-component/diy-component-list.json` \u4E3A\u4E8B\u5B9E\u6E90\u3002\u5B57\u6BB5\u8F83\u591A\u65F6\u4F18\u5148\u4F7F\u7528 `diy_table.Tabs` \u548C\u5B57\u6BB5 `Tab` \u5206\u7EC4\uFF0C\u5C40\u90E8\u590D\u6742\u533A\u57DF\u518D\u7528 `CollapseGroup` \u6216\u5B57\u6BB5\u7EA7 `Tabs` \u63A7\u4EF6\u6298\u53E0/\u5206\u6BB5\u3002\n- \u751F\u6210\u6216\u65B0\u589E\u5B57\u6BB5\u65F6\uFF0C\u666E\u901A\u5B57\u6BB5\u9ED8\u8BA4\u4E0D\u8981\u8BBE\u7F6E `diy_field.FormWidth`\uFF08\u4FDD\u6301 null/\u7701\u7565\uFF09\uFF1B\u53EA\u6709 `CodeEditor`\u3001`Textarea`\u3001`RichText`\u3001\u4E0A\u4F20\u3001\u5B50\u8868\u3001\u5730\u56FE/\u5E03\u5C40/\u81EA\u5B9A\u4E49\u7B49\u9700\u8981\u72EC\u5360\u6574\u884C\u7684\u63A7\u4EF6\u624D\u8BBE\u7F6E\u4E3A `24`\u3002\n- \u751F\u6210\u5BA1\u6279\u6D41\u65F6\uFF0CManifest \u7684 workflows \u9700\u5305\u542B FlowDesign\u3001Nodes\u3001Lines\uFF1B\u8FDE\u7EBF\u6807\u9898\u9ED8\u8BA4\u4F7F\u7528 `{\u8D77\u70B9\u8282\u70B9} \u5230 {\u7EC8\u70B9\u8282\u70B9}`\uFF0C\u591A\u8DEF\u7EBF\u8282\u70B9\u4F18\u5148\u751F\u6210\u8BBE\u7F6E `V8.NextNodeId` \u7684 `LineValueV8`\u3002\n- \u4FDD\u5B58\u5DE5\u4F5C\u6D41\u524D\u8C03\u7528 `microi_check_workflow_package` \u68C0\u67E5\u62D3\u6251\uFF0C\u5FC5\u8981\u65F6\u7528 `microi_test_workflow_condition` \u5E26\u6837\u4F8B\u8868\u5355\u6570\u636E\u6D4B\u8BD5\u56FE\u5F62\u6761\u4EF6\u8DEF\u7EBF\u3002\n- \u8C03\u7528 `microi_plan_system` \u505A\u672C\u5730\u7ED3\u6784\u68C0\u67E5\uFF0C\u518D\u8C03\u7528 `microi_generate_system` \u4E14\u4FDD\u6301 `dryRun:true`\u3002\n- \u53EA\u6709\u7528\u6237\u660E\u786E\u540C\u610F\u5199\u5165\u65F6\uFF0C\u624D\u7528 `dryRun:false` \u5E76\u4F20 `confirmExecution`\uFF0C\u968F\u540E\u8C03\u7528 `microi_validate_system` \u9A8C\u6536\u3002\n",Pi='\n\n## JoinForm \u4E0E TableChild \u5173\u7CFB\u95E8\u7981\uFF08\u5F3A\u5236\uFF09\n\n- \u5148\u786E\u5B9A\u5173\u7CFB\u57FA\u6570\uFF1A`JoinForm` \u53EA\u5141\u8BB8 1:1/N:1\uFF0C\u76EE\u6807\u8868\u5FC5\u987B\u4E0E\u5F53\u524D\u8868\u4E0D\u540C\uFF0C`joinFieldName` \u5FC5\u987B\u662F\u5F53\u524D\u4E3B\u8868\u4E2D\u5DF2\u5B58\u5728\u4E14\u771F\u5B9E\u4FDD\u5B58\u76EE\u6807\u8BB0\u5F55 Id \u7684\u5B57\u6BB5\uFF1B\u7981\u6B62\u9ED8\u8BA4\u5199\u6210 `Name`\u3002\n- \u201C\u5B50\u8868\u3001\u660E\u7EC6\u3001\u6E05\u5355\u3001\u6761\u76EE\u3001\u884C\u9879\u76EE\u3001\u591A\u4E2A\u8BB0\u5F55\u201D\u9ED8\u8BA4\u662F 1:N\uFF0C\u5FC5\u987B\u4F7F\u7528 `TableChild`\u3002\u5728\u72EC\u7ACB\u5B50\u8868\u521B\u5EFA\u771F\u5B9E\u7236\u7EA7\u5916\u952E\u548C\u4EE5 `(OsClient, FK)` \u5F00\u5934\u7684\u7EC4\u5408\u7D22\u5F15\uFF0C\u5E76\u521B\u5EFA\u7ED1\u5B9A\u5B50\u8868\u4E14 `display=0\u3001appDisplay=0\u3001hasChild=0` \u7684\u9690\u85CF\u6A21\u5757\u3002\n- \u5B8C\u6574\u7CFB\u7EDF Manifest \u7684\u5173\u7CFB\u5B57\u6BB5\u5FC5\u987B\u5199\u53EF\u79FB\u690D `relation`\uFF1AJoinForm \u4F7F\u7528 `{cardinality:"N:1",targetTable,joinFieldName}`\uFF1BTableChild \u4F7F\u7528 `{cardinality:"1:N",targetTable,childForeignKey,childModule,primaryTableFieldName:"Id"}`\u3002\u7981\u6B62\u5728 Manifest \u4E2D\u7F16\u9020 `diy_table.Id` \u6216 `sys_menu.Id`\u3002\n- `microi_plan_system` / `microi_generate_system` \u4F1A\u5728\u4EFB\u4F55\u5199\u5165\u524D\u62D2\u7EDD\u81EA\u5173\u8054\u3001\u57FA\u6570/\u7EC4\u4EF6\u4E0D\u7B26\u3001\u7F3A\u5916\u952E\u3001\u7F3A\u9690\u85CF\u5B50\u83DC\u5355\u6216\u7F3A\u56DE\u67E5\u7D22\u5F15\uFF1B\u751F\u6210\u5668\u4F1A\u5728\u8868\u3001\u666E\u901A\u5B57\u6BB5\u548C\u83DC\u5355\u5C31\u7EEA\u540E\u624D\u89E3\u6790\u5F53\u524D\u79DF\u6237\u771F\u5B9E Id \u5E76\u5199\u5173\u7CFB\u5B57\u6BB5\u3002\u4E0D\u5F97\u6539\u7528\u5355\u5B57\u6BB5\u5DE5\u5177\u7ED5\u8FC7\uFF1B\u540E\u7AEF MCP \u8FB9\u754C\u4F1A\u518D\u6B21\u6821\u9A8C\u3002\n',Di="\n\n## \u6570\u636E\u5E93\u7D22\u5F15 MCP \u89C4\u8303\uFF08\u5F3A\u5236\uFF09\n\n- \u9700\u6C42\u3001\u84DD\u56FE\u3001\u63A5\u53E3\u3001Job \u6216\u8BC4\u5BA1\u4E00\u65E6\u660E\u786E\u67D0\u8868\u5B57\u6BB5\u9700\u8981\u7D22\u5F15\uFF0C\u5FC5\u987B\u5199\u5165 Manifest `tables[].indexes`\uFF0C\u5E76\u8C03\u7528 `microi_create_table_index`\uFF1B\u7981\u6B62\u5728 V8\u3001\u63A5\u53E3\u5F15\u64CE\u3001FormEngine \u6216\u4E00\u6B21\u6027 SQL \u4E2D\u624B\u5199 CREATE/DROP INDEX\u3002\n- \u521B\u5EFA\u524D\u540E\u8C03\u7528 `microi_get_table_indexes` \u56DE\u8BFB\u771F\u5B9E\u7269\u7406\u7D22\u5F15\u3002\u5220\u9664\u53EA\u80FD\u7528 `microi_drop_table_index`\uFF0C\u4E3B\u952E\u7D22\u5F15\u7981\u6B62\u5220\u9664\u3002\n- \u79DF\u6237\u4E1A\u52A1\u7EC4\u5408\u7D22\u5F15\u901A\u5E38\u4EE5 `OsClient` \u5F00\u5934\uFF1B\u4E1A\u52A1\u552F\u4E00\u952E\u3001\u5E42\u7B49\u952E\u7528\u79DF\u6237\u8303\u56F4\u552F\u4E00\u7D22\u5F15\uFF1B\u5916\u952E\u3001\u5B50\u8868\u3001Job/outbox/\u5F85\u529E\u626B\u63CF\u6309\u771F\u5B9E WHERE/JOIN/ORDER BY \u8BBE\u8BA1\u3002\n- \u4E0D\u5F97\u628A SearchFieldIds\u3001SortFieldIds\u3001StatisticsFields \u673A\u68B0\u8F6C\u6362\u6210\u4E00\u6279\u5355\u5217\u7D22\u5F15\uFF1B\u4F4E\u57FA\u6570\u5B57\u6BB5\u3001LIKE '%keyword%' \u548C\u957F\u6587\u672C\u4E0D\u80FD\u6EE5\u7528\u666E\u901A B-tree \u7D22\u5F15\u3002\n- DIY \u8868\u7D22\u5F15\u56DE\u8BFB\u540E\u8FD8\u5FC5\u987B\u80FD\u5728 Microi.Client \u201C\u5F00\u53D1\u8BBE\u8BA1 \u2192 \u7D22\u5F15\u7BA1\u7406\u201D\u770B\u5230\u76F8\u540C\u540D\u79F0\u3001\u6709\u5E8F\u5B57\u6BB5\u4E0E\u552F\u4E00\u6027\u3002\n",Ri="\n\n## MCP \u9ED8\u8BA4\u663E\u9690\u89C4\u5219\n\n- \u521B\u5EFA `sys_menu` \u83DC\u5355\u6A21\u5757\u65F6\uFF0C\u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u9690\u85CF\uFF0C\u5426\u5219 `Display` \u548C `AppDisplay` \u9ED8\u8BA4\u8BBE\u4E3A `1`\u3002\n- \u7ED1\u5B9A `diyTableId` \u7684\u83DC\u5355\u9ED8\u8BA4\u8865\u9F50\u5217\u8868\u5217\u3001\u641C\u7D22\u5217\u3001\u9690\u85CF\u5217\u3001\u6392\u5E8F\u5217\u3001\u7EDF\u8BA1\u5217\u3001\u79FB\u52A8\u7AEF/\u5361\u7247\u5217\u548C\u9ED8\u8BA4\u6392\u5E8F\uFF1B\u7528\u6237\u663E\u5F0F\u4F20\u5165\u7684 `sys_menu` JSON \u4F18\u5148\u3002\n- \u521B\u5EFA `diy_field` \u5B57\u6BB5\u65F6\uFF0C\u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u9690\u85CF\uFF0C\u5426\u5219 `Visible` \u548C `AppVisible` \u9ED8\u8BA4\u8BBE\u4E3A `1`\u3002\n- \u5B57\u6BB5\u8F83\u591A\u7684\u8868\u5355\u9ED8\u8BA4\u4F18\u5148\u751F\u6210 `diy_table.Tabs`\uFF0C\u5E76\u7ED9\u5B57\u6BB5\u5199\u5165 `Tab`\uFF1B\u6574\u884C\u63A7\u4EF6\u624D\u4F7F\u7528 `FormWidth=24`\u3002\n",Qn="\n\n## AI \u83DC\u5355\u6A21\u5757\u89C6\u89C9\u4EA4\u4ED8\u95E8\u7981\uFF08\u5F3A\u5236\uFF09\n\n- \u6BCF\u4E2A\u53EF\u89C1\u3001\u7ED1\u5B9A\u8868\u7684\u6A21\u5757\u90FD\u5FC5\u987B\u914D\u7F6E\u7D27\u51D1 Hero \u6807\u9898\u3001\u4E1A\u52A1\u526F\u6807\u9898\u548C 2-4 \u4E2A\u771F\u5B9E\u52A8\u6001\u6307\u6807\u3002\u6307\u6807\u4F18\u5148\u9009\u62E9\u91D1\u989D\u3001\u6570\u91CF\u3001\u4F59\u989D\u3001\u8FDB\u5EA6\u3001\u903E\u671F\u3001\u5F85\u5904\u7406\u7B49\u4E1A\u52A1\u805A\u5408\uFF1B\u6CA1\u6709\u5408\u9002\u6570\u503C\u5B57\u6BB5\u65F6\u4F7F\u7528\u771F\u5B9E `DataCount`\u3001`PageCount` \u6216\u771F\u5B9E\u72B6\u6001\u5206\u5E03\u515C\u5E95\u3002\u7981\u6B62\u968F\u673A\u6570\u3001\u56FA\u5B9A\u6F14\u793A\u6570\u3001\u4F2A\u7EDF\u8BA1\u6216\u53EA\u5199\u6BEB\u65E0\u4E1A\u52A1\u610F\u4E49\u7684\u603B\u6570\u3002\n- \u6BCF\u4E2A\u5217\u8868\u5B57\u6BB5\u90FD\u8981\u6309\u5B57\u6BB5\u8BED\u4E49\u8BBE\u7F6E\u5408\u7406 `TableWidth`\u3002PC \u590D\u5408\u5217\u5FC5\u987B\u7ED9\u8DB3 `MinWidth`\uFF0C\u7EC4\u7EC7\u4E3B\u5B57\u6BB5\u3001\u591A\u884C\u526F\u5B57\u6BB5\u3001\u53F3\u4FA7\u56FE\u6807/\u72B6\u6001\uFF0C\u5E76\u4ECE\u666E\u901A\u5217\u4E2D\u6392\u9664\u5DF2\u7ECF\u5C55\u793A\u7684\u91CD\u590D\u5B57\u6BB5\uFF0C\u540C\u65F6\u4FDD\u7559\u67E5\u8BE2\u4F9D\u8D56\u5B57\u6BB5\u3002\n- \u79FB\u52A8\u7AEF\u5361\u7247\u5E94\u6309\u771F\u5B9E\u4E1A\u52A1\u5B57\u6BB5\u8BBE\u8BA1\u56FE\u7247\u3001\u6807\u9898\u3001\u526F\u6807\u9898\u3001\u9876\u90E8\u6807\u7B7E\u3001\u53F3\u4FA7\u91D1\u989D/\u72B6\u6001\u3001\u5185\u5BB9\u3001Meta \u4E0E\u5E95\u90E8\u5B57\u6BB5\uFF1B\u540C\u4E00\u5B57\u6BB5\u4E0D\u5F97\u8DE8\u533A\u57DF\u91CD\u590D\u5806\u53E0\u3002\n- \u83DC\u5355\u52A8\u6001\u7EDF\u8BA1\u89D2\u6807\u53EA\u7528\u4E8E\u5C11\u6570\u9AD8\u4EF7\u503C\u5F85\u529E/\u5F02\u5E38/\u672A\u8BFB\u5165\u53E3\uFF1B\u9875\u9762\u591A Tab \u548C\u66F4\u591A V8 \u6309\u94AE\u6709\u771F\u5B9E\u4E1A\u52A1\u8BA1\u6570\u65F6\u4E5F\u5E94\u914D\u7F6E\u89D2\u6807\u3002\u6279\u91CF\u89D2\u6807\u5FC5\u987B\u907F\u514D N+1 \u67E5\u8BE2\u5E76\u63D0\u4F9B\u5B89\u5168\u964D\u7EA7\u3002\n- \u6A21\u5757\u8BBE\u8BA1\u5668\u56FA\u5B9A\u63D0\u4F9B\u201C\u6A21\u5757\u6807\u9898\u4E0E\u7EDF\u8BA1\u3001PC \u590D\u5408\u5217\u3001\u79FB\u52A8\u7AEF\u5361\u7247\u3001\u81EA\u5B9A\u4E49\u8868\u5355\u3001\u9AD8\u7EA7 JSON\u201D\u4E94\u4E2A\u5165\u53E3\u3002`EnableViewSchema` \u53EA\u63A7\u5236 Detail/Edit \u81EA\u5B9A\u4E49\u8868\u5355\uFF1B\u5173\u95ED\u540E\u7D27\u51D1\u6807\u9898\u3001\u52A8\u6001\u6307\u6807\u3001\u5217\u8868\u5BC6\u5EA6\u3001PC \u590D\u5408\u5217\u548C\u79FB\u52A8\u7AEF\u5361\u7247\u4ECD\u7136\u751F\u6548\u3002\n- \u5E73\u53F0\u81EA\u52A8\u751F\u6210\u7684 List/Card \u4E0E\u771F\u5B9E\u6570\u636E\u515C\u5E95\u53EA\u662F\u6700\u4F4E\u4FDD\u969C\u3002AI \u4EA4\u4ED8\u65F6\u4ECD\u987B\u6839\u636E\u4E1A\u52A1\u8BED\u4E49\u4E3B\u52A8\u5B8C\u5584\u5E76\u56DE\u8BFB\u9A8C\u8BC1\uFF0C\u4E0D\u5F97\u56E0\u4E3A\u5E73\u53F0\u5DF2\u6709\u9ED8\u8BA4\u503C\u800C\u7701\u7565\u8BBE\u8BA1\u3002\n",Ii="\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",_i="\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",Mi="\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` \u8BFB\u53D6\u5143\u6570\u636E\u3001\u54C8\u5E0C\u3001\u8FD0\u884C\u65F6\u548C\u5FC5\u8981\u7684\u5C0F\u6587\u4EF6\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",Ai="\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",Ni=`
1342
1342
 
1343
1343
  ## MicroService \u53D1\u5E03\u540E\u8FD0\u884C\u63A2\u6D4B\u4E0E 502 \u6062\u590D\u89C4\u5219
1344
1344
 
1345
1345
  - \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
1346
1346
  - \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
1347
1347
  - \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
1348
- `,Ii=`# Microi\u543E\u7801 V8\u5F15\u64CE API \u77E5\u8BC6\u5E93
1348
+ `,Fi=`# Microi\u543E\u7801 V8\u5F15\u64CE API \u77E5\u8BC6\u5E93
1349
1349
 
1350
1350
  > \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
1351
1351
 
@@ -1924,9 +1924,9 @@ console.log('\u8C03\u8BD5\u4FE1\u606F') // \u63
1924
1924
  - \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
1925
1925
  - \`_InvokeType: 'Client'\`\uFF1AFormEngine\u8C03\u7528\u65F6\u89E6\u53D1\u8868\u5355V8\u4E8B\u4EF6\uFF08\u9ED8\u8BA4Server\u6A21\u5F0F\u4E0D\u89E6\u53D1\uFF09
1926
1926
  - \u540E\u7AEF\u53EF\u4FE1V8\u8C03\u7528FormEngine\u4E0D\u8981\u6C42 \`_SysMenuId\`\uFF1B\u6D4F\u89C8\u5668\u4E0D\u80FD\u901A\u8FC7 \`_InvokeType\` \u4F2A\u9020\u4FE1\u4EFB
1927
- `,_i="\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- \u672C\u5730\u6E90\u7801\u540C\u6B65\u8C03\u7528 `microi_sync_microservice_source` \u65F6\u53EA\u4F20\u9879\u76EE\u7EDD\u5BF9\u8DEF\u5F84 `directory`\uFF0C\u7531 MCP \u8FDB\u7A0B\u626B\u63CF\u3001\u54C8\u5E0C\u548C\u8BFB\u53D6\u6587\u4EF6\uFF1B\u7981\u6B62\u628A\u6E90\u7801\u8BFB\u6210 Base64\u3001\u751F\u6210 `.sync-seg-*` / `sync-source-files.json` \u6216\u628A\u4E00\u4E2A\u6587\u4EF6\u4EBA\u5DE5\u5206\u6BB5\u3002\u6A21\u578B\u4E0A\u4E0B\u6587\u53EA\u63A5\u89E6\u6E05\u5355\u3002\n- \u65B0\u811A\u624B\u67B6\u5FC5\u987B\u652F\u6301\u72EC\u7ACB\u5730\u5740\u8FD0\u884C\uFF1A\u65E0\u5BBF\u4E3B Token \u65F6\u663E\u793A\u543E\u7801\u5E10\u53F7\u5BC6\u7801\u767B\u5F55\uFF0C\u5E76\u6309 `V8.GetSysConfig(true).EnableCaptcha` \u52A8\u6001\u52A0\u8F7D\u9A8C\u8BC1\u7801\uFF1B\u83DC\u5355\u548C `V8.OpenAppDialog` \u5165\u53E3\u590D\u7528\u5BBF\u4E3B Token\u3002\n- \u83DC\u5355\u3001\u5F39\u5C42\u548C\u7EC4\u4EF6\u5BBF\u4E3B\u5FC5\u987B\u4F20\u9012 `permissionContext={sysMenuId,moduleEngineKey,diyTableId}`\u3002\u65E0\u6743\u9650\u6309 Token/OsClient\u3001ModuleEngineKey\u3001\u5BBF\u4E3B\u4E0A\u4E0B\u6587\u3001\u89D2\u8272\u6388\u6743\u987A\u5E8F\u6392\u67E5\uFF0C\u7981\u6B62\u6539\u533F\u540D\u6216\u53BB\u6389\u6743\u9650\u6821\u9A8C\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",on=class s{static getInstance(){return s._instance||(s._instance=new s),s._instance}inject(){let e=I.getInstance();if(!e.getWorkspaceRoot())return;let n;try{n=e.getSyncRootDir()}catch{return}let r=_.join(n,wt);D.existsSync(r)||D.mkdirSync(r,{recursive:!0});let i=_.join(r,Gt);D.writeFileSync(i,hi,"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=zn+Ii+Jn+es+Ci+wi+Ti+vi+Ei+qn+bi+ki+Pi+_i+Ri+Di+r,o=[{relativePath:`${Rn}/${In}`,content:ct+i},{relativePath:_n,content:ct+i},{relativePath:Mn,content:ct+i},{relativePath:An,content:ct+i}];if(n.length>0){o.push({relativePath:`${Nn}/${Fn}`,content:this.buildCursorSkillRule(n)});let a=this.buildPortableAiSkill(n);for(let c of Xr)o.push({relativePath:c,content:a});o.push({relativePath:Zr,content:this.buildCodeBuddyRule()})}this.syncGeneratedAiDocs(t,o)}catch{}}ensureLocalRuntimeFilesIgnored(e,t){let n=[".vscode/mcp.json",`.vscode/${sn}`,".cursor/mcp.json",".trae/mcp.json",".workbuddy/mcp.json",".comate/mcp.json",yr,".claude/settings.local.json"],r=_.relative(e,t);if(r&&!r.startsWith("..")&&!_.isAbsolute(r)){let i=r.replace(/\\/g,"/");n.push(`${i}/**/${tt}`,`${i}/**/${Ke}`,`${i}/**/${Ye}`,`${i}/${yt}`,`${i}/**/${yt}`,`${i}/.backups/`,`${i}/**/.backups/`,`${i}/${wt}/`)}rt(e),Oe(e,n)}getBundledSkillsDir(){let e=_.join(__dirname,"microi.skills");if(D.existsSync(e))return e;let t=_.resolve(__dirname,"..","skills");return D.existsSync(t)?t:e}syncBundledSkills(e){let t=this.getBundledSkillsDir();if(!D.existsSync(t))return;let n=_.join(e,Yr),r=_.join(n,Gn),i=this.readSkillManifest(r),o=this.readBundledSkillsMeta(),a=o.skills?.version,c=this.compareMicroiVersions(a,i.bundleVersion)<0,l={version:1,generatedBy:"Microi\u543E\u7801 VSCode Extension",bundleVersion:c?i.bundleVersion:a||i.bundleVersion,bundleBuiltAt:c?i.bundleBuiltAt:o.builtAt||i.bundleBuiltAt,fileVersions:{...i.fileVersions||{}},files:{...i.files}},g=[];this.walkSkillSource(t,(u,p)=>{let m=_.join(n,p),f=D.readFileSync(u,"utf-8"),y=this.hashText(f),S=i.files[p],h=o.fileVersions?.[p]||a,C=i.fileVersions?.[p]||i.bundleVersion,T=this.compareMicroiVersions(h,C)<0,b=!1;if(!D.existsSync(m))b=!T;else if(S)try{b=this.hashText(D.readFileSync(m,"utf-8"))===S&&!T}catch{b=!1}if(b){let v=_.dirname(m);D.existsSync(v)||D.mkdirSync(v,{recursive:!0}),D.writeFileSync(m,f,"utf-8"),g.push(p)}if(b)l.files[p]=y,h&&(l.fileVersions[p]=h);else try{if(this.hashText(D.readFileSync(m,"utf-8"))===y){l.files[p]=y;let k=this.pickNewerMicroiVersion(h,i.fileVersions?.[p]);k&&(l.fileVersions[p]=k)}else S?(l.files[p]=S,i.fileVersions?.[p]&&(l.fileVersions[p]=i.fileVersions[p])):(delete l.files[p],delete l.fileVersions[p])}catch{S&&(l.files[p]=S,i.fileVersions?.[p]&&(l.fileVersions[p]=i.fileVersions[p]))}});let d=JSON.stringify(l)!==JSON.stringify(i);(g.length>0||d||!D.existsSync(r))&&(D.existsSync(n)||D.mkdirSync(n,{recursive:!0}),D.writeFileSync(r,JSON.stringify(l,null,2)+`
1928
- `,"utf-8"),Oe(e,[`${Yr}/${Gn}`]))}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=_.join(__dirname,yi);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===Gn)continue;let o=_.join(r,i.name);if(i.isDirectory())n(o);else if(i.isFile()){let a=_.relative(e,o).replace(/\\/g,"/");t(o,a)}}};n(e)}hashText(e){return ts.createHash("sha256").update(e,"utf-8").digest("hex")}compareMicroiVersions(e,t){let n=o=>{if(!(!o||!/^\d+(?:\.\d+){2}$/.test(o)))return o.split(".").map(a=>Number(a))},r=n(e),i=n(t);if(!r||!i)return 0;for(let o=0;o<3;o++)if(r[o]!==i[o])return r[o]>i[o]?1:-1;return 0}pickNewerMicroiVersion(e,t){return e?t?this.compareMicroiVersions(e,t)>=0?e:t:e:t}syncGeneratedAiDocs(e,t){let n=t.map(u=>u.relativePath.replace(/\\/g,"/")),r=n.map(u=>this.normalizeRelativePath(u)),i=this.getGitTrackedWorkspaceFiles(e,n);if(i===void 0)return;let o=_.join(e,".vscode",sn),a=this.readAiDocsManifest(o),c=this.readBundledSkillsMeta().skills?.version,l=this.pickNewerMicroiVersion(c,a.bundleVersion),g={version:2,generatedBy:"Microi\u543E\u7801 AI\u5F00\u53D1\u5DE5\u5177",bundleVersion:l,fileVersions:{...a.fileVersions||{}},fileHashes:{...a.fileHashes||{}},files:{...a.files}},d=new Set(r);for(let u of Object.keys(g.files))d.has(this.normalizeRelativePath(u))||(delete g.files[u],delete g.fileHashes[u],delete g.fileVersions[u]);for(let u of Object.keys(g.fileHashes))d.has(this.normalizeRelativePath(u))||(delete g.fileHashes[u],delete g.fileVersions[u],delete g.files[u]);for(let u of t){let p=this.normalizeRelativePath(u.relativePath);if(i.has(p)){delete g.files[p],delete g.fileHashes[p],delete g.fileVersions[p];continue}let m=_.join(e,p),f=this.hashText(u.content),y=a.files[p],S=a.fileHashes?.[p]||(/^[a-f0-9]{64}$/i.test(y||"")?y:void 0),h=a.fileVersions?.[p]||a.bundleVersion,C=this.compareMicroiVersions(c,h)<0,T=!D.existsSync(m)&&!C,b="";if(D.existsSync(m))try{let k=D.readFileSync(m,"utf-8");b=this.hashText(k),T=!!S&&b===S&&!C,!S&&k.includes("Generated by Microi\u543E\u7801 VSCode Extension")&&(g.fileHashes[p]=b,h&&(g.fileVersions[p]=h))}catch{T=!1}if(T){let k=_.dirname(m);D.existsSync(k)||D.mkdirSync(k,{recursive:!0}),D.writeFileSync(m,u.content,"utf-8"),b=f,g.fileHashes[p]=f,c&&(g.fileVersions[p]=c)}else if(b===f){g.fileHashes[p]=f;let k=this.pickNewerMicroiVersion(c,h);k&&(g.fileVersions[p]=k)}else S?(g.fileHashes[p]=S,h&&(g.fileVersions[p]=h)):g.fileHashes[p]||delete g.fileVersions[p];let v=g.fileHashes[p];if(v){let k=g.fileVersions[p]||l||"unknown";g.files[p]=`${Si}${k}:${v}`}else delete g.files[p]}if(JSON.stringify(g)!==JSON.stringify(a)||!D.existsSync(o)){let u=_.dirname(o);D.existsSync(u)||D.mkdirSync(u,{recursive:!0}),D.writeFileSync(o,JSON.stringify(g,null,2)+`
1929
- `,"utf-8")}Oe(e,[`.vscode/${sn}`])}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,Qn.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,o=[];for(let l of t){let g=_.relative(r,_.join(e,l));g.startsWith("..")||_.isAbsolute(g)||(o.push(g.replace(/\\/g,"/")),i.set(this.normalizeRelativePath(g),this.normalizeRelativePath(l)))}if(o.length===0)return new Set;let a=(0,Qn.spawnSync)("git",["-C",r,"ls-files","-z","--",...o],{encoding:"utf-8",windowsHide:!0,timeout:3e3,maxBuffer:1024*1024});if(a.error||a.status!==0)return;let c=new Set;for(let l of String(a.stdout||"").split("\0").filter(Boolean)){let g=i.get(this.normalizeRelativePath(l));g&&c.add(g)}return c}hasGitMetadata(e){let t=_.resolve(e);for(;;){if(D.existsSync(_.join(t,".git")))return!0;let n=_.dirname(t);if(n===t)return!1;t=n}}canRemoveGeneratedAiDoc(e,t){if(!D.existsSync(t))return!1;let 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 o=this.readAiDocsManifest(_.join(e,".vscode",sn)),a=o.files[r],c=o.fileHashes?.[r]||(/^[a-f0-9]{64}$/i.test(a||"")?a:void 0);if(!c)return!1;try{return this.hashText(D.readFileSync(t,"utf-8"))===c}catch{return!1}}collectSkillEntries(e){let t=_.join(e,"microi.skills");if(!D.existsSync(t))return[];let n=new Map,r=_.join(t,"README.md");if(D.existsSync(r))try{let a=D.readFileSync(r,"utf-8").matchAll(/`([^`]+\/SKILL\.md)`/g),c=0;for(let l of a){let g=l[1].split(/[\\/]/)[0];g&&!n.has(g)&&n.set(g,c++)}}catch{}let i=[];try{for(let o of D.readdirSync(t,{withFileTypes:!0})){if(!o.isDirectory())continue;let a=_.join(t,o.name,"SKILL.md");D.existsSync(a)&&i.push({name:o.name,relativePath:`microi.skills/${o.name}/SKILL.md`,description:this.readSkillDescription(a,o.name)})}}catch{}return i.sort((o,a)=>{let c=n.get(o.name),l=n.get(a.name);return c!==void 0&&l!==void 0?c-l:c!==void 0?-1:l!==void 0?1:o.name.localeCompare(a.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(`
1927
+ `,Vi="\n\n## MicroService \u5927\u578B\u4EA7\u7269\u4E0E\u4E0A\u4E0B\u6587\u89C4\u5219\uFF08\u8986\u76D6\u65E7\u517C\u5BB9\u8BF4\u660E\uFF09\n\n- `microi_get_application_context` \u9ED8\u8BA4\u53EA\u8BFB\u5143\u6570\u636E\u3001\u54C8\u5E0C\u3001\u8FD0\u884C\u65F6\u548C\u9875\u9762\uFF1B\u5C11\u91CF\u6B63\u6587\u663E\u5F0F\u5F00\u542F\u5185\u5BB9\u8BFB\u53D6\uFF0C\u5355\u6587\u4EF6\u4F7F\u7528 `microi_get_application_file`\u3002\n- \u672C\u5730\u6E90\u7801\u540C\u6B65\u8C03\u7528 `microi_sync_microservice_source` \u65F6\u53EA\u4F20\u9879\u76EE\u7EDD\u5BF9\u8DEF\u5F84 `directory`\uFF0C\u7531 MCP \u8FDB\u7A0B\u626B\u63CF\u3001\u54C8\u5E0C\u548C\u8BFB\u53D6\u6587\u4EF6\uFF1B\u7981\u6B62\u628A\u6E90\u7801\u8BFB\u6210 Base64\u3001\u751F\u6210 `.sync-seg-*` / `sync-source-files.json` \u6216\u628A\u4E00\u4E2A\u6587\u4EF6\u4EBA\u5DE5\u5206\u6BB5\u3002\u6A21\u578B\u4E0A\u4E0B\u6587\u53EA\u63A5\u89E6\u6E05\u5355\u3002\n- \u65B0\u811A\u624B\u67B6\u5FC5\u987B\u652F\u6301\u72EC\u7ACB\u5730\u5740\u8FD0\u884C\uFF1A\u65E0\u5BBF\u4E3B Token \u65F6\u663E\u793A\u543E\u7801\u5E10\u53F7\u5BC6\u7801\u767B\u5F55\uFF0C\u5E76\u6309 `V8.GetSysConfig(true).EnableCaptcha` \u52A8\u6001\u52A0\u8F7D\u9A8C\u8BC1\u7801\uFF1B\u83DC\u5355\u548C `V8.OpenAppDialog` \u5165\u53E3\u590D\u7528\u5BBF\u4E3B Token\u3002\n- \u83DC\u5355\u3001\u5F39\u5C42\u548C\u7EC4\u4EF6\u5BBF\u4E3B\u5FC5\u987B\u4F20\u9012 `permissionContext={sysMenuId,moduleEngineKey,diyTableId}`\u3002\u65E0\u6743\u9650\u6309 Token/OsClient\u3001ModuleEngineKey\u3001\u5BBF\u4E3B\u4E0A\u4E0B\u6587\u3001\u89D2\u8272\u6388\u6743\u987A\u5E8F\u6392\u67E5\uFF0C\u7981\u6B62\u6539\u533F\u540D\u6216\u53BB\u6389\u6743\u9650\u6821\u9A8C\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",cn=class s{static getInstance(){return s._instance||(s._instance=new s),s._instance}inject(){let e=I.getInstance();if(!e.getWorkspaceRoot())return;let n;try{n=e.getSyncRootDir()}catch{return}let r=_.join(n,vt);D.existsSync(r)||D.mkdirSync(r,{recursive:!0});let i=_.join(r,Jt);D.writeFileSync(i,Ti,"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=Jn+Fi+qn+ns+bi+ki+Pi+Di+Ri+Qn+Ii+_i+Mi+Vi+Ni+Ai+r,o=[{relativePath:`${In}/${_n}`,content:lt+i},{relativePath:Mn,content:lt+i},{relativePath:An,content:lt+i},{relativePath:Nn,content:lt+i}];if(n.length>0){o.push({relativePath:`${Fn}/${Vn}`,content:this.buildCursorSkillRule(n)});let a=this.buildPortableAiSkill(n);for(let c of es)o.push({relativePath:c,content:a});o.push({relativePath:ts,content:this.buildCodeBuddyRule()})}this.syncGeneratedAiDocs(t,o)}catch{}}ensureLocalRuntimeFilesIgnored(e,t){let n=[".vscode/mcp.json",`.vscode/${an}`,".cursor/mcp.json",".trae/mcp.json",".workbuddy/mcp.json",".comate/mcp.json",Cr,".claude/settings.local.json"],r=_.relative(e,t);if(r&&!r.startsWith("..")&&!_.isAbsolute(r)){let i=r.replace(/\\/g,"/");n.push(`${i}/**/${nt}`,`${i}/**/${He}`,`${i}/**/${Xe}`,`${i}/${Ct}`,`${i}/**/${Ct}`,`${i}/.backups/`,`${i}/**/.backups/`,`${i}/${vt}/`)}st(e),$e(e,n)}getBundledSkillsDir(){let e=_.join(__dirname,"microi.skills");if(D.existsSync(e))return e;let t=_.resolve(__dirname,"..","skills");return D.existsSync(t)?t:e}syncBundledSkills(e){let t=this.getBundledSkillsDir();if(!D.existsSync(t))return;let n=_.join(e,Zr),r=_.join(n,zn),i=this.readSkillManifest(r),o=this.readBundledSkillsMeta(),a=o.skills?.version,c=this.compareMicroiVersions(a,i.bundleVersion)<0,l={version:1,generatedBy:"Microi\u543E\u7801 VSCode Extension",bundleVersion:c?i.bundleVersion:a||i.bundleVersion,bundleBuiltAt:c?i.bundleBuiltAt:o.builtAt||i.bundleBuiltAt,fileVersions:{...i.fileVersions||{}},files:{...i.files}},g=[];this.walkSkillSource(t,(u,p)=>{let m=_.join(n,p),f=D.readFileSync(u,"utf-8"),y=this.hashText(f),S=i.files[p],h=o.fileVersions?.[p]||a,C=i.fileVersions?.[p]||i.bundleVersion,w=this.compareMicroiVersions(h,C)<0,b=!1;if(!D.existsSync(m))b=!w;else if(S)try{b=this.hashText(D.readFileSync(m,"utf-8"))===S&&!w}catch{b=!1}if(b){let v=_.dirname(m);D.existsSync(v)||D.mkdirSync(v,{recursive:!0}),D.writeFileSync(m,f,"utf-8"),g.push(p)}if(b)l.files[p]=y,h&&(l.fileVersions[p]=h);else try{if(this.hashText(D.readFileSync(m,"utf-8"))===y){l.files[p]=y;let k=this.pickNewerMicroiVersion(h,i.fileVersions?.[p]);k&&(l.fileVersions[p]=k)}else S?(l.files[p]=S,i.fileVersions?.[p]&&(l.fileVersions[p]=i.fileVersions[p])):(delete l.files[p],delete l.fileVersions[p])}catch{S&&(l.files[p]=S,i.fileVersions?.[p]&&(l.fileVersions[p]=i.fileVersions[p]))}});let d=JSON.stringify(l)!==JSON.stringify(i);(g.length>0||d||!D.existsSync(r))&&(D.existsSync(n)||D.mkdirSync(n,{recursive:!0}),D.writeFileSync(r,JSON.stringify(l,null,2)+`
1928
+ `,"utf-8"),$e(e,[`${Zr}/${zn}`]))}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=_.join(__dirname,vi);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===zn)continue;let o=_.join(r,i.name);if(i.isDirectory())n(o);else if(i.isFile()){let a=_.relative(e,o).replace(/\\/g,"/");t(o,a)}}};n(e)}hashText(e){return rs.createHash("sha256").update(e,"utf-8").digest("hex")}compareMicroiVersions(e,t){let n=o=>{if(!(!o||!/^\d+(?:\.\d+){2}$/.test(o)))return o.split(".").map(a=>Number(a))},r=n(e),i=n(t);if(!r||!i)return 0;for(let o=0;o<3;o++)if(r[o]!==i[o])return r[o]>i[o]?1:-1;return 0}pickNewerMicroiVersion(e,t){return e?t?this.compareMicroiVersions(e,t)>=0?e:t:e:t}syncGeneratedAiDocs(e,t){let n=t.map(u=>u.relativePath.replace(/\\/g,"/")),r=n.map(u=>this.normalizeRelativePath(u)),i=this.getGitTrackedWorkspaceFiles(e,n);if(i===void 0)return;let o=_.join(e,".vscode",an),a=this.readAiDocsManifest(o),c=this.readBundledSkillsMeta().skills?.version,l=this.pickNewerMicroiVersion(c,a.bundleVersion),g={version:2,generatedBy:"Microi\u543E\u7801 AI\u5F00\u53D1\u5DE5\u5177",bundleVersion:l,fileVersions:{...a.fileVersions||{}},fileHashes:{...a.fileHashes||{}},files:{...a.files}},d=new Set(r);for(let u of Object.keys(g.files))d.has(this.normalizeRelativePath(u))||(delete g.files[u],delete g.fileHashes[u],delete g.fileVersions[u]);for(let u of Object.keys(g.fileHashes))d.has(this.normalizeRelativePath(u))||(delete g.fileHashes[u],delete g.fileVersions[u],delete g.files[u]);for(let u of t){let p=this.normalizeRelativePath(u.relativePath);if(i.has(p)){delete g.files[p],delete g.fileHashes[p],delete g.fileVersions[p];continue}let m=_.join(e,p),f=this.hashText(u.content),y=a.files[p],S=a.fileHashes?.[p]||(/^[a-f0-9]{64}$/i.test(y||"")?y:void 0),h=a.fileVersions?.[p]||a.bundleVersion,C=this.compareMicroiVersions(c,h)<0,w=!D.existsSync(m)&&!C,b="";if(D.existsSync(m))try{let k=D.readFileSync(m,"utf-8");b=this.hashText(k),w=!!S&&b===S&&!C,!S&&k.includes("Generated by Microi\u543E\u7801 VSCode Extension")&&(g.fileHashes[p]=b,h&&(g.fileVersions[p]=h))}catch{w=!1}if(w){let k=_.dirname(m);D.existsSync(k)||D.mkdirSync(k,{recursive:!0}),D.writeFileSync(m,u.content,"utf-8"),b=f,g.fileHashes[p]=f,c&&(g.fileVersions[p]=c)}else if(b===f){g.fileHashes[p]=f;let k=this.pickNewerMicroiVersion(c,h);k&&(g.fileVersions[p]=k)}else S?(g.fileHashes[p]=S,h&&(g.fileVersions[p]=h)):g.fileHashes[p]||delete g.fileVersions[p];let v=g.fileHashes[p];if(v){let k=g.fileVersions[p]||l||"unknown";g.files[p]=`${Ei}${k}:${v}`}else delete g.files[p]}if(JSON.stringify(g)!==JSON.stringify(a)||!D.existsSync(o)){let u=_.dirname(o);D.existsSync(u)||D.mkdirSync(u,{recursive:!0}),D.writeFileSync(o,JSON.stringify(g,null,2)+`
1929
+ `,"utf-8")}$e(e,[`.vscode/${an}`])}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,Yn.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,o=[];for(let l of t){let g=_.relative(r,_.join(e,l));g.startsWith("..")||_.isAbsolute(g)||(o.push(g.replace(/\\/g,"/")),i.set(this.normalizeRelativePath(g),this.normalizeRelativePath(l)))}if(o.length===0)return new Set;let a=(0,Yn.spawnSync)("git",["-C",r,"ls-files","-z","--",...o],{encoding:"utf-8",windowsHide:!0,timeout:3e3,maxBuffer:1024*1024});if(a.error||a.status!==0)return;let c=new Set;for(let l of String(a.stdout||"").split("\0").filter(Boolean)){let g=i.get(this.normalizeRelativePath(l));g&&c.add(g)}return c}hasGitMetadata(e){let t=_.resolve(e);for(;;){if(D.existsSync(_.join(t,".git")))return!0;let n=_.dirname(t);if(n===t)return!1;t=n}}canRemoveGeneratedAiDoc(e,t){if(!D.existsSync(t))return!1;let 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 o=this.readAiDocsManifest(_.join(e,".vscode",an)),a=o.files[r],c=o.fileHashes?.[r]||(/^[a-f0-9]{64}$/i.test(a||"")?a:void 0);if(!c)return!1;try{return this.hashText(D.readFileSync(t,"utf-8"))===c}catch{return!1}}collectSkillEntries(e){let t=_.join(e,"microi.skills");if(!D.existsSync(t))return[];let n=new Map,r=_.join(t,"README.md");if(D.existsSync(r))try{let a=D.readFileSync(r,"utf-8").matchAll(/`([^`]+\/SKILL\.md)`/g),c=0;for(let l of a){let g=l[1].split(/[\\/]/)[0];g&&!n.has(g)&&n.set(g,c++)}}catch{}let i=[];try{for(let o of D.readdirSync(t,{withFileTypes:!0})){if(!o.isDirectory())continue;let a=_.join(t,o.name,"SKILL.md");D.existsSync(a)&&i.push({name:o.name,relativePath:`microi.skills/${o.name}/SKILL.md`,description:this.readSkillDescription(a,o.name)})}}catch{}return i.sort((o,a)=>{let c=n.get(o.name),l=n.get(a.name);return c!==void 0&&l!==void 0?c-l:c!==void 0?-1:l!==void 0?1:o.name.localeCompare(a.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(`
1930
1930
  `);return`
1931
1931
 
1932
1932
  ---
@@ -1941,11 +1941,11 @@ description: Microi \u9879\u76EE\u6280\u80FD\u89C4\u8303\uFF0C\u8986\u76D6\u4F4E
1941
1941
  globs: ["**/*.{vue,js,ts,jsx,tsx,css,scss,json,md,mdc,cs,csproj,xml,yml,yaml}", "Microi-V8-Engine/**/*.js", "microi-v8-engine/**/*.js", "microi.skills/**/*.md"]
1942
1942
  alwaysApply: true
1943
1943
  ---
1944
- ${ct}
1944
+ ${lt}
1945
1945
  # Microi\u543E\u7801\u9879\u76EE\u6280\u80FD\u89C4\u8303
1946
- ${zn}
1946
+ ${Jn}
1947
1947
  \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
1948
- ${t}${Jn}${es}${qn}
1948
+ ${t}${qn}${ns}${Qn}
1949
1949
  `}buildPortableAiSkill(e){let t=e.map(n=>`- \`${n.relativePath}\` \u2014 ${n.description}`).join(`
1950
1950
  `);return`---
1951
1951
  name: microi
@@ -1954,10 +1954,10 @@ description: \u5B89\u88C5\u6216\u521D\u59CB\u5316 @microi.net/cli\u3001\u914D\u7
1954
1954
 
1955
1955
  # Microi\u543E\u7801 AI \u5F00\u53D1\u8DEF\u7531
1956
1956
 
1957
- ${zn}
1958
-
1959
1957
  ${Jn}
1960
1958
 
1959
+ ${qn}
1960
+
1961
1961
  ## \u7ACB\u5373\u6267\u884C\u89C4\u5219
1962
1962
 
1963
1963
  - \u7528\u6237\u660E\u786E\u8981\u6C42\u5B89\u88C5 \`@microi.net/cli\` \u65F6\uFF0C\u5148\u8FD0\u884C \`npm install --global @microi.net/cli@latest\`\uFF1B\u82E5\u53EA\u9700\u5728\u7A7A\u5DE5\u4F5C\u533A\u521D\u59CB\u5316\uFF0C\u4E5F\u53EF\u76F4\u63A5\u8FD0\u884C \`npx --yes @microi.net/cli@latest init --workspace "<\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84>" --pull\`\u3002
@@ -1968,28 +1968,28 @@ ${Jn}
1968
1968
 
1969
1969
  ## \u543E\u7801\u5B8C\u6574 Skills \u7D22\u5F15
1970
1970
 
1971
- ${t}${qn}
1971
+ ${t}${Qn}
1972
1972
  `}buildCodeBuddyRule(){return`---
1973
1973
  description: Microi\u543E\u7801\u521D\u59CB\u5316\u3001\u670D\u52A1\u5668/MCP \u8FDE\u63A5\u3001\u5168\u90E8 V8 \u62C9\u53D6\u53CA\u4F4E\u4EE3\u7801\u5F00\u53D1\u5165\u53E3
1974
1974
  alwaysApply: true
1975
1975
  ---
1976
1976
 
1977
- ${ct}
1977
+ ${lt}
1978
1978
  # Microi\u543E\u7801\u5165\u53E3
1979
1979
 
1980
1980
  \u9047\u5230 Microi\u3001\u543E\u7801\u3001\`@microi.net/cli\`\u3001\u670D\u52A1\u5668\u8FDE\u63A5\u3001MCP \u6216 V8 \u62C9\u53D6\u4EFB\u52A1\u65F6\uFF0C\u7ACB\u5373\u8BFB\u53D6 \`.codebuddy/skills/microi/SKILL.md\` \u5E76\u6309\u5176\u4E2D\u6D41\u7A0B\u6267\u884C\u3002\u5B8C\u6574\u89C4\u8303\u4F4D\u4E8E\u5DE5\u4F5C\u533A \`microi.skills/\`\uFF0C\u4E0D\u8981\u51ED\u7A7A\u731C\u6D4B\u547D\u4EE4\u3001\u670D\u52A1\u5668\u6216\u6570\u636E\u7ED3\u6784\u3002
1981
- `}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!==tt)continue;let o=_.join(r,i);if(i===tt)try{let a=JSON.parse(D.readFileSync(o,"utf-8")),c=this.formatDbSchemaFull(a,_.relative(e,r));if(c){let l=_.join(r,Ke);D.writeFileSync(l,c,"utf-8"),t.push(l)}}catch{}else try{D.statSync(o).isDirectory()&&n(o)}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}
1981
+ `}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!==nt)continue;let o=_.join(r,i);if(i===nt)try{let a=JSON.parse(D.readFileSync(o,"utf-8")),c=this.formatDbSchemaFull(a,_.relative(e,r));if(c){let l=_.join(r,He);D.writeFileSync(l,c,"utf-8"),t.push(l)}}catch{}else try{D.statSync(o).isDirectory()&&n(o)}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}
1982
1982
  `),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
1983
1983
  `);for(let i of n){let o=i.Description?` \u2014 ${i.Description}`:"";r.push(`## ${i.Name}${o}
1984
1984
  `);let a=i._Fields||i.Fields;if(a&&a.length>0){r.push("| \u5B57\u6BB5 | \u8BF4\u660E | \u7C7B\u578B |"),r.push("|------|------|------|");for(let c of a){let l=c.Description||c.Label||"",g=c.Type||c.FieldType||"";r.push(`| ${c.Name} | ${l} | ${g} |`)}r.push("")}}return r.join(`
1985
- `)}ensureJsConfig(e,t){let n=_.join(e,"jsconfig.json"),r=e,i=e,o;if(D.existsSync(n))try{o=JSON.parse(D.readFileSync(n,"utf-8"))}catch{o={}}else o={};let a=o.compilerOptions||{};a.target=a.target||"ES2020",a.module=a.module||"CommonJS",a.checkJs=!0;let c=_.relative(e,t),l=a.typeRoots||[];l.includes(`./${c}`)||l.push(`./${c}`),a.typeRoots=l,o.compilerOptions=a;let g=o.include||[],d=_.relative(e,r),u=_.relative(e,i),p=`${c}/**/*`;for(let f of[`${d}/**/*`,`${u}/**/*`,p])g.includes(f)||g.push(f);o.include=g;let m=o.exclude||[];m.includes("node_modules")||m.push("node_modules"),o.exclude=m,D.writeFileSync(n,JSON.stringify(o,null,2),"utf-8")}cleanup(){let e=I.getInstance(),t=e.getWorkspaceRoot();if(!t)return;let n=e.getSyncRootDir(),r=_.join(n,wt),i=_.join(r,Gt);D.existsSync(i)&&D.unlinkSync(i);let o=_.join(t,wt),a=_.join(o,Gt);if(D.existsSync(a)&&D.unlinkSync(a),_.resolve(n)!==_.resolve(t)){let c=_.join(t,Rn,In),l=_.join(t,_n),g=_.join(t,Mn),d=_.join(t,An),u=_.join(t,Nn,Fn),p=Xr.map(f=>_.join(t,f)),m=_.join(t,Zr);if(this.canRemoveGeneratedAiDoc(t,c))try{D.unlinkSync(c)}catch{}if(this.canRemoveGeneratedAiDoc(t,l))try{D.unlinkSync(l)}catch{}if(this.canRemoveGeneratedAiDoc(t,g))try{D.unlinkSync(g)}catch{}if(this.canRemoveGeneratedAiDoc(t,d))try{D.unlinkSync(d)}catch{}if(this.canRemoveGeneratedAiDoc(t,u))try{D.unlinkSync(u)}catch{}for(let f of p)if(this.canRemoveGeneratedAiDoc(t,f))try{D.unlinkSync(f)}catch{}if(this.canRemoveGeneratedAiDoc(t,m))try{D.unlinkSync(m)}catch{}}this.cleanupSchemaDocs(n)}cleanupSchemaDocs(e){try{for(let t of D.readdirSync(e)){if(t.startsWith(".")&&t!==Ke)continue;let n=_.join(e,t);if(t===Ke)try{D.unlinkSync(n)}catch{}else try{D.statSync(n).isDirectory()&&this.cleanupSchemaDocs(n)}catch{}}}catch{}}};function Nt(s,e){let t=i=>{if(!(!i||!/^\d+(?:\.\d+){2}$/.test(i)))return i.split(".").map(o=>Number(o))},n=t(s),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 At(s){let e=s.env,t=String(e?.MICROI_TOOL_VERSION||"").trim();return/^\d+(?:\.\d+){2}$/.test(t)?t:""}function an(s){let e=s.env||{},t=s.headers||{},r=(o=>o.trim().replace(/\/+$/,"").toLowerCase())(String(e.MICROI_API_URL||s.url||"")),i=String(e.MICROI_OS_CLIENT||t["X-Microi-OsClient"]||"").trim().toLowerCase();return`${r}|${i}`}function ns(s,e,t){let n={...s},r={},i=new Set,o=[];for(let[c,l]of Object.entries(e)){let g=an(l),d=At(l),u=Object.entries(n).filter(([m,f])=>{if(!t.isManaged(m,f))return!1;let y=an(f);return m===c||g!=="|"&&y===g}),p=u.find(([,m])=>Nt(At(m),d)>0);if(p){let m=At(p[1]);for(let[f]of u)i.add(f);o.push({name:p[0],version:m});continue}r[c]=l}let a=new Set(Object.values(r).map(an).filter(c=>c!=="|"));for(let[c,l]of Object.entries(n)){if(!t.isManaged(c,l)||i.has(c))continue;if(Object.prototype.hasOwnProperty.call(r,c)){delete n[c];continue}let g=an(l);if(a.has(g)){delete n[c];continue}(t.removeManagedNotInNext||t.isStableName&&!t.isStableName(c))&&delete n[c]}return Object.assign(n,r),{servers:n,skippedNewerProviders:o}}var Zn=B(require("child_process")),K=B(require("fs")),rs=B(require("os")),G=B(require("path")),$e="microi-net",Ie="microi",Ae=`${Ie}@${$e}`,dn="@microi.net/cli",ss="@microi.net/codex-plugin",Ft="microi-official",cn=`${Ie}@${Ft}`;function Yn(s){return[s.stderr,s.stdout].filter(Boolean).join(`
1986
- `).trim()}function is(s,e,t=3e4){let n=Zn.spawnSync(s.command,[...s.prefixArgs,...e],{encoding:"utf8",windowsHide:!0,timeout:t,maxBuffer:16777216});return{status:typeof n.status=="number"?n.status:1,stdout:String(n.stdout||""),stderr:[n.error?.message,n.stderr].filter(Boolean).join(`
1987
- `)}}function Mi(s){let e=G.extname(s).toLowerCase();return e===".js"||e===".cjs"||e===".mjs"?{command:process.execPath,prefixArgs:[s],displayPath:s}:process.platform==="win32"&&(e===".cmd"||e===".bat")?{command:process.env.ComSpec||"cmd.exe",prefixArgs:["/d","/s","/c",s],displayPath:s}:{command:s,prefixArgs:[],displayPath:s}}function Ai(){let s=String(process.env.MICROI_CODEX_PATH||"").trim();if(s){let r=G.resolve(s);if(!K.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 o=Zn.spawnSync(r,i,{encoding:"utf8",windowsHide:!0,timeout:3e3});o.status===0&&t.push(...String(o.stdout||"").split(/\r?\n/).map(a=>a.trim()).filter(Boolean))}return process.platform!=="win32"&&t.push("codex"),[...new Map(t.map(r=>[process.platform==="win32"?r.toLowerCase():r,r])).values()].sort((r,i)=>{let o=G.extname(r).toLowerCase()===".exe"?0:1,a=G.extname(i).toLowerCase()===".exe"?0:1;return o-a})}function os(){for(let s of Ai()){if(G.isAbsolute(s)&&!K.existsSync(s))continue;let e=Mi(s),t=is(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 Re(s,e,t=!1){let n=is(s,["-c",'model_reasoning_effort="high"',...e]);if(!t&&n.status!==0)throw new Error(`Codex CLI \u6267\u884C\u5931\u8D25\uFF1Acodex ${e.join(" ")}
1988
- ${Yn(n)}`.trim());return n}function Ni(s){let e=[];for(let t of s.split(/\r?\n/)){let n=t.trim().split(/\s{2,}/);n.length<2||n[0]==="MARKETPLACE"||e.push({name:n[0],root:n.slice(1).join(" ")})}return e}function Fi(s){let e=[];for(let t of s.split(/\r?\n/)){let n=t.trim().split(/\s{2,}/);if(n.length<2||n[0]==="PLUGIN"||!n[0].includes("@"))continue;let r=/^not installed$/i.test(n[1]||"");e.push({selector:n[0],status:n[1]||"",version:r?"":n[2]||"",pluginPath:r?n.slice(2).join(" "):n.slice(3).join(" ")})}return e}function Vi(){let e=[G.join(__dirname,"codex-marketplace.json"),G.resolve(__dirname,"..","..","codex","marketplace.npm.json")].find(t=>K.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 Xn(s,e){let t=G.join(s,".codex-plugin","plugin.json"),n=G.join(s,"package.json"),r,i;try{r=JSON.parse(K.readFileSync(t,"utf8")),i=JSON.parse(K.readFileSync(n,"utf8"))}catch(o){throw new Error(`${e}\u8EAB\u4EFD\u6587\u4EF6\u65E0\u6CD5\u89E3\u6790\uFF1A${o instanceof Error?o.message:String(o)}`)}return{name:String(r.name||""),version:String(r.version||""),packageName:String(i.name||"")}}function xi(){let s=[G.resolve(__dirname,".."),G.resolve(__dirname,"..","..","plugins",Ie)];for(let e of s){if(!K.existsSync(G.join(e,".codex-plugin","plugin.json"))||!K.existsSync(G.join(e,"package.json")))continue;let t=Xn(e,"\u5185\u7F6E Microi Agentx \u63D2\u4EF6");if(t.name===Ie&&t.packageName===dn&&t.version)return{root:e,version:t.version}}throw new Error("CLI \u7F3A\u5C11\u5B8C\u6574\u7684 Microi Agentx \u63D2\u4EF6\u6587\u4EF6\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\u6700\u65B0\u7248 @microi.net/cli")}function Oi(s){if(!s||s.name!==Ie)return!1;if(s.source?.source==="local")return String(s.source.path||"").replace(/\\/g,"/").replace(/^\.\//,"")==="plugins/microi";let e=[dn,ss];return s.source?.source==="npm"&&e.includes(s.source.package||"")}function as(){let s=K.readFileSync(Vi(),"utf8"),e;try{e=JSON.parse(s)}catch(r){throw new Error(`Codex marketplace \u6A21\u677F\u65E0\u6CD5\u89E3\u6790\uFF1A${r instanceof Error?r.message:String(r)}`)}let t=e.plugins?.find(r=>r.name===Ie);if(e.name!==$e||t?.source?.source!=="local"||String(t.source.path||"").replace(/\\/g,"/").replace(/^\.\//,"")!=="plugins/microi")throw new Error("Codex marketplace \u6A21\u677F\u8EAB\u4EFD\u4E0D\u5408\u6CD5\uFF0C\u62D2\u7EDD\u5199\u5165\u5168\u5C40\u914D\u7F6E");let n=xi();return{manifest:e,content:`${JSON.stringify(e,null,2)}
1989
- `,expectedVersion:n.version,pluginRoot:n.root}}function $i(s,e){let t=`${s}.${process.pid}.${Date.now()}.tmp`;try{K.writeFileSync(t,e,"utf8"),K.renameSync(t,s)}finally{try{K.existsSync(t)&&K.unlinkSync(t)}catch{}}}function cs(){return G.resolve(process.env.CODEX_HOME||G.join(rs.homedir(),".codex"))}function Li(s,e,t){let n=G.resolve(s),r=G.resolve(e),i=G.relative(n,r);if(!i||!i.startsWith("..")&&!G.isAbsolute(i))throw new Error(`Codex \u63D2\u4EF6\u76EE\u6807\u76EE\u5F55\u4E0D\u80FD\u4F4D\u4E8E npm \u5305\u5185\u90E8\uFF1A${r}`);if(K.existsSync(r)){let d=Xn(r,"\u73B0\u6709 Microi Agentx \u63D2\u4EF6"),u=[dn,ss];if(d.name!==Ie||!u.includes(d.packageName))throw new Error(`\u76EE\u6807\u76EE\u5F55\u5305\u542B\u975E Microi \u7BA1\u7406\u7684\u63D2\u4EF6\uFF0C\u62D2\u7EDD\u8986\u76D6\uFF1A${r}`)}let o=G.dirname(r);K.mkdirSync(o,{recursive:!0});let a=`${process.pid}-${Date.now()}`,c=G.join(o,`.microi-staging-${a}`),l=G.join(o,`.microi-backup-${a}`),g=!1;try{K.cpSync(n,c,{recursive:!0,errorOnExist:!0});let d=Xn(c,"\u5F85\u5B89\u88C5 Microi Agentx \u63D2\u4EF6");if(d.name!==Ie||d.packageName!==dn||d.version!==t)throw new Error("\u5F85\u5B89\u88C5\u7684 Microi Agentx \u63D2\u4EF6\u8EAB\u4EFD\u6216\u7248\u672C\u4E0D\u4E00\u81F4");K.existsSync(r)&&(K.renameSync(r,l),g=!0),K.renameSync(c,r)}catch(d){if(!K.existsSync(r)&&g&&K.existsSync(l))try{K.renameSync(l,r)}catch{}throw d}finally{try{K.existsSync(c)&&K.rmSync(c,{recursive:!0,force:!0})}catch{}}try{K.existsSync(l)&&K.rmSync(l,{recursive:!0,force:!0})}catch{}}function Bi(s,e,t){let n=cs(),r=G.join(n,"microi-net-marketplace"),i=G.join(r,".agents","plugins","marketplace.json"),o=G.join(r,"plugins",Ie);if(K.mkdirSync(G.dirname(i),{recursive:!0}),K.existsSync(i)){let a;try{a=JSON.parse(K.readFileSync(i,"utf8"))}catch(l){throw new Error(`\u5DF2\u5B58\u5728\u7684 Microi marketplace \u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1A${i}\uFF08${l instanceof Error?l.message:String(l)}\uFF09`)}let c=a.plugins?.find(l=>l.name===Ie);if(a.name!==$e||!Oi(c))throw new Error(`\u76EE\u6807\u76EE\u5F55\u5305\u542B\u975E Microi \u7BA1\u7406\u7684 marketplace\uFF0C\u62D2\u7EDD\u8986\u76D6\uFF1A${i}`)}return Li(e,o,t),(!K.existsSync(i)||K.readFileSync(i,"utf8")!==s)&&$i(i,s),r}function Ui(s){let e=s.trim();if(!e||/[\r\n]/.test(e))throw new Error("Codex marketplace source \u65E0\u6548");let t=G.resolve(e);if(K.existsSync(t))return t;if(G.isAbsolute(e)||e.startsWith("."))throw new Error(`Codex marketplace \u672C\u5730\u8DEF\u5F84\u4E0D\u5B58\u5728\uFF1A${t}`);return e}function ln(s,e){let t=Ni(Re(s,["plugin","marketplace","list"]).stdout),n=Fi(Re(s,["plugin","list"]).stdout),r=t.find(u=>u.name===$e),i=n.find(u=>u.selector===Ae),o=t.some(u=>u.name===Ft),a=n.some(u=>u.selector===cn&&/^installed\b/i.test(u.status)),c=!!(i&&/^installed\b/i.test(i.status)),l=!!(i&&/enabled/i.test(i.status)),g=!e||i?.version===e,d=c?l?g?"none":"update":"enable":"install";return{ok:c&&l&&g,codex:{found:!0,command:s.displayPath,version:s.version},marketplace:{name:$e,configured:!!r,root:r?.root||""},plugin:{selector:Ae,installed:c,enabled:l,version:i?.version||"",expectedVersion:e},legacy:{marketplaceConfigured:o,pluginInstalled:a},action:d}}function ls(){let{expectedVersion:s}=as(),e=os();return e?ln(e,s):{ok:!1,codex:{found:!1,command:"",version:""},marketplace:{name:$e,configured:!1,root:""},plugin:{selector:Ae,installed:!1,enabled:!1,version:"",expectedVersion:s},legacy:{marketplaceConfigured:!1,pluginInstalled:!1},action:"install-codex"}}function ds(s={}){let{content:e,expectedVersion:t,pluginRoot:n}=as(),r=os();if(!r)throw new Error("\u672A\u627E\u5230\u53EF\u6267\u884C\u7684 Codex CLI\u3002\u8BF7\u5148\u5B89\u88C5\u6216\u66F4\u65B0 Codex\uFF0C\u518D\u6267\u884C microi codex install --yes");K.mkdirSync(cs(),{recursive:!0});let i=ln(r,t);if(i.ok&&!s.force){i.legacy.pluginInstalled&&Re(r,["plugin","remove",cn]),i.legacy.marketplaceConfigured&&Re(r,["plugin","marketplace","remove",Ft]);let d=i.legacy.pluginInstalled||i.legacy.marketplaceConfigured;return{installed:!0,changed:d,selector:Ae,version:i.plugin.version,migratedFrom:d?Ft:void 0,restartRequired:d}}let o=s.marketplaceSource?Ui(s.marketplaceSource):Bi(e,n,t);i.marketplace.configured||Re(r,["plugin","marketplace","add",o]);let a=ln(r,t);if(!a.marketplace.configured)throw new Error(`Codex \u672A\u80FD\u6CE8\u518C marketplace ${$e}`);let c;s.force&&a.plugin.installed?(Re(r,["plugin","remove",Ae]),c=Re(r,["plugin","add",Ae],!0)):c=Re(r,["plugin","add",Ae],!0);let l=ln(r,t);if(!l.plugin.installed||!l.plugin.enabled){let d=s.force?"--force \u5DF2\u6267\u884C\u663E\u5F0F\u91CD\u88C5\uFF0C\u8BF7\u68C0\u67E5\u4E0A\u65B9\u9519\u8BEF\u540E\u91CD\u8BD5\u3002":"\u539F\u6709\u63D2\u4EF6\u672A\u88AB\u5220\u9664\u3002";throw new Error(`\u5B89\u88C5 ${Ae} \u5931\u8D25\uFF0C${d}${Yn(c)?`
1990
- ${Yn(c)}`:""}`.trim())}if(l.plugin.version!==t)throw new Error(`\u5F53\u524D\u5DF2\u5B89\u88C5 ${l.plugin.version||"\u672A\u77E5\u7248\u672C"}\uFF0C\u76EE\u6807\u63D2\u4EF6\u5FEB\u7167\u4E3A ${t}\u3002\u8BF7\u4F7F\u7528 --force \u663E\u5F0F\u91CD\u88C5\u3002`);let g=i.legacy.pluginInstalled?cn:"";return i.legacy.pluginInstalled&&Re(r,["plugin","remove",cn]),i.legacy.marketplaceConfigured&&Re(r,["plugin","marketplace","remove",Ft]),{installed:!0,changed:!0,selector:Ae,version:l.plugin.version,marketplace:$e,marketplaceSource:o,migratedFrom:g||void 0,restartRequired:!0,next:"\u65B0\u5EFA Codex \u4EFB\u52A1\u6216\u91CD\u8F7D Codex\uFF0C\u4F7F\u63D2\u4EF6 Skills \u4E0E MCP \u751F\u6548\u3002"}}var nr=B(require("child_process")),ke=B(require("fs")),un=B(require("os")),Z=B(require("path")),Fe="@microi.net/cli",ji=["web","headless"],Ki="https://registry.npmjs.org/";function gn(s){try{let e=JSON.parse(ke.readFileSync(s,"utf8"));return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}catch{return}}function Ne(s){return s&&typeof s=="object"&&!Array.isArray(s)?s:void 0}function us(){let s=[Z.resolve(__dirname,".."),Z.resolve(__dirname,"..","..","plugins","microi")];for(let e of s){let t=gn(Z.join(e,"package.json")),n=Ne(t?.dsh),r=Ne(n?.bundle),i=String(r?.patch||""),o=String(t?.version||"");if(!(t?.name!==Fe||!o||i!=="./cordis.patch.yml")&&ke.existsSync(Z.join(e,"cordis.patch.yml")))return{root:e,version:o,patch:i}}throw new Error("CLI \u7F3A\u5C11\u5B8C\u6574\u7684 Microi DeepSeek Harness bundle\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\u6700\u65B0\u7248 @microi.net/cli")}function Hi(s){let e=Z.extname(s).toLowerCase();return e===".js"||e===".cjs"||e===".mjs"?{command:process.execPath,prefixArgs:[s],displayPath:s}:process.platform==="win32"&&(e===".cmd"||e===".bat")?{command:process.env.ComSpec||"cmd.exe",prefixArgs:["/d","/s","/c",s],displayPath:s}:{command:s,prefixArgs:[],displayPath:s}}function gs(s,e,t=3e4){let n=nr.spawnSync(s.command,[...s.prefixArgs,...e],{cwd:process.cwd(),encoding:"utf8",windowsHide:!0,timeout:t,maxBuffer:33554432,env:{...process.env}});return{status:typeof n.status=="number"?n.status:1,stdout:String(n.stdout||""),stderr:[n.error?.message,n.stderr].filter(Boolean).join(`
1991
- `)}}function Wi(){let s=String(process.env.MICROI_DSH_PATH||"").trim();if(s){let n=Z.resolve(s);if(!ke.existsSync(n))throw new Error(`MICROI_DSH_PATH \u6307\u5411\u7684\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${n}`);return[n]}let e=process.platform==="win32"?[["where.exe",["dsh.exe"]],["where.exe",["dsh.cmd"]],["where.exe",["dsh"]]]:[["which",["dsh"]]],t=[];for(let[n,r]of e){let i=nr.spawnSync(n,r,{encoding:"utf8",windowsHide:!0,timeout:3e3});i.status===0&&t.push(...String(i.stdout||"").split(/\r?\n/).map(o=>o.trim()).filter(Boolean))}return process.platform!=="win32"&&t.push("dsh"),[...new Map(t.map(n=>[process.platform==="win32"?n.toLowerCase():n,n])).values()]}function ps(){for(let s of Wi()){if(Z.isAbsolute(s)&&!ke.existsSync(s))continue;let e=Hi(s),t=gs(e,["--version"],5e3);if(t.status!==0)continue;let n=t.stdout.trim()||t.stderr.trim();if(n)return{...e,version:n}}}function Gi(s){return s==="~"?un.homedir():s.startsWith("~/")||s.startsWith("~\\")?Z.join(un.homedir(),s.slice(2)):s}function er(){let s=String(process.env.DSH_HOME||"").trim();return Z.resolve(Gi(s||Z.join(un.homedir(),".dsh")))}function zi(s){let e=s.trim();if(!e||e==="."||e===".."||e==="node_modules"||/[/\\]/.test(e))throw new Error(`DeepSeek Harness profile \u540D\u79F0\u65E0\u6548\uFF1A${JSON.stringify(s)}`);return e}function ms(s){return s?[zi(s)]:[...ji]}function Ji(s,e){if(!e)return;let t=Z.resolve(s,e),n=Z.relative(s,t);if(!(!n||n.startsWith("..")||Z.isAbsolute(n)))return t}function tr(s,e,t){let n=Z.join(s,"profiles",e),r=gn(Z.join(n,"package.json")),i=Ne(r?.dependencies),o=Ne(r?.dsh),a=Ne(o?.profile),c=Array.isArray(a?.bundles)?a?.bundles.map(String):[],l=Z.join(n,"node_modules","@microi.net","cli"),g=gn(Z.join(l,"package.json")),d=Ne(g?.dsh),u=Ne(d?.bundle),p=String(u?.patch||""),m=Ji(l,p),f=!!r,y=typeof i?.[Fe]=="string",S=g?.name===Fe,h=S?String(g?.version||""):"",C=c.includes(Fe),T=p==="./cordis.patch.yml"&&!!(m&&ke.existsSync(m)),b=h===t;return{profile:e,profileDir:n,initialized:f,dependencyDeclared:y,installed:S,active:C,installedVersion:h,expectedVersion:t,bundlePatch:p,bundlePatchExists:T,ok:f&&y&&S&&C&&T&&b,action:!S||!y?"install":!b||!T?"update":C?"none":"activate"}}function qi(s,e){let t=us(),n=er(),r=e.map(o=>tr(n,o,t.version)),i=s?r.some(o=>o.action==="install")?"install":r.some(o=>o.action==="update")?"update":r.some(o=>o.action==="activate")?"activate":"none":"install-dsh";return{ok:!!s&&r.every(o=>o.ok),dsh:{found:!!s,command:s?.displayPath||"",version:s?.version||"",home:n},package:{name:Fe,expectedVersion:t.version,bundlePatch:t.patch},profiles:r,action:i,requiresNewSession:i!=="none"&&i!=="install-dsh"}}function fs(s){return qi(ps(),ms(s))}function Qi(s){let e=Z.resolve(s);if(!ke.existsSync(e))throw new Error(`DeepSeek Harness bundle \u672C\u5730\u6765\u6E90\u4E0D\u5B58\u5728\uFF1A${e}`);if(!ke.statSync(e).isDirectory()){if(!/\.(?:tgz|tar\.gz)$/i.test(e))throw new Error("DeepSeek Harness bundle --source \u53EA\u63A5\u53D7\u672C\u5730\u76EE\u5F55\u6216 .tgz/.tar.gz");return e}let t=[e,Z.join(e,"plugins","microi")];for(let n of t){let r=gn(Z.join(n,"package.json")),i=Ne(r?.dsh),o=Ne(i?.bundle);if(r?.name===Fe&&o?.patch==="./cordis.patch.yml"&&ke.existsSync(Z.join(n,"cordis.patch.yml")))return n}throw new Error(`\u672C\u5730\u6765\u6E90\u4E0D\u662F\u5B8C\u6574\u7684 ${Fe} DeepSeek Harness bundle\uFF1A${e}`)}function Yi(s){return[s.stderr,s.stdout].filter(Boolean).join(`
1992
- `).trim().slice(0,5e3)}function hs(s={}){let e=ps();if(!e)throw new Error("\u672A\u68C0\u6D4B\u5230 DeepSeek Harness dsh CLI\uFF1B\u8BF7\u5148\u6267\u884C npm install -g @deepseek-ai/dsh\uFF0C\u518D\u91CD\u8BD5 microi dsh install");let t=us(),n=ms(s.profile),r=s.source?Qi(s.source):"",i=r||`${Fe}@${t.version}`,o=[];for(let c of n){let l=tr(er(),c,t.version);if(l.ok&&!s.force){o.push({...l,changed:!1});continue}let g=["plugin","--profile",c,"add",i,"--save-exact",...r?[]:[`--registry=${Ki}`]],d=gs(e,g,5*6e4);if(d.status!==0)throw new Error(`DeepSeek Harness profile ${c} \u5B89\u88C5 Microi bundle \u5931\u8D25\uFF1A${Yi(d)||`exit ${d.status}`}`);let u=tr(er(),c,t.version);if(!u.ok)throw new Error(`DeepSeek Harness profile ${c} \u5B89\u88C5\u540E\u6821\u9A8C\u5931\u8D25\uFF08action=${u.action}\uFF0Cversion=${u.installedVersion||"missing"}\uFF09`);o.push({...u,changed:!0})}let a=o.some(c=>c.changed);return{ok:!0,package:`${Fe}@${t.version}`,source:i,profiles:o,requiresNewSession:a,message:a?"Microi\u543E\u7801\u5DF2\u5B89\u88C5\u4E3A DeepSeek Harness profile bundle\uFF1B\u8BF7\u65B0\u5EFA DSH \u4F1A\u8BDD\u52A0\u8F7D\u65B0\u589E MCP \u5DE5\u5177\uFF0C\u5F53\u524D\u4F1A\u8BDD\u4E0D\u4F1A\u88AB\u7EC8\u6B62\u3002":"DeepSeek Harness \u4E2D\u7684 Microi\u543E\u7801 bundle \u5DF2\u662F\u5F53\u524D\u7248\u672C\uFF0C\u65E0\u9700\u6539\u52A8\u3002"}}var pn=B(require("crypto")),$=B(require("fs")),Ot=B(require("os")),U=B(require("path"));function rr(s){return s.normalize("NFKD").replace(/[^\x00-\x7F]/g,"").replace(/[^A-Za-z0-9_]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"").toLowerCase().slice(0,48)}function Ss(s){try{return rr(new URL(s.apiBaseUrl.trim().replace(/\/+$/,"")).host)}catch{return rr(s.apiBaseUrl)}}function ys(s){return rr(s.osClient||s.sysShortTitle||s.sysTitle||s.label||"")||Ss(s)||"default"}function lt(s){let e=new Map;for(let r of s){let i=ys(r);e.set(i,(e.get(i)||0)+1)}let t=new Set(Array.from(e).filter(([,r])=>r>1).map(([r])=>r)),n=new Set;return s.map(r=>{let i=Ss(r),o=ys(r),a=`microi_${o}`,c=t.has(o)&&i&&i!==o?`${a}_${i}`:a;n.has(c)&&i&&(c=`${a}_${i}`);let l=2;for(;n.has(c);)c=`${a}_${l++}`;return n.add(c),{profile:r,mcpName:c}})}var Vt="";function Le(){if(Vt)return Vt;try{let s=JSON.parse($.readFileSync(U.join(__dirname,"..","package.json"),"utf8"));Vt=/^\d+(?:\.\d+){2}$/.test(String(s.version||""))?String(s.version):"0.0.0"}catch{Vt="0.0.0"}return Vt}function Xi(s){return s.trim().replace(/\/+$/,"")}function Zi(){let s=`MCP:${Ot.hostname()||"Unknown"}`;return/^[\x20-\x7E]{1,128}$/.test(s)?s:`MCP-${pn.createHash("sha256").update(s).digest("hex").slice(0,16)}`}function ws(s){let e=U.basename(s).toLowerCase();return!!process.versions.electron||["code.exe","code - insiders.exe","cursor.exe","windsurf.exe","trae.exe","electron.exe"].includes(e)}function eo(){return{command:process.execPath,isElectron:ws(process.execPath)}}function to(s,e){let t=e.env;return/^microi(?:_|-|$)/i.test(s)||typeof t?.MICROI_API_URL=="string"}function Ts(s,e){let t=`${s}.${process.pid}.${Date.now()}.tmp`;try{$.writeFileSync(t,e,"utf8"),$.renameSync(t,s)}finally{try{$.existsSync(t)&&$.unlinkSync(t)}catch{}}}function _e(s,e){if($.existsSync(s)&&$.readFileSync(s).equals(e))return;$.mkdirSync(U.dirname(s),{recursive:!0});let t=`${process.pid}.${Date.now()}.${pn.randomBytes(4).toString("hex")}`,n=`${s}.${t}.stage`,r=`${s}.${t}.backup`,i=!1;try{$.writeFileSync(n,e),$.existsSync(s)&&($.renameSync(s,r),i=!0),$.renameSync(n,s),i&&$.rmSync(r,{force:!0})}catch(o){if(!$.existsSync(s)&&i&&$.existsSync(r))try{$.renameSync(r,s)}catch{}throw o}finally{try{$.existsSync(n)&&$.rmSync(n,{force:!0})}catch{}}}function no(){let s=Le();if(!/^\d+(?:\.\d+){2}$/.test(s))throw new Error(`CLI \u7248\u672C\u4E0D\u5408\u6CD5\uFF0C\u65E0\u6CD5\u521B\u5EFA MCP \u8FD0\u884C\u65F6\uFF1A${s}`);let e={launcher:U.join(__dirname,"microi-cli-mcp.js"),server:U.join(__dirname,"mcp-server.js"),adapter:U.join(__dirname,"mcp-codex-stdio-adapter.js"),router:U.join(__dirname,"microi-codex-router.js"),broker:U.join(__dirname,"microi-codex-broker.js"),cli:U.join(__dirname,"microi-cli.js"),trae:U.join(__dirname,"mcp-trae-windows-launcher.cmd")},t=Object.values(e).filter(u=>!$.existsSync(u));if(t.length>0)throw new Error(`CLI \u5B89\u88C5\u5305\u7F3A\u5C11\u5185\u7F6E MCP \u8FD0\u884C\u6587\u4EF6\uFF1A${t.join(", ")}`);let n=U.resolve(process.env.MICROI_RUNTIME_HOME||U.join(Ot.homedir(),".microi","runtime")),r=U.join(n,"versions"),i=U.join(r,s);$.mkdirSync(i,{recursive:!0}),_e(U.join(i,"microi-cli-mcp.js"),$.readFileSync(e.launcher)),_e(U.join(i,"mcp-server.js"),$.readFileSync(e.server)),_e(U.join(i,"microi-codex-router.js"),$.readFileSync(e.router)),_e(U.join(i,"microi-codex-broker.js"),$.readFileSync(e.broker)),_e(U.join(i,"microi-cli.js"),$.readFileSync(e.cli));let o=`#!/usr/bin/env node
1985
+ `)}ensureJsConfig(e,t){let n=_.join(e,"jsconfig.json"),r=e,i=e,o;if(D.existsSync(n))try{o=JSON.parse(D.readFileSync(n,"utf-8"))}catch{o={}}else o={};let a=o.compilerOptions||{};a.target=a.target||"ES2020",a.module=a.module||"CommonJS",a.checkJs=!0;let c=_.relative(e,t),l=a.typeRoots||[];l.includes(`./${c}`)||l.push(`./${c}`),a.typeRoots=l,o.compilerOptions=a;let g=o.include||[],d=_.relative(e,r),u=_.relative(e,i),p=`${c}/**/*`;for(let f of[`${d}/**/*`,`${u}/**/*`,p])g.includes(f)||g.push(f);o.include=g;let m=o.exclude||[];m.includes("node_modules")||m.push("node_modules"),o.exclude=m,D.writeFileSync(n,JSON.stringify(o,null,2),"utf-8")}cleanup(){let e=I.getInstance(),t=e.getWorkspaceRoot();if(!t)return;let n=e.getSyncRootDir(),r=_.join(n,vt),i=_.join(r,Jt);D.existsSync(i)&&D.unlinkSync(i);let o=_.join(t,vt),a=_.join(o,Jt);if(D.existsSync(a)&&D.unlinkSync(a),_.resolve(n)!==_.resolve(t)){let c=_.join(t,In,_n),l=_.join(t,Mn),g=_.join(t,An),d=_.join(t,Nn),u=_.join(t,Fn,Vn),p=es.map(f=>_.join(t,f)),m=_.join(t,ts);if(this.canRemoveGeneratedAiDoc(t,c))try{D.unlinkSync(c)}catch{}if(this.canRemoveGeneratedAiDoc(t,l))try{D.unlinkSync(l)}catch{}if(this.canRemoveGeneratedAiDoc(t,g))try{D.unlinkSync(g)}catch{}if(this.canRemoveGeneratedAiDoc(t,d))try{D.unlinkSync(d)}catch{}if(this.canRemoveGeneratedAiDoc(t,u))try{D.unlinkSync(u)}catch{}for(let f of p)if(this.canRemoveGeneratedAiDoc(t,f))try{D.unlinkSync(f)}catch{}if(this.canRemoveGeneratedAiDoc(t,m))try{D.unlinkSync(m)}catch{}}this.cleanupSchemaDocs(n)}cleanupSchemaDocs(e){try{for(let t of D.readdirSync(e)){if(t.startsWith(".")&&t!==He)continue;let n=_.join(e,t);if(t===He)try{D.unlinkSync(n)}catch{}else try{D.statSync(n).isDirectory()&&this.cleanupSchemaDocs(n)}catch{}}}catch{}}};function Vt(s,e){let t=i=>{if(!(!i||!/^\d+(?:\.\d+){2}$/.test(i)))return i.split(".").map(o=>Number(o))},n=t(s),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 Ft(s){let e=s.env,t=String(e?.MICROI_TOOL_VERSION||"").trim();return/^\d+(?:\.\d+){2}$/.test(t)?t:""}function ln(s){let e=s.env||{},t=s.headers||{},r=(o=>o.trim().replace(/\/+$/,"").toLowerCase())(String(e.MICROI_API_URL||s.url||"")),i=String(e.MICROI_OS_CLIENT||t["X-Microi-OsClient"]||"").trim().toLowerCase();return`${r}|${i}`}function ss(s,e,t){let n={...s},r={},i=new Set,o=[];for(let[c,l]of Object.entries(e)){let g=ln(l),d=Ft(l),u=Object.entries(n).filter(([m,f])=>{if(!t.isManaged(m,f))return!1;let y=ln(f);return m===c||g!=="|"&&y===g}),p=u.find(([,m])=>Vt(Ft(m),d)>0);if(p){let m=Ft(p[1]);for(let[f]of u)i.add(f);o.push({name:p[0],version:m});continue}r[c]=l}let a=new Set(Object.values(r).map(ln).filter(c=>c!=="|"));for(let[c,l]of Object.entries(n)){if(!t.isManaged(c,l)||i.has(c))continue;if(Object.prototype.hasOwnProperty.call(r,c)){delete n[c];continue}let g=ln(l);if(a.has(g)){delete n[c];continue}(t.removeManagedNotInNext||t.isStableName&&!t.isStableName(c))&&delete n[c]}return Object.assign(n,r),{servers:n,skippedNewerProviders:o}}var er=O(require("child_process")),K=O(require("fs")),is=O(require("os")),G=O(require("path")),Le="microi-net",_e="microi",Ne=`${_e}@${Le}`,gn="@microi.net/cli",os="@microi.net/codex-plugin",xt="microi-official",dn=`${_e}@${xt}`;function Xn(s){return[s.stderr,s.stdout].filter(Boolean).join(`
1986
+ `).trim()}function as(s,e,t=3e4){let n=er.spawnSync(s.command,[...s.prefixArgs,...e],{encoding:"utf8",windowsHide:!0,timeout:t,maxBuffer:16777216});return{status:typeof n.status=="number"?n.status:1,stdout:String(n.stdout||""),stderr:[n.error?.message,n.stderr].filter(Boolean).join(`
1987
+ `)}}function xi(s){let e=G.extname(s).toLowerCase();return e===".js"||e===".cjs"||e===".mjs"?{command:process.execPath,prefixArgs:[s],displayPath:s}:process.platform==="win32"&&(e===".cmd"||e===".bat")?{command:process.env.ComSpec||"cmd.exe",prefixArgs:["/d","/s","/c",s],displayPath:s}:{command:s,prefixArgs:[],displayPath:s}}function Oi(){let s=String(process.env.MICROI_CODEX_PATH||"").trim();if(s){let r=G.resolve(s);if(!K.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 o=er.spawnSync(r,i,{encoding:"utf8",windowsHide:!0,timeout:3e3});o.status===0&&t.push(...String(o.stdout||"").split(/\r?\n/).map(a=>a.trim()).filter(Boolean))}return process.platform!=="win32"&&t.push("codex"),[...new Map(t.map(r=>[process.platform==="win32"?r.toLowerCase():r,r])).values()].sort((r,i)=>{let o=G.extname(r).toLowerCase()===".exe"?0:1,a=G.extname(i).toLowerCase()===".exe"?0:1;return o-a})}function cs(){for(let s of Oi()){if(G.isAbsolute(s)&&!K.existsSync(s))continue;let e=xi(s),t=as(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 Ie(s,e,t=!1){let n=as(s,["-c",'model_reasoning_effort="high"',...e]);if(!t&&n.status!==0)throw new Error(`Codex CLI \u6267\u884C\u5931\u8D25\uFF1Acodex ${e.join(" ")}
1988
+ ${Xn(n)}`.trim());return n}function $i(s){let e=[];for(let t of s.split(/\r?\n/)){let n=t.trim().split(/\s{2,}/);n.length<2||n[0]==="MARKETPLACE"||e.push({name:n[0],root:n.slice(1).join(" ")})}return e}function Li(s){let e=[];for(let t of s.split(/\r?\n/)){let n=t.trim().split(/\s{2,}/);if(n.length<2||n[0]==="PLUGIN"||!n[0].includes("@"))continue;let r=/^not installed$/i.test(n[1]||"");e.push({selector:n[0],status:n[1]||"",version:r?"":n[2]||"",pluginPath:r?n.slice(2).join(" "):n.slice(3).join(" ")})}return e}function Bi(){let e=[G.join(__dirname,"codex-marketplace.json"),G.resolve(__dirname,"..","..","codex","marketplace.npm.json")].find(t=>K.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 Zn(s,e){let t=G.join(s,".codex-plugin","plugin.json"),n=G.join(s,"package.json"),r,i;try{r=JSON.parse(K.readFileSync(t,"utf8")),i=JSON.parse(K.readFileSync(n,"utf8"))}catch(o){throw new Error(`${e}\u8EAB\u4EFD\u6587\u4EF6\u65E0\u6CD5\u89E3\u6790\uFF1A${o instanceof Error?o.message:String(o)}`)}return{name:String(r.name||""),version:String(r.version||""),packageName:String(i.name||"")}}function Ui(){let s=[G.resolve(__dirname,".."),G.resolve(__dirname,"..","..","plugins",_e)];for(let e of s){if(!K.existsSync(G.join(e,".codex-plugin","plugin.json"))||!K.existsSync(G.join(e,"package.json")))continue;let t=Zn(e,"\u5185\u7F6E Microi Agentx \u63D2\u4EF6");if(t.name===_e&&t.packageName===gn&&t.version)return{root:e,version:t.version}}throw new Error("CLI \u7F3A\u5C11\u5B8C\u6574\u7684 Microi Agentx \u63D2\u4EF6\u6587\u4EF6\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\u6700\u65B0\u7248 @microi.net/cli")}function ji(s){if(!s||s.name!==_e)return!1;if(s.source?.source==="local")return String(s.source.path||"").replace(/\\/g,"/").replace(/^\.\//,"")==="plugins/microi";let e=[gn,os];return s.source?.source==="npm"&&e.includes(s.source.package||"")}function ls(){let s=K.readFileSync(Bi(),"utf8"),e;try{e=JSON.parse(s)}catch(r){throw new Error(`Codex marketplace \u6A21\u677F\u65E0\u6CD5\u89E3\u6790\uFF1A${r instanceof Error?r.message:String(r)}`)}let t=e.plugins?.find(r=>r.name===_e);if(e.name!==Le||t?.source?.source!=="local"||String(t.source.path||"").replace(/\\/g,"/").replace(/^\.\//,"")!=="plugins/microi")throw new Error("Codex marketplace \u6A21\u677F\u8EAB\u4EFD\u4E0D\u5408\u6CD5\uFF0C\u62D2\u7EDD\u5199\u5165\u5168\u5C40\u914D\u7F6E");let n=Ui();return{manifest:e,content:`${JSON.stringify(e,null,2)}
1989
+ `,expectedVersion:n.version,pluginRoot:n.root}}function Ki(s,e){let t=`${s}.${process.pid}.${Date.now()}.tmp`;try{K.writeFileSync(t,e,"utf8"),K.renameSync(t,s)}finally{try{K.existsSync(t)&&K.unlinkSync(t)}catch{}}}function ds(){return G.resolve(process.env.CODEX_HOME||G.join(is.homedir(),".codex"))}function Hi(s,e,t){let n=G.resolve(s),r=G.resolve(e),i=G.relative(n,r);if(!i||!i.startsWith("..")&&!G.isAbsolute(i))throw new Error(`Codex \u63D2\u4EF6\u76EE\u6807\u76EE\u5F55\u4E0D\u80FD\u4F4D\u4E8E npm \u5305\u5185\u90E8\uFF1A${r}`);if(K.existsSync(r)){let d=Zn(r,"\u73B0\u6709 Microi Agentx \u63D2\u4EF6"),u=[gn,os];if(d.name!==_e||!u.includes(d.packageName))throw new Error(`\u76EE\u6807\u76EE\u5F55\u5305\u542B\u975E Microi \u7BA1\u7406\u7684\u63D2\u4EF6\uFF0C\u62D2\u7EDD\u8986\u76D6\uFF1A${r}`)}let o=G.dirname(r);K.mkdirSync(o,{recursive:!0});let a=`${process.pid}-${Date.now()}`,c=G.join(o,`.microi-staging-${a}`),l=G.join(o,`.microi-backup-${a}`),g=!1;try{K.cpSync(n,c,{recursive:!0,errorOnExist:!0});let d=Zn(c,"\u5F85\u5B89\u88C5 Microi Agentx \u63D2\u4EF6");if(d.name!==_e||d.packageName!==gn||d.version!==t)throw new Error("\u5F85\u5B89\u88C5\u7684 Microi Agentx \u63D2\u4EF6\u8EAB\u4EFD\u6216\u7248\u672C\u4E0D\u4E00\u81F4");K.existsSync(r)&&(K.renameSync(r,l),g=!0),K.renameSync(c,r)}catch(d){if(!K.existsSync(r)&&g&&K.existsSync(l))try{K.renameSync(l,r)}catch{}throw d}finally{try{K.existsSync(c)&&K.rmSync(c,{recursive:!0,force:!0})}catch{}}try{K.existsSync(l)&&K.rmSync(l,{recursive:!0,force:!0})}catch{}}function Wi(s,e,t){let n=ds(),r=G.join(n,"microi-net-marketplace"),i=G.join(r,".agents","plugins","marketplace.json"),o=G.join(r,"plugins",_e);if(K.mkdirSync(G.dirname(i),{recursive:!0}),K.existsSync(i)){let a;try{a=JSON.parse(K.readFileSync(i,"utf8"))}catch(l){throw new Error(`\u5DF2\u5B58\u5728\u7684 Microi marketplace \u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1A${i}\uFF08${l instanceof Error?l.message:String(l)}\uFF09`)}let c=a.plugins?.find(l=>l.name===_e);if(a.name!==Le||!ji(c))throw new Error(`\u76EE\u6807\u76EE\u5F55\u5305\u542B\u975E Microi \u7BA1\u7406\u7684 marketplace\uFF0C\u62D2\u7EDD\u8986\u76D6\uFF1A${i}`)}return Hi(e,o,t),(!K.existsSync(i)||K.readFileSync(i,"utf8")!==s)&&Ki(i,s),r}function Gi(s){let e=s.trim();if(!e||/[\r\n]/.test(e))throw new Error("Codex marketplace source \u65E0\u6548");let t=G.resolve(e);if(K.existsSync(t))return t;if(G.isAbsolute(e)||e.startsWith("."))throw new Error(`Codex marketplace \u672C\u5730\u8DEF\u5F84\u4E0D\u5B58\u5728\uFF1A${t}`);return e}function un(s,e){let t=$i(Ie(s,["plugin","marketplace","list"]).stdout),n=Li(Ie(s,["plugin","list"]).stdout),r=t.find(u=>u.name===Le),i=n.find(u=>u.selector===Ne),o=t.some(u=>u.name===xt),a=n.some(u=>u.selector===dn&&/^installed\b/i.test(u.status)),c=!!(i&&/^installed\b/i.test(i.status)),l=!!(i&&/enabled/i.test(i.status)),g=!e||i?.version===e,d=c?l?g?"none":"update":"enable":"install";return{ok:c&&l&&g,codex:{found:!0,command:s.displayPath,version:s.version},marketplace:{name:Le,configured:!!r,root:r?.root||""},plugin:{selector:Ne,installed:c,enabled:l,version:i?.version||"",expectedVersion:e},legacy:{marketplaceConfigured:o,pluginInstalled:a},action:d}}function us(){let{expectedVersion:s}=ls(),e=cs();return e?un(e,s):{ok:!1,codex:{found:!1,command:"",version:""},marketplace:{name:Le,configured:!1,root:""},plugin:{selector:Ne,installed:!1,enabled:!1,version:"",expectedVersion:s},legacy:{marketplaceConfigured:!1,pluginInstalled:!1},action:"install-codex"}}function gs(s={}){let{content:e,expectedVersion:t,pluginRoot:n}=ls(),r=cs();if(!r)throw new Error("\u672A\u627E\u5230\u53EF\u6267\u884C\u7684 Codex CLI\u3002\u8BF7\u5148\u5B89\u88C5\u6216\u66F4\u65B0 Codex\uFF0C\u518D\u6267\u884C microi codex install --yes");K.mkdirSync(ds(),{recursive:!0});let i=un(r,t);if(i.ok&&!s.force){i.legacy.pluginInstalled&&Ie(r,["plugin","remove",dn]),i.legacy.marketplaceConfigured&&Ie(r,["plugin","marketplace","remove",xt]);let d=i.legacy.pluginInstalled||i.legacy.marketplaceConfigured;return{installed:!0,changed:d,selector:Ne,version:i.plugin.version,migratedFrom:d?xt:void 0,restartRequired:d}}let o=s.marketplaceSource?Gi(s.marketplaceSource):Wi(e,n,t);i.marketplace.configured||Ie(r,["plugin","marketplace","add",o]);let a=un(r,t);if(!a.marketplace.configured)throw new Error(`Codex \u672A\u80FD\u6CE8\u518C marketplace ${Le}`);let c;s.force&&a.plugin.installed?(Ie(r,["plugin","remove",Ne]),c=Ie(r,["plugin","add",Ne],!0)):c=Ie(r,["plugin","add",Ne],!0);let l=un(r,t);if(!l.plugin.installed||!l.plugin.enabled){let d=s.force?"--force \u5DF2\u6267\u884C\u663E\u5F0F\u91CD\u88C5\uFF0C\u8BF7\u68C0\u67E5\u4E0A\u65B9\u9519\u8BEF\u540E\u91CD\u8BD5\u3002":"\u539F\u6709\u63D2\u4EF6\u672A\u88AB\u5220\u9664\u3002";throw new Error(`\u5B89\u88C5 ${Ne} \u5931\u8D25\uFF0C${d}${Xn(c)?`
1990
+ ${Xn(c)}`:""}`.trim())}if(l.plugin.version!==t)throw new Error(`\u5F53\u524D\u5DF2\u5B89\u88C5 ${l.plugin.version||"\u672A\u77E5\u7248\u672C"}\uFF0C\u76EE\u6807\u63D2\u4EF6\u5FEB\u7167\u4E3A ${t}\u3002\u8BF7\u4F7F\u7528 --force \u663E\u5F0F\u91CD\u88C5\u3002`);let g=i.legacy.pluginInstalled?dn:"";return i.legacy.pluginInstalled&&Ie(r,["plugin","remove",dn]),i.legacy.marketplaceConfigured&&Ie(r,["plugin","marketplace","remove",xt]),{installed:!0,changed:!0,selector:Ne,version:l.plugin.version,marketplace:Le,marketplaceSource:o,migratedFrom:g||void 0,restartRequired:!0,next:"\u65B0\u5EFA Codex \u4EFB\u52A1\u6216\u91CD\u8F7D Codex\uFF0C\u4F7F\u63D2\u4EF6 Skills \u4E0E MCP \u751F\u6548\u3002"}}var rr=O(require("child_process")),Pe=O(require("fs")),pn=O(require("os")),ee=O(require("path")),Ve="@microi.net/cli",zi=["web","headless"],Ji="https://registry.npmjs.org/";function mn(s){try{let e=JSON.parse(Pe.readFileSync(s,"utf8"));return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}catch{return}}function Fe(s){return s&&typeof s=="object"&&!Array.isArray(s)?s:void 0}function ps(){let s=[ee.resolve(__dirname,".."),ee.resolve(__dirname,"..","..","plugins","microi")];for(let e of s){let t=mn(ee.join(e,"package.json")),n=Fe(t?.dsh),r=Fe(n?.bundle),i=String(r?.patch||""),o=String(t?.version||"");if(!(t?.name!==Ve||!o||i!=="./cordis.patch.yml")&&Pe.existsSync(ee.join(e,"cordis.patch.yml")))return{root:e,version:o,patch:i}}throw new Error("CLI \u7F3A\u5C11\u5B8C\u6574\u7684 Microi DeepSeek Harness bundle\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\u6700\u65B0\u7248 @microi.net/cli")}function qi(s){let e=ee.extname(s).toLowerCase();return e===".js"||e===".cjs"||e===".mjs"?{command:process.execPath,prefixArgs:[s],displayPath:s}:process.platform==="win32"&&(e===".cmd"||e===".bat")?{command:process.env.ComSpec||"cmd.exe",prefixArgs:["/d","/s","/c",s],displayPath:s}:{command:s,prefixArgs:[],displayPath:s}}function ms(s,e,t=3e4){let n=rr.spawnSync(s.command,[...s.prefixArgs,...e],{cwd:process.cwd(),encoding:"utf8",windowsHide:!0,timeout:t,maxBuffer:33554432,env:{...process.env}});return{status:typeof n.status=="number"?n.status:1,stdout:String(n.stdout||""),stderr:[n.error?.message,n.stderr].filter(Boolean).join(`
1991
+ `)}}function Qi(){let s=String(process.env.MICROI_DSH_PATH||"").trim();if(s){let n=ee.resolve(s);if(!Pe.existsSync(n))throw new Error(`MICROI_DSH_PATH \u6307\u5411\u7684\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${n}`);return[n]}let e=process.platform==="win32"?[["where.exe",["dsh.exe"]],["where.exe",["dsh.cmd"]],["where.exe",["dsh"]]]:[["which",["dsh"]]],t=[];for(let[n,r]of e){let i=rr.spawnSync(n,r,{encoding:"utf8",windowsHide:!0,timeout:3e3});i.status===0&&t.push(...String(i.stdout||"").split(/\r?\n/).map(o=>o.trim()).filter(Boolean))}return process.platform!=="win32"&&t.push("dsh"),[...new Map(t.map(n=>[process.platform==="win32"?n.toLowerCase():n,n])).values()]}function fs(){for(let s of Qi()){if(ee.isAbsolute(s)&&!Pe.existsSync(s))continue;let e=qi(s),t=ms(e,["--version"],5e3);if(t.status!==0)continue;let n=t.stdout.trim()||t.stderr.trim();if(n)return{...e,version:n}}}function Yi(s){return s==="~"?pn.homedir():s.startsWith("~/")||s.startsWith("~\\")?ee.join(pn.homedir(),s.slice(2)):s}function tr(){let s=String(process.env.DSH_HOME||"").trim();return ee.resolve(Yi(s||ee.join(pn.homedir(),".dsh")))}function Xi(s){let e=s.trim();if(!e||e==="."||e===".."||e==="node_modules"||/[/\\]/.test(e))throw new Error(`DeepSeek Harness profile \u540D\u79F0\u65E0\u6548\uFF1A${JSON.stringify(s)}`);return e}function hs(s){return s?[Xi(s)]:[...zi]}function Zi(s,e){if(!e)return;let t=ee.resolve(s,e),n=ee.relative(s,t);if(!(!n||n.startsWith("..")||ee.isAbsolute(n)))return t}function nr(s,e,t){let n=ee.join(s,"profiles",e),r=mn(ee.join(n,"package.json")),i=Fe(r?.dependencies),o=Fe(r?.dsh),a=Fe(o?.profile),c=Array.isArray(a?.bundles)?a?.bundles.map(String):[],l=ee.join(n,"node_modules","@microi.net","cli"),g=mn(ee.join(l,"package.json")),d=Fe(g?.dsh),u=Fe(d?.bundle),p=String(u?.patch||""),m=Zi(l,p),f=!!r,y=typeof i?.[Ve]=="string",S=g?.name===Ve,h=S?String(g?.version||""):"",C=c.includes(Ve),w=p==="./cordis.patch.yml"&&!!(m&&Pe.existsSync(m)),b=h===t;return{profile:e,profileDir:n,initialized:f,dependencyDeclared:y,installed:S,active:C,installedVersion:h,expectedVersion:t,bundlePatch:p,bundlePatchExists:w,ok:f&&y&&S&&C&&w&&b,action:!S||!y?"install":!b||!w?"update":C?"none":"activate"}}function eo(s,e){let t=ps(),n=tr(),r=e.map(o=>nr(n,o,t.version)),i=s?r.some(o=>o.action==="install")?"install":r.some(o=>o.action==="update")?"update":r.some(o=>o.action==="activate")?"activate":"none":"install-dsh";return{ok:!!s&&r.every(o=>o.ok),dsh:{found:!!s,command:s?.displayPath||"",version:s?.version||"",home:n},package:{name:Ve,expectedVersion:t.version,bundlePatch:t.patch},profiles:r,action:i,requiresNewSession:i!=="none"&&i!=="install-dsh"}}function ys(s){return eo(fs(),hs(s))}function to(s){let e=ee.resolve(s);if(!Pe.existsSync(e))throw new Error(`DeepSeek Harness bundle \u672C\u5730\u6765\u6E90\u4E0D\u5B58\u5728\uFF1A${e}`);if(!Pe.statSync(e).isDirectory()){if(!/\.(?:tgz|tar\.gz)$/i.test(e))throw new Error("DeepSeek Harness bundle --source \u53EA\u63A5\u53D7\u672C\u5730\u76EE\u5F55\u6216 .tgz/.tar.gz");return e}let t=[e,ee.join(e,"plugins","microi")];for(let n of t){let r=mn(ee.join(n,"package.json")),i=Fe(r?.dsh),o=Fe(i?.bundle);if(r?.name===Ve&&o?.patch==="./cordis.patch.yml"&&Pe.existsSync(ee.join(n,"cordis.patch.yml")))return n}throw new Error(`\u672C\u5730\u6765\u6E90\u4E0D\u662F\u5B8C\u6574\u7684 ${Ve} DeepSeek Harness bundle\uFF1A${e}`)}function no(s){return[s.stderr,s.stdout].filter(Boolean).join(`
1992
+ `).trim().slice(0,5e3)}function Ss(s={}){let e=fs();if(!e)throw new Error("\u672A\u68C0\u6D4B\u5230 DeepSeek Harness dsh CLI\uFF1B\u8BF7\u5148\u6267\u884C npm install -g @deepseek-ai/dsh\uFF0C\u518D\u91CD\u8BD5 microi dsh install");let t=ps(),n=hs(s.profile),r=s.source?to(s.source):"",i=r||`${Ve}@${t.version}`,o=[];for(let c of n){let l=nr(tr(),c,t.version);if(l.ok&&!s.force){o.push({...l,changed:!1});continue}let g=["plugin","--profile",c,"add",i,"--save-exact",...r?[]:[`--registry=${Ji}`]],d=ms(e,g,5*6e4);if(d.status!==0)throw new Error(`DeepSeek Harness profile ${c} \u5B89\u88C5 Microi bundle \u5931\u8D25\uFF1A${no(d)||`exit ${d.status}`}`);let u=nr(tr(),c,t.version);if(!u.ok)throw new Error(`DeepSeek Harness profile ${c} \u5B89\u88C5\u540E\u6821\u9A8C\u5931\u8D25\uFF08action=${u.action}\uFF0Cversion=${u.installedVersion||"missing"}\uFF09`);o.push({...u,changed:!0})}let a=o.some(c=>c.changed);return{ok:!0,package:`${Ve}@${t.version}`,source:i,profiles:o,requiresNewSession:a,message:a?"Microi\u543E\u7801\u5DF2\u5B89\u88C5\u4E3A DeepSeek Harness profile bundle\uFF1B\u8BF7\u65B0\u5EFA DSH \u4F1A\u8BDD\u52A0\u8F7D\u65B0\u589E MCP \u5DE5\u5177\uFF0C\u5F53\u524D\u4F1A\u8BDD\u4E0D\u4F1A\u88AB\u7EC8\u6B62\u3002":"DeepSeek Harness \u4E2D\u7684 Microi\u543E\u7801 bundle \u5DF2\u662F\u5F53\u524D\u7248\u672C\uFF0C\u65E0\u9700\u6539\u52A8\u3002"}}var fn=O(require("crypto")),L=O(require("fs")),Lt=O(require("os")),U=O(require("path"));function sr(s){return s.normalize("NFKD").replace(/[^\x00-\x7F]/g,"").replace(/[^A-Za-z0-9_]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"").toLowerCase().slice(0,48)}function ws(s){try{return sr(new URL(s.apiBaseUrl.trim().replace(/\/+$/,"")).host)}catch{return sr(s.apiBaseUrl)}}function Cs(s){return sr(s.osClient||s.sysShortTitle||s.sysTitle||s.label||"")||ws(s)||"default"}function dt(s){let e=new Map;for(let r of s){let i=Cs(r);e.set(i,(e.get(i)||0)+1)}let t=new Set(Array.from(e).filter(([,r])=>r>1).map(([r])=>r)),n=new Set;return s.map(r=>{let i=ws(r),o=Cs(r),a=`microi_${o}`,c=t.has(o)&&i&&i!==o?`${a}_${i}`:a;n.has(c)&&i&&(c=`${a}_${i}`);let l=2;for(;n.has(c);)c=`${a}_${l++}`;return n.add(c),{profile:r,mcpName:c}})}var Ot="";function Be(){if(Ot)return Ot;try{let s=JSON.parse(L.readFileSync(U.join(__dirname,"..","package.json"),"utf8"));Ot=/^\d+(?:\.\d+){2}$/.test(String(s.version||""))?String(s.version):"0.0.0"}catch{Ot="0.0.0"}return Ot}function ro(s){return s.trim().replace(/\/+$/,"")}function so(){let s=`MCP:${Lt.hostname()||"Unknown"}`;return/^[\x20-\x7E]{1,128}$/.test(s)?s:`MCP-${fn.createHash("sha256").update(s).digest("hex").slice(0,16)}`}function vs(s){let e=U.basename(s).toLowerCase();return!!process.versions.electron||["code.exe","code - insiders.exe","cursor.exe","windsurf.exe","trae.exe","electron.exe"].includes(e)}function io(){return{command:process.execPath,isElectron:vs(process.execPath)}}function oo(s,e){let t=e.env;return/^microi(?:_|-|$)/i.test(s)||typeof t?.MICROI_API_URL=="string"}function Es(s,e){let t=`${s}.${process.pid}.${Date.now()}.tmp`;try{L.writeFileSync(t,e,"utf8"),L.renameSync(t,s)}finally{try{L.existsSync(t)&&L.unlinkSync(t)}catch{}}}function Me(s,e){if(L.existsSync(s)&&L.readFileSync(s).equals(e))return;L.mkdirSync(U.dirname(s),{recursive:!0});let t=`${process.pid}.${Date.now()}.${fn.randomBytes(4).toString("hex")}`,n=`${s}.${t}.stage`,r=`${s}.${t}.backup`,i=!1;try{L.writeFileSync(n,e),L.existsSync(s)&&(L.renameSync(s,r),i=!0),L.renameSync(n,s),i&&L.rmSync(r,{force:!0})}catch(o){if(!L.existsSync(s)&&i&&L.existsSync(r))try{L.renameSync(r,s)}catch{}throw o}finally{try{L.existsSync(n)&&L.rmSync(n,{force:!0})}catch{}}}function ao(){let s=Be();if(!/^\d+(?:\.\d+){2}$/.test(s))throw new Error(`CLI \u7248\u672C\u4E0D\u5408\u6CD5\uFF0C\u65E0\u6CD5\u521B\u5EFA MCP \u8FD0\u884C\u65F6\uFF1A${s}`);let e={launcher:U.join(__dirname,"microi-cli-mcp.js"),server:U.join(__dirname,"mcp-server.js"),adapter:U.join(__dirname,"mcp-codex-stdio-adapter.js"),router:U.join(__dirname,"microi-codex-router.js"),broker:U.join(__dirname,"microi-codex-broker.js"),cli:U.join(__dirname,"microi-cli.js"),trae:U.join(__dirname,"mcp-trae-windows-launcher.cmd")},t=Object.values(e).filter(u=>!L.existsSync(u));if(t.length>0)throw new Error(`CLI \u5B89\u88C5\u5305\u7F3A\u5C11\u5185\u7F6E MCP \u8FD0\u884C\u6587\u4EF6\uFF1A${t.join(", ")}`);let n=U.resolve(process.env.MICROI_RUNTIME_HOME||U.join(Lt.homedir(),".microi","runtime")),r=U.join(n,"versions"),i=U.join(r,s);L.mkdirSync(i,{recursive:!0}),Me(U.join(i,"microi-cli-mcp.js"),L.readFileSync(e.launcher)),Me(U.join(i,"mcp-server.js"),L.readFileSync(e.server)),Me(U.join(i,"microi-codex-router.js"),L.readFileSync(e.router)),Me(U.join(i,"microi-codex-broker.js"),L.readFileSync(e.broker)),Me(U.join(i,"microi-cli.js"),L.readFileSync(e.cli));let o=`#!/usr/bin/env node
1993
1993
  'use strict';
1994
1994
  const fs = require('node:fs');
1995
1995
  const path = require('node:path');
@@ -2001,24 +2001,24 @@ const target = path.resolve(versionsRoot, pointer.version, 'microi-cli-mcp.js');
2001
2001
  const relative = path.relative(versionsRoot, target);
2002
2002
  if (!relative || relative.startsWith('..') || path.isAbsolute(relative)) throw new Error('Unsafe Microi MCP runtime target');
2003
2003
  require(target);
2004
- `,a=U.join(n,"microi-cli-mcp.js"),c=U.join(n,"mcp-codex-stdio-adapter.js"),l=U.join(n,"microi-codex-router.js"),g=U.join(n,"mcp-trae-windows-launcher.cmd");_e(a,Buffer.from(o,"utf8"));let d=o.replace(/microi-cli-mcp\.js/g,"microi-codex-router.js");return _e(l,Buffer.from(d,"utf8")),_e(c,$.readFileSync(e.adapter)),_e(g,$.readFileSync(e.trae)),_e(U.join(n,"current.json"),Buffer.from(`${JSON.stringify({version:s,activatedAt:new Date().toISOString()},null,2)}
2005
- `,"utf8")),{root:n,launcherPath:a,adapterPath:c,routerPath:l,traeLauncherPath:g}}function dt(s,e,t,n=!1){$.mkdirSync(U.dirname(s),{recursive:!0});let r={};if($.existsSync(s))try{r=zt($.readFileSync(s,"utf8"))}catch(l){throw new Error(`MCP \u914D\u7F6E\u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u4E14\u505C\u6B62\u5199\u5165\uFF1A${s}\uFF08${l instanceof Error?l.message:String(l)}\uFF09`)}let i=r[e]&&typeof r[e]=="object"?r[e]:{},o=Object.fromEntries(Object.entries(t).map(([l,g])=>[l,n?Object.fromEntries(Object.entries(g).filter(([d])=>["command","args","env","url","headers"].includes(d))):g])),a=ns(i,o,{isManaged:to,isStableName:l=>/^microi_[a-z0-9_]+$/.test(l),removeManagedNotInNext:!0});r[e]=a.servers;let c=`${JSON.stringify(r,null,2)}
2006
- `;(!$.existsSync(s)||$.readFileSync(s,"utf8")!==c)&&Ts(s,c)}function xt(s){return JSON.stringify(String(s))}function ro(s){return`[${s.map(xt).join(", ")}]`}function so(s){return`{ ${Object.entries(s).filter(([,e])=>e!==""&&e!=null).map(([e,t])=>`${xt(e)} = ${xt(t)}`).join(", ")} }`}function io(s,e){let t=[],n=[];for(let o of s.split(/\r?\n/))/^\s*\[[^\]]+\]\s*$/.test(o)&&n.length&&(t.push(n),n=[]),n.push(o);n.length&&t.push(n);let r=new Set;return{cleaned:t.filter(o=>{let c=o.find(p=>p.trim())?.match(/^\s*\[mcp_servers\.(?:"([^"]+)"|([A-Za-z0-9_-]+))(?:\.|\])/)||null;if(!c)return!0;let l=(c[1]||c[2]||"").toLowerCase(),g=o.join(`
2007
- `);if(!(/^microi(?:_|-|$)/.test(l)||/\bMICROI_(?:API_URL|TOKEN_FILE|OS_CLIENT)\b/.test(g)))return!0;let u=g.match(/["']?MICROI_TOOL_VERSION["']?\s*=\s*["']([^"']+)["']/)?.[1]||"";return Nt(u,e)>0?(r.add(l),!0):!1}).map(o=>o.join(`
2004
+ `,a=U.join(n,"microi-cli-mcp.js"),c=U.join(n,"mcp-codex-stdio-adapter.js"),l=U.join(n,"microi-codex-router.js"),g=U.join(n,"mcp-trae-windows-launcher.cmd");Me(a,Buffer.from(o,"utf8"));let d=o.replace(/microi-cli-mcp\.js/g,"microi-codex-router.js");return Me(l,Buffer.from(d,"utf8")),Me(c,L.readFileSync(e.adapter)),Me(g,L.readFileSync(e.trae)),Me(U.join(n,"current.json"),Buffer.from(`${JSON.stringify({version:s,activatedAt:new Date().toISOString()},null,2)}
2005
+ `,"utf8")),{root:n,launcherPath:a,adapterPath:c,routerPath:l,traeLauncherPath:g}}function ut(s,e,t,n=!1){L.mkdirSync(U.dirname(s),{recursive:!0});let r={};if(L.existsSync(s))try{r=qt(L.readFileSync(s,"utf8"))}catch(l){throw new Error(`MCP \u914D\u7F6E\u65E0\u6CD5\u89E3\u6790\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\u4E14\u505C\u6B62\u5199\u5165\uFF1A${s}\uFF08${l instanceof Error?l.message:String(l)}\uFF09`)}let i=r[e]&&typeof r[e]=="object"?r[e]:{},o=Object.fromEntries(Object.entries(t).map(([l,g])=>[l,n?Object.fromEntries(Object.entries(g).filter(([d])=>["command","args","env","url","headers"].includes(d))):g])),a=ss(i,o,{isManaged:oo,isStableName:l=>/^microi_[a-z0-9_]+$/.test(l),removeManagedNotInNext:!0});r[e]=a.servers;let c=`${JSON.stringify(r,null,2)}
2006
+ `;(!L.existsSync(s)||L.readFileSync(s,"utf8")!==c)&&Es(s,c)}function $t(s){return JSON.stringify(String(s))}function co(s){return`[${s.map($t).join(", ")}]`}function lo(s){return`{ ${Object.entries(s).filter(([,e])=>e!==""&&e!=null).map(([e,t])=>`${$t(e)} = ${$t(t)}`).join(", ")} }`}function uo(s,e){let t=[],n=[];for(let o of s.split(/\r?\n/))/^\s*\[[^\]]+\]\s*$/.test(o)&&n.length&&(t.push(n),n=[]),n.push(o);n.length&&t.push(n);let r=new Set;return{cleaned:t.filter(o=>{let c=o.find(p=>p.trim())?.match(/^\s*\[mcp_servers\.(?:"([^"]+)"|([A-Za-z0-9_-]+))(?:\.|\])/)||null;if(!c)return!0;let l=(c[1]||c[2]||"").toLowerCase(),g=o.join(`
2007
+ `);if(!(/^microi(?:_|-|$)/.test(l)||/\bMICROI_(?:API_URL|TOKEN_FILE|OS_CLIENT)\b/.test(g)))return!0;let u=g.match(/["']?MICROI_TOOL_VERSION["']?\s*=\s*["']([^"']+)["']/)?.[1]||"";return Vt(u,e)>0?(r.add(l),!0):!1}).map(o=>o.join(`
2008
2008
  `)).join(`
2009
2009
  `).replace(/\n{3,}/g,`
2010
2010
 
2011
- `).trimEnd(),preservedNames:r}}function Cs(s,e,t,n,r){$.mkdirSync(U.dirname(s),{recursive:!0});let i=$.existsSync(s)?$.readFileSync(s,"utf8"):"",o=Le(),{cleaned:a,preservedNames:c}=io(i,o),l=Object.values(e).find(f=>typeof f.command=="string"),g=String(l?.command||""),d={...l?.env||{}},u=Object.fromEntries(Object.entries(d).filter(([f])=>!f.startsWith("MICROI_")));g&&ws(g)&&(u.ELECTRON_RUN_AS_NODE="1");let p=l&&c.size===0?["[mcp_servers.microi_codex]",`command = ${xt(g)}`,`args = ${ro([t,n])}`,`cwd = ${xt(r)}`,`env = ${so({...u,MICROI_CODEX_MODE:"1",MICROI_TOOL_SOURCE:"cli-codex-router",MICROI_TOOL_VERSION:o,MICROI_WORKSPACE_ROOT:r})}`,'enabled_tools = ["microi_codex"]','default_tools_approval_mode = "auto"'].join(`
2011
+ `).trimEnd(),preservedNames:r}}function Ts(s,e,t,n,r){L.mkdirSync(U.dirname(s),{recursive:!0});let i=L.existsSync(s)?L.readFileSync(s,"utf8"):"",o=Be(),{cleaned:a,preservedNames:c}=uo(i,o),l=Object.values(e).find(f=>typeof f.command=="string"),g=String(l?.command||""),d={...l?.env||{}},u=Object.fromEntries(Object.entries(d).filter(([f])=>!f.startsWith("MICROI_")));g&&vs(g)&&(u.ELECTRON_RUN_AS_NODE="1");let p=l&&c.size===0?["[mcp_servers.microi_codex]",`command = ${$t(g)}`,`args = ${co([t,n])}`,`cwd = ${$t(r)}`,`env = ${lo({...u,MICROI_CODEX_MODE:"1",MICROI_TOOL_SOURCE:"cli-codex-router",MICROI_TOOL_VERSION:o,MICROI_WORKSPACE_ROOT:r})}`,'enabled_tools = ["microi_codex"]','default_tools_approval_mode = "auto"'].join(`
2012
2012
  `):"",m=[a,p].filter(Boolean).join(`
2013
2013
 
2014
2014
  `)+`
2015
- `;(!$.existsSync(s)||i!==m)&&Ts(s,m)}function oo(s,e){let t=e.label||e.sysShortTitle||e.sysTitle||e.apiBaseUrl||"\u672A\u547D\u540D\u670D\u52A1\u5668";return U.join(s.getSyncRootDir(),s.buildServerDirName(t,e.apiBaseUrl),s.buildOsClientDirName(e.osClient,e.osClientType,e.osClientNetwork),Cr)}function ao(s,e,t){let n={...s.env||{}},r=String(s.command||""),i=Array.isArray(s.args)?s.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}}function co(s){return typeof s.url=="string"&&s.url.trim()?{url:s.url,...s.headers&&typeof s.headers=="object"?{headers:{...s.headers}}:{}}:{command:String(s.command||""),args:Array.isArray(s.args)?s.args.map(String):[],...s.env&&typeof s.env=="object"?{env:{...s.env}}:{}}}function lo(s){return typeof s.url=="string"&&s.url.trim()?{transportType:"streamableHttp",url:s.url,...s.headers&&typeof s.headers=="object"?{headers:{...s.headers}}:{}}:{transportType:"stdio",command:String(s.command||""),args:Array.isArray(s.args)?s.args.map(String):[],...s.env&&typeof s.env=="object"?{env:{...s.env}}:{},...typeof s.cwd=="string"&&s.cwd?{cwd:s.cwd}:{}}}async function $t(s,e={}){let t=I.getInstance(),n=Ce.getInstance(),r=j.getInstance(),i=t.getProfiles(),o=Le(),a=no(),c=a.launcherPath,l=a.adapterPath,g=a.routerPath,d=a.traeLauncherPath,u=eo(),p={};for(let{profile:h,mcpName:C}of lt(i)){let T=n.mcpTokenFilePath,b=T?U.join(U.dirname(T),Rt):"",v=n.getCredentialSecretKeys(h),k=r.getTokenForServer(h.apiBaseUrl,h.osClient,h.osClientType,h.osClientNetwork);!T||!k&&!$.existsSync(b)||(p[C]={type:"stdio",command:u.command,args:[c],cwd:a.root,env:{...u.isElectron?{ELECTRON_RUN_AS_NODE:"1"}:{},MICROI_API_URL:Xi(h.apiBaseUrl),MICROI_TOKEN_FILE:T,MICROI_AUTH_RECOVERY_DIR:n.mcpAuthRecoveryDirPath,MICROI_WORKSPACE_CREDENTIAL_FILE:b,MICROI_WORKSPACE_USERNAME_KEY:v.usernameKey,MICROI_WORKSPACE_PASSWORD_KEY:v.passwordKey,MICROI_OS_CLIENT:h.osClient||"",MICROI_OS_CLIENT_TYPE:h.osClientType||"",MICROI_OS_CLIENT_NETWORK:h.osClientNetwork||"",MICROI_WORKSPACE_ROOT:s,MICROI_SYNC_ROOT:t.getSyncRootDir(),MICROI_AI_APPLICATIONS_DIR:oo(t,h),MICROI_LABEL_BASE64:Buffer.from(h.label||"","utf8").toString("base64"),MICROI_MCP_DID:Zi(),MICROI_TOOL_SOURCE:"cli",MICROI_TOOL_VERSION:o}})}await n.writeMcpTokenFile(),rt(s),Oe(s,[".vscode/mcp.json",".cursor/mcp.json",".trae/mcp.json",".workbuddy/mcp.json",".comate/mcp.json",".mcp.json",".codex/config.toml","Microi-V8-Engine/.microi-mcp-tokens.json",`Microi-V8-Engine/${Rt}`]),dt(U.join(s,".vscode","mcp.json"),"servers",p),dt(U.join(s,".cursor","mcp.json"),"mcpServers",p);let m=Object.fromEntries(Object.entries(p).map(([h,C])=>[h,ao(C,l,d)]));dt(U.join(s,".trae","mcp.json"),"mcpServers",m,!0);let f=Object.fromEntries(Object.entries(p).map(([h,C])=>[h,co(C)]));dt(U.join(s,".workbuddy","mcp.json"),"mcpServers",f,!0);let y=Object.fromEntries(Object.entries(p).map(([h,C])=>[h,lo(C)]));dt(U.join(s,".comate","mcp.json"),"mcpServers",y),dt(U.join(s,".mcp.json"),"mcpServers",p,!0);let S=process.env.CODEX_HOME||U.join(Ot.homedir(),".codex");return e.globalCodex!==!1&&Cs(U.join(S,"config.toml"),p,l,g,s),Cs(U.join(s,".codex","config.toml"),p,l,g,s),{count:Object.keys(p).length,names:Object.keys(p)}}var mn=B(require("fs")),ut=B(require("path"));async function vs(s,e){let t=ut.resolve(s);if(!mn.existsSync(t)||!mn.statSync(t).isDirectory())throw new Error(`\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u76EE\u5F55\uFF1A${t}`);fr(t);let n=I.getInstance(),r=j.getInstance(),i=Ce.getInstance();if(!e&&process.platform!=="win32"&&process.platform!=="darwin")throw new Error("\u5F53\u524D CLI \u7248\u672C\u4EC5\u652F\u6301 Windows DPAPI \u4E0E macOS Keychain \u5DE5\u4F5C\u533A\u51ED\u636E");let o=n.getWorkspaceStateFilePath(yt),a=e||(process.platform==="darwin"?new en(o):new tn(ut.join(ut.dirname(o),Rt)));return r.setSecretStorage(a),i.setSecretStorage(a),i.setMcpTokenFilePath(o),await i.loadMcpTokenFile(),{root:t,config:n,api:r,auth:i}}function Lt(s,e){let t=s.getProfiles();if(!t.length)throw new Error("\u5C1A\u672A\u6DFB\u52A0\u670D\u52A1\u5668\u8FDE\u63A5\uFF0C\u8BF7\u5148\u6267\u884C microi profile add");if(!e)return t[0];let n=Number(e);if(Number.isInteger(n)&&n>=1&&n<=t.length)return t[n-1];let r=e.toLowerCase(),i=t.filter(o=>o.osClient.toLowerCase()===r||o.label.toLowerCase()===r||`${o.apiBaseUrl}|${o.osClient}`.toLowerCase()===r);if(i.length===0){let o=lt(t).filter(a=>a.mcpName.toLowerCase()===r).map(a=>a.profile);if(o.length===1)return o[0]}if(i.length!==1)throw new Error(`\u65E0\u6CD5\u552F\u4E00\u5B9A\u4F4D\u670D\u52A1\u5668\u8FDE\u63A5\uFF1A${e}`);return i[0]}function We(s,e){return!!s.api.getTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork)}var Cn=B(require("child_process")),wn=B(require("crypto")),L=B(require("fs")),ks=B(require("os")),Y=B(require("path"));var Ps="https://registry.npmjs.org/",or="@microi.net/cli",uo=24*60*60*1e3,yn=15*60*1e3,Ds=30*60*1e3;function fn(s){return typeof s=="string"&&s.trim().length>0}function go(s){if(!s||typeof s!="object"||Array.isArray(s))return!1;let e=s;return Array.isArray(e.profiles)&&e.profiles.some(t=>{if(!t||typeof t!="object"||Array.isArray(t))return!1;let n=t;return fn(n.apiBaseUrl)&&fn(n.osClient)})?!0:fn(e.apiBaseUrl)&&fn(e.osClient)}function po(s){try{let e=Y.resolve(s);if(!L.existsSync(e)||!L.statSync(e).isDirectory())return!1;let t=new Set([Y.join(e,De)]);for(let n of L.readdirSync(e,{withFileTypes:!0}))n.isDirectory()&&n.name.toLowerCase()===De.toLowerCase()&&t.add(Y.join(e,n.name));for(let n of t){let r=Y.join(n,Kt);if(!L.existsSync(r))continue;let i=L.statSync(r);if(!(!i.isFile()||i.size>2*1024*1024)&&go(JSON.parse(L.readFileSync(r,"utf8"))))return!0}}catch{}return!1}function pt(){let s=Y.resolve(process.env.MICROI_UPDATE_HOME||Y.join(ks.homedir(),".microi","updater"));return{root:s,status:Y.join(s,"status.json"),log:Y.join(s,"update.log"),lock:Y.join(s,"update.lock")}}function Rs(s,e){L.mkdirSync(Y.dirname(s),{recursive:!0});let t=`${s}.${process.pid}.${Date.now()}.${wn.randomBytes(3).toString("hex")}.tmp`;try{L.writeFileSync(t,e),L.existsSync(s)&&L.rmSync(s,{force:!0}),L.renameSync(t,s)}finally{try{L.existsSync(t)&&L.rmSync(t,{force:!0})}catch{}}}function mo(s){Rs(pt().status,`${JSON.stringify(s,null,2)}
2016
- `)}function fo(){try{return JSON.parse(L.readFileSync(pt().status,"utf8"))}catch{return}}function Is(s){let e=pt();L.mkdirSync(e.root,{recursive:!0}),L.appendFileSync(e.log,`[${new Date().toISOString()}] ${s}
2017
- `,"utf8")}function gt(s,e){try{mo(s)}catch{}if(e)try{Is(e)}catch{}}function Sn(s){let e=String(s||"").trim().match(/^(\d+)\.(\d+)\.(\d+)$/);return e?e.slice(1).map(Number):void 0}function ho(s,e){let t=Sn(s),n=Sn(e);if(!t||!n)return s.localeCompare(e);for(let r=0;r<3;r+=1)if(t[r]!==n[r])return t[r]-n[r];return 0}function hn(s,e,t=12e4,n=!1){let r=Cn.spawnSync(s,e,{encoding:"utf8",windowsHide:!0,timeout:t,maxBuffer:33554432,shell:n});return{ok:r.status===0,status:typeof r.status=="number"?r.status:1,stdout:String(r.stdout||""),stderr:[r.error?.message,r.stderr].filter(Boolean).join(`
2018
- `).trim()}}function ar(s,e=12e4){let t=String(process.env.MICROI_NPM_PATH||"").trim();if(t){let n=Y.resolve(t);return/\.(?:c?m?js)$/i.test(n)?hn(process.execPath,[n,...s],e):hn(n,s,e,process.platform==="win32"&&/\.(?:cmd|bat)$/i.test(n))}return hn(process.platform==="win32"?"npm.cmd":"npm",s,e,process.platform==="win32")}function Es(){let s=ar(["root","--global"],3e4);return s.ok?s.stdout.trim():""}function bs(s){if(!s)return;let e=Y.join(s,"@microi.net","cli"),t=Y.join(e,"scripts","microi-cli.js"),n=Y.join(e,"package.json");try{let r=JSON.parse(L.readFileSync(n,"utf8")),i=String(r.version||"");return!L.existsSync(t)||!Sn(i)?void 0:{cliPath:t,version:i}}catch{return}}function Ve(s,e,t=12e4){return hn(process.execPath,[s,...e],t)}function yo(){let s=ar(["view",or,"version","--json","--prefer-online",`--registry=${Ps}`],45e3);if(!s.ok)throw new Error(s.stderr||s.stdout||"npm registry query failed");let e=s.stdout.trim();try{e=String(JSON.parse(e))}catch{e=e.replace(/^"|"$/g,"")}if(!Sn(e))throw new Error(`npm registry returned invalid version: ${e}`);return e}function So(s){return ar(["install","--global",`${or}@${s}`,`--registry=${Ps}`,"--prefer-online","--no-audit","--no-fund"],5*6e4)}function be(s){return(s.stderr||s.stdout||`exit ${s.status}`).trim().slice(0,2e3)}function sr(s){return/(?:未检测到|未找到|not found|cannot find).*Codex|Codex CLI.*(?:未检测到|未找到|not found|cannot find)/i.test(be(s))}function ir(s){return/(?:未检测到|未找到|not found|cannot find).*DeepSeek Harness|DeepSeek Harness.*(?:未检测到|未找到|not found|cannot find)/i.test(be(s))}function Co(s){let e=Y.resolve(Y.dirname(s),"..");try{let t=JSON.parse(L.readFileSync(Y.join(e,"package.json"),"utf8"));return t.name!==or||t.dsh?.bundle?.patch!=="./cordis.patch.yml"||!L.existsSync(Y.join(e,"cordis.patch.yml"))?void 0:e}catch{return}}function wo(s,e){if(!s||s.currentVersion!==e)return!0;let t=Date.parse(s.attemptedAt||"");if(!Number.isFinite(t))return!0;let n=Date.now()-t;return s.state==="completed"||s.state==="completed-with-warnings"?n>=uo:s.state==="scheduled"||s.state==="running"?n>=Ds:n>=yn}function cr(s){let e=pt(),t=Y.resolve(s.sourceCliPath||process.argv[1]||"");if(!L.existsSync(t))throw new Error(`\u65E0\u6CD5\u627E\u5230 Microi CLI \u66F4\u65B0\u5165\u53E3\uFF1A${t}`);let n=fo();if(!s.force&&!wo(n,s.currentVersion))return{scheduled:!1,reason:`recent-${n?.state||"unknown"}`,statusPath:e.status};L.mkdirSync(e.root,{recursive:!0});let r=s.currentVersion.replace(/[^0-9.]/g,"")||"unknown",i=Y.join(e.root,`microi-update-worker-${r}-${process.pid}-${wn.randomBytes(4).toString("hex")}.js`);Rs(i,L.readFileSync(t));let o=new Date().toISOString();gt({state:"scheduled",currentVersion:s.currentVersion,workspace:s.workspace,message:"\u540E\u53F0\u66F4\u65B0\u5DF2\u6392\u961F\uFF1B\u5F53\u524D\u5DE5\u4F5C\u7EE7\u7EED\u4F7F\u7528\u73B0\u6709\u7248\u672C\u3002",attemptedAt:o});let a=[i,"update","--worker","--current-version",s.currentVersion,"--source-cli",t,"--json",...s.workspace?["--workspace",Y.resolve(s.workspace)]:[]],c=Cn.spawn(process.execPath,a,{cwd:e.root,detached:!0,windowsHide:!0,stdio:"ignore",env:{...process.env}});return c.once("error",l=>{let g=new Date(Date.now()+yn).toISOString();gt({state:"deferred",currentVersion:s.currentVersion,workspace:s.workspace,message:`\u540E\u53F0\u66F4\u65B0\u8FDB\u7A0B\u6682\u65F6\u65E0\u6CD5\u542F\u52A8\uFF1A${l.message}\uFF1B\u4E0D\u5F71\u54CD\u5F53\u524D\u5DE5\u4F5C\u3002`,attemptedAt:o,nextRetryAt:g})}),c.unref(),{scheduled:!0,reason:"scheduled",statusPath:e.status,workerPid:c.pid}}function To(){let s=pt();L.mkdirSync(s.root,{recursive:!0});let e=`${process.pid}-${Date.now()}-${wn.randomBytes(6).toString("hex")}`;for(let t=0;t<2;t+=1)try{let n=L.openSync(s.lock,"wx");return L.writeFileSync(n,`${JSON.stringify({token:e,pid:process.pid,startedAt:new Date().toISOString()})}
2019
- `),L.closeSync(n),{token:e,release:()=>{try{JSON.parse(L.readFileSync(s.lock,"utf8")).token===e&&L.rmSync(s.lock,{force:!0})}catch{}}}}catch(n){if((n&&typeof n=="object"?n.code:"")!=="EEXIST")throw n;try{if(Date.now()-L.statSync(s.lock).mtimeMs<Ds)return;L.rmSync(s.lock,{force:!0})}catch{}}}function _s(s){let e=new Date().toISOString(),t;try{t=To()}catch(a){let c={state:"deferred",currentVersion:s.currentVersion,workspace:s.workspace,message:`\u65E0\u6CD5\u521B\u5EFA\u540E\u53F0\u66F4\u65B0\u72B6\u6001\u76EE\u5F55\uFF1A${a instanceof Error?a.message:String(a)}\uFF1B\u4E0D\u5F71\u54CD\u5F53\u524D\u6216\u65B0\u5EFA\u5DE5\u4F5C\u3002`,attemptedAt:e,nextRetryAt:new Date(Date.now()+yn).toISOString()};return gt(c,c.message),c}if(!t)return{state:"scheduled",currentVersion:s.currentVersion,workspace:s.workspace,message:"\u5DF2\u6709\u540E\u53F0\u66F4\u65B0\u6B63\u5728\u8FD0\u884C\uFF1B\u5F53\u524D\u5DE5\u4F5C\u7EE7\u7EED\u4F7F\u7528\u73B0\u6709\u7248\u672C\u3002",attemptedAt:e};let n=[],r=s.workspace?Y.resolve(s.workspace):void 0,i=!!r&&po(r),o=(a,c,l)=>{let g={state:"deferred",currentVersion:s.currentVersion,latestVersion:c,globalVersion:l,workspace:s.workspace,message:`${a}\uFF1B\u5DF2\u5EF6\u540E\u91CD\u8BD5\uFF0C\u4E0D\u5F71\u54CD\u5F53\u524D\u6216\u65B0\u5EFA\u5DE5\u4F5C\u3002`,warnings:n,attemptedAt:e,finishedAt:new Date().toISOString(),nextRetryAt:new Date(Date.now()+yn).toISOString()};return gt(g,g.message),g};try{let a={state:"running",currentVersion:s.currentVersion,workspace:s.workspace,message:"\u6B63\u5728\u540E\u53F0\u68C0\u67E5\u5B98\u65B9\u66F4\u65B0\uFF1B\u5F53\u524D\u5DE5\u4F5C\u4E0D\u7B49\u5F85\u3002",attemptedAt:e,workerPid:process.pid};gt(a,`update started from ${s.currentVersion}`);let c;try{c=yo()}catch(h){return o(`\u65E0\u6CD5\u8BBF\u95EE npm \u5B98\u65B9 registry\uFF1A${h instanceof Error?h.message:String(h)}`)}let l=Es(),g=bs(l);if(!g||ho(g.version,c)<0){let h=So(c);if(!h.ok){let C=be(h),T=/\b(?:EBUSY|EPERM|EACCES)\b/i.test(C);if(T&&s.sourceCliPath&&L.existsSync(s.sourceCliPath)){let b=Ve(s.sourceCliPath,["codex","install","--yes","--json"],18e4);!b.ok&&!sr(b)&&n.push(`\u5F53\u524D Codex \u63D2\u4EF6\u5FEB\u7167\u6682\u672A\u9884\u7F6E\uFF1A${be(b)}`);let v=Co(s.sourceCliPath),k=Ve(s.sourceCliPath,["dsh","install",...v?["--source",v]:[],"--json"],5*6e4);if(!k.ok&&!ir(k)&&n.push(`\u5F53\u524D DeepSeek Harness bundle \u5FEB\u7167\u6682\u672A\u9884\u7F6E\uFF1A${be(k)}`),i&&r){let V=Ve(s.sourceCliPath,["ai","init","--workspace",r,"--json"],18e4);V.ok||n.push(`\u7248\u672C\u9694\u79BB MCP \u5165\u53E3\u6682\u672A\u9884\u7F6E\uFF1A${be(V)}`)}}return o(T?"\u5168\u5C40 CLI \u6B63\u88AB\u8FD0\u884C\u4E2D\u7684\u65E7\u4EFB\u52A1\u5360\u7528\uFF0C\u5C06\u5728\u7A7A\u95F2\u540E\u91CD\u8BD5\uFF0C\u7EDD\u4E0D\u7EC8\u6B62\u65E7\u4EFB\u52A1":`\u5168\u5C40 CLI \u81EA\u52A8\u5B89\u88C5\u6682\u672A\u5B8C\u6210\uFF1A${C}`,c,g?.version)}l=Es(),g=bs(l)}if(!g)return o("\u5168\u5C40 CLI \u5B89\u88C5\u540E\u672A\u627E\u5230\u53EF\u6267\u884C\u6587\u4EF6",c);let d=g.cliPath,u=Ve(d,["codex","install","--yes","--json"],3*6e4),p=u.ok||!sr(u);!u.ok&&p&&n.push(`Codex \u63D2\u4EF6\u7A0D\u540E\u91CD\u8BD5\uFF1A${be(u)}`);let m=Ve(d,["dsh","install","--json"],5*6e4),f=m.ok||!ir(m);if(!m.ok&&f&&n.push(`DeepSeek Harness bundle \u7A0D\u540E\u91CD\u8BD5\uFF1A${be(m)}`),i&&r){let h=Ve(d,["ai","init","--workspace",r,"--json"],18e4);h.ok||n.push(`\u5DE5\u4F5C\u533A AI/MCP \u521D\u59CB\u5316\u7A0D\u540E\u91CD\u8BD5\uFF1A${be(h)}`);let C=Ve(d,["doctor","--workspace",r,"--json"],2*6e4);if(!C.ok)try{Is(`workspace doctor note: ${be(C)}`)}catch{}}if(p){let h=Ve(d,["codex","status","--json"],6e4);!h.ok&&!sr(h)&&n.push(`Codex \u72B6\u6001\u5F85\u540E\u7EED\u786E\u8BA4\uFF1A${be(h)}`)}if(f){let h=Ve(d,["dsh","status","--json"],6e4);!h.ok&&!ir(h)&&n.push(`DeepSeek Harness \u72B6\u6001\u5F85\u540E\u7EED\u786E\u8BA4\uFF1A${be(h)}`)}let S={state:n.length>0?"completed-with-warnings":"completed",currentVersion:s.currentVersion,latestVersion:c,globalVersion:g.version,workspace:s.workspace,message:n.length>0?"\u6838\u5FC3\u81EA\u52A8\u66F4\u65B0\u5DF2\u5B8C\u6210\uFF0C\u4E2A\u522B\u5BBF\u4E3B\u5C06\u5728\u4E0B\u6B21\u7A7A\u95F2\u6216\u542F\u52A8\u65F6\u7EE7\u7EED\uFF1B\u5F53\u524D\u5DE5\u4F5C\u672A\u88AB\u4E2D\u65AD\u3002":i?"CLI\u3001Codex/DeepSeek Harness \u63D2\u4EF6\u4E0E\u5DE5\u4F5C\u533A AI/MCP \u5DF2\u5728\u540E\u53F0\u66F4\u65B0\uFF1B\u5F53\u524D\u8FDB\u7A0B\u65E0\u9700\u5F3A\u5236\u91CD\u8F7D\u3002":"CLI\u3001Codex/DeepSeek Harness \u63D2\u4EF6\u5DF2\u5728\u540E\u53F0\u66F4\u65B0\uFF1B\u5F53\u524D\u5DE5\u4F5C\u533A\u672A\u914D\u7F6E\u543E\u7801\u670D\u52A1\u5668\uFF0C\u672A\u751F\u6210 AI/MCP \u6587\u4EF6\u3002",warnings:n,attemptedAt:e,finishedAt:new Date().toISOString()};return gt(S,`${S.message} latest=${c} global=${g.version}`),S}catch(a){return o(`\u81EA\u52A8\u66F4\u65B0\u51FA\u73B0\u53EF\u6062\u590D\u9519\u8BEF\uFF1A${a instanceof Error?a.message:String(a)}`)}finally{t?.release();let a=Y.resolve(process.argv[1]||""),c=pt();if(Y.dirname(a)===c.root&&/^microi-update-worker-[\w.-]+\.js$/i.test(Y.basename(a)))try{L.rmSync(a,{force:!0})}catch{}}}function Ms(s){if(s.length>32768)throw new Error("\u8FDE\u63A5\u4FE1\u606F\u8FC7\u957F");let e,t;try{if(e=JSON.parse(s.replace(/^\uFEFF/,"").trim()),!e||typeof e!="object"||Array.isArray(e))throw new Error;t=new URL(String(e.ApiBase||""))}catch{throw new Error("\u8FDE\u63A5\u4FE1\u606F\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u91CD\u65B0\u590D\u5236\u5B8C\u6574\u8FDE\u63A5\u4FE1\u606F")}if(!["https:","http:"].includes(t.protocol)||t.username||t.password||t.search||t.hash)throw new Error("ApiBase \u5FC5\u987B\u662F\u65E0\u51ED\u636E\u3001\u65E0\u67E5\u8BE2\u53C2\u6570\u7684 HTTP(S) \u5730\u5740");let n=String(e.OsClient||"").trim(),r=String(e.Token||"").trim().replace(/^Bearer\s+/i,"");if(!/^[A-Za-z0-9_.-]{1,100}$/.test(n)||!/^[\w-]+\.[\w-]+\.[\w-]+$/.test(r))throw new Error("\u8FDE\u63A5\u4FE1\u606F\u7F3A\u5C11\u6709\u6548 OsClient \u6216 Token");let i;try{i=JSON.parse(Buffer.from(r.split(".")[1],"base64url").toString("utf8"))}catch{throw new Error("Token \u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u8FDE\u63A5\u4FE1\u606F")}if(!i||typeof i!="object")throw new Error("Token \u683C\u5F0F\u65E0\u6548");if(String(i.OsClient||"").toLowerCase()!==n.toLowerCase()||!Number.isFinite(i.exp)||i.exp*1e3<=Date.now())throw new Error("Token \u5DF2\u8FC7\u671F\u6216\u4E0E\u76EE\u6807\u79DF\u6237\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u8FDE\u63A5\u4FE1\u606F");return{ApiBase:t.href.replace(/\/+$/,""),OsClient:n,Token:r,Did:String(e.Did||"")}}async function As(s){let e="";for await(let t of s)if(e+=t.toString(),e.length>32768)throw new Error("\u8FDE\u63A5\u4FE1\u606F\u8FC7\u957F");return e}function vo(s){let e=[],t={};for(let n=0;n<s.length;n+=1){let r=s[n];if(!r.startsWith("--")){e.push(r);continue}let[i,o]=r.slice(2).split(/=(.*)/s,2);if(i.startsWith("no-")&&o===void 0){t[i.slice(3)]=!1;continue}if(o!==void 0){t[i]=o;continue}let a=s[n+1];a&&!a.startsWith("--")?(t[i]=a,n+=1):t[i]=!0}return{words:e,options:t}}function ce(s,e){let t=s[e];return typeof t=="string"?t:void 0}function re(s,e=!1){console.log(e||typeof s!="string"?JSON.stringify(s,null,2):s)}function mt(s,e=""){let t=$s.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>t.question(`${s}${e?` (${e})`:""}: `,r=>{t.close(),n(r.trim()||e)}))}function Eo(s){return!process.stdin.isTTY||!process.stdin.setRawMode?mt(s):new Promise((e,t)=>{let n="";process.stdout.write(`${s}: `),process.stdin.setRawMode(!0),process.stdin.resume();let r=()=>{process.stdin.off("data",i),process.stdin.setRawMode(!1),process.stdin.pause()},i=o=>{let a=o.toString("utf8");if(a===""){r(),t(new Error("\u5DF2\u53D6\u6D88"));return}if(a==="\r"||a===`
2015
+ `;(!L.existsSync(s)||i!==m)&&Es(s,m)}function go(s,e){let t=e.label||e.sysShortTitle||e.sysTitle||e.apiBaseUrl||"\u672A\u547D\u540D\u670D\u52A1\u5668";return U.join(s.getSyncRootDir(),s.buildServerDirName(t,e.apiBaseUrl),s.buildOsClientDirName(e.osClient,e.osClientType,e.osClientNetwork),Tr)}function po(s,e,t){let n={...s.env||{}},r=String(s.command||""),i=Array.isArray(s.args)?s.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}}function mo(s){return typeof s.url=="string"&&s.url.trim()?{url:s.url,...s.headers&&typeof s.headers=="object"?{headers:{...s.headers}}:{}}:{command:String(s.command||""),args:Array.isArray(s.args)?s.args.map(String):[],...s.env&&typeof s.env=="object"?{env:{...s.env}}:{}}}function fo(s){return typeof s.url=="string"&&s.url.trim()?{transportType:"streamableHttp",url:s.url,...s.headers&&typeof s.headers=="object"?{headers:{...s.headers}}:{}}:{transportType:"stdio",command:String(s.command||""),args:Array.isArray(s.args)?s.args.map(String):[],...s.env&&typeof s.env=="object"?{env:{...s.env}}:{},...typeof s.cwd=="string"&&s.cwd?{cwd:s.cwd}:{}}}async function Bt(s,e={}){let t=I.getInstance(),n=we.getInstance(),r=j.getInstance(),i=t.getProfiles(),o=Be(),a=ao(),c=a.launcherPath,l=a.adapterPath,g=a.routerPath,d=a.traeLauncherPath,u=io(),p={};for(let{profile:h,mcpName:C}of dt(i)){let w=n.mcpTokenFilePath,b=w?U.join(U.dirname(w),_t):"",v=n.getCredentialSecretKeys(h),k=r.getTokenForServer(h.apiBaseUrl,h.osClient,h.osClientType,h.osClientNetwork);!w||!k&&!L.existsSync(b)||(p[C]={type:"stdio",command:u.command,args:[c],cwd:a.root,env:{...u.isElectron?{ELECTRON_RUN_AS_NODE:"1"}:{},MICROI_API_URL:ro(h.apiBaseUrl),MICROI_TOKEN_FILE:w,MICROI_AUTH_RECOVERY_DIR:n.mcpAuthRecoveryDirPath,MICROI_WORKSPACE_CREDENTIAL_FILE:b,MICROI_WORKSPACE_USERNAME_KEY:v.usernameKey,MICROI_WORKSPACE_PASSWORD_KEY:v.passwordKey,MICROI_OS_CLIENT:h.osClient||"",MICROI_OS_CLIENT_TYPE:h.osClientType||"",MICROI_OS_CLIENT_NETWORK:h.osClientNetwork||"",MICROI_WORKSPACE_ROOT:s,MICROI_SYNC_ROOT:t.getSyncRootDir(),MICROI_AI_APPLICATIONS_DIR:go(t,h),MICROI_LABEL_BASE64:Buffer.from(h.label||"","utf8").toString("base64"),MICROI_MCP_DID:so(),MICROI_TOOL_SOURCE:"cli",MICROI_TOOL_VERSION:o}})}await n.writeMcpTokenFile(),st(s),$e(s,[".vscode/mcp.json",".cursor/mcp.json",".trae/mcp.json",".workbuddy/mcp.json",".comate/mcp.json",".mcp.json",".codex/config.toml","Microi-V8-Engine/.microi-mcp-tokens.json",`Microi-V8-Engine/${_t}`]),ut(U.join(s,".vscode","mcp.json"),"servers",p),ut(U.join(s,".cursor","mcp.json"),"mcpServers",p);let m=Object.fromEntries(Object.entries(p).map(([h,C])=>[h,po(C,l,d)]));ut(U.join(s,".trae","mcp.json"),"mcpServers",m,!0);let f=Object.fromEntries(Object.entries(p).map(([h,C])=>[h,mo(C)]));ut(U.join(s,".workbuddy","mcp.json"),"mcpServers",f,!0);let y=Object.fromEntries(Object.entries(p).map(([h,C])=>[h,fo(C)]));ut(U.join(s,".comate","mcp.json"),"mcpServers",y),ut(U.join(s,".mcp.json"),"mcpServers",p,!0);let S=process.env.CODEX_HOME||U.join(Lt.homedir(),".codex");return e.globalCodex!==!1&&Ts(U.join(S,"config.toml"),p,l,g,s),Ts(U.join(s,".codex","config.toml"),p,l,g,s),{count:Object.keys(p).length,names:Object.keys(p)}}var hn=O(require("fs")),gt=O(require("path"));async function bs(s,e){let t=gt.resolve(s);if(!hn.existsSync(t)||!hn.statSync(t).isDirectory())throw new Error(`\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u76EE\u5F55\uFF1A${t}`);yr(t);let n=I.getInstance(),r=j.getInstance(),i=we.getInstance();if(!e&&process.platform!=="win32"&&process.platform!=="darwin")throw new Error("\u5F53\u524D CLI \u7248\u672C\u4EC5\u652F\u6301 Windows DPAPI \u4E0E macOS Keychain \u5DE5\u4F5C\u533A\u51ED\u636E");let o=n.getWorkspaceStateFilePath(Ct),a=e||(process.platform==="darwin"?new nn(o):new rn(gt.join(gt.dirname(o),_t)));return r.setSecretStorage(a),i.setSecretStorage(a),i.setMcpTokenFilePath(o),await i.loadMcpTokenFile(),{root:t,config:n,api:r,auth:i}}function Ut(s,e){let t=s.getProfiles();if(!t.length)throw new Error("\u5C1A\u672A\u6DFB\u52A0\u670D\u52A1\u5668\u8FDE\u63A5\uFF0C\u8BF7\u5148\u6267\u884C microi profile add");if(!e)return t[0];let n=Number(e);if(Number.isInteger(n)&&n>=1&&n<=t.length)return t[n-1];let r=e.toLowerCase(),i=t.filter(o=>o.osClient.toLowerCase()===r||o.label.toLowerCase()===r||`${o.apiBaseUrl}|${o.osClient}`.toLowerCase()===r);if(i.length===0){let o=dt(t).filter(a=>a.mcpName.toLowerCase()===r).map(a=>a.profile);if(o.length===1)return o[0]}if(i.length!==1)throw new Error(`\u65E0\u6CD5\u552F\u4E00\u5B9A\u4F4D\u670D\u52A1\u5668\u8FDE\u63A5\uFF1A${e}`);return i[0]}function Ge(s,e){return!!s.api.getTokenForServer(e.apiBaseUrl,e.osClient,e.osClientType,e.osClientNetwork)}var wn=O(require("child_process")),Tn=O(require("crypto")),B=O(require("fs")),Is=O(require("os")),Z=O(require("path"));var pt=O(require("fs")),ks=O(require("os")),z=O(require("path"));function Ps(s={}){let e={...s.env??process.env},t=s.execPath??process.execPath,n=s.home??ks.homedir(),i=(s.platform??process.platform)==="win32",o=i?";":":",a=i?Object.keys(e).find(m=>/^path$/i.test(m))??"Path":"PATH",c=i?"node.exe":"node",l=m=>{try{return pt.statSync(m).isFile()}catch{return!1}},g=m=>{let f=pt.realpathSync(m);if(/\.(?:c?m?js)$/i.test(f)){let y=z.dirname(z.dirname(f)),h=(i?[z.dirname(y),z.dirname(z.dirname(y))]:[z.resolve(y,"../../../bin")]).map(w=>z.join(w,c)).find(l),C=h??t;return h||/^node(?:\.exe)?$/i.test(z.basename(C))?delete e.ELECTRON_RUN_AS_NODE:e.ELECTRON_RUN_AS_NODE="1",e[a]=[z.dirname(C),e[a]??""].filter(Boolean).join(o),{command:C,prefixArgs:[f],env:e,shell:!1}}return e[a]=[z.dirname(f),e[a]??""].filter(Boolean).join(o),{command:f,prefixArgs:[],env:e,shell:i&&/\.(?:cmd|bat)$/i.test(f)}},d=String(e.MICROI_NPM_PATH??"").trim();if(d){let m=z.resolve(d);if(!l(m))throw new Error("\u914D\u7F6E\u7684 npm \u5165\u53E3\u4E0D\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5 MICROI_NPM_PATH\u3002");return g(m)}let u=new Set;for(let m of String(e[a]??"").split(o))z.isAbsolute(m)&&u.add(m);if(u.add(z.dirname(t)),u.add(z.join(n,".microi","nodejs",...i?[]:["bin"])),i){for(let m of[e.ProgramFiles,e["ProgramFiles(x86)"],e.LOCALAPPDATA])m&&z.isAbsolute(m)&&u.add(z.join(m,"nodejs"));e.APPDATA&&z.isAbsolute(e.APPDATA)&&u.add(z.join(e.APPDATA,"npm")),e.NVM_SYMLINK&&z.isAbsolute(e.NVM_SYMLINK)&&u.add(e.NVM_SYMLINK)}else{for(let f of["/opt/homebrew/bin","/usr/local/bin","/usr/bin",z.join(n,".volta","bin")])u.add(f);let m=z.join(e.NVM_DIR&&z.isAbsolute(e.NVM_DIR)?e.NVM_DIR:z.join(n,".nvm"),"versions","node");try{for(let f of pt.readdirSync(m).filter(y=>/^v\d+\.\d+\.\d+$/.test(y)).sort((y,S)=>S.localeCompare(y,void 0,{numeric:!0})).slice(0,8))u.add(z.join(m,f,"bin"))}catch{}}let p=[];e.npm_execpath&&z.isAbsolute(e.npm_execpath)&&p.push(e.npm_execpath);for(let m of u)p.push(z.join(m,"../lib/node_modules/npm/bin/npm-cli.js")),p.push(z.join(m,"node_modules/npm/bin/npm-cli.js")),p.push(z.join(m,i?"npm.cmd":"npm"));for(let m of p)if(l(m))return g(m);throw new Error("\u672A\u627E\u5230\u672C\u673A Node.js/npm\uFF1B\u8BF7\u5B89\u88C5 Node.js \u6216\u5728 Microi\u543E\u7801\u8BBE\u7F6E\u4E2D\u5B89\u88C5\u672C\u5730 Node.js\u3002")}var _s="https://registry.npmjs.org/",ar="@microi.net/cli",ho=24*60*60*1e3,Sn=15*60*1e3,Ms=30*60*1e3;function yn(s){return typeof s=="string"&&s.trim().length>0}function yo(s){if(!s||typeof s!="object"||Array.isArray(s))return!1;let e=s;return Array.isArray(e.profiles)&&e.profiles.some(t=>{if(!t||typeof t!="object"||Array.isArray(t))return!1;let n=t;return yn(n.apiBaseUrl)&&yn(n.osClient)})?!0:yn(e.apiBaseUrl)&&yn(e.osClient)}function So(s){try{let e=Z.resolve(s);if(!B.existsSync(e)||!B.statSync(e).isDirectory())return!1;let t=new Set([Z.join(e,Re)]);for(let n of B.readdirSync(e,{withFileTypes:!0}))n.isDirectory()&&n.name.toLowerCase()===Re.toLowerCase()&&t.add(Z.join(e,n.name));for(let n of t){let r=Z.join(n,Wt);if(!B.existsSync(r))continue;let i=B.statSync(r);if(!(!i.isFile()||i.size>2*1024*1024)&&yo(JSON.parse(B.readFileSync(r,"utf8"))))return!0}}catch{}return!1}function ft(){let s=Z.resolve(process.env.MICROI_UPDATE_HOME||Z.join(Is.homedir(),".microi","updater"));return{root:s,status:Z.join(s,"status.json"),log:Z.join(s,"update.log"),lock:Z.join(s,"update.lock")}}function As(s,e){B.mkdirSync(Z.dirname(s),{recursive:!0});let t=`${s}.${process.pid}.${Date.now()}.${Tn.randomBytes(3).toString("hex")}.tmp`;try{B.writeFileSync(t,e),B.existsSync(s)&&B.rmSync(s,{force:!0}),B.renameSync(t,s)}finally{try{B.existsSync(t)&&B.rmSync(t,{force:!0})}catch{}}}function Co(s){As(ft().status,`${JSON.stringify(s,null,2)}
2016
+ `)}function wo(){try{return JSON.parse(B.readFileSync(ft().status,"utf8"))}catch{return}}function Ns(s){let e=ft();B.mkdirSync(e.root,{recursive:!0}),B.appendFileSync(e.log,`[${new Date().toISOString()}] ${s}
2017
+ `,"utf8")}function mt(s,e){try{Co(s)}catch{}if(e)try{Ns(e)}catch{}}function Cn(s){let e=String(s||"").trim().match(/^(\d+)\.(\d+)\.(\d+)$/);return e?e.slice(1).map(Number):void 0}function To(s,e){let t=Cn(s),n=Cn(e);if(!t||!n)return s.localeCompare(e);for(let r=0;r<3;r+=1)if(t[r]!==n[r])return t[r]-n[r];return 0}var cr;function Fs(s,e,t=12e4,n=!1,r=cr??process.env){let i=wn.spawnSync(s,e,{encoding:"utf8",windowsHide:!0,timeout:t,maxBuffer:33554432,shell:n,env:r});return{ok:i.status===0,status:typeof i.status=="number"?i.status:1,stdout:String(i.stdout||""),stderr:[i.error?.message,i.stderr].filter(Boolean).join(`
2018
+ `).trim()}}function lr(s,e=12e4){let t=Ps();return cr=t.env,Fs(t.command,[...t.prefixArgs,...s],e,t.shell,t.env)}function Ds(){let s=lr(["root","--global"],3e4);return s.ok?s.stdout.trim():""}function Rs(s){if(!s)return;let e=Z.join(s,"@microi.net","cli"),t=Z.join(e,"scripts","microi-cli.js"),n=Z.join(e,"package.json");try{let r=JSON.parse(B.readFileSync(n,"utf8")),i=String(r.version||"");return!B.existsSync(t)||!Cn(i)?void 0:{cliPath:t,version:i}}catch{return}}function xe(s,e,t=12e4){return Fs(process.execPath,[s,...e],t,!1,{...cr??process.env,...process.env.ELECTRON_RUN_AS_NODE?{ELECTRON_RUN_AS_NODE:process.env.ELECTRON_RUN_AS_NODE}:{}})}function vo(){let s=lr(["view",ar,"version","--json","--prefer-online",`--registry=${_s}`],45e3);if(!s.ok)throw new Error(s.stderr||s.stdout||"npm registry query failed");let e=s.stdout.trim();try{e=String(JSON.parse(e))}catch{e=e.replace(/^"|"$/g,"")}if(!Cn(e))throw new Error(`npm registry returned invalid version: ${e}`);return e}function Eo(s){return lr(["install","--global",`${ar}@${s}`,`--registry=${_s}`,"--prefer-online","--no-audit","--no-fund"],5*6e4)}function ke(s){return(s.stderr||s.stdout||`exit ${s.status}`).trim().slice(0,2e3)}function ir(s){return/(?:未检测到|未找到|not found|cannot find).*Codex|Codex CLI.*(?:未检测到|未找到|not found|cannot find)/i.test(ke(s))}function or(s){return/(?:未检测到|未找到|not found|cannot find).*DeepSeek Harness|DeepSeek Harness.*(?:未检测到|未找到|not found|cannot find)/i.test(ke(s))}function bo(s){let e=Z.resolve(Z.dirname(s),"..");try{let t=JSON.parse(B.readFileSync(Z.join(e,"package.json"),"utf8"));return t.name!==ar||t.dsh?.bundle?.patch!=="./cordis.patch.yml"||!B.existsSync(Z.join(e,"cordis.patch.yml"))?void 0:e}catch{return}}function ko(s,e){if(!s||s.currentVersion!==e)return!0;let t=Date.parse(s.attemptedAt||"");if(!Number.isFinite(t))return!0;let n=Date.now()-t;return s.state==="completed"||s.state==="completed-with-warnings"?n>=ho:s.state==="scheduled"||s.state==="running"?n>=Ms:n>=Sn}function dr(s){let e=ft(),t=Z.resolve(s.sourceCliPath||process.argv[1]||"");if(!B.existsSync(t))throw new Error(`\u65E0\u6CD5\u627E\u5230 Microi CLI \u66F4\u65B0\u5165\u53E3\uFF1A${t}`);let n=wo();if(!s.force&&!ko(n,s.currentVersion))return{scheduled:!1,reason:`recent-${n?.state||"unknown"}`,statusPath:e.status};B.mkdirSync(e.root,{recursive:!0});let r=s.currentVersion.replace(/[^0-9.]/g,"")||"unknown",i=Z.join(e.root,`microi-update-worker-${r}-${process.pid}-${Tn.randomBytes(4).toString("hex")}.js`);As(i,B.readFileSync(t));let o=new Date().toISOString();mt({state:"scheduled",currentVersion:s.currentVersion,workspace:s.workspace,message:"\u540E\u53F0\u66F4\u65B0\u5DF2\u6392\u961F\uFF1B\u5F53\u524D\u5DE5\u4F5C\u7EE7\u7EED\u4F7F\u7528\u73B0\u6709\u7248\u672C\u3002",attemptedAt:o});let a=[i,"update","--worker","--current-version",s.currentVersion,"--source-cli",t,"--json",...s.workspace?["--workspace",Z.resolve(s.workspace)]:[]],c=wn.spawn(process.execPath,a,{cwd:e.root,detached:!0,windowsHide:!0,stdio:"ignore",env:{...process.env}});return c.once("error",l=>{let g=new Date(Date.now()+Sn).toISOString();mt({state:"deferred",currentVersion:s.currentVersion,workspace:s.workspace,message:`\u540E\u53F0\u66F4\u65B0\u8FDB\u7A0B\u6682\u65F6\u65E0\u6CD5\u542F\u52A8\uFF1A${l.message}\uFF1B\u4E0D\u5F71\u54CD\u5F53\u524D\u5DE5\u4F5C\u3002`,attemptedAt:o,nextRetryAt:g})}),c.unref(),{scheduled:!0,reason:"scheduled",statusPath:e.status,workerPid:c.pid}}function Po(){let s=ft();B.mkdirSync(s.root,{recursive:!0});let e=`${process.pid}-${Date.now()}-${Tn.randomBytes(6).toString("hex")}`;for(let t=0;t<2;t+=1)try{let n=B.openSync(s.lock,"wx");return B.writeFileSync(n,`${JSON.stringify({token:e,pid:process.pid,startedAt:new Date().toISOString()})}
2019
+ `),B.closeSync(n),{token:e,release:()=>{try{JSON.parse(B.readFileSync(s.lock,"utf8")).token===e&&B.rmSync(s.lock,{force:!0})}catch{}}}}catch(n){if((n&&typeof n=="object"?n.code:"")!=="EEXIST")throw n;try{if(Date.now()-B.statSync(s.lock).mtimeMs<Ms)return;B.rmSync(s.lock,{force:!0})}catch{}}}function Vs(s){let e=new Date().toISOString(),t;try{t=Po()}catch(a){let c={state:"deferred",currentVersion:s.currentVersion,workspace:s.workspace,message:`\u65E0\u6CD5\u521B\u5EFA\u540E\u53F0\u66F4\u65B0\u72B6\u6001\u76EE\u5F55\uFF1A${a instanceof Error?a.message:String(a)}\uFF1B\u4E0D\u5F71\u54CD\u5F53\u524D\u6216\u65B0\u5EFA\u5DE5\u4F5C\u3002`,attemptedAt:e,nextRetryAt:new Date(Date.now()+Sn).toISOString()};return mt(c,c.message),c}if(!t)return{state:"scheduled",currentVersion:s.currentVersion,workspace:s.workspace,message:"\u5DF2\u6709\u540E\u53F0\u66F4\u65B0\u6B63\u5728\u8FD0\u884C\uFF1B\u5F53\u524D\u5DE5\u4F5C\u7EE7\u7EED\u4F7F\u7528\u73B0\u6709\u7248\u672C\u3002",attemptedAt:e};let n=[],r=s.workspace?Z.resolve(s.workspace):void 0,i=!!r&&So(r),o=(a,c,l)=>{let g={state:"deferred",currentVersion:s.currentVersion,latestVersion:c,globalVersion:l,workspace:s.workspace,message:`${a}\uFF1B\u5DF2\u5EF6\u540E\u91CD\u8BD5\uFF0C\u4E0D\u5F71\u54CD\u5F53\u524D\u6216\u65B0\u5EFA\u5DE5\u4F5C\u3002`,warnings:n,attemptedAt:e,finishedAt:new Date().toISOString(),nextRetryAt:new Date(Date.now()+Sn).toISOString()};return mt(g,g.message),g};try{let a={state:"running",currentVersion:s.currentVersion,workspace:s.workspace,message:"\u6B63\u5728\u540E\u53F0\u68C0\u67E5\u5B98\u65B9\u66F4\u65B0\uFF1B\u5F53\u524D\u5DE5\u4F5C\u4E0D\u7B49\u5F85\u3002",attemptedAt:e,workerPid:process.pid};mt(a,`update started from ${s.currentVersion}`);let c;try{c=vo()}catch(h){let C=h instanceof Error?h.message:String(h);return o(/npm 入口不存在|未找到本机 Node.js\/npm/.test(C)?C:`\u65E0\u6CD5\u8BBF\u95EE npm \u5B98\u65B9 registry\uFF1A${C}`)}let l=Ds(),g=Rs(l);if(!g||To(g.version,c)<0){let h=Eo(c);if(!h.ok){let C=ke(h),w=/\b(?:EBUSY|EPERM|EACCES)\b/i.test(C);if(w&&s.sourceCliPath&&B.existsSync(s.sourceCliPath)){let b=xe(s.sourceCliPath,["codex","install","--yes","--json"],18e4);!b.ok&&!ir(b)&&n.push(`\u5F53\u524D Codex \u63D2\u4EF6\u5FEB\u7167\u6682\u672A\u9884\u7F6E\uFF1A${ke(b)}`);let v=bo(s.sourceCliPath),k=xe(s.sourceCliPath,["dsh","install",...v?["--source",v]:[],"--json"],5*6e4);if(!k.ok&&!or(k)&&n.push(`\u5F53\u524D DeepSeek Harness bundle \u5FEB\u7167\u6682\u672A\u9884\u7F6E\uFF1A${ke(k)}`),i&&r){let V=xe(s.sourceCliPath,["ai","init","--workspace",r,"--json"],18e4);V.ok||n.push(`\u7248\u672C\u9694\u79BB MCP \u5165\u53E3\u6682\u672A\u9884\u7F6E\uFF1A${ke(V)}`)}}return o(w?"\u5168\u5C40 CLI \u6B63\u88AB\u8FD0\u884C\u4E2D\u7684\u65E7\u4EFB\u52A1\u5360\u7528\uFF0C\u5C06\u5728\u7A7A\u95F2\u540E\u91CD\u8BD5\uFF0C\u7EDD\u4E0D\u7EC8\u6B62\u65E7\u4EFB\u52A1":`\u5168\u5C40 CLI \u81EA\u52A8\u5B89\u88C5\u6682\u672A\u5B8C\u6210\uFF1A${C}`,c,g?.version)}l=Ds(),g=Rs(l)}if(!g)return o("\u5168\u5C40 CLI \u5B89\u88C5\u540E\u672A\u627E\u5230\u53EF\u6267\u884C\u6587\u4EF6",c);let d=g.cliPath,u=xe(d,["codex","install","--yes","--json"],3*6e4),p=u.ok||!ir(u);!u.ok&&p&&n.push(`Codex \u63D2\u4EF6\u7A0D\u540E\u91CD\u8BD5\uFF1A${ke(u)}`);let m=xe(d,["dsh","install","--json"],5*6e4),f=m.ok||!or(m);if(!m.ok&&f&&n.push(`DeepSeek Harness bundle \u7A0D\u540E\u91CD\u8BD5\uFF1A${ke(m)}`),i&&r){let h=xe(d,["ai","init","--workspace",r,"--json"],18e4);h.ok||n.push(`\u5DE5\u4F5C\u533A AI/MCP \u521D\u59CB\u5316\u7A0D\u540E\u91CD\u8BD5\uFF1A${ke(h)}`);let C=xe(d,["doctor","--workspace",r,"--json"],2*6e4);if(!C.ok)try{Ns(`workspace doctor note: ${ke(C)}`)}catch{}}if(p){let h=xe(d,["codex","status","--json"],6e4);!h.ok&&!ir(h)&&n.push(`Codex \u72B6\u6001\u5F85\u540E\u7EED\u786E\u8BA4\uFF1A${ke(h)}`)}if(f){let h=xe(d,["dsh","status","--json"],6e4);!h.ok&&!or(h)&&n.push(`DeepSeek Harness \u72B6\u6001\u5F85\u540E\u7EED\u786E\u8BA4\uFF1A${ke(h)}`)}let S={state:n.length>0?"completed-with-warnings":"completed",currentVersion:s.currentVersion,latestVersion:c,globalVersion:g.version,workspace:s.workspace,message:n.length>0?"\u6838\u5FC3\u81EA\u52A8\u66F4\u65B0\u5DF2\u5B8C\u6210\uFF0C\u4E2A\u522B\u5BBF\u4E3B\u5C06\u5728\u4E0B\u6B21\u7A7A\u95F2\u6216\u542F\u52A8\u65F6\u7EE7\u7EED\uFF1B\u5F53\u524D\u5DE5\u4F5C\u672A\u88AB\u4E2D\u65AD\u3002":i?"CLI\u3001Codex/DeepSeek Harness \u63D2\u4EF6\u4E0E\u5DE5\u4F5C\u533A AI/MCP \u5DF2\u5728\u540E\u53F0\u66F4\u65B0\uFF1B\u5F53\u524D\u8FDB\u7A0B\u65E0\u9700\u5F3A\u5236\u91CD\u8F7D\u3002":"CLI\u3001Codex/DeepSeek Harness \u63D2\u4EF6\u5DF2\u5728\u540E\u53F0\u66F4\u65B0\uFF1B\u5F53\u524D\u5DE5\u4F5C\u533A\u672A\u914D\u7F6E\u543E\u7801\u670D\u52A1\u5668\uFF0C\u672A\u751F\u6210 AI/MCP \u6587\u4EF6\u3002",warnings:n,attemptedAt:e,finishedAt:new Date().toISOString()};return mt(S,`${S.message} latest=${c} global=${g.version}`),S}catch(a){return o(`\u81EA\u52A8\u66F4\u65B0\u51FA\u73B0\u53EF\u6062\u590D\u9519\u8BEF\uFF1A${a instanceof Error?a.message:String(a)}`)}finally{t?.release();let a=Z.resolve(process.argv[1]||""),c=ft();if(Z.dirname(a)===c.root&&/^microi-update-worker-[\w.-]+\.js$/i.test(Z.basename(a)))try{B.rmSync(a,{force:!0})}catch{}}}function xs(s){if(s.length>32768)throw new Error("\u8FDE\u63A5\u4FE1\u606F\u8FC7\u957F");let e,t;try{if(e=JSON.parse(s.replace(/^\uFEFF/,"").trim()),!e||typeof e!="object"||Array.isArray(e))throw new Error;t=new URL(String(e.ApiBase||""))}catch{throw new Error("\u8FDE\u63A5\u4FE1\u606F\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u91CD\u65B0\u590D\u5236\u5B8C\u6574\u8FDE\u63A5\u4FE1\u606F")}if(!["https:","http:"].includes(t.protocol)||t.username||t.password||t.search||t.hash)throw new Error("ApiBase \u5FC5\u987B\u662F\u65E0\u51ED\u636E\u3001\u65E0\u67E5\u8BE2\u53C2\u6570\u7684 HTTP(S) \u5730\u5740");let n=String(e.OsClient||"").trim(),r=String(e.Token||"").trim().replace(/^Bearer\s+/i,"");if(!/^[A-Za-z0-9_.-]{1,100}$/.test(n)||!/^[\w-]+\.[\w-]+\.[\w-]+$/.test(r))throw new Error("\u8FDE\u63A5\u4FE1\u606F\u7F3A\u5C11\u6709\u6548 OsClient \u6216 Token");let i;try{i=JSON.parse(Buffer.from(r.split(".")[1],"base64url").toString("utf8"))}catch{throw new Error("Token \u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u8FDE\u63A5\u4FE1\u606F")}if(!i||typeof i!="object")throw new Error("Token \u683C\u5F0F\u65E0\u6548");if(String(i.OsClient||"").toLowerCase()!==n.toLowerCase()||!Number.isFinite(i.exp)||i.exp*1e3<=Date.now())throw new Error("Token \u5DF2\u8FC7\u671F\u6216\u4E0E\u76EE\u6807\u79DF\u6237\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u8FDE\u63A5\u4FE1\u606F");return{ApiBase:t.href.replace(/\/+$/,""),OsClient:n,Token:r,Did:String(e.Did||"")}}async function Os(s){let e="";for await(let t of s)if(e+=t.toString(),e.length>32768)throw new Error("\u8FDE\u63A5\u4FE1\u606F\u8FC7\u957F");return e}function Do(s){let e=[],t={};for(let n=0;n<s.length;n+=1){let r=s[n];if(!r.startsWith("--")){e.push(r);continue}let[i,o]=r.slice(2).split(/=(.*)/s,2);if(i.startsWith("no-")&&o===void 0){t[i.slice(3)]=!1;continue}if(o!==void 0){t[i]=o;continue}let a=s[n+1];a&&!a.startsWith("--")?(t[i]=a,n+=1):t[i]=!0}return{words:e,options:t}}function le(s,e){let t=s[e];return typeof t=="string"?t:void 0}function se(s,e=!1){console.log(e||typeof s!="string"?JSON.stringify(s,null,2):s)}function ht(s,e=""){let t=Ks.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>t.question(`${s}${e?` (${e})`:""}: `,r=>{t.close(),n(r.trim()||e)}))}function Ro(s){return!process.stdin.isTTY||!process.stdin.setRawMode?ht(s):new Promise((e,t)=>{let n="";process.stdout.write(`${s}: `),process.stdin.setRawMode(!0),process.stdin.resume();let r=()=>{process.stdin.off("data",i),process.stdin.setRawMode(!1),process.stdin.pause()},i=o=>{let a=o.toString("utf8");if(a===""){r(),t(new Error("\u5DF2\u53D6\u6D88"));return}if(a==="\r"||a===`
2020
2020
  `){process.stdout.write(`
2021
- `),r(),e(n);return}if(a==="\x7F"||a==="\b"){n&&(n=n.slice(0,-1),process.stdout.write("\b \b"));return}/^[\x20-\x7E\u0080-\uFFFF]+$/.test(a)&&(n+=a,process.stdout.write("*".repeat([...a].length)))};process.stdin.on("data",i)})}function Ns(){return`Microi\u543E\u7801 CLI
2021
+ `),r(),e(n);return}if(a==="\x7F"||a==="\b"){n&&(n=n.slice(0,-1),process.stdout.write("\b \b"));return}/^[\x20-\x7E\u0080-\uFFFF]+$/.test(a)&&(n+=a,process.stdout.write("*".repeat([...a].length)))};process.stdin.on("data",i)})}function $s(){return`Microi\u543E\u7801 CLI
2022
2022
 
2023
2023
  \u7528\u6CD5\uFF1Amicroi <\u547D\u4EE4> [\u9009\u9879]
2024
2024
 
@@ -2040,6 +2040,6 @@ require(target);
2040
2040
  sync status [--scope ...] \u6BD4\u8F83\u672C\u5730\u4E0E\u8FDC\u7AEF\u5DEE\u5F02
2041
2041
  doctor \u68C0\u67E5\u8FDE\u63A5\u3001Token\u3001AI \u4E0E MCP \u914D\u7F6E
2042
2042
 
2043
- \u901A\u7528\u9009\u9879\uFF1A--workspace <\u76EE\u5F55>\uFF08\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55\uFF09\u3001--profile <\u5E8F\u53F7/OsClient/\u540D\u79F0/mcpName>\u3001--json`}async function Fs(s,e){let t=(ce(e,"api")||await mt("API \u5730\u5740")).replace(/\/+$/,""),n=ce(e,"os-client")||await mt("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:ce(e,"label")||await mt("\u8FDE\u63A5\u540D\u79F0",n),apiBaseUrl:t,osClient:n,osClientType:ce(e,"type")||"",osClientNetwork:ce(e,"network")||""};return await s.config.addProfile(i),i}function bo(s){return s===!0||s===1||String(s||"").trim().toLowerCase()==="true"}async function Vs(s,e,t){let n=ce(t,"account")||await mt("\u5E10\u53F7"),r=await Eo("\u5BC6\u7801"),i=await s.auth.getSysConfig(e.apiBaseUrl,e.osClient),o,a,c="";if(bo(i?.EnableCaptcha)){let l=await s.auth.getCaptcha(e.apiBaseUrl,e.osClient);if(!l)throw new Error("\u670D\u52A1\u5668\u8981\u6C42\u9A8C\u8BC1\u7801\uFF0C\u4F46\u9A8C\u8BC1\u7801\u56FE\u7247\u83B7\u53D6\u5931\u8D25");c=ae.join(s.config.getSyncRootDir(),".microi-login-captcha.png"),se.mkdirSync(ae.dirname(c),{recursive:!0}),se.writeFileSync(c,Buffer.from(l.imageBase64.split(",")[1],"base64")),console.log(`\u9A8C\u8BC1\u7801\u56FE\u7247\uFF1A${c}`),o=l.captchaId,a=ce(t,"captcha")||await mt("\u9A8C\u8BC1\u7801")}try{let l=await s.auth.login(n,r,{apiBaseUrl:e.apiBaseUrl,osClient:e.osClient,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork,captchaId:o,captchaValue:a});if(!l.ok)throw new Error(l.msg||"\u767B\u5F55\u5931\u8D25");let g=await s.auth.getSysConfig(e.apiBaseUrl,e.osClient,void 0,!0);g&&await s.config.addProfile({...e,label:String(g.SysShortTitle||g.SysTitle||e.label),sysShortTitle:String(g.SysShortTitle||""),sysTitle:String(g.SysTitle||"")})}finally{c&&se.existsSync(c)&&se.rmSync(c,{force:!0})}}async function xs(s,e){on.getInstance().inject();let t=e?await $t(s.root):{count:0,names:[]};return{workspace:s.root,syncRoot:s.config.getSyncRootDir(),mcp:t}}async function Os(s,e,t){if(!We(s,e))throw new Error("\u8BE5\u8FDE\u63A5\u6CA1\u6709\u53EF\u7528 Token\uFF0C\u8BF7\u5148\u6267\u884C microi auth login");let n=at.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 ko(){let{words:s,options:e}=vo(process.argv.slice(2)),t=e.json===!0;if(s[0]==="version"||e.version===!0){let a={package:"@microi.net/cli",version:Le()};t?re(a,!0):console.log(a.version);return}if(!s.length||s[0]==="help"||e.help){console.log(Ns());return}let[n,r,i]=s;if(n==="update"){let a=ce(e,"current-version")||Le();if(e.worker===!0){re(_s({currentVersion:a,workspace:ce(e,"workspace"),sourceCliPath:ce(e,"source-cli")}),t);return}try{re(cr({currentVersion:a,workspace:ce(e,"workspace")||process.cwd(),sourceCliPath:process.argv[1],force:e.force===!0}),t)}catch(c){re({scheduled:!1,deferred:!0,message:`\u81EA\u52A8\u66F4\u65B0\u6682\u672A\u6295\u9012\uFF0C\u5C06\u5728\u540E\u7EED\u4F7F\u7528\u65F6\u91CD\u8BD5\uFF1B\u4E0D\u5F71\u54CD\u5F53\u524D\u6216\u65B0\u5EFA\u5DE5\u4F5C\uFF1A${c instanceof Error?c.message:String(c)}`},t)}return}if(process.env.MICROI_DISABLE_AUTO_UPDATE!=="1")try{cr({currentVersion:Le(),workspace:ce(e,"workspace")||process.cwd(),sourceCliPath:process.argv[1]})}catch{}if(n==="plugin"&&r==="path"){let a=ae.resolve(__dirname,"..");re({package:"@microi.net/cli",packageRoot:a,codeBuddyManifest:ae.join(a,".codebuddy-plugin","plugin.json"),codeBuddyMarketplace:ae.join(a,".codebuddy-plugin","marketplace.json"),workBuddyManifest:ae.join(a,".workbuddy-plugin","plugin.json"),workBuddyMarketplace:ae.join(a,".workbuddy-plugin","marketplace.json"),dshBundle:ae.join(a,"cordis.patch.yml")},t);return}if(n==="codex"){if(r==="status"){let a=ls();re(a,t),a.ok||(process.exitCode=2);return}if(r==="install"){re(ds({force:e.force===!0,marketplaceSource:ce(e,"source")}),t);return}}if(n==="dsh"){let a=ce(e,"profile");if(r==="status"){let c=fs(a);re(c,t),c.ok||(process.exitCode=2);return}if(r==="install"){re(hs({profile:a,source:ce(e,"source"),force:e.force===!0}),t);return}}let o=await vs(ce(e,"workspace")||process.cwd());if(n==="auth"&&r==="import"){if(e["session-stdin"]!==!0)throw new Error("\u8BF7\u4F7F\u7528 --session-stdin\uFF0C\u51ED\u636E\u4E0D\u5F97\u653E\u5165\u547D\u4EE4\u884C\u53C2\u6570");let a=Ms(await As(process.stdin)),c=o.config.getProfiles().find(d=>d.apiBaseUrl.replace(/\/+$/,"")===a.ApiBase&&d.osClient.toLowerCase()===a.OsClient.toLowerCase()),l=c||{label:a.OsClient,apiBaseUrl:a.ApiBase,osClient:a.OsClient,osClientType:"",osClientNetwork:""};o.auth.enableProtectedMcpTokens(l);let g=o.api.getTokenForServer(l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork);try{await o.api.setToken(a.Token,l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork);let d=await o.api.request({method:"POST",path:"/apiengine/platform-current-user",body:{},apiBaseUrl:l.apiBaseUrl,osClient:l.osClient,osClientType:l.osClientType,osClientNetwork:l.osClientNetwork,allowAuthRetry:!1,silent:!0});if(d.Code!==1||!d.Data)throw new Error("\u670D\u52A1\u5668\u672A\u63A5\u53D7\u6B64\u8FDE\u63A5\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u5F00\u53D1\u5DE5\u5177 Token");c||await o.config.addProfile(l),await o.auth.writeMcpTokenFile(),re({imported:!0,ApiBase:l.apiBaseUrl,OsClient:l.osClient,Next:"microi ai init"},t)}catch(d){throw g?await o.api.setToken(g,l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork):await o.api.clearTokenForServer(l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork),d}return}if(n==="profile"){if(r==="list"){let a=lt(o.config.getProfiles()).map(({profile:c,mcpName:l},g)=>({index:g+1,mcpName:l,...c,loggedIn:We(o,c)}));re(a,t);return}if(r==="add"){re(await Fs(o,e),t);return}if(r==="remove"){let a=Lt(o.config,i||ce(e,"profile")),c=o.config.getProfiles().findIndex(l=>l.apiBaseUrl===a.apiBaseUrl&&l.osClient===a.osClient);await o.config.removeProfile(c),await o.auth.writeMcpTokenFile(),await $t(o.root),re({removed:!0,profile:a},t);return}}if(n==="auth"){let a=Lt(o.config,ce(e,"profile"));if(r==="login"){await Vs(o,a,e),re({loggedIn:!0,profile:a.osClient},t);return}if(r==="repair"){if(!await o.auth.recoverProfileLogin(a))throw new Error("\u5F53\u524D\u5DE5\u4F5C\u533A\u6CA1\u6709\u8BE5\u8FDE\u63A5\u53EF\u7528\u7684 OS \u52A0\u5BC6\u5E10\u53F7\u5BC6\u7801\uFF0C\u9700\u5148\u6267\u884C\u4E00\u6B21 microi auth login");re({loggedIn:!0,repaired:!0,profile:a.osClient},t);return}if(r==="status"){re({loggedIn:We(o,a),profile:a},t);return}if(r==="logout"){await o.api.clearTokenForServer(a.apiBaseUrl,a.osClient,a.osClientType,a.osClientNetwork),await o.auth.writeMcpTokenFile(),await $t(o.root),re({loggedIn:!1,profile:a.osClient},t);return}}if(n==="ai"&&r==="init"){re(await xs(o,e.mcp!==!1),t);return}if(n==="mcp"&&r==="init"){re(await $t(o.root),t);return}if(n==="init"){let a=o.config.getProfiles()[0];a||(a=await Fs(o,e)),We(o,a)||await Vs(o,a,e);let c=await xs(o,!0);e.pull===!0&&await Os(o,a,"all"),re({initialized:!0,pulled:e.pull===!0,details:c},t);return}if(n==="pull"){let a=Lt(o.config,ce(e,"profile")),c=ce(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 Os(o,a,c),re({pulled:!0,scope:c,profile:a.osClient},t);return}if(n==="push"){let a=ae.resolve(r||"");if(!se.existsSync(a))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${a}`);if(!await at.getInstance().pushFile(a))throw new Error("\u63A8\u9001\u5931\u8D25\uFF0C\u8BF7\u67E5\u770B\u4E0A\u65B9 Microi \u65E5\u5FD7");re({pushed:!0,file:a},t);return}if(n==="sync"&&r==="status"){let a=Lt(o.config,ce(e,"profile")),c=ce(e,"scope")||"all";if(!["all","api","form","module","workflow"].includes(c))throw new Error(`\u4E0D\u652F\u6301\u7684\u5DEE\u5F02\u8303\u56F4\uFF1A${c}`);let l=await at.getInstance().checkRemoteDifferences(a,c);re({profile:a.osClient,scope:c,count:l.length,differences:l},t);return}if(n==="doctor"){let a=o.config.getProfiles(),c=Le(),l=ae.join(o.root,".vscode","mcp.json"),g=[];if(se.existsSync(l))try{let m=zt(se.readFileSync(l,"utf-8")),f=m.servers&&typeof m.servers=="object"?m.servers:{};for(let[y,S]of Object.entries(f)){let h=S.env&&typeof S.env=="object"?S.env:{};if(!/^microi(?:_|-|$)/i.test(y)&&typeof h.MICROI_API_URL!="string")continue;let C=At(S),T=Nt(C,c);g.push({name:y,source:String(h.MICROI_TOOL_SOURCE||"legacy"),version:C||"legacy",compatibility:T>0?"newer-provider-preserved":T<0?"upgrade-available":"compatible"})}}catch(m){g.push({name:"(config)",source:"unknown",version:"unknown",compatibility:`invalid-json: ${m instanceof Error?m.message:String(m)}`})}let d=ae.join(o.root,".vscode",".microi-ai-docs-manifest.json"),u="";if(se.existsSync(d))try{let m=JSON.parse(se.readFileSync(d,"utf-8"));u=String(m.bundleVersion||"")}catch{u="invalid-json"}let p={ok:a.length>0&&a.some(m=>We(o,m)),tool:{source:"cli",version:c},node:process.version,workspace:o.root,syncRoot:o.config.getSyncRootDir(),profiles:a.map(m=>({label:m.label,osClient:m.osClient,apiBaseUrl:m.apiBaseUrl,loggedIn:We(o,m)})),files:{agents:se.existsSync(ae.join(o.root,"AGENTS.md")),codeBuddySkill:se.existsSync(ae.join(o.root,".codebuddy","skills","microi","SKILL.md")),qoderSkill:se.existsSync(ae.join(o.root,".qoder","skills","microi","SKILL.md")),comateSkill:se.existsSync(ae.join(o.root,".comate","skills","microi","SKILL.md")),vscodeMcp:se.existsSync(l),workBuddyMcp:se.existsSync(ae.join(o.root,".workbuddy","mcp.json")),portableMcp:se.existsSync(ae.join(o.root,".mcp.json")),comateMcp:se.existsSync(ae.join(o.root,".comate","mcp.json")),codexMcp:se.existsSync(ae.join(o.root,".codex","config.toml")),tokenFile:se.existsSync(o.auth.mcpTokenFilePath)},coexistence:{aiBundleVersion:u||"not-initialized",mcpProviders:g}};re(p,t),p.ok||(process.exitCode=2);return}throw new Error(`\u672A\u77E5\u547D\u4EE4\uFF1A${s.join(" ")}
2043
+ \u901A\u7528\u9009\u9879\uFF1A--workspace <\u76EE\u5F55>\uFF08\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55\uFF09\u3001--profile <\u5E8F\u53F7/OsClient/\u540D\u79F0/mcpName>\u3001--json`}async function Ls(s,e){let t=(le(e,"api")||await ht("API \u5730\u5740")).replace(/\/+$/,""),n=le(e,"os-client")||await ht("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:le(e,"label")||await ht("\u8FDE\u63A5\u540D\u79F0",n),apiBaseUrl:t,osClient:n,osClientType:le(e,"type")||"",osClientNetwork:le(e,"network")||""};return await s.config.addProfile(i),i}function Io(s){return s===!0||s===1||String(s||"").trim().toLowerCase()==="true"}async function Bs(s,e,t){let n=le(t,"account")||await ht("\u5E10\u53F7"),r=await Ro("\u5BC6\u7801"),i=await s.auth.getSysConfig(e.apiBaseUrl,e.osClient),o,a,c="";if(Io(i?.EnableCaptcha)){let l=await s.auth.getCaptcha(e.apiBaseUrl,e.osClient);if(!l)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(s.config.getSyncRootDir(),".microi-login-captcha.png"),ie.mkdirSync(ce.dirname(c),{recursive:!0}),ie.writeFileSync(c,Buffer.from(l.imageBase64.split(",")[1],"base64")),console.log(`\u9A8C\u8BC1\u7801\u56FE\u7247\uFF1A${c}`),o=l.captchaId,a=le(t,"captcha")||await ht("\u9A8C\u8BC1\u7801")}try{let l=await s.auth.login(n,r,{apiBaseUrl:e.apiBaseUrl,osClient:e.osClient,osClientType:e.osClientType,osClientNetwork:e.osClientNetwork,captchaId:o,captchaValue:a});if(!l.ok)throw new Error(l.msg||"\u767B\u5F55\u5931\u8D25");let g=await s.auth.getSysConfig(e.apiBaseUrl,e.osClient,void 0,!0);g&&await s.config.addProfile({...e,label:String(g.SysShortTitle||g.SysTitle||e.label),sysShortTitle:String(g.SysShortTitle||""),sysTitle:String(g.SysTitle||"")})}finally{c&&ie.existsSync(c)&&ie.rmSync(c,{force:!0})}}async function Us(s,e){cn.getInstance().inject();let t=e?await Bt(s.root):{count:0,names:[]};return{workspace:s.root,syncRoot:s.config.getSyncRootDir(),mcp:t}}async function js(s,e,t){if(!Ge(s,e))throw new Error("\u8BE5\u8FDE\u63A5\u6CA1\u6709\u53EF\u7528 Token\uFF0C\u8BF7\u5148\u6267\u884C microi auth login");let n=ct.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 _o(){let{words:s,options:e}=Do(process.argv.slice(2)),t=e.json===!0;if(s[0]==="version"||e.version===!0){let a={package:"@microi.net/cli",version:Be()};t?se(a,!0):console.log(a.version);return}if(!s.length||s[0]==="help"||e.help){console.log($s());return}let[n,r,i]=s;if(n==="update"){let a=le(e,"current-version")||Be();if(e.worker===!0){se(Vs({currentVersion:a,workspace:le(e,"workspace"),sourceCliPath:le(e,"source-cli")}),t);return}try{se(dr({currentVersion:a,workspace:le(e,"workspace")||process.cwd(),sourceCliPath:process.argv[1],force:e.force===!0}),t)}catch(c){se({scheduled:!1,deferred:!0,message:`\u81EA\u52A8\u66F4\u65B0\u6682\u672A\u6295\u9012\uFF0C\u5C06\u5728\u540E\u7EED\u4F7F\u7528\u65F6\u91CD\u8BD5\uFF1B\u4E0D\u5F71\u54CD\u5F53\u524D\u6216\u65B0\u5EFA\u5DE5\u4F5C\uFF1A${c instanceof Error?c.message:String(c)}`},t)}return}if(process.env.MICROI_DISABLE_AUTO_UPDATE!=="1")try{dr({currentVersion:Be(),workspace:le(e,"workspace")||process.cwd(),sourceCliPath:process.argv[1]})}catch{}if(n==="plugin"&&r==="path"){let a=ce.resolve(__dirname,"..");se({package:"@microi.net/cli",packageRoot:a,codeBuddyManifest:ce.join(a,".codebuddy-plugin","plugin.json"),codeBuddyMarketplace:ce.join(a,".codebuddy-plugin","marketplace.json"),workBuddyManifest:ce.join(a,".workbuddy-plugin","plugin.json"),workBuddyMarketplace:ce.join(a,".workbuddy-plugin","marketplace.json"),dshBundle:ce.join(a,"cordis.patch.yml")},t);return}if(n==="codex"){if(r==="status"){let a=us();se(a,t),a.ok||(process.exitCode=2);return}if(r==="install"){se(gs({force:e.force===!0,marketplaceSource:le(e,"source")}),t);return}}if(n==="dsh"){let a=le(e,"profile");if(r==="status"){let c=ys(a);se(c,t),c.ok||(process.exitCode=2);return}if(r==="install"){se(Ss({profile:a,source:le(e,"source"),force:e.force===!0}),t);return}}let o=await bs(le(e,"workspace")||process.cwd());if(n==="auth"&&r==="import"){if(e["session-stdin"]!==!0)throw new Error("\u8BF7\u4F7F\u7528 --session-stdin\uFF0C\u51ED\u636E\u4E0D\u5F97\u653E\u5165\u547D\u4EE4\u884C\u53C2\u6570");let a=xs(await Os(process.stdin)),c=o.config.getProfiles().find(d=>d.apiBaseUrl.replace(/\/+$/,"")===a.ApiBase&&d.osClient.toLowerCase()===a.OsClient.toLowerCase()),l=c||{label:a.OsClient,apiBaseUrl:a.ApiBase,osClient:a.OsClient,osClientType:"",osClientNetwork:""};o.auth.enableProtectedMcpTokens(l);let g=o.api.getTokenForServer(l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork);try{await o.api.setToken(a.Token,l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork);let d=await o.api.request({method:"POST",path:"/apiengine/platform-current-user",body:{},apiBaseUrl:l.apiBaseUrl,osClient:l.osClient,osClientType:l.osClientType,osClientNetwork:l.osClientNetwork,allowAuthRetry:!1,silent:!0});if(d.Code!==1||!d.Data)throw new Error("\u670D\u52A1\u5668\u672A\u63A5\u53D7\u6B64\u8FDE\u63A5\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u5F00\u53D1\u5DE5\u5177 Token");c||await o.config.addProfile(l),await o.auth.writeMcpTokenFile(),se({imported:!0,ApiBase:l.apiBaseUrl,OsClient:l.osClient,Next:"microi ai init"},t)}catch(d){throw g?await o.api.setToken(g,l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork):await o.api.clearTokenForServer(l.apiBaseUrl,l.osClient,l.osClientType,l.osClientNetwork),d}return}if(n==="profile"){if(r==="list"){let a=dt(o.config.getProfiles()).map(({profile:c,mcpName:l},g)=>({index:g+1,mcpName:l,...c,loggedIn:Ge(o,c)}));se(a,t);return}if(r==="add"){se(await Ls(o,e),t);return}if(r==="remove"){let a=Ut(o.config,i||le(e,"profile")),c=o.config.getProfiles().findIndex(l=>l.apiBaseUrl===a.apiBaseUrl&&l.osClient===a.osClient);await o.config.removeProfile(c),await o.auth.writeMcpTokenFile(),await Bt(o.root),se({removed:!0,profile:a},t);return}}if(n==="auth"){let a=Ut(o.config,le(e,"profile"));if(r==="login"){await Bs(o,a,e),se({loggedIn:!0,profile:a.osClient},t);return}if(r==="repair"){if(!await o.auth.recoverProfileLogin(a))throw new Error("\u5F53\u524D\u5DE5\u4F5C\u533A\u6CA1\u6709\u8BE5\u8FDE\u63A5\u53EF\u7528\u7684 OS \u52A0\u5BC6\u5E10\u53F7\u5BC6\u7801\uFF0C\u9700\u5148\u6267\u884C\u4E00\u6B21 microi auth login");se({loggedIn:!0,repaired:!0,profile:a.osClient},t);return}if(r==="status"){se({loggedIn:Ge(o,a),profile:a},t);return}if(r==="logout"){await o.api.clearTokenForServer(a.apiBaseUrl,a.osClient,a.osClientType,a.osClientNetwork),await o.auth.writeMcpTokenFile(),await Bt(o.root),se({loggedIn:!1,profile:a.osClient},t);return}}if(n==="ai"&&r==="init"){se(await Us(o,e.mcp!==!1),t);return}if(n==="mcp"&&r==="init"){se(await Bt(o.root),t);return}if(n==="init"){let a=o.config.getProfiles()[0];a||(a=await Ls(o,e)),Ge(o,a)||await Bs(o,a,e);let c=await Us(o,!0);e.pull===!0&&await js(o,a,"all"),se({initialized:!0,pulled:e.pull===!0,details:c},t);return}if(n==="pull"){let a=Ut(o.config,le(e,"profile")),c=le(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 js(o,a,c),se({pulled:!0,scope:c,profile:a.osClient},t);return}if(n==="push"){let a=ce.resolve(r||"");if(!ie.existsSync(a))throw new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${a}`);if(!await ct.getInstance().pushFile(a))throw new Error("\u63A8\u9001\u5931\u8D25\uFF0C\u8BF7\u67E5\u770B\u4E0A\u65B9 Microi \u65E5\u5FD7");se({pushed:!0,file:a},t);return}if(n==="sync"&&r==="status"){let a=Ut(o.config,le(e,"profile")),c=le(e,"scope")||"all";if(!["all","api","form","module","workflow"].includes(c))throw new Error(`\u4E0D\u652F\u6301\u7684\u5DEE\u5F02\u8303\u56F4\uFF1A${c}`);let l=await ct.getInstance().checkRemoteDifferences(a,c);se({profile:a.osClient,scope:c,count:l.length,differences:l},t);return}if(n==="doctor"){let a=o.config.getProfiles(),c=Be(),l=ce.join(o.root,".vscode","mcp.json"),g=[];if(ie.existsSync(l))try{let m=qt(ie.readFileSync(l,"utf-8")),f=m.servers&&typeof m.servers=="object"?m.servers:{};for(let[y,S]of Object.entries(f)){let h=S.env&&typeof S.env=="object"?S.env:{};if(!/^microi(?:_|-|$)/i.test(y)&&typeof h.MICROI_API_URL!="string")continue;let C=Ft(S),w=Vt(C,c);g.push({name:y,source:String(h.MICROI_TOOL_SOURCE||"legacy"),version:C||"legacy",compatibility:w>0?"newer-provider-preserved":w<0?"upgrade-available":"compatible"})}}catch(m){g.push({name:"(config)",source:"unknown",version:"unknown",compatibility:`invalid-json: ${m instanceof Error?m.message:String(m)}`})}let d=ce.join(o.root,".vscode",".microi-ai-docs-manifest.json"),u="";if(ie.existsSync(d))try{let m=JSON.parse(ie.readFileSync(d,"utf-8"));u=String(m.bundleVersion||"")}catch{u="invalid-json"}let p={ok:a.length>0&&a.some(m=>Ge(o,m)),tool:{source:"cli",version:c},node:process.version,workspace:o.root,syncRoot:o.config.getSyncRootDir(),profiles:a.map(m=>({label:m.label,osClient:m.osClient,apiBaseUrl:m.apiBaseUrl,loggedIn:Ge(o,m)})),files:{agents:ie.existsSync(ce.join(o.root,"AGENTS.md")),codeBuddySkill:ie.existsSync(ce.join(o.root,".codebuddy","skills","microi","SKILL.md")),qoderSkill:ie.existsSync(ce.join(o.root,".qoder","skills","microi","SKILL.md")),comateSkill:ie.existsSync(ce.join(o.root,".comate","skills","microi","SKILL.md")),vscodeMcp:ie.existsSync(l),workBuddyMcp:ie.existsSync(ce.join(o.root,".workbuddy","mcp.json")),portableMcp:ie.existsSync(ce.join(o.root,".mcp.json")),comateMcp:ie.existsSync(ce.join(o.root,".comate","mcp.json")),codexMcp:ie.existsSync(ce.join(o.root,".codex","config.toml")),tokenFile:ie.existsSync(o.auth.mcpTokenFilePath)},coexistence:{aiBundleVersion:u||"not-initialized",mcpProviders:g}};se(p,t),p.ok||(process.exitCode=2);return}throw new Error(`\u672A\u77E5\u547D\u4EE4\uFF1A${s.join(" ")}
2044
2044
 
2045
- ${Ns()}`)}ko().catch(s=>{console.error(`Microi CLI: ${s instanceof Error?s.message:String(s)}`),process.exitCode=1});
2045
+ ${$s()}`)}_o().catch(s=>{console.error(`Microi CLI: ${s instanceof Error?s.message:String(s)}`),process.exitCode=1});