Saltar al contenido
ColliePWA

09/Documentation

El SDK durable (experimental)

El paquete de npm @colliepwa/durable-sdk, parte por parte: entradas y entornos de ejecución, openCollie, métodos del panel, los cuatro tipos de pregunta y requireApproval, hooks, historial, caps, funciones auxiliares, integración con Pi y versiones

Experimental. El paquete, su API y el protocolo que utiliza pueden cambiar, o la función puede eliminarse, en una versión menor posterior. Versiones indica lo que esto significa para su agente duradero.

@colliepwa/durable-sdk es el paquete npm que utiliza un agente duradero para mostrarse en el teléfono a través de Collie. Esta página enumera cada parte del mismo. Durable agents contiene el inicio rápido y la configuración del lado de Collie, y El protocolo durable explica lo que se transfiere entre ambos.

Instalación y puntos de entrada

Una instalación proporciona cinco puntos de entrada: la importación raíz para la mayoría de los agentes duraderos, y cuatro para necesidades más específicas.

npm install @colliepwa/durable-sdk@experimental
# or
bun add @colliepwa/durable-sdk@experimental
importacióncontenido
@colliepwa/durable-sdkopenCollie y la API completa. En Bun sirve el socket con el servidor Bun; en otros entornos, con el servidor node:http
@colliepwa/durable-sdk/bunLa misma API, siempre con el servidor Bun
@colliepwa/durable-sdk/nodeLa misma API, siempre con el servidor node:http, más NO_DESCENDANT_CHECK, la línea que escribe al iniciar
@colliepwa/durable-sdk/coreEl diseño y el cable en una sola función, handle(request), para un durable agent que aporta su propio transporte. Sin importación de runtime, por lo que se ejecuta dondequiera que lo haga un Request web
@colliepwa/durable-sdk/piEl pegamento para un durable agent construido sobre Pi Durable (Los helpers de Pi)

El paquete requiere Node 22.19 o posterior, o Bun 1.4 o posterior, y no tiene dependencias de runtime. ./pi requiere @earendil-works/pi-durable, @earendil-works/pi-ai y @earendil-works/chord, 1.1 o posterior y menor que 2. La entrada está probada con Pi Durable 1.1.0 y 1.2.0. Los tres son dependencias de pares opcionales: un durable agent que nunca importe ./pi no instala ninguno.

El runtime decide si el durable agent puede determinar quién responde. La comprobación de descendientes rechaza una acción del propio durable agent o de un proceso iniciado por él, con 403 caller-refused. Cubre answer, send, stop, action, rename, close, reopen y starter. Las lecturas permanecen abiertas.

runtimela comprobación de descendienteslo que se configure
Bun en LinuxActivado por defecto. Bun lee el id de proceso del emisor desde el socketNada. callerCheck: "off" lo desactiva
Bun en macOS, o cualquier otro sistema salvo LinuxNo se puede ejecutar. El inicio falla con un error que nombra callerCheckcallerCheck: "off"
Node, cualquier sistemaNo se puede ejecutar: Node no puede leer el emisor de un socket. El durable agent escribe una línea al inicio que lo indicaNada. callerCheck no se lee

Sin la comprobación, cualquier proceso de su usuario puede responder a una tarjeta, incluida una herramienta que ejecute el agente. Ejecute las herramientas del agente en un sandbox que no pueda acceder al socket. El socket requiere un sistema con propietarios de archivos, por lo que en Windows openCollie se detiene al inicio. En su lugar, un durable agent allí sirve ./core detrás de TLS con un token (Dos formas de acceder a un agente duradero).

Abrir una conexión

openCollie crea el socket privado, y el identificador que devuelve define lo que muestra el teléfono.

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();

Sin la opción socket, la ruta proviene de COLLIE_DURABLE_SOCKET, la variable que Collie también lee.

opciónqué hacepredeterminado
socketLa ruta del socket: absoluta, como máximo 103 bytes. Su carpeta se crea con modo 0700, o ya debe pertenecerle con modo 0700La variable COLLIE_DURABLE_SOCKET. Si ninguna está definida: el inicio falla
hostNameEl nombre propio del durable agent en su saludo, truncado a 64 bytes. ObligatorioNinguno
tailLimitCuántos eventos sin procesar conserva cada panel para las lecturas de Collie500, como máximo 1000
capsLo que el durable agent declara que puede hacer (Caps)Todo lo que el SDK puede hacer
callerCheckdescendant o off. Se lee solo en Bundescendant
hooksUn lugar con nombre para cada acto que envía el teléfono (Hooks e historial)Ninguno
warnDonde el SDK escribe sus notas de una línea, por ejemplo sobre un Collie que habla otra versión de protocoloconsole.warn
onRenameObsoleto. El nombre anterior de hooks.onRename, conservado durante una versión, sin el id de solicitudNinguno

