아키텍처 개요
Triggerfish는 단일 핵심 불변 규칙을 가진 안전한 멀티 채널 AI 에이전트 플랫폼입니다:
보안 보안은 결정론적이며 LLM 하위에 있습니다. 모든 보안 결정은 LLM이 우회, 재정의 또는 영향을 미칠 수 없는 순수 코드에 의해 이루어집니다. LLM은 권한이 없습니다 -- 동작을 요청하고, 정책 계층이 결정합니다. :::
이 페이지는 Triggerfish 작동 방식의 전체 그림을 제공합니다. 각 주요 구성 요소는 전용 심층 분석 페이지로 연결됩니다.
시스템 아키텍처
데이터 흐름
모든 메시지는 시스템을 통해 이 경로를 따릅니다:
모든 시행 지점에서 결정은 결정론적입니다 -- 같은 입력은 항상 같은 결과를 생성합니다. hook 내부에는 LLM 호출도, 무작위성도, LLM이 결과에 영향을 미칠 방법도 없습니다.
주요 구성 요소
분류 시스템
데이터는 네 가지 정렬된 수준을 통해 흐릅니다: RESTRICTED > CONFIDENTIAL > INTERNAL > PUBLIC. 핵심 규칙은 no write-down입니다: 데이터는 동일하거나 더 높은 분류 수준으로만 흐를 수 있습니다. CONFIDENTIAL 세션은 PUBLIC 채널로 데이터를 보낼 수 없습니다. 예외 없음. LLM 재정의 불가.
정책 엔진과 Hook
8개의 결정론적 시행 hook이 데이터 흐름의 중요 지점에서 모든 동작을 가로챕니다. Hook은 순수 함수입니다: 동기적이고, 로깅되며, 위조할 수 없습니다. 정책 엔진은 고정 규칙(절대 구성 불가), 관리자 조정 가능 규칙, 엔터프라이즈용 선언적 YAML escape hatch를 지원합니다.
세션과 Taint
각 대화는 독립적인 taint 추적이 있는 세션입니다. 세션이 분류된 데이터에 접근하면 taint가 해당 수준으로 상승하며 세션 내에서 절대 감소할 수 없습니다. 전체 초기화는 taint와 대화 기록을 모두 지웁니다. 모든 데이터 요소는 계보 추적 시스템을 통해 출처 메타데이터를 전달합니다.
Gateway
Gateway는 중앙 제어 평면입니다 -- WebSocket JSON-RPC 엔드포인트를 통해 세션, 채널, 도구, 이벤트, 에이전트 프로세스를 관리하는 장기 실행 로컬 서비스입니다. 알림 서비스, cron 스케줄러, webhook 수집, 채널 라우팅을 조율합니다.
저장소
모든 상태 데이터는 통합 StorageProvider 추상화를 통해 흐릅니다. 네임스페이스 키(sessions:, taint:, lineage:, audit:)로 관심사를 분리하면서도 비즈니스 로직을 건드리지 않고 백엔드를 교체할 수 있습니다. 기본값은 ~/.triggerfish/data/triggerfish.db의 SQLite WAL입니다.
심층 방어
보안은 채널 인증과 권한 인식 데이터 접근에서부터 세션 taint, 정책 hook, plugin 샌드박스, 파일 시스템 도구 샌드박스, 감사 로깅에 이르기까지 13개의 독립적인 메커니즘에 걸쳐 계층화되어 있습니다. 어떤 단일 계층도 혼자서는 충분하지 않습니다; 함께 작동하여 하나의 계층이 침해되더라도 우아하게 성능이 저하되는 방어를 형성합니다.
설계 원칙
| 원칙 | 의미 |
|---|---|
| 결정론적 시행 | 정책 hook은 순수 함수를 사용합니다. LLM 호출 없음, 무작위성 없음. 같은 입력은 항상 같은 결정을 생성합니다. |
| Taint 전파 | 모든 데이터는 분류 메타데이터를 전달합니다. 세션 taint는 상승만 가능하고, 절대 감소하지 않습니다. |
| No write-down | 데이터는 더 낮은 분류 수준으로 흐를 수 없습니다. 절대로. |
| 모든 것을 감사 | 모든 정책 결정이 전체 컨텍스트와 함께 로깅됩니다: 타임스탬프, hook 유형, 세션 ID, 입력, 결과, 평가된 규칙. |
| Hook은 위조 불가 | LLM은 정책 hook 결정을 우회, 수정 또는 영향을 미칠 수 없습니다. Hook은 LLM 계층 아래의 코드에서 실행됩니다. |
| 세션 격리 | 각 세션은 taint를 독립적으로 추적합니다. 백그라운드 세션은 새로운 PUBLIC taint로 생성됩니다. 에이전트 워크스페이스는 완전히 격리됩니다. |
| 저장소 추상화 | 어떤 모듈도 자체 저장소를 생성하지 않습니다. 모든 영속성은 StorageProvider를 통해 흐릅니다. |
기술 스택
| 구성 요소 | 기술 |
|---|---|
| 런타임 | Deno 2.x (TypeScript strict mode) |
| Python plugin | Pyodide (WASM) |
| 테스팅 | Deno 내장 테스트 러너 |
| 채널 | Baileys (WhatsApp), grammY (Telegram), Bolt (Slack), discord.js (Discord) |
| 브라우저 자동화 | puppeteer-core (CDP) |
| 음성 | Whisper (로컬 STT), ElevenLabs/OpenAI (TTS) |
| 저장소 | SQLite WAL (기본값), 엔터프라이즈 백엔드 (Postgres, S3) |
| 시크릿 | OS 키체인 (개인), vault 연동 (엔터프라이즈) |
Triggerfish는 외부 빌드 도구, Docker, 클라우드 종속성이 필요하지 않습니다. 로컬에서 실행되고, 데이터를 로컬에서 처리하며, 사용자에게 데이터에 대한 완전한 주권을 부여합니다. :::
