Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TalkFlow

macOS용 카카오톡 답장 보조 도구. 로컬 데이터베이스에서 대화를 읽고, 방마다 정한 규칙으로 답할지 판단하고, LLM에 초안을 요청하고, 원하면 그 초안을 카카오톡 창에 직접 입력해 보냅니다.

English: TalkFlow drafts and optionally sends KakaoTalk replies on your behalf, on macOS. Documentation is in Korean because the tool is specific to KakaoTalk. Before using it, read “읽고 결정하세요” below — the people you talk to will not be told that a model wrote the reply.


읽고 결정하세요

이 문서에서 가장 중요한 절입니다. 기능 목록보다 먼저 읽어야 합니다.

상대는 모릅니다. 자동 전송을 켜면 당신의 카카오톡 계정에서, 당신 이름으로, 당신 말투에 맞춰 조정된 메시지가 나갑니다. 나가는 메시지에 「AI가 썼다」는 표시는 없습니다. 이 저장소에 그런 기능은 구현되어 있지 않고, 프롬프트는 오히려 사람처럼 읽히도록 — 방의 말투를 따르고 같은 말을 반복하지 않도록 — 지시합니다. 상대에게 알릴지 말지는 이 도구가 대신 결정해 주지 않는 문제이고, 쓰는 사람의 책임으로 남습니다.

당신은 동의했고 상대는 동의하지 않았습니다. 답을 만들려면 최근 대화가 AI 제공자로 나가야 합니다. 방 설정에 따라 사진, 링크가 가리키는 페이지 내용, 대화에서 뽑은 검색어까지 함께 나갈 수 있습니다. 그 대화에 있는 사람들은 그 사실을 알 방법이 없습니다. 「채팅방 요약」과 「사람 기억」을 켜면 실제 사람에 대한 서술이 디스크에 저장되고 이후 프롬프트에 실려 나갑니다.

비공식 연동입니다. 카카오톡의 암호화된 로컬 데이터베이스를 읽고, 접근성 API로 카카오톡 창을 조작해 전송합니다. 카카오톡이 승인한 방법이 아니고, 카카오 이용약관에 어긋날 가능성이 높습니다. 카카오톡이 업데이트되면 조용히 깨질 수 있습니다.

전송은 되돌릴 수 없습니다. 잘못 나간 메시지는 취소할 수 없습니다.

기본값은 이 위험을 최소로 두고 시작합니다. 설치 직후에는 아무 방도 답하지 않고(responseMode: .off), 방을 켜도 처음에는 초안만 만들며, 전송에는 별도 동의가 따로 필요합니다. 밖으로 나가는 것을 넓히는 설정 — 사진 함께 읽기, 웹 검색, 링크 읽기, 사람 기억 — 은 모두 꺼진 채로 도착합니다.

예외가 하나 있습니다: 채팅방 요약은 켜진 채로 시작합니다. 답하는 방이라면 그 대화는 이미 답장마다 AI 제공자로 나가고 있어서, 요약이 새로 넓히는 것은 없다는 판단입니다. 다만 요약은 그 방에 대한 서술을 디스크에 남깁니다. 그게 싫으면 방마다 끌 수 있고, 끄면 남은 요약도 지웁니다. 사람에 대한 서술을 남기는 「사람 기억」은 이와 달리 기본이 꺼짐입니다.

그래도 위 네 가지 경고는 켜는 순간 사실이 됩니다.

권하는 사용 방식은 초안만 켜고 사람이 읽고 보내는 것입니다. 그러면 이 도구는 대신 말하는 것이 아니라 먼저 써 보는 것이 됩니다.


필요한 것

macOS 15 이상
카카오톡 macOS 앱, 로그인된 상태
katok 0.3.0 — 카카오톡 로컬 DB 읽기와 증분 동기화
Codex CLI 초안을 쓰는 모델 호출. 별도 로그인이 필요합니다
전체 디스크 접근 초안만 쓸 때도 필요합니다. 카카오톡의 로컬 대화를 읽는 데 씁니다
접근성 권한 자동 전송에만 필요합니다. 초안만 쓸 때는 필요 없습니다

