Direkt zum Inhalt
ColliePWA

09/Documentation

Das SDK für persistente Agenten (experimentell)

Das npm-Paket @colliepwa/durable-sdk im Detail: Einstiegspunkte und Laufzeitumgebungen, openCollie, die Bereichsmethoden, die vier Fragetypen und requireApproval, Hooks, Verlauf, Berechtigungen, die Hilfsfunktionen, die Pi-Anbindung und die Versionen

Experimentell. Das Paket, seine API und das Protokoll, das es spricht, können sich in einer späteren Minor-Version ändern, oder die Funktion kann entfernt werden. Versionen beschreibt, was das für Ihren Durable Agent bedeutet.

@colliepwa/durable-sdk ist das npm-Paket, das ein Durable Agent nutzt, um sich über Collie auf Ihrem Smartphone anzuzeigen. Diese Seite führt alle Bestandteile auf. Persistente Agenten enthält die Schnellanleitung sowie die Einrichtung auf Collie-Seite, und Das Durable-Wire erklärt die Übertragung zwischen beiden.

Installation und Einstiegspunkte

Eine Installation liefert fünf Einstiegspunkte: den Root-Import für die meisten Durable Agents und vier für spezifischere Anforderungen.

npm install @colliepwa/durable-sdk@experimental
# or
bun add @colliepwa/durable-sdk@experimental
Importwas er enthält
@colliepwa/durable-sdkopenCollie und die gesamte API. Unter Bun stellt es den Socket mit dem Bun-Server bereit, andernorts mit dem node:http-Server
@colliepwa/durable-sdk/bunDieselbe API, immer mit dem Bun-Server
@colliepwa/durable-sdk/nodeDieselbe API, immer mit dem node:http-Server, plus NO_DESCENDANT_CHECK, die Zeile, die es beim Start schreibt
@colliepwa/durable-sdk/coreDas Layout und die Leitung als eine Funktion, handle(request), für einen langlebigen Agenten mit eigenem Transport. Kein Laufzeit-Import, läuft also überall dort, wo ein Web-Request läuft
@colliepwa/durable-sdk/piDer Verbindungscode für einen langlebigen Agenten auf Basis von Pi Durable (Die Pi-Hilfsfunktionen)

Das Paket erfordert Node 22.19 oder neuer oder Bun 1.4 oder neuer und hat keine Laufzeitabhängigkeit. ./pi erfordert @earendil-works/pi-durable, @earendil-works/pi-ai und @earendil-works/chord, 1.1 oder neuer und unter 2. Der Einstiegspunkt ist mit Pi Durable 1.1.0 und 1.2.0 getestet. Die drei sind optionale Peer-Abhängigkeiten: Ein langlebiger Agent, der ./pi nie importiert, installiert keine davon.

Die Laufzeitumgebung entscheidet, ob der langlebige Agent erkennen kann, wer antwortet. Die Nachfahrenprüfung verweigert Aktionen des langlebigen Agenten selbst oder eines von ihm gestarteten Prozesses mit 403 caller-refused. Sie deckt answer, send, stop, action, rename, close, reopen und starter ab. Lesezugriffe bleiben offen.

Laufzeitumgebungdie Nachfahrenprüfungwas Sie setzen
Bun unter LinuxStandardmäßig aktiv. Bun liest die Prozess-ID des Aufrufers vom SocketNichts. callerCheck: "off" schaltet sie ab
Bun unter macOS oder jedem anderen System außer LinuxKann nicht ausgeführt werden. Der Start schlägt mit einem Fehler fehl, der callerCheck nenntcallerCheck: "off"
Node, jedes SystemKann nicht ausgeführt werden: Node kann den Aufrufer eines Sockets nicht lesen. Der langlebige Agent schreibt beim Start eine Zeile, die dies mitteiltNichts. callerCheck wird nicht gelesen

