09/Documentation
Durable SDK (실험적 기능)
npm 패키지 @colliepwa/durable-sdk의 구성 요소별 안내: 엔트리 및 런타임, openCollie, 창 메서드, 4가지 유형의 질문 및 requireApproval, 훅, 히스토리, 기능 한도, 헬퍼, Pi 연동 및 버전을 다룹니다
실험적 기능입니다. 패키지, 해당 API 및 사용하는 통신 방식은 이후 마이너 릴리스에서 변경되거나 기능이 제거될 수 있습니다. 영구 에이전트에서 이것이 무엇을 의미하는지는 버전에 설명되어 있습니다.
@colliepwa/durable-sdk은 영구 에이전트가 Collie를 통해 휴대전화에 자신을 표시하는 데 사용하는 npm 패키지입니다. 이 페이지에서는 해당 패키지의 모든 부분을 나열합니다. Durable agent에는 빠른 시작과 Collie 측 설정이 나와 있으며, durable wire에는 둘 사이에서 전달되는 내용이 설명되어 있습니다.
설치 및 진입점
한 번 설치하면 5개의 진입점이 제공됩니다. 대부분의 영구 에이전트를 위한 루트 import와 특수한 용도의 진입점 4개입니다.
npm install @colliepwa/durable-sdk@experimental
# or
bun add @colliepwa/durable-sdk@experimental| import | 포함된 내용 |
|---|---|
@colliepwa/durable-sdk | openCollie 및 전체 API입니다. Bun에서는 Bun 서버로 소켓을 서비스하고, 그 외 환경에서는 node:http 서버로 서비스합니다 |
@colliepwa/durable-sdk/bun | 동일한 API이며 항상 Bun 서버와 함께 사용합니다 |
@colliepwa/durable-sdk/node | 동일한 API이며 항상 node:http 서버와 함께 사용하고, 시작 시 기록하는 줄인 NO_DESCENDANT_CHECK이 추가됩니다 |
@colliepwa/durable-sdk/core | 자체 전송을 제공하는 durable agent를 위한 단일 함수 handle(request) 형태의 레이아웃 및 연결입니다. 런타임 import가 없으므로 웹 Request이 실행되는 곳이라면 어디서나 동작합니다. |
@colliepwa/durable-sdk/pi | Pi Durable(Pi 헬퍼입니다.)을 기반으로 구축된 durable agent를 위한 접착 코드입니다. |
이 패키지에는 Node 22.19 이상 또는 Bun 1.4 이상이 필요하며, 런타임 의존성은 없습니다. ./pi에는 1.1 이상 2 미만의 @earendil-works/pi-durable, @earendil-works/pi-ai, @earendil-works/chord이 필요합니다. 해당 엔트리는 Pi Durable 1.1.0 및 1.2.0에서 테스트되었습니다. 세 가지는 선택적 피어 의존성이므로, ./pi을 전혀 import하지 않는 durable agent는 아무것도 설치하지 않습니다.
런타임은 durable agent가 응답자를 식별할 수 있는지 결정합니다. 하위 프로세스 검사는 durable agent 자체 또는 해당 에이전트가 시작한 프로세스의 동작을 403 caller-refused으로 거부합니다. answer, send, stop, action, rename, close, reopen 및 starter가 여기에 해당합니다. 읽기 작업은 계속 열려 있습니다.
| 런타임 | 하위 프로세스 검사 | 설정한 값 |
|---|---|---|
| Linux 환경의 Bun | 기본적으로 켜져 있습니다. Bun은 소켓에서 호출자의 프로세스 ID를 읽습니다. | 없음. callerCheck: "off" 설정 시 꺼집니다. |
| macOS의 Bun, 또는 Linux 이외의 모든 시스템 | 실행할 수 없습니다. callerCheck을 명시하는 오류와 함께 시작이 실패합니다. | callerCheck: "off" |
| Node, 모든 시스템 | 실행할 수 없습니다: Node는 소켓의 호출자를 읽을 수 없습니다. durable agent는 시작 시 이를 알리는 한 줄을 작성합니다. | 없음. callerCheck은 읽히지 않습니다. |
이 검사가 없으면 에이전트가 실행하는 도구를 포함하여 사용자의 모든 프로세스가 카드에 응답할 수 있습니다. 소켓에 접근할 수 없는 샌드박스에서 에이전트 도구를 실행하십시오. 소켓에는 파일 소유자가 있는 시스템이 필요하므로 Windows에서는 시작 시 openCollie이 중단됩니다. Windows 환경의 durable agent는 대신 토큰이 포함된 TLS 뒤에서 ./core을 제공합니다(durable agent에 연결하는 두 가지 방법).
연결 열기
openCollie은 비공개 소켓을 생성하며, 반환된 핸들은 휴대폰에 표시되는 내용을 배치합니다.
import { openCollie } from "@colliepwa/durable-sdk";
const collie = await openCollie({ hostName: "desk" });
const space = collie.workspace("support", { title: "Support" });
const tab = space.tab("main", { title: "Tickets" });
const pane = tab.pane("ticket-1", { title: "Maria Lopez", harness: "desk" });
collie.ready();socket 옵션이 없으면 Collie도 읽는 변수인 COLLIE_DURABLE_SOCKET에서 경로를 가져옵니다.
| 옵션 | 동작 방식 | 기본값 |
|---|---|---|
socket | 소켓 경로: 절대 경로이며 최대 103바이트입니다. 해당 폴더는 0700 모드로 생성되거나, 0700 모드를 가진 사용자 소유의 폴더여야 합니다. | COLLIE_DURABLE_SOCKET 변수입니다. 둘 다 설정되지 않은 경우 시작이 실패합니다. |
hostName | hello에 포함되는 durable agent 자체 이름으로, 64바이트로 잘립니다. 필수 항목입니다. | 없음 |
tailLimit | Collie의 읽기 작업을 위해 각 창이 유지하는 원시 이벤트 수입니다. | 500, 최대 1000 |
caps | durable agent가 수행할 수 있다고 선언하는 기능(기능) | SDK가 수행할 수 있는 모든 작업 |
callerCheck | descendant 또는 off. Bun에서만 읽습니다. | descendant |
hooks | 휴대폰이 보내는 각 동작(훅 및 기록)마다 지정된 하나의 위치 | 없음 |
warn | SDK가 한 줄 메모를 기록하는 위치(예: 다른 유선 프로토콜 버전을 사용하는 Collie 관련 메모) | console.warn |
onRename | 지원 중단되었습니다. 한 릴리스 동안 요청 ID 없이 유지되는 hooks.onRename의 이전 이름입니다. | 없음 |
openCollie에는 없고 createCore에만 두 가지 옵션이 더 존재합니다: receipts 및 allowAlways(질문 목록).
| 핸들에서 | 설명 |
|---|---|
address | 수신 대기하는 소켓 경로 |
epoch | 시작할 때마다 새로 무작위 생성되는 128비트 값 |
core | 소켓 배후의 코어입니다. 테스트 또는 보조 전송 계층은 core.handle을 직접 호출합니다. |
workspace(id, { title, cwd? }) | ID마다 한 번 생성되는 워크스페이스입니다. 워크스페이스의 tab(id, { title })은 탭을 제공하고, 탭의 pane(id, options)은 창을 제공합니다. |
starters(list) | 새로 만들기 페이지에서 휴대폰이 시작할 수 있는 항목으로 최대 50개입니다. 각각은 { id, label, run }이며, run은 표시된 창의 { paneId } 값으로 확인됩니다. |
history(provider) | 영속 에이전트 자체의 대화 기록 제공(훅 및 기록) |
ready() | 모든 창이 표시된 후 한 번 호출하고, 재시작 후에는 열린 모든 ask가 다시 제기된 후 한 번 호출하십시오. 그때까지는 hello를 제외한 모든 경로가 503 starting으로 응답합니다. |
close() | 서버를 중지합니다. 이미 전송 중인 응답은 최대 2초 동안 계속 전송된 후 소켓 파일이 제거됩니다. |
close()은 의도적으로 열린 ask를 열린 상태로 둡니다. 종료는 응답이 아니며, 응답을 기다리는 작업의 처리 방식은 영속 에이전트가 결정합니다.
tab.pane(id, { title, harness, cwd?, sessionId? })은 해당 ID를 가진 창이 존재할 때 이를 반환하므로 영속 에이전트는 두 번째 창 없이 대화를 두 번 표시할 수 있습니다. 제목은 256바이트로, harness은 64바이트로 잘립니다. cwd은 절대 경로여야 하며 그렇지 않으면 생략됩니다.
모든 ID는 ID 규칙을 따릅니다: 1~128바이트, 제어 문자 없음, 공백 문자 없음, /, ?, # 중 어느 것도 포함하지 않음. 잘못된 ID는 TypeError입니다. 유선 프로토콜이 탭을 <workspace>:<tab>로 지정하므로 워크스페이스 또는 탭 ID에는 :를 포함할 수 없습니다.
창
창은 하나의 대화이며, 창의 메서드는 휴대폰에 표시할 내용을 설정합니다.
| 메서드 | 휴대폰에 표시되는 내용 | 제한 |
|---|---|---|
state(s) | working, waiting 또는 idle. working의 변경은 새 턴을 시작합니다. | 열린 ask가 하나라도 있는 동안 창은 waiting 상태를 나타냅니다. |
event(e) | 채팅 항목: item, remove, settled, reset 및 synced 이벤트 | 아래 항목 표를 참조하십시오. |
subtitle(text) | 제목 아래 한 줄입니다. null은 이를 지웁니다. | 120자 |
badge(value) | 제목 옆의 { count } 또는 { text }. null은 이를 지웁니다. | 0부터 9999까지의 개수, 12자의 텍스트 |
progress(value) | 창이 작업 중이거나 대기하는 동안 표시되는 { kind: "steps", steps } 또는 { kind: "percent", value, label? }. null은 이를 지웁니다. | 12개 단계, 각 라벨은 60자, 값은 0부터 100까지입니다 |
actions(list) | belt의 durable agent 섹션에 있는 버튼: { id, label, icon?, busy?, disabled? }. null은 이를 비웁니다 | 버튼 4개, 16자 라벨 |
onAction(fn) | 해당 버튼 중 하나를 탭하는 동작을 실행합니다. 거부하려면 false을 반환하십시오 | 휴대폰은 busy 또는 disabled 버튼에 대해 탭을 전송하지 않습니다 |
onSend(fn) | 휴대폰의 텍스트를 fn(text, { steer, requestId })으로 받습니다 | 32 KiB 텍스트 |
onAbort(fn) | Stop을 fn({ requestId })으로 받습니다 | 없음 |
ask(input, { signal? }) | 질문 카드 (질문 목록) | 창(pane)당 열린 ask 50개 |
updateAsk, decideAsk, outcomeOf | ask 변경, 결정 또는 다시 읽기 (질문 목록) | 없음 |
close() | 레이아웃에서 창을 제거합니다. 열려 있는 ask는 중지됨 상태로 닫힙니다 | 없음 |
창에는 4개의 읽기 전용 필드도 있습니다: id, sessionId, turnId (실행 중인 turn 또는 마지막 turn), openAsks. 액션의 icon은 play, pause, check, x, refresh, archive, flag, star, send, note, search, more 중 하나입니다. 다른 이름은 아이콘을 표시하지 않습니다.
item 이벤트는 id 및 선택적 ts을 가진 항목 하나를 전달합니다. 알려진 id를 가진 항목은 이전 항목을 제자리에서 대체합니다.
| 종류 | 포함된 내용 | 제한 |
|---|---|---|
user | 사용자가 보낸 한 줄입니다. requestId은 해당 내용이 시작된 전송의 이름을 지정하므로, 휴대폰은 자체 회선을 해당 내용으로 바꿉니다 | 64 KiB 텍스트 |
reply, thinking, notice | 에이전트의 발화 | 64 KiB 텍스트 |
markdown | 휴대폰이 마크다운으로 렌더링하는 텍스트: 제목, 목록, 강조, 코드 스팬, 링크 | 32 KiB 텍스트 |
code | 코드 블록, ts과 같은 lang 포함 | 32 KiB 텍스트. lang은 1~24자의 문자, 숫자 또는 _ + # . -입니다 |
link | href 및 선택적 label | href은 https:// 전용이며 최대 2048자입니다. label은 120자입니다 |
tool | 도구 호출: tool: { kind: "other", name, summary, output? }, 그리고 running, done, failed, denied 중 하나의 status | name 128바이트, summary 1 KiB, output 16 KiB |
reply, thinking, notice 또는 markdown 항목은 텍스트가 늘어나는 동안 partial: true을 전달할 수 있습니다. 창이 working을 벗어나기 전에 텍스트가 늘어남에 따라 동일한 id를 최대 250ms마다 다시 작성하고, 마지막으로 partial 없이 최종 텍스트와 함께 한 번 더 작성하십시오.
제한을 초과한 텍스트는 잘리며, 제어 문자 및 보이지 않는 문자는 제거됩니다. 잘못된 lang, 잘못된 href, 잘못된 배지 또는 잘못된 진행률은 Collie가 버리므로 대신 TypeError 또는 RangeError이 됩니다. durable agent는 ask, ask-closed, state 이벤트를 직접 추가할 수 없습니다. ask() 및 state()이 이를 작성합니다.
질문 목록
pane.ask은 카드를 표시하고 응답으로 리졸브되며, requireApproval은 한 줄로 단일 도구 호출에 대해 묻습니다.
import { requireApproval } from "@colliepwa/durable-sdk";
const args = { order: "5521", amount: 40 };
const approval = await requireApproval("refund", args, {
pane,
toolCallId: "call-1",
timeoutMs: 10 * 60_000,
});
if (!approval.approved) throw new Error(`refund not approved: ${approval.decidedBy}`);requireApproval(toolName, args, options)은 모델의 설명이 아니라 호출 내용 자체로부터 카드를 구성합니다. 제목은 "refund wants to run"이고 도구 라인은 refund(order: "5521", amount: 40)이며 푸시는 "refund needs a yes"로 표시되고 버튼은 Allow 및 Deny입니다. { approved, decidedBy, decidedAt, askId }을 반환합니다. 거부, 타임아웃, 중지, 중단은 모두 approved: false을 반환합니다.
requireApproval의 옵션 | 동작 방식 | 기본값 |
|---|---|---|
pane | 요청하는 창입니다. 필수 항목입니다 | 없음 |
toolCallId | 도구 호출 자체의 id이며 재시작 후에도 동일합니다. 임의의 문자열을 사용할 수 있으며, id 규칙을 벗어난 문자열은 안전하게 처리됩니다. | 필수 |
itemId | 카드가 속한 항목 | 도구 호출 id |
timeoutMs | 휴대폰에 주어지는 시간입니다. 이 시간을 초과하면 호출이 거부되며 timeout에 의해 결정됩니다. | 제한 없음 |
signal | AbortSignal입니다. 중단하면 호출이 거부되며 program에 의해 결정됩니다. | 없음 |
labels | 두 버튼의 문구, { allow?, deny? } | 허용 및 거부 |
callSummary(name, args) 및 argumentsView(args)은 사용하는 두 구성 요소입니다. 호출은 한 줄로 표현되고 인수는 각 값이 JSON인 key: value 쌍으로 표현됩니다.
pane.ask(input)은(는) 네 가지 종류 중 하나를 받습니다. 프로미스는 해당 종류의 형태를 가진 응답으로 해결됩니다.
kind | 카드가 표시하는 내용 | 응답 | 제한 |
|---|---|---|---|
permission | 옵션당 버튼 하나, 각각 effect 포함: allow, allow-always, deny 또는 cancel | { optionId, note? } | 1~6개 옵션 |
choice | 옵션당 버튼 하나. multiple: true을(를) 사용하면 사용자가 여러 개를 선택합니다. | { optionIds } | 1~8개 옵션 |
text | 텍스트 필드 하나, 선택적 placeholder 포함 | { text } | maxLength은(는) 1~2000이며 기본값은 500입니다. 플레이스홀더는 60자입니다. |
form | 1~6개 필드, 각 필드는 text, choice 또는 toggle 종류이며 일부는 required | 필드 id를 키로 하는 { values } | 선택 필드에는 1~8개의 옵션이 있습니다. |
모든 종류는 toolCallId, itemId, title(256바이트)를 받습니다. reason(2 KiB), tool, push: { title?, line? }(60자 및 120자, 알림 문구), expiresAt(시간대가 포함된 Date 또는 ISO 8601 문자열)을 받을 수 있습니다.
id을(를) 생략하십시오. SDK는 askIdFor(paneId, toolCallId)을(를) 통해 이를 도출합니다. 두 id에 대한 SHA-256의 앞자리 16진수 32자입니다. 따라서 재시작 후 다시 발생한 동일한 도구 호출은 동일한 id를 얻게 되며, 재시작 전에 휴대폰에서 전송한 응답이 전달됩니다. 이미 열려 있는 id를 발생시키는 것은 TypeError입니다.
| 창에서 | 동작 방식 |
|---|---|
updateAsk(askId, patch) | 열려 있는 요청을 직접 변경합니다: title, reason, tool, options, placeholder, maxLength 또는 fields. 리비전이 1 증가하므로 이전 양식에 대한 응답은 409 stale을(를) 받고 휴대폰은 새로 탭하도록 요청합니다. 요청이 열려 있지 않으면 false입니다. |
decideAsk(askId, answer?) | 지속형 에이전트가 휴대폰이 아닌 다른 곳에서 요청을 직접 결정했습니다. answer이(가) 있으면 대기 중인 ask()이(가) 해당 값으로 해결됩니다. 없으면 AskClosed(으)로 거부됩니다. 나중에 휴대폰에서 탭하면 409 decided을(를) 받고 카드에는 "지속형 에이전트에서 결정됨"이라고 표시됩니다. 요청이 열려 있지 않으면 false입니다. |
outcomeOf(askId) | 첫 번째 결정: { decidedBy, decidedAt, optionId?, effect? }. 창은 최근 500개를 기억합니다. 요청을 생성한 적이 없거나 잊어버린 경우에는 정의되지 않습니다. |
decidedBy은(는) phone, program 또는 timeout입니다. 요청은 expiresAt을(를) 초과하면 timeout에 의해 결정된 상태로 닫힙니다. ask()은(는) decidedBy이(가) timeout인 AskClosed(으)로 거부됩니다. 카드에는 그때까지 남은 시간이 표시됩니다. 시간 초과되었거나 지속형 에이전트에서 결정된 질문은 Chat에 "응답 전에 시간 초과됨: refund 실행을 원함"과 같은 한 줄을 남깁니다.
중단된 signal, pane.close() 및 휴대폰에서의 종료는 요청을 program에 의해 결정된 상태로 닫으며 ask()은(는) AskClosed(으)로 거부됩니다.
주의.allow-always옵션은 한 번 응답한 후의 모든 후속 호출을 통과시킵니다. https에서는 토큰이 유일한 관문이므로, 그곳의 지속형 에이전트는 허용 및 거부만 제공합니다.allowAlways: false을(를) 포함한createCore은(는)allow-always옵션을TypeError(으)로 만듭니다. 문구가 잘리거나 정제된 요청 또는 도구 이름이 없는 요청에 대해서는 휴대폰에서allow-always을(를) 제공하지 않습니다.
휴대폰에서 오는 모든 동작에는 요청 id가 포함되며, 코어는 해당 영수증을 보관합니다. 중복 요청은 아무것도 실행하지 않고 replayed: true와 함께 첫 번째 응답을 다시 받습니다. 기본 MemoryReceiptStore는 창별로, 그리고 시작, 이름 변경, 닫기, 다시 열기 그룹별로 최신 RECEIPTS_PER_GROUP개(1000개)를 유지합니다. 폐기된 id가 중복 요청되면 500 receipt-dropped을 받고 아무것도 실행하지 않습니다. 프로세스가 종료되면 저장소도 사라집니다.
재시작 후에도 영수증을 유지하려면 get(requestId) 및 put(requestId, record, group)를 포함하는 ReceiptStore를 작성하고 createCore에 receipts로 전달하십시오. openCollie는 항상 이를 메모리에 보관합니다.
훅 및 기록
hook은 휴대폰이 보내는 동작을 처리하는 단일 지정 위치이며, history provider는 자체 기록을 제공합니다.
| hook | 실행 조건 | 거부 방식 |
|---|---|---|
onSend(pane, { text, steer, turnId, requestId }) | pane.onSend가 없는 창에 전달된 텍스트 | 예외 발생: 500 internal, 휴대폰 입장에서 결과를 알 수 없음 |
onAbort(pane, { turnId, requestId }) | pane.onAbort가 없는 창에 대한 중지 | 위와 동일하게 예외 발생 |
onAction(pane, { actionId, turnId?, requestId }) | pane.onAction가 없는 창에서의 벨트 탭 | false 반환: 422 action-refused |
onRename({ kind, id, title }, requestId) | 워크스페이스 또는 탭의 새 제목 | false 반환: 422 rename-refused |
onClose({ kind, id, paneIds }, requestId) | 휴대폰이 창, 탭 또는 워크스페이스를 닫음 | false 반환: 422 close-refused |
onReopen({ id, paneId? }, requestId) | 휴대폰이 닫힌 대화를 다시 엶 | false 반환: 422 reopen-refused |
hook은 해당 cap이 켜져 있고 요청 id가 새로운 경우에만 실행됩니다. 거부 시에는 아무것도 저장되지 않으므로 동일한 요청 id로 다시 시도할 수 있습니다. 창별 핸들러가 hook보다 우선합니다. 둘 다 없는 창은 전송, 중지 또는 탭에 대해 409 not-supported로 응답합니다.
SDK는 수락된 동작을 직접 적용합니다. 이름 변경은 제목을 설정합니다. 닫기는 대상과 그 내부의 모든 항목을 제거하고, 열려 있는 질문들을 중지됨 상태로 닫습니다. hook 없는 다시 열기는 현재 프로세스가 닫은 창을 복원합니다. 재시작 전에 닫힌 대화는 onReopen가 필요합니다. 레이아웃은 시작할 때마다 다시 생성되므로, 제목이나 닫기 상태가 프로세스 종료 후에도 유지되기를 원하는 durable agent는 이를 hook에 저장합니다.
collie.history(provider)는 durable agent 자체 저장소에서 열려 있거나 닫힌 모든 대화를 제공합니다. caps가 생략되거나 history: true을 지정하면 history cap을 켭니다.
HistoryProvider | 반환값 |
|---|---|
list(after, limit) | { items, next? }: 최신순 대화 행, 최대 limit개(100개) |
items(id, after, limit) | { items, next? }: 오래된 순 대화 항목, 각각 최신 버전 기준, 최대 limit개(1000개). 알 수 없는 id인 경우 undefined 반환 |
행은 { id, title, subtitle?, workspaceId?, tabId?, startedAt, endedAt?, state, items }이며, state은 open 또는 closed이고 items는 개수입니다. 커서(after, next)는 공백이 없는 1~512바이트의 출력 가능한 ASCII 문자열로 직접 지정합니다. next가 없으면 목록이 끝납니다.
provider가 설정되면 각 창의 sessionId는 해당 창의 id가 되며, 기록은 그 아래에서 창의 대화를 제공합니다. 다른 id를 지정하려면 sessionId를 tab.pane()에 전달하고, 재시작 후 동일하게 유지될 수 없는 경우에는 null를 전달하십시오.
tailLimit는 기록이 아닙니다. Collie의 이벤트 읽기를 위해 각 창이 보관하는 원시 tail이며, 기본값은 500개 이벤트입니다. 이보다 뒤처진 리더는 창의 현재 전체 뷰(최대 최신 2000개 항목)를 대신 받습니다.
기능
cap은 durable agent가 수행할 수 있는 작업을 나타내며, 휴대폰은 durable agent가 선언한 cap에 대해서만 컨트롤을 표시합니다.
| 상한 | durable agent가 받는 항목 |
|---|---|
asks | 질문을 제기하고 답변을 받음 |
starters | starter 목록을 표시하고 새 페이지에서 하나를 실행함 |
send | 휴대폰에서 텍스트를 받음 |
steer | 진행 중인 턴으로 텍스트를 받음. send 필요 |
abort | 실행 중인 턴을 중지합니다 |
rename | 워크스페이스 또는 탭의 새 제목을 받습니다 |
close | 창, 탭 또는 워크스페이스를 닫습니다 |
actions | 창의 벨트 버튼을 나열하고 하나를 실행합니다 |
history | 열려 있거나 닫힌 대화를 제공합니다 |
reopen | 닫힌 대화를 다시 표시합니다 |
생략하면 caps는 SDK가 수행할 수 있는 모든 기능을 활성화하고, history()에 제공자가 생기면 history도 활성화합니다. 지정하면 전체 목록으로 작동합니다. 지정하지 않은 cap은 비활성화되므로 { asks: true }는 ask만 선언합니다. 하나만 비활성화하고 나머지를 유지하려면 ALL_CAPS를 전개하십시오: { ...ALL_CAPS, steer: false }. 비활성화된 cap의 라우트는 409 not-supported로 응답합니다. terminal는 항상 false입니다.
도우미 및 상수
루트 import는 openCollie를 구성하는 요소들과 적용되는 규칙도 함께 내보냅니다.
| export | 설명 |
|---|---|
createCore(options) | 서버가 없는 코어입니다. socket와 callerCheck를 제외한 openCollie 옵션에 receipts 및 allowAlways를 더하여 받습니다. epoch, workspace, starters, history, ready, isReady, handle(request)를 반환합니다 |
handle | 단일 함수 형태의 통신 계층으로, 웹 Request를 입력받고 Response를 출력합니다. core.handle(request)가 일반적인 진입 방식입니다 |
wireListener(core) | 정상적인 종료를 위한 drained()를 포함하는, node:http 요청 리스너 형태의 core.handle |
hello, versionLine | hello 응답, 그리고 버전 거부 시 durable 에이전트가 작성하는 한 줄 |
mintId() | 새로운 무작위 ID(32자리 16진수 문자 형태의 128비트) |
askIdFor(paneId, toolCallId) | 파생된 ask ID |
AskClosed | 응답이 오지 않았을 때 ask()가 거부 처리하는 오류입니다. by 및 decidedBy를 전달합니다 |
idOk(id), assertId(id, what), safeId(raw) | ID 규칙: 검사, 예외를 던지는 검사, 어떤 문자열로든 생성되며 매번 동일한 안전한 ID |
cursorOk(cursor) | 기록 커서 규칙 |
cut(text, max, multiline?) | 문자열을 정리하고 끝에 …를 붙여 max바이트로 자릅니다 |
hrefOf, langOf, badgeOf, progressOf | 링크 대상, 코드 언어, 배지 및 진행 상태(창에서 검사하는 방식대로 검사됨) |
subtitleOf, pushTextOf, renameTitleOf | 정리 및 축소된 부제목, ask의 푸시 단어 및 이름 변경 제목 |
CAPS, LIMITS | 필드당 모든 cap(바이트 단위) 및 목록당 모든 cap |
ACTION_LABEL_MAX, BADGE_TEXT_MAX, BADGE_COUNT_MAX | 16, 12, 9999 |
SUBTITLE_MAX, LINK_LABEL_MAX, RENAME_TITLE_MAX | 각 120자 |
PROGRESS_STEPS_MAX, PROGRESS_LABEL_MAX | 12단계, 60자 |
PUSH_TITLE_MAX, PUSH_LINE_MAX, PLACEHOLDER_MAX | 60, 120, 60자 |
ANSWER_TEXT_MAX, ANSWER_TEXT_DEFAULT, ANSWER_TEXT_BYTES | 2000자, 500자 및 8000바이트 |
ALL_CAPS, PROTOCOL_RANGE, SOCKET_ENV | 모든 cap 켜짐, SDK가 지원하는 통신 버전 및 이름 COLLIE_DURABLE_SOCKET |
MemoryReceiptStore, RECEIPTS_PER_GROUP | 기본 영수증 저장소 및 그룹당 1000개 제한 |
유선상(wire)의 모든 타입과 모든 훅 페이로드 역시 src/core/types.ts에서 export됩니다.
Pi 헬퍼입니다.
./pi은(는) Pi Durable 대화를 창(pane)으로, 위험한 툴 호출을 카드로, Pi의 저장소를 히스토리로 변환합니다.
| export | 동작 방식 |
|---|---|
showConversation(loc, harness, conversation, o) | 대화를 창으로 표시하며, 히스토리를 먼저 표시한 뒤 실시간 이벤트를 표시합니다. Send는 요청 ID와 함께 Pi의 submit에 전달되고, Stop은 abort에 전달됩니다. 두 번 호출해도 안전합니다. |
PaneRegistry | 어느 창이 어느 대화를 표시하는지 나타냅니다. 재시작 후 reRaised(risky)은(는) 결과가 없는 각 위험한 호출이 다시 요청할 때까지 대기하므로, ready()은(는) 요청 이후에 나타납니다. |
riskGuard({ panes, risky, words?, timeoutMs?, onTimeout? }) | beforeTool 훅을 통해 risky의 툴 호출을 허용(Allow) 및 거부(Deny) 카드로 변환하는 Pi 확장 프로그램입니다. 거부된 호출은 차단됩니다. timeoutMs을(를) 사용하면 카드가 만료되고, 응답이 없는 호출은 차단되며, onTimeout(tool, title)을(를) 통해 durable agent가 이를 기록할 수 있습니다. |
askTools({ panes, words, timeoutMs?, onTimeout? }) | 지원 데스크의 두 가지 질의 툴: 선택 항목인 ask_queue, 텍스트 질의인 ask_customer. timeoutMs을(를) 사용하면 응답하지 않은 질의가 만료되고 툴이 "timed out"을 반환합니다. |
spawnHelperTool(o) | 툴 spawn_helper: 도우미의 답변을 반환하는 새 창으로 표시되는 하위 대화입니다. |
piHistory({ harness, panes, describe }) | 모든 Pi 대화의 모든 항목을 읽는 HistoryProvider |
firstMessageOf(conversation) | 창의 이름을 지정하기 위한 대화의 첫 번째 메시지 텍스트 |
paneIdOf(id), conversationOfPaneId(paneId) | Pi 대화의 창 ID, conv-<id>, 그리고 그 역방향 변환 |
summaryOf(args, name?) | 툴 호출 인수를 단어로 표현한 것(최대 200자) |
Mapper | 항목으로 표현된 Pi 엔트리 및 에이전트 이벤트. 생성 중인 응답은 하나의 항목 ID를 유지합니다. |
PARTIAL_MS, RE_RAISE_MS | 생성 중인 응답의 두 쓰기 작업 사이의 간격 250ms 및 reRaised이(가) 최대 대기하는 5000ms |
ESCALATED | 예시 어휘: showConversation이(가) escalate: true(으)로 추가하는 Escalate 버튼에 대한 지원 데스크 알림 |
ASKING_TOOLS | 예시 어휘: 지원 데스크의 두 가지 질의 툴 이름 |
Submit, ReplyExtras | 커스텀 submit의 타입, 그리고 durable agent가 완료된 응답 아래에 추가하는 항목들의 타입 |
카드가 표시하는 단어는 옵션으로 전달되므로, ./pi에는 해당 두 상수를 제외한 예시 텍스트가 포함되지 않습니다. 이는 Pi Durable 1.1.0을 기준으로 작성되었습니다. examples/durable-member/의 지원 데스크가 모든 부분을 결합합니다.
버전
이 패키지는 Collie와는 별개의 자체 버전을 가지며, 지원하는 유선 버전을 지정합니다.
| 오늘 | 의미 | |
|---|---|---|
SDK_VERSION | 0.1.0 | 패키지 버전입니다. 패키지가 dist-tag experimental을 벗어날 때까지는 마이너 릴리스에서 API가 변경될 수 있습니다. |
WIRE_VERSION | 1 | 패키지가 지원하는 durable 유선 버전 |
Collie는 하나의 유선 버전을 지원하며, 새 버전이 출시된 후 한 번의 마이너 릴리스 동안은 직전 버전을 허용합니다. Collie가 사용자의 버전 중 어느 것도 지원하지 않는 경우, 코어는 warn을(를) 통해 버전당 한 줄씩 작성합니다(예: collie: Collie speaks wire v2, this durable agent speaks v1. Update the agent's SDK, or Collie.). Phone은 durable agent의 홈에 Collie 자체의 표현으로 불일치를 표시합니다. 더 오래된 쪽을 업데이트하십시오.
패키지는 최신(latest)이 아닌 npm dist-tag experimental로 배포됩니다. durable 유선 버전이 종료에 도달하면 패키지는 지원 중단됩니다(ADR 0105).