@microi.net/cli 5.7.7 → 5.7.9

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 (191) 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 +102 -101
  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 +366 -366
  19. package/skills/.microi-skills-version.json +2 -2
  20. package/skills/.progressive-disclosure-manifest.json +27 -27
  21. package/skills/README.md +286 -286
  22. package/skills/ai-engine/SKILL.md +265 -265
  23. package/skills/ai-engine/agents/openai.yaml +4 -4
  24. package/skills/ai-platform-governance/SKILL.md +177 -177
  25. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  26. package/skills/app-store/SKILL.md +392 -396
  27. package/skills/app-store/agents/openai.yaml +4 -4
  28. package/skills/business-blueprint/SKILL.md +193 -193
  29. package/skills/datasource-engine/SKILL.md +90 -90
  30. package/skills/datasource-engine/agents/openai.yaml +4 -4
  31. package/skills/dos-orm/references/api-reference.md +229 -229
  32. package/skills/email-engine/SKILL.md +78 -78
  33. package/skills/email-engine/references/v8-email.md +34 -34
  34. package/skills/job-engine/SKILL.md +171 -172
  35. package/skills/job-engine/agents/openai.yaml +4 -4
  36. package/skills/message-notification/SKILL.md +155 -156
  37. package/skills/message-notification/agents/openai.yaml +5 -5
  38. package/skills/message-notification/references/contracts.md +102 -102
  39. package/skills/microi-ai-app-auth.js +652 -652
  40. package/skills/microi-ai-application/SKILL.md +102 -106
  41. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  42. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  43. package/skills/microi-client-frontend/SKILL.md +235 -240
  44. 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
  45. 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
  46. 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
  47. package/skills/microi-codex/SKILL.md +75 -75
  48. package/skills/microi-codex-installer/SKILL.md +225 -223
  49. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  50. package/skills/microi-datasource-mapping/SKILL.md +107 -111
  51. package/skills/microi-db-schema/SKILL.md +175 -175
  52. package/skills/microi-db-schema/agents/openai.yaml +4 -4
  53. package/skills/microi-db-schema/references/core-tables.md +695 -695
  54. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  55. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  56. package/skills/microi-db-schema/references/schema.md +646 -646
  57. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  58. package/skills/microi-deployment/references/deployment-matrix.md +101 -101
  59. package/skills/microi-docs-coverage/references/capability-map.md +0 -1
  60. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  61. package/skills/microi-form-engine/SKILL.md +226 -226
  62. package/skills/microi-form-engine/references/component-catalog.md +216 -216
  63. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  64. package/skills/microi-form-layout/SKILL.md +205 -205
  65. 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
  66. package/skills/microi-frontend-sdk/SKILL.md +188 -188
  67. 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
  68. package/skills/microi-left-right-layout/SKILL.md +141 -141
  69. package/skills/microi-microservice/SKILL.md +322 -323
  70. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  71. package/skills/microi-mobile-app-quality/SKILL.md +181 -181
  72. 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
  73. 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
  74. package/skills/microi-solution-quotation/SKILL.md +78 -78
  75. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  76. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  77. package/skills/microi-sso/references/acceptance.md +49 -49
  78. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  79. package/skills/microi-sso/references/inbound.md +53 -53
  80. package/skills/microi-sso/references/outbound.md +39 -39
  81. package/skills/microi-system-delivery/SKILL.md +134 -134
  82. 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
  83. 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
  84. package/skills/microi-ui/SKILL.md +174 -174
  85. 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
  86. package/skills/microi-uniapp-frontend/SKILL.md +193 -193
  87. 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
  88. 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
  89. package/skills/microi.v8.js +1921 -1921
  90. package/skills/module-engine/SKILL.md +237 -250
  91. package/skills/module-engine/references/module-config.md +204 -204
  92. package/skills/ocr-engine/SKILL.md +113 -113
  93. package/skills/ocr-engine/agents/openai.yaml +4 -4
  94. package/skills/page-engine/SKILL.md +180 -191
  95. 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
  96. 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
  97. package/skills/performance-testing/SKILL.md +221 -221
  98. package/skills/playwright-e2e/SKILL.md +197 -197
  99. 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
  100. 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
  101. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
  102. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
  103. package/skills/print-engine/SKILL.md +259 -259
  104. package/skills/production-readonly-audit/SKILL.md +41 -41
  105. package/skills/report-engine/SKILL.md +71 -71
  106. package/skills/report-engine/agents/openai.yaml +4 -4
  107. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  108. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  109. package/skills/search-engine/SKILL.md +75 -75
  110. package/skills/search-engine/agents/openai.yaml +4 -4
  111. package/skills/spider-engine/SKILL.md +190 -190
  112. package/skills/system-observability/SKILL.md +238 -238
  113. package/skills/system-observability/references/memory-incident-triage.md +70 -70
  114. package/skills/translate-engine/SKILL.md +140 -140
  115. package/skills/translate-engine/agents/openai.yaml +4 -4
  116. package/skills/ui-design/SKILL.md +191 -191
  117. package/skills/ui-design/assets/templates/MCI-DESIGN.md +198 -198
  118. package/skills/ui-design/references/design-pattern-library.md +184 -184
  119. package/skills/ui-design/references/mci-design-contract.md +163 -163
  120. 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
  121. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +137 -137
  122. 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
  123. 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
  124. 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
  125. 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
  126. 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
  127. 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
  128. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  129. package/skills/unity-integration/SKILL.md +155 -155
  130. package/skills/unity-integration/agents/openai.yaml +4 -4
  131. package/skills/unity-integration/references/ai-app-delivery.md +103 -103
  132. package/skills/unity-integration/references/sdk-api.md +82 -82
  133. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  134. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  135. package/skills/v8-cache-pattern/SKILL.md +306 -306
  136. package/skills/v8-crud-api/SKILL.md +175 -175
  137. 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
  138. 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
  139. package/skills/v8-debugging/SKILL.md +284 -284
  140. package/skills/v8-explorer-tree/SKILL.md +228 -228
  141. package/skills/v8-export-import/SKILL.md +209 -209
  142. 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
  143. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
  144. 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
  145. package/skills/v8-file-upload/SKILL.md +256 -263
  146. 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
  147. 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
  148. package/skills/v8-formengine-http/SKILL.md +219 -219
  149. package/skills/v8-frontend-events/SKILL.md +178 -178
  150. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  151. package/skills/v8-frontend-events/references/bluetooth-print.md +246 -246
  152. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
  153. package/skills/v8-http-integration/SKILL.md +182 -182
  154. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
  155. 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
  156. package/skills/v8-image-processing/SKILL.md +190 -190
  157. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  158. package/skills/v8-image-processing/references/api-reference.md +623 -623
  159. package/skills/v8-menu-buttons/SKILL.md +180 -180
  160. 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
  161. 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
  162. 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
  163. package/skills/v8-mongodb/SKILL.md +192 -192
  164. package/skills/v8-mq-mqtt/SKILL.md +175 -176
  165. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  166. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -181
  167. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  168. package/skills/v8-saas-multi-tenant/SKILL.md +219 -219
  169. package/skills/v8-security/SKILL.md +168 -168
  170. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +198 -198
  171. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +158 -158
  172. package/skills/v8-sql-query/SKILL.md +302 -302
  173. package/skills/v8-table-event/SKILL.md +144 -144
  174. 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
  175. 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
  176. package/skills/v8-tcp-integration/SKILL.md +147 -147
  177. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  178. package/skills/v8-template-engine/SKILL.md +167 -167
  179. package/skills/v8-utilities/SKILL.md +90 -90
  180. package/skills/v8-utilities/references/client-api-index.md +143 -143
  181. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  182. package/skills/v8-utilities/references/server-api-index.md +188 -188
  183. package/skills/v8-workflow/SKILL.md +216 -243
  184. 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
  185. package/skills/vision-engine/SKILL.md +159 -159
  186. package/skills/vision-engine/agents/openai.yaml +4 -4
  187. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  188. package/skills/workspace-conventions/SKILL.md +261 -261
  189. 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
  190. 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
  191. 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,113 +1,113 @@