Ohne die Prüfung kann jeder Prozess Ihres Benutzers eine Karte beantworten, einschließlich eines vom Agenten ausgeführten Werkzeugs. Führen Sie die Werkzeuge des Agenten in einer Sandbox aus, die den Socket nicht erreichen kann. Der Socket erfordert ein System mit Dateieigentümern; unter Windows bricht openCollie daher beim Start ab. Ein langlebiger Agent stellt dort stattdessen ./core hinter TLS mit einem Token bereit (Zwei Wege, einen langlebigen Agenten zu erreichen).

Verbindung öffnen

openCollie erstellt den privaten Socket, und das zurückgegebene Handle bestimmt das Layout der Smartphone-Anzeige.

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

Ohne die Option socket stammt der Pfad aus COLLIE_DURABLE_SOCKET, der Variable, die auch Collie liest.

OptionFunktionStandard
socketDer Socket-Pfad: absolut, maximal 103 Bytes. Sein Ordner wird mit Modus 0700 erstellt oder muss Ihnen bereits mit Modus 0700 gehörenDie Variable COLLIE_DURABLE_SOCKET. Ist keine gesetzt, schlägt der Start fehl
hostNameDer eigene Name des langlebigen Agenten in seinem Hello, gekürzt auf 64 Bytes. ErforderlichKeine
tailLimitWie viele Rohereignisse jeder Bereich für die Lesezugriffe von Collie vorhält500, maximal 1000
capsWas der langlebige Agent laut eigener Angabe kann (Fähigkeiten)Alles, was das SDK kann
callerCheckdescendant oder off. Wird nur unter Bun gelesendescendant
hooksEin benannter Ort für jeden Vorgang, den das Telefon sendet (Hooks und Verlauf)Keine
warnWohin das SDK seine einzeiligen Notizen schreibt, beispielsweise über ein Collie, das eine andere Wire-Version verwendetconsole.warn
onRenameVeraltet. Der alte Name von hooks.onRename, für ein Release beibehalten, ohne die Anfrage-IDKeine

Zwei weitere Optionen existieren nur bei createCore, nicht bei openCollie: receipts und allowAlways (Fragen).

auf dem HandleBeschreibung
addressDer Socket-Pfad, auf dem gelauscht wird
epochNeu und zufällig bei jedem Start, 128 Bit
coreDer Kern hinter dem Socket. Ein Test oder ein zweiter Transport ruft core.handle direkt auf
workspace(id, { title, cwd? })Ein Arbeitsbereich, einmal pro ID erstellt. Sein tab(id, { title }) liefert einen Tab und das pane(id, options) des Tabs einen Bereich
starters(list)Was das Telefon über die Neu-Seite starten kann, maximal 50. Jeder Eintrag ist { id, label, run }, und run löst sich zu { paneId } des angezeigten Bereichs auf
history(provider)Die eigenen Aufzeichnungen des dauerhaften Agenten über seine Konversationen ausliefern (Hooks und Verlauf)
ready()Einmal aufrufen, sobald jeder Bereich angezeigt wird, und nach einem Neustart, sobald jede offene Anfrage erneut gestellt wurde. Bis dahin antwortet jede Route außer hello mit 503 starting
close()Den Server stoppen. Antworten, die bereits unterwegs sind, werden noch gesendet, höchstens 2 s lang; danach wird die Socket-Datei entfernt

close() lässt offene Anfragen absichtlich offen: Ein Herunterfahren ist keine Antwort, und der dauerhafte Agent entscheidet, was mit der darauf wartenden Arbeit geschieht.

tab.pane(id, { title, harness, cwd?, sessionId? }) gibt den Bereich mit dieser ID zurück, falls vorhanden, sodass ein dauerhafter Agent eine Konversation zweimal ohne zweiten Bereich anzeigen kann. Titel werden auf 256 Bytes gekürzt und harness auf 64. cwd ist ein absoluter Pfad, andernfalls wird er weggelassen.

Jede ID folgt der ID-Regel: 1 bis 128 Bytes, kein Steuerzeichen, kein Leerraum und keines von /, ? oder #. Eine ungültige ID ist ein TypeError. Eine Arbeitsbereichs- oder Tab-ID darf : nicht enthalten, da das Wire einen Tab als <workspace>:<tab> benennt.