Existen dos opciones más solo en createCore, no en openCollie: receipts y allowAlways (Preguntas).

en el identificadorqué es
addressLa ruta de socket en la que escucha
epochNuevo y aleatorio en cada inicio, 128 bits
coreEl núcleo detrás del socket. Una prueba, o un segundo transporte, llama a core.handle directamente
workspace(id, { title, cwd? })Un espacio de trabajo, creado una vez por id. Su tab(id, { title }) proporciona una pestaña, y el pane(id, options) de la pestaña un panel
starters(list)Lo que el teléfono puede iniciar desde la página Nuevo, como máximo 50. Cada uno es { id, label, run }, y run resuelve a { paneId } del panel que mostró
history(provider)Servir el propio registro de conversaciones del agente persistente (Hooks e historial)
ready()Llamar una vez que se muestre cada panel, y tras reiniciar una vez que cada solicitud abierta se plantee de nuevo. Hasta entonces cada ruta excepto hello responde 503 starting
close()Detener el servidor. Las respuestas que ya están en camino todavía salen, durante 2 s como máximo, luego el archivo de socket se elimina

close() deja abiertas las solicitudes abiertas a propósito: un apagado no es una respuesta, y el agente persistente decide qué ocurre con el trabajo que espera una.

tab.pane(id, { title, harness, cwd?, sessionId? }) devuelve el panel que tiene ese id cuando existe, para que un agente persistente pueda mostrar una conversación dos veces sin un segundo panel. Los títulos se cortan a 256 bytes y harness a 64. cwd es una ruta absoluta; de lo contrario se omite.

Cada id sigue la regla de id: de 1 a 128 bytes, sin caracteres de control, sin espacios en blanco y ninguno de /, ? o #. Un id no válido es un TypeError. El id de un espacio de trabajo o pestaña no puede contener :, porque el protocolo nombra una pestaña como <workspace>:<tab>.

Paneles

Un panel es una conversación, y sus métodos definen lo que el teléfono muestra para ella.

métodolo que muestra el teléfonolímite
state(s)working, waiting o idle. Un cambio a working inicia un nuevo turnoMientras haya alguna solicitud abierta, el panel muestra waiting
event(e)Elementos del chat: eventos de item, remove, settled, reset y syncedConsulte la tabla de elementos a continuación
subtitle(text)Una línea debajo del título. null la borra120 caracteres
badge(value){ count } o { text } junto al título. null lo borraUn conteo de 0 a 9999, un texto de 12 caracteres
progress(value){ kind: "steps", steps } o { kind: "percent", value, label? }, dibujado mientras el panel trabaja o espera. null lo borra12 pasos, cada etiqueta de 60 caracteres, un valor de 0 a 100
actions(list)Botones en la sección del agente duradero en el cinturón: { id, label, icon?, busy?, disabled? }. null los borra4 botones, una etiqueta de 16 caracteres
onAction(fn)Ejecuta una pulsación en uno de esos botones. Devuelva false para rechazarlaEl teléfono no envía ninguna pulsación para un botón busy o disabled
onSend(fn)Toma el texto del teléfono, como fn(text, { steer, requestId })32 KiB de texto
onAbort(fn)Toma Stop, como fn({ requestId })Ninguno
ask(input, { signal? })Una tarjeta de pregunta (Preguntas)50 solicitudes abiertas por panel
updateAsk, decideAsk, outcomeOfCambiar, decidir o volver a leer una solicitud (Preguntas)Ninguno
close()Elimina el panel de la distribución. Sus solicitudes abiertas se cierran como detenidasNinguno

Un panel también tiene cuatro campos de solo lectura: id, sessionId, turnId (el turno en ejecución, o el último) y openAsks. El icon de una acción es uno de play, pause, check, x, refresh, archive, flag, star, send, note, search y more. Otro nombre no dibuja ningún icono.

Un evento item transporta un elemento con un id y un ts opcional. Un elemento con un id conocido reemplaza al anterior en su lugar.

