Aller au contenu
ColliePWA

09/Documentation

Le SDK durable (expérimental)

Le paquet npm @colliepwa/durable-sdk, partie par partie : ses points d'entrée et ses environnements d'exécution, openCollie, les méthodes de panneau, les quatre types de questions et requireApproval, les hooks, l'historique, les capacités, les utilitaires, le connecteur Pi et les versions

Expérimental. Le paquet, son API et le protocole réseau utilisé peuvent changer, ou la fonctionnalité peut être supprimée, dans une version mineure ultérieure. Versions explique ce que cela implique pour votre agent durable.

@colliepwa/durable-sdk est le paquet npm qu'un agent durable utilise pour s'afficher sur votre téléphone via Collie. Cette page détaille chacun de ses composants. Agents durables contient le guide de démarrage rapide ainsi que la configuration côté Collie, et Le câble durable explique ce qui circule entre les deux.

Installation et points d'entrée

Une seule installation fournit cinq points d'entrée : l'import racine pour la plupart des agents durables, et quatre autres pour des besoins plus spécifiques.

npm install @colliepwa/durable-sdk@experimental
# or
bun add @colliepwa/durable-sdk@experimental
importce qu'elle contient
@colliepwa/durable-sdkopenCollie et l'ensemble de l'API. Sur Bun, il gère la socket avec le serveur Bun, ailleurs avec le serveur node:http
@colliepwa/durable-sdk/bunLa même API, toujours avec le serveur Bun
@colliepwa/durable-sdk/nodeLa même API, toujours avec le serveur node:http, plus NO_DESCENDANT_CHECK, la ligne écrite au démarrage
@colliepwa/durable-sdk/coreLa disposition et la connexion en une seule fonction, handle(request), pour un agent durable qui fournit son propre transport. Aucun import d'exécution, il s'exécute donc partout où tourne un Request web
@colliepwa/durable-sdk/piLe liant pour un agent durable construit sur Pi Durable (Les assistants Pi)

Le paquet requiert Node 22.19 ou supérieur, ou Bun 1.4 ou supérieur, et ne possède aucune dépendance d'exécution. ./pi requiert @earendil-works/pi-durable, @earendil-works/pi-ai et @earendil-works/chord, version 1.1 ou supérieure et inférieure à 2. Le point d'entrée est testé avec Pi Durable 1.1.0 et 1.2.0. Les trois sont des peer dependencies optionnelles : un agent durable qui n'importe jamais ./pi n'en installe aucune.

L'environnement d'exécution détermine si l'agent durable peut identifier qui répond. La vérification de descendance refuse une action provenant de l'agent durable lui-même ou d'un processus qu'il a lancé, avec un code 403 caller-refused. Elle couvre answer, send, stop, action, rename, close, reopen et starter. Les lectures restent ouvertes.

environnement d'exécutionla vérification de descendancece que vous définissez
Bun sur LinuxActivé par défaut. Bun lit l'identifiant de processus de l'appelant sur le socketRien. callerCheck: "off" le désactive
Bun sur macOS, ou tout autre système sauf LinuxImpossible à exécuter. Le démarrage échoue avec une erreur qui nomme callerCheckcallerCheck: "off"
Node, tout systèmeImpossible à exécuter : Node ne peut pas lire l'appelant d'un socket. L'agent durable écrit au démarrage une ligne qui l'indiqueRien. callerCheck n'est pas lu

Sans cette vérification, n'importe quel processus de votre utilisateur peut répondre à une carte, y compris un outil exécuté par l'agent. Exécutez les outils de l'agent dans un bac à sable qui ne peut pas atteindre le socket. Le socket nécessite un système gérant les propriétaires de fichiers, donc sur Windows, openCollie s'arrête au démarrage. Un agent durable y sert plutôt ./core derrière TLS avec un jeton (Deux façons de joindre un agent durable).

Ouvrir une connexion

