שליטה מרחוק ונייד
Control Center הוא אפליקציית שולחן עבודה, אבל העבודה שהוא עוקב אחריה לא
נעצרת כשאתם מתרחקים משולחן העבודה. שליטה מרחוק משייכת את הטלפון שלכם אל
cc_server שלכם, באמצעות Remote, אפליקציית
הלוויה שכתובתה remote.usectrl.dev, כדי שתוכלו לעקוב אחרי הצי משם: לקרוא
הודעות וכרטיסים, להשיב לסוכן, לעשות טריאז׳ לעדכוני החדשות — בלי שהשמע,
התמליל, קוד המקור או פרטי ההתחברות שיושבים על השרת יעזבו אותו אי פעם.
חישבו עליו כעל בן לוויה לשולחן העבודה שנועד בעיקר לקריאה. הוא לא נועד להחליף את לקוח שולחן העבודה המלא.
תעבורה
קטע בשם “תעבורה”הטלפון מגיע אל cc_server דרך WebSocket: או בחיבור ישיר (loopback, LAN,
tailnet או wss://) או בחדר שמוגן בהזמנה במתווך איתות שמעביר מסגרות אטומות.
אין ערוץ נתונים עמית-לעמית.
מה הטלפון יכול לעשות
קטע בשם “מה הטלפון יכול לעשות”הטלפון המשויך מגיע לפרוסה קטנה ומכוונת של משטח השרת:
- לקרוא כרטיסים, סוכנים, מרחבים וההודעות שלהם ואת עדכוני החדשות שלכם
- להשיב: לשלוח הודעה במרחב, לעדכן כרטיס או להקצות אותו, לסמן מאמר כנקרא או כנשמר
- להריץ פלייבוק: ליצור מופע של תבנית תוכנית שמורה עם הפרמטרים שלה. הפעולה רק מציעה תוכנית; שום דבר לא מתבצע ולא מוציא תקציב עד שמפעיל מאשר אותה ב-Plan Studio בלקוח מלא
- להחליף סביבות עבודה, מתוך הבורר של הטלפון עצמו
זה כמעט כל מה שיש. הטלפון הוא ישות בעלת הרשאה נמוכה יותר מאשר לקוח מלא. הוא לא יכול להריץ תהליכים, להוציא תקציב LLM, לדחוף ל-GitHub או ליצור סביבות עבודה. ראו מודל הגישה כדי להבין איך זה נאכף ולא רק מיועד לכך.
איך נבנה הקישור
קטע בשם “איך נבנה הקישור”החיבור נוסע על ממסר מתווך: השרת מצטרף לחדר אחד שמוגן בהזמנה במתווך
wss:// בתור הבעלים שלו, וכל לקוח משויך — שולחן עבודה, אינטרנט, טלפון —
מצטרף לאותו חדר עם אסימון כניסה מוגבל בזמן. שלושה רכיבים מתחברים יחד:
| רכיב | תפקיד |
|---|---|
| Remote (אפליקציית הטלפון) | אפליקציית האינטרנט הנלווית, שמתארחת כברירת מחדל ב-remote.usectrl.dev, או באירוח עצמי. נטענת בדפדפן ושומרת את רשומת השיוך ב-IndexedDB. |
| מתווך הממסר | ממסר wss:// חסר מצב (cc_signaling_server) שמארח חדרים של N צדדים. הוא נושא רק מסגרות אטומות: כל מטען נאטם מקצה לקצה בין הטלפון לשרת, כך שהמתווך לעולם אינו רואה נתוני אפליקציה או את סוד השיוך ולעולם אינו מפרש את מה שהוא מעביר. |
cc_server |
הבעלים של החדר. הוא עונה לקריאות של הטלפון דרך אותו מפיץ שכל לקוח אחר משתמש בו. |
הצעת שיוך נושאת מתאר חיבור שמפרט כל נתיב אל השרת (LAN, tailnet, wss://
ציבורי, ממסר) וגם טביעת אצבע של הזהות שלו. הפותר של הטלפון בוחר את הנתיב
הנגיש הטוב ביותר ומצמיד את טביעת האצבע בחיבור הראשון (TOFU); הממסר מבטיח
קישוריות גם כשאין נתיב ישיר, בלי יכולת לקרוא את התעבורה.
מה מכיל מטען השיוך
קטע בשם “מה מכיל מטען השיוך”השיוך מונפק מהאפליקציה ונמסר כקישור עמוק; ראו שיוך מכשיר לתיאור ההליך. מה שחשוב כאן הוא האנטומיה.
https://<pwa-host>/#<payload>המטען נוסע בקטע של כתובת ה-URL — החלק שאחרי # שדפדפנים לעולם אינם
שולחים לשרת, כך שמארח ה-HTTPS של ה-PWA לעולם אינו רואה אותו. הוא נושא את כל
מה שהטלפון צריך כדי להגיע לשרת ולהוכיח מי הוא: מתאר החיבור (כל נתיב וגם
טביעת האצבע של הזהות), מזהה מכשיר שזה עתה הונפק, מפתח בן 32 בתים ששותף מראש
וחותמת תפוגה. הטלפון מפענח אותו, שומר רשומת שיוך מקומית ומסיר את הקטע כך
שהסוד יוצא מכתובת ה-URL.
למטען יש שתי צורות והן אינן ניתנות להחלפה. קוד ה-QR לטלפון
שמונפק מפאנל השיוך שבתוך האפליקציה הוא ה-PairingPayload מגרסה v2 שלמעלה,
ומצביע על מארח ה-PWA של Remote. cc_server pair --client-url מפיק קישור שונה
וישן יותר מגרסה v1 ({s, i, k} — כתובת השרת, מזהה מכשיר, מפתח) שמיועד ללקוח
האינטרנט בלבד.
הם גם נבדלים בתוקף, וקל לטעות בכך:
| הונפק על ידי | תפוגת פרטי ההתחברות |
|---|---|
פאנל השיוך שבתוך האפליקציה (pairing.mint) |
30 יום, תמיד |
cc_server pair משורת הפקודה |
אין — פרטי ההתחברות אינם פגים |
מודל הגישה
קטע בשם “מודל הגישה”מכשיר משויך הוא מאומת אך לא מהימן. כמה שערים בלתי תלויים מונעים משיוך מאושר (או שהודלף) להפוך לשליטה מלאה בשרת.
1. החברות, לא השיוך, היא הגבול
קטע בשם “1. החברות, לא השיוך, היא הגבול”מפתח שיוך תקף מוכיח איזה מכשיר אתם. מה שמותר לכם לקרוא או לשנות נקבע לפי התפקיד שלכם בסביבת העבודה, שנפתר מחדש בכל קריאה וקריאה, ולפי הענקות לפי מאגר בכל דבר שחושף תוכן של מאגר. מכשיר שמחזיק מפתח תקין לחלוטין אך שייך למשתמש שאינו חבר בסביבת העבודה הנקובה נדחה עם “Not a member of this workspace”.
רצפת התפקיד נגזרת מסוג הפעולה, אלא אם היא מצהירה על רצפה משלה: קריאות דורשות
guest, שינויים דורשים member, ופעולות הרסניות דורשות admin.
2. הטלפון הוא דרג סשן נמוך יותר
קטע בשם “2. הטלפון הוא דרג סשן נמוך יותר”מעבר לבדיקת התפקיד, סשן של טלפון נושא יכולת נמוכה יותר מסשן של שולחן עבודה או של אינטרנט. פעולות שמוצהרות כ“ללקוח מלא בלבד” נדחות עבור טלפון לפני שהמטפל רץ, ולא משנה מה מידת ההרשאה של המשתמש שמאחוריו: הנפקה, רישום, שינוי שם וביטול של שיוכי מכשירים; קריאה וקביעה של קישוריות מנהרה; גיבוי שרת וייצוא/ייבוא של סביבת עבודה; זיהוי תהליכים והריגתם; בדיקות מתאמים; הגדרות השרת; ניהול SSO; שליטה בצי; והשתלטות על סוכן שרץ או החזרתו.
3. רשימת היתר לכלים עם דחייה כברירת מחדל
קטע בשם “3. רשימת היתר לכלים עם דחייה כברירת מחדל”במשטח כלי ה-MCP ספציפית (tools/call), רשימת היתר שדוחה כברירת מחדל קובעת
אילו כלים הטלפון רשאי להפעיל. כל מה שאינו ברשימה נדחה לפני שהוא רץ. הרשימה
מוטה לקריאה ולתצפית, בתוספת קומץ כתיבות מקומיות בלבד — הודעה, עדכון
כרטיס, סימון מאמר — שאינן מוציאות תקציב LLM, אינן מפעילות תהליך ואינן נוגעות
במערכת חיצונית.
נדחים, למשל: התייעצות עם סוכן, התחלת סקירת AI, הריגת סוכן, פרסום סקירה ל-GitHub, גיוס סוכנים או פיטוריהם, ויצירת סביבת עבודה.
4. תחימת סביבת עבודה לכל קריאה
קטע בשם “4. תחימת סביבת עבודה לכל קריאה”השרת אינו מחזיק שום “סביבת עבודה נוכחית”. הוא חסר מצב בתכנונו: כל קריאה
בתחום סביבת עבודה חייבת לציין את ה-workspace_id של היעד בארגומנטים שלה,
והמפיץ דוחה את הקריאה על הסף כשזה חסר או כשהוא מציין סביבת עבודה שאינה רשומה
בשרת — לפני שמשהו פותח מסד נתונים. לכן טלפון לעולם אינו יכול לרשת את התחום
של לקוח אחר או לגלוש לתוכו, וציון סביבת עבודה זרה גם הוא לא עוזר, מפני
שבדיקת החברות בשער 1 עדיין חלה. זהו אותו אינווריאנט של
בידוד סביבות עבודה שכל שאר המוצר
אוכף.
5. מסגרות אטומות מקצה לקצה עם מפתח ששותף מראש
קטע בשם “5. מסגרות אטומות מקצה לקצה עם מפתח ששותף מראש”כל מסגרת בין הטלפון לשרת נאטמת במפתח השיוך; אסימון הכניסה רק מכניס לקוח לחדר, והוא אינו מפענח דבר. המתווך מעביר טקסט מוצפן ולעולם אינו רואה את המפתח. מכשיר שנשלל מגלה שפרטי ההתחברות שלו כבר אינם, ולכן הוא נכשל באופן סגור בחיבור מחדש.
פרטי התחברות שהונפקו באפליקציה מוגבלים ל-30 יום; לאחר מכן שער החיבור מכשיל אותם ועל הטלפון לבצע שיוך מחדש. השלילה חיה: השרת עוקב אחר טבלת המכשירים ומפיל סשנים פתוחים של מכשיר שנשלל בתוך שניות במקום להמתין לחיבור הבא שלו.
6. הגבלת קצב לפי ישות
קטע בשם “6. הגבלת קצב לפי ישות”מגביל בחלון מחליק חוסם תעבורת כלים מרוחקת ב-120 קריאות בדקה, עם תקרה משנה צרה יותר של 30 בדקה לפעלים המשנים. התקציב שייך לישות, לא לסשן: שלושה מהמכשירים שלכם יונקים מהקצאה אחת, כך שלקוח שנחטף אינו יכול לקנות מרווח על ידי פתיחת סשנים נוספים, וחבר רועש אחד אינו יכול להרעיב את האחרים.
7. מתווך שלא לומד דבר
קטע בשם “7. מתווך שלא לומד דבר”מתווך הממסר טיפש בכוונה: הוא מארח חדרים, מעביר מסגרות אטומות ואינו מחזיק חשבונות, נתוני אפליקציה או מפתחות. חדרים מוגנים בהזמנה וחולפים. נתוני האפליקציה, השמע, התמליל, קוד המקור ופרטי ההתחברות — כולם נשארים על השרת.
עדכונים חיים
קטע בשם “עדכונים חיים”לאחר השיוך, הטלפון מקבל עדכונים חיים כמסגרות התראה — הודעות חדשות של סוכנים, כרטיסים שהוקצו לכם, שינויי סטטוס — בשיקוף של ההתראות של שולחן העבודה עצמו. השרת משדר את המסגרות האלה לכל סשן מחובר, והסינון לפי סביבת עבודה מיושם בצד הלקוח, כך שמה שאתם רואים מתוחם לסביבת העבודה שאתם צופים בה.
היכן זה נמצא
קטע בשם “היכן זה נמצא”| משטח | מה הוא מציג |
|---|---|
הגדרות ← אישי ← המכשירים שלכם (/workspaces/:workspaceId/settings/you/devices) |
לקוחות משויכים עם סטטוס חי, בתוספת צמד לקוח חדש (דפדפן אינטרנט, אפליקציית שולחן עבודה או טלפון) וביטול גישה |
אותו פאנל מנפיק שיוכים גם עבור דפדפן או אפליקציית שולחן עבודה שניים, לא רק עבור טלפונים — הזרימה זהה, ורק הקישור העמוק שונה.
ראו גם
קטע בשם “ראו גם”- סביבות עבודה ובידוד: התחימה לכל קריאה שעליה זה נשען
- רב־משתמשים — זהות, חברות ונוכחות: תפקידים, חברות והענקות לפי מאגר
- פריסה ולקוחות: היכן השליטה מרחוק יושבת בין דרגי הלקוחות
- ארכיטקטורה: היכן השליטה מרחוק יושבת במערכת השכבות
- שיוך מכשיר