@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.
Files changed (47) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +43 -43
  4. package/.workbuddy-plugin/marketplace.json +2 -2
  5. package/.workbuddy-plugin/plugin.json +1 -1
  6. package/assets/build-meta.json +4 -4
  7. package/cordis.patch.yml +1 -1
  8. package/package.json +82 -82
  9. package/scripts/mcp-server.js +199 -164
  10. package/scripts/microi-skills.meta.json +243 -237
  11. package/skills/.microi-skills-version.json +2 -2
  12. package/skills/.progressive-disclosure-manifest.json +67 -51
  13. package/skills/ai-engine/SKILL.md +18 -5
  14. package/skills/ai-engine/references/ai-employees.md +4 -0
  15. package/skills/app-store/SKILL.md +10 -1
  16. package/skills/business-blueprint/SKILL.md +1 -1
  17. package/skills/job-engine/SKILL.md +15 -0
  18. package/skills/message-notification/SKILL.md +2 -0
  19. package/skills/microi-codex/SKILL.md +6 -1
  20. package/skills/microi-deployment/SKILL.md +64 -18
  21. package/skills/microi-deployment/references/deployment-matrix.md +7 -1
  22. package/skills/microi-docs-coverage/SKILL.md +11 -1
  23. package/skills/microi-frontend-sdk/SKILL.md +12 -0
  24. package/skills/microi-microservice/SKILL.md +12 -1
  25. package/skills/microi-mobile-app-quality/references/mobile-first-delivery.md +2 -1
  26. package/skills/microi-system-delivery/SKILL.md +1 -0
  27. package/skills/microi-system-delivery/references/context-quality.md +56 -54
  28. 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
  29. 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
  30. package/skills/microi.v8.js +445 -0
  31. package/skills/module-engine/SKILL.md +13 -0
  32. package/skills/module-engine/references/module-config.md +17 -0
  33. package/skills/ocr-engine/SKILL.md +1 -0
  34. package/skills/playwright-e2e/SKILL.md +2 -0
  35. package/skills/scripts/sync-public-resource-router.mjs +29 -0
  36. package/skills/system-observability/SKILL.md +29 -6
  37. package/skills/translate-engine/SKILL.md +2 -0
  38. package/skills/v8-api-config/SKILL.md +1 -1
  39. package/skills/v8-file-upload/SKILL.md +17 -32
  40. package/skills/v8-file-upload/references/hotspot-offload-operations.md +103 -0
  41. 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
  42. package/skills/v8-security/SKILL.md +5 -8
  43. package/skills/v8-sql-query/SKILL.md +2 -2
  44. package/skills/workspace-conventions/SKILL.md +154 -136
  45. 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
  46. 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
  47. 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
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "6.1.6",
2
+ "version": "6.1.8",
3
3
  "versionRule": "Microi version uses three numeric parts. Each publish increments the last part; when a part exceeds 9 it carries to the previous part: 1.0.9 -> 1.1.0, 1.9.9 -> 2.0.0.",
4
4
  "managedBy": "Microi.Agent/bump-version.js",
5
- "updatedAt": "2026-10-26T01:26:07.339Z"
5
+ "updatedAt": "2026-10-29T04:44:58.881Z"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-10-26T01:25:41.917Z",
3
+ "generatedAt": "2026-10-29T04:40:40.047Z",
4
4
  "policy": {
5
5
  "maxEntryLines": 285,
6
6
  "referenceBudgetLines": 245,
@@ -411,7 +411,7 @@
411
411
  "originalLines": 321,
412
412
  "prefixSha256": "f64639b7e1c6cd7b2793d3506101cf1b91f77d306daabaae45599ecaefc551bb",
413
413
  "prefixBytes": 936,
414
- "entryLines": 195,
414
+ "entryLines": 207,
415
415
  "chunks": [
416
416
  {
417
417
  "id": "microi-frontend-sdk-000",
@@ -534,8 +534,8 @@
534
534
  ]
535
535
  },
536
536
  "microi-mobile-app-quality": {
537
- "originalSha256": "64b7711929b8a7610fe0b528302e576a31839297ac7b3b798b62f5788d04c33a",
538
- "originalLines": 562,
537
+ "originalSha256": "1ff50c437e189d1d4aa40e53e716c0356f13cd24c054d4ea7ce2e0227f8c3452",
538
+ "originalLines": 563,
539
539
  "prefixSha256": "a176be940d146b3651c3940757c256cb845941e102102b7adcd35c1f737f8c12",
540
540
  "prefixBytes": 1562,
541
541
  "entryLines": 204,
@@ -720,8 +720,8 @@
720
720
  "id": "microi-mobile-app-quality-022",
721
721
  "ordinal": 22,
722
722
  "destination": "microi-mobile-app-quality/references/mobile-first-delivery.md",
723
- "sha256": "748fc4a802457bab760ae24281c3bb27cb70841fe72b61b86f088439236867aa",
724
- "lines": 68,
723
+ "sha256": "33bf185e007fab2c8316f090b1f608143deca2e3ff4b010e7577c7f88d751008",
724
+ "lines": 69,
725
725
  "heading": "开发前固定事实源和首版范围"
726
726
  }
727
727
  ],
@@ -763,11 +763,11 @@
763
763
  ]
764
764
  },
765
765
  "microi-system-delivery": {
766
- "originalSha256": "5f525ce40bc074b4e6d0e19909e4420f8d76247b5dc0c8bca2ac7ef801b267c5",
767
- "originalLines": 711,
768
- "prefixSha256": "4b609f39cb11459d3cace78e0da3f848b963b2ec2ff9c5fa07b35f3f1114ea96",
769
- "prefixBytes": 6016,
770
- "entryLines": 116,
766
+ "originalSha256": "9db37be1921e828867a3d1878f42b72fbfd346d7d11b42d0203f0b48c891b83a",
767
+ "originalLines": 718,
768
+ "prefixSha256": "b6b97e8df68678ea61b8d67ad14057c0deb0c09a3834e8b77994d20aaeb92e7e",
769
+ "prefixBytes": 6666,
770
+ "entryLines": 117,
771
771
  "chunks": [
772
772
  {
773
773
  "id": "microi-system-delivery-000",
@@ -789,7 +789,7 @@
789
789
  "id": "microi-system-delivery-002",
790
790
  "ordinal": 3,
791
791
  "destination": "microi-system-delivery/references/progressive-03-安全与跨端验收.md",
792
- "sha256": "b4cd10b169b54235314d170c8e74f17bf6bcb5f658d0d4d2e10c73dc8aa37ef7",
792
+ "sha256": "1cf73c1365e3f8245b2069f5f2e24bcbfdc7f6e67c0f13524998b16f7bbf029b",
793
793
  "lines": 52,
794
794
  "heading": "平台安全与存量兼容验收(强制)"
795
795
  },
@@ -797,7 +797,7 @@
797
797
  "id": "microi-system-delivery-003",
798
798
  "ordinal": 5,
799
799
  "destination": "microi-system-delivery/references/progressive-03-安全与跨端验收.md",
800
- "sha256": "479ccdb65450c7741b052a30d8e4a11917bc19d80bf9b4ac89ea00092b4aaa73",
800
+ "sha256": "8e2891f2a149d6828b653b9f0735ea39a4df5ba60178c79f0e5b0065ce72ee84",
801
801
  "lines": 13,
802
802
  "heading": "前端交付检查清单"
803
803
  },
@@ -821,8 +821,8 @@
821
821
  "id": "microi-system-delivery-006",
822
822
  "ordinal": 4,
823
823
  "destination": "microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md",
824
- "sha256": "dee4ef7027b49b46a92f4b2bbd88d82997f9c992351e5d599ba6d38a03267258",
825
- "lines": 149,
824
+ "sha256": "30d24447c0ee767e09df1fb2ecb91b146da5afc0a100dcb2c5ba310b27bd9f7d",
825
+ "lines": 153,
826
826
  "heading": "自动化测试必须覆盖的坑"
827
827
  },