권한 없이 카카오톡 컨테이너를 열거하면 에러가 아니라 돌아오지 않는 호출이 됩니다. 앱이 「감지 중」 초록불을 켠 채로 멈춘 것처럼 보이면 대개 전체 디스크 접근이 빠진 것입니다 (PLATFORM-FINDINGS 8.2).

katok은 Homebrew tap이 없어서 릴리스 아카이브를 고정 버전으로 내려받고 게시된 SHA-256을 검증한 뒤 설치합니다.

scripts/install-katok.sh

빌드

TALKFLOW_BUNDLE_ID=com.yourdomain.talkflow scripts/build-app.sh --install

번들 ID는 역DNS라 본인이 소유한 도메인이어야 합니다. 그리고 이 값을 한 번 정하면 바꾸지 마세요 — macOS의 접근성·자동화 승인은 번들 ID와 팀 ID에 걸려 있어서, 다른 번들 ID로 빌드한 앱은 시스템 입장에서 다른 앱이고 권한을 처음부터 다시 받아야 합니다.

swift build가 만드는 실행 파일을 직접 실행하지 마세요. 앱 번들이 아니면 권한이 제대로 붙지 않습니다. 이유는 scripts/build-app.sh 머리말과 docs/PLATFORM-FINDINGS.md 8절에 있습니다.

테스트는 이 명령으로 돌립니다. 그냥 swift test는 무한 정지할 수 있습니다 — 이유는 AGENTS.md 검증 절에 있습니다.

swift test --skip extractedPhotosLandInOneDirectoryThatDiscardRemoves \
           --skip aMessageWithNoPictureLeavesNoDirectoryBehind \
           --skip anEmptyPlaceholderFileIsNotOfferedToTheModel \
           --skip onlyPhotosUpToTheCapAreEverAskedFor \
           --skip withoutTheConnectorThereAreNoPhotosAndNoTemporaryFiles

어떻게 동작하는가

카카오톡 로컬 DB 변경 감지 (본 DB와 -wal, -shm 제외)
        ↓
katok sync — 최소 간격을 두고 증분 동기화
        ↓
방마다 규칙 판단 — 대부분 여기서 걸러진다. 모델은 후보에만 묻는다
        ↓
초안 생성 — 최근 대화, 방 요약, 사람 메모, (설정에 따라) 사진·링크·웹 검색
        ↓
전송 대기열 — 전송 직전에 모든 조건을 다시 확인한다

규칙 판단이 모델 호출보다 앞에 있는 것은 비용 때문만이 아닙니다. 답하지 않기로 한 이유도 기록에 남아서, 활동 화면이 「무엇을 보냈는가」와 함께 「왜 아무 일도 일어나지 않았는가」에 답할 수 있습니다.

무엇을 정할 수 있는가

전부 방마다 따로 정합니다. 한 방을 자동응답으로 두고 다른 방은 아예 끄는 것이 기본 사용 방식입니다.

언제 답할지

설정
응답 · 감지(기록만) · 멘션(불렸을 때만) · 자동(전부 모델에 넘김)
호출어 계정 이름 + 전역 호출어 + 방 전용 호출어. 카카오톡 「답장」으로 내 메시지를 지목한 것도 부른 것으로 셉니다
끼어들기 확률 나를 부르지 않은 메시지를 모델에 넘길 확률(0~100%). 0이면 아예 묻지 않습니다
판단 주기 즉시 · 5분 · 10개(메시지 수) · 5분~10분(범위). 모아서 한 번에 판단합니다
최소 간격 답장과 답장 사이 최소 시간
활성 시간 09:00-23:00 같은 창. 밖이면 아무것도 하지 않습니다

어떻게 답할지

말투(자유 문장) · 길이 · 이모지 · 적극성. 전역으로 한 벌 정하고 방마다 덮어쓸 수 있습니다. 답변 조건은 자유 문장으로 「이럴 때만 답해라」를 적는 자리입니다.

무엇을 보고 답할지

기본값
최근 대화 항상. 방 전체 역사가 아니라 창 하나 분량입니다
채팅방 요약 켜짐 — 이 방이 어떤 방이고 무엇이 진행 중인지
사람 기억 꺼짐 — 사람별 메모와 링크
사진 함께 읽기 꺼짐
링크 읽기 꺼짐 — 메시지에 있는 URL의 페이지 내용을 읽습니다
웹 검색 꺼짐 — 대화가 검색어가 되어 나갑니다

