사람함께에이전트▾
사람 — 직접 정하고 책임지는 비즈니스 규칙과 흐름. 직접 읽어보세요.
함께 — 개념은 알아두고, 세부 규칙은 에이전트가 따릅니다.
에이전트 — 에이전트가 따르는 규칙과 레퍼런스. 필요할 때 찾아보세요.



CLI 레퍼런스▾
AkanJS 레퍼런스▾Agent 네임스페이스가 그 UI입니다. 레이아웃에 <Agent.Chat /> 하나면 연결이 끝나고, 나머지 멤버는 범위를 좁히거나 에이전트가 보는 것을 보여 줍니다.import { Agent } from "akanjs/ui";

st.tool로 공개한 동작 하나입니다. 보통 버튼이 이미 부르는 핸들러입니다.Agent.Chat과 Agent.Zone이 각자 하나씩 만듭니다.navigate, goBack, readScreen, readState, highlight.st.expose나 st.useState로 공개해 에이전트가 읽을 수 있게 한 값입니다.Agent.Context, Agent.Section, Agent.StateKey, Agent.Tool, Agent.Transcript입니다. 직접 인스펙터를 조립할 때 씁니다.Agent.Zone이나 AgentProvider 안에서는 채팅이 그 세션에 합류하므로, 이 값은 그 세션을 만든 쪽이 정합니다.Agent.Guide가 그 위에 겹칩니다.runAgentTurn으로 보내고, httpRunner({ url })는 다른 주소로 보냅니다.at을 넘거나 알려진 창까지 buffer만 남으면 요약합니다. { at: 0 }이면 끕니다.true면 기본 툴 다섯 개 전부, false면 없음, 배열이면 적은 것만 줍니다. askUser는 항상 남습니다.{ storage: "local" }이나 SessionHistory를 주면 다른 곳에 둡니다.reveal) 포인터가 눌러 보입니다(cursor). false면 둘 다 끕니다.open만 주면 닫기 버튼을 그리지 않습니다.false면 런처를 그리지 않습니다. 자기 컨트롤로 패널을 여는 앱을 위한 옵션입니다.false로 브라우저에 돌려줍니다.className은 둘 모두에 붙습니다.chrome={false}면 헤더 바를 없애고, 지우기는 /new로 합니다.?prompt= 값을 보내지 않고 채워 둘 때 씁니다.null을 돌려주면 이미지와 텍스트를 읽는 기본 리더가 처리합니다.@ 메뉴의 대상이며 각자 search를 가집니다. mentions는 포인터를 이름으로 그리고, 대상이 있으면 켜집니다.persist가 없으면 페이지와 함께 사라집니다.attach, voice, reference, runner, onCompact, onOpenChange는 함수를 담고 있어 서버 레이아웃에서 RSC 경계를 넘길 수 없습니다. apps/akan/ui/DocsAgentChat.tsx처럼 ui/에 감싸는 컴포넌트를 두고, 음성 엔진은 @libs/util/webkit의 useSpeech()로 만듭니다.open만 주는 제어 방식은 서버 컴포넌트에서도 쓸 수 있습니다. onOpenChange가 없으면 넘기는 함수가 없으므로 그대로 조립할 수 있습니다.lazy(…, { ssr: false }) 경계라서 코드 청크가 하이드레이션이 끝난 뒤에 로드됩니다. 정상 동작입니다.lib/option.ts에서 합니다. option.setLlm({ apiKey, model, host })와 option.setAgentAccess(SignedIn)으로 설정하며, 환경 변수로는 하지 않습니다.url이면 data를 돌려주세요. attach 결과의 url은 프로바이더가 직접 가져갑니다. 둘 다 돌려주면 모델에는 바이트가 가고, 주소는 썸네일에 쓰입니다.Agent.Chat은 자동으로 이 zone에 묶이므로, 한 화면의 zone 두 개는 각자 자기 하위 트리만 보면서 대화 두 개를 나란히 돌립니다.data-agent-zone 값이 여기서 나오며, A-Za-z0-9_- 밖의 문자는 -가 됩니다.data-agent-zone이 붙는 감싸는 div에 붙습니다.Agent.Guide로 마운트되는 zone 지침입니다. 루트 에이전트도 읽고, 형제 zone은 읽지 않습니다.st.use 구독, 지침은 이 zone의 세션과 루트 에이전트 양쪽에 함께 속합니다.<id>.<name>이라는 이름을 갖습니다. 지침에 툴 이름을 적을 때는 접두사까지 적어야 합니다. 접두사 없는 이름은 없는 툴이라 모델이 Unknown tool로 턴 하나를 버립니다. 이름은 id로 조립하고, 공개 목록은 Agent.Context의 Assemble로 확인합니다.builtins={["readScreen", "readState"]}를 주면 navigate, goBack, highlight를 권고가 아니라 아예 주지 않으므로, 프롬프트로 우회할 수 없습니다.persist의 저장 키가 zone의 scope 경로라서 두 zone이 대화 기록을 섞지 않습니다._layout.tsx나 페이지에서 렌더하면 그 트리가 마운트된 동안 매 턴의 지침에 합쳐집니다. 화면에는 아무것도 그리지 않습니다.l() 규칙 대상이 아닙니다.page()에도 pageConfig에도 instructions 필드는 없고, *.abstract.md도 에이전트에게 전달되지 않습니다.persist와 같은 일을 prop 대신 마운트하는 컴포넌트로 하며, 화면에는 아무것도 그리지 않습니다.persist 대신 컴포넌트인 이유. 함수는 prop으로 서버/클라이언트 경계를 넘지 못하므로, 세션을 만드는 쪽에 persist를 넘기면 그 위의 조상이 모두 클라이언트 컴포넌트가 됩니다. 이 말단 컴포넌트 하나만 클라이언트로 두면 zone과 채팅은 서버 컴포넌트에 남습니다.<Agent.Zone id="thread"><ThreadHistory … /></Agent.Zone>처럼 Agent.Zone이나 AgentProvider 안에 마운트합니다. 루트 Agent.Chat은 세션을 아래로 내려 주지 않으므로, 그쪽은 persist를 씁니다.session.setHistory를 직접 호출하세요. 그 호출이 자리를 차지하므로 이후의 언마운트가 건드리지 않습니다.section으로 읽을 때 쓰는 이름입니다. 필수입니다.div에 붙습니다.[skipped: <label>]이 남으므로, 푸터를 물으면 푸터가 없다고 하지 않고 읽지 않았다고 답합니다. 필요하면 section: "<label>"으로 읽습니다.st.tool도 그대로 공개되고 highlight도 안쪽 컨트롤에 닿습니다.<footer data-agent-skip="site footer"><id>.<name>으로 공개되고, 중첩된 scope는 점으로 이어집니다.Agent.Zone은 kind="zone"으로 자기 scope를 엽니다.Agent.Scope를 씁니다. Agent.Zone은 scope를 감싸고 자기 대화까지 엽니다.Agent.Dock이 그것을 보여 줍니다. 개발 중에는 아래처럼 채팅 옆에 마운트합니다.Agent.Dock과 Agent.Context는 AKAN_PUBLIC_ENV=main에서 아무것도 그리지 않으므로, 마운트해 두어도 방문자에게는 비용이 없습니다.Agent.Section, Agent.StateKey, Agent.Tool, Agent.Transcript로 직접 만든 인스펙터는 프로덕션에서 스스로 숨겨야 합니다.open은 Tools를 펼칩니다. Transcript는 항상 펼친 채로, 나머지 섹션은 접힌 채로 시작합니다.bridge는 상태 키를, surface는 툴 목록을 제공하고, open은 Tools를 펼칩니다.<details> 그룹입니다. 도크는 이것을 다섯 개 그립니다.AgentChat 슬롯은 패널 전체를 바꿉니다.AgentLauncherAgentBubbleAgentStepsAgentComposerAgentApprovalAgentQuestionAgentQueuedAgentMenuAgentMarkdownAgentToolCardAgentCode