Skip to content

Commit 0f4929e

Browse files
chrisryugjclaude
andcommitted
release: v3.6.1 — 암호 미리보기 kordoc 핀 드리프트 수리 + AI 안내 모달 provider 분기 (#37) + macOS 설치 안내 (#38)
- publish.yml kordoc SHA 핀 v4.3.0→v4.4.0(e92525f): v3.6.0 배포본이 --password 미지원 kordoc v4.3.0을 번들해 암호 문서 미리보기가 동작하지 않던 문제 수리. v4.4.0의 HWP3 아래아·PUA 11종·CDATA 소실 수정도 함께 반영 - AiDisclaimerModal: 열릴 때 get_settings로 ai_provider/ai_base_url을 읽어 전송 대상 문구 분기 — OpenAI 호환은 base URL 표기, localhost/루프백은 "이 컴퓨터 안에서만 처리" 안내 (#37) - README: macOS 15 Sequoia Gatekeeper 팝업(그래도 열기/xattr) 안내 추가 (#38) - CHANGELOG 3.6.1 + 버전 3곳 + Cargo.lock Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016qXsP28ZpS8Hsw8HD6iHtS
1 parent 245e4bf commit 0f4929e

8 files changed

Lines changed: 99 additions & 14 deletions

File tree

.github/workflows/publish.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@ jobs:
4848
# 리포가 private이면 token: ${{ secrets.KORDOC_PAT }} 추가 필요
4949
#
5050
# SHA 고정으로 공급망 공격 방지. 새 kordoc 버전 릴리스 시 이 SHA를 갱신.
51-
# 현재: v4.3.0 (기안문 서식·누름틀 채우기, 빈 문단 보존 #57, 에러 계약 7건, TAC outMargin, 성능) — 2026-07-29
51+
# 현재: v4.4.0 (비밀번호 문서 열기 #59 — v3.6.0 암호 미리보기 필수, HWP3 아래아·PUA·CDATA 소실 수정) — 2026-08-04
5252
- name: Checkout kordoc
5353
uses: actions/checkout@v4
5454
with:
5555
repository: chrisryugj/kordoc
5656
path: kordoc-src
57-
ref: 4868052e1d56d9e68a348cbcb97a217c089edd6d
57+
ref: e92525f394245e5afd859908ad20af9082726b50
5858

5959
- name: Build kordoc dist
6060
working-directory: kordoc-src
@@ -222,7 +222,7 @@ jobs:
222222
with:
223223
repository: chrisryugj/kordoc
224224
path: kordoc-src
225-
ref: 4868052e1d56d9e68a348cbcb97a217c089edd6d
225+
ref: e92525f394245e5afd859908ad20af9082726b50
226226

227227
- name: Build kordoc dist
228228
working-directory: kordoc-src

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,23 @@
11
# Changelog
22

3+
## [3.6.1] - 2026-08-04
4+
5+
**v3.6.0 암호 미리보기 수리(kordoc 핀 드리프트) + AI 답변 MD 저장 + AI 안내 모달 provider 분기**
6+
7+
### 🐛 수정
8+
9+
- **v3.6.0 암호 문서 미리보기가 배포본에서 동작하지 않던 문제**: 릴리스 빌드가 kordoc v4.3.0을 번들하고 있었습니다(publish.yml SHA 핀 미갱신). 암호 입력 시 kordoc CLI가 알 수 없는 `--password` 옵션으로 실패했습니다. 핀을 v4.4.0(e92525f)으로 갱신 — HWP3 아래아 소실·한컴 PUA 11종·CDATA 텍스트 소실 수정도 함께 반영됩니다.
10+
- **AI 안내 모달이 로컬·사내 LLM 설정에서도 "Google Gemini API로 전송"으로 표시** (#37): 모달이 열릴 때 현재 provider 설정을 읽어 문구를 분기합니다. OpenAI 호환 endpoint는 설정한 base URL을 표시하고, localhost/루프백이면 "이 컴퓨터 안에서만 처리됩니다"로 안내합니다.
11+
12+
### ✨ 추가
13+
14+
- **AI 답변을 Markdown 파일로 저장** (#39, @amnotyoung): AI 답변 하단 액션 바에 "MD 저장" 버튼 추가. 질문·답변·참조 문서를 한 문서로 묶어 저장하며, 저장 다이얼로그는 질의에 사용한 검색 범위 폴더에서 열립니다.
15+
16+
### 📝 문서
17+
18+
- README 개발자용 섹션에 kordoc 번들 빌드 단계 추가 (#40, @tindone)
19+
- README macOS 설치 안내에 macOS 15 Sequoia Gatekeeper 팝업("악성 코드가 없음을 확인할 수 없습니다") 대응 방법 추가 (#38)
20+
321
## [3.6.0] - 2026-08-01
422

523
**암호로 보호된 문서 열기 — 미리보기에서 비밀번호 입력 (kordoc v4.4.0)**

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,17 @@ Everything처럼 파일명 일부만 입력하면 인메모리 캐시에서 **
160160
1. `.dmg` 더블클릭 → Applications 폴더로 드래그
161161
2. **첫 실행만**: Applications 폴더에서 Anything 우클릭 → "열기" → 경고창에서 다시 "열기"
162162

163+
**"Apple은 'Anything'에 악성 코드가 없음을 확인할 수 없습니다" 팝업이 뜰 때** (macOS 15 Sequoia 이상)
164+
165+
macOS 15부터는 우클릭 → "열기" 우회가 막혀 위 팝업에 "열기" 버튼이 없습니다. 두 방법 중 하나로 열 수 있습니다.
166+
167+
- 팝업에서 "완료" 클릭 → **시스템 설정 → 개인정보 보호 및 보안** → 하단 "'Anything'이(가) 차단되었습니다" 옆 **"그래도 열기"** → 다시 실행
168+
- 또는 터미널에서 quarantine 속성 제거:
169+
170+
```bash
171+
xattr -dr com.apple.quarantine /Applications/Anything.app
172+
```
173+
163174
**"손상된 앱"으로 표시될 때** (Gatekeeper quarantine)
164175

165176
```bash

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "anything",
3-
"version": "3.6.0",
3+
"version": "3.6.1",
44
"description": "로컬 문서 검색 앱 - Everything 대항마",
55
"type": "module",
66
"scripts": {

src-tauri/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src-tauri/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "docufinder"
3-
version = "3.6.0"
3+
version = "3.6.1"
44
description = "로컬 문서 검색 앱 - HWPX, Office, PDF 지원"
55
authors = ["Chris"]
66
edition = "2021"

src-tauri/tauri.conf.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://schema.tauri.app/config/2",
33
"productName": "Anything",
4-
"version": "3.6.0",
4+
"version": "3.6.1",
55
"identifier": "com.anything.app",
66
"build": {
77
"beforeDevCommand": "pnpm dev",

src/components/search/AiDisclaimerModal.tsx

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import { useState, useCallback } from "react";
1+
import { useState, useEffect, useCallback } from "react";
22
import { Modal } from "../ui/Modal";
33
import { Button } from "../ui/Button";
4+
import { invokeWithTimeout, IPC_TIMEOUT } from "../../utils/invokeWithTimeout";
5+
import type { Settings, AiProvider } from "../../types/settings";
46

57
const STORAGE_KEY = "docufinder_ai_disclaimer_accepted";
68
const LEGACY_STORAGE_KEY = "ai_disclaimer_accepted";
@@ -11,9 +13,32 @@ interface AiDisclaimerModalProps {
1113
onDecline: () => void;
1214
}
1315

14-
/** AI 기능 사용 시 문서 유출 경고 모달 */
16+
/** base URL이 이 컴퓨터를 가리키는지 (localhost/루프백) */
17+
function isLocalEndpoint(baseUrl: string): boolean {
18+
try {
19+
const host = new URL(baseUrl).hostname;
20+
return host === "localhost" || host === "127.0.0.1" || host === "[::1]" || host === "::1";
21+
} catch {
22+
return false;
23+
}
24+
}
25+
26+
/** AI 기능 사용 시 문서 유출 경고 모달 — 전송 대상 문구는 provider 설정에 따라 분기 (#37) */
1527
export function AiDisclaimerModal({ isOpen, onAccept, onDecline }: AiDisclaimerModalProps) {
1628
const [dontShowAgain, setDontShowAgain] = useState(false);
29+
const [aiTarget, setAiTarget] = useState<{ provider: AiProvider; baseUrl: string } | null>(null);
30+
31+
// 열릴 때마다 현재 설정을 읽는다 — 설정 변경 후에도 안내가 실제 전송 대상과 일치하도록
32+
useEffect(() => {
33+
if (!isOpen) return;
34+
invokeWithTimeout<Settings>("get_settings", undefined, IPC_TIMEOUT.SETTINGS)
35+
.then((s) => setAiTarget({ provider: s.ai_provider ?? "gemini", baseUrl: (s.ai_base_url ?? "").trim() }))
36+
.catch(() => setAiTarget(null));
37+
}, [isOpen]);
38+
39+
const isOpenAi = aiTarget?.provider === "open_ai";
40+
const baseUrl = aiTarget?.baseUrl ?? "";
41+
const isLocal = isOpenAi && isLocalEndpoint(baseUrl);
1742

1843
const handleAccept = useCallback(() => {
1944
if (dontShowAgain) {
@@ -67,8 +92,24 @@ export function AiDisclaimerModal({ isOpen, onAccept, onDecline }: AiDisclaimerM
6792
</div>
6893

6994
<p className="text-sm text-center" style={{ color: "var(--color-text-primary)" }}>
70-
AI 질문 및 요약 기능을 사용하면<br />
71-
<strong>문서 내용의 일부가 외부 서버</strong>(Google Gemini API)로 전송됩니다.
95+
{isLocal ? (
96+
<>
97+
AI 질문 및 요약 기능을 사용하면<br />
98+
문서 내용의 일부가 <strong>이 컴퓨터의 로컬 LLM 서버</strong>
99+
(<code className="text-xs">{baseUrl}</code>)로 전송됩니다.
100+
</>
101+
) : isOpenAi ? (
102+
<>
103+
AI 질문 및 요약 기능을 사용하면<br />
104+
<strong>문서 내용의 일부가 설정하신 LLM 서버</strong>
105+
{baseUrl && <>(<code className="text-xs">{baseUrl}</code>)</>}로 전송됩니다.
106+
</>
107+
) : (
108+
<>
109+
AI 질문 및 요약 기능을 사용하면<br />
110+
<strong>문서 내용의 일부가 외부 서버</strong>(Google Gemini API)로 전송됩니다.
111+
</>
112+
)}
72113
</p>
73114

74115
<div
@@ -78,9 +119,24 @@ export function AiDisclaimerModal({ isOpen, onAccept, onDecline }: AiDisclaimerM
78119
color: "var(--color-text-secondary)",
79120
}}
80121
>
81-
<p>- 검색된 문서의 텍스트 청크가 API로 전달됩니다</p>
82-
<p>- 기밀/민감 문서를 다루는 경우 주의하세요</p>
83-
<p>- API 키는 로컬에 저장되며 외부에 공유되지 않습니다</p>
122+
{isLocal ? (
123+
<>
124+
<p>- 검색된 문서의 텍스트 청크가 이 컴퓨터 안에서만 처리됩니다</p>
125+
<p>- 외부 클라우드로 나가는 요청이 없습니다</p>
126+
</>
127+
) : isOpenAi ? (
128+
<>
129+
<p>- 검색된 문서의 텍스트 청크가 지정하신 엔드포인트로만 전달됩니다</p>
130+
<p>- 사내망/로컬 서버가 아닌 외부 호환 서비스를 지정한 경우 유의하세요</p>
131+
<p>- API 키는 로컬에 저장되며 외부에 공유되지 않습니다</p>
132+
</>
133+
) : (
134+
<>
135+
<p>- 검색된 문서의 텍스트 청크가 API로 전달됩니다</p>
136+
<p>- 기밀/민감 문서를 다루는 경우 주의하세요</p>
137+
<p>- API 키는 로컬에 저장되며 외부에 공유되지 않습니다</p>
138+
</>
139+
)}
84140
</div>
85141
</div>
86142
</Modal>

0 commit comments

Comments
 (0)