828
828
  {
@@ -837,8 +837,8 @@
837
837
  "id": "microi-system-delivery-008",
838
838
  "ordinal": 8,
839
839
  "destination": "microi-system-delivery/references/context-quality.md",
840
- "sha256": "beffc0924e9b36dca7a57da12a4cecb65ab05e938cb776c295c7fc5d7f736553",
841
- "lines": 54,
840
+ "sha256": "7d4c1226d529de92a79f6dcb277178f3d274738f51ed4b0fa609bb6f39ae9cb0",
841
+ "lines": 56,
842
842
  "heading": "质量优先的上下文与增量开发"
843
843
  }
844
844
  ],
@@ -1382,11 +1382,11 @@
1382
1382
  ]
1383
1383
  },
1384
1384
  "playwright-e2e": {
1385
- "originalSha256": "19bfaf779ced81fabca3069774756c3835674e87f2931718d1f7724ea09d58ac",
1386
- "originalLines": 817,
1387
- "prefixSha256": "67bf36437cf205f8d5a5e99120964c9da05b65807dba45beb9da1cba967645f2",
1388
- "prefixBytes": 4223,
1389
- "entryLines": 209,
1385
+ "originalSha256": "3f38f36f2d0a0f1287276948a9fdc7419c871dc4ab30902c162d2f29828bb22c",
1386
+ "originalLines": 819,
1387
+ "prefixSha256": "7193a78f9c53122f8df47bf1058ea9147741558c9a132eefa51583ecf1f21807",
1388
+ "prefixBytes": 4679,
1389
+ "entryLines": 211,
1390
1390
  "chunks": [
1391
1391
  {
1392
1392
  "id": "playwright-e2e-000",
@@ -2259,11 +2259,11 @@
2259
2259
  ]
2260
2260
  },
2261
2261
  "v8-file-upload": {
2262
- "originalSha256": "8a83abaa535749cfccd64d2499c3ef0d5787ea743ba3610c1d805907bfe46a6e",
2263
- "originalLines": 702,
2264
- "prefixSha256": "5b42e3b11954bc1de401574a135c2fee80ef12201bdbaa0271377fb06843baf4",
2265
- "prefixBytes": 19947,
2266
- "entryLines": 281,
2262
+ "originalSha256": "7b4bbe849df820c5de33f90965e701009a0d5b43ca64b264df299eb3e740cf76",
2263
+ "originalLines": 783,
2264
+ "prefixSha256": "414f3c18ed82ea52f3b02fbfdc2be5608a660aedc77bee2d70e26890894afc95",
2265
+ "prefixBytes": 21314,
2266
+ "entryLines": 266,
2267
2267
  "chunks": [
2268
2268
  {
2269
2269
  "id": "v8-file-upload-000",
@@ -2292,9 +2292,9 @@
2292
2292
  {
2293
2293
  "id": "v8-file-upload-003",
2294
2294
  "ordinal": 5,
2295
- "destination": "v8-file-upload/SKILL.md",
2296
- "sha256": "08b60d1f33338b9e54c39850d9074ca0089c2b867d2fff4a5857b34d8f1d14a9",
2297
- "lines": 24,
2295
+ "destination": "v8-file-upload/references/hotspot-offload-operations.md",
2296
+ "sha256": "18bfbc6466abb62cec99d226b3bdd5091669a8317ab02f5045b7913f366c4334",
2297
+ "lines": 31,
2298
2298
  "heading": "跨平台文件同步登录会话"
2299
2299
  },
2300
2300
  {
@@ -2317,7 +2317,7 @@
2317
2317
  "id": "v8-file-upload-006",
2318
2318
  "ordinal": 4,
2319
2319
  "destination": "v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md",
2320
- "sha256": "2dcf2dd7a571cc4757e9015cf213191be2dc3f041d91b0de51ed8ee00b0b86e7",
2320
+ "sha256": "405f2dc31677040e3b81ae5f2e84820680b13d4384477ec7c4bf9186e3b3abef",
2321
2321
  "lines": 50,
2322
2322
  "heading": "接口直接响应文件(下载/导出)"
2323
2323
  },
@@ -2352,6 +2352,14 @@
2352
2352
  "sha256": "f34d476435c3a8321df017b481771d757f580c8d75f7648fdd54ee1c624d116c",
2353
2353
  "lines": 26,
2354
2354
  "heading": "安全注意"
2355
+ },
2356
+ {
2357
+ "id": "v8-file-upload-011",
2358
+ "ordinal": 11,
2359
+ "destination": "v8-file-upload/references/hotspot-offload-operations.md",
2360
+ "sha256": "4983b127efd106705151c7a304de2b3eb30e824068f5b92df73352e79663b322",
2361
+ "lines": 67,
2362
+ "heading": "从费用需求到实际分流"
2355
2363
  }
2356
2364
  ],
2357
2365
  "references": [
@@ -2377,6 +2385,14 @@
2377
2385
  "空目录标记的受控恢复",
2378
2386
  "下载远程文件并存到 HDFS"
2379
2387
  ]
2388
+ },
2389
+ {
2390
+ "path": "references/hotspot-offload-operations.md",
2391
+ "headings": [
2392
+ "从费用需求到实际分流",
2393
+ "跨平台文件同步登录会话",
2394
+ "热点公开资源的可信分流"
2395
+ ]
2380
2396
  }
2381
2397
  ]
2382
2398
  },
@@ -2831,18 +2847,18 @@
2831
2847
  ]
2832
2848
  },
2833
2849
  "v8-security": {
2834
- "originalSha256": "b46bc6a930754ae64f22903c2530428c123c40e510f4ca0ca6c7489edf418da3",
2835
- "originalLines": 573,
2836
- "prefixSha256": "52262abdb901d909adf460efdd98fbfb715b53536c081816ff0d37f7cfe2d81e",
2837
- "prefixBytes": 6943,
2838
- "entryLines": 243,
2850
+ "originalSha256": "8b4b792f4b835835b261f10c8038c8f860fe6776f34c4b65f3aa35d03d4fa2e0",
2851
+ "originalLines": 570,
2852
+ "prefixSha256": "1371b6ca81fcf1b9cf12f30ed08624fef44a1f06650b986fd8b4d98c1f5475ba",
2853
+ "prefixBytes": 8303,
2854
+ "entryLines": 240,
2839
2855
  "chunks": [
2840
2856
  {
2841
2857
  "id": "v8-security-000",
2842
2858
  "ordinal": 0,
2843
2859
  "destination": "v8-security/SKILL.md",
2844
- "sha256": "0dfa03a03298161e6aa29dff18f68fdb00e4f0865cb7562fec090dcadd745c43",
2845
- "lines": 59,
2860
+ "sha256": "a6a4311b1a799ea4ed005b22c01cb8230509aaf09aeead5a17c8c46da74772c8",
2861
+ "lines": 52,
2846
2862
  "heading": "0. 租户动态系统设置与密钥边界"
2847
2863
  },
2848
2864
  {
@@ -3241,25 +3257,25 @@
3241
3257
  ]
3242
3258
  },
3243
3259
  "workspace-conventions": {
3244
- "originalSha256": "1c4f533e55f0ab695e0998026300de6cce481479b93a3619bfb4e642668802a9",
3245
- "originalLines": 711,
3246
- "prefixSha256": "dca80d3ddfca36f1c9a6fbd8bb5681de212255e753a0428aea69f9f21546bb5c",
3247
- "prefixBytes": 15187,
3248
- "entryLines": 175,
3260
+ "originalSha256": "f38521daa43ae0d1b017f8a1e9cc13b22f3a5aec31e4f01482f2db0acbc35542",
3261
+ "originalLines": 732,
3262
+ "prefixSha256": "f42cd32cfd8ff7bbe7ac8892aeba19f0806657f9fe9e6f45ecc95831071e6a60",
3263
+ "prefixBytes": 19369,
3264
+ "entryLines": 193,
3249
3265
  "chunks": [
3250
3266
  {
3251
3267
  "id": "workspace-conventions-000",
3252
3268
  "ordinal": 0,
3253
3269
  "destination": "workspace-conventions/SKILL.md",
3254
- "sha256": "e3e6f49e83e80b958184a4d281559fd80aa0a3bb7cbcb0893ecc1821c4b2f001",
3255
- "lines": 60,
3270
+ "sha256": "31990746b27d29d6f3a471dc800c843f1ddcc08b09a8444efdbf5c04cbde5503",
3271
+ "lines": 62,
3256
3272
  "heading": "任务启动前 Skill 读取规则(强制)"
3257
3273
  },
3258
3274
  {
3259
3275
  "id": "workspace-conventions-001",
3260
3276
  "ordinal": 1,
3261
3277
  "destination": "workspace-conventions/SKILL.md",
3262
- "sha256": "8d8dfff420c0cc768bbeb13d94e9f77f52d5002fc61d93dc82d71b3a17f2eaa0",
3278
+ "sha256": "c3db79fb5f6f00a6ea619f7129f1e81259efe899256a5100f9c84a5b5dca58f4",
3263
3279
  "lines": 12,
3264
3280
  "heading": "Microi吾码工作进度播报规范(强制)"
3265
3281
  },
@@ -3323,7 +3339,7 @@
3323
3339
  "id": "workspace-conventions-009",
3324
3340
  "ordinal": 9,
3325
3341
  "destination": "workspace-conventions/references/progressive-04-工作区与平台专项保障.md",
3326
- "sha256": "da44c7edb8923a1c4a7a5da87bfe1e6ec87323096ed2b71a2b27abf4a46d188e",
3342
+ "sha256": "9056add84ccdd3ee8d75883aa9b19bd271bc4fc179de1b4c142b8c5f3531e6e2",
3327
3343
  "lines": 44,
3328
3344
  "heading": "多对话共享工作区变更归属保护(强制)"
3329
3345
  },
@@ -3451,7 +3467,7 @@
3451
3467
  "id": "workspace-conventions-025",
3452
3468
  "ordinal": 25,
3453
3469
  "destination": "workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md",
3454
- "sha256": "4cf40c4ca771f7e04b80279646323a816378b98669f562ff8f4c647d5bf837ca",
3470
+ "sha256": "8a7a3437fbd43fa31d038d8f8c583e6145d4b68dce42faa290f142b5ff390a0b",
3455
3471
  "lines": 32,
3456
3472
  "heading": "多 AI 对话共享本地服务与发布互斥(强制)"
3457
3473
  },
@@ -3555,7 +3571,7 @@
3555
3571
  "id": "workspace-conventions-038",
3556
3572
  "ordinal": 38,
3557
3573
  "destination": "workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md",
3558
- "sha256": "1b65652abc8ca096a22d79a62b32c74557e5fc3daa7d81f3c192c4b9e37e4665",
3574
+ "sha256": "8c9a110528e81ace24313833ab2085efa9a69705566be5c2f700b76dbc91f207",
3559
3575
  "lines": 30,
3560
3576
  "heading": "CLI 与 IDE 插件错版共存约定"
3561
3577
  },
