@microi.net/cli 5.2.5 → 5.2.7

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 (51) 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/assets/build-meta.json +6 -6
  7. package/cordis.patch.yml +1 -1
  8. package/package.json +1 -1
  9. package/scripts/mcp-server.js +88 -88
  10. package/scripts/microi-cli.js +15 -0
  11. package/scripts/microi-skills.meta.json +225 -222
  12. package/skills/.microi-skills-version.json +2 -2
  13. package/skills/.progressive-disclosure-manifest.json +93 -93
  14. package/skills/README.md +2 -1
  15. package/skills/ai-engine/SKILL.md +1 -1
  16. package/skills/app-store/SKILL.md +13 -9
  17. package/skills/microi-client-frontend/SKILL.md +1 -1
  18. 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 +1 -1
  19. 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 +2 -2
  20. package/skills/microi-docs-coverage/references/capability-map.md +3 -1
  21. package/skills/microi-form-layout/SKILL.md +6 -6
  22. package/skills/microi-frontend-sdk/SKILL.md +6 -6
  23. package/skills/microi-microservice/SKILL.md +2 -1
  24. package/skills/microi-sso/SKILL.md +3 -1
  25. package/skills/microi-sso/references/acceptance.md +1 -1
  26. package/skills/microi-sso/references/configuration-and-security.md +1 -1
  27. package/skills/microi-system-delivery/SKILL.md +2 -2
  28. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +1 -1
  29. package/skills/microi.v8.js +1 -1
  30. package/skills/performance-testing/SKILL.md +12 -0
  31. package/skills/system-observability/SKILL.md +139 -0
  32. package/skills/translate-engine/SKILL.md +3 -0
  33. package/skills/ui-design/SKILL.md +6 -3
  34. package/skills/v8-api-config/SKILL.md +31 -9
  35. package/skills/v8-cache-pattern/SKILL.md +304 -289
  36. package/skills/v8-debugging/SKILL.md +1 -1
  37. package/skills/v8-file-upload/SKILL.md +3 -3
  38. 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 +1 -1
  39. package/skills/v8-menu-buttons/SKILL.md +1 -1
  40. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +1 -1
  41. package/skills/v8-mq-mqtt/SKILL.md +130 -109
  42. package/skills/v8-mq-mqtt/references/mqtt-production.md +3 -2
  43. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +14 -16
  44. package/skills/v8-security/SKILL.md +7 -5
  45. package/skills/v8-table-event/SKILL.md +1 -1
  46. 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 +1 -1
  47. package/skills/v8-utilities/SKILL.md +1 -1
  48. package/skills/v8-utilities/references/platform-http-routes.md +4 -2
  49. package/skills/v8-utilities/references/server-api-index.md +6 -3
  50. package/skills/v8-workflow/SKILL.md +1 -1
  51. package/skills/workspace-conventions/SKILL.md +1 -1
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=microi-client-frontend-005 sha256=c4aeb714b7eaa724eb7ac8667d474e0707e76c79dcf02c106e8c5b25a1e0ef17 -->
5
+ <!-- microi-progressive:chunk id=microi-client-frontend-005 sha256=0ffafbd99fc0ee478db91200bfc3645c288f20d45120cd7413fb00ac3fbd8952 -->
6
6
  ## 3. 动态按钮系统
7
7
 
8
8
  按钮配置来自 `sys_menu`:
@@ -149,7 +149,7 @@ Microi 的 AI 应用与应用商城只有一个主数据源:`sys_microistore`
149
149
  - 同一份 ApiKey/Token 摘要在 Overview 与 AI 页面复用同一个组件;Token 额度统一展示“总量/Total”,不要把总量写成“赠送”。复制密钥必须有明确成功或失败提示,并提供 Clipboard API 不可用时的兼容复制。
150
150
 
151
151
  <!-- /microi-progressive:chunk -->
152
- <!-- microi-progressive:chunk id=microi-client-frontend-013 sha256=41c4bd99de48ccd402eb1d2dc551cf19a4472abce542b7904bf7ee61bdd43f0a -->
152
+ <!-- microi-progressive:chunk id=microi-client-frontend-013 sha256=8f876b46e20dce5020e17f87ac6f9acfb37c908ab27f7c9568d59e9e7a00d3b2 -->
153
153
  ## 浏览器访问密钥路由
154
154
 
155
155
  - 固定看板免登录使用常量匿名路由 `/access-login`,密钥使用 `microi_ak_` 前缀,完整链接格式为 `{Microi.Client前端WebBase}/?OsClient={当前租户}#/access-login?access_key={密钥}&redirect={encodeURIComponent后的站内Hash路由}`。例如目标路由 `/mic/data-dashboard/preview/01KK988A0YPHKAM8SF216917HX` 必须生成 `redirect=%2Fmic%2Fdata-dashboard%2Fpreview%2F01KK988A0YPHKAM8SF216917HX`。生成器只复制当前 `OsClient`,不能把其它页面查询参数带进凭据链接,也不能把 API Server 当成前端 WebBase。
@@ -159,7 +159,7 @@ Microi 的 AI 应用与应用商城只有一个主数据源:`sys_microistore`
159
159
  - 兑换通过 `POST /api/SysUserAccessKey/Exchange` 的 JSON Body 完成。响应头中的短期 Token 继续交给平台统一请求层保存和轮换。
160
160
  - 创建界面默认按页面名称勾选,也支持粘贴完整页面网址自动解析;不能要求普通用户手写路由和物理表名。页面/数据均可选择“全部已授权”,内部值为 `*`,含义只是取消密钥层二次白名单,仍与目标帐号实时菜单、表单和行权限取交集。接口引擎与数据源引擎 Key 仍必须准确选择。
161
161
  - `_AccessKeySession=true` 且页面为准确白名单时只允许清单路径;页面范围为 `*` 时才加载目标帐号实时可用的动态路由,以便全部已授权菜单可访问。该前端限制只是体验和泄露面收窄,服务端仍必须校验 API、表和引擎权限。
162
- - 全部页面模式会调用 `/api/SysMenu/GetSysMenuStep`,服务端只能在 `page:open + AllowedRoutes=*` 时放行;准确页面模式不得为了省事请求完整菜单树。页面渲染过程中使用 `FormEngineKey`、`TableId`、`ModuleEngineKey` 或 `_SysMenuId` 的请求都必须能被服务端映射到同一份表范围,不能通过换参数名绕过,也不能把合法的菜单 Id 请求误判为缺少表引用。
162
+ - 全部页面模式会调用 `/apiengine/platform-sys-menu?Action=GetSysMenuStep`,服务端只能在 `page:open + AllowedRoutes=*` 时放行;准确页面模式不得为了省事请求完整菜单树。页面渲染过程中使用 `FormEngineKey`、`TableId`、`ModuleEngineKey` 或 `_SysMenuId` 的请求都必须能被服务端映射到同一份表范围,不能通过换参数名绕过,也不能把合法的菜单 Id 请求误判为缺少表引用。
163
163
  - 列表和表单会把表 Key 或菜单 Id 放进动态友好地址,例如 `/api/FormEngine/GetTableData-{table-key}` 和 `/api/FormEngine/GetFormData-{table-key}`。访问密钥服务端必须先把这些地址归一化为标准 action,再按 `form:read/form:write` 对 URL 后缀与请求体中的表/菜单引用做一致性校验,并把菜单 Id 映射回绑定的 `DiyTableId` 校验数据范围;不能要求前端为了密钥会话退回另一套 URL,也不能对整个 `FormEngine` Controller 无条件放行。
164
164
  - 不要因为底层帐号是管理员而在访问密钥会话展示控制面入口或触发控制面预加载。`_AccessKeySession=true` 时,密码显示、密钥管理、表/字段/菜单设计、缓存/服务器管理、查看或踢出其它终端等功能必须保持不可用;后台任务中心最多读取和管理当前用户自己的任务。