1
- ---
2
- name: ocr-engine
3
- description: 为 Microi 吾码集成、配置、调用和验收通用 OCR 能力。处理 V8.OCR、/apiengine/platform-ocr-recognize、PaddleX/PaddleOCR 服务、SaaS 租户 OCR 配置、图片或 PDF 文字识别、OCR 安全边界、Docker 部署和多节点交付时使用。
4
- ---
5
-
6
- > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
7
-
8
- # Microi OCR 引擎
9
-
10
- ## 先读取相关规范
11
-
12
- - 涉及租户配置时,读取 `../v8-saas-multi-tenant/SKILL.md`。
13
- - 涉及外部 OCR 服务时,读取 `../v8-http-integration/SKILL.md`。
14
- - 涉及 Base64、上传文件或私有文件时,读取 `../v8-file-upload/SKILL.md`。
15
- - 涉及权限、密钥、日志或匿名接口时,读取 `../v8-security/SKILL.md`。
16
- - 涉及数据库字段和表单 Tab 时,读取 `../microi-db-schema/SKILL.md`。
17
-
18
- ## 固定架构
19
-
20
- Microi 后端只实现统一 OCR 网关、租户隔离、协议适配和安全治理,不在 .NET 进程内训练或维护 OCR 模型。默认提供方为独立部署的 PaddleX OCR 服务;业务代码只能调用 `IMicroiOcr`、`V8.OCR` 或官方 Managed 接口 `/apiengine/platform-ocr-recognize`,不得直接读取 SaaS 密钥并自行拼接 HTTP 请求。
21
-
22
- 同步识别必须绑定当前请求和当前租户。批量、超大文件或长耗时 OCR 应进入共享数据库/MQ/outbox,以全局任务 Id 做幂等;不得把任务状态、队列或锁只放在单机内存中。
23
-
24
- ## SaaS 配置
25
-
26
- 配置位于 `sys_osclients` 的独立“OCR识别”Tab:
27
-
28
- | 字段 | 用途 | 默认值 |
29
- |---|---|---|
30
- | `OcrEnabled` | 租户总开关,默认关闭 | `0` |
31
- | `OcrProvider` | `PaddleX` 或 `PaddleXHighStability` | `PaddleX` |
32
- | `OcrEndpoint` | OCR 服务完整接口地址 | 空 |
33
- | `OcrApiKey` | 可选 Bearer 密钥,只允许后端使用 | 空 |
34
- | `OcrHeadersJson` | 可选服务端固定请求头 JSON | 空 |
35
- | `OcrTimeoutSeconds` | 单次超时秒数 | `60` |
36
- | `OcrMaxFileMB` | 单文件大小上限 | `20` |
37
- | `OcrMaxPages` | PDF 页数上限 | `10` |
38
- | `OcrMinConfidence` | 返回文本最低置信度 | `0` |
39
-
40
- 这些配置不得投影到 `V8.OsClientModel`,不得由前端请求覆盖,不得写入普通日志。没有启用、没有 endpoint 或配置无效时必须失败关闭。
41
-
42
- ## 调用
43
-
44
- 接口引擎或后端表单事件中:
45
-
46
- ```js
47
- var result = await V8.OCR.Recognize({
48
- FileByteBase64: V8.FilesByteBase64.invoice,
49
- FileName: 'invoice.png',
50
- UseDocOrientationClassify: true,
51
- UseDocUnwarping: true,
52
- UseTextlineOrientation: true,
53
- TextRecScoreThresh: 0.5,
54
- ReturnWordBox: false
55
- });
56
-
57
- if (result.Code !== 1) {
58
- return result;
59
- }
60
-
61
- return {
62
- Code: 1,
63
- Data: {
64
- Text: result.Data.Text,
65
- Pages: result.Data.Pages,
66
- Provider: result.Data.Provider
67
- }
68
- };
69
- ```
70
-
71
- 已登录客户端调用 `POST /apiengine/platform-ocr-recognize`,请求体与 `V8.OCR.Recognize` 一致,并携带正常登录 Token。`OsClient` 以 Token 解析结果为准。该接口由官方应用以 `Managed` 策略恢复;个性化逻辑只能写入租户 `platform-runtime-custom-hook`,且官方接口不会把文件 Base64、识别原文或密钥传给 Hook。
72
-
73
- 标准成功结果包含 `Provider`、`Text`、`Pages`、`ElapsedMilliseconds`。每页包含 `PageIndex`、`Text`、`Regions`,每个区域包含 `Text`、`Confidence` 和归一化后的 `Polygon`。
74
-
75
- ## 协议与输入边界
76
-
77
- - `PaddleX` 使用基础服务协议 `POST /ocr`。
78
- - `PaddleXHighStability` 使用 KServe 协议 `POST /v2/models/ocr/infer`。
79
- - 接受 PDF、PNG、JPEG、BMP、GIF、TIFF、WebP;同时检查文件扩展名、Base64 和文件魔数。
80
- - 固定 `visualize=false`,避免服务返回大体积可视化图片。
81
- - 由服务端限制文件大小、超时、PDF 页数、响应体大小和最低置信度。
82
- - 禁止接受调用方传入 endpoint、API key、任意请求头、代理地址或本地文件路径,防止 SSRF 和密钥绕过。
83
- - 日志只记录租户、提供方、状态码、耗时和安全裁剪后的错误,不记录文件 Base64、识别原文、API key 或完整响应。
84
-
85
- ## Docker 与多节点
86
-
87
- - OCR 模型服务独立部署,固定 PaddleX/PaddlePaddle/模型版本;不要使用浮动 `latest` 直接上线。
88
- - CPU 基线位于 `../../Microi.Server/Microi.OCR/deploy/paddlex/`,固定 PaddleX 3.6.1 与 PaddlePaddle 3.2.2;公开镜像固定为 `registry.cn-hangzhou.aliyuncs.com/microios/paddlex-ocr:3.6.1-paddle3.2.2-cpu`,当前只交付 `linux/amd64`。PaddlePaddle 3.3.0 存在 CPU oneDNN PIR 推理兼容问题,在完成真实图片回归前不得升级。
89
- - 发布镜像使用同目录 `publish-image.ps1`:它从根目录发布配置读取凭据,通过隔离 Docker 配置和 `--password-stdin` 登录,推送后退出并匿名回读公开摘要。不得在命令行、日志或文档中展开用户名/密码,也不得只凭 `docker push` 返回成功就宣布国内镜像可用。
90
- - 发布镜像时执行 `create_pipeline("OCR")` 预置默认产线模型。运行时使用 named volume 挂载 `/home/microi/.paddlex`,让 Docker 首次创建卷时从镜像复制模型;不要改成空宿主机 bind mount,否则会遮住镜像内的预置模型并触发重新下载。
91
- - OCR 宿主机端口只绑定 `127.0.0.1`;Docker 化 API 与 OCR 同时加入 external bridge 网络 `microi-ocr`,一键安装的内部 endpoint 固定为 `http://microi-install-ocr:8080/ocr`。不得通过公网/LAN 回环调用同机 OCR。
92
- - `install-microi.sh` 默认尝试安装 OCR,但先部署 API/Web 并通过 liveness、完整 `ServerVersion` 升级链和 readiness。随后必须依次满足“固定镜像拉取并回读为 amd64 → OCR healthy → Upgrade29 的 9 个物理字段数据库回读 → 唯一活动主租户 → 配置写入后回读 → API 重启 readiness”才设置 `OcrEnabled=1`;任一步失败都保持 OCR 能力关闭并记录警告,但不得中断已经可用的核心平台。字段每秒回读一次且最多 15 秒;正常升级应首轮命中,镜像过旧或迁移失败应快速关闭 OCR,禁止无意义等待 5 分钟。不要用安装脚本直接伪造 `diy_field` 元数据绕过 Upgrade29。
93
- - API/Web 官方浮动 `latest` 必须在 Compose 启动时强制回源拉取,避免旧本机镜像缺少 Upgrade29。核心门禁失败时输出“安装未完成”恢复汇总并保留非零退出码;OCR 字段、服务或配置门禁失败时,成功汇总明确显示“OCR SaaS 未启用”和附加能力警告。两种汇总都不是启用 OCR 的依据。
94
- - OCR 使用固定不可变版本,不加入只跟踪 API/Web 浮动标签的 Watchtower 自动更新列表;升级镜像时先发布新 tag、匿名回读 digest/架构,再修改 Compose 与安装器。
95
- - 登录国内镜像源必须从本机发布配置读取凭据并走 `docker login --password-stdin`,不得输出密码。推送成功不是发布验收,必须使用隔离的匿名 Docker config 回读 manifest/digest,必要时再做匿名拉取。
96
- - 不要在内存不足的共享开发机上直接构建模型镜像。构建前检查物理内存、Docker 占用与同类进程;保留至少 `max(6 GB, 物理内存 20%)`,不足时延后构建而不是停止他人服务。
97
- - API 多节点共享同一个或同一组 OCR endpoint;每节点仅保留无状态 `HttpClient`。
98
- - OCR 服务至少配置 readiness、并发上限、CPU/GPU 资源上限、请求体上限和访问控制。
99
- - GPU 推理采用独立 Worker/服务池,避免 OCR 模型抢占 Microi API 内存。
100
- - 滚动升级时保持旧新 OCR 响应协议兼容;协议变更先扩展解析器,再升级服务。
101
-
102
- ## 验收门禁
103
-
104
- 交付时分别报告:
105
-
106
- 1. 源码:网关、V8、REST、SaaS 字段、密钥投影隔离是否齐全。
107
- 2. 定向测试:基础协议、高稳定协议、低置信度过滤、错误响应、配置隔离。
108
- 3. 数据库:目标 `OsClient` 的 Tab、字段和物理列经 MCP 写后回读。
109
- 4. 服务:真实 PNG/JPEG/PDF 至少各一例,包含中英文、旋转和多页场景。
110
- 5. 多节点:两个 API 节点同时调用,同租户限制一致,服务故障时均能超时/降级且不泄漏密钥。
111
- 6. UI:SaaS 配置表单能查看独立 Tab、保存配置,密码字段不出现在普通前端上下文。
112
-
113
- 没有真实 OCR endpoint、服务版本和样例识别结果时,只能声明“平台接入完成、运行验收待配置”,不能声明生产 OCR 已可用。
1
+ ---
2
+ name: ocr-engine
3
+ description: 为 Microi 吾码集成、配置、调用和验收通用 OCR 能力。处理 V8.OCR、/apiengine/platform-ocr-recognize、PaddleX/PaddleOCR 服务、SaaS 租户 OCR 配置、图片或 PDF 文字识别、OCR 安全边界、Docker 部署和多节点交付时使用。
4
+ ---
5
+
6
+ > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
7
+
8
+ # Microi OCR 引擎
9
+
10
+ ## 先读取相关规范
11
+
12
+ - 涉及租户配置时,读取 `../v8-saas-multi-tenant/SKILL.md`。
13
+ - 涉及外部 OCR 服务时,读取 `../v8-http-integration/SKILL.md`。
14
+ - 涉及 Base64、上传文件或私有文件时,读取 `../v8-file-upload/SKILL.md`。
15
+ - 涉及权限、密钥、日志或匿名接口时,读取 `../v8-security/SKILL.md`。
16
+ - 涉及数据库字段和表单 Tab 时,读取 `../microi-db-schema/SKILL.md`。
17
+
18
+ ## 固定架构
19
+
20
+ Microi 后端只实现统一 OCR 网关、租户隔离、协议适配和安全治理,不在 .NET 进程内训练或维护 OCR 模型。默认提供方为独立部署的 PaddleX OCR 服务;业务代码只能调用 `IMicroiOcr`、`V8.OCR` 或官方 Managed 接口 `/apiengine/platform-ocr-recognize`,不得直接读取 SaaS 密钥并自行拼接 HTTP 请求。
21
+
22
+ 同步识别必须绑定当前请求和当前租户。批量、超大文件或长耗时 OCR 应进入共享数据库/MQ/outbox,以全局任务 Id 做幂等;不得把任务状态、队列或锁只放在单机内存中。
23
+
24
+ ## SaaS 配置
25
+
26
+ 配置位于 `sys_osclients` 的独立“OCR识别”Tab:
27
+
28
+ | 字段 | 用途 | 默认值 |
29
+ |---|---|---|
30
+ | `OcrEnabled` | 租户总开关,默认关闭 | `0` |
31
+ | `OcrProvider` | `PaddleX` 或 `PaddleXHighStability` | `PaddleX` |
32
+ | `OcrEndpoint` | OCR 服务完整接口地址 | 空 |
33
+ | `OcrApiKey` | 可选 Bearer 密钥,只允许后端使用 | 空 |
34
+ | `OcrHeadersJson` | 可选服务端固定请求头 JSON | 空 |
35
+ | `OcrTimeoutSeconds` | 单次超时秒数 | `60` |
36
+ | `OcrMaxFileMB` | 单文件大小上限 | `20` |
37
+ | `OcrMaxPages` | PDF 页数上限 | `10` |
38
+ | `OcrMinConfidence` | 返回文本最低置信度 | `0` |
39
+
40
+ 这些配置不得投影到 `V8.OsClientModel`,不得由前端请求覆盖,不得写入普通日志。没有启用、没有 endpoint 或配置无效时必须失败关闭。
41
+
42
+ ## 调用
43
+
44
+ 接口引擎或后端表单事件中:
45
+
46
+ ```js
47
+ var result = await V8.OCR.Recognize({
48
+ FileByteBase64: V8.FilesByteBase64.invoice,
49
+ FileName: 'invoice.png',
50
+ UseDocOrientationClassify: true,
51
+ UseDocUnwarping: true,
52
+ UseTextlineOrientation: true,
53
+ TextRecScoreThresh: 0.5,
54
+ ReturnWordBox: false
55
+ });
56
+
57
+ if (result.Code !== 1) {
58
+ return result;
59
+ }
60
+
61
+ return {
62
+ Code: 1,
63
+ Data: {
64
+ Text: result.Data.Text,
65
+ Pages: result.Data.Pages,
66
+ Provider: result.Data.Provider
67
+ }
68
+ };
69
+ ```
70
+
71
+ 已登录客户端调用 `POST /apiengine/platform-ocr-recognize`,请求体与 `V8.OCR.Recognize` 一致,并携带正常登录 Token。`OsClient` 以 Token 解析结果为准。该接口由官方应用以 `Managed` 策略恢复;个性化逻辑只能写入租户 `platform-runtime-custom-hook`,且官方接口不会把文件 Base64、识别原文或密钥传给 Hook。
72
+
73
+ 标准成功结果包含 `Provider`、`Text`、`Pages`、`ElapsedMilliseconds`。每页包含 `PageIndex`、`Text`、`Regions`,每个区域包含 `Text`、`Confidence` 和归一化后的 `Polygon`。
74
+
75
+ ## 协议与输入边界
76
+
77
+ - `PaddleX` 使用基础服务协议 `POST /ocr`。
78
+ - `PaddleXHighStability` 使用 KServe 协议 `POST /v2/models/ocr/infer`。
79
+ - 接受 PDF、PNG、JPEG、BMP、GIF、TIFF、WebP;同时检查文件扩展名、Base64 和文件魔数。
80
+ - 固定 `visualize=false`,避免服务返回大体积可视化图片。
81
+ - 由服务端限制文件大小、超时、PDF 页数、响应体大小和最低置信度。
82
+ - 禁止接受调用方传入 endpoint、API key、任意请求头、代理地址或本地文件路径,防止 SSRF 和密钥绕过。
83
+ - 日志只记录租户、提供方、状态码、耗时和安全裁剪后的错误,不记录文件 Base64、识别原文、API key 或完整响应。
84
+
85
+ ## Docker 与多节点
86
+
87
+ - OCR 模型服务独立部署,固定 PaddleX/PaddlePaddle/模型版本;不要使用浮动 `latest` 直接上线。
88
+ - CPU 基线位于 `../../Microi.Server/Microi.OCR/deploy/paddlex/`,固定 PaddleX 3.6.1 与 PaddlePaddle 3.2.2;公开镜像固定为 `registry.cn-hangzhou.aliyuncs.com/microios/paddlex-ocr:3.6.1-paddle3.2.2-cpu`,当前只交付 `linux/amd64`。PaddlePaddle 3.3.0 存在 CPU oneDNN PIR 推理兼容问题,在完成真实图片回归前不得升级。
89
+ - 发布镜像使用同目录 `publish-image.ps1`:它从根目录发布配置读取凭据,通过隔离 Docker 配置和 `--password-stdin` 登录,推送后退出并匿名回读公开摘要。不得在命令行、日志或文档中展开用户名/密码,也不得只凭 `docker push` 返回成功就宣布国内镜像可用。
90
+ - 发布镜像时执行 `create_pipeline("OCR")` 预置默认产线模型。运行时使用 named volume 挂载 `/home/microi/.paddlex`,让 Docker 首次创建卷时从镜像复制模型;不要改成空宿主机 bind mount,否则会遮住镜像内的预置模型并触发重新下载。
91
+ - OCR 宿主机端口只绑定 `127.0.0.1`;Docker 化 API 与 OCR 同时加入 external bridge 网络 `microi-ocr`,一键安装的内部 endpoint 固定为 `http://microi-install-ocr:8080/ocr`。不得通过公网/LAN 回环调用同机 OCR。
92
+ - `install-microi.sh` 默认尝试安装 OCR,但先部署 API/Web 并通过 liveness、完整 `ServerVersion` 升级链和 readiness。随后必须依次满足“固定镜像拉取并回读为 amd64 → OCR healthy → Upgrade29 的 9 个物理字段数据库回读 → 唯一活动主租户 → 配置写入后回读 → API 重启 readiness”才设置 `OcrEnabled=1`;任一步失败都保持 OCR 能力关闭并记录警告,但不得中断已经可用的核心平台。字段每秒回读一次且最多 15 秒;正常升级应首轮命中,镜像过旧或迁移失败应快速关闭 OCR,禁止无意义等待 5 分钟。不要用安装脚本直接伪造 `diy_field` 元数据绕过 Upgrade29。
93
+ - API/Web 官方浮动 `latest` 必须在 Compose 启动时强制回源拉取,避免旧本机镜像缺少 Upgrade29。核心门禁失败时输出“安装未完成”恢复汇总并保留非零退出码;OCR 字段、服务或配置门禁失败时,成功汇总明确显示“OCR SaaS 未启用”和附加能力警告。两种汇总都不是启用 OCR 的依据。
94
+ - OCR 使用固定不可变版本,不加入只跟踪 API/Web 浮动标签的 Watchtower 自动更新列表;升级镜像时先发布新 tag、匿名回读 digest/架构,再修改 Compose 与安装器。
95
+ - 登录国内镜像源必须从本机发布配置读取凭据并走 `docker login --password-stdin`,不得输出密码。推送成功不是发布验收,必须使用隔离的匿名 Docker config 回读 manifest/digest,必要时再做匿名拉取。
96
+ - 不要在内存不足的共享开发机上直接构建模型镜像。构建前检查物理内存、Docker 占用与同类进程;保留至少 `max(6 GB, 物理内存 20%)`,不足时延后构建而不是停止他人服务。
97
+ - API 多节点共享同一个或同一组 OCR endpoint;每节点仅保留无状态 `HttpClient`。
98
+ - OCR 服务至少配置 readiness、并发上限、CPU/GPU 资源上限、请求体上限和访问控制。
99
+ - GPU 推理采用独立 Worker/服务池,避免 OCR 模型抢占 Microi API 内存。
100
+ - 滚动升级时保持旧新 OCR 响应协议兼容;协议变更先扩展解析器,再升级服务。
101
+
102
+ ## 验收门禁
103
+
104
+ 交付时分别报告:
105
+
106
+ 1. 源码:网关、V8、REST、SaaS 字段、密钥投影隔离是否齐全。
107
+ 2. 定向测试:基础协议、高稳定协议、低置信度过滤、错误响应、配置隔离。
108
+ 3. 数据库:目标 `OsClient` 的 Tab、字段和物理列经 MCP 写后回读。
109
+ 4. 服务:真实 PNG/JPEG/PDF 至少各一例,包含中英文、旋转和多页场景。
110
+ 5. 多节点:两个 API 节点同时调用,同租户限制一致,服务故障时均能超时/降级且不泄漏密钥。
111
+ 6. UI:SaaS 配置表单能查看独立 Tab、保存配置,密码字段不出现在普通前端上下文。
112
+
113
+ 没有真实 OCR endpoint、服务版本和样例识别结果时,只能声明“平台接入完成、运行验收待配置”,不能声明生产 OCR 已可用。
@@ -1,4 +1,4 @@
1
- interface:
2
- display_name: "Microi OCR 引擎"
3
- short_description: "集成、配置和验证 Microi 通用 OCR 能力"
4
- default_prompt: "Use $ocr-engine to integrate and validate tenant-isolated OCR in Microi."
1
+ interface:
2
+ display_name: "Microi OCR 引擎"
3
+ short_description: "集成、配置和验证 Microi 通用 OCR 能力"
4
+ default_prompt: "Use $ocr-engine to integrate and validate tenant-isolated OCR in Microi."
@@ -1,12 +1,12 @@
1
- ---
2
- name: page-engine
3
- description: 生成和审查 Microi 界面引擎 Page Engine 页面 JSON。用于创建仪表盘、图表、表格、地图、组件、页面布局,或校验 mic_page formData JSON。
4
- ---
5
-
6
- > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
7
-
8
- # Microi 界面引擎(Page Engine)页面 JSON 生成
9
-
1
+ ---
2
+ name: page-engine
3
+ description: 生成和审查 Microi 界面引擎 Page Engine 页面 JSON。用于创建仪表盘、图表、表格、地图、组件、页面布局,或校验 mic_page formData JSON。
4
+ ---
5
+
6
+ > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
7
+
8
+ # Microi 界面引擎(Page Engine)页面 JSON 生成
9
+
10
10
  MCP 的生成/保存入口包含 `microi_build_page_design` 与 `microi_save_page_design`;版本治理入口见下文。保存工具写入后仍需回读 `mic_page`,不能把生成成功当作持久化成功。
