@microi.net/cli 5.8.4 → 5.8.6

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 (212) 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/.mcp.json +1 -1
  5. package/.workbuddy-plugin/marketplace.json +2 -2
  6. package/.workbuddy-plugin/plugin.json +1 -1
  7. package/LICENSE +21 -21
  8. package/README.md +71 -71
  9. package/assets/build-meta.json +7 -7
  10. package/assets/feature-matrix.json +138 -138
  11. package/assets/logo.svg +4 -4
  12. package/cordis.patch.yml +1 -1
  13. package/package.json +1 -1
  14. package/scripts/codex-marketplace.json +20 -20
  15. package/scripts/mcp-codex-stdio-adapter.js +189 -189
  16. package/scripts/mcp-server.js +5 -0
  17. package/scripts/mcp-trae-windows-launcher.cmd +21 -21
  18. package/scripts/microi-cli-mcp.js +7 -7
  19. package/scripts/microi-cli.js +67 -66
  20. package/scripts/microi-codex-broker.js +450 -450
  21. package/scripts/microi-codex-router.js +618 -582
  22. package/scripts/microi-skills.meta.json +384 -384
  23. package/skills/.microi-skills-version.json +2 -2
  24. package/skills/.progressive-disclosure-manifest.json +3566 -3566
  25. package/skills/README.md +287 -287
  26. package/skills/ai-engine/SKILL.md +269 -265
  27. package/skills/ai-engine/agents/openai.yaml +4 -4
  28. package/skills/ai-engine/references/ai-employees.md +48 -48
  29. package/skills/ai-engine/references/self-hosted-digital-human.md +59 -59
  30. package/skills/ai-platform-governance/SKILL.md +177 -177
  31. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  32. package/skills/app-store/SKILL.md +525 -525
  33. package/skills/app-store/agents/openai.yaml +4 -4
  34. package/skills/business-blueprint/SKILL.md +193 -193
  35. package/skills/datasource-engine/SKILL.md +93 -93
  36. package/skills/datasource-engine/agents/openai.yaml +4 -4
  37. package/skills/dos-orm/SKILL.md +97 -97
  38. package/skills/dos-orm/references/api-reference.md +229 -229
  39. package/skills/email-engine/SKILL.md +81 -81
  40. package/skills/email-engine/references/v8-email.md +34 -34
  41. package/skills/job-engine/SKILL.md +176 -176
  42. package/skills/job-engine/agents/openai.yaml +4 -4
  43. package/skills/message-notification/SKILL.md +156 -156
  44. package/skills/message-notification/agents/openai.yaml +5 -5
  45. package/skills/message-notification/references/contracts.md +102 -102
  46. package/skills/microi/SKILL.md +14 -14
  47. package/skills/microi-ai-app-auth.js +652 -652
  48. package/skills/microi-ai-application/SKILL.md +115 -115
  49. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  50. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  51. package/skills/microi-client-frontend/SKILL.md +244 -244
  52. 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
  53. 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
  54. 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
  55. package/skills/microi-codex/SKILL.md +102 -100
  56. package/skills/microi-codex-installer/SKILL.md +231 -227
  57. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  58. package/skills/microi-datasource-mapping/SKILL.md +122 -122
  59. package/skills/microi-db-schema/SKILL.md +175 -175
  60. package/skills/microi-db-schema/agents/openai.yaml +4 -4
  61. package/skills/microi-db-schema/references/core-tables.md +695 -695
  62. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  63. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  64. package/skills/microi-db-schema/references/schema.md +646 -646
  65. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  66. package/skills/microi-deployment/SKILL.md +221 -221
  67. package/skills/microi-deployment/references/deployment-matrix.md +109 -109
  68. package/skills/microi-docs-coverage/SKILL.md +133 -133
  69. package/skills/microi-docs-coverage/references/capability-map.md +91 -91
  70. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  71. package/skills/microi-form-engine/SKILL.md +333 -333
  72. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  73. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  74. package/skills/microi-form-layout/SKILL.md +205 -205
  75. 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
  76. package/skills/microi-frontend-sdk/SKILL.md +194 -194
  77. 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
  78. package/skills/microi-left-right-layout/SKILL.md +141 -141
  79. package/skills/microi-microservice/SKILL.md +326 -324
  80. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  81. package/skills/microi-mobile-app-quality/SKILL.md +185 -185
  82. 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
  83. 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
  84. package/skills/microi-solution-quotation/SKILL.md +78 -78
  85. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  86. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  87. package/skills/microi-sso/SKILL.md +92 -92
  88. package/skills/microi-sso/references/acceptance.md +49 -49
  89. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  90. package/skills/microi-sso/references/inbound.md +53 -53
  91. package/skills/microi-sso/references/outbound.md +39 -39
  92. package/skills/microi-system-delivery/SKILL.md +137 -137
  93. 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
  94. 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 +217 -217
  95. package/skills/microi-ui/SKILL.md +192 -192
  96. 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
  97. package/skills/microi-uniapp-frontend/SKILL.md +193 -193
  98. 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
  99. 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
  100. package/skills/microi.v8.js +1921 -1921
  101. package/skills/module-engine/SKILL.md +255 -255
  102. package/skills/module-engine/references/module-config.md +204 -204
  103. package/skills/ocr-engine/SKILL.md +113 -113
  104. package/skills/ocr-engine/agents/openai.yaml +4 -4
  105. package/skills/page-engine/SKILL.md +206 -206
  106. package/skills/page-engine/examples/compact-dashboard.json +1444 -1444
  107. 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
  108. 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
  109. package/skills/performance-testing/SKILL.md +221 -221
  110. package/skills/playwright-e2e/SKILL.md +196 -196
  111. 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
  112. 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
  113. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
  114. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
  115. package/skills/print-engine/SKILL.md +259 -259
  116. package/skills/production-readonly-audit/SKILL.md +41 -41
  117. package/skills/report-engine/SKILL.md +71 -71
  118. package/skills/report-engine/agents/openai.yaml +4 -4
  119. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  120. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  121. package/skills/scripts/sync-embedded-skills.mjs +46 -46
  122. package/skills/scripts/validate-progressive-disclosure.mjs +57 -57
  123. package/skills/search-engine/SKILL.md +75 -75
  124. package/skills/search-engine/agents/openai.yaml +4 -4
  125. package/skills/spider-engine/SKILL.md +190 -190
  126. package/skills/system-observability/SKILL.md +248 -248
  127. package/skills/system-observability/references/memory-incident-triage.md +77 -77
  128. package/skills/translate-engine/SKILL.md +140 -140
  129. package/skills/translate-engine/agents/openai.yaml +4 -4
  130. package/skills/ui-design/SKILL.md +223 -223
  131. package/skills/ui-design/assets/pattern-showcase/app.js +54 -54
  132. package/skills/ui-design/assets/pattern-showcase/index.html +163 -163
  133. package/skills/ui-design/assets/pattern-showcase/styles.css +311 -311
  134. package/skills/ui-design/assets/templates/MCI-DESIGN.md +206 -206
  135. package/skills/ui-design/references/design-pattern-library.md +184 -184
  136. package/skills/ui-design/references/mci-design-contract.md +163 -163
  137. package/skills/ui-design/references/motion-and-media.md +78 -78
  138. package/skills/ui-design/references/product-flow-recipes.md +94 -94
  139. 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
  140. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +164 -164
  141. 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
  142. 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
  143. 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
  144. 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
  145. 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
  146. 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 +142 -142
  147. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  148. package/skills/unity-integration/SKILL.md +171 -171
  149. package/skills/unity-integration/agents/openai.yaml +4 -4
  150. package/skills/unity-integration/references/ai-app-delivery.md +119 -119
  151. package/skills/unity-integration/references/sdk-api.md +82 -82
  152. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  153. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  154. package/skills/v8-api-config/SKILL.md +388 -388
  155. package/skills/v8-cache-pattern/SKILL.md +312 -312
  156. package/skills/v8-crud-api/SKILL.md +178 -178
  157. 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
  158. 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
  159. package/skills/v8-debugging/SKILL.md +284 -284
  160. package/skills/v8-explorer-tree/SKILL.md +228 -228
  161. package/skills/v8-export-import/SKILL.md +219 -219
  162. 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
  163. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
  164. 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
  165. package/skills/v8-file-upload/SKILL.md +284 -284
  166. 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 +263 -263
  167. 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 +161 -161
  168. package/skills/v8-formengine-http/SKILL.md +238 -238
  169. package/skills/v8-frontend-events/SKILL.md +180 -180
  170. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  171. package/skills/v8-frontend-events/references/bluetooth-print.md +258 -258
  172. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
  173. package/skills/v8-http-integration/SKILL.md +182 -182
  174. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
  175. 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
  176. package/skills/v8-image-processing/SKILL.md +190 -190
  177. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  178. package/skills/v8-image-processing/references/api-reference.md +623 -623
  179. package/skills/v8-menu-buttons/SKILL.md +186 -186
  180. 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
  181. 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
  182. 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
  183. package/skills/v8-mongodb/SKILL.md +200 -200
  184. package/skills/v8-mq-mqtt/SKILL.md +176 -176
  185. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  186. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -181
  187. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  188. package/skills/v8-saas-multi-tenant/SKILL.md +305 -305
  189. package/skills/v8-security/SKILL.md +210 -210
  190. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +200 -200
  191. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +160 -160
  192. package/skills/v8-sql-query/SKILL.md +302 -302
  193. package/skills/v8-table-event/SKILL.md +176 -176
  194. 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 +216 -216
  195. 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
  196. package/skills/v8-tcp-integration/SKILL.md +147 -147
  197. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  198. package/skills/v8-template-engine/SKILL.md +167 -167
  199. package/skills/v8-utilities/SKILL.md +104 -104
  200. package/skills/v8-utilities/references/client-api-index.md +143 -143
  201. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  202. package/skills/v8-utilities/references/server-api-index.md +188 -188
  203. package/skills/v8-workflow/SKILL.md +252 -252
  204. 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
  205. package/skills/v8-workflow/references/workflow-configuration.md +49 -49
  206. package/skills/vision-engine/SKILL.md +160 -160
  207. package/skills/vision-engine/agents/openai.yaml +4 -4
  208. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  209. package/skills/workspace-conventions/SKILL.md +273 -270
  210. 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 +209 -209
  211. 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 +217 -217
  212. 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,176 +1,176 @@