Bereiche

Ein Bereich entspricht einer Konversation, und seine Methoden legen fest, was das Telefon dafür anzeigt.

Methodewas das Telefon anzeigtLimit
state(s)working, waiting oder idle. Eine Änderung an working beginnt einen neuen ZugSolange eine Anfrage offen ist, zeigt der Bereich waiting an
event(e)Chat-Elemente: Ereignisse für item, remove, settled, reset und syncedSiehe die Elementtabelle unten
subtitle(text)Eine Zeile unter dem Titel. null leert sie120 Zeichen
badge(value){ count } oder { text } neben dem Titel. null leert das FeldEin Zähler von 0 bis 9999, ein Text aus 12 Zeichen
progress(value){ kind: "steps", steps } oder { kind: "percent", value, label? }, gezeichnet während der Bereich arbeitet oder wartet. null leert die Anzeige12 Schritte, jede Beschriftung 60 Zeichen, ein Wert von 0 bis 100
actions(list)Schaltflächen im Bereich des persistenten Agenten auf dem Band: { id, label, icon?, busy?, disabled? }. null leert sie4 Schaltflächen, eine Beschriftung von 16 Zeichen
onAction(fn)Führt ein Antippen einer dieser Schaltflächen aus. Geben Sie false zurück, um es abzulehnenDas Telefon sendet kein Antippen für eine Schaltfläche mit busy oder disabled
onSend(fn)Akzeptiert den Text des Telefons als fn(text, { steer, requestId })32 KiB Text
onAbort(fn)Akzeptiert Stop als fn({ requestId })Keine
ask(input, { signal? })Eine Fragekarte (Fragen)50 offene Anfragen pro Bereich
updateAsk, decideAsk, outcomeOfEine Anfrage ändern, entscheiden oder zurücklesen (Fragen)Keine
close()Entfernt den Bereich aus dem Layout. Seine offenen Anfragen schließen als gestopptKeine

Ein Bereich hat außerdem vier schreibgeschützte Felder: id, sessionId, turnId (der laufende Durchlauf oder der letzte) und openAsks. Das icon einer Aktion ist eines von play, pause, check, x, refresh, archive, flag, star, send, note, search und more. Ein anderer Name zeichnet kein Symbol.

Ein item-Ereignis überträgt ein Element mit einer id und einem optionalen ts. Ein Element mit einer bekannten ID ersetzt das frühere Element an Ort und Stelle.

Artwas er enthältLimit
userEine Zeile, die die Person gesendet hat. requestId benennt den Sendevorgang, aus dem sie stammt, sodass das Telefon seine eigene Zeile dagegen austauscht64 KiB Text
reply, thinking, noticeDie Worte des Agenten64 KiB Text
markdownText, den das Telefon als Markdown darstellt: Überschriften, Listen, Hervorhebungen, Code-Abschnitte und Links32 KiB Text
codeEin Codeblock mit lang wie ts32 KiB Text. lang besteht aus 1 bis 24 Buchstaben, Ziffern oder _ + # . -
linkEin href und ein optionales labelhref ist nur https://, maximal 2048 Zeichen. label ist 120 Zeichen lang
toolEin Werkzeugaufruf: tool: { kind: "other", name, summary, output? } und ein status von running, done, failed oder deniedname 128 Bytes, summary 1 KiB, output 16 KiB

Ein reply-, thinking-, notice- oder markdown-Element darf partial: true tragen, während sein Text wächst. Schreiben Sie dieselbe ID erneut, während er wächst, höchstens alle 250 ms, danach noch einmal mit dem finalen Text und ohne partial, bevor der Bereich working verlässt.