165
165
  - `/access-login` 必须在普通 SSO 发现之前直接放行,兑换最多等待 20 秒并给出明确错误,不能让页面永久停在“正在自动登录”。
@@ -36,9 +36,11 @@ Markdown。第一列是相对 `microi.doc/docs/doc/` 的路径;第二列 Skill
36
36
  | `system-engine/ai-engine.md` | ai-engine, v8-http-integration, microi-ai-application | 模型代理、License、V8.AI、MCP 对话、跨端调用和安全 |
37
37
  | `system-engine/ai-platform-governance.md` | ai-platform-governance, app-store, business-blueprint, page-engine | 门户、身份、配置、发布、服务韧性、Trace/日志、资产协作与可恢复导入 |
38
38
  | `system-engine/ai-workflow-suite.md` | business-blueprint, v8-workflow, microi-system-delivery | AI 工作流、蓝图、状态机、自动化流和流程挖掘 |
39
+ | `system-engine/system-observability.md` | system-observability, performance-testing, v8-debugging, microi-microservice | 系统日志、Trace、热点接口、资源监控、网络流量归因、安全治理、AI/MCP 与商城交付 |
39
40
  | `system-engine/app-store.md` | app-store | 应用包、安装、升级和回滚 |
40
41
  | `system-engine/databases.md` | dos-orm, v8-sql-query, microi-deployment | 扩展数据库与迁移 |
41
42
  | `system-engine/datasource-engine.md` | datasource-engine | 数据源定义、执行和供数 |
43
+ | `system-engine/cache.md` | v8-cache-pattern, v8-saas-multi-tenant | L1/L2 架构、租户 Redis、Pub/Sub 失效、V8 安全代理与 Redis 管理器 |
42
44
  | `system-engine/file-manage.md` | v8-file-upload, microi-client-frontend | 文件柜、公私桶管理、在线预览、回收站、跨平台与 MinIO 同步 |
43
45
  | `system-engine/job.md` | job-engine | 调度、后台任务和分布式恢复 |
44
46
  | `system-engine/micro-app.md` | microi-microservice, microi-ai-application | 微服务/AI 前端应用的工程架构与交付 |
@@ -46,7 +48,7 @@ Markdown。第一列是相对 `microi.doc/docs/doc/` 的路径;第二列 Skill
46
48
  | `system-engine/microi-ui.md` | microi-ui | Microi.UI 组件和主题 |
47
49
  | `system-engine/message-notification.md` | message-notification | 平台内部消息、SignalR 与多通道通知 |
48
50
  | `system-engine/module-engine.md` | module-engine, v8-menu-buttons, v8-template-engine, microi-mobile-app-quality | 菜单统计、模块指标、复合列、移动卡片、按钮角标和页面入口 |
49
- | `system-engine/mq.md` | v8-mq-mqtt | RabbitMQ 生产与消费 |
51
+ | `system-engine/mq.md` | v8-mq-mqtt | RabbitMQ 租户连接、队列规范化、事务发布、消费确认、有限重试、幂等与多节点运行 |
50
52
  | `system-engine/mqtt-engine.md` | v8-mq-mqtt | MQTT Broker、SaaS 认证、Topic ACL、V8 事件、设备路由、下行与生产部署 |
51
53
  | `system-engine/page-engine.md` | page-engine | 界面引擎 JSON |
52
54
  | `system-engine/print-engine.md` | print-engine, v8-frontend-events | 服务端模板打印与蓝牙直连边界 |
@@ -33,7 +33,7 @@ Microi 吾码低代码提供 **三种** 表单分组能力,但每种都有明
33
33
  - 配置表采用“表级 Tab + Tab 内 CollapseGroup”时,CollapseGroup 必须与成员字段写入同一个 `Tab`,并用连续 `Sort` 保证作用范围在下一个布局节点前结束。发布前必须打开真实编辑表单验证,不能只凭元数据字符串判断布局成功。
34
34
 
35
35
  <!-- microi-progressive:begin -->
36
- <!-- microi-progressive:chunk id=microi-form-layout-000 sha256=cade6a415454aa04f5fcf840e6d9df1323ac9751c0e3c8e1b07b360007413819 -->
36
+ <!-- microi-progressive:chunk id=microi-form-layout-000 sha256=79fcf1787c0fbdbe51363f25fcf72b060b714eed9cbc5593760f9080cff48e31 -->
37
37
  ## 1. 三种分组能力速查
38
38
 
39
39
  | 能力 | 存储位置 | 控件 | 核心作用 | 适用场景 |
@@ -44,7 +44,7 @@ Microi 吾码低代码提供 **三种** 表单分组能力,但每种都有明
44
44
  | **D. 不分组(默认平铺)** | 无 | — | 全部字段在第一屏 | 总有效表单行 ≤ 6、没有复杂控件,且没有必须强调的业务分组 |
45
45
 
46
46
  <!-- /microi-progressive:chunk -->
47
- <!-- microi-progressive:chunk id=microi-form-layout-001 sha256=f43f8c6f1c156ef3669f0c1f9a9d9d2cb7baf630d0b0cb2f48307a31f3f82ae2 -->
47
+ <!-- microi-progressive:chunk id=microi-form-layout-001 sha256=eb8f9a306f46484217f8fc6094a7dc8ea1f5315187430329d79fa71134c3b2da -->
48
48
  ## 2. 黄金决策流程(AI 必须按此顺序判断)
49
49
 
50
50
  ### 2.1 先算“有效表单行”,禁止只数字段
@@ -95,7 +95,7 @@ Q1: 核心可见字段数、子表和强任务域?
95
95
  | 工作流审批表(≤10 字段) | D. 不分组 | 禁止使用 Tab |
96
96
 
97
97
  <!-- /microi-progressive:chunk -->
98
- <!-- microi-progressive:chunk id=microi-form-layout-002 sha256=9165f561ba90696ce130d24f71a0e56c521b5f8935eac2ddcffb852f3af5d9b2 -->
98
+ <!-- microi-progressive:chunk id=microi-form-layout-002 sha256=119311f1ec30de83c323a0604c0aefb12676da7c421fc459d1555b0a1a7858d0 -->
99
99
  ## 4. AI 生成表单布局的标准动作
100
100
 
101
101
  ### 4.1 必做顺序
@@ -137,7 +137,7 @@ Q1: 核心可见字段数、子表和强任务域?
137
137
  V8 事件中可用 `V8.HideFormTab('tabId')` / `V8.ShowFormTab('tabId')` / `V8.ClickFormTab('tabId')` 动态控制 Tab 显隐和默认选中。
138
138
 
139
139
  <!-- /microi-progressive:chunk -->
140
- <!-- microi-progressive:chunk id=microi-form-layout-003 sha256=c737fc8b0d488548e5a3de616ff172b8b645553c818fb09e70a196f4e9c0e2ae -->
140
+ <!-- microi-progressive:chunk id=microi-form-layout-003 sha256=02934831afff7bd9065406b074f5780cb5686ccdb63fcb350b8c409dad315c74 -->
141
141
  ## 5. 必填与禁止
142
142
 
143
143
  ### 5.1 必填
