정체와 구조
PawWork(爪爪, '완전해방판')는 크롬 웹스토어에 올리지 않는 MV3 언팩 확장이다. 선택 위젯도, 스토어 앱도 아니라고 README가 못박는다. 핵심 주장은 하나다. 이미 로그인된 브라우저 자체를 프로그래머블 계층으로 보고, 사이드패널에 에이전트를 앉혀 그 위에서 페이지를 조종하고 시트·문서·사이트 산출물을 만든다. 서버가 없고, 모델은 사용자가 키를 직접 넣는 BYOK다.
실측상 리포는 매우 어리다. 커밋 13회, 전체 이력이 2026-09-01부터 2026-09-10까지 열흘 남짓이고, 저자 2명 중 하나는 github-actions 봇이라 실인간은 사실상 1명이다. 그런데 스타가 2,591개, 포크 7개다. 스타 대 커밋·나이 비율이 유기적 성장보다는 홍보성 유입에 가깝다는 신호로 읽어야 한다.
규모 수치(377 파일·16.5만 줄)도 그대로 믿으면 안 된다. 개발 로드인 src/와 릴리스 로드인 extension/이 거의 같은 트리를 중복 보관하기 때문이다. 실효 코드는 절반 수준이고, 그중에서도 src/sidepanel.js 한 파일이 14,491줄로 사이드패널 UI 대부분을 짊어진다.
핵심 기능과 아키텍처
1. 진입·선택. 콘텐츠 스크립트가 모든 프레임에 붙어 사용자가 페이지 요소를 집는다('伸爪' 선택). 단축키로 영역 스크린샷도 대화 첨부로 넘긴다. 2. 사용자 메시지. 사이드패널은 에이전트 루프를 돌리지 않고 workspaceRpc('sendMessage')만 보낸다. 서비스워커는 권한 면만 담당하고 세션 상태를 들지 않는다(곧 죽을 수 있으니). 3. 에이전트 루프. 실제 런타임은 offscreen 문서의 SessionWorkspaceService 안에 산다. IndexedDB + OPFS 세션 저장소 위에서 AI SDK의 ToolLoopAgent가 돈다. 4. 도구 호출. action(라이브 스냅샷 후 그 세대 ref+rev로 변형), sheet·doc·web(Univer 표·문서·사이트 캔버스), inspect·acquire·clarify, 그리고 run. 5. 샌드박스 실행. run은 QuickJS 게스트 JS를 manifest sandbox에서 돌린다. 게스트는 chrome.*에 손대지 못하고 오직 sys ABI(tabs·eval·fetch·cdp·download·screenshot)를 서비스워커로 RPC해서 브라우저를 만진다. 6. 산출물. 게스트 FS는 /context(읽기전용)·/artifacts(영속)·/scratch(이번 턴). sys.fetch({as:'page'})가 로그인 쿠키를 태워 받은 데이터를 saveTo로 파일에 바로 쓰고, 모델은 샘플·스키마만 읽는다.
설계 특징: 캔버스 쓰기는 expectedRevision을 실어 호스트가 동기 검증 후에만 반영, OPFS 파일 교체는 신경로 기록 후 메타데이터 트랜잭션 성공 뒤에야 구파일 회수. 정지·타임아웃 시 파견된 부작용은 '결과 불명'으로 남긴다.
실제로 되는 것과 안 되는 것
되는 것: 회귀 테스트(tests/runtime-regression.test.mjs, node --test)와 실제 Chromium 스모크(tests/browser-smoke.cjs). 스모크는 IDB/OPFS 재개, QuickJS·샌드박스 오류 왕복, run→파일→artifact 등록, offscreen 아닌 sys 요청 거절, 본문 타임아웃, RPC 버전 충돌 거절을 검증(유료 모델 미호출).
안 되는 것·경계: CI 워크플로우 0개. 문서 스스로 크래시 간 자동 복구·네이티브 OS 제어·고신뢰 오피스 왕복은 아직 아니라고 적음. 크롬 135+ 필요, 138+는 'Allow User Scripts' 수동 허용 필요, F12 열린 탭은 CDP_BUSY, chrome://·웹스토어는 NEED_PAGE.
우리 적용점
- 실행 계약. 사용자 턴을 임대(lease)로 잡고 스크래치를 묶어 크래시 시 무효화 → Tefo·Triforge 에이전트 실행 단위를 상태로 다룰 때 참고.
- 정지·타임아웃 정직성. 부작용을 '되돌렸다' 거짓 보고 안 하고 결과 불명으로 → coxpit-oss 원격 stop·명령 감사에서 값어치.
- 샌드박스 경계. 게스트가
chrome.* 못 만지고 좁은 sys ABI만 RPC → coxpit-oss 셸 노출 경계 설계 참고. - 데이터는 파일로. 대용량을 모델 컨텍스트 아닌 파일로(saveTo) → -ing 스튜디오·Keeping 산출물 파이프라인 컨텍스트 비용 절감.
- 낙관적 동시성. expectedRevision + 커밋 성공 후 회수 → Keeping 버전 이어붙임, Featuring·Sliding 캔버스 저장의 손실 없는 저장 계약 비교.
가져오지 말 것
- 권한 모델. manifest가
debugger·userScripts·scripting·downloads·webNavigation + <all_urls> 통째 요구. 위험 표면이 극단적으로 넓다. 그대로 옮기면 안 된다. - 임의 게스트 eval.
run 안 임의 JS·sys.eval은 owner 단독 로컬 전제 위에서만 성립. 다중 사용자·공개 노출로 가져오면 격리 붕괴. - 구조 부채. src/extension 트리 중복·14k줄 단일 파일은 흉내 대상 아님.
- 성숙도 착시. 스타 2,591을 안정성·채택 신호로 읽지 말 것. 열흘·13커밋·실저자 1명·CI 0개가 실측.
실측 정보
- HEAD 커밋
- eaffacb (2026-09-10) · shallow clone 기준
- 무엇
- 크롬 웹스토어에 안 올리는 MV3 언팩 확장. 이미 로그인된 브라우저 자체를 프로그래머블 계층으로 보고, 사이드패널 에이전트가 페이지를 조종해 시트·문서·사이트 산출물을 만든다. 서버 없음 · BYOK
- 규모 / 실측
- 377파일 · 165,315줄이지만 src/(개발)·extension/(릴리스)가 거의 같은 트리 중복이라 실효는 절반 · src/sidepanel.js 한 파일이 14,491줄 · 테스트 2 · CI 0 · js 139,936
- 활발 / 유지
- 전체 이력 2026-09-01~09-10 열흘 · 커밋 13 · 저자 2 중 1은 github-actions 봇(실인간 사실상 1명) · 릴리스 5태그
- ⚠️ 스타 진위
- 커밋 13·나이 열흘인데 스타 2,591 · 스타 대 커밋/나이 비율이 유기적 성장보다 홍보성 유입에 가까움 · CI 0·단일 거대 파일 등 미성숙 신호 뚜렷
- 라이선스
- MIT
적용점
- 이럴 때 유용에이전트가 이미 로그인된 브라우저를 조종하게 만드는 설계를 배우려는 사람. '브라우저를 프로그래머블 컴퓨터로 본다'는 관점과 낙관적 동시성·결과 불명 상태 정직성·데이터는 파일로 나른다 같은 런타임 계약이 코드에 실제로 박혀 있다.
- 이럴 땐 부적합도입할 라이브러리를 찾는다면 아니다. 이력 열흘·실인간 1명·CI 0·트리 중복 등 미성숙 신호가 뚜렷하고, 스타 수가 성숙도를 뜻하지 않는다. 안정적으로 의존할 물건이 아니다.
- 먼저 볼 것값은 제품이 아니라 에이전트 런타임 설계다. 안전 경계와 실행 계약(무엇을 언제 하게 하나, 결과가 불명일 때 어떻게 정직하게 남기나). 우리 에이전트 제품(Tefo·coxpit)의 경계 설계를 배우러 가는 리포지, 붙일 코드가 아니다.
◈ 참고용리포 전체 이력이 열흘 남짓(커밋 13회)인데 스타가 2,591개다. 실인간 저자 1명, CI 0개, 14k줄 단일 파일, src/extension 트리 중복 같은 미성숙 신호가 뚜렷하다. 그럼에도 참고 가치가 높은 이유는 '브라우저를 프로그래머블 컴퓨터로 본다'는 관점과, 낙관적 동시성·결과 불명 상태 정직성·데이터는 파일로 나른다 같은 에이전트 런타임 설계가 코드에 실제로 박혀 있기 때문이다. 도입할 라이브러리가 아니라 우리 에이전트 제품의 안전 경계와 실행 계약을 배우러 가는 리포다.
원문 README
아래는 Player-YN/PawWork_ZhuaZhua 저장소의 README 원문입니다(GitHub 렌더, 수집 시점 기준). 저작권은 원 프로젝트에 있으며 원 저장소의 라이선스를 따릅니다. GitHub에서 보기
README 전문 펼치기

