From 309064be7d70caa3a7a89fa6af76d2b16a10367a Mon Sep 17 00:00:00 2001 From: Chaim Date: Fri, 12 Jun 2026 10:57:49 +0000 Subject: [PATCH] =?UTF-8?q?chore(api-types):=20regenerate=20types.ts=20?= =?UTF-8?q?=E2=80=94=20add=20/learning-status=20+=20re-sync=20prod=20drift?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Picks up GET /api/cases/{case_number}/learning-status (PR #233) plus accumulated schema drift from prior backend changes that never regenerated types.ts. tsc clean. Co-Authored-By: Claude Opus 4.8 (1M context) --- web-ui/src/lib/api/types.ts | 874 +++++++++++++++++++++++++++++++++--- 1 file changed, 815 insertions(+), 59 deletions(-) diff --git a/web-ui/src/lib/api/types.ts b/web-ui/src/lib/api/types.ts index 42acdc4..84c903d 100644 --- a/web-ui/src/lib/api/types.ts +++ b/web-ui/src/lib/api/types.ts @@ -408,6 +408,31 @@ export interface paths { patch?: never; trace?: never; }; + "/api/scripts/catalog": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get Scripts Catalog + * @description Return the maintained ``scripts/SCRIPTS.md`` catalog (read-only). + * + * ``scripts/SCRIPTS.md`` is the single source of truth describing every + * script under ``scripts/`` — its role, type, and schedule (CLAUDE.md + * mandates updating it on any add/remove/change). The UI just surfaces it + * at ``/scripts`` for transparency; edits go through git/Gitea, not here. + */ + get: operations["get_scripts_catalog_api_scripts_catalog_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/training/curator/style-analyzer-prompt": { parameters: { query?: never; @@ -1585,6 +1610,30 @@ export interface paths { patch?: never; trace?: never; }; + "/api/cases/{case_number}/citations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Api Case Citations + * @description Precedents CITED inside this case's signed decision — split into those linked to + * the precedent library and those still missing from it (flagged for upload). + * + * Powers the case-page "פסיקה שצוטטה בהחלטה" panel. Source: the decision's row in + * case_law (source_kind='internal_committee') → precedent_internal_citations. + */ + get: operations["api_case_citations_api_cases__case_number__citations_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/cases/{case_number}/exports/{filename}/mark-final": { parameters: { query?: never; @@ -1605,6 +1654,108 @@ export interface paths { patch?: never; trace?: never; }; + "/api/cases/{case_number}/final/upload": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Api Upload Final Decision + * @description Clean path: upload the CHAIR's signed final decision (Dafna's version). + * + * Distinct from the two pre-existing flows: + * • exports/upload → uploads a *revised version of OUR draft* (retrofits bookmarks, + * becomes active_draft). NOT for the chair's final. + * • exports/{f}/mark-final → marks one of *our* exports as final. + * + * This endpoint takes the EXTERNAL signed final, stores it canonically, and wires it + * into the full corpus-growth loop (07-learning §1.3): + * • style corpus (voice learning) + draft↔final pair (INV-LRN4); + * • the precedent library (case_law, internal_committee) so the decision is CITABLE — + * chair_name is resolved deterministically (case → committee default), never left + * empty (DB constraint), so enrollment always succeeds; + * • its citations are linked to the library and any cited precedent NOT in the library + * is auto-flagged as a missing_precedent. + * It does NOT touch active_draft. The LLM-heavy steps (style/halacha panels, halacha + * extraction, corroboration) still run on the local worker via run-learning/run-halacha. + */ + post: operations["api_upload_final_decision_api_cases__case_number__final_upload_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/cases/{case_number}/final/run-learning": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Api Final Run Learning + * @description Staged step 1 — voice learning: wake the local worker to run ingest_final_version + * (Opus distillation) + the 2-judge style panel (DeepSeek+Gemini). + */ + post: operations["api_final_run_learning_api_cases__case_number__final_run_learning_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/cases/{case_number}/final/run-halacha": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Api Final Run Halacha + * @description Staged step 2 — halacha validation: wake the local worker to extract the cited + * halachot, build corroboration, and run the 3-judge halacha panel (--apply). + */ + post: operations["api_final_run_halacha_api_cases__case_number__final_run_halacha_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/cases/{case_number}/learning-status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Api Case Learning Status + * @description Derived status of the two post-final pipelines (voice learning + halacha + * extraction) for the case: whether each ran, succeeded, why not, and how many + * halachot were extracted. Focused/cheap endpoint for the UI to poll + invalidate + * after the run-learning/run-halacha buttons. Same derivation as case_get's + * learning_status (single source — db.case_learning_status). + */ + get: operations["api_case_learning_status_api_cases__case_number__learning_status_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/cases/{case_number}/export-docx": { parameters: { query?: never; @@ -2663,27 +2814,6 @@ export interface paths { patch?: never; trace?: never; }; - "/api/precedent-library/queue/pending": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Precedent Queue Pending - * @description Read-only view of the queue. The MCP worker reads this too, but the - * UI calls it to show 'X ממתינות לעיבוד מקומי' badges. - */ - get: operations["precedent_queue_pending_api_precedent_library_queue_pending_get"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; "/api/digests/upload": { parameters: { query?: never; @@ -2761,6 +2891,176 @@ export interface paths { patch?: never; trace?: never; }; + "/api/operations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Operations Snapshot + * @description Everything running in the background: services + pipelines/queues. + */ + get: operations["operations_snapshot_api_operations_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/operations/services/{name}/{action}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Operations Service Action + * @description Control a background service (restart/stop/start) or run a drain now. + * + * 'run-now' maps to pm2 restart — for a one-shot cron drain that fires the + * job immediately. Whitelisted to legal-* (enforced again on the host). + */ + post: operations["operations_service_action_api_operations_services__name___action__post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/operations/drains/{name}/disabled": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Operations Drain Toggle + * @description Switch a cron drain on/off (the 'startup type' in the services panel). + * + * Written straight to drain_controls — no host roundtrip; the drain reads the + * flag at startup and no-ops when disabled (pm2 cron_restart can't be trusted + * to stay stopped). + */ + post: operations["operations_drain_toggle_api_operations_drains__name__disabled_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/operations/agents": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Operations Agents + * @description Queued + running heartbeat runs across all companies (read-only). + * + * Tolerates a per-company Paperclip hiccup: returns whatever it could fetch + * plus an ``errors`` list, so one company's outage never blanks the panel. + */ + get: operations["operations_agents_api_operations_agents_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/operations/agents/runs/{run_id}/log": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Operations Agent Run Log + * @description Full output log (NDJSON stream) of one heartbeat run. + */ + get: operations["operations_agent_run_log_api_operations_agents_runs__run_id__log_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/operations/agents/runs/{run_id}/events": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Operations Agent Run Events + * @description Lifecycle/event timeline of one heartbeat run. + */ + get: operations["operations_agent_run_events_api_operations_agents_runs__run_id__events_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/operations/agents/runs/{run_id}/cancel": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Operations Agent Run Cancel + * @description Gracefully cancel a queued/running heartbeat run (not a raw kill). + */ + post: operations["operations_agent_run_cancel_api_operations_agents_runs__run_id__cancel_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/operations/agents/{agent_id}/reset-session": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Operations Agent Reset Session + * @description Reset a wedged agent session so its next wakeup starts clean. + */ + post: operations["operations_agent_reset_session_api_operations_agents__agent_id__reset_session_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/digests/{digest_id}": { parameters: { query?: never; @@ -2824,6 +3124,27 @@ export interface paths { patch?: never; trace?: never; }; + "/api/bulletins/upload": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Bulletin Upload + * @description Stage a monthly bulletin PDF to data/bulletins/incoming (no DB). Dedup by + * content hash so re-running the n8n backfill never duplicates a file. + */ + post: operations["bulletin_upload_api_bulletins_upload_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/internal-decisions/upload": { parameters: { query?: never; @@ -2905,9 +3226,11 @@ export interface paths { * Halachot List * @description List halachot. ``exclude_low_quality`` hides flagged items (#84.1), * ``order_by_priority`` switches to the active-learning order (#84.3), - * ``cluster`` annotates near-duplicate groups for one-card review (#84.2), and - * ``include_equivalents`` attaches cross-precedent parallel-authority links. All - * default off so existing callers are unaffected; the review queue opts in. + * ``cluster`` annotates near-duplicate groups for one-card review (#84.2), + * ``include_equivalents`` attaches cross-precedent parallel-authority links, and + * ``include_panel_round`` attaches the latest 3-judge panel deliberation so the + * chair sees why the panel split (#133/FU-2). All default off so existing callers + * are unaffected; the review queue opts in. */ get: operations["halachot_list_api_halachot_get"]; put?: never; @@ -3088,7 +3411,12 @@ export interface paths { }; /** * Missing Precedents List - * @description List missing precedents, optionally filtered by status / case. + * @description List missing precedents, optionally filtered by status / case / text. + * + * ``q`` is a free-text term matched across the gap's own מראה-מקום, case name, + * and cited-in appeal number — so the chair can find a gap by the missing + * decision's number (e.g. 85074), not only by the appeal it was cited in. + * ``case_id``/``case_number`` remain exact filters for programmatic callers. */ get: operations["missing_precedents_list_api_missing_precedents_get"]; put?: never; @@ -3259,6 +3587,11 @@ export interface components { /** File */ file: string; }; + /** Body_api_upload_final_decision_api_cases__case_number__final_upload_post */ + Body_api_upload_final_decision_api_cases__case_number__final_upload_post: { + /** File */ + file: string; + }; /** Body_api_upload_tagged_document_api_cases__case_number__documents_upload_tagged_post */ Body_api_upload_tagged_document_api_cases__case_number__documents_upload_tagged_post: { /** File */ @@ -3279,6 +3612,11 @@ export interface components { */ title: string; }; + /** Body_bulletin_upload_api_bulletins_upload_post */ + Body_bulletin_upload_api_bulletins_upload_post: { + /** File */ + file: string; + }; /** Body_digest_upload_api_digests_upload_post */ Body_digest_upload_api_digests_upload_post: { /** File */ @@ -3933,6 +4271,8 @@ export interface components { subject_tags?: string[] | null; /** Practice Areas */ practice_areas?: string[] | null; + /** Supporting Quote */ + supporting_quote?: string | null; }; /** InteractionResponseRequest */ InteractionResponseRequest: { @@ -3971,8 +4311,8 @@ export interface components { lesson_text?: string | null; /** Category */ category?: string | null; - /** Applied To Skill */ - applied_to_skill?: boolean | null; + /** Review Status */ + review_status?: string | null; }; /** McpEnvUpdateRequest */ McpEnvUpdateRequest: { @@ -4847,6 +5187,26 @@ export interface operations { }; }; }; + get_scripts_catalog_api_scripts_catalog_get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + }; + }; get_style_analyzer_prompt_api_training_curator_style_analyzer_prompt_get: { parameters: { query?: never; @@ -6681,6 +7041,37 @@ export interface operations { }; }; }; + api_case_citations_api_cases__case_number__citations_get: { + parameters: { + query?: never; + header?: never; + path: { + case_number: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; api_mark_final_api_cases__case_number__exports__filename__mark_final_post: { parameters: { query?: never; @@ -6713,6 +7104,134 @@ export interface operations { }; }; }; + api_upload_final_decision_api_cases__case_number__final_upload_post: { + parameters: { + query?: never; + header?: never; + path: { + case_number: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "multipart/form-data": components["schemas"]["Body_api_upload_final_decision_api_cases__case_number__final_upload_post"]; + }; + }; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + api_final_run_learning_api_cases__case_number__final_run_learning_post: { + parameters: { + query?: never; + header?: never; + path: { + case_number: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + api_final_run_halacha_api_cases__case_number__final_run_halacha_post: { + parameters: { + query?: never; + header?: never; + path: { + case_number: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + api_case_learning_status_api_cases__case_number__learning_status_get: { + parameters: { + query?: never; + header?: never; + path: { + case_number: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; api_export_docx_api_cases__case_number__export_docx_post: { parameters: { query?: never; @@ -8403,38 +8922,6 @@ export interface operations { }; }; }; - precedent_queue_pending_api_precedent_library_queue_pending_get: { - parameters: { - query?: { - kind?: string; - limit?: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful Response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": unknown; - }; - }; - /** @description Validation Error */ - 422: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["HTTPValidationError"]; - }; - }; - }; - }; digest_upload_api_digests_upload_post: { parameters: { query?: never; @@ -8475,6 +8962,7 @@ export interface operations { concept_tag?: string; linked?: boolean | null; search?: string; + publication?: string; limit?: number; offset?: number; }; @@ -8570,6 +9058,239 @@ export interface operations { }; }; }; + operations_snapshot_api_operations_get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + }; + }; + operations_service_action_api_operations_services__name___action__post: { + parameters: { + query?: never; + header?: never; + path: { + name: string; + action: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + operations_drain_toggle_api_operations_drains__name__disabled_post: { + parameters: { + query?: never; + header?: never; + path: { + name: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + [key: string]: unknown; + }; + }; + }; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + operations_agents_api_operations_agents_get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + }; + }; + operations_agent_run_log_api_operations_agents_runs__run_id__log_get: { + parameters: { + query?: never; + header?: never; + path: { + run_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + operations_agent_run_events_api_operations_agents_runs__run_id__events_get: { + parameters: { + query?: never; + header?: never; + path: { + run_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + operations_agent_run_cancel_api_operations_agents_runs__run_id__cancel_post: { + parameters: { + query?: never; + header?: never; + path: { + run_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + operations_agent_reset_session_api_operations_agents__agent_id__reset_session_post: { + parameters: { + query?: never; + header?: never; + path: { + agent_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; digest_get_api_digests__digest_id__get: { parameters: { query?: never; @@ -8764,6 +9485,39 @@ export interface operations { }; }; }; + bulletin_upload_api_bulletins_upload_post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "multipart/form-data": components["schemas"]["Body_bulletin_upload_api_bulletins_upload_post"]; + }; + }; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; internal_decisions_upload_api_internal_decisions_upload_post: { parameters: { query?: never; @@ -8875,6 +9629,7 @@ export interface operations { order_by_priority?: boolean; cluster?: boolean; include_equivalents?: boolean; + include_panel_round?: boolean; }; header?: never; path?: never; @@ -9205,6 +9960,7 @@ export interface operations { case_id?: string; case_number?: string; legal_topic?: string; + q?: string; limit?: number; offset?: number; };