Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
f62a9c8
fix(security): ניקוי טוקן גם באירועי transactions של Sentry
claude Aug 18, 2026
6d70897
refactor(security): איחוד לוגיקת ה-before_send והדפוס למקור אמת יחיד
claude Aug 18, 2026
1d0bd3e
test: חיזוק הטסט של scrub_sentry_event — אימות אירוע ממשי ולא רק היעד…
claude Aug 18, 2026
59c0ac4
fix(repo-browser): מוני הריפו מתעדכנים בהחלפת ריפו
claude Aug 19, 2026
81a1b6d
chore: איחוד עם היסטוריית הענף הישן
claude Aug 19, 2026
ac8e377
fix(repo-browser): ערך לא מספרי מוצג כ-— ולא כאפס, וטסטים התנהגותיים
claude Aug 19, 2026
1ffb47f
docs: שורת טריגר לדפוס "פעולה שרוכבת על שורת לוג"
claude Aug 19, 2026
1a2f33f
docs: תיקון שורת הטריגר לדפוס "פעולה שרוכבת על שורת לוג"
claude Aug 19, 2026
d5cb343
chore: איחוד עם main אחרי מיזוג #3243
claude Aug 19, 2026
5f268e6
docs: הרחבת שורת הטריגר — כל guard שמונע הערכה, לא רק isEnabledFor
claude Aug 19, 2026
8bb6ed2
chore: איחוד עם main אחרי מיזוג #3245
claude Aug 19, 2026
91538f1
docs: דף זרימת שיתוף ב-Gist
claude Aug 19, 2026
9e03fcd
chore: איחוד עם main אחרי מיזוג #3246
claude Aug 19, 2026
580cb82
docs: תיקוני ריוויו לדף זרימת ה-Gist
claude Aug 19, 2026
1fd23f9
docs: מיפוי נכון של השיתוף המרובה ל-create_gist_multi
claude Aug 19, 2026
0a61e25
Merge branch 'main' into claude/bot-hacked-messages-comsrh
amirbiron Aug 19, 2026
22e7c64
docs: מיעון עמיד להטמעות קוד בתיעוד, וטסט שאוכף אותו
claude Aug 19, 2026
f50d525
Merge remote-tracking branch 'origin/claude/bot-hacked-messages-comsr…
claude Aug 19, 2026
f6bb2b9
docs: מפת תיעוד נגזרת לסוכני AI + מחולל ורענון אוטומטי
claude Aug 19, 2026
5875579
fix(docs-map): תיקוני ריוויו — ירידה לפיגומים, גדרות, והקשחת ה-Action
claude Aug 19, 2026
425bd41
fix(docs-map): סבב ריוויו שני — הזחה, קישורים, בטיחות כתיבה והקשחת ה-…
claude Aug 19, 2026
ecf4adb
fix(docs-map): לולאה אינסופית על עמוד-טבלה, הגבלת ה-Action ל-main, וט…
claude Aug 19, 2026
53103c0
fix(docs-map): ממצאי Ultrareview — טוקן הדחיפה, שחזור rebase, וכפילויות
claude Aug 19, 2026
d232e17
chore: הסרת תו כיווניות אחרון שנשאר בעזרת ה---out
claude Aug 19, 2026
a8d6d7e
fix(docs-map): טסט הטבלה מוכיח את התיקון, ו-PR חסום לא נשאר שקט
claude Aug 19, 2026
d3bde37
style: פיצול שורת נתוני הטסט שחרגה מ-120 תווים
claude Aug 19, 2026
852262f
fix(docs-map): גם מסלול "PR קיים" נכשל בלי PAT, ו---check/--out סותרים
claude Aug 19, 2026
6e3bffa
fix(docs-map): ה-PAT לא נשמר בדיסק, וה-docstring מעודכן ל---out
claude Aug 19, 2026
0c43192
refactor(docs-map): חילוץ הפרסום לסקריפט עם בידוד סוד אמיתי
claude Aug 19, 2026
28e8f6a
fix(docs-map): פרסום דרך Contents API — הסרת הצורך ב-PAT
claude Aug 19, 2026
fcda497
fix(docs-map): הזרימה כולה הייתה no-op ירוק — בדיקת קבלה מקצה לקצה ות…
claude Aug 20, 2026
35d07b3
fix(docs-map): טבלאות Markdown, safe_rmrf, paths, וטסטים שבודקים את ה…
claude Aug 20, 2026
7d7af1a
refactor(docs-map): בדיקת טריות במקום פרסום אוטומטי ל-main
claude Aug 20, 2026
aa933cd
fix(docs-map): טבלת Markdown היא בלוק ולא שורה — שורות הנתונים דלפו ל…
claude Aug 20, 2026
3a1fd35
fix(docs-map): טבלת Markdown נגמרת גם בתחילת בלוק, לא רק בשורה ריקה
claude Aug 20, 2026
279b5d0
fix(docs-map): הוספתי טיפול לכל סוגי הבלוקים ב-_MD_BLOCK_START_RE
cubic-dev-ai[bot] Aug 20, 2026
38f2c15
fix(docs-map): מקור אחד לרשימת הבלוקים, במקום שתיים שנפרדות בשקט
claude Aug 20, 2026
b693da7
fix(docs-map): גדר נסגרת לפי כללי המקור, לא לפי שלושה תווים ראשונים
claude Aug 20, 2026
36f5eb7
fix(docs-map): שורה שנראית כמו גדר ואינה כזו נאספת כפרוזה
claude Aug 20, 2026
b2fe4a8
refactor(docs-map): התקציר מוצהר בראש העמוד, לא מחולץ מהגוף
claude Aug 20, 2026
b7dbb0f
docs(ai-map): 26 הממצאים — כפילות, תקצירים אנושיים, ושלושה תיקוני קוד
claude Aug 20, 2026
0351db9
docs(ai-map): כותרות יתומות, תקצירים, סתירות קוד/תיעוד, ושני באגי מחולל
claude Aug 20, 2026
cfa8090
docs(ai-map): טענות שדורשות אימות יוצאות מהתקצירים, ובדיקה שאוכפת
claude Aug 20, 2026
9b3d5f7
fix(ai-map): המודל שמאחורי דילוג ה-RST היה שגוי — מוחלף במדידה
claude Aug 20, 2026
0652533
fix(ai-map): שאלת "אילו directives שקופים" נמחקת, לא נענית שוב
claude Aug 20, 2026
7eb5201
docs(doc-authoring): הטענה על קידום ל-docinfo מתוקנת גם בעמוד
claude Aug 20, 2026
0dd64b1
Merge branch 'main' into claude/bot-hacked-messages-comsrh
claude Aug 20, 2026
6a850b6
test(ai-map): בדיקה לתקציר שכל כולו הכותרת
claude Aug 20, 2026
4ec5db0
test(ai-map): הטענה המתה על docinfo יורדת גם מהבדיקות, ומקרה הכלה חלקית
claude Aug 20, 2026
aaa7b42
feat(primer): תקרת ההגשה עולה ל-24KB, והמספר מפסיק להיות משוכפל
claude Aug 20, 2026
1692dce
Merge branch 'main' into claude/bot-hacked-messages-comsrh
amirbiron Aug 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/environment-variables.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2178,7 +2178,7 @@
.. note::

