Μετάβαση στο περιεχόμενο

Γέφυρα συνομιλίας

Πάροχος Τιμή wire Μεταφορά Είδος χώρου
Slack slack Socket Mode (εξερχόμενη WSS) slack

Το Slack είναι ο μόνος πάροχος. Το ChatProvider είναι enum μίας τιμής και το cc_server καταχωρεί ένα plugin. Το σχήμα, κάθε αναζήτηση και κάθε μοναδικό ευρετήριο κλειδώνονται με το provider, οπότε τα ids δεν περνούν ποτέ από τον έναν πάροχο στον άλλο και η προσθήκη ενός είναι αλλαγή μόνο στον διακομιστή.

Μία εφαρμογή στην πλευρά του παρόχου ανά χώρο εργασίας × πάροχο.

Το όνομα της εντολής είναι ανά εφαρμογή (cc από προεπιλογή, άρα /cc). Ένας διαχειριστής μπορεί να το μετονομάσει· η γέφυρα τότε χρησιμοποιεί ό,τι χρησιμοποιήθηκε την τελευταία φορά που κλήθηκε.

Εντολή Αποτέλεσμα
/cc help (ή /cc χωρίς ρήμα) Απαριθμεί τι μπορεί να κάνει το bot
/cc link <code> Εξαργυρώνει έναν κωδικό μίας χρήσης και συνδέει την ταυτότητα συνομιλίας του αποστολέα
/cc ticket <title> Καταχωρεί ένα τοπικό εισιτήριο που ανέφερε το συνδεδεμένο μέλος
/cc ticket <title> | <description> Το ίδιο, με ό,τι ακολουθεί την πρώτη | ως περιγραφή
Άγνωστο ρήμα Αναφέρει το άγνωστο ρήμα μαζί με το κείμενο βοήθειας

Τρόποι να φτάσετε σε έναν πράκτορα:

Κίνηση Συμπεριφορά
@bot … σε ένα κανάλι Ανοίγει ένα νήμα Slack και έναν αντίστοιχο χώρο του Control Center· ο πράκτορας απαντά στο νήμα του Slack
Απάντηση σε ένα γεφυρωμένο νήμα του Slack Συνεχίζει τον ίδιο χώρο του Control Center — δεν χρειάζεται αναφορά
Απλό μήνυμα σε ένα κανάλι Αγνοείται (δεν απευθύνεται στο bot και δεν βρίσκεται σε γεφυρωμένο νήμα του Slack)
Άμεσο μήνυμα στο bot Ένας χώρος του Control Center ανά συνομιλία άμεσων μηνυμάτων· ορίζει τίτλο νήματος Slack και κατάσταση «is thinking…» όσο εργάζεται ο πράκτορας

Δηλώνονται από τον περιγραφέα του παρόχου, ο οποίος παράγει τον διάλογο σύνδεσης και επικυρώνει την υποβολή.

Αναγνωριστικό πεδίου Ετικέτα Απαιτείται Πρόθεμα Πού βρίσκεται
botToken Token OAuth χρήστη bot Ναι xoxb- OAuth & Permissions
appToken Token επιπέδου εφαρμογής Ναι xapp- Basic Information → App-Level Tokens, scope connections:write
configRefreshToken Token ανανέωσης ρύθμισης εφαρμογής Όχι xoxe App configuration tokens on api.slack.com/apps

Το configRefreshToken είναι το διαπιστευτήριο διαχείρισης εφαρμογής: χωρίς αυτό η σύνδεση λειτουργεί, αλλά το bot δεν μπορεί να δημιουργηθεί ή να επεξεργαστεί από το Control Center. Περιστρέφεται σε κάθε χρήση και η περιστραμμένη τιμή αποθηκεύεται αμέσως.

Οι τιμές περικόπτονται, τα μη δηλωμένα κλειδιά απορρίπτονται και μια αναντιστοιχία προθέματος απορρίπτεται με την ίδια φράση στον πελάτη και στον διακομιστή. Τα υποχρεωτικά πεδία πρέπει να υπάρχουν σε κάθε σύνδεση· ένα προαιρετικό πεδίο που μένει κενό διατηρεί ό,τι είχε ήδη αποθηκευτεί.

Scopes του token bot:

app_mentions:read
assistant:write
channels:history
chat:write
commands
groups:history
im:history
users:read
users:read.email

Συνδρομές σε συμβάντα bot:

app_home_opened
app_mention
message.channels
message.groups
message.im

Δομικές ρυθμίσεις που επιβάλλει το Control Center όταν δημιουργεί ή επεξεργάζεται την εφαρμογή: Socket Mode ενεργό, κανένα request URL, καρτέλα Messages ενεργή και εγγράψιμη, bot always_online, τα απαιτούμενα scopes και συμβάντα συγχωνευμένα σε ό,τι έχει ήδη η εφαρμογή (ποτέ αφαιρούμενα) και μία εντολή slash που φέρει την περιγραφή File a ticket or link your Control Center account — τον δείκτη που αναγνωρίζει τη δική του εντολή του Control Center σε ένα εξαγόμενο manifest.

Κατάσταση Wire Σημασία
Δεν έχει συνδεθεί disconnected Δεν έχουν αποθηκευτεί διαπιστευτήρια για αυτόν τον χώρο εργασίας × πάροχο
Σύνδεση… connecting Τα διαπιστευτήρια αποθηκεύτηκαν, η μεταφορά καλεί ή επανακαλεί
Ζωντανά connected Η μεταφορά είναι ενεργή και λαμβάνει συμβάντα
Σφάλμα σύνδεσης error Αποθηκευμένα αλλά αποτυγχάνουν· το σφάλμα του ίδιου του παρόχου εμφανίζεται δίπλα

Η επανασύνδεση γίνεται με εκθετική καθυστέρηση επανάληψης με τυχαία διακύμανση, με ανώτατο όριο τα 30 δευτερόλεπτα. Μια εναλλαγή socket που ξεκινά ο πάροχος επανασυνδέεται άμεσα χωρίς να κλιμακώσει την καθυστέρηση. Ένα απορριφθέν διαπιστευτήριο (invalid_auth, not_authed, token_revoked, account_inactive, token_expired, invalid_app_id) ή ένα απόν scope είναι τελειωτικό: η γέφυρα σταματά να επαναλαμβάνει μέχρι να φτάσουν νέα διαπιστευτήρια.

Η γέφυρα είναι γραμμένη απέναντι στην πλουσιότερη επιφάνεια και υποβαθμίζεται ανά δυνατότητα.

Δυνατότητα Slack Αποτέλεσμα όταν λείπει
streaming ναι Ολόκληρη η απάντηση αναρτάται μία φορά, στο τέλος
streamingRequiresThread ναι Ένας στόχος απάντησης χωρίς άγκυρα νήματος αναρτά ολόκληρες απαντήσεις
ephemeralMessages ναι Μια απάντηση σε εντολή slash χωρίς χρησιμοποιήσιμη λαβή απάντησης απορρίπτεται (οι αρνήσεις αναρτώνται πάντα εντός νήματος)
threadStatus ναι Καμία παροδική γραμμή «is thinking…»
threadTitle ναι Το νήμα συνομιλίας κρατά τον προεπιλεγμένο τίτλο του
slashCommands ναι Καμία επιφάνεια /cc
taskCards ναι Μόνο κείμενο — καμία κάρτα πάνω από την απάντηση και κανένας σύνδεσμος «View in Control Center»
maxMessageLength 39.000 Οι μεγαλύτερες απαντήσεις περικόπτονται με υπόδειξη προς το Control Center
maxStreamChunkLength 3.800 Τα append χωρίζονται σε όριο παραγράφου, γραμμής ή κενού

Το να διαφημίζεται η ροή δεν είναι ροή που υποσχέθηκε: αυτή του Slack χρειάζεται τη λειτουργία Agents & AI Apps σε πλάνο επί πληρωμή. Μια άρνηση τη στιγμή της κλήσης (streaming_not_supported, feature_not_enabled, paid_only, …) θυμάται για όλη τη ζωή της σύνδεσης και εκτίθεται ως streamingAvailable: false. Οι κάρτες εργασίας του Slack ταξιδεύουν στην ίδια κλήση, οπότε ένα Slack που αρνείται τη λειτουργία προβολής της κάρτας κρατά τη ροή του και χάνει μόνο την κάρτα, μία φορά, για όλη τη ζωή της σύνδεσης.