Text oberhalb des Limits wird abgeschnitten, und Steuerzeichen sowie unsichtbare Zeichen werden entfernt. Ein ungültiges lang, ein ungültiges href, ein ungültiges Badge oder ein ungültiger Fortschritt wird stattdessen zu einem TypeError oder einem RangeError, da Collie es sonst verwerfen würde. Ein persistenter Agent darf ask-, ask-closed- oder state-Ereignisse nicht selbst anhängen: ask() und state() schreiben diese.

Fragen

pane.ask zeigt eine Karte an und löst mit der Antwort auf, und requireApproval fragt nach einem Werkzeugaufruf in einer einzelnen Zeile.

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) erstellt die Karte anhand des Aufrufinhalts, niemals anhand der Worte des Modells darüber. Der Titel lautet "refund wants to run", die Werkzeugzeile ist refund(order: "5521", amount: 40), die Push-Nachricht lautet "refund needs a yes", und die Schaltflächen sind Allow und Deny. Es gibt { approved, decidedBy, decidedAt, askId } zurück. Ablehnung, Zeitüberschreitung, Stopp und Abbruch geben alle approved: false zurück.

Option von requireApprovalFunktionStandard
paneDer Bereich, der anfragt. ErforderlichKeine
toolCallIdDie eigene ID des Tool-Aufrufs, über einen Neustart hinweg dieselbe. Eine beliebige Zeichenkette: Eine, die die ID-Regel verletzt, wird sicher gemachtErforderlich
itemIdDas Element, unter dem sich die Karte befindetDie ID des Tool-Aufrufs
timeoutMsWie viel Zeit das Telefon hat. Nach Ablauf wird der Aufruf verweigert, entschieden von timeoutKeine Begrenzung
signalEin AbortSignal. Ein Abbruch verweigert den Aufruf, entschieden von programKeine
labelsDer Text der beiden Schaltflächen, { allow?, deny? }Erlauben und Verweigern

callSummary(name, args) und argumentsView(args) sind die beiden Teile, die es verwendet: der Aufruf in einer Zeile und die Argumente als key: value-Paare mit jedem Wert als JSON.

pane.ask(input) akzeptiert eine von vier Arten. Das Promise wird mit der Antwort in der Form der Art aufgelöst.

kindWas die Karte anzeigtdie AntwortLimit
permissionEine Schaltfläche pro Option, jeweils mit einer effect: allow, allow-always, deny oder cancel{ optionId, note? }1 bis 6 Optionen
choiceEine Schaltfläche pro Option. Mit multiple: true wählt die Person mehrere aus{ optionIds }1 bis 8 Optionen
textEin Textfeld mit einem optionalen placeholder{ text }maxLength von 1 bis 2000, Standardwert 500. Der Platzhalter umfasst 60 Zeichen
form1 bis 6 Felder, jeweils von der Art text, choice oder toggle, manche required{ values }, indiziert nach Feld-IDEin Auswahlfeld hat 1 bis 8 Optionen

Jede Art akzeptiert toolCallId, itemId und title (256 Bytes). Sie kann reason (2 KiB), tool, push: { title?, line? } (60 und 120 Zeichen, der Text der Benachrichtigung) und expiresAt (ein Date oder eine ISO-8601-Zeichenkette mit Zeitzone) akzeptieren.

Lassen Sie id weg. Das SDK leitet es mit askIdFor(paneId, toolCallId) ab: SHA-256 über die beiden IDs, die ersten 32 Hex-Zeichen. Derselbe nach einem Neustart erneut ausgelöste Tool-Aufruf erhält daher dieselbe ID, und eine Antwort, die das Telefon über den Neustart hinweg gesendet hat, kommt an. Das Auslösen einer bereits offenen ID ist ein TypeError.