openCollie crée le socket privé, et le handle retourné définit la disposition affichée par le téléphone.

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

Sans l'option socket, le chemin provient de COLLIE_DURABLE_SOCKET, la variable que Collie lit également.

optiondescriptionvaleur par défaut
socketLe chemin du socket : absolu, 103 octets au maximum. Son dossier est créé avec le mode 0700, ou doit déjà vous appartenir avec le mode 0700La variable COLLIE_DURABLE_SOCKET. Si aucune des deux n'est définie : le démarrage échoue
hostNameLe nom propre de l'agent durable dans son hello, tronqué à 64 octets. RequisAucun
tailLimitNombre d'événements bruts conservés par chaque panneau pour les lectures de Collie500, au maximum 1000
capsCe que l'agent durable déclare pouvoir faire (Capacités)Tout ce que le SDK peut faire
callerCheckdescendant ou off. Lu sur Bun uniquementdescendant
hooksUn emplacement nommé pour chaque acte envoyé par le téléphone (Hooks et historique)Aucun
warnOù le SDK écrit ses notes d'une ligne, par exemple à propos d'un Collie utilisant une autre version de protocoleconsole.warn
onRenameObsolète. L'ancien nom de hooks.onRename, conservé pendant une version, sans l'ID de requêteAucun

Deux options supplémentaires existent uniquement sur createCore, pas sur openCollie : receipts et allowAlways (Questions).

sur le handlece que c'est
addressLe chemin de socket sur lequel il écoute
epochNouveau et aléatoire à chaque démarrage, 128 bits
coreLe cœur derrière le socket. Un test, ou un second transport, appelle directement core.handle
workspace(id, { title, cwd? })Un workspace, créé une seule fois par ID. Son tab(id, { title }) donne un onglet, et le pane(id, options) de l'onglet donne un volet
starters(list)Ce que le téléphone peut lancer depuis la page New, 50 au maximum. Chacun correspond à { id, label, run }, et run résout en { paneId } du volet affiché
history(provider)Sert l'enregistrement propre à l'agent durable de ses conversations (Hooks et historique)
ready()À appeler une fois que chaque volet est affiché, et après un redémarrage, une fois que chaque ask ouverte est relancée. D'ici là, chaque route sauf hello répond 503 starting
close()Arrête le serveur. Les réponses déjà en cours d'envoi partent encore, pendant 2 s au maximum, puis le fichier de socket disparaît

close() laisse volontairement ouvertes les asks ouvertes : un arrêt n'est pas une réponse, et l'agent durable décide du sort du travail en attente.

tab.pane(id, { title, harness, cwd?, sessionId? }) renvoie le volet possédant cet ID s'il existe, afin qu'un agent durable puisse afficher deux fois une conversation sans second volet. Les titres sont coupés à 256 octets et harness à 64. cwd est un chemin absolu, sinon il est omis.

Chaque ID suit la règle des ID : 1 à 128 octets, aucun caractère de contrôle, aucun espace, et aucun parmi /, ? ou #. Un ID invalide donne un TypeError. Un ID de workspace ou d'onglet ne peut pas contenir :, car le protocole nomme un onglet <workspace>:<tab>.

Volets

Un volet représente une conversation, et ses méthodes définissent ce que le téléphone affiche pour celle-ci.