Μια ροή πρέπει επίσης να ονομάζει τον αναγνώστη για τον οποίο προορίζεται. Το Slack απαιτεί και έναν χρήστη παραλήπτη και την ομάδα του για να ανοίξει μια ροή σε ένα κανάλι (ένα άμεσο μήνυμα δεν αρκεί) και αρνείται με missing_recipient_user_id / missing_recipient_team_id σε αντίθετη περίπτωση — άρνηση ανά κλήση, οπότε η γέφυρα συνεχίζει να προσπαθεί και η στροφή φτάνει στο μεταξύ ως μία αναρτημένη απάντηση. Παραλήπτης είναι όποιος ρώτησε, παρμένος από το εισερχόμενο μήνυμα (η δική του ομάδα, όχι της εφαρμογής, ώστε ένα κανάλι Slack Connect να επιλύεται σωστά). Για μια στροφή που κανείς δεν ξεκίνησε από τη συνομιλία — εργασία που ξεκίνησε στο Control Center σε μια ήδη γεφυρωμένη συνομιλία — είναι το μέλος του οποίου η σύνδεση δημιούργησε τη γέφυρα· αν στο μεταξύ αποσύνδεσε τον λογαριασμό συνομιλίας του, αυτή η στροφή αναρτάται ολόκληρη αντί να μεταδίδεται σε ροή.

Μία ομαδοποιημένη κάρτα ανά στροφή πράκτορα (task_display_mode: plan), με μία γραμμή ανά βήμα. Κάθε γραμμή είναι ένα task_update με id + title + status, συν ένα details μίας φοράς όταν η σκέψη είναι έτοιμη. Τα details και το output με το ίδιο id συνενώνονται χωρίς διαχωριστικό, οπότε τα details στέλνονται μία φορά και το output δεν μεταδίδεται ποτέ σε ροή. Ο τίτλος του σχεδίου είναι το αίτημα· η απάντηση είναι ένα ξεχωριστό μεταγενέστερο append που φέρει ένα τμήμα markdown_text.

Μέρος Περιεχόμενο
Τίτλος σχεδίου Τι ζητήθηκε
Γραμμή προετοιμασίας Working on it…, μετά Cloning …, μετά Starting the agent… — μία γραμμή, ο τίτλος αντικαθίσταται
Γραμμή σκέψης Thinking…, προστίθεται όταν ο πράκτορας αρχίζει να συλλογίζεται· η σκέψη είναι τα details αυτής της γραμμής, που στέλνονται μία φορά όταν ολοκληρωθεί η συλλογιστική
Γραμμές εργαλείων Μία ανά εργαλείο (Bash which swift), μοναδικό id ώστε να στέκονται δίπλα δίπλα
Κατάσταση Σε εξέλιξη όσο εκτελείται αυτή η γραμμή· ολοκληρωμένη όταν ξεκινήσει η επόμενη γραμμή ή τελειώσει η στροφή· σφάλμα για αποτυχημένη, διακοπείσα και λόγω ορίου στροφών
Πρόσκληση σε ενέργεια View in Control Center ως τελευταία γραμμή όταν τελειώσει η στροφή — απούσα όσο η εργασία εκτελείται ακόμη και απούσα όταν ο διακομιστής δεν έχει προσβάσιμο δημόσιο URL

Τι δεν μεταφέρει ποτέ μια κάρτα: έξοδο εργαλείου, όρισμα εκτός αυτής της λίστας επιτρεπομένων ή οτιδήποτε διαβάστηκε από τη βάση δεδομένων. Η συλλογιστική πρόζα είναι μόνο τα details της γραμμής Thinking… (με ανώτατο όριο 256 χαρακτήρες), όχι το σώμα του μηνύματος. Μια κάρτα που δεν θα έλεγε τίποτα νέο δεν αποστέλλεται ξανά. Μια αναφορά ανοίγει τη ροή αμέσως ώστε το νήμα του Slack να μη μείνει σιωπηλό· μια στροφή που μετά δεν παρήγαγε καθόλου κείμενο ολοκληρώνει αυτή την ίδια κάρτα με μια σύντομη σημείωση αντί να αναρτήσει δεύτερο μήνυμα. Μια στροφή χωρίς λέξεις σε έναν χώρο που δεν άνοιξε ποτέ ροή (χωρίς κάρτες ή με τη ροή ήδη απορριφθείσα) αναρτά ακόμη ένα μήνυμα που φέρει την ολοκληρωμένη κάρτα και τη σημείωση.