tipocontenidolímite
userUna línea enviada por el usuario. requestId nombra el envío del que procede, de modo que el teléfono intercambia su propia línea por esta64 KiB de texto
reply, thinking, noticeLas palabras del agente64 KiB de texto
markdownTexto que el teléfono renderiza como markdown: encabezados, listas, énfasis, fragmentos de código y enlaces32 KiB de texto
codeUn bloque de código, con lang como ts32 KiB de texto. lang contiene de 1 a 24 letras, dígitos o _ + # . -
linkUn href y un label opcionalhref es solo https://, con un máximo de 2048 caracteres. label tiene 120 caracteres
toolUna llamada a herramienta: tool: { kind: "other", name, summary, output? } y un status de running, done, failed o deniedname 128 bytes, summary 1 KiB, output 16 KiB

Un elemento reply, thinking, notice o markdown puede transportar partial: true mientras crece su texto. Escriba el mismo id de nuevo a medida que crezca, como máximo cada 250 ms, y luego una vez más con el texto final y sin partial, antes de que el panel salga de working.

El texto que excede su límite se recorta, y los controles y caracteres invisibles se eliminan. Un lang incorrecto, un href incorrecto, una insignia incorrecta o un progreso incorrecto se convierten en un TypeError o un RangeError, ya que Collie lo descartaría. Un agente duradero no puede anexar eventos ask, ask-closed o state por sí mismo: ask() y state() escriben estos.

Preguntas

pane.ask muestra una tarjeta y se resuelve con la respuesta, y requireApproval consulta sobre una llamada a herramienta en una sola línea.

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) construye la tarjeta a partir de lo que es la llamada, nunca a partir de las palabras del modelo sobre ella. El título es "refund wants to run", la línea de la herramienta es refund(order: "5521", amount: 40), la notificación dice "refund needs a yes", y los botones son Allow y Deny. Devuelve { approved, decidedBy, decidedAt, askId }. Una denegación, un tiempo de espera agotado, una detención y una anulación devuelven approved: false.

opción de requireApprovalqué hacepredeterminado
paneEl panel que realiza la solicitud. RequeridoNinguno
toolCallIdEl id propio de la llamada a la herramienta, el mismo tras un reinicio. Cualquier cadena: si no cumple la regla de id, se adapta de forma segura.Obligatorio
itemIdEl elemento debajo del cual se ubica la tarjetaEl id de la llamada a la herramienta
timeoutMsEl tiempo de que dispone el teléfono. Tras este plazo se deniega la llamada, decidido por timeoutSin límite
signalUn AbortSignal. Abortar deniega la llamada, decidido por programNinguno
labelsEl texto de los dos botones, { allow?, deny? }Permitir y Denegar

callSummary(name, args) y argumentsView(args) son las dos piezas que utiliza: la llamada en una sola línea y los argumentos como pares key: value con cada valor en formato JSON.

pane.ask(input) acepta una de cuatro clases. La promesa se resuelve con la respuesta en el formato de esa clase.

kindlo que muestra la tarjetala respuestalímite
permissionUn botón por opción, cada uno con un effect: allow, allow-always, deny o cancel{ optionId, note? }De 1 a 6 opciones
choiceUn botón por opción. Con multiple: true se seleccionan varias{ optionIds }De 1 a 8 opciones
textUn campo de texto, con un placeholder opcional{ text }maxLength de 1 a 2000, 500 por defecto. El marcador de posición tiene 60 caracteres
formDe 1 a 6 campos, cada uno de clase text, choice o toggle, algunos required{ values }, indexado por el id del campoUn campo de selección tiene de 1 a 8 opciones

Cada clase admite toolCallId, itemId y title (256 bytes). Puede admitir reason (2 KiB), tool, push: { title?, line? } (60 y 120 caracteres, el texto de la notificación) y expiresAt (un Date o una cadena ISO 8601 con zona).

Omita id. El SDK lo deriva con askIdFor(paneId, toolCallId): SHA-256 sobre los dos identificadores, los primeros 32 caracteres hexadecimales. Por tanto, la misma llamada a la herramienta generada de nuevo tras un reinicio recibe el mismo id, y se procesa una respuesta enviada por el teléfono durante el reinicio. Generar un id ya abierto constituye un TypeError.