méthodece que le téléphone affichelimite
state(s)working, waiting ou idle. Une modification de working démarre un nouveau tourTant qu'une ask reste ouverte, le volet indique waiting
event(e)Éléments du chat : événements item, remove, settled, reset et syncedVoir le tableau des éléments ci-dessous
subtitle(text)Une ligne sous le titre. null l'efface120 caractères
badge(value){ count } ou { text } à côté du titre. null l'effaceUn décompte de 0 à 9999, un texte de 12 caractères
progress(value){ kind: "steps", steps } ou { kind: "percent", value, label? }, affiché pendant que le volet travaille ou attend. null l'efface12 étapes, chaque libellé de 60 caractères, une valeur de 0 à 100
actions(list)Boutons dans la section de l'agent durable du bandeau : { id, label, icon?, busy?, disabled? }. null les efface4 boutons, un libellé de 16 caractères
onAction(fn)Exécute un appui sur l'un de ces boutons. Renvoyez false pour le refuserLe téléphone n'envoie aucun appui pour un bouton busy ou disabled
onSend(fn)Prend le texte du téléphone, sous la forme fn(text, { steer, requestId })32 Kio de texte
onAbort(fn)Prend Stop, sous la forme fn({ requestId })Aucun
ask(input, { signal? })Une carte de question (Questions)50 demandes ouvertes par panneau
updateAsk, decideAsk, outcomeOfModifier, trancher ou relire une demande (Questions)Aucun
close()Retire le panneau de la disposition. Ses demandes ouvertes se ferment avec l'état arrêtéAucun

Un panneau possède également quatre champs en lecture seule : id, sessionId, turnId (le tour en cours, ou le dernier) et openAsks. Le champ icon d'une action est l'un des suivants : play, pause, check, x, refresh, archive, flag, star, send, note, search et more. Tout autre nom n'affiche aucune icône.

Un événement item transporte un élément avec un id et un ts facultatif. Un élément avec un identifiant connu remplace le précédent sur place.

typece qu'elle contientlimite
userUne ligne envoyée par la personne. requestId nomme l'envoi d'origine, afin que le téléphone remplace sa propre ligne par celle-ci64 Kio de texte
reply, thinking, noticeLes mots de l'agent64 Kio de texte
markdownTexte que le téléphone affiche en markdown : titres, listes, mise en valeur, fragments de code et liens32 Kio de texte
codeUn bloc de code, avec lang tel que ts32 Kio de texte. lang contient de 1 à 24 lettres, chiffres ou _ + # . -
linkUn href et un label facultatifhref correspond à https:// uniquement, 2048 caractères au maximum. label fait 120 caractères
toolUn appel d'outil : tool: { kind: "other", name, summary, output? } et un status parmi running, done, failed ou deniedname 128 octets, summary 1 Kio, output 16 Kio

Un élément reply, thinking, notice ou markdown peut porter partial: true pendant que son texte s'étoffe. Réécrivez le même identifiant au fur et à mesure qu'il grandit, au maximum toutes les 250 ms, puis une dernière fois avec le texte final et sans partial, avant que le panneau ne quitte working.

Le texte dépassant sa limite est tronqué, et les caractères de contrôle et invisibles sont supprimés. Un mauvais lang, un mauvais href, un mauvais badge ou une mauvaise progression devient un TypeError ou un RangeError à la place, car Collie l'abandonnerait. Un agent durable ne peut pas ajouter lui-même d'événements ask, ask-closed ou state : ask() et state() les écrivent.

Questions

pane.ask affiche une carte et se résout avec la réponse, et requireApproval pose une question sur un appel d'outil en une ligne.

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) construit la carte à partir de la nature de l'appel, jamais à partir des propos du modèle à son sujet. Le titre est "refund wants to run", la ligne d'outil est refund(order: "5521", amount: 40), la notification push indique "refund needs a yes", et les boutons sont Allow et Deny. Il renvoie { approved, decidedBy, decidedAt, askId }. Un refus, un délai d'attente dépassé, un arrêt et une interruption renvoient tous approved: false.

option de requireApprovaldescriptionvaleur par défaut
paneLe panneau demandeur. RequisAucun
toolCallIdL'identifiant propre de l'appel d'outil, conservé après un redémarrage. N'importe quelle chaîne : une valeur qui enfreint la règle d'identifiant est sécuriséeRequis
itemIdL'élément sous lequel se trouve la carteL'identifiant de l'appel d'outil
timeoutMsLe délai accordé au téléphone. Au-delà, l'appel est refusé, décision prise par timeoutAucune limite
signalUn AbortSignal. L'interruption refuse l'appel, décision prise par programAucun
labelsLe texte des deux boutons, { allow?, deny? }Autoriser et Refuser

