@microi.net/cli 6.1.6 → 6.1.8
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.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +43 -43
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +4 -4
- package/cordis.patch.yml +1 -1
- package/package.json +82 -82
- package/scripts/mcp-server.js +199 -164
- package/scripts/microi-skills.meta.json +243 -237
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +67 -51
- package/skills/ai-engine/SKILL.md +18 -5
- package/skills/ai-engine/references/ai-employees.md +4 -0
- package/skills/app-store/SKILL.md +10 -1
- package/skills/business-blueprint/SKILL.md +1 -1
- package/skills/job-engine/SKILL.md +15 -0
- package/skills/message-notification/SKILL.md +2 -0
- package/skills/microi-codex/SKILL.md +6 -1
- package/skills/microi-deployment/SKILL.md +64 -18
- package/skills/microi-deployment/references/deployment-matrix.md +7 -1
- package/skills/microi-docs-coverage/SKILL.md +11 -1
- package/skills/microi-frontend-sdk/SKILL.md +12 -0
- package/skills/microi-microservice/SKILL.md +12 -1
- package/skills/microi-mobile-app-quality/references/mobile-first-delivery.md +2 -1
- package/skills/microi-system-delivery/SKILL.md +1 -0
- package/skills/microi-system-delivery/references/context-quality.md +56 -54
- 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 +9 -5
- package/skills/microi-system-delivery/references/progressive-03-/345/256/211/345/205/250/344/270/216/350/267/250/347/253/257/351/252/214/346/224/266.md +65 -65
- package/skills/microi.v8.js +445 -0
- package/skills/module-engine/SKILL.md +13 -0
- package/skills/module-engine/references/module-config.md +17 -0
- package/skills/ocr-engine/SKILL.md +1 -0
- package/skills/playwright-e2e/SKILL.md +2 -0
- package/skills/scripts/sync-public-resource-router.mjs +29 -0
- package/skills/system-observability/SKILL.md +29 -6
- package/skills/translate-engine/SKILL.md +2 -0
- package/skills/v8-api-config/SKILL.md +1 -1
- package/skills/v8-file-upload/SKILL.md +17 -32
- package/skills/v8-file-upload/references/hotspot-offload-operations.md +103 -0
- 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 +2 -2
- package/skills/v8-security/SKILL.md +5 -8
- package/skills/v8-sql-query/SKILL.md +2 -2
- package/skills/workspace-conventions/SKILL.md +154 -136
- 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 +8 -5
- 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 +2 -2
- package/skills/workspace-conventions/references/progressive-04-/345/267/245/344/275/234/345/214/272/344/270/216/345/271/263/345/217/260/344/270/223/351/241/271/344/277/235/351/232/234.md +4 -4
|
@@ -33,6 +33,19 @@ description: Microi 模块引擎与 sys_menu 配置指南。用于创建或修
|
|
|
33
33
|
不得仅因 DOM 有文字就判定回显成功,需验证窄搜索槽位中的真实宽度、90~110 密度、选项
|
|
34
34
|
Key/Label 映射、清除与查询条件一致;不能为修复显示改动实际查询 Key 或业务数据源。
|
|
35
35
|
|
|
36
|
+
操作列按当前页各行真实 DOM 布局取最大宽度,自动响应密度、语言、字体、角标及按钮显隐
|
|
37
|
+
变化;`TableActionFixedWidth` 只作为安全最小值。首帧或隐藏时的字符估算仅为兼容兜底,
|
|
38
|
+
不能用固定字符系数代替已渲染宽度。验收包含最长翻译、最多/最少按钮与刷新后边界。
|
|
39
|
+
|
|
40
|
+
PC 卡片优先选择当前终端 Card 视图,没有时复用 Mobile Card;关键字段通过模块
|
|
41
|
+
`Layout.Card.Fields` 或旧 `MobileListFields` 配置,不在平台组件中按业务表写死。
|
|
42
|
+
配置前核对真实字段、权限和查询返回值;标题/状态之外应保留 2~4 个有判断价值的可读字段,
|
|
43
|
+
相同字段跨区域去重、空区域隐藏。底部按钮保持原配置及显隐,【更多】显示当前语言文字
|
|
44
|
+
与展开图标,不能只剩三点;卡片高度由内容与密度决定,不用大段留白代替缺失字段。
|
|
45
|
+
普通与树形列表的显式查询列均须补齐视图依赖字段,未配置/星号全列查询不能被窄化;
|
|
46
|
+
空白与空多选在展示态隐藏,`0/false` 保留,行内编辑空字段继续可录入。
|
|
47
|
+
验收覆盖小/标准/大密度、长文本、多个行外按钮、明暗主题与桌面/移动布局。
|
|
48
|
+
|
|
36
49
|
## 必读参考
|
|
37
50
|
|
|
38
51
|
- 字段、打开方式、查询配置、ViewSchema 和接口替换:
|
|
@@ -128,6 +128,17 @@ FontWeight/DisplayStyle`。运行时会把引用字段并入 `_SelectFields`;
|
|
|
128
128
|
返回这些字段。多字段模板沿用对应 `diy_field.V8TmpEngineTable`,不在 ViewSchema 内保存
|
|
129
129
|
可执行脚本。
|
|
130
130
|
|
|
131
|
+
桌面采用卡片模式时,优先使用 PC/All 的 Card 视图,没有匹配视图时复用 Mobile Card;
|
|
132
|
+
移动端也保留相反终端的兼容回退。`Fields` 解析到字段时作为正文来源,否则兼容
|
|
133
|
+
`MobileListFields`。标题、头像、顶部、副标题、右侧、正文、Meta 与底部按现有运行时规则
|
|
134
|
+
去重,空值隐藏;不要凭“字段元数据存在”判断已展示,还须检查查询响应与实际页面。
|
|
135
|
+
核心正文建议配置 2~4 个可读业务字段及 `ShowLabel=true`,秘密和内部 Id 不作为装饰信息。
|
|
136
|
+
副标题保留 `ShowLabel/Icon`,正文支持 `ShowLabel=false`;空白与空多选在展示态隐藏,
|
|
137
|
+
`0/false` 仍显示,行内编辑空字段继续可录入。普通与树形列表的显式 `_SelectFields`
|
|
138
|
+
都须补齐视图依赖字段;未配置或 `*` 的全列查询不能因补字段而被窄化。
|
|
139
|
+
操作区必须保留行外按钮、权限与显隐逻辑,【更多】使用本地化文字与展开图标;
|
|
140
|
+
密度切换、长文本、多个按钮和移动断点下不得溢出或只剩难以辨认的图标。
|
|
141
|
+
|
|
131
142
|
PC 复合列的常规高度上限是两行:`Field` 占主行,`Lines` 通常只放 1 项。多个信息组拆成
|
|
132
143
|
多个两行复合列;只有确有层级价值且完成桌面截图验收后,才允许在同一列放第 2 个
|
|
133
144
|
`Lines`。`TrailingFields` 位于右侧,不应被误用成增加纵向信息层级。
|
|
@@ -159,6 +170,12 @@ Hero 必须在 PageTabs 上方渲染。PC 无指标/含指标头部分别为 `44
|
|
|
159
170
|
按钮对象必须有稳定唯一 Id、Sort、Name、显隐逻辑和动作。后台任务按钮还要配置
|
|
160
171
|
ApiEngineKey、Workload、幂等字段、并发 Key、业务状态/任务 Id/进度/ETA 字段。
|
|
161
172
|
|
|
173
|
+
PC 操作列使用当前页每行已渲染按钮、图标、间距、角标与单元格边界的实际宽度,取最宽行;
|
|
174
|
+
`TableActionFixedWidth` 为安全最小值,不能用它截断动态内容。隐藏/未完成首帧测量时才保留
|
|
175
|
+
兼容估算;显示后按实际布局校准。DOM 文本/子节点/样式变化、密度/主题/语言变化、字体加载
|
|
176
|
+
与窗口尺寸变化合帧重测,停用和卸载时清理观察器。回归应覆盖异步翻译、按钮显隐、角标、
|
|
177
|
+
最多与最少按钮行以及卡片切回表格,不能只按中文字符数验证。
|
|
178
|
+
|
|
162
179
|
`PageTabs` 与五类按钮共用统计字段:`BadgeEnabled`、`BadgeApiEngineKey`、`BadgeValuePath`、`BadgeField`、
|
|
163
180
|
`BadgeTone`、`BadgeColor`、`BadgeMax`、`BadgeShowZero`、`BadgeRefreshSeconds`。接口一次接收当前页 `Ids` 与
|
|
164
181
|
`ButtonKeys`,推荐返回:
|
|
@@ -91,6 +91,7 @@ return {
|
|
|
91
91
|
- OCR 宿主机端口只绑定 `127.0.0.1`;Docker 化 API 与 OCR 同时加入 external bridge 网络 `microi-ocr`,一键安装的内部 endpoint 固定为 `http://microi-install-ocr:8080/ocr`。不得通过公网/LAN 回环调用同机 OCR。
|
|
92
92
|
- `install-microi.sh` 默认尝试安装 OCR,但先部署 API/Web 并通过 liveness、完整 `ServerVersion` 升级链和 readiness。随后必须依次满足“固定镜像拉取并回读为 amd64 → OCR healthy → Upgrade29 的 9 个物理字段数据库回读 → 唯一活动主租户 → 配置写入后回读 → API 重启 readiness”才设置 `OcrEnabled=1`;任一步失败都保持 OCR 能力关闭并记录警告,但不得中断已经可用的核心平台。字段每秒回读一次且最多 15 秒;正常升级应首轮命中,镜像过旧或迁移失败应快速关闭 OCR,禁止无意义等待 5 分钟。不要用安装脚本直接伪造 `diy_field` 元数据绕过 Upgrade29。
|
|
93
93
|
- API/Web 官方浮动 `latest` 必须在 Compose 启动时强制回源拉取,避免旧本机镜像缺少 Upgrade29。核心门禁失败时输出“安装未完成”恢复汇总并保留非零退出码;OCR 字段、服务或配置门禁失败时,成功汇总明确显示“OCR SaaS 未启用”和附加能力警告。两种汇总都不是启用 OCR 的依据。
|
|
94
|
+
- 内存保护优先于默认安装:新安装识别物理内存低于 7680MiB 或模型启动前可用内存低于 2048MiB 时,OCR 和翻译在本次安装始终保持停用,已有同名安装容器精确停止并关闭自动重启,保留卷和数据;核心升级后只对唯一活动主租户设置 `OcrEnabled=0` 并回读,再刷新 API。不要因停止后可用内存增加或存在 Swap 而重新启用,也不要在降级主机继续触发真实 OCR 推理。内存充足时 OCR Compose 默认限制 1024MiB RAM、1536MiB RAM+Swap、0.75CPU,且原生数学库线程为 1。
|
|
94
95
|
- OCR 使用固定不可变版本,不加入只跟踪 API/Web 浮动标签的 Watchtower 自动更新列表;升级镜像时先发布新 tag、匿名回读 digest/架构,再修改 Compose 与安装器。
|
|
95
96
|
- 登录国内镜像源必须从本机发布配置读取凭据并走 `docker login --password-stdin`,不得输出密码。推送成功不是发布验收,必须使用隔离的匿名 Docker config 回读 manifest/digest,必要时再做匿名拉取。
|
|
96
97
|
- 不要在内存不足的共享开发机上直接构建模型镜像。构建前检查物理内存、Docker 占用与同类进程;保留至少 `max(6 GB, 物理内存 20%)`,不足时延后构建而不是停止他人服务。
|
|
@@ -7,6 +7,8 @@ description: 按 Microi 系统真实业务逻辑进行 Playwright 全自动化
|
|
|
7
7
|
|
|
8
8
|
# Microi 吾码 Playwright E2E 自动化测试
|
|
9
9
|
|
|
10
|
+
用户浏览器的扩展、连接或控制能力不可用时,必须执行 [浏览器不可用时继续交付](../workspace-conventions/SKILL.md#浏览器不可用时继续交付强制入口):尝试宿主内置浏览器,展示需要用户登录的页面,并继续独立的 MCP、源码与验证工作。明确的安全拒绝不属于可换工具绕过的能力故障;等待登录、页面打开或接口成功都不能冒充业务验收完成。
|
|
11
|
+
|
|
10
12
|
桌面人工补充或新建浏览器验收默认只选一个常规 CSS 视口:优先复现用户实际浏览器尺寸,未知时用 1920×1080。截图文件像素还受设备缩放影响,不能据此强制 4K;仅用户明确要求或问题涉及超宽屏时追加 4K,移动端或响应式改动按需补充相关窄屏。沿用已有有效验收,不为截图分辨率重复整套用例;正式脚本既有 Full 不在运行中删减。核心发布已冻结后,新增规范文案独立交付,不因此重启合格候选的构建、测试或上传。
|
|
11
13
|
|
|
12
14
|
每轮测试成功、失败、取消或中断退出时,在 `finally` / teardown 中关闭本任务 browser/context 和临时写入进程,再按 [测试临时文件随任务清理](../workspace-conventions/SKILL.md#测试临时文件必须随任务清理强制) 删除本任务 `.tmp` 下的一次性脚本、夹具及无用途的截图、trace、video、日志和编译副本。交付必需证据先最小归档并回读,失败排查只暂留有明确归属和清理时机的最小集合;报告和截图路径规则不构成永久保留许可,结束后必须单独验收清理结果。
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import crypto from 'node:crypto';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
|
|
6
|
+
// Single-file SDKs retain their delivery contract; only this generated router block is synchronized.
|
|
7
|
+
const args = process.argv.slice(2), write = args.includes('--write');
|
|
8
|
+
function option(name, fallback) { const at = args.indexOf(name); return at < 0 ? fallback : args[at + 1] || (() => { throw Error('Missing ' + name); })(); }
|
|
9
|
+
const root = path.resolve(option('--root', path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..')));
|
|
10
|
+
const routerPath = path.resolve(option('--router', path.join(root, 'Microi.Client/src/utils/public-resource-router.mjs')));
|
|
11
|
+
const bytes = fs.readFileSync(routerPath), router = bytes.toString('utf8');
|
|
12
|
+
if (/^import\s/m.test(router) || /^export (?!function )/m.test(router)) throw Error('RouterModuleShapeChanged');
|
|
13
|
+
const sha = crypto.createHash('sha256').update(bytes).digest('hex');
|
|
14
|
+
const generated = '// BEGIN GENERATED PUBLIC RESOURCE ROUTER; source SHA256 ' + sha + '\n'
|
|
15
|
+
+ 'const createSdkPublicResourceClient = (() => {\n' + router.replace(/^export function /gm, 'function ')
|
|
16
|
+
+ '\nreturn createPublicResourceClient;\n})();\n// END GENERATED PUBLIC RESOURCE ROUTER';
|
|
17
|
+
const marker = /\/\/ BEGIN GENERATED PUBLIC RESOURCE ROUTER; source SHA256 [a-f0-9]{64}\r?\n[\s\S]*?\/\/ END GENERATED PUBLIC RESOURCE ROUTER/g;
|
|
18
|
+
const paths = ['microi.skills/microi.v8.js', 'microi.uniapp/src/utils/microi.v8.js', 'Microi.Server/OfficialApplications/PlatformService/src/utils/microi.v8.js'];
|
|
19
|
+
const pending = paths.map(relative => {
|
|
20
|
+
const full = path.join(root, relative), text = fs.readFileSync(full, 'utf8');
|
|
21
|
+
const blocks = [...text.matchAll(marker)]; if (blocks.length !== 1) throw Error('ExpectedSingleRouterBlock:' + relative);
|
|
22
|
+
const nl = text.includes('\r\n') ? '\r\n' : '\n';
|
|
23
|
+
const block = generated.replace(/\r?\n/g, nl);
|
|
24
|
+
return { path: relative, full, text, next: text.replace(marker, () => block) };
|
|
25
|
+
});
|
|
26
|
+
const changed = pending.filter(item => item.text !== item.next);
|
|
27
|
+
if (!write && changed.length) throw Error('SdkRouterOutOfDate:' + changed.map(item => item.path).join(','));
|
|
28
|
+
if (write) for (const item of changed) fs.writeFileSync(item.full, item.next);
|
|
29
|
+
console.log(JSON.stringify({ mode: write ? 'write' : 'check', routerSha256: sha, sdkCount: paths.length, changed: changed.map(item => item.path) }));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: system-observability
|
|
3
|
-
description: Microi
|
|
3
|
+
description: Microi 系统日志/监控查询、诊断与治理规范。用于日志、Trace、CPU/内存/OOM、网络流量、安全事件,以及 OSS/CDN 高下载文件归因、NAS 热点分流与完整日费用验收。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
> **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
|
|
@@ -201,6 +201,12 @@ UnblockIp:<ip>
|
|
|
201
201
|
|
|
202
202
|
## 接口引擎归因规范
|
|
203
203
|
|
|
204
|
+
OSS/CDN 高费用、文件下载榜单和 NAS 分流还须读取
|
|
205
|
+
[文件资源分流操作流程](../v8-file-upload/references/hotspot-offload-operations.md)。
|
|
206
|
+
通过受管 `mci-cdn-manager` 核对流量来源及账单,通过 `mci-file-resource-runtime`
|
|
207
|
+
检查资格、复制及实际路由;完整自然日、当天部分账单和一次性复制成本分开记录。
|
|
208
|
+
已有通用 `microi_run_engine` 复用当前租户鉴权,不另建云凭据或旁路 HTTP 工具。
|
|
209
|
+
|
|
204
210
|
- PC、UniApp、内置微服务、MCP 和应用包中的固定接口必须调用 `/apiengine/{ApiEngineKey}` 或该引擎唯一 `ApiAddress`;新增代码禁止调用 `/api/ApiEngine/Run`。
|
|
205
211
|
- SDK 的普通 `ApiEngine.Run` 必须自动生成真实引擎路径;旧通用入口只能封装在显式 `RunLegacy` 中,供不能立即升级的历史客户端使用。
|
|
206
212
|
- 监控中保留通用入口的兼容识别,但不能依赖读取请求正文才能知道 Key;真实路由、访问日志、限流和流量排行应直接显示接口引擎 Key。
|
|
@@ -231,17 +237,32 @@ UnblockIp:<ip>
|
|
|
231
237
|
|
|
232
238
|
### CDN 模块
|
|
233
239
|
|
|
240
|
+
- 官方 Chromium 分流仅限 `static.itdos.com/openclaw/chromium/` 的 137.0.7151.68 三平台精确 ZIP。先核三份真实 native Ready/raw SHA/大小/SourceRevision/TargetConfigHash 与独立公有回退,再以 `ChromiumRedirectState` 和逐平台 `Preview → Submit` 安装;各平台保留原 RequestKey/Id/ConfigId/RequestId。Unknown 只回读,回滚必须使用本平台原成功操作 Id,禁止同形认领或全域改写。外部云控制台写者不受域租约约束;真实旧 URL 两跳、NAS HEAD/Range 和完整日账单分别验收。
|
|
241
|
+
- 七种官方空库的 `mci-file-resource-empty-database-download` 只映射固定 Database 枚举和公开 `install/microi_empty_*.sql.zip`,当前可信原生副本可用才返回 NAS 与完整性 Header,否则回官方 CDN。它不复制、不签私链、不接收任意 URL。MCP 复用 run/save/官方包发布工具,不新增通用代理。
|
|
242
|
+
|
|
243
|
+
- 回源路径只读诊断使用管理员入口 `mci-cdn-manager` 的固定 `OriginRouting` 动作,仅传 `Provider:aliyun` 与一个精确 `Domain`;先确认 `Capabilities.Providers` 内阿里云 `Features.OriginRouting=true`。旧 `Configs` 五项不变,禁止开放云 Action、FunctionNames、Endpoint、凭据或分页任意覆盖。
|
|
244
|
+
- `ConfigurationReadComplete` 只表示固定配置集合读取完整;缺失、云失败、分页/截断或超限不能解释成零规则。保留规则 `ConfigId/ParentId/Status/Index/sequence`。条件、源站组、EdgeScript/EdgeRoutine 与未知参数作为待审证据,绝不回传脚本、敏感 Header/查询值或原始 IP。
|
|
245
|
+
- 同一 OSS 源不代表同对象路径;`EffectiveObjectMappingVerified/AutomaticAliasRoutingAuthorized` 固定为 false。必须另验 Host、路径、条件关联、当前公开权限及内容身份后才可能配置别名;本动作不复制、不公开、不分流。三条 Managed 引擎经系统日志应用包交付,通用 MCP 已可调用,不为诊断另发 C#、npm 或后端镜像。
|
|
246
|
+
|
|
247
|
+
|
|
234
248
|
- 现有 `microi-platform-service` 的系统日志页增加 CDN Tab;不另建同名应用。固定管理员入口为 `mci-cdn-manager`,内部 `mci-cdn-core / mci-cdn-aliyun / mci-cdn-worker` 均 `StopHttp=1`,四个引擎归 `app.microi.sys-log` 的 Managed 资源。
|
|
235
|
-
- 通过当前租户 MCP 的 `microi_run_engine` 先查 `Capabilities`,再使用 `Domains / Trend / ReportList / Reports / Sls / Configs / Config / Rules / Operations`。现有执行、源码、元数据及发布工具已覆盖此模块,不为 CDN 新增旁路鉴权或通用 HTTP 代理。
|
|
249
|
+
- 通过当前租户 MCP 的 `microi_run_engine` 先查 `Capabilities`,再使用 `OriginRouting / Domains / Trend / Usage / CacheHit / OriginTraffic / Billing / StorageHealth / StorageLogs / Logs / LogDelivery / ReportList / Reports / Sls / Configs / Config / Rules / Operations`。现有执行、源码、元数据及发布工具已覆盖此模块,不为 CDN 新增旁路鉴权或通用 HTTP 代理。
|
|
236
250
|
- 凭据优先级为当前租户 `Integration.Cdn.Aliyun.*` 完整私密组 → `Integration.Dns.Aliyun.*` 私密组 → 当前租户 SaaS 的兼容 DNS 字段。半组配置必须失败,不能混组或回退主租户。新增密钥写 `mci_system_setting` Secret,由可信后端解密到后端 `ServerPrivateSettings`;不返回原文。
|
|
237
|
-
-
|
|
251
|
+
- 用量与金额分开:`Trend` 带宽点不能按小时积分冒充流量;`Usage(Field=traf)` 的字节量才用于流量合计,金额读取 `Billing`,禁止统一乘固定单价标为实际费用。`Usage` 接受 `UsageType`(不是平台保留参数 `Type`)、`DataProtocol`、`Field`、`Area`;流量/带宽只允许 all 类型与协议,请求数只允许 all 地区。UTC 起止时间与实际 `DataInterval` 必须保留;300/3600/86400 秒的 Usage 单次跨度分别不超过3/7/31天。`CacheHit/OriginTraffic` 同粒度跨度为3/31/366天,不传 Area,单位分别为百分比/字节。
|
|
252
|
+
- `Billing.Kind` 固定为 `Overview/Instance/Packages/PackageUsage`,返回 `Data.Result`。先用 `BillingCycle=YYYY-MM` 概览发现产品代码,再按 `ProductCode` 查 `Instance` 的 MONTHLY/DAILY 计费项;DAILY 的 BillingDate 必须属于账期。MaxResults不超过300,完整消费NextToken;Packages用Page/PageSize,PackageUsage绑定InstanceId、以中国站账单时间格式原样查询并将NextToken映射LastToken。应付PretaxAmount、原价PretaxGrossAmount、实付PaymentAmount和资源包抵扣不混用;当前包列表不证明历史抵扣,当月暂计、数据延迟、权限失败不伪造为零。
|
|
253
|
+
- 账单API固定后端`business.aliyuncs.com/2017-12-14`,复用当前租户完整凭据,不接受客户端Endpoint/密钥。概览、实例明细、资源包与抵扣权限分别为`bss:DescribeBillList`、`bssapi:DescribeInstanceBill`、`bss:DescribeInstances`、`bss:FrDeductLogQueryRequest`;权限不足显式返回,不自动扩权。诊断同时拆分CDN下行与OSS的NetworkOut/CdnOut,后者分别为公网流出/向CDN回源流出;CDN处置无法阻止OSS直连,不能单凭高流量认定攻击。
|
|
254
|
+
- Aliyun 运营报表 ID:1/3 URL 请求/流量、5/7 Referer 请求/流量、9/11 回源 URL 请求/流量、13/15 IP 请求/流量、17 域名、19 PV/UV、21 地区、23 运营商。定制免费,通常次日6点后产出且不补订阅前数据;未订阅不能伪造成零流量,也不能将历史 TOP 当作分钟级规则数据;未知流量单位保持原始值。
|
|
255
|
+
- 报表订阅是账号唯一任务:先读`DescribeCdnSubList`,保留旧domains/reportId及时间边界,显式合并新域名;没有任务用CreateCdnSubTask,已有任务用UpdateCdnSubTask(没有SubId入参)。按集合、enable状态和有效期严格回读,禁止substring判断;省略DomainName会扩大到全账号,不能据此实现单域订阅。已有all、停用或过期任务须保留并明确处理范围,不暗中缩小或重新启用。
|
|
238
256
|
- 报表参数按类型分开:只有 13/15 传非空 Area,1/3/9/11 传非空 HttpCode,21/23 传 IsOverseas;17 不传 DomainName。不得统一附加无关或空筛选项,否则阿里云返回 InvalidParameter。内嵌调用的 V8.Param 可能是 CLR JObject,不向它写入配置对象,创建独立 JS 请求并从服务端读取接入配置。
|
|
239
|
-
-
|
|
240
|
-
-
|
|
257
|
+
- `LogDelivery`只读发现实时投递,Unauthorized不等于未开通。`Logs`只返回离线日志元数据,最近31天、单次一天、每页最多100,按HasMore完整分页;不返回LogPath。独立管理员`LogDownload`必须绑定同域/同窗云端清单的精确LogName,临时DownloadUrl仅供受控审计进程,不进入前端、日志、安装包或公开报告;原始日志有界流式读取并去除查询凭据。离线日志不是实时自动封禁来源。
|
|
258
|
+
- `StorageHealth`从当前租户SaaS读取公私桶/Endpoint、日志与存储统计;不接受客户端覆盖桶/Endpoint/凭据,多环境歧义停止。`ProbeInternal=true`仅探测同地域固定内网候选,保持SSRF保护;分区标签不证明内网可用,失败不自动改配置。`StorageLogs(StorageScope=Public|Private,Day,Marker)`按真实日志配置的日期前缀只读列举,每页1000,完整消费HasMore/NextMarker;未开通与错误区分。`StorageLogDownload`仅匹配当前页精确LogName、单文件≤128MiB,5分钟签名仅给受控流式脱敏进程,不进UI/日志/报告。对象/IP/UA/时段证据与账单分别核对,不能把SDK重复下载当成攻击,也不能把公网Endpoint全部流量推定为公网计费。
|
|
259
|
+
- `RuleJson.Source=CDN` 为域名站内预警:固定 bytes/fixed/observe,窗口为5分钟倍数,延迟15分钟取Usage traf/all,并要求完整300秒样本。连续命中/冷却/稳定EventId防重复,固定当前租户Account=admin超管和MsgKey=cdn_traffic_alert;`AlertPending/AlertSent/AlertFailed`及ResultJson中的真实msg_event Succeeded/Failed/LogIds分开记录。失败保存LastError/LastFailureAt且不推进窗口;观察、排队或接口成功不能冒称消息送达。
|
|
260
|
+
- `RuleJson.Source=SLS` 只用固定查询模板与已校验域名/项目/地域/Logstore;基于`remote_ip`、`response_size`及独立全窗口聚合健康,返回HealthComplete/TotalRequests/DeliveryNotGuaranteed。Truncated、MissingBytes、日志不新鲜、查询不完整或动态基线不足只观察不封禁;查询完成不等于投递完整。保留连续命中、白名单、冷却与限额;私网/环回/链路本地/组播/未指定地址、IPv4映射IPv6与保护CIDR均受保护,默认观察。
|
|
261
|
+
- 云端变更先`Preview`再`Submit`,RequestKey必须绑定同一命令内容;保留既有黑名单、模式与ip_acl_xfwd语义,缺省xfwd按on失败关闭。配置快照比较、独立持久状态不可省略;所有规则评估共享规则租约,域操作900秒租约在写前续租并在锁内重查限额。超时/崩溃记Unknown且只读Reconcile,不自动重发;Reconcile仅接受Running/Unknown/AwaitingVerification,不复活终态。到期只回收本应用新增条目,含Running/Unknown的重叠持有延后回收;轮询须有界且公平,不能让最新未知项饿死旧操作。
|
|
241
262
|
- CMS 历史公有媒体的专用动作是 `RefreshCmsMedia/CmsRefreshStatus`;先验证 Capabilities 的 `CmsMediaRefresh/CmsRefreshTaskReadback`。管理员只能提交 `RendId/CmsTaskId`;服务端必须从当前租户已 Offline 的衍生、同站/同版本/同 InputHash 的原源删除检查点、可信 FileServer 与 `/当前租户/mci-cms-public/` 路径计算唯一旧 URL。拒绝任意 URL/目录/正则/客户端任务 Id/云密钥;普通 CMS 角色不能进入管理员入口,内部调用仍须重查权威撤销记录。
|
|
242
263
|
- 云刷新前独立提交操作请求键、租约、原任务快照和 `CloudWriteStarted`;未知只读回原任务,不重复云写入。缺失 TaskId 仅可依据原 URL、执行时间与前快照恢复唯一新任务,歧义保持 Unknown。任务全部 Complete/100%、原 URL 严格 HTTP404 后,CMS 还必须重查源对象不存在和当前发布权限,并在站点锁内消费当前租户权威 outbox。客户端 CacheVerified 标记、隐藏前台、源404、刷新受理或加随机参数404均不能作撤权成功。用户保存/下载副本不可召回。
|
|
243
264
|
- 精确文件刷新通常约5~6分钟;单 URL 入口保留默认每日10,000文件刷新额度、50QPS写入与5QPS任务读取边界,任务历史仅3天且同秒同 URL 任务可能合并,不假定请求与 TaskId 一一对应。刷新本身无独立费用,回源对象存储请求/流量仍可能计费。以阿里云 [RefreshObjectCaches](https://www.alibabacloud.com/help/en/cdn/developer-reference/api-cdn-2018-05-10-refreshobjectcaches)、[DescribeRefreshTasks](https://www.alibabacloud.com/help/en/cdn/developer-reference/api-cdn-2018-05-10-describerefreshtasks)及[刷新预热说明](https://help.aliyun.com/zh/cdn/user-guide/refresh-and-prefetch/)核对实际额度。验收先 warm 自有测试旧 URL 至真实缓存命中,再原请求撤回,保留源删除后旧 URL 仍200的红证、云任务与原 URL404绿证;Node模型通过不能替代真实云端。
|
|
244
|
-
- 单域名
|
|
265
|
+
- 单域名IP黑名单与账号范围严格分开;`GlobalBlock/GlobalUnblock`当前禁止写入,未具备账号级共享租约、限额及完整保护配置时不得以单域预览代替。海量服务需阿里云开通,验收不自动开通付费服务。`limit_rate`是至少100 KB/s的下载速率,不是QPS;日志规则也不等于实时边缘WAF。
|
|
245
266
|
- `mci-cdn-security-tick` 回收到期封禁;每条启用规则通过 `V8.Method.SaveScheduleJob` 创建错峰任务并使用独立数据库租约。安装包包含基础调度及三张表的结构,不带云密钥、规则实例、白名单或任何测试 IP。
|
|
246
267
|
- 验收分开记录 Node 行为测试、真实管理员/云端只读、文档保留 IP 的受控封禁/到期恢复、真实宿主页面、包正文 SHA 与安装。日志未投递或海量服务未开通时,如实标为待配置,不伪造云端通过。
|
|
247
268
|
|
|
@@ -262,3 +283,5 @@ UnblockIp:<ip>
|
|
|
262
283
|
- 对请求热路径做开关前后压测,确认观测开启后 P95/P99、CPU、内存和分配率没有不可接受回退;故障 Mongo 不得阻塞业务请求。
|
|
263
284
|
- 多节点、网卡重置/回绕、服务重启、匿名/登录、大上传/下载、敏感字段脱敏、时间桶幂等和缓存失效均有验证证据。
|
|
264
285
|
- 内存专项至少覆盖:V8 限制关闭的复杂执行、真实 Kestrel TraceId、500 个活动请求、异步嵌套归属、独立采集栈、Mongo 故障、执行中强杀、改名重启、跨节点补传、旧快照重放和租户隔离。
|
|
286
|
+
|
|
287
|
+
- 原生签名状态必须先对原始 UTF-8 JSON 字节验 HMAC,再以保留小数精度及字符串日期的设置解析;禁止先解析重序列化后验签,否则 SaaS decimal 阈值 1.000000 变为 1.0 会使后台泵停摆。修复读取器时保留既有回执,不手工改写状态或 Ready。
|
|
@@ -74,6 +74,8 @@ LibreTranslate 是动态翻译供应商,不是 `diy_lang` 的替代品。一
|
|
|
74
74
|
|
|
75
75
|
用户可追加经过白名单校验的语言 Key。语言越多,首次模型下载越慢;一键安装不得等待模型下载或 HTTP 就绪。应先用同版本镜像独立初始化持久化 `api_keys.db`、写入并回读随机 API Key,再启动正式容器并确认其进入运行状态,让语言模型在容器中继续初始化,不阻塞吾码主体安装。
|
|
76
76
|
|
|
77
|
+
默认部署服从内存保护:新安装的物理内存低于 7680MiB 或模型启动前可用内存低于 2048MiB 时,本次安装始终停用 OCR/LibreTranslate,不拉取/初始化/启动模型;已有同名安装容器精确停止并关闭自动重启,保留模型和密钥库。核心升级后唯一活动主租户的 `TranslateProvider` 设置为 `None` 并回读,再刷新 API;保留 URL/Key,不能写空 Provider,因为空值会按保留 URL 自动回退。内存保护已触发时不做真实模型推理验收。内存充足时 LibreTranslate 默认限制 768MiB RAM、1280MiB RAM+Swap、0.75CPU,保持 `LT_THREADS=1` 和原生模型单线程;Swap 不计入物理内存准入。
|
|
78
|
+
|
|
77
79
|
服务端统一从 SaaS 引擎租户配置读取 `TranslateProvider`、`TranslateUrl`(兼容 `TranslateApiUrl` / `LibreTranslateUrl`)、`TranslateApiKey`(兼容 `TranslateKey`)和 `TranslateTimeout`;不要再为翻译供应商增加 API 容器环境变量。密钥不得进入前端、日志或文档示例的固定默认值。
|
|
78
80
|
|
|
79
81
|
一键安装先部署平台 API/Web,并通过 liveness、完整 `ServerVersion` 升级链和 readiness;随后才预初始化并回读 API Key 数据库、启动 LibreTranslate 容器,再回读 Upgrade31 的 4 个翻译物理字段。字段每秒回读一次且最多 15 秒,正常升级应首轮命中,镜像过旧或迁移失败应快速关闭翻译能力。只有数据库回读确认字段已存在,才能把当前 `OsClient` 的 `TranslateProvider=LibreTranslate`、Docker 内网 `TranslateUrl`、匹配的 `TranslateApiKey` 和超时写入并立即回读一致性。禁止在 API/Upgrade 启动前直接更新新字段,也禁止遇到 `Unknown column` 后由安装器伪造元数据。LibreTranslate 的网络、镜像、Key、容器、字段或配置任一步失败都应保持翻译能力未启用、记录附加能力警告并继续核心安装。日志只显示 Provider 与 URL,禁止输出密钥。模型尚未完成时翻译能力可以暂时不可用,但不得拖住其它服务的安装。
|
|
@@ -244,7 +244,7 @@ ApiAddress: /saml/{OsClient}/sp/{ConnectionKey}/metadata
|
|
|
244
244
|
|
|
245
245
|
开启后接口可直接输出二进制流:
|
|
246
246
|
|
|
247
|
-
后端会统一处理响应头和文件头校验:图片/PDF 浏览器直接打开,其它文件下载;V8 代码只返回文件三字段,不要在接口里手写复杂的魔数判断。`ContentType`
|
|
247
|
+
后端会统一处理响应头和文件头校验:图片/PDF 浏览器直接打开,其它文件下载;V8 代码只返回文件三字段,不要在接口里手写复杂的魔数判断。`ContentType` 必须匹配真实字节,第三方 PLM `KD_C_PLM` 等业务封装流不能伪装成 `application/pdf`。
|
|
248
248
|
|
|
249
249
|
响应文件动态路由必须同时接受 `GET` 和 `HEAD`。OnlyOffice 等服务端预览器可能先用 `HEAD` 探测文件类型、长度和可达性;如果浏览器直接下载正常但 `HEAD` 返回 `405`,在线预览仍可能一直停在“加载文档”。
|
|
250
250
|
|
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: v8-file-upload
|
|
3
|
-
description: Microi V8 与 MCP
|
|
3
|
+
description: Microi V8 与 MCP 文件上传下载指南。用于流式发布、私有文件、HDFS/OSS/MinIO/S3,以及 OSS/CDN 费用治理、FileServerBak 热点自动复制与持续 NAS 分流、实际消费验收。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
> **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
|
|
7
7
|
|
|
8
8
|
# Microi V8 文件上传下载
|
|
9
9
|
|
|
10
|
+
## OSS / CDN 费用与 NAS 分流入口
|
|
11
|
+
|
|
12
|
+
用户要求降低 OSS/CDN 流量费用、把高下载模型/JS/图片/视频转到 NAS,或询问
|
|
13
|
+
“1 GiB / 24 小时配置在哪里”时,使用已有热点分流能力。先读
|
|
14
|
+
[热点分流操作流程](references/hotspot-offload-operations.md),再核对本文的原生权限和依赖边界。
|
|
15
|
+
系统设置 `/system-config` 的 `FileServerBakThresholdGiB`、`FileServerBakWindowHours`
|
|
16
|
+
控制初次资格;`FileServerBak` 是备用 HTTPS origin。可信达标后低流量不撤回 NAS 偏好。
|
|
17
|
+
只复制、保存配置或发布页面都不等于实际入口已走 NAS,也不等于完整日费用已下降。
|
|
18
|
+
|
|
10
19
|
## 源码仓库资源隔离(默认强制)
|
|
11
20
|
|
|
12
21
|
截图、配图、PDF/PPT、音视频、压缩包、模型、安装包和其它大体积交付资源统一通过 MCP 上传 CDN,禁止提交到 Gitee/GitHub 源码历史,即使压缩到小于 1 MB 也不能把截图或附件改放源码仓库。官方资源使用已校验的 `microi_itdos`(`https://api.microi.net + OsClient=iTdos`)公有桶与 `https://file.microi.net` 前缀;私有资料按租户实际权限保持私有。源码只存 URL、字节数、SHA-256、MIME 等轻量清单。上传后独立回读实际字节和类型,PDF 验证 Range;超过 Base64 协议容量使用流式/分片工具。暂存区及每个待推送提交都须排除资源本体,详细门禁遵循 [工作区默认 CDN 规范](../workspace-conventions/SKILL.md#截图与大体积资源必须走-cdn默认强制)。
|
|
@@ -17,14 +26,13 @@ description: Microi V8 与 MCP 文件上传下载指南。用于处理流式 AI
|
|
|
17
26
|
|
|
18
27
|
公开入口覆盖 `V8.uploadFile`、多文件 `V8.uploadFiles` 与 MCP `microi_upload_file_base64`。多文件上传必须限制并发、逐文件返回结果;Base64 工具只接受明确文件名、大小和租户内目标范围,写后回读路径、大小与哈希。
|
|
19
28
|
|
|
29
|
+
公开运行资源的备用地址只通过 `V8.Method.GetPublicResourceBackupUrl({FilePathName:'tenant/micro-app/app/index.html'})` 只读选择,返回 `{Code:1,Data:{UseBackup,Url}}`。只允许 `FilePathName`,不能传 URL、Ready、SHA、流量、凭据或用户身份;当前公开应用、完整版本清单、签名副本与 NAS 健康必须同时匹配。`UseBackup=false`、异常或旧后端缺少该能力时继续原公开地址,不把 `FileServerBak` 非空或目录存在当作可用副本;该方法不复制对象、不读取私有文件,也不授予管理权限。管理和迁移仍走已有受信任应用接口,并分别回读副本完整性与真实消费结果。
|
|
30
|
+
|
|
20
31
|
## MCP stdio 与完整包的传输边界
|
|
21
32
|
|
|
22
|
-
- 标准 MCP 服务的 stdio 使用固定 `128 MiB`(`134217728` 字节)未解析 JSON-RPC 缓冲,超过边界立即拒绝并关闭连接;不读取动态环境变量放大。SDK
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
任意 `64 MiB` 包响应都通过,也不能把它当成 HDFS `256 MiB` 应用包能力的新上限。
|
|
26
|
-
- 已存在的正规完整包协议仍可使用 `PreparedPersistPackageByteBase64`;先按精确正文计算编码和整个请求/响应字节数,保留版本、CAS、哈希、HDFS 回读及快照 finalize。
|
|
27
|
-
连接关闭属于结果未知,先回读同版本、同请求身份,不能换请求键盲重传。
|
|
33
|
+
- 标准 MCP 服务的 stdio 使用固定 `128 MiB`(`134217728` 字节)未解析 JSON-RPC 缓冲,超过边界立即拒绝并关闭连接;不读取动态环境变量放大。SDK 调用端若仍使用默认 `10 MiB` 缓冲,大响应仍可能关闭客户端,必须核对调用端支持的真实边界。
|
|
34
|
+
- 该限制计算 UTF-8 wire 字节,包含完整 JSON 信封、Base64 和重复 `Data/Result` 正文。单个 Base64 字段的理论原始字节上限约 `96 MiB` 减信封,不能据此保证任意 `64 MiB` 包响应都通过,也不能把它当成 HDFS `256 MiB` 应用包能力的新上限。
|
|
35
|
+
- 已存在的正规完整包协议仍可使用 `PreparedPersistPackageByteBase64`;先按精确正文计算编码和整个请求/响应字节数,保留版本、CAS、哈希、HDFS 回读及快照 finalize。连接关闭属于结果未知,先回读同版本、同请求身份,不能换请求键盲重传。
|
|
28
36
|
- 超过 wire 能力的源码、运行资产优先使用已有目录/文件 stream 或分片协议及其
|
|
29
37
|
小型指针/回执,不把私有源码、超大资产常态化塞入 JSON/Jint;支持更大正文的其它
|
|
30
38
|
连接也须有明确边界。不能用增大stdio缓冲绕过能力鉴权、业务配额或包完整性检查。
|
|
@@ -247,31 +255,8 @@ Unity `Data`、WASM、Windows 安装包、视频模型等发布资产不得进
|
|
|
247
255
|
- 生产 H5 不能只依赖 `uni.uploadFile`。页面从 `uni.chooseImage` 得到的 `tempFiles[0].file`、`tempFiles[0]`、`blob:` / `data:` 临时路径都要传给 `V8.uploadFile`,并设置 `preferFetch:true`;SDK 必须能用 `fetch + FormData` 兜底,否则线上可能报 `未找到 MicroiV8 上传适配器。`。
|
|
248
256
|
|
|
249
257
|
<!-- /microi-progressive:chunk -->
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
文件柜、文件同步等需要连接另一套 Microi API 的工具,必须把远程平台视为独立登录会话:
|
|
254
|
-
|
|
255
|
-
- 用户必须先完成远程登录,登录成功后显示远程用户名称、帐号、ApiBase、OsClient 和登录状态,并提供明确的退出登录操作。
|
|
256
|
-
- 历史远程连接通过 `mci_` 前缀表保存,并按 `V8.CurrentUser.Id` 做行级隔离;不得把帐号、密码或 Token 放入 `localStorage`。
|
|
257
|
-
- 密码和 Token 只能由受保护的接口引擎写入、读取和清理。数据库必须保存可校验的加密密文,普通 FormEngine 列表不得返回密文字段。
|
|
258
|
-
- 密码和 Token 使用 `V8.Method.ProtectApiEngineSecret/UnprotectApiEngineSecret`,由宿主把密文绑定当前 `OsClient + ApiEngineKey`;不得从已脱敏的 `V8.OsClientModel` 读取 `AuthSecret/DbConn`,也不得使用进程级临时密钥。接口引擎 Key 必须稳定,确保服务重启和应用升级后仍能解密历史连接。
|
|
259
|
-
- 历史连接列表只返回脱敏元数据;一键重连时再按记录 Id 和当前用户读取凭据。删除连接必须同时清除保存的密码和 Token。
|
|
260
|
-
- 远程目标登录后必须调用文件柜能力探针 `mci_file_sync_capability` 检查同步协议版本,并使用其 `Data.FileManagerSysMenuId` 作为目标租户权威文件柜菜单;禁止硬编码发布端菜单 Id。接口不存在、未返回菜单 Id、返回 404/非标准结果或协议版本过低时,提示目标平台更新【文件柜】应用,不得继续同步。
|
|
261
|
-
- 验收至少覆盖:登录成功显示身份、退出后 Token 清空、历史连接一键重连、删除连接、密文落库、服务重启后仍可解密、目标平台缺少能力接口时的升级提示。
|
|
262
|
-
|
|
263
|
-
### 热点公开资源的可信分流
|
|
264
|
-
|
|
265
|
-
- SaaS MinIO 绑定的凭据不能通过通用表工具写入。使用 `microi_manage_saas_minio` 的
|
|
266
|
-
Inspect → Save(Revision CAS)→ Probe;旧后端缺少入口先升级。它不改变 HDFS/OSS,
|
|
267
|
-
不复制对象或改变桶策略;签名桶探测成功与副本校验、实际分流是不同验收项。
|
|
268
|
-
|
|
269
|
-
- `PublicResourceOffload/2` 与旧目录/路由第一版分别验收。系统日志应用拥有 `mci-file-resource-runtime`(管理员控制面)与 `mci-file-resource-public-url`(匿名只读公开选择);目录的 Ready、流量和副本行不作为运行授权,不能通过普通 CRUD 制造成功。
|
|
270
|
-
- 从当前 SaaS 引擎读取 MinIO 凭据,第二版 FileServerBak 使用 HTTPS origin 加后端绑定的公有桶。主 HDFS 保留 Aliyun;不全桶迁移、不删源文件、不把私有桶改公开。只复制当前已发布公开运行清单,JS/CSS/模型依赖完整成组;复制、签名回读与匿名 SHA/MIME/Range/CORS 全部成功后才允许消费者采用 NAS。
|
|
271
|
-
- 完整北京时间自然日的 CDN 运营报表及已接入 SDK 的实际响应字节可证明超过阈值的正向下界;榜单缺行、计量缺失和空报表不是零。迁移验证单独排除;历史人工指定单独记录,不能伪造当前24小时阈值通过。阈值触发后的同版本副本持续保留,避免源流量下降反复切回。
|
|
272
|
-
- HTTP/MCP只登记复制意图;共享签名状态、租约栅栏、逐文件回读恢复与退避负责副作用。未知上传先对账,异内容不覆盖。当前版本/完整清单或配置变化、撤为私有、NAS健康失效均回退原地址;先确认真正消费路径,再分别验收实际下载下降与完整日账单节省。主壳预配置 JS、旧绝对 CDN 书签和非受管资源须明确列出未接入范围,不能声称所有资源自动切换。
|
|
273
|
-
|
|
274
|
-
<!-- /microi-progressive:chunk -->
|
|
258
|
+
热点分流与跨平台会话的完整规则见
|
|
259
|
+
[操作与原生边界](references/hotspot-offload-operations.md)。
|
|
275
260
|
## 详细参考路由(渐进披露)
|
|
276
261
|
仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
|
|
277
262
|
- [references/progressive-01-公有桶-vs-私有桶.md](references/progressive-01-公有桶-vs-私有桶.md):公有桶 vs 私有桶;接口直接响应文件(下载/导出);通过 URL 列表批量下载并入库
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# 热点公开资源分流操作流程
|
|
2
|
+
|
|
3
|
+
<!-- microi-progressive:chunk id=v8-file-upload-011 sha256=4983b127efd106705151c7a304de2b3eb30e824068f5b92df73352e79663b322 -->
|
|
4
|
+
## 从费用需求到实际分流
|
|
5
|
+
|
|
6
|
+
用户希望降低 OSS/CDN 下载费用时,先核对当前连接、运行能力、配置和真实消费入口。
|
|
7
|
+
不全桶迁移,不删除云端源对象,不把私有文件改公有,不承诺费用降到零。
|
|
8
|
+
|
|
9
|
+
### 配置与计量
|
|
10
|
+
|
|
11
|
+
- 系统设置路由 /system-config:备用文件服务器 FileServerBak,备用分流阈值(GiB)
|
|
12
|
+
FileServerBakThresholdGiB,备用分流统计窗口(小时)FileServerBakWindowHours。
|
|
13
|
+
- 示例 1 / 24 表示一个对象或完整公开依赖组在已结束的完整北京时间自然日内,
|
|
14
|
+
可信实际下载字节达到 1073741824;不是文件大小、当前部分日或滚动窗口。
|
|
15
|
+
- 当前 FileServerBak 使用 HTTPS origin(允许端口,不带桶路径);SaaS MinIO 绑定
|
|
16
|
+
内外端点、公私桶与凭据。HDFS 保持 Aliyun,原 FileServer 保留作权威来源/回退。
|
|
17
|
+
- 首次可信达标后 LowTrafficRevokesPreference=false:后续低流量、重启或缓存丢失
|
|
18
|
+
不撤回同源偏好。内容更新须重新验证;来源/权限改变、健康失败或管理员停用优先。
|
|
19
|
+
|
|
20
|
+
### AI / MCP 执行顺序
|
|
21
|
+
|
|
22
|
+
1. profiles 核对 ApiBase、OsClient 与工具链版本;读取当前管理能力、Schema 及唯一
|
|
23
|
+
sys_config 记录,仅投影三个备用配置字段。先发现、describe_tool 再调用写工具。
|
|
24
|
+
2. microi_run_engine 调用 mci-file-resource-runtime,先 Action=Capabilities、Status,
|
|
25
|
+
检查原生协议和实际部署;配套系统设置、系统日志/监控应用通过官方应用包安装。
|
|
26
|
+
3. 非敏感阈值通过标准配置保存与独立回读。MinIO 只用 microi_manage_saas_minio:
|
|
27
|
+
Inspect 取得 Revision,Save 绑定 expectedRevision 与 SAVE_MINIO:<tenant>:<revision>,
|
|
28
|
+
再 Inspect / Probe。凭据只写不读;超时先回读,不盲重放,不向通用表或临时 V8 写密钥。
|
|
29
|
+
当前工具列表缺失时核对发行包与已加载 MCP,更新后重新发现;不能猜不存在的工具。
|
|
30
|
+
4. 读取固定任务 microiPublicResourceOffloadScheduler / mci-file-resource-scheduler,
|
|
31
|
+
保留其启用/暂停意图;不能新建第二套采集复制循环。任务配置需按 job-engine 规范。
|
|
32
|
+
5. 在资源状态读取 Collector、WindowEvaluations、来源绑定、复制与 LastPump,按真实
|
|
33
|
+
Id/对象键定位失败。采集受 30 分钟到期门禁,日报迟到补最近两个完整日;未知不是零。
|
|
34
|
+
6. 已有历史热点可在授权范围通过 PinHistoricalHotspot、PinHistoricalPublicObject 或
|
|
35
|
+
PinHistoricalAsset 明确选择;先读取当前引擎参数,按各自精确身份传参。
|
|
36
|
+
人工指定单独留因,不伪造当日流量、不直接写 Ready、不自动恢复已停用资源。
|
|
37
|
+
7. 验证当前发布的完整依赖组,等原生复制、摘要和匿名门禁全部通过。应用 JS/CSS
|
|
38
|
+
必须有可信清单;模型包括贴图依赖。独立 JS/CSS 缺清单不能强当无依赖叶文件。
|
|
39
|
+
8. 通过 mci-file-resource-public-url 或应用稳定入口验证选址,再从真实官网/应用
|
|
40
|
+
核对最终 URL 与 NAS 字节、MIME、CORS、HEAD/Range。静态主域仍 200 可能是保留
|
|
41
|
+
回退入口,不能仅据此推断全部失败,也不能据 NAS 副本 200 推断所有客户端已接入。
|
|
42
|
+
|
|
43
|
+
### 请求批次与覆盖范围
|
|
44
|
+
|
|
45
|
+
前端接入读取 `microi-frontend-sdk/SKILL.md`。独立项目的 SDK 实例使用
|
|
46
|
+
`V8.configure({apiBase,osClient,fileServer,fileServerBak})` 同步当前租户配置,
|
|
47
|
+
在首个资源请求前等待 `V8.resolvePublicResource(value,{private:false})`;
|
|
48
|
+
明确公有上传元数据也可由 `resolveFileUrl` 解析。NAS 加载实际失败时,
|
|
49
|
+
`V8.reportPublicResourceFailure(value)` 提供一次原址回退。
|
|
50
|
+
主后台使用 `DiyCommon.GetPublicResourceRoute`;后端固定原子为
|
|
51
|
+
`V8.Method.GetPublicResourceBackupUrls({ObjectKeys})`,由受管接口编排。
|
|
52
|
+
独立 SDK 的 `V8` 实例不是主后台 V8 事件新增的同名全局函数,不能混用。
|
|
53
|
+
|
|
54
|
+
ObjectKeys 协议最多 100 项,不代表一轮可确认任意数量的独立组。
|
|
55
|
+
原生实际选择另受独立组数与时间预算约束;只采用每行 UseBackup=true 且回执完整的结果。
|
|
56
|
+
诊断多组可按小批(例如 5 项)读取,并保留每项状态;未选择不是零流量或文件不存在。
|
|
57
|
+
旧硬编码 URL、平台 bootstrap、私有对象和未接入 loader 单独列为缺口,不能全局字符串
|
|
58
|
+
替换,也不能把公开编译组路由扩大到私有源码。
|
|
59
|
+
|
|
60
|
+
### 归因与财务验收
|
|
61
|
+
|
|
62
|
+
- 用 mci-cdn-manager 的 Reports / StorageLogs 等受管动作定位具体对象、请求数和字节;
|
|
63
|
+
公私桶、域名、日期、原始窗口、覆盖边界与 TOP 截断保留,旧报告不冒充当前全集。
|
|
64
|
+
- 高请求数不等于同等次数的完整成功下载;GiB 与账单 GB 分开,不据样本分摊精确人民币。
|
|
65
|
+
- Billing 采用相同币种/税口径,完整分页;OSS NetworkOut、CdnOut 与 CDN 下行分别核对,
|
|
66
|
+
CdnOut 已在 OSS 总额中时不再次相加。完整旧代码日与完整新代码可用日才能比较。
|
|
67
|
+
- 首次复制成本、混合部署日、欠费停用日和当天部分账单分开;缺少可比日时实际节省为空。
|
|
68
|
+
按每个源的实际切换时间记录,不能用单节点健康或页面发布替代全部覆盖证明。
|
|
69
|
+
|
|
70
|
+
<!-- /microi-progressive:chunk -->
|
|
71
|
+
|
|
72
|
+
<!-- microi-progressive:chunk id=v8-file-upload-003 sha256=18bfbc6466abb62cec99d226b3bdd5091669a8317ab02f5045b7913f366c4334 -->
|
|
73
|
+
## 跨平台文件同步登录会话
|
|
74
|
+
|
|
75
|
+
文件柜、文件同步等需要连接另一套 Microi API 的工具,必须把远程平台视为独立登录会话:
|
|
76
|
+
|
|
77
|
+
- 用户必须先完成远程登录,登录成功后显示远程用户名称、帐号、ApiBase、OsClient 和登录状态,并提供明确的退出登录操作。
|
|
78
|
+
- 历史远程连接通过 `mci_` 前缀表保存,并按 `V8.CurrentUser.Id` 做行级隔离;不得把帐号、密码或 Token 放入 `localStorage`。
|
|
79
|
+
- 密码和 Token 只能由受保护的接口引擎写入、读取和清理。数据库必须保存可校验的加密密文,普通 FormEngine 列表不得返回密文字段。
|
|
80
|
+
- 密码和 Token 使用 `V8.Method.ProtectApiEngineSecret/UnprotectApiEngineSecret`,由宿主把密文绑定当前 `OsClient + ApiEngineKey`;不得从已脱敏的 `V8.OsClientModel` 读取 `AuthSecret/DbConn`,也不得使用进程级临时密钥。接口引擎 Key 必须稳定,确保服务重启和应用升级后仍能解密历史连接。
|
|
81
|
+
- 历史连接列表只返回脱敏元数据;一键重连时再按记录 Id 和当前用户读取凭据。删除连接必须同时清除保存的密码和 Token。
|
|
82
|
+
- 远程目标登录后必须调用文件柜能力探针 `mci_file_sync_capability` 检查同步协议版本,并使用其 `Data.FileManagerSysMenuId` 作为目标租户权威文件柜菜单;禁止硬编码发布端菜单 Id。接口不存在、未返回菜单 Id、返回 404/非标准结果或协议版本过低时,提示目标平台更新【文件柜】应用,不得继续同步。
|
|
83
|
+
- 验收至少覆盖:登录成功显示身份、退出后 Token 清空、历史连接一键重连、删除连接、密文落库、服务重启后仍可解密、目标平台缺少能力接口时的升级提示。
|
|
84
|
+
|
|
85
|
+
### 热点公开资源的可信分流
|
|
86
|
+
|
|
87
|
+
8.7.11 原生后端把 5–64 MiB 既有公开对象(包括只有一个 8 MiB 捕获块的对象)交给同一原生 multipart 完成协议;保留源权限、签名状态、私有块和整文件 SHA、匿名 MIME/CORS/Range/健康门禁。未知结果先对账,不重新拉取已确认的 OSS 正文;停用仍先撤权再精确清理,不可手改 Ready。回归与实际 NAS 消费分别验收。
|
|
88
|
+
|
|
89
|
+
- SaaS MinIO 绑定的凭据不能通过通用表工具写入。使用 `microi_manage_saas_minio` 的 Inspect → Save(Revision CAS)→ Probe;旧后端缺少入口先升级。它不改变 HDFS/OSS, 不复制对象或改变桶策略;签名桶探测成功与副本校验、实际分流是不同验收项。
|
|
90
|
+
|
|
91
|
+
- `PublicResourceOffload/2` 与旧目录/路由第一版分别验收。系统日志应用拥有 `mci-file-resource-runtime`(管理员控制面)与 `mci-file-resource-public-url`(匿名只读公开选择);目录的 Ready、流量和副本行不作为运行授权,不能通过普通 CRUD 制造成功。
|
|
92
|
+
- 从当前 SaaS 引擎读取 MinIO 凭据,FileServerBak 使用 HTTPS origin 加后端绑定的公有桶。主 HDFS 保留 Aliyun;不全桶迁移、不删源、不公开私桶。第二版应用使用当前已发布公开运行清单完整分组;通用 v3 支持公开图片/音视频等叶子及 GLB/glTF 同桶相对依赖;包含 EXT_texture_webp 解析修复的原生后端仅允许扩展 source 为 images 的合法整数索引,内嵌图片无外部依赖,外链与普通回退图片均保留完整 URI/ACL/版本校验,未知扩展仍拒绝;此兼容不改变应用可见性、不接通未调用解析器的 loader,8.7.7 单对象 64 MiB、组 256 MiB;只有实际 Capabilities.GenericLargeCopyProtocol=PublicResourcePinnedByteCapture/1 的后续后端才将单对象/组分别扩至 2 GiB,含入口仍最多 128 对象,8 MiB 私有暂存块有签名 SHA 回执,恢复复用已确认块;依赖由暂存解析,完整 SHA 由 NAS 组装计算。源 ACL/版本与当前绑定是权威,ETag 不是 SHA。8.7.7 配套 Managed runtime 的 PinHistoricalPublicObject 仅传 ObjectKey,当前公开 HEAD 后保存人工历史选择,worker 重验相同源绑定/版本才纳入;不造流量、不直写 Ready、不恢复暂停。JSON 原样作为叶文件,不解析改写包内 URL,限额按实际原生能力回读,不放宽商城解析/安装正文限制;商城消费须对比返回 VerifiedSha256/VerifiedSize 与权威精确包版本,再验同响应 Binding,旧后端缺证明回源。未接可信提交清单的独立 JS/CSS 拒绝;完整复制、签名回读、匿名 SHA/MIME/Range/CORS 才 Ready,未包含精确 Origin 修复的通用后端仅接受 CORS *;包含本修复后亦接受与本次配置 ApiBase 的 HTTPS Origin 完全相同的单一值,错误域名、多个值、null 或缺失值仍拒绝。
|
|
93
|
+
- 历史安装微服务的商城 `IsPublic=0` 不等同于其已发布编译文件是私有对象。只有原生 `InstalledPublicBuild/1` 提供者从主库独立读取当前应用、唯一协议 0–2 历史版本、唯一启用服务及完整 `dist/` 文件集合,复用安装别名四方一致性校验,并确认匹配且未到期的 `InstalledAliasReconciliation/1` 三次稳定检查点后,才可把整个公开构建依赖组纳入分流。每个文件必须标记 `PublicBuildOnly` 或 `PrivateSource+PublicBuild`,源对象当前公有 ACL、版本、原始 SHA 与同一复制 Run 的目标回执都要核验;单个 JS、私有源码、陈旧检查点、缺失成员或跨租户路径均不准入。首次开放目标前和健康续期复查全组,实际选择时再复查所选源对象;失败继续原授权下载链,不把 `IsPublic`、`LegacyUnverified` 或协议号改成公开/V3 成功。该接口只供原生宿主内部调用,不开放新的 HTTP、MCP 参数或可编辑 V8 能力。探测链最后一个 NAS 响应返回后,准备与续期都通过同一个完成门重新读取当前整组权威和公有 ACL,再检查租约并提交 Ready 或健康时间;变化则走现有失败撤权。两种真实访问入口使用同一个 5 秒总预算覆盖绑定、Redis、主库权威、ACL 和 HTML HEAD,原生权威读取最多 4 个并发,超时停止等待但占用槽位直到已启动读取结束,后续 SQL 不再启动;后台任务仍使用宿主原有取消期限。 稳定微应用资产入口的原生叶资源兼容(须部署包含此修复的后端):既有 Controller 完成当前版本/清单选择后,若应用组路由不可用,可只读查询该清单**精确对象键、原始 SHA-256 与大小**匹配的通用公开 Ready 副本。公开对象仍须通过源 ACL/版本、源与目标绑定、健康期和受管 NAS URL 校验;不会把应用 IsPublic=0 改为公开,也不公开私有源码或私有对象。HTML、JS、CSS、JSON、SVG 及 OriginalStorage=1 保留原链。root/latest/版本路径即使同名同 SHA 也不能互借 Ready;历史榜单对象已复制不等于当前版本路径已接通。直接 static/CDN URL 绕过稳定入口时仍不受本兼容影响。该能力不新增 V8/MCP 动作或可由调用方覆盖的 owner/摘要参数。
|
|
94
|
+
- 当前权威公开清单中的 `Sha256` / `ContentHash` 与历史 `Hash`(含小写别名)统一按原始文件 SHA-256 校验,仅接受 64 位十六进制值;现代字段优先,任一非空别名无效或多个别名冲突均拒绝。此兼容不改变文件大小、完整原始字节 SHA 回读、公私权限或发布/检查点状态,不能把 ETag、MD5 或目录声明当作可信摘要。
|
|
95
|
+
- 1 GiB / 24 小时按最新已结束的完整北京时间自然日计算,不是滚动或当天部分窗口。CDN/已接 SDK 只证明正向下界,缺行/空报表不是零,版本内分摊未知。迟到日报只补采最近两个完整日;同日同域同 key 快照取最大值,跨域分开、跨日不合并;每个日期先保存指向另一日的签名游标再做 SDK/云读取,避免预算饿死旧日。未知计数为 null,WindowEvaluations 仅两条摘要,诊断明细超 3 MiB 显式截断并保留总数;超签名预算则拒绝签名。固定 microiPublicResourceOffloadScheduler / mci-file-resource-scheduler 使用主库鉴权及共享 tick 租约;旧 Disabled/已签 handoff 须租约迁移,不添 Pin/Ready。升级保留 Redis/索引、建事实表并统一全部节点;handoff 持久化后暂停、删除任务或 Redis 丢失不恢复旧宿主。统一 30 分钟采集;4 分钟 BudgetReached/Partial 不代表全体 Ready。首次资格进入主库签名 CAS,低流量、重启/Redis 丢失不取消;新版本重验权限和副本,显式停用优先。旧 v2 缺源桶/端点不能从 SourceRevision 反推:缺 ConfiguredSourceBinding 拒继承与路由;仅管理员新 PinHistoricalHotspot 对当前完整同清单/版本/SHA/大小/目标明确重申可复用旧 Ready,先健康回读,不造新自动资格。已有绑定不一致须新运行。CDN 只取当前源首次观察之后的整日,旧未绑定 SDK 累计保留但不合并。源码回归不替代生产采集、真实请求下降或完整日账单验收。 别名自动采集须含 NativePublicSourceAlias/1 的后端:固定云只读重验唯一同源 OSS 与显式同源 Host,无 rewrite/条件/未知配置;独立签名 ObservedSince 覆盖整日,本轮现查成功才归属,失败/变化/超过24小时观察间隔重建。只用既有source-observation-v1签名行的CdnAliasCollector子结构(50条/128KiB),不增物理StateKey;同源同目标保留,源/目标变化或旧节点丢字段只重置观察、不追认旧日。每轮最多2域、先存公平游标、每元数据调用15秒,共享总预算;原 FileServer/SDK路径保持。Status.LastCollection.AliasCollection/CdnAliasAuthority展示有限范围,不能把公有桶名当对象ACL,也不改变旧static消费者或SourceMappings;普通V8不能自报映射/流量。 实际旧URL消费须另具PublicSourceUrlRoutes/1:AliasCandidates仅发现;明确公有客户端提交精确无签名PublicUrls,native固定来源重验后走原Generic公开ACL/依赖/Ready选择,60秒有界证明不当永久授权。回执须精确SourceUrl/ObjectKey/目标前缀和最短健康期,tenant变化/异常行/过期回原地址;不得把同步assetUrl、启动JS、旧HTML或任意Three.js都称已覆盖。
|
|
96
|
+
- HTTP/MCP只登记意图,目录 CRUD 不能制造 Ready;先通过拥有方应用包安装 mci_file_offload_state 及 Owner/StateKey 唯一索引,原生主库签名/CAS、租约栅栏与检查点负责副作用。Web/UniApp 按类型取 committed V3,旧 service 不遮蔽;源码草稿 Changed 仅在当前应用/版本均 Completed V3、精确提交归属/正栅栏/请求前缀/完整重算清单与双方摘要一致时沿用已验证运行副本,微服务还须精确匹配该提交投影及不可变对象键。Legacy/Failed/Building 不放宽;只改草稿不改 SourceRevision、不重读 OSS 正文,真正权限/版本/源绑定漂移仍撤权,禁止手工改 Success/Ready;保留权威 AppKey 原大小写,索引按状态键去重。未知上传先对账,异内容不覆盖。源 ACL/版本/依赖或配置变化停止新路由,签名前仍重验源权威。先确认消费路径,再分别验收实际下载下降与完整日费用,文档和离线测试不证明部署或省费。
|
|
97
|
+
|
|
98
|
+
- 公开之前先持久化签名状态的 PublishedRuns 账本;停用/源变私有/版本或目标变化按账本撤自有前缀 GetObject,策略回读后须逐对象匿名 HEAD 403/404,不能把“移除自有策略”当匿名已撤销。旧目标绑定未知则 PreviousTargetBindingUnavailable 阻断,不借新目标凭据称旧 URL 已失效;历史缓存字节不能召回。
|
|
99
|
+
- 已提交公开应用及受权威版本约束的历史安装包复用 PublicResourceLargeAssetTransfer/1:2 GiB 内按 8 MiB 私有块、NAS server-side multipart Copy 和持久完整 raw SHA 续传;每步 120 秒受宿主预算/租约取消,未知结果先对账。匿名 Range 逐段签名续验,ETag 不是 SHA;旧 MIME 仅在完整 SHA 相符后条件 COPY 修复并重验,不能放宽类型。停用/换版先撤权,精确清理自有 upload/chunk,保留失败账本。具备 PublicResourcePinnedByteCapture/1 时,普通公开叶文件 64 MiB–2 GiB 从 pinned 源块回读推进 SHA,再移交同一私有块,不二次下载 OSS;GLB 只读头与至多 4 MiB JSON,不整读 binary 或大临时文件。旧预知 SHA 入口保持。临时失败保留分块;显式停用/来源失效先记退休意图、撤权再断点清理,重新启用按新运行验证。完整日首次达标的同源长期偏好不随低流量撤回。>2 GiB、私有、缺可信清单的独立脚本和未接消费者仍不覆盖。
|
|
100
|
+
- 历史大安装包使用独立 `PinHistoricalAsset / EnableHistoricalAsset / DisableHistoricalAsset / ListHistoricalAssets`,经标准 MCP 调用拥有方 Managed mci-file-resource-runtime。只传 SourceTenant/AppKey/VersionId/AssetPath;当前主库重新校验公开 Web/UniApp、已完成 V3 历史版本、请求前缀与完整清单 SHA。文件名版本不等于发布版本;不换 latest,不接收调用方 URL/摘要/Ready,不借用通用字节捕获替代历史版本授权。仅精确 exe/dmg/zip,单文件最多 2 GiB。
|
|
101
|
+
- 历史 archive 状态独立主库签名/CAS,人工选择不伪造当前流量;重复 Pin 保留停用。8 MiB 原生分块、NAS multipart 与逐段匿名校验都保存可恢复回执,完整权威 SHA 才 Ready;源/目标变化先撤旧公开授权,私有暂存所有权保留待清理。匿名 Managed HTTP mci-file-resource-archive-download 只读重验后 302 到已验 NAS 或同一历史版本原云地址;私有/权威缺失拒绝。先部署接口再发官网,按 more/hdfs.md 分层验收。
|
|
102
|
+
- 七文件消费者为 public-resource-router.mjs、diy.common.js、diy-imgupload.vue、diy-fileupload.vue、DiyTableSpecialCell.vue、diy-common.mixin.js、diy-richtext.vue:显式 Limit:false 初始 src/链接/新富文本插入前 await 批量原生 GenericPublicResourceRoutes/1,校验绑定、源/行/字段/租户身份,可观测错误最多一次原址回退。卡片 helper 无活动调用点不能算额外页面覆盖;私有、旧富文本 HTML、Three.js/AI 硬编码 URL、平台 bootstrap、独立 JS 缺清单、ZIP 聚合/下游 Office 仍未覆盖;完整入口和 HEAD 后失败限制见官网 more/hdfs.md。
|
|
103
|
+
<!-- /microi-progressive:chunk -->
|
|
@@ -182,7 +182,7 @@ var url = V8.Method.GetPrivateFileUrl({
|
|
|
182
182
|
- `Limit:false` 的公有文件允许通过 CDN/公有桶直接访问,不要求记录用户行为日志,也不要为了审计强制改走私有代理。
|
|
183
183
|
|
|
184
184
|
<!-- /microi-progressive:chunk -->
|
|
185
|
-
<!-- microi-progressive:chunk id=v8-file-upload-006 sha256=
|
|
185
|
+
<!-- microi-progressive:chunk id=v8-file-upload-006 sha256=405f2dc31677040e3b81ae5f2e84820680b13d4384477ec7c4bf9186e3b3abef -->
|
|
186
186
|
## 接口直接响应文件(下载/导出)
|
|
187
187
|
|
|
188
188
|
接口引擎需要在配置中开启【**响应文件**】选项,然后返回特殊结构:
|
|
@@ -230,7 +230,7 @@ return {
|
|
|
230
230
|
- `image/png` / `image/jpeg`
|
|
231
231
|
- `application/octet-stream`(通用二进制)
|
|
232
232
|
|
|
233
|
-
|
|
233
|
+
注意:如果远程系统返回的是错误页、登录页、业务容器格式(例如第三方 PLM 电子仓 `KD_C_PLM`、或其它文件头不是 `%PDF-` 的伪 PDF),不要在 V8 里伪装成 PDF。后端会返回 JSON 错误,包含 `ExpectedFirstAscii`、`ActualFirstAscii`、`ActualFirstHex`、`Length`,按这些信息排查上游下载接口。
|
|
234
234
|
|
|
235
235
|
<!-- /microi-progressive:chunk -->
|
|
236
236
|
<!-- microi-progressive:chunk id=v8-file-upload-007 sha256=710eb73f616aff2ebce65a82568abe8208b701c1211a7e95ce500b1ce20b363f -->
|
|
@@ -52,21 +52,18 @@ Preview 和确认均重验当前客户端、回调及 Scope;账号变化通过
|
|
|
52
52
|
|
|
53
53
|
同一 Managed 会话接口包含本人初始化与敏感管理动作时,精确 `ApiRole` 不能代替动作级鉴权。SaaS v8.4.26 / `platform-sys-user-session` v1.0.5 对已归一化的 `GetSysUserPassword`,先拒绝匿名和访问密钥,再以可信 `V8.CurrentUser`、`V8.Db` 主库的本人活动状态/等级及有效管理员角色核验后调用原可信原子;不读取密码字段做授权,不使用 `DbRead`、客户端身份字段或角色名判断。标准角色授权可用于只读账号的本人会话初始化,不能把整引擎授权解释成敏感动作许可。负例使用预先确认不存在的固定用户 Id:普通账号必须先被管理员门拒绝,管理员仅验证合法路径返回不存在,禁止为验收读取任何真实密码。
|
|
54
54
|
|
|
55
|
+
登录密码的 `Pwd` 与 `PwdEncode` 必须成组更新;不能在 PBKDF2 账号上只写 DES 密文,也不能在验证失败时自动降级为 DES。官网短信重置使用固定 `official_password_reset` 调用 `V8.Method.ResetPlatformSmsPassword({Phone,SmsCode,NewPassword,ConfirmPassword,_Lang})`,由可信后端完成一次性验证码消费、原始密码哈希和会话撤销。历史编码不一致只由 `platform-sys-user-admin` 的 `RepairPasswordEncoding` 动作调用 V8.Method.RepairPlatformPasswordEncoding 可信修复原子:默认 `DryRun=true`,最多 20 个用户,写入需显式 `DryRun=false` 与 `ConfirmExecution='REPAIR_PASSWORD_ENCODING'`;不进入租户 Hook,不返回密码材料。两原子最低后端 8.7.4,应用包最低 SaaS v8.6.13 / 系统账号 v8.4.13,先确认运行版本再安装或调用。
|
|
56
|
+
|
|
57
|
+
密码注册、重置与登录要保留相同原始输入,不能在单个环节独自 `trim`。登录及重置包装器把 `_Lang`(无值时沿用 `lang` Header,再默认 `cn`)传至认证内核;缓存未预热也应返回本地化错误而不是内部 Key。手机号作为登录别名时精确账号优先,手机号重复则拒绝;验证后的身份只按认证结果 Id 回读。账号必须 `State=1` 且未删除;历史 `State=2` 是禁用,不能为了排障绕过或自动启用。
|
|
58
|
+
|
|
55
59
|
<!-- microi-progressive:begin -->
|
|
56
|
-
<!-- microi-progressive:chunk id=v8-security-000 sha256=
|
|
60
|
+
<!-- microi-progressive:chunk id=v8-security-000 sha256=a6a4311b1a799ea4ed005b22c01cb8230509aaf09aeead5a17c8c46da74772c8 -->
|
|
57
61
|
## 0. 租户动态系统设置与密钥边界
|
|
58
62
|
|
|
59
63
|
**AI 默认处理路径:** 用户交付第三方 Secret 并授权配置时,优先调用 `microi_manage_server_private_secret`:List 只确认 Key/HasSecret;Save 使用 `confirmExecution=SAVE:<ConfigKey>`,固定 `IsSecret=true / IsPublic=false` 并自动脱敏回读。例如畅捷通使用 `Integration.Changjet.AppSecret`,后端从 `V8.SysConfig.ServerPrivateSettings` 使用。不要仅拒绝硬编码后停止,也不要因为 `OsClientModel` 不暴露密钥而误判服务端 V8 无法调用第三方。工具不提供原文揭示;更换已有 Key 前回读现状,超时只回读、不盲目重写。
|
|
60
64
|
|
|
61
65
|
第三方密钥(微信、支付宝、OpenAI、阿里云、ERP、SMTP)**禁止**硬编码在 V8 代码或前端。公开的租户配置必须建成当前租户 `sys_config` 的实体字段;敏感或仅供后端使用的租户业务配置保存到 `mci_system_setting`。数据库、Redis、MongoDB、MinIO、MQ 等部署控制面仍由主库 `sys_osclients` 托管,子租户不能修改。
|
|
62
66
|
|
|
63
|
-
MinIO 部署凭据使用专用 `microi_manage_saas_minio`,不能误存到普通第三方业务 Secret,
|
|
64
|
-
也不能为此放宽 `microi_admin_table_data` 的秘密字段限制。先 Inspect 当前主租户及运行分区,
|
|
65
|
-
再以其 Revision 和 `SAVE_MINIO:<tenant>:<revision>` 确认保存;省略凭据保留,候选先探测、
|
|
66
|
-
事务行锁 CAS、提交后缓存刷新及运行回读。只返回 HasAccessKey/HasSecretKey,拒绝子租户和
|
|
67
|
-
访问密钥会话,不修改 HDFS/OSS 或桶权限。超时和 Persisted=true 的失败先 Inspect/Probe,
|
|
68
|
-
不能盲重放;旧后端不支持时升级正式后端,禁止用 SQL、普通表单或临时 V8 绕过。
|
|
69
|
-
|
|
70
67
|
能力是否启用、入口是否显示、公开交互模式等 Bool/Enum 配置即使属于登录或第三方集成,也必须放在 `sys_config`;API Key、ClientSecret、RP ID、Origin、Issuer、Scope、供应商地址等后端参数才放在 `mci_system_setting`。禁止给同一个新配置双写两张表。迁移旧开关时采用“新 `sys_config` 显式值 → 旧私密 Key → 存量安全默认”的只读回退,并从私密设置的列表、保存和删除入口移除旧 Key。
|
|
71
68
|
|
|
72
69
|
```javascript
|
|
@@ -166,14 +166,14 @@ var list = V8.Dbs.OracleDB1.FromSql('SELECT * FROM Table WHERE Id = @p0')
|
|
|
166
166
|
// 不写入 microi_database:创建仅当前请求使用的临时会话
|
|
167
167
|
var tempDb = V8.Dbs.Open(
|
|
168
168
|
'SqlServer',
|
|
169
|
-
'Server=
|
|
169
|
+
'Server=db.example.com,1433;Database=app;User Id=user;Password=***;Encrypt=True;TrustServerCertificate=False;'
|
|
170
170
|
);
|
|
171
171
|
var tempList = tempDb.FromSql('SELECT Id, Name FROM Customer WHERE Status = @p0')
|
|
172
172
|
.AddInParameter('@p0', 1)
|
|
173
173
|
.ToArray();
|
|
174
174
|
```
|
|
175
175
|
|
|
176
|
-
`V8.Dbs.Open`
|
|
176
|
+
`V8.Dbs.Open` 与保存连接支持 Dos.ORM 当前提供驱动和方言的 `MySql`、`SqlServer`、`Oracle`、`PostgreSql`、`DaMeng`、`KingBase`;具体 CPU、操作系统、数据库版本组合仍需真实验收,不代表第三方适配认证。SQL Server 生产连接启用加密与服务器证书校验,域名必须匹配证书且 API 宿主信任签发 CA,不以跳过校验作为通用修复。动态连接串只能来自可信服务端密钥或管理员代码,禁止使用 `V8.Param.ConnectionString`,禁止记录或返回。外部 SQL 的表名、列名、排序字段必须来自已校验元数据白名单;动态值继续使用 `AddInParameter`。
|
|
177
177
|
|
|
178
178
|
MCP 结构发现使用 `microi_inspect_external_database`,安全抽样默认使用只读的 `microi_query_external_database`。当用户明确要求数据库管理级能力时,使用独立的 `microi_execute_external_database`:它只允许后端确认的 `Level >= 9999` 当前用户调用,显式确认后可执行目标数据库账号有权执行的任意 DML、DDL、存储过程、数据库原生命令或多语句。输出行数限制只保护 MCP 传输,不限制数据库副作用;审计只记录 SQL 哈希、长度、模式和结果,不得记录 SQL 正文、连接串或密码。
|
|
179
179
|
|