어떻게 보낼지

초안만(사람이 눌러야 나감) · 유휴 자동(자리를 비웠을 때만) · 상시. 어느 쪽이든 전송 직전에 모든 조건을 다시 확인하고, 그 사이 상대가 말을 더 했으면 붙여서 다시 판단합니다.

묻지 않아도 하는 것 — 전부 기본 꺼짐입니다

  • 먼저 말 걸기 — 방이 조용해지면 먼저 말을 겁니다. 전용 시간, 주기, 연속 횟수, 재시도 주제를 정합니다
  • 집중 시간 — 확률로 한동안 빠르게 답하는 구간에 들어갔다 나옵니다
  • 상태 알림 — 네 전이(활성 시간 열림·닫힘, 집중 시간 시작·끝) 중 고른 것에서 그 방에 한마디 합니다. 전이마다 켜고 끄고, 초안만 둘지 보낼지도 따로 정합니다

지켜보는 것

  • 활동 — 보낸 것과 보내지 않은 이유가 같은 목록에 있습니다. 각 항목은 감지 → 동기화 → 규칙 판단 → 대기열 → 전송 시도 → 전송의 단계별 소요 시간을 들고 있어서, 답장이 2분 걸렸을 때 어느 2분이었는지 알 수 있습니다
  • 전송 대기열 — 나가기를 기다리는 초안. 고쳐서 보내거나 버릴 수 있습니다
  • 관리자 방 — 지정한 방에서 ! 명령으로 설정을 읽고 바꿉니다. 맥 앞에 없을 때 씁니다

어떻게 보이는가

화면은 다섯입니다 — 개요 · 채팅방 · 사람 · 활동 · 설정. 전송 대기열과 권한 안내는 개요 안에 있고, 대기 중인 초안 수는 사이드바의 활동 항목에 배지로 붙습니다.

아래는 관리자 방 출력입니다. 손으로 베낀 것이 아니라 이 저장소의 포매터를 직접 호출해 생성했습니다 — 형식이 코드와 어긋날 수 없습니다. 방 이름과 사람 이름은 지어낸 것입니다.

!방 — 방 목록

방 12개

1. 주말 산책 · 자동응답 · 초안만

2. 늦반딧불 등산모임 · 끔 · 초안만

3. 달빛 스튜디오 · 멘션 · 유휴자동

!방 3 — 한 방의 설정 전부

3. 달빛 스튜디오 (단체) · 대화창 열림

· 응답: 멘션 (끔·감지·멘션·자동)
· 전송: 유휴자동 (초안·유휴자동·상시)
· 끼어들기: 40% · 최소간격: 5분 · 판단주기: 5분~10분마다
· 활성시간: 09:00–23:00
· 사진: 끔 · 웹검색: 끔 · 링크: 켬
· 대화기억: 켬 · 사람기억: 켬
· 먼저말: 꺼짐 · 집중시간: 켬

말투·답변조건은 앱에서만.
항목 자세히·바꾸기: !세팅 3 <항목> <값>

!세팅 3 판단주기 — 바꾸기 전에 지금 값과 받는 값을 먼저 보여줍니다

3. 달빛 스튜디오 · 판단주기

지금: 5분~10분마다
값: 즉시·10개·5분·5분~10분
바꾸기: !세팅 3 판단주기 <값>

!세팅 3 전송 상시 — 바뀐 것을 전후로 되읽어 줍니다

3. 달빛 스튜디오

전송: 유휴 상태 자동 전송 → 상시 전송

!활동 — 답한 것과 답하지 않은 것이 같은 목록에 있습니다

최근 활동 · 1~3

1. 달빛 스튜디오 · 답장 · 네 그 시간 괜찮아요

2. 주말 산책 · 보류 · 최소 간격 안

3. 달빛 스튜디오 · 초안 · 확인해 보고 알려드릴게요

다음: !활동 2쪽

말투와 답변 조건은 콘솔에서 바꿀 수 없습니다. 방의 목소리를 그 방에 있는 누구든 한 줄씩 조용히 고쳐 쓸 수 있게 되는 자리라, 그 둘만은 앱에서만 바뀝니다.

설계에서 지킨 것