callSummary(name, args) et argumentsView(args) sont les deux éléments utilisés : l'appel sur une seule ligne, et les arguments sous forme de paires key: value avec chaque valeur en JSON.

pane.ask(input) accepte l'un des quatre types. La promesse est résolue avec la réponse sous la forme de ce type.

kindce que la carte affichela réponselimite
permissionUn bouton par option, chacun avec un effect : allow, allow-always, deny ou cancel{ optionId, note? }1 à 6 options
choiceUn bouton par option. Avec multiple: true, la personne en sélectionne plusieurs{ optionIds }1 à 8 options
textUn champ texte, avec un placeholder facultatif{ text }maxLength de 1 à 2000, 500 par défaut. Le texte indicatif fait 60 caractères
form1 à 6 champs, chacun de type text, choice ou toggle, certains required{ values }, indexé par l'identifiant du champUn champ de sélection comporte 1 à 8 options

Chaque type accepte toolCallId, itemId et title (256 octets). Il peut accepter reason (2 Kio), tool, push: { title?, line? } (60 et 120 caractères, le texte de la notification) et expiresAt (un Date ou une chaîne ISO 8601 avec fuseau horaire).

Omettez id. Le SDK le dérive avec askIdFor(paneId, toolCallId) : SHA-256 sur les deux identifiants, les 32 premiers caractères hexadécimaux. Le même appel d'outil déclenché à nouveau après un redémarrage reçoit ainsi le même identifiant, et une réponse envoyée par le téléphone pendant le redémarrage aboutit. Déclencher un identifiant déjà ouvert constitue un TypeError.

sur le panneaudescription
updateAsk(askId, patch)Modifie une demande ouverte sur place : title, reason, tool, options, placeholder, maxLength ou fields. Sa révision augmente de un, donc une réponse à l'ancien formulaire reçoit 409 stale et le téléphone réclame une nouvelle saisie. Vaut false quand la demande n'est pas ouverte
decideAsk(askId, answer?)L'agent durable a tranché la demande lui-même, ailleurs que sur le téléphone. Avec answer, l'attente de ask() est résolue avec cette valeur. Sans, elle est rejetée avec AskClosed. Une saisie ultérieure sur le téléphone reçoit 409 decided, et la carte affiche "Decided in the durable agent." Vaut false quand la demande n'est pas ouverte
outcomeOf(askId)La première décision : { decidedBy, decidedAt, optionId?, effect? }. Le panneau conserve ses 500 dernières décisions. Non défini pour une demande qu'il n'a jamais déclenchée ou qu'il a oubliée

decidedBy vaut phone, program ou timeout. Une demande dépasse son expiresAt et se ferme avec une décision prise par timeout : ask() est rejeté avec AskClosed, dont decidedBy est timeout. La carte affiche le temps restant jusque-là. Une question ayant expiré ou ayant été tranchée dans l'agent durable laisse une seule ligne dans Chat, par exemple "Timed out before an answer: refund wants to run".

Un signal interrompu, pane.close() et une fermeture depuis le téléphone ferment la demande avec une décision prise par program, et ask() est rejeté avec AskClosed.

Attention. Une option allow-always laisse passer tous les appels ultérieurs après une seule réponse. En https, le jeton constitue l'unique barrière, donc un agent durable n'y propose que Autoriser et Refuser. createCore avec allowAlways: false transforme une option allow-always en TypeError. Le téléphone ne propose aucune option allow-always sur une demande dont le texte a été tronqué ou nettoyé, ou qui ne nomme aucun outil.

