@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,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
+ 自动同步、宿主表单、商城包与官网真实截图。