吸收数字员工管理端记忆策略预览

This commit is contained in:
baiyanyun
2026-06-15 10:40:32 +08:00
parent e57971488c
commit 6ad88cb6c4
7 changed files with 144 additions and 2 deletions

View File

@@ -155,6 +155,16 @@ public class DigitalEmployeeAdminWorkbenchRowDto {
private String lastGovernanceAction;
@JsonProperty("last_reviewed_at")
private String lastReviewedAt;
@JsonProperty("memory_policy_id")
private String memoryPolicyId;
@JsonProperty("memory_policy_status")
private String memoryPolicyStatus;
@JsonProperty("merge_policy_id")
private String mergePolicyId;
@JsonProperty("merge_action_disabled")
private Boolean mergeActionDisabled;
@JsonProperty("remote_memory_policy_disabled")
private Boolean remoteMemoryPolicyDisabled;
@JsonProperty("skill_id")
private String skillId;
@JsonProperty("skill_version")

View File

@@ -73,6 +73,7 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
"artifact:mark_keep", "artifact:mark_expire", "artifact:mark_reviewed", "artifact:record_cleanup_request",
"daily_report:mark_delivered", "daily_report:mark_confirmed", "daily_report:request_approval", "daily_report:record_approval_decision",
"memory:archive_memory", "memory:restore_memory", "memory:mark_reviewed",
"memory_policy:pull_policy", "memory_policy:mark_reviewed", "memory_policy:dismiss",
"skill:mark_reviewed", "skill:dismiss",
"policy_snapshot:pull_policy", "policy_snapshot:mark_reviewed", "policy_snapshot:dismiss",
"scheduler:retry_scheduler_check", "scheduler:mark_reviewed", "scheduler:dismiss",
@@ -1146,6 +1147,11 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
.latestMemoryId(firstString(businessView.get("latest_memory_id"), businessView.get("latestMemoryId"), payload.get("latest_memory_id"), payload.get("latestMemoryId")))
.lastGovernanceAction(firstString(businessView.get("last_governance_action"), businessView.get("lastGovernanceAction"), payload.get("last_governance_action"), payload.get("lastGovernanceAction")))
.lastReviewedAt(firstString(businessView.get("last_reviewed_at"), businessView.get("lastReviewedAt"), payload.get("last_reviewed_at"), payload.get("lastReviewedAt")))
.memoryPolicyId(firstString(businessView.get("memory_policy_id"), businessView.get("memoryPolicyId"), payload.get("memory_policy_id"), payload.get("memoryPolicyId")))
.memoryPolicyStatus(firstString(businessView.get("memory_policy_status"), businessView.get("memoryPolicyStatus"), payload.get("memory_policy_status"), payload.get("memoryPolicyStatus")))
.mergePolicyId(firstString(businessView.get("merge_policy_id"), businessView.get("mergePolicyId"), payload.get("merge_policy_id"), payload.get("mergePolicyId")))
.mergeActionDisabled(nullableBooleanValue(firstPresent(businessView.get("merge_action_disabled"), businessView.get("mergeActionDisabled"), payload.get("merge_action_disabled"), payload.get("mergeActionDisabled"))))
.remoteMemoryPolicyDisabled(nullableBooleanValue(firstPresent(businessView.get("remote_memory_policy_disabled"), businessView.get("remoteMemoryPolicyDisabled"), payload.get("remote_memory_policy_disabled"), payload.get("remoteMemoryPolicyDisabled"))))
.skillId(firstString(businessView.get("skill_id"), businessView.get("skillId"), payload.get("skill_id"), payload.get("skillId")))
.skillVersion(firstString(businessView.get("skill_version"), businessView.get("skillVersion"), businessView.get("version"), payload.get("skill_version"), payload.get("skillVersion"), payload.get("version")))
.installStatus(firstString(businessView.get("install_status"), businessView.get("installStatus"), payload.get("install_status"), payload.get("installStatus")))
@@ -1206,6 +1212,7 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
case "governance_commands" -> isGovernanceCommandRow(row);
case "route_governance" -> isRouteGovernanceRow(row);
case "memory_governance" -> isMemoryGovernanceRow(row);
case "memory_policies" -> isMemoryPolicyRow(row);
case "skill_audits" -> isSkillAuditRow(row);
case "policy_center" -> isPolicyCenterRow(row);
case "scheduler_operations" -> isSchedulerOperationsRow(row);
@@ -1364,6 +1371,20 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
|| row.getMergeCandidateCount() != null;
}
private boolean isMemoryPolicyRow(DigitalEmployeeAdminWorkbenchRowDto row) {
String category = firstString(row.getCategory());
String kind = firstString(row.getKind());
return Set.of("memory_policy", "memory_merge_policy", "memory_retention_policy").contains(category)
|| contains(kind, "memory_policy")
|| contains(kind, "memory_merge_policy")
|| contains(kind, "memory_retention_policy")
|| StringUtils.isNotBlank(row.getMemoryPolicyId())
|| StringUtils.isNotBlank(row.getMemoryPolicyStatus())
|| StringUtils.isNotBlank(row.getMergePolicyId())
|| row.getMergeActionDisabled() != null
|| row.getRemoteMemoryPolicyDisabled() != null;
}
private boolean isSkillAuditRow(DigitalEmployeeAdminWorkbenchRowDto row) {
String category = firstString(row.getCategory());
String kind = firstString(row.getKind());

View File

@@ -506,6 +506,60 @@ class DigitalEmployeeSyncApplicationServiceImplTest {
assertThat(result.getRecords().get(1).getLastGovernanceAction()).isEqualTo("archive");
}
@Test
void queryAdminWorkbenchMemoryPoliciesReturnsPolicyRowsOnly() {
when(repository.queryBusinessRecords(eq(101L), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(1L), eq(20L)))
.thenReturn(page(List.of(
record("outbox-memory-policy", "event", "event-memory-policy-1", 101L, new Date(10_000),
Map.ofEntries(
Map.entry("entity_type", "event"),
Map.entry("category", "memory_policy"),
Map.entry("kind", "memory_policy_snapshot"),
Map.entry("status", "synced"),
Map.entry("title", "记忆策略快照"),
Map.entry("memory_policy_id", "memory-policy-1"),
Map.entry("memory_policy_status", "remote_disabled"),
Map.entry("merge_policy_id", "merge-policy-1"),
Map.entry("merge_action_disabled", true),
Map.entry("remote_memory_policy_disabled", true),
Map.entry("policy_source", "remote")
),
Map.of("id", "event-memory-policy-1", "kind", "memory_policy_snapshot")),
record("outbox-memory-merge-policy", "event", "event-memory-policy-2", 101L, new Date(11_000),
Map.of(
"entity_type", "event",
"category", "memory_merge_policy",
"kind", "memory_merge_policy_pulled",
"status", "synced",
"title", "合并策略已拉取",
"merge_policy_id", "merge-policy-2",
"merge_action_disabled", true
),
Map.of("id", "event-memory-policy-2", "kind", "memory_merge_policy_pulled")),
record("outbox-memory", "memory", "memory-1", 101L, new Date(12_000),
Map.of("entity_type", "memory", "title", "普通记忆", "status", "active", "memory_id", "memory-1"),
Map.of("id", "memory-1", "status", "active")),
record("outbox-skill", "event", "event-skill-1", 101L, new Date(13_000),
Map.of("entity_type", "event", "category", "skill", "title", "技能", "status", "allowed"),
Map.of("id", "event-skill-1", "status", "allowed"))
)));
DigitalEmployeeAdminWorkbenchPageDto result = service.queryAdminWorkbench(
"memory_policies", null, null, null, null, null, null, null, null, null, null, null, 1L, 20L
);
assertThat(result.getTotal()).isEqualTo(2);
assertThat(result.getRecords()).extracting(DigitalEmployeeAdminWorkbenchRowDto::getEntityId)
.containsExactly("event-memory-policy-1", "event-memory-policy-2");
assertThat(result.getRecords().get(0).getView()).isEqualTo("memory_policies");
assertThat(result.getRecords().get(0).getMemoryPolicyId()).isEqualTo("memory-policy-1");
assertThat(result.getRecords().get(0).getMemoryPolicyStatus()).isEqualTo("remote_disabled");
assertThat(result.getRecords().get(0).getMergePolicyId()).isEqualTo("merge-policy-1");
assertThat(result.getRecords().get(0).getMergeActionDisabled()).isTrue();
assertThat(result.getRecords().get(0).getRemoteMemoryPolicyDisabled()).isTrue();
assertThat(result.getRecords().get(1).getMergePolicyId()).isEqualTo("merge-policy-2");
}
@Test
void queryAdminWorkbenchSkillAuditsReturnsSkillAndToolAuditRowsOnly() {
when(repository.queryBusinessRecords(eq(101L), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(1L), eq(20L)))