@@ -3563,8 +3579,8 @@
3563
3579
  "id": "workspace-conventions-039",
3564
3580
  "ordinal": 39,
3565
3581
  "destination": "workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md",
3566
- "sha256": "ff09cc6c76c9c6d13280f1d0fe45db19775863bca06eae8dadd1c4b2358183d3",
3567
- "lines": 15,
3582
+ "sha256": "4a24e3f7bd0244debb6efa82ea164265ab5841ccf97372af67ca16e0211bfe9c",
3583
+ "lines": 18,
3568
3584
  "heading": "本地测试程序与依赖生命周期(强制)"
3569
3585
  }
3570
3586
  ],
@@ -55,6 +55,8 @@ description: Microi AI 引擎、MiniMax 图片/音乐/视频生成与预览、
55
55
 
56
56
  MCP 可信写前校验分支确认未执行时标记 `notExecuted`,保留安全的参数位置和错误码,同一动作最多允许模型修正一次参数;不能仅凭未看到 HTTP 请求就推断未写入。发出写请求后断线或工具报错保留 `uncertain`,停止后续写入。已知表、字段和 Manifest 使用精确只读工具核对;回读返回不等于原写入成功,也不授权重放。普通 POST 网络失败不得通过另一 HTTP 传输自动重发;已有稳定 RequestId 的专用资产协议按自身契约执行。浏览器提前断流、取消或错误时保留已收到的文本、步骤与失败回执,不能把正在执行的工具保存为成功。
57
57
 
58
+ Manifest 原始声明必须在兼容归一化前整体预检:资源集合只能为非空对象组成的数组,省略可选集合时删除属性;非法成员不得静默过滤。冲突的大小写集合别名、大小写不敏感的重复表名/接口 Key/数据源 Key,以及同表重复字段名/显式索引名须在任何资源调用前拒绝。合法局部更新、相同别名和不同表的同名字段继续兼容。通过 `microi_get_manifest_schema.declarationPreflight.version=1` 发现能力;源码、离线处理器测试和已加载工具分别核对。此门禁不代表跨资源事务,也不能代替服务端权限和写后回读。
59
+
58
60
  建表和新增字段的 DDL 来自已鉴权 MCP 端点开启的内部 ORM observer,在真实 DbCommand 执行前、返回或失败时记录安全语句,不从模型计划推测。字面量、默认值、注释及含歧义的双引号段隐藏,只返回有界 TABLE/INDEX DDL,不返回 DML 值。`submitted/executed/failed` 与 `TransactionPending` 是数据库执行阶段,不等于最终事务提交;截断必须标明。局部 HTTPS 联调只使用系统证书链与 localhost 名称验证通过的公开链,专属 Node 临时 CA 文件严格限权并在退出后清理;不关闭 TLS、不导出服务端私钥。
59
61
 
60
62
  在线工具网关仅转发当前请求的真实 DiyToken 与租户到同版 MCP,不创建服务账号或提权 Token;不继承宿主其它凭据。每次调用前复核当前管理员权限,模型只能提出调用建议,MCP 继续负责参数 Schema、写操作确认、幂等、审计和权威回读。对浏览器本地文件,先通过受控上传取得服务器可读内容,不能把客户端路径当作 API 节点路径。
@@ -80,10 +82,15 @@ MCP 可信写前校验分支确认未执行时标记 `notExecuted`,保留安
80
82
 
81
83
  `Chat/ChatStream` 虽声明 GET/POST,含问题、附件和会话上下文的业务调用默认使用 POST,避免敏感内容进入 URL 日志。Controller 和 `V8.AI` 必须从可信执行上下文覆盖当前用户和 `OsClient`,并清除客户端提交的 `ApiKey/Endpoint`。所谓打字机效果必须来自真实 SSE 增量块;`microi_chat` 只返回最终结果,不能被描述成逐 token MCP 流。
82
84
 
85
+ 普通聊天与 NL2V8 流式运行时通过可选 `IAiCancellableStream` 接口接收 HTTP `RequestAborted`,联结模型超时并传入 SDK;既有二参数接口兼容保留。支持该接口的 Core、AI 与 API 必须一起交付,旧 AI 模块回退路径不能声称具有取消传播。`DataAppend.CompletionStatus` 区分 `Completed/Cancelled/TimedOut/Truncated/Filtered/Incomplete/Failed`,只有明确正常结束且非空输出返回 `Code=1`;部分结果保留在 Data/增量回调中,不能自动保存为成功。HTTP `done` 只表示传输结束。取消/断流不撤销已完成工具写入或供应商费用,不自动重试;普通聊天空流不再隐式追加第二次模型请求。NL2V8 关键词扩词接收同一取消信号;数据库/可选向量查询仍有独立超时,当前仅在查询前后检查取消,不能宣称所有外部查询已即时中断。
86
+
83
87
  安全数据分析的新客户端调用 `/apiengine/platform-ai-runtime` 并固定 `Action=NL2SQL`;旧 `/api/Ai/NL2SQL` 只保留兼容转发。最终都由租户/用户绑定的 `V8.AI.NL2SQL` 从当前用户权限生成表白名单;任何通用包装接口都不得接受客户端自报的表名作为授权。
84
88
 
85
89
  ## 代码分层
86
90
 