1
- # microi-frontend-sdk 详细参考 1
2
-
3
- > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
-
5
- <!-- microi-progressive:chunk id=microi-frontend-sdk-006 sha256=e3a4f78365b0d189c55e03eb4cc1f36deaa39b3fe5580ccb4b7b77f8b443be8b -->
6
- ## Token、当前登录用户与当前终端登录协议
7
-
8
- Microi 后端不是只保存一个全局 Token。每个租户、每个 `sys_user` 在 Redis 中维护一份 `CurrentToken`,其中 `CurrentUser` 表示平台当前登录用户,`Tokens` 表示该用户的多个当前终端登录。每个终端项至少包含 `Token`、`ClientType`、`Did`、`IP`、`CreateTime`、`UpdateTime`;退出、管理员清除登录信息、同终端重新登录或 Token 轮换都会影响该列表。
9
-
10
- 登录必须同时标记终端类型和稳定设备 Id:
11
-
12
- ```js
13
- const V8 = createMicroiV8({
14
- apiBase,
15
- osClient,
16
- clientType: 'Mobile', // PC / Mobile / H5 / App / WxMiniProgram / VSCode / MCP
17
- didKey: 'microi_did'
18
- });
19
-
20
- const result = await V8.Login({
21
- Account,
22
- Pwd,
23
- _ClientType: 'Mobile'
24
- });
25
- ```
26
-
27
- - PC 后台传 `_ClientType:'PC'`,有效期读取 SaaS 引擎 `SessionAuthTimeout`,单位分钟,默认 20 分钟。
28
- - VS Code 传 `_ClientType:'VSCode'`,优先读取 `VSCodeAccessTokenLifetime`,否则读取 `AccessTokenLifetime`,单位天,默认 30 天。
29
- - MCP 传 `_ClientType:'MCP'`,优先读取 `McpAccessTokenLifetime`,否则读取 `AccessTokenLifetime`,单位天,默认 30 天。
30
- - Mobile、H5、App、各类小程序及其它非 PC 终端读取 `AccessTokenLifetime`,单位天,默认 30 天。
31
- - `did` 通过请求头发送,同一安装或浏览器配置必须稳定持久化;不要每次请求生成新值。标准 SDK 使用 `V8.getDid()` 自动生成和复用。
32
- - Token 优先从响应头 `authorization` 读取,并立即覆盖本地旧 Token;兼容接口才从响应体读取。每个受保护请求都要接收响应头中的新 Token,因为后端可能在普通请求中自动轮换。
33
-
34
- ### 续签时机
35
-
36
- 不要把本地固定 15 分钟当作所有终端的有效期。读取 JWT 的 `exp` 与 `MicroiTokenIssuedAt`,在到期前按以下规则触发以旧换新:
37
-
38
- ```text
39
- 提前量 = lifetime / 10
40
- 最少提前 5 分钟
41
- 最多提前 1 天
42
- ```
43
-
44
- 因此默认 PC 20 分钟会在约第 15 分钟续签;默认移动端、VS Code 30 天会在到期前 1 天进入续签窗口。调用:
45
-
46
- ```js
47
- V8.startTokenMaintenance();
48
-
49
- // UniApp/App/小程序每次回到前台
50
- await V8.resumeAuthSession(false);
51
-
52
- // 主动以旧换新
53
- const result = await V8.refreshToken();
54
- ```
55
-
56
- - Web 同时监听 `visibilitychange`、`focus`、`pageshow`。浏览器可能休眠后台标签页并暂停 `setInterval`,恢复可见时必须立即检查,不能等下一个定时周期。
57
- - UniApp/App/小程序在 `App.onShow` 调用 `resumeAuthSession(false)`。
58
- - VS Code 在扩展激活后维护 Token,并在 `vscode.window.onDidChangeWindowState` 恢复焦点时立即检查。
59
- - 多请求、多 Tab 续签必须 single-flight。PC 后台可使用 Web Locks;收到响应时,如果本地 Token 已被其它 Tab 更新,旧请求不得把旧 Token 覆盖回来或清掉新登录态。
60
- - 续签请求即使以 `auth:false` 调用,也必须绑定发起时的会话(SDK 内部使用 `sessionBound:true`);退出或重新登录后的旧续签响应不得恢复旧会话。UniApp 登录缓存写入后须回读确认 Token 与用户都已保存,失败时清理半登录态并留在登录页,禁止继续欢迎提示和导航。
61
- - 调用 `/api/SysUser/RefreshToken` 时同时传旧 `authorization`、当前 `OsClient`、原终端 `_ClientType`,请求头继续传稳定 `did`。不要频繁无条件换新。
62
-
63
- ### 失效提示与租户边界
64
-
65
- 受保护接口返回 `Code=1001/1002`,或 RefreshToken 返回登录失效时,必须原样展示后端 `Msg`,禁止覆盖成固定“登录已过期”。后端会返回 `DataAppend` 诊断:
66
-
67
- | `ReasonCode` | 处理方式 |
68
- |---|---|
69
- | `JwtExpired` / `SessionExpired` | 展示已过期分钟、小时或天以及过期时间,然后清理当前终端会话并重新登录 |
70
- | `TenantMismatch` | 提示 Token 所属租户与当前请求租户,切换租户或重新登录;禁止把该 Token 用于当前租户 |
71
- | `TokenReplaced` | 先检查本地 Token 是否已被其它 Tab/并发请求更新;有新 Token 时重试一次,否则重新登录 |
72
- | `SessionMissing` | 服务端登录态已退出、被管理员清除或缓存已重建;清理本地 Token 并重新登录 |
73
- | `AuthVersionChanged` | 后端安全版本已升级,必须重新登录 |
74
- | `MalformedToken` / `MissingClaims` | Token 无法继续使用,清理并重新登录 |
75
-
76
- 不要显示完整 Token、用户密码或密钥。日志只记录 `ReasonCode`、终端类型、脱敏 `did`、请求租户和 Token 租户。`TokenOsClient` 只用于提示和诊断,真正鉴权仍以服务端签名、租户和 Redis 当前终端列表为准。
77
-
78
- ### Token 验收
79
-
80
- - PC、移动端、VS Code 分别登录,回读 JWT `ClientType`、`Did` 和有效期,确认命中对应 SaaS 配置。
81
- - 模拟页面隐藏超过 PC 有效期后恢复,确认先执行续签;若已无法续签,提示精确显示过期时长。
82
- - 使用 A 租户 Token 请求 B 租户,确认返回 `TenantMismatch`,提示同时包含 Token 租户与当前租户且不泄漏 Token。
83
- - 同一旧 Token 并发调用两次 RefreshToken,确认复用同一新 Token,后续请求成功。
84
- - 管理员调用 `ClearUserLoginInfo` 后,旧 Token 返回 `SessionMissing` 或等价明确原因,前端不再循环续签。
85
-
86
- <!-- /microi-progressive:chunk -->
87
- <!-- microi-progressive:chunk id=microi-frontend-sdk-007 sha256=32ff522b3d30d94eb6cc1747b1f1238e35c1c3d43091f3ce308067e320ecb2a4 -->
88
- ## 仅支持 Vue 3
89
-
90
- 新的 Microi 前端工作只支持 Vue 3。不要把 Vue2、Vuex、`Vue.prototype` 或 Vue2/uni-app 条件编译加入 `microi.v8.js`。状态管理属于项目本身,通常使用 Pinia 或本地组合函数;SDK 只负责平台访问、请求、鉴权、上传、资源 URL 和小工具。
91
-
92
- <!-- /microi-progressive:chunk -->
93
- <!-- microi-progressive:chunk id=microi-frontend-sdk-008 sha256=0c59d00b2e54dd61d194d6246dd787a456ab8f12d4abe6dc330b002f41d7ee26 -->
94
- ## Key-Value 枚举的跨端约定(强制)
95
-
96
- - PC、UniApp、小程序和 Web 页面遇到简单枚举时,应从字段元数据或业务接口返回的公开 `{Key,Value}` 选项获取数据源;`Value` 只负责展示,`Key` 才能进入表单值、URL、缓存键和接口筛选参数。
97
- - 不得把中文 `Value` 当作查询条件,也不得在各端复制维护互相漂移的中文/英文映射。若业务接口已返回选项投影,优先直接消费;本地常量只能作为接口暂时不可用时的同 Key 兜底。
98
- - 页面 URL 需要保存筛选状态时写入稳定英文 Key,返回页面后按 Key 恢复选中项;切换语言只替换 Value,不得改变 URL 和数据库值。
99
- - 兼容历史数据时,客户端可以短期识别旧 Value,但提交和新 URL 必须立即归一为 Key;长期迁移由服务端完成并回读验证。
100
-
101
- <!-- /microi-progressive:chunk -->
102
- <!-- microi-progressive:chunk id=microi-frontend-sdk-009 sha256=2e428f404342ad21af261e5f5876e34e2b9fc9455791bf0ad73ff4ad5b3e2ed0 -->
103
- ## 界面层独立
104
-
105
- SDK 不得导入 Element Plus、uni-ui、uView、TDesign、FirstUI、Pinia、Vue Router 或 axios。界面反馈通过可配置适配器提供:
106
-
107
- - `toast(message)`
108
- - `confirm(message)`
109
- - `onAuthExpired(body, V8)`
110
- - optional `requestAdapter(options)`
111
-
112
- 这样同一个 SDK 才能同时用于 uni-app、PC 网站、后台扩展页面和文档演示。
113
-
114
- <!-- /microi-progressive:chunk -->
115
- <!-- microi-progressive:chunk id=microi-frontend-sdk-010 sha256=ee237c45899f7204d3da1a2d589a89268c2db2a9b765f68fc7097eadf8da7104 -->
116
- ## 验证
117
-
118
- 将项目改为使用 SDK 后:
119
-
120
- - 运行相关构建或类型检查。
121
- - 至少测试一次需要登录的 ApiEngine 调用和一次匿名调用。
122
- - 用 `assetUrl` 测试一个图片或上传 JSON 字段。
123
- - 如果任务涉及鉴权,测试 Token 过期行为。
124
- - 对 uni-app H5,同时验证移动视口和 PC 浏览器手机壳下 SDK 正常工作。
125
-
126
- ### 复盘:生产构建被 `.env.local` 的 localhost 地址污染
127
-
128
- - 触发场景:本地开发通过 `.env.local` 指向 `localhost` API,发布后的官网仍请求开发者电脑的 loopback 地址,线上出现 `Failed to fetch`。
129
- - 根因:Vite 会在所有模式加载 `.env.local`;它不是仅开发模式文件。若生产模式没有更高优先级配置,loopback 地址会被编译进正式产物。
130
- - 通用规则:本地 API 只写入 `.env.development.local`;生产项目必须提供 `.env.production`。独立官网还要在统一 ApiBase 解析层拒绝“生产构建或非本地域名 + localhost/127.0.0.1/::1”,并安全回退到明确的正式 API。
131
- - 自动化检查:生产构建后扫描 JS 产物不得包含本地 ApiBase,并在正式域名上下文断言接口请求 origin 等于配置的生产 API;本地 `npm run dev` 仍应命中开发 API。
132
-
133
- <!-- /microi-progressive:chunk -->
134
- <!-- microi-progressive:chunk id=microi-frontend-sdk-011 sha256=81ac75e383ea5a32ae45aeff1276fc2b8f56141961e70cc3956ae818aaf2fa1d -->
135
- ## 搭配 MCI-UI
136
-
137
- SDK 负责平台能力,MCI-UI 负责产品界面。新的 Microi Vue3 项目应同时使用:
138
-
139
- - `microi.skills/microi.v8.js`:请求、Token、上传、文件 URL、ApiEngine/FormEngine。
140
- - `Microi.UI/src/theme`:`--mci-*` 设计变量。
141
- - `Microi.UI/src/uniapp`:移动端/UniApp 组件。
142
- - `Microi.UI/src/web`:PC 官网和响应式网站组件。
143
-
144
- 不要在 SDK 内解决界面状态、骨架屏、富文本间距或安全区布局。这一层应使用 MCI-UI 组件处理。
145
-
146
- <!-- /microi-progressive:chunk -->
147
- <!-- microi-progressive:chunk id=microi-frontend-sdk-012 sha256=d869adb0abd87d9ba03b58faa84944a61895773a6c3642f5c20c8a03e315a2ce -->
148
- ## MicroApp 宿主 Token 同步
149
-
150
- Vue3 前端微服务通过 `window.microApp.getData()` 接收主平台上下文时,不能只把 `token` 放进普通配置对象后假设请求会自动携带。标准 `microi.v8.js` 必须支持 `config.token`,且 `getToken()` 要优先读取运行时 token,再回退到 `storage[tokenKey]`。微服务必须复用同一个 V8 客户端实例,不能在每次按钮点击时重新 `createMicroiV8()`。
151
-
152
- `getData()` 中的 Token 是宿主传入的快照,只能用于首次引导或宿主确实下发了不同值时更新;不能在每次 `configureMicroiV8()` 时用旧快照覆盖 SDK 已从响应头取得的新 Token。推荐同时配置 `onTokenChanged`,把新 Token 与发起请求所用的旧 Token 回传宿主,宿主通过 `DiyCommon.ApplyAuthorizationToken(newToken, requestToken)` 接力并防止多标签页旧响应回写:
153
-
154
- ```js
155
- const microiV8 = V8; // 模块级单例
156
- let appliedHostToken = '';
157
-
158
- microiV8.configure({
159
- apiBase: ctx.apiBase,
160
- osClient: ctx.osClient,
161
- onTokenChanged: (token, requestToken) => {
162
- window.microApp?.dispatch?.({ type: 'micro-app:token', data: { token, requestToken } });
163
- }
164
- });
165
- if (ctx.token && ctx.token !== appliedHostToken) {
166
- appliedHostToken = ctx.token;
167
- microiV8.setToken(ctx.token);
168
- }
169
- ```
170
-
171
- 普通 `request`、浏览器 `fetch(FormData)` 上传和 `uni.uploadFile` 都必须读取响应头的新 Token。验收时必须连续执行至少两个需要登录态的请求(前一个允许发生 Token 轮换),确认后一个仍返回 `Code=1`;不能只看页面首屏渲染成功。
172
- <!-- /microi-progressive:chunk -->
173
-
174
- ## 运行时 ApiBase / OsClient 切换
175
-
176
- 允许用户切换平台的客户端必须把 `ApiBase + OsClient` 视为完整安全边界,而不是只替换请求 URL。候选端点应先匿名探测,成功后再原子更新配置并清除旧 Token、用户和平台派生缓存;账号、RSA 密文、菜单、表元数据和页面状态不得跨边界复用。SDK 每次修改 `apiBase` 或 `osClient` 都必须推进端点代次,请求记录发起时代次,并在处理响应头 Token、鉴权失效或响应体之前拒绝旧代次的迟到响应。验收至少覆盖“旧平台登录请求未返回 -> 切换平台 -> 旧响应携带 Token 返回”,并确认旧 Token 没有写入、新请求只发送一个新 `osclient`。
1
+ # microi-frontend-sdk 详细参考 1
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-006 sha256=e3a4f78365b0d189c55e03eb4cc1f36deaa39b3fe5580ccb4b7b77f8b443be8b -->
6
+ ## Token、当前登录用户与当前终端登录协议
7
+
8
+ Microi 后端不是只保存一个全局 Token。每个租户、每个 `sys_user` 在 Redis 中维护一份 `CurrentToken`,其中 `CurrentUser` 表示平台当前登录用户,`Tokens` 表示该用户的多个当前终端登录。每个终端项至少包含 `Token`、`ClientType`、`Did`、`IP`、`CreateTime`、`UpdateTime`;退出、管理员清除登录信息、同终端重新登录或 Token 轮换都会影响该列表。
9
+
10
+ 登录必须同时标记终端类型和稳定设备 Id:
11
+
12
+ ```js
13
+ const V8 = createMicroiV8({
14
+ apiBase,
15
+ osClient,
16
+ clientType: 'Mobile', // PC / Mobile / H5 / App / WxMiniProgram / VSCode / MCP
17
+ didKey: 'microi_did'
18
+ });
19
+
20
+ const result = await V8.Login({
21
+ Account,
22
+ Pwd,
23
+ _ClientType: 'Mobile'
24
+ });
25
+ ```
26
+
27
+ - PC 后台传 `_ClientType:'PC'`,有效期读取 SaaS 引擎 `SessionAuthTimeout`,单位分钟,默认 20 分钟。
28
+ - VS Code 传 `_ClientType:'VSCode'`,优先读取 `VSCodeAccessTokenLifetime`,否则读取 `AccessTokenLifetime`,单位天,默认 30 天。
29
+ - MCP 传 `_ClientType:'MCP'`,优先读取 `McpAccessTokenLifetime`,否则读取 `AccessTokenLifetime`,单位天,默认 30 天。
30
+ - Mobile、H5、App、各类小程序及其它非 PC 终端读取 `AccessTokenLifetime`,单位天,默认 30 天。
31
+ - `did` 通过请求头发送,同一安装或浏览器配置必须稳定持久化;不要每次请求生成新值。标准 SDK 使用 `V8.getDid()` 自动生成和复用。
32
+ - Token 优先从响应头 `authorization` 读取,并立即覆盖本地旧 Token;兼容接口才从响应体读取。每个受保护请求都要接收响应头中的新 Token,因为后端可能在普通请求中自动轮换。
33
+
34
+ ### 续签时机
35
+
36
+ 不要把本地固定 15 分钟当作所有终端的有效期。读取 JWT 的 `exp` 与 `MicroiTokenIssuedAt`,在到期前按以下规则触发以旧换新:
37
+
38
+ ```text
39
+ 提前量 = lifetime / 10
40
+ 最少提前 5 分钟
41
+ 最多提前 1 天
42
+ ```
43
+
44
+ 因此默认 PC 20 分钟会在约第 15 分钟续签;默认移动端、VS Code 30 天会在到期前 1 天进入续签窗口。调用:
45
+
46
+ ```js
47
+ V8.startTokenMaintenance();
48
+
49
+ // UniApp/App/小程序每次回到前台
50
+ await V8.resumeAuthSession(false);
51
+
52
+ // 主动以旧换新
53
+ const result = await V8.refreshToken();
54
+ ```
55
+
56
+ - Web 同时监听 `visibilitychange`、`focus`、`pageshow`。浏览器可能休眠后台标签页并暂停 `setInterval`,恢复可见时必须立即检查,不能等下一个定时周期。
57
+ - UniApp/App/小程序在 `App.onShow` 调用 `resumeAuthSession(false)`。
58
+ - VS Code 在扩展激活后维护 Token,并在 `vscode.window.onDidChangeWindowState` 恢复焦点时立即检查。
59
+ - 多请求、多 Tab 续签必须 single-flight。PC 后台可使用 Web Locks;收到响应时,如果本地 Token 已被其它 Tab 更新,旧请求不得把旧 Token 覆盖回来或清掉新登录态。
60
+ - 续签请求即使以 `auth:false` 调用,也必须绑定发起时的会话(SDK 内部使用 `sessionBound:true`);退出或重新登录后的旧续签响应不得恢复旧会话。UniApp 登录缓存写入后须回读确认 Token 与用户都已保存,失败时清理半登录态并留在登录页,禁止继续欢迎提示和导航。
61
+ - 调用 `/api/SysUser/RefreshToken` 时同时传旧 `authorization`、当前 `OsClient`、原终端 `_ClientType`,请求头继续传稳定 `did`。不要频繁无条件换新。
62
+
63
+ ### 失效提示与租户边界
64
+
65
+ 受保护接口返回 `Code=1001/1002`,或 RefreshToken 返回登录失效时,必须原样展示后端 `Msg`,禁止覆盖成固定“登录已过期”。后端会返回 `DataAppend` 诊断:
66
+
67
+ | `ReasonCode` | 处理方式 |
68
+ |---|---|
69
+ | `JwtExpired` / `SessionExpired` | 展示已过期分钟、小时或天以及过期时间,然后清理当前终端会话并重新登录 |
70
+ | `TenantMismatch` | 提示 Token 所属租户与当前请求租户,切换租户或重新登录;禁止把该 Token 用于当前租户 |
71
+ | `TokenReplaced` | 先检查本地 Token 是否已被其它 Tab/并发请求更新;有新 Token 时重试一次,否则重新登录 |
72
+ | `SessionMissing` | 服务端登录态已退出、被管理员清除或缓存已重建;清理本地 Token 并重新登录 |
73
+ | `AuthVersionChanged` | 后端安全版本已升级,必须重新登录 |
74
+ | `MalformedToken` / `MissingClaims` | Token 无法继续使用,清理并重新登录 |
75
+
76
+ 不要显示完整 Token、用户密码或密钥。日志只记录 `ReasonCode`、终端类型、脱敏 `did`、请求租户和 Token 租户。`TokenOsClient` 只用于提示和诊断,真正鉴权仍以服务端签名、租户和 Redis 当前终端列表为准。
77
+
78
+ ### Token 验收
79
+
80
+ - PC、移动端、VS Code 分别登录,回读 JWT `ClientType`、`Did` 和有效期,确认命中对应 SaaS 配置。
81
+ - 模拟页面隐藏超过 PC 有效期后恢复,确认先执行续签;若已无法续签,提示精确显示过期时长。
82
+ - 使用 A 租户 Token 请求 B 租户,确认返回 `TenantMismatch`,提示同时包含 Token 租户与当前租户且不泄漏 Token。
83
+ - 同一旧 Token 并发调用两次 RefreshToken,确认复用同一新 Token,后续请求成功。
84
+ - 管理员调用 `ClearUserLoginInfo` 后,旧 Token 返回 `SessionMissing` 或等价明确原因,前端不再循环续签。
85
+
86
+ <!-- /microi-progressive:chunk -->
87
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-007 sha256=32ff522b3d30d94eb6cc1747b1f1238e35c1c3d43091f3ce308067e320ecb2a4 -->
88
+ ## 仅支持 Vue 3
89
+
90
+ 新的 Microi 前端工作只支持 Vue 3。不要把 Vue2、Vuex、`Vue.prototype` 或 Vue2/uni-app 条件编译加入 `microi.v8.js`。状态管理属于项目本身,通常使用 Pinia 或本地组合函数;SDK 只负责平台访问、请求、鉴权、上传、资源 URL 和小工具。
91
+
92
+ <!-- /microi-progressive:chunk -->
93
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-008 sha256=0c59d00b2e54dd61d194d6246dd787a456ab8f12d4abe6dc330b002f41d7ee26 -->
94
+ ## Key-Value 枚举的跨端约定(强制)
95
+
96
+ - PC、UniApp、小程序和 Web 页面遇到简单枚举时,应从字段元数据或业务接口返回的公开 `{Key,Value}` 选项获取数据源;`Value` 只负责展示,`Key` 才能进入表单值、URL、缓存键和接口筛选参数。
97
+ - 不得把中文 `Value` 当作查询条件,也不得在各端复制维护互相漂移的中文/英文映射。若业务接口已返回选项投影,优先直接消费;本地常量只能作为接口暂时不可用时的同 Key 兜底。
98
+ - 页面 URL 需要保存筛选状态时写入稳定英文 Key,返回页面后按 Key 恢复选中项;切换语言只替换 Value,不得改变 URL 和数据库值。
99
+ - 兼容历史数据时,客户端可以短期识别旧 Value,但提交和新 URL 必须立即归一为 Key;长期迁移由服务端完成并回读验证。
100
+
101
+ <!-- /microi-progressive:chunk -->
102
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-009 sha256=2e428f404342ad21af261e5f5876e34e2b9fc9455791bf0ad73ff4ad5b3e2ed0 -->
103
+ ## 界面层独立
104
+
105
+ SDK 不得导入 Element Plus、uni-ui、uView、TDesign、FirstUI、Pinia、Vue Router 或 axios。界面反馈通过可配置适配器提供:
106
+
107
+ - `toast(message)`
108
+ - `confirm(message)`
109
+ - `onAuthExpired(body, V8)`
110
+ - optional `requestAdapter(options)`
111
+
112
+ 这样同一个 SDK 才能同时用于 uni-app、PC 网站、后台扩展页面和文档演示。
113
+
114
+ <!-- /microi-progressive:chunk -->
115
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-010 sha256=ee237c45899f7204d3da1a2d589a89268c2db2a9b765f68fc7097eadf8da7104 -->
116
+ ## 验证
117
+
118
+ 将项目改为使用 SDK 后:
119
+
120
+ - 运行相关构建或类型检查。
121
+ - 至少测试一次需要登录的 ApiEngine 调用和一次匿名调用。
122
+ - 用 `assetUrl` 测试一个图片或上传 JSON 字段。
123
+ - 如果任务涉及鉴权,测试 Token 过期行为。
124
+ - 对 uni-app H5,同时验证移动视口和 PC 浏览器手机壳下 SDK 正常工作。
125
+
126
+ ### 复盘:生产构建被 `.env.local` 的 localhost 地址污染
127
+
128
+ - 触发场景:本地开发通过 `.env.local` 指向 `localhost` API,发布后的官网仍请求开发者电脑的 loopback 地址,线上出现 `Failed to fetch`。
129
+ - 根因:Vite 会在所有模式加载 `.env.local`;它不是仅开发模式文件。若生产模式没有更高优先级配置,loopback 地址会被编译进正式产物。
130
+ - 通用规则:本地 API 只写入 `.env.development.local`;生产项目必须提供 `.env.production`。独立官网还要在统一 ApiBase 解析层拒绝“生产构建或非本地域名 + localhost/127.0.0.1/::1”,并安全回退到明确的正式 API。
131
+ - 自动化检查:生产构建后扫描 JS 产物不得包含本地 ApiBase,并在正式域名上下文断言接口请求 origin 等于配置的生产 API;本地 `npm run dev` 仍应命中开发 API。
132
+
133
+ <!-- /microi-progressive:chunk -->
134
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-011 sha256=81ac75e383ea5a32ae45aeff1276fc2b8f56141961e70cc3956ae818aaf2fa1d -->
135
+ ## 搭配 MCI-UI
136
+
137
+ SDK 负责平台能力,MCI-UI 负责产品界面。新的 Microi Vue3 项目应同时使用:
138
+
139
+ - `microi.skills/microi.v8.js`:请求、Token、上传、文件 URL、ApiEngine/FormEngine。
140
+ - `Microi.UI/src/theme`:`--mci-*` 设计变量。
141
+ - `Microi.UI/src/uniapp`:移动端/UniApp 组件。
142
+ - `Microi.UI/src/web`:PC 官网和响应式网站组件。
143
+
144
+ 不要在 SDK 内解决界面状态、骨架屏、富文本间距或安全区布局。这一层应使用 MCI-UI 组件处理。
145
+
146
+ <!-- /microi-progressive:chunk -->
147
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-012 sha256=d869adb0abd87d9ba03b58faa84944a61895773a6c3642f5c20c8a03e315a2ce -->
148
+ ## MicroApp 宿主 Token 同步
149
+
150
+ Vue3 前端微服务通过 `window.microApp.getData()` 接收主平台上下文时,不能只把 `token` 放进普通配置对象后假设请求会自动携带。标准 `microi.v8.js` 必须支持 `config.token`,且 `getToken()` 要优先读取运行时 token,再回退到 `storage[tokenKey]`。微服务必须复用同一个 V8 客户端实例,不能在每次按钮点击时重新 `createMicroiV8()`。
151
+
152
+ `getData()` 中的 Token 是宿主传入的快照,只能用于首次引导或宿主确实下发了不同值时更新;不能在每次 `configureMicroiV8()` 时用旧快照覆盖 SDK 已从响应头取得的新 Token。推荐同时配置 `onTokenChanged`,把新 Token 与发起请求所用的旧 Token 回传宿主,宿主通过 `DiyCommon.ApplyAuthorizationToken(newToken, requestToken)` 接力并防止多标签页旧响应回写:
153
+
154
+ ```js
155
+ const microiV8 = V8; // 模块级单例
156
+ let appliedHostToken = '';
157
+
158
+ microiV8.configure({
159
+ apiBase: ctx.apiBase,
160
+ osClient: ctx.osClient,
161
+ onTokenChanged: (token, requestToken) => {
162
+ window.microApp?.dispatch?.({ type: 'micro-app:token', data: { token, requestToken } });
163
+ }
164
+ });
165
+ if (ctx.token && ctx.token !== appliedHostToken) {
166
+ appliedHostToken = ctx.token;
167
+ microiV8.setToken(ctx.token);
168
+ }
169
+ ```
170
+
171
+ 普通 `request`、浏览器 `fetch(FormData)` 上传和 `uni.uploadFile` 都必须读取响应头的新 Token。验收时必须连续执行至少两个需要登录态的请求(前一个允许发生 Token 轮换),确认后一个仍返回 `Code=1`;不能只看页面首屏渲染成功。
172
+ <!-- /microi-progressive:chunk -->
173
+
174
+ ## 运行时 ApiBase / OsClient 切换
175
+
176
+ 允许用户切换平台的客户端必须把 `ApiBase + OsClient` 视为完整安全边界,而不是只替换请求 URL。候选端点应先匿名探测,成功后再原子更新配置并清除旧 Token、用户和平台派生缓存;账号、RSA 密文、菜单、表元数据和页面状态不得跨边界复用。SDK 每次修改 `apiBase` 或 `osClient` 都必须推进端点代次,请求记录发起时代次,并在处理响应头 Token、鉴权失效或响应体之前拒绝旧代次的迟到响应。验收至少覆盖“旧平台登录请求未返回 -> 切换平台 -> 旧响应携带 Token 返回”,并确认旧 Token 没有写入、新请求只发送一个新 `osclient`。