feat(client): reply digital approvals to acp

This commit is contained in:
baiyanyun
2026-06-08 10:23:06 +08:00
parent ee51fcdbeb
commit f4af77cb2b
8 changed files with 228 additions and 130 deletions

View File

@@ -104,6 +104,12 @@ describe("digital employee state service", () => {
metadata: {
decision_id: "approval-1",
decision: "approved",
acp_permission: {
permission_id: "permission-1",
session_id: "session-1",
response: "once",
success: true,
},
},
state: {
selectedDutyIdsByDate: {},
@@ -135,6 +141,12 @@ describe("digital employee state service", () => {
decision: "approved",
decidedAt: "2026-06-07T08:00:00.000Z",
previousStatus: "pending",
acpPermission: {
permission_id: "permission-1",
session_id: "session-1",
response: "once",
success: true,
},
});
expect(mockState.db?.outbox.get("approval:upsert:approval-1")).toMatchObject({
entity_type: "approval",

View File

@@ -392,18 +392,21 @@ function recordUiApprovalDecision(update: DigitalEmployeeUiStateUpdate): void {
const previousStatus = stringField(existing, "status") || "pending";
const storedPayload = parseStoredPayload(existing["payload"]);
const storedPayloadRecord = objectRecord(storedPayload);
const acpPermission = objectRecord(metadata?.acp_permission);
const payload = storedPayloadRecord
? {
...storedPayloadRecord,
decision,
decidedAt: now,
previousStatus,
...(acpPermission ? { acpPermission } : {}),
}
: {
value: storedPayload,
decision,
decidedAt: now,
previousStatus,
...(acpPermission ? { acpPermission } : {}),
};
upsertApproval({
id: decisionId,

View File

@@ -119,5 +119,8 @@ contextBridge.exposeInMainWorld("QimingClawBridge", {
async recordGovernanceCommand(command: unknown) {
return ipcRenderer.invoke("digitalEmployee:recordGovernanceCommand", command);
},
async respondPermission(sessionId: string, permissionId: string, response: "once" | "always" | "reject") {
return ipcRenderer.invoke("agent:respondPermission", sessionId, permissionId, response);
},
},
});