91
+ - OpenAI 兼容代理按完整 SSE 事件判断模型终态;只在全部请求候选都有显式已知 `finish_reason`、有文本/工具调用载荷且无错误时,给正常 EOF 补单个 `[DONE]`。已有终止帧即为传输边界,忽略其后数据;纯 EOF、取消、空答案、错误和冲突终态不能变成功。`length/content_filter` 保留原值,传输结束不等于业务答案完整;原有计量来源与记录继续生效。正常及错误 body 读取须传取消信号,并沿用代理总超时。需部署包含该修复的新 AI 后端,不能以商城/MCP 更新冒充上线。
92
+ - 固定 JSON 基准须显式记录思考设置。`microi.benchmarks/ai-quality` 协议 1.1.0 对 MiniMax-M3 的两个条件同样固定 `reasoning_split:true`、`thinking:{type:'disabled'}`;其它模型不发送未经确认的参数。保留 1.0.0 失败结果;不剥离任意回答或取消终止帧验收来制造通过,不把不同思考配置比较成效率收益。供应商能力以官方文档和当前实际回执为准。
93
+
87
94
  AI 业务统一实现在 `Microi.Server/Microi.AI`。`Microi.Server/Microi.net.Api` 只是 HTTP、SSE 与 SignalR 传输层,可以做路由、请求绑定、读取认证中间件产生的可信用户/租户、传递取消信号和写响应,但不能承载模型选择、Schema/Skill 检索、NL2SQL 授权与执行、提示词编排、代理路由、供应商密钥、额度计量、订阅支付状态或 AI 工作流。
88
95
 
89
96
  - Controller、Hub 只调用 `IMicroiAI`、`AiProxyService`、`SubscriptionService`、`AiWorkflowService` 等 `Microi.AI` 门面,不直接查询 `mic_ai` / `mic_sub_order`,不接触上游密钥和向量基础设施。
@@ -100,7 +107,7 @@ AI 业务统一实现在 `Microi.Server/Microi.AI`。`Microi.Server/Microi.net.A
100
107
 
101
108
  ### 媒体目录与图片任务的 Managed 调用
102
109
 
103
- - 后端新增 `V8.AI.GetMediaModels()`、`GenerateMiniMaxImage(param)`、`GetMiniMaxImageTask(taskId)`、`RecoverMiniMaxImageTask(taskId)` 四个原子。前端及 Microi Agent 调用 `/apiengine/platform-ai-runtime` 的同名 `Action`,后端 V8 可直接调用原子,不自请求本机 HTTP,不新增第二套媒体编排入口。
110
+ - 后端新增 `V8.AI.GetMediaModels()`、`V8.AI.GenerateMiniMaxImage(param)`、`V8.AI.GetMiniMaxImageTask(taskId)`、`V8.AI.RecoverMiniMaxImageTask(taskId)` 四个原子。前端及 Microi Agent 调用 `/apiengine/platform-ai-runtime` 的同名 `Action`,后端 V8 可直接调用原子,不自请求本机 HTTP,不新增第二套媒体编排入口。
104
111
  - 当前租户和用户绑定于可信 V8 上下文,匿名拒绝;图片任务提交沿用既有运行时的模型、许可、权限、配额与幂等校验。查询和恢复只访问该租户、该用户拥有的任务。目录仅安全投影,Hook 仍只接收来源、阶段和动作,不接收媒体、提示词、任务号或密钥。
105
112
  - 提交持久任务后保存原 `RequestId`、`TaskId` 及服务器/租户/账号归属;`Code=2` 仅表示受理。超时、断连、空响应先复查原任务,不能换 Id 重发。恢复仅复用已经保存的供应商回执与结果,不重新生成;没有回执的未知结果明确失败或保持未知,不能伪造成功。
106
113
  - 四个原子、Managed 引擎和消费者需一起验收;应用包或版本号不代表服务器能力已部署。至少验证匿名拒绝、跨租户/跨用户隔离、请求参数白名单、幂等回放、未知结果复查,以及图片持久地址回读。没有线上回执时只报告源码与测试已完成,不声称某一版本已经上线。
@@ -130,14 +137,20 @@ AI 业务统一实现在 `Microi.Server/Microi.AI`。`Microi.Server/Microi.net.A
130
137
  - 管理端【AI视频】应按 `TaskHandle` 轮询任务,成功后优先转存 HDFS,并用 `<video controls preload="metadata">` 原页预览和明确下载按钮消费同一个已校验地址。临时 URL、生成完成、HDFS 转存、媒体可播放和外部平台发布是五个不同事实,必须分别验收。
131
138
  - 使用 Microi.AI 中转站时,租户侧 AI Bootstrap 通过官方 `official_ai_relay_models` 发现可用运行模型。该接口是跨租户只读公共契约,必须保持启用、允许匿名 HTTP 调用,并且只返回模型标识、展示名等公开白名单字段,绝不能返回中转密钥或上游 Endpoint。消费者不得把 `NoAuth` 静默伪装为“没有配置模型”;应返回可诊断错误,同时前端显示明确空态。
132
139
  - PC、UniApp 和其它客户端通过 `POST /apiengine/{key}` 发送的 JSON Body 必须完整进入 `V8.Param`;兼容入口 `/api/ApiEngine/Run` 的 JSON Body 还必须包含 `ApiEngineKey`。API 层只负责请求绑定和清除客户端伪造的可信字段,模型选择、权限策略与对话逻辑仍全部位于 `Microi.AI` 或受控 AI 接口引擎中。
133
- - 当前计量记录除问题摘要外还可能持久化完整 `Question`、`Answer`,部分诊断日志也会输出问题或摘要。处理现有版本时必须把这些字段视为敏感业务数据,限制查询权限和留存;不要声称已经全面脱敏。
134
- - 发布目标是日志只记录 trace id、模型、耗时、token 计数和状态,Prompt/Answer 按租户策略脱敏,密码、Token、连接串和完整业务数据不落日志。该目标必须用源码和真实数据回读证明。
135
- - OpenAI 代理流式接口会传递 HTTP 请求取消信号;普通 `ChatStream` 与 `NL2V8` 当前主要使用内部超时 Token。不要声称浏览器断开一定立即终止上游调用或计费。
140
+ - 本轮源码的两条中转计量写入路径将 `PromptPreview/Question/Answer` 绑定为空字符串;用量查询只投影计量与关联字段,不返回旧正文预览。旧物理列保留兼容,不批量删除历史数据,不改变数值计量事务或用户主动保存的会话历史。正式运行以目标版本发布和实际读回为准;部署旧版本时这些字段仍可能保存正文。
141
+ - 普通聊天/NL2V8 诊断仅记录长度、状态、异常类型;NL2V8 异常响应也不回显异常正文。历史日志、旧账本、会话存储、其它 AI 分支及外部供应商留存需单独审计;不能据此声称全平台全面脱敏或统一留存策略已完成。
142
+ - 流式回执 `UsageSource=Provider` 仅用于 SDK 实际返回的用量,缺失为 `Unavailable`;存量中转计量估算保留且另标 `RelayUsageSource=Estimated`,不得当作供应商实际 token 或费用。公开实测可用 `microi.benchmarks/ai-quality` 固定合成任务协议,模拟夹具必须标 `harness-test`,真实供应商回执标 `real-provider`;结构化 JSON 校验不能替代端到端数据库/界面/权限验收。
143
+ - OpenAI 代理、普通 `/api/Ai/ChatStream` 与 `/api/Ai/NL2V8Engine` 将 HTTP 取消信号传递到对应模型流读取,并与模型超时组合;`IAiCancellableStream` 为普通聊天提供可取消契约。取消/超时/长度截断/上游失败不能标为完整成功。取消不撤销供应商已经发生的用量,也不能承诺网络断开瞬间停止上游计费。
144
+ - 中转无限额度使用 `mci_ai_token_account.IsUnlimited=1` 的独立权益,不能把负数或极大余额当作无限。赠送余额保持有限数值,无限期间按该调用既有的计量来源继续累计 `UsedTokens` 与脱敏用量账本而不减 `RemainingTokens`,供应商用量缺失时仍可能为估算;各余额预检与扣量 SQL 均读取服务端当前权益,撤销后恢复有限余额规则。该权益不代替服务器 License、登录/API Key、付费订阅、供应商配额或并发保护。
145
+ - 管理中转权益复用 Managed `platform-ai-account`:先 `GetRelayTokenAccount({TargetUserId})`,再 `SetRelayTokenLimit({TargetUserId,IsUnlimited,ExpectedUnlimited})`。后两参数必须为布尔值,ExpectedUnlimited 必须来自刚回读状态;仅当前配置主租户、数据库仍有效的平台管理员可调用,访问密钥与子租户均拒绝。无账户的读取不开户;设置可受控初始化默认赠送账户,多条有效账户立即失败。写后回读 `AccountExists/IsUnlimited/GiftTokens/UsedTokens/RemainingTokens/UnlimitedUpdatedBy/UnlimitedUpdatedAt`,不能只看 Code。
146
+ - MCP 使用既有 `microi_run_engine` 调用同一 Managed 动作,`V8.Method.ManageAiPlatform` 负责可信身份、并发条件更新与计量原子。普通客户端 FormEngine 无权直改账户/用量表;获授权可编辑后端代码仍属于可信开发执行权,不能宣称任意服务端脚本被账本表分类隔离。字段由官方 AI 应用升级,旧库缺列按有限额度兼容,管理设置要求先完成宿主与应用包同步升级;不得临时维护引擎、SQL 绕过 MCP 或清空消费历史。
147
+ - 在途请求若在预检后被撤销权益,或有限余额被其它请求消耗,扣量时按数据库当前状态拒绝不足余额,不沿用旧无限快照、不自动补扣。供应商已经发生的用量可能未进入本地成功账本,应另查供应商回执;不能宣称所有失败用量均已完整入账。
148
+ - 无限权益能力要求 Core/AI 宿主至少 `8.7.0`、官方 AI 应用至少 `7.7.8`、`platform-ai-account` 至少 `1.1.1`;MCP `6.1.5` 的通用 `microi_run_engine` 可调用。当前用户的官方中转摘要/用量同样只在可信主租户上下文访问,子租户不能以相同用户 Id 读取主租户账户。
136
149
 