en el panelqué hace
updateAsk(askId, patch)Modifica in situ una solicitud abierta: title, reason, tool, options, placeholder, maxLength o fields. Su revisión aumenta en uno, de modo que una respuesta al formulario anterior recibe 409 stale y el teléfono solicita una nueva pulsación. Devuelve false si la solicitud no está abierta.
decideAsk(askId, answer?)El agente persistente resolvió la solicitud por sí mismo, fuera del teléfono. Con answer, el ask() en espera se resuelve con ella. Sin este parámetro, se rechaza con AskClosed. Una pulsación posterior en el teléfono recibe 409 decided, y la tarjeta muestra "Decided in the durable agent." Devuelve false si la solicitud no está abierta.
outcomeOf(askId)La primera decisión: { decidedBy, decidedAt, optionId?, effect? }. El panel recuerda las últimas 500. Sin definir para una solicitud no generada u olvidada.

decidedBy es phone, program o timeout. Una solicitud supera su expiresAt y se cierra como decidida por timeout: ask() rechaza con AskClosed, cuyo decidedBy es timeout. La tarjeta muestra el tiempo restante hasta entonces. Una pregunta que agotó el tiempo de espera o se decidió en el agente persistente deja una línea en Chat, como por ejemplo "Timed out before an answer: refund wants to run".

Un signal abortado, pane.close() y un cierre desde el teléfono cierran la solicitud como decidida por program, y ask() rechaza con AskClosed.

Precaución. Una opción allow-always permite el paso de todas las llamadas posteriores tras una única respuesta. Mediante https el token es el único control de acceso, por lo que un agente persistente en ese entorno solo ofrece Permitir y Denegar. createCore con allowAlways: false convierte una opción allow-always en un TypeError. El teléfono no ofrece ningún allow-always en una solicitud cuyo texto fue recortado o limpiado, o que no especifica ninguna herramienta.

Cada acto desde el teléfono lleva un id de solicitud, y el núcleo guarda su recibo: una repetición no ejecuta nada y obtiene la primera respuesta nuevamente con replayed: true. El MemoryReceiptStore predeterminado conserva los RECEIPTS_PER_GROUP más recientes (1000) por panel, y por grupo para iniciadores, cambios de nombre, cierres y reaperturas. Una repetición de un id descartado obtiene 500 receipt-dropped y no ejecuta nada. El almacén desaparece con el proceso.

Para conservar los recibos tras un reinicio, escriba un ReceiptStore con get(requestId) y put(requestId, record, group), y páselo a createCore como receipts. openCollie siempre los conserva en memoria.

Hooks e historial

Un hook es el único lugar con nombre para un acto que envía el teléfono, y un proveedor de historial sirve su propio registro.

hookcuándo se ejecutacómo rechaza
onSend(pane, { text, steer, turnId, requestId })Texto para un panel que no tiene pane.onSendLanzar excepción: 500 internal, un resultado desconocido para el teléfono
onAbort(pane, { turnId, requestId })Detención para un panel que no tiene pane.onAbortLanzar excepción, como arriba
onAction(pane, { actionId, turnId?, requestId })Un toque en la barra de herramientas en un panel que no tiene pane.onActionDevolver false: 422 action-refused
onRename({ kind, id, title }, requestId)Un nuevo título para un espacio de trabajo o una pestañaDevolver false: 422 rename-refused
onClose({ kind, id, paneIds }, requestId)El teléfono cierra un panel, una pestaña o un espacio de trabajoDevolver false: 422 close-refused
onReopen({ id, paneId? }, requestId)El teléfono reabre una conversación cerradaDevolver false: 422 reopen-refused

Un hook solo se ejecuta cuando su cap está activo y su id de solicitud es nuevo. Un rechazo no almacena nada, por lo que el mismo id de solicitud puede intentar de nuevo. Los controladores por panel tienen prioridad sobre un hook. Un panel sin ninguno de los dos responde 409 not-supported a un envío, una detención o un toque.

El SDK aplica un acto aceptado por sí mismo. Un cambio de nombre establece el título. Un cierre elimina el destino y todo lo que contiene, y cierra sus solicitudes abiertas como detenidas. Una reapertura sin hook restablece un panel que este proceso cerró; una conversación cerrada antes de un reinicio necesita onReopen. El diseño se vuelve a crear en cada inicio, por lo que un agente persistente que requiera que un título o un cierre sobreviva al proceso lo almacena en su hook.

collie.history(provider) sirve cada conversación, abierta y cerrada, desde el propio almacén del agente persistente. Activa el cap history cuando se omite caps o nombra a history: true.

