๐ฆพ AgentiLoop Agent!
September 21, 2026 ยท View on GitHub
แแ ฉแฏแแ ตแจแแ ต แแ กแฏแแ ณแทแแ ณแ แ ตแแ งแซ: แแ ฅแแ ณแซ แแ ฅ แแ ตแแ กแผ Cursorแแ ก Claude Codeแ แ ณแฏ แแ กแแ ญแผแแ กแแ ต แแ กแญแแ ณแธแแ ตแแ ก. AgentiLoopแแ ด Agent!แแ ณแซ แแ ณ แแ ฉแแ ตแผ แแ ฉแแ ฎแแ ณแฏแแ ณแฏ แแ ขแแ ฆแแ ขแปแแ ณแฏ แแ ฎแซแแ กแซ แแ กแแ ตแ แ ก, แแ ตแแ ฆแแ ตแฏ แแ กแแ ฉแผแแ ช, แแ ฉแแ ณแแ ณแแ ฐแแ ฅ แแ ขแแ ฉ, 12แแ ข แแ ตแแ กแผแแ ด แแ ฅแทแแ ขแจ แแ ฆแซแแ ตแซแแ ณแฏ แแ ชแฏแแ ญแผแแ กแซ Safari แแ ฐแธ แแ ฅแทแแ ขแจ, แแ ณแ แ ตแแ ฉ แแ ณแแ ณแ แ ฉ แแ ฅแธแแ ฆแแ ตแแ ณแแ ฌแแ ณแซ แแ ฐแธแแ กแแ ตแแ ณ แแ ฎแแ ฎแจแแ ฆแแ ฉ แแ กแแ ญแผแแ กแแ ฉ แแ ตแปแแ ณแธแแ ตแแ ก. Agent!แแ ณแซ macOS 26 แแ ตแพ 27แแ ณแฏ แแ ฑแแ กแซ แแ กแแ กแผ แแ กแผแ แ งแจแแ กแซ แแ ฆแแ ตแแ ฅแซแแ ตแจ AI แแ ฉแแ ฎแแ ก แแ ฌแแ ฅแปแแ ณแธแแ ตแแ ก.
Mac ๋ฐ์คํฌํฑ์ ์ํ ์์ด์ ํฑ AI
Agent!๊ฐ ์์ฌ์ด ์ฌ์ฉ์ผ๋ก Photo Booth๋ฅผ ์กฐ์ โ ํด๋ฆญ๋, ์คํฌ๋ฆฝํธ๋ ์์ด ๊ทธ์ "์ฌ์ง ์ฐ์ด์ค".
README ๋ฒ์ญ
Agent ์์ ์ฒด์ค
Agent!๋?
ํ๋์ ์ฑ. ์ด๋ค AI๋ . Mac์ ๋ํ ์์ ํ ํต์ .
Agent!๋ 100% ๋ค์ดํฐ๋ธ Swift 6.2 / SwiftUI ์ฑ์ผ๋ก, 21๊ฐ LLM ์ ๊ณต์ โ Claude, Codex, OpenAI, Gemini, Grok, Mistral, Mistral Vibe, DeepSeek, Hugging Face, Z.ai, BigModel, Alibaba DashScope, Qwen, Qwen Code, MiniMax, OpenRouter, Requesty, A2Agent, OrcaRouter, Ollama(ํด๋ผ์ฐ๋ ๋ฐ ๋ก์ปฌ), vLLM, LM Studio โ ์ ์จ๋๋ฐ์ด์ค Apple Intelligence๊น์ง ๋ํด, ์ค์ ๋ก ์ผ์ ํด๋ด๋ ์์จ ์์ ๋ฃจํ๋ก ์ฐ๊ฒฐํฉ๋๋ค: ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ฝ๊ณ , ๋ฒ๊ทธ๋ฅผ ๊ณ ์น๊ณ , Xcode ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๊ณ , diff๋ฅผ ์ปค๋ฐํ๊ณ , ์์ฌ์ด ์ฌ์ฉ API๋ก ๋ชจ๋ Mac ์ฑ์ ์กฐ์ํ๊ณ , ์ฌ์ฉ์ ๋๋ root ๊ถํ์ผ๋ก ์ ธ ๋ช ๋ น์ ์คํํ๊ณ , iMessage๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ด๊ณ , ์์ฑ "Agent!" ํธ์ถ์ ์๋ตํฉ๋๋ค.
NPM๋, Electron๋, ๊ตฌ๋ ๋, ํ ๋ ๋ฉํธ๋ฆฌ๋ ์์ต๋๋ค. ์ง์ API ํค๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋, ์์ ํ ๋ก์ปฌ๋ก ์คํํ๊ฑฐ๋, Apple Intelligence๋ก ๋ฌด๋ฃ๋ก ์คํํ์ธ์. ์์กดํ๋ ๋ชจ๋ Swift ํจํค์ง๋ ๊ฐ์ ์ ์๊ฐ ์์ฑํ์ต๋๋ค. ์๋ ๋นํ์ธ๋ ์คํ ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์๋ก์ด ์์ ๐
v1.1.x โ The Hardened Harness Release ยท ๋ฆด๋ฆฌ์ค โ
- ์ปจํ
์คํธ ์์ถ, ์ฌ๊ตฌ์ถ. ์๊ณ๊ฐ = ๋ชจ๋ธ ์๋์ฐ โ ์์ฝ ์ถ๋ ฅ โ ๋ฒํผ, ์ค์
input_tokens๊ธฐ๋ฐ. ์ ๊ณต์ ์ธก 9์น์ LLM ์์ฝ์ด ์จ๋๋ฐ์ด์ค 4K ์์ฝ์ ๋์ฒด; ์ด๋ฆฐ ๋ชฉํ, ๊ณํ ์ฒดํฌ๋ฆฌ์คํธ, ํธ์ง๋ ํ์ผ์ ๋งค ์์ถ ํ ๋ค์ ์ฒจ๋ถ๋ฉ๋๋ค. ๊ณผ๋ํ๊ฒ ํฐ ๋๊ตฌ ๊ฒฐ๊ณผ๋ ๋ฐ์ ์ ๋์คํฌ๋ก ๋๊ธฐ๊ณrestore_tool_result๋ก ๋ณต๊ตฌํ ์ ์์ต๋๋ค. 413 ์ค๋ฒํ๋ก๋ ๊ฐ์ ์์ถ๊ณผ ๋ ์งง์ ์ฌ์๋๋ก ์ฒ๋ฆฌ;max_tokens์ด๊ณผ๋ ํ๋ ํ ๊ณ์ํ๋ ๋ฐฉ์์ผ๋ก ๋ณต๊ตฌ๋ฉ๋๋ค. - ํธ์ง ์ ์ฝ๊ธฐ ๊ฒ์ดํธ.
edit_file/apply_diff/diff_apply๋ ์ด ์์ ์์ LLM์ด ์ฝ์ง ์์๊ฑฐ๋ ๋ง์ง๋ง ์ฝ๊ธฐ ์ดํ ๋์คํฌ์์ ๋ณ๊ฒฝ๋(SHA-256) ํ์ผ์ ๊ฑด๋๋ฆฌ์ง ์์ต๋๋ค. ๊ฑฐ๋ถ ์ ํ์ผ์ ์๋์ผ๋ก ์ฝ์ด ๋ค์ ํธ์ถ์ด ๋ฐ๋ก ํธ์ง์ด ๋๊ฒ ํฉ๋๋ค. ์ธ๋ถ ํ์ผ ๋ณ๊ฒฝ์ ๋งค ํด diff ์ค๋ํซ์ผ๋ก ํ์๋ฉ๋๋ค. - ๋ก์ปฌ ๋ชจ๋ธ์ ์ค์ ์ปจํ ์คํธ ์๋์ฐ. LM Studio, Ollama, vLLM์ด ๋ชจ๋ธ๋ณ ์ค์ ์ปจํ ์คํธ ๊ธธ์ด๋ฅผ ๋ณด๊ณ ํฉ๋๋ค โ ๋ ์ด์ ํ๋์ฝ๋ฉ๋ 32K ๊ฐ์ ์ด ์์ต๋๋ค.
- ๋ ๋น ๋ฅธ ํด. ์ฝ๊ธฐ ์ ์ฉ ๋๊ตฌ๋ Claude ์๋ต์ด ์คํธ๋ฆฌ๋ฐ๋๋ ๋์ ์์; ์
๋ ฅ ์ธ์ ์
ธ ๋์์ฑ; 429/529์
Retry-After๋ฅผ ๋ฐ์ํ ์งํฐ ์ง์ ์ฌ์๋; ๋ชจ๋ ์ ๊ณต์์์ ์คํธ๋ฆผ ์ค SSE ์ค๋ฅ ํ์. - ์ฌ์ธต ๋ฐฉ์ด.
ShellSafetyService๊ฐ ์ด์ ํด๋ผ์ด์ธํธ ์ธก๋ฟ ์๋๋ผ ๋ฐ๋ชฌ ์ธก(AgentHelper + AgentUser)์์๋ ์ ์ฉ; ๋ฆด๋ฆฌ์ค ๋น๋๋ ํ ์๋ XPC ํด๋ผ์ด์ธํธ๋ฅผ ๊ฑฐ๋ถ; ๋ XPC ๋ฆฌ์ค๋ ๋ชจ๋ ์ฑ ์์ฒด ์๋ช ์์ ํ์๋ ๋์ผ ํ ์ฝ๋ ์๋ช ์ ์๊ตฌํฉ๋๋ค. - ํ๋ ๋ก๊ทธ. ๋ ์ด์ 50K ์๋ฆผ์ด๋ 500K ์ฌ์์ ํธ๋ฆผ์ด ์์ต๋๋ค โ ํฐ ๋ก๊ทธ๋ "Processing tab dataโฆ" ์ค๋ฒ๋ ์ด์ ํจ๊ป ๋ฉ์ธ ์ค๋ ๋ ๋ฐ์์ ๋ ๋๋ง; ์ ํ์ "Activity Log Below HUD" ๋ ์ด์์.
- ์ฑ ๋ฉ๋ด: ์ ๋ฐ์ดํธ ํ์ธโฆ(GitHub ๋ฆด๋ฆฌ์ค), ์น์ฌ์ดํธ, GitHub. ๋ชจ๋ PR์ CI Build & Test ์ํฌํ๋ก; 273๊ฐ ํ ์คํธ ํต๊ณผ.
- ์ถ๊ฐ: ์ฆ๊ฑฐ๋ก ๊ฒ์ฆ๋๋ ๊ธฐ์ค์ ๊ฐ์ง
goal_state, ์๋ฃ ์ ์ ํ์ ํฌ๋ฆฌํฑ diff ๋ฆฌ๋ทฐ, ์์ ๋ฒ์rewind_task, Claude ํ์ฅ ์ฌ๊ณ ,reasoning_effort์ ๋ฌ, ์์ด์ ํธ๋ณ ๋ชจ๋ธ ์ค๋ฒ๋ผ์ด๋๊ฐ ๊ฐ๋ฅํ ์๋ธ ์์ด์ ํธ(๋์ 3๊ฐ, ์ฝ๊ธฐ ์ ์ฉ 6๊ฐ), ๋ณต๊ตฌ ํํธ๊ฐ ์๋ ํ์ ๋๊ตฌ ์ค๋ฅ, ์ด๋ฒคํธ ํ .
๋น ๋ฅธ ์์ (๋ค์ด๋ก๋)
- Agent!๋ฅผ ๋ค์ด๋ก๋ํ์ฌ ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก ๋๋๊ทธ โ ๋๋ Homebrew๋ก:
brew update && brew install --cask agentiloop-agent - Agent!๋ฅผ ์ด๊ธฐ โ ๋ชจ๋ ๊ฒ์ด ์๋์ผ๋ก ์ค์ ๋ฉ๋๋ค
- AI ์ ํ โ ์ค์ โ ์ ๊ณต์ ์ ํ โ API ํค ์ ๋ ฅ
โ ์์ค์์ ์ปดํ์ผํ ํ์๊ฐ ์ ํ ์์ต๋๋ค. ๋ชจ๋ ๋ฆด๋ฆฌ์ค์ ๋ชจ๋ ํ๋ฆฌ๋ฆด๋ฆฌ์ค์๋ CI๊ฐ ๋น๋ํ๊ณ AgentiLoop Team ID๋ก Apple์ด ์๋ช , ๊ณต์ฆ(notarize), ์คํ ์ดํ(staple)ํ ์ฌ์ ์ปดํ์ผ Mac ๋ฐ์ด๋๋ฆฌ(
.dmg+.zip)๊ฐ ํจ๊ป ์ ๊ณต๋ฉ๋๋ค. ๊ณต์ ๋ฐ์ด๋๋ฆฌ๋ ์ค์ Developer ID๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ Launch Agent์ Launch Daemon์ด ํญ์ ๋ฑ๋ก๋๋ฉฐ ์ ๋ "์ฌ๋ผ์ง์ง" ์์ต๋๋ค โ ๊ทธ๋ฐ ์ผ์ ad-hoc ์๋ช ๋ ์์ค ๋น๋์์๋ง ๋ฐ์ํฉ๋๋ค(์๋ ์ต์ B ์ฐธ๊ณ ). ํฌํผ๊ฐ ์ฌ๋ผ์ก๋ค๋ฉด ์ต์ ๋ฆด๋ฆฌ์ค ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ค์นํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๋น ๋ฅธ ์์ (์์ค์์ ๋น๋)
Agent! ์์ฒด๋ฅผ ์์ ํ๊ณ ์ถ์ ๋๋ง ํ์ํฉ๋๋ค. ๊ทธ ์ธ ๋ชจ๋ ๋ถ์ ์์ ์๋ช ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฌ์ฉํ์ธ์.
git clone https://github.com/AgentiLoop/agent.git
cd Agent
์ต์
A โ Xcode (Apple Developer ๊ณ์ ): Agent.xcodeproj๋ฅผ ์ด๊ณ , Development Team์ ์ค์ ํ๊ณ , Agent ํ๊ฒ์ Build & Runํ ๋ค, ํ๋กฌํํธ๊ฐ ๋จ๋ฉด ํฌํผ๋ฅผ ์น์ธํ์ธ์.
์ต์ B โ ๊ฐ๋ฐ์ ๊ณ์ ์์ (Xcode Command Line Tools๋ง):
./build.sh # Debug
./build.sh Release # Release
open "build/DerivedData/Build/Products/Debug/Agent!.app"
โ ๏ธ ์ต์ B ๋น๋๋ ad-hoc ์๋ช ์ ๋๋ค. Launch Agent/Daemon ํฌํผ๋ ๋ฑ๋ก๋์ง ์์ง๋ง(SMAppService์ Team ID ํ์), LLM ๋ฃจํ, ๋ชจ๋ ๋๊ตฌ, ์์ฌ์ด ์ฌ์ฉ, AppleScript, ์ ธ, MCP๋ ์ฌ์ ํ ๋์ํฉ๋๋ค. ๊ฐ๋ฐ์ ๊ณ์ ์์ด ํฌํผ๋ฅผ ์ํ์๋์? ์๋ช ยท๊ณต์ฆ๋ ๋ฆด๋ฆฌ์ค ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฌ์ฉํ์ธ์ โ ์ปดํ์ผ์ด ํ์ ์์ต๋๋ค.
๐ก ์ ๋ ดํ ์ค์ : Z.ai์ GLM-5.3(๊ฐ์ฅ ๋น ๋ฅธ ๊ฐ์ , ๊ธฐ๋ณธ ๋ชจ๋ธ)์ ๋ฐฑ๋ง ํ ํฐ๋น ๋ช ์ผํธ์ ๋๋ค. ๋ก์ปฌ ์คํ? GLM-4.7-Turbo(32B)๋ง ์๋น์์ฉ ํ๋์จ์ด(Ollama ๊ธฐ์ค 64โ128GB Apple Silicon)์ ๋ง์ต๋๋ค.
๋ฌธ์ ํด๊ฒฐ (์์ค์์ ๋น๋)
xcode-select๊ฐ Command Line Tools๋ฅผ ๊ฐ๋ฆฌํด โsudo xcode-select -s /Applications/Xcode.app/Contents/Developer- pull ํ ์ด์ํ
BUILD FAILEDโ ์ค๋๋ DerivedData:./build.sh clean && ./build.sh - ํฌํผ๊ฐ ๋ฑ๋ก๋์ง ์์ โ ์ต์ B์์๋ ์ ์; ์ต์ A๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์๋ช ๋ ๋ฆด๋ฆฌ์ค ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ค์นํ์ธ์ โ ๋ชจ๋ ๋ฆด๋ฆฌ์ค์ ํ๋ฆฌ๋ฆด๋ฆฌ์ค์ ํฌํจ๋ฉ๋๋ค
- Deployment target / SDK ์ค๋ฅ โ Agent!๋ macOS 26์ ๋์์ผ๋ก ํฉ๋๋ค; macOS์ Xcode๋ฅผ ์ ๋ฐ์ดํธํ์ธ์
- ๊ตฌ์ฑ ์ธ์๋ ๋์๋ฌธ์ ๊ตฌ๋ถ โ
./build.sh(Debug) ๋๋./build.sh Release
๋ฌด์์ ํ ์ ์๋์?
"Xcode ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๊ณ ์ค๋ฅ๋ฅผ ๋ชจ๋ ๊ณ ์ณ์ค" ยท "์์ ์ฑ์์ ๋ด Workout ํ๋ ์ด๋ฆฌ์คํธ ์ฌ์ํด์ค" ยท "Photo Booth๋ก ์ฌ์ง ์ฐ์ด์ค" ยท "์๋งํํ 6์์ ์ง์ ๊ฐ๋ค๊ณ iMessage ๋ณด๋ด์ค" ยท "Safari ์ด๊ณ ๋์ฟํ ํญ๊ณตํธ ๊ฒ์ํด์ค" ยท "์ด ํด๋์ค๋ฅผ ๋ ์์ ํ์ผ๋ก ๋ฆฌํฉํฐ๋งํด์ค" ยท "์ค๋ ์บ๋ฆฐ๋ ์ผ์ ์ด ๋ญ์ผ?"
์ํ๋ ๊ฒ์ ๊ทธ๋ฅ ์ ๋ ฅํ์ธ์. Agent!๊ฐ ๋ฐฉ๋ฒ์ ์ฐพ์ ์คํํฉ๋๋ค.
์ฃผ์ ๊ธฐ๋ฅ
- ๐ง ์์ฒด ๊ฒ์ฆ ์์
๋ฃจํ โ ์ถ๋ก ํ๊ณ , ์คํํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๊ด์ฐฐํ๊ณ , ์ค์ค๋ก ์์ ํฉ๋๋ค.
goal_state๊ธฐ์ค์ด ์ฆ๊ฑฐ์ ํจ๊ป ํ์๋๊ธฐ ์ ์๋ ์์ ์ด ์๋ฃ๋ฅผ ์ ์ธํ ์ ์์ผ๋ฉฐ, ์ ํ์ ํฌ๋ฆฌํฑ์ด ๋จผ์ diff๋ฅผ ๊ฒํ ํฉ๋๋ค. - ๐ ์์ด์ ํฑ ์ฝ๋ฉ โ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ฝ๊ณ , ๋ฌธ์์ด ์นํ diff๋ก ํธ์งํ๊ณ , Xcode ํ๋ก์ ํธ๋ฅผ ๋ค์ดํฐ๋ธ๋ก ๋น๋(ํด๋ฆญ ๊ฐ๋ฅํ ์ค๋ฅ)ํ๊ณ , git์ ๊ด๋ฆฌํ๊ณ , ์ ์ฅ์๋ฅผ ์ด์ ๊ฐ๋ฅํ JSONL ๋ฆฌํฌ ๋งต์ผ๋ก ์์ธํฉ๋๋ค. ๋ชจ๋ ํธ์ง์ ์ค๋
์ท๋ฉ๋๋ค โ ์ํด๋ฆญ ๋กค๋ฐฑ ๋๋ ์์
์ ์ฒด
rewind_task. - ๐ฅ ๋ฐ์คํฌํฑ ์๋ํ โ ์์ฌ์ด ์ฌ์ฉ API(AXorcist)๋ก ๋ชจ๋ Mac ์ฑ์ ์กฐ์, ํผ์ง ์๋ ์ฌ์๋๊ฐ ์๋ ์์ ๊ธฐ๋ฐ. ์ฌ๊ธฐ์ NSAppleScript, JXA, 51๊ฐ ScriptingBridge ์ฑ ๋ธ๋ฆฌ์ง โ ๋ชจ๋ TCC์ ํจ๊ป ์ธํ๋ก์ธ์ค.
- ๐ AgentScript โ ๋ฐํ์์ ์ปดํ์ผ๋์ด ์ ์ฒด TCC๋ก ์ธํ๋ก์ธ์ค
dlopen๋๋ Swift dylib. ์ญ์ ๋ ์คํฌ๋ฆฝํธ๋.Trash๋ก ์ด๋ํ๋ฉฐ ๋ณต์ ๊ฐ๋ฅํฉ๋๋ค. - ๐ก ๊ถํ ์๋ ์คํ โ Launch Agent๋ก ์ฌ์ฉ์ ๊ถํ ์ ธ, ๋๋ ๋ฑ ํ ๋ฒ ์น์ธํ๋ Launch Daemon์ผ๋ก root ์ ธ(SMAppService + XPC). SMAppService๊ฐ ์ด๋ฏธ ์๋ช ์์ด๋ดํฐํฐ๋ฅผ ๊ฐ์ ํ๋ ์ด์ ๋ docs/SECURITY.md๋ฅผ ์ฐธ๊ณ ํ์ธ์.
- ๐ ์์ฑ โ **"Agent!"**๋ผ๊ณ ๋งํ ๋ค ์์
์ ๋งํ์ธ์; ์จ๋๋ฐ์ด์ค
SFSpeechRecognizer, ~2.5์ด ๋ฌด์ ํ ์๋ ์คํ, ๋ฐ๋ณต. - ๐ฑ iMessage ์๊ฒฉ ์ ์ด โ iPhone์์
Agent! next song์ ๋ฌธ์๋ก ๋ณด๋ด์ธ์; ์น์ธ๋ ๋ฐ์ ์๋ง.chat.db๋ฅผ ์ํด ์ ์ฒด ๋์คํฌ ์ ๊ทผ ๊ถํ์ด ํ์ํฉ๋๋ค. - ๐ ์น โ ๋ด์ฅ Safari ์๋ํ(JavaScript + AppleScript); ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ ์ ํ์ Selenium๊ณผ Playwright MCP.
- ๐ค ์๋ธ ์์ด์ ํธ โ ๋ฉ์ผ๋ฐ์ค ๋ฉ์์ง๊ณผ ์์ด์ ํธ๋ณ ๋ชจ๋ธ ์ค๋ฒ๋ผ์ด๋๊ฐ ์๋ ์ต๋ 3๊ฐ ๋์(์ฝ๊ธฐ ์ ์ฉ 6๊ฐ) ๊ฒฉ๋ฆฌ ์์ด์ ํธ.
- ๐งฉ MCP โ ์ค์ โ MCP Servers์์ ์ด๋ค MCP ์๋ฒ๋ ์ถ๊ฐ; ๋๊ตฌ๋
mcp_<server>_<tool>๋ก ๋ํ๋ฉ๋๋ค. Xcode MCP:{"mcpServers":{"xcode":{"command":"xcrun","args":["mcpbridge"],"transport":"stdio"}}}. - ๐ ํญ, ๊ธฐ๋ก, ๋ฉ๋ชจ๋ฆฌ, ๊ณํ, ์คํฌ โ ๊ฐ ํญ์ ์์ฒด ํ๋ก์ ํธ ํด๋์ ๋ก๊ทธ๋ฅผ ๊ฐ์ง; ์๊ตฌ ์ฌ์ฉ์ ๋ฉ๋ชจ๋ฆฌ; ๋ชจ๋ ํ๋กฌํํธ์ ํ์๋๋ ๋ค์ค ๊ณํ ์ฒดํฌ๋ฆฌ์คํธ.
- ๐ ํด๋ฐฑ ์ฒด์ธ โ 429/ํ์์์/๋คํธ์ํฌ ์คํจ ์ ๋ค์ ๊ตฌ์ฑ๋ ์ ๊ณต์๋ก ์๋ ์ ํ.
๐ค 21๊ฐ AI ์ ๊ณต์
| ์ ๊ณต์ | ๋น์ฉ | ์ต์ ์ฉ๋ |
|---|---|---|
| A2Agent | ์ ๋ ด | ๊ณต์ ๊ฐ๊ฒฉ์ ์ผ๋ถ๋ก ํ๋์ OpenAI ํธํ ํค๋ฅผ ํตํด DeepSeek, GLM, Kimi, MiniMax, Qwen |
| Apple Intelligence | ๋ฌด๋ฃ, ์จ๋๋ฐ์ด์ค | ๋ถ๋ฅ, ์์ฝ, ํ ํฐ ์์ถ(๋๋ ์์ด์ฝ, ์ ๊ณต์ ์ ํ๊ธฐ์๋ ์์) |
| Claude | ํ ํฐ๋น(API ํค) ๋๋ ๊ตฌ๋ (OAuth) | ๊ธด ์์จ ์์ , ํ์ฅ ์ฌ๊ณ , ํ๋กฌํํธ ์บ์ฑ |
| Codex | ChatGPT ๊ตฌ๋ | ChatGPT OAuth๋ฅผ ํตํ OpenAI ๋ชจ๋ธ โ API ํค ์์, ํ ํฐ๋น ์๊ธ ์์ |
| DeepSeek | ์ ๋ ด | ์ ์์ฐ ์ฝ๋ฉ, ์บ์ ํํธ ๋ณด๊ณ |
| Google Gemini | ์ ๋ฃ(๋ฌด๋ฃ ํฐ์ด ์์) | ๊ธด ์ปจํ ์คํธ, ๋น์ |
| Grok (xAI) | ์ ๋ฃ | ์ค์๊ฐ ์ ๋ณด |
| Hugging Face | ๋ค์ | ์คํ ๋ชจ๋ธ, ์๋ฒ๋ฆฌ์ค ๋๋ ์ ์ฉ ์๋ํฌ์ธํธ |
| ๋ก์ปฌ Ollama / vLLM / LM Studio | ๋ฌด๋ฃ + ํ๋์จ์ด | ์์ ์คํ๋ผ์ธ; ๋ชจ๋ธ๋ณ ์ค์ ์ปจํ ์คํธ ์๋์ฐ ๊ฐ์ง |
| MiniMax | ์ ๋ ด | 1M ํ ํฐ ์ปจํ ์คํธ |
| Mistral / Mistral Vibe | ์ ๋ฃ | ์คํ ์จ์ดํธ ํด๋ผ์ฐ๋, ์ฝ๋, ์์ด์ ํธ ์ ํ |
| Ollama (ํด๋ผ์ฐ๋) | ๋ฌด๋ฃ ํฐ์ด | ํธ์คํ ๋ ์คํ ๋ชจ๋ธ |
| OpenAI | ์ ๋ฃ | ๋ฒ์ฉ, ๋๊ตฌ ํธ์ถ, ๋น์ , reasoning_effort |
| OpenRouter | ์ ๋ฃ | 200๊ฐ ์ด์ ๋ชจ๋ธ, ํ๋์ ํค; Claude๋ Anthropic ํ๋กํ ์ฝ๋ก ๋ผ์ฐํ |
| OrcaRouter | ์ ๋ฃ | ํ๋์ OpenAI ํธํ ํค๋ก ์ ๊ณต์ ์๊ฐ์ 190๊ฐ ์ด์ ๋ชจ๋ธ; auto/fusion/fallback ๋ผ์ฐํ |
| Alibaba DashScope (Model Studio / QwenCloud ์ข ๋์ ) | ์ ๋ ด | DashScope๋ฅผ ํตํ Qwen 3.8; Model Studio sk- ๋ฐ QwenCloud sk-ws- ํค |
| Qwen (qwen.ai Token Plan) | ๊ตฌ๋ | QwenCloud Token Plan(sk-sp- ํค, token-plan.*.maas.aliyuncs.com): qwen3.8-max, qwen3.7-plus, GLM-5.2, DeepSeek V4 |
| Qwen Code | ๊ตฌ๋ | Alibaba Coding Plan(sk-sp- ํค): qwen3-coder-plus, qwen3.7-plus, GLM-5, Kimi K2.5, MiniMax-M2.5 |
| Requesty | ์ ๋ฃ | ํ๋์ OpenAI ํธํ ํค๋ก 300๊ฐ ์ด์ ๋ชจ๋ธ; ๋ชจ๋ธ๋ณ ๊ฐ๊ฒฉ ๋ฐ ๊ธฐ๋ฅ ๋ฉํ๋ฐ์ดํฐ |
| Z.ai / BigModel | ์ ๋ ด | GLM-5.3 โ ์ถ์ฒ ์์์ |
๐ก ์์ฒด ํธ์คํ ์ ๊ณต์๋ API ์๊ธ ์ธก๋ฉด์์๋ง ๋ฌด๋ฃ์ ๋๋ค โ ์ธ ๋งํ 30B+ ๋ชจ๋ธ์๋ M2/M3/M4 Ultra Mac Studio(64โ128GB)๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฐ ํ๋์จ์ด๊ฐ ์๋ค๋ฉด ์์ ์ ๋ ดํ ํด๋ผ์ฐ๋ ๊ฒฝ๋ก๊ฐ ํจ์ฌ ๋ ์ ๋ ดํฉ๋๋ค.
๋๊ตฌ
์ ์ ์ด๋ฆ์ AgentTools.Name.*์์ ์ต๋๋ค(์๋ณธ: AgentTools ํจํค์ง). ์ ๊ณต์๋ณ ํ ๊ธ๋ก ๊ฐ๋ณ ๋๊ตฌ๋ฅผ ์จ๊ธธ ์ ์์ต๋๋ค.
| ๊ทธ๋ฃน | ๋๊ตฌ |
|---|---|
| Core | done ยท list_tools ยท search ยท web_search ยท fetch ยท chat ยท memory ยท plan ยท goal_state ยท restore_tool_result ยท directory ยท skill ยท ask_user ยท index |
| ์ฝ๋ / ๋น๋ | file (read/write/edit/diff_apply/undo/list/search/mkdir/โฆ) ยท git ยท xcode (build/run/analyze/snippet/code_review/add_file/bump_version/โฆ) ยท agent_script |
| ์ ธ | user_shell (Launch Agent) ยท root_shell (Launch Daemon) ยท shell (์ธํ๋ก์ธ์ค ํด๋ฐฑ) ยท batch ยท multi |
| macOS ์๋ํ | accessibility (25๊ฐ ์์ ๊ธฐ๋ฐ ์ก์
) ยท applescript (lookup_sdef ํฌํจ) ยท javascript (JXA) |
| ์น | safari ยท selenium ยท mcp_playwright_browser_* (์ ํ) |
| ์๋ธ ์์ด์ ํธ | spawn_agent ยท tell_agent |
์ก์ ๋ณ ์ ์ฒด ์ฐธ์กฐ: docs/TECHNICAL.md.
AgentScript โ ์ ์ฒด TCC๋ฅผ ๊ฐ์ง Swift ์คํฌ๋ฆฝํธ
AgentScript๋ ~/Documents/AgentScript/agents/Sources/Scripts/์ ์๋ ํ๋ฒํ Swift ํ์ผ์
๋๋ค. Agent!๋ ๊ฐ๊ฐ์ SwiftPM์ผ๋ก .dylib๋ก ์ปดํ์ผํ ๋ค(Package.swift๋ ๋ชจ๋ ์คํฌ๋ฆฝํธ์ 51๊ฐ ScriptingBridge ์ฑ ๋ธ๋ฆฌ์ง๋ฅผ ๋์ด), Agent! ์์ฒด์ TCC ๊ถํ โ ์์ฌ์ด ์ฌ์ฉ, ์๋ํ, ์บ๋ฆฐ๋, ์ฐ๋ฝ์ฒ, Mail, ์ฌ์ง ๋ฑ โ ์ผ๋ก dlopenํฉ๋๋ค. LLM์ agent_script(create / edit / run / delete / restore / pull)๋ก ๊ด๋ฆฌํ๋ฉฐ, ํด๋์ ~35๊ฐ ์์ ๊ฐ ํฌํจ๋ฉ๋๋ค(Hello, TodayEvents, NowPlaying, CheckMail, CreateDmg, ArchiveXcode, โฆ).
์ง์
์ โ ์ต์์ ์ฝ๋ ์์, exit() ์์; stdout์ LLM์ ๋ฐํ๋๊ณ , ๋ฐํ๊ฐ์ ์ข
๋ฃ ์ํ์
๋๋ค:
import Foundation
import CalendarBridge // ์ด๋ค `import XBridge`๋ ์๋ ์ฐ๊ฒฐ โ Package.swift ํธ์ง ๋ถํ์
@_cdecl("script_main")
public func scriptMain() -> Int32 {
print("Hello from AgentScript! ๐")
return 0
}
ํ๊ฒฝ ๋ณ์ โ ์ด๋ป๊ฒ ์ค์ ๋๋๊ฐ. LLM์ ํ๊ฒฝ์ ์ง์ ๊ฑด๋๋ฆฌ์ง ์์ต๋๋ค. ๋๊ตฌ๋ฅผ ํธ์ถํ๋ฉด Agent!์ ScriptService๊ฐ ๋ณ์๋ฅผ ์คํฌ๋ฆฝํธ ํ๋ก์ธ์ค๋ก ๋ด๋ณด๋
๋๋ค(ScriptService+Execution.swift์ env["AGENT_PROJECT_FOLDER"] = cwd, env["AGENT_SCRIPT_ARGS"] = arguments; ์ธํ๋ก์ธ์ค ๋ณํ์ setenv(...)). ๊ฐ์ ๋ ๋ณ์๊ฐ ๋ชจ๋ user_shell / root_shell / shell ๋ช
๋ น์๋ ๋ด๋ณด๋ด์ง๋๋ค.
LLM ๋๊ตฌ ํธ์ถ Agent!๊ฐ ์คํฌ๋ฆฝํธ์ ๋ด๋ณด๋ด๋ ๊ฒ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
agent_script(action:"run", name:"TodayEvents") AGENT_PROJECT_FOLDER=/Users/you/Documents/GitHub/Agent
(AGENT_SCRIPT_ARGS๋ ์ค์ ๋์ง ์์)
agent_script(action:"run", name:"TodayEvents", AGENT_PROJECT_FOLDER=/Users/you/Documents/GitHub/Agent
arguments:"days=3,location=false,json=true") AGENT_SCRIPT_ARGS="days=3,location=false,json=true"
| ๋ณ์ | ์ค์ ์์ | ์๋ฏธ |
|---|---|---|
AGENT_PROJECT_FOLDER | ํญ์ | ํ์ฑ ํญ์ ํ๋ก์ ํธ ํด๋(์์ผ๋ฉด $HOME). ๋ฌ๋์ cwd๋ ์ฌ๊ธฐ๋ก ์ค์ ๋ฉ๋๋ค. |
AGENT_SCRIPT_ARGS | LLM์ด arguments:"โฆ"๋ฅผ ์ ๋ฌํ ๋๋ง | LLM์ด ์ ๋ฌํ ๋ฌธ์์ด ๊ทธ๋๋ก. ๋ฒ๋ค ์์ ๋ key=value,key=value ๊ท์น์ ์ฌ์ฉํฉ๋๋ค. |
ํ๊ฒฝ ๋ณ์ โ ์ด๋ป๊ฒ ์ฝ๋๊ฐ. ์คํฌ๋ฆฝํธ ์์์ ๋ ๋ค ProcessInfo.processInfo.environment์์ ์ต๋๋ค. Hello.swift / TodayEvents.swift๊ฐ ์ฌ์ฉํ๋ ์ ํํ ํ์ฑ ํจํด์
๋๋ค:
import Foundation
@_cdecl("script_main")
public func scriptMain() -> Int32 {
let env = ProcessInfo.processInfo.environment
// 1. ํ๋ก์ ํธ ํด๋ โ ํญ์ ์กด์ฌ; ๋ง์ฝ์ ์ํด cwd๋ก ํด๋ฐฑ
let folder = env["AGENT_PROJECT_FOLDER"] ?? FileManager.default.currentDirectoryPath
// 2. ์ธ์ โ LLM์ด `arguments:"โฆ"`๋ฅผ ์ ๋ฌํ์ง ์์ผ๋ฉด ์์
let argsString = env["AGENT_SCRIPT_ARGS"] ?? ""
// 3. ๊ธฐ๋ณธ๊ฐ, ๊ทธ๋ค์ "key=value,key=value" ํ์ฑ
var daysAhead = 0
var showLocation = true
var outputJSON = false
for pair in argsString.split(separator: ",") {
let parts = pair.split(separator: "=", maxSplits: 1).map { \$0.trimmingCharacters(in: .whitespaces) }
guard parts.count == 2 else { continue }
switch parts[0] {
case "days": daysAhead = Int(parts[1]) ?? 0
case "location": showLocation = parts[1].lowercased() == "true"
case "json": outputJSON = parts[1].lowercased() == "true"
default: break
}
}
print("Project folder: \(folder)")
print("days=\(daysAhead) location=\(showLocation) json=\(outputJSON)")
return 0
}
๋ ๋ณ์๋ ๋
๋ฆฝ์ ์
๋๋ค โ ์ ๋ AGENT_SCRIPT_ARGS์์ ํ๋ก์ ํธ ํด๋๋ฅผ ํ์ฑํ์ง ๋ง์ธ์. user_shell ์์ Bash ๋ฑ๊ฐ: ls "$AGENT_PROJECT_FOLDER/Sources"(cwd๊ฐ ์ด๋ฏธ ๊ฑฐ๊ธฐ์ด๋ฏ๋ก cd ๋ถํ์).
๋ฒ๋ค ์คํฌ๋ฆฝํธ์ ์ค์ AGENT_SCRIPT_ARGS ๊ท์น(~/Documents/AgentScript/agents/Sources/Scripts/):
| ์คํฌ๋ฆฝํธ | LLM์ด ์ ๋ฌํ๋ arguments: | ์คํ์ผ |
|---|---|---|
TodayEvents | days=3,location=false,json=true | key=value,โฆ |
CheckMail | unreadOnly=true,inboxCount=true,json=true | key=value,โฆ |
ListReminders | completed=false,limit=5 | key=value,โฆ |
QuitApps | excluded=Xcode,Agent,Terminal | ๋ชฉ๋ก์ด ์๋ key=value |
NowPlaying | json=true,artwork=true | key=value,โฆ |
ArchiveXcode | /path/to/Project.xcodeproj MyScheme 469UCUB275 | ์์น ๊ธฐ๋ฐ, ๊ณต๋ฐฑ ๊ตฌ๋ถ(scheme/teamID ์๋ต ์ ์๋ ๊ฐ์ง) |
CreateDmg | --app /path/to/App.app --output /path/out.dmg --name "My App" --compress | ํ๋๊ทธ ์คํ์ผ, ๊ณต๋ฐฑ ๊ตฌ๋ถ, ๋ฐ์ดํ ์กด์ค |
JSON ์
๋ ฅ / ์ถ๋ ฅ โ ํ๊ฒฝ ๋ณ์์ ๋ณ๊ฐ์ ๋ฉ์ปค๋์ฆ. ํ๊ฒฝ ๋ณ์๋ Agent!๊ฐ ํ๋ก์ธ์ค๋ก ๋ด๋ณด๋ด๊ณ , JSON ํ์ผ์ ์คํฌ๋ฆฝํธ ์์ฒด๊ฐ FileManager / JSONSerialization์ผ๋ก ์ฝ๊ณ ์ฐ๋ ๋์คํฌ์ ํ๋ฒํ ํ์ผ์
๋๋ค. Agent!๋ ์ด๋ฅผ ๋ง๋ค๊ฑฐ๋, ์ ๋ฌํ๊ฑฐ๋, ํ์ฑํ์ง ์์ต๋๋ค. ๋ฒ๋ค ์คํฌ๋ฆฝํธ์ ๋ ๊ฐ์ง ์ค์ ํจํด:
1. JSON ์ ์ฉ ์
๋ ฅ(SendMessage) โ env ์ธ์ ์ ํ ์์; ์คํฌ๋ฆฝํธ๋ SendMessage_input.json์ ์๊ตฌํ๊ณ ์์ผ๋ฉด 1์ ๋ฐํ:
// ~/Documents/AgentScript/json/SendMessage_input.json (์คํ ์ LLM์ด file(action:"write")๋ก ์์ฑ)
{ "recipient": "Mom", "message": "Home at 6", "imagePath": "~/Pictures/Photos Library.photoslibrary/originals/A/IMG_0001.jpeg" }
// ~/Documents/AgentScript/json/SendMessage_output.json (์คํฌ๋ฆฝํธ๊ฐ ์์ฑ)
{ "success": true, "timestamp": "2026-09-03T21:14:02Z", "recipient": "Mom", "message": "Home at 6" }
// ์คํจ ์: { "success": false, "timestamp": "โฆ", "error": "Missing required field: recipient" }
// SendMessage.swift โ ์คํฌ๋ฆฝํธ๊ฐ ์ฝ๋ ๋ฐฉ๋ฒ
let inputPath = "\(NSHomeDirectory())/Documents/AgentScript/json/SendMessage_input.json"
guard let inputData = FileManager.default.contents(atPath: inputPath) else {
writeOutput(outputPath, success: false, error: "Input file not found: \(inputPath)"); return 1
}
guard let json = try? JSONSerialization.jsonObject(with: inputData) as? [String: Any],
let recipientHandle = json["recipient"] as? String else { /* โฆ */ return 1 }
let message = json["message"] as? String
let imagePath = json["imagePath"] as? String
2. ์ต์
์ env ์ธ์, ๊ตฌ์กฐํ๋ ์ถ๋ ฅ์ JSON(TodayEvents, NowPlaying, CheckMail, ListReminders) โ ์ต์
์ AGENT_SCRIPT_ARGS(๋๋ ์ ํ์ <Name>_input.json)์์ ์ค๋ฉฐ, json=true์ด๋ฉด ์คํฌ๋ฆฝํธ๋ LLM์ ๋์๊ฐ๋ ์ฌ๋์ด ์ฝ์ ์ ์๋ stdout์ ๋ํด <Name>_output.json์ ์์ฑํฉ๋๋ค:
// agent_script(action:"run", name:"TodayEvents", arguments:"days=3,json=true")
// โ ~/Documents/AgentScript/json/TodayEvents_output.json
{ "success": true, "timestamp": "โฆ", "count": 2,
"events": [ { "summary": "Standup", "calendar": "Work", "startTime": "โฆ", "endTime": "โฆ", "allDay": false, "location": "โฆ" }, โฆ ] }
// agent_script(action:"run", name:"NowPlaying", arguments:"json=true,artwork=true")
// โ ~/Documents/AgentScript/json/NowPlaying_output.json
{ "success": true, "playerState": "playing",
"track": { "name": "โฆ", "artist": "โฆ", "album": "โฆ", "duration": 240 },
"artwork": { "saved": true, "path": "~/Documents/AgentScript/images/โฆ.png", "width": 500, "height": 500 } }
// TodayEvents.swift โ ์คํฌ๋ฆฝํธ๊ฐ ์ฐ๋ ๋ฐฉ๋ฒ
func writeTodayEventsOutput(_ path: String, success: Bool, error: String? = nil,
events: [[String: Any]]? = nil, count: Int? = nil, outputJSON: Bool) {
guard outputJSON else { return }
var result: [String: Any] = ["success": success, "timestamp": ISO8601DateFormatter().string(from: Date())]
if !success, let error { result["error"] = error }
if success { if let events { result["events"] = events }; if let count { result["count"] = count } }
try? FileManager.default.createDirectory(atPath: (path as NSString).deletingLastPathComponent, withIntermediateDirectories: true)
if let out = try? JSONSerialization.data(withJSONObject: result, options: .prettyPrinted) {
try? out.write(to: URL(fileURLWithPath: path))
}
}
์ญ์ ๋ ์คํฌ๋ฆฝํธ๋ ~/Documents/AgentScript/agents/.Trash/๋ก ์ด๋ํฉ๋๋ค(agent_script(action:"restore")); action:"pull"์ AgentScripts ์ ์ฅ์์์ ์
์คํธ๋ฆผ ๋ฒ์ ์ ๊ฐ์ ธ์ต๋๋ค.
๐ Jev โ ์ ธ ๋ช ๋ น ์ ๋ ๋ฒ์งธ ์๊ฒฌ
Jev(TypeSafe System One)๋ Agent!๊ฐ ์ ธ ๋ช ๋ น์ ์คํํ๊ธฐ ์ ์ ๊ฒํ ํ๋ ์ ํ์ ์์ฌ๊ฒฐ์ ๊ณ์ธต์ ๋๋ค. ์ ํํ LLM ์ ๊ณต์๋ฅผ ๋ณด์ํ ๋ฟ, ์ ๋ ๋์ฒดํ์ง ์์ต๋๋ค.
- ํ๋ ์ผ. ํ๋์ฝ๋ฉ๋
ShellSafetyService๊ท์น์ ์ด๋ฏธ ํต๊ณผํ ๋ชจ๋ ๋ช ๋ น์ด Jev๋ก ์ ์ก๋๋ฉฐ, Jev๋ ๋ฐ์ดํฐ๋ฅผ ๋น๊ฐ์ญ์ ์ผ๋ก ํ๊ดดํ ๊ฐ๋ฅ์ฑ์ ํ๊ฐํฉ๋๋ค. ์๊ณ๊ฐ ์ด์์ด๋ฉด ํ๊ฐ์ ๋ช ๋ น ํ ์คํธ์ ํจ๊ป ๊ฑฐ๋ถ๋๊ณ , ๋ฏธ๋ง์ด๋ฉด ์คํ๋ฉ๋๋ค. - ์ ์ฉ ๋ฒ์. ๋ชจ๋ ์
ธ ๊ฒฝ๋ก: ์ธํ๋ก์ธ์ค ์
ธ, ์ฌ์ฉ์ Launch Agent(
user_shell), ๊ถํ ์๋ Launch Daemon(root_shell). - ์กฐ์ ๊ฐ๋ฅํ ์ปท์คํ. ์ค์ โ LLM Common Settings โ Reject at โฆ % destructive, 0โ100%๋ฅผ 10% ๋จ์๋ก. ๊ธฐ๋ณธ๊ฐ 70%.
- ์ค๊ณ์ fail-open. API ํค ์์, Consult Jev before tools ํ ๊ธ ๊บผ์ง, ๋๋ TypeSafe ์ฅ์ ๋ "์๊ฒฌ ์์"์ ๋ปํฉ๋๋ค โ ๋ช ๋ น์ ์งํ๋๊ณ ์คํจ๋ ๋ก๊ทธ์ ๋จ์ผ๋ฉฐ, ์ ๋ ์กฐ์ฉํ ์์ ํ์ ์ผ๋ก ์ทจ๊ธ๋์ง ์์ต๋๋ค. Jev ๊ฒ์ฌ ์ค ์์ ์ ์ทจ์ํ๋ฉด ๋ช ๋ น์ด ์ค์ง๋ฉ๋๋ค.
- ๊ฐ์์ฑ. ๋ชจ๋ ๊ฒ์ฌ๋ ํ๊ดด ์ํ ๋ฐฑ๋ถ์จ, ํ์ฉ/๊ฑฐ๋ถ ํ์ , ์๋ต ๋ชจ๋ธ, ์ ๋ ฅ/์ถ๋ ฅ ํ ํฐ ์๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
- ๊ตฌ์ฑ. API ํค(ํค์ฒด์ธ ์ ์ฅ), ์นดํ๋ก๊ทธ ์๋ก๊ณ ์นจ์ด ์๋ ๋ชจ๋ธ ์ ํ๊ธฐ, ์ด๋๋ฐ์ด์ ํ ๊ธ ๋ชจ๋ LLM Common Settings์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ๋ฒ๋ค๋
TypeSafeKit/TypeSafeMiddlewareSwift ํจํค์ง์ ์์ต๋๋ค.
๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ฐ ์์
ํ์ผ, ํ๋ฉด ๋ด์ฉ, ๊ฐ์ธ ๋ฐ์ดํฐ๋ ์ ๋ Mac์ ๋ ๋์ง ์์ต๋๋ค โ ํด๋ผ์ฐ๋ ์ ๊ณต์๋ ํ๋กฌํํธ ํ ์คํธ๋ง ๋ณด๊ณ , ๋ก์ปฌ ์ ๊ณต์๋ ๋ชจ๋ ๊ฒ์ ์คํ๋ผ์ธ์ผ๋ก ์ ์งํฉ๋๋ค. ๋ชจ๋ ์ก์ ์ ๋ก๊ทธ์ ๊ธฐ๋ก๋ฉ๋๋ค.
| ๊ณ์ธต | ํ๋ ์ผ |
|---|---|
| Shell Safety Service | rm -rf /, rm -rf ~, ๋ฒ ์ด ๊ธ๋กญ rm -rf, --no-preserve-root๋ฅผ ํ๋ ์ฐจ๋จ โ ํด๋ผ์ด์ธํธ ์ธก ๋ฐ ๋ฐ๋ชฌ ์ธก์์ ์ ์ฉ. LLM์ด ์ฐํํ ์ ์์. |
| XPC ํด๋ผ์ด์ธํธ ์ ๋ขฐ | ๋ ๋ฆฌ์ค๋ ๋ชจ๋ ์ฑ ์์ฒด ์๋ช ์์ ํ์๋ ๋์ผ ํ ์ฝ๋ ์๋ช ์ ์๊ตฌ; ๋ฆด๋ฆฌ์ค ๋น๋๋ ํ ์๋ ํด๋ผ์ด์ธํธ๋ฅผ ๊ฑฐ๋ถ. |
| ํธ์ง ์ ์ฝ๊ธฐ ๊ฒ์ดํธ | ์ฝ์ง ์์๊ฑฐ๋ ์ธ๋ถ์์ ์์ ๋ ํ์ผ์ ํธ์ง์ ๊ฑฐ๋ถ(SHA-256), ๊ฑฐ๋ถ ์ ์๋ ์ฝ๊ธฐ. |
| ํ์ผ ๋ฐฑ์ + ๋๊ฐ๊ธฐ | ๋ชจ๋ ํธ์ง ์ค๋
์ท(1์ฃผ TTL); ๋กค๋ฐฑ UI, file(action:"undo"), ๋๋ ์์
๋ฒ์ rewind_task. |
| TCC ์ธํ๋ก์ธ์ค ๋ผ์ฐํ | AppleScript/JXA/screencapture/์์ฌ์ด ์ฌ์ฉ ๋ช ๋ น์ Agent!๊ฐ TCC ๊ถํ์ ๊ฐ์ง ์ธํ๋ก์ธ์ค์์ ์คํ๋๋ฉฐ, ์ ๋ ๋ฐ๋ชฌ์ ๊ฑฐ์น์ง ์์. |
| ๋๊ตฌ ์คํ ๊ฒ์ดํ | LLM์ ๊ฒฐ๊ณผ๋ฅผ ์ง์ด๋ผ ์ ์์ โ ๋ชจ๋ ํธ์ถ์ dispatchTool()์ ๊ฑฐ์ณ ์ค์ ์ถ๋ ฅ์ ๋ฐํ. ๋๊ตฌ ์๋ "ํด๋ฆญ/๊ฒ์ํ์ด์โฆ" ์ฃผ์ฅ์ ์ ์ ์ด ์ฃผ์
๋จ. |
| ํ์ ์ค๋ฅ + ๊ฐ๋ | ๋ชจ๋ ์คํจ ๋๊ตฌ ๊ฒฐ๊ณผ๋ ๋ณต๊ตฌ ํํธ๋ฅผ ํฌํจ; ๋ฐ๋ณต/์ ์ฒด ๊ฐ๋๊ฐ ๋์งํ ๋ค ์ค์ง; ์๋ฃ ๊ฒ์ดํธ๋ ์์ ๋น ๊ฑฐ๋ถ๋ฅผ 3ํ๋ก ์ ํ. |
| Console ๊ฐ์ฌ ์ถ์ | ๋ชจ๋ ๋๊ตฌ ํธ์ถ๊ณผ ๋ชจ๋ ํฌํผ ๋ช ๋ น์ด ๋ก๊ทธ์ ๊ธฐ๋ก๋จ. |
ํค๋ณด๋ ๋จ์ถํค ๋ฐ ์ฌ๋์ ๋ช ๋ น
| ๋จ์ถํค | ๋์ |
|---|---|
Return | ์์
์คํ ยท โ . / Esc ์ทจ์ |
โ T / โ W / โ 1โ9 / โ โง โโ | ์ ํญ / ๋ซ๊ธฐ / ์ ํ / ์ด์ -๋ค์ ํญ |
โ B / โ D | LLM Output ์ค๋ฒ๋ ์ด / ์ ฐ๋ธ๋ก ํ ๊ธ |
โ F / โ L / โ V | ๋ก๊ทธ ๊ฒ์ / ๋ก๊ทธ ์ง์ฐ๊ธฐ / ์ด๋ฏธ์ง ๋ถ์ฌ๋ฃ๊ธฐ |
โ / โ | ํ๋กฌํํธ ๊ธฐ๋ก |
โ โง M / โ โง P | ๋ฉ์์ง ๋ชจ๋ํฐ / ์ค์ |
โ โง K L H J U | ๋ชจ๋ ์ง์ฐ๊ธฐ / LLM ํจ๋ / ํ๋กฌํํธ ๊ธฐ๋ก / ์์ ๊ธฐ๋ก / ํ ํฐ ์นด์ดํฐ |
์ฌ๋์ ๋ช
๋ น์ ๋ก์ปฌ์์ ์คํ๋ฉ๋๋ค: /clear [log|all|llm|history|tasks|tokens], /memory [show|clear|edit|<text>].
FAQ
์ฝ๋ฉ์ ์์์ผ ํ๋์? ์๋์ โ ํ๋ฒํ ํ๊ตญ์ด(๋๋ ๋ชจ๊ตญ์ด)๋ฉด ๋ฉ๋๋ค. ๋น์ฉ์ ์ผ๋ง์ธ๊ฐ์? ์ฑ์ ๋น์์ ์ ยท๊ฐ์ธ ์ฉ๋๋ก ๋ฌด๋ฃ์ ๋๋ค(PolyForm Noncommercial 1.0.0). ์ ๊ณต์ ๋น์ฉ๋ง ์ง๋ถํ๋ฉด ๋ฉ๋๋ค; ์ง์งํ ์์ ์๋ Z.ai/BigModel์ GLM-5.3์ด๋ DeepSeek์ด ๊ฐ์ฅ ์ ๋ ดํฉ๋๋ค. ํ๋์จ์ด๊ฐ ์๋ค๋ฉด ๋ก์ปฌ ๋ชจ๋ธ์ ๋ฌด๋ฃ์ ๋๋ค. ์ด๋ค Mac์ด ํ์ํ๊ฐ์? Apple Silicon, macOS 26.4.1+. ํด๋ผ์ฐ๋ ์ ๊ณต์๋ ์ต์ Mac์ด๋ฉด ์ถฉ๋ถ; 30B ๋ก์ปฌ ๋ชจ๋ธ์ 64GB+. Siri์ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ์? Siri๋ ๋ตํฉ๋๋ค. Agent!๋ ํ๋ํฉ๋๋ค โ ์ฑ, ํ์ผ, ์ฝ๋, ์์คํ .
๋ ๋ณด๊ธฐ: docs/FAQ.md ยท ๊ธฐ์ ์ํคํ ์ฒ ยท ๋น๊ต (Claude Code, Cursor, Cline, OpenClaw ๋๋น) ยท ๋ณด์ ๋ชจ๋ธ
๋นํ์ธ๋ ์คํ ๋ฆฌ
Agent!๋ 3๋ ๊ฐ ์์ด์ ํฑ AI ์ฑ์ ๋ง๋ ๊ฒฐ๊ณผ์ ๋๋ค โ ANIE, Game Changer, BattleScript, XCF MCP Server์ Client, D1F, ๊ทธ๋ฆฌ๊ณ ์ฝ 8๊ฐ์ ๋ ์ฐฝ์ ์ธ Swift ํจํค์ง. ๋น ์ง ์กฐ๊ฐ์ ์ง๋ฅ์ ์ธ ์์จ ๋ฃจํ์๊ณ , ์ด๋ฅผ ๋ฌ์ฑํ์ ๊ทธ ํ๋ก์ ํธ๋ค์ ์ ์๊ฐ Agent!๋ก ๋ชจ์์ต๋๋ค. ๋น๋์ค ๊ฒ์(Boss-Man)์ ์์ฑํ๊ณ , ์ฑ์ ๋ง๋ค๊ณ , AppleScript๋ก Pages์ ์๋ฅผ ์ฐ๊ณ , ๋์คํฌ ์ด๋ฏธ์ง๋ฅผ ์์ฑํด GitHub ๋ฆด๋ฆฌ์ค์ ์ฒจ๋ถํ์ต๋๋ค. Claude Code๊ฐ ~65๊ฐ์ ์๋ํํฐ NPM ํจํค์ง์ ์์กดํ๋ ๋ฐ๋ฉด, Agent!๋ 100% ๋ค์ดํฐ๋ธ์ด๊ณ , RAM์ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ, Xcode ์๋ํ, Swift Syntax 6.2 ๋ถ์, ์์ฌ์ด ์ฌ์ฉ, AppleScript, AgentScript/ScriptingBridge, Safari ์๋ํ, MCP ์ง์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํฉ๋๋ค.
๊ธฐ์ฌํ๊ธฐ
CONTRIBUTING.md๋ฅผ ์ฐธ๊ณ ํ์ธ์ โ ./build.sh๋ก ~5๋ถ ๋ง์ ์์ค์์ ๋น๋, ๊ฐ๋ฐ์ ๊ณ์ ๋ถํ์. Pull request๋ CI Build & Test ์ํฌํ๋ก๋ฅผ ์คํํฉ๋๋ค. good first issues๋ฅผ ํ์ธํ์ธ์.
๋ผ์ด์ ์ค
PolyForm Noncommercial 1.0.0 โ ๋น์์ ์ ยท๊ฐ์ธ ์ฉ๋๋ก ๋ฌด๋ฃ. ์์ ์ ์ฌ์ฉ ๋ฐ ์ํํธ์จ์ด์ ์์ ์ฉ ๋ฒ์ ์ Logos InkPen LLC ํ์ฌ์ธ AgentiLoop.ai์ ๋ ์ ์ ์ผ๋ก ์ ๋ณด๋ฉ๋๋ค. ์์ ์ฉ ๋ผ์ด์ ์ค๋ AgentiLoop์ ๋ฌธ์ํ์ธ์.
โ ๏ธ ๋ฒ์ ๊ณ ์ง ๋ฐ ์ ์์ ํ์
์ํ ๊ณ ์ง
"AgentiLoop Agent! for Mac"์ ๋ ๋ฆฝ์ ์ธ ์ํํธ์จ์ด ํ๋ก์ ํธ์ด๋ฉฐ Apple Inc.์ ์ ํด, ๋ณด์ฆ, ํ์ ๋๋ ๊ธฐํ ๊ด๋ จ์ด ์์ต๋๋ค. "Apple", "Mac", "Mac mini", "MacBook", "macOS" ๋ฐ ๊ด๋ จ ๋งํฌ๋ ๋ฏธ๊ตญ ๋ฐ ๊ธฐํ ๊ตญ๊ฐ์ ๋ฑ๋ก๋ Apple Inc.์ ์ํ์ ๋๋ค. ์ฌ๊ธฐ์ ์ธ๊ธ๋ ๊ธฐํ ๋ชจ๋ ์ํ, ์๋น์ค ๋งํฌ ๋ฐ ์ํธ๋ ๊ฐ ์์ ์์ ์ฌ์ฐ์ด๋ฉฐ ์๋ณ ๋ชฉ์ ์ผ๋ก๋ง ์ฌ์ฉ๋ฉ๋๋ค.
"AgentiLoop Agent!"์ AgentiLoop Agent! ๋ก๊ณ ๋ Logos InkPen LLC ํ์ฌ์ธ AgentiLoop.ai์ ์ํ์ ๋๋ค. ์ด ๋งํฌ์ ์ฌ์ฉ์๋ ์ฌ์ ์๋ฉด ํ๊ฐ๊ฐ ํ์ํฉ๋๋ค. ์๋ PolyForm Noncommercial ๋ผ์ด์ ์ค๋ ์์ค ์ฝ๋์ ๋ํ ๊ถ๋ฆฌ๋ง ๋ถ์ฌํ๋ฉฐ โ ์ํ๊ถ์ ๋ถ์ฌํ์ง ์์ต๋๋ค.
์์ค ์ฝ๋ ๋ผ์ด์ ์ค (PolyForm Noncommercial 1.0.0)
"AgentiLoop Agent! for Mac"์ ์์ค ์ฝ๋๋ ๊ณต๊ฐ๋์ด ์์ผ๋ฉฐ PolyForm Noncommercial License 1.0.0์ผ๋ก ์ ๊ณต๋ฉ๋๋ค. LICENSE ํ์ผ์ ์กฐ๊ฑด(Required Notice์ ๋ผ์ด์ ์ค ์กฐํญ์ ์ฌ๋ณธ ๋๋ ๋งํฌ ์ ์ง)์ ๋ฐ๋ผ ๋ชจ๋ ๋น์์ ์ ๋ชฉ์ ์ผ๋ก ์์ค ์ฝ๋๋ฅผ ์์ ๋กญ๊ฒ ์ฌ์ฉ, ๋ณต์ฌ, ์์ , ๋ฐฐํฌํ ์ ์์ต๋๋ค. ์์ ์ ์ฌ์ฉ ๋ฐ ์ํํธ์จ์ด์ ์์ ์ฉ ๋ฒ์ ์ Logos InkPen LLC ํ์ฌ์ธ AgentiLoop.ai์ ๋ ์ ์ ์ผ๋ก ์ ๋ณด๋ฉ๋๋ค.
์ปดํ์ผ๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ ๋ฆด๋ฆฌ์ค
์ด ํ๋ก์ ํธ์ GitHub Releases, AgentiLoop.ai ๋๋ ๊ธฐํ ๊ณต์ ์ฑ๋์ ํตํด ๋ฐฐํฌ๋๋ ์ปดํ์ผ๋ ๋ฐ์ด๋๋ฆฌ, ์ค์น ํ๋ก๊ทธ๋จ, ์ฝ๋ ์๋ช ๋ ๋น๋ ๋ฐ ๋ฆด๋ฆฌ์ค ์ํฐํฉํธ๋ Logos InkPen LLC ํ์ฌ์ธ AgentiLoop.ai์ ์ ์๋ฌผ์ด๋ฉฐ ์์ค ์ฝ๋๋ฅผ ๊ท์จํ๋ PolyForm Noncommercial ๋ผ์ด์ ์ค์ ์ ์ฉ์ ๋ฐ์ง ์์ต๋๋ค. ๊ณต์ ๋ฐ์ด๋๋ฆฌ์ ๋ํ ๋ชจ๋ ๊ถ๋ฆฌ โ "AgentiLoop Agent!" ์ด๋ฆ, ๋ก๊ณ , ์ฝ๋ ์๋ช ์์ด๋ดํฐํฐ, Developer ID ํฌํจ โ ๋ ์ ๋ณด๋ฉ๋๋ค.
Copyright ยฉ 2026 AgentiLoop.ai, a Logos InkPen LLC company. All rights reserved.
"AgentiLoop Agent!" ์ด๋ฆ, ๋ก๊ณ ๋๋ ๋ธ๋๋ฉ์ ์ ํ ์๋ณ์ ์ฌ์ฉํ์ง ์๋ ํ, PolyForm Noncommercial ๋ผ์ด์ ์ค์ ๋ฐ๋ผ ๋น์์ ์ ์ฉ๋๋ก ์์ค์์ ์ง์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋น๋ํ๋ ๊ฒ์ ํ์ํฉ๋๋ค.
๋ณด์ฆ ๋ถ์ธ
์ด ์ํํธ์จ์ด๋ ์ํ์ฑ, ํน์ ๋ชฉ์ ์ ํฉ์ฑ ๋ฐ ๋น์นจํด์ ๋ํ ๋ณด์ฆ์ ํฌํจํ๋ ์ด์ ๊ตญํ๋์ง ์๋ ๋ช ์์ ๋๋ ๋ฌต์์ ์ด๋ ํ ๋ณด์ฆ ์์ด "์๋ ๊ทธ๋๋ก" ์ ๊ณต๋ฉ๋๋ค. ์ด๋ ํ ๊ฒฝ์ฐ์๋ ์ ์ ๋๋ ์ ์๊ถ์๋ ๊ณ์ฝ, ๋ถ๋ฒ ํ์ ๋๋ ๊ธฐํ ์์ก์์ ์ํํธ์จ์ด ๋๋ ์ํํธ์จ์ด์ ์ฌ์ฉ์ด๋ ๊ธฐํ ๊ฑฐ๋๋ก ์ธํด ๋ฐ์ํ๋ ์ฒญ๊ตฌ, ์ํด ๋๋ ๊ธฐํ ์ฑ ์์ ๋ํด ์ฑ ์์ง์ง ์์ต๋๋ค.
AgentiLoop Agent!์ ๊ด์ฌ์ ๊ฐ์ ธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค โ ์ ํ Mac ํ๋์จ์ด์ ์ํํธ์จ์ด์์ macOS 26.4 ์ด์์ ์คํํ๋ Mac mini, MacBook, Mac Studio ์ปดํจํฐ๋ฅผ ์ํด ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.
- ์น์ฌ์ดํธ: https://AgentiLoop.ai
- Github : https://github.com/AgentiLoop/agent