im BereichFunktion
updateAsk(askId, patch)Ändert eine offene Anfrage direkt vor Ort: title, reason, tool, options, placeholder, maxLength oder fields. Ihre Revision erhöht sich um eins, sodass eine Antwort auf das alte Formular 409 stale erhält und das Telefon ein erneutes Antippen verlangt. False, wenn die Anfrage nicht offen ist
decideAsk(askId, answer?)Der Durable Agent hat die Anfrage selbst entschieden, an anderer Stelle als auf dem Telefon. Mit answer löst sich das wartende ask() damit auf. Ohne wird es mit AskClosed abgelehnt. Ein späteres Antippen auf dem Telefon erhält 409 decided, und die Karte meldet „Im Durable Agent entschieden“. False, wenn die Anfrage nicht offen ist
outcomeOf(askId)Die erste Entscheidung: { decidedBy, decidedAt, optionId?, effect? }. Der Bereich merkt sich seine letzten 500. Undefined für eine Anfrage, die er nie ausgelöst oder die er vergessen hat

decidedBy ist phone, program oder timeout. Eine Anfrage überschreitet ihr expiresAt und schließt als entschieden von timeout: ask() schlägt fehl mit AskClosed, dessen decidedBy timeout ist. Die Karte zeigt die verbleibende Zeit bis dahin an. Eine Frage, die abgelaufen ist oder im Durable Agent entschieden wurde, hinterlässt eine Zeile im Chat, wie etwa „Vor einer Antwort abgelaufen: refund möchte ausgeführt werden“.

Ein abgebrochenes signal, pane.close() und ein Schließen vom Telefon schließen die Anfrage als entschieden von program, und ask() schlägt fehl mit AskClosed.

Achtung. Eine allow-always-Option lässt nach einer einzigen Antwort jeden späteren Aufruf durch. Über https ist das Token das einzige Zugangstor, daher bietet ein Durable Agent dort nur Erlauben und Verweigern an. createCore mit allowAlways: false macht eine allow-always-Option zu einem TypeError. Das Telefon bietet kein allow-always bei einer Anfrage an, deren Text gekürzt oder bereinigt wurde oder die kein Tool benennt.

Jede Aktion des Telefons enthält eine Anfrage-ID, und der Core behält deren Beleg: Eine Wiederholung führt nichts aus und erhält die erste Antwort erneut mit replayed: true. Der Standard-MemoryReceiptStore behält die neuesten RECEIPTS_PER_GROUP (1000) pro Bereich sowie pro Gruppe für Starter, Umbenennungen, Schließungen und Wiederöffnungen. Eine Wiederholung einer ID, die er verworfen hat, erhält 500 receipt-dropped und führt nichts aus. Der Speicher verschwindet mit dem Prozess.

Um Belege über einen Neustart hinweg zu behalten, schreiben Sie einen ReceiptStore mit get(requestId) und put(requestId, record, group) und übergeben Sie ihn an createCore als receipts. openCollie behält sie immer im Arbeitsspeicher.

Hooks und Verlauf

Ein Hook ist der einzige benannte Ort für eine Aktion, die das Telefon sendet, und ein Verlaufsprovider liefert Ihren eigenen Datensatz aus.

Hookwann er ausgeführt wirdwie er ablehnt
onSend(pane, { text, steer, turnId, requestId })Text für einen Bereich ohne pane.onSendAusnahme: 500 internal, ein unbekanntes Ergebnis für das Telefon
onAbort(pane, { turnId, requestId })Stopp für einen Bereich ohne pane.onAbortAusnahme, wie oben
onAction(pane, { actionId, turnId?, requestId })Ein Klick auf die Gürtelleiste in einem Bereich ohne pane.onActionRückgabe false: 422 action-refused
onRename({ kind, id, title }, requestId)Ein neuer Titel für einen Arbeitsbereich oder einen TabRückgabe false: 422 rename-refused
onClose({ kind, id, paneIds }, requestId)Das Telefon schließt einen Bereich, einen Tab oder einen ArbeitsbereichRückgabe false: 422 close-refused
onReopen({ id, paneId? }, requestId)Das Telefon öffnet eine geschlossene Konversation wiederRückgabe false: 422 reopen-refused

