feat(tools): כלי legal_predecessor_context — הקשר מריצות-קודמות לסוכן (#220)
מוסיף כלי-plugin שהסוכן קורא בעת continuation כדי לראות מה ריצות קודמות על התיק
הסיקו (ה-summary של כל heartbeat), במקום לגלות-מחדש הקשר מאפס (blind heartbeat).
- legal-api.ts: getPredecessorForCase(caseNumber) → GET
/api/operations/cases/{case}/predecessor (endpoint שנוסף ב-legal-ai #410).
- worker.ts: רישום הכלי (case_number param) — מעצב digest קריא (agent·issue·when·
status + summary חתוך ל-600 תווים, newest-first).
ארכיטקטורה (ההכרעה מהדיון): הכלי חי ב-plugin — המעטפת המוצהרת שמותר לה לדבר גם
Paperclip וגם legal-ai web — ולא ב-mcp-server (הליבה נשארת עיוורת-פלטפורמה, G12).
זו הסיבה שזה plugin-tool ולא mcp→web seam.
בנייה: tsc + biome נקיים. פריסה (ידנית, pm2): npm run build → plugin install →
pm2 restart paperclip. המשך: הוראת-HEARTBEAT לקרוא בעת continuation.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -507,6 +507,40 @@ const plugin = definePlugin({
|
||||
},
|
||||
);
|
||||
|
||||
ctx.tools.register(
|
||||
"legal_predecessor_context",
|
||||
{
|
||||
displayName: "הקשר מריצות קודמות",
|
||||
description:
|
||||
"Recent conclusions from prior heartbeat runs on this case (the 'summary' each run left). Call this when RESUMING work on a case to see what earlier sessions already did/decided — instead of re-deriving context from scratch. Provide the case number.",
|
||||
parametersSchema: {
|
||||
type: "object",
|
||||
properties: {
|
||||
case_number: {
|
||||
type: "string",
|
||||
description: "Case number (e.g. 1043-02-26)",
|
||||
},
|
||||
},
|
||||
required: ["case_number"],
|
||||
},
|
||||
},
|
||||
async (params) => {
|
||||
const { case_number } = params as { case_number: string };
|
||||
const result = await api.getPredecessorForCase(case_number);
|
||||
// Readable digest for the agent — each prior run's conclusion,
|
||||
// newest-first, summaries trimmed to keep the wake context lean.
|
||||
const lines = result.runs.map((r) => {
|
||||
const summary = (r.summary ?? "").trim().slice(0, 600);
|
||||
const when = r.finished_at ?? r.started_at ?? "";
|
||||
return `▸ ${r.agent_name ?? "?"} · ${r.identifier ?? ""} · ${when} · ${r.status}\n${summary}`;
|
||||
});
|
||||
const content = lines.length
|
||||
? lines.join("\n\n")
|
||||
: "אין ריצות קודמות עם מסקנות לתיק זה.";
|
||||
return { content, data: result };
|
||||
},
|
||||
);
|
||||
|
||||
// ── Events ─────────────────────────────────────────────────────
|
||||
|
||||
ctx.events.on("issue.created", async (event) => {
|
||||
|
||||
Reference in New Issue
Block a user