137
150
  ## 跨端 AI 助手与商城交付
138
151
 
139
152
  - PC 与移动端复用 `mci_ai_data_assistant`。`Bootstrap` 返回的 `Enabled`、`Models`、`AllowedDomains` 和 `Prompts` 是跨端共同事实源;快捷问题来自启用的 `mci_ai_data_domain.PromptExamples`,前端不能维护另一套固定文案。
140
- - 官方 AI助手应用归 `app.microi.ai-engine`。v6.3.6 的接口引擎必须严格只有 Managed `mci_ai_data_assistant`、Managed `platform-ai-account`、Managed `platform-ai-runtime` 和 CreateIfMissing `platform-ai-custom-hook` 四项,并声明 `V8.Method.ManageAiPlatform`、`V8.Method.RequireManagedProtocolContext` 与所需 `V8.AI` 能力;后端缺少任一能力时安装预检失败关闭。
153
+ - 官方 AI助手应用归 `app.microi.ai-engine`,接口引擎保留 Managed `mci_ai_data_assistant`、Managed `platform-ai-account`、Managed `platform-ai-runtime` 和 CreateIfMissing `platform-ai-custom-hook` 四项,并声明 `V8.Method.ManageAiPlatform`、`V8.Method.RequireManagedProtocolContext` 与所需 `V8.AI` 能力。`RequiredPlatformCapabilities` 是发布与 CI 校验的包声明,不能声称安装器逐项探测运行能力。安装器 v3.1.1 或更新版本按 `ServerMinVersion` 读取真实 Core 版本并在写入前校验;AI 应用 v7.7.8 最低为平台 8.7.0。版本校验不能识别混装旧 AI 程序集,仍需部署匹配的 Core/AI/API,并实际调用管理动作和回读结构。
141
154
  - `ai_app_list`、`ai_app_detail`、`ai_app_get_file`、`ai_app_save_file`、`ai_app_create`、`ai_app_build`、`ai_app_preview`、`ai_app_download_source_zip`、`ai_app_download_build_zip`、`ai_app_moveobject_probe`、`ai_app_moveobject_exec_probe`、`ai_app_publish_store` 这 12 个 `ai_app_*` 归 `app.microi.store` 维护。AI助手包移除它们的资源选择和所有权声明,但不会删除目标租户既有运行时接口记录;既有记录继续由应用商城包升级。
142
155
  - v6.3.6 还必须保持 AI助手包的 DDL、PhysicalColumns、DiyTables、DiyFields、DataSets 全层不再包含重复的 `mci_ai_app_version`、`mci_ai_app_file`、`sys_microistore`,这些表交回 Store/SaaS 既有平台包维护;当前仅 AI助手包拥有的 `app_mic_aiapp`、`mci_ai_app` 继续保留。
143
156
  - 普通角色读取业务数据必须匹配启用的 `mci_ai_role_policy`,这不是常规对话的前置条件。只有后端可信的 `V8.CurrentUser.Level >= 9999` 可以在新安装租户缺少角色策略时获得数据分析安全兜底:从目标租户动态读取已启用业务域和模型,范围为 `All`,仍保持 `AllowRawSql=false`、敏感字段默认关闭。不得相信客户端提交的 Level、角色名或账号名。
@@ -13,6 +13,10 @@
13
13
 
14
14
  ## 模型与持久执行
15
15
 
16
+ 项目群中同一员工的桌面模型按租户、负责人和员工标识持久绑定,不随新群创建而重置。保存时只提交本次选中的员工;已有群和新群读取同一绑定。旧群配置唯一一致时可只读继承,冲突时保留原值,由负责人明确选择;密钥和 Endpoint 继续留在本机。已经排队或执行中的运行保留原始模型快照,只有确认尚未调用模型的安全重试才重新读取当前绑定。
17
+
18
+ 项目列表置顶优先,其余按最后消息倒序;无消息的新群按创建时间排序。置顶、归档和恢复属于当前用户的群成员偏好,不删除群、消息或工作链,不改其它成员的列表。列表时间与绑定需要有界批量读取,不能按群查询完整历史;新 schema 与受管引擎通过新的应用商城版本交付,源码或浏览器夹具通过不等于线上升级完成。
19
+
16
20
  后端 `V8.AI.Chat` 的 `AiModel` 不能假定可留空。先从当前用户获授权的目录选择 `AiModel / AiModelId`;显式模型不可用时失败,不能静默切换账号。Key 与 Endpoint 保留在可信后端。
17
21
 
18
22
  长调用通过平台持久后台任务执行。领取先提交,再调用外部模型;组合稳定幂等键、数据库条件写入、租约和旧执行者拒绝。调用无法回滚时,独立保存开始标记;重启后结果未知就核对,不盲目重发。等待模型时不能持有业务行锁。
@@ -15,6 +15,13 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
15
15
 
16
16
  应用包是声明式资源的权威交付边界:当前包标记为 `Managed` 的表单元数据、菜单、字段、接口引擎等资源按包覆盖;当前包标记为 `CreateIfMissing` 或 `InsertIfMissing` 的租户扩展/配置只补缺。覆盖安装不等于整表清空,仍禁止把发布方租户业务数据、密钥或连接配置原样复制到目标租户。
17
17
 
18
+ ## 最低运行版本与只读预检
19
+
20
+ - 从安装器 v3.1.1 开始,`PackageInfo.ServerMinVersion/ClientMinVersion` 接受可选 `v` 前缀的三段或四段非负整数版本;不接受范围、预发布后缀、非字符串或不合法数字。省略、空白或 null 保留旧包兼容,返回 `NotDeclared`,不得宣称已经核验。
21
+ - 后端只信任当前节点 `V8.Method.GetBackendVersion()`,低于要求返回 `PACKAGE_RUNTIME_VERSION_TOO_LOW`;有声明但能力缺失、异常或运行版本无法解析返回 `PACKAGE_RUNTIME_VERSION_UNAVAILABLE`。格式错误返回 `PACKAGE_RUNTIME_VERSION_INVALID`。直接包、下载包、Managed 同版本重装和每个后台续跑分片都在任何安装写入前核验,不采信请求参数或历史检查点里的版本。
22
+ - 服务端无法可信获取浏览器实际部署版本,前端声明仅返回 `PendingClientVerification` 和警告;不得从 `V8.Param.ClientVersion` 冒充检查通过,也不能据此宣称前端已部署或验收。
23
+ - 使用现有 MCP `microi_run_engine` 调用 `import-microi-store-package`,传 `ValidateOnly:true`(或 `Action:"validate"`)检查结构及 `Data.Compatibility`。只读预检不得运行物理引导 DDL、更新后台进度或写包正文缓存;它不替代正式安装任务和资源回读。无需新增工具或绕过 MCP;升级应用商城交付安装器,目标后端没有可信版本原子时先升级后端。
24
+
18
25
  ## 平台升级的应用商城边界(强制)