**הפריימר לסוכן** (``GET /api/agent/primer``) אינו מוסיף אף משתנה סביבה.
תקרת ה-8KB ומשך ה-cache (60 שניות) הם קבועים ב-``mcp_server/primer.py``
תקרת ה-24KB ומשך ה-cache (60 שניות) הם קבועים ב-``mcp_server/primer.py``
במכוון — התקרה היא תקציב מול חלון ההקשר של המודל ולא כוונון תפעולי, ומצב
הכשל של העלאתה בלתי-נראה (הקשר נאכל בשקט). שינוי דורש PR. תוכן הפריימר
נערך מהדפדפן ב-``/settings`` ונשמר ב-``user_preferences``, לא ב-ENV.
Expand Down
8 changes: 4 additions & 4 deletions docs/mcp-server.rst
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ OAuth 2.1) וגם מול **Claude Code / Claude Desktop** (טוקן אישי).
ושמות קבצים בלי מסגור הם רעש ולא פריימר.
* - ``401``
- אין טוקן, או שהטוקן בוטל/פג.
* - תקרת 8KB
* - תקרת 24KB
- חריגה גורמת לחיתוך + שורה שמודיעה על כך; **לעולם לא שגיאה**, כי פריימר
חתוך עדיף על פריימר חסר. שורת המצב מקבלת מקום שמור ולא נדחפת החוצה.
* - Cache
Expand All @@ -172,7 +172,7 @@ OAuth 2.1) וגם מול **Claude Code / Claude Desktop** (טוקן אישי).
``sk-``, JWT, ``KEY=...`` וכו') לפני ההחזרה — גם אם הודבקו לשדה בטעות.
ערכי משתני סביבה של השרת אינם נכנסים לגוף כלל.

התקרה וה-TTL הם **קבועים בקוד** ולא משתני סביבה, במכוון: ה-8KB אינו כוונון
התקרה וה-TTL הם **קבועים בקוד** ולא משתני סביבה, במכוון: התקרה אינה כוונון
תפעולי אלא תקציב מול חלון ההקשר של המודל. אילו היה משתנה סביבה, מצב הכשל של
העלאתו היה בלתי-נראה — הקשר נאכל בשקט בלי שאף אחד מתריע. שינוי דורש PR.

Expand All @@ -188,10 +188,10 @@ OAuth 2.1) וגם מול **Claude Code / Claude Desktop** (טוקן אישי).
~~~~~~~~~~~~~

``/settings`` → הכרטיס **"הוראות לסוכן"**. השדה מציג מונה בייטים חי ומתריע
כשמתקרבים לתקרה (מ-7KB) וכשחוצים אותה — כדי שחריגה תיתפס בכתיבה, ולא רק דרך
כשמתקרבים לתקרה (מ-21KB) וכשחוצים אותה — כדי שחריגה תיתפס בכתיבה, ולא רק דרך
שורת חיתוך שמופיעה בגוף שרק הסוכן קורא.

האחסון (16KB תווים) רחב מההגשה (8KB) בכוונה: החיתוך הוא החלטה של ההגשה ולא
האחסון (48KB תווים) רחב מההגשה (24KB) בכוונה: החיתוך הוא החלטה של ההגשה ולא
של האחסון, כדי שלא יימחק טקסט שהמשתמש כתב. הסודות נשמרים כפי שהם ומסוננים רק
בהגשה — אחרת המשתמש היה פותח את ההגדרות ומוצא ``***REDACTED***`` בלי לדעת מה
נמחק לו.
Expand Down
4 changes: 2 additions & 2 deletions mcp_server/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ curl -sS -H "Authorization: Bearer $CODEKEEPER_PAT" \
- **תוכן:** שדה "הוראות לסוכן" מעמוד ההגדרות בוובאפ, ואחריו שורת מצב קצרה עם שלושת
הקבצים האחרונים שנשמרו ומתי.
- **`204`** כששדה ההוראות ריק (ולא `200` עם גוף ריק). **`401`** בלי טוקן תקין.
- **תקרת 8KB:** חריגה ⇒ חיתוך + שורה שמודיעה על כך. לעולם לא שגיאה.
- **תקרת 24KB:** חריגה ⇒ חיתוך + שורה שמודיעה על כך. לעולם לא שגיאה.
- **Cache 60 שניות** לכל משתמש (`Cache-Control: private, max-age=60`).
- **סינון סודות** על כל הגוף לפני ההחזרה.

Expand Down Expand Up @@ -262,7 +262,7 @@ Claude.ai → /authorize → provider יוצר txn → הפניה ל-webapp /oau
| `oauth_provider.py` | מימוש חוזה ה‑OAuth של ה‑SDK (כולל PAT מאוחד) |
| `oauth_identity.py` | חתימת/אימות זהות HMAC (משותף עם הוובאפ) |
| `oauth_routes.py` | מסך ה‑consent + הנפקת code |
| `primer.py` | `GET /api/agent/primer` — פריימר טקסט לסוכן (8KB, cache 60ש׳, סינון סודות) |
| `primer.py` | `GET /api/agent/primer` — פריימר טקסט לסוכן (24KB, cache 60ש׳, סינון סודות) |
| `server.py` | חיווט FastMCP: כלים + OAuth + ASGI |
| `app.py` | נקודת כניסה: בוחר PAT/OAuth לפי ENV |

Expand Down
10 changes: 5 additions & 5 deletions mcp_server/primer.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@
שהאפליקציה מוגנת: במצב OAuth (הפרודקשן) ה-``PATAuthMiddleware`` לא מותקן בכלל,
וה-SDK עוטף רק את ה-mount של ``/mcp`` — ראוט שנרשם ידנית יוצא ציבורי. ראו את
ה-docstring של ``mcp_server.auth``.
* **תקרת 8KB.** חורגים ⇒ חותכים ומוסיפים שורה שאומרת שנחתך. לעולם לא שגיאה:
* **תקרת 24KB.** חורגים ⇒ חותכים ומוסיפים שורה שאומרת שנחתך. לעולם לא שגיאה:
פריימר חתוך עדיף על פריימר חסר.
* **60 שניות cache.** נקרא בפתיחת כל סשן, ולכן אסור לו לגעת בשאילתה כבדה.
* **סינון סודות.** הפריימר עובר דרך המודל, ולכן הוא מסונן בכל מקרה — גם אם
המשתמש הדביק מפתח לשדה ההוראות בטעות. ערכי משתני סביבה של השרת לא נכנסים
לגוף כלל: אין כאן שום קריאה ל-``os.environ``.

התקרה וה-TTL הם **קבועים בקוד** ולא משתני סביבה, במכוון. ה-8KB אינו כוונון
התקרה וה-TTL הם **קבועים בקוד** ולא משתני סביבה, במכוון. התקרה אינה כוונון
תפעולי אלא תקציב מול חלון ההקשר של המודל, שמתחלק עם כל השאר בסשן; אילו היה
משתנה סביבה, מצב הכשל של העלאתו היה בלתי-נראה (הקשר נאכל בשקט, בלי שאף אחד
מתריע). שינוי דורש PR — וזה החיכוך הנכון.
Expand All @@ -43,7 +43,7 @@
PRIMER_PATH = "/api/agent/primer"

#: תקרת גודל הגוף בבייטים. קבוע במכוון — ראו את ה-docstring של המודול.
MAX_BYTES = 8 * 1024
MAX_BYTES = 24 * 1024

#: משך ה-cache בשניות.
CACHE_TTL_SECONDS = 60
Expand All @@ -64,10 +64,10 @@
#: סף האזהרה שה-UI בוובאפ מציג. חי כאן כי ``MAX_BYTES`` הוא מקור האמת שלו —
#: ``webapp.routes.settings_routes`` משכפל את שניהם (שני שירותים נפרדים, בלי
#: ייבוא ביניהם) ו-``test_mcp_primer`` מוודא שהערכים לא התפצלו.
WARN_BYTES = 7 * 1024
WARN_BYTES = 21 * 1024

_TRUNCATION_NOTICE = (
"\n[הפריימר נחתך כאן: ההוראות חורגות מתקרת 8KB. "
f"\n[הפריימר נחתך כאן: ההוראות חורגות מתקרת {MAX_BYTES // 1024}KB. "
"קצרו אותן בהגדרות CodeKeeper — ההמשך לא נשלח לסוכן.]"
)

Expand Down
23 changes: 21 additions & 2 deletions tests/test_mcp_primer.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""טסטים ל-``GET /api/agent/primer`` (mcp_server/primer.py).

מכסה את ארבעת האילוצים של האנדפוינט: אימות, תקרת 8KB, cache של 60 שניות,
מכסה את ארבעת האילוצים של האנדפוינט: אימות, תקרת 24KB, cache של 60 שניות,
וסינון סודות — וגם את מקרי הקצה של הגוף (204 בהוראות ריקות, אין שורת מצב
כשאין קבצים).
"""
Expand Down Expand Up @@ -207,7 +207,7 @@ def recent_files(self, user_id, *, limit=3):
assert "ההוראות שלי" in resp.text


# ---------------------------------------------------------------- תקרת 8KB
# --------------------------------------------------------------- תקרת 24KB
def test_oversized_primer_is_truncated_not_rejected():
backend = _FakeBackend("א" * 20000, files=[{"file_name": "a.py", "saved_at": NOW}])
resp = _client(backend).get("/api/agent/primer", headers=_auth())
Expand Down Expand Up @@ -392,6 +392,7 @@ def test_webapp_limits_match_the_primer_limits():
"""
flask = pytest.importorskip("flask") # noqa: F841
from webapp.routes.settings_routes import (
AGENT_INSTRUCTIONS_MAX_CHARS,
AGENT_INSTRUCTIONS_WARN_BYTES,
AGENT_PRIMER_MAX_BYTES,
)
Expand All @@ -400,6 +401,24 @@ def test_webapp_limits_match_the_primer_limits():
assert AGENT_INSTRUCTIONS_WARN_BYTES == WARN_BYTES
assert WARN_BYTES < MAX_BYTES # אחרת האזהרה מגיעה רק אחרי החריגה

