openxiangda 2.69.1 → 2.70.1
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/documentation/application-operations.md +14 -0
- package/documentation/data-authz.md +4 -1
- package/documentation/declarations-cheatsheet.md +3 -0
- package/documentation/getting-started.md +7 -7
- package/documentation/manifest.json +8 -8
- package/documentation/multi-organization.md +43 -16
- package/documentation/reference/mcp.md +321 -0
- package/documentation/workflow-events.md +21 -0
- package/package.json +24 -22
- package/releases/2.63.0.json +45 -0
- package/releases/2.63.1.json +46 -0
- package/releases/2.66.0.json +29 -0
- package/releases/2.66.1.json +29 -0
- package/releases/2.66.2.json +29 -0
- package/releases/2.67.0.json +33 -0
- package/releases/2.67.1.json +35 -0
- package/releases/2.67.2.json +34 -0
- package/releases/2.68.2.json +33 -0
- package/releases/2.70.0.json +35 -0
- package/releases/2.70.1.json +34 -0
- package/skills/manifest.json +1 -1
- package/skills/openxiangda-v2/SKILL.md +4 -4
- package/skills/openxiangda-v2/references/application-operations.md +14 -0
- package/skills/openxiangda-v2/references/data-authz.md +4 -1
- package/skills/openxiangda-v2/references/declarations-cheatsheet.md +3 -0
- package/skills/openxiangda-v2/references/getting-started.md +7 -7
- package/skills/openxiangda-v2/references/mcp.md +321 -0
- package/skills/openxiangda-v2/references/multi-organization.md +43 -16
- package/skills/openxiangda-v2/references/workflow-events.md +21 -0
- package/releases/2.68.1.json +0 -33
- package/releases/2.69.1.json +0 -32
|
@@ -288,6 +288,327 @@ MCP 使用项目锁定的根包;在客户端配置下列 stdio 启动参数,
|
|
|
288
288
|
{
|
|
289
289
|
"type": "object",
|
|
290
290
|
"oneOf": [
|
|
291
|
+
{
|
|
292
|
+
"type": "object",
|
|
293
|
+
"additionalProperties": false,
|
|
294
|
+
"properties": {
|
|
295
|
+
"operation": {
|
|
296
|
+
"const": "workflows.legacy-prepare",
|
|
297
|
+
"description": "准备旧审批当前节点接续,冻结原申请人、轮次、历史和Native业务单"
|
|
298
|
+
},
|
|
299
|
+
"environment": {
|
|
300
|
+
"type": "string",
|
|
301
|
+
"enum": [
|
|
302
|
+
"test",
|
|
303
|
+
"production"
|
|
304
|
+
]
|
|
305
|
+
},
|
|
306
|
+
"input": {
|
|
307
|
+
"type": "object",
|
|
308
|
+
"additionalProperties": false,
|
|
309
|
+
"properties": {
|
|
310
|
+
"schemaVersion": {
|
|
311
|
+
"const": "openxiangda.workflow-legacy-adoption-prepare/v2"
|
|
312
|
+
},
|
|
313
|
+
"requestKey": {
|
|
314
|
+
"type": "string",
|
|
315
|
+
"minLength": 1,
|
|
316
|
+
"maxLength": 128
|
|
317
|
+
},
|
|
318
|
+
"reason": {
|
|
319
|
+
"type": "string",
|
|
320
|
+
"minLength": 1,
|
|
321
|
+
"maxLength": 1000
|
|
322
|
+
},
|
|
323
|
+
"expectedHeadRevision": {
|
|
324
|
+
"type": "integer",
|
|
325
|
+
"minimum": 1,
|
|
326
|
+
"maximum": 9007199254740991
|
|
327
|
+
},
|
|
328
|
+
"workflowCode": {
|
|
329
|
+
"type": "string",
|
|
330
|
+
"minLength": 1,
|
|
331
|
+
"maxLength": 128,
|
|
332
|
+
"pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
|
|
333
|
+
},
|
|
334
|
+
"resourceCode": {
|
|
335
|
+
"type": "string",
|
|
336
|
+
"minLength": 1,
|
|
337
|
+
"maxLength": 128,
|
|
338
|
+
"pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
|
|
339
|
+
},
|
|
340
|
+
"recordId": {
|
|
341
|
+
"type": "string",
|
|
342
|
+
"minLength": 1,
|
|
343
|
+
"maxLength": 36,
|
|
344
|
+
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
|
|
345
|
+
},
|
|
346
|
+
"expectedRevision": {
|
|
347
|
+
"type": "integer",
|
|
348
|
+
"minimum": 1,
|
|
349
|
+
"maximum": 9007199254740991
|
|
350
|
+
},
|
|
351
|
+
"source": {
|
|
352
|
+
"type": "object",
|
|
353
|
+
"additionalProperties": false,
|
|
354
|
+
"properties": {
|
|
355
|
+
"system": {
|
|
356
|
+
"type": "string",
|
|
357
|
+
"minLength": 1,
|
|
358
|
+
"maxLength": 128,
|
|
359
|
+
"pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
|
|
360
|
+
},
|
|
361
|
+
"recordKey": {
|
|
362
|
+
"type": "string",
|
|
363
|
+
"minLength": 1,
|
|
364
|
+
"maxLength": 255
|
|
365
|
+
},
|
|
366
|
+
"snapshotSha256": {
|
|
367
|
+
"type": "string",
|
|
368
|
+
"minLength": 1,
|
|
369
|
+
"maxLength": 64,
|
|
370
|
+
"pattern": "^[0-9a-f]{64}$"
|
|
371
|
+
},
|
|
372
|
+
"recordSha256": {
|
|
373
|
+
"type": "string",
|
|
374
|
+
"minLength": 1,
|
|
375
|
+
"maxLength": 64,
|
|
376
|
+
"pattern": "^[0-9a-f]{64}$"
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
"required": [
|
|
380
|
+
"system",
|
|
381
|
+
"recordKey",
|
|
382
|
+
"snapshotSha256",
|
|
383
|
+
"recordSha256"
|
|
384
|
+
]
|
|
385
|
+
},
|
|
386
|
+
"checkpoint": {
|
|
387
|
+
"type": "object",
|
|
388
|
+
"additionalProperties": false,
|
|
389
|
+
"properties": {
|
|
390
|
+
"initiatorUserId": {
|
|
391
|
+
"type": "string",
|
|
392
|
+
"minLength": 1,
|
|
393
|
+
"maxLength": 36,
|
|
394
|
+
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
|
|
395
|
+
},
|
|
396
|
+
"approvalRound": {
|
|
397
|
+
"type": "integer",
|
|
398
|
+
"minimum": 1,
|
|
399
|
+
"maximum": 2147483647
|
|
400
|
+
},
|
|
401
|
+
"currentNodeId": {
|
|
402
|
+
"type": "string",
|
|
403
|
+
"minLength": 1,
|
|
404
|
+
"maxLength": 128,
|
|
405
|
+
"pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
|
|
406
|
+
},
|
|
407
|
+
"initiatorField": {
|
|
408
|
+
"type": "string",
|
|
409
|
+
"minLength": 1,
|
|
410
|
+
"maxLength": 63,
|
|
411
|
+
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,62}$"
|
|
412
|
+
},
|
|
413
|
+
"initiatorIdentityField": {
|
|
414
|
+
"type": "string",
|
|
415
|
+
"minLength": 1,
|
|
416
|
+
"maxLength": 63,
|
|
417
|
+
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,62}$"
|
|
418
|
+
},
|
|
419
|
+
"roundField": {
|
|
420
|
+
"type": "string",
|
|
421
|
+
"minLength": 1,
|
|
422
|
+
"maxLength": 63,
|
|
423
|
+
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,62}$"
|
|
424
|
+
},
|
|
425
|
+
"stateField": {
|
|
426
|
+
"type": "string",
|
|
427
|
+
"minLength": 1,
|
|
428
|
+
"maxLength": 63,
|
|
429
|
+
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,62}$"
|
|
430
|
+
},
|
|
431
|
+
"stateValue": {
|
|
432
|
+
"type": "string",
|
|
433
|
+
"minLength": 1,
|
|
434
|
+
"maxLength": 255
|
|
435
|
+
},
|
|
436
|
+
"history": {
|
|
437
|
+
"type": "array",
|
|
438
|
+
"maxItems": 64,
|
|
439
|
+
"items": {
|
|
440
|
+
"type": "object",
|
|
441
|
+
"additionalProperties": false,
|
|
442
|
+
"properties": {
|
|
443
|
+
"nodeId": {
|
|
444
|
+
"type": "string",
|
|
445
|
+
"minLength": 1,
|
|
446
|
+
"maxLength": 128,
|
|
447
|
+
"pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
|
|
448
|
+
},
|
|
449
|
+
"reviewerDisplay": {
|
|
450
|
+
"type": "string",
|
|
451
|
+
"minLength": 1,
|
|
452
|
+
"maxLength": 255
|
|
453
|
+
},
|
|
454
|
+
"reviewedAt": {
|
|
455
|
+
"type": "string",
|
|
456
|
+
"minLength": 1,
|
|
457
|
+
"maxLength": 64
|
|
458
|
+
},
|
|
459
|
+
"opinion": {
|
|
460
|
+
"type": "string",
|
|
461
|
+
"maxLength": 8192
|
|
462
|
+
},
|
|
463
|
+
"reviewerField": {
|
|
464
|
+
"type": "string",
|
|
465
|
+
"minLength": 1,
|
|
466
|
+
"maxLength": 63,
|
|
467
|
+
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,62}$"
|
|
468
|
+
},
|
|
469
|
+
"reviewedAtField": {
|
|
470
|
+
"type": "string",
|
|
471
|
+
"minLength": 1,
|
|
472
|
+
"maxLength": 63,
|
|
473
|
+
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,62}$"
|
|
474
|
+
},
|
|
475
|
+
"opinionField": {
|
|
476
|
+
"type": "string",
|
|
477
|
+
"minLength": 1,
|
|
478
|
+
"maxLength": 63,
|
|
479
|
+
"pattern": "^[A-Za-z][A-Za-z0-9_]{0,62}$"
|
|
480
|
+
}
|
|
481
|
+
},
|
|
482
|
+
"required": [
|
|
483
|
+
"nodeId",
|
|
484
|
+
"reviewerDisplay",
|
|
485
|
+
"reviewedAt",
|
|
486
|
+
"opinion",
|
|
487
|
+
"reviewerField",
|
|
488
|
+
"reviewedAtField",
|
|
489
|
+
"opinionField"
|
|
490
|
+
]
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
},
|
|
494
|
+
"required": [
|
|
495
|
+
"initiatorUserId",
|
|
496
|
+
"approvalRound",
|
|
497
|
+
"currentNodeId",
|
|
498
|
+
"initiatorField",
|
|
499
|
+
"initiatorIdentityField",
|
|
500
|
+
"roundField",
|
|
501
|
+
"stateField",
|
|
502
|
+
"stateValue",
|
|
503
|
+
"history"
|
|
504
|
+
]
|
|
505
|
+
}
|
|
506
|
+
},
|
|
507
|
+
"required": [
|
|
508
|
+
"schemaVersion",
|
|
509
|
+
"requestKey",
|
|
510
|
+
"reason",
|
|
511
|
+
"expectedHeadRevision",
|
|
512
|
+
"workflowCode",
|
|
513
|
+
"resourceCode",
|
|
514
|
+
"recordId",
|
|
515
|
+
"expectedRevision",
|
|
516
|
+
"source",
|
|
517
|
+
"checkpoint"
|
|
518
|
+
]
|
|
519
|
+
}
|
|
520
|
+
},
|
|
521
|
+
"required": [
|
|
522
|
+
"operation",
|
|
523
|
+
"environment",
|
|
524
|
+
"input"
|
|
525
|
+
]
|
|
526
|
+
},
|
|
527
|
+
{
|
|
528
|
+
"type": "object",
|
|
529
|
+
"additionalProperties": false,
|
|
530
|
+
"properties": {
|
|
531
|
+
"operation": {
|
|
532
|
+
"const": "workflows.legacy-apply",
|
|
533
|
+
"description": "按原计划摘要原子接续当前节点,仅创建当前待办"
|
|
534
|
+
},
|
|
535
|
+
"environment": {
|
|
536
|
+
"type": "string",
|
|
537
|
+
"enum": [
|
|
538
|
+
"test",
|
|
539
|
+
"production"
|
|
540
|
+
]
|
|
541
|
+
},
|
|
542
|
+
"input": {
|
|
543
|
+
"type": "object",
|
|
544
|
+
"additionalProperties": false,
|
|
545
|
+
"properties": {
|
|
546
|
+
"schemaVersion": {
|
|
547
|
+
"const": "openxiangda.workflow-legacy-adoption-apply/v2"
|
|
548
|
+
},
|
|
549
|
+
"planId": {
|
|
550
|
+
"type": "string",
|
|
551
|
+
"minLength": 1,
|
|
552
|
+
"maxLength": 36,
|
|
553
|
+
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
|
|
554
|
+
},
|
|
555
|
+
"expectedPlanDigest": {
|
|
556
|
+
"type": "string",
|
|
557
|
+
"minLength": 1,
|
|
558
|
+
"maxLength": 64,
|
|
559
|
+
"pattern": "^[0-9a-f]{64}$"
|
|
560
|
+
}
|
|
561
|
+
},
|
|
562
|
+
"required": [
|
|
563
|
+
"schemaVersion",
|
|
564
|
+
"planId",
|
|
565
|
+
"expectedPlanDigest"
|
|
566
|
+
]
|
|
567
|
+
}
|
|
568
|
+
},
|
|
569
|
+
"required": [
|
|
570
|
+
"operation",
|
|
571
|
+
"environment",
|
|
572
|
+
"input"
|
|
573
|
+
]
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
"type": "object",
|
|
577
|
+
"additionalProperties": false,
|
|
578
|
+
"properties": {
|
|
579
|
+
"operation": {
|
|
580
|
+
"const": "workflows.legacy-receipt",
|
|
581
|
+
"description": "读取旧审批接续准备或执行回执"
|
|
582
|
+
},
|
|
583
|
+
"environment": {
|
|
584
|
+
"type": "string",
|
|
585
|
+
"enum": [
|
|
586
|
+
"test",
|
|
587
|
+
"production"
|
|
588
|
+
]
|
|
589
|
+
},
|
|
590
|
+
"input": {
|
|
591
|
+
"type": "object",
|
|
592
|
+
"additionalProperties": false,
|
|
593
|
+
"properties": {
|
|
594
|
+
"planId": {
|
|
595
|
+
"type": "string",
|
|
596
|
+
"minLength": 1,
|
|
597
|
+
"maxLength": 36,
|
|
598
|
+
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
|
|
599
|
+
}
|
|
600
|
+
},
|
|
601
|
+
"required": [
|
|
602
|
+
"planId"
|
|
603
|
+
]
|
|
604
|
+
}
|
|
605
|
+
},
|
|
606
|
+
"required": [
|
|
607
|
+
"operation",
|
|
608
|
+
"environment",
|
|
609
|
+
"input"
|
|
610
|
+
]
|
|
611
|
+
},
|
|
291
612
|
{
|
|
292
613
|
"type": "object",
|
|
293
614
|
"additionalProperties": false,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
教育局与多所学校各有独立钉钉企业、同一教师属于多个组织、家长的孩子在不同学校时,优先复用平台的组织与身份基础能力。应用不再建立第二份企业组织树、钉钉身份库或学校密钥配置。
|
|
4
4
|
|
|
5
|
-
本专题描述 2026-10-14
|
|
5
|
+
本专题描述 2026-10-14 的源码契约基线。组织基础、本人目录角色事实读取、SDK 组织切换、目录事实到应用角色的投影及 Native 组织行边界已有配套实现。目标站点是否部署了这些接口,需现场核实;安装新工具或读到本专题不证明平台已经升级。
|
|
6
6
|
|
|
7
7
|
## AI 识别场景与选择能力 {#scenario}
|
|
8
8
|
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
| 当前人的可切换组织 | 已有平台会话 HTTP 与 `loadCurrentOrganizationMemberships()` | 读取本人活动成员列表,显示对应企业/学校选项 |
|
|
27
27
|
| 当前工作组织、同会话切换 | 已有平台登录上下文、SDK `activeOrganizationId` 和 `switchCurrentOrganization()` 生命周期 | 在支持本契约的会话中读取/切换;不能从 URL 直接产生授权 |
|
|
28
28
|
| 组织管理授权 | 已实现平台管理员授予人/部门,祖先授权覆盖后代 | 管理操作由平台核验;不能把“教育局成员”当作“全区管理员” |
|
|
29
|
-
| 应用角色 `self` / `subtree` |
|
|
30
|
-
| 家校事实到应用角色、班级范围的消费 |
|
|
31
|
-
|
|
|
29
|
+
| 应用角色 `self` / `subtree` | V2 声明、组织维度角色绑定和实时 SQL 准入已接通 | 声明每个角色的覆盖意图;旧应用未声明继续沿用原行为 |
|
|
30
|
+
| 家校事实到应用角色、班级范围的消费 | `authz.directoryRoleSources` 由平台投影到应用角色和字符串 scope | 使用真实来源角色事实,目录派生绑定不能手工覆盖;事实退休立即拒绝旧投影 |
|
|
31
|
+
| 组织数据归属、隔离、后代可见与内容下发 | `organization.mode=owned/inherited-down`、不可改归属及 RLS 已实现 | 声明策略并核验目标站点的配套能力,按真实组织角色验收允许和拒绝 |
|
|
32
32
|
| 安装回调、每校自动定时同步、组织通知路由与链接生成 | 尚未完成整条自动接入 | 不假定安装完成后立即能登录,不假定消息自动选中正确安装 |
|
|
33
33
|
|
|
34
34
|
平台管理组织的授权与应用业务授权是两种事实。能开通学校或查询组织树,不会自动获得该学校的业务数据权限;看到一条成员关系,也不会自动成为应用管理员。
|
|
@@ -102,7 +102,7 @@ SDK 通过应用 `/auth/organization/switch-surface` 取得真实浏览器会话
|
|
|
102
102
|
|
|
103
103
|
成功、运输结果未知或服务器 5xx 时,SDK 失效旧授权、命令缓存和在途读取,通过 Runtime identity epoch 重读并重建页面。旧学校晚到的响应不会覆盖新学校数据。跨页只发送失效信号,不传身份或凭据;明确 4xx 拒绝保留原授权。切换写入不自动重放;结果未知先读回当前授权,不能把目标名称当成成功。组织切换不选择应用角色,也不是只收窄读取的 Perspective。
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
角色与数据隔离通过下面的显式声明启用;切换后的角色列表或字段传递仍不能替代实际行权限验收。
|
|
106
106
|
|
|
107
107
|
### 管理面接口
|
|
108
108
|
|
|
@@ -129,24 +129,51 @@ SDK 通过应用 `/auth/organization/switch-surface` 取得真实浏览器会话
|
|
|
129
129
|
|
|
130
130
|
SDK 使用 `loadCurrentDirectoryRoleFacts({ limit, after, signal })`,返回 `DirectoryRoleFactPage`,包含 organizationId、userId、items、nextCursor。每个 item 包含 id、subjectId、source、roleCode、scopeType、scopeValue。客户端拒绝与当前 identity 不同组织/用户的响应,并在组织变化时丢弃旧读取,不自动拉取全部页面。
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
读取来源事实不授予应用能力。使用下面的 `directoryRoleSources` 声明由平台派生角色及班级范围;不能以管理 upsert 或复制应用通讯录替代。
|
|
133
133
|
|
|
134
134
|
## 应用角色与数据边界 {#authorization}
|
|
135
135
|
|
|
136
|
-
|
|
136
|
+
应用通过显式声明启用组织能力;编译器自动生成 `authz.organizations`、`authz.directory-roles` 和 `data.organizations` 的最低能力要求。目标平台不支持时拒绝激活,不能手改生成契约绕过协商。
|
|
137
137
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
138
|
+
```ts
|
|
139
|
+
authz: {
|
|
140
|
+
roles: [
|
|
141
|
+
{ code: 'teacher', name: '教师', organizationReach: 'self', capabilities: teacherCapabilities },
|
|
142
|
+
{ code: 'bureau', name: '区管理人员', organizationReach: 'subtree', capabilities: bureauCapabilities },
|
|
143
|
+
],
|
|
144
|
+
scopeDimensions: [{ code: 'class', name: '班级', valueType: 'string' }],
|
|
145
|
+
directoryRoleSources: [{
|
|
146
|
+
code: 'teachers', name: '家校教师事实', source: 'dingtalk_school_contact',
|
|
147
|
+
roleFactCode: 'teacher', roleCode: 'teacher', failureMode: 'strict',
|
|
148
|
+
scopes: [{ dimensionCode: 'class', scopeType: 'class', operations: ['read', 'create', 'update'] }],
|
|
149
|
+
}],
|
|
150
|
+
},
|
|
151
|
+
data: {
|
|
152
|
+
resources: [{ code: 'assignments', name: '作业', organization: { mode: 'owned' }, fields: assignmentFields }],
|
|
153
|
+
},
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
上例省略了应用自己的操作能力与班级行策略定义;`teacherCapabilities`、`bureauCapabilities` 和 `assignmentFields` 是应用变量,并非平台内置对象。班级字段保存真实来源字符串 ID,通过原 dataPolicy 的 `class` 维度核对。来源字符串不能绑定 Native UUID 维度、valueSource、resourceCode 或组织树层级。
|
|
157
|
+
|
|
158
|
+
| 声明 | 语义 |
|
|
159
|
+
| --- | --- |
|
|
160
|
+
| `role.organizationReach = self` | 绑定在授予组织,只在该工作组织生效 |
|
|
161
|
+
| `role.organizationReach = subtree` | 绑定在授予组织,在该组织和活动后代生效;不自动授予操作能力 |
|
|
162
|
+
| `resource.organization.mode = owned` | 创建时记录归属可信工作组织。self 只操作本组织;subtree 可在其获准树内结合行策略操作 |
|
|
163
|
+
| `resource.organization.mode = inherited-down` | 同 owned,额外允许获准角色读取工作组织的祖先内容;下级不能修改祖先内容 |
|
|
164
|
+
| 未声明或 `none` | 沿用原无组织行为,不产生组织隔离 |
|
|
165
|
+
|
|
166
|
+
角色的操作能力、字段能力、组织 reach 和班级行范围必须在同一条 membership 中成立。不能合并多个组织的班级范围,不能用 subtree 角色的组织范围借用另一角色的班级范围。上级普通成员没有 subtree,共享 unionId 也不合并各校授权。目录映射角色只能 self,不能与 Native roleMembershipSources 争用同一角色。
|
|
167
|
+
|
|
168
|
+
目录源最多 32 个,每个源最多 16 个 scope;每次当前人、工作组织最多 512 个不同事实。超限、源失效、手工 shadow 冲突和更新锁竞争失败关闭;无变化的投影不更新 membership 或权限版本,也不与当前事务自己的角色锁冲突。目录派生绑定稳定且分组织,原始目录仍只有平台一份。本人读取不返回 raw 或 unionId。没有工作组织时,启用了目录映射的当前授权请求返回 `OPENXIANGDA_CURRENT_USER_ORGANIZATION_REQUIRED`。
|
|
142
169
|
|
|
143
|
-
|
|
170
|
+
手工给非目录角色授权使用现有 Native membership 管理面及 `createNativeRoleMembership`,新增可选 `organizationId`。组织角色必须明确目标,目标用户须是同租户活动安装的活动成员;平台管理员或应用管理员可管理。已有委托管理没有组织覆盖契约,不能扩大为跨校授权。更新不能换组织,目录派生角色的 create/update/revoke 均返回平台所有权拒绝。传统无组织角色不需要该字段。批量 create 也支持组织维度;重复目标以 user/role/organization 核对。
|
|
144
171
|
|
|
145
|
-
|
|
172
|
+
组织归属是平台保留列 `organization_id`,不是业务字段。组织资源的读回提供这一只读 UUID,可在 Data API 的筛选和聚合 dimensions 中按学校分组;写入包含它会被拒绝。传统资源不增加该字段。创建从可信当前用户派生,更新不可修改;历史 NULL 归属不会自动推断或回填,组织资源也不会放行。唯一键按组织分区;父子表需要同样的组织策略,复合外键防止跨组织关联。已启用资源不能通过下一版本移除组织策略来开放历史数据。
|
|
146
173
|
|
|
147
|
-
|
|
174
|
+
列表、直接 ID、聚合、导出及关联通过同一 Native RLS。命名 Nest 业务动作保留经过验证的当前用户/组织,继续核验短期调用证明、动作能力与同一 membership 的变更前后行范围。业务输入不能填充可信组织;没有当前用户证明的普通 application、后台或定时身份不获得组织资源权限。声明策略不自动授予服务身份全区访问。
|
|
148
175
|
|
|
149
|
-
|
|
176
|
+
组织上下文请求实时核对目录与成员,当前暂不使用授权快照缓存。fresh 和事务请求均不读取或保存未提交快照;Head 在准备期间变化要求刷新。安装、成员、账号、主体或事实撤销后,数据库下一条语句即拒绝。源码和独立 PostgreSQL 测试不证明目标站点已经部署,也不代表真实教师/家长验收。
|
|
150
177
|
|
|
151
178
|
## 入口、同步与通知的处理边界 {#entry-sync}
|
|
152
179
|
|
|
@@ -158,7 +185,7 @@ SDK 使用 `loadCurrentDirectoryRoleFacts({ limit, after, signal })`,返回 `D
|
|
|
158
185
|
|
|
159
186
|
## 开发前核对与验收 {#verification}
|
|
160
187
|
|
|
161
|
-
1. 用项目锁定版本的 `context --json` / MCP `workspace_context` 确认平台绑定;用 `docs multi-organization` / `docs_read`
|
|
188
|
+
1. 用项目锁定版本的 `context --json` / MCP `workspace_context` 确认平台绑定;用 `docs multi-organization` / `docs_read` 读取同版本正文。通过实际 `platform_capabilities` 核对配套声明的能力 code 和最低版本,不能把文档可读当成站点可用。
|
|
162
189
|
2. 确认目标站点的源码/部署版本、正式 SQL 迁移与组织管理授权。资料版本、接口状态和实际启用分别记录;站点缺能力由平台维护者补齐,应用不自行执行迁移或发包。
|
|
163
190
|
3. 在测试组织核实本人成员列表、真实企业名称、活动安装、profile/原始授权组织字段,验证同会话切换与非成员拒绝。不以单次 HTTP 200 代替响应 `code` 和业务事实。
|
|
164
191
|
4. 使用家校角色前,确认平台已经提供可消费的事实读取及映射契约;使用 `self/subtree` 前,确认 V2 声明、可信上下文和服务端数据边界均已实现。未闭合就标记依赖,不能报告自动隔离通过。
|
|
@@ -1261,3 +1261,24 @@ pnpm openxiangda workflow sync request-review --from production --to test \
|
|
|
1261
1261
|
新节点尚未填完标准成员/角色时可以保存草稿;正式发布与办理覆盖仍完整校验。服务端重新读取实际上下文,不信任浏览器自报目录或已校验标志。AI提案同样经过原binding/canvas门禁;不能把草稿可保存解释为可发布。
|
|
1262
1262
|
|
|
1263
1263
|
冲突、失权或结果未知时保留整个assignment及原operationId,不自动合并分支、不静默丢失条件。已进入流程的任务仍使用原冻结快照,新的规则不回写历史任务。源码同步、配置与发布分别核对原Head/版本和操作回执。
|
|
1264
|
+
|
|
1265
|
+
|
|
1266
|
+
### 应用事务拥有的业务待办
|
|
1267
|
+
|
|
1268
|
+
预约分配、结算确认等非 Workflow 的业务任务,可由同一 Native 事务写入业务状态并
|
|
1269
|
+
发送不可变自定义事件。订阅显式声明
|
|
1270
|
+
`platformAccess.notification: { mode: 'business-task', taskCodes: ['booking-review'] }`,
|
|
1271
|
+
验证签名的 Nest 事件消费者使用 `OpenXiangdaBusinessNotificationService.sendTaskFromEvent`。
|
|
1272
|
+
平台协商 `notification-hub-v2.event-tasks` 能力并检查当前运行 Head 和封存的任务代码清单。
|
|
1273
|
+
|
|
1274
|
+
输入使用 `openxiangda.notification.event-task-send/v2`,通过 taskCodePath、recordKeyPath、
|
|
1275
|
+
generationPath、sequencePath、statePath、recipientPaths、titlePath 和可选 summaryPath
|
|
1276
|
+
投影原事件,状态只能是 action_required/completed/rejected/cancelled。不接收调用者
|
|
1277
|
+
自拟收件人或消息键。navigationTarget 使用同应用 AUTHENTICATED APP_ROUTE,原页面
|
|
1278
|
+
重新验证办理权限;不生成 Workflow 回调或审批令牌。
|
|
1279
|
+
|
|
1280
|
+
同一业务键和轮次只产生一个待办;重新申请必须创建新的 generation。终态先到、
|
|
1281
|
+
乱序和重试不会重新打开旧待办。应用应冻结原任务收件人,在原业务事务中关闭旧轮次
|
|
1282
|
+
并创建下一轮,不因管理员变化覆盖旧任务。此能力复用平台任务中心、通知发件箱、
|
|
1283
|
+
供应方关闭和审计;普通 informational 通知仍不能创建待办。业务提交成功不等于
|
|
1284
|
+
供应方投递或用户收到,分别核对业务回执、事件投递和消息详情。
|
package/releases/2.68.1.json
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schemaVersion": "openxiangda.release-notes/v1",
|
|
3
|
-
"version": "2.68.1",
|
|
4
|
-
"status": "reviewed",
|
|
5
|
-
"title": "原部署运行的流程例外只读预览",
|
|
6
|
-
"summary": "按平台能力读取失败 DeploymentRun 的冻结候选、当前 Head 和真实流程例外,支持在独立诊断目录使用公开 SDK 读取旧工作区会话。",
|
|
7
|
-
"newFeatures": [
|
|
8
|
-
"`status <deployment-id> --workflow-exceptions` 只读展示原运行的例外及完整集合摘要,不确认或重试。",
|
|
9
|
-
"独立精确版本 devkit 客户端可读取旧工作区 link/session,无需更改应用 package、lock 或冻结包。"
|
|
10
|
-
],
|
|
11
|
-
"fixes": [],
|
|
12
|
-
"affectedUsers": [
|
|
13
|
-
"发布包含工作流的 V2 应用的开发者和管理员。"
|
|
14
|
-
],
|
|
15
|
-
"upgradeSteps": [
|
|
16
|
-
"平台需先提供 deployment.workflow-adoption-preview 1.0.0 能力;无能力时明确停止。",
|
|
17
|
-
"使用本版根包或独立 openxiangda-devkit-core 2.67.0 诊断目录;旧应用不必为了查看例外升级依赖。",
|
|
18
|
-
"保留原 DeploymentRun ID,先核对完整例外;生产仍只晋级已验收 TEST 原版本。"
|
|
19
|
-
],
|
|
20
|
-
"knownLimitations": [
|
|
21
|
-
"本批仅提供预览,不提供例外确认、事实转换或原 Run 恢复通道。",
|
|
22
|
-
"truncated=true 不代表已观察完整明细;预览不授予激活许可。",
|
|
23
|
-
"包发行不等于平台部署或真实业务验收;source/status 的独立500故障不在此修复中。"
|
|
24
|
-
],
|
|
25
|
-
"compatibility": {
|
|
26
|
-
"node": "Node.js 24 or newer for maintained toolchain",
|
|
27
|
-
"generation": "OpenXiangda V2; no V1 migration",
|
|
28
|
-
"platform": "New read-only preview requires deployment.workflow-adoption-preview 1.0.0; contracts remains 2.88.0"
|
|
29
|
-
},
|
|
30
|
-
"issues": [],
|
|
31
|
-
"sha256": "859687bd04474e031528a651304916e7535919419aa697ec1892ff5b17cdf666",
|
|
32
|
-
"url": "https://github.com/1377385356/openxiangda/releases/tag/v2.68.1"
|
|
33
|
-
}
|
package/releases/2.69.1.json
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schemaVersion": "openxiangda.release-notes/v1",
|
|
3
|
-
"version": "2.69.1",
|
|
4
|
-
"status": "reviewed",
|
|
5
|
-
"title": "流程画布按需面板与连续分支保存修复",
|
|
6
|
-
"summary": "修复流程设计器的常驻面板、连续条件路由断线及带可读名称的草稿无法保存。",
|
|
7
|
-
"newFeatures": [],
|
|
8
|
-
"fixes": [
|
|
9
|
-
"流程大纲默认隐藏,节点设置默认关闭;选择节点后按需打开配置,浮层不挤压编辑画布。",
|
|
10
|
-
"相邻条件区域只拥有各自分支,汇合目标保持单一位置;连续条件和嵌套并行的连线接回实际目标节点。",
|
|
11
|
-
"正式流程文档schema接受已有readability元数据,保留闭集字段、长度与数量上限及原业务权限校验。"
|
|
12
|
-
],
|
|
13
|
-
"affectedUsers": [
|
|
14
|
-
"使用V2流程设计器编辑或维护审批流程的应用。"
|
|
15
|
-
],
|
|
16
|
-
"upgradeSteps": [
|
|
17
|
-
"安装精确openxiangda 2.69.1官方组合并重新检查、构建应用。",
|
|
18
|
-
"平台后端同步正式contracts包及同源回执后,才具备草稿保存schema修复;应用自行维护流程列表和独立画布路由。"
|
|
19
|
-
],
|
|
20
|
-
"knownLimitations": [
|
|
21
|
-
"不修改历史实例、审批边界或业务拓扑;此版本不包含原DeploymentRun例外ack接口。",
|
|
22
|
-
"包发行不等于平台部署或现场草稿保存验收,已有未保存输入需保留。"
|
|
23
|
-
],
|
|
24
|
-
"compatibility": {
|
|
25
|
-
"node": "Node.js 24 or newer for maintained toolchain",
|
|
26
|
-
"generation": "OpenXiangda V2; V1 unchanged",
|
|
27
|
-
"platform": "平台后端须消费本轮正式contracts及配套组合;原权限、revision和operationId守卫保持"
|
|
28
|
-
},
|
|
29
|
-
"issues": [],
|
|
30
|
-
"sha256": "529eee3d6d426c149635e6143310ff6a4a01da6c7243e203ff959f9d3b34a4b5",
|
|
31
|
-
"url": "https://github.com/1377385356/openxiangda/releases/tag/v2.69.1"
|
|
32
|
-
}
|