ltcai 0.1.9 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +174 -305
- package/docs/CHANGELOG.md +307 -0
- package/docs/architecture.md +121 -0
- package/docs/mcp-tools.md +116 -0
- package/docs/privacy.md +74 -0
- package/docs/public-deploy.md +137 -0
- package/docs/security-model.md +121 -0
- package/knowledge_graph.py +123 -15
- package/llm_router.py +100 -28
- package/ltcai_cli.py +138 -5
- package/package.json +14 -2
- package/server.py +1756 -329
- package/skills/SKILL_TEMPLATE.md +61 -29
- package/skills/code_review/SKILL.md +28 -0
- package/skills/code_review/examples.md +59 -0
- package/skills/code_review/risk.json +9 -0
- package/skills/code_review/schema.json +65 -0
- package/skills/data_analysis/SKILL.md +28 -0
- package/skills/data_analysis/examples.md +62 -0
- package/skills/data_analysis/risk.json +9 -0
- package/skills/data_analysis/schema.json +61 -0
- package/skills/file_edit/SKILL.md +33 -0
- package/skills/file_edit/examples.md +45 -0
- package/skills/file_edit/risk.json +9 -0
- package/skills/file_edit/schema.json +60 -0
- package/skills/summarize_document/SKILL.md +68 -0
- package/skills/summarize_document/examples.md +65 -0
- package/skills/summarize_document/risk.json +9 -0
- package/skills/summarize_document/schema.json +71 -0
- package/skills/web_search/SKILL.md +28 -0
- package/skills/web_search/examples.md +61 -0
- package/skills/web_search/risk.json +9 -0
- package/skills/web_search/schema.json +62 -0
- package/static/account.html +53 -51
- package/static/admin.html +50 -46
- package/static/chat.html +124 -96
- package/static/graph.html +1231 -337
- package/static/manifest.json +2 -2
- package/tests/integration/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tests/integration/__pycache__/test_api.cpython-314-pytest-9.0.3.pyc +0 -0
- package/tests/unit/__pycache__/test_tools.cpython-314-pytest-9.0.3.pyc +0 -0
- package/tests/unit/test_tools.py +194 -1
- package/tools.py +264 -4
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.1.16] - 2026-05-22
|
|
4
|
+
|
|
5
|
+
### First-user admin bootstrap
|
|
6
|
+
|
|
7
|
+
- 서버를 처음 설치하고 가입하는 첫 번째 사용자가 자동으로 **admin** 권한 획득
|
|
8
|
+
- 이후 가입자는 기존과 동일하게 `user` 역할
|
|
9
|
+
- `/register` 응답에 `role` 필드 추가 — 클라이언트가 첫 가입 여부 확인 가능
|
|
10
|
+
|
|
11
|
+
### Release
|
|
12
|
+
- 배포 버전을 `0.1.16`으로 상향
|
|
13
|
+
|
|
14
|
+
## [0.1.15] - 2026-05-22
|
|
15
|
+
|
|
16
|
+
### Security hardening
|
|
17
|
+
|
|
18
|
+
- `LTCAI --tunnel` 실행 시 `LATTICEAI_REQUIRE_AUTH=true` 자동 강제 — 터널로 공개된 서버에 로그인 없이 접근 불가
|
|
19
|
+
- `/register` IP당 시간당 5회 rate limit
|
|
20
|
+
- `/login` IP당 5분당 10회 rate limit (brute force 방지)
|
|
21
|
+
- Cloudflare 터널 통과 시 `CF-Connecting-IP` 헤더로 실제 클라이언트 IP 추출
|
|
22
|
+
- `LATTICEAI_OPEN_REGISTRATION=false` 설정 시 회원가입 완전 차단 (관리자 직접 추가만 허용)
|
|
23
|
+
|
|
24
|
+
### Release
|
|
25
|
+
- 배포 버전을 `0.1.15`로 상향
|
|
26
|
+
|
|
27
|
+
## [0.1.14] - 2026-05-22
|
|
28
|
+
|
|
29
|
+
### `--tunnel` flag — 누구나 자기 PC를 서버로
|
|
30
|
+
|
|
31
|
+
- `LTCAI --tunnel` 한 줄로 Cloudflare 무료 터널 자동 개설
|
|
32
|
+
- cloudflared 바이너리가 없으면 GitHub에서 자동 다운로드 (`~/.latticeai/bin/`)
|
|
33
|
+
- macOS arm64/amd64, Linux arm64/amd64, Windows amd64 지원
|
|
34
|
+
- 터널 URL을 배너에 출력 + `LATTICEAI_TELEGRAM_BOT_TOKEN` / `LATTICEAI_TELEGRAM_CHAT_ID` 설정 시 Telegram 자동 알림
|
|
35
|
+
- `--tunnel` 지정 시 host 자동으로 `0.0.0.0`, CORS 네트워크 허용으로 전환
|
|
36
|
+
|
|
37
|
+
### Release
|
|
38
|
+
- 배포 버전을 `0.1.14`로 상향
|
|
39
|
+
- 대상 채널: `npm`, `PyPI`, `VS Code Marketplace`, `Open VSX`
|
|
40
|
+
|
|
41
|
+
## [0.1.13] - 2026-05-22
|
|
42
|
+
|
|
43
|
+
### Code quality & efficiency
|
|
44
|
+
|
|
45
|
+
- `HF_MODELS_ROOT` / `hf_model_dir` 중복 정의 제거 — `llm_router.py` 단일 소스로 통합, `server.py`에서 import
|
|
46
|
+
- `_looks_like_hf_model_dir` 가중치 파일 체크를 `.safetensors` / `.bin`으로 일치 — `.gguf`를 MLX 경로에서 잘못 허용하던 버그 수정
|
|
47
|
+
- `vllm_executable()` `shutil.which` 이중 호출 → 변수 캐시
|
|
48
|
+
- `ensure_lmstudio_model()` `_find_lmstudio_model_key` 이중 호출 → `found_key` 변수로 캐시
|
|
49
|
+
- `engine_support_status` 3단계 중첩 조건 → `is_apple_silicon` 플래그로 평탄화
|
|
50
|
+
- `ensure_llamacpp_server` 동일 프로세스 이중 `terminate()` 블록 → 단일 블록 (vllm 패턴과 통일)
|
|
51
|
+
- `ensure_vllm_server` 37줄 중첩 삼항 커맨드 빌더 → `if/elif/else` + `_host_args` 공통화
|
|
52
|
+
- `except: pass` → `except Exception: pass` (KeyboardInterrupt 노출)
|
|
53
|
+
- `knowledge_graph.py` 엣지 순회 루프 두 번 (`degree_map` + `topic_metrics`) → 단일 루프로 병합
|
|
54
|
+
|
|
55
|
+
### Performance & correctness
|
|
56
|
+
|
|
57
|
+
- `get_lmstudio_models()` TTL 캐시(10초) 추가 — `/health`, `/engines`, `/models` 매 요청마다 LM Studio HTTP 프로브하던 문제 해결, 서버 미응답 시 마지막 캐시 반환
|
|
58
|
+
- `/health`, `/engines`, `/models` 엔드포인트에서 `engine_status()` 호출을 `asyncio.to_thread()`로 오프로드 — LM Studio 최대 45초, ollama subprocess 블로킹이 이벤트 루프를 점유하던 문제 해결
|
|
59
|
+
- 앱 종료 시 `LOCAL_SERVER_PROCESSES` (vLLM, llama.cpp) 자식 프로세스 정리 — GPU 메모리 고아 프로세스 누수 수정
|
|
60
|
+
|
|
61
|
+
### Release
|
|
62
|
+
- 배포 버전을 `0.1.13`으로 상향
|
|
63
|
+
- 대상 채널: `npm`, `PyPI`, `VS Code Marketplace`, `Open VSX`
|
|
64
|
+
|
|
65
|
+
## [0.1.12] - 2026-05-22
|
|
66
|
+
|
|
67
|
+
### Local engine install / load flow
|
|
68
|
+
- `vLLM` 설치 경로를 macOS용 `Python 3.12 + vllm-metal` 흐름으로 교체
|
|
69
|
+
- `LM Studio` 번들 `lms` CLI와 native API를 사용해 서버 시작, 모델 다운로드, 모델 로드를 자동화
|
|
70
|
+
- `llama.cpp`는 선택한 GGUF를 alias와 함께 OpenAI 호환 서버로 직접 로드하도록 정리
|
|
71
|
+
- 모델 패널의 `설치` / `다운로드 후 자동 로드` 흐름이 실제 `prepare_and_load_model()` 경로로 수렴되도록 정리
|
|
72
|
+
|
|
73
|
+
### Verified
|
|
74
|
+
- 최소 테스트 모델 기준 실사용 검증 완료
|
|
75
|
+
- `vLLM`: `Qwen/Qwen2.5-0.5B-Instruct-AWQ`
|
|
76
|
+
- `LM Studio`: `https://huggingface.co/lmstudio-community/Qwen2.5-0.5B-Instruct-GGUF`
|
|
77
|
+
- `llama.cpp`: `lmstudio-community/Qwen2.5-0.5B-Instruct-GGUF`
|
|
78
|
+
|
|
79
|
+
### Release
|
|
80
|
+
- 배포 버전을 `0.1.12`로 상향
|
|
81
|
+
- 대상 채널: `npm`, `PyPI`, `VS Code Marketplace`, `Open VSX`
|
|
82
|
+
|
|
83
|
+
## [0.1.11] - 2026-05-21
|
|
84
|
+
|
|
85
|
+
### Agent state machine (renamed + cleaned up)
|
|
86
|
+
- 8개의 명시적 상태: `IDLE → PLANNING → WAITING_APPROVAL → EXECUTING → VERIFYING → (DONE | ROLLBACK → FAILED)`
|
|
87
|
+
- `RETRY` 상태 제거 — 재시도 카운터는 `AgentRunContext.retry_count`에 보관, `VERIFYING`이 `EXECUTING`으로 직접 전환
|
|
88
|
+
- 종료 상태를 `DONE` / `FAILED`로 분리 — 응답에 `final_state` 필드 추가, `status`는 `"ok"` 또는 `"failed"`
|
|
89
|
+
|
|
90
|
+
### Tool Permission Layer
|
|
91
|
+
- `ToolPermission` 추가 — `{ tool, risk, requires_approval, network }` 4-필드 컴팩트 뷰
|
|
92
|
+
- 기존 7-차원 `TOOL_GOVERNANCE`에서 자동 파생 (단일 진실 공급원)
|
|
93
|
+
- `GET /tools/permissions` 엔드포인트 추가
|
|
94
|
+
- `/mcp/tools` 응답의 각 툴에 `permission` 필드 노출
|
|
95
|
+
|
|
96
|
+
### Cleanup
|
|
97
|
+
- 중국어 응답 지원 제거 — `detect_language`는 이제 `ko` 또는 `en`만 반환
|
|
98
|
+
- `_LANG_HINT`에서 `"zh"` 키 삭제, EXECUTOR_PROMPT의 "Chinese" 언급 제거
|
|
99
|
+
|
|
100
|
+
### Repo
|
|
101
|
+
- `CHANGELOG.md` → `docs/CHANGELOG.md` 이동 (루트 가독성 개선)
|
|
102
|
+
- 자동 릴리스 워크플로(`release.yml`) 제거 — 수동 배포 유지
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## [0.1.10] - 2026-05-21
|
|
107
|
+
|
|
108
|
+
### Agent intelligence (pro-developer workflow)
|
|
109
|
+
- **`AGENT_SYSTEM_PROMPT` 완전 재작성** — Claude Code 스타일 시니어 개발자 워크플로
|
|
110
|
+
- Discover → Plan → Implement → Verify 4단계 강제
|
|
111
|
+
- JSON 응답에 `thoughts` 필드 추가, transcript에 함께 기록되어 다음 스텝의 컨텍스트로 전달
|
|
112
|
+
- 코드 읽기 전 수정 금지, 검증 없이 "완료" 주장 금지, 작은 diff 원칙
|
|
113
|
+
- 새 도구 카탈로그 + 안티패턴(반복 액션·환각 import·placeholder URL) 명시
|
|
114
|
+
- **`max_steps` 상향** — 기본값 6 → 25, 캡 10 → 50 (`AgentRequest.max_steps`)
|
|
115
|
+
|
|
116
|
+
### New tools
|
|
117
|
+
- **`edit_file`** — 정밀 diff 편집. `old_string`이 파일에 유일하게 존재해야만 성공(또는 `replace_all=true`). 환각 import / 잘못된 위치 수정 방지. 결과에 `first_edit_line` 포함
|
|
118
|
+
- **`grep`** — 정규식 검색, 전체 텍스트 파일 대상, `glob` 필터, `context_lines`, binary dir(`node_modules`, `.git`, `venv`, `dist` 등) 자동 제외. 기존 `search_files`는 호환 유지
|
|
119
|
+
- **`todo_write` / `todo_read`** — 워크스페이스별 영구 TODO 리스트(`agent_workspace/.lattice/todos.json`). 멀티스텝 작업의 상태 유지. status ∈ `pending | in_progress | completed`. 다중 in_progress 경고
|
|
120
|
+
- **`read_file` 업그레이드** — `numbered`(라인 번호 뷰), `total_lines`, `start_line`/`end_line`, optional `offset`/`limit` 추가. 기존 `content` 반환 호환 유지
|
|
121
|
+
- 위 모든 도구에 `/tools/*` REST 엔드포인트 추가, `_TOOL_RISK` 등록, `/mcp/tools` 카탈로그 노출
|
|
122
|
+
|
|
123
|
+
### Loop safety
|
|
124
|
+
- `_FILE_CREATE_ACTIONS`에 `edit_file` 포함 — 같은 args로 연속 호출 시 자동 중단
|
|
125
|
+
- 반복 중단 메시지를 "다음 단계로 진행하세요"로 명확화
|
|
126
|
+
|
|
127
|
+
### Tests
|
|
128
|
+
- `tests/unit/test_tools.py`에 23개 신규 테스트 — edit_file (유일/모호/`replace_all`/identical), grep (regex·glob·case·context·binary dir), todo round-trip + 검증, read_file numbered/offset/limit, 샌드박스 이탈 차단 (`52 passed`)
|
|
129
|
+
|
|
130
|
+
### Security (보안 기본값 통일)
|
|
131
|
+
- **기본 바인딩 `0.0.0.0` → `127.0.0.1` 롤백** — v0.1.8에서 PWA 편의를 위해 0.0.0.0으로 변경했으나 개인 AI 서버의 기본값은 로컬 전용이어야 안전함. 네트워크 노출이 필요한 경우 `LATTICEAI_HOST=0.0.0.0` 명시적 설정.
|
|
132
|
+
- SECURITY.md, CONTRIBUTING.md, GitHub Actions CI/Release 워크플로 추가
|
|
133
|
+
- docs/ 문서 추가: architecture, security-model, public-deploy, mcp-tools, privacy
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## [0.1.9] - 2026-05-21
|
|
138
|
+
|
|
139
|
+
### Security
|
|
140
|
+
- **세션 TTL 7일 → 24시간 + sliding refresh** — 활동 시 만료시간 자동 연장, 15분 단위 디스크 쓰기 throttle
|
|
141
|
+
- **평문 비밀번호 마이그레이션 audit 로깅** — `password_migrated_from_plaintext` 이벤트로 남은 평문 사용자 추적
|
|
142
|
+
- **파일 업로드 magic-number 검증** — `_bytes_match_extension()`: PDF/DOCX/XLSX/PPTX/PNG/JPEG/ZIP 시그니처 확인, 확장자 위조 방지
|
|
143
|
+
- **Rate limiting** — `/chat` 30 burst/분당 30, `/agent` 10 burst/분당 6, `/upload` 20 burst/분당 12. 토큰 버킷 per-user. `LATTICEAI_RATE_LIMIT=0`으로 비활성화 가능
|
|
144
|
+
|
|
145
|
+
### Reliability
|
|
146
|
+
- **PyMuPDF 파일 핸들 누수 수정** — `/tools/pdf_pages` try/finally로 doc.close() 보장, `len(doc)` 호출 위치 버그 수정
|
|
147
|
+
- **ollama serve 좀비 방지** — 실행 전 already_up 체크, `start_new_session=True`로 detach
|
|
148
|
+
- **knowledge_graph.py 손상된 metadata_json 안전 처리** — `_safe_loads()` 헬퍼로 corrupt row 통과 (5곳 적용)
|
|
149
|
+
- **백그라운드 asyncio 태스크 예외 로깅** — `_spawn()` 헬퍼 (`add_done_callback`) — startup 태스크 silent fail 방지
|
|
150
|
+
- **silent except → logging.warning** — `_load_sessions`, `_persist_sessions`, `load_vpc_config`, `load_mcp_installs`
|
|
151
|
+
|
|
152
|
+
### Tests
|
|
153
|
+
- **`tests/unit/test_security.py`** — 16개 신규 테스트: bcrypt 해시 라운드트립/유니크, MIME 검증, rate limit (29 → 31개 전체 통과)
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## [0.1.8] - 2026-05-21
|
|
158
|
+
|
|
159
|
+
### Added
|
|
160
|
+
- **PWA (Progressive Web App)** — iPad / Android / Galaxy Tab 홈화면 설치 지원
|
|
161
|
+
- `manifest.json`: 앱 이름, 아이콘, 배경색, 테마색, 단축키 정의
|
|
162
|
+
- `sw.js` Service Worker: 정적 파일 캐시-퍼스트, API 네트워크-퍼스트, 오프라인 대응
|
|
163
|
+
- 192×192, 512×512, apple-touch-icon 180×180, favicon 32×32 PNG 아이콘 생성
|
|
164
|
+
- 모든 HTML에 `<link rel="manifest">`, `apple-mobile-web-app-*`, `theme-color` 메타태그 추가
|
|
165
|
+
- `viewport-fit=cover` — iPhone Dynamic Island / 노치 안전영역 확장
|
|
166
|
+
- **서버 네트워크 공개 바인딩** — 기본 host `127.0.0.1` → `0.0.0.0`으로 변경
|
|
167
|
+
- 같은 Wi-Fi 내 iPad / Android / Galaxy Tab 에서 `http://<Mac IP>:4825` 로 바로 접근 가능
|
|
168
|
+
- 시작 배너에 로컬 / 네트워크 URL 및 "Add to Home Screen" 안내 출력
|
|
169
|
+
- **Windows 서버 호환성**
|
|
170
|
+
- `computer_screenshot`: macOS `screencapture` 외 Windows/Linux에서 pyautogui fallback
|
|
171
|
+
- `computer_open_app` / `computer_open_url`: `open -a` (macOS) / `cmd /c start` (Windows) / `xdg-open` (Linux) 자동 분기
|
|
172
|
+
- `_PLATFORM` 상수 도입으로 향후 플랫폼 분기 일관성 확보
|
|
173
|
+
- **배포 파일 포함**: `manifest.json`, `sw.js`, `icons/` 폴더를 npm · PyPI 패키지에 포함
|
|
174
|
+
|
|
175
|
+
### Deployed
|
|
176
|
+
- npm ✅
|
|
177
|
+
- PyPI ✅
|
|
178
|
+
- VS Code Marketplace ✅
|
|
179
|
+
- Open VSX ✅
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## [0.1.7] - 2026-05-21
|
|
184
|
+
|
|
185
|
+
### Added
|
|
186
|
+
- **모바일 반응형 UI** — 폰/태블릿 화면 크기에 자동 대응
|
|
187
|
+
- 768px 이하: 사이드바가 좌측 슬라이드 드로어로 전환, 헤더 햄버거(☰) 버튼으로 열기
|
|
188
|
+
- 오버레이 탭하면 사이드바 닫힘, 대화 선택 시 자동 닫힘
|
|
189
|
+
- ops-strip 카드 3개 → 가로 스크롤 한 줄 압축 (모바일)
|
|
190
|
+
- `100dvh` 적용 — iOS 소프트 키보드 올라와도 레이아웃 유지
|
|
191
|
+
- `env(safe-area-inset-bottom)` — iPhone 노치/홈바 안전영역 자동 여백
|
|
192
|
+
- textarea `font-size: 16px` (480px 이하) — iOS 자동 줌 방지
|
|
193
|
+
- 브레이크포인트 3단계: 900px(태블릿) / 768px(모바일 드로어) / 480px(폰)
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## [0.1.6] - 2026-05-21
|
|
198
|
+
|
|
199
|
+
### Added
|
|
200
|
+
- **LATTICEAI_ENABLE_GRAPH** 환경변수 — Data Graph 기능을 퍼블릭 서버에서 완전히 숨길 수 있는 토글 (기본값 `true`)
|
|
201
|
+
- `false`로 설정 시 모든 그래프 API 엔드포인트 404 반환, 인제스트 건너뜀, 사이드바 버튼 자동 숨김
|
|
202
|
+
- `.env.example`에 `LATTICEAI_ENABLE_GRAPH` 항목 추가 (로컬/퍼블릭 모드 각각)
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## [0.1.5] - 2026-05-21
|
|
207
|
+
|
|
208
|
+
### Added
|
|
209
|
+
- **Data Graph** — 채팅·AI 답변·업로드 문서를 SQLite 지식 그래프로 자동 구조화, `/graph`에서 Canvas 기반 Force-directed 시각화
|
|
210
|
+
- **Graph RAG** — 그래프 검색 결과를 채팅 컨텍스트에 자동 주입하여 이전 대화·문서 참조 능력 강화
|
|
211
|
+
- **Telegram 원격 제어** — 인라인 키보드 메뉴로 상태 조회, 모델 관리, 스크린샷, 그래프 통계, 문서 업로드 등 원격 제어
|
|
212
|
+
- `knowledge_graph.py` — KnowledgeGraphStore (node/edge/chunk/event), `ingest_message()`, `ingest_document()`, `context_for_query()`, `search()`, `neighbors()`
|
|
213
|
+
- `static/graph.html` — 타입별 색상, 줌/패닝, 핀치 줌, 이웃 하이라이트, 노드 상세 정보, 채팅 연결 링크
|
|
214
|
+
|
|
215
|
+
### Security
|
|
216
|
+
- 어드민 세션 핸드오프를 URL 파라미터 → `sessionStorage` 1회 읽기 방식으로 교체 (히스토리 노출 방지)
|
|
217
|
+
- `X-Admin-Email` 헤더 폴백 제거 — Bearer 토큰 인증만 허용
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## [0.1.4] - 2026-05-18
|
|
222
|
+
|
|
223
|
+
### Added
|
|
224
|
+
- **세션 영속성** — 서버 재시작 후에도 로그인 유지 (sessions.json 파일 기반)
|
|
225
|
+
- **SSO 로그인** — Entra ID / Okta OIDC 지원 (`OIDC_DISCOVERY_URL`, `OIDC_CLIENT_ID`, `OIDC_CLIENT_SECRET` 환경변수)
|
|
226
|
+
- **채팅 히스토리 검색** — 사이드바 검색창으로 대화 내용 키워드 검색 (`GET /history/search`)
|
|
227
|
+
- **대화 삭제** — 사이드바 각 대화에 삭제 버튼 추가
|
|
228
|
+
- **MCP 서버 관리 UI** — 사이드바 "MCP 관리" 버튼으로 설치/목록 확인 모달
|
|
229
|
+
- **인라인 Diff 뷰** — Edit Selection 결과를 diff로 보여주고 Apply/Discard 선택
|
|
230
|
+
- **현재 파일 첨부** — `Lattice AI: Attach Current File to Chat` 명령 추가 (VS Code)
|
|
231
|
+
- `authlib` 의존성 추가 (SSO OIDC 지원)
|
|
232
|
+
|
|
233
|
+
### Deployed
|
|
234
|
+
- PyPI ✅
|
|
235
|
+
- npm ✅
|
|
236
|
+
- VS Code Marketplace ✅
|
|
237
|
+
- Open VSX ✅
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## [0.1.3] - 2026-05-18
|
|
242
|
+
|
|
243
|
+
### Added
|
|
244
|
+
- 프로필 수정 API (`PATCH /account/profile`) 및 UI — 이름·닉네임 변경
|
|
245
|
+
- 회원가입 폼 개선 — 비밀번호 확인 필드, 인라인 에러 메시지
|
|
246
|
+
- 어드민 패널 초대 링크 섹션 — 원클릭 복사
|
|
247
|
+
- 어드민 대시보드 메시지 활동 차트 (Chart.js, 최근 14일)
|
|
248
|
+
- 웹 UI 한국어 / 영어 전환 (`🌐 Languages` 버튼, localStorage 저장)
|
|
249
|
+
|
|
250
|
+
### Fixed
|
|
251
|
+
- 로그아웃 시 `/logout` API 호출하여 서버 세션 쿠키 정상 만료
|
|
252
|
+
- 인증(`account.html`)과 채팅(`chat.html`) UI 분리 — 레거시 `index.html` 제거
|
|
253
|
+
- `chat.html` 내 죽은 인증 코드 제거
|
|
254
|
+
- 채팅 헤더에서 언어 선택 드롭다운이 ops-strip을 가리는 문제 수정
|
|
255
|
+
|
|
256
|
+
### Deployed
|
|
257
|
+
- PyPI ✅
|
|
258
|
+
- npm ✅
|
|
259
|
+
- VS Code Marketplace ✅
|
|
260
|
+
- Open VSX ✅
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## [0.1.1] - 2026-05-18
|
|
265
|
+
|
|
266
|
+
### Added
|
|
267
|
+
- 비밀번호 변경 API (`POST /account/change-password`)
|
|
268
|
+
- 웹 UI 비밀번호 변경 모달 (헤더 계정 아이콘)
|
|
269
|
+
|
|
270
|
+
### Docs
|
|
271
|
+
- 어드민 패널: 첫 가입자 자동 admin 안내 추가
|
|
272
|
+
- 플랫폼 지원 범위 (Windows/Linux) 안내 추가
|
|
273
|
+
- 언어 지원 (KO/EN) 안내 추가
|
|
274
|
+
|
|
275
|
+
### Deployed
|
|
276
|
+
- PyPI ✅
|
|
277
|
+
- npm ✅
|
|
278
|
+
- VS Code Marketplace ✅
|
|
279
|
+
- Open VSX ✅
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## [0.1.0] - 2026-05-17
|
|
284
|
+
|
|
285
|
+
### Added
|
|
286
|
+
- FastAPI 브릿지 서버 (port 4825)
|
|
287
|
+
- Apple Silicon MLX 로컬 모델 지원 (Gemma 4, Qwen 2.5 등)
|
|
288
|
+
- 클라우드 모델 지원 (OpenAI, Groq, Together, OpenRouter 등)
|
|
289
|
+
- VS Code / Cursor / Antigravity 확장
|
|
290
|
+
- Telegram 봇 (로컬 AI 미러 + Codex 클라우드 봇)
|
|
291
|
+
- 어드민 패널 (`/admin`)
|
|
292
|
+
- P-Reinforce 지식 정원 엔진
|
|
293
|
+
- MCP 서버 연동
|
|
294
|
+
- Ollama / vLLM / LM Studio / llama.cpp 연동
|
|
295
|
+
|
|
296
|
+
### Security
|
|
297
|
+
- 모든 민감 엔드포인트 인증 적용
|
|
298
|
+
- SameSite=Lax 쿠키 (CSRF 방어)
|
|
299
|
+
- scrypt 비밀번호 해싱
|
|
300
|
+
- tempfile 레이스 컨디션 수정
|
|
301
|
+
- `run_command()` 위험 플래그 차단
|
|
302
|
+
|
|
303
|
+
### Deployed
|
|
304
|
+
- PyPI ✅
|
|
305
|
+
- npm ✅
|
|
306
|
+
- VS Code Marketplace ✅
|
|
307
|
+
- Open VSX ✅
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Lattice AI — 아키텍처
|
|
2
|
+
|
|
3
|
+
## 전체 구조
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
┌─────────────────────────────────────────────────────────┐
|
|
7
|
+
│ 클라이언트 레이어 │
|
|
8
|
+
│ 웹 UI (chat.html) │ VS Code 확장 │ Telegram 봇 │
|
|
9
|
+
└──────────────────────────┬──────────────────────────────┘
|
|
10
|
+
│ HTTP / SSE
|
|
11
|
+
┌──────────────────────────▼──────────────────────────────┐
|
|
12
|
+
│ server.py — FastAPI (port 4825) │
|
|
13
|
+
│ │
|
|
14
|
+
│ /chat /agent /models /tools/* /mcp/* /garden │
|
|
15
|
+
│ /account /admin /auth/sso /knowledge-graph /graph │
|
|
16
|
+
└────┬──────────┬──────────┬──────────┬───────────────────┘
|
|
17
|
+
│ │ │ │
|
|
18
|
+
▼ ▼ ▼ ▼
|
|
19
|
+
llm_router tools.py knowledge_ p_reinforce
|
|
20
|
+
.py graph.py .py
|
|
21
|
+
│
|
|
22
|
+
├── MLX (mlx_lm / mlx_vlm) ← Apple Silicon 로컬
|
|
23
|
+
├── OpenAI SDK ← openai / groq / together / openrouter
|
|
24
|
+
└── Ollama / vLLM REST ← 로컬 서버 연동
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 파일별 역할
|
|
28
|
+
|
|
29
|
+
| 파일 | 역할 |
|
|
30
|
+
|------|------|
|
|
31
|
+
| `server.py` | FastAPI 앱, 모든 HTTP 엔드포인트, 인증/세션/CORS/rate limit |
|
|
32
|
+
| `ltcai_cli.py` | CLI 엔트리포인트 (`LTCAI` 명령), `doctor` 서브커맨드, uvicorn 실행 |
|
|
33
|
+
| `llm_router.py` | 로컬(MLX/Ollama) ↔ 클라우드(OpenAI/Groq/…) 라우팅, 스트리밍 SSE |
|
|
34
|
+
| `tools.py` | 에이전트 도구 구현: read_file, edit_file, grep, run_command, todo_write/read, 스크린샷 등 |
|
|
35
|
+
| `knowledge_graph.py` | SQLite 지식 그래프 (노드/엣지/청크), Graph RAG 컨텍스트 주입 |
|
|
36
|
+
| `p_reinforce.py` | P-Reinforce 지식 정원 엔진, `~/.ltcai-brain/` 분류 저장 |
|
|
37
|
+
| `telegram_bot.py` | 로컬 AI Telegram 미러 봇 |
|
|
38
|
+
| `codex_telegram_bot.py` | 클라우드 Codex Telegram 봇 (GPT + GitHub 이슈) |
|
|
39
|
+
| `vscode-extension/` | TypeScript VS Code 확장 |
|
|
40
|
+
| `static/` | 웹 UI HTML (chat, account, admin, graph), PWA manifest/SW |
|
|
41
|
+
| `bin/ltcai.js` | npm CLI 엔트리포인트 (Python 환경 자동 부트스트랩) |
|
|
42
|
+
|
|
43
|
+
## 데이터 흐름
|
|
44
|
+
|
|
45
|
+
### 채팅 요청
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
브라우저 → POST /chat
|
|
49
|
+
→ server.py: 인증 확인, rate limit
|
|
50
|
+
→ llm_router.py: 모델 선택 (로컬/클라우드)
|
|
51
|
+
→ knowledge_graph.py: Graph RAG 컨텍스트 조회 + 주입
|
|
52
|
+
→ LLM 스트리밍 응답 (SSE)
|
|
53
|
+
→ knowledge_graph.py: 메시지/응답 인제스트
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 에이전트 요청
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
브라우저/VS Code → POST /agent
|
|
60
|
+
→ server.py: 인증 확인, rate limit (6/분)
|
|
61
|
+
→ llm_router.py: Discover→Plan→Implement→Verify 루프 (max 25스텝)
|
|
62
|
+
→ tools.py: read_file / edit_file / grep / run_command / todo_*
|
|
63
|
+
→ 각 스텝 결과 스트리밍
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 문서 업로드
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
브라우저 → POST /upload
|
|
70
|
+
→ server.py: magic-number 검증, rate limit (12/분)
|
|
71
|
+
→ tools.py: PDF/DOCX/XLSX/PPTX 파싱
|
|
72
|
+
→ knowledge_graph.py: Chunk/Page/Sheet/Slide 노드 인제스트
|
|
73
|
+
→ blob 저장: ~/.ltcai/knowledge_graph_blobs/
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## 데이터 저장소
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
~/.ltcai/
|
|
80
|
+
├── users.json # 사용자 계정 (scrypt 해시)
|
|
81
|
+
├── sessions.json # 세션 토큰 (24h TTL)
|
|
82
|
+
├── chat_history.json # 채팅 히스토리
|
|
83
|
+
├── knowledge_graph.sqlite # Graph RAG SQLite DB
|
|
84
|
+
├── knowledge_graph_blobs/ # 원본 업로드 파일
|
|
85
|
+
├── mcp_installs.json # MCP 서버 설치 목록
|
|
86
|
+
└── todos.json # 에이전트 TODO 리스트
|
|
87
|
+
|
|
88
|
+
~/.ltcai-brain/
|
|
89
|
+
├── INDEX.md
|
|
90
|
+
├── 00_Raw/
|
|
91
|
+
├── 10_Wiki/
|
|
92
|
+
├── 20_Skills/
|
|
93
|
+
├── 30_Projects/
|
|
94
|
+
└── 40_Log/
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## 인증 흐름
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
POST /login (username + password)
|
|
101
|
+
→ scrypt 검증
|
|
102
|
+
→ 세션 토큰 생성 (UUID, 24h TTL)
|
|
103
|
+
→ Set-Cookie: session=<token>; HttpOnly; SameSite=Lax
|
|
104
|
+
|
|
105
|
+
모든 민감 엔드포인트:
|
|
106
|
+
→ _require_auth(): 쿠키 검증 → User 반환 또는 401
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
SSO (OIDC):
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
GET /auth/sso/login → 리디렉션 (Entra ID / Okta)
|
|
113
|
+
GET /auth/sso/callback?code=... → 토큰 교환 → 세션 생성
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## MCP 연동
|
|
117
|
+
|
|
118
|
+
`/mcp/tools` — 에이전트 도구 카탈로그를 MCP 형식으로 노출
|
|
119
|
+
Claude Desktop / Cursor의 MCP 설정에 `http://localhost:4825/mcp` 추가 시 직접 도구 사용 가능.
|
|
120
|
+
|
|
121
|
+
자세한 내용: [mcp-tools.md](mcp-tools.md)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# MCP 도구 카탈로그
|
|
2
|
+
|
|
3
|
+
Lattice AI는 MCP(Model Context Protocol) 서버로 동작하여 Claude Desktop, Cursor 등에서 직접 도구를 사용할 수 있습니다.
|
|
4
|
+
|
|
5
|
+
## 연결 설정
|
|
6
|
+
|
|
7
|
+
`claude_desktop_config.json` 또는 Cursor MCP 설정:
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"mcpServers": {
|
|
12
|
+
"lattice-ai": {
|
|
13
|
+
"url": "http://localhost:4825/mcp"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 도구 목록
|
|
20
|
+
|
|
21
|
+
### 파일 시스템
|
|
22
|
+
|
|
23
|
+
| 도구 | 설명 | 위험도 |
|
|
24
|
+
|------|------|--------|
|
|
25
|
+
| `read_file` | 파일 읽기 (라인 번호, offset/limit 지원) | 낮음 |
|
|
26
|
+
| `edit_file` | 정밀 diff 편집 (`old_string` 유일성 검증) | 중간 |
|
|
27
|
+
| `list_dir` | 디렉토리 목록 | 낮음 |
|
|
28
|
+
| `grep` | 정규식 검색, glob 필터, context_lines | 낮음 |
|
|
29
|
+
|
|
30
|
+
### 실행
|
|
31
|
+
|
|
32
|
+
| 도구 | 설명 | 위험도 |
|
|
33
|
+
|------|------|--------|
|
|
34
|
+
| `run_command` | 셸 명령 실행 (위험 패턴 차단) | 높음 |
|
|
35
|
+
| `run_terminal_command` | 터미널 명령 (별칭) | 높음 |
|
|
36
|
+
|
|
37
|
+
### 작업 관리
|
|
38
|
+
|
|
39
|
+
| 도구 | 설명 | 위험도 |
|
|
40
|
+
|------|------|--------|
|
|
41
|
+
| `todo_write` | TODO 항목 생성/업데이트 | 낮음 |
|
|
42
|
+
| `todo_read` | TODO 목록 조회 | 낮음 |
|
|
43
|
+
|
|
44
|
+
### 시스템
|
|
45
|
+
|
|
46
|
+
| 도구 | 설명 | 위험도 |
|
|
47
|
+
|------|------|--------|
|
|
48
|
+
| `computer_screenshot` | 화면 캡처 | 낮음 |
|
|
49
|
+
| `computer_open_app` | 앱 실행 | 중간 |
|
|
50
|
+
| `computer_open_url` | URL 열기 | 낮음 |
|
|
51
|
+
| `network_status` | IP, Wi-Fi 정보 | 낮음 |
|
|
52
|
+
|
|
53
|
+
### 문서
|
|
54
|
+
|
|
55
|
+
| 도구 | 설명 | 위험도 |
|
|
56
|
+
|------|------|--------|
|
|
57
|
+
| `pdf_to_text` | PDF → 텍스트 변환 | 낮음 |
|
|
58
|
+
| `pdf_pages` | PDF 페이지 수 조회 | 낮음 |
|
|
59
|
+
| `read_docx` | Word 문서 읽기 | 낮음 |
|
|
60
|
+
| `read_xlsx` | Excel 파일 읽기 | 낮음 |
|
|
61
|
+
| `read_pptx` | PowerPoint 읽기 | 낮음 |
|
|
62
|
+
|
|
63
|
+
### 지식 정원 (P-Reinforce)
|
|
64
|
+
|
|
65
|
+
| 도구 | 설명 | 위험도 |
|
|
66
|
+
|------|------|--------|
|
|
67
|
+
| `garden_save` | 지식 정원에 저장 | 낮음 |
|
|
68
|
+
| `garden_tree` | 지식 트리 조회 | 낮음 |
|
|
69
|
+
| `garden_read` | 정원 파일 읽기 | 낮음 |
|
|
70
|
+
|
|
71
|
+
## REST API 직접 호출
|
|
72
|
+
|
|
73
|
+
MCP 대신 REST API로도 동일한 도구를 호출할 수 있습니다:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# read_file
|
|
77
|
+
curl -b "session=<token>" \
|
|
78
|
+
"http://localhost:4825/tools/read_file?path=server.py"
|
|
79
|
+
|
|
80
|
+
# edit_file
|
|
81
|
+
curl -b "session=<token>" -X POST \
|
|
82
|
+
http://localhost:4825/tools/edit_file \
|
|
83
|
+
-H "Content-Type: application/json" \
|
|
84
|
+
-d '{"path": "server.py", "old_string": "old code", "new_string": "new code"}'
|
|
85
|
+
|
|
86
|
+
# grep
|
|
87
|
+
curl -b "session=<token>" \
|
|
88
|
+
"http://localhost:4825/tools/grep?pattern=def%20main&glob=*.py"
|
|
89
|
+
|
|
90
|
+
# run_command
|
|
91
|
+
curl -b "session=<token>" -X POST \
|
|
92
|
+
http://localhost:4825/tools/run_command \
|
|
93
|
+
-H "Content-Type: application/json" \
|
|
94
|
+
-d '{"command": "python -m pytest tests/ -v"}'
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## 도구 카탈로그 조회
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
curl http://localhost:4825/mcp/tools
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
응답:
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"tools": [
|
|
107
|
+
{
|
|
108
|
+
"name": "edit_file",
|
|
109
|
+
"description": "정밀 diff 편집. old_string이 파일에 유일해야만 성공.",
|
|
110
|
+
"risk": "medium",
|
|
111
|
+
"parameters": { ... }
|
|
112
|
+
},
|
|
113
|
+
...
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
```
|
package/docs/privacy.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# 개인정보 및 데이터 정책
|
|
2
|
+
|
|
3
|
+
## 요약
|
|
4
|
+
|
|
5
|
+
**Lattice AI는 데이터를 수집하거나 외부 서버로 전송하지 않습니다.**
|
|
6
|
+
|
|
7
|
+
모든 데이터는 사용자의 로컬 머신에만 저장됩니다.
|
|
8
|
+
|
|
9
|
+
## 저장되는 데이터
|
|
10
|
+
|
|
11
|
+
| 데이터 | 저장 위치 | 설명 |
|
|
12
|
+
|--------|-----------|------|
|
|
13
|
+
| 사용자 계정 | `~/.ltcai/users.json` | 이름, scrypt 해시 비밀번호, 역할 |
|
|
14
|
+
| 세션 토큰 | `~/.ltcai/sessions.json` | UUID 토큰, 만료시간 |
|
|
15
|
+
| 채팅 히스토리 | `~/.ltcai/chat_history.json` | 사용자-AI 대화 내용 |
|
|
16
|
+
| 지식 그래프 | `~/.ltcai/knowledge_graph.sqlite` | 채팅/문서 노드/엣지 |
|
|
17
|
+
| 업로드 파일 | `~/.ltcai/knowledge_graph_blobs/` | 원본 PDF/DOCX 등 |
|
|
18
|
+
| 지식 정원 | `~/.ltcai-brain/` | P-Reinforce 분류 저장 |
|
|
19
|
+
| 설정 | `~/.ltcai/config.json` | 모델 설정, API 키 (keyring) |
|
|
20
|
+
|
|
21
|
+
## 수집하지 않는 데이터
|
|
22
|
+
|
|
23
|
+
- 사용 통계, 세션 길이, 클릭 이벤트
|
|
24
|
+
- 오류 리포트 (로컬 `server.log`에만 기록)
|
|
25
|
+
- 기기 정보, IP 주소
|
|
26
|
+
- 프롬프트/응답 내용
|
|
27
|
+
|
|
28
|
+
## 클라우드 모델 사용 시
|
|
29
|
+
|
|
30
|
+
사용자가 직접 OpenAI, Groq, Together, OpenRouter 등의 API 키를 설정하고 클라우드 모델을 선택한 경우, 해당 프롬프트와 응답은 각 클라우드 제공업체의 서버를 경유합니다. 이는 각 제공업체의 개인정보처리방침을 따릅니다.
|
|
31
|
+
|
|
32
|
+
- OpenAI: https://openai.com/privacy
|
|
33
|
+
- Groq: https://groq.com/privacy-policy
|
|
34
|
+
- Together AI: https://www.together.ai/privacy
|
|
35
|
+
- OpenRouter: https://openrouter.ai/privacy
|
|
36
|
+
|
|
37
|
+
Apple Silicon MLX 로컬 모델 사용 시에는 프롬프트가 외부로 전송되지 않습니다.
|
|
38
|
+
|
|
39
|
+
## API 키 보안
|
|
40
|
+
|
|
41
|
+
- API 키는 OS keyring(macOS Keychain, Windows Credential Manager, Linux Secret Service)에 저장됩니다
|
|
42
|
+
- `LATTICEAI_ALLOW_PLAINTEXT_API_KEYS=true` 설정 없이는 디스크에 평문 저장되지 않습니다
|
|
43
|
+
- 채팅 히스토리 저장 전 API key/token/password 패턴 자동 마스킹
|
|
44
|
+
|
|
45
|
+
## 데이터 삭제
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# 채팅 히스토리만 삭제
|
|
49
|
+
rm ~/.ltcai/chat_history.json
|
|
50
|
+
|
|
51
|
+
# 지식 그래프 삭제
|
|
52
|
+
rm ~/.ltcai/knowledge_graph.sqlite
|
|
53
|
+
rm -rf ~/.ltcai/knowledge_graph_blobs/
|
|
54
|
+
|
|
55
|
+
# 전체 데이터 삭제
|
|
56
|
+
rm -rf ~/.ltcai/
|
|
57
|
+
rm -rf ~/.ltcai-brain/
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
웹 UI에서: `/clear` 명령 (현재 대화 삭제), 어드민 패널에서 사용자별 데이터 관리
|
|
61
|
+
|
|
62
|
+
## 퍼블릭 배포 시
|
|
63
|
+
|
|
64
|
+
외부 사용자가 접근할 수 있는 환경에 배포하는 경우, 사용자에게 다음을 고지하세요:
|
|
65
|
+
|
|
66
|
+
1. 어떤 데이터가 서버에 저장되는지
|
|
67
|
+
2. 사용하는 클라우드 AI 제공업체
|
|
68
|
+
3. 채팅 내용의 보존 기간 및 삭제 방법
|
|
69
|
+
|
|
70
|
+
Lattice AI 자체는 퍼블릭 배포 운영자의 데이터 처리 방식에 대해 책임지지 않습니다.
|
|
71
|
+
|
|
72
|
+
## 문의
|
|
73
|
+
|
|
74
|
+
개인정보 관련 문의: rnlgnquvk@gmail.com
|