카카오톡과 무관하게 옮겨 쓸 수 있는 부분입니다. 자율적으로 행동하는 도구를 만들 때의 입장이고, 코드로 강제되어 있습니다.

  • 초안에서 멈춘다. 전송은 별도 결정이고 별도 코드 경로다. 되돌릴 수 없는 것과 되돌릴 수 있는 것을 같은 함수에 두지 않는다.
  • 되돌릴 수 없는 행동 직전에 모든 조건을 다시 읽는다. 10초 전에 통과한 판단은 통과한 판단이 아니다.
  • 채팅 메시지는 신뢰할 수 없는 입력이다. 메시지 내용이 앱 정책이나 시스템 지시를 바꿀 수 없다. 예외는 하나뿐이고(관리자 방 명령), 그 권한은 메시지 에 있는 두 가지 — 지정된 방인가, 그 방의 구성원인가 — 로만 결정된다.
  • 계정 확인이 불확실하면 보내지 않는다. 커넥터가 로그아웃한 계정을 읽는 동안 전송은 현재 계정으로 나갈 수 있다. 실제로 9일간 그랬다.
  • 밖으로 나가는 것을 넓히는 기능은 꺼진 상태로 도착한다. 업그레이드가 사용자를 대신해 그 결정을 하지 않는다. 마이그레이션마다 그 판단의 근거가 주석으로 남아 있다.
  • 설정은 보이는 곳에 표시가 함께 있다. 눌러도 화면에 아무 변화가 없는 스위치는 꺼진 것과 구분되지 않는다.
  • 판단의 근거를 기록한다. 답하지 않은 것도 기록이다.

알려진 한계

  • 고지 기능이 없습니다. 위 「읽고 결정하세요」 참고. 이 저장소는 상대에게 알리는 기능을 제공하지 않습니다.
  • 카카오톡 업데이트에 깨집니다. 창 제목으로 방을 찾고, 접근성 트리에서 입력란과 전송 버튼을 찾습니다. 어느 것이 바뀌어도 전송이 멈춥니다.
  • 같은 이름의 방이 여러 개면 전송을 거부합니다. 접근성 트리에는 방을 구분할 다른 정보가 없어서, 추측해서 넣으면 남의 대화로 갑니다.
  • 한국어 전용입니다. UI, 프롬프트, 문서가 모두 한국어입니다.
  • 카카오톡 macOS만 지원합니다. iOS, 안드로이드, PC 버전은 대상이 아닙니다.

문서

문서 담는 것
DESIGN.md 제품이 무엇을 하고 왜 그렇게 하는지. 결정과 근거
docs/ARCHITECTURE.md 모듈 경계, 의존 방향, 파일 관리 기준
docs/PLATFORM-FINDINGS.md 카카오톡·macOS·katok의 관측된 동작. 확인 방법과 함께
AGENTS.md 이 저장소에서 코드를 쓸 때 지킬 규칙

PLATFORM-FINDINGS.md는 이 저장소에서 가장 옮겨 쓸 만한 문서일 수 있습니다. 카카오톡과 macOS는 우리 통제 밖이라 거기 적힌 사실은 언젠가 틀려집니다. 동작이 이상해지면 설계를 의심하기 전에 그 문서부터 다시 검증하세요.

개인정보

  • 카카오톡 원문, 계정 식별값, API 키는 이 저장소에 없습니다. 문서와 테스트의 이름, 방 이름, 메시지는 모두 지어낸 것입니다.
  • 계정 식별값은 실행 중에 이 기기에서 해석해 앱 지원 폴더에 캐시합니다. 저장소에 들어 있지 않고, 들어갈 수도 없습니다.
  • 인용된 카카오톡 문장은 원문 대신 같은 모양으로 옮겨 적은 것이고, 그렇다고 표시해 두었습니다.

버그를 보고할 때 실제 대화 내용, 실제 이름, 계정 식별값을 붙이지 마세요.

라이선스

MIT.

라이선스는 이 코드를 쓸 권리를 주지만, 다른 사람에게 무엇을 해도 된다는 뜻은 아닙니다. 이 도구로 당신 이름으로 나가는 메시지는 당신의 것이고, 그 결과도 당신의 것입니다.

About

카카오톡 대화에 넣는 봇 퍼블릭버전

Resources

Stars

11 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages