@aiquants/daily-report 0.21.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -7
- package/dist/client.d.mts +24 -13
- package/dist/client.d.ts +24 -13
- package/dist/client.js +5 -5
- package/dist/client.mjs +5 -5
- package/dist/{sse-schema-DCxpdETM.d.mts → ids-stream-BnM6L-Sk.d.ts} +42 -2
- package/dist/{sse-schema-DoQw8_om.d.ts → ids-stream-DCuiaTit.d.mts} +42 -2
- package/dist/index.d.mts +3 -30
- package/dist/index.d.ts +3 -30
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/server.d.mts +11 -3
- package/dist/server.d.ts +11 -3
- package/dist/server.js +4 -15
- package/dist/server.mjs +4 -15
- package/dist/styles/daily-report.standalone.css +1 -1
- package/package.json +5 -4
package/dist/server.mjs
CHANGED
|
@@ -1,15 +1,4 @@
|
|
|
1
|
-
var Tt=t=>{throw TypeError(t)};var At=(t,e,r)=>e.has(t)||Tt("Cannot "+r);var qe=(t,e,r)=>(At(t,e,"read from private field"),r?r.call(t):e.get(t)),lt=(t,e,r)=>e.has(t)?Tt("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),ut=(t,e,r,s)=>(At(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r);var Ct=t=>({async getEpoch(e){try{let r=await t?.getClient();if(!r)return null;let s=await r.get(e);return s?Number(s):0}catch{return null}},async incrementEpoch(e){try{let r=await t?.getClient();if(!r)return;await r.incr(e)}catch{}}}),Ge=class{constructor(e,r){this.config=e;this.epochStore=r;this.buckets=new Map;this.inFlight=new Map;this.invalidate=e=>{this.buckets.delete(e),this.inFlight.delete(e)};this.maybeRefreshAhead=e=>{let r=e.refreshAheadRatio;if(r===void 0)return;let{cacheKey:s}=e,d=this.buckets.get(s);if(!d)return;let l=e.ttlMsOverride??this.config.defaultTtlMs;if(l-(d.expireAt-Date.now())<l*r||this.inFlight.has(s))return;let p;p=(async()=>{let x=e.epochKey?await this.epochStore.getEpoch(e.epochKey):null,i=await e.fetcher();return this.inFlight.get(s)===p&&this.buckets.set(s,{records:i,expireAt:Date.now()+l,epoch:x}),i})(),this.inFlight.set(s,p),p.catch(()=>{}).finally(()=>{this.inFlight.get(s)===p&&this.inFlight.delete(s)})};this.getOrFetch=async e=>{let{cacheKey:r,forceRefresh:s,snapshot:d}=e,l=this.buckets.get(r);if(s&&(this.buckets.delete(r),this.inFlight.delete(r)),!s&&l&&l.expireAt>Date.now())if(e.epochKey){let p=await this.epochStore.getEpoch(e.epochKey);if(p===null||l.epoch===p)return this.maybeRefreshAhead(e),d?l.records.map(x=>structuredClone(x)):l.records;this.buckets.delete(r)}else return this.maybeRefreshAhead(e),d?l.records.map(p=>structuredClone(p)):l.records;if(!s&&this.inFlight.has(r)){let p=await this.inFlight.get(r);return d?p.map(x=>structuredClone(x)):p}let R;R=(async()=>{let p=e.epochKey?await this.epochStore.getEpoch(e.epochKey):null;e.onFetchStart?.();let x=await e.fetcher();if(s||this.inFlight.get(r)===R){let i=Date.now()+(e.ttlMsOverride??this.config.defaultTtlMs);this.buckets.set(r,{records:x,expireAt:i,epoch:p}),this.buckets.size>500&&this.cleanExpired()}return x})(),s||this.inFlight.set(r,R);try{let p=await R;return d?p.map(x=>structuredClone(x)):p}finally{this.inFlight.get(r)===R&&this.inFlight.delete(r)}};this.flush=e=>{this.buckets.delete(e),this.inFlight.delete(e)};this.clearAll=()=>{this.buckets.clear(),this.inFlight.clear()};this.invalidatePrefix=e=>{for(let r of this.buckets.keys())r.startsWith(e)&&this.buckets.delete(r);for(let r of this.inFlight.keys())r.startsWith(e)&&this.inFlight.delete(r)}}cleanExpired(){let e=Date.now();for(let[r,s]of this.buckets.entries())s.expireAt<=e&&this.buckets.delete(r)}};var ir=/^\d{4}-\d{2}-\d{2}$/,lr=/^\d{4}\/\d{2}\/\d{2}$/,_t=t=>t<10?`0${t}`:`${t}`,vt=t=>{if(Number.isNaN(t.getTime()))return null;let e=t.getFullYear(),r=_t(t.getMonth()+1),s=_t(t.getDate());return`${e}-${r}-${s}`};var ue=t=>{if(t==null)return null;if(t instanceof Date)return vt(t);let e=t.trim();if(e==="")return null;if(ir.test(e))return e;if(lr.test(e))return e.replaceAll("/","-");let r=new Date(e);return vt(r)};var dt=t=>{let e=2166136261,r=-624069552;for(let s of t){let d=s.reportHubId;e^=d&255,e=Math.imul(e,16777619),e^=d>>>8&255,e=Math.imul(e,16777619),e^=d>>>16&255,e=Math.imul(e,16777619),e^=d>>>24&255,e=Math.imul(e,16777619),r^=d>>>24&255,r=Math.imul(r,16777619),r^=d>>>16&255,r=Math.imul(r,16777619),r^=d>>>8&255,r=Math.imul(r,16777619),r^=d&255,r=Math.imul(r,16777619);let l=s.businessDate;if(l===null)e^=1,e=Math.imul(e,16777619),r^=1,r=Math.imul(r,16777619);else for(let R=0;R<l.length;R++){let p=l.charCodeAt(R);e^=p&255,e=Math.imul(e,16777619),r^=p&255,r=Math.imul(r,16777619)}}return e^=t.length,e=Math.imul(e,16777619),r^=t.length,r=Math.imul(r,16777619),((e>>>0).toString(16).padStart(8,"0")+(r>>>0).toString(16).padStart(8,"0")).replace(/^0+(?=.)/,"")},Qe=(t,e)=>t.businessDate!==e.businessDate?t.businessDate===null?1:e.businessDate===null||t.businessDate>e.businessDate?-1:1:e.reportHubId-t.reportHubId,xt=t=>{for(let e=1;e<t.length;e++)if(Qe(t[e-1],t[e])>0)return!1;return!0};var kt=(t,e)=>{let r=t.findIndex(s=>Qe({businessDate:s.businessDate,reportHubId:s.reportHubId},e)>0);return r===-1?t.length:r};var ye=(t,e,r=console)=>{let s=d=>typeof d=="string"?[`${e} ${d}`]:[e,d];return{debug:(d,...l)=>{t<=0&&r.debug(...s(d),...l)},info:(d,...l)=>{t<=1&&r.info(...s(d),...l)},warn:(d,...l)=>{t<=2&&r.warn(...s(d),...l)},error:(d,...l)=>{t<=3&&r.error(...s(d),...l)}}};import{z as c}from"zod";var ur=c.object({name:c.string().nullish(),affiliation:c.string().nullish()}),dr=c.object({name:c.string().nullish(),text:c.string().nullish(),color:c.string().nullish()}),cr=c.object({id:c.number(),name:c.string().nullish(),color:c.string().nullish()}),Et=c.object({id:c.number(),userId:c.string().nullish(),userName:c.string().nullish(),content:c.string().nullish(),createdAt:c.string().nullish(),isMine:c.boolean()}),pr=c.object({id:c.string(),fileName:c.string(),fileType:c.string().nullable(),fileSize:c.number().nullable(),createdAt:c.string().nullable(),state:c.enum(["present","absent","unknown"])}),ct=c.object({reportHubId:c.number(),date:c.string().nullish(),createdAt:c.string().nullish(),author:c.string().nullish(),userId:c.string().nullish(),sourceType:c.string().nullish(),employeeName:c.string().nullish(),updatedBy:c.string().nullish(),updatedAt:c.string().nullish(),category:c.string().nullish(),creationCategory:c.string().nullish(),visitTimeFrom:c.string().nullish(),visitTimeTo:c.string().nullish(),customerName:c.string().nullish(),interviewers:c.array(ur),subject:c.string().nullish(),content:c.string().nullish(),externalComments:c.array(dr),isRead:c.boolean(),isStarred:c.boolean(),labels:c.array(cr),postedComments:c.array(Et),attachments:c.array(pr).default([])}),mr=c.object({type:c.literal("connected")}),Xe=c.object({type:c.literal("status-update"),reportHubId:c.number(),statusType:c.enum(["star","read"]),value:c.boolean(),clientTempId:c.string(),recipientRawUserId:c.number().optional()}),pt=c.string().optional(),mt=c.object({type:c.literal("comment-add"),reportHubId:c.number(),comment:Et,clientTempId:c.string(),recipientRawUserId:c.number().optional(),sourceType:pt}),yt=c.object({type:c.literal("comment-delete"),reportHubId:c.number(),commentId:c.number(),clientTempId:c.string(),recipientRawUserId:c.number().optional(),sourceType:pt}),ht=c.object({type:c.literal("report-create"),reportHubId:c.number(),report:ct,clientTempId:c.string(),recipientRawUserId:c.number().optional()}),ft=c.object({type:c.literal("report-update"),reportHubId:c.number(),report:ct,clientTempId:c.string(),recipientRawUserId:c.number().optional()}),bt=c.object({type:c.literal("report-publish"),reportHubId:c.number(),report:ct,clientTempId:c.string(),recipientRawUserId:c.number().optional()}),gt=c.object({type:c.literal("report-delete"),reportHubId:c.number(),clientTempId:c.string(),sourceType:pt}),Mt=c.discriminatedUnion("type",[mr,Xe,mt,yt,ht,ft,bt,gt]);import{createHash as yr}from"crypto";var Rt=t=>{let e=JSON.stringify(t);return`"${yr("sha256").update(e).digest("hex")}"`};var hr=ye(1,"[Response]"),Re=(t,e,r,s=200,d=hr)=>{let l=Rt(r),R=t.headers.get("If-None-Match");d.info(`[jsonResponseWithETag] ETag: ${l}, If-None-Match: ${R}`);let p=new Headers({"Content-Type":"application/json","Cache-Control":"private, max-age=0, must-revalidate","X-Content-Type-Options":"nosniff","X-Frame-Options":"DENY","Content-Security-Policy":"default-src 'none'",ETag:l});return e&&p.append("Set-Cookie",e),t.method==="GET"&&s===200&&R===l?new Response(null,{status:304,headers:p}):new Response(JSON.stringify(r),{status:s,headers:p})};import{EventEmitter as fr}from"events";var ze=(t,e)=>{let[r,s]=t.split("-").map(Number),[d,l]=e.split("-").map(Number);return r!==d?r<d:s<=l},Ze=class{constructor(e){this.config=e;this._emitter=new fr;this._state="idle";this._refCount=0;this._lastId="$";this._emitter.setMaxListeners(0),this._logger=e.logger??ye(1,"[SSE Reader]")}subscribe(e,r){return this._emitter.on("entry",e),r&&this._emitter.on("error",r),this._refCount++,this._refCount===1&&this._startLoop(),()=>{this._emitter.removeListener("entry",e),r&&this._emitter.removeListener("error",r),this._refCount--,this._refCount<=0&&(this._refCount=0,this._stopLoop())}}async destroy(){this._refCount=0,await this._stopLoop(),this._emitter.removeAllListeners(),this._lastId="$"}async _startLoop(){for(;this._state==="stopping";)await new Promise(e=>setTimeout(e,50));if(this._state!=="running"&&this._refCount!==0){this._state="running";try{this._client=await this.config.redis?.createClient()}catch(e){this._state="idle",this._emitError(e instanceof Error?e:new Error("Failed to create Redis client for SSE reader"));return}if(!this._client){this._state="idle",this._emitError(new Error("Failed to create Redis client for SSE reader"));return}if(this._client.on("error",e=>{this._logger.error("Redis client error:",e)}),this._lastId==="$")try{let e=await this.config.redis?.getClient();if(e){let r=await e.xRevRange(this.config.streamKey,"+","-",{COUNT:1});this._lastId=r.length>0?r[0].id:"0-0"}}catch(e){this._logger.warn("Failed to resolve stream tail anchor; falling back to $:",e)}try{for(;this._state==="running"&&this._client?.isOpen;){let e=await this._client.xRead([{key:this.config.streamKey,id:this._lastId}],{BLOCK:5e3,COUNT:100});if(e)for(let r of e)for(let s of r.messages){this._lastId=s.id;try{let d=s.message?.data?JSON.parse(s.message.data):null,l=d?.type;if((l==="report-create"||l==="report-delete"||l==="report-publish")&&this.config.cache.invalidatePrefix("daily-report:ids"),l==="comment-add"||l==="comment-delete"||l==="status-update"){let R=d?.reportHubId;typeof R=="number"&&(this.config.cache.invalidate(`daily-report:detail:${R}`),this.config.cache.invalidatePrefix(`daily-report:detail:${R}:user:`))}}catch{}this._emitter.emit("entry",{id:s.id,message:s.message})}}}catch(e){!(e?.constructor?.name==="ClientClosedError")&&this._state==="running"&&(this._logger.error("xRead loop error:",e),this._emitError(e instanceof Error?e:new Error(String(e))))}finally{if(this._client?.isOpen)try{await this._client.quit()}catch{}this._client=void 0,this._state="idle",this._refCount>0&&this._startLoop()}}}async _stopLoop(){if(this._state==="running"){if(this._state="stopping",this._client?.isOpen)try{await this._client.quit()}catch{}for(;this._state==="stopping";)await new Promise(e=>setTimeout(e,50))}}_emitError(e){this._emitter.listenerCount("error")>0?this._emitter.emit("error",e):this._logger.error("SSE reader error (no error listeners):",e)}};import{inArray as br,sql as Nt}from"drizzle-orm";var gr="",Rr=64,Dr=t=>t.toLowerCase(),wr=t=>t.trim().toLowerCase();function Lt(t){if(t==null)return null;if(!Array.isArray(t))return new Set;let e=new Set;for(let r of t){if(typeof r!="string")continue;let s=wr(r);s.length>0&&e.add(s)}return e}function Ie(t,e){return t===null?!0:e==null?!1:t.has(Dr(e))}function ve(t){return t!==null&&t.size===0}function $t(t,e){if(e!==null)return e.size===0?Nt`1 = 0`:br(Nt`LOWER(${t})`,[...e])}var Le,Pe,Ve=class Ve{constructor(e,r){lt(this,Le);lt(this,Pe);ut(this,Le,e),ut(this,Pe,r)}get visible(){return qe(this,Le)===null?null:new Set(qe(this,Le))}get commentable(){return qe(this,Pe)===null?null:new Set(qe(this,Pe))}static restrictTo(e){let r=typeof e=="object"&&e!==null&&"read"in e,s=Lt(r?e.read:e),d=r?e.comment:void 0;if(d===void 0)return new Ve(s,s);let l=Lt(d),R=new Set;for(let p of l??[])s.has(p)&&R.add(p);return new Ve(s,R)}static unrestricted(e){return new Ve(null,null)}};Le=new WeakMap,Pe=new WeakMap;var De=Ve;function Ke(t){let e=Pt(t.visible),r=Pt(t.commentable);return e===r?e:`d:${e.length}:${e}${r}`}function Pt(t){if(t===null)return"all";if(t.size===0)return"none";let e=[...t].sort().map(s=>`${s.length}:${s}`).join(gr);if(e.length<=Rr)return`s:${e}`;let r=2166136261;for(let s=0;s<e.length;s++)r^=e.charCodeAt(s),r=Math.imul(r,16777619);return`sh:${(r>>>0).toString(16)}`}var Sr=(t,e)=>{let r=new Headers({"Content-Type":"application/json"});return e?.setCookie&&r.append("Set-Cookie",e.setCookie),new Response(JSON.stringify(t),{status:e?.status??200,headers:r})},et=30,Yt=4e3,Ir="stream interrupted by server error",Tr=/^\d{4}-\d{2}-\d{2}$/,Ar=15e3,Bt=Symbol("ids-stream-heartbeat"),Cr=12,_r=/^[0-9a-f]{1,16}$/,vr=t=>{let e=t.searchParams.get("cursor_report_hub_id"),r=t.searchParams.get("cursor_business_date"),s=t.searchParams.get("cursor_snapshot"),d=s!==null&&_r.test(s)?s:null;if(e===null)return r===null?{cursor:null,snapshot:d}:{invalid:!0};let l=Number.parseInt(e,10);return!Number.isSafeInteger(l)||String(l)!==e||l<=0?{invalid:!0}:r===null?{cursor:{businessDate:null,reportHubId:l},snapshot:d}:Tr.test(r)?{cursor:{businessDate:r,reportHubId:l},snapshot:d}:{invalid:!0}};async function*Ut(t,e,r,s){let d=e?kt(t,e):0,l=!0;for(;;){let R=t.slice(d,d+(l?r:Yt));d+=R.length;let p=d>=t.length,x=R[R.length-1];if(yield{kind:"chunk",items:R,nextCursor:p||!x?null:{businessDate:x.businessDate,reportHubId:x.reportHubId},isLast:p,...l?{total:t.length}:{},snapshot:s.snapshot,...l&&s.restarted?{restarted:!0}:{}},l=!1,p)return}}var Ht=(t,e,r,s)=>{let d=new TextEncoder,l=!1,R=null,p=new ReadableStream({async pull(i){if(l||r.signal.aborted){await e.return(void 0).catch(()=>{});try{i.close()}catch{}return}let O=null;try{R===null&&(R=e.next());let m=new Promise(fe=>{O=setTimeout(()=>fe(Bt),Ar)}),V=await Promise.race([R,m]);if(O!==null&&(clearTimeout(O),O=null),V===Bt){if(l||r.signal.aborted){await e.return(void 0).catch(()=>{});try{i.close()}catch{}return}i.enqueue(d.encode(`
|
|
2
|
-
`));return}
|
|
3
|
-
`))}catch(
|
|
4
|
-
`)),i.close()}catch{}}},cancel(){l=!0,e.return(void 0).catch(()=>{})}}),x=new Headers({"Content-Type":"application/x-ndjson; charset=utf-8","Cache-Control":"private, no-cache, no-transform","X-Content-Type-Options":"nosniff"});return t&&x.append("Set-Cookie",t),new Response(p,{status:200,headers:x})},xr=32*1024*1024,kr=60,Er=4,Mr=12e4,Nr=1024,Lr=60,Pr=5,$r=new Set(["image/png","image/jpeg","image/gif","image/webp","application/pdf","text/plain"]),Br=/^[\x20-\x7E]+$/,Ur=/^[\w.+-]+\/[\w.+-]+/,Ot=t=>t&&Br.test(t)&&Ur.test(t)?t:null,Hr=t=>encodeURIComponent(t).replace(/['()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`),Or=t=>t.replace(/[^\x20-\x7E]/g,"_").replace(/["\\]/g,"_"),Yr=t=>{switch(t){case"not_found":case"denied":case"invalid_path":return 404;case"too_large":return 413;default:return 502}},Fr={404:"Attachment not found",413:"Attachment too large",502:"Attachment storage unavailable"},qr=t=>{let e=new Map;return(r,s)=>{let d=e.get(r);d&&e.delete(r);let l=d??{tokens:t,lastRefillMs:s},R=Math.max(0,s-l.lastRefillMs);R>0&&(l.tokens=Math.min(t,l.tokens+R*t/6e4),l.lastRefillMs=s);let p=l.tokens>=1;for(p&&(l.tokens-=1),e.set(r,l);e.size>Nr;){let x=e.keys().next();if(x.done)break;e.delete(x.value)}return p}},zr=t=>{let e=0;return{tryAcquire:()=>e>=t?!1:(e+=1,!0),release:()=>{e>0&&(e-=1)}}},Vr=(t,e,r)=>{let s=setTimeout(e,r);s.unref?.();let d=()=>{clearTimeout(s),e()},l=!1;return new ReadableStream({pull(R){if(l){R.close(),d();return}l=!0,R.enqueue(t)},cancel(){d()}})},Kr=(t,e,r,s)=>{if(r===null&&s===null)return!0;let d=typeof e.sourceType=="string"?e.sourceType:void 0;switch(t.type){case"connected":case"status-update":return!0;case"report-create":case"report-update":case"report-publish":return Ie(r,t.report.sourceType);case"comment-add":case"comment-delete":return Ie(s,d??"Internal");case"report-delete":return Ie(r,d)}},jr=["externalComments","postedComments"],Jr=(t,e,r)=>{if(r===null||t.type!=="report-create"&&t.type!=="report-update"&&t.type!=="report-publish"||Ie(r,t.report.sourceType))return!1;let s=e.report;if(typeof s!="object"||s===null)return!1;let d=s;for(let l of jr)d[l]=[];return!0};function Ft(t){let{authenticate:e,service:r,encodeUserId:s,redis:d,sseReader:l,streamKey:R}=t,p=t.loginRedirectPath??"/auth/login",x=t.logger??ye(3,"[DailyReportAPI]"),i=t.logger??ye(3,"[DailyReportVisibility]"),O=t.logger??ye(1,"[DailyReportSSE]"),m=t.logger??ye(1,"[DailyReportAttachment]"),V=t.attachmentMaxBytes??xr,K=qr(t.attachmentRateLimitPerMinute??kr),Y=zr(t.attachmentConcurrency??Er),fe=async(w,U="initial")=>{let k=t.resolveVisibleSourceTypes;if(!k)return De.unrestricted("no visibility port injected: this deployment does not restrict by source type");try{let T=await k(w,{reason:U});return T==null?De.unrestricted("visibility port returned null/undefined: this deployment opts out of source-type filtering"):De.restrictTo(T)}catch(T){return i.error("resolveVisibleSourceTypes threw; failing closed (deny all)",T),De.restrictTo([])}},He=async({request:w})=>{let{user:U,cookie:k}=await e(w,{failureRedirect:p}),T=new Headers;k&&T.append("Set-Cookie",k);let y=await r.getUserIdByExternalId(U.id),$=y?s(y):null;return{data:{user:U,userId:$},headers:T}},Oe={"business-date":async(w,U,k,T,y)=>{let $=ue(w.searchParams.get("businessDate")),F=w.searchParams.get("forceRefresh")==="true";if(!$)return Re(k,U,{error:{message:"Invalid business date"}},400);let _=await r.getDailyReportsByBusinessDateByExternalId(y,$,T.id,{forceRefresh:F});return Re(k,U,{businessDate:$,reports:_},200)},"ids-stream":async(w,U,k,T,y)=>{let $=vr(w);if("invalid"in $)return Re(k,U,{error:{message:"Invalid cursor"}},400);let F=w.searchParams.get("forceRefresh")==="true",_=!1,S=null,A=null,q=new Promise((M,E)=>{S=M,A=E});q.catch(()=>{});let he=r.getDailyReportIdsByExternalId(y,T.id,{forceRefresh:F,onFetchStart:$.cursor?void 0:()=>{_=!0,r.getDailyReportIdsFirstPageByExternalId(y,T.id,et).then(M=>S?.(M),M=>A?.(M))}});if(he.catch(()=>{}),$.cursor){let M=await he,E=dt(M),P=$.snapshot!==null&&$.snapshot===E;return Ht(U,Ut(M,P?$.cursor:null,et,{snapshot:E,restarted:!P}),k,x)}let L=(async function*(){let M=await Promise.race([he.then(N=>({kind:"full",items:N}),N=>({kind:"full-error",error:N})),q.then(N=>({kind:"page",items:N}),()=>({kind:"page-error"}))]),E=null,P=!1;if(M.kind==="full")E=M.items;else if(M.kind==="page"){let N=M.items;if(N.length<et){yield{kind:"chunk",items:N,nextCursor:null,isLast:!0,total:N.length};return}yield{kind:"chunk",items:N,nextCursor:null,isLast:!1,provisional:!0},P=!0}else if(M.kind==="full-error"&&_){let N=await q.catch(()=>null);N&&N.length>0&&(yield{kind:"chunk",items:N,nextCursor:null,isLast:!1,provisional:!0})}E===null&&(E=await he),yield*Ut(E,null,P?Yt:et,{snapshot:dt(E)})})();return Ht(U,L,k,x)},report:async(w,U,k,T,y)=>{let $=w.searchParams.get("reportHubId"),F=w.searchParams.get("forceRefresh")==="true",_=$?Number.parseInt($,10):NaN;if(!Number.isFinite(_)||_<=0)return Re(k,U,{error:{message:"Invalid reportHubId"}},400);let S=await r.getDailyReportDetailByIdByExternalId(y,_,T.id,{snapshot:!0,forceRefresh:F});return S?Re(k,U,{report:S},200):Re(k,U,{error:{message:"Report not found"}},404)}};return{index:{loader:He},api:{loader:async({request:w,params:U})=>{let{user:k,cookie:T}=await e(w,{failureRedirect:null}),y=T??null;if(!k)return Re(w,y,{error:{message:"Unauthorized"}},401);if(w.method!=="GET")return Re(w,y,{error:{message:"Method not allowed"}},405);let $=U.endpoint??"",F=Oe[$];if(!F)return Re(w,y,{error:{message:"Unknown endpoint"}},404);let _=Date.now();try{let S=new URL(w.url),A=await fe(w);return await F(S,y,w,k,A)}catch(S){let A=Date.now()-_,q=S instanceof Error?S:new Error(String(S));return x.error(`500 endpoint=${$} elapsed=${A}ms name=${q.name} code=${"code"in q?q.code:"N/A"} message=${q.message}`),x.error("Stack:",q.stack),Re(w,y,{error:{message:"Internal Server Error"}},500)}},action:async({request:w,params:U})=>{let{user:k,cookie:T}=await e(w,{failureRedirect:null}),y=(F,_)=>Sr(F,{..._,setCookie:T});if(!k)return y({error:"Unauthorized"},{status:401});let $=Date.now();try{if(U.endpoint!=="action")return y({error:"Unknown endpoint"},{status:404});let _=await r.getUserIdByExternalId(k.id);if(!_)return y({error:"User not found"},{status:404});let S=await fe(w),A=await w.formData(),q=A.get("intent"),he=A.get("reportHubId"),L=he?Number(he):NaN,M=A.get("businessDate"),E=Number(A.get("operationTimestamp")),P=A.get("clientTempId");if(q==="clearCache")return t.enableDevCacheClear?(await r.clearCache(),y({status:"OK",intent:"clearCache"})):y({error:"Invalid intent"},{status:400});if(!P)return y({error:"clientTempId required"},{status:400});if(q!=="create"&&(!L||Number.isNaN(L)))return y({error:"Invalid reportHubId"},{status:400});let N=async(D,H,ee)=>{let be=A.get(H);if(be===null)return y({error:`${H} required`},{status:400});try{let pe=await ee(be==="true");return y({status:"OK",intent:D,updatedStatus:{isStarred:pe.isStarred,isRead:pe.isRead},operationTimestamp:E,reportHubId:String(L),clientTempId:P})}catch(pe){if(pe instanceof Error&&pe.message==="Not Found")return y({error:"Report not found"},{status:404});throw pe}};switch(q){case"create":{if(!M)return y({error:"businessDate required"},{status:400});let D=await r.createDailyReport(_,M,P);return y({status:"OK",intent:"create",report:D,reportHubId:String(D.reportHubId),clientTempId:P})}case"update":{let D=A.get("title"),H=A.get("content");try{return await r.updateDailyReport(L,_,{title:D,content:H},P),y({status:"OK",intent:"update",reportHubId:String(L),clientTempId:P})}catch(ee){if(ee instanceof Error){if(ee.message==="Unauthorized")return y({error:"Unauthorized"},{status:403});if(ee.message==="Not Found")return y({error:"Report not found"},{status:404})}throw ee}}case"publish":try{let D=await r.publishDailyReport(L,_,P);return y({status:"OK",intent:"publish",reportHubId:String(L),clientTempId:P,report:D})}catch(D){if(D instanceof Error){if(D.message==="Unauthorized")return y({error:"Unauthorized"},{status:403});if(D.message==="Not Found")return y({error:"Report not found"},{status:404})}throw D}case"delete":try{return await r.deleteDailyReport(L,_,P),y({status:"OK",intent:"delete",reportHubId:String(L),clientTempId:P})}catch(D){if(D instanceof Error){if(D.message==="Unauthorized")return y({error:"Unauthorized"},{status:403});if(D.message==="Not Found")return y({error:"Report not found"},{status:404})}throw D}case"toggleStar":return await N("toggleStar","isStarred",D=>r.setStarStatus(S,_,L,M,D,P));case"toggleRead":return await N("toggleRead","isRead",D=>r.setReadStatus(S,_,L,M,D,P));case"addComment":{let D=A.get("content");if(!D)return y({error:"Content required"},{status:400});try{let H=await r.addComment(S,_,L,D,M,P),ee={...H,userId:H.userId};return y({status:"OK",intent:"addComment",newComment:ee,reportHubId:String(L),clientTempId:P})}catch(H){if(H instanceof Error){if(H.message==="Not Found")return y({error:"Report not found"},{status:404});if(H.message.startsWith("Comments are restricted"))return y({error:"Comments are restricted for this report"},{status:403})}throw H}}case"deleteComment":{let D=Number(A.get("commentId"));if(!D||Number.isNaN(D))return y({error:"Invalid commentId"},{status:400});try{return await r.deleteComment(S,_,L,D,M,P),y({status:"OK",reportHubId:String(L),deletedCommentId:String(D),clientTempId:P})}catch(H){if(H instanceof Error){if(H.message==="Unauthorized")return y({error:"Unauthorized"},{status:403});if(H.message==="Not Found")return y({error:"Comment not found"},{status:404})}throw H}}default:return y({error:"Invalid intent"},{status:400})}}catch(F){if(F instanceof Response)throw F;let _=Date.now()-$,S=F instanceof Error?F:new Error(String(F));return x.error(`500 action elapsed=${_}ms name=${S.name} message=${S.message}`),x.error("Stack:",S.stack),y({error:"Internal Server Error"},{status:500})}}},sse:{loader:async({request:w,params:U})=>{let{user:k,cookie:T}=await e(w,{failureRedirect:null}),y=se=>T===void 0?se:{...se??{},"Set-Cookie":T};if(!k)return new Response("Unauthorized",{status:401,headers:y()});let $=await r.getUserIdByExternalId(k.id);if(!$)return new Response("Forbidden",{status:403,headers:y()});if(U.endpoint!=="updates")return new Response("Not Found",{status:404,headers:y()});let F=await fe(w),_=F.visible,S=F.commentable,A=0,q=0,L=new URL(w.url).searchParams.get("lastEventId")||w.headers.get("Last-Event-ID"),M=new TextEncoder,E=null,P=null,N=null,D=!1,H=()=>{if(!D){if(D=!0,P&&(clearInterval(P),P=null),N&&(N(),N=null),E)try{E.desiredSize!==null&&E.close()}catch{}finally{E=null}D=!1}},ee=se=>{E&&E.desiredSize!==null&&E.enqueue(M.encode(`id: ${se}
|
|
5
|
-
data: ${JSON.stringify({type:"connected"})}
|
|
6
|
-
|
|
7
|
-
`))},be=(se,te)=>{if(te.data)try{let Q=JSON.parse(te.data),v=Mt.safeParse(Q);if(!v.success){O.error("SSE message validation failed:",v.error.format());return}let J=v.data,me=typeof Q.recipientRawUserId=="number"?Q.recipientRawUserId:void 0;if(J.type==="status-update"){if(me===void 0||me!==$)return}else if(me!==void 0&&me!==$)return;if(!Kr(J,Q,_,S)){ee(se);return}let nt=Jr(J,Q,S),ge;if("recipientRawUserId"in Q){let{recipientRawUserId:Ye,...Te}=Q;ge=JSON.stringify(Te)}else nt?ge=JSON.stringify(Q):ge=te.data;E&&E.desiredSize!==null&&E.enqueue(M.encode(`id: ${se}
|
|
8
|
-
data: ${ge}
|
|
9
|
-
|
|
10
|
-
`))}catch(Q){O.error(`[SSE:${$}] processEntry error:`,Q)}},pe=new ReadableStream({async start(se){E=se,P=setInterval(()=>{try{if(E&&E.desiredSize!==null){if(E.enqueue(M.encode(`: keep-alive
|
|
11
|
-
|
|
12
|
-
`)),++A%Cr===0){let v=++q;fe(w,"refresh").then(J=>{v===q&&(_=J.visible,S=J.commentable)})}}else H()}catch{H()}},5e3),w.signal.addEventListener("abort",()=>{H()});let te=L||"0-0",Q=null;if(N=l.subscribe(v=>{ze(v.id,te)||(Q===null&&(Q=v.id),te=v.id,be(v.id,v.message))},v=>{O.error(`[SSE:${$}] Fan-Out reader error:`,v),H()}),!L)try{let v=await d?.getClient();if(v){let J=await v.xRevRange(R,"+","-",{COUNT:1});J.length>0&&!ze(J[0].id,te)&&(te=J[0].id)}}catch{}if(E&&E.desiredSize!==null){let v=`data: ${JSON.stringify({type:"connected"})}
|
|
13
|
-
|
|
14
|
-
`,J=te!=="0-0"?`id: ${te}
|
|
15
|
-
${v}`:v;E.enqueue(M.encode(J))}if(L)try{let v=await d?.getClient();if(v){let J=await v.xRange(R,L,"+",{COUNT:1e3});for(let me of J)me.id!==L&&(Q!==null&&ze(Q,me.id)||(ze(me.id,te)||(te=me.id),be(me.id,me.message)))}}catch(v){O.error(`[SSE:${$}] catch-up xRange error:`,v)}},cancel(){H()}});return new Response(pe,{headers:y({"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive"})})}},attachment:{loader:async({request:w,params:U})=>{let k=null,T=(y,$,F)=>{let _=new Headers({"Content-Type":"application/json"});return F!==void 0&&_.set("Retry-After",String(F)),k&&_.append("Set-Cookie",k),new Response(JSON.stringify({error:{message:$}}),{status:y,headers:_})};try{let{user:y,cookie:$}=await e(w,{failureRedirect:null});if(k=$??null,!y)return T(401,"Unauthorized");if(w.method!=="GET"&&w.method!=="HEAD")return T(405,"Method not allowed");let F=t.attachmentIdCodec,_=t.readAttachment;if(!(F&&_))return T(404,"Attachment not found");let S=U.token??"",A=F.decode(S);if(A===null||!Number.isSafeInteger(A)||A<=0)return T(400,"Invalid attachment token");let q=await r.getUserIdByExternalId(y.id);if(!q)return T(403,"Forbidden");if(!K(q,Date.now()))return m.error(`429 attachment=${A} viewer=${q} reason=rate_limit`),T(429,"Too many requests",Lr);let he=await fe(w),L=await r.getAttachmentForUser(he,A,q);if(!L)return m.error(`404 attachment=${A} viewer=${q} reason=not_visible`),T(404,"Attachment not found");if(L.fileSize!=null&&L.fileSize>V)return m.error(`413 attachment=${A} viewer=${q} reason=db_size`),T(413,"Attachment too large");if(!Y.tryAcquire())return m.error(`503 attachment=${A} viewer=${q} reason=concurrency`),T(503,"Too many concurrent downloads",Pr);let M=!1,E=()=>{M||(M=!0,Y.release())},P=!1;try{let N=w.method==="HEAD",D=await _(L.filePath,{maxBytes:V,head:N,principal:s(q)});if(!D.ok){let v=Yr(D.reason);return D.reason==="not_found"&&r.markAttachmentMissing(A).catch(J=>{m.error(`markAttachmentMissing failed attachment=${A} message=${J instanceof Error?J.message:"unknown"}`)}),m.error(`${v} attachment=${A} viewer=${q} reason=${D.reason} code=${D.code??"-"}`),T(v,Fr[v]??"Attachment storage unavailable")}let H=Ot(L.fileType)??Ot(D.contentType)??"application/octet-stream",ee=$r.has(H),be=new URL(w.url).searchParams.get("download")==="1",pe=ee?H:"application/octet-stream",se=ee&&!be?"inline":"attachment",te=D.size??D.bytes.byteLength,Q=new Headers({"Content-Type":pe,"Content-Length":String(te),"Content-Disposition":`${se}; filename="${Or(L.fileName)}"; filename*=UTF-8''${Hr(L.fileName)}`,"Cache-Control":"private, no-store","X-Content-Type-Options":"nosniff","Content-Security-Policy":"default-src 'none'; sandbox","X-Frame-Options":"SAMEORIGIN"});return k&&Q.append("Set-Cookie",k),r.markAttachmentPresent(A).catch(v=>{m.error(`markAttachmentPresent failed attachment=${A} message=${v instanceof Error?v.message:"unknown"}`)}),m.info(`200 attachment=${A} viewer=${q} type=${pe} disposition=${se} bytes=${te}`),N?new Response(null,{status:200,headers:Q}):(P=!0,new Response(Vr(D.bytes,E,Mr),{status:200,headers:Q}))}finally{P||E()}}catch(y){if(y instanceof Response)throw y;return m.error(`500 attachment=? viewer=? reason=unexpected message=${y instanceof Error?y.message:"unknown"}`),T(500,"Attachment request failed")}}}}}import{runWithTransactionRetry as Gr}from"@aiquants/mssql";import{aliasedTable as $e,and as G,asc as tt,desc as Be,eq as f,getColumns as Qr,inArray as we,isNull as ce,or as Ue,sql as qt}from"drizzle-orm";var xe=t=>Qr(t),de=(t,e)=>{if(!t)return null;let r=t instanceof Date?t:new Date(t);if(Number.isNaN(r.getTime()))return typeof t=="string"?t:null;let s=r.getFullYear(),d=s<0?`-${String(-s).padStart(4,"0")}`:String(s).padStart(4,"0"),l=String(r.getMonth()+1).padStart(2,"0"),R=String(r.getDate()).padStart(2,"0");if(e==="YYYY-MM-DD")return`${d}-${l}-${R}`;let p=String(r.getHours()).padStart(2,"0"),x=String(r.getMinutes()).padStart(2,"0"),i=String(r.getSeconds()).padStart(2,"0");return`${d}-${l}-${R} ${p}:${x}:${i}`};function zt(t){let{db:e,tables:r,userTable:s,resolveUserId:d,encodeUserId:l,redis:R,cache:p,epochs:x}=t,{hub:i,internal:O,comment:m,label:V,hubLabel:K,userStatus:Y}=r,fe=t.externalSources??[],He=t.draftLabelNames&&t.draftLabelNames.length>0?t.draftLabelNames:[t.draftLabelName??"\u4E0B\u66F8\u304D"],Oe=He[0]??"\u4E0B\u66F8\u304D",ne=t.logger??ye(1,"[DailyReportService]"),rt=n=>Gr(a=>e.transaction(o=>a(()=>n(o))),t.transactionRetry),Ee="daily-report:ids",Dt=t.idsTtlMs??18e4,w="daily-report:ids:epoch",U="daily-report:business-date:",k=t.businessDateTtlMs??3e5,T="daily-report:date-epoch:",y="daily-report:detail-epoch:",F=`${t.streamKey??"daily-report:sse-stream"}:v2`,_=t.streamMaxLen??1e4,S=n=>x.incrementEpoch(n),A=n=>$t(i.sourceType,n),q=(n,a)=>`${Ee}:user:${n}:st:${a}`,he=n=>`${Ee}:user:${n}:`,L=(n,a,o)=>`daily-report:date:${n}:user:${a}:st:${o}`,M=(n,a)=>`daily-report:date:${n}:user:${a}:`,E=(n,a,o)=>`daily-report:detail:${n}:user:${a}:st:${o}`,P=(n,a)=>`daily-report:detail:${n}:user:${a}:`,N=async(n,a)=>{let o=await R?.getClient();if(!o){ne.warn(`[SSE] Redis client unavailable (${a})`);return}let u=Date.now();try{await o.xAdd(F,"*",{data:JSON.stringify(n)},{TRIM:{strategy:"MAXLEN",strategyModifier:"~",threshold:_}});let h=Date.now()-u;h>1e3&&ne.warn(`[SSE] Slow publish (${a}): ${h}ms`)}catch(h){ne.error(`[SSE] Redis publish failed (${a}):`,h)}},D=n=>n==null||n===""?null:/^\d+$/.test(n)?l(Number(n)):n,H=()=>{let n={};for(let a of fe)n[`ext_${a.sourceType}`]=xe(a.table);return n},ee=n=>{let a=n;for(let o of fe)a=a.leftJoin(o.table,G(f(i.sourceType,o.sourceType),f(i.sourceIdNum,o.idColumn)));return a},be=(n,a,o)=>{let{hub:u,internal:h}=a,b=u.summary,g=[],I=null,C=null,X=null,j=null,Z=null,oe=null,Me=[],Ce=fe.find(B=>B.sourceType===u.sourceType),Ne=Ce?a[`ext_${Ce.sourceType}`]:void 0;if(Ce&&Ne){let B=Ce.mapRow(Ne);B.content!==void 0&&(b=B.content),B.employeeName!==void 0&&(oe=B.employeeName),B.category!==void 0&&(I=B.category),B.creationCategory!==void 0&&(C=B.creationCategory),B.visitTimeFrom!==void 0&&(X=B.visitTimeFrom),B.visitTimeTo!==void 0&&(j=B.visitTimeTo),B.customerName!==void 0&&(Z=B.customerName),B.interviewers!==void 0&&(g=B.interviewers),B.externalComments!==void 0&&(Me=B.externalComments)}else u.sourceType==="Internal"&&h&&(b=h.body);let Ae=(a.labels??[]).map(B=>({id:B.id,name:B.name,color:B.color})),ie=a.postedCommentRows??[],W=Ie(n.commentable,u.sourceType),le=C?He.includes(C):!1,it=ge?.[0]??null;return le&&it&&!Ae.some(B=>B.id===it)&&Ae.push({id:it,name:Oe,color:null}),{reportHubId:u.id,date:de(u.businessDate,"YYYY-MM-DD"),author:a.creatorName??D(u.createdBy)??"",userId:u.userId?l(u.userId):"",sourceType:u.sourceType??"Internal",createdAt:de(u.createdAt,"YYYY-MM-DD HH:mm:ss"),updatedAt:de(u.updatedAt,"YYYY-MM-DD HH:mm:ss"),updatedBy:D(u.updatedBy),employeeName:oe??a.creatorName??D(u.createdBy),category:I,creationCategory:C,visitTimeFrom:X,visitTimeTo:j,customerName:Z,interviewers:g,subject:u.title,content:b,externalComments:W?Me:[],isRead:a.isRead??!1,isStarred:a.isStarred??!1,labels:Ae,postedComments:ie.filter(B=>W||o!==void 0&&B.userId===o).map(B=>({...B,userId:l(B.userId),isMine:o?B.userId===o:!1})),attachments:a.attachments}},pe=async(n,a)=>{let o=$e(K,"draft_label"),u=await Te();return(await e.select({reportHubId:i.id,businessDate:i.businessDate,sourceType:i.sourceType}).from(i).leftJoin(o,G(f(o.hubId,i.id),we(o.labelId,u))).where(G(ce(i.deletedAt),Ue(f(i.userId,a),ce(i.userId),ce(o.hubId)),A(n.visible))).orderBy(Be(i.businessDate),Be(i.id))).map(b=>({...b,businessDate:de(b.businessDate,"YYYY-MM-DD")}))},se=async(n,a,o)=>{let u=await J(a);if(!u)return[];if(ve(n.visible))return[];let h=$e(K,"draft_label"),b=await Te();return(await e.select({reportHubId:i.id,businessDate:i.businessDate,sourceType:i.sourceType}).top(o).from(i).leftJoin(h,G(f(h.hubId,i.id),we(h.labelId,b))).where(G(ce(i.deletedAt),Ue(f(i.userId,u),ce(i.userId),ce(h.hubId)),A(n.visible))).orderBy(Be(i.businessDate),Be(i.id))).map(I=>({...I,businessDate:de(I.businessDate,"YYYY-MM-DD")}))},te=async(n,a)=>{let o=await ee(e.select({hub:xe(i),internal:xe(O),creatorName:s.displayName,...H()}).from(i)).leftJoin(O,f(i.id,O.hubId)).leftJoin(s,f(i.userId,s.id)).where(G(f(i.businessDate,qt`${a}`),ce(i.deletedAt),A(n.visible))).orderBy(Be(i.id)),u=await je(o.map(h=>h.hub.id));return o.map(h=>be(n,{...h,attachments:u.get(h.hub.id)??[]}))},Q=n=>`${U}${n}`,v=new Map,J=async n=>{if(!t.disableUserIdCache&&v.has(n))return v.get(n)??null;let a=await d(n);return a!==null&&!t.disableUserIdCache&&v.set(n,a),a},me=async(n,a,{forceRefresh:o=!1,snapshot:u=!1,ttlMsOverride:h,onFetchStart:b}={})=>{let g=await J(a);if(!g)return[];if(ve(n.visible))return[];let I=q(g,Ke(n));return p.getOrFetch({cacheKey:I,fetcher:async()=>{let C=await pe(n,g);return xt(C)?C:(ne.warn("[DailyReportService] ids array is not in stream order; re-sorting (check SQL ORDER BY vs compareIdsStreamOrder, or concurrent row movement during the scan)"),[...C].sort(Qe))},onFetchStart:b,forceRefresh:o,snapshot:u,ttlMsOverride:h??Dt,epochKey:w,refreshAheadRatio:.5})},nt=(n,a,{forceRefresh:o=!1,snapshot:u=!1,ttlMsOverride:h}={})=>{let b=ue(a);return b?ve(n.visible)?Promise.resolve([]):p.getOrFetch({cacheKey:`${Q(b)}:st:${Ke(n)}`,fetcher:()=>te(n,b),forceRefresh:o,snapshot:u,ttlMsOverride:h??k}):Promise.resolve([])},ge=null,Ye=async()=>(ge!==null||(ge=(await e.select({id:V.id}).from(V).where(we(V.name,He)).orderBy(V.id)).map(a=>a.id)),ge),Te=async()=>{let n=await Ye();return n.length>0?n:[-1]},at=async()=>{let n=await Ye();if(n.length===0)return null;let[a]=await e.select({id:V.id}).top(1).from(V).where(f(V.name,Oe));return a?.id??n[0]},Jt=(n,a)=>a!=null?"absent":n!=null?"present":"unknown",je=async n=>{let a=new Map,o=r.attachment,u=t.attachmentIdCodec;if(n.length===0||!o||!u)return a;let h=await e.select({id:o.id,hubId:o.hubId,fileName:o.fileName,fileType:o.fileType,fileSize:o.fileSize,createdAt:o.createdAt,objectCheckedAt:o.objectCheckedAt,objectMissingAt:o.objectMissingAt}).from(o).where(we(o.hubId,n)).orderBy(tt(o.createdAt),tt(o.id));for(let b of h){let g={id:u.encode(Number(b.id)),fileName:String(b.fileName),fileType:b.fileType?String(b.fileType):null,fileSize:b.fileSize!=null?Number(b.fileSize):null,createdAt:de(b.createdAt,"YYYY-MM-DD HH:mm:ss"),state:Jt(b.objectCheckedAt,b.objectMissingAt)},I=a.get(Number(b.hubId));I?I.push(g):a.set(Number(b.hubId),[g])}return a},Gt=async(n,a,o)=>{let u=r.attachment;if(!u||ve(n.visible))return null;let h=await Te(),b=$e(K,"draft_label");return(await e.select({fileName:u.fileName,filePath:u.filePath,fileType:u.fileType,fileSize:u.fileSize}).top(1).from(u).innerJoin(i,f(i.id,u.hubId)).leftJoin(b,G(f(b.hubId,i.id),we(b.labelId,h))).where(G(f(u.id,a),ce(i.deletedAt),Ue(f(i.userId,o),ce(b.hubId)),A(n.visible))))[0]??null},Qt=async n=>{let a=r.attachment;if(!a)return;let o=new Date;try{await e.update(a).set({objectCheckedAt:o,objectMissingAt:o,updatedAt:o}).where(f(a.id,n))}catch(u){ne.error("markAttachmentMissing failed",u)}},Xt=async n=>{let a=r.attachment;if(!a)return;let o=new Date;try{await e.update(a).set({objectCheckedAt:o,objectMissingAt:null,updatedAt:o}).where(f(a.id,n))}catch(u){ne.error("markAttachmentPresent failed",u)}},Wt=async(n,a,o,{forceRefresh:u=!1,snapshot:h=!1,ttlMsOverride:b}={})=>{let g=await J(o);if(!g)return[];let I=ue(a);if(!I)return[];if(ve(n.visible))return[];let C=L(I,g,Ke(n));return p.getOrFetch({cacheKey:C,fetcher:async()=>{let X=await Te(),j=$e(K,"draft_label"),Z=await ee(e.select({hub:xe(i),internal:xe(O),isRead:Y.isRead,isStarred:Y.isStarred,creatorName:s.displayName,...H()}).from(i)).leftJoin(O,f(i.id,O.hubId)).leftJoin(Y,G(f(i.id,Y.hubId),f(Y.userId,g))).leftJoin(j,G(f(j.hubId,i.id),we(j.labelId,X))).leftJoin(s,f(i.userId,s.id)).where(G(f(i.businessDate,qt`${I}`),ce(i.deletedAt),Ue(f(i.userId,g),ce(j.hubId)),A(n.visible))).orderBy(Be(i.id));if(Z.length===0)return[];let oe=Z.map(W=>W.hub.id),Me=await e.select({hubId:K.hubId,id:V.id,name:V.name,color:V.color}).from(K).innerJoin(V,f(K.labelId,V.id)).where(we(K.hubId,oe)),Ce=await e.select({hubId:m.hubId,id:m.id,body:m.body,createdAt:m.createdAt,userId:m.userId,userName:s.displayName}).from(m).leftJoin(s,f(m.userId,s.id)).where(we(m.hubId,oe)).orderBy(tt(m.createdAt)),Ne=await je(oe),Ae=new Map,ie=new Map;for(let W of Me){let le=Ae.get(W.hubId);le||(le=[],Ae.set(W.hubId,le)),le.push({id:W.id,name:W.name,color:W.color})}for(let W of Ce){let le=ie.get(W.hubId);le||(le=[],ie.set(W.hubId,le)),le.push({id:W.id,content:W.body,createdAt:de(W.createdAt,"YYYY-MM-DD HH:mm:ss")||"",userId:W.userId,userName:W.userName||""})}return Z.map(W=>{let le=W.hub.id;return be(n,{...W,attachments:Ne.get(le)??[],labels:Ae.get(le)||[],postedCommentRows:ie.get(le)||[]},g)})},forceRefresh:u,snapshot:h,ttlMsOverride:b??k,epochKey:`${T}${I}`})},Fe=async(n,a,o,{forceRefresh:u=!1,snapshot:h=!1,ttlMsOverride:b}={})=>{if(ve(n.visible))return null;let g=E(a,o,Ke(n));return(await p.getOrFetch({cacheKey:g,fetcher:async()=>{let C=await Te(),X=$e(K,"draft_label"),j=await ee(e.select({hub:xe(i),internal:xe(O),isRead:Y.isRead,isStarred:Y.isStarred,creatorName:s.displayName,...H()}).from(i)).leftJoin(O,f(i.id,O.hubId)).leftJoin(Y,G(f(i.id,Y.hubId),f(Y.userId,o))).leftJoin(X,G(f(X.hubId,i.id),we(X.labelId,C))).leftJoin(s,f(i.userId,s.id)).where(G(f(i.id,a),ce(i.deletedAt),Ue(f(i.userId,o),ce(X.hubId)),A(n.visible)));if(j.length===0)return[];let Z=j[0].hub.id,oe=await e.select({id:V.id,name:V.name,color:V.color}).from(K).innerJoin(V,f(K.labelId,V.id)).where(f(K.hubId,Z)),Me=await e.select({id:m.id,body:m.body,createdAt:m.createdAt,userId:m.userId,userName:s.displayName}).from(m).leftJoin(s,f(m.userId,s.id)).where(f(m.hubId,Z)).orderBy(tt(m.createdAt)),Ce=await je([Z]),Ne=oe.map(ie=>({id:ie.id,name:ie.name,color:ie.color})),Ae=Me.map(ie=>({id:ie.id,content:ie.body,createdAt:de(ie.createdAt,"YYYY-MM-DD HH:mm:ss")||"",userId:ie.userId,userName:ie.userName||""}));return[be(n,{...j[0],attachments:Ce.get(Z)??[],labels:Ne,postedCommentRows:Ae},o)]},forceRefresh:u,snapshot:h,ttlMsOverride:b??k,epochKey:`${y}${a}`}))[0]??null},Zt=async(n,a,o,u={})=>{let h=await J(o);return h?Fe(n,a,h,u):null},er=async(n,a)=>{let o=await Te(),u=$e(K,"draft_label"),[h]=await e.select({sourceType:i.sourceType,deletedAt:i.deletedAt}).top(1).from(i).leftJoin(u,G(f(u.hubId,i.id),we(u.labelId,o))).where(G(f(i.id,n),Ue(f(i.userId,a),ce(u.hubId))));return h??null},st=async(n,a,o)=>{let u=await er(a,o);if(!u||u.deletedAt||!Ie(n.visible,u.sourceType))throw new Error("Not Found")},tr=async(n,a,o,u,h,b)=>{await st(n,o,a);let g=await e.select().top(1).from(Y).where(G(f(Y.hubId,o),f(Y.userId,a))),I;if(g.length>0?g[0].isStarred!==h?I=(await e.update(Y).set({isStarred:h,updatedAt:new Date,updatedBy:String(a)}).output().where(G(f(Y.hubId,o),f(Y.userId,a))))[0]:I=g[0]:I=(await e.insert(Y).output().values({hubId:o,userId:a,isStarred:h,isRead:!1,createdAt:new Date,createdBy:String(a),updatedAt:new Date,updatedBy:String(a)}))[0],u){let C=ue(u);C&&(p.invalidatePrefix(M(C,a)),await S(`${T}${C}`))}return p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(P(o,a)),await S(`${y}${o}`),await N(Xe.parse({type:"status-update",reportHubId:o,recipientRawUserId:a,statusType:"star",value:h,clientTempId:b}),"setStarStatus"),I},rr=async(n,a,o,u,h,b)=>{await st(n,o,a);let g=await e.select().top(1).from(Y).where(G(f(Y.hubId,o),f(Y.userId,a))),I;if(g.length>0?g[0].isRead!==h?I=(await e.update(Y).set({isRead:h,updatedAt:new Date,updatedBy:String(a)}).output().where(G(f(Y.hubId,o),f(Y.userId,a))))[0]:I=g[0]:I=(await e.insert(Y).output().values({hubId:o,userId:a,isRead:h,isStarred:!1,createdAt:new Date,createdBy:String(a),updatedAt:new Date,updatedBy:String(a)}))[0],u){let C=ue(u);C&&(p.invalidatePrefix(M(C,a)),await S(`${T}${C}`))}return p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(P(o,a)),await S(`${y}${o}`),await N(Xe.parse({type:"status-update",reportHubId:o,recipientRawUserId:a,statusType:"read",value:h,clientTempId:b}),"setReadStatus"),I},wt=async(n,a)=>{if(a===null)return;let o=await Te(),[u]=await e.select({hubId:K.hubId}).top(1).from(K).where(G(f(K.hubId,n),we(K.labelId,o)));return u?a:void 0},nr=async(n,a,o,u,h,b)=>{let[g]=await e.select({sourceType:i.sourceType,deletedAt:i.deletedAt,userId:i.userId}).top(1).from(i).where(f(i.id,o));if(!g||g.deletedAt)throw new Error("Not Found");if(await st(n,o,a),!Ie(n.commentable,g.sourceType))throw new Error("Comments are restricted by the viewer's comment permission");if(g.sourceType.toLowerCase()!=="internal")throw new Error("Comments are restricted for external daily report sources");let I=await wt(o,g.userId),[C]=await e.insert(m).output().values({hubId:o,userId:a,body:u,createdAt:new Date,createdBy:String(a),updatedAt:new Date,updatedBy:String(a)}),[X]=await e.select({displayName:s.displayName}).top(1).from(s).where(f(s.id,a)),j=X?.displayName??"";if(h){let oe=ue(h);oe&&(p.invalidatePrefix(`daily-report:date:${oe}:user:`),await S(`${T}${oe}`))}p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(`daily-report:detail:${o}:user:`),await S(`${y}${o}`);let Z={id:C.id,userId:l(C.userId),userName:j,content:C.body,createdAt:de(C.createdAt,"YYYY-MM-DD HH:mm:ss")??"",isMine:!0};return await N(mt.parse({type:"comment-add",reportHubId:o,comment:Z,clientTempId:b,recipientRawUserId:I,sourceType:g.sourceType}),"addComment"),Z},ar=async(n,a)=>await n.select().top(1).from(m).where(f(m.id,a)),sr=async(n,a,o,u,h,b)=>{let g=await ar(e,u);if(g.length===0)throw new Error("Not Found");if(g[0].hubId!==o)throw new Error("Not Found");let[I]=await e.select({userId:i.userId,sourceType:i.sourceType}).top(1).from(i).where(f(i.id,g[0].hubId));if(!(I&&Ie(n.visible,I.sourceType)))throw new Error("Not Found");if(g[0].userId!==a)throw new Error("Unauthorized");let C=await wt(o,I.userId);if(await e.delete(m).where(f(m.id,u)),h){let X=ue(h);X&&(p.invalidatePrefix(`daily-report:date:${X}:user:`),await S(`${T}${X}`))}p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(`daily-report:detail:${o}:user:`),await S(`${y}${o}`),await N(yt.parse({type:"comment-delete",reportHubId:o,commentId:u,clientTempId:b,recipientRawUserId:C,sourceType:I?.sourceType}),"deleteComment")},or=async(n,a,o)=>{ne.info("createDailyReport called",{userId:n,businessDate:a});let[u]=await e.select({displayName:s.displayName}).from(s).where(f(s.id,n)),h=u?.displayName??l(n);try{let b=await rt(async C=>{ne.info("Starting transaction");let X=`internal-temp-${Date.now()}-${Math.random()}`,[j]=await C.insert(i).output().values({sourceType:"Internal",sourceId:X,businessDate:new Date(a),userId:n,title:"(\u7121\u984C)",createdAt:new Date,createdBy:String(n),updatedAt:new Date,updatedBy:String(n)});await C.update(i).set({sourceId:String(j.id)}).where(f(i.id,j.id)),ne.info("Hub created",j),await C.insert(O).values({hubId:j.id,body:"",createdAt:new Date,createdBy:String(n),updatedAt:new Date,updatedBy:String(n)}),ne.info("Internal created"),ne.info("Calling getDraftLabelId");let Z=await at();ne.info("draftLabelId",Z);let oe=[];return Z&&(await C.insert(K).values({hubId:j.id,labelId:Z,createdAt:new Date,createdBy:String(n)}),oe.push({id:Z,name:Oe,color:null})),ne.info("Label assigned"),{reportHubId:j.id,date:a,createdAt:de(j.createdAt,"YYYY-MM-DD HH:mm:ss"),author:h,userId:l(n),sourceType:"Internal",employeeName:h,updatedBy:l(n),updatedAt:de(j.updatedAt,"YYYY-MM-DD HH:mm:ss"),category:null,creationCategory:null,visitTimeFrom:null,visitTimeTo:null,customerName:null,interviewers:[],subject:j.title,content:"",externalComments:[],isRead:!0,isStarred:!1,labels:oe,postedComments:[],attachments:[]}}),g=ue(a);g&&p.invalidatePrefix(M(g,n)),p.invalidatePrefix(U),p.invalidatePrefix(he(n)),await S(w),g&&await S(`${T}${g}`);let I=await Fe(De.unrestricted("post-write self read: the writer always sees the row they just wrote"),b.reportHubId,n,{forceRefresh:!0});if(I){let C=await Ye(),X=I.labels.some(j=>C.includes(j.id));await N(ht.parse({type:"report-create",reportHubId:I.reportHubId,report:I,clientTempId:o,recipientRawUserId:X?n:void 0}),"createDailyReport")}return I??b}catch(b){throw ne.error("Error in createDailyReport",b),b}},Je=async(n,a)=>await n.select().top(1).from(i).where(f(i.id,a)),ot=async(n,a,o)=>{await n.update(i).set(o).where(f(i.id,a))},St=async(n,a,o)=>{await n.update(O).set(o).where(f(O.hubId,a))},It=async(n,a,o)=>{await n.delete(K).where(G(f(K.hubId,a),f(K.labelId,o)))};return{streamKey:F,streamMaxLen:_,clearCache:async()=>{p.clearAll(),v.clear(),ge=null,x&&await S(w),ne.info("[DailyReportService] Server-side DB/SQL caches cleared successfully.")},invalidateHubReadCaches:async(n,a)=>{p.invalidatePrefix(U),p.invalidatePrefix(Ee),await S(w);for(let o of new Set(n))p.invalidatePrefix(`daily-report:detail:${o}:user:`),await S(`${y}${o}`);for(let o of new Set(a)){let u=ue(o);u&&await S(`${T}${u}`)}},getUserIdByExternalId:J,getDailyReportIdsByExternalId:me,getDailyReportIdsFirstPageByExternalId:se,getDailyReportsByBusinessDate:nt,getDailyReportsByBusinessDateByExternalId:Wt,getDailyReportDetailById:Fe,getDailyReportDetailByIdByExternalId:Zt,getDraftLabelId:at,getAttachmentsByHubIds:je,getAttachmentForUser:Gt,markAttachmentMissing:Qt,markAttachmentPresent:Xt,setStarStatus:tr,setReadStatus:rr,addComment:nr,deleteComment:sr,createDailyReport:or,updateDailyReport:async(n,a,o,u)=>{let h=await Je(e,n);if(!h.length||h[0].deletedAt)throw new Error("Not Found");if(h[0].userId!==a)throw new Error("Unauthorized");await rt(async I=>{o.title!==void 0&&await ot(I,n,{title:o.title,updatedAt:new Date,updatedBy:String(a)}),o.content!==void 0&&await St(I,n,{body:o.content,updatedAt:new Date,updatedBy:String(a)})}),p.invalidate(`daily-report:detail:${n}`),p.invalidatePrefix(`daily-report:detail:${n}:user:`),p.invalidatePrefix(U),await S(`${y}${n}`);let b=ue(de(h[0].businessDate,"YYYY-MM-DD"));b&&(p.invalidatePrefix(`daily-report:date:${b}:user:`),await S(`${T}${b}`));let g=await Fe(De.unrestricted("post-write self read: the writer always sees the row they just wrote"),n,a,{forceRefresh:!0});if(g){let I=await Ye(),C=g.labels.some(X=>I.includes(X.id));await N(ft.parse({type:"report-update",reportHubId:g.reportHubId,report:g,clientTempId:u,recipientRawUserId:C?a:void 0}),"updateDailyReport")}},publishDailyReport:async(n,a,o)=>{let u=await Je(e,n);if(!u.length)throw new Error("Not Found");if(u[0].userId!==a)throw new Error("Unauthorized");let h=await at();if(!h)return null;if(await It(e,n,h),p.invalidatePrefix(`daily-report:detail:${n}:user:`),p.invalidatePrefix(U),p.invalidatePrefix(Ee),await S(w),u[0].businessDate){let I=ue(de(u[0].businessDate,"YYYY-MM-DD"));I&&await S(`${T}${I}`)}let b=ue(de(u[0].businessDate,"YYYY-MM-DD"));b&&p.invalidatePrefix(M(b,a));let g=await Fe(De.unrestricted("post-write self read: the writer always sees the row they just wrote"),n,a,{forceRefresh:!0});return g&&await N(bt.parse({type:"report-publish",reportHubId:g.reportHubId,report:g,clientTempId:o}),"publishDailyReport"),g??null},deleteDailyReport:async(n,a,o)=>{let u=await Je(e,n);if(!u.length||u[0].deletedAt)throw new Error("Not Found");if(u[0].userId!==a)throw new Error("Unauthorized");if(await ot(e,n,{deletedAt:new Date,deletedBy:String(a),updatedAt:new Date,updatedBy:String(a)}),p.invalidatePrefix(`daily-report:detail:${n}:user:`),p.invalidatePrefix(U),p.invalidatePrefix(Ee),await S(w),u[0].businessDate){let h=ue(de(u[0].businessDate,"YYYY-MM-DD"));h&&await S(`${T}${h}`)}await N(gt.parse({type:"report-delete",reportHubId:n,clientTempId:o,sourceType:u[0].sourceType}),"deleteDailyReport")},findDailyReportHubById:Je,updateDailyReportHub:ot,updateDailyReportInternal:St,deleteDailyReportLabel:It}}import{and as Xr,eq as Vt}from"drizzle-orm";function Wr(t){let e=[],r=t&&t.length>0?t:[{key:"internal",name:"Internal",description:"Internal daily reports"},{key:"external",name:"External",description:"External daily reports"}];for(let s of r){let l=`daily_report_${s.key.toLowerCase().replace(/[^a-z0-9_]/g,"_")}`;e.push({resourceKey:l,name:s.name,description:s.description??`${s.name} daily report access`}),s.includeCommentResource!==!1&&e.push({resourceKey:`${l}_comment`,name:`${s.name} Comment`,description:`${s.name} daily report comment access`})}return e}async function Kn(t,e,r){let s=t,d=e.TMResource,l=r.appKey,R=r.actor??"system:daily-report",p=new Date,x=r.resources??Wr(r.sources);for(let i of x){let O=await s.select().from(d).where(Xr(Vt(d.appKey,l),Vt(d.resourceKey,i.resourceKey)));(!O||O.length===0)&&await s.insert(d).values({appKey:l,resourceKey:i.resourceKey,name:i.name,description:i.description??null,createdAt:p,createdBy:R,updatedAt:p,updatedBy:R})}}var Zr=ye(1,"[DailyReportExternalSource]"),Gn=(t,e,r,s=Zr)=>{if(!t)return[];try{let d=JSON.parse(t);return Array.isArray(d)?d.map(r).filter(l=>l!==null):(s.warn(`Unexpected ${e} format: not an array`),[])}catch(d){return s.warn(`Failed to parse ${e}:`,d),[]}};import{desc as Kt,sql as en}from"drizzle-orm";import{bigint as re,bit as jt,date as tn,datetime2 as ae,foreignKey as Se,index as _e,int as rn,mssqlSchema as nn,nvarchar as z,primaryKey as ke,uniqueIndex as an}from"drizzle-orm/mssql-core";function Zn(t,e){let r=nn(t),s=e.userTable,d=r.table("DailyReportHub",{id:re("id",{mode:"number"}).identity().notNull(),sourceType:z("source_type",{length:20}).notNull(),sourceId:z("source_id",{length:100}).notNull(),sourceIdNum:re("source_id_num",{mode:"number"}).generatedAlwaysAs(en`TRY_CAST(source_id AS BIGINT)`),businessDate:tn("business_date"),userId:re("user_id",{mode:"number"}),title:z("title",{length:200}),summary:z("summary",{length:"max"}),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull(),deletedAt:ae("deleted_at"),deletedBy:z("deleted_by",{length:50})},m=>[ke({name:`${t}_DailyReportHub_pk`,columns:[m.id]}),Se({name:`${t}_DailyReportHub_user_id_fk`,columns:[m.userId],foreignColumns:[s.id]}),_e(`${t}_DailyReportHub_business_date_index`).on(m.businessDate),_e(`${t}_DailyReportHub_updated_at_index`).on(m.updatedAt),_e(`${t}_DailyReportHub_source_index`).on(m.sourceType,m.sourceId),_e(`${t}_DailyReportHub_user_id_index`).on(m.userId),_e(`${t}_DailyReportHub_business_date_id_index`).on(Kt(m.businessDate),Kt(m.id)),_e(`${t}_DailyReportHub_deleted_at_index`).on(m.deletedAt)]),l=r.table("DailyReportInternal",{hubId:re("hub_id",{mode:"number"}).notNull(),body:z("body",{length:"max"}),metadata:z("metadata",{length:"max"}),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[ke({name:`${t}_DailyReportInternal_pk`,columns:[m.hubId]}),Se({name:`${t}_DailyReportInternal_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]})]),R=r.table("DailyReportComment",{id:re("id",{mode:"number"}).identity().notNull(),hubId:re("hub_id",{mode:"number"}).notNull(),userId:re("user_id",{mode:"number"}).notNull(),body:z("body",{length:"max"}).notNull(),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[ke({name:`${t}_DailyReportComment_pk`,columns:[m.id]}),Se({name:`${t}_DailyReportComment_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]}),Se({name:`${t}_DailyReportComment_user_id_fk`,columns:[m.userId],foreignColumns:[s.id]}),_e(`${t}_DailyReportComment_hub_id_index`).on(m.hubId)]),p=r.table("DailyReportLabel",{id:re("id",{mode:"number"}).identity().notNull(),userId:re("user_id",{mode:"number"}),name:z("name",{length:50}).notNull(),color:z("color",{length:20}),sortOrder:rn("sort_order"),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[ke({name:`${t}_DailyReportLabel_pk`,columns:[m.id]}),Se({name:`${t}_DailyReportLabel_user_id_fk`,columns:[m.userId],foreignColumns:[s.id]})]),x=r.table("DailyReportHub_Label",{hubId:re("hub_id",{mode:"number"}).notNull(),labelId:re("label_id",{mode:"number"}).notNull(),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull()},m=>[ke({name:`${t}_DailyReportHub_Label_pk`,columns:[m.hubId,m.labelId]}),Se({name:`${t}_DailyReportHub_Label_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]}),Se({name:`${t}_DailyReportHub_Label_label_id_fk`,columns:[m.labelId],foreignColumns:[p.id]})]),i=r.table("DailyReportUserStatus",{hubId:re("hub_id",{mode:"number"}).notNull(),userId:re("user_id",{mode:"number"}).notNull(),isRead:jt("is_read").default(!1).notNull(),isStarred:jt("is_starred").default(!1).notNull(),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[ke({name:`${t}_DailyReportUserStatus_pk`,columns:[m.hubId,m.userId]}),Se({name:`${t}_DailyReportUserStatus_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]}),Se({name:`${t}_DailyReportUserStatus_user_id_fk`,columns:[m.userId],foreignColumns:[s.id]})]),O=r.table("DailyReportAttachment",{id:re("id",{mode:"number"}).identity().notNull(),hubId:re("hub_id",{mode:"number"}).notNull(),uploadedBy:re("uploaded_by",{mode:"number"}),sourceKey:z("source_key",{length:200}).notNull(),fileName:z("file_name",{length:255}).notNull(),filePath:z("file_path",{length:"max"}).notNull(),fileType:z("file_type",{length:100}),fileSize:re("file_size",{mode:"number"}),objectCheckedAt:ae("object_checked_at"),objectMissingAt:ae("object_missing_at"),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[ke({name:`${t}_DailyReportAttachment_pk`,columns:[m.id]}),Se({name:`${t}_DailyReportAttachment_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]}),Se({name:`${t}_DailyReportAttachment_uploaded_by_fk`,columns:[m.uploadedBy],foreignColumns:[s.id]}),an(`${t}_DailyReportAttachment_source_unique`).on(m.hubId,m.sourceKey),_e(`${t}_DailyReportAttachment_hub_id_index`).on(m.hubId,m.createdAt)]);return{hub:d,internal:l,comment:R,attachment:O,label:p,hubLabel:x,userStatus:i}}function sa(t){t.redis||(t.logger??console).warn("[DailyReport] redis provider is not injected: cross-worker cache invalidation is disabled (staleness is bounded only by TTL) and SSE publishing is skipped.");let e=Ct(t.redis),r=new Ge({defaultTtlMs:t.cacheDefaultTtlMs??6e4},e),s=zt({...t,cache:r,epochs:e}),d=new Ze({redis:t.redis,streamKey:s.streamKey,cache:r,logger:t.logger}),l=Ft({authenticate:t.authenticate,resolveVisibleSourceTypes:t.resolveVisibleSourceTypes,service:s,encodeUserId:t.encodeUserId,attachmentIdCodec:t.attachmentIdCodec,readAttachment:t.readAttachment,attachmentMaxBytes:t.attachmentMaxBytes,attachmentRateLimitPerMinute:t.attachmentRateLimitPerMinute,attachmentConcurrency:t.attachmentConcurrency,redis:t.redis,sseReader:d,streamKey:s.streamKey,loginRedirectPath:t.loginRedirectPath,enableDevCacheClear:t.enableDevCacheClear,logger:t.logger});return{service:s,cache:r,epochs:e,sseReader:d,streamKey:s.streamKey,knownSourceTypes:[...new Set(["Internal",...(t.externalSources??[]).map(R=>R.sourceType)])],...l}}export{Ze as DailyReportSseReader,De as DailyReportViewerScope,Ge as SqlResultCache,Or as asciiFallbackFileName,$t as buildVisibleSourceTypeCondition,Pt as computeSourceTypeDigest,Ke as computeViewerScopeDigest,Ft as createDailyReportHandlers,sa as createDailyReportServer,zt as createDailyReportService,Ct as createEpochStore,Wr as defineDailyReportAuthzResources,Zn as defineDailyReportSchema,ve as deniesEverySourceType,Hr as encodeRfc8187,de as formatDateValue,Rt as generateETag,Ie as isSourceTypeVisible,ze as isStreamIdLte,Re as jsonResponseWithETag,Lt as normalizeVisibleSourceTypes,Ot as sanitizeMediaType,Kn as seedDailyReportAuthzResources,Gn as transformJsonArray};
|
|
1
|
+
var Tt=t=>{throw TypeError(t)};var _t=(t,e,r)=>e.has(t)||Tt("Cannot "+r);var Fe=(t,e,r)=>(_t(t,e,"read from private field"),r?r.call(t):e.get(t)),dt=(t,e,r)=>e.has(t)?Tt("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),ct=(t,e,r,s)=>(_t(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r);var Ct=t=>({async getEpoch(e){try{let r=await t?.getClient();if(!r)return null;let s=await r.get(e);return s?Number(s):0}catch{return null}},async incrementEpoch(e){try{let r=await t?.getClient();if(!r)return;await r.incr(e)}catch{}}}),Xe=class{constructor(e,r){this.config=e;this.epochStore=r;this.buckets=new Map;this.inFlight=new Map;this.invalidate=e=>{this.buckets.delete(e),this.inFlight.delete(e)};this.maybeRefreshAhead=e=>{let r=e.refreshAheadRatio;if(r===void 0)return;let{cacheKey:s}=e,l=this.buckets.get(s);if(!l)return;let u=e.ttlMsOverride??this.config.defaultTtlMs;if(u-(l.expireAt-Date.now())<u*r||this.inFlight.has(s))return;let p;p=(async()=>{let P=e.epochKey?await this.epochStore.getEpoch(e.epochKey):null,i=await e.fetcher();return this.inFlight.get(s)===p&&this.buckets.set(s,{records:i,expireAt:Date.now()+u,epoch:P}),i})(),this.inFlight.set(s,p),p.catch(()=>{}).finally(()=>{this.inFlight.get(s)===p&&this.inFlight.delete(s)})};this.getOrFetch=async e=>{let{cacheKey:r,forceRefresh:s,snapshot:l}=e,u=this.buckets.get(r);if(s&&(this.buckets.delete(r),this.inFlight.delete(r)),!s&&u&&u.expireAt>Date.now())if(e.epochKey){let p=await this.epochStore.getEpoch(e.epochKey);if(p===null||u.epoch===p)return this.maybeRefreshAhead(e),l?u.records.map(P=>structuredClone(P)):u.records;this.buckets.delete(r)}else return this.maybeRefreshAhead(e),l?u.records.map(p=>structuredClone(p)):u.records;if(!s&&this.inFlight.has(r)){let p=await this.inFlight.get(r);return l?p.map(P=>structuredClone(P)):p}let S;S=(async()=>{let p=e.epochKey?await this.epochStore.getEpoch(e.epochKey):null;e.onFetchStart?.();let P=await e.fetcher();if(s||this.inFlight.get(r)===S){let i=Date.now()+(e.ttlMsOverride??this.config.defaultTtlMs);this.buckets.set(r,{records:P,expireAt:i,epoch:p}),this.buckets.size>500&&this.cleanExpired()}return P})(),s||this.inFlight.set(r,S);try{let p=await S;return l?p.map(P=>structuredClone(P)):p}finally{this.inFlight.get(r)===S&&this.inFlight.delete(r)}};this.flush=e=>{this.buckets.delete(e),this.inFlight.delete(e)};this.clearAll=()=>{this.buckets.clear(),this.inFlight.clear()};this.invalidatePrefix=e=>{for(let r of this.buckets.keys())r.startsWith(e)&&this.buckets.delete(r);for(let r of this.inFlight.keys())r.startsWith(e)&&this.inFlight.delete(r)}}cleanExpired(){let e=Date.now();for(let[r,s]of this.buckets.entries())s.expireAt<=e&&this.buckets.delete(r)}};import{systemSseRuntime as Mr}from"@aiquants/sse";import{createSseResponse as kr,readLastEventId as Nr,startSseHeartbeat as Pr,terminalStreamResponse as Lr}from"@aiquants/sse/server";var hr=/^\d{4}-\d{2}-\d{2}$/,fr=/^\d{4}\/\d{2}\/\d{2}$/,Et=t=>t<10?`0${t}`:`${t}`,vt=t=>{if(Number.isNaN(t.getTime()))return null;let e=t.getFullYear(),r=Et(t.getMonth()+1),s=Et(t.getDate());return`${e}-${r}-${s}`};var oe=t=>{if(t==null)return null;if(t instanceof Date)return vt(t);let e=t.trim();if(e==="")return null;if(hr.test(e))return e;if(fr.test(e))return e.replaceAll("/","-");let r=new Date(e);return vt(r)};var pt=t=>{let e=2166136261,r=-624069552;for(let s of t){let l=s.reportHubId;e^=l&255,e=Math.imul(e,16777619),e^=l>>>8&255,e=Math.imul(e,16777619),e^=l>>>16&255,e=Math.imul(e,16777619),e^=l>>>24&255,e=Math.imul(e,16777619),r^=l>>>24&255,r=Math.imul(r,16777619),r^=l>>>16&255,r=Math.imul(r,16777619),r^=l>>>8&255,r=Math.imul(r,16777619),r^=l&255,r=Math.imul(r,16777619);let u=s.businessDate;if(u===null)e^=1,e=Math.imul(e,16777619),r^=1,r=Math.imul(r,16777619);else for(let S=0;S<u.length;S++){let p=u.charCodeAt(S);e^=p&255,e=Math.imul(e,16777619),r^=p&255,r=Math.imul(r,16777619)}}return e^=t.length,e=Math.imul(e,16777619),r^=t.length,r=Math.imul(r,16777619),((e>>>0).toString(16).padStart(8,"0")+(r>>>0).toString(16).padStart(8,"0")).replace(/^0+(?=.)/,"")},Ze=(t,e)=>t.businessDate!==e.businessDate?t.businessDate===null?1:e.businessDate===null||t.businessDate>e.businessDate?-1:1:e.reportHubId-t.reportHubId,xt=t=>{for(let e=1;e<t.length;e++)if(Ze(t[e-1],t[e])>0)return!1;return!0};var Mt=(t,e)=>{let r=t.findIndex(s=>Ze({businessDate:s.businessDate,reportHubId:s.reportHubId},e)>0);return r===-1?t.length:r};var de=(t,e,r=console)=>{let s=l=>typeof l=="string"?[`${e} ${l}`]:[e,l];return{debug:(l,...u)=>{t<=0&&r.debug(...s(l),...u)},info:(l,...u)=>{t<=1&&r.info(...s(l),...u)},warn:(l,...u)=>{t<=2&&r.warn(...s(l),...u)},error:(l,...u)=>{t<=3&&r.error(...s(l),...u)}}};import{z as c}from"zod";var kt=15e3,Nt="lastEventId",br=/^\d{1,15}-\d{1,15}$/,Pt=t=>br.test(t),gr=c.object({name:c.string().nullish(),affiliation:c.string().nullish()}),Rr=c.object({name:c.string().nullish(),text:c.string().nullish(),color:c.string().nullish()}),Sr=c.object({id:c.number(),name:c.string().nullish(),color:c.string().nullish()}),Lt=c.object({id:c.number(),userId:c.string().nullish(),userName:c.string().nullish(),content:c.string().nullish(),createdAt:c.string().nullish(),isMine:c.boolean()}),Dr=c.object({id:c.string(),fileName:c.string(),fileType:c.string().nullable(),fileSize:c.number().nullable(),createdAt:c.string().nullable(),state:c.enum(["present","absent","unknown"])}),mt=c.object({reportHubId:c.number(),date:c.string().nullish(),createdAt:c.string().nullish(),author:c.string().nullish(),userId:c.string().nullish(),sourceType:c.string().nullish(),employeeName:c.string().nullish(),updatedBy:c.string().nullish(),updatedAt:c.string().nullish(),category:c.string().nullish(),creationCategory:c.string().nullish(),visitTimeFrom:c.string().nullish(),visitTimeTo:c.string().nullish(),customerName:c.string().nullish(),interviewers:c.array(gr),subject:c.string().nullish(),content:c.string().nullish(),externalComments:c.array(Rr),isRead:c.boolean(),isStarred:c.boolean(),labels:c.array(Sr),postedComments:c.array(Lt),attachments:c.array(Dr).default([])}),wr=c.object({type:c.literal("connected")}),et=c.object({type:c.literal("status-update"),reportHubId:c.number(),statusType:c.enum(["star","read"]),value:c.boolean(),clientTempId:c.string(),recipientRawUserId:c.number().optional()}),yt=c.string().optional(),ht=c.object({type:c.literal("comment-add"),reportHubId:c.number(),comment:Lt,clientTempId:c.string(),recipientRawUserId:c.number().optional(),sourceType:yt}),ft=c.object({type:c.literal("comment-delete"),reportHubId:c.number(),commentId:c.number(),clientTempId:c.string(),recipientRawUserId:c.number().optional(),sourceType:yt}),bt=c.object({type:c.literal("report-create"),reportHubId:c.number(),report:mt,clientTempId:c.string(),recipientRawUserId:c.number().optional()}),gt=c.object({type:c.literal("report-update"),reportHubId:c.number(),report:mt,clientTempId:c.string(),recipientRawUserId:c.number().optional()}),Rt=c.object({type:c.literal("report-publish"),reportHubId:c.number(),report:mt,clientTempId:c.string(),recipientRawUserId:c.number().optional()}),St=c.object({type:c.literal("report-delete"),reportHubId:c.number(),clientTempId:c.string(),sourceType:yt}),$t=c.discriminatedUnion("type",[wr,et,ht,ft,bt,gt,Rt,St]);import{createHash as Ir}from"crypto";var Dt=t=>{let e=JSON.stringify(t);return`"${Ir("sha256").update(e).digest("hex")}"`};var Ar=de(1,"[Response]"),me=(t,e,r,s=200,l=Ar)=>{let u=Dt(r),S=t.headers.get("If-None-Match");l.info(`[jsonResponseWithETag] ETag: ${u}, If-None-Match: ${S}`);let p=new Headers({"Content-Type":"application/json","Cache-Control":"private, max-age=0, must-revalidate","X-Content-Type-Options":"nosniff","X-Frame-Options":"DENY","Content-Security-Policy":"default-src 'none'",ETag:u});return e&&p.append("Set-Cookie",e),t.method==="GET"&&s===200&&S===u?new Response(null,{status:304,headers:p}):new Response(JSON.stringify(r),{status:s,headers:p})};import{EventEmitter as Tr}from"events";var Pe=(t,e)=>{let[r,s]=t.split("-").map(Number),[l,u]=e.split("-").map(Number);return r!==l?r<l:s<=u},rt=class{constructor(e){this.config=e;this._emitter=new Tr;this._state="idle";this._refCount=0;this._lastId="$";this._emitter.setMaxListeners(0),this._logger=e.logger??de(1,"[SSE Reader]")}subscribe(e,r){return this._emitter.on("entry",e),r&&this._emitter.on("error",r),this._refCount++,this._refCount===1&&this._startLoop(),()=>{this._emitter.removeListener("entry",e),r&&this._emitter.removeListener("error",r),this._refCount--,this._refCount<=0&&(this._refCount=0,this._stopLoop())}}async destroy(){this._refCount=0,await this._stopLoop(),this._emitter.removeAllListeners(),this._lastId="$"}async _startLoop(){for(;this._state==="stopping";)await new Promise(e=>setTimeout(e,50));if(this._state!=="running"&&this._refCount!==0){this._state="running";try{this._client=await this.config.redis?.createClient()}catch(e){this._state="idle",this._emitError(e instanceof Error?e:new Error("Failed to create Redis client for SSE reader"));return}if(!this._client){this._state="idle",this._emitError(new Error("Failed to create Redis client for SSE reader"));return}if(this._client.on("error",e=>{this._logger.error("Redis client error:",e)}),this._lastId==="$")try{let e=await this.config.redis?.getClient();if(e){let r=await e.xRevRange(this.config.streamKey,"+","-",{COUNT:1});this._lastId=r.length>0?r[0].id:"0-0"}}catch(e){this._logger.warn("Failed to resolve stream tail anchor; falling back to $:",e)}try{for(;this._state==="running"&&this._client?.isOpen;){let e=await this._client.xRead([{key:this.config.streamKey,id:this._lastId}],{BLOCK:5e3,COUNT:100});if(e)for(let r of e)for(let s of r.messages){this._lastId=s.id;try{let l=s.message?.data?JSON.parse(s.message.data):null,u=l?.type;if((u==="report-create"||u==="report-delete"||u==="report-publish")&&this.config.cache.invalidatePrefix("daily-report:ids"),u==="comment-add"||u==="comment-delete"||u==="status-update"){let S=l?.reportHubId;typeof S=="number"&&(this.config.cache.invalidate(`daily-report:detail:${S}`),this.config.cache.invalidatePrefix(`daily-report:detail:${S}:user:`))}}catch{}this._emitter.emit("entry",{id:s.id,message:s.message})}}}catch(e){!(e?.constructor?.name==="ClientClosedError")&&this._state==="running"&&(this._logger.error("xRead loop error:",e),this._emitError(e instanceof Error?e:new Error(String(e))))}finally{if(this._client?.isOpen)try{await this._client.quit()}catch{}this._client=void 0,this._state="idle",this._refCount>0&&this._startLoop()}}}async _stopLoop(){if(this._state==="running"){if(this._state="stopping",this._client?.isOpen)try{await this._client.quit()}catch{}for(;this._state==="stopping";)await new Promise(e=>setTimeout(e,50))}}_emitError(e){this._emitter.listenerCount("error")>0?this._emitter.emit("error",e):this._logger.error("SSE reader error (no error listeners):",e)}};import{inArray as _r,sql as Bt}from"drizzle-orm";var Cr="",Er=64,vr=t=>t.toLowerCase(),xr=t=>t.trim().toLowerCase();function Ut(t){if(t==null)return null;if(!Array.isArray(t))return new Set;let e=new Set;for(let r of t){if(typeof r!="string")continue;let s=xr(r);s.length>0&&e.add(s)}return e}function ge(t,e){return t===null?!0:e==null?!1:t.has(vr(e))}function Ee(t){return t!==null&&t.size===0}function Ht(t,e){if(e!==null)return e.size===0?Bt`1 = 0`:_r(Bt`LOWER(${t})`,[...e])}var Le,$e,Ve=class Ve{constructor(e,r){dt(this,Le);dt(this,$e);ct(this,Le,e),ct(this,$e,r)}get visible(){return Fe(this,Le)===null?null:new Set(Fe(this,Le))}get commentable(){return Fe(this,$e)===null?null:new Set(Fe(this,$e))}static restrictTo(e){let r=typeof e=="object"&&e!==null&&"read"in e,s=Ut(r?e.read:e),l=r?e.comment:void 0;if(l===void 0)return new Ve(s,s);let u=Ut(l),S=new Set;for(let p of u??[])s.has(p)&&S.add(p);return new Ve(s,S)}static unrestricted(e){return new Ve(null,null)}};Le=new WeakMap,$e=new WeakMap;var ye=Ve;function ze(t){let e=Ot(t.visible),r=Ot(t.commentable);return e===r?e:`d:${e.length}:${e}${r}`}function Ot(t){if(t===null)return"all";if(t.size===0)return"none";let e=[...t].sort().map(s=>`${s.length}:${s}`).join(Cr);if(e.length<=Er)return`s:${e}`;let r=2166136261;for(let s=0;s<e.length;s++)r^=e.charCodeAt(s),r=Math.imul(r,16777619);return`sh:${(r>>>0).toString(16)}`}var $r=(t,e)=>{let r=new Headers({"Content-Type":"application/json"});return e?.setCookie&&r.append("Set-Cookie",e.setCookie),new Response(JSON.stringify(t),{status:e?.status??200,headers:r})},nt=30,Gt=4e3,Br="stream interrupted by server error",Ur=/^\d{4}-\d{2}-\d{2}$/,Or=15e3,Yt=Symbol("ids-stream-heartbeat"),qt=864e5,Hr={baseMs:2e3,jitterMs:8e3},Yr=6e4,Ft=1e3,Vt=JSON.stringify({type:"connected"}),zt="0-0",qr=/^[0-9a-f]{1,16}$/,Fr=t=>{let e=t.searchParams.get("cursor_report_hub_id"),r=t.searchParams.get("cursor_business_date"),s=t.searchParams.get("cursor_snapshot"),l=s!==null&&qr.test(s)?s:null;if(e===null)return r===null?{cursor:null,snapshot:l}:{invalid:!0};let u=Number.parseInt(e,10);return!Number.isSafeInteger(u)||String(u)!==e||u<=0?{invalid:!0}:r===null?{cursor:{businessDate:null,reportHubId:u},snapshot:l}:Ur.test(r)?{cursor:{businessDate:r,reportHubId:u},snapshot:l}:{invalid:!0}};async function*Kt(t,e,r,s){let l=e?Mt(t,e):0,u=!0;for(;;){let S=t.slice(l,l+(u?r:Gt));l+=S.length;let p=l>=t.length,P=S[S.length-1];if(yield{kind:"chunk",items:S,nextCursor:p||!P?null:{businessDate:P.businessDate,reportHubId:P.reportHubId},isLast:p,...u?{total:t.length}:{},...u?{streamAnchor:s.streamAnchor}:{},snapshot:s.snapshot,...u&&s.restarted?{restarted:!0}:{}},u=!1,p)return}}var jt=(t,e,r,s)=>{let l=new TextEncoder,u=!1,S=null,p=new ReadableStream({async pull(i){if(u||r.signal.aborted){await e.return(void 0).catch(()=>{});try{i.close()}catch{}return}let B=null;try{S===null&&(S=e.next());let y=new Promise(pe=>{B=setTimeout(()=>pe(Yt),Or)}),V=await Promise.race([S,y]);if(B!==null&&(clearTimeout(B),B=null),V===Yt){if(u||r.signal.aborted){await e.return(void 0).catch(()=>{});try{i.close()}catch{}return}i.enqueue(l.encode(`
|
|
2
|
+
`));return}S=null;let{value:z,done:H}=V;if(H){i.close();return}if(u||r.signal.aborted){await e.return(void 0).catch(()=>{});try{i.close()}catch{}return}i.enqueue(l.encode(`${JSON.stringify(z)}
|
|
3
|
+
`))}catch(y){if(B!==null&&clearTimeout(B),S=null,u||r.signal.aborted)return;s.error(`ids-stream emission failed: ${y instanceof Error?y.message:String(y)}`);try{let V={kind:"error",error:Br};i.enqueue(l.encode(`${JSON.stringify(V)}
|
|
4
|
+
`)),i.close()}catch{}}},cancel(){u=!0,e.return(void 0).catch(()=>{})}}),P=new Headers({"Content-Type":"application/x-ndjson; charset=utf-8","Cache-Control":"private, no-cache, no-transform","X-Content-Type-Options":"nosniff"});return t&&P.append("Set-Cookie",t),new Response(p,{status:200,headers:P})},Vr=32*1024*1024,zr=60,Kr=4,jr=12e4,Jr=1024,Gr=60,Qr=5,Wr=new Set(["image/png","image/jpeg","image/gif","image/webp","application/pdf","text/plain"]),Xr=/^[\x20-\x7E]+$/,Zr=/^[\w.+-]+\/[\w.+-]+/,Jt=t=>t&&Xr.test(t)&&Zr.test(t)?t:null,en=t=>encodeURIComponent(t).replace(/['()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`),tn=t=>t.replace(/[^\x20-\x7E]/g,"_").replace(/["\\]/g,"_"),rn=t=>{switch(t){case"not_found":case"denied":case"invalid_path":return 404;case"too_large":return 413;default:return 502}},nn={404:"Attachment not found",413:"Attachment too large",502:"Attachment storage unavailable"},an=t=>{let e=new Map;return(r,s)=>{let l=e.get(r);l&&e.delete(r);let u=l??{tokens:t,lastRefillMs:s},S=Math.max(0,s-u.lastRefillMs);S>0&&(u.tokens=Math.min(t,u.tokens+S*t/6e4),u.lastRefillMs=s);let p=u.tokens>=1;for(p&&(u.tokens-=1),e.set(r,u);e.size>Jr;){let P=e.keys().next();if(P.done)break;e.delete(P.value)}return p}},sn=t=>{let e=0;return{tryAcquire:()=>e>=t?!1:(e+=1,!0),release:()=>{e>0&&(e-=1)}}},on=(t,e,r)=>{let s=setTimeout(e,r);s.unref?.();let l=()=>{clearTimeout(s),e()},u=!1;return new ReadableStream({pull(S){if(u){S.close(),l();return}u=!0,S.enqueue(t)},cancel(){l()}})},ln=(t,e,r,s)=>{if(r===null&&s===null)return!0;let l=typeof e.sourceType=="string"?e.sourceType:void 0;switch(t.type){case"connected":case"status-update":return!0;case"report-create":case"report-update":case"report-publish":return ge(r,t.report.sourceType);case"comment-add":case"comment-delete":return ge(s,l??"Internal");case"report-delete":return ge(r,l)}},un=["externalComments","postedComments"],dn=(t,e,r)=>{if(r===null||t.type!=="report-create"&&t.type!=="report-update"&&t.type!=="report-publish"||ge(r,t.report.sourceType))return!1;let s=e.report;if(typeof s!="object"||s===null)return!1;let l=s;for(let u of un)l[u]=[];return!0};function Qt(t){let{authenticate:e,service:r,encodeUserId:s,redis:l,sseReader:u,streamKey:S}=t,p=t.loginRedirectPath??"/auth/login",P=t.logger??de(3,"[DailyReportAPI]"),i=t.logger??de(3,"[DailyReportVisibility]"),B=t.logger??de(1,"[DailyReportSSE]"),y=t.logger??de(1,"[DailyReportAttachment]"),V=t.attachmentMaxBytes??Vr,z=an(t.attachmentRateLimitPerMinute??zr),H=sn(t.attachmentConcurrency??Kr),pe=async(h,x="initial")=>{let M=t.resolveVisibleSourceTypes;if(!M)return ye.unrestricted("no visibility port injected: this deployment does not restrict by source type");try{let w=await M(h,{reason:x});return w==null?ye.unrestricted("visibility port returned null/undefined: this deployment opts out of source-type filtering"):ye.restrictTo(w)}catch(w){return i.error("resolveVisibleSourceTypes threw; failing closed (deny all)",w),ye.restrictTo([])}},He=async({request:h})=>{let{user:x,cookie:M}=await e(h,{failureRedirect:p}),w=new Headers;M&&w.append("Set-Cookie",M);let m=await r.getUserIdByExternalId(x.id),f=m?s(m):null;return{data:{user:x,userId:f},headers:w}},Ye={"business-date":async(h,x,M,w,m)=>{let f=oe(h.searchParams.get("businessDate")),E=h.searchParams.get("forceRefresh")==="true";if(!f)return me(M,x,{error:{message:"Invalid business date"}},400);let C=await r.getDailyReportsByBusinessDateByExternalId(m,f,w.id,{forceRefresh:E});return me(M,x,{businessDate:f,reports:C},200)},"ids-stream":async(h,x,M,w,m)=>{let f=Fr(h);if("invalid"in f)return me(M,x,{error:{message:"Invalid cursor"}},400);let E=h.searchParams.get("forceRefresh")==="true",C=!1,U=null,_=null,v=new Promise((k,j)=>{U=k,_=j});v.catch(()=>{});let Z=r.getDailyReportIdsByExternalId(m,w.id,{forceRefresh:E,onFetchStart:f.cursor?void 0:()=>{C=!0,r.readSseStreamAnchor().then(k=>r.getDailyReportIdsFirstPageByExternalId(m,w.id,nt).then(j=>({items:j,streamAnchor:k}))).then(k=>U?.(k),k=>_?.(k))}});if(Z.catch(()=>{}),f.cursor){let{items:k,streamAnchor:j}=await Z,O=pt(k),Y=f.snapshot!==null&&f.snapshot===O;return jt(x,Kt(k,Y?f.cursor:null,nt,{snapshot:O,restarted:!Y,streamAnchor:j}),M,P)}let L=(async function*(){let k=await Promise.race([Z.then(Y=>({kind:"full",source:Y}),Y=>({kind:"full-error",error:Y})),v.then(Y=>({kind:"page",page:Y}),()=>({kind:"page-error"}))]),j=null,O=!1;if(k.kind==="full")j=k.source;else if(k.kind==="page"){let{items:Y,streamAnchor:I}=k.page;if(Y.length<nt){yield{kind:"chunk",items:Y,nextCursor:null,isLast:!0,total:Y.length,streamAnchor:I};return}yield{kind:"chunk",items:Y,nextCursor:null,isLast:!1,provisional:!0},O=!0}else if(k.kind==="full-error"&&C){let Y=await v.catch(()=>null);Y&&Y.items.length>0&&(yield{kind:"chunk",items:Y.items,nextCursor:null,isLast:!1,provisional:!0})}j===null&&(j=await Z),yield*Kt(j.items,null,O?Gt:nt,{snapshot:pt(j.items),streamAnchor:j.streamAnchor})})();return jt(x,L,M,P)},report:async(h,x,M,w,m)=>{let f=h.searchParams.get("reportHubId"),E=h.searchParams.get("forceRefresh")==="true",C=f?Number.parseInt(f,10):NaN;if(!Number.isFinite(C)||C<=0)return me(M,x,{error:{message:"Invalid reportHubId"}},400);let U=await r.getDailyReportDetailByIdByExternalId(m,C,w.id,{snapshot:!0,forceRefresh:E});return U?me(M,x,{report:U},200):me(M,x,{error:{message:"Report not found"}},404)}},X=async({request:h,params:x})=>{let{user:M,cookie:w}=await e(h,{failureRedirect:null}),m=w??null;if(!M)return me(h,m,{error:{message:"Unauthorized"}},401);if(h.method!=="GET")return me(h,m,{error:{message:"Method not allowed"}},405);let f=x.endpoint??"",E=Ye[f];if(!E)return me(h,m,{error:{message:"Unknown endpoint"}},404);let C=Date.now();try{let U=new URL(h.url),_=await pe(h);return await E(U,m,h,M,_)}catch(U){let _=Date.now()-C,v=U instanceof Error?U:new Error(String(U));return P.error(`500 endpoint=${f} elapsed=${_}ms name=${v.name} code=${"code"in v?v.code:"N/A"} message=${v.message}`),P.error("Stack:",v.stack),me(h,m,{error:{message:"Internal Server Error"}},500)}},Ke=async({request:h,params:x})=>{let{user:M,cookie:w}=await e(h,{failureRedirect:null}),m=(E,C)=>$r(E,{...C,setCookie:w});if(!M)return m({error:"Unauthorized"},{status:401});let f=Date.now();try{if(x.endpoint!=="action")return m({error:"Unknown endpoint"},{status:404});let C=await r.getUserIdByExternalId(M.id);if(!C)return m({error:"User not found"},{status:404});let U=await pe(h),_=await h.formData(),v=_.get("intent"),Z=_.get("reportHubId"),L=Z?Number(Z):NaN,k=_.get("businessDate"),j=Number(_.get("operationTimestamp")),O=_.get("clientTempId");if(v==="clearCache")return t.enableDevCacheClear?(await r.clearCache(),m({status:"OK",intent:"clearCache"})):m({error:"Invalid intent"},{status:400});if(!O)return m({error:"clientTempId required"},{status:400});if(v!=="create"&&(!L||Number.isNaN(L)))return m({error:"Invalid reportHubId"},{status:400});let Y=async(I,A,K)=>{let le=_.get(A);if(le===null)return m({error:`${A} required`},{status:400});try{let te=await K(le==="true");return m({status:"OK",intent:I,updatedStatus:{isStarred:te.isStarred,isRead:te.isRead},operationTimestamp:j,reportHubId:String(L),clientTempId:O})}catch(te){if(te instanceof Error&&te.message==="Not Found")return m({error:"Report not found"},{status:404});throw te}};switch(v){case"create":{if(!k)return m({error:"businessDate required"},{status:400});let I=await r.createDailyReport(C,k,O);return m({status:"OK",intent:"create",report:I,reportHubId:String(I.reportHubId),clientTempId:O})}case"update":{let I=_.get("title"),A=_.get("content");try{return await r.updateDailyReport(L,C,{title:I,content:A},O),m({status:"OK",intent:"update",reportHubId:String(L),clientTempId:O})}catch(K){if(K instanceof Error){if(K.message==="Unauthorized")return m({error:"Unauthorized"},{status:403});if(K.message==="Not Found")return m({error:"Report not found"},{status:404})}throw K}}case"publish":try{let I=await r.publishDailyReport(L,C,O);return m({status:"OK",intent:"publish",reportHubId:String(L),clientTempId:O,report:I})}catch(I){if(I instanceof Error){if(I.message==="Unauthorized")return m({error:"Unauthorized"},{status:403});if(I.message==="Not Found")return m({error:"Report not found"},{status:404})}throw I}case"delete":try{return await r.deleteDailyReport(L,C,O),m({status:"OK",intent:"delete",reportHubId:String(L),clientTempId:O})}catch(I){if(I instanceof Error){if(I.message==="Unauthorized")return m({error:"Unauthorized"},{status:403});if(I.message==="Not Found")return m({error:"Report not found"},{status:404})}throw I}case"toggleStar":return await Y("toggleStar","isStarred",I=>r.setStarStatus(U,C,L,k,I,O));case"toggleRead":return await Y("toggleRead","isRead",I=>r.setReadStatus(U,C,L,k,I,O));case"addComment":{let I=_.get("content");if(!I)return m({error:"Content required"},{status:400});try{let A=await r.addComment(U,C,L,I,k,O),K={...A,userId:A.userId};return m({status:"OK",intent:"addComment",newComment:K,reportHubId:String(L),clientTempId:O})}catch(A){if(A instanceof Error){if(A.message==="Not Found")return m({error:"Report not found"},{status:404});if(A.message.startsWith("Comments are restricted"))return m({error:"Comments are restricted for this report"},{status:403})}throw A}}case"deleteComment":{let I=Number(_.get("commentId"));if(!I||Number.isNaN(I))return m({error:"Invalid commentId"},{status:400});try{return await r.deleteComment(U,C,L,I,k,O),m({status:"OK",reportHubId:String(L),deletedCommentId:String(I),clientTempId:O})}catch(A){if(A instanceof Error){if(A.message==="Unauthorized")return m({error:"Unauthorized"},{status:403});if(A.message==="Not Found")return m({error:"Comment not found"},{status:404})}throw A}}default:return m({error:"Invalid intent"},{status:400})}}catch(E){if(E instanceof Response)throw E;let C=Date.now()-f,U=E instanceof Error?E:new Error(String(E));return P.error(`500 action elapsed=${C}ms name=${U.name} message=${U.message}`),P.error("Stack:",U.stack),m({error:"Internal Server Error"},{status:500})}},Ae=(h,x)=>{h.writeEvent({event:null,id:x,data:Vt})},st=(h,x,M,w)=>{if(M.data)try{let m=JSON.parse(M.data),f=$t.safeParse(m);if(!f.success){B.error("SSE message validation failed:",f.error.format());return}let E=f.data,C=typeof m.recipientRawUserId=="number"?m.recipientRawUserId:void 0;if((E.type==="status-update"||C!==void 0)&&C!==w.internalUserId||!ln(E,m,w.visibleSet,w.commentableSet)){Ae(h,x);return}let _=dn(E,m,w.commentableSet),v;if("recipientRawUserId"in m){let{recipientRawUserId:Z,...L}=m;v=JSON.stringify(L)}else _?v=JSON.stringify(m):v=M.data;h.writeEvent({event:null,id:x,data:v})}catch(m){B.error(`[SSE:${w.internalUserId}] processEntry error:`,m)}},Se=async(h,x)=>{let{request:M,internalUserId:w,cursor:m}=x,f=x.initialScope.visible,E=x.initialScope.commentable,C=0,U=setInterval(()=>{let A=++C;pe(M,"refresh").then(K=>{A===C&&(f=K.visible,E=K.commentable)})},Yr);h.onClose(()=>clearInterval(U));let _=m===null?zt:m,v=m!==null&&l!==void 0,Z=[],L=null,k=A=>{Pe(A.id,_)||(_=A.id,st(h,A.id,A.message,{internalUserId:w,visibleSet:f,commentableSet:E}))},j=async(A,K)=>{let[le]=await A.xRange(S,"-","+",{COUNT:1});return le!==void 0&&!Pe(le.id,K)},O=async(A,K)=>{if(await j(A,K))return!1;let le=K;for(;;){let te=await A.xRange(S,le,"+",{COUNT:Ft}),_e=te[0];if(_e!==void 0&&_e.id!==le&&await j(A,le))return!1;for(let ce of te){if(L!==null&&Pe(L,ce.id))return!0;k(ce)}let be=te.at(-1);if(te.length<Ft||be===void 0||h.isClosed())return!0;le=be.id}},Y=u.subscribe(A=>{if(!v){k(A);return}Pe(A.id,_)||(L===null&&(L=A.id),Z.push(A))},A=>{B.error(`[SSE:${w}] Fan-Out reader error:`,A),h.close()});if(h.onClose(Y),m===null)try{let A=await l?.getClient();if(A){let K=await A.xRevRange(S,"+","-",{COUNT:1});K.length>0&&!Pe(K[0].id,_)&&(_=K[0].id)}}catch{}if(h.writeEvent({event:null,id:_===zt?null:_,data:Vt}),Pr(h,{intervalMs:kt,retry:Hr,runtime:Mr}),m===null||l===void 0)return;let I=await l.getClient();if(I===void 0)throw new Error("redis client unavailable for the SSE catch-up");if(!await O(I,m)){h.writeRetry(qt),h.writeEvent({event:"resync-required",id:null,data:""}),h.close();return}v=!1;for(let A of Z.splice(0))k(A)};return{index:{loader:He},api:{loader:X,action:Ke},sse:{loader:async({request:h,params:x})=>{let M,w=()=>{let f=new Headers;return M!==void 0&&f.append("Set-Cookie",M),f},m=f=>Lr(f,{data:"",retryMs:qt,headers:w()});try{let f=await e(h,{failureRedirect:null});M=f.cookie;let{user:E}=f;if(!E)return m("auth-required");let C=await r.getUserIdByExternalId(E.id);if(!C)return m("forbidden");if(x.endpoint!=="updates")return new Response("Not Found",{status:404,headers:w()});let U=Nr(h,Nt);if(U!==null&&!Pt(U))return B.warn(`[SSE:${C}] malformed resume cursor; asking the client to resync`),m("resync-required");let _=await pe(h);return kr({requestSignal:h.signal,headers:w(),onError:(v,Z)=>B.error(`[SSE:${C}] ${Z} failed:`,v),produce:v=>Se(v,{request:h,internalUserId:C,cursor:U,initialScope:_})})}catch(f){if(f instanceof Response)throw f;let E=f instanceof Error?f:new Error(String(f));return B.error(`500 sse name=${E.name} message=${E.message}`),new Response("Internal Server Error",{status:500,headers:w()})}}},attachment:{loader:async({request:h,params:x})=>{let M=null,w=(m,f,E)=>{let C=new Headers({"Content-Type":"application/json"});return E!==void 0&&C.set("Retry-After",String(E)),M&&C.append("Set-Cookie",M),new Response(JSON.stringify({error:{message:f}}),{status:m,headers:C})};try{let{user:m,cookie:f}=await e(h,{failureRedirect:null});if(M=f??null,!m)return w(401,"Unauthorized");if(h.method!=="GET"&&h.method!=="HEAD")return w(405,"Method not allowed");let E=t.attachmentIdCodec,C=t.readAttachment;if(!(E&&C))return w(404,"Attachment not found");let U=x.token??"",_=E.decode(U);if(_===null||!Number.isSafeInteger(_)||_<=0)return w(400,"Invalid attachment token");let v=await r.getUserIdByExternalId(m.id);if(!v)return w(403,"Forbidden");if(!z(v,Date.now()))return y.error(`429 attachment=${_} viewer=${v} reason=rate_limit`),w(429,"Too many requests",Gr);let Z=await pe(h),L=await r.getAttachmentForUser(Z,_,v);if(!L)return y.error(`404 attachment=${_} viewer=${v} reason=not_visible`),w(404,"Attachment not found");if(L.fileSize!=null&&L.fileSize>V)return y.error(`413 attachment=${_} viewer=${v} reason=db_size`),w(413,"Attachment too large");if(!H.tryAcquire())return y.error(`503 attachment=${_} viewer=${v} reason=concurrency`),w(503,"Too many concurrent downloads",Qr);let k=!1,j=()=>{k||(k=!0,H.release())},O=!1;try{let Y=h.method==="HEAD",I=await C(L.filePath,{maxBytes:V,head:Y,principal:s(v)});if(!I.ok){let De=rn(I.reason);return I.reason==="not_found"&&r.markAttachmentMissing(_).catch(Je=>{y.error(`markAttachmentMissing failed attachment=${_} message=${Je instanceof Error?Je.message:"unknown"}`)}),y.error(`${De} attachment=${_} viewer=${v} reason=${I.reason} code=${I.code??"-"}`),w(De,nn[De]??"Attachment storage unavailable")}let A=Jt(L.fileType)??Jt(I.contentType)??"application/octet-stream",K=Wr.has(A),le=new URL(h.url).searchParams.get("download")==="1",te=K?A:"application/octet-stream",_e=K&&!le?"inline":"attachment",be=I.size??I.bytes.byteLength,ce=new Headers({"Content-Type":te,"Content-Length":String(be),"Content-Disposition":`${_e}; filename="${tn(L.fileName)}"; filename*=UTF-8''${en(L.fileName)}`,"Cache-Control":"private, no-store","X-Content-Type-Options":"nosniff","Content-Security-Policy":"default-src 'none'; sandbox","X-Frame-Options":"SAMEORIGIN"});return M&&ce.append("Set-Cookie",M),r.markAttachmentPresent(_).catch(De=>{y.error(`markAttachmentPresent failed attachment=${_} message=${De instanceof Error?De.message:"unknown"}`)}),y.info(`200 attachment=${_} viewer=${v} type=${te} disposition=${_e} bytes=${be}`),Y?new Response(null,{status:200,headers:ce}):(O=!0,new Response(on(I.bytes,j,jr),{status:200,headers:ce}))}finally{O||j()}}catch(m){if(m instanceof Response)throw m;return y.error(`500 attachment=? viewer=? reason=unexpected message=${m instanceof Error?m.message:"unknown"}`),w(500,"Attachment request failed")}}}}}import{runWithTransactionRetry as cn}from"@aiquants/mssql";import{aliasedTable as Be,and as G,asc as at,desc as Ue,eq as g,getColumns as pn,inArray as he,isNull as ue,or as Oe,sql as Wt}from"drizzle-orm";var ve=t=>pn(t),ie=(t,e)=>{if(!t)return null;let r=t instanceof Date?t:new Date(t);if(Number.isNaN(r.getTime()))return typeof t=="string"?t:null;let s=r.getFullYear(),l=s<0?`-${String(-s).padStart(4,"0")}`:String(s).padStart(4,"0"),u=String(r.getMonth()+1).padStart(2,"0"),S=String(r.getDate()).padStart(2,"0");if(e==="YYYY-MM-DD")return`${l}-${u}-${S}`;let p=String(r.getHours()).padStart(2,"0"),P=String(r.getMinutes()).padStart(2,"0"),i=String(r.getSeconds()).padStart(2,"0");return`${l}-${u}-${S} ${p}:${P}:${i}`};function Xt(t){let{db:e,tables:r,userTable:s,resolveUserId:l,encodeUserId:u,redis:S,cache:p,epochs:P}=t,{hub:i,internal:B,comment:y,label:V,hubLabel:z,userStatus:H}=r,pe=t.externalSources??[],He=t.draftLabelNames&&t.draftLabelNames.length>0?t.draftLabelNames:[t.draftLabelName??"\u4E0B\u66F8\u304D"],Ye=He[0]??"\u4E0B\u66F8\u304D",X=t.logger??de(1,"[DailyReportService]"),Ke=n=>cn(a=>e.transaction(o=>a(()=>n(o))),t.transactionRetry),Ae="daily-report:ids",st=t.idsTtlMs??18e4,Se="daily-report:ids:epoch",Te="daily-report:business-date:",je=t.businessDateTtlMs??3e5,h="daily-report:date-epoch:",x="daily-report:detail-epoch:",w=`${t.streamKey??"daily-report:sse-stream"}:v2`,m=t.streamMaxLen??1e4,f=n=>P.incrementEpoch(n),E=n=>Ht(i.sourceType,n),C=(n,a)=>`${Ae}:user:${n}:st:${a}`,U=n=>`${Ae}:user:${n}:`,_=(n,a,o)=>`daily-report:date:${n}:user:${a}:st:${o}`,v=(n,a)=>`daily-report:date:${n}:user:${a}:`,Z=(n,a,o)=>`daily-report:detail:${n}:user:${a}:st:${o}`,L=(n,a)=>`daily-report:detail:${n}:user:${a}:`,k=async(n,a)=>{let o=await S?.getClient();if(!o){X.warn(`[SSE] Redis client unavailable (${a})`);return}let d=Date.now();try{await o.xAdd(w,"*",{data:JSON.stringify(n)},{TRIM:{strategy:"MAXLEN",strategyModifier:"~",threshold:m}});let b=Date.now()-d;b>1e3&&X.warn(`[SSE] Slow publish (${a}): ${b}ms`)}catch(b){X.error(`[SSE] Redis publish failed (${a}):`,b)}},j=async()=>{try{let n=await S?.getClient();if(n===void 0)return null;let[a]=await n.xRevRange(w,"+","-",{COUNT:1});return a===void 0?null:a.id}catch(n){return X.error("[DailyReportService] SSE stream anchor read failed",n),null}},O=n=>n==null||n===""?null:/^\d+$/.test(n)?u(Number(n)):n,Y=()=>{let n={};for(let a of pe)n[`ext_${a.sourceType}`]=ve(a.table);return n},I=n=>{let a=n;for(let o of pe)a=a.leftJoin(o.table,G(g(i.sourceType,o.sourceType),g(i.sourceIdNum,o.idColumn)));return a},A=(n,a,o)=>{let{hub:d,internal:b}=a,R=d.summary,D=[],T=null,N=null,J=null,q=null,W=null,ne=null,ke=[],we=pe.find($=>$.sourceType===d.sourceType),Ne=we?a[`ext_${we.sourceType}`]:void 0;if(we&&Ne){let $=we.mapRow(Ne);$.content!==void 0&&(R=$.content),$.employeeName!==void 0&&(ne=$.employeeName),$.category!==void 0&&(T=$.category),$.creationCategory!==void 0&&(N=$.creationCategory),$.visitTimeFrom!==void 0&&(J=$.visitTimeFrom),$.visitTimeTo!==void 0&&(q=$.visitTimeTo),$.customerName!==void 0&&(W=$.customerName),$.interviewers!==void 0&&(D=$.interviewers),$.externalComments!==void 0&&(ke=$.externalComments)}else d.sourceType==="Internal"&&b&&(R=b.body);let Re=(a.labels??[]).map($=>({id:$.id,name:$.name,color:$.color})),ae=a.postedCommentRows??[],Q=ge(n.commentable,d.sourceType),se=N?He.includes(N):!1,ut=Me?.[0]??null;return se&&ut&&!Re.some($=>$.id===ut)&&Re.push({id:ut,name:Ye,color:null}),{reportHubId:d.id,date:ie(d.businessDate,"YYYY-MM-DD"),author:a.creatorName??O(d.createdBy)??"",userId:d.userId?u(d.userId):"",sourceType:d.sourceType??"Internal",createdAt:ie(d.createdAt,"YYYY-MM-DD HH:mm:ss"),updatedAt:ie(d.updatedAt,"YYYY-MM-DD HH:mm:ss"),updatedBy:O(d.updatedBy),employeeName:ne??a.creatorName??O(d.createdBy),category:T,creationCategory:N,visitTimeFrom:J,visitTimeTo:q,customerName:W,interviewers:D,subject:d.title,content:R,externalComments:Q?ke:[],isRead:a.isRead??!1,isStarred:a.isStarred??!1,labels:Re,postedComments:ae.filter($=>Q||o!==void 0&&$.userId===o).map($=>({...$,userId:u($.userId),isMine:o?$.userId===o:!1})),attachments:a.attachments}},K=async(n,a)=>{let o=Be(z,"draft_label"),d=await Ce();return(await e.select({reportHubId:i.id,businessDate:i.businessDate,sourceType:i.sourceType}).from(i).leftJoin(o,G(g(o.hubId,i.id),he(o.labelId,d))).where(G(ue(i.deletedAt),Oe(g(i.userId,a),ue(i.userId),ue(o.hubId)),E(n.visible))).orderBy(Ue(i.businessDate),Ue(i.id))).map(R=>({...R,businessDate:ie(R.businessDate,"YYYY-MM-DD")}))},le=async(n,a,o)=>{let d=await ce(a);if(!d)return[];if(Ee(n.visible))return[];let b=Be(z,"draft_label"),R=await Ce();return(await e.select({reportHubId:i.id,businessDate:i.businessDate,sourceType:i.sourceType}).top(o).from(i).leftJoin(b,G(g(b.hubId,i.id),he(b.labelId,R))).where(G(ue(i.deletedAt),Oe(g(i.userId,d),ue(i.userId),ue(b.hubId)),E(n.visible))).orderBy(Ue(i.businessDate),Ue(i.id))).map(T=>({...T,businessDate:ie(T.businessDate,"YYYY-MM-DD")}))},te=async(n,a)=>{let o=await I(e.select({hub:ve(i),internal:ve(B),creatorName:s.displayName,...Y()}).from(i)).leftJoin(B,g(i.id,B.hubId)).leftJoin(s,g(i.userId,s.id)).where(G(g(i.businessDate,Wt`${a}`),ue(i.deletedAt),E(n.visible))).orderBy(Ue(i.id)),d=await Qe(o.map(b=>b.hub.id));return o.map(b=>A(n,{...b,attachments:d.get(b.hub.id)??[]}))},_e=n=>`${Te}${n}`,be=new Map,ce=async n=>{if(!t.disableUserIdCache&&be.has(n))return be.get(n)??null;let a=await l(n);return a!==null&&!t.disableUserIdCache&&be.set(n,a),a},De=async(n,a,{forceRefresh:o=!1,snapshot:d=!1,ttlMsOverride:b,onFetchStart:R}={})=>{let D=await ce(a);if(!D)return{items:[],streamAnchor:null};if(Ee(n.visible))return{items:[],streamAnchor:await j()};let T=C(D,ze(n)),[N]=await p.getOrFetch({cacheKey:T,fetcher:async()=>{let J=await j(),q=await K(n,D);return xt(q)?[{items:q,streamAnchor:J}]:(X.warn("[DailyReportService] ids array is not in stream order; re-sorting (check SQL ORDER BY vs compareIdsStreamOrder, or concurrent row movement during the scan)"),[{items:[...q].sort(Ze),streamAnchor:J}])},onFetchStart:R,forceRefresh:o,snapshot:d,ttlMsOverride:b??st,epochKey:Se,refreshAheadRatio:.5});if(N===void 0)throw new Error("[DailyReportService] ids cache returned no record");return N},Je=(n,a,{forceRefresh:o=!1,snapshot:d=!1,ttlMsOverride:b}={})=>{let R=oe(a);return R?Ee(n.visible)?Promise.resolve([]):p.getOrFetch({cacheKey:`${_e(R)}:st:${ze(n)}`,fetcher:()=>te(n,R),forceRefresh:o,snapshot:d,ttlMsOverride:b??je}):Promise.resolve([])},Me=null,Ge=async()=>(Me!==null||(Me=(await e.select({id:V.id}).from(V).where(he(V.name,He)).orderBy(V.id)).map(a=>a.id)),Me),Ce=async()=>{let n=await Ge();return n.length>0?n:[-1]},ot=async()=>{let n=await Ge();if(n.length===0)return null;let[a]=await e.select({id:V.id}).top(1).from(V).where(g(V.name,Ye));return a?.id??n[0]},rr=(n,a)=>a!=null?"absent":n!=null?"present":"unknown",Qe=async n=>{let a=new Map,o=r.attachment,d=t.attachmentIdCodec;if(n.length===0||!o||!d)return a;let b=await e.select({id:o.id,hubId:o.hubId,fileName:o.fileName,fileType:o.fileType,fileSize:o.fileSize,createdAt:o.createdAt,objectCheckedAt:o.objectCheckedAt,objectMissingAt:o.objectMissingAt}).from(o).where(he(o.hubId,n)).orderBy(at(o.createdAt),at(o.id));for(let R of b){let D={id:d.encode(Number(R.id)),fileName:String(R.fileName),fileType:R.fileType?String(R.fileType):null,fileSize:R.fileSize!=null?Number(R.fileSize):null,createdAt:ie(R.createdAt,"YYYY-MM-DD HH:mm:ss"),state:rr(R.objectCheckedAt,R.objectMissingAt)},T=a.get(Number(R.hubId));T?T.push(D):a.set(Number(R.hubId),[D])}return a},nr=async(n,a,o)=>{let d=r.attachment;if(!d||Ee(n.visible))return null;let b=await Ce(),R=Be(z,"draft_label");return(await e.select({fileName:d.fileName,filePath:d.filePath,fileType:d.fileType,fileSize:d.fileSize}).top(1).from(d).innerJoin(i,g(i.id,d.hubId)).leftJoin(R,G(g(R.hubId,i.id),he(R.labelId,b))).where(G(g(d.id,a),ue(i.deletedAt),Oe(g(i.userId,o),ue(R.hubId)),E(n.visible))))[0]??null},ar=async n=>{let a=r.attachment;if(!a)return;let o=new Date;try{await e.update(a).set({objectCheckedAt:o,objectMissingAt:o,updatedAt:o}).where(g(a.id,n))}catch(d){X.error("markAttachmentMissing failed",d)}},sr=async n=>{let a=r.attachment;if(!a)return;let o=new Date;try{await e.update(a).set({objectCheckedAt:o,objectMissingAt:null,updatedAt:o}).where(g(a.id,n))}catch(d){X.error("markAttachmentPresent failed",d)}},or=async(n,a,o,{forceRefresh:d=!1,snapshot:b=!1,ttlMsOverride:R}={})=>{let D=await ce(o);if(!D)return[];let T=oe(a);if(!T)return[];if(Ee(n.visible))return[];let N=_(T,D,ze(n));return p.getOrFetch({cacheKey:N,fetcher:async()=>{let J=await Ce(),q=Be(z,"draft_label"),W=await I(e.select({hub:ve(i),internal:ve(B),isRead:H.isRead,isStarred:H.isStarred,creatorName:s.displayName,...Y()}).from(i)).leftJoin(B,g(i.id,B.hubId)).leftJoin(H,G(g(i.id,H.hubId),g(H.userId,D))).leftJoin(q,G(g(q.hubId,i.id),he(q.labelId,J))).leftJoin(s,g(i.userId,s.id)).where(G(g(i.businessDate,Wt`${T}`),ue(i.deletedAt),Oe(g(i.userId,D),ue(q.hubId)),E(n.visible))).orderBy(Ue(i.id));if(W.length===0)return[];let ne=W.map(Q=>Q.hub.id),ke=await e.select({hubId:z.hubId,id:V.id,name:V.name,color:V.color}).from(z).innerJoin(V,g(z.labelId,V.id)).where(he(z.hubId,ne)),we=await e.select({hubId:y.hubId,id:y.id,body:y.body,createdAt:y.createdAt,userId:y.userId,userName:s.displayName}).from(y).leftJoin(s,g(y.userId,s.id)).where(he(y.hubId,ne)).orderBy(at(y.createdAt)),Ne=await Qe(ne),Re=new Map,ae=new Map;for(let Q of ke){let se=Re.get(Q.hubId);se||(se=[],Re.set(Q.hubId,se)),se.push({id:Q.id,name:Q.name,color:Q.color})}for(let Q of we){let se=ae.get(Q.hubId);se||(se=[],ae.set(Q.hubId,se)),se.push({id:Q.id,content:Q.body,createdAt:ie(Q.createdAt,"YYYY-MM-DD HH:mm:ss")||"",userId:Q.userId,userName:Q.userName||""})}return W.map(Q=>{let se=Q.hub.id;return A(n,{...Q,attachments:Ne.get(se)??[],labels:Re.get(se)||[],postedCommentRows:ae.get(se)||[]},D)})},forceRefresh:d,snapshot:b,ttlMsOverride:R??je,epochKey:`${h}${T}`})},qe=async(n,a,o,{forceRefresh:d=!1,snapshot:b=!1,ttlMsOverride:R}={})=>{if(Ee(n.visible))return null;let D=Z(a,o,ze(n));return(await p.getOrFetch({cacheKey:D,fetcher:async()=>{let N=await Ce(),J=Be(z,"draft_label"),q=await I(e.select({hub:ve(i),internal:ve(B),isRead:H.isRead,isStarred:H.isStarred,creatorName:s.displayName,...Y()}).from(i)).leftJoin(B,g(i.id,B.hubId)).leftJoin(H,G(g(i.id,H.hubId),g(H.userId,o))).leftJoin(J,G(g(J.hubId,i.id),he(J.labelId,N))).leftJoin(s,g(i.userId,s.id)).where(G(g(i.id,a),ue(i.deletedAt),Oe(g(i.userId,o),ue(J.hubId)),E(n.visible)));if(q.length===0)return[];let W=q[0].hub.id,ne=await e.select({id:V.id,name:V.name,color:V.color}).from(z).innerJoin(V,g(z.labelId,V.id)).where(g(z.hubId,W)),ke=await e.select({id:y.id,body:y.body,createdAt:y.createdAt,userId:y.userId,userName:s.displayName}).from(y).leftJoin(s,g(y.userId,s.id)).where(g(y.hubId,W)).orderBy(at(y.createdAt)),we=await Qe([W]),Ne=ne.map(ae=>({id:ae.id,name:ae.name,color:ae.color})),Re=ke.map(ae=>({id:ae.id,content:ae.body,createdAt:ie(ae.createdAt,"YYYY-MM-DD HH:mm:ss")||"",userId:ae.userId,userName:ae.userName||""}));return[A(n,{...q[0],attachments:we.get(W)??[],labels:Ne,postedCommentRows:Re},o)]},forceRefresh:d,snapshot:b,ttlMsOverride:R??je,epochKey:`${x}${a}`}))[0]??null},ir=async(n,a,o,d={})=>{let b=await ce(o);return b?qe(n,a,b,d):null},lr=async(n,a)=>{let o=await Ce(),d=Be(z,"draft_label"),[b]=await e.select({sourceType:i.sourceType,deletedAt:i.deletedAt}).top(1).from(i).leftJoin(d,G(g(d.hubId,i.id),he(d.labelId,o))).where(G(g(i.id,n),Oe(g(i.userId,a),ue(d.hubId))));return b??null},it=async(n,a,o)=>{let d=await lr(a,o);if(!d||d.deletedAt||!ge(n.visible,d.sourceType))throw new Error("Not Found")},ur=async(n,a,o,d,b,R)=>{await it(n,o,a);let D=await e.select().top(1).from(H).where(G(g(H.hubId,o),g(H.userId,a))),T;if(D.length>0?D[0].isStarred!==b?T=(await e.update(H).set({isStarred:b,updatedAt:new Date,updatedBy:String(a)}).output().where(G(g(H.hubId,o),g(H.userId,a))))[0]:T=D[0]:T=(await e.insert(H).output().values({hubId:o,userId:a,isStarred:b,isRead:!1,createdAt:new Date,createdBy:String(a),updatedAt:new Date,updatedBy:String(a)}))[0],d){let N=oe(d);N&&(p.invalidatePrefix(v(N,a)),await f(`${h}${N}`))}return p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(L(o,a)),await f(`${x}${o}`),await k(et.parse({type:"status-update",reportHubId:o,recipientRawUserId:a,statusType:"star",value:b,clientTempId:R}),"setStarStatus"),T},dr=async(n,a,o,d,b,R)=>{await it(n,o,a);let D=await e.select().top(1).from(H).where(G(g(H.hubId,o),g(H.userId,a))),T;if(D.length>0?D[0].isRead!==b?T=(await e.update(H).set({isRead:b,updatedAt:new Date,updatedBy:String(a)}).output().where(G(g(H.hubId,o),g(H.userId,a))))[0]:T=D[0]:T=(await e.insert(H).output().values({hubId:o,userId:a,isRead:b,isStarred:!1,createdAt:new Date,createdBy:String(a),updatedAt:new Date,updatedBy:String(a)}))[0],d){let N=oe(d);N&&(p.invalidatePrefix(v(N,a)),await f(`${h}${N}`))}return p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(L(o,a)),await f(`${x}${o}`),await k(et.parse({type:"status-update",reportHubId:o,recipientRawUserId:a,statusType:"read",value:b,clientTempId:R}),"setReadStatus"),T},wt=async(n,a)=>{if(a===null)return;let o=await Ce(),[d]=await e.select({hubId:z.hubId}).top(1).from(z).where(G(g(z.hubId,n),he(z.labelId,o)));return d?a:void 0},cr=async(n,a,o,d,b,R)=>{let[D]=await e.select({sourceType:i.sourceType,deletedAt:i.deletedAt,userId:i.userId}).top(1).from(i).where(g(i.id,o));if(!D||D.deletedAt)throw new Error("Not Found");if(await it(n,o,a),!ge(n.commentable,D.sourceType))throw new Error("Comments are restricted by the viewer's comment permission");if(D.sourceType.toLowerCase()!=="internal")throw new Error("Comments are restricted for external daily report sources");let T=await wt(o,D.userId),[N]=await e.insert(y).output().values({hubId:o,userId:a,body:d,createdAt:new Date,createdBy:String(a),updatedAt:new Date,updatedBy:String(a)}),[J]=await e.select({displayName:s.displayName}).top(1).from(s).where(g(s.id,a)),q=J?.displayName??"";if(b){let ne=oe(b);ne&&(p.invalidatePrefix(`daily-report:date:${ne}:user:`),await f(`${h}${ne}`))}p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(`daily-report:detail:${o}:user:`),await f(`${x}${o}`);let W={id:N.id,userId:u(N.userId),userName:q,content:N.body,createdAt:ie(N.createdAt,"YYYY-MM-DD HH:mm:ss")??"",isMine:!0};return await k(ht.parse({type:"comment-add",reportHubId:o,comment:W,clientTempId:R,recipientRawUserId:T,sourceType:D.sourceType}),"addComment"),W},pr=async(n,a)=>await n.select().top(1).from(y).where(g(y.id,a)),mr=async(n,a,o,d,b,R)=>{let D=await pr(e,d);if(D.length===0)throw new Error("Not Found");if(D[0].hubId!==o)throw new Error("Not Found");let[T]=await e.select({userId:i.userId,sourceType:i.sourceType}).top(1).from(i).where(g(i.id,D[0].hubId));if(!(T&&ge(n.visible,T.sourceType)))throw new Error("Not Found");if(D[0].userId!==a)throw new Error("Unauthorized");let N=await wt(o,T.userId);if(await e.delete(y).where(g(y.id,d)),b){let J=oe(b);J&&(p.invalidatePrefix(`daily-report:date:${J}:user:`),await f(`${h}${J}`))}p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(`daily-report:detail:${o}:user:`),await f(`${x}${o}`),await k(ft.parse({type:"comment-delete",reportHubId:o,commentId:d,clientTempId:R,recipientRawUserId:N,sourceType:T?.sourceType}),"deleteComment")},yr=async(n,a,o)=>{X.info("createDailyReport called",{userId:n,businessDate:a});let[d]=await e.select({displayName:s.displayName}).from(s).where(g(s.id,n)),b=d?.displayName??u(n);try{let R=await Ke(async N=>{X.info("Starting transaction");let J=`internal-temp-${Date.now()}-${Math.random()}`,[q]=await N.insert(i).output().values({sourceType:"Internal",sourceId:J,businessDate:new Date(a),userId:n,title:"(\u7121\u984C)",createdAt:new Date,createdBy:String(n),updatedAt:new Date,updatedBy:String(n)});await N.update(i).set({sourceId:String(q.id)}).where(g(i.id,q.id)),X.info("Hub created",q),await N.insert(B).values({hubId:q.id,body:"",createdAt:new Date,createdBy:String(n),updatedAt:new Date,updatedBy:String(n)}),X.info("Internal created"),X.info("Calling getDraftLabelId");let W=await ot();X.info("draftLabelId",W);let ne=[];return W&&(await N.insert(z).values({hubId:q.id,labelId:W,createdAt:new Date,createdBy:String(n)}),ne.push({id:W,name:Ye,color:null})),X.info("Label assigned"),{reportHubId:q.id,date:a,createdAt:ie(q.createdAt,"YYYY-MM-DD HH:mm:ss"),author:b,userId:u(n),sourceType:"Internal",employeeName:b,updatedBy:u(n),updatedAt:ie(q.updatedAt,"YYYY-MM-DD HH:mm:ss"),category:null,creationCategory:null,visitTimeFrom:null,visitTimeTo:null,customerName:null,interviewers:[],subject:q.title,content:"",externalComments:[],isRead:!0,isStarred:!1,labels:ne,postedComments:[],attachments:[]}}),D=oe(a);D&&p.invalidatePrefix(v(D,n)),p.invalidatePrefix(Te),p.invalidatePrefix(U(n)),await f(Se),D&&await f(`${h}${D}`);let T=await qe(ye.unrestricted("post-write self read: the writer always sees the row they just wrote"),R.reportHubId,n,{forceRefresh:!0});if(T){let N=await Ge(),J=T.labels.some(q=>N.includes(q.id));await k(bt.parse({type:"report-create",reportHubId:T.reportHubId,report:T,clientTempId:o,recipientRawUserId:J?n:void 0}),"createDailyReport")}return T??R}catch(R){throw X.error("Error in createDailyReport",R),R}},We=async(n,a)=>await n.select().top(1).from(i).where(g(i.id,a)),lt=async(n,a,o)=>{await n.update(i).set(o).where(g(i.id,a))},It=async(n,a,o)=>{await n.update(B).set(o).where(g(B.hubId,a))},At=async(n,a,o)=>{await n.delete(z).where(G(g(z.hubId,a),g(z.labelId,o)))};return{streamKey:w,streamMaxLen:m,clearCache:async()=>{p.clearAll(),be.clear(),Me=null,P&&await f(Se),X.info("[DailyReportService] Server-side DB/SQL caches cleared successfully.")},invalidateHubReadCaches:async(n,a)=>{p.invalidatePrefix(Te),p.invalidatePrefix(Ae),await f(Se);for(let o of new Set(n))p.invalidatePrefix(`daily-report:detail:${o}:user:`),await f(`${x}${o}`);for(let o of new Set(a)){let d=oe(o);d&&await f(`${h}${d}`)}},getUserIdByExternalId:ce,getDailyReportIdsByExternalId:De,getDailyReportIdsFirstPageByExternalId:le,readSseStreamAnchor:j,getDailyReportsByBusinessDate:Je,getDailyReportsByBusinessDateByExternalId:or,getDailyReportDetailById:qe,getDailyReportDetailByIdByExternalId:ir,getDraftLabelId:ot,getAttachmentsByHubIds:Qe,getAttachmentForUser:nr,markAttachmentMissing:ar,markAttachmentPresent:sr,setStarStatus:ur,setReadStatus:dr,addComment:cr,deleteComment:mr,createDailyReport:yr,updateDailyReport:async(n,a,o,d)=>{let b=await We(e,n);if(!b.length||b[0].deletedAt)throw new Error("Not Found");if(b[0].userId!==a)throw new Error("Unauthorized");await Ke(async T=>{o.title!==void 0&&await lt(T,n,{title:o.title,updatedAt:new Date,updatedBy:String(a)}),o.content!==void 0&&await It(T,n,{body:o.content,updatedAt:new Date,updatedBy:String(a)})}),p.invalidate(`daily-report:detail:${n}`),p.invalidatePrefix(`daily-report:detail:${n}:user:`),p.invalidatePrefix(Te),await f(`${x}${n}`);let R=oe(ie(b[0].businessDate,"YYYY-MM-DD"));R&&(p.invalidatePrefix(`daily-report:date:${R}:user:`),await f(`${h}${R}`));let D=await qe(ye.unrestricted("post-write self read: the writer always sees the row they just wrote"),n,a,{forceRefresh:!0});if(D){let T=await Ge(),N=D.labels.some(J=>T.includes(J.id));await k(gt.parse({type:"report-update",reportHubId:D.reportHubId,report:D,clientTempId:d,recipientRawUserId:N?a:void 0}),"updateDailyReport")}},publishDailyReport:async(n,a,o)=>{let d=await We(e,n);if(!d.length)throw new Error("Not Found");if(d[0].userId!==a)throw new Error("Unauthorized");let b=await ot();if(!b)return null;if(await At(e,n,b),p.invalidatePrefix(`daily-report:detail:${n}:user:`),p.invalidatePrefix(Te),p.invalidatePrefix(Ae),await f(Se),d[0].businessDate){let T=oe(ie(d[0].businessDate,"YYYY-MM-DD"));T&&await f(`${h}${T}`)}let R=oe(ie(d[0].businessDate,"YYYY-MM-DD"));R&&p.invalidatePrefix(v(R,a));let D=await qe(ye.unrestricted("post-write self read: the writer always sees the row they just wrote"),n,a,{forceRefresh:!0});return D&&await k(Rt.parse({type:"report-publish",reportHubId:D.reportHubId,report:D,clientTempId:o}),"publishDailyReport"),D??null},deleteDailyReport:async(n,a,o)=>{let d=await We(e,n);if(!d.length||d[0].deletedAt)throw new Error("Not Found");if(d[0].userId!==a)throw new Error("Unauthorized");if(await lt(e,n,{deletedAt:new Date,deletedBy:String(a),updatedAt:new Date,updatedBy:String(a)}),p.invalidatePrefix(`daily-report:detail:${n}:user:`),p.invalidatePrefix(Te),p.invalidatePrefix(Ae),await f(Se),d[0].businessDate){let b=oe(ie(d[0].businessDate,"YYYY-MM-DD"));b&&await f(`${h}${b}`)}await k(St.parse({type:"report-delete",reportHubId:n,clientTempId:o,sourceType:d[0].sourceType}),"deleteDailyReport")},findDailyReportHubById:We,updateDailyReportHub:lt,updateDailyReportInternal:It,deleteDailyReportLabel:At}}import{and as mn,eq as Zt}from"drizzle-orm";function yn(t){let e=[],r=t&&t.length>0?t:[{key:"internal",name:"Internal",description:"Internal daily reports"},{key:"external",name:"External",description:"External daily reports"}];for(let s of r){let u=`daily_report_${s.key.toLowerCase().replace(/[^a-z0-9_]/g,"_")}`;e.push({resourceKey:u,name:s.name,description:s.description??`${s.name} daily report access`}),s.includeCommentResource!==!1&&e.push({resourceKey:`${u}_comment`,name:`${s.name} Comment`,description:`${s.name} daily report comment access`})}return e}async function ua(t,e,r){let s=t,l=e.TMResource,u=r.appKey,S=r.actor??"system:daily-report",p=new Date,P=r.resources??yn(r.sources);for(let i of P){let B=await s.select().from(l).where(mn(Zt(l.appKey,u),Zt(l.resourceKey,i.resourceKey)));(!B||B.length===0)&&await s.insert(l).values({appKey:u,resourceKey:i.resourceKey,name:i.name,description:i.description??null,createdAt:p,createdBy:S,updatedAt:p,updatedBy:S})}}var hn=de(1,"[DailyReportExternalSource]"),pa=(t,e,r,s=hn)=>{if(!t)return[];try{let l=JSON.parse(t);return Array.isArray(l)?l.map(r).filter(u=>u!==null):(s.warn(`Unexpected ${e} format: not an array`),[])}catch(l){return s.warn(`Failed to parse ${e}:`,l),[]}};import{desc as er,sql as fn}from"drizzle-orm";import{bigint as ee,bit as tr,date as bn,datetime2 as re,foreignKey as fe,index as Ie,int as gn,mssqlSchema as Rn,nvarchar as F,primaryKey as xe,uniqueIndex as Sn}from"drizzle-orm/mssql-core";function fa(t,e){let r=Rn(t),s=e.userTable,l=r.table("DailyReportHub",{id:ee("id",{mode:"number"}).identity().notNull(),sourceType:F("source_type",{length:20}).notNull(),sourceId:F("source_id",{length:100}).notNull(),sourceIdNum:ee("source_id_num",{mode:"number"}).generatedAlwaysAs(fn`TRY_CAST(source_id AS BIGINT)`),businessDate:bn("business_date"),userId:ee("user_id",{mode:"number"}),title:F("title",{length:200}),summary:F("summary",{length:"max"}),createdAt:re("created_at").notNull(),createdBy:F("created_by",{length:50}).notNull(),updatedAt:re("updated_at").notNull(),updatedBy:F("updated_by",{length:50}).notNull(),deletedAt:re("deleted_at"),deletedBy:F("deleted_by",{length:50})},y=>[xe({name:`${t}_DailyReportHub_pk`,columns:[y.id]}),fe({name:`${t}_DailyReportHub_user_id_fk`,columns:[y.userId],foreignColumns:[s.id]}),Ie(`${t}_DailyReportHub_business_date_index`).on(y.businessDate),Ie(`${t}_DailyReportHub_updated_at_index`).on(y.updatedAt),Ie(`${t}_DailyReportHub_source_index`).on(y.sourceType,y.sourceId),Ie(`${t}_DailyReportHub_user_id_index`).on(y.userId),Ie(`${t}_DailyReportHub_business_date_id_index`).on(er(y.businessDate),er(y.id)),Ie(`${t}_DailyReportHub_deleted_at_index`).on(y.deletedAt)]),u=r.table("DailyReportInternal",{hubId:ee("hub_id",{mode:"number"}).notNull(),body:F("body",{length:"max"}),metadata:F("metadata",{length:"max"}),createdAt:re("created_at").notNull(),createdBy:F("created_by",{length:50}).notNull(),updatedAt:re("updated_at").notNull(),updatedBy:F("updated_by",{length:50}).notNull()},y=>[xe({name:`${t}_DailyReportInternal_pk`,columns:[y.hubId]}),fe({name:`${t}_DailyReportInternal_hub_id_fk`,columns:[y.hubId],foreignColumns:[l.id]})]),S=r.table("DailyReportComment",{id:ee("id",{mode:"number"}).identity().notNull(),hubId:ee("hub_id",{mode:"number"}).notNull(),userId:ee("user_id",{mode:"number"}).notNull(),body:F("body",{length:"max"}).notNull(),createdAt:re("created_at").notNull(),createdBy:F("created_by",{length:50}).notNull(),updatedAt:re("updated_at").notNull(),updatedBy:F("updated_by",{length:50}).notNull()},y=>[xe({name:`${t}_DailyReportComment_pk`,columns:[y.id]}),fe({name:`${t}_DailyReportComment_hub_id_fk`,columns:[y.hubId],foreignColumns:[l.id]}),fe({name:`${t}_DailyReportComment_user_id_fk`,columns:[y.userId],foreignColumns:[s.id]}),Ie(`${t}_DailyReportComment_hub_id_index`).on(y.hubId)]),p=r.table("DailyReportLabel",{id:ee("id",{mode:"number"}).identity().notNull(),userId:ee("user_id",{mode:"number"}),name:F("name",{length:50}).notNull(),color:F("color",{length:20}),sortOrder:gn("sort_order"),createdAt:re("created_at").notNull(),createdBy:F("created_by",{length:50}).notNull(),updatedAt:re("updated_at").notNull(),updatedBy:F("updated_by",{length:50}).notNull()},y=>[xe({name:`${t}_DailyReportLabel_pk`,columns:[y.id]}),fe({name:`${t}_DailyReportLabel_user_id_fk`,columns:[y.userId],foreignColumns:[s.id]})]),P=r.table("DailyReportHub_Label",{hubId:ee("hub_id",{mode:"number"}).notNull(),labelId:ee("label_id",{mode:"number"}).notNull(),createdAt:re("created_at").notNull(),createdBy:F("created_by",{length:50}).notNull()},y=>[xe({name:`${t}_DailyReportHub_Label_pk`,columns:[y.hubId,y.labelId]}),fe({name:`${t}_DailyReportHub_Label_hub_id_fk`,columns:[y.hubId],foreignColumns:[l.id]}),fe({name:`${t}_DailyReportHub_Label_label_id_fk`,columns:[y.labelId],foreignColumns:[p.id]})]),i=r.table("DailyReportUserStatus",{hubId:ee("hub_id",{mode:"number"}).notNull(),userId:ee("user_id",{mode:"number"}).notNull(),isRead:tr("is_read").default(!1).notNull(),isStarred:tr("is_starred").default(!1).notNull(),createdAt:re("created_at").notNull(),createdBy:F("created_by",{length:50}).notNull(),updatedAt:re("updated_at").notNull(),updatedBy:F("updated_by",{length:50}).notNull()},y=>[xe({name:`${t}_DailyReportUserStatus_pk`,columns:[y.hubId,y.userId]}),fe({name:`${t}_DailyReportUserStatus_hub_id_fk`,columns:[y.hubId],foreignColumns:[l.id]}),fe({name:`${t}_DailyReportUserStatus_user_id_fk`,columns:[y.userId],foreignColumns:[s.id]})]),B=r.table("DailyReportAttachment",{id:ee("id",{mode:"number"}).identity().notNull(),hubId:ee("hub_id",{mode:"number"}).notNull(),uploadedBy:ee("uploaded_by",{mode:"number"}),sourceKey:F("source_key",{length:200}).notNull(),fileName:F("file_name",{length:255}).notNull(),filePath:F("file_path",{length:"max"}).notNull(),fileType:F("file_type",{length:100}),fileSize:ee("file_size",{mode:"number"}),objectCheckedAt:re("object_checked_at"),objectMissingAt:re("object_missing_at"),createdAt:re("created_at").notNull(),createdBy:F("created_by",{length:50}).notNull(),updatedAt:re("updated_at").notNull(),updatedBy:F("updated_by",{length:50}).notNull()},y=>[xe({name:`${t}_DailyReportAttachment_pk`,columns:[y.id]}),fe({name:`${t}_DailyReportAttachment_hub_id_fk`,columns:[y.hubId],foreignColumns:[l.id]}),fe({name:`${t}_DailyReportAttachment_uploaded_by_fk`,columns:[y.uploadedBy],foreignColumns:[s.id]}),Sn(`${t}_DailyReportAttachment_source_unique`).on(y.hubId,y.sourceKey),Ie(`${t}_DailyReportAttachment_hub_id_index`).on(y.hubId,y.createdAt)]);return{hub:l,internal:u,comment:S,attachment:B,label:p,hubLabel:P,userStatus:i}}function wa(t){t.redis||(t.logger??console).warn("[DailyReport] redis provider is not injected: cross-worker cache invalidation is disabled (staleness is bounded only by TTL) and SSE publishing is skipped.");let e=Ct(t.redis),r=new Xe({defaultTtlMs:t.cacheDefaultTtlMs??6e4},e),s=Xt({...t,cache:r,epochs:e}),l=new rt({redis:t.redis,streamKey:s.streamKey,cache:r,logger:t.logger}),u=Qt({authenticate:t.authenticate,resolveVisibleSourceTypes:t.resolveVisibleSourceTypes,service:s,encodeUserId:t.encodeUserId,attachmentIdCodec:t.attachmentIdCodec,readAttachment:t.readAttachment,attachmentMaxBytes:t.attachmentMaxBytes,attachmentRateLimitPerMinute:t.attachmentRateLimitPerMinute,attachmentConcurrency:t.attachmentConcurrency,redis:t.redis,sseReader:l,streamKey:s.streamKey,loginRedirectPath:t.loginRedirectPath,enableDevCacheClear:t.enableDevCacheClear,logger:t.logger});return{service:s,cache:r,epochs:e,sseReader:l,streamKey:s.streamKey,knownSourceTypes:[...new Set(["Internal",...(t.externalSources??[]).map(S=>S.sourceType)])],...u}}export{Ft as DAILY_REPORT_SSE_CATCH_UP_BATCH,Yr as DAILY_REPORT_SSE_VISIBILITY_REFRESH_MS,rt as DailyReportSseReader,ye as DailyReportViewerScope,Xe as SqlResultCache,tn as asciiFallbackFileName,Ht as buildVisibleSourceTypeCondition,Ot as computeSourceTypeDigest,ze as computeViewerScopeDigest,Qt as createDailyReportHandlers,wa as createDailyReportServer,Xt as createDailyReportService,Ct as createEpochStore,yn as defineDailyReportAuthzResources,fa as defineDailyReportSchema,Ee as deniesEverySourceType,en as encodeRfc8187,ie as formatDateValue,Dt as generateETag,ge as isSourceTypeVisible,Pe as isStreamIdLte,me as jsonResponseWithETag,Ut as normalizeVisibleSourceTypes,Jt as sanitizeMediaType,ua as seedDailyReportAuthzResources,pa as transformJsonArray};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */
|
|
2
2
|
/*! @aiquants/daily-report standalone CSS — 非 Tailwind ホスト専用。ホストの Tailwind ビルドと混在させないこと */
|
|
3
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-duration:initial;--tw-ease:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-600:oklch(68.1% .162 75.834);--color-green-400:oklch(79.2% .209 151.711);--color-green-600:oklch(62.7% .194 149.214);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-900:oklch(37.8% .077 168.94);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-900:oklch(41% .159 10.272);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-700:oklch(37.3% .034 259.733);--color-white:#fff;--spacing:.25rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--leading-relaxed:1.625;--radius-sm:calc(var(--radius,.5rem) - 4px);--radius-md:calc(var(--radius,.5rem) - 2px);--radius-lg:var(--radius,.5rem);--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--color-input:hsl(var(--input));--color-ring:hsl(var(--ring));--color-background:hsl(var(--background));--color-foreground:hsl(var(--foreground));--color-primary:hsl(var(--primary));--color-primary-foreground:hsl(var(--primary-foreground));--color-secondary:hsl(var(--secondary));--color-secondary-foreground:hsl(var(--secondary-foreground));--color-destructive:hsl(var(--destructive));--color-destructive-foreground:hsl(var(--destructive-foreground));--color-muted:hsl(var(--muted));--color-muted-foreground:hsl(var(--muted-foreground));--color-accent:hsl(var(--accent));--color-accent-foreground:hsl(var(--accent-foreground))}}@layer base,components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-0{left:calc(var(--spacing) * 0)}.isolate{isolation:isolate}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[100\]{z-index:100}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.-mx-0\.5{margin-inline:calc(var(--spacing) * -.5)}.mx-auto{margin-inline:auto}.mt-0{margin-top:calc(var(--spacing) * 0)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-auto{margin-top:auto}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-5\.5{height:calc(var(--spacing) * 5.5)}.h-6{height:calc(var(--spacing) * 6)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-16{height:calc(var(--spacing) * 16)}.h-24{height:calc(var(--spacing) * 24)}.h-auto{height:auto}.h-full{height:100%}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-15{min-height:calc(var(--spacing) * 15)}.min-h-22{min-height:calc(var(--spacing) * 22)}.min-h-50{min-height:calc(var(--spacing) * 50)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/2{width:50%}.w-1\/3{width:33.3333%}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing) * 4)}.w-4\/5{width:80%}.w-5{width:calc(var(--spacing) * 5)}.w-5\/6{width:83.3333%}.w-6{width:calc(var(--spacing) * 6)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-11\/12{width:91.6667%}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-56{width:calc(var(--spacing) * 56)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[92vw\]{max-width:92vw}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.origin-center{transform-origin:50%}.scale-50{--tw-scale-x:50%;--tw-scale-y:50%;--tw-scale-z:50%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-pointer{cursor:pointer}.touch-pan-x{--tw-pan-x:pan-x;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.touch-pan-y{--tw-pan-y:pan-y;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.touch-manipulation{touch-action:manipulation}.touch-none{touch-action:none}.resize{resize:both}.scrollbar-none{scrollbar-width:none}.scrollbar-thin{scrollbar-width:thin}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-300\/70{border-color:#ffd236b3}@supports (color:color-mix(in lab, red, red)){.border-amber-300\/70{border-color:color-mix(in oklab, var(--color-amber-300) 70%, transparent)}}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-300{border-color:var(--color-blue-300)}.border-input{border-color:var(--color-input)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-200\/80{border-color:#e2e8f0cc}@supports (color:color-mix(in lab, red, red)){.border-slate-200\/80{border-color:color-mix(in oklab, var(--color-slate-200) 80%, transparent)}}.border-slate-300{border-color:var(--color-slate-300)}.border-transparent{border-color:#0000}.border-l-blue-500{border-left-color:var(--color-blue-500)}.bg-amber-50\/60{background-color:#fffbeb99}@supports (color:color-mix(in lab, red, red)){.bg-amber-50\/60{background-color:color-mix(in oklab, var(--color-amber-50) 60%, transparent)}}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-600{background-color:var(--color-amber-600)}.bg-background{background-color:var(--color-background)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-destructive{background-color:var(--color-destructive)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-muted{background-color:var(--color-muted)}.bg-primary{background-color:var(--color-primary)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-600{background-color:var(--color-red-600)}.bg-rose-100{background-color:var(--color-rose-100)}.bg-rose-200{background-color:var(--color-rose-200)}.bg-secondary{background-color:var(--color-secondary)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-100\/60{background-color:#f1f5f999}@supports (color:color-mix(in lab, red, red)){.bg-slate-100\/60{background-color:color-mix(in oklab, var(--color-slate-100) 60%, transparent)}}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-900\/50{background-color:#0f172b80}@supports (color:color-mix(in lab, red, red)){.bg-slate-900\/50{background-color:color-mix(in oklab, var(--color-slate-900) 50%, transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.fill-yellow-400{fill:var(--color-yellow-400)}.p-0{padding:calc(var(--spacing) * 0)}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-20{padding-right:calc(var(--spacing) * 20)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-0\.5{padding-left:calc(var(--spacing) * .5)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-1{--tw-leading:calc(var(--spacing) * 1);line-height:calc(var(--spacing) * 1)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-nowrap{text-wrap:nowrap}.wrap-break-word{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-500{color:var(--color-amber-500)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-emerald-800{color:var(--color-emerald-800)}.text-gray-700{color:var(--color-gray-700)}.text-green-600{color:var(--color-green-600)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-orange-500{color:var(--color-orange-500)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-900{color:var(--color-rose-900)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-white{color:var(--color-white)}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.text-white\/90{color:color-mix(in oklab, var(--color-white) 90%, transparent)}}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-600{color:var(--color-yellow-600)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-slate-400\/30{--tw-shadow-color:#90a1b94d}@supports (color:color-mix(in lab, red, red)){.shadow-slate-400\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-400) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-blue-200{--tw-ring-color:var(--color-blue-200)}.ring-offset-background{--tw-ring-offset-color:var(--color-background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,border-color\,box-shadow\]{transition-property:transform,border-color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[visibility\]{transition-property:visibility;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.duration-200{animation-duration:.2s}.duration-500{animation-duration:.5s}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}.fade-in{--tw-enter-opacity:0}.running{animation-play-state:running}.slide-in-from-bottom-2{--tw-enter-translate-y:.5rem}.zoom-in-95{--tw-enter-scale:.95}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--color-primary)}.selection\:bg-primary::selection{background-color:var(--color-primary)}.selection\:text-primary-foreground ::selection{color:var(--color-primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--color-primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--color-foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}@media (hover:hover){.hover\:z-10:hover{z-index:10}.hover\:-translate-y-0\.5:hover{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:border-blue-300:hover{border-color:var(--color-blue-300)}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-amber-200\/60:hover{background-color:#fee68599}@supports (color:color-mix(in lab, red, red)){.hover\:bg-amber-200\/60:hover{background-color:color-mix(in oklab, var(--color-amber-200) 60%, transparent)}}.hover\:bg-amber-700:hover{background-color:var(--color-amber-700)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-destructive\/90:hover{background-color:color-mix(in srgb, hsl(var(--destructive)) 90%, transparent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--color-destructive) 90%, transparent)}}.hover\:bg-primary\/90:hover{background-color:color-mix(in srgb, hsl(var(--primary)) 90%, transparent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--color-primary) 90%, transparent)}}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-rose-300:hover{background-color:var(--color-rose-300)}.hover\:bg-secondary\/80:hover{background-color:color-mix(in srgb, hsl(var(--secondary)) 80%, transparent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--color-secondary) 80%, transparent)}}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.hover\:bg-slate-200\/60:hover{background-color:#e2e8f099}@supports (color:color-mix(in lab, red, red)){.hover\:bg-slate-200\/60:hover{background-color:color-mix(in oklab, var(--color-slate-200) 60%, transparent)}}.hover\:text-accent-foreground:hover{color:var(--color-accent-foreground)}.hover\:text-amber-950:hover{color:var(--color-amber-950)}.hover\:text-blue-500:hover{color:var(--color-blue-500)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-slate-700:hover{color:var(--color-slate-700)}.hover\:text-slate-900:hover{color:var(--color-slate-900)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-yellow-400:hover{color:var(--color-yellow-400)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:bg-white:focus{background-color:var(--color-white)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:border-ring:focus-visible{border-color:var(--color-ring)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-blue-500:focus-visible{--tw-ring-color:var(--color-blue-500)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--color-ring)}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in srgb, hsl(var(--ring)) 50%, transparent)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-ring) 50%, transparent)}}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:var(--color-background)}.focus-visible\:outline-hidden:focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus-visible\:outline-hidden:focus-visible{outline-offset:2px;outline:2px solid #0000}}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:scale-125:active{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}:where([data-scrolling]) .in-\[\[data-scrolling\]\]\:transform-none{transform:none}:where([data-scrolling]) .in-\[\[data-scrolling\]\]\:border-slate-200{border-color:var(--color-slate-200)}:where([data-scrolling]) .in-\[\[data-scrolling\]\]\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:where([data-scrolling]) .in-\[\[data-scrolling\]\]\:transition-none{transition-property:none}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--color-destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in srgb, hsl(var(--destructive)) 20%, transparent)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--color-background)}.data-\[state\=active\]\:bg-white[data-state=active]{background-color:var(--color-white)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--color-foreground)}.data-\[state\=active\]\:text-slate-900[data-state=active]{color:var(--color-slate-900)}.data-\[state\=active\]\:shadow-2xs[data-state=active]{--tw-shadow:0 1px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.data-\[state\=active\]\:shadow-xs[data-state=active]{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--color-primary)}.data-\[state\=inactive\]\:hidden[data-state=inactive]{display:none}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--color-input)}@media (min-width:640px){.sm\:flex{display:flex}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:768px){.md\:grid-cols-\[minmax\(0\,1fr\)_220px\]{grid-template-columns:minmax(0,1fr) 220px}.md\:grid-cols-\[minmax\(0\,1fr\)_240px\]{grid-template-columns:minmax(0,1fr) 240px}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.dark\:border-amber-700\/50:where(.dark,.dark *){border-color:#b7500080}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-700\/50:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-amber-700) 50%, transparent)}}.dark\:border-blue-500\/70:where(.dark,.dark *){border-color:#3080ffb3}@supports (color:color-mix(in lab, red, red)){.dark\:border-blue-500\/70:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-blue-500) 70%, transparent)}}.dark\:border-blue-800\/70:where(.dark,.dark *){border-color:#193cb8b3}@supports (color:color-mix(in lab, red, red)){.dark\:border-blue-800\/70:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-blue-800) 70%, transparent)}}.dark\:border-red-500\/60:where(.dark,.dark *){border-color:#fb2c3699}@supports (color:color-mix(in lab, red, red)){.dark\:border-red-500\/60:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-red-500) 60%, transparent)}}.dark\:border-red-900:where(.dark,.dark *){border-color:var(--color-red-900)}.dark\:border-red-900\/50:where(.dark,.dark *){border-color:#82181a80}@supports (color:color-mix(in lab, red, red)){.dark\:border-red-900\/50:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-red-900) 50%, transparent)}}.dark\:border-slate-600:where(.dark,.dark *){border-color:var(--color-slate-600)}.dark\:border-slate-700:where(.dark,.dark *){border-color:var(--color-slate-700)}.dark\:border-slate-800:where(.dark,.dark *){border-color:var(--color-slate-800)}.dark\:bg-amber-600:where(.dark,.dark *){background-color:var(--color-amber-600)}.dark\:bg-amber-900\/40:where(.dark,.dark *){background-color:#7b330666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-900\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-amber-900) 40%, transparent)}}.dark\:bg-amber-950\/40:where(.dark,.dark *){background-color:#46190166}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-amber-950) 40%, transparent)}}.dark\:bg-blue-400:where(.dark,.dark *){background-color:var(--color-blue-400)}.dark\:bg-blue-900\/40:where(.dark,.dark *){background-color:#1c398e66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-900\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-blue-900) 40%, transparent)}}.dark\:bg-blue-950\/40:where(.dark,.dark *){background-color:#16245666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-950\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-blue-950) 40%, transparent)}}.dark\:bg-emerald-900\/30:where(.dark,.dark *){background-color:#004e3b4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-900\/30:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-emerald-900) 30%, transparent)}}.dark\:bg-input\/30:where(.dark,.dark *){background-color:color-mix(in srgb, hsl(var(--input)) 30%, transparent)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-input) 30%, transparent)}}.dark\:bg-red-700:where(.dark,.dark *){background-color:var(--color-red-700)}.dark\:bg-red-950\/40:where(.dark,.dark *){background-color:#46080966}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-950\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-red-950) 40%, transparent)}}.dark\:bg-rose-800:where(.dark,.dark *){background-color:var(--color-rose-800)}.dark\:bg-rose-900\/40:where(.dark,.dark *){background-color:#8b083666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-rose-900\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-rose-900) 40%, transparent)}}.dark\:bg-slate-700:where(.dark,.dark *){background-color:var(--color-slate-700)}.dark\:bg-slate-800:where(.dark,.dark *){background-color:var(--color-slate-800)}.dark\:bg-slate-800\/40:where(.dark,.dark *){background-color:#1d293d66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-800\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-800) 40%, transparent)}}.dark\:bg-slate-800\/60:where(.dark,.dark *){background-color:#1d293d99}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-800\/60:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-800) 60%, transparent)}}.dark\:bg-slate-900\/40:where(.dark,.dark *){background-color:#0f172b66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-900) 40%, transparent)}}.dark\:bg-slate-900\/60:where(.dark,.dark *){background-color:#0f172b99}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/60:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-900) 60%, transparent)}}.dark\:bg-slate-900\/70:where(.dark,.dark *){background-color:#0f172bb3}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/70:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-900) 70%, transparent)}}.dark\:bg-slate-900\/90:where(.dark,.dark *){background-color:#0f172be6}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/90:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-900) 90%, transparent)}}.dark\:bg-slate-900\/95:where(.dark,.dark *){background-color:#0f172bf2}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/95:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-900) 95%, transparent)}}.dark\:bg-slate-950:where(.dark,.dark *){background-color:var(--color-slate-950)}.dark\:text-amber-200:where(.dark,.dark *){color:var(--color-amber-200)}.dark\:text-amber-300:where(.dark,.dark *){color:var(--color-amber-300)}.dark\:text-blue-300:where(.dark,.dark *){color:var(--color-blue-300)}.dark\:text-blue-400:where(.dark,.dark *){color:var(--color-blue-400)}.dark\:text-emerald-400:where(.dark,.dark *){color:var(--color-emerald-400)}.dark\:text-gray-300:where(.dark,.dark *){color:var(--color-gray-300)}.dark\:text-green-400:where(.dark,.dark *){color:var(--color-green-400)}.dark\:text-orange-400:where(.dark,.dark *){color:var(--color-orange-400)}.dark\:text-red-300:where(.dark,.dark *){color:var(--color-red-300)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}.dark\:text-rose-100:where(.dark,.dark *){color:var(--color-rose-100)}.dark\:text-rose-300:where(.dark,.dark *){color:var(--color-rose-300)}.dark\:text-slate-100:where(.dark,.dark *){color:var(--color-slate-100)}.dark\:text-slate-200:where(.dark,.dark *){color:var(--color-slate-200)}.dark\:text-slate-300:where(.dark,.dark *){color:var(--color-slate-300)}.dark\:text-slate-400:where(.dark,.dark *){color:var(--color-slate-400)}.dark\:text-slate-500:where(.dark,.dark *){color:var(--color-slate-500)}.dark\:text-yellow-400:where(.dark,.dark *){color:var(--color-yellow-400)}.dark\:ring-blue-500\/40:where(.dark,.dark *){--tw-ring-color:#3080ff66}@supports (color:color-mix(in lab, red, red)){.dark\:ring-blue-500\/40:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab, var(--color-blue-500) 40%, transparent)}}@media (hover:hover){.dark\:hover\:bg-amber-700:where(.dark,.dark *):hover{background-color:var(--color-amber-700)}.dark\:hover\:bg-amber-800\/60:where(.dark,.dark *):hover{background-color:#953d0099}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-amber-800\/60:where(.dark,.dark *):hover{background-color:color-mix(in oklab, var(--color-amber-800) 60%, transparent)}}.dark\:hover\:bg-red-800:where(.dark,.dark *):hover{background-color:var(--color-red-800)}.dark\:hover\:bg-rose-700:where(.dark,.dark *):hover{background-color:var(--color-rose-700)}.dark\:hover\:bg-slate-700:where(.dark,.dark *):hover{background-color:var(--color-slate-700)}.dark\:hover\:bg-slate-700\/60:where(.dark,.dark *):hover{background-color:#31415899}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-slate-700\/60:where(.dark,.dark *):hover{background-color:color-mix(in oklab, var(--color-slate-700) 60%, transparent)}}.dark\:hover\:bg-slate-800:where(.dark,.dark *):hover{background-color:var(--color-slate-800)}.dark\:hover\:text-amber-100:where(.dark,.dark *):hover{color:var(--color-amber-100)}.dark\:hover\:text-slate-100:where(.dark,.dark *):hover{color:var(--color-slate-100)}.dark\:hover\:text-slate-200:where(.dark,.dark *):hover{color:var(--color-slate-200)}}.dark\:aria-invalid\:ring-destructive\/40:where(.dark,.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in srgb, hsl(var(--destructive)) 40%, transparent)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:where(.dark,.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.dark\:data-\[state\=active\]\:bg-slate-800:where(.dark,.dark *)[data-state=active]{background-color:var(--color-slate-800)}.dark\:data-\[state\=active\]\:bg-slate-900\/70:where(.dark,.dark *)[data-state=active]{background-color:#0f172bb3}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[state\=active\]\:bg-slate-900\/70:where(.dark,.dark *)[data-state=active]{background-color:color-mix(in oklab, var(--color-slate-900) 70%, transparent)}}.dark\:data-\[state\=active\]\:text-slate-100:where(.dark,.dark *)[data-state=active]{color:var(--color-slate-100)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0), var(--tw-enter-translate-y,0), 0) scale3d(var(--tw-enter-scale,1), var(--tw-enter-scale,1), var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0), var(--tw-exit-translate-y,0), 0) scale3d(var(--tw-exit-scale,1), var(--tw-exit-scale,1), var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|
|
3
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-600:oklch(68.1% .162 75.834);--color-green-400:oklch(79.2% .209 151.711);--color-green-600:oklch(62.7% .194 149.214);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-900:oklch(37.8% .077 168.94);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-900:oklch(41% .159 10.272);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-700:oklch(37.3% .034 259.733);--color-white:#fff;--spacing:.25rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--leading-relaxed:1.625;--radius-sm:calc(var(--radius,.5rem) - 4px);--radius-md:calc(var(--radius,.5rem) - 2px);--radius-lg:var(--radius,.5rem);--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--color-input:hsl(var(--input));--color-ring:hsl(var(--ring));--color-background:hsl(var(--background));--color-foreground:hsl(var(--foreground));--color-primary:hsl(var(--primary));--color-primary-foreground:hsl(var(--primary-foreground));--color-secondary:hsl(var(--secondary));--color-secondary-foreground:hsl(var(--secondary-foreground));--color-destructive:hsl(var(--destructive));--color-destructive-foreground:hsl(var(--destructive-foreground));--color-muted:hsl(var(--muted));--color-muted-foreground:hsl(var(--muted-foreground));--color-accent:hsl(var(--accent));--color-accent-foreground:hsl(var(--accent-foreground))}}@layer base,components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-0{left:calc(var(--spacing) * 0)}.isolate{isolation:isolate}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[100\]{z-index:100}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.-mx-0\.5{margin-inline:calc(var(--spacing) * -.5)}.mx-auto{margin-inline:auto}.mt-0{margin-top:calc(var(--spacing) * 0)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-auto{margin-top:auto}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-5\.5{height:calc(var(--spacing) * 5.5)}.h-6{height:calc(var(--spacing) * 6)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-16{height:calc(var(--spacing) * 16)}.h-24{height:calc(var(--spacing) * 24)}.h-auto{height:auto}.h-full{height:100%}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-15{min-height:calc(var(--spacing) * 15)}.min-h-22{min-height:calc(var(--spacing) * 22)}.min-h-50{min-height:calc(var(--spacing) * 50)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/2{width:50%}.w-1\/3{width:33.3333%}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing) * 4)}.w-4\/5{width:80%}.w-5{width:calc(var(--spacing) * 5)}.w-5\/6{width:83.3333%}.w-6{width:calc(var(--spacing) * 6)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-11\/12{width:91.6667%}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-56{width:calc(var(--spacing) * 56)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[92vw\]{max-width:92vw}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.origin-center{transform-origin:50%}.scale-50{--tw-scale-x:50%;--tw-scale-y:50%;--tw-scale-z:50%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-pointer{cursor:pointer}.touch-pan-x{--tw-pan-x:pan-x;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.touch-pan-y{--tw-pan-y:pan-y;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.touch-manipulation{touch-action:manipulation}.touch-none{touch-action:none}.resize{resize:both}.scrollbar-none{scrollbar-width:none}.scrollbar-thin{scrollbar-width:thin}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-300\/70{border-color:#ffd236b3}@supports (color:color-mix(in lab, red, red)){.border-amber-300\/70{border-color:color-mix(in oklab, var(--color-amber-300) 70%, transparent)}}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-300{border-color:var(--color-blue-300)}.border-input{border-color:var(--color-input)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-200\/80{border-color:#e2e8f0cc}@supports (color:color-mix(in lab, red, red)){.border-slate-200\/80{border-color:color-mix(in oklab, var(--color-slate-200) 80%, transparent)}}.border-slate-300{border-color:var(--color-slate-300)}.border-transparent{border-color:#0000}.border-l-blue-500{border-left-color:var(--color-blue-500)}.bg-amber-50\/60{background-color:#fffbeb99}@supports (color:color-mix(in lab, red, red)){.bg-amber-50\/60{background-color:color-mix(in oklab, var(--color-amber-50) 60%, transparent)}}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-600{background-color:var(--color-amber-600)}.bg-background{background-color:var(--color-background)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-destructive{background-color:var(--color-destructive)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-muted{background-color:var(--color-muted)}.bg-primary{background-color:var(--color-primary)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-600{background-color:var(--color-red-600)}.bg-rose-100{background-color:var(--color-rose-100)}.bg-rose-200{background-color:var(--color-rose-200)}.bg-secondary{background-color:var(--color-secondary)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-100\/60{background-color:#f1f5f999}@supports (color:color-mix(in lab, red, red)){.bg-slate-100\/60{background-color:color-mix(in oklab, var(--color-slate-100) 60%, transparent)}}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-900\/50{background-color:#0f172b80}@supports (color:color-mix(in lab, red, red)){.bg-slate-900\/50{background-color:color-mix(in oklab, var(--color-slate-900) 50%, transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.fill-yellow-400{fill:var(--color-yellow-400)}.p-0{padding:calc(var(--spacing) * 0)}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-20{padding-right:calc(var(--spacing) * 20)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-0\.5{padding-left:calc(var(--spacing) * .5)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-1{--tw-leading:calc(var(--spacing) * 1);line-height:calc(var(--spacing) * 1)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-nowrap{text-wrap:nowrap}.wrap-break-word{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-500{color:var(--color-amber-500)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-emerald-800{color:var(--color-emerald-800)}.text-gray-700{color:var(--color-gray-700)}.text-green-600{color:var(--color-green-600)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-orange-500{color:var(--color-orange-500)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-900{color:var(--color-rose-900)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-white{color:var(--color-white)}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.text-white\/90{color:color-mix(in oklab, var(--color-white) 90%, transparent)}}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-600{color:var(--color-yellow-600)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-slate-400\/30{--tw-shadow-color:#90a1b94d}@supports (color:color-mix(in lab, red, red)){.shadow-slate-400\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-400) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-blue-200{--tw-ring-color:var(--color-blue-200)}.ring-offset-background{--tw-ring-offset-color:var(--color-background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,border-color\,box-shadow\]{transition-property:transform,border-color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[visibility\]{transition-property:visibility;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.duration-200{animation-duration:.2s}.duration-500{animation-duration:.5s}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}.fade-in{--tw-enter-opacity:0}.running{animation-play-state:running}.slide-in-from-bottom-2{--tw-enter-translate-y:.5rem}.zoom-in-95{--tw-enter-scale:.95}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--color-primary)}.selection\:bg-primary::selection{background-color:var(--color-primary)}.selection\:text-primary-foreground ::selection{color:var(--color-primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--color-primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--color-foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}@media (hover:hover){.hover\:z-10:hover{z-index:10}.hover\:-translate-y-0\.5:hover{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:border-blue-300:hover{border-color:var(--color-blue-300)}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-amber-200\/60:hover{background-color:#fee68599}@supports (color:color-mix(in lab, red, red)){.hover\:bg-amber-200\/60:hover{background-color:color-mix(in oklab, var(--color-amber-200) 60%, transparent)}}.hover\:bg-amber-700:hover{background-color:var(--color-amber-700)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-destructive\/90:hover{background-color:color-mix(in srgb, hsl(var(--destructive)) 90%, transparent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--color-destructive) 90%, transparent)}}.hover\:bg-primary\/90:hover{background-color:color-mix(in srgb, hsl(var(--primary)) 90%, transparent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--color-primary) 90%, transparent)}}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-rose-300:hover{background-color:var(--color-rose-300)}.hover\:bg-secondary\/80:hover{background-color:color-mix(in srgb, hsl(var(--secondary)) 80%, transparent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--color-secondary) 80%, transparent)}}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.hover\:bg-slate-200\/60:hover{background-color:#e2e8f099}@supports (color:color-mix(in lab, red, red)){.hover\:bg-slate-200\/60:hover{background-color:color-mix(in oklab, var(--color-slate-200) 60%, transparent)}}.hover\:text-accent-foreground:hover{color:var(--color-accent-foreground)}.hover\:text-amber-950:hover{color:var(--color-amber-950)}.hover\:text-blue-500:hover{color:var(--color-blue-500)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-slate-700:hover{color:var(--color-slate-700)}.hover\:text-slate-900:hover{color:var(--color-slate-900)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-yellow-400:hover{color:var(--color-yellow-400)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:bg-white:focus{background-color:var(--color-white)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:border-ring:focus-visible{border-color:var(--color-ring)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-blue-500:focus-visible{--tw-ring-color:var(--color-blue-500)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--color-ring)}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in srgb, hsl(var(--ring)) 50%, transparent)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-ring) 50%, transparent)}}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:var(--color-background)}.focus-visible\:outline-hidden:focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus-visible\:outline-hidden:focus-visible{outline-offset:2px;outline:2px solid #0000}}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:scale-125:active{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}:where([data-scrolling]) .in-\[\[data-scrolling\]\]\:transform-none{transform:none}:where([data-scrolling]) .in-\[\[data-scrolling\]\]\:border-slate-200{border-color:var(--color-slate-200)}:where([data-scrolling]) .in-\[\[data-scrolling\]\]\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:where([data-scrolling]) .in-\[\[data-scrolling\]\]\:transition-none{transition-property:none}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--color-destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in srgb, hsl(var(--destructive)) 20%, transparent)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--color-background)}.data-\[state\=active\]\:bg-white[data-state=active]{background-color:var(--color-white)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--color-foreground)}.data-\[state\=active\]\:text-slate-900[data-state=active]{color:var(--color-slate-900)}.data-\[state\=active\]\:shadow-2xs[data-state=active]{--tw-shadow:0 1px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.data-\[state\=active\]\:shadow-xs[data-state=active]{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--color-primary)}.data-\[state\=inactive\]\:hidden[data-state=inactive]{display:none}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--color-input)}@media (min-width:640px){.sm\:flex{display:flex}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:768px){.md\:grid-cols-\[minmax\(0\,1fr\)_220px\]{grid-template-columns:minmax(0,1fr) 220px}.md\:grid-cols-\[minmax\(0\,1fr\)_240px\]{grid-template-columns:minmax(0,1fr) 240px}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.dark\:border-amber-700\/50:where(.dark,.dark *){border-color:#b7500080}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-700\/50:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-amber-700) 50%, transparent)}}.dark\:border-blue-500\/70:where(.dark,.dark *){border-color:#3080ffb3}@supports (color:color-mix(in lab, red, red)){.dark\:border-blue-500\/70:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-blue-500) 70%, transparent)}}.dark\:border-blue-800\/70:where(.dark,.dark *){border-color:#193cb8b3}@supports (color:color-mix(in lab, red, red)){.dark\:border-blue-800\/70:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-blue-800) 70%, transparent)}}.dark\:border-red-500\/60:where(.dark,.dark *){border-color:#fb2c3699}@supports (color:color-mix(in lab, red, red)){.dark\:border-red-500\/60:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-red-500) 60%, transparent)}}.dark\:border-red-900:where(.dark,.dark *){border-color:var(--color-red-900)}.dark\:border-red-900\/50:where(.dark,.dark *){border-color:#82181a80}@supports (color:color-mix(in lab, red, red)){.dark\:border-red-900\/50:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-red-900) 50%, transparent)}}.dark\:border-slate-600:where(.dark,.dark *){border-color:var(--color-slate-600)}.dark\:border-slate-700:where(.dark,.dark *){border-color:var(--color-slate-700)}.dark\:border-slate-800:where(.dark,.dark *){border-color:var(--color-slate-800)}.dark\:bg-amber-600:where(.dark,.dark *){background-color:var(--color-amber-600)}.dark\:bg-amber-900\/40:where(.dark,.dark *){background-color:#7b330666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-900\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-amber-900) 40%, transparent)}}.dark\:bg-amber-950\/40:where(.dark,.dark *){background-color:#46190166}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-amber-950) 40%, transparent)}}.dark\:bg-blue-400:where(.dark,.dark *){background-color:var(--color-blue-400)}.dark\:bg-blue-900\/40:where(.dark,.dark *){background-color:#1c398e66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-900\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-blue-900) 40%, transparent)}}.dark\:bg-blue-950\/40:where(.dark,.dark *){background-color:#16245666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-950\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-blue-950) 40%, transparent)}}.dark\:bg-emerald-900\/30:where(.dark,.dark *){background-color:#004e3b4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-900\/30:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-emerald-900) 30%, transparent)}}.dark\:bg-input\/30:where(.dark,.dark *){background-color:color-mix(in srgb, hsl(var(--input)) 30%, transparent)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-input) 30%, transparent)}}.dark\:bg-red-700:where(.dark,.dark *){background-color:var(--color-red-700)}.dark\:bg-red-950\/40:where(.dark,.dark *){background-color:#46080966}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-950\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-red-950) 40%, transparent)}}.dark\:bg-rose-800:where(.dark,.dark *){background-color:var(--color-rose-800)}.dark\:bg-rose-900\/40:where(.dark,.dark *){background-color:#8b083666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-rose-900\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-rose-900) 40%, transparent)}}.dark\:bg-slate-700:where(.dark,.dark *){background-color:var(--color-slate-700)}.dark\:bg-slate-800:where(.dark,.dark *){background-color:var(--color-slate-800)}.dark\:bg-slate-800\/40:where(.dark,.dark *){background-color:#1d293d66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-800\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-800) 40%, transparent)}}.dark\:bg-slate-800\/60:where(.dark,.dark *){background-color:#1d293d99}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-800\/60:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-800) 60%, transparent)}}.dark\:bg-slate-900\/40:where(.dark,.dark *){background-color:#0f172b66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/40:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-900) 40%, transparent)}}.dark\:bg-slate-900\/60:where(.dark,.dark *){background-color:#0f172b99}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/60:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-900) 60%, transparent)}}.dark\:bg-slate-900\/70:where(.dark,.dark *){background-color:#0f172bb3}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/70:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-900) 70%, transparent)}}.dark\:bg-slate-900\/90:where(.dark,.dark *){background-color:#0f172be6}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/90:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-900) 90%, transparent)}}.dark\:bg-slate-900\/95:where(.dark,.dark *){background-color:#0f172bf2}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/95:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-900) 95%, transparent)}}.dark\:bg-slate-950:where(.dark,.dark *){background-color:var(--color-slate-950)}.dark\:text-amber-200:where(.dark,.dark *){color:var(--color-amber-200)}.dark\:text-amber-300:where(.dark,.dark *){color:var(--color-amber-300)}.dark\:text-blue-300:where(.dark,.dark *){color:var(--color-blue-300)}.dark\:text-blue-400:where(.dark,.dark *){color:var(--color-blue-400)}.dark\:text-emerald-400:where(.dark,.dark *){color:var(--color-emerald-400)}.dark\:text-gray-300:where(.dark,.dark *){color:var(--color-gray-300)}.dark\:text-green-400:where(.dark,.dark *){color:var(--color-green-400)}.dark\:text-orange-400:where(.dark,.dark *){color:var(--color-orange-400)}.dark\:text-red-300:where(.dark,.dark *){color:var(--color-red-300)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}.dark\:text-rose-100:where(.dark,.dark *){color:var(--color-rose-100)}.dark\:text-rose-300:where(.dark,.dark *){color:var(--color-rose-300)}.dark\:text-slate-100:where(.dark,.dark *){color:var(--color-slate-100)}.dark\:text-slate-200:where(.dark,.dark *){color:var(--color-slate-200)}.dark\:text-slate-300:where(.dark,.dark *){color:var(--color-slate-300)}.dark\:text-slate-400:where(.dark,.dark *){color:var(--color-slate-400)}.dark\:text-slate-500:where(.dark,.dark *){color:var(--color-slate-500)}.dark\:text-yellow-400:where(.dark,.dark *){color:var(--color-yellow-400)}.dark\:ring-blue-500\/40:where(.dark,.dark *){--tw-ring-color:#3080ff66}@supports (color:color-mix(in lab, red, red)){.dark\:ring-blue-500\/40:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab, var(--color-blue-500) 40%, transparent)}}@media (hover:hover){.dark\:hover\:bg-amber-700:where(.dark,.dark *):hover{background-color:var(--color-amber-700)}.dark\:hover\:bg-amber-800\/60:where(.dark,.dark *):hover{background-color:#953d0099}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-amber-800\/60:where(.dark,.dark *):hover{background-color:color-mix(in oklab, var(--color-amber-800) 60%, transparent)}}.dark\:hover\:bg-red-800:where(.dark,.dark *):hover{background-color:var(--color-red-800)}.dark\:hover\:bg-rose-700:where(.dark,.dark *):hover{background-color:var(--color-rose-700)}.dark\:hover\:bg-slate-700:where(.dark,.dark *):hover{background-color:var(--color-slate-700)}.dark\:hover\:bg-slate-700\/60:where(.dark,.dark *):hover{background-color:#31415899}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-slate-700\/60:where(.dark,.dark *):hover{background-color:color-mix(in oklab, var(--color-slate-700) 60%, transparent)}}.dark\:hover\:bg-slate-800:where(.dark,.dark *):hover{background-color:var(--color-slate-800)}.dark\:hover\:text-amber-100:where(.dark,.dark *):hover{color:var(--color-amber-100)}.dark\:hover\:text-slate-100:where(.dark,.dark *):hover{color:var(--color-slate-100)}.dark\:hover\:text-slate-200:where(.dark,.dark *):hover{color:var(--color-slate-200)}}.dark\:aria-invalid\:ring-destructive\/40:where(.dark,.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in srgb, hsl(var(--destructive)) 40%, transparent)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:where(.dark,.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.dark\:data-\[state\=active\]\:bg-slate-800:where(.dark,.dark *)[data-state=active]{background-color:var(--color-slate-800)}.dark\:data-\[state\=active\]\:bg-slate-900\/70:where(.dark,.dark *)[data-state=active]{background-color:#0f172bb3}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[state\=active\]\:bg-slate-900\/70:where(.dark,.dark *)[data-state=active]{background-color:color-mix(in oklab, var(--color-slate-900) 70%, transparent)}}.dark\:data-\[state\=active\]\:text-slate-100:where(.dark,.dark *)[data-state=active]{color:var(--color-slate-100)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0), var(--tw-enter-translate-y,0), 0) scale3d(var(--tw-enter-scale,1), var(--tw-enter-scale,1), var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0), var(--tw-exit-translate-y,0), 0) scale3d(var(--tw-exit-scale,1), var(--tw-exit-scale,1), var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiquants/daily-report",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"description": "Reusable daily-report feature package: shared types/schemas, React (Router v7 / v8) UI with virtual scrolling + optimistic updates + SSE sync, and a drizzle (mssql) server layer with DI ports (auth, user resolution, redis, external sources).",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"**/*.css"
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
"license": "MIT",
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"@aiquants/mssql": "^0.1.2",
|
|
47
|
+
"@aiquants/sse": "^0.2.0",
|
|
47
48
|
"@heroicons/react": "^2.2.0",
|
|
48
49
|
"@radix-ui/react-label": "^2.1.8",
|
|
49
50
|
"@radix-ui/react-slot": "^1.2.4",
|
|
@@ -107,9 +108,9 @@
|
|
|
107
108
|
"dev": "tsup --watch --onSuccess \"pnpm build:css\"",
|
|
108
109
|
"typecheck": "tsc --noEmit",
|
|
109
110
|
"clean": "rimraf dist",
|
|
110
|
-
"publish:patch": "pnpm run verify && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks",
|
|
111
|
-
"publish:minor": "pnpm run verify && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks",
|
|
112
|
-
"publish:major": "pnpm run verify && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks",
|
|
111
|
+
"publish:patch": "pnpm run verify && pnpm run build && node ../../.config/scripts/check-publish-leaks.mjs && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks",
|
|
112
|
+
"publish:minor": "pnpm run verify && pnpm run build && node ../../.config/scripts/check-publish-leaks.mjs && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks",
|
|
113
|
+
"publish:major": "pnpm run verify && pnpm run build && node ../../.config/scripts/check-publish-leaks.mjs && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks",
|
|
113
114
|
"lint": "biome lint src/",
|
|
114
115
|
"check": "biome check src/",
|
|
115
116
|
"check:fix": "biome check --write src/",
|