# האחסון רחב מההגשה — אינווריאנט מוצהר ב-``docs/mcp-server.rst``, שנועד
# לכך שהמשתמש לא יאבד טקסט שכתב: החיתוך הוא החלטה של ההגשה ולא של
# השמירה. ההשוואה היא תווים מול בייטים, ולכן המקרה הקובע הוא ASCII —
# שם תו הוא בייט. בעברית תו הוא שני בייטים והמרווח גדול פי שניים.
assert AGENT_INSTRUCTIONS_MAX_CHARS >= AGENT_PRIMER_MAX_BYTES


def test_the_truncation_notice_quotes_the_actual_cap():
"""הודעת החיתוך נגזרת מ-``MAX_BYTES`` ולא מוקלדת.

ההודעה הזו היא הדבר היחיד שהסוכן רואה כשהפריימר נחתך, והיא מצטטת את
התקרה במספר. כשהיא הייתה מוקלדת ("8KB"), שינוי התקרה היה משאיר אותה
משקרת בשקט — בדיוק הדפוס של ערך משוכפל שמתפצל מהמקור.
"""
from mcp_server.primer import _TRUNCATION_NOTICE

assert f"{MAX_BYTES // 1024}KB" in _TRUNCATION_NOTICE


def test_204_is_cached_too():
"""גם "אין פריימר" הוא תשובה — אסור לה לפגוע במסד בכל פתיחת סשן."""
Expand Down
8 changes: 4 additions & 4 deletions webapp/routes/settings_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -321,14 +321,14 @@ def theme_gallery():

# תקרת האחסון של "הוראות לסוכן". גבוהה מתקרת ההגשה בכוונה: החיתוך הוא החלטה
# של ההגשה ולא של האחסון, כדי שהמשתמש לא יאבד טקסט שכתב.
AGENT_INSTRUCTIONS_MAX_CHARS = 16 * 1024
AGENT_INSTRUCTIONS_MAX_CHARS = 48 * 1024

# תקרת הגוף שהפריימר מגיש בפועל וסף האזהרה ב-UI. מקור האמת הוא
# ``mcp_server.primer`` (MAX_BYTES / WARN_BYTES); הערכים משוכפלים לכאן כי
# הוובאפ ושירות ה-MCP הם שני שירותים נפרדים ואין ביניהם ייבוא.
# ``tests/test_mcp_primer.py`` נכשל אם הזוגות מתפצלים.
AGENT_PRIMER_MAX_BYTES = 8 * 1024
AGENT_INSTRUCTIONS_WARN_BYTES = 7 * 1024
AGENT_PRIMER_MAX_BYTES = 24 * 1024
AGENT_INSTRUCTIONS_WARN_BYTES = 21 * 1024


def _agent_instructions_user_id():
Expand Down Expand Up @@ -435,7 +435,7 @@ def api_update_agent_instructions():
{
"ok": True,
"bytes": size,
# ההגשה חותכת ב-8KB. מחזירים את הדגל כדי שה-UI יוכל להתריע מיד
# ההגשה חותכת ב-24KB. מחזירים את הדגל כדי שה-UI יוכל להתריע מיד
# אחרי שמירה, ולא רק דרך שורה שרק הסוכן רואה.
"will_truncate": size > AGENT_PRIMER_MAX_BYTES,
}
Expand Down
6 changes: 3 additions & 3 deletions webapp/templates/settings.html
Original file line number Diff line number Diff line change
Expand Up @@ -457,9 +457,9 @@ <h2 class="section-title">

const ENDPOINT = '/api/settings/agent-instructions';
// ברירות מחדל; השרת מחזיר את הערכים האמיתיים ב-GET כדי שלא יתפצלו משני צדדים.
let MAX_BYTES = 8 * 1024;
let WARN_BYTES = 7 * 1024;
let MAX_CHARS = 16 * 1024;
let MAX_BYTES = 24 * 1024;
let WARN_BYTES = 21 * 1024;
let MAX_CHARS = 48 * 1024;
let saved = '';

const encoder = new TextEncoder();
Expand Down
Loading