permission-auto-respond.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { base64Encode } from "@kirincode-ai/core/util/encode"
  2. export function acceptKey(sessionID: string, directory?: string) {
  3. if (!directory) return sessionID
  4. return `${base64Encode(directory)}/${sessionID}`
  5. }
  6. export function directoryAcceptKey(directory: string) {
  7. return `${base64Encode(directory)}/*`
  8. }
  9. function accepted(autoAccept: Record<string, boolean>, sessionID: string, directory?: string) {
  10. const key = acceptKey(sessionID, directory)
  11. const directoryKey = directory ? directoryAcceptKey(directory) : undefined
  12. return autoAccept[key] ?? autoAccept[sessionID] ?? (directoryKey ? autoAccept[directoryKey] : undefined)
  13. }
  14. export function isDirectoryAutoAccepting(autoAccept: Record<string, boolean>, directory: string) {
  15. const key = directoryAcceptKey(directory)
  16. return autoAccept[key] ?? false
  17. }
  18. function sessionLineage(session: { id: string; parentID?: string }[], sessionID: string) {
  19. const parent = session.reduce((acc, item) => {
  20. if (item.parentID) acc.set(item.id, item.parentID)
  21. return acc
  22. }, new Map<string, string>())
  23. const seen = new Set([sessionID])
  24. const ids = [sessionID]
  25. for (const id of ids) {
  26. const parentID = parent.get(id)
  27. if (!parentID || seen.has(parentID)) continue
  28. seen.add(parentID)
  29. ids.push(parentID)
  30. }
  31. return ids
  32. }
  33. export function autoRespondsPermission(
  34. autoAccept: Record<string, boolean>,
  35. session: { id: string; parentID?: string }[],
  36. permission: { sessionID: string },
  37. directory?: string,
  38. ) {
  39. const value = sessionLineage(session, permission.sessionID)
  40. .map((id) => accepted(autoAccept, id, directory))
  41. .find((item): item is boolean => item !== undefined)
  42. return value ?? false
  43. }