Οι κάρτες σε ροή και οι αναρτημένες κάρτες είναι διαφορετικά ωφέλιμα φορτία:

Μορφή Σχήμα Πρόζα
Σε ροή Τμήματα plan_update συν task_update κλειδωμένα με id Απλή συμβολοσειρά, με ανώτατο όριο 256 χαρακτήρες ανά τμήμα
Αναρτημένη Ένα block plan που περιβάλλει task_card κλειδωμένα με task_id Εμπλουτισμένο κείμενο

Χειρισμός αποτυχιών:

Κατάσταση Συμπεριφορά
Ο πάροχος αρνείται την κάρτα σε ένα append Το append επαναλαμβάνεται αμέσως χωρίς αυτήν· η πρόζα φτάνει ακόμη ζωντανά και οι κάρτες απορρίπτονται για όλη τη ζωή της σύνδεσης
Ο πάροχος αρνείται και την πρόζα Η ροή κλείνει και η απάντηση αναρτάται ολόκληρη
Η ροή διακόπτεται αφού έχει φτάσει μέρος της απάντησης Η ροή κλείνει και τίποτα δεν αναρτάται ξανά

Δείτε τις Γέφυρες συνομιλίας για το γιατί το ωφέλιμο φορτίο χωρίζεται έτσι.

Η κάρτα ανοίγει όταν γίνεται δεκτή μια αναφορά, πριν από την κλωνοποίηση και πριν από το πρώτο token· η στροφή που ακολουθεί υιοθετεί την ίδια κάρτα και ροή. Η αφήγηση μετά προέρχεται από το SpaceProvisioningChanged στον δίαυλο γεγονότων τομέα — την ίδια πρόοδο που διαβάζει το πανό προετοιμασίας της εφαρμογής υπολογιστή από τη γραμμή του χώρου.

Κατάσταση προετοιμασίας Αφήγηση
Η αναφορά έγινε δεκτή Working on it…
Βήμα repo Cloning <repo>…
Βήμα prCheckout Checking out the pull request in <repo>…
Βήμα script Running the setup script for <repo>…
Βήμα agent Setting up <agent>…
provisioning, κανένα βήμα ακόμη Preparing the workspace…
ready Starting the agent…
Ο πράκτορας συλλογίζεται Thinking…
failed Workspace setup failed — details are in Control Center.
cancelled Workspace setup was stopped — details are in Control Center.

Η αφήγηση προετοιμασίας απαιτεί και τις τέσσερις συνθήκες:

Συνθήκη
Ο πάροχος αποδίδει κάρτες
Η ροή είναι διαθέσιμη σε αυτή τη σύνδεση
Ο χώρος έχει ένα αίτημα συνομιλίας σε εκκρεμότητα
Καμία κάρτα δεν αναφέρει ήδη μια στροφή εκεί

Το αίτημα παραμένει σε εκκρεμότητα μέχρι να ξεκινήσει μια στροφή ή να αποτύχει η προετοιμασία. Ένα γεγονός ready χωρίς ήδη ανοιχτή κάρτα είναι ένας θερμός χώρος και αφήνεται ήσυχος, και μια προετοιμασία που κανείς στη συνομιλία δεν περιμένει — μια συνομιλία που άνοιξε στην εφαρμογή, μια εγκαταλελειμμένη που συνεχίστηκε στην εκκίνηση — δεν παράγει καθόλου κάρτα.

Τα προϊόντα συνομιλίας δέχονται http(s) σε έναν σύνδεσμο και τίποτα άλλο, οπότε μια πρόσκληση σε ενέργεια δεν μπορεί να ονομάσει απευθείας το σχήμα της εφαρμογής υπολογιστή.