@@ -167,7 +167,7 @@ V8 事件中可用 `V8.HideFormTab('tabId')` / `V8.ShowFormTab('tabId')` / `V8.C
167
167
  - ❌ **禁止**用普通新增字段或通用表单数据写入创建布局节点;这类路径可能对目标业务表执行物理 DDL。
168
168
 
169
169
  <!-- /microi-progressive:chunk -->
170
- <!-- microi-progressive:chunk id=microi-form-layout-004 sha256=539ae919554ca9eda5b5a26ac405181f601f4195f6a59baf1fd368d315987e6c -->
170
+ <!-- microi-progressive:chunk id=microi-form-layout-004 sha256=5de749261dec123edd0fc9186188cb90887892490298dad9d6944670457177df -->
171
171
  ## 6. 验收清单
172
172
 
173
173
  修改或新建表单布局后,AI 必须按以下顺序验收:
@@ -188,7 +188,7 @@ V8 事件中可用 `V8.HideFormTab('tabId')` / `V8.ShowFormTab('tabId')` / `V8.C
188
188
  通常跳过这些运行态事件;未完成这一步不得直接判定为 Microi.Client 渲染缺陷。
189
189
 
190
190
  <!-- /microi-progressive:chunk -->
191
- <!-- microi-progressive:chunk id=microi-form-layout-005 sha256=db6759bef83e520e5f137347070f85df1275e14dcbc742bebfdaac4da14be375 -->
191
+ <!-- microi-progressive:chunk id=microi-form-layout-005 sha256=941d45f4389751946df34ec388e28adbbe9965d6ad9f637f48fd35cc6aca5065 -->
192
192
  ## 9. 与其他 Skill 的关系
193
193
 
194
194
  - 字段创建流程:`v8-table-event/SKILL.md` 写 InFormV8 / SubmitFormV8 等。
@@ -10,7 +10,7 @@ description: Microi 前端 SDK 使用规范,适用于 Vue 3、uni-app、H5、P
10
10
  所有 Vue 3 前端项目都应使用 `microi.skills/microi.v8.js` 作为统一的 Microi 前端 SDK。新项目不要复制旧版 Vue2/Vuex 请求封装,也不要重新手写 token、上传、文件 URL、ApiEngine 或 FormEngine 层。
11
11
 
12
12
  <!-- microi-progressive:begin -->
13
- <!-- microi-progressive:chunk id=microi-frontend-sdk-000 sha256=06f944bc009a4e773ae6d5496d435d3e4a4fdb23d59107dac9cedffcfdf18f86 -->
13
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-000 sha256=4b1d4f626b1c4de344339a2fba6b2eaf48e9e5a018c2faa1f7480b90254a4cfb -->
14
14
  ## 必须采用的模式
15
15
 
16
16
  将 SDK 复制到项目源码目录,通常是:
