Files
legal-ai/web/agent_platform_port.py
Chaim 3ea5d3b536
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
Lint — undefined names / undefined-names (pull_request) Successful in 11s
feat(case-ui): כרטיס "הפקת מסמכים" עם 3 כפתורי-הפק דטרמיניסטיים (#214)
מוסיף כרטיס "הפקת מסמכים" בראש טאב "טיוטות והערות" (mockup 26 — תוספת ל-18h),
תוספת לעמוד הקיים, כל הסקשנים נשמרים.

- כפתור 1 "הפק סיכום מנהלים" → endpoint חדש POST /generate/party-claims-summary
  → CEO wakeup סטרוקטורלי action="party_claims_summary" (שלב H2, host-side).
  Polling: GET /research/party-claims-summary (200=מוכן → פתח/DOCX).
- כפתור 2 "הפק טיוטה של טענות הצדדים" → endpoint חדש POST /generate/interim-draft
  → CEO wakeup action="interim_draft" (שלב H, host-side).
  Polling: רשימת ה-exports עד שמופיע טיוטת-ביניים-{case}-vN.docx.
- כפתור 3 "הפק טיוטת החלטה מלאה" → ה-useExportDocx הקיים (in-container, ללא LLM);
  הועבר מהבאנר (כפתור "הפק DOCX" הוסר משם — אין כפילות). disabled+title כשאין
  בלוקים כתובים (isDraftReady).

מסלול-עירור יחיד דרך ה-Platform Port (pc_wake_ceo_for_action) → API helper
/api/agents/{id}/wakeup, לעולם לא DB insert. Israel-time + cache-invalidation.

Invariants: G12 (מגע-Paperclip רק ב-paperclip_client + agent_platform_port;
leak-guard ירוק) · G2 (אין מסלול-עירור מקביל — שימוש חוזר ב-pc_request הקיים) ·
G10 (הפקה מגודרת-יו"ר/CEO) · INV-UI9 (Asia/Jerusalem) · X6 (UI↔API contract).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 19:54:54 +00:00

122 lines
4.8 KiB
Python

"""Agent Platform Port (INV-G12 / docs/spec/X15) — the single seam to the platform.
Paperclip is the *agent platform*: a replaceable shell, not the core. This module
is the ONLY place in the web layer that may import the Paperclip client
(``web.paperclip_client`` / ``web.paperclip_api``). ``web/app.py`` — and any future
web code — imports the platform operations from HERE, never from the Paperclip
modules directly. So the dependency points inward (Ports & Adapters / the
Dependency Rule, Cockburn / Martin): swapping the platform means re-implementing
this one module, not touching app.py.
Enforced by the leak-guard (X15 §4 / R4): no file outside this Port imports
``paperclip_client`` / ``paperclip_api``.
Two tiers:
• **Lifecycle side-effects** — archive / restore / create a case's project, and
the case-status notification — are also exposed under domain names
(``archive_case_project`` …). These are the genuine domain events the app
emits over a case's lifecycle; prefer them in new code.
• **Issue / interaction / comment / agent operations** are re-exported under
their existing ``pc_*`` names: they are request/response API calls, not
events, so a faithful facade re-export — rather than an artificial "event"
is the honest treatment. Migrating these to domain verbs is a follow-up that
can happen as call sites are touched; the import seam (the enforceable part
of G12) holds regardless.
"""
from __future__ import annotations
# ── the Paperclip shell — imported ONLY here (the Port is the single seam) ──
from web.paperclip_api import (
emit_case_status_webhook,
emit_export_complete_webhook,
emit_missing_precedent_webhook,
pc_request,
require_paperclip_db_url,
)
from web.paperclip_client import (
COMPANIES as PAPERCLIP_COMPANIES,
accept_interaction as pc_accept_interaction,
archive_project as pc_archive_project,
cancel_run as pc_cancel_run,
create_project as pc_create_project,
create_workflow_issue as pc_create_workflow_issue,
get_agents_for_case as pc_get_agents_for_case,
get_agents_for_company as pc_get_agents,
get_case_issues as pc_get_case_issues,
get_issue_comments as pc_get_issue_comments,
get_issue_interactions as pc_get_issue_interactions,
get_project_url,
get_run_events as pc_get_run_events,
get_run_log as pc_get_run_log,
list_live_runs as pc_list_live_runs,
post_comment as pc_post_comment,
reject_interaction as pc_reject_interaction,
reset_agent_session as pc_reset_agent_session,
reset_case_agents as pc_reset_case_agents,
respond_to_interaction as pc_respond_to_interaction,
restore_project as pc_restore_project,
update_project_name as pc_update_project_name,
wake_analyst_for_appraiser_facts as pc_wake_analyst_for_appraiser_facts,
wake_analyst_for_argument_aggregation as pc_wake_analyst_for_argument_aggregation,
wake_ceo_agent as pc_wake_ceo,
wake_ceo_for_action as pc_wake_ceo_for_action,
wake_ceo_for_feedback_fold as pc_wake_ceo_for_feedback_fold,
wake_curator_for_final as pc_wake_curator_for_final,
wake_for_precedent_extraction as pc_wake_for_precedent_extraction,
)
# ── domain-named lifecycle aliases (preferred for new call sites) ───────────
archive_case_project = pc_archive_project
restore_case_project = pc_restore_project
create_case_project = pc_create_project
rename_case_project = pc_update_project_name
notify_case_status = emit_case_status_webhook
__all__ = [
# platform infrastructure
"PAPERCLIP_COMPANIES",
"pc_request",
"require_paperclip_db_url",
"get_project_url",
# lifecycle — domain names (preferred) + legacy aliases
"archive_case_project",
"restore_case_project",
"create_case_project",
"rename_case_project",
"notify_case_status",
"emit_case_status_webhook",
"emit_export_complete_webhook",
"emit_missing_precedent_webhook",
"pc_archive_project",
"pc_restore_project",
"pc_create_project",
"pc_update_project_name",
# issues / workflow
"pc_create_workflow_issue",
"pc_get_case_issues",
# agents / wakeups
"pc_get_agents_for_case",
"pc_get_agents",
"pc_wake_ceo",
"pc_wake_ceo_for_action",
"pc_wake_ceo_for_feedback_fold",
"pc_wake_curator_for_final",
"pc_wake_for_precedent_extraction",
"pc_wake_analyst_for_appraiser_facts",
"pc_wake_analyst_for_argument_aggregation",
# comments / interactions
"pc_post_comment",
"pc_get_issue_comments",
"pc_get_issue_interactions",
"pc_accept_interaction",
"pc_reject_interaction",
"pc_respond_to_interaction",
# agent-run observability + control (live view + smart management)
"pc_list_live_runs",
"pc_get_run_log",
"pc_get_run_events",
"pc_cancel_run",
"pc_reset_agent_session",
"pc_reset_case_agents",
]