Ιδιότητα Τιμή
Διαδρομή GET /open/workspaces/<workspaceId>/(spaces|tickets)/<id>
Προέλευση Παράγεται από το δημόσιο URL του διακομιστή (ws → http, wss → https)· το loopback διατηρείται
Απόκριση Μια μικρή σελίδα HTML με no-store που πλοηγείται στο control-center://workspaces/<workspaceId>/(spaces|tickets)/<id> και δείχνει ένα χειροκίνητο κουμπί
Επικύρωση Τα ids πρέπει να ταιριάζουν με [A-Za-z0-9_.-]{1,128}· οτιδήποτε άλλο είναι 404
Πρόσβαση Δημόσια και αδρανής — δεν διαβάζει καμία βάση δεδομένων, οπότε δεν είναι μαντείο ύπαρξης· η εφαρμογή που ανοίγει κάνει την εξουσιοδότηση
Πεδίο Όριο Σημειώσεις
appName 1–35 χαρακτήρες Προεπιλογή: Control Center · <workspace name>
botDisplayName 1–80 χαρακτήρες Προεπιλογή: control-center
description ≤ 140 χαρακτήρες
agentDescription ≤ 300 χαρακτήρες Εμφανίζεται πάνω από ένα άμεσο μήνυμα προς το bot
command ≤ 32 χαρακτήρες Κανονικοποιείται: οι αρχικές κάθετοι αφαιρούνται, τα γράμματα γίνονται πεζά, το [^a-z0-9_-] διαγράφεται, ένα κενό αποτέλεσμα καταλήγει στο cc
agentEnabled — Αν εκτίθεται η εμπειρία άμεσων μηνυμάτων/πράκτορα

Ένα κενό πεδίο σημαίνει «άφησέ το ήσυχο», όχι «καθάρισέ το». Τα όρια είναι του Slack, που είναι τα στενότερα από τα προϊόντα που μοντελοποιούνται.

Ιδιότητα Τιμή
Μήκος 6 χαρακτήρες
Αλφάβητο 23456789ABCDEFGHJKLMNPQRSTVWXYZ (χωρίς 0/O, 1/I, U)
Διάρκεια ζωής 15 λεπτά
Χρήσεις Μία
Αποθήκευση Στη μνήμη — μια επανεκκίνηση του διακομιστή ακυρώνει τους εκκρεμείς κωδικούς
Εμβέλεια Ένας χώρος εργασίας και ένας πάροχος· η έκδοση νέου κωδικού ακυρώνει τον προηγούμενο του μέλους

Η εξαργύρωση αντιστοιχίζεται χωρίς διάκριση πεζών-κεφαλαίων. Άγνωστοι, ληγμένοι, ξένου χώρου εργασίας και λάθος παρόχου κωδικοί αποτυγχάνουν όλοι πανομοιότυπα σκόπιμα.

Μέθοδος Wire Πώς
Κωδικός code Το μέλος εξαργύρωσε το /cc link <code>
Email email Το επαληθευμένο email του παρόχου αντιστοιχίστηκε με χρήστη που είναι ήδη μέλος του χώρου εργασίας

Όλες έχουν εμβέλεια χώρου εργασίας. Ο διακομιστής είναι άνευ κατάστασης, οπότε κάθε κλήση φέρει το δικό της workspace_id στα args· ο dispatcher αρνείται μια λειτουργία εμβέλειας χώρου εργασίας που το παραλείπει, πριν ανοίξει οποιαδήποτε βάση δεδομένων. Τα διαπιστευτήρια ταξιδεύουν μόνο προς τα μέσα — οι αναγνώσεις κατάστασης δεν τα επιστρέφουν ποτέ.

Λειτουργία Είδος Ελάχιστος ρόλος Κλάσεις ενέργειας
chat.providers ανάγνωση guest —
chat.status ανάγνωση guest —
chat.connect μεταβολή admin secretAccess, networkEgress
chat.disconnect καταστροφική admin secretAccess
chat.listUserLinks ανάγνωση guest —
chat.beginUserLink μεταβολή member —
chat.unlinkUser μεταβολή member για τον εαυτό σας, admin για οποιονδήποτε άλλον —
chat.createApp μεταβολή admin secretAccess, networkEgress
chat.setupLink ανάγνωση admin —
chat.botProfile ανάγνωση admin networkEgress
chat.updateBotProfile μεταβολή admin networkEgress

Οι λειτουργίες ανάγνωσης κληρονομούν το κατώτατο όριο guest από το είδος τους· οι μεταβολές χωρίς ρητό κατώτατο όριο απαιτούν member.