19
26
 
20
27
  - 默认启动只恢复表单、模块、系统设置的核心结构与普通账号登录、权限、导航、商城安装所需资源;由一个 `app.microi.bootstrap` 投影包交付,不等于完整安装其来源应用。SSO、AI、通知、备份、OCR、翻译、工作流及 SaaS 管理界面等按需从商城安装。新增平台包、配置字段或微服务页面不能自动加入启动恢复范围。本文历史复盘中提到的九包/106 接口方案已经收缩,不再作为默认启动要求。
@@ -278,7 +285,9 @@ staged 行、请求参数、`StableFilePathName` 或外部 CDN URL 推断版本
278
285
  - 每个主租户和子租户都可以发布自己的应用;应用行用 `IsPublic` 表达公开范围,缺省/历史空值按公开兼容。公开应用允许未登录来源读取和安装,私有应用只允许来源登录成功后的授权身份读取,列表、详情、版本接口都必须重复执行这一权限判断。
279
286
  - 组合包的 `ApplicationBundles[].Application` 必须由发布器从源应用实际记录携带 `IsPublic/IsApprove`,不接受请求参数替代。安装器只接受 `0/1`、`"0"/"1"` 和布尔值,显式源标记优先;未审批的源不能因 Build 成功变成已审批。历史包无公开标记时,已有目标保持原值(含历史空值),首次新增运行应用显式 `IsPublic=0`,不能继承目标 Switch 默认1。无效声明在直接包入口任何 I/O 前失败;下载包在读取正文后、该包资源/文件写入前失败,旧库既有物理前置兼容检查不因此重排。父商品 AppId/公开范围、目标拥有者和源码下载独立鉴权不得随运行标记改变;验收必须覆盖新私有、已有私有/公开、显式公开、旧包新建/重装、非法类型零包写入和即时撤权。
280
287
  - 新版安装包正文不得长期内联在 `sys_microistore.AppPakcet`,也不得随 `mic_data_version.Data` 重复复制。公开应用写入 HDFS 公有桶并记录 `HdfsPublic`,私有应用写入私有桶并记录 `HdfsPrivate`;数据库只保存 `PackageId/PackageHdfsPath/PackageSha256/PackageSize/PackageContentType/PackageFormatVersion/PackageUploadedAt`。`IsPublic` 历史空值按公开兼容,但所有新建应用必须显式落为 `1/0`。
281
- - 发布顺序必须是“UTF-8 JSON 上传 → HDFS 回读 → 字节数和 SHA-256 一致 → 写入不可变包索引及商城指针 → 以原值 CAS 清空 `AppPakcet`”。普通发布不得仅凭 Redis 命中跳过 HDFS 回读;只有受控历史压缩可复用内容寻址缓存,安装端仍必须独立下载并校验。公开包可通过 FileServer/CDN 公有地址读取;私有包只能由来源后端在当前授权身份下签发短期下载地址,Token、签名 URL 和包正文不得进入浏览器配置、日志或后台任务参数。
288
+ - 发布顺序必须是“UTF-8 JSON 上传 → HDFS 回读 → 字节数和 SHA-256 一致 → 写入不可变包索引及商城指针 → 以原值 CAS 清空 `AppPakcet`”。普通发布不得仅凭 Redis 命中跳过 HDFS 回读;只有受控历史压缩可复用内容寻址缓存,安装端首次下载与后续缓存命中均必须独立核对正文大小与 SHA-256。公开包可通过 FileServer/CDN 公有地址读取;私有包只能由来源后端在当前授权身份下签发短期下载地址,Token、签名 URL 和包正文不得进入浏览器配置、日志或后台任务参数。
289
+ - `MARKETPLACE_VERIFIED_PACKAGE_CACHE_V1` 用于详情摘要与安装分片的重复整包下载治理。每租户每用途一个固定槽,原文上限64 MiB、序列化上限96 MiB、TTL900秒且命中不续期;不能按应用/版本无限增键。缓存只写入已校验正文,绑定来源ApiBase/OsClient、当前租户、Id、StoreVersionId、PackageHdfsPath、存储范围、SHA与大小,不存签名URL或凭据;每片仍先重新读取来源权限与权威指针,命中重新校验实际字节与SHA。缓存损坏/故障/超限回退完整下载,不能为了减少下载取消后台分片或把包正文塞进checkpoint。详情`PackageContentRead`及导入诊断`marketplace_package_read`只报告包下载字节,测试覆盖撤权、来源/快照/路径变化、污染、不可用与固定槽有界;真实同包两次读取须有`VerifiedDownload → VerifiedCache / NetworkBytes=0`回执。官方发布源禁止运行安装器,客户安装与包发布分别验收。
290
+ - `MARKETPLACE_VERIFIED_PUBLIC_PACKAGE_ROUTE_V1` 只为当前来源公开 `HdfsPublic` 的精确 `packages/*.json` 选择传输地址。模型用 `GetPublicResourceBackupUrls`,安装器只向已固定来源 `ApiBase + OsClient` 的 `mci-file-resource-public-url` 做一次有界匿名查询;不能调用目标租户 resolver 代替来源。结果必须核对 `GenericPublicResourceRoutes/1`、来源租户、Binding 的 BackupOrigin/PublicBucket/TargetConfigHash、精确 ObjectKey、短效期限和不可变目标路径,且 `VerifiedSha256/VerifiedSize` 等于权威快照的 PackageSha256/PackageSize;SourceRevision 不是内容摘要。私有、跨租户、非包路径、旧合同及无效回执保持原地址,不能复制或公开私有包。实际下载继续原始字节 SHA/大小校验,凭据不转发 NAS;缓存命中不再次查询路由,不持久化路由 URL,不重写源包指针、版本或后台 checkpoint。长期阈值资格归调度器管理,与两分钟健康回执分开。回归必须执行旧直链故障/新 NAS 成功、未 Ready、错误 hash/size、历史快照、当前撤权、恶意 URL/路径、跨来源和缓存复用;正式包需同步独立脚本、商城内嵌与最小启动副本后发布回读,单元测试不算生产分流。
282
291
  - `mic_data_version` 历史快照保留不可变 `StoreVersionId` 和同一组包指针,因此旧版本仍可精确安装,不再要求 `Data` 内含完整 JSON。导入器先校验快照版本/应用身份,再按指针下载并在解析前核对大小与哈希;指针缺失时才回退旧版内联字段,禁止快照不匹配时退回当前版本。
283
292
  - 旧库容量治理使用 `compact-microi-store-packages` 超级管理员持久后台任务:先幂等补齐物理列,再用有界 `Id` 游标逐批处理;每个包都先上传回读,随后 CAS 清理当前行或历史快照。禁止对数 GB `mic_data_version.Data` 执行全表 `LIKE`/包正文计数。逻辑大字段清空后,MySQL 表空间文件是否立即缩小取决于存储引擎;`OPTIMIZE TABLE` 只能在备份完成的维护窗口由管理员另行执行,不能由应用安装或压缩任务自动触发。
284
293
  - 商城来源以 `ApiBase + OsClient` 唯一定位。添加来源先只读发现系统标题、验证码策略和公开应用数;需要私有应用时再登录。帐号、密码、Token 不能写浏览器配置或商城来源 JSON;密码只用于本次登录,长会话 Token 以 `MCP/Mobile` 非 PC 客户端签发,并由当前租户后端加密保存到 `mci_system_setting`,浏览器只持有不具备取密能力的凭据 Key。
@@ -9,7 +9,7 @@ description: Microi 业务架构蓝图(System Blueprint)— 设计期系统
9
9
 
10
10
  ## 这是什么
11
11
 
