Skip to content

SDK תוספים וארגז חול

תוספי Triggerfish מאפשרים לכם להרחיב את הסוכן עם קוד מותאם המתקשר עם מערכות חיצוניות -- שאילתות CRM, פעולות בסיס נתונים, אינטגרציות API, זרימות עבודה רב-שלביות -- תוך הרצה בתוך ארגז חול כפול שמונע מהקוד לבצע כל דבר שלא הורשה לו באופן מפורש.

סביבת ריצה

תוספים רצים על Deno + Pyodide (WASM). ללא Docker. ללא מכולות. ללא דרישות מוקדמות מעבר להתקנת Triggerfish עצמה.

  • תוספי TypeScript רצים ישירות בארגז החול של Deno
  • תוספי Python רצים בתוך Pyodide (מפרש Python שקומפל ל-WebAssembly), שעצמו רץ בתוך ארגז החול של Deno
ארגז חול לתוספים: ארגז חול Deno עוטף ארגז חול WASM, קוד התוסף רץ בשכבה הפנימית ביותר

ארכיטקטורת ארגז חול כפול זו מבטיחה שגם אם תוסף מכיל קוד זדוני, הוא אינו יכול לגשת למערכת הקבצים, לבצע קריאות רשת לא מוצהרות, או לברוח למערכת המארחת.

מה תוספים יכולים לעשות

לתוספים יש פנים גמיש בתוך גבולות מחמירים. בתוך ארגז החול, התוסף יכול:

  • לבצע פעולות CRUD מלאות במערכות יעד (באמצעות הרשאות המשתמש)
  • לבצע שאילתות וטרנספורמציות נתונים מורכבות
  • לתזמר זרימות עבודה רב-שלביות
  • לעבד ולנתח נתונים
  • לשמור מצב תוסף בין הפעלות
  • לקרוא לכל נקודת קצה API חיצונית מוצהרת

מה תוספים אינם יכולים לעשות

מגבלהכיצד נאכפת
גישה לנקודות רשת לא מוצהרותארגז החול חוסם כל קריאות רשת שאינן ברשימת ההיתר
פליטת נתונים ללא תווית סיווגה-SDK דוחה נתונים לא מסווגים
קריאת נתונים ללא הפצת זיהוםה-SDK מזהם אוטומטית את הסשן כאשר ניגשים לנתונים
שמירת נתונים מחוץ ל-Triggerfishללא גישה למערכת קבצים מתוך ארגז החול
חילוץ דרך ערוצים צדדייםמגבלות משאבים נאכפות, ללא גישה ל-socket גולמי
שימוש באישורי מערכתה-SDK חוסם get_system_credential(); אישורי משתמש בלבד

אבטחה sdk.get_system_credential() חסום בתכנון.

תוספים חייבים תמיד להשתמש באישורי משתמש מואצלים דרך sdk.get_user_credential(). זה מבטיח שהסוכן יכול לגשת רק למה שהמשתמש יכול לגשת -- לעולם לא יותר. :::

שיטות SDK לתוספים

ה-SDK מספק ממשק מבוקר לתוספים לתקשורת עם מערכות חיצוניות ופלטפורמת Triggerfish.

גישה לאישורים

typescript
// קבלת אישור מואצל של המשתמש לשירות
const credential = await sdk.get_user_credential("salesforce");

// בדיקה אם המשתמש חיבר שירות
const connected = await sdk.has_user_connection("notion");

פעולות נתונים

typescript
// שאילתת מערכת חיצונית באמצעות הרשאות המשתמש
const results = await sdk.query_as_user("salesforce", {
  query: "SELECT Name, Amount FROM Opportunity WHERE StageName = 'Closed Won'",
});

// פליטת נתונים חזרה לסוכן — תווית סיווג נדרשת
sdk.emitData({
  classification: "CONFIDENTIAL",
  payload: results,
  source: "salesforce",
});

כל קריאה ל-sdk.emitData() דורשת תווית classification. אם

משמיטים אותה, ה-SDK דוחה את הקריאה. זה מבטיח שכל הנתונים הזורמים מתוספים להקשר הסוכן מסווגים כראוי. :::

מחזור חיי תוסף

כל תוסף עוקב אחר מחזור חיים שמבטיח סקירת אבטחה לפני הפעלה.