HistoryProviderdevuelve
list(after, limit){ items, next? }: filas de conversaciones, las más recientes primero, como máximo limit (100)
items(id, after, limit){ items, next? }: los elementos de la conversación, los más antiguos primero, cada uno en su versión más reciente, como máximo limit (1000). undefined para un id que no conoce

Una fila es { id, title, subtitle?, workspaceId?, tabId?, startedAt, endedAt?, state, items }, con state open o closed y items el recuento. Un cursor (after, next) es su propia cadena, de 1 a 512 bytes de ASCII imprimible sin espacios. next ausente finaliza la lista.

Una vez configurado un proveedor, el sessionId de cada panel es su id de panel, y el historial sirve la conversación del panel bajo este. Pase sessionId a tab.pane() para nombrar otro id, o null cuando no pueda mantenerse igual tras un reinicio.

tailLimit no es historial. Es el registro final sin procesar que conserva cada panel para las lecturas de eventos de Collie, 500 eventos por defecto. Un lector que se haya quedado atrás obtiene en su lugar la vista actual completa del panel, como máximo los 2000 elementos más recientes.

Caps

Un cap indica que el agente persistente puede hacer una cosa, y el teléfono dibuja un control solo para un cap que el agente persistente declaró.

límitelo que admite el agente persistente
asksFormula preguntas y admite respuestas
startersEnumera iniciadores y ejecuta uno desde la página Nuevo
sendAdmite texto desde el teléfono
steerAdmite texto en un turno en ejecución. Requiere send
abortDetiene un turno en ejecución
renameAcepta un nuevo título para un espacio de trabajo o una pestaña
closeCierra un panel, una pestaña o un espacio de trabajo
actionsLista los botones de la barra en un panel y ejecuta uno
historySirve sus conversaciones, abiertas y cerradas
reopenMuestra de nuevo una conversación cerrada

Si se omite, caps activa todo lo que el SDK puede hacer, y history una vez que history() tenga un proveedor. Si se proporciona, es la lista completa: una capacidad que no mencione está desactivada, por lo que { asks: true } declara únicamente solicitudes. Para desactivar una y mantener el resto, propague ALL_CAPS: { ...ALL_CAPS, steer: false }. Una ruta cuya capacidad esté desactivada responde 409 not-supported. terminal siempre es false.

Funciones auxiliares y constantes

La importación raíz también exporta las partes que componen openCollie y las reglas que aplica.

exportqué es
createCore(options)El núcleo sin servidor. Acepta las opciones de openCollie excepto socket y callerCheck, además de receipts y allowAlways. Devuelve epoch, workspace, starters, history, ready, isReady y handle(request)
handleEl protocolo en una sola función: una Request web de entrada y una Response de salida. core.handle(request) es la vía de entrada habitual
wireListener(core)core.handle como agente de escucha de peticiones node:http, con drained() para un cierre limpio
hello, versionLineLa respuesta de bienvenida y la única línea que un agente duradero escribe para un rechazo de versión
mintId()Un nuevo identificador aleatorio, 128 bits como 32 caracteres hexadecimales
askIdFor(paneId, toolCallId)El identificador de solicitud derivado
AskClosedEl error con el que ask() rechaza cuando no hubo respuesta. Contiene by y decidedBy
idOk(id), assertId(id, what), safeId(raw)La regla de identificadores: una comprobación, una comprobación que lanza una excepción y un identificador seguro generado a partir de cualquier cadena, siempre el mismo
cursorOk(cursor)La regla del cursor de historial
cut(text, max, multiline?)Limpia una cadena y la recorta a max bytes, con … al final
hrefOf, langOf, badgeOf, progressOfUn destino de enlace, un lenguaje de código, una insignia y un progreso, validados como los valida el panel
subtitleOf, pushTextOf, renameTitleOfUn subtítulo, las palabras clave de una solicitud y el título de un cambio de nombre, limpios y recortados
CAPS, LIMITSCada límite por campo en bytes y cada límite por lista
ACTION_LABEL_MAX, BADGE_TEXT_MAX, BADGE_COUNT_MAX16, 12 y 9999
SUBTITLE_MAX, LINK_LABEL_MAX, RENAME_TITLE_MAX120 caracteres cada uno
PROGRESS_STEPS_MAX, PROGRESS_LABEL_MAX12 pasos, 60 caracteres
PUSH_TITLE_MAX, PUSH_LINE_MAX, PLACEHOLDER_MAX60, 120 y 60 caracteres
ANSWER_TEXT_MAX, ANSWER_TEXT_DEFAULT, ANSWER_TEXT_BYTES2000 y 500 caracteres, y 8000 bytes
ALL_CAPS, PROTOCOL_RANGE, SOCKET_ENVTodas las capacidades activadas, las versiones del protocolo que admite el SDK y el nombre COLLIE_DURABLE_SOCKET
MemoryReceiptStore, RECEIPTS_PER_GROUPEl almacén de recibos predeterminado, y su límite de 1000 por grupo

