Architecture
권한 모델 — 3단계 위험도 × 4가지 reviewer 모드
LVIS의 권한 모델은 두 개의 직교 축. 도구 위험도(RiskLevel: low/medium/high)와 자동 reviewer 모드(disabled/rule/llm/strict)가 만나서 어떤 도구가 자동 실행되고, 어떤 도구가 사용자 승인 카드를 띄울지 결정합니다.
src/permissions/reviewer/risk-classifier.ts
src/tools/types.ts:33
agentApproval 표준 경로
Risk levels — low / medium / high
// src/permissions/reviewer/risk-classifier.ts:44
export type RiskLevel = "low" | "medium" | "high";
// :53
const LEVEL_RANK: Record<RiskLevel, number> = { low: 0, medium: 1, high: 2 };Reviewer 모드 4종
disabled
자동 검토 끔. 모든 도구는 카테고리 기반 카드/다이얼로그.
rule
정적 규칙 기반. 도구 카테고리 + 인자 패턴 + grant 만으로 판정.
llm
LLM 보조 검토. 위험 인자 정황 + 자연어 reason 평가 후 권고.
strict
모든 medium/high 는 사용자 다이얼로그 강제. 자동화 최소화.
도구 카테고리 (5종)
// src/tools/types.ts:16
export type ToolSource = "builtin" | "plugin" | "mcp";
// :33
export type ToolCategory = "read" | "write" | "shell" | "network" | "meta";플러그인은 manifest toolSchemas.<tool>.category 로 각 도구의 카테고리를 선언합니다. 예: msgraph_email_reply = write, msgraph_email_list = read.
평가 격자 — Risk × Category × Mode
| Risk | read | write | shell | network |
|---|---|---|---|---|
| low | 자동 | 자동 (rule 모드만) | 카드 확인 | 자동 |
| medium | 자동 | 카드 확인 | 다이얼로그 | 카드 확인 |
| high | 카드 확인 | 다이얼로그 | 다이얼로그 + agentApproval | 다이얼로그 |
위 표는 일반적 매핑 — strict 모드에선 medium 도 다이얼로그로 격상. 실제 판정은 reviewer 코드가 사용자 grant + 모드 + reason 까지 함께 평가.
agentApproval — 위임된 위험 액션 표준 경로
Plugin 이 위험한 cross-plugin 액션 (파일 공유, 작업 위임, 외부 API 호출) 을 수행할 때는hostApi.agentApproval.request({ toolName, args, reason, scope }) 를 호출합니다. 승인 다이얼로그가 사용자에게 표시되고 ApprovalChoice 가 반환됩니다. 승인 응답은 respond(requestId, choice, nonce?, hmac?) 로 cryptographic chain 에 추가됩니다.
권한 grant 저장 위치
~/.lvis/permissions.json— 사용자 grant 저장 (src/permissions/permissions-store.ts)- 0o600 file, 0o700 directory 강제.
- 회수된 권한을 다시 요구하는 도구 호출은 fallback 없이 즉시 reject + 재허용 카드 발사 (LVIS no-fallback 룰).
No-fallback 룰 — 검증 사례
2026-04-30 work-assistant repo (구 work-proactive) PR #17 의 hardcoded
outlook.com 허용 → PR #19 revert + configSchema.meetingDetectorAllowedSenderDomains 외부화. 현재 코드: meeting-detector.ts:141 가 readPolicyExtra() + setPolicyAllowedDomains() 로 환경 변수/config 우선, default fail-closed (빈 배열).