Chaque action provenant du téléphone comporte un identifiant de requête, et le cœur en conserve l'accusé de réception : une répétition n'exécute rien et reçoit à nouveau la première réponse avec replayed: true. Le MemoryReceiptStore par défaut conserve les RECEIPTS_PER_GROUP plus récents (1000) par volet, ainsi que par groupe pour les démarrages, renommages, fermetures et réouvertures. Une répétition d'un identifiant abandonné reçoit 500 receipt-dropped et n'exécute rien. Le stockage disparaît avec le processus.

Pour conserver les accusés de réception après un redémarrage, écrivez un ReceiptStore avec get(requestId) et put(requestId, record, group), et transmettez-le à createCore sous le nom de receipts. openCollie les conserve toujours en mémoire.

Hooks et historique

Un hook est l'unique emplacement nommé pour une action envoyée par le téléphone, et un fournisseur d'historique sert votre propre registre.

hookquand il s'exécutecomment il refuse
onSend(pane, { text, steer, turnId, requestId })Texte pour un volet qui n'a pas de pane.onSendThrow : 500 internal, un résultat inconnu pour le téléphone
onAbort(pane, { turnId, requestId })Arrêt pour un volet qui n'a pas de pane.onAbortThrow, comme ci-dessus
onAction(pane, { actionId, turnId?, requestId })Un appui sur la ceinture pour un volet qui n'a pas de pane.onActionRenvoie false : 422 action-refused
onRename({ kind, id, title }, requestId)Un nouveau titre pour un espace de travail ou un ongletRenvoie false : 422 rename-refused
onClose({ kind, id, paneIds }, requestId)Le téléphone ferme un volet, un onglet ou un espace de travailRenvoie false : 422 close-refused
onReopen({ id, paneId? }, requestId)Le téléphone rouvre une conversation ferméeRenvoie false : 422 reopen-refused

Un hook ne s'exécute que lorsque sa capacité est activée et que son identifiant de requête est nouveau. Un refus ne stocke rien, de sorte que le même identifiant de requête peut faire une nouvelle tentative. Les gestionnaires par volet prévalent sur un hook. Un volet ne possédant ni l'un ni l'autre répond 409 not-supported à un envoi, un arrêt ou un appui.

Le SDK applique lui-même une action acceptée. Un renommage définit le titre. Une fermeture supprime la cible et tout son contenu, et ferme leurs demandes en cours comme interrompues. Une réouverture sans hook rétablit un volet fermé par ce processus ; une conversation fermée avant un redémarrage nécessite onReopen. La disposition est recréée à chaque démarrage, donc un agent durable souhaitant qu'un titre ou une fermeture survive au processus le stocke dans son hook.

collie.history(provider) sert chaque conversation, ouverte et fermée, depuis le stockage propre de l'agent durable. Il active la capacité history lorsque caps est omis ou nomme history: true.

HistoryProviderrenvoie
list(after, limit){ items, next? } : lignes de conversation, les plus récentes en premier, au maximum limit (100)
items(id, after, limit){ items, next? } : les éléments de la conversation, les plus anciens en premier, chacun dans sa dernière version, au maximum limit (1000). undefined pour un identifiant qu'il ne connaît pas

Une ligne est { id, title, subtitle?, workspaceId?, tabId?, startedAt, endedAt?, state, items }, avec state open ou closed et items le décompte. Un curseur (after, next) est votre propre chaîne, de 1 à 512 octets d'ASCII imprimable sans espace. next absent termine la liste.

Dès qu'un fournisseur est défini, le sessionId de chaque volet correspond à son identifiant de volet, et l'historique sert la conversation du volet sous cet identifiant. Transmettez sessionId à tab.pane() pour désigner un autre identifiant, ou null lorsqu'il ne peut pas rester le même après un redémarrage.

tailLimit n'est pas un historique. C'est le flux brut de fin que chaque volet conserve pour les lectures d'événements de Collie, 500 événements par défaut. Un lecteur ayant pris du retard reçoit à la place l'intégralité de la vue actuelle du volet, au maximum les 2000 éléments les plus récents.

Capacités