Ein Hook wird nur ausgeführt, wenn seine Cap aktiviert und seine Anfrage-ID neu ist. Eine Ablehnung speichert nichts, daher kann dieselbe Anfrage-ID einen erneuten Versuch starten. Die Handler pro Bereich haben Vorrang vor einem Hook. Ein Bereich mit keinem von beiden antwortet mit 409 not-supported auf ein Senden, einen Stopp oder einen Klick.

Das SDK wendet eine akzeptierte Aktion selbst an. Eine Umbenennung setzt den Titel. Ein Schließen entfernt das Ziel samt Inhalt und schließt dessen offene Anfragen als gestoppt. Ein Wiederöffnen ohne Hook stellt einen Bereich wieder her, den dieser Prozess geschlossen hat; eine vor einem Neustart geschlossene Konversation benötigt onReopen. Das Layout wird bei jedem Start neu erstellt. Ein langlebiger Agent, dessen Titel oder Schließung den Prozess überdauern soll, speichert dies daher in seinem Hook.

collie.history(provider) liefert jede Konversation, offen wie geschlossen, aus dem eigenen Speicher des langlebigen Agenten aus. Es aktiviert die history-Cap, wenn caps weggelassen wird oder history: true benennt.

HistoryProvidergibt zurück
list(after, limit){ items, next? }: Konversationszeilen, neueste zuerst, maximal limit (100)
items(id, after, limit){ items, next? }: die Einträge der Konversation, älteste zuerst, jeweils in der neuesten Version, maximal limit (1000). undefined bei einer unbekannten ID

Eine Zeile ist { id, title, subtitle?, workspaceId?, tabId?, startedAt, endedAt?, state, items }, mit state open oder closed und items als Anzahl. Ein Cursor (after, next) ist Ihre eigene Zeichenkette, 1 bis 512 Byte druckbares ASCII ohne Leerzeichen. Ein fehlendes next beendet die Liste.

Sobald ein Provider gesetzt ist, entspricht sessionId jedes Bereichs dessen Bereichs-ID, und der Verlauf liefert die Konversation des Bereichs darunter aus. Übergeben Sie sessionId an tab.pane(), um eine andere ID anzugeben, oder null, wenn sie über einen Neustart hinweg nicht gleich bleiben kann.

tailLimit ist kein Verlauf. Es ist das reine Protokollende, das jeder Bereich für Collies Ereignisabfragen behält, standardmäßig 500 Ereignisse. Ein Leser, der dahinter zurückgefallen ist, erhält stattdessen die gesamte aktuelle Ansicht des Bereichs, maximal die neuesten 2000 Einträge.

Fähigkeiten

Eine Cap besagt, dass der langlebige Agent eine bestimmte Sache ausführen kann, und das Telefon stellt ein Steuerelement nur für eine Cap dar, die der langlebige Agent deklariert hat.

Obergrenzewas der langlebige Agent entgegennimmt
asksStellt Fragen und nimmt Antworten entgegen
startersListet Starter auf und führt einen über die Seite „Neu“ aus
sendNimmt Text vom Telefon entgegen
steerNimmt Text in einen laufenden Zug auf. Benötigt send
abortStoppt einen laufenden Durchlauf
renameAkzeptiert einen neuen Titel für einen Arbeitsbereich oder einen Tab
closeSchließt einen Bereich, einen Tab oder einen Arbeitsbereich
actionsListet Gürtelschaltflächen in einem Bereich auf und führt eine davon aus
historyStellt seine Unterhaltungen bereit, offene und geschlossene
reopenZeigt eine geschlossene Unterhaltung wieder an

Wird er weggelassen, schaltet caps alles ein, was das SDK unterstützt, und history, sobald history() einen Provider hat. Wird er angegeben, gilt die vollständige Liste: Eine Funktionseinschränkung (Cap), die er nicht nennt, ist deaktiviert; { asks: true } deklariert somit allein Anfragen. Um eine zu deaktivieren und den Rest zu behalten, wenden Sie Spread auf ALL_CAPS an: { ...ALL_CAPS, steer: false }. Eine Route mit deaktivierter Funktionseinschränkung antwortet mit 409 not-supported. terminal ist immer false.

Hilfsfunktionen und Konstanten

Der Root-Import exportiert auch die Bausteine, aus denen openCollie besteht, und die Regeln, die es anwendet.

ExportierenBeschreibung
createCore(options)Der Kern ohne Server. Er übernimmt die openCollie-Optionen mit Ausnahme von socket und callerCheck, zuzüglich receipts und allowAlways. Er gibt epoch, workspace, starters, history, ready, isReady und handle(request) zurück.
handleDie Übertragung als einzelne Funktion: ein Web-Request hinein und ein Response heraus. core.handle(request) ist der reguläre Einstiegspunkt.
wireListener(core)core.handle als ein node:http-Anfrage-Listener, mit drained() für ein sauberes Schließen
hello, versionLineDie Hello-Antwort und die einzelne Zeile, die ein persistenter Agent bei einer Versionsablehnung schreibt
mintId()Eine neue zufällige ID, 128 Bit als 32 Hex-Zeichen
askIdFor(paneId, toolCallId)Die abgeleitete Anfrage-ID
AskClosedDer Fehler, mit dem ask() abweist, wenn keine Antwort eingegangen ist. Er enthält by und decidedBy.
idOk(id), assertId(id, what), safeId(raw)Die ID-Regel: eine Prüfung, eine Prüfung mit Fehlerauslösung und eine sichere ID, die deterministisch aus einer beliebigen Zeichenkette erzeugt wird
cursorOk(cursor)Die Verlaufszeiger-Regel
cut(text, max, multiline?)Eine Zeichenkette bereinigen und auf max Bytes kürzen, mit … am Ende
hrefOf, langOf, badgeOf, progressOfEin Linkziel, eine Codesprache, ein Badge und ein Fortschritt, geprüft gemäß den Kriterien des Bereichs
subtitleOf, pushTextOf, renameTitleOfEin Untertitel, die Push-Begriffe einer Anfrage und ein Umbenennungstitel, bereinigt und gekürzt
CAPS, LIMITSJedes Limit pro Feld in Bytes und jedes Limit pro Liste
ACTION_LABEL_MAX, BADGE_TEXT_MAX, BADGE_COUNT_MAX16, 12 und 9999
SUBTITLE_MAX, LINK_LABEL_MAX, RENAME_TITLE_MAXJeweils 120 Zeichen
PROGRESS_STEPS_MAX, PROGRESS_LABEL_MAX12 Schritte, 60 Zeichen
PUSH_TITLE_MAX, PUSH_LINE_MAX, PLACEHOLDER_MAX60, 120 und 60 Zeichen
ANSWER_TEXT_MAX, ANSWER_TEXT_DEFAULT, ANSWER_TEXT_BYTES2000 und 500 Zeichen sowie 8000 Bytes
ALL_CAPS, PROTOCOL_RANGE, SOCKET_ENVJede Funktionseinschränkung aktiv, die Übertragungsversionen, die das SDK beherrscht, und der Name COLLIE_DURABLE_SOCKET
MemoryReceiptStore, RECEIPTS_PER_GROUPDer Standard-Empfangsbestätigungsspeicher und seine 1000 pro Gruppe

Jeder Typ auf der Leitung und jede Hook-Nutzlast wird ebenfalls exportiert, aus src/core/types.ts.

Die Pi-Hilfsfunktionen

./pi wandelt eine Pi-Durable-Unterhaltung in einen Bereich um, einen riskanten Werkzeugaufruf in eine Karte und den Pi-Speicher in den Verlauf.

ExportierenFunktion
showConversation(loc, harness, conversation, o)Zeigt eine Unterhaltung als Bereich an, zuerst den Verlauf, dann Live-Ereignisse. Senden geht mit der Anfrage-ID an submit von Pi und Stopp an dessen Abbruch. Kann gefahrlos zweimal aufgerufen werden
PaneRegistryWelcher Bereich welche Unterhaltung anzeigt. Nach einem Neustart wartet reRaised(risky), bis jeder riskante Aufruf ohne Ergebnis erneut nachgefragt hat, sodass ready() nach den Nachfragen kommt
riskGuard({ panes, risky, words?, timeoutMs?, onTimeout? })Eine Pi-Erweiterung, deren Hook beforeTool einen Aufruf an ein Werkzeug in risky in eine Erlauben- und Ablehnen-Karte umwandelt. Ein abgelehnter Aufruf wird blockiert. Mit timeoutMs läuft die Karte ab, ein von niemandem beantworteter Aufruf wird blockiert und onTimeout(tool, title) lässt den Durable-Agenten dies protokollieren
askTools({ panes, words, timeoutMs?, onTimeout? })Die zwei Nachfrage-Werkzeuge des Support-Desks: ask_queue, eine Auswahl, und ask_customer, eine Textnachfrage. Mit timeoutMs läuft eine unbeantwortete Nachfrage ab und das Werkzeug gibt "timed out" zurück
spawnHelperTool(o)Das Werkzeug spawn_helper: eine untergeordnete Unterhaltung, die als neuer Bereich angezeigt wird und die Antwort des Helfers zurückgibt
piHistory({ harness, panes, describe })Ein HistoryProvider, der jeden Eintrag jeder Pi-Unterhaltung liest
firstMessageOf(conversation)Der Text der ersten Nachricht einer Unterhaltung, um ihren Bereich zu benennen
paneIdOf(id), conversationOfPaneId(paneId)Die Bereichs-ID einer Pi-Unterhaltung, conv-<id>, und zurück
summaryOf(args, name?)Die Argumente eines Werkzeugaufrufs in Worten, maximal 200 Zeichen
MapperPi-Einträge und Agenten-Ereignisse als Elemente. Eine wachsende Antwort behält eine Element-ID
PARTIAL_MS, RE_RAISE_MS250 ms zwischen zwei Schreibvorgängen einer wachsenden Antwort und die 5000 ms, die reRaised maximal wartet
ESCALATEDBeispiel-Vokabular: der Hinweis des Support-Desks für die Eskalieren-Schaltfläche, die showConversation mit escalate: true hinzufügt
ASKING_TOOLSBeispiel-Vokabular: die Namen der beiden Nachfrage-Werkzeuge des Support-Desks
Submit, ReplyExtrasDie Typen eines benutzerdefinierten submit und der Elemente, die ein Durable-Agent unter einer fertigen Antwort hinzufügt

Die Wörter, die eine Karte anzeigt, werden als Optionen übergeben, daher enthält ./pi keinen Text des Beispiels außer diesen beiden Konstanten. Es wurde für Pi Durable 1.1.0 geschrieben. Der Support-Desk in examples/durable-member/ setzt alle Teile zusammen.

Versionen

Das Paket hat eine eigene Version, unabhängig von der von Collie, und nennt die Leitungsversion, die es spricht.

heuteBedeutung
SDK_VERSION0.1.0Die Paketversion. Bis das Paket das dist-tag experimental verlässt, kann ein Minor-Release die API ändern
WIRE_VERSION1Die Durable-Leitungsversion, die das Paket spricht

Collie spricht eine Leitungsversion und akzeptiert die vorherige für ein Minor-Release nach der Veröffentlichung einer neuen. Wenn ein Collie keine Ihrer Versionen spricht, schreibt der Kern eine Zeile über warn, einmal pro Version, zum Beispiel collie: Collie speaks wire v2, this durable agent speaks v1. Update the agent's SDK, or Collie. Das Telefon meldet die Abweichung auf der Startseite des Durable-Agenten mit Collies eigenen Worten. Aktualisieren Sie die ältere Seite.

Das Paket wird unter dem npm-dist-tag experimental veröffentlicht, niemals unter latest. Wenn die Durable-Leitung bei das Beenden eingestellt wird, wird das Paket als veraltet markiert (ADR 0105).

Diese Seite auf GitHub bearbeiten

The rest of the documentation