Το chat.setupLink συνθέτει ένα URL δημιουργίας εφαρμογής παρόχου από το προφίλ του bot. Δεν δηλώνει καμία κλάση ενέργειας επειδή δεν διαβάζει κανένα μυστικό και δεν καλεί τίποτα — ο περιηγητής του ίδιου του χρήστη κάνει τη μοναδική κλήση.

Ένα αντιδραστικό query ολοκληρώνει την επιφάνεια:

Query Είδος Εκπέμπει
chat.watchUserLinks παρακολούθηση Ο κατάλογος, που αποστέλλεται ξανά κάθε φορά που δημιουργείται ή αφαιρείται μια σύνδεση

Υπάρχει επειδή η σύνδεση συμβαίνει στην άλλη πλευρά: ένα μέλος πληκτρολογεί τον κωδικό μίας χρήσης στο bot, οπότε καμία απόκριση πελάτη δεν μπορεί να μεταφέρει την απάντηση πίσω. Ο κατάλογος των ρυθμίσεων και ο ανοιχτός διάλογος «σύνδεση του λογαριασμού μου» τον ακολουθούν και ο διάλογος μετατρέπεται σε επιβεβαίωση τη στιγμή που καταφτάνει η σύνδεση του ίδιου του μέλους.

Το chat.beginUserLink εκδίδει πάντα έναν κωδικό για την ταυτότητα του ίδιου του καλούντος. Το chat.updateBotProfile επιστρέφει ένα remaining_step μόνο όταν απομένει κάποιο βήμα (τυπικά μια επανεγκατάσταση)· η απουσία του σημαίνει ότι η αλλαγή είναι ζωντανή.

Το chat.providers επιστρέφει μία εγγραφή ανά προσφερόμενο πάροχο — τον περιγραφέα συν, όταν υπάρχει, την κατάσταση σύνδεσης. Ό,τι αποδίδει το UI των ρυθμίσεων προέρχεται από αυτό το ωφέλιμο φορτίο, γι’ αυτό η προσθήκη ενός παρόχου είναι αλλαγή μόνο στον διακομιστή.

Τι Πού
Διαπιστευτήρια σύνδεσης <dataDir>/<workspaceId>/chat_credentials/<provider>.json
Ημιτελής καθοδηγούμενη ρύθμιση <dataDir>/<workspaceId>/chat_credentials/<provider>_setup.json
Παλιά αρχεία Slack <dataDir>/<workspaceId>/slack_credentials.json και slack_app_setup.json, διαβάζονται μία φορά και μεταναστεύουν επί τόπου

Τα διαπιστευτήρια ζουν δίπλα στη βάση δεδομένων του χώρου εργασίας, όχι μέσα της: η διαγραφή ενός χώρου εργασίας παίρνει μαζί της τα token συνομιλίας του και το workspace.export ή ένα αντίγραφο ασφαλείας αντιγράφει το workspace.db — οπότε ένας χώρος εργασίας που παραδίδεται σε κάποιον άλλο δεν κουβαλά ζωντανά token bot. Οι εγγραφές είναι ατομικές (προσωρινό αρχείο συν μετονομασία) και περιορίζονται σε δικαιώματα μόνο του ιδιοκτήτη.

Και οι δύο ζουν στη βάση δεδομένων του χώρου εργασίας, η οποία φέρει μια συμπτυγμένη βάση αναφοράς v1 — οπότε μια ανάγνωση από άλλον χώρο εργασίας δεν μεταγλωττίζεται.

chat_space_links — μία εξωτερική συνομιλία ↔ ένας χώρος του Control Center:

Στήλη Σημειώσεις
id UUID v4
workspace_id Εμβέλεια χώρου εργασίας
provider ChatProvider.wire
external_team_id Ομάδα Slack T…, κενό για παρόχους χωρίς την έννοια
external_channel_id Κανάλι Slack C…, ομάδα G…, άμεσο μήνυμα D…
external_thread_id Άγκυρα νήματος Slack, ή null όταν ολόκληρη η συνομιλία είναι η άγκυρα (άμεσα μηνύματα bot)
cc_space_id REFERENCES spaces(id) ON DELETE CASCADE
created_by_user_id, created_at, last_activity_at

Μοναδικό στα (workspace_id, provider, external_channel_id, external_thread_id), με μερικό ευρετήριο που επιβάλλει το ίδιο για thread ids με null (το SQLite αντιμετωπίζει τα NULL ως διακριτά).

