개선관리 요구사항과 Google 로그인을 완료

This commit is contained in:
Yun Chan 2026-08-28 16:07:09 +09:00
parent cc0a15b7c6
commit 2a39636163
112 changed files with 10166 additions and 527 deletions

View file

@ -128,6 +128,58 @@ export interface paths {
patch?: never;
trace?: never;
};
"/admin/protocols": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** List Admin Protocols */
get: operations["list_admin_protocols_admin_protocols_get"];
put?: never;
/** Create Admin Protocol */
post: operations["create_admin_protocol_admin_protocols_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/admin/protocols/{protocol_id}/activate": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Activate Admin Protocol */
post: operations["activate_admin_protocol_admin_protocols__protocol_id__activate_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/admin/protocols/{protocol_id}/retire": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** Retire Admin Protocol */
post: operations["retire_admin_protocol_admin_protocols__protocol_id__retire_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/admin/tickets": {
parameters: {
query?: never;
@ -1218,7 +1270,8 @@ export interface paths {
* @description 문서 인덱싱(관리자, RBAC ADMIN 강제). content_hash 증분 + 청크 임베딩 적재.
*
* ⚠️ 임베딩은 무거운 작업 → 본래 BackgroundTasks/배치 워커 위임 권장(202 Accepted).
* DSM verbatim 저작권(license C/D)은 source 등록 시점 external_llm_ok 가드 책임.
* source_id는 사전 등록된 kb.source만 허용하고, 라이선스와 프로토콜 active 상태는
* 요청값이 아닌 DB 행으로 검증한다.
* 모델 미가용 시 embedding NULL 폴백(BM25 만, degraded=True) — 크래시 X.
*/
post: operations["index_document_kb_index_post"];
@ -2573,8 +2626,8 @@ export interface components {
};
/** ActualTransferExecutionResponse */
ActualTransferExecutionResponse: {
assessment: components["schemas"]["ActualTransferAssessment"];
execution: components["schemas"]["ActualTransferExecution"];
assessment?: components["schemas"]["ActualTransferAssessment"] | null;
execution?: components["schemas"]["ActualTransferExecution"] | null;
/** Idempotent Replay */
idempotent_replay: boolean;
};
@ -2738,6 +2791,89 @@ export interface components {
/** Smtp Configured */
smtp_configured: boolean;
};
/** AdminProtocolActivationResponse */
AdminProtocolActivationResponse: {
/** Chunks Indexed */
chunks_indexed: number;
/** Degraded */
degraded: boolean;
/** Embedded */
embedded: boolean;
protocol: components["schemas"]["AdminProtocolResponse"];
/** Skipped Unchanged */
skipped_unchanged: boolean;
};
/** AdminProtocolCreate */
AdminProtocolCreate: {
/** Content */
content: string;
/**
* External Llm Ok
* @default false
*/
external_llm_ok: boolean;
/**
* License
* @enum {string}
*/
license: "A" | "B" | "C" | "D";
/** Source */
source: string;
/** Title */
title: string;
/**
* Version
* @default 1
*/
version: number;
};
/** AdminProtocolListResponse */
AdminProtocolListResponse: {
/** Protocols */
protocols: components["schemas"]["AdminProtocolResponse"][];
/** Total */
total: number;
};
/** AdminProtocolResponse */
AdminProtocolResponse: {
/** Activated At */
activated_at?: string | null;
/** Content */
content: string;
/** Content Hash */
content_hash: string;
/** External Llm Ok */
external_llm_ok: boolean;
/**
* License
* @enum {string}
*/
license: "A" | "B" | "C" | "D";
/** Protocol Id */
protocol_id: string;
/**
* Registered At
* Format: date-time
*/
registered_at: string;
/** Registered By */
registered_by: string;
/** Retired At */
retired_at?: string | null;
/** Source */
source: string;
/** Source Id */
source_id: string;
/**
* Status
* @enum {string}
*/
status: "draft" | "active" | "retired";
/** Title */
title: string;
/** Version */
version: number;
};
/** AdminServiceHealth */
AdminServiceHealth: {
/** Detail */
@ -3073,10 +3209,11 @@ export interface components {
AdminUserCreate: {
/**
* Account Status
* @default approved
* @default pending
* @constant
* @enum {string}
*/
account_status: "pending" | "approved" | "suspended";
account_status: "pending";
/**
* Admin Access
* @default false
@ -3090,6 +3227,11 @@ export interface components {
display_name: string;
/** Email */
email: string;
/**
* Learner Feedback Enabled
* @default true
*/
learner_feedback_enabled: boolean;
/**
* Role
* @default learner
@ -3116,6 +3258,8 @@ export interface components {
cohort_ids?: string[] | null;
/** Display Name */
display_name?: string | null;
/** Learner Feedback Enabled */
learner_feedback_enabled?: boolean | null;
/** Role */
role?: ("learner" | "teacher" | "admin") | null;
};
@ -3142,6 +3286,8 @@ export interface components {
email: string;
/** Last Seen At */
last_seen_at: number;
/** Learner Feedback Enabled */
learner_feedback_enabled: boolean;
/**
* Role
* @enum {string}
@ -5881,6 +6027,58 @@ export interface components {
* @default runtime
*/
source: string;
training_exposure?: components["schemas"]["LearnerDashboardTrainingExposure"];
};
/** LearnerDashboardTrainingExposure */
LearnerDashboardTrainingExposure: {
/**
* Attention Threshold
* @default 0.75
*/
attention_threshold: number;
/**
* Completed Sessions
* @default 0
*/
completed_sessions: number;
/**
* Definition
* @default 종료 회기의 페르소나별 최다 노출 비중을 보여 주는 투명한 훈련 노출 지표이며, 공정성 평가나 임상진단이 아닙니다.
*/
definition: string;
/** Dominant Persona Code */
dominant_persona_code?: string | null;
/** Dominant Persona Name */
dominant_persona_name?: string | null;
/**
* Dominant Sessions
* @default 0
*/
dominant_sessions: number;
/** Dominant Share */
dominant_share?: number | null;
/**
* Label
* @default 판정 근거 부족
* @enum {string}
*/
label: "판정 근거 부족" | "훈련 집중 주의" | "균형";
/**
* Minimum Completed Sessions
* @default 4
*/
minimum_completed_sessions: number;
/**
* Status
* @default insufficient
* @enum {string}
*/
status: "insufficient" | "attention" | "balanced";
/**
* Version
* @default training-exposure-dominant-share.v1
*/
version: string;
};
/** LearnerRefMapping */
LearnerRefMapping: {
@ -5905,6 +6103,11 @@ export interface components {
client_turn_count: number;
/** Ended At */
ended_at?: string | null;
/**
* Learner Feedback Enabled
* @default true
*/
learner_feedback_enabled: boolean;
/** Learner Turn Count */
learner_turn_count: number;
/** Persona Code */
@ -8678,6 +8881,62 @@ export interface components {
/** Persona */
persona: string;
};
/** ReviewFirstSessionChecklist */
ReviewFirstSessionChecklist: {
/**
* Applicable
* @default true
*/
applicable: boolean;
/** Criteria */
criteria?: components["schemas"]["ReviewFirstSessionChecklistCriterion"][];
/**
* Note
* @default 축어록에서 관찰 가능한 대화 행동을 규칙 기반으로 점검하며, 임상 평가나 성적 판정이 아닙니다.
*/
note: string;
/**
* Status
* @default ready
* @enum {string}
*/
status: "ready" | "not_applicable";
/**
* Title
* @default 첫 회기 라포·개방질문 체크리스트
*/
title: string;
/**
* Version
* @default first-session-rapport-open-question.v1
*/
version: string;
};
/** ReviewFirstSessionChecklistCriterion */
ReviewFirstSessionChecklistCriterion: {
/** Criterionid */
criterionId: string;
/** Description */
description: string;
/** Evidenceturns */
evidenceTurns?: components["schemas"]["ReviewFirstSessionChecklistEvidence"][];
/** Label */
label: string;
/**
* Status
* @enum {string}
*/
status: "met" | "not_observed";
};
/** ReviewFirstSessionChecklistEvidence */
ReviewFirstSessionChecklistEvidence: {
/** Quote */
quote: string;
/** Turnid */
turnId: string;
/** Turnseq */
turnSeq: number;
};
/** ReviewNonverbalEvent */
ReviewNonverbalEvent: {
/** Detail */
@ -9097,10 +9356,19 @@ export interface components {
ended_at?: string | null;
/** Goal Stages */
goal_stages?: ("라포" | "탐색" | "개입" | "정리")[];
/**
* Learner Feedback Enabled
* @default true
*/
learner_feedback_enabled: boolean;
/** Persona Code */
persona_code: string;
/** Persona Id */
persona_id?: string | null;
/** Persona Name */
persona_name: string;
/** Persona Version */
persona_version?: number | null;
progress?: components["schemas"]["SessionProgress"] | null;
/**
* Review Ready
@ -9260,10 +9528,16 @@ export interface components {
durationLabel: string;
/** Durationseconds */
durationSeconds: number;
firstSessionChecklist?: components["schemas"]["ReviewFirstSessionChecklist"] | null;
/** Goodmoments */
goodMoments?: components["schemas"]["ReviewPoint"][];
/** Growthpoints */
growthPoints?: components["schemas"]["ReviewPoint"][];
/**
* Learnerfeedbackenabled
* @default true
*/
learnerFeedbackEnabled: boolean;
/** Nextline */
nextLine?: string | null;
/** Pdfexporturl */
@ -9284,6 +9558,8 @@ export interface components {
reviewReady: boolean;
/** Rubric */
rubric?: components["schemas"]["ReviewRubricRow"][];
/** Sessionno */
sessionNo: number;
/** Sessionsignal */
sessionSignal: string;
/** Session Id */
@ -9378,6 +9654,15 @@ export interface components {
effective_openness: number;
/** Goal Stages */
goal_stages?: ("라포" | "탐색" | "개입" | "정리")[];
/**
* Learner Feedback Enabled
* @default true
*/
learner_feedback_enabled: boolean;
/** Persona Id */
persona_id: string;
/** Persona Version */
persona_version: number;
/** Recall Summary */
recall_summary?: string | null;
/** Session Id */
@ -11244,6 +11529,145 @@ export interface operations {
};
};
};
list_admin_protocols_admin_protocols_get: {
parameters: {
query?: {
status?: ("draft" | "active" | "retired") | null;
search?: string | null;
};
header?: never;
path?: never;
cookie?: {
"__Host-vignette_sid"?: string | null;
vignette_sid?: string | null;
};
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["AdminProtocolListResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
create_admin_protocol_admin_protocols_post: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: {
"__Host-vignette_sid"?: string | null;
vignette_sid?: string | null;
};
};
requestBody: {
content: {
"application/json": components["schemas"]["AdminProtocolCreate"];
};
};
responses: {
/** @description Successful Response */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["AdminProtocolResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
activate_admin_protocol_admin_protocols__protocol_id__activate_post: {
parameters: {
query?: never;
header?: never;
path: {
protocol_id: string;
};
cookie?: {
"__Host-vignette_sid"?: string | null;
vignette_sid?: string | null;
};
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["AdminProtocolActivationResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
retire_admin_protocol_admin_protocols__protocol_id__retire_post: {
parameters: {
query?: never;
header?: never;
path: {
protocol_id: string;
};
cookie?: {
"__Host-vignette_sid"?: string | null;
vignette_sid?: string | null;
};
};
requestBody?: never;
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["AdminProtocolResponse"];
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
list_tickets_admin_tickets_get: {
parameters: {
query?: {
@ -11841,7 +12265,9 @@ export interface operations {
};
get_my_calibration_transfer_calibration_learners_me_get: {
parameters: {
query?: never;
query?: {
session_id?: string | null;
};
header?: never;
path?: never;
cookie?: {
@ -14361,7 +14787,9 @@ export interface operations {
};
get_multimodal_session_metadata_sessions__session_id__multimodal_alliance_get: {
parameters: {
query?: never;
query?: {
include_derived?: boolean;
};
header?: never;
path: {
session_id: string;