Treat the already-logged-in Chrome as a programmable computer. 爪爪 is the agent on that machine.
爪爪 · 完全解放版 (PawWork_ZhuaZhua) is a Chrome MV3 unpacked extension. It runs a side-panel agent that can drive the current tab (action), execute guest JS against the browser (sys inside run), and keep sheet / Univer doc / site HTML artifacts in the session.
Not on the Chrome Web Store. No hosted model — bring your own key.
- Clone this repo, or download a Release zip
- Chrome →
chrome://extensions → Developer mode → Load unpacked → select the folder (manifest.json is at its root)
- Open the side panel → paste an OpenAI-compatible API key (BYOK; stored in
chrome.storage.local) → send a task on a normal http(s) page
After editing files, click 重新加载 on the extension card. There is no package.json and no build step.
Needs Chrome 135+. On Chrome 138+, enable Allow User Scripts on the extension details page if you want sys.eval or page-identity fetch. Close DevTools on the target tab before using sys.cdp (otherwise CDP_BUSY). Restricted pages such as chrome:// and the Web Store return NEED_PAGE.
node --test tests/runtime-regression.test.mjs # pure Node, no browser
node tests/browser-smoke.cjs <path-to-playwright> # loads the real extension
Side panel → service worker → offscreen SessionWorkspaceService → AI SDK ToolLoopAgent. Process layering, domain objects, tool contracts, and the unimplemented boundaries are documented in AGENTS.md and the nested AGENTS.md files under src/.
Release packaging: python scripts/pack_extension.py --zip dist/pawwork.zip.
MIT. Third-party components: THIRD_PARTY_NOTICES.md.
판정에 대한 반론, 도입 경험, 정정 제보를 환영합니다. GitHub 계정으로 참여합니다.