Une capacité indique que l'agent durable peut effectuer une action, et le téléphone n'affiche un contrôle que pour une capacité déclarée par l'agent durable.

plafondce que l'agent durable accepte
asksPose des questions et prend des réponses
startersListe les démarreurs et en exécute un depuis la page Nouveau
sendPrend le texte envoyé par le téléphone
steerPrend du texte dans un tour en cours. Nécessite send
abortArrête un tour en cours
renamePrend un nouveau titre pour un espace de travail ou un onglet
closeFerme un volet, un onglet ou un espace de travail
actionsListe les boutons du bandeau sur un volet et en exécute un
historySert ses conversations, ouvertes comme fermées
reopenAffiche à nouveau une conversation fermée

Omis, caps active tout ce que le SDK sait faire, ainsi que history dès que history() a un fournisseur. Défini, il s'agit de la liste complète : une capacité non mentionnée est désactivée, ainsi { asks: true } déclare uniquement les asks. Pour en désactiver une et conserver le reste, décomposez ALL_CAPS : { ...ALL_CAPS, steer: false }. Une route dont la capacité est désactivée renvoie 409 not-supported. terminal est toujours faux.

Utilitaires et constantes

L'import racine exporte aussi les éléments constituant openCollie, ainsi que les règles qu'il applique.

exportce que c'est
createCore(options)Le cœur sans serveur. Il prend les options de openCollie sauf socket et callerCheck, plus receipts et allowAlways. Il renvoie epoch, workspace, starters, history, ready, isReady et handle(request)
handleLe protocole sous forme de fonction unique, un Request web en entrée et un Response en sortie. core.handle(request) est le point d'entrée habituel
wireListener(core)core.handle en tant qu'écouteur de requêtes node:http, avec drained() pour une fermeture propre
hello, versionLineLa réponse hello, et l'unique ligne qu'un agent persistant écrit en cas de refus de version
mintId()Un nouvel identifiant aléatoire, 128 bits sous forme de 32 caractères hexadécimaux
askIdFor(paneId, toolCallId)L'identifiant d'ask dérivé
AskClosedL'erreur renvoyée par le rejet de ask() en l'absence de réponse. Elle contient by et decidedBy
idOk(id), assertId(id, what), safeId(raw)La règle d'identifiant : une vérification, une vérification avec levée d'erreur, et un identifiant sûr généré à partir de toute chaîne, identique à chaque fois
cursorOk(cursor)La règle du curseur d'historique
cut(text, max, multiline?)Nettoyer une chaîne et la tronquer à max octets, avec … à la fin
hrefOf, langOf, badgeOf, progressOfUne cible de lien, un langage de code, un badge et une progression, vérifiés selon les règles du volet
subtitleOf, pushTextOf, renameTitleOfUn sous-titre, les mots d'action d'un ask et un titre renommé, nettoyés et tronqués
CAPS, LIMITSChaque limite par champ en octets, et chaque limite par liste
ACTION_LABEL_MAX, BADGE_TEXT_MAX, BADGE_COUNT_MAX16, 12 et 9999
SUBTITLE_MAX, LINK_LABEL_MAX, RENAME_TITLE_MAX120 caractères chacun
PROGRESS_STEPS_MAX, PROGRESS_LABEL_MAX12 étapes, 60 caractères
PUSH_TITLE_MAX, PUSH_LINE_MAX, PLACEHOLDER_MAX60, 120 et 60 caractères
ANSWER_TEXT_MAX, ANSWER_TEXT_DEFAULT, ANSWER_TEXT_BYTES2000 et 500 caractères, et 8000 octets
ALL_CAPS, PROTOCOL_RANGE, SOCKET_ENVToutes les capacités activées, les versions de protocole prises en charge par le SDK, et le nom COLLIE_DURABLE_SOCKET
MemoryReceiptStore, RECEIPTS_PER_GROUPLe magasin de reçus par défaut, et ses 1000 par groupe