12
- 业务架构蓝图是 Microi 吾码的 **设计期系统总图**,不是 n8n / Dify / ComfyUI 那种运行时工作流。它一次同时承担三个职责:
12
+ 业务架构蓝图是 Microi 吾码的 **设计期系统总图**,用于描述系统组成、业务关系和治理约束。它一次同时承担三个职责:
13
13
 
14
14
  1. **可视化总图** — 用户在前端 X6 画布拖拽节点,完整描述一个业务系统的组成
15
15
  2. **AI 事实源** — AI 生成代码、表、接口引擎、菜单前必读的"宪法",防止幻觉
@@ -64,6 +64,18 @@ Quartz 管理能力包含查询、添加、更新、暂停、恢复、删除任
64
64
 
65
65
  锁只能减少并发,不能替代幂等。
66
66
 
67
+ ## 公开热点分流的固定调度入口
68
+
69
+ 以下协议适用于包含通用公开对象 v3 的后端候选;任务元数据、应用包和客户端均须另有部署回执,不能用本文或离线测试推断已经在线分流。
70
+
71
+ - 任务表为 `diy_schedule_job`,固定 `JobName=microiPublicResourceOffloadScheduler`、`ApiEngineKey=mci-file-resource-scheduler`、`JobType=1`、`Status=正常`。只由 Quartz 原生分派进入受信调度原子;每次从当前主库回读,重复、已删除、停用、改名或改 Key 均拒绝。可编辑 V8/普通 HTTP 不能伪造宿主上下文或通过 CLR 直调运行时;目录和任务资源通过应用包交付,管理员管理沿标准 MCP;固定任务保存额外要求当前主租户管理员主库复核,拒绝访问密钥会话和仅具通用任务写权的角色。Quartz 副作用之前按当前主库、参数化 Id/名称、5 秒命令读取旧身份;新旧任一名称大小写等价命中保留任务均复核,禁止用旧 Id 改名或大小写变体绕过。
72
+ - Quartz 与旧 `PublicResourceOffloadHostedService` 共用 `PublicResourceOffload:tick` 租约;主租户范围、当前持有者、续租、fencing 和签名状态共同约束执行。管理员标准保存确认元数据持久化后,对固定主租户任务在同一租约内写入签名 `scheduler-handoff`;已暂停的合法任务也可接管,但不执行采集。表单事务 `RuntimeOnly` 路径不提前跨写,仍由首次合法原生 tick 接管。保存成功而接管未确认时返回部分保存提示,先回读,不盲目重建。接管后暂停、删除、改名、禁用任务不自动恢复旧 HostedService;handoff 按 Revision CAS 写入主库签名状态,进程重启和 Redis 丢失仍保持接管,主库不可读失败关闭。恢复必须修复原受控任务,不能删除标记绕过停用意图。
73
+ - 采集使用独立共享租约 `PublicResourceOffload:cloud-collection` 与 30 分钟 `NextAtUtc` 门禁;手动 Collect 同样受限,没有调用方 force 绕过。最新完整北京时间自然日、1 GiB / 24 小时仅为已观测字节正向下界;TOP 榜不是全部路径,空值不当零,不用客户端上报字节制造晋级。首次可信达标保存持久偏好,后续低流量不取消;新版本仍重验公开权限/副本,显式停用不被采集自动恢复。
74
+ - 每轮 4 分钟执行预算,租约最多 5 分钟。预算耗尽保存可恢复检查点并返回 `State=BudgetReached, Partial=true, AllResourcesReady=false`;`Code=1` 仍不等于所有资源复制或分流完成。外部取消、采集失败、失租和发布失败分别保留真实结果;单轮不能承诺任意体积全量复制。已确认的 8 MiB 私有暂存块可复用,通用复制受单对象 64 MiB、组 256 MiB、含入口 128 对象限制。
75
+ - 先安装拥有方应用包的 mci_file_offload_state 和 Owner/StateKey 唯一索引再部署新后端,缺表失败关闭。主库单条命令 5 秒,恢复最多 2000 条身份及 32 MiB 回执,超限/并发变更整批拒绝。4 分钟是调度预算,不承诺全部同步数据库或远端 I/O 在该时刻绝对结束;阿里云同步 SDK 使用自身 20 秒超时,取消后可能仍有在途尾部。MinIO 策略 SET 没有远端原子 CAS/fencing,前后验租、策略比对及未知结果回读无法消除外部策略写入竞态;未知结果不盲重写,不把本地租约或离线测试称为远端副作用“恰好一次”。
76
+ - 复制、Ready、公开授权、旧前缀撤权均验证当前租约;源 ACL/版本变化或停用先停止新路由,按签名 `PublishedRuns` 对旧授权逐项回读和匿名拒绝核验。旧目标无法绑定时阻断并保留未撤销事实,不能因任务返回成功而宣称旧 URL 已失效。暂停整个任务也停止后台复制/撤权推进;需要完成撤权时应保持该受控任务可运行,并先停用对应资源。
77
+ - 验收覆盖 job/host 同时竞争、双节点领取、失租前后副作用、暂停/删除后不退回 host、改 Key/主库不可用/CLR 拒绝、4 分钟部分工作恢复、源版本或权限变化、旧目标未知,以及真实消费者的第一次请求。私有、独立 JS 缺可信清单、旧富文本 HTML、Three.js 硬编码和平台 bootstrap 不因任务存在而自动分流;七个已接入客户端文件及完整边界见 `../v8-file-upload/SKILL.md` 与官网 `more/hdfs.md`。上线、小时请求下降、完整日费用下降必须分层独立验收。
78
+
67
79
  ## 任务骨架
68
80
 
69
81
  ```js
@@ -90,6 +102,9 @@ return { Code: 1, Data: { IdempotencyKey: idempotencyKey } };
90
102
  - 先证明任务真的在执行:读 `Scheduler.IsStarted`、`Scheduler.NumberOfJobsExecuted` 和 `Acquisition.LastAcquisitionError`,参考 `microi.doc/docs/doc/system-engine/job.md` 的“任务不执行”。`diy_schedule_job.Status=正常`、`diy_schedule_job.NextTime` 和“插件启动成功”都不能证明触发成功;列表/详情页的 `LastTime/NextTime` 来自运行时,直接查表看到的是库内快照。
91
103
  - 领取错误含 `Key 'IDX_microi_job_T_NFT_ST' doesn't exist` 时,是 Quartz 3.19 MySQL 方言依赖 `USE INDEX (IDX_{tablePrefix}T_NFT_ST)` 与 `IDX_{tablePrefix}T_NFT_ST_MISFIRE`,而触发器表缺少这两个索引(常见于历史租户库仍是旧 `QRTZ_` 前缀索引名)。平台调度器初始化会按前缀幂等补齐;人工抢修可直接执行文档中的两条 `CREATE INDEX`,索引名大小写不敏感,补完后无需重建任务或 Cron。
92
104
  - 失败记录错误分类、重试次数和 `NextRetryTime`,采用有上限退避;永久错误进入人工处理。
105
+ - 大应用包安装返回 Id 后长期 `Pending/AttemptCount=0`,先回读原任务和 `WorkerClaimFailed` 持久栈。旧版完整 `ParamJson` 共用 2 秒候选扫描时限,数据库慢读可能触发驱动超时处理中的空引用;不得凭异常文案归因业务脚本或重复提交。新版候选仅含领取必需字段,完整参数在已领取的执行槽中以任务 Id、租户、owner/fence 和有效租约约束读取,独立上限 30 秒,读后再验租约;读取失败不执行正文,仅释放本次仍拥有的租约。验收覆盖大参数慢读、读失败、读取期间租约变化和原任务成功终态;需要更新后端,MCP/CLI 升级不能代替。
106
+ - 已领取的后台任务执行失败时,先按原任务 Id 回读真实状态,再查系统日志 `Source=BackgroundTask`、`Action=ExecutionFailed`。脱敏诊断用 `Stage` 区分接口引擎执行(`ApiEngineExecution`,也包括执行前的权威引擎读取)、分片进度写入(`ContinuationProgress`)、分片重新入队(`ContinuationPersist`)和终态写入(`TerminalPersist`);后者表示 `Complete` 本身失败,不能据此认定业务脚本失败。结合 `OwnerOsClient/ExecutionOsClient`、运行环境、`TaskId/Fence` 关联原任务;安全异常链最多 4 个节点,保留类型、`HResult`、可读取的提供商 `Number/SqlState/SocketErrorCode` 及每节点最多 4 个 CLR 方法名,不包含源码路径、行号或实参。
107
+ - 此诊断不记录异常消息正文、SQL、参数或连接串。`MessageSha256` 仅用于关联相同消息前缀:最多取前 65,536 个 UTF-16 字符后编码为 UTF-8 计算摘要,并同时记录 `MessageLength/MessageHashChars/MessageHashTruncated`;不能把截断摘要当作完整消息或根因证据。诊断走既有 `QueueSystemLog`,接受入队不等于已经持久化,必须实际查询到日志才算取得诊断证据;日志拒绝或异常不改变原任务的重试、事务、租约和失败结果,也不能触发重复提交。
93
108
  - 外部调用设置超时;无法确认对方是否成功时用业务幂等号查询,不盲目重发。
