@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,229 +1,229 @@
1
- # Dos.ORM API 参考
2
-
3
- ## 数据库 Provider
4
-
5
- | DatabaseType | Provider |
6
- |---|---|
7
- | `SqlServer` | SQL Server 2000 |
8
- | `SqlServer9` | SQL Server 2005+ |
9
- | `MySql` | MySQL |
10
- | `Oracle` | Oracle |
11
- | `PostgreSql` | PostgreSQL |
12
- | `DaMeng` | 达梦 |
13
- | `KingBase` | 人大金仓 |
14
- | `Sqlite3` | SQLite |
15
- | `MsAccess` | Access |
16
-
17
- 兼容协议数据库仍需目标库实测,不能只凭协议名称判定所有 DDL、分页和 BulkCopy 一致。
18
-
19
- 默认会话入口是 `DbSession.Default`;多数据库、读写分离和分片场景使用明确的
20
- `DbSession` 实例,避免把默认连接误用于其它租户或数据库。
21
-
22
- ## 实体
23
-
24
- ```csharp
25
- [TableName("sys_user")]
26
- public class SysUser : Entity
27
- {
28
- public string Id { get; set; }
29
- public string Account { get; set; }
30
- public DateTime CreateTime { get; set; }
31
-
32
- public override Field[] GetFields() => new[] { _.Id, _.Account, _.CreateTime };
33
- public override object[] GetValues() => new object[] { Id, Account, CreateTime };
34
- public override Field GetIdentityField() => _.Id;
35
-
36
- public sealed class _
37
- {
38
- public static readonly Field Id = new Field("Id", "sys_user");
39
- public static readonly Field Account = new Field("Account", "sys_user");
40
- public static readonly Field CreateTime = new Field("CreateTime", "sys_user");
41
- }
42
- }
43
- ```
44
-
45
- `Entity.GetFields()` 的字段顺序也是批量写入和 CodeFirst 映射依据;实体声明、
46
- 字段数组与数据库列变更必须同步。
47
-
48
- ## 查询链
49
-
50
- | API | 作用 |
51
- |---|---|
52
- | `From<T>()` / `From("table")` | 查询入口 |
53
- | `Where(predicate)` / `Where(WhereClip)` | 条件 |
54
- | `OrderBy` / `OrderByDescending` | 排序 |
55
- | `GroupBy` / `Having` | 分组 |
56
- | `Select` / `AddSelect` | 选择字段 |
57
- | `Distinct` / `Top` / `Page` | 去重、Top、分页 |
58
- | `InnerJoin/LeftJoin/RightJoin/CrossJoin/FullJoin` | Join |
59
- | `Union/UnionAll` | 集合联合 |
60
- | `SetCacheTimeOut` / `Refresh` | 查询缓存/绕过缓存 |
61
- | `ToList/ToListAsync` | 列表 |
62
- | `ToFirst/ToFirstAsync` | 第一条或 null |
63
- | `ToFirstDefault` | 第一条或 new 实体 |
64
- | `ToScalar/ToScalarAsync` | 标量 |
65
- | `ToDataReader` / `ToDataTable/ToDataTableAsync` | Reader/DataTable |
66
- | `ToEnumerable` | 流式枚举 |
67
- | `Count/CountAsync` | 计数 |
68
- | `ExecuteNonQuery/ExecuteNonQueryAsync` | 非查询 |
69
-
70
- 查询缓存入口的完整成员名是 `FromSection.SetCacheTimeOut`。缓存 Key 包含 SQL
71
- 与参数值,但写后失效、租户隔离和多节点一致性仍由业务负责。
72
-
73
- ```csharp
74
- var users = await dbSession.From<SysUser>()
75
- .Where(u => u.Account == account)
76
- .OrderByDescending(u => u.CreateTime)
77
- .Page(20, 1)
78
- .ToListAsync();
79
- ```
80
-
81
- ## WhereClip
82
-
83
- ```csharp
84
- var where = new Where<SysUser>();
85
- where.And(u => u.Status == 1);
86
- if (!string.IsNullOrWhiteSpace(keyword))
87
- where.And(u => u.Name.Like(keyword));
88
- if (deptIds?.Any() == true)
89
- where.And(u => u.DeptId.In(deptIds));
90
-
91
- var list = dbSession.From<SysUser>()
92
- .Where(where.ToWhereClip())
93
- .ToList();
94
- ```
95
-
96
- 支持比较、`Like/NotLike/StartsWith/EndsWith`、`In/NotIn` 和 NULL。
97
-
98
- ## 原生 SQL
99
-
100
- ```csharp
101
- var users = dbSession
102
- .FromSql("SELECT Id,Account FROM sys_user WHERE Status=@p0")
103
- .AddInParameter("@p0", 1)
104
- .ToList<SysUser>();
105
- ```
106
-
107
- 动态值只走参数;动态标识符先从固定白名单映射。
108
- Provider 的标识符替换最终由 `DataUtils.FormatSQL` 完成;不要绕过该步骤手工
109
- 拼接用户输入的表名或字段名。
110
-
111
- ## 写入
112
-
113
- ```csharp
114
- dbSession.Insert(entity);
115
- dbSession.Insert(list);
116
- dbSession.Update<SysUser>(u => u.Status, 0, u => u.Id == id);
117
- dbSession.Delete<SysUser>(u => u.Id == id);
118
- ```
119
-
120
- 批量:
121
-
122
- ```csharp
123
- var affected = dbSession.BulkInsert(list, batchSize: 5000, bulkCopyTimeoutSeconds: 600);
124
- var affectedAsync = await dbSession.BulkInsertAsync(list, batchSize: 5000, ct: token);
125
- ```
126
-
127
- 原生优选:
128
-
129
- - SQL Server:SqlBulkCopy
130
- - MySQL:MySqlBulkCopy
131
- - PostgreSQL/KingBase:Binary COPY
132
- - Oracle/达梦/SQLite/Access:多行参数化 INSERT 回退
133
-
134
- 批大小 5000 只是起点;按行宽、索引、日志、网络和数据库负载测量。
135
-
136
- ## Upsert
137
-
138
- ```csharp
139
- dbSession.Upsert(user, SysUser._.Account);
140
- await dbSession.UpsertAsync(
141
- user,
142
- ct: token,
143
- conflictFields: new[] { SysUser._.Account });
144
- ```
145
-
146
- 各 Provider 使用 `ON DUPLICATE KEY`、`ON CONFLICT`、`MERGE` 或更新后插入回退。
147
- 冲突字段必须有数据库唯一约束。
148
-
149
- ## SqlFunc 与子查询
150
-
151
- `SqlFunc` 提供 `SqlFunc.IfNull`、`SqlFunc.IIF`、`SqlFunc.Length`、
152
- `SqlFunc.Substring`、`SqlFunc.Now`、`SqlFunc.DateDiff`、
153
- `SqlFunc.JsonValue`、`SqlFunc.Concat`、`SqlFunc.Upper`、`SqlFunc.Lower`、
154
- `SqlFunc.Trim`、`SqlFunc.Abs`、`SqlFunc.Round`、`SqlFunc.Count`、
155
- `SqlFunc.Sum`、`SqlFunc.Avg`、`SqlFunc.Min`、`SqlFunc.Max` 的 Provider 方言。
156
-
157
- `SqlSubQuery` 提供 `SqlSubQuery.Exists`、`SqlSubQuery.NotExists`、
158
- `SqlSubQuery.In`、`SqlSubQuery.NotIn`、`SqlSubQuery.Scalar` 和
159
- `SqlSubQuery.Count`。
160
- 返回的是 SQL 片段,数据值仍要参数化。
161
-
162
- ## 导航属性
163
-
164
- `[Navigate]` 支持 `NavigateType.OneToOne`、`NavigateType.OneToMany`、
165
- `NavigateType.ManyToMany`;加载入口:
166
-
167
- - `IncludeOne`
168
- - `IncludeMany`
169
- - `IncludeManyToMany`
170
-
171
- 实现使用批量 IN,避免逐行 N+1。仍要限制主结果规模。
172
-
173
- ## CodeFirst
174
-
175
- ```csharp
176
- dbSession.CreateTable<SysUser>();
177
- dbSession.SyncSchema(typeof(SysUser), typeof(Order));
178
- var exists = dbSession.TableExists("sys_user");
179
- ```
180
-
181
- `CreateTable<T>(dropIfExists: true)` 是破坏性操作,只可在明确授权的隔离环境使用。
182
- 实体索引可用 `[Index]` 声明;Microi 低代码业务表的运行时索引仍必须走 Manifest/MCP。
183
-
184
- ## 读写分离
185
-
186
- ```csharp
187
- var router = new ReadWriteRouter(master);
188
- router.AddSlave(slave1, weight: 1);
189
- router.AddSlave(slave2, weight: 2);
190
-
191
- var read = router.GetReadSession();
192
- var write = router.GetWriteSession();
193
-
194
- using (router.ForceMaster())
195
- {
196
- var latest = router.GetReadSession().From<SysUser>().ToList();
197
- }
198
- ```
199
-
200
- 支持加权轮询、摘除和回退。事务与读自己刚写的数据必须读主。
201
-
202
- ## 分库分表
203
-
204
- 表名路由:
205
-
206
- - `ShardingRouter.MonthlyTable`
207
- - `ShardingRouter.HashModTable`
208
- - `ShardingRouter.ModTable`
209
-
210
- 数据库路由:
211
-
212
- - `DbShardingRouter.AddNode`
213
- - `RouteByHash`
214
- - `AllNodes`
215
-
216
- 稳定 Hash 使用 FNV-1a。跨分片事务、全局唯一键、分页排序和聚合需要业务层明确设计。
217
-
218
- ## 监控与缓存
219
-
220
- ```csharp
221
- Dos.ORM.Section.SlowSqlThresholdMs = 1000;
222
- Dos.ORM.Section.OnSlowSql = (cmd, elapsed, operation) =>
223
- {
224
- // 记录脱敏 SQL 模板、耗时和关联 Id;不要记录密钥参数
225
- };
226
- ```
227
-
228
- 反序列化器、实体元数据和字段名缓存是进程内优化,允许节点重启后重建;
229
- 不能作为跨节点业务事实。查询缓存使用滑动过期,写后按业务失效。
1
+ # Dos.ORM API 参考
2
+
3
+ ## 数据库 Provider
4
+
5
+ | DatabaseType | Provider |
6
+ |---|---|
7
+ | `SqlServer` | SQL Server 2000 |
8
+ | `SqlServer9` | SQL Server 2005+ |
9
+ | `MySql` | MySQL |
10
+ | `Oracle` | Oracle |
11
+ | `PostgreSql` | PostgreSQL |
12
+ | `DaMeng` | 达梦 |
13
+ | `KingBase` | 人大金仓 |
14
+ | `Sqlite3` | SQLite |
15
+ | `MsAccess` | Access |
16
+
17
+ 兼容协议数据库仍需目标库实测,不能只凭协议名称判定所有 DDL、分页和 BulkCopy 一致。
18
+
19
+ 默认会话入口是 `DbSession.Default`;多数据库、读写分离和分片场景使用明确的
20
+ `DbSession` 实例,避免把默认连接误用于其它租户或数据库。
21
+
22
+ ## 实体
23
+
24
+ ```csharp
25
+ [TableName("sys_user")]
26
+ public class SysUser : Entity
27
+ {
28
+ public string Id { get; set; }
29
+ public string Account { get; set; }
30
+ public DateTime CreateTime { get; set; }
31
+
32
+ public override Field[] GetFields() => new[] { _.Id, _.Account, _.CreateTime };
33
+ public override object[] GetValues() => new object[] { Id, Account, CreateTime };
34
+ public override Field GetIdentityField() => _.Id;
35
+
36
+ public sealed class _
37
+ {
38
+ public static readonly Field Id = new Field("Id", "sys_user");
39
+ public static readonly Field Account = new Field("Account", "sys_user");
40
+ public static readonly Field CreateTime = new Field("CreateTime", "sys_user");
41
+ }
42
+ }
43
+ ```
44
+
45
+ `Entity.GetFields()` 的字段顺序也是批量写入和 CodeFirst 映射依据;实体声明、
46
+ 字段数组与数据库列变更必须同步。
47
+
48
+ ## 查询链
49
+
50
+ | API | 作用 |
51
+ |---|---|
52
+ | `From<T>()` / `From("table")` | 查询入口 |
53
+ | `Where(predicate)` / `Where(WhereClip)` | 条件 |
54
+ | `OrderBy` / `OrderByDescending` | 排序 |
55
+ | `GroupBy` / `Having` | 分组 |
56
+ | `Select` / `AddSelect` | 选择字段 |
57
+ | `Distinct` / `Top` / `Page` | 去重、Top、分页 |
58
+ | `InnerJoin/LeftJoin/RightJoin/CrossJoin/FullJoin` | Join |
59
+ | `Union/UnionAll` | 集合联合 |
60
+ | `SetCacheTimeOut` / `Refresh` | 查询缓存/绕过缓存 |
61
+ | `ToList/ToListAsync` | 列表 |
62
+ | `ToFirst/ToFirstAsync` | 第一条或 null |
63
+ | `ToFirstDefault` | 第一条或 new 实体 |
64
+ | `ToScalar/ToScalarAsync` | 标量 |
65
+ | `ToDataReader` / `ToDataTable/ToDataTableAsync` | Reader/DataTable |
66
+ | `ToEnumerable` | 流式枚举 |
67
+ | `Count/CountAsync` | 计数 |
68
+ | `ExecuteNonQuery/ExecuteNonQueryAsync` | 非查询 |
69
+
70
+ 查询缓存入口的完整成员名是 `FromSection.SetCacheTimeOut`。缓存 Key 包含 SQL
71
+ 与参数值,但写后失效、租户隔离和多节点一致性仍由业务负责。
72
+
73
+ ```csharp
74
+ var users = await dbSession.From<SysUser>()
75
+ .Where(u => u.Account == account)
76
+ .OrderByDescending(u => u.CreateTime)
77
+ .Page(20, 1)
78
+ .ToListAsync();
79
+ ```
80
+
81
+ ## WhereClip
82
+
83
+ ```csharp
84
+ var where = new Where<SysUser>();
85
+ where.And(u => u.Status == 1);
86
+ if (!string.IsNullOrWhiteSpace(keyword))
87
+ where.And(u => u.Name.Like(keyword));
88
+ if (deptIds?.Any() == true)
89
+ where.And(u => u.DeptId.In(deptIds));
90
+
91
+ var list = dbSession.From<SysUser>()
92
+ .Where(where.ToWhereClip())
93
+ .ToList();
94
+ ```
95
+
96
+ 支持比较、`Like/NotLike/StartsWith/EndsWith`、`In/NotIn` 和 NULL。
97
+
98
+ ## 原生 SQL
99
+
100
+ ```csharp
101
+ var users = dbSession
102
+ .FromSql("SELECT Id,Account FROM sys_user WHERE Status=@p0")
103
+ .AddInParameter("@p0", 1)
104
+ .ToList<SysUser>();
105
+ ```
106
+
107
+ 动态值只走参数;动态标识符先从固定白名单映射。
108
+ Provider 的标识符替换最终由 `DataUtils.FormatSQL` 完成;不要绕过该步骤手工
109
+ 拼接用户输入的表名或字段名。
110
+
111
+ ## 写入
112
+
113
+ ```csharp
114
+ dbSession.Insert(entity);
115
+ dbSession.Insert(list);
116
+ dbSession.Update<SysUser>(u => u.Status, 0, u => u.Id == id);
117
+ dbSession.Delete<SysUser>(u => u.Id == id);
118
+ ```
119
+
120
+ 批量:
121
+
122
+ ```csharp
123
+ var affected = dbSession.BulkInsert(list, batchSize: 5000, bulkCopyTimeoutSeconds: 600);
124
+ var affectedAsync = await dbSession.BulkInsertAsync(list, batchSize: 5000, ct: token);
125
+ ```
126
+
127
+ 原生优选:
128
+
129
+ - SQL Server:SqlBulkCopy
130
+ - MySQL:MySqlBulkCopy
131
+ - PostgreSQL/KingBase:Binary COPY
132
+ - Oracle/达梦/SQLite/Access:多行参数化 INSERT 回退
133
+
134
+ 批大小 5000 只是起点;按行宽、索引、日志、网络和数据库负载测量。
135
+
136
+ ## Upsert
137
+
138
+ ```csharp
139
+ dbSession.Upsert(user, SysUser._.Account);
140
+ await dbSession.UpsertAsync(
141
+ user,
142
+ ct: token,
143
+ conflictFields: new[] { SysUser._.Account });
144
+ ```
145
+
146
+ 各 Provider 使用 `ON DUPLICATE KEY`、`ON CONFLICT`、`MERGE` 或更新后插入回退。
147
+ 冲突字段必须有数据库唯一约束。
148
+
149
+ ## SqlFunc 与子查询
150
+
151
+ `SqlFunc` 提供 `SqlFunc.IfNull`、`SqlFunc.IIF`、`SqlFunc.Length`、
152
+ `SqlFunc.Substring`、`SqlFunc.Now`、`SqlFunc.DateDiff`、
153
+ `SqlFunc.JsonValue`、`SqlFunc.Concat`、`SqlFunc.Upper`、`SqlFunc.Lower`、
154
+ `SqlFunc.Trim`、`SqlFunc.Abs`、`SqlFunc.Round`、`SqlFunc.Count`、
155
+ `SqlFunc.Sum`、`SqlFunc.Avg`、`SqlFunc.Min`、`SqlFunc.Max` 的 Provider 方言。
156
+
157
+ `SqlSubQuery` 提供 `SqlSubQuery.Exists`、`SqlSubQuery.NotExists`、
158
+ `SqlSubQuery.In`、`SqlSubQuery.NotIn`、`SqlSubQuery.Scalar` 和
159
+ `SqlSubQuery.Count`。
160
+ 返回的是 SQL 片段,数据值仍要参数化。
161
+
162
+ ## 导航属性
163
+
164
+ `[Navigate]` 支持 `NavigateType.OneToOne`、`NavigateType.OneToMany`、
165
+ `NavigateType.ManyToMany`;加载入口:
166
+
167
+ - `IncludeOne`
168
+ - `IncludeMany`
169
+ - `IncludeManyToMany`
170
+
171
+ 实现使用批量 IN,避免逐行 N+1。仍要限制主结果规模。
172
+
173
+ ## CodeFirst
174
+
175
+ ```csharp
176
+ dbSession.CreateTable<SysUser>();
177
+ dbSession.SyncSchema(typeof(SysUser), typeof(Order));
178
+ var exists = dbSession.TableExists("sys_user");
179
+ ```
180
+
181
+ `CreateTable<T>(dropIfExists: true)` 是破坏性操作,只可在明确授权的隔离环境使用。
182
+ 实体索引可用 `[Index]` 声明;Microi 低代码业务表的运行时索引仍必须走 Manifest/MCP。
183
+
184
+ ## 读写分离
185
+
186
+ ```csharp
187
+ var router = new ReadWriteRouter(master);
188
+ router.AddSlave(slave1, weight: 1);
189
+ router.AddSlave(slave2, weight: 2);
190
+
191
+ var read = router.GetReadSession();
192
+ var write = router.GetWriteSession();
193
+
194
+ using (router.ForceMaster())
195
+ {
196
+ var latest = router.GetReadSession().From<SysUser>().ToList();
197
+ }
198
+ ```
199
+
200
+ 支持加权轮询、摘除和回退。事务与读自己刚写的数据必须读主。
201
+
202
+ ## 分库分表
203
+
204
+ 表名路由:
205
+
206
+ - `ShardingRouter.MonthlyTable`
207
+ - `ShardingRouter.HashModTable`
208
+ - `ShardingRouter.ModTable`
209
+
210
+ 数据库路由:
211
+
212
+ - `DbShardingRouter.AddNode`
213
+ - `RouteByHash`
214
+ - `AllNodes`
215
+
216
+ 稳定 Hash 使用 FNV-1a。跨分片事务、全局唯一键、分页排序和聚合需要业务层明确设计。
217
+
218
+ ## 监控与缓存
219
+
220
+ ```csharp
221
+ Dos.ORM.Section.SlowSqlThresholdMs = 1000;
222
+ Dos.ORM.Section.OnSlowSql = (cmd, elapsed, operation) =>
223
+ {
224
+ // 记录脱敏 SQL 模板、耗时和关联 Id;不要记录密钥参数
225
+ };
226
+ ```
227
+
228
+ 反序列化器、实体元数据和字段名缓存是进程内优化,允许节点重启后重建;
229
+ 不能作为跨节点业务事实。查询缓存使用滑动过期,写后按业务失效。
@@ -1,81 +1,81 @@
1
- ---
2
- name: email-engine
3
- description: 开发、安装和使用吾码邮箱系统 mci-email。用于 QQ、163、126、企业或自定义 IMAP/SMTP 邮箱账号维护、自动与手动同步、邮件阅读、草稿、附件、回复转发、发送结果核对,以及邮箱 MCP 工具和 V8.Email 协议原子。
4
- ---
5
-
6
- # 吾码邮箱系统
7
-
8
- > **Codex 非阻塞自动更新:** 先遵循 [工作区约定](../workspace-conventions/SKILL.md),通过 `microi update --background --workspace "<工作区绝对路径>" --json` 投递更新检查;当前任务继续执行,不等待更新或重启现有会话。
9
-
10
- 邮箱系统是使用吾码 UI 的独立 Vue 3 微服务,商城 AppKey 为 `mci-email`,
11
- 后台入口为「系统引擎 → 邮箱系统」,菜单路由 `/mci-email`。
12
-
13
- 先读取 `../workspace-conventions/SKILL.md`;开发或发布时还需读取
14
- `../microi-microservice/SKILL.md`、`../app-store/SKILL.md`。
15
- 先调用 `microi_list_applications`,再读取目标应用完整上下文,禁止覆盖未读取的源码。
16
-
17
- ## 选择正确入口
18
-
19
- | 需求 | 入口 |
20
- | --- | --- |
21
- | 邮箱工作台 | 源码微服务 `mci-email` |
22
- | 账号配置 | 原表 `mic_email_server`,通过宿主 `openForm` 打开吾码表单 |
23
- | 全部业务 HTTP | 接口引擎 `mci-email`,请求参数 `Action` |
24
- | 手动同步 | `Action: Sync` 返回持久后台任务,使用 `SyncStatus` 回读终态 |
25
- | 自动同步 | 定时任务调用 `mci-email-auto-sync`,内部调度 `mci-email-sync-step` |
26
- | 协议、MIME、加密 | 最小后端原子 `V8.Email`,不新增业务 Controller |
27
- | 租户扩展 | `mci-email-hook`,商城策略 `CreateIfMissing` |
28
- | AI 操作 | `microi_email_query`、`microi_email_manage`、`microi_email_send` |
29
-
30
- 当前版本沿用原邮箱配置表的平台管理员权限(`Level >= 9999`),
31
- 并按当前用户检查账号和邮件所有权。不得因 AI 使用而绕过这些约束。
32
- 各运行节点需要包含 `V8.Email` 的平台版本;仅安装前端源码不能补齐 .NET 协议能力。
33
-
34
- ## 配置和同步
35
-
36
- 1. 确认用户拥有或获准使用邮箱;在服务商处开启 IMAP/SMTP,取得客户端授权码。
37
- 2. 打开账号表单,选择 QQ / 163 / 126 / 腾讯企业邮箱 / 自定义,填写地址与授权码。
38
- 3. QQ、163 常用 IMAP 993 / SMTP 465,选择 `SslOnConnect`;
39
- 使用 SMTP 587 时选择 `StartTls`。具体端口以服务商配置为准。
40
- 4. 授权码提交后由可信后端加密。编辑留空保留旧值;列表、导出、源码、日志和截图不含原文。
41
- 5. 先检测连接,再手动同步。首次先显示最新一批邮件,再增量补齐历史并核对状态。
42
- 6. 自动同步由平台定时任务运行,不依赖浏览器开着;每个账号设置同步间隔。
43
-
44
- 目录路径作为服务商的不透明值保存,不能自行翻译或改写。
45
- 去重键必须包含账号、目录、UIDVALIDITY 和 UID;UIDVALIDITY 改变时只重建该目录缓存。
1
+ ---
2
+ name: email-engine
3
+ description: 开发、安装和使用吾码邮箱系统 mci-email。用于 QQ、163、126、企业或自定义 IMAP/SMTP 邮箱账号维护、自动与手动同步、邮件阅读、草稿、附件、回复转发、发送结果核对,以及邮箱 MCP 工具和 V8.Email 协议原子。
4
+ ---
5
+
6
+ # 吾码邮箱系统
7
+
8
+ > **Codex 非阻塞自动更新:** 先遵循 [工作区约定](../workspace-conventions/SKILL.md),通过 `microi update --background --workspace "<工作区绝对路径>" --json` 投递更新检查;当前任务继续执行,不等待更新或重启现有会话。
9
+
10
+ 邮箱系统是使用吾码 UI 的独立 Vue 3 微服务,商城 AppKey 为 `mci-email`,
11
+ 后台入口为「系统引擎 → 邮箱系统」,菜单路由 `/mci-email`。
12
+
13
+ 先读取 `../workspace-conventions/SKILL.md`;开发或发布时还需读取
14
+ `../microi-microservice/SKILL.md`、`../app-store/SKILL.md`。
15
+ 先调用 `microi_list_applications`,再读取目标应用完整上下文,禁止覆盖未读取的源码。
16
+
17
+ ## 选择正确入口
18
+
19
+ | 需求 | 入口 |
20
+ | --- | --- |
21
+ | 邮箱工作台 | 源码微服务 `mci-email` |
22
+ | 账号配置 | 原表 `mic_email_server`,通过宿主 `openForm` 打开吾码表单 |
23
+ | 全部业务 HTTP | 接口引擎 `mci-email`,请求参数 `Action` |
24
+ | 手动同步 | `Action: Sync` 返回持久后台任务,使用 `SyncStatus` 回读终态 |
25
+ | 自动同步 | 定时任务调用 `mci-email-auto-sync`,内部调度 `mci-email-sync-step` |
26
+ | 协议、MIME、加密 | 最小后端原子 `V8.Email`,不新增业务 Controller |
27
+ | 租户扩展 | `mci-email-hook`,商城策略 `CreateIfMissing` |
28
+ | AI 操作 | `microi_email_query`、`microi_email_manage`、`microi_email_send` |
29
+
30
+ 当前版本沿用原邮箱配置表的平台管理员权限(`Level >= 9999`),
31
+ 并按当前用户检查账号和邮件所有权。不得因 AI 使用而绕过这些约束。
32
+ 各运行节点需要包含 `V8.Email` 的平台版本;仅安装前端源码不能补齐 .NET 协议能力。
33
+
34
+ ## 配置和同步
35
+
36
+ 1. 确认用户拥有或获准使用邮箱;在服务商处开启 IMAP/SMTP,取得客户端授权码。
37
+ 2. 打开账号表单,选择 QQ / 163 / 126 / 腾讯企业邮箱 / 自定义,填写地址与授权码。
38
+ 3. QQ、163 常用 IMAP 993 / SMTP 465,选择 `SslOnConnect`;
39
+ 使用 SMTP 587 时选择 `StartTls`。具体端口以服务商配置为准。
40
+ 4. 授权码提交后由可信后端加密。编辑留空保留旧值;列表、导出、源码、日志和截图不含原文。
41
+ 5. 先检测连接,再手动同步。首次先显示最新一批邮件,再增量补齐历史并核对状态。
42
+ 6. 自动同步由平台定时任务运行,不依赖浏览器开着;每个账号设置同步间隔。
43
+
44
+ 目录路径作为服务商的不透明值保存,不能自行翻译或改写。
45
+ 去重键必须包含账号、目录、UIDVALIDITY 和 UID;UIDVALIDITY 改变时只重建该目录缓存。
46
46
  同步锁使用接口引擎分布式锁,检查点进入数据库;进程重启后继续执行。