Cada tipo en el cable y cada carga útil de hook también se exportan, desde src/core/types.ts.

Los helpers de Pi

./pi convierte una conversación de Pi Durable en un panel, una llamada a herramienta riesgosa en una tarjeta y el almacén de Pi en historial.

exportqué hace
showConversation(loc, harness, conversation, o)Muestra una conversación como un panel, primero el historial y luego los eventos en vivo. Send va a submit de Pi con el id de solicitud, y Stop a su cancelación. Es seguro llamarlo dos veces
PaneRegistryQué panel muestra qué conversación. Después de reiniciar, reRaised(risky) espera hasta que cada llamada riesgosa sin resultado haya preguntado de nuevo, por lo que ready() viene después de las preguntas
riskGuard({ panes, risky, words?, timeoutMs?, onTimeout? })Una extensión de Pi cuyo hook beforeTool convierte una llamada a una herramienta en risky en una tarjeta de Permitir y Denegar. Una llamada denegada se bloquea. Con timeoutMs, la tarjeta caduca, una llamada que nadie respondió se bloquea y onTimeout(tool, title) permite que el agente duradero lo registre
askTools({ panes, words, timeoutMs?, onTimeout? })Las dos herramientas de consulta del centro de soporte: ask_queue, una opción, y ask_customer, una consulta de texto. Con timeoutMs, una consulta sin respuesta caduca y la herramienta devuelve "timed out"
spawnHelperTool(o)La herramienta spawn_helper: una conversación secundaria que se muestra como un panel nuevo y devuelve la respuesta del asistente
piHistory({ harness, panes, describe })Un HistoryProvider que lee cada entrada de cada conversación de Pi
firstMessageOf(conversation)El texto del primer mensaje de una conversación, para nombrar su panel
paneIdOf(id), conversationOfPaneId(paneId)El id de panel de una conversación de Pi, conv-<id>, y viceversa
summaryOf(args, name?)Los argumentos de una llamada a herramienta en palabras, como máximo 200 caracteres
MapperEntradas de Pi y eventos del agente como elementos. Una respuesta que sigue creciendo conserva un id de elemento
PARTIAL_MS, RE_RAISE_MS250 ms entre dos escrituras de una respuesta en crecimiento, y los 5000 ms que reRaised espera como máximo
ESCALATEDVocabulario de ejemplo: el aviso del centro de soporte para el botón Escalate que showConversation añade con escalate: true
ASKING_TOOLSVocabulario de ejemplo: los nombres de las dos herramientas de consulta del centro de soporte
Submit, ReplyExtrasLos tipos de un submit personalizado, y de los elementos que un agente duradero añade bajo una respuesta finalizada

Las palabras que muestra una tarjeta llegan como opciones, por lo que ./pi no contiene texto del ejemplo salvo esas dos constantes. Está escrito para Pi Durable 1.1.0. El centro de soporte en examples/durable-member/ reúne todas las partes.

Versiones

El paquete tiene su propia versión, aparte de la de Collie, e indica la versión de cable con la que se comunica.

hoysignificado
SDK_VERSION0.1.0La versión del paquete. Hasta que el paquete deje la etiqueta de distribución experimental, una versión menor puede cambiar la API
WIRE_VERSION1La versión de cable duradero con la que se comunica el paquete

Collie utiliza una versión de cable y acepta la anterior durante una versión menor tras publicar una nueva. Si un Collie no es compatible con ninguna de sus versiones, el núcleo escribe una línea mediante warn, una vez por versión, por ejemplo collie: Collie speaks wire v2, this durable agent speaks v1. Update the agent's SDK, or Collie. El teléfono muestra la discrepancia en el inicio del agente duradero, con las palabras de Collie. Actualice el extremo desactualizado.

El paquete se publica bajo la etiqueta de distribución de npm experimental, nunca latest. Si el cable duradero pasa a la salida, el paquete queda obsoleto (ADR 0105).

Editar esta página en GitHub

The rest of the documentation