94
109
  - SQL Server 业务库可用但商城保存任务时报证书链不受信任时,核对调度节点主数据库连接串和实际后端版本。Dos.ORM 的 `System.Data.SqlClient` 与 Quartz 的 `Microsoft.Data.SqlClient` 缺省加密策略不同;插件仅为缺少 `Encrypt` 的旧串显式保留 ORM 的可选加密语义,普通注册和延迟初始化共用此策略。显式 `Encrypt/TrustServerCertificate` 必须保留,不能全局添加信任证书或吞掉任务保存失败。正式环境优先受信任证书;自签名测试环境仅由管理员显式配置。更新后端或连接配置后重启调度节点,再重装并回读 Quartz 任务及触发器,不能以元数据存在代替。
95
110
  - 服务停机先停止接单,再在有限宽限期排空或持久化;重启扫描未完成任务。
@@ -15,6 +15,8 @@ description: 设计、实现、迁移和验收 Microi 多通道消息通知与
15
15
  - `microi_manage_system_reminder` 提供 `Validate / Save / Publish / Withdraw`,确认串为 `<action>:<id或requestId>`。保存仅草稿;发布前核对用户已经授权的具体内容、范围与时间。保存/发布使用稳定 `requestId`,编辑/发布/撤回传最新 `expectedRevision`,超时先按原 Id/Key 回读,禁止换请求标识盲目新建。
16
16
  - `AccountScope` 在本租户 `Users` 默认 `AllAccounts`,在 `Tenants / Editions` 默认 `SuperAdmins`;不要让已指定的普通帐号被默认管理员筛选误排除。用户显式指定的帐号范围优先。
17
17
  - 配置接口只管理原表、校验引用和读取脱敏投递记录;实际发送继续调用 `msg_event`。`ConfigRevision` 缺省按 0 兼容旧记录,更新使用同事务条件写,失败不能覆盖别人修改。停用旧配置允许保留失效引用,再启用时重新核验。
18
+ - 业务规则详情的“查看投递记录”必须携带规则 Id,日志页提供独立分页读取的全规则筛选,不能只从当前日志页反推选项。MCP `Logs` 使用 `configId` 对应 `MsgEventId` 精确筛选;日志按 `CreateTime DESC, Id DESC` 稳定排序。历史空标题/通道通过本页规则批量映射显示,失败原因脱敏,禁止返回原始 `MsgResult/Payload`。FormEngine 的 CLR 宿主记录先转普通 JSON,再删除敏感字段,不能直接在宿主对象上 `delete`;同时验收真实 Jint 和只读原记录夹具。
19
+ - 微信可信原子先将 dynamic 参数和 FormEngine.Data 落为静态 JObject,避免字符串扩展方法发生动态绑定异常;当前模板的 `thingN/character_stringN/timeN` 等类型化字段必须原样进入 SDK JSON,同时保留旧 first/keyword/remark 和字段数/长度边界。模板必须属于实际 `WxMpId`,未绑定 OpenId、未认证/权限失效与后端缺陷分别排查。通知应用安装不代替 API 镜像部署或真实微信投递验收。
18
20
  - MCP 缺少上述工具时优先更新本机插件/CLI;当前宿主未重载可复用已有 `microi_run_engine` 调用同一固定接口,不另建临时维护引擎或绕过授权。明确区分本机工具打包成功与用户渠道已发布。
19
21
 
20
22
  ## 目标
@@ -119,7 +119,12 @@ Codex Router 启动后会异步调用 bundled CLI 的 `microi update --backgroun
119
119
 
120
120
  ## 同步与安全边界
121
121
 
122
- - 发布扩展与 CLI/AI Plugin 前检查实际 VSIX:完整清单、字节数、SHA-256 和敏感文件扫描回执保存在 `.tmp/development-tools-releases/<版本>/`;逐字节核对 MCP 输出/构建输入与 Skills 全部文件同源。归档超过 64 MiB 或混入签名资料、凭据、桌面安装包、工具链、apps、upstream、同步目录或 node_modules 时停止,修复误包后复测;断点补发使用同一门禁,不用 `vsce ls` 替代归档检查。npm Token 只绑定官方 HTTPS registry,私有 npmrc 仅引用 `${NPM_TOKEN}`;同时固定 `npm_config_userconfig` / `NPM_CONFIG_USERCONFIG` 与 registry 两种大小写变量,避免外层 `npm run` 的配置遮蔽有效 Token。不输出凭据,不因继承错误重复要求登录;已发布正确制品保留,发行内容变化使用新不可变版本。npm、Visual Studio Marketplace、Open VSX 的发布命令明确提示成功即可报告对应渠道发布成功;默认不追加 `--verify-all` / `--verify-only`、版本轮询或下载回读,不因传播延迟重复发布。只有命令报错、结果未知或用户明确要求核验时才查询渠道状态。
122
+ 处理“降低 OSS/CDN 费用、热点资源自动复制到 NAS、FileServerBak”时,先读取
123
+ `v8-file-upload/SKILL.md` 及其 `references/hotspot-offload-operations.md`,再读取
124
+ `system-observability/SKILL.md`。复用 `microi_run_engine` 的受管资源和 CDN 接口,
125
+ 配置使用标准表工具、MinIO 凭据使用专用管理工具;不要仅保存备用地址就报告已分流。
126
+
127
+ - 发布扩展与 CLI/AI Plugin 前检查实际 VSIX:完整清单、字节数、SHA-256 和敏感文件扫描回执保存在 `.tmp/development-tools-releases/<版本>/`;逐字节核对 MCP 输出/构建输入与 Skills 全部文件同源。归档超过 64 MiB 或混入签名资料、凭据、桌面安装包、工具链、apps、upstream、同步目录或 node_modules 时停止,修复误包后复测;断点补发使用同一门禁,不用 `vsce ls` 替代归档检查。npm Token 只绑定官方 HTTPS registry,私有 npmrc 仅引用 `${NPM_TOKEN}`;同时固定 `npm_config_userconfig` / `NPM_CONFIG_USERCONFIG` 与 registry 两种大小写变量,避免外层 `npm run` 的配置遮蔽有效 Token。不输出凭据,不因继承错误重复要求登录;已发布正确制品保留,发行内容变化使用新不可变版本。npm、Visual Studio Marketplace、Open VSX 的发布命令明确提示成功即可报告对应渠道发布成功;默认不追加 `--verify-all` / `--verify-only`、版本轮询或下载回读,不因传播延迟重复发布。用户明确确认其本机终端已发布成功,也作为该渠道的完成依据;不得再要求确认结果行、提供回执或等待 npm/市场公开可见。只有发布命令确实报错、结果未知且用户也未确认成功,或用户明确要求核验时,才按需查询渠道状态。
123
128
 
124
129
  - `Microi-V8-Engine/.microi-config.json` 是三端连接配置事实源;未知字段必须保留。
125
130
  - CLI、VS Code、Codex 与 DeepSeek Harness 插件可以在同一工作区并存;各端必须复用同一配置/Token/MCP 协议,带版本写入实行较新 provider 优先,禁止旧入口回写降级。`doctor.coexistence` 未通过时准确报告兼容风险并后台修复,但不得因此停止无关工作。