@@ -56,7 +56,7 @@ export function createApp() {
56
56
  页面和业务接口模块应从项目请求模块导入已配置实例或薄封装函数,不要直接从标准 skill 文件导入。
57
57
 
58
58
  <!-- /microi-progressive:chunk -->
59
- <!-- microi-progressive:chunk id=microi-frontend-sdk-001 sha256=f1c2ab1fadc01dbe8ea4b9de98f7c02192c3f2cfed8b792fe62f8ef516b67d83 -->
59
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-001 sha256=c418c6c9e6846d2ce4db04501520036e2c6b0f162c282d6e099e802c9b83f72d -->
60
60
  ## 必须委托 SDK 的能力
61
61
 
62
62
  - `ApiEngine.Run`:直接调用 `/apiengine/{key}` 时使用 `V8.ApiEngine.Run(key, data)`。
@@ -71,7 +71,7 @@ export function createApp() {
71
71
  `Microi.Client` 主后台运行时已内置前后端同构的 `V8.Http.Get/Post/Patch` 及对应 Response 方法;表单事件、按钮 V8 等宿主前端新代码必须优先使用 `V8.Http`,旧 `V8.Post/Get` 仅作兼容保留,其参数和兼容规则以 `v8-http-integration/SKILL.md` 为准。独立项目使用本 SDK、且不在主后台 V8 宿主中时,才使用 SDK 自身的小写 `V8.get/post`、`ApiEngine`、`FormEngine`;不要把它们与宿主旧版大写 `V8.Post/Get` 混为一谈,也不要假设浏览器可以绕过第三方接口的 CORS。
72
72
 
73
73
  <!-- /microi-progressive:chunk -->
74
- <!-- microi-progressive:chunk id=microi-frontend-sdk-002 sha256=5842c30af751f60041e4435efe5c993144a874cb2e9d97c41fb37d1f06d6474e -->
74
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-002 sha256=54b302bfe2a8830a3043ae7804ca775d6159453bea0cfdeac61c3b97d36466ed -->
75
75
  ## 登录与验证码封装
76
76
 
77
77
  SDK 或项目请求模块必须提供登录所需的系统配置和验证码薄封装,不要让页面散落手写。
@@ -120,7 +120,7 @@ AI 生成的前端微服务不能假定永远在主平台 iframe/micro-app 宿
120
120
  - 宿主额外传入 `permissionContext={sysMenuId,moduleEngineKey,diyTableId}`。SDK/服务层需要访问 FormEngine 时使用真实授权 `moduleEngineKey`;该对象不能代替后端权限,也不能成为放宽匿名接口的理由。
121
121
 
122
122
  <!-- /microi-progressive:chunk -->
123
- <!-- microi-progressive:chunk id=microi-frontend-sdk-003 sha256=d5d1984e6cd4efbb2340f984473146c66bb342d60bb571454c457f5673b1c68f -->
123
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-003 sha256=fd0dbc19f767d1b69c41582a99d2c578c2e4ee8c871df89fd67ed054641d1931 -->
124
124
  ## 请求头规则
125
125
 
126
126
  SDK 的 `buildHeaders` 必须集中处理所有请求头,不能让页面、业务 wrapper 或上传逻辑各自拼接租户和鉴权头。
@@ -132,7 +132,7 @@ SDK 的 `buildHeaders` 必须集中处理所有请求头,不能让页面、业
132
132
  - 验收时检查真实网络请求:不得出现 `osclient: demo, demo`、`Authorization: Bearer xxx, Bearer xxx` 这类逗号合并值。
133
133
 
134
134
  <!-- /microi-progressive:chunk -->
135
- <!-- microi-progressive:chunk id=microi-frontend-sdk-004 sha256=c5f546fd4ef770459d42239b40af81d52399a3623340472b703cffe09a7b5d1e -->
135
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-004 sha256=f5644fc45280e53988d1eed432e57afc2c56fc58b1232505950359219b5220d2 -->
136
136
  ## 上传规则
137
137
 
138
138
  `V8.uploadFile` 是 Microi 前端唯一允许的上传入口。SDK 实现必须:
@@ -150,7 +150,7 @@ SDK 的 `buildHeaders` 必须集中处理所有请求头,不能让页面、业
150
150
  当上传突然报 `移动端文件上传路径不合法!` 时,先检查实际 multipart 表单字段和请求头。在 Microi 移动端/会员 Token 流程中,后端会在 HDFS 上传前校验 `Path`;错误的 `Content-Type` 会导致后端读不到表单字段,并表现为路径错误。
151
151
 
152
152
  <!-- /microi-progressive:chunk -->
153
- <!-- microi-progressive:chunk id=microi-frontend-sdk-005 sha256=1a9d0a33adbff849decf01d114e72cad96f80a6122f0b281cecf9092bbcd0c42 -->
153
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-005 sha256=ea5ffc6757b73bb3251b34d26b2902674c3a0c7f5277dcf8745e39ff11fe6b56 -->
154
154
  ## 项目封装规则
155
155
 
156
156
  面向业务页面的函数名要保持稳定。如果已有项目导出 `callEngine`、`formEngineGet`、`getImageUrl`、`parseImages` 或 `uploadFile`,保留这些导出,内部委托给 `V8`。这样既能统一 SDK,又能避免大面积改页面。
@@ -160,7 +160,8 @@ window.microApp.dispatch({
160
160
 
161
161
  AI 生成菜单微服务时,应优先封装一个 `callMicroiHost(action, data)`,先检查
162
162
  `hostCapabilities.actions`,再 dispatch。当前标准动作是:`closeTab`、`navigate`、
163
- `replaceTab`、`back`、`forward`、`reloadTab`、`setTabTitle`、`showMessage`。
163
+ `replaceTab`、`back`、`forward`、`reloadTab`、`setTabTitle`、`showMessage`、`setGlobalOverlay`。
164
+ `setGlobalOverlay` 只负责平台级遮罩、宿主滚动锁和必要时提升微应用层级,不替代子应用自己的 Dialog、焦点管理和权限。平台级详情/确认弹层打开时传 `visible/blur/lockScroll/mask/promote`,关闭、路由离开、错误和 `onBeforeUnmount` 都必须发送 `visible:false, lockScroll:false, promote:false`;多个弹层用本地计数或统一 computed 保证最后一个关闭后才撤销。
164
165
  `navigate/replaceTab` 只传以 `/` 开头的站内 path 或 `{name,params,query,hash}`;禁止传
165
166
  外部 URL、登录页、访问密钥页或内部 redirect。目标仍要存在于当前用户动态路由并经过路由守卫,
166
167
  宿主桥接不授予菜单或数据权限。业务保存成功后才能关闭/跳转,不能把尽力返回的
@@ -40,7 +40,7 @@ description: 设计、实现、配置、迁移、发布和验收 Microi 吾码
40
40
  7. 外部角色、邮箱或昵称不能直接获得管理员权限。默认 `BoundOnly`,JIT 必须显式默认角色、唯一性、回收和审计。
41
41
  8. HTTP 200、构建成功、商城任务入队或包可下载都不是完整 SSO 验收。
42
42
  9. SSO 业务逻辑必须接口引擎优先:连接投影、绑定/JIT、角色与 Claim 映射、审计、登录完成和租户扩展不得重新写进 Controller。只有协议报文、签名验签、Secret/私钥隔离、一次性票据与 DiyToken 等可信原子可以保留 C#。
43
- 10. 客户端调用应用接口使用稳定 `/api/ApiEngine/Run?OsClient=`;应用未安装时必须得到结构化错误,禁止重新依赖可能由网关缺失而 404 的动态 `/apiengine/*` 或已删除的 `/api/Sso/Capabilities` 等定制路由。
43
+ 10. 客户端调用固定应用接口必须优先使用 `/apiengine/{ApiEngineKey}?OsClient=`,让系统日志/监控按真实接口引擎归因;新版宿主即使接口尚未安装也会返回结构化缺失错误。`/api/ApiEngine/Run` 只保留给无法预知 Key 的旧版兼容调用,禁止新增固定业务依赖;同样禁止调用已删除的 `/api/Sso/Capabilities` 等定制路由。
44
44
 
45
45
  ## 标准工作流
46
46
 
@@ -77,6 +77,8 @@ C# 只保留:
77
77
  - 高熵一次性 code/ticket、重放保护和 DiyToken 签发;
78
78
  - 仅允许精确 Managed Key 调用的 `CreateFederatedUser`、`CreateSsoLoginTicket`、`CompleteSsoLogin`、`RotateSsoClientSecret` 原子。
79
79
 
80
+ 协议网关的标准路由是 `/api/Sso/Begin`、`/api/Sso/CompleteAuthorization`、`/api/Sso/CompleteLogin`、`/api/Sso/LegacyCapabilities` 和 `/api/Sso/RotateClientSecret`(统一前缀 `/api/Sso/`)。这些路由只处理重定向、协议报文、签名/票据和可信原子;连接投影、身份解析、登录完成与密钥轮换的业务编排仍由上面的 Managed 接口引擎承担。
81
+
80
82
  新增 SSO 需求先判断是否只需修改上述接口引擎。只有缺少不可伪造、不可泄露的底层原子时才增加 V8 方法;增加后同时更新应用 `RequiredPlatformCapabilities`、后端文档、测试与最低版本。
81
83
 
82
84
  详细用户文档:`microi.doc/docs/doc/more/sso.md`。
@@ -43,7 +43,7 @@
43
43
 
44
44
  ## 404 与应用缺失回归
45
45
 
46
- - 客户端能力发现和登录完成只允许调用 `/api/ApiEngine/Run?OsClient=`,请求体携带精确 `ApiEngineKey`。
46
+ - 客户端能力发现和登录完成只允许调用 `/apiengine/{ApiEngineKey}?OsClient=`;固定业务不得新增 `/api/ApiEngine/Run` 依赖。
47
47
  - 在未安装 `app.microi.sso` 的租户调用通用入口,应返回结构化“接口引擎不存在”;不能返回 `/api/Sso/Capabilities` 路由 404。
48
48
  - 安装后回读 11 个 `sys_apiengine` 行并刷新缓存,再验证 `sso_capabilities` 为 `Code=1`。
49
49
  - `/api/Sso/Capabilities`、`LegacyCapabilities`、`CompleteLogin`、`RotateClientSecret` 与 `/api/SysUser/SsoPengrui` 必须保持删除,防止业务逻辑重新漂回 Controller。
@@ -12,7 +12,7 @@
12
12
 
13
13
  `diy_sso` 是管理员专用平台表。匿名能力接口只投影 ConnectionKey、名称、协议、图标、说明和发起地址;旧兼容投影只允许同源 `/api/` 路径与安全 Token 参数名。
14
14
 
15
- 匿名投影由 `sso_capabilities` / `sso_legacy_capabilities` 接口引擎提供;Controller 不得直接查询并返回 `diy_sso`。内部协议网关通过 StopHttp 的 `sso_connection_runtime` 取得最小运行投影。客户端统一调用 `/api/ApiEngine/Run?OsClient=`,避免应用尚未安装或网关未注册动态路由时出现 404。
15
+ 匿名投影由 `sso_capabilities` / `sso_legacy_capabilities` 接口引擎提供;Controller 不得直接查询并返回 `diy_sso`。内部协议网关通过 StopHttp 的 `sso_connection_runtime` 取得最小运行投影。客户端统一调用 `/apiengine/{ApiEngineKey}?OsClient=`,让观测数据保留真实 Key;新版宿主对未安装引擎返回结构化缺失错误,不再因动态路由尚未注册而直接 404。
16
16
 
17
17
  ## Secret 与证书
18
18
 
@@ -16,7 +16,7 @@ Manifest 使用 `tables[].formBanner`;未显式配置时仍按字段类型选
16
16
  模块引擎或 `sys_menu`。逐步建模在字段完成后调用 `microi_configure_form_banner` 回读验收。
17
17
 
18
18
  <!-- microi-progressive:begin -->
19
- <!-- microi-progressive:chunk id=microi-system-delivery-000 sha256=b09c3f2d05e2927322de0c42913f85813296e9001bccf31b6dc85779cbe3099f -->
19
+ <!-- microi-progressive:chunk id=microi-system-delivery-000 sha256=088aaa73360be7d63b64ca476e884371140c7807d118c05f04d87a12de0c7701 -->
20
20
  ## 交付总原则
21
21
 
22
22
  1. **先事实源,后建模**:先读需求文档、截图、现有蓝图、数据库结构和菜单结构,形成业务蓝图;不要边猜边建表、边猜边写接口。
@@ -45,7 +45,7 @@ Manifest 使用 `tables[].formBanner`;未显式配置时仍按字段类型选
45
45
  最终回复必须按原始编号逐项汇总:哪些已实现、哪些未实现、是否通过全自动化测试、是否通过截图验证。不能只给总括性“都完成了”。如果某项没有测试或没有截图,必须明说“未覆盖/未截图”,并说明原因。
46
46
 
47
47
  <!-- /microi-progressive:chunk -->
48
- <!-- microi-progressive:chunk id=microi-system-delivery-002 sha256=aa3d244481565608bc92f7c389f8647e8cd551d241aabad9a9d876f1d15aab52 -->
48
+ <!-- microi-progressive:chunk id=microi-system-delivery-002 sha256=5b929c8ab1cf588601fb0e27149ef05893bc5000eecf05e58961c4f785251e31 -->
49
49
  ## 平台安全与存量兼容验收(强制)
50
50
 
51
51
  AI 零代码交付不能只验证管理员帐号和页面能打开。任何涉及 FormEngine、菜单、角色、子表、文件、SaaS 或登录协议的交付,都必须按以下服务端边界设计和验收:
@@ -7,7 +7,7 @@
7
7
  统计都应来自真实字段或真实接口引擎;配置写 `diy_table`,禁止写入 `sys_menu`。即使用户
8
8
  没有逐项指定,也必须写入类型感知的合理默认值,不能交付空 Banner。
9
9
 
10
- <!-- microi-progressive:chunk id=microi-system-delivery-005 sha256=e27ee98421974395b858927ab7b7fbebe27f314e54a8f616064b9c77c01ba808 -->
10
+ <!-- microi-progressive:chunk id=microi-system-delivery-005 sha256=8e90f8c4618b882000935a83b8ed581ff20c32d9b888f74eb0ace8c39439a46e -->
11
11
  ## 标准工作流
12
12
 
13
13
  ### 1. 需求蓝图阶段
@@ -1510,7 +1510,7 @@ export function createMicroiV8(options = {}) {
1510
1510
  UniappUploadAnonymous: '/api/HDFS/uniappUploadAnonymous',
1511
1511
  GetCurrentUser: '/api/SysUser/getCurrentUser',
1512
1512
  GetDateTimeNow: '/api/os/getDateTimeNow',
1513
- AddSysLog: '/api/SysLog/addSysLog',
1513
+ AddSysLog: '/apiengine/platform-client-log',
1514
1514
  GetOsClientByDomain: '/api/Os/getOsClientByDomain',
1515
1515
  ApiEngine: {}
1516
1516
  };
@@ -115,6 +115,18 @@ POST /api/formengine/DelFormData
115
115
  - “有界 Channel + 无界 ConcurrentQueue 溢出区”仍然是无界队列,禁止作为保护方案。主队列和内存重试区都必须有硬容量;两者满时要同步写持久化 spool/WAL 形成回压,并断言 `EmergencySpooled` 可观测、`Dropped=0`。
116
116
  - 进程被强制结束、宿主机掉电等场景若要求绝对零丢失,必须采用外部持久消息队列或同步 WAL;内存 Channel 加异步 spool 只能保证 Mongo 故障和正常停机,不得宣称覆盖尚未落盘的强杀窗口。
117
117
 
118
+ ## 网络流量可观测性与写入性能(强制)
119
+
120
+ 查询动作、AI/MCP 调用、权限与数据解释边界统一读取 `../system-observability/SKILL.md`;本节只定义热路径和压测门禁。
121
+
122
+ API 网络监控必须同时展示“网卡/容器网络命名空间计数”和“可归因 HTTP 请求体、响应体计数”,并明确两者不能直接画等号。Docker NetIO 还可能包含 TLS/HTTP 头、重传、数据库、Redis、MongoDB、对象存储、外部 HTTP 与容器内部通信;界面必须展示未归因差值、采样范围、节点、窗口和数据边界,禁止把差值伪装成某个帐号或接口的精确流量。
123
+
124
+ - 请求热路径只做原子计数和有硬上限的分钟桶聚合;端点、IP、帐号、租户、内容类型等维度必须限制基数和保留 TOP N,禁止逐请求同步写 MySQL/MongoDB、同步序列化完整请求或创建无界队列。
125
+ - 高频普通明细只驻留短窗口内存;大文件、可疑、错误或慢请求等有诊断价值的样本进入现有有界日志队列并异步批量写 MongoDB。Mongo 故障、队列满和停机语义继续遵守本 Skill 的 spool/WAL 规则。
126
+ - 长期趋势写 MySQL 固定时间桶汇总(默认 5 分钟),按 `BucketStart + Node + DimensionType + DimensionKeyHash` 形成确定性幂等键,批量 upsert;查询必须命中“时间桶+维度+总字节”等索引,页面默认分页 15 条,不得扫描 Mongo 明细生成每次总览。
127
+ - 禁止持久化 QueryString、Cookie、Token、Authorization、请求正文或响应正文。文件只记录经过清洗且有长度上限的文件名/扩展名/数量/字节;IP 必须标注是可信代理解析后的客户端 IP 还是直接连接 IP。
128
+ - 验收至少覆盖:并发计数无负数、维度基数有界、敏感值不落盘、固定时间桶幂等重放、Mongo 故障不阻塞请求、匿名/登录用户区分、上传/下载字节、网卡重置/回绕、低流量和大流量样本、服务重启后的历史查询,以及开启监控前后 P95/P99、CPU、分配率和内存差异。
129
+
118
130
  ### 多节点与滚动重启压测
119
131
 
120
132
  - 至少启动两个 API/Worker 实例连接同一 Redis、业务数据库和 MongoDB,通过同一负载均衡入口并发施压;禁止用单进程内开两个对象冒充分布式验收。
@@ -0,0 +1,139 @@
1
+ ---
2
+ name: system-observability
3
+ description: Microi 系统日志/监控查询、诊断与治理规范。用于通过界面、MCP 或接口引擎分析系统日志、Trace、热点接口、CPU/内存、网络流量归因、安全事件、IP 封禁、应用日志及可观测性性能边界。
4
+ ---
5
+
6
+ > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
7
+
8
+ # Microi 系统日志/监控
9
+
10
+ 本 Skill 用于读取、解释、扩展和验收 Microi 的统一【系统日志/监控】能力。它不授权查看其它租户、绕过菜单/平台管理员权限,或把当前节点样本扩写成全局结论。
11
+
12
+ ## 先选入口
13
+
14
+ | 目标 | 推荐入口 |
15
+ |---|---|
16
+ | 人工排查、看趋势、打开日志详情 | 平台菜单【系统日志/监控】 |
17
+ | AI 查询、自动诊断、验收 | MCP `microi_query_system_observability` |
18
+ | AI 封禁或解封 IP | MCP `microi_manage_system_observability` |
19
+ | 应用页面读取 | Managed 接口引擎 `mci-system-observability-query` |
20
+ | 应用页面治理 | Managed 接口引擎 `mci-system-observability-action` |
21
+ | 扩展宿主、进程、Mongo 或安全底层原子能力 | `V8.Method.GetSystemObservability` / `V8.Method.ManageSystemObservability` |
22
+
23
+ AI 第一次使用时先查询 `action=Capabilities`,再按返回的动作、权限和边界选择查询。不要用通用 `microi_run_engine` 代替专用工具;专用工具已经限制动作、参数、分页、确认和审计。
24
+
25
+ ## 查询动作
26
+
27
+ `microi_query_system_observability` 支持:
28
+
29
+ | action | 用途 | 关键参数 |
30
+ |---|---|---|
31
+ | `Capabilities` | 能力目录与真实边界 | 无 |
32
+ | `Snapshot` | 请求、进程、主机、Docker、队列、诊断和实时网络 | `windowMinutes=1..15`、`top`、`includeHost`、`includeDocker` |
33
+ | `Logs` | 日志列表和完整详情数据 | `keyword/type/category/source/level/searchMonth/pageIndex/pageSize` |
34
+ | `LogTypes` | 日志类型与数量 | `keyword/searchMonth` |
35
+ | `LogStats` | 总数、错误、警告、慢 SQL、慢执行、异常 | `keyword/searchMonth` |
36
+ | `Signal` | 时间窗内的诊断信号 | `windowSeconds=60..86400` 与日志过滤项 |
37
+ | `Trace` | W3C Trace 时间线 | 32 位十六进制 `traceId` |
38
+ | `ApiRank` | 热点接口、耗时占比、平均/P95、异常率 | `top/apiEngineKey/name` |
39
+ | `AppLogs` | 当前 API 进程日志尾部 | `lines=20..1000` |
40
+ | `PlatformStats` | 表、菜单、接口引擎、租户、用户和排行 | 无 |
41
+ | `SecurityData` | 访问、攻击或封锁记录 | `kind=Access|Attack|Block`、分页 |
42
+ | `TrafficHistory` | MySQL 固定时间桶流量趋势 | `rangeKey`;可选 `dimensionType` |
43
+ | `HistoricalDashboard` | 同一时间范围内的热点接口、IP、帐号、租户、内容类型与请求/流量总览 | `rangeKey=live5|today|yesterday|3d|7d|15d|30d|3m|6m|1y`、`top` |
44
+ | `TrafficDetails` | 跨月大文件、上传下载和可疑传输 MongoDB 明细 | `rangeKey`、`pageIndex/pageSize`;可选 `keyword/transferAction/ip/userId/endpoint` |
45
+
46
+ 示例:
47
+
48
+ ```json
49
+ {
50
+ "action": "HistoricalDashboard",
51
+ "rangeKey": "30d",
52
+ "top": 15
53
+ }
54
+ ```
55
+
56
+ ```json
57
+ {
58
+ "action": "TrafficDetails",
59
+ "rangeKey": "7d",
60
+ "transferAction": "Upload",
61
+ "pageIndex": 1,
62
+ "pageSize": 15
63
+ }
64
+ ```
65
+
66
+ 所有列表默认按 15 条开始;扩大分页前先增加过滤条件。日志和安全数据每页最多 200 条,Trace 最多 500 条。历史总览由固定聚合桶一次返回有界 TOP,不得循环拉取无时间边界的全量日志。
67
+
68
+ ## 安全治理动作
69
+
70
+ `microi_manage_system_observability` 只允许 `BlockIp` 和 `UnblockIp`。第一次不带确认调用只返回 dry-run,不产生写入;确认值必须精确为:
71
+
72
+ ```text
73
+ BlockIp:<ip>
74
+ UnblockIp:<ip>
75
+ ```
76
+
77
+ 封禁前必须核对反向代理、容器网桥、健康检查、办公出口和 NAT。可信后端会再次验证平台管理员身份、IP 格式、本机/未指定/组播限制、租户范围,并写审计日志。不能通过参数指定其它租户,也不能把批量 IP、CIDR、任意表写入或旧菜单删除塞进这个工具。
78
+
79
+ ## 数据解释边界
80
+
81
+ 1. `Snapshot`、活动请求、最近请求、进程与应用日志是当前 API 节点视角。多节点结论需要逐节点或接入统一遥测平台。
82
+ 2. 热点接口的“耗时占比”是窗口总请求耗时贡献,用于定位相关性;它不是逐请求 CPU 核采样,也不等于该接口独占同等 CPU。
83
+ 3. HTTP 可归因流量只统计经过 API 中间件的请求体和响应体。网卡、容器 NetIO 还包含 TLS/HTTP 头、重传、数据库、Redis、MongoDB、MQ、对象存储、外部 HTTP、健康检查和同机其它进程。
84
+ 4. “未归因流量”只能作为排查线索,不能强行归属给某个帐号、IP 或接口。
85
+ 5. IP 必须注明是可信代理解析后的客户端地址还是直接连接地址;代理链未配置正确前不要据此处罚用户。
86
+ 6. 进程 CPU“多核原始值”可超过 100%;247.7% 表示约占用 2.48 个逻辑核心。判断整机压力应使用主机归一值并结合持续时间、请求率与热点排行。
87
+
88
+ ## 隐私与权限
89
+
90
+ - 只允许平台可观测性管理员读取敏感运行数据或治理 IP;通常要求 `Level >= 9999`,最终以可信后端判定为准。
91
+ - 不采集或持久化请求正文、响应正文、QueryString、Cookie、Authorization、Token、密码、Secret 或 API Key。
92
+ - 文件流量只记录清洗后的文件名/扩展名/数量/字节,不记录文件内容。
93
+ - 日志详情由可信后端递归脱敏;AI 回答仍要避免复述连接串、内部路径、个人信息或可用于登录的材料。
94
+ - 对外分享截图前检查帐号、IP、Trace、内部域名、物理路径和业务数据;需要时使用测试数据重新截图。
95
+
96
+ ## 高性能存储规范
97
+
98
+ - 请求热路径只做原子计数和有硬上限的分钟桶聚合;端点、IP、帐号、租户、内容类型限制基数并保留 TOP N。
99
+ - 普通高频明细只保留短窗口内存;错误、慢请求、大文件和可疑传输进入有界队列,异步批量写 MongoDB。
100
+ - 长期趋势使用 MySQL 固定时间桶和确定性幂等键批量 upsert;5 分钟桶保留 48 小时、小时桶保留 45 天、天桶保留 400 天。页面不能每次扫描 Mongo 明细重新聚合总览。
101
+ - 队列必须有硬容量、故障 spool/WAL、停机排空和幂等重放;禁止无界 `ConcurrentQueue` 或逐请求同步写 Mongo/MySQL。
102
+ - Redis 适合短时热点结果、租约和限流;缓存 Key 包含租户、动作和过滤摘要,写入或治理后主动失效,并保留短 TTL 防止永久陈旧。
103
+
104
+ ## 接口引擎归因规范
105
+
106
+ - PC、UniApp、内置微服务、MCP 和应用包中的固定接口必须调用 `/apiengine/{ApiEngineKey}` 或该引擎唯一 `ApiAddress`;新增代码禁止调用 `/api/ApiEngine/Run`。
107
+ - SDK 的普通 `ApiEngine.Run` 必须自动生成真实引擎路径;旧通用入口只能封装在显式 `RunLegacy` 中,供不能立即升级的历史客户端使用。
108
+ - 监控中保留通用入口的兼容识别,但不能依赖读取请求正文才能知道 Key;真实路由、访问日志、限流和流量排行应直接显示接口引擎 Key。
109
+ - 代码审计要区分运行调用与文档/兼容测试;发布门至少扫描 Microi.Client、UniApp、微服务源码、MCP 与应用包,确保没有新增固定业务依赖。
110
+
111
+ 需要压测或修改热路径时同时读取 `../performance-testing/SKILL.md`;排查 V8/日志写法时读取 `../v8-debugging/SKILL.md`。
112
+
113
+ ## AI 诊断顺序
114
+
115
+ 1. 先查 `Capabilities`,确认当前版本和边界。
116
+ 2. 查 `Snapshot`,记录节点、窗口、请求率、活动请求、CPU/内存、队列、HTTP 流量与未归因残差。
117
+ 3. 查 `ApiRank` 和 `TrafficHistory` 的 Endpoint/IP/User/Tenant/ContentType 维度,区分“计算慢”与“传输大”;再用 `TrafficDetails` 定位具体帐号/匿名、IP、接口、文件元数据和 TraceId。
118
+ 4. 按异常接口或 TraceId 查 `Logs`、`Signal`、`Trace`;先处理时间线中的首个根因。
119
+ 5. 对慢 SQL 核对执行计划、索引、返回字段、分页、排序/Join 和锁等待;不要先盲目加 Redis。
120
+ 6. 对高频只读结果评估短 TTL Redis,并明确更新/删除时的失效路径;对写接口先批量化 I/O、缩小事务和消除逐行远程调用。
121
+ 7. 对匿名上传、大响应、重复轮询或攻击信号先核对业务合法性,再限流、对象存储直传/CDN、Range、压缩或封禁。
122
+ 8. 优化后用相同窗口与负载复测 P50/P95/P99、RPS、错误率、CPU、内存、分配率和网络字节,不能只凭单次页面刷新下结论。
123
+
124
+ ## 扩展与商城交付
125
+
126
+ - 普通查询和汇总优先在 `mci-system-observability-query` 接口引擎编排。
127
+ - 只有接口引擎缺少宿主进程、Docker、Mongo 聚合、安全运行态等可复用底层能力时,才扩展最小 V8 原子方法;Controller 不承载业务编排。
128
+ - 官方引擎使用应用包 `ResourcePolicies.ApiEngines=Managed`,客户扩展使用新 Key 或 `CreateIfMissing`,不要覆盖客户已修改的本地代码。
129
+ - 应用包必须包含表、字段、索引/DDL、接口引擎、微服务全部源码、构建产物、菜单和版本日志;安装后回读固定版本快照并在真实页面验收。
130
+ - 后端框架和商城应用是两条升级链:只升级其中一条不能证明功能完整。目标端应先升级兼容框架,再安装/更新最新【系统日志/监控】应用。
131
+
132
+ ## 最低验收
133
+
134
+ - 系统日志位于首个 Tab;统计、筛选、15 条默认分页、搜索、详情、Trace 时间线均可用。
135
+ - 日志详情使用平台级 `Teleport to="body"` 遮罩整个系统框架;标题/副标题最多两行,异常标红并提供原因与解决方案。
136
+ - 七个 Tab 均跟随主题;动画只使用 transform/opacity 等低成本属性,页面隐藏或 `prefers-reduced-motion` 时暂停。
137
+ - MCP 能发现两个专用工具;`Capabilities`、日志/流量分页、Trace 缺参拦截、IP dry-run、错误确认和成功审计均有自动测试。
138
+ - 对请求热路径做开关前后压测,确认观测开启后 P95/P99、CPU、内存和分配率没有不可接受回退;故障 Mongo 不得阻塞业务请求。
139
+ - 多节点、网卡重置/回绕、服务重启、匿名/登录、大上传/下载、敏感字段脱敏、时间桶幂等和缓存失效均有验证证据。
@@ -7,6 +7,8 @@ description: Microi 翻译引擎与多语言词条规范。用于 V8.TranslateEn
7
7
 
8
8
  # Microi TranslateEngine
9
9
 
10
+ 翻译运行时源码位于开源类库 `Microi.Server/Microi.Translate`,NuGet 包名为 `Microi.Translate`。可复用的供应商、租户隔离、缓存和模型契约必须维护在该类库;闭源 `Microi.net` 只允许保留 License 授权或平台私有装配边界,不能重新复制翻译业务实现。
11
+
10
12
  ## API
11
13
 
12
14
  ```js
@@ -111,6 +113,7 @@ MCP 固定工具:`microi_translate`、`microi_detect_language`、`microi_list_
111
113
 
112
114
  ## 验收清单
113
115
 
116
+ - [ ] `Microi.Translate` 能独立编译、打包并由发布脚本推送 NuGet,`Microi.net/TranslateEngine` 不再残留重复源码
114
117
  - [ ] `Translate` 的 `DosResult` 契约处理正确
115
118
  - [ ] 词条优先,动态翻译只用于动态内容
116
119
  - [ ] 普通租户无法伪造 `OsClient`
@@ -63,7 +63,7 @@ description: Microi UI 设计系统指南。用于设计 PC Vue、Element Plus
63
63
  ---
64
64
 
65
65
  <!-- /microi-progressive:chunk -->
66
- <!-- microi-progressive:chunk id=ui-design-002 sha256=4339d981ddbc6340663729c1bd89f6be9f9215fa1c6768260377b6feaf202505 -->
66
+ <!-- microi-progressive:chunk id=ui-design-002 sha256=0d1bac0d19d61d288a6eb25f18fc15a045bca3df9a01399d5ce5224c8accffd3 -->
67
67
  ## 高端视觉标准
68
68
 
69
69
  - 每个新页面必须有首屏视觉重心:核心数据、主任务、产品/品牌对象或可操作内容应在第一屏明确出现,不能只有说明文字或空白装饰。
@@ -75,12 +75,15 @@ description: Microi UI 设计系统指南。用于设计 PC Vue、Element Plus
75
75
  - 导航栏必须和首屏背景属于同一视觉语境:深色英雄区使用深色玻璃或透明暗底导航,浅色内容页才使用浅色导航;导航文字、Logo、搜索框和下拉入口必须截图检查对比度。
76
76
  - 主按钮/胶囊按钮必须使用 `inline-flex` 或等价布局垂直居中,明确 `align-items:center`、`justify-content:center`、稳定高度和 `line-height:1`;不能只靠 padding 让文字“看起来差不多”。
77
77
  - 按钮、标签、Tab、空态行动按钮、登录/授权入口等只要文字语义是居中呈现,就必须同时做到上下居中和左右居中;截图或视觉断言发现文字偏上、偏下、偏左、偏右都算未完成。
78
- - 所有弹窗/对话框默认必须上下左右居中;PC 端应支持通过标题栏拖动,拖动后仍保持在可视区域内;移动端如改为底部抽屉或全屏弹层必须有明确业务理由。弹窗不得贴在左上角、底部或被遮罩/导航/输入框遮挡,截图验收必须覆盖默认居中态和至少一次拖动后的可用状态。
78
+ - 所有弹窗/对话框默认必须上下左右居中;PC 端应支持通过标题栏拖动,拖动后仍保持在可视区域内;移动端如改为底部抽屉或全屏弹层必须有明确业务理由。弹窗不得贴在左上角、底部或被遮罩/导航/输入框遮挡,截图验收必须覆盖默认居中态和至少一次拖动后的可用状态。
79
+ - 菜单微服务中的“平台级详情/确认弹窗”必须通过宿主 `setGlobalOverlay` 能力让遮罩覆盖 Logo、侧栏、顶部页签和内容区,并锁定宿主滚动;子应用自身弹层仍保持可访问焦点、Esc 关闭和 body 滚动恢复。关闭、路由离开、异常及卸载都必须幂等撤销宿主遮罩,禁止只在 iframe/微应用内容矩形内铺一层假全屏遮罩。
79
80
  - 禁止在任何交付界面中直接调用浏览器原生 `window.alert`、`window.confirm`、`window.prompt` 或其无前缀别名。简单提示优先使用吾码平台 `Tips`/`DiyCommon.Tips`,确认操作使用 `V8.ConfirmTips`、Element Plus `ElMessageBox`,独立微服务则使用符合本规范的可访问确认弹层;原生浏览器对话框会阻塞线程、无法主题化,也无法满足吾码视觉与自动化标准。
80
81
  - Toast、错误反馈、提交结果和二次确认必须脱离业务滚动容器:优先 teleport/append 到 `body`,使用 `position:fixed`、明确遮罩和高于宿主弹窗的层级,并在当前可视区域上下左右居中。用户把长弹窗滚到任意位置后仍必须立刻看到完整提示;禁止把反馈放在内容顶部、滚动层内部或仅靠 `top: 0` 伪装固定。
81
82
  - 确认框必须说明“即将执行什么、作用范围、当前任务状态、确认与取消动作”。只有真实检测到正在执行/排队任务时才能写“已有任务”;没有检测到时应明确“提交后新建任务”,并把并发到来时的排队策略作为条件说明,不能用固定模板误导用户。
82
83
  - 同一类 UI 在两个及以上页面出现时,必须优先封装为 `Mci*` 或项目级 `mci-*` 组件,通过 props/slots/events 配置标题、说明、图标、按钮、路由、状态和少量变体;不要复制两份卡片、空态、登录提示、按钮组、筛选栏或底部操作栏。
83
- - 卡片背景必须服务页面氛围:暗色科技背景上的展示卡、价格卡、聊天卡不应突然变成大面积灰白卡;浅色卡片只在整体页面转为浅色内容区时使用,并且要有过渡带或区块背景承接。
84
+ - 卡片背景必须服务页面氛围:暗色科技背景上的展示卡、价格卡、聊天卡不应突然变成大面积灰白卡;浅色卡片只在整体页面转为浅色内容区时使用,并且要有过渡带或区块背景承接。
85
+ - 日志、告警、监控和审计表格的主标题与副标题默认各最多两行,使用 CSS line clamp 与原文 Tooltip/title 保留完整可读性;异常行、异常值和风险标签必须使用主题兼容的红色语义,并在悬停/聚焦时同时说明“可能原因、排查顺序、解决方案”,不能只显示红色数字。
86
+ - 驾驶舱/数据大屏风格必须跟随当前主题令牌并保持紧凑信息密度。持续动效仅允许少量低振幅 `transform`、`opacity`、`background-position`,页面隐藏、微服务 `afterhidden` 或低性能模式时暂停;必须实现 `prefers-reduced-motion` 静态降级,长表格启用虚拟化或 `content-visibility`,禁止每个单元格独立定时器、持续阴影/模糊重绘和高频全量图表重算。
84
87
 
85
88
  ---
86
89
 
@@ -19,7 +19,8 @@ description: Microi V8 接口引擎配置指南。用于设置 ApiEngineKey、Ap
19
19
  | `ParamType` | `form` / `json` / `url` —— 但 V8.Param 都能统一接收 | `Both` |
20
20
  | `IsAnonymous` | 允许匿名调用(无 Token) | `false` |
21
21
  | `StopHttp` | 禁止外部 HTTP 调用(仅允许 V8.ApiEngine.Run 内部调用) | `false` |
22
- | `IsResponseFile` | 是否响应文件(开启后 Data 必须是文件结构) | `false` |
22
+ | `IsResponseFile` | 是否响应文件(开启后 Data 必须是文件结构) | `false` |
23
+ | `ResponseType` | `JSON/String/File/HTML/Stream`;`Stream` 开启 SSE/NDJSON | 自动识别 |
23
24
  | `LockKey` | 分布式锁 Key(同一时刻全集群只能执行一次) | 空 |
24
25
  | `LockTimeout` | 锁超时秒数 | `30` |
25
26
  | `LockMsg` | 加锁失败时返回提示 | `操作过于频繁` |
@@ -35,9 +36,25 @@ description: Microi V8 接口引擎配置指南。用于设置 ApiEngineKey、Ap
35
36
  - 嵌套调用不重复占用全局/租户并发名额,同一调用树重入同 Key 也不会自锁;不同子接口 Key 仍受自己的 Key 并发门保护。
36
37
  - `V8.Limits` 可读取本片有效预算和当前深度。异常优先检查 `DataAppend.V8Limit.Code`,不要看到“2GB”就判断服务器真实吃满 2GB。
37
38
  - 后台任务使用同一执行引擎。总任务可以运行数小时,但单片仍受 `Timeout/MaxStatements/LimitMemory` 约束;超过 10 分钟必须返回 `HasMore + Checkpoint` 分片续跑,不能只把 `Timeout` 调到 1800/3600。
38
- - 接口引擎使用正向 `V8Limit`:默认 `0/false`,不设置当前 Jint Engine 的单次超时、语句、函数递归、累计分配和 Promise 固定等待预算;只有 `1/true` 才应用 `Timeout/MaxStatements/LimitMemory/LimitRecursion`。常驻内存保护、取消令牌、并发、接口嵌套深度、权限沙箱及数据库限制在两种状态下都保留。老 `V8Unlimited` 只作协议兼容;MCP/Manifest 新配置统一写 `v8Limit`。
39
-
40
- ### 通用实时事件(SignalR
39
+ - 接口引擎使用正向 `V8Limit`:默认 `0/false`,不设置当前 Jint Engine 的单次超时、语句、函数递归、累计分配和 Promise 固定等待预算;只有 `1/true` 才应用 `Timeout/MaxStatements/LimitMemory/LimitRecursion`。常驻内存保护、取消令牌、并发、接口嵌套深度、权限沙箱及数据库限制在两种状态下都保留。老 `V8Unlimited` 只作协议兼容;MCP/Manifest 新配置统一写 `v8Limit`。
40
+
41
+ ### 流式响应(ResponseType=Stream
42
+
43
+ ```javascript
44
+ for (var i = 0; i < rows.length; i++) {
45
+ var pushed = await V8.Stream.WriteAsync(rows[i], 'chunk', String(i));
46
+ if (pushed.Code !== 1) return pushed;
47
+ }
48
+ return { Code: 1, Data: { Count: rows.length } };
49
+ ```
50
+
51
+ - 默认协议为 SSE;客户端请求 `Accept: application/x-ndjson` 或 `streamFormat=ndjson` 可使用 NDJSON。
52
+ - `V8.Stream.Write/WriteAsync` 输出的分片统一标记 `Provisional:true`。宿主保留 `open/done/error/heartbeat`,并且只有事务提交后才发送 `done + Committed:true`;收到 `error` 时客户端不得把暂态分片当成已提交数据。
53
+ - 每次写入都要检查 `Code`,客户端断开或超过大小上限后立即停止循环。请求取消会传入当前 Jint 执行链,但不能替代业务幂等和事务。
54
+ - 当前租户在 `sys_osclients` 配置单分片、累计响应和心跳:`ApiEngineStreamMaxChunkKB` 默认 256(4–1024)、`ApiEngineStreamMaxTotalMB` 默认 16(1–256)、`ApiEngineStreamHeartbeatSeconds` 默认 15(5–60)。
55
+ - 流式传输用于在线增量反馈;大型文件走 HDFS/文件响应,可靠长任务走后台任务 + Checkpoint,广播状态走提交后 SignalR。禁止用流式响应绕过这些边界。
56
+
57
+ ### 通用实时事件(SignalR)
41
58
 
42
59
  订单、协作、设备、审批或多人房间需要实时刷新时,业务写命令仍由接口引擎执行并提交事务;成功结果通过 `DataAppend.RealtimeEvent` 声明提交后事件。新业务统一使用通用 v2 Hub `/api-engine-realtime`,不要再新建业务专用 Hub 或把权威状态放进 C# 进程内字典。
43
60
 
@@ -205,11 +222,16 @@ POST /apiengine/{ApiEngineKey}
205
222
  Headers: Content-Type=application/json, osclient={OsClient}, apiengine=1
206
223
  Body: {"Action":"Bootstrap","OsClient":"{OsClient}"}
207
224
 
208
- # 兼容旧入口
209
- POST /api/ApiEngine/Run
210
- Headers: Content-Type=application/json, OsClient={OsClient}
211
- Body: {"ApiEngineKey":"your_key","Action":"Bootstrap"}
212
- ```
225
+ # 仅用于不能立即升级的旧客户端;新增或可修改代码禁止使用
226
+ POST /api/ApiEngine/Run
227
+ Headers: Content-Type=application/json, OsClient={OsClient}
228
+ Body: {"ApiEngineKey":"your_key","Action":"Bootstrap"}
229
+ ```
230
+
231
+ 固定业务接口必须调用 `/apiengine/{ApiEngineKey}` 或该引擎配置的唯一
232
+ `ApiAddress`。禁止新增 `/api/ApiEngine/Run` 依赖,否则反向代理、限流、审计和
233
+ 系统日志/监控只能看到同一个通用入口,难以按真实接口引擎准确归因。SDK 只可在
234
+ 显式命名的 `RunLegacy` 兼容方法中保留旧地址,普通 `Run` 必须生成动态地址。
213
235
 
214
236
  复测重点:
215
237