11
11
 
12
12
  ## 紧凑报表与平台主题
@@ -18,189 +18,178 @@ MCP 的生成/保存入口包含 `microi_build_page_design` 与 `microi_save_pag
18
18
  运行容器默认 `wrapperOption.heightMode="content"`,`height` 只保留设计器布局尺寸。仅需固定图形画布时设为 `fixed`;图表自身可以设置 240–320px 高度。不要为一行指标、标题、三行表格预留 200–400px 空容器。紧凑布局的卡片间距建议 10–16px,面板内边距 8–16px;统计组件 `widgetParams[24].value` 支持 `summary`(图标和大数字)、`detail`(多行小指标)及兼容的 `cards`。
19
19
 
20
20
  用户提供参考截图时,先拆出面板行列比例、指标主次、图表与表格高度、标题/筛选位置,再用原生 pannel/statistic/chart/tabel/list 组合配置。不能把所有指标替换成一排大色块,也不能用模板假数据声称已接通客户业务。必须用同一视口截图检查浅色和平台深色,检查页面缩放后的断行与纵向空白;布局接近度和真实数据绑定分别验收。
21
-
22
- ### 平台智能工作首页
23
21
 
24
- 保留 `aiengine` 原生 AI 创作中心,与 `homeoverview` 工作概览组成桌面首行 14/10 栅格;任务、月历与公告放在下一行,移动端自动切为 24 栅格。不能把任务的完整 15 行列表或未配置日程的大空白块直接堆在首屏。
22
+ 你正在为 Microi 吾码平台生成界面引擎页面的 JSON 数据。界面引擎页面由 `formData` 对象描述,用户导入 JSON 即可使用。
25
23
 
26
- - `homeoverview.widgetParams[0]` 为真实个人统计接口 `platform-home-overview`,`[1].value="compact"` 启用紧凑指标、常用应用与趋势;所有数据仍受当前用户权限过滤。
27
- - `workcenter.widgetParams` 按索引依次为视图、工作菜单、流程菜单、公告菜单、日历菜单、分页条数;`[5].value=5` 用于首页任务,范围 5–20,不能影响独立“我的工作”页面。
28
- - `diycalendar.widgetParams[0].value` 应绑定当前账号可访问、关联 `microi_calendar` 的真实模块 Id;`[1].value="compact"` 只压缩月历密度,仍须支持点击日期新增及事件编辑、删除。备注字段为 `Remark`。隐藏菜单也可以是授权入口,旧模块可能没有 `DiyTableName`,此时必须显式绑定实际模块,不把只读日期回退当作日程验收成功。无模块时展示本月日期并明确提示未配置,不伪造任务。
29
- - `diytable.widgetParams[4].value="NoticeList"` 以只读公告列表展示真实授权公告;表、菜单仍在 `[0]/[1]`,模块缺失时使用 `referencePolicy.onMissing="RemoveWidget"` 移除可选组件及空容器。
30
- - 修改已有首页前通过 MCP 读取页面及历史 `CurrentHash`,保存传 `expectedCurrentHash`,再回读 JSON 和历史,保留可恢复版本。
24
+ <!-- microi-progressive:begin -->
25
+ <!-- microi-progressive:chunk id=page-engine-000 sha256=e9ccd20e2c3504afc0a91f5dbe93ed755aed4e83e9ffec13af5b9d60528986e0 -->
26
+ ## 设计器源码事件
27
+
28
+ 只有在扩展界面引擎设计器源码时才使用全局事件总线。用
29
+ `EventBus.on(eventName, handler)` 监听保存、日期选择或组件跳转等事件,并在
30
+ 组件卸载时逐项调用 `EventBus.off(eventName)`。重复挂载不解绑会造成一次操作
31
+ 触发多次;普通页面 JSON 生成不需要注册事件总线。
32
+
33
+ <!-- /microi-progressive:chunk -->
34
+ <!-- microi-progressive:chunk id=page-engine-001 sha256=57717991f9c7de557b524ec36fc9bdd716080b71b682439f1b6662b0b9b2f45c -->
35
+ ## 核心数据结构
36
+
37
+ ```
38
+ formData(页面)
39
+ ├── Id: string // 页面唯一ID(GUID)
40
+ ├── Title: string // 页面标题
41
+ ├── Number: string // 页面编号(如 PAGE1)
42
+ ├── Desc: string // 页面描述
43
+ └── JsonObj
44
+ ├── formConfig // 页面全局配置
45
+ └── wrapperList[] // 容器列表
46
+ ├── wrapperOption // 容器配置
47
+ └── widgetList[] // 组件列表
48
+ ├── widgetOption // 组件通用配置
49
+ └── widgetParams[] // 组件私有参数
50
+ ```
51
+
52
+ <!-- /microi-progressive:chunk -->
53
+ <!-- microi-progressive:chunk id=page-engine-002 sha256=6a1a85b40bcb5f8be694b0aad73a805083acd0d6fcd9cba36278dc9b51d24dcb -->
54
+ ## formConfig 页面全局配置
55
+
56
+ ```json
57
+ {
58
+ "gutter": 0, "mask": true, "drag": true, "left": true,
59
+ "hover": true, "shadow": true, "link": false, "watermark": false,
60
+ "mobile": false, "dark": false, "autoRefresh": 0, "lastRefreshTime": "",
61
+ "watermarkStyle": {
62
+ "content": "Microi吾码",
63
+ "font": { "fontSize": 16, "color": "rgba(255, 0, 0, 0.15)" },
64
+ "rotate": -22
65
+ },
66
+ "dynamicStyle": { "padding": "4px", "backgroundColor": "", "opacity": 1 }
67
+ }
68
+ ```
69
+
70
+ <!-- /microi-progressive:chunk -->
71
+ <!-- microi-progressive:chunk id=page-engine-003 sha256=8afb75b0e4d85ab9f56a7ba018e1cc50f758d3e604683d8c38d5f0a45d53f135 -->
72
+ ## 容器类型
73
+
74
+ | type | label | 说明 |
75
+ |------|-------|------|
76
+ | `pannel` | 卡片 | 标准容器,包含一个 `widgetList` |
77
+ | `tabs` | 选项卡 | 多标签页容器,使用 `tabWidgetMap` 存储每个 tab 的组件 |
78
+
79
+ ### 卡片容器(pannel)关键字段
80
+
81
+ ```json
82
+ {
83
+ "type": "pannel",
84
+ "label": "卡片",
85
+ "hidden": false,
86
+ "wrapperOption": {
87
+ "number": 10001, // 随机5位整数,页面内唯一
88
+ "span": 12, // 栅格宽度(1-24,24=满宽)
89
+ "height": 300, // 容器高度(px)
90
+ "margin": "0px 10px 10px 0px",
91
+ "dynamicStyle": { "padding": "10px", "backgroundColor": "" },
92
+ "titleOption": {
93
+ "hidden": true, // true=隐藏标题
94
+ "title": "未命名",
95
+ "dynamicStyle": { "textAlign": "left", "padding": "0px", "height": "20px", "lineHeight": "20px", "fontSize": "14px", "color": "" },
96
+ "moreOption": { "hidden": true, "icon": "More", "iconShow": false, "text": "更多", "linkurl": "/", "linktype": "router", "refresh": "0", "datetime": "0", "autotime": false, "autotimeval": 1, "dynamicStyle": { "color": "", "fontSize": "12px" } }
97
+ }
98
+ },
99
+ "widgetList": []
100
+ }
101
+ ```
102
+
103
+ ### 选项卡容器(tabs)
104
+
105
+ 组件放在 `tabWidgetMap[tabKey][]` 中,**不**放在 `widgetList` 中。
106
+
107
+ ```json
108
+ {
109
+ "type": "tabs",
110
+ "wrapperOption": {
111
+ "number": 10002, "span": 24, "height": 400,
112
+ "tabType": "", // '' | 'card' | 'border-card'
113
+ "tabPosition": "top", // 'top' | 'right' | 'bottom' | 'left'
114
+ "tabs": [
115
+ { "key": "tab_1", "label": "标签页1" },
116
+ { "key": "tab_2", "label": "标签页2" }
117
+ ],
118
+ "activeTab": "tab_1"
119
+ },
120
+ "tabWidgetMap": { "tab_1": [], "tab_2": [] },
121
+ "widgetList": []
122
+ }
123
+ ```
124
+
125
+ <!-- /microi-progressive:chunk -->
126
+ <!-- microi-progressive:chunk id=page-engine-004 sha256=9c7c85bb0d25267d07e45d9abeb5691c2f0ffd9da233351cf2f448a9b848cea5 -->
127
+ ## 组件通用结构
128
+
129
+ ```json
130
+ {
131
+ "type": "bar",
132
+ "label": "柱状图",
133
+ "category": 0,
134
+ "show": 1,
135
+ "widgetOption": {
136
+ "number": 20001, // 随机5位整数,页面内唯一
137
+ "wrapperNumber": 10001, // 必须等于所在容器的 wrapperOption.number
138
+ "span": 24,
139
+ "height": 280,
140
+ "dynamicStyle": { "padding": "8px", "backgroundColor": "" }
141
+ },
142
+ "widgetParams": []
143
+ }
144
+ ```
145
+
146
+ <!-- /microi-progressive:chunk -->
147
+ <!-- microi-progressive:chunk id=page-engine-005 sha256=c1e31dede775f14761182fc197cf428d494806c4503a622ffdad3d16d091d3e0 -->
148
+ ## widgetParams 参数类型
149
+
150
+ | type | 说明 | value 类型 |
151
+ |------|------|-----------|
152
+ | `textarea` | 多行文本(数据来源) | `string` |
153
+ | `input` | 单行文本 | `string` |
154
+ | `number` | 数字 | `number` |
155
+ | `switch` | 开关 | `boolean` |
156
+ | `slider` | 滑块 | `number` |
157
+ | `color` | 颜色选择 | `string` |
158
+ | `select` | 下拉选择 | `string` |
159
+ | `radio` | 单选组 | `string` |
160
+
161
+ <!-- /microi-progressive:chunk -->
162
+ <!-- microi-progressive:chunk id=page-engine-006 sha256=2c021e43f4f0d730da1f5a5cf6a2d314589435e2bb9ff573148c787538a8cc86 -->
163
+ ## 数据来源(widgetParams[0])
164
+
165
+ 大多数组件的第一个参数(sort=0)是"数据来源":
166
+ - **静态数据**:`value` 为空,数据在 `typeOptions.dataJson` 中
167
+ - **动态接口**:`value` 设为接口地址,运行时请求替换 `dataJson`
168
+
169
+ **接口引擎地址格式:**
170
+ ```
171
+ $ApiBase$/apiengine/{ApiEngineKey}
172
+ ```
173
+
174
+ <!-- /microi-progressive:chunk -->
175
+ <!-- microi-progressive:chunk id=page-engine-007 sha256=9d5fced79d01857e14e83888681b44f06c69fcc79abf6551dcec312d96c1c02b -->
176
+ ## 运行态布局与滚动规范
31
177
 
32
- 你正在为 Microi 吾码平台生成界面引擎页面的 JSON 数据。界面引擎页面由 `formData` 对象描述,用户导入 JSON 即可使用。
33
-
34
- <!-- microi-progressive:begin -->
35
- <!-- microi-progressive:chunk id=page-engine-000 sha256=e9ccd20e2c3504afc0a91f5dbe93ed755aed4e83e9ffec13af5b9d60528986e0 -->
36
- ## 设计器源码事件
37
-
38
- 只有在扩展界面引擎设计器源码时才使用全局事件总线。用
39
- `EventBus.on(eventName, handler)` 监听保存、日期选择或组件跳转等事件,并在
40
- 组件卸载时逐项调用 `EventBus.off(eventName)`。重复挂载不解绑会造成一次操作
41
- 触发多次;普通页面 JSON 生成不需要注册事件总线。
42
-
43
- <!-- /microi-progressive:chunk -->
44
- <!-- microi-progressive:chunk id=page-engine-001 sha256=57717991f9c7de557b524ec36fc9bdd716080b71b682439f1b6662b0b9b2f45c -->
45
- ## 核心数据结构
46
-
47
- ```
48
- formData(页面)
49
- ├── Id: string // 页面唯一ID(GUID)
50
- ├── Title: string // 页面标题
51
- ├── Number: string // 页面编号(如 PAGE1)
52
- ├── Desc: string // 页面描述
53
- └── JsonObj
54
- ├── formConfig // 页面全局配置
55
- └── wrapperList[] // 容器列表
56
- ├── wrapperOption // 容器配置
57
- └── widgetList[] // 组件列表
58
- ├── widgetOption // 组件通用配置
59
- └── widgetParams[] // 组件私有参数
60
- ```
61
-
62
- <!-- /microi-progressive:chunk -->
63
- <!-- microi-progressive:chunk id=page-engine-002 sha256=6a1a85b40bcb5f8be694b0aad73a805083acd0d6fcd9cba36278dc9b51d24dcb -->
64
- ## formConfig 页面全局配置
65
-
66
- ```json
67
- {
68
- "gutter": 0, "mask": true, "drag": true, "left": true,
69
- "hover": true, "shadow": true, "link": false, "watermark": false,
70
- "mobile": false, "dark": false, "autoRefresh": 0, "lastRefreshTime": "",
71
- "watermarkStyle": {
72
- "content": "Microi吾码",
73
- "font": { "fontSize": 16, "color": "rgba(255, 0, 0, 0.15)" },
74
- "rotate": -22
75
- },
76
- "dynamicStyle": { "padding": "4px", "backgroundColor": "", "opacity": 1 }
77
- }
78
- ```
79
-
80
- <!-- /microi-progressive:chunk -->
81
- <!-- microi-progressive:chunk id=page-engine-003 sha256=8afb75b0e4d85ab9f56a7ba018e1cc50f758d3e604683d8c38d5f0a45d53f135 -->
82
- ## 容器类型
83
-
84
- | type | label | 说明 |
85
- |------|-------|------|
86
- | `pannel` | 卡片 | 标准容器,包含一个 `widgetList` |
87
- | `tabs` | 选项卡 | 多标签页容器,使用 `tabWidgetMap` 存储每个 tab 的组件 |
88
-
89
- ### 卡片容器(pannel)关键字段
90
-
91
- ```json
92
- {
93
- "type": "pannel",
94
- "label": "卡片",
95
- "hidden": false,
96
- "wrapperOption": {
97
- "number": 10001, // 随机5位整数,页面内唯一
98
- "span": 12, // 栅格宽度(1-24,24=满宽)
99
- "height": 300, // 容器高度(px)
100
- "margin": "0px 10px 10px 0px",
101
- "dynamicStyle": { "padding": "10px", "backgroundColor": "" },
102
- "titleOption": {
103
- "hidden": true, // true=隐藏标题
104
- "title": "未命名",
105
- "dynamicStyle": { "textAlign": "left", "padding": "0px", "height": "20px", "lineHeight": "20px", "fontSize": "14px", "color": "" },
106
- "moreOption": { "hidden": true, "icon": "More", "iconShow": false, "text": "更多", "linkurl": "/", "linktype": "router", "refresh": "0", "datetime": "0", "autotime": false, "autotimeval": 1, "dynamicStyle": { "color": "", "fontSize": "12px" } }
107
- }
108
- },
109
- "widgetList": []
110
- }
111
- ```
112
-
113
- ### 选项卡容器(tabs)
114
-
115
- 组件放在 `tabWidgetMap[tabKey][]` 中,**不**放在 `widgetList` 中。
116
-
117
- ```json
118
- {
119
- "type": "tabs",
120
- "wrapperOption": {
121
- "number": 10002, "span": 24, "height": 400,
122
- "tabType": "", // '' | 'card' | 'border-card'
123
- "tabPosition": "top", // 'top' | 'right' | 'bottom' | 'left'
124
- "tabs": [
125
- { "key": "tab_1", "label": "标签页1" },
126
- { "key": "tab_2", "label": "标签页2" }
127
- ],
128
- "activeTab": "tab_1"
129
- },
130
- "tabWidgetMap": { "tab_1": [], "tab_2": [] },
131
- "widgetList": []
132
- }
133
- ```
134
-
135
- <!-- /microi-progressive:chunk -->
136
- <!-- microi-progressive:chunk id=page-engine-004 sha256=9c7c85bb0d25267d07e45d9abeb5691c2f0ffd9da233351cf2f448a9b848cea5 -->
137
- ## 组件通用结构
138
-
139
- ```json
140
- {
141
- "type": "bar",
142
- "label": "柱状图",
143
- "category": 0,
144
- "show": 1,
145
- "widgetOption": {
146
- "number": 20001, // 随机5位整数,页面内唯一
147
- "wrapperNumber": 10001, // 必须等于所在容器的 wrapperOption.number
148
- "span": 24,
149
- "height": 280,
150
- "dynamicStyle": { "padding": "8px", "backgroundColor": "" }
151
- },
152
- "widgetParams": []
153
- }
154
- ```
155
-
156
- <!-- /microi-progressive:chunk -->
157
- <!-- microi-progressive:chunk id=page-engine-005 sha256=c1e31dede775f14761182fc197cf428d494806c4503a622ffdad3d16d091d3e0 -->
158
- ## widgetParams 参数类型
159
-
160
- | type | 说明 | value 类型 |
161
- |------|------|-----------|
162
- | `textarea` | 多行文本(数据来源) | `string` |
163
- | `input` | 单行文本 | `string` |
164
- | `number` | 数字 | `number` |
165
- | `switch` | 开关 | `boolean` |
166
- | `slider` | 滑块 | `number` |
167
- | `color` | 颜色选择 | `string` |
168
- | `select` | 下拉选择 | `string` |
169
- | `radio` | 单选组 | `string` |
170
-
171
- <!-- /microi-progressive:chunk -->
172
- <!-- microi-progressive:chunk id=page-engine-006 sha256=2c021e43f4f0d730da1f5a5cf6a2d314589435e2bb9ff573148c787538a8cc86 -->
173
- ## 数据来源(widgetParams[0])
174
-
175
- 大多数组件的第一个参数(sort=0)是"数据来源":
176
- - **静态数据**:`value` 为空,数据在 `typeOptions.dataJson` 中
177
- - **动态接口**:`value` 设为接口地址,运行时请求替换 `dataJson`
178
-
179
- **接口引擎地址格式:**
180
- ```
181
- $ApiBase$/apiengine/{ApiEngineKey}
182
- ```
183
-
184
- <!-- /microi-progressive:chunk -->
185
- <!-- microi-progressive:chunk id=page-engine-007 sha256=ce0486eb9d2282bc199972e167e85aca7b03860d15abdd03982c4a23a90e206e -->
186
- ## 运行态布局与滚动规范
187
-
188
178
  - 页面只保留一个主滚动容器:仪表盘、首页和嵌套界面优先继承最外层页面滚动;单个 `pannel`、`workcenter`、`diytable`、`diycalendar`、嵌套 `pageengine` 在运行态默认使用内容自适应高度和 `overflow: visible`,不得无条件设置 `overflow: auto`。
189
- - 经典桌面主滚动容器为路由内容区,导航与 Tab 留在视口内;移动端继续保留外层文档滚动。图表在异步挂载后绑定尺寸观察器,切换导航、收缩侧栏及改变窗口宽度都应重新测量,禁止仅隐藏溢出而保留错误画布宽度。真实回归覆盖两种导航、两种桌面宽度,以及日程创建后刷新、备注编辑和删除。
190
- - 固定高度只用于设计器拖拽预览、图表画布或确有虚拟滚动需求的组件。设计态可按 `widgetOption.height` 提供滚动,运行态必须先验证内容能完整展开;不能用双滚动条掩盖容器高度不足。
191
- - 表格型容器通常按 15 条数据验收,表头、工具栏、全部数据行和分页区应同时可见;首页紧凑表格可通过 `diy-table` 的 `PageSizeList` 追加 `[10]`,并在 `sys_menu.DefaultPageSize` 为空时默认选择候选页码中的最小值。空间不足时先压缩统计卡、工具栏、行高和间距,再考虑增加外层页面长度,不隐藏分页、不在卡片内部滚动。
192
- - 同一行的容器使用一致的左右边距、内边距、标题高度和顶部基线;同层卡片间距必须相同,左右边缘、标题、工具栏和内容区应形成稳定对齐线。推荐使用统一的 8px 基础间距和 8/12/16px 倍数。
193
- - 成对容器应设置相同的最小高度;内容较少的组件通过内容居中、合理留白或自适应布局消化空间,不能在底部留下明显的大块无意义空白。内容较多时允许容器自然增高并由页面继续向下滚动。
194
- - 日历和公告应完整展示工具栏、主体和底部操作区;日历优先使用 `height: auto` / `contentHeight: auto`,公告优先使用标准表单引擎分页与权限按钮。
195
- - 运行态移动端必须按实际视口自动切为 24 栅格,不能只依赖保存 JSON 中的 `formConfig.mobile`;窗口旋转或宽度变化时也要同步。嵌入的 `diytable` 不得渲染独立列表页的固定返回栏和全局 FAB,新增、页面按钮、批量操作应留在当前容器工具栏内;容器标题操作区允许紧凑换行,但不能绝对定位覆盖标题或其它卡片。
196
- - `aiengine` 在移动端嵌入首页时应使用内容自适应高度和外层页面滚动,指标卡与快捷入口优先两列紧凑排布,避免 4 个指标和全部快捷入口单列堆叠造成超长首屏;输入区和模型/推理设置必须保持可见且不横向溢出。
197
- - 交付前必须在真实运行页检查:是否存在内部纵向/横向滚动条、15 条表格分页是否可见、同排容器是否对齐、四周边距是否一致、组件底部是否有异常空白。仅检查设计器画布不算验收完成。
198
-
199
- <!-- /microi-progressive:chunk -->
200
- ## 详细参考路由(渐进披露)
201
-
202
- 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
203
-
204
- - [references/progressive-01-所有组件类型.md](references/progressive-01-所有组件类型.md):所有组件类型;Office/PDF 在线预览自然语言生成规则;searchData 查询条件通用结构
205
- - [references/progressive-02-版本历史-并发保存与回滚.md](references/progressive-02-版本历史-并发保存与回滚.md):版本历史、并发保存与回滚;本地撤销、Vue 源码桥与资产包;生成 JSON 注意事项;经营看板周期筛选与布局规则
206
- <!-- microi-progressive:end -->
179
+ - 固定高度只用于设计器拖拽预览、图表画布或确有虚拟滚动需求的组件。设计态可按 `widgetOption.height` 提供滚动,运行态必须先验证内容能完整展开;不能用双滚动条掩盖容器高度不足。
180
+ - 表格型容器通常按 15 条数据验收,表头、工具栏、全部数据行和分页区应同时可见;首页紧凑表格可通过 `diy-table` 的 `PageSizeList` 追加 `[10]`,并在 `sys_menu.DefaultPageSize` 为空时默认选择候选页码中的最小值。空间不足时先压缩统计卡、工具栏、行高和间距,再考虑增加外层页面长度,不隐藏分页、不在卡片内部滚动。
181
+ - 同一行的容器使用一致的左右边距、内边距、标题高度和顶部基线;同层卡片间距必须相同,左右边缘、标题、工具栏和内容区应形成稳定对齐线。推荐使用统一的 8px 基础间距和 8/12/16px 倍数。
182
+ - 成对容器应设置相同的最小高度;内容较少的组件通过内容居中、合理留白或自适应布局消化空间,不能在底部留下明显的大块无意义空白。内容较多时允许容器自然增高并由页面继续向下滚动。
183
+ - 日历和公告应完整展示工具栏、主体和底部操作区;日历优先使用 `height: auto` / `contentHeight: auto`,公告优先使用标准表单引擎分页与权限按钮。
184
+ - 运行态移动端必须按实际视口自动切为 24 栅格,不能只依赖保存 JSON 中的 `formConfig.mobile`;窗口旋转或宽度变化时也要同步。嵌入的 `diytable` 不得渲染独立列表页的固定返回栏和全局 FAB,新增、页面按钮、批量操作应留在当前容器工具栏内;容器标题操作区允许紧凑换行,但不能绝对定位覆盖标题或其它卡片。
185
+ - `aiengine` 在移动端嵌入首页时应使用内容自适应高度和外层页面滚动,指标卡与快捷入口优先两列紧凑排布,避免 4 个指标和全部快捷入口单列堆叠造成超长首屏;输入区和模型/推理设置必须保持可见且不横向溢出。
186
+ - 交付前必须在真实运行页检查:是否存在内部纵向/横向滚动条、15 条表格分页是否可见、同排容器是否对齐、四周边距是否一致、组件底部是否有异常空白。仅检查设计器画布不算验收完成。
187
+
188
+ <!-- /microi-progressive:chunk -->
189
+ ## 详细参考路由(渐进披露)
190
+
191
+ 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
192
+
193
+ - [references/progressive-01-所有组件类型.md](references/progressive-01-所有组件类型.md):所有组件类型;Office/PDF 在线预览自然语言生成规则;searchData 查询条件通用结构
194
+ - [references/progressive-02-版本历史-并发保存与回滚.md](references/progressive-02-版本历史-并发保存与回滚.md):版本历史、并发保存与回滚;本地撤销、Vue 源码桥与资产包;生成 JSON 注意事项;经营看板周期筛选与布局规则
195
+ <!-- microi-progressive:end -->