1. תוסף נוצר (על ידי משתמש, סוכן או צד שלישי)
       |
       v
2. תוסף נבנה באמצעות Plugin SDK
   - חייב ליישם ממשקים נדרשים
   - חייב להצהיר על נקודות קצה ויכולות
   - חייב לעבור אימות
       |
       v
3. תוסף נכנס למצב UNTRUSTED
   - הסוכן אינו יכול להשתמש בו
   - הבעלים/מנהל מקבל הודעה: "ממתין לסיווג"
       |
       v
4. בעלים (אישי) או מנהל (ארגוני) סוקר:
   - לאילו נתונים תוסף זה ניגש?
   - אילו פעולות הוא יכול לבצע?
   - מקצה רמת סיווג
       |
       v
5. תוסף פעיל בסיווג שהוקצה
   - הסוכן יכול להפעיל בתוך מגבלות מדיניות
   - כל ההפעלות עוברות דרך ווי מדיניות

ברמה האישית, אתם הבעלים -- אתם סוקרים ומסווגים את התוספים שלכם.

ברמה הארגונית, מנהל מנהל את רישום התוספים ומקצה רמות סיווג. :::

חיבוריות בסיס נתונים

דרייברים מקומיים לבסיסי נתונים (psycopg2, mysqlclient, וכו') אינם עובדים בתוך ארגז החול WASM. תוספים מתחברים לבסיסי נתונים דרך API מבוססי HTTP במקום.

בסיס נתוניםאפשרות מבוססת HTTP
PostgreSQLPostgREST, Supabase SDK, Neon API
MySQLPlanetScale API
MongoDBAtlas Data API
SnowflakeREST API
BigQueryREST API
DynamoDBAWS SDK (HTTP)

זהו יתרון אבטחה, לא מגבלה. כל גישה לבסיס נתונים זורמת דרך בקשות HTTP הניתנות לבדיקה ולשליטה שארגז החול יכול לאכוף ומערכת הביקורת יכולה לתעד.

כתיבת תוסף TypeScript

תוסף TypeScript מינימלי השואל REST API:

typescript
import type { PluginResult, PluginSdk } from "triggerfish/plugin";

export async function execute(sdk: PluginSdk): Promise<PluginResult> {
  // בדיקה אם המשתמש חיבר את השירות
  if (!await sdk.has_user_connection("acme-api")) {
    return {
      success: false,
      error: "User has not connected Acme API. Please connect it first.",
    };
  }

  // שאילתה באמצעות אישורי המשתמש
  const data = await sdk.query_as_user("acme-api", {
    endpoint: "/api/v1/tasks",
    method: "GET",
  });

  // פליטת נתונים מסווגים חזרה לסוכן
  sdk.emitData({
    classification: "INTERNAL",
    payload: data,
    source: "acme-api",
  });

  return { success: true };
}

כתיבת תוסף Python

תוסף Python מינימלי:

python
async def execute(sdk):
    # בדיקת חיבור
    if not await sdk.has_user_connection("analytics-db"):
        return {"success": False, "error": "Analytics DB not connected"}

    # שאילתה באמצעות אישורי המשתמש
    results = await sdk.query_as_user("analytics-db", {
        "endpoint": "/rest/v1/metrics",
        "method": "GET",
        "params": {"period": "7d"}
    })

    # פליטה עם סיווג
    sdk.emit_data({
        "classification": "CONFIDENTIAL",
        "payload": results,
        "source": "analytics-db"
    })

    return {"success": True}

תוספי Python רצים בתוך סביבת ריצה Pyodide WASM. מודולי ספרייה סטנדרטית זמינים, אך הרחבות C מקומיות אינן. השתמשו ב-API מבוססי HTTP לקישוריות חיצונית.

סיכום אבטחת תוספים

  • תוספים רצים בארגז חול כפול (Deno + WASM) עם בידוד מחמיר
  • כל גישת רשת חייבת להיות מוצהרת במניפסט התוסף
  • כל נתונים שנפלטים חייבים לשאת תווית סיווג
  • אישורי מערכת חסומים -- רק אישורי משתמש מואצלים זמינים
  • כל תוסף נכנס למערכת כ-UNTRUSTED וחייב להיות מסווג לפני שימוש
  • כל הפעלות תוסף עוברות דרך ווי מדיניות ומבוקרות במלואן