Chaque type sur le réseau et chaque payload de hook est également exporté, depuis src/core/types.ts.

Les assistants Pi

./pi transforme une conversation Pi Durable en panneau, un appel d'outil risqué en carte, et le magasin de Pi en historique.

exportdescription
showConversation(loc, harness, conversation, o)Affiche une conversation sous forme de panneau, d'abord l'historique, puis les événements en direct. Send va vers le submit de Pi avec l'identifiant de requête, et Stop vers son abort. Peut être appelé deux fois sans risque
PaneRegistryQuel panneau affiche quelle conversation. Après un redémarrage, reRaised(risky) attend que chaque appel risqué sans résultat ait redemandé, de sorte que ready() arrive après les demandes
riskGuard({ panes, risky, words?, timeoutMs?, onTimeout? })Une extension Pi dont le hook beforeTool transforme un appel à un outil dans risky en carte Allow et Deny. Un appel refusé est bloqué. Avec timeoutMs, la carte expire, un appel auquel personne n'a répondu est bloqué, et onTimeout(tool, title) permet à l'agent durable de le consigner
askTools({ panes, words, timeoutMs?, onTimeout? })Les deux outils d'interrogation du support desk: ask_queue, un choix, et ask_customer, une demande de texte. Avec timeoutMs, une demande sans réponse expire et l'outil renvoie "timed out"
spawnHelperTool(o)L'outil spawn_helper: une conversation enfant affichée sous forme de nouveau panneau, qui renvoie la réponse de l'assistant
piHistory({ harness, panes, describe })Un HistoryProvider qui lit chaque entrée de chaque conversation Pi
firstMessageOf(conversation)Le texte du premier message d'une conversation, pour nommer son panneau
paneIdOf(id), conversationOfPaneId(paneId)L'identifiant de panneau d'une conversation Pi, conv-<id>, et inversement
summaryOf(args, name?)Les arguments d'un appel d'outil en texte clair, 200 caractères au maximum
MapperLes entrées Pi et les événements d'agent sous forme d'éléments. Une réponse en cours garde un identifiant d'élément unique
PARTIAL_MS, RE_RAISE_MS250 ms entre deux écritures d'une réponse en cours, et les 5000 ms que reRaised attend au maximum
ESCALATEDVocabulaire d'exemple: la notification du support desk pour le bouton Escalate que showConversation ajoute avec escalate: true
ASKING_TOOLSVocabulaire d'exemple: les noms des deux outils d'interrogation du support desk
Submit, ReplyExtrasLes types d'un submit personnalisé, et des éléments qu'un agent durable ajoute sous une réponse terminée

Le texte affiché par une carte provient des options, ainsi ./pi ne contient aucun texte de l'exemple en dehors de ces deux constantes. Il est écrit pour Pi Durable 1.1.0. Le support desk dans examples/durable-member/ assemble chaque composant.

Versions

Le package possède sa propre version, distincte de celle de Collie, et indique la version du protocole réseau qu'il gère.

aujourd'huice que cela signifie
SDK_VERSION0.1.0La version du package. Tant que le package reste sous le dist-tag experimental, une version mineure peut modifier l'API
WIRE_VERSION1La version du protocole réseau durable gérée par le package

Collie gère une version du protocole réseau et accepte la précédente pendant une version mineure après la sortie d'une nouvelle version. Quand un Collie ne gère aucune de vos versions, le cœur écrit une ligne via warn, une fois par version, par exemple collie: Collie speaks wire v2, this durable agent speaks v1. Update the agent's SDK, or Collie. Le téléphone signale l'incompatibilité sur l'écran d'accueil de l'agent durable, avec les propres termes de Collie. Mettez à jour le composant le plus ancien.

Le package est publié sous le dist-tag npm experimental, jamais latest. Si le protocole réseau durable passe à la sortie, le package devient obsolète (ADR 0105).

Modifier cette page sur GitHub

The rest of the documentation