feat(agent): add opt-in push notifications

This commit is contained in:
2026-10-14 22:03:21 -07:00
parent 80748f764f
commit a1c0264d36
51 changed files with 4815 additions and 121 deletions
+77
View File
@@ -219,7 +219,84 @@ model ProjectItem {
// Shared personal read position for the external persistent Sybil Agent room.
// Messages remain in the agent's durable transcript, not duplicated in Sybil Chat.
model AgentReadState {
sourceId String?
id String @id
cursor String @default("0")
updatedAt DateTime @updatedAt
}
// One server-derived shared principal. Transport payloads are secret DB data.
model AgentPushInstallation {
id String @id
ownerEpoch String
transport String
payload String
fingerprint String
enabled Boolean @default(false)
version Int @default(1)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
lastClearAt DateTime?
revokedAt DateTime?
@@index([ownerEpoch, enabled])
@@index([fingerprint])
}
model AgentPushPresence {
id String @id
ownerEpoch String
sequence Int
visible Boolean
focused Boolean
lastInteractionAt DateTime?
expiresAt DateTime
@@index([ownerEpoch, expiresAt])
}
model AgentPushConnection {
id String @id
ownerEpoch String
kind String
sessionId String?
expiresAt DateTime
@@index([ownerEpoch, expiresAt])
}
model AgentPushCoordinator {
id String @id
ownerEpoch String
sourceId String?
cursor String @default("0")
quarantined Boolean @default(false)
contextObservedAt DateTime?
latestUserMessageAt DateTime?
localPromptAt DateTime?
nativeActive Boolean @default(false)
nativeUnknown Boolean @default(true)
uncertain Boolean @default(true)
lockOwner String?
lockUntil DateTime?
}
model AgentPushDelivery {
id String @id
ownerEpoch String
installationId String
installationVersion Int
sourceId String
messageId String
cursor String
kind String
trigger String
priority Int @default(0)
status String @default("pending")
attempts Int @default(0)
createdAt DateTime @default(now())
dueAt DateTime
expiresAt DateTime
updatedAt DateTime @updatedAt
outcome String?
@@index([status, dueAt])
@@index([installationId, status])
@@index([ownerEpoch, sourceId, cursor])
}