classifierApprovals.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /**
  2. * Tracks which tool uses were auto-approved by classifiers.
  3. * Populated from useCanUseTool.ts and permissions.ts, read from UserToolSuccessMessage.tsx.
  4. */
  5. import { feature } from 'bun:bundle'
  6. import { createSignal } from './signal.js'
  7. type ClassifierApproval = {
  8. classifier: 'bash' | 'auto-mode'
  9. matchedRule?: string
  10. reason?: string
  11. }
  12. const CLASSIFIER_APPROVALS = new Map<string, ClassifierApproval>()
  13. const CLASSIFIER_CHECKING = new Set<string>()
  14. const classifierChecking = createSignal()
  15. export function setClassifierApproval(
  16. toolUseID: string,
  17. matchedRule: string,
  18. ): void {
  19. if (!feature('BASH_CLASSIFIER')) {
  20. return
  21. }
  22. CLASSIFIER_APPROVALS.set(toolUseID, {
  23. classifier: 'bash',
  24. matchedRule,
  25. })
  26. }
  27. export function getClassifierApproval(toolUseID: string): string | undefined {
  28. if (!feature('BASH_CLASSIFIER')) {
  29. return undefined
  30. }
  31. const approval = CLASSIFIER_APPROVALS.get(toolUseID)
  32. if (!approval || approval.classifier !== 'bash') return undefined
  33. return approval.matchedRule
  34. }
  35. export function setYoloClassifierApproval(
  36. toolUseID: string,
  37. reason: string,
  38. ): void {
  39. if (!feature('TRANSCRIPT_CLASSIFIER')) {
  40. return
  41. }
  42. CLASSIFIER_APPROVALS.set(toolUseID, { classifier: 'auto-mode', reason })
  43. }
  44. export function getYoloClassifierApproval(
  45. toolUseID: string,
  46. ): string | undefined {
  47. if (!feature('TRANSCRIPT_CLASSIFIER')) {
  48. return undefined
  49. }
  50. const approval = CLASSIFIER_APPROVALS.get(toolUseID)
  51. if (!approval || approval.classifier !== 'auto-mode') return undefined
  52. return approval.reason
  53. }
  54. export function setClassifierChecking(toolUseID: string): void {
  55. if (!feature('BASH_CLASSIFIER') && !feature('TRANSCRIPT_CLASSIFIER')) return
  56. CLASSIFIER_CHECKING.add(toolUseID)
  57. classifierChecking.emit()
  58. }
  59. export function clearClassifierChecking(toolUseID: string): void {
  60. if (!feature('BASH_CLASSIFIER') && !feature('TRANSCRIPT_CLASSIFIER')) return
  61. CLASSIFIER_CHECKING.delete(toolUseID)
  62. classifierChecking.emit()
  63. }
  64. export const subscribeClassifierChecking = classifierChecking.subscribe
  65. export function isClassifierChecking(toolUseID: string): boolean {
  66. return CLASSIFIER_CHECKING.has(toolUseID)
  67. }
  68. export function deleteClassifierApproval(toolUseID: string): void {
  69. CLASSIFIER_APPROVALS.delete(toolUseID)
  70. }
  71. export function clearClassifierApprovals(): void {
  72. CLASSIFIER_APPROVALS.clear()
  73. CLASSIFIER_CHECKING.clear()
  74. classifierChecking.emit()
  75. }