chat_user_links — ένα εξωτερικό μέλος ↔ ένας χρήστης του Control Center:

Στήλη Σημειώσεις
id UUID v4
workspace_id Εμβέλεια χώρου εργασίας
provider ChatProvider.wire
external_team_id, external_user_id Μέλος Slack U…
user_id Χρήστης του Control Center (καθολικός, γι’ αυτό χωρίς ξένο κλειδί)
method code ή email
linked_at

Μοναδικό στα (workspace_id, provider, external_team_id, external_user_id) και στο (workspace_id, provider, user_id) — απόδοση μίας τιμής και προς τις δύο κατευθύνσεις, ενώ ένα άτομο μπορεί να είναι συνδεδεμένο σε πολλούς παρόχους.

Μια σύνδεση είναι επίλυση ταυτότητας, όχι παραχώρηση πρόσβασης: η ιδιότητα μέλους ελέγχεται ξανά σε κάθε εισερχόμενο συμβάν, οπότε μια σύνδεση με μέλος που έχει στο μεταξύ αφαιρεθεί καταλήγει σε άρνηση.

Είδος χώρου και μεταδεδομένα μηνυμάτων

Ενότητα με τίτλο «Είδος χώρου και μεταδεδομένα μηνυμάτων»

Ένας γεφυρωμένος χώρος δημιουργείται με το SpaceKind του παρόχου (slack). Συμπεριφέρεται σαν ένας συνηθισμένος χώρος για ανθρώπους — ειδοποιείται και κατατάσσεται σε ενότητες όπως το topic — και το isExternalChat είναι ο έλεγχος από τον οποίο περνά κάθε συμπεριφορά (καθρεφτισμός, σήμανση, διατήρηση).

Κάθε μήνυμα που φέρνει μέσα η γέφυρα φέρει σφραγίδα metadata['chat']:

{
"chat": {
"provider": "slack",
"teamId": "T024BE7LD",
"channelId": "C0G9QF9GW",
"threadId": "1700000000.000100",
"messageId": "1700000000.000200",
"userId": "U024BE7LH",
"userLabel": "sam"
}
}

Η σφραγίδα είναι επίσης η προστασία από την ηχώ: ο εξερχόμενος καθρέφτης παραλείπει κάθε μήνυμα που τη φέρει, και αυτό εμποδίζει ένα εισερχόμενο μήνυμα συνομιλίας να αναρτηθεί αμέσως πίσω.

Συμπεριφορά Λεπτομέρεια
Τι αναμεταδίδεται προς τα έξω Μόνο το κείμενο του πράκτορα, συν τη γραμμή κατάστασης της κάρτας εργασίας. Η συλλογιστική πρόζα και η έξοδος εργαλείων μένουν στο Control Center
Ρυθμός ροής Περιορίζεται σε μία εκκένωση ανά δευτερόλεπτο όσο εκτελείται μια στροφή· η κάρτα και το κείμενο που εξηγεί ταξιδεύουν στην ίδια κλήση
Ανθρώπινα μηνύματα που πληκτρολογούνται στο Control Center Καθρεφτίζονται στο συνδεδεμένο νήμα, με πρόθεμα το εμφανιζόμενο όνομα του συντάκτη
Κενές στροφές Αναφέρονται με μια σύντομη σημείωση (η εκτέλεση απέτυχε, διακόπηκε ή σταμάτησε στο όριο στροφών της) αντί για σιωπή
Αποδιπλασιασμός Κλειδώνεται με το δικό του id συμβάντος του παρόχου· τα τελευταία 512 θυμούνται
Πράκτορας υποδοχής Μια νέα γεφυρωμένη συνομιλία ξυπνά τον πράκτορα CEO του χώρου εργασίας, αλλιώς τον πρώτο του πράκτορα, αλλιώς κανέναν
Ονομασία χώρου #channel · <request> για νήμα καναλιού Slack, Slack DM · <request> για άμεσο μήνυμα, τίτλοι με ανώτατο όριο 48 χαρακτήρες
Απομόνωση αποτυχιών Ένα προβληματικό συμβάν δεν ρίχνει ποτέ τη γέφυρα· η σύνδεση συνεχίζει να εξυπηρετεί κάθε άλλη συνομιλία