47
47
  每批状态核对和近期摘要刷新都要先比较缓存,只更新实际变化的字段;未变化的 100 封邮件不能逐封重写。查询仅投影需要比较的标记/摘要字段,不加载正文或附件。跳过无变化写入仍须推进 UID 游标,保留远端删除、软删除恢复和已发送副本关联,并用同步回归测试验证。
48
48
  邮件正文按需读取,默认阻止脚本、表单提交与外部图片;不能直接在宿主使用 `v-html`。
49
-
50
- ## MCP 使用
51
-
52
- 先通过 `microi_codex action=profiles` 选择用户指定租户,再按工具 Schema 调用。
53
-
54
- ```json
55
- {"action":"Overview"}
56
- ```
57
-
58
- 以上参数用于 `microi_email_query`,不会回传授权码。
59
- 查询邮件用 `action: Messages`,可传 `accountId`、`folderKind`、`keyword`、
60
- `pageIndex` 和 `pageSize`;只在任务需要时读取正文或附件。
61
-
62
- 维护工具先返回操作预览。用户已有明确授权后,`confirmExecution` 精确填写
63
- `Action:目标Id`;新账号为 `SaveAccount:new`,新草稿为 `SaveDraft:账号Id`。
64
- 同步需要稳定的 `requestId`,恢复同一请求不得生成新值。
65
-
66
- 发信先通过 `microi_email_manage(action: SaveDraft)` 保存确定的收件人、正文与附件,
67
- 然后调用 `microi_email_send(draftId, confirmExecution: draftId)`。
68
- 只有用户已授权发送给这些收件人时才执行;不要把读取邮件的请求当作发送授权。
69
-
70
- ## 发送和结果边界
71
-
72
- - 一次发送意图绑定稳定草稿 Id 和 Message-Id;同一草稿重复请求不能再次 SMTP 投递。
73
- - `Sent` 表示 SMTP 服务器已接受;收件端可见需要实际收件验证。
74
- - `Unknown` 表示连接中断等情况导致结果不确定,保留在发件箱,禁止自动重发。
75
- 先按 Message-Id 检查服务商已发送目录;确需新发时由用户确认新的发送意图。
76
- - 远端已发送副本单独保存;副本或租户 Hook 失败不得回滚已发生的 SMTP 副作用。
77
- - 原子只解密当前租户的凭据,不能向 V8 暴露解密方法;必须校验 TLS 证书。
78
-
79
- 协议方法和参数见 [V8.Email 原子参考](references/v8-email.md)。
80
- 最终分别验证源码/构建、API 权限、连接、实际收件、附件字节、重复发送、
81
- 自动同步、宿主表单、商城包与官网真实截图。
49
+
50
+ ## MCP 使用
51
+
52
+ 先通过 `microi_codex action=profiles` 选择用户指定租户,再按工具 Schema 调用。
53
+
54
+ ```json
55
+ {"action":"Overview"}
56
+ ```
57
+
58
+ 以上参数用于 `microi_email_query`,不会回传授权码。
59
+ 查询邮件用 `action: Messages`,可传 `accountId`、`folderKind`、`keyword`、
60
+ `pageIndex` 和 `pageSize`;只在任务需要时读取正文或附件。
61
+
62
+ 维护工具先返回操作预览。用户已有明确授权后,`confirmExecution` 精确填写
63
+ `Action:目标Id`;新账号为 `SaveAccount:new`,新草稿为 `SaveDraft:账号Id`。
64
+ 同步需要稳定的 `requestId`,恢复同一请求不得生成新值。
65
+
66
+ 发信先通过 `microi_email_manage(action: SaveDraft)` 保存确定的收件人、正文与附件,
67
+ 然后调用 `microi_email_send(draftId, confirmExecution: draftId)`。
68
+ 只有用户已授权发送给这些收件人时才执行;不要把读取邮件的请求当作发送授权。
69
+
70
+ ## 发送和结果边界
71
+
72
+ - 一次发送意图绑定稳定草稿 Id 和 Message-Id;同一草稿重复请求不能再次 SMTP 投递。
73
+ - `Sent` 表示 SMTP 服务器已接受;收件端可见需要实际收件验证。
74
+ - `Unknown` 表示连接中断等情况导致结果不确定,保留在发件箱,禁止自动重发。
75
+ 先按 Message-Id 检查服务商已发送目录;确需新发时由用户确认新的发送意图。
76
+ - 远端已发送副本单独保存;副本或租户 Hook 失败不得回滚已发生的 SMTP 副作用。
77
+ - 原子只解密当前租户的凭据,不能向 V8 暴露解密方法;必须校验 TLS 证书。
78
+
79
+ 协议方法和参数见 [V8.Email 原子参考](references/v8-email.md)。
80
+ 最终分别验证源码/构建、API 权限、连接、实际收件、附件字节、重复发送、
81
+ 自动同步、宿主表单、商城包与官网真实截图。