---
name: session-guard
description: שומר הסשנים. סשן אחד שמזהה סשני עבודה שנפלו על קטיעת זרם (Unexpected EOF), מגבלת חשבון או חסימת תוכן, ומחזיר אותם לעבודה בהודעה. מחליף את עצמו בסשן חדש כשההקשר שלו גדל. מילות טריגר - שומר סשנים, תחיה את הסשנים, סשנים נופלים, session guard.
---

# שומר הסשנים

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

**הכותרת שלך בסרגל: `שומר סשנים`.**

**שמור על תורות קצרים.** אתה נופל על אותן קטיעות, והסיכון עולה עם משך
התור. פעולה אחת או שתיים בכל תור, ותשובה של שורה או שתיים.

**הנתיב לסקריפט** (עדכנו לנתיב שלכם):
`<repo>/scripts/session-guard.mjs`

## הפעלה

1. `set_session_title` על `self` עם `שומר סשנים`.
2. **החלפת משמרת:** `list_sessions`. אם רץ סשן אחר בשם שמתחיל ב-`שומר סשנים`,
   שלח לו: "המשמרת עברה אליי (<המזהה שלך מ-get_session self>). עצור את
   המוניטור ואת הלולאה שלך, שנה את הכותרת ל'שומר סשנים (הוחלף)' וסיים. אין
   צורך להשיב לי."
3. בנה את רשימת השמירה (למטה) וחמש את המוניטור.
4. קבע פעימה ב-`ScheduleWakeup` בעוד 1200 שניות, עם הפרומפט `/session-guard מחזור`.

## רשימת השמירה

מתוך `list_sessions` (עם `limit: 40`) שומרים על כל סשן ש:

- אינו אתה ואינו שומר סשנים אחר.
- אינו סשן של משימה מתוזמנת.
- אינו בארכיון, ופעילותו האחרונה (`lastActivityAt`) ב-12 השעות האחרונות.

**אל תסנן לפי `isRunning`:** סשן שנפל מופיע כלא-רץ, ובדיוק אותו צריך למצוא.

## המוניטור

```bash
node <repo>/scripts/session-guard.mjs --session <sessionId> --session <sessionId>
```

מריצים ב-`Monitor` עם `persistent: true`. הסקריפט מוצא לבד את התמליל של כל
סשן לפי המזהה, גם אחרי שהסשן עבר ל-worktree.

- `UNRESOLVED <id>`: הסשן עוד לא קבע כותרת, ולכן המזהה שלו אינו בתמליל. חמש
  מחדש כשלאותו מזהה מצורף `=<cwd>` מתוך `list_sessions`, או `=<נתיב לקובץ jsonl>`
  כשבאותה תיקיית תמלילים יושבים כמה סשנים.
- `ERR`: דווח למשתמש בשורה אחת, אם הוא חוזר.
- הודעת תפוגה של המוניטור (הכלי קובע לפעמים 30 דקות גם עם `persistent`): חמש מחדש.

## כשמגיע FELL

| `kind`  | מה עושים                                                                                        |
| ------- | ----------------------------------------------------------------------------------------------- |
| `EOF`   | שולחים את הודעת ההמשך.                                                                          |
| `LIMIT` | **לא שולחים.** מדווחים למשתמש שהחשבון נחסם ומתי הוא נפתח, לפי נוסח השגיאה.                      |
| `BLOCK` | שולחים הודעה שמורה להימנע מהפעולה שהפילה (לרוב קריאת תמונה או תוכן שהמסנן חוסם) ולא לחזור עליה. |
| `OTHER` | קוראים את סוף התמליל בפרוסה קטנה לפני שמחליטים.                                                 |

הודעת ההמשך:

> התור הקודם שלך נקטע ב-API Error: JSON Parse error: Unexpected EOF (קטיעת
> זרם, שום תוכן לא אבד). המשך בדיוק מהמקום שבו עצרת, מהפעולה הבאה שתכננת.
> אין צורך להשיב לי.

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

## פעימת המחזור (`/session-guard מחזור`)

1. **בדיקת משמרת:**
   `node <repo>/scripts/session-guard.mjs --self <מזהה הסשן שלך>`. המזהה הוא
   ה-UUID שבנתיב תיקיית הסקראצ'פד שלך. הפלט: `SELF tokens=<n> ageMin=<n>`.
   אם `tokens >= 200000` או `ageMin >= 360`, בצע החלפת משמרת (למטה).
2. `list_sessions`. אם רשימת השמירה השתנתה, `TaskStop` למוניטור וחמש מחדש.
3. אם אין אירוע מוניטור חי, חמש מחדש.
4. קבע את הפעימה הבאה: 1200 שניות, או 1800 אם אין סשני עבודה ברשימה.

## החלפת משמרת

ככל שהשיחה של השומר מתארכת, כל תור שלו יקר יותר ממכסת החשבון, כי ההקשר כולו
נקרא מחדש. לכן כשהסף נחצה:

1. הצע למשתמש לפתוח שומר חדש (בכלי שהסביבה שלך מציעה לכך, למשל משימת רקע
   חדשה), עם הפרומפט `/session-guard`.
2. הודע לו בשורה אחת: "השומר הנוכחי הגיע לסף ההקשר. פתח שומר חדש. אני
   ממשיך לשמור עד שהחדש יעלה."
3. **המשך לשמור.** אל תעצור לפני שהשומר החדש שולח לך את הודעת ההחלפה, ואל
   תפתח בקשה שנייה. אם עברו 60 דקות בלי החלפה, הזכר פעם אחת.
4. כשמגיעה הודעת ההחלפה: `TaskStop` למוניטור, `ScheduleWakeup` עם `stop: true`,
   שנה את הכותרת ל-`שומר סשנים (הוחלף)`, ושורת סיום אחת.

## כשהשומר עצמו נופל

אין מי שישלח לך הודעה. מה שמחזיר אותך הוא אירוע שאינו תלוי בתור שנקטע:
אירוע של המוניטור (נפילה של סשן אחר או הודעת התפוגה שלו) או פעימה שכבר
נקבעה. במקרה הגרוע זה עד חצי שעה. לכן בכל תור קבע את הפעימה הבאה **לפני**
פעולות אחרות, כדי שתור שנקטע באמצע לא ישאיר אותך בלי פעימה. המשתמש יכול
תמיד לכתוב "Try again". אין להפעיל שני שומרים שמשגיחים זה על זה, כי הם
מכפילים את העלות ואת ההודעות לסשנים.
