@linkfox-web/app-kit 0.2.0 → 0.4.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.
@@ -1,2 +1,2 @@
1
- import{o as g,p as l,q as c}from"./chunk-7K2XKPOX.js";import{useSyncExternalStore as T}from"react";function R(){return T(g,l,c)}import{useSyncExternalStore as f}from"react";var s="linkfox:timezone",u=new Set;function x(){return Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC"}function m(){try{return localStorage.getItem(s)}catch{return null}}function w(){return m()||x()}function p(t){u.add(t);let e=r=>{r.key===s&&t()};return window.addEventListener("storage",e),()=>{u.delete(t),window.removeEventListener("storage",e)}}function U(t){try{t?localStorage.setItem(s,t):localStorage.removeItem(s)}catch{}u.forEach(e=>e())}function _(){return f(p,w,()=>"UTC")}function M(){return f(p,()=>m()===null,()=>!0)}function F(t,e=new Date){try{return new Intl.DateTimeFormat("en-US",{timeZone:t,timeZoneName:"longOffset"}).formatToParts(e).find(n=>n.type==="timeZoneName")?.value.replace("GMT","UTC")||"UTC"}catch{return""}}function y(t){if(t instanceof Date)return t;if(typeof t=="number")return new Date(t);let e=String(t).trim();return/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}(:\d{2})?$/.test(e)?new Date(`${e.replace(" ","T")}Z`):/^\d{4}-\d{2}-\d{2}$/.test(e)?new Date(`${e}T00:00:00Z`):new Date(e)}function d(t,e){let r=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).formatToParts(new Date(e)),n=o=>Number(r.find(i=>i.type===o)?.value);return Date.UTC(n("year"),n("month")-1,n("day"),n("hour"),n("minute"),n("second"))-e}function L(t,e,r=0){let[n,o,i]=t.split("-").map(Number),a=Date.UTC(n,o-1,i+r),b=a-d(e,a);return a-d(e,b)}function G(t,e){if(t==null||t==="")return"-";let r=y(t);return!r||Number.isNaN(r.getTime())?String(t):new Intl.DateTimeFormat("zh-CN",{timeZone:e,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).format(r)}import{createContext as C,useContext as D,useEffect as h,useMemo as P,useState as A}from"react";import{jsx as $}from"react/jsx-runtime";var B="linkfox:agent-done",N=200,S=C(null);function K({children:t}){let[e,r]=A(!1),[n,o]=A(null),i=P(()=>({open:e,setOpen:r,page:n,setPage:o}),[e,n]);return $(S.Provider,{value:i,children:t})}function E(){let t=D(S);if(!t)throw new Error("useAgent 必须在 AgentProvider 内使用");return t}function V(t){let{setPage:e}=E(),r=t?JSON.stringify(t):"";h(()=>{e(r?JSON.parse(r):null)},[r,e]),h(()=>()=>e(null),[e])}function X(t,e,r){if(!e)return t;let n=["【页面上下文(系统自动带入)】",`当前页面:${e.source}`];if(e.table&&(r&&n.push(`多维表格:${r.name}(notebookId: ${r.notebookId})`),n.push(`数据表:${e.table.name}(tableId: ${e.table.id})`),n.push("读写数据请用 linkfox-smart-table 技能操作上述数据表,修改前确认字段名存在。")),e.records.length){let o=e.records.slice(0,N);n.push(`用户勾选的记录(${e.records.length} 条,格式:${e.idLabel??"recordId"} | 摘要):`),o.forEach(i=>n.push(`- ${i.id} | ${i.label}`)),e.records.length>o.length&&n.push(`(其余 ${e.records.length-o.length} 条未列出)`)}return n.push("","【用户要求】",t),n.join(`
1
+ import{p as g,q as l,r as c}from"./chunk-WREK6TXJ.js";import{useSyncExternalStore as T}from"react";function R(){return T(g,l,c)}import{useSyncExternalStore as f}from"react";var s="linkfox:timezone",u=new Set;function x(){return Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC"}function m(){try{return localStorage.getItem(s)}catch{return null}}function w(){return m()||x()}function p(t){u.add(t);let e=r=>{r.key===s&&t()};return window.addEventListener("storage",e),()=>{u.delete(t),window.removeEventListener("storage",e)}}function U(t){try{t?localStorage.setItem(s,t):localStorage.removeItem(s)}catch{}u.forEach(e=>e())}function _(){return f(p,w,()=>"UTC")}function M(){return f(p,()=>m()===null,()=>!0)}function F(t,e=new Date){try{return new Intl.DateTimeFormat("en-US",{timeZone:t,timeZoneName:"longOffset"}).formatToParts(e).find(n=>n.type==="timeZoneName")?.value.replace("GMT","UTC")||"UTC"}catch{return""}}function y(t){if(t instanceof Date)return t;if(typeof t=="number")return new Date(t);let e=String(t).trim();return/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}(:\d{2})?$/.test(e)?new Date(`${e.replace(" ","T")}Z`):/^\d{4}-\d{2}-\d{2}$/.test(e)?new Date(`${e}T00:00:00Z`):new Date(e)}function d(t,e){let r=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).formatToParts(new Date(e)),n=o=>Number(r.find(i=>i.type===o)?.value);return Date.UTC(n("year"),n("month")-1,n("day"),n("hour"),n("minute"),n("second"))-e}function L(t,e,r=0){let[n,o,i]=t.split("-").map(Number),a=Date.UTC(n,o-1,i+r),b=a-d(e,a);return a-d(e,b)}function G(t,e){if(t==null||t==="")return"-";let r=y(t);return!r||Number.isNaN(r.getTime())?String(t):new Intl.DateTimeFormat("zh-CN",{timeZone:e,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).format(r)}import{createContext as C,useContext as D,useEffect as h,useMemo as P,useState as A}from"react";import{jsx as $}from"react/jsx-runtime";var B="linkfox:agent-done",N=200,S=C(null);function K({children:t}){let[e,r]=A(!1),[n,o]=A(null),i=P(()=>({open:e,setOpen:r,page:n,setPage:o}),[e,n]);return $(S.Provider,{value:i,children:t})}function E(){let t=D(S);if(!t)throw new Error("useAgent 必须在 AgentProvider 内使用");return t}function V(t){let{setPage:e}=E(),r=t?JSON.stringify(t):"";h(()=>{e(r?JSON.parse(r):null)},[r,e]),h(()=>()=>e(null),[e])}function X(t,e,r){if(!e)return t;let n=["【页面上下文(系统自动带入)】",`当前页面:${e.source}`];if(e.table&&(r&&n.push(`多维表格:${r.name}(notebookId: ${r.notebookId})`),n.push(`数据表:${e.table.name}(tableId: ${e.table.id})`),n.push("读写数据请用 linkfox-smart-table 技能操作上述数据表,修改前确认字段名存在。")),e.records.length){let o=e.records.slice(0,N);n.push(`用户勾选的记录(${e.records.length} 条,格式:${e.idLabel??"recordId"} | 摘要):`),o.forEach(i=>n.push(`- ${i.id} | ${i.label}`)),e.records.length>o.length&&n.push(`(其余 ${e.records.length-o.length} 条未列出)`)}return n.push("","【用户要求】",t),n.join(`
2
2
  `)}var Y=(t,e=60)=>t.length>e?`${t.slice(0,e)}…`:t;export{R as a,x as b,U as c,_ as d,M as e,F as f,L as g,G as h,B as i,K as j,E as k,V as l,X as m,Y as n};
@@ -0,0 +1,2 @@
1
+ import{f as W,g as B,h as K,j as U,l as M,s as D,x as O}from"./chunk-WREK6TXJ.js";import{clearCreditsExhausted as Q,getCreditsError as Z,getRemainingCredits as J,isCreditsExhausted as ee,onCreditsExhausted as te}from"@linkfox-web/ai-tools/account";var Re="https://ai.linkfox.com/usercenter/pricing?tab=ai&plan=personalYearly";async function ne(){try{let{totalRemainingCredits:e}=await J();return Number.isFinite(e)?e:void 0}catch{return}}function Se(){return ee()}function Ee(){return Z()}function Ne(e){return te(()=>e())}async function Ae(){let e=await ne();return e!==void 0&&e>0&&Q(),e}function Le(e){return e.type==="range"||e.type==="dateRange"?[`${e.id}.gte`,`${e.id}.lte`]:[e.id]}function re(e){return(e??"").split(",").map(t=>t.trim()).filter(Boolean)}function Fe(e,t,o){let n=re(e).filter(a=>a!==t);return o&&n.push(t),n.join(",")}function Oe(e,t){for(let o of e){let n=o.items.find(a=>t===a.href||t.startsWith(`${a.href}/`));if(n)return{group:o,item:n}}return null}async function L(e){try{return await e}catch(t){throw O(t),t}}import*as y from"@linkfox-web/ai-tools/agent-os";var se=2500,oe=5,ie=3,Be=[{id:"default",name:"通用助手"},{id:"linkfox-product-selection-agent",name:"选品 Agent"},{id:"linkfox-market-analysis-agent",name:"市场分析 Agent"},{id:"linkfox-listing-agent",name:"Listing Agent"},{id:"linkfox-image-agent",name:"图片 Agent"},{id:"linkfox-video-agent",name:"视频 Agent"}],ae={read:"读取文件",execute:"执行命令",edit:"编辑文件",search:"搜索"},G=e=>e?.type==="text"||e?.type===void 0?e?.text??e?.value??"":"";function le(e){return e.type!=="resource_link"||!e.uri?null:{name:decodeURIComponent(e.uri.split("?")[0].split("/").pop()??"")||e.name||"文件",uri:e.uri}}function ce(e){let t=new Map,o="";return e.forEach((n,a)=>{if(n.sessionUpdate==="tool_call"||n.sessionUpdate==="tool_call_update"){let d=n.toolCallId??`step-${a}`,b=t.get(d),h=n.title?.replace(/\(.*\)$/,"")||b?.title||ae[n.kind??""]||"处理中",T=n.status==="completed"?"done":n.status==="failed"?"failed":b?.status??"running";t.set(d,{id:d,title:h,status:T})}else(n.sessionUpdate==="agent_message_chunk"||n.sessionUpdate==null)&&(o+=G(n.content))}),{steps:[...t.values()],text:o}}function de(e){let t="",o=new Map;for(let{content:n}of e){if(!n)continue;let a=le(n);a?o.set(a.uri,a):t+=G(n)}return{text:t,files:[...o.values()]}}function Ke(e){return L(y.cancelTask({messageId:e}))}async function Ue(e){try{return(await L(y.getShareUrl({messageId:e}))).shareUrl||void 0}catch{return}}async function Me(e,t,{signal:o,onUpdate:n,sessionId:a}){let d=await L(y.createTask(a?{prompt:e,modelId:t,sessionId:a}:{prompt:e,modelId:t},{signal:o}));if(!d.id)throw new W(500,"LinkFox OS 没有返回任务 ID");let b=d.id,h=d.sessionId||a||"";n({messageId:b,sessionId:h,steps:[],text:"",files:[],stopReason:""});let T=new Map,w=0,E=0;for(;;){await M(se,o);let F=Math.max(0,w-oe),I;try{I=await L(y.getTask({messageId:b,fromIndex:F},{signal:o})),E=0}catch(g){if(B(g)||U(g)||K(g)||++E>=ie)throw g;continue}I.eventList?.forEach((g,R)=>T.set(F+R,g)),w=I.eventTotal??w;let _=[...T.entries()].sort((g,R)=>g[0]-R[0]).map(([,g])=>g),N=ce(_),v=I.message?.stopReason??"";if(v){let g=de(I.message?.agentMessageChunks??[]),R=N.steps.map(C=>C.status==="running"?{...C,status:"done"}:C);return{messageId:b,sessionId:h,steps:R,text:g.text||N.text,files:g.files,stopReason:v}}n({messageId:b,sessionId:h,steps:N.steps,text:N.text,files:[],stopReason:""})}}import{LinkfoxHttpError as fe}from"@linkfox-web/http";import*as u from"@linkfox-web/ai-tools/smart-table";function A(e,t){return new fe({service:"ai-tools",status:200,code:e,message:t})}var H=(e,t)=>(e.createdTime??"").localeCompare(t.createdTime??""),j=e=>Object.fromEntries(e.map(t=>[t.name,t.fieldId]));function V(e,t,o){let n=e.get(t);return n||(n=o(),e.set(t,n),n.catch(()=>e.delete(t))),n}function ue(){return typeof window>"u"?!1:/(^|\.)app\.linkfox\.com$/.test(window.location.hostname)}var pe=new Set(["主图"]);function Ve(e){let t=e.fields??{},o=new Map,n=new Map,a=new Map;async function d(s){try{return await s}catch(i){throw O(i),i}}async function b(s){let i=[];for(let r=1;r<=50;r++){let c=await d(u[s]({page:r,perPage:100})),l=c.notebooks??[];if(i.push(...l),l.length===0||i.length>=(c.total??0))break}return i}async function h(){let{notebookId:s,notebookName:i}=e,r=await b("listMyTables");if(s){let x=r.find(k=>k.notebookId===s)??(await b("listSharedTables")).find(k=>k.notebookId===s);if(!x)throw A(404,`找不到配置的多维表 ${s},请检查 .env 的 NEXT_PUBLIC_NOTE_BOOK_ID 或 linkfox.config.ts`);return x}if(ue())throw A(500,"应用未绑定多维表(缺少 NEXT_PUBLIC_NOTE_BOOK_ID)。请重新打开应用完成初始化后再试。");let c=r.filter(x=>x.name===i).sort(H);if(c.length)return c[0];let l=(await b("listSharedTables")).filter(x=>x.name===i).sort(H);if(l.length)return l[0];let m=e.requestKeyPrefix??"linkfox-app",p=await d(u.createTable({name:i,requestKey:`${m}-${i}`}));return{notebookId:p.notebookId,name:p.notebookName,tables:[{tableId:p.tableId,name:p.name,url:p.url,refKey:p.refKey}]}}function T(){return V(o,D(),h)}function w(s,i){return V(n,`${D()}:${s}`,async()=>{let r=i??t[s];if(!r)throw A(500,`数据表 ${String(s)} 没有登记列定义,请在 linkfox.config.ts 的 smartTableConfig.fields 里补上`);let c=e.tables[s];if(!c)throw A(500,`数据表 ${String(s)} 没有登记表名,请在 smartTableConfig.tables 里补上`);let l=await T(),m=l.tables.find(f=>f.name===c);if(!m){let f=await d(u.addTable({notebookId:l.notebookId,name:c,fields:r})),S={tableId:f.tableId,name:f.name,url:f.url,refKey:f.refKey};return l.tables.push(S),{...S,fieldIds:j(f.fields??[])}}let{fields:p}=await d(u.listFields({tableId:m.tableId,includeChoices:!1})),x=r.filter(f=>pe.has(f.name)&&p.some(S=>S.name===f.name&&S.type!==f.type)),k=p;if(x.length){let f=x.map(P=>P.name);k=(await d(u.deleteFields({tableId:m.tableId,fieldNames:f,allowBreakingDependents:!0}))).fields??p.filter(P=>!f.includes(P.name))}let z=new Set(k.map(f=>f.name)),$=r.filter(f=>!z.has(f.name));for(let f=0;f<$.length;f+=50)k=(await d(u.addFields({tableId:m.tableId,fields:$.slice(f,f+50)}))).fields??k;return{...m,fieldIds:j(k)}})}function E(s){return d(u.listRecords(s))}async function F(s,i=100){let r=[];for(let c=1;c<=i;c++){let l=await E({...s,page:c,perPage:100});if(r.push(...l.records),l.records.length<100||r.length>=l.total)break}return r}async function I(s,i){let r=[];for(let c=0;c<i.length;c+=50){let l=i.slice(c,c+50),m=await d(u.createRecords({tableId:s,records:l.map(p=>({fields:p}))}));if(r.push(...m.records??[]),m.created!==l.length)throw A(500,`已写入 ${r.length} 条,但有 ${l.length-m.created} 条未写入成功`)}return r}async function _(s,i){for(let r=0;r<i.length;r+=100){let c=i.slice(r,r+100),l=await d(u.updateRecords({tableId:s,records:c}));if(l.updated!==c.length)throw A(404,`只更新了 ${l.updated}/${c.length} 条,记录可能已被删除,请刷新后重试`)}}async function N(s,i){for(let r=0;r<i.length;r+=100)await d(u.deleteRecords({tableId:s,recordIds:i.slice(r,r+100)}))}function v(s,i,r,c){let l=`${s}:${i}:${r}`,p=(a.get(l)??Promise.resolve()).catch(()=>{}).then(()=>d(u.uploadAttachment({tableId:s,recordId:i,fieldName:r,imageUrl:c})).then(x=>x.attachment));return a.set(l,p),p.finally(()=>{a.get(l)===p&&a.delete(l)}).catch(()=>{}),p}async function g(s,i,r,c,l){return(await E({tableId:s,perPage:100,fieldNames:l,filter:{conditions:[{fieldName:i,operator:"is",value:r}]}})).records.find(p=>p.recordId===c)??null}function R(){return Promise.all(Object.keys(t).map(s=>w(s)))}async function C(s){return(await w(s)).tableId}return{config:e,TABLE_FIELDS:t,getNotebook:T,ensureTable:w,listRecords:E,listAllRecords:F,createRecords:I,updateRecords:_,deleteRecords:N,uploadAttachment:v,getRecord:g,warmTables:R,tableIdOf:C}}var q;function qe(e){q=e}function X(){return q}function ge(e){return Array.isArray(e)&&e.every(t=>t&&typeof t=="object"&&"token"in t)}function me(e){return ge(e)?e[0]:void 0}function Xe(e,t="full"){let o=me(e);return o&&(t==="thumb"?o.smThumbnailUrl??o.lgThumbnailUrl??o.presignedUrl:o.presignedUrl)||void 0}var be=e=>e==null?"":typeof e=="string"?e:String(e),Ye=e=>typeof e=="number"?e:Number(e)||0,ze=e=>be(e).split(/[,,、\n]/).map(t=>t.trim()).filter(Boolean),Qe=()=>new Date().toISOString();var he=["启用","禁用"],xe=[{name:"词条",type:"singleLineText"},{name:"中文名",type:"singleLineText"},{name:"状态",type:"singleSelect",choices:he.map(e=>({name:e}))},{name:"来源",type:"singleLineText"},{name:"创建时间",type:"date"}],ke={brandWords:"品牌词",sensitiveWords:"敏感词"},ye=Object.keys(ke);function Te(e){function t(n){return e.ensureTable(n,xe)}async function o(){return(await Promise.all(ye.map(async a=>{let{tableId:d}=await t(a);return(await e.listAllRecords({tableId:d,fieldNames:["词条"],filter:{conditions:[{fieldName:"状态",operator:"is",value:"启用"}]}})).map(h=>String(h.fields.词条??"").trim()).filter(Boolean).map(h=>({word:h,kind:a}))}))).flat()}return{ensureWordTable:t,loadActiveWords:o}}function et(){let e=X();if(!e)throw new Error("多维表客户端尚未初始化:请确认模板的 lib/app-kit.ts 调用了 setActiveSmartTable(smartTable)");return Te(e)}var we=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Y=/[A-Za-z0-9]/;function tt(e){let t=e.map(o=>{let n=o.word.replace(/\s+/g," "),a=Y.test(n[0])?"(?<![\\p{L}\\p{N}])":"",d=Y.test(n[n.length-1])?"(?![\\p{L}\\p{N}])":"";return{hit:o,re:new RegExp(`${a}${we(n).replace(/ /g,"\\s+")}${d}`,"iu")}});return o=>{let n=o.filter(Boolean).join(`
2
+ `);return t.filter(a=>a.re.test(n)).map(a=>a.hit)}}export{Re as a,ne as b,Se as c,Ee as d,Ne as e,Ae as f,Le as g,re as h,Fe as i,Oe as j,L as k,Be as l,Ke as m,Ue as n,Me as o,Ve as p,qe as q,X as r,ge as s,me as t,Xe as u,be as v,Ye as w,ze as x,Qe as y,he as z,xe as A,ke as B,Te as C,et as D,tt as E};
@@ -0,0 +1 @@
1
+ var p;function j(t){p={...t}}function n(){if(!p)throw new Error("app-kit 未配置:请在模板的 lib/app-kit.ts 中调用 configureAppKit(),并在入口组件里 import 该文件");return p}function s(){return n().apiKey?.()?.trim()||void 0}import{isLinkfoxHttpError as u,LinkfoxHttpError as C}from"@linkfox-web/http";var P=/算力|余额不足|计费不足|套餐到期|充值|剩余额度|额度上限|insufficient balance|quota exceeded/i,O=/invalid_token|the access token is invalid|expired or revoked/i,c="会话已过期,请重新登录";function l(t){if(!u(t))return!1;if(t.message===c)return!0;let e=typeof t.body=="string"?t.body:JSON.stringify(t.body??"");return O.test(`${t.message} ${e}`)}var x=class extends C{constructor(e,r){super({service:"app",status:0,code:e,message:r})}};function et(t){return t instanceof DOMException&&t.name==="AbortError"}function E(t){return u(t)&&t.service==="ai-tools"&&(String(t.code)==="402"||P.test(t.message))}function nt(t){return u(t)&&E(t)&&/额度上限/.test(t.message)}function g(t){return u(t)&&t.service==="ai-tools"&&(String(t.code)==="401"||t.status===401)}function m(t){if(u(t)){let e=String(t.code??"");return e==="NETWORK_ERROR"?"网络请求失败,请检查网络后重试":e==="TIMEOUT"?"请求超时,请稍后重试":l(t)?c:e==="UNAUTHORIZED"?"登录已失效,请重新登录":g(t)?"工具网关鉴权失败:API Key 或登录已失效":E(t)?`算力余额不足,请前往 LinkFox 充值后重试(${t.message})`:t.message}return t instanceof Error?t.message:String(t)}var it=(t,e)=>new Promise((r,v)=>{let L=setTimeout(r,t);e?.addEventListener("abort",()=>{clearTimeout(L),v(new DOMException("Aborted","AbortError"))})});import{recordAppVisit as N}from"@linkfox-web/ai-tools/smart-table";var U="public_app_id_xxx";function y(){let t=n().applicationId?.trim();if(!(!t||t===U))return t}function T(){let t=y();if(!t)return;let e=typeof window>"u"?void 0:window.location.href;N({appId:t,appUrl:e}).catch(()=>{})}import{configure as R}from"@linkfox-web/http";import"@linkfox-web/api-user-center";var K=!1;function S(){if(K)return;let t=n();R({...t.timeout?{timeout:t.timeout}:{},services:{"ai-tools":{baseURL:t.gatewayBaseUrl,apiKey:s,apiKeyHeader:t.rewrite?"Authorization":"tool-gateway-api-key"},"third-party-sso":{baseURL:t.ssoBaseUrl}}}),K=!0}import{clearSession as M}from"@linkfox-web/http";import{clearThirdPartySsoSession as D,completeThirdPartySsoRedirect as $,getThirdPartyApplicationTeam as B,readThirdPartySsoSession as _,redirectToThirdPartySso as X}from"@linkfox-web/api-user-center";var k={status:"loading"},G=3e3,H=3e4,o=k,b=!1,h,w,I=new Set;function i(t){o=t,I.forEach(e=>e())}function wt(t){return I.add(t),()=>{I.delete(t)}}function F(){return o}function It(){return k}function At(){return o.status==="ready"?o.identity:""}function a(){clearTimeout(w),h=void 0}function f(){return`linkfox:sso:signed-out:${n().ssoClientId}`}function V(){if(new URLSearchParams(window.location.search).get("login")==="manual")return!1;try{if(window.sessionStorage.getItem(f()))return!1;let t=`linkfox:sso:auto-login:${n().ssoClientId}`;return Date.now()-Number(window.sessionStorage.getItem(t))<H?!1:(window.sessionStorage.setItem(t,String(Date.now())),!0)}catch{return!1}}function q(){try{return!!window.sessionStorage.getItem(f())}catch{return!1}}function z(t){h=t.accessToken;try{window.sessionStorage.removeItem(f())}catch{}clearTimeout(w),w=setTimeout(()=>{d()},Math.min(Math.max(t.expireAt-Date.now(),0),2147483647)),i({status:"ready",identity:`${n().ssoClientId}:${t.sub}`,userName:t.name}),T()}function ht(){if(b)return;if(b=!0,s()){d();return}S();let t=n().ssoClientId,e=()=>{if(o.status!=="ready")return;let r=_(t);(!r||r.accessToken!==h)&&d()};window.addEventListener("focus",e),document.addEventListener("visibilitychange",e),window.addEventListener("pageshow",r=>{r.persisted&&o.status==="redirecting"&&i({status:"anonymous"})}),J()}async function J(){let t=n().ssoClientId;if(t){new URLSearchParams(window.location.search).has("state")&&i({status:"callback"});try{let e=await $(t);if(e&&e.returnTo!==window.location.href){window.location.replace(e.returnTo);return}}catch(e){a(),i({status:"error",action:"login",message:m(e)});return}}await d(),F().status==="anonymous"&&V()&&await Z({auto:!0})}async function d(){S();let t=s();if(t){a(),M(),i({status:"ready",apiKey:t,identity:"api-key",userName:"API Key 访问"});return}let e=n().ssoClientId;if(!e){a(),i({status:"error",action:"config",message:"请配置 NEXT_PUBLIC_LINKFOX_SSO_CLIENT_ID(开发使用 .env.local,构建使用 .env),然后重启或重新构建"});return}let r=_(e);if(r){z(r);return}a(),i({status:"anonymous"})}function W(){let t=n().basePath??"";return t?`${window.location.origin}${t}/`:window.location.origin}async function Y(){let t=y();if(t)try{return await B(n().ssoClientId,t,{timeout:G})}catch{return}}async function Z({auto:t=!1}={}){if(o.status!=="redirecting"){a(),i({status:"redirecting",auto:t});try{await X({clientId:n().ssoClientId,redirectUri:W(),replace:t,autoLogin:q()?!1:void 0,teamId:await Y()})}catch(e){i({status:"error",action:"login",message:m(e)})}}}function A(){D(n().ssoClientId),a(),i({status:"anonymous"})}function xt(){try{window.sessionStorage.setItem(f(),"1")}catch{}A()}function Et(t){if(l(t)){if(o.status!=="ready")return;A(),i({status:"error",action:"login",message:c});return}if(!(!g(t)||o.status!=="ready")){if(s()){a(),i({status:"error",action:"config",message:"API Key 已失效,请更新 NEXT_PUBLIC_LINKFOX_API_KEY 后重启开发服务或重新构建部署"});return}A(),i({status:"error",action:"login",message:"登录已失效,请重新登录"})}}function Tt(t){return t.length<=8?"****":`${t.slice(0,4)}****${t.slice(-4)}`}function Kt(){return s()??null}export{j as a,n as b,s as c,c as d,l as e,x as f,et as g,E as h,nt as i,g as j,m as k,it as l,y as m,T as n,S as o,wt as p,F as q,It as r,At as s,ht as t,d as u,Z as v,xt as w,Et as x,Tt as y,Kt as z};
@@ -1,9 +1,10 @@
1
1
  import * as react from 'react';
2
2
  import { JSX } from 'react';
3
- import { N as NavGroup, U as UiFilterSpec, F as FilterValues } from '../filter-spec-BHwe1PQ-.js';
4
- export { a as NavItem, f as findNav } from '../filter-spec-BHwe1PQ-.js';
3
+ import { N as NavGroup, U as UiFilterSpec, F as FilterValues, W as WordTableKey } from '../word-tables-B3Zc1OiL.js';
4
+ export { a as NavItem, f as findNav } from '../word-tables-B3Zc1OiL.js';
5
5
  import { ThemeProvider as ThemeProvider$1 } from 'next-themes';
6
6
  import 'lucide-react';
7
+ import '@linkfox-web/ai-tools/smart-table';
7
8
 
8
9
  interface AgentSuggestions {
9
10
  /** 按页面 source 结尾匹配的推荐提问 */
@@ -43,6 +44,12 @@ declare function AuthGate({ children }: {
43
44
  children: React.ReactNode;
44
45
  }): string | number | bigint | boolean | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react.JSX.Element | null | undefined;
45
46
 
47
+ /**
48
+ * 算力余额提醒:登录后查一次可用算力,为 0 时弹窗;运行中遇到 402 时弹窗并暂停后续计费请求
49
+ * (熔断在 `@linkfox-web/ai-tools` 的 callGateway 里,这里只负责提示与重新检查)。
50
+ */
51
+ declare function CreditsDialog(): react.JSX.Element;
52
+
46
53
  declare function ThemeProvider({ children, ...props }: react.ComponentProps<typeof ThemeProvider$1>): react.JSX.Element;
47
54
 
48
55
  declare function TimezoneSelect(): react.JSX.Element;
@@ -169,6 +176,17 @@ declare function ConfirmDialog({ open, onOpenChange, title, description, details
169
176
  onConfirm: () => void;
170
177
  }): react.JSX.Element;
171
178
 
179
+ /**
180
+ * 品牌词 / 敏感词管理页:词库增删改查、启停、分页。
181
+ *
182
+ * 页面只需要一行 `<WordManager kind="brandWords" description="…" />`;两张表的列定义、
183
+ * 建表与匹配规则都在 `@linkfox-web/app-kit/runtime` 的 `word-tables` 里。
184
+ */
185
+ declare function WordManager({ kind, description }: {
186
+ kind: WordTableKey;
187
+ description: string;
188
+ }): react.JSX.Element;
189
+
172
190
  /** 阶段通过情况:一行一个阶段,label 如「G1 新品初筛」 */
173
191
  interface TaskCardStage {
174
192
  key: string;
@@ -263,4 +281,4 @@ declare function Markdown({ children }: {
263
281
  children: string;
264
282
  }): JSX.Element;
265
283
 
266
- export { AgentPanel, type AgentSuggestions, AgentToggle, AppShell, type AppShellProps, AppSidebar, type AppSidebarProps, AuthGate, ColumnPicker, ComboInput, type ComboOption, ConfirmDialog, type DataColumn, DataPagination, DataTable, FilterPanel, Markdown, NavGroup, PAGE_SIZE, type StageCounts, type StageNode, type StageNodeState, StageProgress, TaskCard, type TaskCardBudget, type TaskCardData, type TaskCardStage, TaskLog, ThemeProvider, TimezoneSelect, UserMenu, countsBalanced };
284
+ export { AgentPanel, type AgentSuggestions, AgentToggle, AppShell, type AppShellProps, AppSidebar, type AppSidebarProps, AuthGate, ColumnPicker, ComboInput, type ComboOption, ConfirmDialog, CreditsDialog, type DataColumn, DataPagination, DataTable, FilterPanel, Markdown, NavGroup, PAGE_SIZE, type StageCounts, type StageNode, type StageNodeState, StageProgress, TaskCard, type TaskCardBudget, type TaskCardData, type TaskCardStage, TaskLog, ThemeProvider, TimezoneSelect, UserMenu, WordManager, countsBalanced };
@@ -1,4 +1,4 @@
1
- "use client";import{a as ia,b as sa,c as la,d as Ee,f as Tt,g as fa,h as ga,i as ba,l as va}from"../chunk-IPHQW7KZ.js";import{a as ot,b as It,c as xa,d as ha,e as Ca,f as rt,i as ya,j as wa,k as zt,m as Na}from"../chunk-SJFNXBPH.js";import{g as ra,j as na,s as da,t as ca,u as pa,v as ma,x as ua}from"../chunk-7K2XKPOX.js";import{Fragment as Gn}from"react";import Fn from"next/link";import{usePathname as On}from"next/navigation";import Lt from"next/link";import{usePathname as Ur}from"next/navigation";import{ChevronRightIcon as Zr}from"lucide-react";import{Collapsible as Dt}from"radix-ui";import{jsx as At}from"react/jsx-runtime";function ge({...e}){return At(Dt.Root,{"data-slot":"collapsible",...e})}function be({...e}){return At(Dt.CollapsibleTrigger,{"data-slot":"collapsible-trigger",...e})}function ve({...e}){return At(Dt.CollapsibleContent,{"data-slot":"collapsible-content",...e})}import*as M from"react";import{cva as Er}from"class-variance-authority";import{cn as I}from"cn";import{Slot as _a}from"radix-ui";import*as Pa from"react";var vr=768,ka=`(max-width: ${vr-1}px)`;function xr(e){let t=window.matchMedia(ka);return t.addEventListener("change",e),()=>t.removeEventListener("change",e)}function Sa(){return Pa.useSyncExternalStore(xr,()=>window.matchMedia(ka).matches,()=>!1)}import{cva as hr}from"class-variance-authority";import{cn as Cr}from"cn";import{Slot as yr}from"radix-ui";import{jsx as Nr}from"react/jsx-runtime";var wr=hr("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function p({className:e,variant:t="default",size:a="default",asChild:o=!1,...r}){let i=o?yr.Root:"button";return Nr(i,{"data-slot":"button","data-variant":t,"data-size":a,className:Cr(wr({variant:t,size:a,className:e})),...r})}import{cn as Pr}from"cn";import{jsx as kr}from"react/jsx-runtime";function te({className:e,type:t,...a}){return kr("input",{type:t,"data-slot":"input",className:Pr("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",e),...a})}import{cn as Sr}from"cn";import{Separator as Rr}from"radix-ui";import{jsx as Tr}from"react/jsx-runtime";function Ra({className:e,orientation:t="horizontal",decorative:a=!0,...o}){return Tr(Rr.Root,{"data-slot":"separator",decorative:a,orientation:t,className:Sr("shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",e),...o})}import{cn as _e}from"cn";import{Dialog as ae}from"radix-ui";import{XIcon as Ir}from"lucide-react";import{jsx as $,jsxs as Mt}from"react/jsx-runtime";function Ta({...e}){return $(ae.Root,{"data-slot":"sheet",...e})}function zr({...e}){return $(ae.Portal,{"data-slot":"sheet-portal",...e})}function Dr({className:e,...t}){return $(ae.Overlay,{"data-slot":"sheet-overlay",className:_e("fixed inset-0 z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",e),...t})}function Ia({className:e,children:t,side:a="right",showCloseButton:o=!0,...r}){return Mt(zr,{children:[$(Dr,{}),Mt(ae.Content,{"data-slot":"sheet-content","data-side":a,className:_e("fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=right]:data-closed:slide-out-to-right-10 data-[side=top]:data-closed:slide-out-to-top-10",e),...r,children:[t,o&&$(ae.Close,{"data-slot":"sheet-close",asChild:!0,children:Mt(p,{variant:"ghost",className:"absolute top-3 right-3",size:"icon-sm",children:[$(Ir,{}),$("span",{className:"sr-only",children:"Close"})]})})]})]})}function za({className:e,...t}){return $("div",{"data-slot":"sheet-header",className:_e("flex flex-col gap-0.5 p-4",e),...t})}function Da({className:e,...t}){return $(ae.Title,{"data-slot":"sheet-title",className:_e("font-heading text-base font-medium text-foreground",e),...t})}function Aa({className:e,...t}){return $(ae.Description,{"data-slot":"sheet-description",className:_e("text-sm text-muted-foreground",e),...t})}import{cn as Ar}from"cn";import{jsx as Mr}from"react/jsx-runtime";function Ma({className:e,...t}){return Mr("div",{"data-slot":"skeleton",className:Ar("animate-pulse rounded-md bg-muted",e),...t})}import{cn as Br}from"cn";import{Tooltip as Ge}from"radix-ui";import{jsx as nt,jsxs as Lr}from"react/jsx-runtime";function Ba({...e}){return nt(Ge.Root,{"data-slot":"tooltip",...e})}function La({...e}){return nt(Ge.Trigger,{"data-slot":"tooltip-trigger",...e})}function Ea({className:e,sideOffset:t=0,children:a,...o}){return nt(Ge.Portal,{children:Lr(Ge.Content,{"data-slot":"tooltip-content",sideOffset:t,className:Br("z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",e),...o,children:[a,nt(Ge.Arrow,{className:"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground"})]})})}import{PanelLeftIcon as _r}from"lucide-react";import{jsx as x,jsxs as Fe}from"react/jsx-runtime";var Gr="sidebar_state",Fr=3600*24*7,Or="16rem",Vr="18rem",$r="3rem",Hr="b",Ga=M.createContext(null);function xe(){let e=M.useContext(Ga);if(!e)throw new Error("useSidebar must be used within a SidebarProvider.");return e}function Fa({defaultOpen:e=!0,open:t,onOpenChange:a,className:o,style:r,children:i,...s}){let n=Sa(),[l,c]=M.useState(!1),[f,k]=M.useState(e),w=t??f,S=M.useCallback(g=>{let y=typeof g=="function"?g(w):g;a?a(y):k(y),document.cookie=`${Gr}=${y}; path=/; max-age=${Fr}`},[a,w]),C=M.useCallback(()=>n?c(g=>!g):S(g=>!g),[n,S,c]);M.useEffect(()=>{let g=y=>{y.key===Hr&&(y.metaKey||y.ctrlKey)&&(y.preventDefault(),C())};return window.addEventListener("keydown",g),()=>window.removeEventListener("keydown",g)},[C]);let v=w?"expanded":"collapsed",P=M.useMemo(()=>({state:v,open:w,setOpen:S,isMobile:n,openMobile:l,setOpenMobile:c,toggleSidebar:C}),[v,w,S,n,l,c,C]);return x(Ga.Provider,{value:P,children:x("div",{"data-slot":"sidebar-wrapper",style:{"--sidebar-width":Or,"--sidebar-width-icon":$r,...r},className:I("group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar",o),...s,children:i})})}function Oa({side:e="left",variant:t="sidebar",collapsible:a="offcanvas",className:o,children:r,dir:i,...s}){let{isMobile:n,state:l,openMobile:c,setOpenMobile:f}=xe();return a==="none"?x("div",{"data-slot":"sidebar",className:I("flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground",o),...s,children:r}):n?x(Ta,{open:c,onOpenChange:f,...s,children:Fe(Ia,{dir:i,"data-sidebar":"sidebar","data-slot":"sidebar","data-mobile":"true",className:"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",style:{"--sidebar-width":Vr},side:e,children:[Fe(za,{className:"sr-only",children:[x(Da,{children:"Sidebar"}),x(Aa,{children:"Displays the mobile sidebar."})]}),x("div",{className:"flex h-full w-full flex-col",children:r})]})}):Fe("div",{className:"group peer hidden text-sidebar-foreground md:block","data-state":l,"data-collapsible":l==="collapsed"?a:"","data-variant":t,"data-side":e,"data-slot":"sidebar",children:[x("div",{"data-slot":"sidebar-gap",className:I("relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear","group-data-[collapsible=offcanvas]:w-0","group-data-[side=right]:rotate-180",t==="floating"||t==="inset"?"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]":"group-data-[collapsible=icon]:w-(--sidebar-width-icon)")}),x("div",{"data-slot":"sidebar-container","data-side":e,className:I("fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex",t==="floating"||t==="inset"?"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]":"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l",o),...s,children:x("div",{"data-sidebar":"sidebar","data-slot":"sidebar-inner",className:"flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border",children:r})})]})}function Va({className:e,onClick:t,...a}){let{toggleSidebar:o}=xe();return Fe(p,{"data-sidebar":"trigger","data-slot":"sidebar-trigger",variant:"ghost",size:"icon-sm",className:I(e),onClick:r=>{t?.(r),o()},...a,children:[x(_r,{}),x("span",{className:"sr-only",children:"Toggle Sidebar"})]})}function $a({className:e,...t}){let{toggleSidebar:a}=xe();return x("button",{"data-sidebar":"rail","data-slot":"sidebar-rail","aria-label":"Toggle Sidebar",tabIndex:-1,onClick:a,title:"Toggle Sidebar",className:I("absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2","in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize","[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize","group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar","[[data-side=left][data-collapsible=offcanvas]_&]:-right-2","[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",e),...t})}function Ha({className:e,...t}){return x("main",{"data-slot":"sidebar-inset",className:I("relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2",e),...t})}function Ka({className:e,...t}){return x("div",{"data-slot":"sidebar-header","data-sidebar":"header",className:I("flex flex-col gap-2 p-2",e),...t})}function Ua({className:e,...t}){return x("div",{"data-slot":"sidebar-content","data-sidebar":"content",className:I("no-scrollbar flex min-h-0 flex-1 flex-col gap-0 overflow-auto group-data-[collapsible=icon]:overflow-hidden",e),...t})}function Za({className:e,...t}){return x("div",{"data-slot":"sidebar-group","data-sidebar":"group",className:I("relative flex w-full min-w-0 flex-col p-2",e),...t})}function Bt({className:e,...t}){return x("ul",{"data-slot":"sidebar-menu","data-sidebar":"menu",className:I("flex w-full min-w-0 flex-col gap-0",e),...t})}function it({className:e,...t}){return x("li",{"data-slot":"sidebar-menu-item","data-sidebar":"menu-item",className:I("group/menu-item relative",e),...t})}var Kr=Er("peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate",{variants:{variant:{default:"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",outline:"bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]"},size:{default:"h-8 text-sm",sm:"h-7 text-xs",lg:"h-12 text-sm group-data-[collapsible=icon]:p-0!"}},defaultVariants:{variant:"default",size:"default"}});function st({asChild:e=!1,isActive:t=!1,variant:a="default",size:o="default",tooltip:r,className:i,...s}){let n=e?_a.Root:"button",{isMobile:l,state:c}=xe(),f=x(n,{"data-slot":"sidebar-menu-button","data-sidebar":"menu-button","data-size":o,"data-active":t,className:I(Kr({variant:a,size:o}),i),...s});return r?(typeof r=="string"&&(r={children:r}),Fe(Ba,{children:[x(La,{asChild:!0,children:f}),x(Ea,{side:"right",align:"center",hidden:c!=="collapsed"||l,...r})]})):f}function qa({className:e,...t}){return x("ul",{"data-slot":"sidebar-menu-sub","data-sidebar":"menu-sub",className:I("mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden",e),...t})}function Wa({className:e,...t}){return x("li",{"data-slot":"sidebar-menu-sub-item","data-sidebar":"menu-sub-item",className:I("group/menu-sub-item relative",e),...t})}function Xa({asChild:e=!1,size:t="md",isActive:a=!1,className:o,...r}){let i=e?_a.Root:"a";return x(i,{"data-slot":"sidebar-menu-sub-button","data-sidebar":"menu-sub-button","data-size":t,"data-active":a,className:I("flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",o),...r})}import{jsx as b,jsxs as oe}from"react/jsx-runtime";function Et({nav:e,appName:t="LinkFox",appSubtitle:a,version:o}){let r=Ur(),i=Ee(e,r),{isMobile:s,setOpenMobile:n}=xe();return oe(Oa,{collapsible:"icon",children:[b(Ka,{children:b(Bt,{children:b(it,{children:b(st,{size:"lg",asChild:!0,children:oe(Lt,{href:"/",children:[b("div",{className:"flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary font-semibold text-sidebar-primary-foreground",children:"LF"}),oe("div",{className:"flex flex-col gap-0.5 leading-none",children:[oe("span",{className:"flex items-center gap-1.5 font-medium",children:[t,o?b("span",{className:"rounded border px-1 text-[10px] leading-4 font-normal text-muted-foreground tabular-nums",children:o}):null]}),a?b("span",{className:"text-xs text-muted-foreground",children:a}):null]})]})})})})}),b(Ua,{children:b(Za,{children:b(Bt,{children:e.map(l=>{if(l.items.length===1){let c=l.items[0];return b(it,{children:b(st,{tooltip:l.title,isActive:i?.group===l,asChild:!0,children:oe(Lt,{href:c.href,onClick:()=>s&&n(!1),children:[b(l.icon,{}),b("span",{children:l.title})]})})},l.title)}return b(ge,{asChild:!0,defaultOpen:!0,className:"group/collapsible",children:oe(it,{children:[b(be,{asChild:!0,children:oe(st,{tooltip:l.title,isActive:i?.group===l,children:[b(l.icon,{}),b("span",{children:l.title}),b(Zr,{className:"ml-auto transition-transform group-data-[state=open]/collapsible:rotate-90"})]})}),b(ve,{children:b(qa,{children:l.items.map(c=>b(Wa,{children:b(Xa,{asChild:!0,isActive:i?.item===c,children:b(Lt,{href:c.href,onClick:()=>s&&n(!1),children:b("span",{children:c.title})})})},c.href))})})]})},l.title)})})})}),b($a,{})]})}import{useEffect as Ft,useRef as Ot,useState as ne}from"react";import{BotIcon as nn,CheckCircle2Icon as sn,ChevronDownIcon as ln,ExternalLinkIcon as dn,FileTextIcon as cn,MessageCirclePlusIcon as Qa,SendIcon as pn,SparklesIcon as eo,SquareIcon as mn,TableIcon as un,Trash2Icon as fn,XCircleIcon as gn,XIcon as to}from"lucide-react";import qr from"react-markdown";import Wr from"remark-gfm";import{jsx as he}from"react/jsx-runtime";function _(e,t){function a({node:o,...r}){return he(e,{className:t,...r})}return a}var Xr={p:_("p","my-1.5 leading-relaxed"),ul:_("ul","my-1.5 list-disc pl-5"),ol:_("ol","my-1.5 list-decimal pl-5"),li:_("li","my-0.5"),h1:_("h3","mt-3 mb-1 font-semibold"),h2:_("h3","mt-3 mb-1 font-semibold"),h3:_("h4","mt-2 mb-1 font-semibold"),a:({href:e,children:t})=>he("a",{href:e,target:"_blank",rel:"noopener noreferrer",className:"break-all text-primary underline underline-offset-2",children:t}),code:_("code","rounded bg-muted px-1 py-0.5 font-mono text-xs"),pre:_("pre","my-2 overflow-x-auto rounded-md bg-muted p-2 text-xs [&_code]:bg-transparent [&_code]:p-0"),table:({children:e})=>he("div",{className:"my-2 overflow-x-auto rounded-md border",children:he("table",{className:"w-full text-xs",children:e})}),th:_("th","border-b bg-muted px-2 py-1 text-left font-medium whitespace-nowrap"),td:_("td","border-b px-2 py-1 align-top"),blockquote:_("blockquote","my-2 border-l-2 pl-3 text-muted-foreground")};function _t({children:e}){return he("div",{className:"text-sm break-words",children:he(qr,{remarkPlugins:[Wr],components:Xr,children:e})})}import{cn as re}from"cn";import{Select as L}from"radix-ui";import{ChevronDownIcon as Ja,CheckIcon as Jr,ChevronUpIcon as Yr}from"lucide-react";import{jsx as R,jsxs as Gt}from"react/jsx-runtime";function lt({...e}){return R(L.Root,{"data-slot":"select",...e})}function Ya({className:e,...t}){return R(L.Group,{"data-slot":"select-group",className:re("scroll-my-1 p-1",e),...t})}function dt({...e}){return R(L.Value,{"data-slot":"select-value",...e})}function ct({className:e,size:t="default",children:a,...o}){return Gt(L.Trigger,{"data-slot":"select-trigger","data-size":t,className:re("flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...o,children:[a,R(L.Icon,{asChild:!0,children:R(Ja,{className:"pointer-events-none size-4 text-muted-foreground"})})]})}function pt({className:e,children:t,position:a="item-aligned",align:o="center",...r}){return R(L.Portal,{children:Gt(L.Content,{"data-slot":"select-content","data-align-trigger":a==="item-aligned",className:re("relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",a==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:a,align:o,...r,children:[R(jr,{}),R(L.Viewport,{"data-position":a,className:re("data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)",a==="popper"&&""),children:t}),R(Qr,{})]})})}function Oe({className:e,children:t,...a}){return Gt(L.Item,{"data-slot":"select-item",className:re("relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",e),...a,children:[R("span",{className:"pointer-events-none absolute right-2 flex size-4 items-center justify-center",children:R(L.ItemIndicator,{children:R(Jr,{className:"pointer-events-none"})})}),R(L.ItemText,{children:t})]})}function jr({className:e,...t}){return R(L.ScrollUpButton,{"data-slot":"select-scroll-up-button",className:re("z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",e),...t,children:R(Yr,{})})}function Qr({className:e,...t}){return R(L.ScrollDownButton,{"data-slot":"select-scroll-down-button",className:re("z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",e),...t,children:R(Ja,{})})}import{cn as en}from"cn";import{Loader2Icon as tn}from"lucide-react";import{jsx as an}from"react/jsx-runtime";function Y({className:e,...t}){return an(tn,{"data-slot":"spinner",role:"status","aria-label":"Loading",className:en("size-4 animate-spin",e),...t})}import{cn as on}from"cn";import{jsx as rn}from"react/jsx-runtime";function ja({className:e,...t}){return rn("textarea",{"data-slot":"textarea",className:on("flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",e),...t})}import{cn as bn}from"cn";import{Fragment as yn,jsx as d,jsxs as h}from"react/jsx-runtime";var vn=["介绍一下这个应用现在能做什么","帮我梳理接下来可以加哪些功能"],xn="例如:帮我把当前页面的数据按状态汇总一下",ao=e=>Tt.find(t=>t.id===e)?.name??e;function Vt({suggestions:e}){let{open:t,setOpen:a,page:o}=zt(),[r,i]=ne(),[s,n]=ne([]),[l,c]=ne(""),[f,k]=ne("default"),[w,S]=ne(!0),[C,v]=ne(""),P=Ot(null),g=Ot(null),y=Ot(null),q=s.some(m=>m.running),Pt=!!o&&(!!o.table||o.records.length>0),Qe=()=>v("");Ft(()=>{!t||r||va()?.getNotebook().then(m=>i({notebookId:m.notebookId,name:m.name})).catch(()=>{})},[t,r]);let kt=o?`${o.table?.id}:${o.records.map(m=>m.id).join(",")}`:"",[mr,ur]=ne(kt);kt!==mr&&(ur(kt),S(!0)),Ft(()=>{y.current?.scrollIntoView({block:"end"})},[s]),Ft(()=>()=>P.current?.abort(),[]);let et=(m,Le)=>n(tt=>tt.map(W=>W.id===m?{...W,...Le}:W)),aa=async(m=l)=>{let Le=m.trim();if(!Le||q)return;let tt=w&&Pt?o:null,W=crypto.randomUUID(),St=C;n(F=>[...F,{id:W,input:Le,context:tt,modelId:f,running:!0,followUp:!!St}]),c("");let Rt=new AbortController;P.current=Rt,g.current=null;try{let F=await ba(Na(Le,St?null:tt,r),f,{signal:Rt.signal,sessionId:St||void 0,onUpdate:at=>{g.current=at.messageId,at.sessionId&&v(at.sessionId),et(W,{task:at})}});F.sessionId&&v(F.sessionId),et(W,{task:F,running:!1,error:F.stopReason==="end_turn"?void 0:`任务异常结束(${F.stopReason})`}),window.dispatchEvent(new Event(ya));let oa=await ga(F.messageId);oa&&et(W,{shareUrl:oa})}catch(F){et(W,{running:!1,error:ra(F)?"已停止":na(F)})}finally{P.current===Rt&&(P.current=null)}},fr=()=>{let m=g.current;P.current?.abort(),m&&fa(m).catch(()=>{})},gr=e?.items??[],br=(o?gr.find(m=>o.source.endsWith(m.match))?.items:void 0)??e?.fallback??vn;return h("aside",{"aria-label":"LinkFox OS 助手",className:bn("z-40 flex flex-col border-l bg-background","fixed inset-0 md:sticky md:top-0 md:h-svh md:w-1/4 md:min-w-90 md:shrink-0 md:self-start",!t&&"hidden"),children:[h("header",{className:"flex h-14 shrink-0 items-center gap-2 border-b px-3",children:[d(eo,{className:"size-4 text-primary"}),d("span",{className:"font-medium",children:"LinkFox OS"}),h(lt,{value:f,onValueChange:m=>{k(m),Qe()},disabled:q,children:[d(ct,{size:"sm",className:"ml-auto w-32","aria-label":"选择 Agent",children:d(dt,{})}),d(pt,{align:"end",children:Tt.map(m=>d(Oe,{value:m.id,children:m.name},m.id))})]}),d(p,{variant:"ghost",size:"icon-sm","aria-label":"开新对话(不保留上下文)",title:"开新对话:下一条消息不再续接当前会话",disabled:q||!C,onClick:Qe,children:d(Qa,{})}),d(p,{variant:"ghost",size:"icon-sm","aria-label":"清空对话",disabled:q||!s.length,onClick:()=>{n([]),Qe()},children:d(fn,{})}),d(p,{variant:"ghost",size:"icon-sm","aria-label":"关闭助手",onClick:()=>a(!1),children:d(to,{})})]}),h("div",{className:"min-h-0 flex-1 overflow-y-auto overscroll-contain px-3 py-3",children:[s.length===0?h("div",{className:"flex flex-col gap-3 py-6 text-sm text-muted-foreground",children:[h("div",{className:"flex items-center gap-2 text-foreground",children:[d(nn,{className:"size-5"}),d("span",{className:"font-medium",children:"让 LinkFox 帮你干活"})]}),d("p",{children:"描述你要完成的事,LinkFox OS 会自己调用选品、数据查询、生图、多维表等技能去执行。勾选的记录会自动带上。"}),d("div",{className:"flex flex-col gap-2",children:br.map(m=>d("button",{type:"button",className:"rounded-lg border px-3 py-2 text-left text-foreground transition-colors hover:bg-muted",onClick:()=>c(m),children:m},m))})]}):d("div",{className:"flex flex-col gap-4",children:s.map(m=>d(Cn,{item:m,notebook:r},m.id))}),d("div",{ref:y})]}),h("div",{className:"shrink-0 border-t p-3",children:[C?h("div",{className:"mb-2 flex items-center gap-2 text-xs text-muted-foreground",children:[d(Qa,{className:"size-3.5 shrink-0"}),h("span",{className:"min-w-0 flex-1",children:["接着上一轮聊(",ao(f)," 记得前面的内容,可以直接追问)"]}),d("button",{type:"button",className:"shrink-0 text-primary underline-offset-2 hover:underline",onClick:Qe,children:"开新对话"})]}):h(yn,{children:[Pt&&w&&o&&d(hn,{context:o,notebook:r,onRemove:()=>S(!1)}),Pt&&!w&&d("button",{type:"button",className:"mb-2 text-xs text-primary underline-offset-2 hover:underline",onClick:()=>S(!0),children:"重新带入当前页面的数据表和勾选记录"})]}),h("div",{className:"flex items-end gap-2",children:[d(ja,{value:l,onChange:m=>c(m.target.value),onKeyDown:m=>{m.key==="Enter"&&!m.shiftKey&&!m.nativeEvent.isComposing&&(m.preventDefault(),aa())},placeholder:C?"接着问,例如:把第 3 条展开说说 / 换个角度再看一遍":e?.placeholder??xn,"aria-label":"告诉 LinkFox 要做什么",className:"max-h-40 min-h-16 resize-none"}),q?d(p,{size:"icon",variant:"outline","aria-label":"停止",onClick:fr,children:d(mn,{})}):d(p,{size:"icon","aria-label":"发送",disabled:!l.trim(),onClick:()=>aa(),children:d(pn,{})})]}),d("p",{className:"mt-2 text-xs text-muted-foreground",children:"执行会消耗 LinkFox 算力。Enter 发送,Shift+Enter 换行。"})]})]})}function hn({context:e,notebook:t,onRemove:a}){let o=e.records.length;return h(ge,{className:"mb-2 rounded-lg border bg-muted/40 text-xs",children:[h("div",{className:"flex items-center gap-2 px-2.5 py-2",children:[d(un,{className:"size-3.5 shrink-0 text-muted-foreground"}),h("div",{className:"min-w-0 flex-1",children:[e.table&&h("div",{className:"truncate",children:[t?`${t.name} / `:"",e.table.name]}),d("div",{className:"text-muted-foreground",children:o?`已勾选 ${o} 条记录,将一并发送`:`当前页面:${e.source}`})]}),o>0&&d(be,{asChild:!0,children:d(p,{variant:"ghost",size:"icon-xs","aria-label":"查看勾选记录",className:"[&[data-state=open]>svg]:rotate-180",children:d(ln,{})})}),d(p,{variant:"ghost",size:"icon-xs","aria-label":"不带入上下文",onClick:a,children:d(to,{})})]}),o>0&&d(ve,{children:d("ul",{className:"max-h-32 overflow-y-auto border-t px-2.5 py-1.5",children:e.records.map(r=>d("li",{className:"truncate py-0.5",title:r.label,children:r.label},r.id))})})]})}function Cn({item:e,notebook:t}){let{task:a,context:o}=e,r=a?.steps??[];return h("div",{className:"flex flex-col gap-2",children:[h("div",{className:"ml-6 self-end rounded-lg bg-primary px-3 py-2 text-sm whitespace-pre-wrap text-primary-foreground",children:[e.input,o&&h("div",{className:"mt-1.5 border-t border-primary-foreground/20 pt-1.5 text-xs opacity-80",children:[o.table?`${t?`${t.name} / `:""}${o.table.name}`:o.source,o.records.length?` · 勾选 ${o.records.length} 条`:""]})]}),h("div",{className:"mr-2 flex flex-col gap-2 rounded-lg border px-3 py-2",children:[h("div",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",children:[d("span",{children:ao(e.modelId)}),e.followUp&&d("span",{className:"rounded bg-muted px-1.5 py-0.5",children:"接上一轮"})]}),r.length>0&&d("ul",{className:"flex flex-col gap-1 text-xs",children:r.map(i=>h("li",{className:"flex items-center gap-1.5",children:[i.status==="running"?d(Y,{className:"size-3"}):i.status==="failed"?d(gn,{className:"size-3 text-destructive"}):d(sn,{className:"size-3 text-emerald-600"}),d("span",{className:"truncate",children:i.status==="running"?`正在调用 ${i.title}`:i.title})]},i.id))}),a?.text?d(_t,{children:a.text}):e.running&&h("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[d(Y,{})," ",a?"LinkFox 正在处理…":"正在提交任务…"]}),a&&a.files.length>0&&d("ul",{className:"flex flex-col gap-1",children:a.files.map(i=>d("li",{children:h("a",{href:i.uri,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1.5 text-xs text-primary underline-offset-2 hover:underline",children:[d(cn,{className:"size-3.5 shrink-0"}),d("span",{className:"truncate",children:i.name})]})},i.uri))}),e.error&&d("div",{className:"text-sm text-destructive",children:e.error}),e.shareUrl&&h("a",{href:e.shareUrl,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 self-start text-xs text-muted-foreground underline-offset-2 hover:text-foreground hover:underline",children:["查看完整过程 ",d(dn,{className:"size-3"})]})]})]})}function $t(){let{open:e,setOpen:t}=zt();return h(p,{variant:e?"secondary":"default",size:"sm",onClick:()=>t(a=>!a),"aria-expanded":e,"aria-label":"让LinkFox帮你干活",children:[d(eo,{}),d("span",{className:"hidden sm:inline",children:"让LinkFox帮你干活"})]})}import{useMemo as Rn,useState as Tn}from"react";import{CheckIcon as go,GlobeIcon as In}from"lucide-react";import{Command as we}from"cmdk";import{cn as Ne}from"cn";import{cva as oo}from"class-variance-authority";import{cn as Ve}from"cn";import{jsx as $e}from"react/jsx-runtime";function Ce({className:e,...t}){return $e("div",{"data-slot":"input-group",role:"group",className:Ve("group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5",e),...t})}var wn=oo("flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4",{variants:{align:{"inline-start":"order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]","inline-end":"order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]","block-start":"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2","block-end":"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2"}},defaultVariants:{align:"inline-start"}});function ye({className:e,align:t="inline-start",...a}){return $e("div",{role:"group","data-slot":"input-group-addon","data-align":t,className:Ve(wn({align:t}),e),onClick:o=>{o.target.closest("button")||o.currentTarget.parentElement?.querySelector("input")?.focus()},...a})}var Nn=oo("flex items-center gap-2 text-sm shadow-none",{variants:{size:{xs:"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5",sm:"","icon-xs":"size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0","icon-sm":"size-8 p-0 has-[>svg]:p-0"}},defaultVariants:{size:"xs"}});function ro({className:e,type:t="button",variant:a="ghost",size:o="xs",...r}){return $e(p,{type:t,"data-size":o,variant:a,className:Ve(Nn({size:o}),e),...r})}function no({className:e,...t}){return $e("span",{className:Ve("flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",e),...t})}function mt({className:e,...t}){return $e(te,{"data-slot":"input-group-control",className:Ve("flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent",e),...t})}import{SearchIcon as Pn,CheckIcon as kn}from"lucide-react";import{jsx as X,jsxs as po}from"react/jsx-runtime";function io({className:e,...t}){return X(we,{"data-slot":"command",className:Ne("flex size-full flex-col overflow-hidden rounded-xl! bg-popover p-1 text-popover-foreground",e),...t})}function so({className:e,...t}){return X("div",{"data-slot":"command-input-wrapper",className:"p-1 pb-0",children:po(Ce,{className:"h-8! rounded-lg! border-input/30 bg-input/30 shadow-none! *:data-[slot=input-group-addon]:pl-2!",children:[X(we.Input,{"data-slot":"command-input",className:Ne("w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50",e),...t}),X(ye,{children:X(Pn,{className:"size-4 shrink-0 opacity-50"})})]})})}function lo({className:e,...t}){return X(we.List,{"data-slot":"command-list",className:Ne("no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none",e),...t})}function co({className:e,...t}){return X(we.Empty,{"data-slot":"command-empty",className:Ne("py-6 text-center text-sm",e),...t})}function ut({className:e,...t}){return X(we.Group,{"data-slot":"command-group",className:Ne("overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground",e),...t})}function Ht({className:e,children:t,...a}){return po(we.Item,{"data-slot":"command-item",className:Ne("group/command-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-lg! data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-selected:*:[svg]:text-foreground",e),...a,children:[t,X(kn,{className:"ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100"})]})}import{cn as Sn}from"cn";import{Popover as ft}from"radix-ui";import{jsx as gt}from"react/jsx-runtime";function mo({...e}){return gt(ft.Root,{"data-slot":"popover",...e})}function uo({...e}){return gt(ft.Trigger,{"data-slot":"popover-trigger",...e})}function fo({className:e,align:t="center",sideOffset:a=4,...o}){return gt(ft.Portal,{children:gt(ft.Content,{"data-slot":"popover-content",align:t,sideOffset:a,className:Sn("z-50 flex w-72 origin-(--radix-popover-content-transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",e),...o})})}import{cn as bo}from"cn";import{jsx as B,jsxs as ie}from"react/jsx-runtime";var Kt=["Asia/Shanghai","America/Los_Angeles","America/New_York","Europe/London","Europe/Berlin","Asia/Tokyo","UTC"];function zn(){try{return Intl.supportedValuesOf("timeZone")}catch{return Kt}}function Ut(){let[e,t]=Tn(!1),a=ha(),o=Ca(),r=Rn(()=>e?zn().filter(n=>!Kt.includes(n)).map(n=>({zone:n,offset:rt(n)})):[],[e]),i=n=>{xa(n),t(!1)},s=(n,l=rt(n))=>ie(Ht,{value:`${n} ${l}`,onSelect:()=>i(n),children:[B(go,{className:bo(!o&&n===a?"opacity-100":"opacity-0")}),B("span",{className:"truncate",children:n}),B("span",{className:"ml-auto text-xs text-muted-foreground",children:l})]},n);return ie(mo,{open:e,onOpenChange:t,children:[B(uo,{asChild:!0,children:ie(p,{variant:"outline",size:"sm","aria-label":"选择时区",children:[B(In,{"data-icon":"inline-start"}),B("span",{className:"hidden max-w-40 truncate sm:inline",children:a}),B("span",{className:"text-muted-foreground",children:rt(a)})]})}),B(fo,{align:"end",className:"w-80 p-0",children:ie(io,{children:[B(so,{placeholder:"搜索时区,如 Shanghai、UTC+08"}),ie(lo,{children:[B(co,{children:"没有匹配的时区"}),B(ut,{heading:"默认",children:ie(Ht,{value:`跟随浏览器 ${It()}`,onSelect:()=>i(null),children:[B(go,{className:bo(o?"opacity-100":"opacity-0")}),ie("span",{className:"truncate",children:["跟随浏览器(",It(),")"]})]})}),B(ut,{heading:"常用",children:Kt.map(n=>s(n))}),B(ut,{heading:"全部",children:r.map(n=>s(n.zone,n.offset))})]})]})})]})}import{LogOutIcon as Mn,UserIcon as Bn}from"lucide-react";import{cn as He}from"cn";import{DropdownMenu as H}from"radix-ui";import{CheckIcon as Dn,ChevronRightIcon as Wl}from"lucide-react";import{jsx as O,jsxs as An}from"react/jsx-runtime";function Pe({...e}){return O(H.Root,{"data-slot":"dropdown-menu",...e})}function ke({...e}){return O(H.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}function Se({className:e,align:t="start",sideOffset:a=4,...o}){return O(H.Portal,{children:O(H.Content,{"data-slot":"dropdown-menu-content",sideOffset:a,align:t,className:He("z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) min-w-32 origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",e),...o})})}function Ke({...e}){return O(H.Group,{"data-slot":"dropdown-menu-group",...e})}function se({className:e,inset:t,variant:a="default",...o}){return O(H.Item,{"data-slot":"dropdown-menu-item","data-inset":t,"data-variant":a,className:He("group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",e),...o})}function vo({className:e,children:t,checked:a,inset:o,...r}){return An(H.CheckboxItem,{"data-slot":"dropdown-menu-checkbox-item","data-inset":o,className:He("relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),checked:a,...r,children:[O("span",{className:"pointer-events-none absolute right-2 flex items-center justify-center","data-slot":"dropdown-menu-checkbox-item-indicator",children:O(H.ItemIndicator,{children:O(Dn,{})})}),t]})}function Ue({className:e,inset:t,...a}){return O(H.Label,{"data-slot":"dropdown-menu-label","data-inset":t,className:He("px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7",e),...a})}function bt({className:e,...t}){return O(H.Separator,{"data-slot":"dropdown-menu-separator",className:He("-mx-1 my-1 h-px bg-border",e),...t})}import{Fragment as Ln,jsx as Re,jsxs as Ze}from"react/jsx-runtime";function Zt(){let e=ot();return e.status!=="ready"?null:Ze(Pe,{children:[Re(ke,{asChild:!0,children:Re(p,{variant:"ghost",size:"icon","aria-label":"账号",children:Re(Bn,{})})}),Ze(Se,{align:"end",children:[Re(Ue,{children:e.userName||"LinkFox 用户"}),e.apiKey&&Ze(Ue,{className:"font-normal text-muted-foreground",children:["API Key:",ua(e.apiKey)]}),!e.apiKey&&Ze(Ln,{children:[Re(bt,{}),Ze(se,{onSelect:ma,children:[Re(Mn,{}),"退出登录"]})]})]})]})}import{cn as Te}from"cn";import{Slot as En}from"radix-ui";import{ChevronRightIcon as _n,MoreHorizontalIcon as id}from"lucide-react";import{jsx as le,jsxs as ld}from"react/jsx-runtime";function xo({className:e,...t}){return le("nav",{"aria-label":"breadcrumb","data-slot":"breadcrumb",className:Te(e),...t})}function ho({className:e,...t}){return le("ol",{"data-slot":"breadcrumb-list",className:Te("flex flex-wrap items-center gap-1.5 text-sm wrap-break-word text-muted-foreground",e),...t})}function qt({className:e,...t}){return le("li",{"data-slot":"breadcrumb-item",className:Te("inline-flex items-center gap-1",e),...t})}function Co({asChild:e,className:t,...a}){let o=e?En.Root:"a";return le(o,{"data-slot":"breadcrumb-link",className:Te("transition-colors hover:text-foreground",t),...a})}function yo({className:e,...t}){return le("span",{"data-slot":"breadcrumb-page",role:"link","aria-disabled":"true","aria-current":"page",className:Te("font-normal text-foreground",e),...t})}function wo({children:e,className:t,...a}){return le("li",{"data-slot":"breadcrumb-separator",role:"presentation","aria-hidden":"true",className:Te("[&>svg]:size-3.5",t),...a,children:e??le(_n,{})})}import{jsx as T,jsxs as qe}from"react/jsx-runtime";function Vn({children:e,nav:t,appName:a,appSubtitle:o,version:r,suggestions:i}){let s=On(),n=Ee(t,s),l=n?[...new Set([n.group.title,n.item.title])]:[];return T(wa,{children:qe(Fa,{children:[T(Et,{nav:t,appName:a,appSubtitle:o,version:r}),qe(Ha,{className:"min-w-0",children:[qe("header",{className:"sticky top-0 z-10 flex h-14 shrink-0 items-center gap-2 border-b bg-background px-4",children:[T(Va,{className:"-ml-1"}),T(Ra,{orientation:"vertical",className:"mr-2 data-[orientation=vertical]:h-4"}),T(xo,{className:"min-w-0 flex-1",children:qe(ho,{children:[T(qt,{className:"hidden md:inline-flex",children:T(Co,{asChild:!0,children:T(Fn,{href:"/",children:"首页"})})}),l.map((c,f)=>qe(Gn,{children:[T(wo,{className:f===0?"hidden md:block":void 0}),T(qt,{className:f<l.length-1?"hidden md:inline-flex":void 0,children:f===l.length-1?T(yo,{children:c}):T("span",{children:c})})]},c))]})}),T($t,{}),T(Ut,{}),T(Zt,{})]}),T("main",{className:"flex min-w-0 flex-1 flex-col gap-4 p-4",children:e})]}),T(Vt,{suggestions:i})]})})}import{useEffect as Kn}from"react";import{CircleAlertIcon as Un,LogInIcon as Io,RotateCwIcon as Zn}from"lucide-react";import{cva as $n}from"class-variance-authority";import{cn as Ie}from"cn";import{jsx as ze}from"react/jsx-runtime";function No({className:e,...t}){return ze("div",{"data-slot":"empty",className:Ie("flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-xl border-dashed p-6 text-center text-balance",e),...t})}function Po({className:e,...t}){return ze("div",{"data-slot":"empty-header",className:Ie("flex max-w-sm flex-col items-center gap-2",e),...t})}var Hn=$n("mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0",{variants:{variant:{default:"bg-transparent",icon:"flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-4"}},defaultVariants:{variant:"default"}});function ko({className:e,variant:t="default",...a}){return ze("div",{"data-slot":"empty-icon","data-variant":t,className:Ie(Hn({variant:t,className:e})),...a})}function So({className:e,...t}){return ze("div",{"data-slot":"empty-title",className:Ie("font-heading text-sm font-medium tracking-tight",e),...t})}function Ro({className:e,...t}){return ze("div",{"data-slot":"empty-description",className:Ie("text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",e),...t})}function To({className:e,...t}){return ze("div",{"data-slot":"empty-content",className:Ie("flex w-full max-w-sm min-w-0 flex-col items-center gap-2.5 text-sm text-balance",e),...t})}import{jsx as G,jsxs as vt}from"react/jsx-runtime";function qn({children:e}){let t=ot();if(Kn(()=>{da()},[]),t.status==="ready")return e;let a=t.status==="redirecting"&&t.auto;if(t.status==="loading"||t.status==="callback"||a)return vt("div",{className:"flex min-h-svh items-center justify-center gap-2",role:"status",children:[G(Y,{}),G("span",{children:t.status==="callback"?"正在完成登录…":a?"正在跳转登录…":"正在准备登录…"})]});let o=t.status==="error",r=t.status==="redirecting";return G("div",{className:"flex min-h-svh items-center justify-center bg-muted p-4",children:vt(No,{className:"max-w-md bg-background",children:[vt(Po,{children:[G(ko,{variant:"icon",children:o?G(Un,{}):G(Io,{})}),G(So,{children:o?"无法进入选品工作台":"登录 LinkFox"}),G(Ro,{children:o?t.message:"使用 LinkFox 账号登录,登录状态将在此浏览器中保留至到期或退出。"})]}),G(To,{children:vt(p,{disabled:r,onClick:o&&t.action==="config"?()=>{ca()}:()=>{pa()},children:[r?G(Y,{"data-icon":"inline-start"}):o?G(Zn,{"data-icon":"inline-start"}):G(Io,{"data-icon":"inline-start"}),r?"正在跳转…":o?"重试":"登录 LinkFox"]})})]})})}import*as zo from"react";import{ThemeProvider as Wn,useTheme as Xn}from"next-themes";import{jsx as Qn,jsxs as ei}from"react/jsx-runtime";function Jn({children:e,...t}){return ei(Wn,{attribute:"class",defaultTheme:"system",enableSystem:!0,disableTransitionOnChange:!0,...t,children:[Qn(jn,{}),e]})}function Yn(e){return e instanceof HTMLElement?e.isContentEditable||e.tagName==="INPUT"||e.tagName==="TEXTAREA"||e.tagName==="SELECT":!1}function jn(){let{resolvedTheme:e,setTheme:t}=Xn();return zo.useEffect(()=>{function a(o){o.defaultPrevented||o.repeat||o.metaKey||o.ctrlKey||o.altKey||o.key.toLowerCase()==="d"&&(Yn(o.target)||t(e==="dark"?"light":"dark"))}return window.addEventListener("keydown",a),()=>{window.removeEventListener("keydown",a)}},[e,t]),null}import{cn as ti}from"cn";import{Checkbox as Do}from"radix-ui";import{CheckIcon as ai}from"lucide-react";import{jsx as Wt}from"react/jsx-runtime";function de({className:e,...t}){return Wt(Do.Root,{"data-slot":"checkbox",className:ti("peer relative flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input transition-colors outline-none group-has-disabled/field:opacity-50 group-has-[:focus-visible]/field-label:ring-0 group-has-[:focus-visible]/field-label:not-data-checked:border-input after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground group-has-[:focus-visible]/field-label:data-checked:border-primary dark:data-checked:bg-primary",e),...t,children:Wt(Do.Indicator,{"data-slot":"checkbox-indicator",className:"grid place-content-center text-current transition-none [&>svg]:size-3.5",children:Wt(ai,{})})})}import{cn as De}from"cn";import{jsx as ce}from"react/jsx-runtime";function Ao({className:e,...t}){return ce("div",{"data-slot":"table-container",className:"relative w-full overflow-x-auto",children:ce("table",{"data-slot":"table",className:De("w-full caption-bottom text-sm",e),...t})})}function Mo({className:e,...t}){return ce("thead",{"data-slot":"table-header",className:De("[&_tr]:border-b",e),...t})}function Bo({className:e,...t}){return ce("tbody",{"data-slot":"table-body",className:De("[&_tr:last-child]:border-0",e),...t})}function We({className:e,...t}){return ce("tr",{"data-slot":"table-row",className:De("border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted",e),...t})}function xt({className:e,...t}){return ce("th",{"data-slot":"table-head",className:De("h-10 px-2 text-left align-middle font-medium text-foreground [&:has([role=checkbox])]:pr-0",e),...t})}function Ae({className:e,...t}){return ce("td",{"data-slot":"table-cell",className:De("p-2 align-middle break-words [&:has([role=checkbox])]:pr-0",e),...t})}import{cn as ht}from"cn";import{jsx as z,jsxs as Ct}from"react/jsx-runtime";var Lo=56,Eo=120;function oi({columns:e,rows:t,rowKey:a,renderCell:o,actions:r,actionsWidth:i=200,selection:s,onRowClick:n,loading:l,skeletonRows:c=8,empty:f,className:k}){let w=e.length+(s?1:0)+(r?1:0),C={"--dt-min-width":`${e.reduce((v,P)=>v+(P.width??Eo),0)+(s?Lo:0)+(r?i:0)}px`};return Ct(Ao,{style:C,className:ht("lg:[min-width:var(--dt-min-width)] max-lg:block",k),children:[z(Mo,{className:"max-lg:hidden",children:Ct(We,{children:[s&&z(xt,{style:{width:Lo},className:"lg:sticky lg:left-0 lg:z-20 lg:bg-card",children:z(de,{"aria-label":"全选本页",checked:s.pageAllSelected?!0:s.pageSomeSelected?"indeterminate":!1,disabled:!t.length,onCheckedChange:v=>s.onToggleAll(v===!0)})}),e.map(v=>z(xt,{style:{width:v.width??Eo},className:"break-words",children:v.label},v.key)),r&&z(xt,{style:{width:i},className:"text-right lg:sticky lg:right-0 lg:z-20 lg:border-l lg:bg-card",children:"操作"})]})}),Ct(Bo,{className:"max-lg:block",children:[l&&t.length===0?Array.from({length:c},(v,P)=>z(We,{className:"max-lg:block max-lg:border-0",children:z(Ae,{colSpan:w,className:"max-lg:block",children:z(Ma,{className:"h-10 w-full"})})},P)):t.map(v=>{let P=a(v);return Ct(We,{"data-state":s?.selected.has(P)?"selected":void 0,onClick:n?()=>n(v):void 0,className:ht("group/row",l&&"opacity-60",n&&"cursor-pointer","max-lg:mb-3 max-lg:block max-lg:rounded-lg max-lg:border max-lg:p-3"),children:[s&&z(Ae,{className:"max-lg:flex max-lg:items-center max-lg:border-0 max-lg:px-0 max-lg:py-1 lg:sticky lg:left-0 lg:z-10 lg:bg-card lg:group-hover/row:bg-muted",children:z(de,{"aria-label":"选择本行",checked:s.selected.has(P),onCheckedChange:g=>s.onToggleRow(v,g===!0),onClick:g=>g.stopPropagation()})}),e.map(g=>z(Ae,{"data-label":g.label,className:ht("align-top break-words","max-lg:flex max-lg:gap-3 max-lg:border-0 max-lg:px-0 max-lg:py-1","max-lg:before:w-24 max-lg:before:shrink-0 max-lg:before:text-xs max-lg:before:text-muted-foreground","max-lg:before:content-[attr(data-label)]"),children:z("div",{className:"min-w-0 flex-1",children:o(v,g)})},g.key)),r&&z(Ae,{className:ht("align-top text-right max-lg:flex max-lg:justify-end max-lg:border-0 max-lg:px-0 max-lg:py-1","lg:sticky lg:right-0 lg:z-10 lg:border-l lg:bg-card lg:group-hover/row:bg-muted"),children:z("div",{className:"flex justify-end gap-1",onClick:g=>g.stopPropagation(),children:r(v)})})]},P)}),!l&&t.length===0&&f?z(We,{className:"max-lg:block max-lg:border-0 hover:bg-transparent",children:z(Ae,{colSpan:w,className:"whitespace-normal max-lg:block",children:f})}):null]})]})}import{cn as Me}from"cn";import{ChevronLeftIcon as ri,ChevronRightIcon as ni,MoreHorizontalIcon as ii}from"lucide-react";import{jsx as V,jsxs as Xt}from"react/jsx-runtime";function _o({className:e,...t}){return V("nav",{role:"navigation","aria-label":"pagination","data-slot":"pagination",className:Me("mx-auto flex w-full justify-center",e),...t})}function Go({className:e,...t}){return V("ul",{"data-slot":"pagination-content",className:Me("flex items-center gap-0.5",e),...t})}function Xe({...e}){return V("li",{"data-slot":"pagination-item",...e})}function yt({className:e,isActive:t,size:a="icon",...o}){return V(p,{asChild:!0,variant:t?"outline":"ghost",size:a,className:Me(e),children:V("a",{"aria-current":t?"page":void 0,"data-slot":"pagination-link","data-active":t,...o})})}function Fo({className:e,text:t="Previous",...a}){return Xt(yt,{"aria-label":"Go to previous page",size:"default",className:Me("pl-1.5!",e),...a,children:[V(ri,{"data-icon":"inline-start"}),V("span",{className:"hidden sm:block",children:t})]})}function Oo({className:e,text:t="Next",...a}){return Xt(yt,{"aria-label":"Go to next page",size:"default",className:Me("pr-1.5!",e),...a,children:[V("span",{className:"hidden sm:block",children:t}),V(ni,{"data-icon":"inline-end"})]})}function Vo({className:e,...t}){return Xt("span",{"aria-hidden":!0,"data-slot":"pagination-ellipsis",className:Me("flex size-8 items-center justify-center [&_svg:not([class*='size-'])]:size-4",e),...t,children:[V(ii,{}),V("span",{className:"sr-only",children:"More pages"})]})}import{cn as $o}from"cn";import{jsx as K,jsxs as Jt}from"react/jsx-runtime";var Ho=20;function si(e,t){if(t<=7)return Array.from({length:t},(i,s)=>s+1);let a=[1],o=Math.max(2,e-1),r=Math.min(t-1,e+1);o>2&&a.push("…");for(let i=o;i<=r;i++)a.push(i);return r<t-1&&a.push("…"),a.push(t),a}function li({page:e,total:t,disabled:a,onChange:o,pageSize:r=Ho,note:i}){let s=Math.max(1,Math.ceil(t/r)),n=c=>f=>{f.preventDefault(),!(a||c<1||c>s||c===e)&&o(c)},l=c=>$o(c&&"pointer-events-none opacity-50");return Jt("div",{className:"flex flex-col items-center justify-between gap-2 sm:flex-row",children:[Jt("p",{className:"text-sm text-muted-foreground",children:["共 ",t.toLocaleString("zh-CN")," 条,第 ",e,"/",s," 页,每页 ",r," 条",i?K("span",{className:"ml-2",children:i}):null]}),K(_o,{className:"mx-0 w-auto",children:Jt(Go,{children:[K(Xe,{children:K(Fo,{href:"#",text:"上一页","aria-label":"上一页",onClick:n(e-1),className:l(a||e<=1)})}),si(e,s).map((c,f)=>c==="…"?K(Xe,{className:"hidden sm:block",children:K(Vo,{})},`e${f}`):K(Xe,{className:$o(c!==e&&"hidden sm:block"),children:K(yt,{href:"#",isActive:c===e,onClick:n(c),className:l(!!a),children:c})},c)),K(Xe,{children:K(Oo,{href:"#",text:"下一页","aria-label":"下一页",onClick:n(e+1),className:l(a||e>=s)})})]})})]})}import{useState as gi}from"react";import{ChevronDownIcon as bi,RotateCcwIcon as vi,SearchIcon as xi}from"lucide-react";import{ChevronDownIcon as di}from"lucide-react";import{jsx as j,jsxs as Ko}from"react/jsx-runtime";function Yt({id:e,value:t,onChange:a,options:o,placeholder:r,multiple:i}){let s=n=>{if(!i)return a(n);let l=t.split(/[,,、]/).map(c=>c.trim()).filter(Boolean);a(l.includes(n)?l.join(","):[...l,n].join(","))};return Ko(Ce,{children:[j(mt,{id:e,value:t,placeholder:r??"请选择或输入",onChange:n=>a(n.target.value)}),j(ye,{align:"inline-end",children:Ko(Pe,{children:[j(ke,{asChild:!0,children:j(ro,{size:"icon-xs","aria-label":"展开选项",children:j(di,{})})}),j(Se,{align:"end",className:"max-h-72 overflow-y-auto",children:j(Ke,{children:o.map(n=>j(se,{onSelect:()=>s(n.value),children:n.label??n.value},n.value))})})]})})]})}import{cn as Uo}from"cn";import{jsx as Wo}from"react/jsx-runtime";function Zo({className:e,size:t="default",...a}){return Wo("div",{"data-slot":"card","data-size":t,className:Uo("group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",e),...a})}function qo({className:e,...t}){return Wo("div",{"data-slot":"card-content",className:Uo("px-(--card-spacing)",e),...t})}import{useMemo as yc}from"react";import{cva as ui}from"class-variance-authority";import{cn as jt}from"cn";import{cn as ci}from"cn";import{Label as pi}from"radix-ui";import{jsx as mi}from"react/jsx-runtime";function Be({className:e,...t}){return mi(pi.Root,{"data-slot":"label",className:ci("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",e),...t})}import{jsx as ea,jsxs as Sc}from"react/jsx-runtime";function Qt({className:e,...t}){return ea("div",{"data-slot":"field-group",className:jt("group/field-group @container/field-group flex w-full flex-col gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4",e),...t})}var fi=ui("group/field flex w-full gap-2 data-[invalid=true]:text-destructive",{variants:{orientation:{vertical:"flex-col *:w-full [&>.sr-only]:w-auto",horizontal:"flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",responsive:"flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px"}},defaultVariants:{orientation:"vertical"}});function pe({className:e,orientation:t="vertical",...a}){return ea("div",{role:"group","data-slot":"field","data-orientation":t,className:jt(fi({orientation:t}),e),...a})}function me({className:e,...t}){return ea(Be,{"data-slot":"field-label",className:jt("group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border has-[>[data-slot=field]]:not-has-[:disabled,[data-disabled]]:hover:bg-muted/50 has-[>[data-slot=field]]:has-[:focus-visible]:border-ring has-[>[data-slot=field]]:has-[:focus-visible]:ring-3 has-[>[data-slot=field]]:has-[:focus-visible]:ring-ring/50 *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10","has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col",e),...t})}import{cn as Xo}from"cn";import{jsx as u,jsxs as N}from"react/jsx-runtime";var Jo="grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4";function Yo({spec:e,values:t,set:a,currency:o}){let r=`ff-${e.id}`;switch(e.type){case"range":{let i=e.price?o:e.unit,s=(n,l,c)=>N(Ce,{children:[u(mt,{id:n.endsWith("gte")?r:void 0,inputMode:"decimal","aria-label":`${e.label}${c}`,placeholder:l,value:t[n]??"",onChange:f=>a(n,f.target.value)}),i&&u(ye,{align:"inline-end",children:u(no,{children:i})})]});return N(pe,{children:[u(me,{htmlFor:r,children:e.label}),N("div",{className:"flex items-center gap-2",children:[s(`${e.id}.gte`,"最小","最小值"),u("span",{className:"text-muted-foreground",children:"至"}),s(`${e.id}.lte`,"最大","最大值")]})]})}case"dateRange":return N(pe,{children:[u(me,{htmlFor:r,children:e.label}),N("div",{className:"flex items-center gap-2",children:[u(te,{id:r,type:"date","aria-label":`${e.label}开始`,value:t[`${e.id}.gte`]??"",onChange:i=>a(`${e.id}.gte`,i.target.value)}),u("span",{className:"text-muted-foreground",children:"至"}),u(te,{type:"date","aria-label":`${e.label}结束`,value:t[`${e.id}.lte`]??"",onChange:i=>a(`${e.id}.lte`,i.target.value)})]})]});case"text":return N(pe,{children:[u(me,{htmlFor:r,children:e.label}),u(te,{id:r,placeholder:e.placeholder,value:t[e.id]??"",onChange:i=>a(e.id,i.target.value)})]});case"list":return N(pe,{children:[u(me,{htmlFor:r,children:e.label}),e.options?u(Yt,{id:r,placeholder:e.placeholder,value:t[e.id]??"",options:e.options.map(i=>({value:i})),multiple:e.multiple,onChange:i=>a(e.id,i)}):u(te,{id:r,placeholder:e.placeholder,value:t[e.id]??"",onChange:i=>a(e.id,i.target.value)})]});case"flags":{let i=sa(t[e.id]);return N(pe,{children:[u(me,{children:e.label}),u("div",{className:"flex flex-wrap gap-x-4 gap-y-2 pt-1",children:e.options.map(s=>N(Be,{className:"flex items-center gap-2 font-normal",children:[u(de,{checked:i.includes(s.value),onCheckedChange:n=>a(e.id,la(t[e.id],s.value,n===!0))}),s.label]},s.value))})]})}case"bool":case"select":{let i=e.type==="bool"?[{value:"yes",label:"是"},{value:"no",label:"否"}]:e.options,s=e.type==="select"&&e.required,n=s?t[e.id]||i[0]?.value:t[e.id]||"any";return N(pe,{children:[u(me,{htmlFor:r,children:e.label}),N(lt,{value:n,onValueChange:l=>a(e.id,l==="any"?"":l),children:[u(ct,{id:r,className:"w-full",children:u(dt,{})}),u(pt,{children:N(Ya,{children:[!s&&u(Oe,{value:"any",children:"不限"}),i.map(l=>u(Oe,{value:l.value,children:l.label},l.value))]})})]})]})}}}function hi({primary:e,more:t,values:a,onChange:o,onSearch:r,onReset:i,loading:s,currency:n,searchLabel:l="查询",searchIcon:c,disabled:f,prepend:k,append:w,note:S}){let[C,v]=gi(!1),P=(y,q)=>o({...a,[y]:q}),g=t.filter(y=>ia(y).some(q=>a[q])).length;return u(Zo,{children:u(qo,{children:N("form",{onSubmit:y=>{y.preventDefault(),r()},className:"flex flex-col gap-4",children:[N(Qt,{className:Jo,children:[k,e.map(y=>u(Yo,{spec:y,values:a,set:P,currency:n},y.id)),w]}),N(ge,{open:C,onOpenChange:v,children:[u(ve,{children:u(Qt,{className:Xo(Jo,"pb-4"),children:t.map(y=>u(Yo,{spec:y,values:a,set:P,currency:n},y.id))})}),N("div",{className:"flex flex-wrap items-center gap-2",children:[N(p,{type:"submit",disabled:s||f,children:[s?u(Y,{"data-icon":"inline-start"}):c??u(xi,{"data-icon":"inline-start"}),l]}),N(p,{type:"button",variant:"outline",onClick:i,children:[u(vi,{"data-icon":"inline-start"}),"重置"]}),t.length>0&&u(be,{asChild:!0,children:N(p,{type:"button",variant:"ghost",children:["更多条件",g?`(已填 ${g})`:"",u(bi,{"data-icon":"inline-end",className:Xo("transition-transform",C&&"rotate-180")})]})}),S&&u("p",{className:"text-xs text-muted-foreground sm:ml-auto",children:S})]})]})]})})})}import{Columns3Icon as Ci}from"lucide-react";import{jsx as ue,jsxs as Je}from"react/jsx-runtime";function yi({columns:e,visible:t,onChange:a,onReset:o}){return Je(Pe,{children:[ue(ke,{asChild:!0,children:Je(p,{variant:"outline",size:"sm",children:[ue(Ci,{"data-icon":"inline-start"}),"列设置"]})}),Je(Se,{align:"end",className:"max-h-96 w-56 overflow-y-auto",children:[Je(Ue,{children:["显示的列(",t.length,"/",e.length,")"]}),Je(Ke,{children:[ue(se,{onSelect:r=>(r.preventDefault(),o()),children:"恢复默认"}),ue(se,{onSelect:r=>(r.preventDefault(),a(e.map(i=>i.key))),children:"全部显示"})]}),ue(bt,{}),ue(Ke,{children:e.map(r=>ue(vo,{checked:t.includes(r.key),onSelect:i=>i.preventDefault(),onCheckedChange:i=>a(i?e.map(s=>s.key).filter(s=>s===r.key||t.includes(s)):t.filter(s=>s!==r.key)),children:r.label},r.key))})]})]})}import{useState as ki}from"react";import{cn as Q}from"cn";import{AlertDialog as ee}from"radix-ui";import{jsx as E,jsxs as Pi}from"react/jsx-runtime";function jo({...e}){return E(ee.Root,{"data-slot":"alert-dialog",...e})}function wi({...e}){return E(ee.Portal,{"data-slot":"alert-dialog-portal",...e})}function Ni({className:e,...t}){return E(ee.Overlay,{"data-slot":"alert-dialog-overlay",className:Q("fixed inset-0 z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",e),...t})}function Qo({className:e,size:t="default",...a}){return Pi(wi,{children:[E(Ni,{}),E(ee.Content,{"data-slot":"alert-dialog-content","data-size":t,className:Q("group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none max-w-[calc(100%-2rem)] sm:max-w-sm data-[size=sm]:sm:max-w-xs data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",e),...a})]})}function er({className:e,...t}){return E("div",{"data-slot":"alert-dialog-header",className:Q("grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-4 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]",e),...t})}function tr({className:e,...t}){return E("div",{"data-slot":"alert-dialog-footer",className:Q("-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end",e),...t})}function ar({className:e,...t}){return E(ee.Title,{"data-slot":"alert-dialog-title",className:Q("font-heading text-base font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2",e),...t})}function or({className:e,...t}){return E(ee.Description,{"data-slot":"alert-dialog-description",className:Q("text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",e),...t})}function rr({className:e,variant:t="default",size:a="default",...o}){return E(p,{variant:t,size:a,asChild:!0,children:E(ee.Action,{"data-slot":"alert-dialog-action",className:Q(e),...o})})}function nr({className:e,variant:t="outline",size:a="default",...o}){return E(p,{variant:t,size:a,asChild:!0,children:E(ee.Cancel,{"data-slot":"alert-dialog-cancel",className:Q(e),...o})})}import{jsx as J,jsxs as wt}from"react/jsx-runtime";function Si({open:e,onOpenChange:t,title:a,description:o,details:r,requireCheck:i,confirmLabel:s="确认",cancelLabel:n="取消",destructive:l,busy:c,onConfirm:f}){let[k,w]=ki(!1),S=!!i&&!k;return J(jo,{open:e,onOpenChange:C=>{C||w(!1),t(C)},children:wt(Qo,{children:[wt(er,{children:[J(ar,{children:a}),o&&J(or,{children:o})]}),r?.length?J("ul",{className:"list-disc space-y-1 pl-5 text-sm text-muted-foreground",children:r.map((C,v)=>J("li",{children:C},v))}):null,i&&wt(Be,{className:"flex items-start gap-2 text-sm font-normal",children:[J(de,{checked:k,onCheckedChange:C=>w(C===!0),className:"mt-0.5"}),J("span",{children:i})]}),wt(tr,{children:[J(nr,{children:n}),J(rr,{variant:l?"destructive":void 0,disabled:c||S,onClick:C=>{C.preventDefault(),!S&&f()},children:s})]})]})})}import{cva as Ri}from"class-variance-authority";import{cn as Ti}from"cn";import{Slot as Ii}from"radix-ui";import{jsx as Di}from"react/jsx-runtime";var zi=Ri("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",secondary:"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",destructive:"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",outline:"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",ghost:"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",link:"text-primary underline-offset-4 hover:underline"}},defaultVariants:{variant:"default"}});function ir({className:e,variant:t="default",asChild:a=!1,...o}){let r=a?Ii.Root:"span";return Di(r,{"data-slot":"badge","data-variant":t,className:Ti(zi({variant:t}),e),...o})}import{cn as Ai}from"cn";import{jsx as A,jsxs as U}from"react/jsx-runtime";var Mi={已完成:"border-emerald-600/40 bg-emerald-600/10 text-emerald-700 dark:text-emerald-400",需人工处理:"border-amber-600/40 bg-amber-600/10 text-amber-700 dark:text-amber-400",失败:"border-destructive/40 bg-destructive/10 text-destructive"};function Bi({task:e,running:t,onOpen:a,onStop:o,onRetry:r,className:i}){let s=e.budget&&(e.budget.used>0||e.budget.estimate)?e.budget.estimate?`${e.budget.used} / ${e.budget.estimate}${e.budget.unit??""}`:`${e.budget.used}${e.budget.unit??""}`:void 0;return U("div",{className:Ai("rounded-lg border p-3",i),children:[U("div",{className:"flex flex-wrap items-center gap-2",children:[A("button",{type:"button",className:"min-w-0 flex-1 truncate text-left font-medium text-primary underline-offset-4 hover:underline",onClick:a,children:e.code}),A(ir,{variant:"outline",className:Mi[e.status]??"",children:e.status||"—"})]}),(e.stage||e.hint)&&A("p",{className:"mt-1 text-xs text-muted-foreground",children:[e.stage,e.hint].filter(Boolean).join(" · ")}),e.stages?.length?A("div",{className:"mt-2 flex flex-wrap gap-1",children:e.stages.map(n=>U("span",{className:"rounded border px-1.5 py-0.5 text-xs tabular-nums",title:n.label,children:[n.label," ",n.pass,"/",n.input,n.todo?U("span",{className:"text-amber-600 dark:text-amber-400",children:[" +",n.todo]}):null]},n.key))}):null,U("dl",{className:"mt-2 grid grid-cols-2 gap-x-3 gap-y-1 text-xs text-muted-foreground",children:[s&&U("div",{className:"flex justify-between gap-2",children:[A("dt",{children:"算力"}),A("dd",{className:"tabular-nums",children:s})]}),e.rounds!=null&&U("div",{className:"flex justify-between gap-2",children:[A("dt",{children:"轮次"}),A("dd",{className:"tabular-nums",children:e.rounds})]}),e.startedAt&&U("div",{className:"flex justify-between gap-2",children:[A("dt",{children:"开始"}),A("dd",{className:"tabular-nums",children:e.startedAt})]}),e.lastActiveAt&&U("div",{className:"flex justify-between gap-2",children:[A("dt",{children:"最后活动"}),A("dd",{className:"tabular-nums",children:e.lastActiveAt})]})]}),U("div",{className:"mt-2 flex flex-wrap gap-1",children:[a&&A(p,{variant:"ghost",size:"sm",onClick:a,children:"查看"}),t&&o&&A(p,{variant:"ghost",size:"sm",onClick:o,children:"停止"}),r&&A(p,{variant:"ghost",size:"sm",onClick:r,children:"重试未完成"})]})]})}import{useEffect as dr,useRef as _i,useState as Gi}from"react";import{CheckIcon as Fi,CopyIcon as Oi}from"lucide-react";import{cn as sr}from"cn";import{ScrollArea as Ye}from"radix-ui";import{jsx as je,jsxs as Ei}from"react/jsx-runtime";function lr({className:e,children:t,...a}){return Ei(Ye.Root,{"data-slot":"scroll-area",className:sr("relative",e),...a,children:[je(Ye.Viewport,{"data-slot":"scroll-area-viewport",className:"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1",children:t}),je(Li,{}),je(Ye.Corner,{})]})}function Li({className:e,orientation:t="vertical",...a}){return je(Ye.ScrollAreaScrollbar,{"data-slot":"scroll-area-scrollbar","data-orientation":t,orientation:t,className:sr("flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent",e),...a,children:je(Ye.ScrollAreaThumb,{"data-slot":"scroll-area-thumb",className:"relative flex-1 rounded-full bg-border"})})}import{jsx as fe,jsxs as Nt}from"react/jsx-runtime";var Vi=/^\[(\d{4}-\d{2}-\d{2}T[\d:.]+Z)\]/;function $i(e,t){let a=e.match(Vi);if(!a)return e;let o=new Date(a[1]);return Number.isNaN(o.getTime())?e:`[${new Intl.DateTimeFormat("zh-CN",{timeZone:t,month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).format(o)}]${e.slice(a[0].length)}`}function Hi({text:e,timeZone:t,className:a}){let o=String(e??"").trim(),r=o?o.split(`
2
- `).map(c=>$i(c,t)):[],i=_i(null),[s,n]=Gi(!1);dr(()=>{i.current?.scrollIntoView({block:"nearest"})},[o]),dr(()=>{if(!s)return;let c=setTimeout(()=>n(!1),1500);return()=>clearTimeout(c)},[s]);async function l(){try{await navigator.clipboard.writeText(r.join(`
3
- `)),n(!0)}catch{}}return Nt("section",{className:a,children:[Nt("div",{className:"mb-2 flex flex-wrap items-center gap-2",children:[fe("h3",{className:"text-sm font-medium",children:"工作流执行日志"}),fe("span",{className:"text-xs text-muted-foreground",children:"保留最近 50 条 · 时间按所选时区"}),o&&Nt(p,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>{l()},children:[s?fe(Fi,{"data-icon":"inline-start"}):fe(Oi,{"data-icon":"inline-start"}),s?"已复制":"复制"]})]}),o?Nt(lr,{className:"h-56 rounded border bg-muted/40",children:[fe("pre",{className:"whitespace-pre-wrap break-words p-3 text-xs leading-relaxed",children:r.join(`
4
- `)}),fe("div",{ref:i})]}):fe("p",{className:"rounded border border-dashed p-3 text-xs text-muted-foreground",children:"暂无执行日志"})]})}import{CheckIcon as Ki,ChevronRightIcon as cr,LoaderIcon as Ui,SettingsIcon as Zi}from"lucide-react";import{cn as ta}from"cn";import{jsx as D,jsxs as Z}from"react/jsx-runtime";var qi={done:"bg-emerald-600 text-white border-emerald-600",active:"bg-primary text-primary-foreground border-primary",idle:"bg-muted text-muted-foreground border-border"};function pr(e){return e.input===0||e.input===e.pass+e.fail+e.todo}function Wi({startLabel:e="启动条件",startSummary:t,stages:a,countsOf:o,stateOf:r,current:i,onSelect:s,tail:n}){return Z("div",{className:"flex flex-col gap-2 lg:flex-row lg:items-stretch",children:[Z("div",{className:"flex min-w-0 items-center gap-2 rounded border bg-muted/40 px-3 py-2 lg:shrink-0",children:[D("span",{className:"flex size-6 shrink-0 items-center justify-center rounded-full border bg-background",children:D(Zi,{className:"size-3.5"})}),Z("div",{className:"min-w-0",children:[D("p",{className:"text-sm font-medium",children:e}),D("p",{className:"truncate text-xs text-muted-foreground",children:t})]})]}),a.map((l,c)=>{let f=r(l.key),k=o(l.key),w=i===l.key,S=pr(k);return Z("div",{className:"flex min-w-0 items-stretch gap-2 lg:shrink-0",children:[D(cr,{className:"hidden size-4 shrink-0 self-center text-muted-foreground lg:block"}),Z(p,{variant:w?"secondary":"ghost",onClick:()=>s(l.key),"aria-pressed":w,className:ta("h-auto w-full min-w-0 justify-start gap-2 border px-3 py-2 text-left lg:w-auto lg:min-w-40",w&&"border-primary"),children:[D("span",{className:ta("flex size-6 shrink-0 items-center justify-center rounded-full border text-xs",qi[f]),children:f==="done"?D(Ki,{className:"size-3.5"}):f==="active"?D(Ui,{className:"size-3.5 animate-spin"}):c+1}),Z("span",{className:"min-w-0 flex-1",children:[D("span",{className:"block text-sm font-medium",children:l.label}),Z("span",{className:"block text-xs tabular-nums text-muted-foreground",children:["输入 ",k.input," · 通过 ",D("span",{className:"text-emerald-600 dark:text-emerald-400",children:k.pass})," · 不通过"," ",k.fail," · 未完成 ",D("span",{className:ta(k.todo>0&&"text-amber-600 dark:text-amber-400"),children:k.todo})]}),!S&&D("span",{className:"block text-xs text-amber-600 dark:text-amber-400",children:"数不平,正在执行中"})]})]})]},l.key)}),n&&Z("div",{className:"flex min-w-0 items-stretch gap-2 lg:shrink-0",children:[D(cr,{className:"hidden size-4 shrink-0 self-center text-muted-foreground lg:block"}),Z("div",{className:"flex min-w-0 items-center gap-2 rounded border bg-muted/40 px-3 py-2 lg:min-w-32",children:[D("span",{className:"flex size-6 shrink-0 items-center justify-center rounded-full border bg-background",children:n.icon}),Z("div",{className:"min-w-0",children:[D("p",{className:"text-sm font-medium",children:n.label}),D("p",{className:"text-xs tabular-nums text-muted-foreground",children:n.summary})]})]})]})]})}export{Vt as AgentPanel,$t as AgentToggle,Vn as AppShell,Et as AppSidebar,qn as AuthGate,yi as ColumnPicker,Yt as ComboInput,Si as ConfirmDialog,li as DataPagination,oi as DataTable,hi as FilterPanel,_t as Markdown,Ho as PAGE_SIZE,Wi as StageProgress,Bi as TaskCard,Hi as TaskLog,Jn as ThemeProvider,Ut as TimezoneSelect,Zt as UserMenu,pr as countsBalanced,Ee as findNav};
1
+ "use client";import{B as ya,D as vo,a as Ja,b as ja,d as eo,e as to,f as ao,g as no,h as io,i as so,j as vt,l as ha,m as fo,n as go,o as bo,r as Re,z as Ca}from"../chunk-Q7ASIOYP.js";import{a as Ft,b as wa,c as xo,d as _t,e as ho,f as Gt,h as Co,i as yo,j as wo,k as Na,m as No}from"../chunk-2DZYZ6RZ.js";import{g as oo,i as ro,k as fe,t as lo,u as co,v as po,w as mo,y as uo}from"../chunk-WREK6TXJ.js";import{Fragment as Li}from"react";import Fi from"next/link";import{usePathname as _i}from"next/navigation";import Ta from"next/link";import{usePathname as Bn}from"next/navigation";import{ChevronRightIcon as En}from"lucide-react";import{Collapsible as Pa}from"radix-ui";import{jsx as ka}from"react/jsx-runtime";function Ke({...e}){return ka(Pa.Root,{"data-slot":"collapsible",...e})}function Ue({...e}){return ka(Pa.CollapsibleTrigger,{"data-slot":"collapsible-trigger",...e})}function We({...e}){return ka(Pa.CollapsibleContent,{"data-slot":"collapsible-content",...e})}import*as V from"react";import{cva as kn}from"class-variance-authority";import{cn as E}from"cn";import{Slot as Lo}from"radix-ui";import*as Po from"react";var nn=768,ko=`(max-width: ${nn-1}px)`;function sn(e){let t=window.matchMedia(ko);return t.addEventListener("change",e),()=>t.removeEventListener("change",e)}function So(){return Po.useSyncExternalStore(sn,()=>window.matchMedia(ko).matches,()=>!1)}import{cva as ln}from"class-variance-authority";import{cn as dn}from"cn";import{Slot as cn}from"radix-ui";import{jsx as mn}from"react/jsx-runtime";var pn=ln("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function m({className:e,variant:t="default",size:a="default",asChild:o=!1,...r}){let i=o?cn.Root:"button";return mn(i,{"data-slot":"button","data-variant":t,"data-size":a,className:dn(pn({variant:t,size:a,className:e})),...r})}import{cn as un}from"cn";import{jsx as fn}from"react/jsx-runtime";function X({className:e,type:t,...a}){return fn("input",{type:t,"data-slot":"input",className:un("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",e),...a})}import{cn as gn}from"cn";import{Separator as bn}from"radix-ui";import{jsx as vn}from"react/jsx-runtime";function Ro({className:e,orientation:t="horizontal",decorative:a=!0,...o}){return vn(bn.Root,{"data-slot":"separator",decorative:a,orientation:t,className:gn("shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",e),...o})}import{cn as xt}from"cn";import{Dialog as Te}from"radix-ui";import{XIcon as xn}from"lucide-react";import{jsx as ne,jsxs as Sa}from"react/jsx-runtime";function To({...e}){return ne(Te.Root,{"data-slot":"sheet",...e})}function hn({...e}){return ne(Te.Portal,{"data-slot":"sheet-portal",...e})}function Cn({className:e,...t}){return ne(Te.Overlay,{"data-slot":"sheet-overlay",className:xt("fixed inset-0 z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",e),...t})}function Do({className:e,children:t,side:a="right",showCloseButton:o=!0,...r}){return Sa(hn,{children:[ne(Cn,{}),Sa(Te.Content,{"data-slot":"sheet-content","data-side":a,className:xt("fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=right]:data-closed:slide-out-to-right-10 data-[side=top]:data-closed:slide-out-to-top-10",e),...r,children:[t,o&&ne(Te.Close,{"data-slot":"sheet-close",asChild:!0,children:Sa(m,{variant:"ghost",className:"absolute top-3 right-3",size:"icon-sm",children:[ne(xn,{}),ne("span",{className:"sr-only",children:"Close"})]})})]})]})}function Io({className:e,...t}){return ne("div",{"data-slot":"sheet-header",className:xt("flex flex-col gap-0.5 p-4",e),...t})}function zo({className:e,...t}){return ne(Te.Title,{"data-slot":"sheet-title",className:xt("font-heading text-base font-medium text-foreground",e),...t})}function Ao({className:e,...t}){return ne(Te.Description,{"data-slot":"sheet-description",className:xt("text-sm text-muted-foreground",e),...t})}import{cn as yn}from"cn";import{jsx as wn}from"react/jsx-runtime";function Ot({className:e,...t}){return wn("div",{"data-slot":"skeleton",className:yn("animate-pulse rounded-md bg-muted",e),...t})}import{cn as Nn}from"cn";import{Tooltip as ht}from"radix-ui";import{jsx as Vt,jsxs as Pn}from"react/jsx-runtime";function Mo({...e}){return Vt(ht.Root,{"data-slot":"tooltip",...e})}function Bo({...e}){return Vt(ht.Trigger,{"data-slot":"tooltip-trigger",...e})}function Eo({className:e,sideOffset:t=0,children:a,...o}){return Vt(ht.Portal,{children:Pn(ht.Content,{"data-slot":"tooltip-content",sideOffset:t,className:Nn("z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",e),...o,children:[a,Vt(ht.Arrow,{className:"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground"})]})})}import{PanelLeftIcon as Sn}from"lucide-react";import{jsx as k,jsxs as Ct}from"react/jsx-runtime";var Rn="sidebar_state",Tn=3600*24*7,Dn="16rem",In="18rem",zn="3rem",An="b",Fo=V.createContext(null);function Ze(){let e=V.useContext(Fo);if(!e)throw new Error("useSidebar must be used within a SidebarProvider.");return e}function _o({defaultOpen:e=!0,open:t,onOpenChange:a,className:o,style:r,children:i,...n}){let s=So(),[l,d]=V.useState(!1),[f,R]=V.useState(e),P=t??f,v=V.useCallback(y=>{let w=typeof y=="function"?y(P):y;a?a(w):R(w),document.cookie=`${Rn}=${w}; path=/; max-age=${Tn}`},[a,P]),C=V.useCallback(()=>s?d(y=>!y):v(y=>!y),[s,v,d]);V.useEffect(()=>{let y=w=>{w.key===An&&(w.metaKey||w.ctrlKey)&&(w.preventDefault(),C())};return window.addEventListener("keydown",y),()=>window.removeEventListener("keydown",y)},[C]);let h=P?"expanded":"collapsed",T=V.useMemo(()=>({state:h,open:P,setOpen:v,isMobile:s,openMobile:l,setOpenMobile:d,toggleSidebar:C}),[h,P,v,s,l,d,C]);return k(Fo.Provider,{value:T,children:k("div",{"data-slot":"sidebar-wrapper",style:{"--sidebar-width":Dn,"--sidebar-width-icon":zn,...r},className:E("group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar",o),...n,children:i})})}function Go({side:e="left",variant:t="sidebar",collapsible:a="offcanvas",className:o,children:r,dir:i,...n}){let{isMobile:s,state:l,openMobile:d,setOpenMobile:f}=Ze();return a==="none"?k("div",{"data-slot":"sidebar",className:E("flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground",o),...n,children:r}):s?k(To,{open:d,onOpenChange:f,...n,children:Ct(Do,{dir:i,"data-sidebar":"sidebar","data-slot":"sidebar","data-mobile":"true",className:"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",style:{"--sidebar-width":In},side:e,children:[Ct(Io,{className:"sr-only",children:[k(zo,{children:"Sidebar"}),k(Ao,{children:"Displays the mobile sidebar."})]}),k("div",{className:"flex h-full w-full flex-col",children:r})]})}):Ct("div",{className:"group peer hidden text-sidebar-foreground md:block","data-state":l,"data-collapsible":l==="collapsed"?a:"","data-variant":t,"data-side":e,"data-slot":"sidebar",children:[k("div",{"data-slot":"sidebar-gap",className:E("relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear","group-data-[collapsible=offcanvas]:w-0","group-data-[side=right]:rotate-180",t==="floating"||t==="inset"?"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]":"group-data-[collapsible=icon]:w-(--sidebar-width-icon)")}),k("div",{"data-slot":"sidebar-container","data-side":e,className:E("fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex",t==="floating"||t==="inset"?"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]":"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l",o),...n,children:k("div",{"data-sidebar":"sidebar","data-slot":"sidebar-inner",className:"flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border",children:r})})]})}function Oo({className:e,onClick:t,...a}){let{toggleSidebar:o}=Ze();return Ct(m,{"data-sidebar":"trigger","data-slot":"sidebar-trigger",variant:"ghost",size:"icon-sm",className:E(e),onClick:r=>{t?.(r),o()},...a,children:[k(Sn,{}),k("span",{className:"sr-only",children:"Toggle Sidebar"})]})}function Vo({className:e,...t}){let{toggleSidebar:a}=Ze();return k("button",{"data-sidebar":"rail","data-slot":"sidebar-rail","aria-label":"Toggle Sidebar",tabIndex:-1,onClick:a,title:"Toggle Sidebar",className:E("absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2","in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize","[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize","group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar","[[data-side=left][data-collapsible=offcanvas]_&]:-right-2","[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",e),...t})}function $o({className:e,...t}){return k("main",{"data-slot":"sidebar-inset",className:E("relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2",e),...t})}function Ho({className:e,...t}){return k("div",{"data-slot":"sidebar-header","data-sidebar":"header",className:E("flex flex-col gap-2 p-2",e),...t})}function Ko({className:e,...t}){return k("div",{"data-slot":"sidebar-content","data-sidebar":"content",className:E("no-scrollbar flex min-h-0 flex-1 flex-col gap-0 overflow-auto group-data-[collapsible=icon]:overflow-hidden",e),...t})}function Uo({className:e,...t}){return k("div",{"data-slot":"sidebar-group","data-sidebar":"group",className:E("relative flex w-full min-w-0 flex-col p-2",e),...t})}function Ra({className:e,...t}){return k("ul",{"data-slot":"sidebar-menu","data-sidebar":"menu",className:E("flex w-full min-w-0 flex-col gap-0",e),...t})}function $t({className:e,...t}){return k("li",{"data-slot":"sidebar-menu-item","data-sidebar":"menu-item",className:E("group/menu-item relative",e),...t})}var Mn=kn("peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate",{variants:{variant:{default:"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",outline:"bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]"},size:{default:"h-8 text-sm",sm:"h-7 text-xs",lg:"h-12 text-sm group-data-[collapsible=icon]:p-0!"}},defaultVariants:{variant:"default",size:"default"}});function Ht({asChild:e=!1,isActive:t=!1,variant:a="default",size:o="default",tooltip:r,className:i,...n}){let s=e?Lo.Root:"button",{isMobile:l,state:d}=Ze(),f=k(s,{"data-slot":"sidebar-menu-button","data-sidebar":"menu-button","data-size":o,"data-active":t,className:E(Mn({variant:a,size:o}),i),...n});return r?(typeof r=="string"&&(r={children:r}),Ct(Mo,{children:[k(Bo,{asChild:!0,children:f}),k(Eo,{side:"right",align:"center",hidden:d!=="collapsed"||l,...r})]})):f}function Wo({className:e,...t}){return k("ul",{"data-slot":"sidebar-menu-sub","data-sidebar":"menu-sub",className:E("mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden",e),...t})}function Zo({className:e,...t}){return k("li",{"data-slot":"sidebar-menu-sub-item","data-sidebar":"menu-sub-item",className:E("group/menu-sub-item relative",e),...t})}function qo({asChild:e=!1,size:t="md",isActive:a=!1,className:o,...r}){let i=e?Lo.Root:"a";return k(i,{"data-slot":"sidebar-menu-sub-button","data-sidebar":"menu-sub-button","data-size":t,"data-active":a,className:E("flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",o),...r})}import{jsx as N,jsxs as De}from"react/jsx-runtime";function Da({nav:e,appName:t="LinkFox",appSubtitle:a,version:o}){let r=Bn(),i=vt(e,r),{isMobile:n,setOpenMobile:s}=Ze();return De(Go,{collapsible:"icon",children:[N(Ho,{children:N(Ra,{children:N($t,{children:N(Ht,{size:"lg",asChild:!0,children:De(Ta,{href:"/",children:[N("div",{className:"flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary font-semibold text-sidebar-primary-foreground",children:"LF"}),De("div",{className:"flex flex-col gap-0.5 leading-none",children:[De("span",{className:"flex items-center gap-1.5 font-medium",children:[t,o?N("span",{className:"rounded border px-1 text-[10px] leading-4 font-normal text-muted-foreground tabular-nums",children:o}):null]}),a?N("span",{className:"text-xs text-muted-foreground",children:a}):null]})]})})})})}),N(Ko,{children:N(Uo,{children:N(Ra,{children:e.map(l=>{if(l.items.length===1){let d=l.items[0];return N($t,{children:N(Ht,{tooltip:l.title,isActive:i?.group===l,asChild:!0,children:De(Ta,{href:d.href,onClick:()=>n&&s(!1),children:[N(l.icon,{}),N("span",{children:l.title})]})})},l.title)}return N(Ke,{asChild:!0,defaultOpen:!0,className:"group/collapsible",children:De($t,{children:[N(Ue,{asChild:!0,children:De(Ht,{tooltip:l.title,isActive:i?.group===l,children:[N(l.icon,{}),N("span",{children:l.title}),N(En,{className:"ml-auto transition-transform group-data-[state=open]/collapsible:rotate-90"})]})}),N(We,{children:N(Wo,{children:l.items.map(d=>N(Zo,{children:N(qo,{asChild:!0,isActive:i?.item===d,children:N(Ta,{href:d.href,onClick:()=>n&&s(!1),children:N("span",{children:d.title})})})},d.href))})})]})},l.title)})})})}),N(Vo,{})]})}import{useEffect as $n,useState as Ia}from"react";import{CircleAlertIcon as Hn,ExternalLinkIcon as Kn,RefreshCwIcon as Un}from"lucide-react";import{cn as qe}from"cn";import{Dialog as Ce}from"radix-ui";import{XIcon as Ln}from"lucide-react";import{jsx as Q,jsxs as Kt}from"react/jsx-runtime";function Ut({...e}){return Q(Ce.Root,{"data-slot":"dialog",...e})}function Fn({...e}){return Q(Ce.Portal,{"data-slot":"dialog-portal",...e})}function _n({className:e,...t}){return Q(Ce.Overlay,{"data-slot":"dialog-overlay",className:qe("fixed inset-0 isolate z-50 bg-black/50 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",e),...t})}function Wt({className:e,children:t,showCloseButton:a=!0,...o}){return Kt(Fn,{children:[Q(_n,{}),Kt(Ce.Content,{"data-slot":"dialog-content",className:qe("fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",e),...o,children:[t,a&&Q(Ce.Close,{"data-slot":"dialog-close",asChild:!0,children:Kt(m,{variant:"ghost",className:"absolute top-2 right-2",size:"icon-sm",children:[Q(Ln,{}),Q("span",{className:"sr-only",children:"关闭"})]})})]})]})}function Zt({className:e,...t}){return Q("div",{"data-slot":"dialog-header",className:qe("flex flex-col gap-2",e),...t})}function qt({className:e,showCloseButton:t=!1,children:a,...o}){return Kt("div",{"data-slot":"dialog-footer",className:qe("-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end",e),...o,children:[a,t&&Q(Ce.Close,{asChild:!0,children:Q(m,{variant:"outline",children:"Close"})})]})}function Xt({className:e,...t}){return Q(Ce.Title,{"data-slot":"dialog-title",className:qe("font-heading text-base leading-none font-medium",e),...t})}function Qt({className:e,...t}){return Q(Ce.Description,{"data-slot":"dialog-description",className:qe("text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",e),...t})}import{cn as Gn}from"cn";import{Loader2Icon as On}from"lucide-react";import{jsx as Vn}from"react/jsx-runtime";function U({className:e,...t}){return Vn(On,{"data-slot":"spinner",role:"status","aria-label":"Loading",className:Gn("size-4 animate-spin",e),...t})}import{jsx as ie,jsxs as Ie}from"react/jsx-runtime";var Wn={login:{title:"算力余额不足",lead:"当前账号可用算力为 0,LinkFox 的付费工具暂时无法调用。"},team:{title:"算力余额不足,已暂停请求",lead:"当前账号可用算力不足,本次操作已停止;为避免重复消耗,后续请求不会再发起。"},member:{title:"已达到团队设置的算力限额",lead:"你的算力使用已达到团队管理员设置的上限,本次操作已停止,后续请求不会再发起。"}},Zn="如果你是团队管理员,可以前往充值,或在「团队管理」中为成员提高算力限额;如果你是团队成员,请联系团队管理员充值或调整你的限额。",qn="请联系团队管理员在「团队管理」中提高你的算力限额。",Xo=!1;function za(){let[e,t]=Ia(),[a,o]=Ia(!1),[r,i]=Ia(!1);function n(d){Xo||(Xo=!0,i(!1),t(d))}$n(()=>{let d=!1;ja().then(R=>{!d&&R===0&&n("login")});let f=to(()=>{d||n(ro(eo())?"member":"team")});return()=>{d=!0,f()}},[]);async function s(){o(!0),i(!1);let d=await ao();o(!1),d!==void 0&&d>0?t(void 0):i(!0)}let l=e?Wn[e]:void 0;return ie(Ut,{open:!!e,onOpenChange:d=>!d&&t(void 0),children:Ie(Wt,{className:"sm:max-w-md",children:[Ie(Zt,{children:[Ie(Xt,{className:"flex items-center gap-2",children:[ie(Hn,{className:"size-4 text-destructive"}),l?.title]}),Ie(Qt,{className:"space-y-2 pt-1",children:[ie("span",{className:"block text-foreground",children:l?.lead}),ie("span",{className:"block",children:e==="member"?qn:Zn}),r&&ie("span",{className:"block text-destructive",children:"仍未检测到可用算力。充值到账后请稍等片刻再试,或联系团队管理员确认额度。"})]})]}),Ie(qt,{children:[ie(m,{variant:"ghost",onClick:()=>t(void 0),children:"暂不处理"}),Ie(m,{variant:"outline",onClick:()=>{s()},disabled:a,children:[a?ie(U,{}):ie(Un,{}),"我已充值,重新检查"]}),ie(m,{asChild:!0,children:Ie("a",{href:Ja,target:"_blank",rel:"noreferrer",children:["前往充值",ie(Kn,{})]})})]})]})})}import{useEffect as Ba,useRef as Ea,useState as Le}from"react";import{BotIcon as ri,CheckCircle2Icon as ni,ChevronDownIcon as ii,ExternalLinkIcon as si,FileTextIcon as li,MessageCirclePlusIcon as Jo,SendIcon as di,SparklesIcon as jo,SquareIcon as ci,TableIcon as pi,Trash2Icon as mi,XCircleIcon as ui,XIcon as er}from"lucide-react";import Xn from"react-markdown";import Qn from"remark-gfm";import{jsx as Xe}from"react/jsx-runtime";function Y(e,t){function a({node:o,...r}){return Xe(e,{className:t,...r})}return a}var Yn={p:Y("p","my-1.5 leading-relaxed"),ul:Y("ul","my-1.5 list-disc pl-5"),ol:Y("ol","my-1.5 list-decimal pl-5"),li:Y("li","my-0.5"),h1:Y("h3","mt-3 mb-1 font-semibold"),h2:Y("h3","mt-3 mb-1 font-semibold"),h3:Y("h4","mt-2 mb-1 font-semibold"),a:({href:e,children:t})=>Xe("a",{href:e,target:"_blank",rel:"noopener noreferrer",className:"break-all text-primary underline underline-offset-2",children:t}),code:Y("code","rounded bg-muted px-1 py-0.5 font-mono text-xs"),pre:Y("pre","my-2 overflow-x-auto rounded-md bg-muted p-2 text-xs [&_code]:bg-transparent [&_code]:p-0"),table:({children:e})=>Xe("div",{className:"my-2 overflow-x-auto rounded-md border",children:Xe("table",{className:"w-full text-xs",children:e})}),th:Y("th","border-b bg-muted px-2 py-1 text-left font-medium whitespace-nowrap"),td:Y("td","border-b px-2 py-1 align-top"),blockquote:Y("blockquote","my-2 border-l-2 pl-3 text-muted-foreground")};function Aa({children:e}){return Xe("div",{className:"text-sm break-words",children:Xe(Xn,{remarkPlugins:[Qn],components:Yn,children:e})})}import{cn as ze}from"cn";import{Select as W}from"radix-ui";import{ChevronDownIcon as Qo,CheckIcon as Jn,ChevronUpIcon as jn}from"lucide-react";import{jsx as M,jsxs as Ma}from"react/jsx-runtime";function Ae({...e}){return M(W.Root,{"data-slot":"select",...e})}function yt({className:e,...t}){return M(W.Group,{"data-slot":"select-group",className:ze("scroll-my-1 p-1",e),...t})}function Me({...e}){return M(W.Value,{"data-slot":"select-value",...e})}function Be({className:e,size:t="default",children:a,...o}){return Ma(W.Trigger,{"data-slot":"select-trigger","data-size":t,className:ze("flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...o,children:[a,M(W.Icon,{asChild:!0,children:M(Qo,{className:"pointer-events-none size-4 text-muted-foreground"})})]})}function Ee({className:e,children:t,position:a="item-aligned",align:o="center",...r}){return M(W.Portal,{children:Ma(W.Content,{"data-slot":"select-content","data-align-trigger":a==="item-aligned",className:ze("relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",a==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:a,align:o,...r,children:[M(ei,{}),M(W.Viewport,{"data-position":a,className:ze("data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)",a==="popper"&&""),children:t}),M(ti,{})]})})}function ge({className:e,children:t,...a}){return Ma(W.Item,{"data-slot":"select-item",className:ze("relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",e),...a,children:[M("span",{className:"pointer-events-none absolute right-2 flex size-4 items-center justify-center",children:M(W.ItemIndicator,{children:M(Jn,{className:"pointer-events-none"})})}),M(W.ItemText,{children:t})]})}function ei({className:e,...t}){return M(W.ScrollUpButton,{"data-slot":"select-scroll-up-button",className:ze("z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",e),...t,children:M(jn,{})})}function ti({className:e,...t}){return M(W.ScrollDownButton,{"data-slot":"select-scroll-down-button",className:ze("z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",e),...t,children:M(Qo,{})})}import{cn as ai}from"cn";import{jsx as oi}from"react/jsx-runtime";function Yo({className:e,...t}){return oi("textarea",{"data-slot":"textarea",className:ai("flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",e),...t})}import{cn as fi}from"cn";import{Fragment as hi,jsx as p,jsxs as S}from"react/jsx-runtime";var gi=["介绍一下这个应用现在能做什么","帮我梳理接下来可以加哪些功能"],bi="例如:帮我把当前页面的数据按状态汇总一下",tr=e=>ha.find(t=>t.id===e)?.name??e;function La({suggestions:e}){let{open:t,setOpen:a,page:o}=Na(),[r,i]=Le(),[n,s]=Le([]),[l,d]=Le(""),[f,R]=Le("default"),[P,v]=Le(!0),[C,h]=Le(""),T=Ea(null),y=Ea(null),w=Ea(null),q=n.some(g=>g.running),Pe=!!o&&(!!o.table||o.records.length>0),pe=()=>h("");Ba(()=>{!t||r||Re()?.getNotebook().then(g=>i({notebookId:g.notebookId,name:g.name})).catch(()=>{})},[t,r]);let j=o?`${o.table?.id}:${o.records.map(g=>g.id).join(",")}`:"",[ft,gt]=Le(j);j!==ft&&(gt(j),v(!0)),Ba(()=>{w.current?.scrollIntoView({block:"end"})},[n]),Ba(()=>()=>T.current?.abort(),[]);let me=(g,u)=>s(D=>D.map(z=>z.id===g?{...z,...u}:z)),ue=async(g=l)=>{let u=g.trim();if(!u||q)return;let D=P&&Pe?o:null,z=crypto.randomUUID(),he=C;s(B=>[...B,{id:z,input:u,context:D,modelId:f,running:!0,followUp:!!he}]),d("");let re=new AbortController;T.current=re,y.current=null;try{let B=await bo(No(u,he?null:D,r),f,{signal:re.signal,sessionId:he||void 0,onUpdate:Se=>{y.current=Se.messageId,Se.sessionId&&h(Se.sessionId),me(z,{task:Se})}});B.sessionId&&h(B.sessionId),me(z,{task:B,running:!1,error:B.stopReason==="end_turn"?void 0:`任务异常结束(${B.stopReason})`}),window.dispatchEvent(new Event(yo));let ke=await go(B.messageId);ke&&me(z,{shareUrl:ke})}catch(B){me(z,{running:!1,error:oo(B)?"已停止":fe(B)})}finally{T.current===re&&(T.current=null)}},bt=()=>{let g=y.current;T.current?.abort(),g&&fo(g).catch(()=>{})},va=e?.items??[],xa=(o?va.find(g=>o.source.endsWith(g.match))?.items:void 0)??e?.fallback??gi;return S("aside",{"aria-label":"LinkFox OS 助手",className:fi("z-40 flex flex-col border-l bg-background","fixed inset-0 md:sticky md:top-0 md:h-svh md:w-1/4 md:min-w-90 md:shrink-0 md:self-start",!t&&"hidden"),children:[S("header",{className:"flex h-14 shrink-0 items-center gap-2 border-b px-3",children:[p(jo,{className:"size-4 text-primary"}),p("span",{className:"font-medium",children:"LinkFox OS"}),S(Ae,{value:f,onValueChange:g=>{R(g),pe()},disabled:q,children:[p(Be,{size:"sm",className:"ml-auto w-32","aria-label":"选择 Agent",children:p(Me,{})}),p(Ee,{align:"end",children:ha.map(g=>p(ge,{value:g.id,children:g.name},g.id))})]}),p(m,{variant:"ghost",size:"icon-sm","aria-label":"开新对话(不保留上下文)",title:"开新对话:下一条消息不再续接当前会话",disabled:q||!C,onClick:pe,children:p(Jo,{})}),p(m,{variant:"ghost",size:"icon-sm","aria-label":"清空对话",disabled:q||!n.length,onClick:()=>{s([]),pe()},children:p(mi,{})}),p(m,{variant:"ghost",size:"icon-sm","aria-label":"关闭助手",onClick:()=>a(!1),children:p(er,{})})]}),S("div",{className:"min-h-0 flex-1 overflow-y-auto overscroll-contain px-3 py-3",children:[n.length===0?S("div",{className:"flex flex-col gap-3 py-6 text-sm text-muted-foreground",children:[S("div",{className:"flex items-center gap-2 text-foreground",children:[p(ri,{className:"size-5"}),p("span",{className:"font-medium",children:"让 LinkFox 帮你干活"})]}),p("p",{children:"描述你要完成的事,LinkFox OS 会自己调用选品、数据查询、生图、多维表等技能去执行。勾选的记录会自动带上。"}),p("div",{className:"flex flex-col gap-2",children:xa.map(g=>p("button",{type:"button",className:"rounded-lg border px-3 py-2 text-left text-foreground transition-colors hover:bg-muted",onClick:()=>d(g),children:g},g))})]}):p("div",{className:"flex flex-col gap-4",children:n.map(g=>p(xi,{item:g,notebook:r},g.id))}),p("div",{ref:w})]}),S("div",{className:"shrink-0 border-t p-3",children:[C?S("div",{className:"mb-2 flex items-center gap-2 text-xs text-muted-foreground",children:[p(Jo,{className:"size-3.5 shrink-0"}),S("span",{className:"min-w-0 flex-1",children:["接着上一轮聊(",tr(f)," 记得前面的内容,可以直接追问)"]}),p("button",{type:"button",className:"shrink-0 text-primary underline-offset-2 hover:underline",onClick:pe,children:"开新对话"})]}):S(hi,{children:[Pe&&P&&o&&p(vi,{context:o,notebook:r,onRemove:()=>v(!1)}),Pe&&!P&&p("button",{type:"button",className:"mb-2 text-xs text-primary underline-offset-2 hover:underline",onClick:()=>v(!0),children:"重新带入当前页面的数据表和勾选记录"})]}),S("div",{className:"flex items-end gap-2",children:[p(Yo,{value:l,onChange:g=>d(g.target.value),onKeyDown:g=>{g.key==="Enter"&&!g.shiftKey&&!g.nativeEvent.isComposing&&(g.preventDefault(),ue())},placeholder:C?"接着问,例如:把第 3 条展开说说 / 换个角度再看一遍":e?.placeholder??bi,"aria-label":"告诉 LinkFox 要做什么",className:"max-h-40 min-h-16 resize-none"}),q?p(m,{size:"icon",variant:"outline","aria-label":"停止",onClick:bt,children:p(ci,{})}):p(m,{size:"icon","aria-label":"发送",disabled:!l.trim(),onClick:()=>ue(),children:p(di,{})})]}),p("p",{className:"mt-2 text-xs text-muted-foreground",children:"执行会消耗 LinkFox 算力。Enter 发送,Shift+Enter 换行。"})]})]})}function vi({context:e,notebook:t,onRemove:a}){let o=e.records.length;return S(Ke,{className:"mb-2 rounded-lg border bg-muted/40 text-xs",children:[S("div",{className:"flex items-center gap-2 px-2.5 py-2",children:[p(pi,{className:"size-3.5 shrink-0 text-muted-foreground"}),S("div",{className:"min-w-0 flex-1",children:[e.table&&S("div",{className:"truncate",children:[t?`${t.name} / `:"",e.table.name]}),p("div",{className:"text-muted-foreground",children:o?`已勾选 ${o} 条记录,将一并发送`:`当前页面:${e.source}`})]}),o>0&&p(Ue,{asChild:!0,children:p(m,{variant:"ghost",size:"icon-xs","aria-label":"查看勾选记录",className:"[&[data-state=open]>svg]:rotate-180",children:p(ii,{})})}),p(m,{variant:"ghost",size:"icon-xs","aria-label":"不带入上下文",onClick:a,children:p(er,{})})]}),o>0&&p(We,{children:p("ul",{className:"max-h-32 overflow-y-auto border-t px-2.5 py-1.5",children:e.records.map(r=>p("li",{className:"truncate py-0.5",title:r.label,children:r.label},r.id))})})]})}function xi({item:e,notebook:t}){let{task:a,context:o}=e,r=a?.steps??[];return S("div",{className:"flex flex-col gap-2",children:[S("div",{className:"ml-6 self-end rounded-lg bg-primary px-3 py-2 text-sm whitespace-pre-wrap text-primary-foreground",children:[e.input,o&&S("div",{className:"mt-1.5 border-t border-primary-foreground/20 pt-1.5 text-xs opacity-80",children:[o.table?`${t?`${t.name} / `:""}${o.table.name}`:o.source,o.records.length?` · 勾选 ${o.records.length} 条`:""]})]}),S("div",{className:"mr-2 flex flex-col gap-2 rounded-lg border px-3 py-2",children:[S("div",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",children:[p("span",{children:tr(e.modelId)}),e.followUp&&p("span",{className:"rounded bg-muted px-1.5 py-0.5",children:"接上一轮"})]}),r.length>0&&p("ul",{className:"flex flex-col gap-1 text-xs",children:r.map(i=>S("li",{className:"flex items-center gap-1.5",children:[i.status==="running"?p(U,{className:"size-3"}):i.status==="failed"?p(ui,{className:"size-3 text-destructive"}):p(ni,{className:"size-3 text-emerald-600"}),p("span",{className:"truncate",children:i.status==="running"?`正在调用 ${i.title}`:i.title})]},i.id))}),a?.text?p(Aa,{children:a.text}):e.running&&S("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[p(U,{})," ",a?"LinkFox 正在处理…":"正在提交任务…"]}),a&&a.files.length>0&&p("ul",{className:"flex flex-col gap-1",children:a.files.map(i=>p("li",{children:S("a",{href:i.uri,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1.5 text-xs text-primary underline-offset-2 hover:underline",children:[p(li,{className:"size-3.5 shrink-0"}),p("span",{className:"truncate",children:i.name})]})},i.uri))}),e.error&&p("div",{className:"text-sm text-destructive",children:e.error}),e.shareUrl&&S("a",{href:e.shareUrl,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 self-start text-xs text-muted-foreground underline-offset-2 hover:text-foreground hover:underline",children:["查看完整过程 ",p(si,{className:"size-3"})]})]})]})}function Fa(){let{open:e,setOpen:t}=Na();return S(m,{variant:e?"secondary":"default",size:"sm",onClick:()=>t(a=>!a),"aria-expanded":e,"aria-label":"让LinkFox帮你干活",children:[p(jo,{}),p("span",{className:"hidden sm:inline",children:"让LinkFox帮你干活"})]})}import{useMemo as ki,useState as Si}from"react";import{CheckIcon as ur,GlobeIcon as Ri}from"lucide-react";import{Command as Je}from"cmdk";import{cn as je}from"cn";import{cva as ar}from"class-variance-authority";import{cn as wt}from"cn";import{jsx as Nt}from"react/jsx-runtime";function Qe({className:e,...t}){return Nt("div",{"data-slot":"input-group",role:"group",className:wt("group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5",e),...t})}var Ci=ar("flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4",{variants:{align:{"inline-start":"order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]","inline-end":"order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]","block-start":"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2","block-end":"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2"}},defaultVariants:{align:"inline-start"}});function Ye({className:e,align:t="inline-start",...a}){return Nt("div",{role:"group","data-slot":"input-group-addon","data-align":t,className:wt(Ci({align:t}),e),onClick:o=>{o.target.closest("button")||o.currentTarget.parentElement?.querySelector("input")?.focus()},...a})}var yi=ar("flex items-center gap-2 text-sm shadow-none",{variants:{size:{xs:"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5",sm:"","icon-xs":"size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0","icon-sm":"size-8 p-0 has-[>svg]:p-0"}},defaultVariants:{size:"xs"}});function or({className:e,type:t="button",variant:a="ghost",size:o="xs",...r}){return Nt(m,{type:t,"data-size":o,variant:a,className:wt(yi({size:o}),e),...r})}function rr({className:e,...t}){return Nt("span",{className:wt("flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",e),...t})}function Yt({className:e,...t}){return Nt(X,{"data-slot":"input-group-control",className:wt("flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent",e),...t})}import{SearchIcon as wi,CheckIcon as Ni}from"lucide-react";import{jsx as be,jsxs as dr}from"react/jsx-runtime";function nr({className:e,...t}){return be(Je,{"data-slot":"command",className:je("flex size-full flex-col overflow-hidden rounded-xl! bg-popover p-1 text-popover-foreground",e),...t})}function ir({className:e,...t}){return be("div",{"data-slot":"command-input-wrapper",className:"p-1 pb-0",children:dr(Qe,{className:"h-8! rounded-lg! border-input/30 bg-input/30 shadow-none! *:data-[slot=input-group-addon]:pl-2!",children:[be(Je.Input,{"data-slot":"command-input",className:je("w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50",e),...t}),be(Ye,{children:be(wi,{className:"size-4 shrink-0 opacity-50"})})]})})}function sr({className:e,...t}){return be(Je.List,{"data-slot":"command-list",className:je("no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none",e),...t})}function lr({className:e,...t}){return be(Je.Empty,{"data-slot":"command-empty",className:je("py-6 text-center text-sm",e),...t})}function Jt({className:e,...t}){return be(Je.Group,{"data-slot":"command-group",className:je("overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground",e),...t})}function _a({className:e,children:t,...a}){return dr(Je.Item,{"data-slot":"command-item",className:je("group/command-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-lg! data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-selected:*:[svg]:text-foreground",e),...a,children:[t,be(Ni,{className:"ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100"})]})}import{cn as Pi}from"cn";import{Popover as jt}from"radix-ui";import{jsx as ea}from"react/jsx-runtime";function cr({...e}){return ea(jt.Root,{"data-slot":"popover",...e})}function pr({...e}){return ea(jt.Trigger,{"data-slot":"popover-trigger",...e})}function mr({className:e,align:t="center",sideOffset:a=4,...o}){return ea(jt.Portal,{children:ea(jt.Content,{"data-slot":"popover-content",align:t,sideOffset:a,className:Pi("z-50 flex w-72 origin-(--radix-popover-content-transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",e),...o})})}import{cn as fr}from"cn";import{jsx as $,jsxs as Fe}from"react/jsx-runtime";var Ga=["Asia/Shanghai","America/Los_Angeles","America/New_York","Europe/London","Europe/Berlin","Asia/Tokyo","UTC"];function Ti(){try{return Intl.supportedValuesOf("timeZone")}catch{return Ga}}function Oa(){let[e,t]=Si(!1),a=_t(),o=ho(),r=ki(()=>e?Ti().filter(s=>!Ga.includes(s)).map(s=>({zone:s,offset:Gt(s)})):[],[e]),i=s=>{xo(s),t(!1)},n=(s,l=Gt(s))=>Fe(_a,{value:`${s} ${l}`,onSelect:()=>i(s),children:[$(ur,{className:fr(!o&&s===a?"opacity-100":"opacity-0")}),$("span",{className:"truncate",children:s}),$("span",{className:"ml-auto text-xs text-muted-foreground",children:l})]},s);return Fe(cr,{open:e,onOpenChange:t,children:[$(pr,{asChild:!0,children:Fe(m,{variant:"outline",size:"sm","aria-label":"选择时区",children:[$(Ri,{"data-icon":"inline-start"}),$("span",{className:"hidden max-w-40 truncate sm:inline",children:a}),$("span",{className:"text-muted-foreground",children:Gt(a)})]})}),$(mr,{align:"end",className:"w-80 p-0",children:Fe(nr,{children:[$(ir,{placeholder:"搜索时区,如 Shanghai、UTC+08"}),Fe(sr,{children:[$(lr,{children:"没有匹配的时区"}),$(Jt,{heading:"默认",children:Fe(_a,{value:`跟随浏览器 ${wa()}`,onSelect:()=>i(null),children:[$(ur,{className:fr(o?"opacity-100":"opacity-0")}),Fe("span",{className:"truncate",children:["跟随浏览器(",wa(),")"]})]})}),$(Jt,{heading:"常用",children:Ga.map(s=>n(s))}),$(Jt,{heading:"全部",children:r.map(s=>n(s.zone,s.offset))})]})]})})]})}import{LogOutIcon as zi,UserIcon as Ai}from"lucide-react";import{cn as Pt}from"cn";import{DropdownMenu as se}from"radix-ui";import{CheckIcon as Di,ChevronRightIcon as vc}from"lucide-react";import{jsx as ee,jsxs as Ii}from"react/jsx-runtime";function et({...e}){return ee(se.Root,{"data-slot":"dropdown-menu",...e})}function tt({...e}){return ee(se.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}function at({className:e,align:t="start",sideOffset:a=4,...o}){return ee(se.Portal,{children:ee(se.Content,{"data-slot":"dropdown-menu-content",sideOffset:a,align:t,className:Pt("z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) min-w-32 origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",e),...o})})}function kt({...e}){return ee(se.Group,{"data-slot":"dropdown-menu-group",...e})}function _e({className:e,inset:t,variant:a="default",...o}){return ee(se.Item,{"data-slot":"dropdown-menu-item","data-inset":t,"data-variant":a,className:Pt("group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",e),...o})}function gr({className:e,children:t,checked:a,inset:o,...r}){return Ii(se.CheckboxItem,{"data-slot":"dropdown-menu-checkbox-item","data-inset":o,className:Pt("relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),checked:a,...r,children:[ee("span",{className:"pointer-events-none absolute right-2 flex items-center justify-center","data-slot":"dropdown-menu-checkbox-item-indicator",children:ee(se.ItemIndicator,{children:ee(Di,{})})}),t]})}function St({className:e,inset:t,...a}){return ee(se.Label,{"data-slot":"dropdown-menu-label","data-inset":t,className:Pt("px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7",e),...a})}function ta({className:e,...t}){return ee(se.Separator,{"data-slot":"dropdown-menu-separator",className:Pt("-mx-1 my-1 h-px bg-border",e),...t})}import{Fragment as Mi,jsx as ot,jsxs as Rt}from"react/jsx-runtime";function Va(){let e=Ft();return e.status!=="ready"?null:Rt(et,{children:[ot(tt,{asChild:!0,children:ot(m,{variant:"ghost",size:"icon","aria-label":"账号",children:ot(Ai,{})})}),Rt(at,{align:"end",children:[ot(St,{children:e.userName||"LinkFox 用户"}),e.apiKey&&Rt(St,{className:"font-normal text-muted-foreground",children:["API Key:",uo(e.apiKey)]}),!e.apiKey&&Rt(Mi,{children:[ot(ta,{}),Rt(_e,{onSelect:mo,children:[ot(zi,{}),"退出登录"]})]})]})]})}import{cn as rt}from"cn";import{Slot as Bi}from"radix-ui";import{ChevronRightIcon as Ei,MoreHorizontalIcon as Dc}from"lucide-react";import{jsx as Ge,jsxs as zc}from"react/jsx-runtime";function br({className:e,...t}){return Ge("nav",{"aria-label":"breadcrumb","data-slot":"breadcrumb",className:rt(e),...t})}function vr({className:e,...t}){return Ge("ol",{"data-slot":"breadcrumb-list",className:rt("flex flex-wrap items-center gap-1.5 text-sm wrap-break-word text-muted-foreground",e),...t})}function $a({className:e,...t}){return Ge("li",{"data-slot":"breadcrumb-item",className:rt("inline-flex items-center gap-1",e),...t})}function xr({asChild:e,className:t,...a}){let o=e?Bi.Root:"a";return Ge(o,{"data-slot":"breadcrumb-link",className:rt("transition-colors hover:text-foreground",t),...a})}function hr({className:e,...t}){return Ge("span",{"data-slot":"breadcrumb-page",role:"link","aria-disabled":"true","aria-current":"page",className:rt("font-normal text-foreground",e),...t})}function Cr({children:e,className:t,...a}){return Ge("li",{"data-slot":"breadcrumb-separator",role:"presentation","aria-hidden":"true",className:rt("[&>svg]:size-3.5",t),...a,children:e??Ge(Ei,{})})}import{jsx as A,jsxs as Tt}from"react/jsx-runtime";function Gi({children:e,nav:t,appName:a,appSubtitle:o,version:r,suggestions:i}){let n=_i(),s=vt(t,n),l=s?[...new Set([s.group.title,s.item.title])]:[];return A(wo,{children:Tt(_o,{children:[A(Da,{nav:t,appName:a,appSubtitle:o,version:r}),Tt($o,{className:"min-w-0",children:[Tt("header",{className:"sticky top-0 z-10 flex h-14 shrink-0 items-center gap-2 border-b bg-background px-4",children:[A(Oo,{className:"-ml-1"}),A(Ro,{orientation:"vertical",className:"mr-2 data-[orientation=vertical]:h-4"}),A(br,{className:"min-w-0 flex-1",children:Tt(vr,{children:[A($a,{className:"hidden md:inline-flex",children:A(xr,{asChild:!0,children:A(Fi,{href:"/",children:"首页"})})}),l.map((d,f)=>Tt(Li,{children:[A(Cr,{className:f===0?"hidden md:block":void 0}),A($a,{className:f<l.length-1?"hidden md:inline-flex":void 0,children:f===l.length-1?A(hr,{children:d}):A("span",{children:d})})]},d))]})}),A(Fa,{}),A(Oa,{}),A(Va,{})]}),A("main",{className:"flex min-w-0 flex-1 flex-col gap-4 p-4",children:e})]}),A(La,{suggestions:i}),A(za,{})]})})}import{useEffect as $i}from"react";import{CircleAlertIcon as Hi,LogInIcon as Nr,RotateCwIcon as Ki}from"lucide-react";import{cva as Oi}from"class-variance-authority";import{cn as nt}from"cn";import{jsx as it}from"react/jsx-runtime";function aa({className:e,...t}){return it("div",{"data-slot":"empty",className:nt("flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-xl border-dashed p-6 text-center text-balance",e),...t})}function oa({className:e,...t}){return it("div",{"data-slot":"empty-header",className:nt("flex max-w-sm flex-col items-center gap-2",e),...t})}var Vi=Oi("mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0",{variants:{variant:{default:"bg-transparent",icon:"flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-4"}},defaultVariants:{variant:"default"}});function yr({className:e,variant:t="default",...a}){return it("div",{"data-slot":"empty-icon","data-variant":t,className:nt(Vi({variant:t,className:e})),...a})}function ra({className:e,...t}){return it("div",{"data-slot":"empty-title",className:nt("font-heading text-sm font-medium tracking-tight",e),...t})}function na({className:e,...t}){return it("div",{"data-slot":"empty-description",className:nt("text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",e),...t})}function wr({className:e,...t}){return it("div",{"data-slot":"empty-content",className:nt("flex w-full max-w-sm min-w-0 flex-col items-center gap-2.5 text-sm text-balance",e),...t})}import{jsx as J,jsxs as ia}from"react/jsx-runtime";function Ui({children:e}){let t=Ft();if($i(()=>{lo()},[]),t.status==="ready")return e;let a=t.status==="redirecting"&&t.auto;if(t.status==="loading"||t.status==="callback"||a)return ia("div",{className:"flex min-h-svh items-center justify-center gap-2",role:"status",children:[J(U,{}),J("span",{children:t.status==="callback"?"正在完成登录…":a?"正在跳转登录…":"正在准备登录…"})]});let o=t.status==="error",r=t.status==="redirecting";return J("div",{className:"flex min-h-svh items-center justify-center bg-muted p-4",children:ia(aa,{className:"max-w-md bg-background",children:[ia(oa,{children:[J(yr,{variant:"icon",children:o?J(Hi,{}):J(Nr,{})}),J(ra,{children:o?"无法进入选品工作台":"登录 LinkFox"}),J(na,{children:o?t.message:"使用 LinkFox 账号登录,登录状态将在此浏览器中保留至到期或退出。"})]}),J(wr,{children:ia(m,{disabled:r,onClick:o&&t.action==="config"?()=>{co()}:()=>{po()},children:[r?J(U,{"data-icon":"inline-start"}):o?J(Ki,{"data-icon":"inline-start"}):J(Nr,{"data-icon":"inline-start"}),r?"正在跳转…":o?"重试":"登录 LinkFox"]})})]})})}import*as Pr from"react";import{ThemeProvider as Wi,useTheme as Zi}from"next-themes";import{jsx as Yi,jsxs as Ji}from"react/jsx-runtime";function qi({children:e,...t}){return Ji(Wi,{attribute:"class",defaultTheme:"system",enableSystem:!0,disableTransitionOnChange:!0,...t,children:[Yi(Qi,{}),e]})}function Xi(e){return e instanceof HTMLElement?e.isContentEditable||e.tagName==="INPUT"||e.tagName==="TEXTAREA"||e.tagName==="SELECT":!1}function Qi(){let{resolvedTheme:e,setTheme:t}=Zi();return Pr.useEffect(()=>{function a(o){o.defaultPrevented||o.repeat||o.metaKey||o.ctrlKey||o.altKey||o.key.toLowerCase()==="d"&&(Xi(o.target)||t(e==="dark"?"light":"dark"))}return window.addEventListener("keydown",a),()=>{window.removeEventListener("keydown",a)}},[e,t]),null}import{cn as ji}from"cn";import{Checkbox as kr}from"radix-ui";import{CheckIcon as es}from"lucide-react";import{jsx as Ha}from"react/jsx-runtime";function Oe({className:e,...t}){return Ha(kr.Root,{"data-slot":"checkbox",className:ji("peer relative flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input transition-colors outline-none group-has-disabled/field:opacity-50 group-has-[:focus-visible]/field-label:ring-0 group-has-[:focus-visible]/field-label:not-data-checked:border-input after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground group-has-[:focus-visible]/field-label:data-checked:border-primary dark:data-checked:bg-primary",e),...t,children:Ha(kr.Indicator,{"data-slot":"checkbox-indicator",className:"grid place-content-center text-current transition-none [&>svg]:size-3.5",children:Ha(es,{})})})}import{cn as st}from"cn";import{jsx as Ve}from"react/jsx-runtime";function sa({className:e,...t}){return Ve("div",{"data-slot":"table-container",className:"relative w-full overflow-x-auto",children:Ve("table",{"data-slot":"table",className:st("w-full caption-bottom text-sm",e),...t})})}function la({className:e,...t}){return Ve("thead",{"data-slot":"table-header",className:st("[&_tr]:border-b",e),...t})}function da({className:e,...t}){return Ve("tbody",{"data-slot":"table-body",className:st("[&_tr:last-child]:border-0",e),...t})}function ve({className:e,...t}){return Ve("tr",{"data-slot":"table-row",className:st("border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted",e),...t})}function te({className:e,...t}){return Ve("th",{"data-slot":"table-head",className:st("h-10 px-2 text-left align-middle font-medium text-foreground [&:has([role=checkbox])]:pr-0",e),...t})}function H({className:e,...t}){return Ve("td",{"data-slot":"table-cell",className:st("p-2 align-middle break-words [&:has([role=checkbox])]:pr-0",e),...t})}import{cn as ca}from"cn";import{jsx as L,jsxs as pa}from"react/jsx-runtime";var Sr=56,Rr=120;function ts({columns:e,rows:t,rowKey:a,renderCell:o,actions:r,actionsWidth:i=200,selection:n,onRowClick:s,loading:l,skeletonRows:d=8,empty:f,className:R}){let P=e.length+(n?1:0)+(r?1:0),C={"--dt-min-width":`${e.reduce((h,T)=>h+(T.width??Rr),0)+(n?Sr:0)+(r?i:0)}px`};return pa(sa,{style:C,className:ca("lg:[min-width:var(--dt-min-width)] max-lg:block",R),children:[L(la,{className:"max-lg:hidden",children:pa(ve,{children:[n&&L(te,{style:{width:Sr},className:"lg:sticky lg:left-0 lg:z-20 lg:bg-card",children:L(Oe,{"aria-label":"全选本页",checked:n.pageAllSelected?!0:n.pageSomeSelected?"indeterminate":!1,disabled:!t.length,onCheckedChange:h=>n.onToggleAll(h===!0)})}),e.map(h=>L(te,{style:{width:h.width??Rr},className:"break-words",children:h.label},h.key)),r&&L(te,{style:{width:i},className:"text-right lg:sticky lg:right-0 lg:z-20 lg:border-l lg:bg-card",children:"操作"})]})}),pa(da,{className:"max-lg:block",children:[l&&t.length===0?Array.from({length:d},(h,T)=>L(ve,{className:"max-lg:block max-lg:border-0",children:L(H,{colSpan:P,className:"max-lg:block",children:L(Ot,{className:"h-10 w-full"})})},T)):t.map(h=>{let T=a(h);return pa(ve,{"data-state":n?.selected.has(T)?"selected":void 0,onClick:s?()=>s(h):void 0,className:ca("group/row",l&&"opacity-60",s&&"cursor-pointer","max-lg:mb-3 max-lg:block max-lg:rounded-lg max-lg:border max-lg:p-3"),children:[n&&L(H,{className:"max-lg:flex max-lg:items-center max-lg:border-0 max-lg:px-0 max-lg:py-1 lg:sticky lg:left-0 lg:z-10 lg:bg-card lg:group-hover/row:bg-muted",children:L(Oe,{"aria-label":"选择本行",checked:n.selected.has(T),onCheckedChange:y=>n.onToggleRow(h,y===!0),onClick:y=>y.stopPropagation()})}),e.map(y=>L(H,{"data-label":y.label,className:ca("align-top break-words","max-lg:flex max-lg:gap-3 max-lg:border-0 max-lg:px-0 max-lg:py-1","max-lg:before:w-24 max-lg:before:shrink-0 max-lg:before:text-xs max-lg:before:text-muted-foreground","max-lg:before:content-[attr(data-label)]"),children:L("div",{className:"min-w-0 flex-1",children:o(h,y)})},y.key)),r&&L(H,{className:ca("align-top text-right max-lg:flex max-lg:justify-end max-lg:border-0 max-lg:px-0 max-lg:py-1","lg:sticky lg:right-0 lg:z-10 lg:border-l lg:bg-card lg:group-hover/row:bg-muted"),children:L("div",{className:"flex justify-end gap-1",onClick:y=>y.stopPropagation(),children:r(h)})})]},T)}),!l&&t.length===0&&f?L(ve,{className:"max-lg:block max-lg:border-0 hover:bg-transparent",children:L(H,{colSpan:P,className:"whitespace-normal max-lg:block",children:f})}):null]})]})}import{cn as lt}from"cn";import{ChevronLeftIcon as as,ChevronRightIcon as os,MoreHorizontalIcon as rs}from"lucide-react";import{jsx as ae,jsxs as Ka}from"react/jsx-runtime";function Tr({className:e,...t}){return ae("nav",{role:"navigation","aria-label":"pagination","data-slot":"pagination",className:lt("mx-auto flex w-full justify-center",e),...t})}function Dr({className:e,...t}){return ae("ul",{"data-slot":"pagination-content",className:lt("flex items-center gap-0.5",e),...t})}function Dt({...e}){return ae("li",{"data-slot":"pagination-item",...e})}function ma({className:e,isActive:t,size:a="icon",...o}){return ae(m,{asChild:!0,variant:t?"outline":"ghost",size:a,className:lt(e),children:ae("a",{"aria-current":t?"page":void 0,"data-slot":"pagination-link","data-active":t,...o})})}function Ir({className:e,text:t="Previous",...a}){return Ka(ma,{"aria-label":"Go to previous page",size:"default",className:lt("pl-1.5!",e),...a,children:[ae(as,{"data-icon":"inline-start"}),ae("span",{className:"hidden sm:block",children:t})]})}function zr({className:e,text:t="Next",...a}){return Ka(ma,{"aria-label":"Go to next page",size:"default",className:lt("pr-1.5!",e),...a,children:[ae("span",{className:"hidden sm:block",children:t}),ae(os,{"data-icon":"inline-end"})]})}function Ar({className:e,...t}){return Ka("span",{"aria-hidden":!0,"data-slot":"pagination-ellipsis",className:lt("flex size-8 items-center justify-center [&_svg:not([class*='size-'])]:size-4",e),...t,children:[ae(rs,{}),ae("span",{className:"sr-only",children:"More pages"})]})}import{cn as Mr}from"cn";import{jsx as le,jsxs as Ua}from"react/jsx-runtime";var It=20;function ns(e,t){if(t<=7)return Array.from({length:t},(i,n)=>n+1);let a=[1],o=Math.max(2,e-1),r=Math.min(t-1,e+1);o>2&&a.push("…");for(let i=o;i<=r;i++)a.push(i);return r<t-1&&a.push("…"),a.push(t),a}function Wa({page:e,total:t,disabled:a,onChange:o,pageSize:r=It,note:i}){let n=Math.max(1,Math.ceil(t/r)),s=d=>f=>{f.preventDefault(),!(a||d<1||d>n||d===e)&&o(d)},l=d=>Mr(d&&"pointer-events-none opacity-50");return Ua("div",{className:"flex flex-col items-center justify-between gap-2 sm:flex-row",children:[Ua("p",{className:"text-sm text-muted-foreground",children:["共 ",t.toLocaleString("zh-CN")," 条,第 ",e,"/",n," 页,每页 ",r," 条",i?le("span",{className:"ml-2",children:i}):null]}),le(Tr,{className:"mx-0 w-auto",children:Ua(Dr,{children:[le(Dt,{children:le(Ir,{href:"#",text:"上一页","aria-label":"上一页",onClick:s(e-1),className:l(a||e<=1)})}),ns(e,n).map((d,f)=>d==="…"?le(Dt,{className:"hidden sm:block",children:le(Ar,{})},`e${f}`):le(Dt,{className:Mr(d!==e&&"hidden sm:block"),children:le(ma,{href:"#",isActive:d===e,onClick:s(d),className:l(!!a),children:d})},d)),le(Dt,{children:le(zr,{href:"#",text:"下一页","aria-label":"下一页",onClick:s(e+1),className:l(a||e>=n)})})]})})]})}import{useState as us}from"react";import{ChevronDownIcon as fs,RotateCcwIcon as gs,SearchIcon as bs}from"lucide-react";import{ChevronDownIcon as is}from"lucide-react";import{jsx as ye,jsxs as Br}from"react/jsx-runtime";function dt({id:e,value:t,onChange:a,options:o,placeholder:r,multiple:i}){let n=s=>{if(!i)return a(s);let l=t.split(/[,,、]/).map(d=>d.trim()).filter(Boolean);a(l.includes(s)?l.join(","):[...l,s].join(","))};return Br(Qe,{children:[ye(Yt,{id:e,value:t,placeholder:r??"请选择或输入",onChange:s=>a(s.target.value)}),ye(Ye,{align:"inline-end",children:Br(et,{children:[ye(tt,{asChild:!0,children:ye(or,{size:"icon-xs","aria-label":"展开选项",children:ye(is,{})})}),ye(at,{align:"end",className:"max-h-72 overflow-y-auto",children:ye(kt,{children:o.map(s=>ye(_e,{onSelect:()=>n(s.value),children:s.label??s.value},s.value))})})]})})]})}import{cn as Er}from"cn";import{jsx as Lr}from"react/jsx-runtime";function zt({className:e,size:t="default",...a}){return Lr("div",{"data-slot":"card","data-size":t,className:Er("group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",e),...a})}function At({className:e,...t}){return Lr("div",{"data-slot":"card-content",className:Er("px-(--card-spacing)",e),...t})}import{useMemo as cs}from"react";import{cva as ps}from"class-variance-authority";import{cn as ua}from"cn";import{cn as ss}from"cn";import{Label as ls}from"radix-ui";import{jsx as ds}from"react/jsx-runtime";function ct({className:e,...t}){return ds(ls.Root,{"data-slot":"label",className:ss("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",e),...t})}import{jsx as pt,jsxs as Xp}from"react/jsx-runtime";function mt({className:e,...t}){return pt("div",{"data-slot":"field-group",className:ua("group/field-group @container/field-group flex w-full flex-col gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4",e),...t})}var ms=ps("group/field flex w-full gap-2 data-[invalid=true]:text-destructive",{variants:{orientation:{vertical:"flex-col *:w-full [&>.sr-only]:w-auto",horizontal:"flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",responsive:"flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px"}},defaultVariants:{orientation:"vertical"}});function F({className:e,orientation:t="vertical",...a}){return pt("div",{role:"group","data-slot":"field","data-orientation":t,className:ua(ms({orientation:t}),e),...a})}function _({className:e,...t}){return pt(ct,{"data-slot":"field-label",className:ua("group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border has-[>[data-slot=field]]:not-has-[:disabled,[data-disabled]]:hover:bg-muted/50 has-[>[data-slot=field]]:has-[:focus-visible]:border-ring has-[>[data-slot=field]]:has-[:focus-visible]:ring-3 has-[>[data-slot=field]]:has-[:focus-visible]:ring-ring/50 *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10","has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col",e),...t})}function Fr({className:e,children:t,errors:a,...o}){let r=cs(()=>{if(t)return t;if(!a?.length)return null;let i=[...new Map(a.map(n=>[n?.message,n])).values()];return i?.length==1?i[0]?.message:pt("ul",{className:"ml-4 flex list-disc flex-col gap-1",children:i.map((n,s)=>n?.message&&pt("li",{children:n.message},s))})},[t,a]);return r?pt("div",{role:"alert","data-slot":"field-error",className:ua("text-sm font-normal text-destructive",e),...o,children:r}):null}import{cn as _r}from"cn";import{jsx as x,jsxs as I}from"react/jsx-runtime";var Gr="grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4";function Or({spec:e,values:t,set:a,currency:o}){let r=`ff-${e.id}`;switch(e.type){case"range":{let i=e.price?o:e.unit,n=(s,l,d)=>I(Qe,{children:[x(Yt,{id:s.endsWith("gte")?r:void 0,inputMode:"decimal","aria-label":`${e.label}${d}`,placeholder:l,value:t[s]??"",onChange:f=>a(s,f.target.value)}),i&&x(Ye,{align:"inline-end",children:x(rr,{children:i})})]});return I(F,{children:[x(_,{htmlFor:r,children:e.label}),I("div",{className:"flex items-center gap-2",children:[n(`${e.id}.gte`,"最小","最小值"),x("span",{className:"text-muted-foreground",children:"至"}),n(`${e.id}.lte`,"最大","最大值")]})]})}case"dateRange":return I(F,{children:[x(_,{htmlFor:r,children:e.label}),I("div",{className:"flex items-center gap-2",children:[x(X,{id:r,type:"date","aria-label":`${e.label}开始`,value:t[`${e.id}.gte`]??"",onChange:i=>a(`${e.id}.gte`,i.target.value)}),x("span",{className:"text-muted-foreground",children:"至"}),x(X,{type:"date","aria-label":`${e.label}结束`,value:t[`${e.id}.lte`]??"",onChange:i=>a(`${e.id}.lte`,i.target.value)})]})]});case"text":return I(F,{children:[x(_,{htmlFor:r,children:e.label}),x(X,{id:r,placeholder:e.placeholder,value:t[e.id]??"",onChange:i=>a(e.id,i.target.value)})]});case"list":return I(F,{children:[x(_,{htmlFor:r,children:e.label}),e.options?x(dt,{id:r,placeholder:e.placeholder,value:t[e.id]??"",options:e.options.map(i=>({value:i})),multiple:e.multiple,onChange:i=>a(e.id,i)}):x(X,{id:r,placeholder:e.placeholder,value:t[e.id]??"",onChange:i=>a(e.id,i.target.value)})]});case"flags":{let i=io(t[e.id]);return I(F,{children:[x(_,{children:e.label}),x("div",{className:"flex flex-wrap gap-x-4 gap-y-2 pt-1",children:e.options.map(n=>I(ct,{className:"flex items-center gap-2 font-normal",children:[x(Oe,{checked:i.includes(n.value),onCheckedChange:s=>a(e.id,so(t[e.id],n.value,s===!0))}),n.label]},n.value))})]})}case"bool":case"select":{let i=e.type==="bool"?[{value:"yes",label:"是"},{value:"no",label:"否"}]:e.options,n=e.type==="select"&&e.required,s=n?t[e.id]||i[0]?.value:t[e.id]||"any";return I(F,{children:[x(_,{htmlFor:r,children:e.label}),I(Ae,{value:s,onValueChange:l=>a(e.id,l==="any"?"":l),children:[x(Be,{id:r,className:"w-full",children:x(Me,{})}),x(Ee,{children:I(yt,{children:[!n&&x(ge,{value:"any",children:"不限"}),i.map(l=>x(ge,{value:l.value,children:l.label},l.value))]})})]})]})}}}function vs({primary:e,more:t,values:a,onChange:o,onSearch:r,onReset:i,loading:n,currency:s,searchLabel:l="查询",searchIcon:d,disabled:f,prepend:R,append:P,note:v}){let[C,h]=us(!1),T=(w,q)=>o({...a,[w]:q}),y=t.filter(w=>no(w).some(q=>a[q])).length;return x(zt,{children:x(At,{children:I("form",{onSubmit:w=>{w.preventDefault(),r()},className:"flex flex-col gap-4",children:[I(mt,{className:Gr,children:[R,e.map(w=>x(Or,{spec:w,values:a,set:T,currency:s},w.id)),P]}),I(Ke,{open:C,onOpenChange:h,children:[x(We,{children:x(mt,{className:_r(Gr,"pb-4"),children:t.map(w=>x(Or,{spec:w,values:a,set:T,currency:s},w.id))})}),I("div",{className:"flex flex-wrap items-center gap-2",children:[I(m,{type:"submit",disabled:n||f,children:[n?x(U,{"data-icon":"inline-start"}):d??x(bs,{"data-icon":"inline-start"}),l]}),I(m,{type:"button",variant:"outline",onClick:i,children:[x(gs,{"data-icon":"inline-start"}),"重置"]}),t.length>0&&x(Ue,{asChild:!0,children:I(m,{type:"button",variant:"ghost",children:["更多条件",y?`(已填 ${y})`:"",x(fs,{"data-icon":"inline-end",className:_r("transition-transform",C&&"rotate-180")})]})}),v&&x("p",{className:"text-xs text-muted-foreground sm:ml-auto",children:v})]})]})]})})})}import{Columns3Icon as xs}from"lucide-react";import{jsx as $e,jsxs as Mt}from"react/jsx-runtime";function hs({columns:e,visible:t,onChange:a,onReset:o}){return Mt(et,{children:[$e(tt,{asChild:!0,children:Mt(m,{variant:"outline",size:"sm",children:[$e(xs,{"data-icon":"inline-start"}),"列设置"]})}),Mt(at,{align:"end",className:"max-h-96 w-56 overflow-y-auto",children:[Mt(St,{children:["显示的列(",t.length,"/",e.length,")"]}),Mt(kt,{children:[$e(_e,{onSelect:r=>(r.preventDefault(),o()),children:"恢复默认"}),$e(_e,{onSelect:r=>(r.preventDefault(),a(e.map(i=>i.key))),children:"全部显示"})]}),$e(ta,{}),$e(kt,{children:e.map(r=>$e(gr,{checked:t.includes(r.key),onSelect:i=>i.preventDefault(),onCheckedChange:i=>a(i?e.map(n=>n.key).filter(n=>n===r.key||t.includes(n)):t.filter(n=>n!==r.key)),children:r.label},r.key))})]})]})}import{useState as Ns}from"react";import{cn as we}from"cn";import{AlertDialog as Ne}from"radix-ui";import{jsx as Z,jsxs as ws}from"react/jsx-runtime";function Vr({...e}){return Z(Ne.Root,{"data-slot":"alert-dialog",...e})}function Cs({...e}){return Z(Ne.Portal,{"data-slot":"alert-dialog-portal",...e})}function ys({className:e,...t}){return Z(Ne.Overlay,{"data-slot":"alert-dialog-overlay",className:we("fixed inset-0 z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",e),...t})}function $r({className:e,size:t="default",...a}){return ws(Cs,{children:[Z(ys,{}),Z(Ne.Content,{"data-slot":"alert-dialog-content","data-size":t,className:we("group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none max-w-[calc(100%-2rem)] sm:max-w-sm data-[size=sm]:sm:max-w-xs data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",e),...a})]})}function Hr({className:e,...t}){return Z("div",{"data-slot":"alert-dialog-header",className:we("grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-4 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]",e),...t})}function Kr({className:e,...t}){return Z("div",{"data-slot":"alert-dialog-footer",className:we("-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end",e),...t})}function Ur({className:e,...t}){return Z(Ne.Title,{"data-slot":"alert-dialog-title",className:we("font-heading text-base font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2",e),...t})}function Wr({className:e,...t}){return Z(Ne.Description,{"data-slot":"alert-dialog-description",className:we("text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",e),...t})}function Zr({className:e,variant:t="default",size:a="default",...o}){return Z(m,{variant:t,size:a,asChild:!0,children:Z(Ne.Action,{"data-slot":"alert-dialog-action",className:we(e),...o})})}function qr({className:e,variant:t="outline",size:a="default",...o}){return Z(m,{variant:t,size:a,asChild:!0,children:Z(Ne.Cancel,{"data-slot":"alert-dialog-cancel",className:we(e),...o})})}import{jsx as xe,jsxs as fa}from"react/jsx-runtime";function Za({open:e,onOpenChange:t,title:a,description:o,details:r,requireCheck:i,confirmLabel:n="确认",cancelLabel:s="取消",destructive:l,busy:d,onConfirm:f}){let[R,P]=Ns(!1),v=!!i&&!R;return xe(Vr,{open:e,onOpenChange:C=>{C||P(!1),t(C)},children:fa($r,{children:[fa(Hr,{children:[xe(Ur,{children:a}),o&&xe(Wr,{children:o})]}),r?.length?xe("ul",{className:"list-disc space-y-1 pl-5 text-sm text-muted-foreground",children:r.map((C,h)=>xe("li",{children:C},h))}):null,i&&fa(ct,{className:"flex items-start gap-2 text-sm font-normal",children:[xe(Oe,{checked:R,onCheckedChange:C=>P(C===!0),className:"mt-0.5"}),xe("span",{children:i})]}),fa(Kr,{children:[xe(qr,{children:s}),xe(Zr,{variant:l?"destructive":void 0,disabled:d||v,onClick:C=>{C.preventDefault(),!v&&f()},children:n})]})]})})}import{useCallback as zs,useEffect as As,useState as K}from"react";import{PencilIcon as Ms,PlusIcon as Bs,PowerIcon as Es,RotateCcwIcon as Ls,SearchIcon as Fs,Trash2Icon as _s}from"lucide-react";import{toast as ut}from"sonner";import{cva as Ps}from"class-variance-authority";import{cn as qa}from"cn";import{jsx as Xa}from"react/jsx-runtime";var ks=Ps("group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-card text-card-foreground",destructive:"bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current"}},defaultVariants:{variant:"default"}});function Xr({className:e,variant:t,...a}){return Xa("div",{"data-slot":"alert",role:"alert",className:qa(ks({variant:t}),e),...a})}function Qr({className:e,...t}){return Xa("div",{"data-slot":"alert-title",className:qa("font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",e),...t})}function Yr({className:e,...t}){return Xa("div",{"data-slot":"alert-description",className:qa("text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",e),...t})}import{cva as Ss}from"class-variance-authority";import{cn as Rs}from"cn";import{Slot as Ts}from"radix-ui";import{jsx as Is}from"react/jsx-runtime";var Ds=Ss("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",secondary:"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",destructive:"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",outline:"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",ghost:"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",link:"text-primary underline-offset-4 hover:underline"}},defaultVariants:{variant:"default"}});function ga({className:e,variant:t="default",asChild:a=!1,...o}){let r=a?Ts.Root:"span";return Is(r,{"data-slot":"badge","data-variant":t,className:Rs(Ds({variant:t}),e),...o})}import{jsx as c,jsxs as b}from"react/jsx-runtime";var Jr=[{value:"手动添加"},{value:"侵权投诉"},{value:"商标库"},{value:"平台通知"},{value:"行业经验"}],Bt={word:"",cnName:"",status:"all",source:""},oe=e=>e==null?"":String(e);function Gs({kind:e,description:t}){let a=ya[e],o=_t(),[r,i]=K(),[n,s]=K(""),[l,d]=K(Bt),[f,R]=K(Bt),[P,v]=K(1),[C,h]=K([]),[T,y]=K(0),[w,q]=K(!1),[Pe,pe]=K(null),[j,ft]=K(null),[gt,me]=K(),ue=zs(async(u,D,z)=>{let he=Re();if(!he)throw new Error("多维表客户端尚未初始化");let re=[];D.word.trim()&&re.push({fieldName:"词条",operator:"contains",value:D.word.trim()}),D.cnName.trim()&&re.push({fieldName:"中文名",operator:"contains",value:D.cnName.trim()}),D.status!=="all"&&re.push({fieldName:"状态",operator:"is",value:D.status}),D.source.trim()&&re.push({fieldName:"来源",operator:"contains",value:D.source.trim()}),R(D),q(!0);try{let B=rn=>he.listRecords({tableId:u,page:rn,perPage:It,fieldNames:["词条","中文名","状态","来源","创建时间"],filter:re.length?{conjunction:"and",conditions:re}:void 0}),ke=await B(z),Se=Math.max(1,Math.ceil(ke.total/It));z>Se&&(z=Se,ke=await B(z)),v(z),h(ke.records),y(ke.total)}catch(B){ut.error(`查询失败:${fe(B)}`)}finally{q(!1)}},[]);As(()=>{try{vo().ensureWordTable(e).then(u=>(i(u.tableId),ue(u.tableId,Bt,1))).catch(u=>s(fe(u)))}catch(u){s(fe(u))}},[e,ue]);let bt=()=>r?ue(r,f,P):Promise.resolve(),va=u=>{u?.preventDefault(),r&&ue(r,{...l},1)},Ya=()=>{d(Bt),r&&ue(r,Bt,1)},xa=async u=>{let D=Re();if(!r||!D)return;let z=u.fields.状态==="启用"?"禁用":"启用";me(u.recordId);try{await D.updateRecords(r,[{recordId:u.recordId,fields:{状态:z}}]),ut.success(`已${z}「${oe(u.fields.词条)}」`),await bt()}catch(he){ut.error(fe(he))}finally{me(void 0)}},g=async()=>{let u=Re();if(!(!r||!j||!u)){me(j.recordId);try{await u.deleteRecords(r,[j.recordId]),ut.success(`已删除「${oe(j.fields.词条)}」`),ft(null),await bt()}catch(D){ut.error(fe(D))}finally{me(void 0)}}};return n?b(Xr,{variant:"destructive",children:[b(Qr,{children:["无法打开",a,"表"]}),c(Yr,{children:n})]}):b("div",{className:"flex flex-col gap-4",children:[b("div",{children:[c("h1",{className:"text-lg font-semibold",children:a}),c("p",{className:"text-sm text-muted-foreground",children:t})]}),c(zt,{children:c(At,{children:b("form",{onSubmit:va,children:[b(mt,{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4",children:[b(F,{children:[c(_,{htmlFor:`${e}-q-word`,children:"词条"}),c(X,{id:`${e}-q-word`,value:l.word,placeholder:"包含",onChange:u=>d({...l,word:u.target.value})})]}),b(F,{children:[c(_,{htmlFor:`${e}-q-cn`,children:"中文名"}),c(X,{id:`${e}-q-cn`,value:l.cnName,placeholder:"包含",onChange:u=>d({...l,cnName:u.target.value})})]}),b(F,{children:[c(_,{htmlFor:`${e}-q-status`,children:"状态"}),b(Ae,{value:l.status,onValueChange:u=>d({...l,status:u}),children:[c(Be,{id:`${e}-q-status`,className:"w-full",children:c(Me,{})}),c(Ee,{children:b(yt,{children:[c(ge,{value:"all",children:"全部"}),Ca.map(u=>c(ge,{value:u,children:u},u))]})})]})]}),b(F,{children:[c(_,{htmlFor:`${e}-q-source`,children:"来源"}),c(dt,{id:`${e}-q-source`,value:l.source,options:Jr,onChange:u=>d({...l,source:u})})]})]}),b("div",{className:"mt-4 flex flex-wrap gap-2",children:[b(m,{type:"submit",disabled:!r||w,children:[c(Fs,{"data-icon":"inline-start"}),"查询"]}),b(m,{type:"button",variant:"outline",onClick:Ya,children:[c(Ls,{"data-icon":"inline-start"}),"重置"]}),b(m,{type:"button",variant:"secondary",className:"sm:ml-auto",disabled:!r,onClick:()=>pe("new"),children:[c(Bs,{"data-icon":"inline-start"}),"新增",a]})]})]})})}),c(zt,{children:b(At,{className:"flex flex-col gap-4",children:[b(sa,{children:[c(la,{children:b(ve,{children:[c(te,{children:"词条"}),c(te,{children:"中文名"}),c(te,{children:"状态"}),c(te,{children:"来源"}),c(te,{children:"创建时间"}),c(te,{className:"sticky right-0 bg-background text-right",children:"操作"})]})}),c(da,{children:(w||!r)&&C.length===0?Array.from({length:5},(u,D)=>c(ve,{children:c(H,{colSpan:6,children:c(Ot,{className:"h-6 w-full"})})},D)):C.map(u=>b(ve,{className:w?"opacity-60":void 0,children:[c(H,{className:"font-medium",children:oe(u.fields.词条)}),c(H,{children:oe(u.fields.中文名)||"-"}),c(H,{children:c(ga,{variant:u.fields.状态==="启用"?"default":"secondary",children:oe(u.fields.状态)||"-"})}),c(H,{children:oe(u.fields.来源)||"-"}),c(H,{className:"whitespace-nowrap",children:Co(u.fields.创建时间,o)}),c(H,{className:"sticky right-0 bg-background",children:b("div",{className:"flex justify-end gap-1",children:[b(m,{variant:"ghost",size:"sm",onClick:()=>pe(u),children:[c(Ms,{"data-icon":"inline-start"}),"修改"]}),b(m,{variant:"ghost",size:"sm",disabled:gt===u.recordId,onClick:()=>xa(u),children:[gt===u.recordId?c(U,{"data-icon":"inline-start"}):c(Es,{"data-icon":"inline-start"}),u.fields.状态==="启用"?"禁用":"启用"]}),b(m,{variant:"ghost",size:"sm",onClick:()=>ft(u),children:[c(_s,{"data-icon":"inline-start"}),"删除"]})]})})]},u.recordId))})]}),!w&&r&&C.length===0&&c(aa,{children:b(oa,{children:[b(ra,{children:["暂无",a]}),b(na,{children:["点击「新增",a,"」添加第一条词条。"]})]})}),c(Wa,{page:P,total:T,disabled:w,onChange:u=>r&&ue(r,f,u)})]})}),Pe&&r&&c(Os,{kind:e,tableId:r,record:Pe==="new"?null:Pe,onClose:()=>pe(null),onSaved:()=>{pe(null),bt()}}),c(Za,{open:!!j,onOpenChange:u=>!u&&ft(null),title:`删除${a}「${oe(j?.fields.词条)}」?`,description:"删除后无法恢复。只想暂时不用的话,可以改为「禁用」。",confirmLabel:"删除",destructive:!0,busy:gt===j?.recordId,onConfirm:g})]})}function Os({kind:e,tableId:t,record:a,onClose:o,onSaved:r}){let i=ya[e],[n,s]=K({词条:oe(a?.fields.词条),中文名:oe(a?.fields.中文名),状态:oe(a?.fields.状态)||"启用",来源:oe(a?.fields.来源)||(a?"":"手动添加")}),[l,d]=K(""),[f,R]=K(!1);return c(Ut,{open:!0,onOpenChange:v=>!v&&o(),children:c(Wt,{className:"flex max-h-[90svh] flex-col",children:b("form",{onSubmit:async v=>{v.preventDefault();let C=Re();if(!C){d("多维表客户端尚未初始化");return}let h=n.词条.trim();if(!h){d("请输入词条");return}R(!0),d("");try{if((await C.listRecords({tableId:t,perPage:5,fieldNames:["词条"],filter:{conditions:[{fieldName:"词条",operator:"is",value:h}]}})).records.some(w=>w.recordId!==a?.recordId)){d(`「${h}」已存在`);return}let y={...n,词条:h,中文名:n.中文名.trim(),来源:n.来源.trim()};a?await C.updateRecords(t,[{recordId:a.recordId,fields:y}]):await C.createRecords(t,[{...y,创建时间:new Date().toISOString()}]),ut.success(a?"已保存修改":`已新增${i}「${h}」`),r()}catch(T){d(fe(T))}finally{R(!1)}},className:"flex min-h-0 flex-1 flex-col gap-4",children:[b(Zt,{children:[c(Xt,{children:a?`修改${i}`:`新增${i}`}),c(Qt,{children:"启用状态的词条会在「添加到选品库」时用于过滤商品。"})]}),c("div",{className:"-mx-4 min-h-0 flex-1 overflow-y-auto overscroll-contain px-4",children:b(mt,{children:[b(F,{"data-invalid":l?!0:void 0,children:[c(_,{htmlFor:"word-term",children:"词条"}),c(X,{id:"word-term",autoFocus:!0,value:n.词条,"aria-invalid":l?!0:void 0,onChange:v=>s({...n,词条:v.target.value})}),l&&c(Fr,{children:l})]}),b(F,{children:[c(_,{htmlFor:"word-cn",children:"中文名"}),c(X,{id:"word-cn",value:n.中文名,onChange:v=>s({...n,中文名:v.target.value})})]}),b(F,{children:[c(_,{htmlFor:"word-status",children:"状态"}),b(Ae,{value:n.状态,onValueChange:v=>s({...n,状态:v}),children:[c(Be,{id:"word-status",className:"w-full",children:c(Me,{})}),c(Ee,{children:c(yt,{children:Ca.map(v=>c(ge,{value:v,children:v},v))})})]})]}),b(F,{children:[c(_,{htmlFor:"word-source",children:"来源"}),c(dt,{id:"word-source",value:n.来源,options:Jr,onChange:v=>s({...n,来源:v})})]})]})}),b(qt,{children:[c(m,{type:"button",variant:"outline",onClick:o,children:"取消"}),b(m,{type:"submit",disabled:f,children:[f&&c(U,{"data-icon":"inline-start"}),"保存"]})]})]})})})}import{cn as Vs}from"cn";import{jsx as O,jsxs as de}from"react/jsx-runtime";var $s={已完成:"border-emerald-600/40 bg-emerald-600/10 text-emerald-700 dark:text-emerald-400",需人工处理:"border-amber-600/40 bg-amber-600/10 text-amber-700 dark:text-amber-400",失败:"border-destructive/40 bg-destructive/10 text-destructive"};function Hs({task:e,running:t,onOpen:a,onStop:o,onRetry:r,className:i}){let n=e.budget&&(e.budget.used>0||e.budget.estimate)?e.budget.estimate?`${e.budget.used} / ${e.budget.estimate}${e.budget.unit??""}`:`${e.budget.used}${e.budget.unit??""}`:void 0;return de("div",{className:Vs("rounded-lg border p-3",i),children:[de("div",{className:"flex flex-wrap items-center gap-2",children:[O("button",{type:"button",className:"min-w-0 flex-1 truncate text-left font-medium text-primary underline-offset-4 hover:underline",onClick:a,children:e.code}),O(ga,{variant:"outline",className:$s[e.status]??"",children:e.status||"—"})]}),(e.stage||e.hint)&&O("p",{className:"mt-1 text-xs text-muted-foreground",children:[e.stage,e.hint].filter(Boolean).join(" · ")}),e.stages?.length?O("div",{className:"mt-2 flex flex-wrap gap-1",children:e.stages.map(s=>de("span",{className:"rounded border px-1.5 py-0.5 text-xs tabular-nums",title:s.label,children:[s.label," ",s.pass,"/",s.input,s.todo?de("span",{className:"text-amber-600 dark:text-amber-400",children:[" +",s.todo]}):null]},s.key))}):null,de("dl",{className:"mt-2 grid grid-cols-2 gap-x-3 gap-y-1 text-xs text-muted-foreground",children:[n&&de("div",{className:"flex justify-between gap-2",children:[O("dt",{children:"算力"}),O("dd",{className:"tabular-nums",children:n})]}),e.rounds!=null&&de("div",{className:"flex justify-between gap-2",children:[O("dt",{children:"轮次"}),O("dd",{className:"tabular-nums",children:e.rounds})]}),e.startedAt&&de("div",{className:"flex justify-between gap-2",children:[O("dt",{children:"开始"}),O("dd",{className:"tabular-nums",children:e.startedAt})]}),e.lastActiveAt&&de("div",{className:"flex justify-between gap-2",children:[O("dt",{children:"最后活动"}),O("dd",{className:"tabular-nums",children:e.lastActiveAt})]})]}),de("div",{className:"mt-2 flex flex-wrap gap-1",children:[a&&O(m,{variant:"ghost",size:"sm",onClick:a,children:"查看"}),t&&o&&O(m,{variant:"ghost",size:"sm",onClick:o,children:"停止"}),r&&O(m,{variant:"ghost",size:"sm",onClick:r,children:"重试未完成"})]})]})}import{useEffect as tn,useRef as Ws,useState as Zs}from"react";import{CheckIcon as qs,CopyIcon as Xs}from"lucide-react";import{cn as jr}from"cn";import{ScrollArea as Et}from"radix-ui";import{jsx as Lt,jsxs as Us}from"react/jsx-runtime";function en({className:e,children:t,...a}){return Us(Et.Root,{"data-slot":"scroll-area",className:jr("relative",e),...a,children:[Lt(Et.Viewport,{"data-slot":"scroll-area-viewport",className:"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1",children:t}),Lt(Ks,{}),Lt(Et.Corner,{})]})}function Ks({className:e,orientation:t="vertical",...a}){return Lt(Et.ScrollAreaScrollbar,{"data-slot":"scroll-area-scrollbar","data-orientation":t,orientation:t,className:jr("flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent",e),...a,children:Lt(Et.ScrollAreaThumb,{"data-slot":"scroll-area-thumb",className:"relative flex-1 rounded-full bg-border"})})}import{jsx as He,jsxs as ba}from"react/jsx-runtime";var Qs=/^\[(\d{4}-\d{2}-\d{2}T[\d:.]+Z)\]/;function Ys(e,t){let a=e.match(Qs);if(!a)return e;let o=new Date(a[1]);return Number.isNaN(o.getTime())?e:`[${new Intl.DateTimeFormat("zh-CN",{timeZone:t,month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).format(o)}]${e.slice(a[0].length)}`}function Js({text:e,timeZone:t,className:a}){let o=String(e??"").trim(),r=o?o.split(`
2
+ `).map(d=>Ys(d,t)):[],i=Ws(null),[n,s]=Zs(!1);tn(()=>{i.current?.scrollIntoView({block:"nearest"})},[o]),tn(()=>{if(!n)return;let d=setTimeout(()=>s(!1),1500);return()=>clearTimeout(d)},[n]);async function l(){try{await navigator.clipboard.writeText(r.join(`
3
+ `)),s(!0)}catch{}}return ba("section",{className:a,children:[ba("div",{className:"mb-2 flex flex-wrap items-center gap-2",children:[He("h3",{className:"text-sm font-medium",children:"工作流执行日志"}),He("span",{className:"text-xs text-muted-foreground",children:"保留最近 50 条 · 时间按所选时区"}),o&&ba(m,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>{l()},children:[n?He(qs,{"data-icon":"inline-start"}):He(Xs,{"data-icon":"inline-start"}),n?"已复制":"复制"]})]}),o?ba(en,{className:"h-56 rounded border bg-muted/40",children:[He("pre",{className:"whitespace-pre-wrap break-words p-3 text-xs leading-relaxed",children:r.join(`
4
+ `)}),He("div",{ref:i})]}):He("p",{className:"rounded border border-dashed p-3 text-xs text-muted-foreground",children:"暂无执行日志"})]})}import{CheckIcon as js,ChevronRightIcon as an,LoaderIcon as el,SettingsIcon as tl}from"lucide-react";import{cn as Qa}from"cn";import{jsx as G,jsxs as ce}from"react/jsx-runtime";var al={done:"bg-emerald-600 text-white border-emerald-600",active:"bg-primary text-primary-foreground border-primary",idle:"bg-muted text-muted-foreground border-border"};function on(e){return e.input===0||e.input===e.pass+e.fail+e.todo}function ol({startLabel:e="启动条件",startSummary:t,stages:a,countsOf:o,stateOf:r,current:i,onSelect:n,tail:s}){return ce("div",{className:"flex flex-col gap-2 lg:flex-row lg:items-stretch",children:[ce("div",{className:"flex min-w-0 items-center gap-2 rounded border bg-muted/40 px-3 py-2 lg:shrink-0",children:[G("span",{className:"flex size-6 shrink-0 items-center justify-center rounded-full border bg-background",children:G(tl,{className:"size-3.5"})}),ce("div",{className:"min-w-0",children:[G("p",{className:"text-sm font-medium",children:e}),G("p",{className:"truncate text-xs text-muted-foreground",children:t})]})]}),a.map((l,d)=>{let f=r(l.key),R=o(l.key),P=i===l.key,v=on(R);return ce("div",{className:"flex min-w-0 items-stretch gap-2 lg:shrink-0",children:[G(an,{className:"hidden size-4 shrink-0 self-center text-muted-foreground lg:block"}),ce(m,{variant:P?"secondary":"ghost",onClick:()=>n(l.key),"aria-pressed":P,className:Qa("h-auto w-full min-w-0 justify-start gap-2 border px-3 py-2 text-left lg:w-auto lg:min-w-40",P&&"border-primary"),children:[G("span",{className:Qa("flex size-6 shrink-0 items-center justify-center rounded-full border text-xs",al[f]),children:f==="done"?G(js,{className:"size-3.5"}):f==="active"?G(el,{className:"size-3.5 animate-spin"}):d+1}),ce("span",{className:"min-w-0 flex-1",children:[G("span",{className:"block text-sm font-medium",children:l.label}),ce("span",{className:"block text-xs tabular-nums text-muted-foreground",children:["输入 ",R.input," · 通过 ",G("span",{className:"text-emerald-600 dark:text-emerald-400",children:R.pass})," · 不通过"," ",R.fail," · 未完成 ",G("span",{className:Qa(R.todo>0&&"text-amber-600 dark:text-amber-400"),children:R.todo})]}),!v&&G("span",{className:"block text-xs text-amber-600 dark:text-amber-400",children:"数不平,正在执行中"})]})]})]},l.key)}),s&&ce("div",{className:"flex min-w-0 items-stretch gap-2 lg:shrink-0",children:[G(an,{className:"hidden size-4 shrink-0 self-center text-muted-foreground lg:block"}),ce("div",{className:"flex min-w-0 items-center gap-2 rounded border bg-muted/40 px-3 py-2 lg:min-w-32",children:[G("span",{className:"flex size-6 shrink-0 items-center justify-center rounded-full border bg-background",children:s.icon}),ce("div",{className:"min-w-0",children:[G("p",{className:"text-sm font-medium",children:s.label}),G("p",{className:"text-xs tabular-nums text-muted-foreground",children:s.summary})]})]})]})]})}export{La as AgentPanel,Fa as AgentToggle,Gi as AppShell,Da as AppSidebar,Ui as AuthGate,hs as ColumnPicker,dt as ComboInput,Za as ConfirmDialog,za as CreditsDialog,Wa as DataPagination,ts as DataTable,vs as FilterPanel,Aa as Markdown,It as PAGE_SIZE,ol as StageProgress,Hs as TaskCard,Js as TaskLog,qi as ThemeProvider,Oa as TimezoneSelect,Va as UserMenu,Gs as WordManager,on as countsBalanced,vt as findNav};
@@ -1 +1 @@
1
- "use client";import{a as n,b as s,c as u,d as a,e as b,f as d,g,h,i as j,j as k,k as q,l as v,m as w,n as y}from"../chunk-SJFNXBPH.js";import{o,p as r,q as e,r as t,s as f,t as m,u as p,v as x,w as c,x as i,y as l}from"../chunk-7K2XKPOX.js";export{j as AGENT_DONE_EVENT,k as AgentProvider,t as authIdentity,s as browserTimeZone,w as buildAgentPrompt,h as formatDateTime,l as getApiKey,r as getAuthState,c as handleGatewayError,e as initialAuthState,m as loadApiKey,p as login,x as logout,i as maskApiKey,u as setTimeZone,f as startAuth,o as subscribeAuth,d as timeZoneOffset,y as truncate,q as useAgent,v as useAgentPageContext,n as useAuth,b as useIsBrowserTimeZone,a as useTimeZone,g as zonedDayStart};
1
+ "use client";import{a as n,b as s,c as u,d as a,e as b,f as d,g,h,i as j,j as k,k as q,l as v,m as w,n as y}from"../chunk-2DZYZ6RZ.js";import{p as o,q as r,r as e,s as t,t as f,u as m,v as p,w as x,x as c,y as i,z as l}from"../chunk-WREK6TXJ.js";export{j as AGENT_DONE_EVENT,k as AgentProvider,t as authIdentity,s as browserTimeZone,w as buildAgentPrompt,h as formatDateTime,l as getApiKey,r as getAuthState,c as handleGatewayError,e as initialAuthState,m as loadApiKey,p as login,x as logout,i as maskApiKey,u as setTimeZone,f as startAuth,o as subscribeAuth,d as timeZoneOffset,y as truncate,q as useAgent,v as useAgentPageContext,n as useAuth,b as useIsBrowserTimeZone,a as useTimeZone,g as zonedDayStart};
@@ -1,10 +1,9 @@
1
+ import * as _linkfox_web_http from '@linkfox-web/http';
1
2
  import { LinkfoxHttpError } from '@linkfox-web/http';
2
- export { F as FilterValues, N as NavGroup, a as NavItem, U as UiFilterSpec, b as filterKeys, f as findNav, c as flagList, t as toggleFlag } from '../filter-spec-BHwe1PQ-.js';
3
- import * as st from '@linkfox-web/ai-tools/smart-table';
4
- import { FieldInput, NotebookInfo as NotebookInfo$1, TableInfo as TableInfo$1, RecordFilter, SmartRecord } from '@linkfox-web/ai-tools/smart-table';
5
- export { Attachment, FieldInfo, FieldType, FilterCondition, ListRecordsResult as ListRecordsResponse, RecordFilter, SmartRecord } from '@linkfox-web/ai-tools/smart-table';
3
+ export { b as FieldDef, F as FilterValues, N as NavGroup, a as NavItem, c as NotebookInfo, S as SmartTable, d as SmartTableConfig, e as SmartTableFieldDef, T as TableInfo, U as UiFilterSpec, g as WORD_FIELDS, h as WORD_KIND_LABEL, i as WORD_STATUS, j as WordHit, W as WordTableKey, k as activeSmartTable, l as activeWordTables, m as attachmentUrl, n as buildWordMatcher, o as createSmartTable, p as createWordTables, q as filterKeys, f as findNav, r as firstAttachment, s as flagList, t as isAttachmentList, u as nowIso, v as num, w as setActiveSmartTable, x as splitList, y as str, z as toggleFlag } from '../word-tables-B3Zc1OiL.js';
6
4
  export { A as AuthState, a as authIdentity, g as getApiKey, b as getAuthState, h as handleGatewayError, i as initialAuthState, l as loadApiKey, c as login, d as logout, m as maskApiKey, s as startAuth, e as subscribeAuth } from '../auth-RGVm8hmz.js';
7
5
  export { cn } from 'cn';
6
+ export { Attachment, FieldInfo, FieldType, FilterCondition, ListRecordsResult as ListRecordsResponse, RecordFilter, SmartRecord } from '@linkfox-web/ai-tools/smart-table';
8
7
  import 'lucide-react';
9
8
 
10
9
  /**
@@ -27,6 +26,8 @@ interface AppKitConfig {
27
26
  apiKey?: () => string | undefined;
28
27
  /** 应用 ID(`apl` 开头);为空则跳过访问登记 */
29
28
  applicationId?: string;
29
+ /** 单次接口请求超时(毫秒),默认沿用 SDK 的 30 秒;工作流类慢接口需要的模板自行调大 */
30
+ timeout?: number;
30
31
  /** 子路径部署的前缀,用于拼 SSO 回调地址 */
31
32
  basePath?: string;
32
33
  }
@@ -35,6 +36,25 @@ declare function appKitConfig(): AppKitConfig;
35
36
  /** 每次调用都重新读取,避免把构建期之外的 Key 变化缓存住 */
36
37
  declare function getConfiguredApiKey(): string | undefined;
37
38
 
39
+ /** LinkFox 充值页(按年付、AI 算力页签) */
40
+ declare const CREDITS_RECHARGE_URL = "https://ai.linkfox.com/usercenter/pricing?tab=ai&plan=personalYearly";
41
+ /**
42
+ * 查一次当前成员可用算力。失败(网络、401、接口异常)返回 undefined,
43
+ * 调用方据此静默跳过——余额检查不能挡住登录。
44
+ */
45
+ declare function fetchRemainingCredits(): Promise<number | undefined>;
46
+ /** 当前是否已因余额不足停止发起计费请求 */
47
+ declare function creditsExhausted(): boolean;
48
+ /** 触发熔断的错误(用于区分「团队没额度」和「成员限额」) */
49
+ declare function creditsError(): _linkfox_web_http.LinkfoxHttpError | undefined;
50
+ /** 订阅新的熔断事件;已熔断时不补发 */
51
+ declare function subscribeCreditsExhausted(listener: () => void): () => void;
52
+ /**
53
+ * 充值后重新检查:查到 > 0 就解除熔断并返回余额;
54
+ * 仍为 0 或查询失败返回原值/undefined,熔断保持不变。
55
+ */
56
+ declare function recheckCredits(): Promise<number | undefined>;
57
+
38
58
  declare const SESSION_EXPIRED_MESSAGE = "\u4F1A\u8BDD\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55";
39
59
  /** 会话过期:上游 invalid_token(token 失效 / 过期 / 被吊销),或网关直接回 401 */
40
60
  declare function isSessionExpired(e: unknown): boolean;
@@ -45,6 +65,11 @@ declare class LinkfoxError extends LinkfoxHttpError {
45
65
  declare function isAbortError(e: unknown): boolean;
46
66
  /** 算力 / 余额不足:重试无意义,轮询时直接抛出 */
47
67
  declare function isBalanceError(e: unknown): boolean;
68
+ /**
69
+ * 成员达到团队设置的算力限额(余额没耗尽,是管理员给这个成员封了顶)。
70
+ * 与「团队余额为 0」的后续动作不同:前者要找管理员提额度,后者充值即可。
71
+ */
72
+ declare function isMemberLimitError(e: unknown): boolean;
48
73
  /** 工具网关返回 401:配了固定 Key 时是 Key 失效,否则是登录态失效 */
49
74
  declare function isApiKeyInvalid(e: unknown): boolean;
50
75
  declare function errorMessage(e: unknown): string;
@@ -125,87 +150,6 @@ declare function runTask(prompt: string, modelId: string, { signal, onUpdate, se
125
150
  sessionId?: string;
126
151
  }): Promise<TaskView>;
127
152
 
128
- type FieldDef = FieldInput;
129
- type NotebookInfo = NotebookInfo$1;
130
- /** 模板 `linkfox.config.ts` 的 `smartTableConfig` 结构(多数字段来自 `config/smart-table.json`) */
131
- interface SmartTableFieldDef {
132
- name: string;
133
- type: string;
134
- [key: string]: unknown;
135
- }
136
- interface SmartTableConfig {
137
- /** 多维表(容器)名称 */
138
- notebookName: string;
139
- /** 多维表 id(nbk 开头):构建期由 NEXT_PUBLIC_NOTE_BOOK_ID 指定,留空则按名称查找 */
140
- notebookId?: string;
141
- /** 建多维表时的幂等键前缀,按应用区分 */
142
- requestKeyPrefix?: string;
143
- /** 数据表名称:key → 表名 */
144
- tables: Record<string, string>;
145
- /** 各数据表的列定义:ensureTable 建表/补列时使用 */
146
- fields?: Record<string, readonly SmartTableFieldDef[]>;
147
- }
148
- /** 数据表信息 + 字段名 → fieldId(工作流触发条件要用) */
149
- interface TableInfo extends TableInfo$1 {
150
- fieldIds: Record<string, string>;
151
- }
152
- /**
153
- * 按模板的 `smartTableConfig` 建一套多维表客户端。
154
- *
155
- * 用工厂而不是模块级单例:包不能读宿主的环境变量,表结构也只能由模板注入。
156
- * 模板的 `lib/app-kit.ts` 里 `setActiveSmartTable(createSmartTable(smartTableConfig))`,
157
- * 包内组件(如 LinkFox OS 助手)通过 `activeSmartTable()` 拿到同一个实例。
158
- */
159
- declare function createSmartTable<C extends SmartTableConfig>(config: C): {
160
- config: C;
161
- TABLE_FIELDS: Record<string, st.FieldInput[]>;
162
- getNotebook: () => Promise<st.NotebookInfo>;
163
- ensureTable: (key: string, fields?: FieldDef[]) => Promise<TableInfo>;
164
- listRecords: (params: {
165
- tableId: string;
166
- page?: number;
167
- perPage?: number;
168
- fieldNames?: string[];
169
- filter?: RecordFilter;
170
- }) => Promise<st.ListRecordsResult>;
171
- listAllRecords: (params: {
172
- tableId: string;
173
- fieldNames?: string[];
174
- filter?: RecordFilter;
175
- }, maxPages?: number) => Promise<st.SmartRecord[]>;
176
- createRecords: (tableId: string, rows: Record<string, unknown>[]) => Promise<st.SmartRecord[]>;
177
- updateRecords: (tableId: string, records: SmartRecord[]) => Promise<void>;
178
- deleteRecords: (tableId: string, recordIds: string[]) => Promise<void>;
179
- uploadAttachment: (tableId: string, recordId: string, fieldName: string, imageUrl: string) => Promise<st.Attachment>;
180
- getRecord: (tableId: string, primaryField: string, primaryValue: string, recordId: string, fieldNames?: string[]) => Promise<st.SmartRecord | null>;
181
- warmTables: () => Promise<TableInfo[]>;
182
- tableIdOf: (key: string) => Promise<string>;
183
- };
184
- type SmartTable = ReturnType<typeof createSmartTable>;
185
- /** 模板在 `lib/app-kit.ts` 里注册;包内组件用它读写多维表 */
186
- declare function setActiveSmartTable(client: SmartTable): void;
187
- /**
188
- * 没注册时返回 undefined,而不是抛错:包内组件(如助手面板)据此跳过需要多维表的功能,
189
- * 模板漏了 `import "@/lib/app-kit"` 时页面不会整块崩掉。
190
- */
191
- declare function activeSmartTable(): SmartTable | undefined;
192
- declare function isAttachmentList(v: unknown): v is st.Attachment[];
193
- /** 附件 cell 的第一项(附件列是数组,业务上主图只存一张) */
194
- declare function firstAttachment(v: unknown): st.Attachment | undefined;
195
- /**
196
- * 附件 cell 的临时访问地址。
197
- * 地址由多维表每次读取时重签(约 3 小时有效),所以只能在渲染 / 调用接口的当下取,不要存。
198
- * prefer=thumb 取缩略图(列表用),full 取原图(生图 / 生文输入用)。
199
- */
200
- declare function attachmentUrl(v: unknown, prefer?: "thumb" | "full"): string | undefined;
201
- /** 单元格取值工具 */
202
- declare const str: (v: unknown) => string;
203
- declare const num: (v: unknown) => number;
204
- /** 逗号 / 换行分隔的文本列 → 数组 */
205
- declare const splitList: (v: unknown) => string[];
206
- /** 多维表 date 列写入用 */
207
- declare const nowIso: () => string;
208
-
209
153
  /**
210
154
  * 工作流身份判定:**不靠名字**认「这条流是不是我这条模板流」。
211
155
  *
@@ -301,4 +245,4 @@ declare function isTriggerLinked(links: IRegisteredWorkflow[] | null, flowId: st
301
245
  */
302
246
  declare function initLinkfoxSdk(): void;
303
247
 
304
- export { AGENT_MODELS, type AppKitConfig, type FieldDef, type IClaimableFlow, type IRegisteredWorkflow, type IWorkflowClaim, LinkfoxError, type NotebookInfo, SESSION_EXPIRED_MESSAGE, type SmartTable, type SmartTableConfig, type SmartTableFieldDef, type TableInfo, type TaskFile, type TaskStep, type TaskView, activeSmartTable, appKitConfig, attachmentUrl, cancelTask, claimWorkflows, configureAppKit, createSmartTable, currentNotebookId, errorMessage, firstAttachment, gateway, getApplicationId, getConfiguredApiKey, getShareUrl, initLinkfoxSdk, isAbortError, isApiKeyInvalid, isAttachmentList, isBalanceError, isSessionExpired, isTriggerLinked, keyOf, listRegisteredWorkflows, nowIso, num, recordVisit, runTask, setActiveSmartTable, sleep, splitList, str, withWorkflowKey };
248
+ export { AGENT_MODELS, type AppKitConfig, CREDITS_RECHARGE_URL, type IClaimableFlow, type IRegisteredWorkflow, type IWorkflowClaim, LinkfoxError, SESSION_EXPIRED_MESSAGE, type TaskFile, type TaskStep, type TaskView, appKitConfig, cancelTask, claimWorkflows, configureAppKit, creditsError, creditsExhausted, currentNotebookId, errorMessage, fetchRemainingCredits, gateway, getApplicationId, getConfiguredApiKey, getShareUrl, initLinkfoxSdk, isAbortError, isApiKeyInvalid, isBalanceError, isMemberLimitError, isSessionExpired, isTriggerLinked, keyOf, listRegisteredWorkflows, recheckCredits, recordVisit, runTask, sleep, subscribeCreditsExhausted, withWorkflowKey };
@@ -1 +1 @@
1
- import{a as S,b as K,c as O,d as z,e as p,f as M,g as Q,h as V,i as X,j as Z,k as ee,l as w,m as te,n as re,o as oe,p as ne,q as ie,r as se,s as le}from"../chunk-IPHQW7KZ.js";import{a as b,b as T,c as W,d as h,e as C,f as R,g as $,h as F,i as L,j as B,k as N,l as D,m as E,n as I,o as P,p as j,q as v,r as A,s as J,t as U,u as Y,v as _,w as q,x as G,y as H}from"../chunk-7K2XKPOX.js";import*as g from"@linkfox-web/ai-tools/smart-table";var a=/key=([a-z0-9][a-z0-9-]*)/i;function y(e){let t=a.exec(e.description??"")?.[1];if(t)return t.toLowerCase();try{let r=JSON.parse(e.flowData??"{}");return a.exec(r.description??"")?.[1]?.toLowerCase()}catch{return}}function de(e,t){if(a.test(e))return e;let r=e.trim();return r?`${r};key=${t}`:`key=${t}`}function ce(){return w()?.config.notebookId||void 0}async function me(e){if(!e)return null;try{return((await p(g.listWorkflows({notebookId:e}))).workflows??[]).map(r=>({flowId:r.flowId,tableId:r.tableId??null}))}catch{return null}}function ue(e){let{notebookId:t,names:r,flows:k,links:d}=e,c=d?new Set(d.map(n=>n.flowId)):null,i={};for(let[n,s]of Object.entries(r)){let x=t?`${s} (${t})`:s,m=o=>o.name===x,u=k.filter(o=>(c?.has(o.id)??!1)||m(o)),l=u.filter(o=>y(o)===n.toLowerCase());if(l.length){i[n]={key:n,flow:l[0],matchedBy:"key",duplicates:l.slice(1)};continue}let f=u.filter(o=>m(o)||(c&&t&&o.name.startsWith(`${s} (`))===!0);i[n]=f.length?{key:n,flow:f[0],matchedBy:"name",duplicates:f.slice(1)}:{key:n,duplicates:[]}}return i}function pe(e,t){if(!(!e||!t))return e.some(r=>r.flowId===t)}import{cn as Le}from"cn";export{M as AGENT_MODELS,R as LinkfoxError,h as SESSION_EXPIRED_MESSAGE,w as activeSmartTable,T as appKitConfig,oe as attachmentUrl,A as authIdentity,Q as cancelTask,ue as claimWorkflows,Le as cn,b as configureAppKit,Z as createSmartTable,ce as currentNotebookId,B as errorMessage,S as filterKeys,z as findNav,re as firstAttachment,K as flagList,p as gateway,H as getApiKey,D as getApplicationId,j as getAuthState,W as getConfiguredApiKey,V as getShareUrl,q as handleGatewayError,I as initLinkfoxSdk,v as initialAuthState,$ as isAbortError,L as isApiKeyInvalid,te as isAttachmentList,F as isBalanceError,C as isSessionExpired,pe as isTriggerLinked,y as keyOf,me as listRegisteredWorkflows,U as loadApiKey,Y as login,_ as logout,G as maskApiKey,le as nowIso,ie as num,E as recordVisit,X as runTask,ee as setActiveSmartTable,N as sleep,se as splitList,J as startAuth,ne as str,P as subscribeAuth,O as toggleFlag,de as withWorkflowKey};
1
+ import{A as ge,B as xe,C as ke,D as Ie,E as ye,a as h,b as C,c as R,d as $,e as F,f as L,g as j,h as v,i as A,j as J,k as p,l as re,m as oe,n as ne,o as ie,p as se,q as le,r as w,s as fe,t as ae,u as de,v as ce,w as me,x as ue,y as pe,z as we}from"../chunk-Q7ASIOYP.js";import{a as b,b as T,c as W,d as B,e as N,f as S,g as K,h as O,i as z,j as D,k as E,l as P,m as U,n as Y,o as I,p as _,q,r as G,s as H,t as M,u as Q,v as V,w as X,x as Z,y as ee,z as te}from"../chunk-WREK6TXJ.js";import*as g from"@linkfox-web/ai-tools/smart-table";var a=/key=([a-z0-9][a-z0-9-]*)/i;function y(e){let t=a.exec(e.description??"")?.[1];if(t)return t.toLowerCase();try{let r=JSON.parse(e.flowData??"{}");return a.exec(r.description??"")?.[1]?.toLowerCase()}catch{return}}function We(e,t){if(a.test(e))return e;let r=e.trim();return r?`${r};key=${t}`:`key=${t}`}function he(){return w()?.config.notebookId||void 0}async function Ce(e){if(!e)return null;try{return((await p(g.listWorkflows({notebookId:e}))).workflows??[]).map(r=>({flowId:r.flowId,tableId:r.tableId??null}))}catch{return null}}function Re(e){let{notebookId:t,names:r,flows:x,links:d}=e,c=d?new Set(d.map(n=>n.flowId)):null,i={};for(let[n,s]of Object.entries(r)){let k=t?`${s} (${t})`:s,m=o=>o.name===k,u=x.filter(o=>(c?.has(o.id)??!1)||m(o)),l=u.filter(o=>y(o)===n.toLowerCase());if(l.length){i[n]={key:n,flow:l[0],matchedBy:"key",duplicates:l.slice(1)};continue}let f=u.filter(o=>m(o)||(c&&t&&o.name.startsWith(`${s} (`))===!0);i[n]=f.length?{key:n,flow:f[0],matchedBy:"name",duplicates:f.slice(1)}:{key:n,duplicates:[]}}return i}function $e(e,t){if(!(!e||!t))return e.some(r=>r.flowId===t)}import{cn as Ye}from"cn";export{re as AGENT_MODELS,h as CREDITS_RECHARGE_URL,S as LinkfoxError,B as SESSION_EXPIRED_MESSAGE,ge as WORD_FIELDS,xe as WORD_KIND_LABEL,we as WORD_STATUS,w as activeSmartTable,Ie as activeWordTables,T as appKitConfig,de as attachmentUrl,H as authIdentity,ye as buildWordMatcher,oe as cancelTask,Re as claimWorkflows,Ye as cn,b as configureAppKit,se as createSmartTable,ke as createWordTables,$ as creditsError,R as creditsExhausted,he as currentNotebookId,E as errorMessage,C as fetchRemainingCredits,j as filterKeys,J as findNav,ae as firstAttachment,v as flagList,p as gateway,te as getApiKey,U as getApplicationId,q as getAuthState,W as getConfiguredApiKey,ne as getShareUrl,Z as handleGatewayError,I as initLinkfoxSdk,G as initialAuthState,K as isAbortError,D as isApiKeyInvalid,fe as isAttachmentList,O as isBalanceError,z as isMemberLimitError,N as isSessionExpired,$e as isTriggerLinked,y as keyOf,Ce as listRegisteredWorkflows,Q as loadApiKey,V as login,X as logout,ee as maskApiKey,pe as nowIso,me as num,L as recheckCredits,Y as recordVisit,ie as runTask,le as setActiveSmartTable,P as sleep,ue as splitList,M as startAuth,ce as str,_ as subscribeAuth,F as subscribeCreditsExhausted,A as toggleFlag,We as withWorkflowKey};
@@ -0,0 +1,198 @@
1
+ import { LucideIcon } from 'lucide-react';
2
+ import * as st from '@linkfox-web/ai-tools/smart-table';
3
+ import { FieldInput, NotebookInfo as NotebookInfo$1, TableInfo as TableInfo$1, RecordFilter, SmartRecord } from '@linkfox-web/ai-tools/smart-table';
4
+
5
+ interface NavItem {
6
+ title: string;
7
+ href: string;
8
+ }
9
+ interface NavGroup {
10
+ title: string;
11
+ icon: LucideIcon;
12
+ items: NavItem[];
13
+ }
14
+ /** 根据路径找出面包屑:[菜单组, 页面];菜单由模板传入 */
15
+ declare function findNav(nav: NavGroup[], pathname: string): {
16
+ group: NavGroup;
17
+ item: NavItem;
18
+ } | null;
19
+
20
+ /** 搜索条件的界面描述(选品页、选品库、自动任务弹窗共用) */
21
+ type UiFilterSpec = {
22
+ type: "range";
23
+ id: string;
24
+ label: string;
25
+ unit?: string;
26
+ price?: boolean;
27
+ } | {
28
+ type: "dateRange";
29
+ id: string;
30
+ label: string;
31
+ } | {
32
+ type: "text";
33
+ id: string;
34
+ label: string;
35
+ placeholder?: string;
36
+ } | {
37
+ type: "list";
38
+ id: string;
39
+ label: string;
40
+ placeholder?: string;
41
+ options?: string[];
42
+ multiple?: boolean;
43
+ } | {
44
+ type: "bool";
45
+ id: string;
46
+ label: string;
47
+ }
48
+ /** required:接口必填项,不提供「不限」选项 */
49
+ | {
50
+ type: "select";
51
+ id: string;
52
+ label: string;
53
+ options: {
54
+ value: string;
55
+ label: string;
56
+ }[];
57
+ required?: boolean;
58
+ }
59
+ /** 一组开关:Keepa 的 buyBoxIsFBA 这类参数只认 true,不选就是不限;值是选中项的逗号拼接 */
60
+ | {
61
+ type: "flags";
62
+ id: string;
63
+ label: string;
64
+ options: {
65
+ value: string;
66
+ label: string;
67
+ }[];
68
+ };
69
+ /** 表单值:range / dateRange 用 `${id}.gte` / `${id}.lte`,其它用 id */
70
+ type FilterValues = Record<string, string>;
71
+ declare function filterKeys(spec: {
72
+ type: string;
73
+ id: string;
74
+ }): string[];
75
+ /** flags 的值 → 选中项数组 */
76
+ declare function flagList(value: string | undefined): string[];
77
+ declare function toggleFlag(value: string | undefined, flag: string, on: boolean): string;
78
+
79
+ type FieldDef = FieldInput;
80
+ type NotebookInfo = NotebookInfo$1;
81
+ /** 模板 `linkfox.config.ts` 的 `smartTableConfig` 结构(多数字段来自 `config/smart-table.json`) */
82
+ interface SmartTableFieldDef {
83
+ name: string;
84
+ type: string;
85
+ [key: string]: unknown;
86
+ }
87
+ interface SmartTableConfig {
88
+ /** 多维表(容器)名称 */
89
+ notebookName: string;
90
+ /** 多维表 id(nbk 开头):构建期由 NEXT_PUBLIC_NOTE_BOOK_ID 指定,留空则按名称查找 */
91
+ notebookId?: string;
92
+ /** 建多维表时的幂等键前缀,按应用区分 */
93
+ requestKeyPrefix?: string;
94
+ /** 数据表名称:key → 表名 */
95
+ tables: Record<string, string>;
96
+ /** 各数据表的列定义:ensureTable 建表/补列时使用 */
97
+ fields?: Record<string, readonly SmartTableFieldDef[]>;
98
+ }
99
+ /** 数据表信息 + 字段名 → fieldId(工作流触发条件要用) */
100
+ interface TableInfo extends TableInfo$1 {
101
+ fieldIds: Record<string, string>;
102
+ }
103
+ /**
104
+ * 按模板的 `smartTableConfig` 建一套多维表客户端。
105
+ *
106
+ * 用工厂而不是模块级单例:包不能读宿主的环境变量,表结构也只能由模板注入。
107
+ * 模板的 `lib/app-kit.ts` 里 `setActiveSmartTable(createSmartTable(smartTableConfig))`,
108
+ * 包内组件(如 LinkFox OS 助手)通过 `activeSmartTable()` 拿到同一个实例。
109
+ */
110
+ declare function createSmartTable<C extends SmartTableConfig>(config: C): {
111
+ config: C;
112
+ TABLE_FIELDS: Record<string, st.FieldInput[]>;
113
+ getNotebook: () => Promise<st.NotebookInfo>;
114
+ ensureTable: (key: string, fields?: FieldDef[]) => Promise<TableInfo>;
115
+ listRecords: (params: {
116
+ tableId: string;
117
+ page?: number;
118
+ perPage?: number;
119
+ fieldNames?: string[];
120
+ filter?: RecordFilter;
121
+ }) => Promise<st.ListRecordsResult>;
122
+ listAllRecords: (params: {
123
+ tableId: string;
124
+ fieldNames?: string[];
125
+ filter?: RecordFilter;
126
+ }, maxPages?: number) => Promise<st.SmartRecord[]>;
127
+ createRecords: (tableId: string, rows: Record<string, unknown>[]) => Promise<st.SmartRecord[]>;
128
+ updateRecords: (tableId: string, records: SmartRecord[]) => Promise<void>;
129
+ deleteRecords: (tableId: string, recordIds: string[]) => Promise<void>;
130
+ uploadAttachment: (tableId: string, recordId: string, fieldName: string, imageUrl: string) => Promise<st.Attachment>;
131
+ getRecord: (tableId: string, primaryField: string, primaryValue: string, recordId: string, fieldNames?: string[]) => Promise<st.SmartRecord | null>;
132
+ warmTables: () => Promise<TableInfo[]>;
133
+ tableIdOf: (key: string) => Promise<string>;
134
+ };
135
+ type SmartTable = ReturnType<typeof createSmartTable>;
136
+ /** 模板在 `lib/app-kit.ts` 里注册;包内组件用它读写多维表 */
137
+ declare function setActiveSmartTable(client: SmartTable): void;
138
+ /**
139
+ * 没注册时返回 undefined,而不是抛错:包内组件(如助手面板)据此跳过需要多维表的功能,
140
+ * 模板漏了 `import "@/lib/app-kit"` 时页面不会整块崩掉。
141
+ */
142
+ declare function activeSmartTable(): SmartTable | undefined;
143
+ declare function isAttachmentList(v: unknown): v is st.Attachment[];
144
+ /** 附件 cell 的第一项(附件列是数组,业务上主图只存一张) */
145
+ declare function firstAttachment(v: unknown): st.Attachment | undefined;
146
+ /**
147
+ * 附件 cell 的临时访问地址。
148
+ * 地址由多维表每次读取时重签(约 3 小时有效),所以只能在渲染 / 调用接口的当下取,不要存。
149
+ * prefer=thumb 取缩略图(列表用),full 取原图(生图 / 生文输入用)。
150
+ */
151
+ declare function attachmentUrl(v: unknown, prefer?: "thumb" | "full"): string | undefined;
152
+ /** 单元格取值工具 */
153
+ declare const str: (v: unknown) => string;
154
+ declare const num: (v: unknown) => number;
155
+ /** 逗号 / 换行分隔的文本列 → 数组 */
156
+ declare const splitList: (v: unknown) => string[];
157
+ /** 多维表 date 列写入用 */
158
+ declare const nowIso: () => string;
159
+
160
+ /**
161
+ * 品牌词 / 敏感词:选品应用在采集结果里做侵权拦截用的两本词库。
162
+ *
163
+ * 词库由用户在页面上维护,不能写死在代码里。表和列的语义在 5 个应用里完全一致,
164
+ * 所以连「建表 + 读启用词 + 生成匹配函数」一起做成公共件,随 SDK 升级。
165
+ */
166
+ declare const WORD_STATUS: readonly ["启用", "禁用"];
167
+ /**
168
+ * 两本词的列定义。始终显式传给 `ensureTable`:早期几个模板的 `config/smart-table.json`
169
+ * 里这两张表登记的是「备注 / 创建时间戳」而不是「中文名 / 来源」,靠 config 建表会让
170
+ * 管理页写不进去;显式传这份定义,缺的列会在下次打开应用时补齐。
171
+ */
172
+ declare const WORD_FIELDS: FieldDef[];
173
+ declare const WORD_KIND_LABEL: {
174
+ readonly brandWords: "品牌词";
175
+ readonly sensitiveWords: "敏感词";
176
+ };
177
+ type WordTableKey = keyof typeof WORD_KIND_LABEL;
178
+ interface WordHit {
179
+ word: string;
180
+ kind: WordTableKey;
181
+ }
182
+ /** 绑定到某个多维表客户端的词库操作;由 `activeWordTables()` 用已注册的客户端创建。 */
183
+ declare function createWordTables(table: SmartTable): {
184
+ ensureWordTable: (key: WordTableKey) => Promise<TableInfo>;
185
+ loadActiveWords: () => Promise<WordHit[]>;
186
+ };
187
+ /** 用 `setActiveSmartTable` 注册的客户端创建词库操作。 */
188
+ declare function activeWordTables(): {
189
+ ensureWordTable: (key: WordTableKey) => Promise<TableInfo>;
190
+ loadActiveWords: () => Promise<WordHit[]>;
191
+ };
192
+ /**
193
+ * 生成匹配函数:大小写不敏感;英文/数字开头或结尾的词按完整单词匹配(避免 "Apple" 命中 "Pineapple"),
194
+ * 中文等其它字符按包含匹配。
195
+ */
196
+ declare function buildWordMatcher(words: WordHit[]): (texts: string[]) => WordHit[];
197
+
198
+ export { type FilterValues as F, type NavGroup as N, type SmartTable as S, type TableInfo as T, type UiFilterSpec as U, type WordTableKey as W, type NavItem as a, type FieldDef as b, type NotebookInfo as c, type SmartTableConfig as d, type SmartTableFieldDef as e, findNav as f, WORD_FIELDS as g, WORD_KIND_LABEL as h, WORD_STATUS as i, type WordHit as j, activeSmartTable as k, activeWordTables as l, attachmentUrl as m, buildWordMatcher as n, createSmartTable as o, createWordTables as p, filterKeys as q, firstAttachment as r, flagList as s, isAttachmentList as t, nowIso as u, num as v, setActiveSmartTable as w, splitList as x, str as y, toggleFlag as z };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linkfox-web/app-kit",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "LinkFox 应用模板公共运行时与组件:登录门禁、多维表客户端、列表/筛选/任务组件、LinkFox OS 助手",
5
5
  "repository": {
6
6
  "type": "git",
@@ -27,9 +27,9 @@
27
27
  "react-markdown": "^10.1.0",
28
28
  "remark-gfm": "^4.0.1",
29
29
  "sonner": "^2.0.8",
30
- "@linkfox-web/ai-tools": "^0.3.11",
31
- "@linkfox-web/api-user-center": "^0.3.13",
32
- "@linkfox-web/http": "^0.3.13"
30
+ "@linkfox-web/ai-tools": "^0.4.0",
31
+ "@linkfox-web/http": "^0.3.13",
32
+ "@linkfox-web/api-user-center": "^0.3.13"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/react": "19.3.0",
@@ -45,8 +45,8 @@
45
45
  "react-markdown": "10.1.0",
46
46
  "remark-gfm": "4.0.1",
47
47
  "sonner": "2.0.8",
48
- "@linkfox-web/ai-tools": "0.3.11",
49
48
  "@linkfox-web/api-user-center": "0.3.13",
49
+ "@linkfox-web/ai-tools": "0.4.0",
50
50
  "@linkfox-web/http": "0.3.13"
51
51
  },
52
52
  "publishConfig": {
@@ -1 +0,0 @@
1
- var p;function j(t){p={...t}}function n(){if(!p)throw new Error("app-kit 未配置:请在模板的 lib/app-kit.ts 中调用 configureAppKit(),并在入口组件里 import 该文件");return p}function s(){return n().apiKey?.()?.trim()||void 0}import{isLinkfoxHttpError as u,LinkfoxHttpError as C}from"@linkfox-web/http";var L=/算力|余额不足|计费不足|套餐到期|充值|quota exceeded|insufficient balance/i,P=/invalid_token|the access token is invalid|expired or revoked/i,c="会话已过期,请重新登录";function l(t){if(!u(t))return!1;if(t.message===c)return!0;let e=typeof t.body=="string"?t.body:JSON.stringify(t.body??"");return P.test(`${t.message} ${e}`)}var x=class extends C{constructor(e,r){super({service:"app",status:0,code:e,message:r})}};function et(t){return t instanceof DOMException&&t.name==="AbortError"}function O(t){return u(t)&&t.service==="ai-tools"&&(String(t.code)==="402"||L.test(t.message))}function g(t){return u(t)&&t.service==="ai-tools"&&(String(t.code)==="401"||t.status===401)}function m(t){if(u(t)){let e=String(t.code??"");return e==="NETWORK_ERROR"?"网络请求失败,请检查网络后重试":e==="TIMEOUT"?"请求超时,请稍后重试":l(t)?c:e==="UNAUTHORIZED"?"登录已失效,请重新登录":g(t)?"工具网关鉴权失败:API Key 或登录已失效":O(t)?`算力余额不足,请前往 LinkFox 充值后重试(${t.message})`:t.message}return t instanceof Error?t.message:String(t)}var nt=(t,e)=>new Promise((r,k)=>{let v=setTimeout(r,t);e?.addEventListener("abort",()=>{clearTimeout(v),k(new DOMException("Aborted","AbortError"))})});import{recordAppVisit as N}from"@linkfox-web/ai-tools/smart-table";var U="public_app_id_xxx";function y(){let t=n().applicationId?.trim();if(!(!t||t===U))return t}function E(){let t=y();if(!t)return;let e=typeof window>"u"?void 0:window.location.href;N({appId:t,appUrl:e}).catch(()=>{})}import{configure as R}from"@linkfox-web/http";import"@linkfox-web/api-user-center";var T=!1;function S(){if(T)return;let t=n();R({services:{"ai-tools":{baseURL:t.gatewayBaseUrl,apiKey:s,apiKeyHeader:t.rewrite?"Authorization":"tool-gateway-api-key"},"third-party-sso":{baseURL:t.ssoBaseUrl}}}),T=!0}import{clearSession as M}from"@linkfox-web/http";import{clearThirdPartySsoSession as D,completeThirdPartySsoRedirect as $,getThirdPartyApplicationTeam as B,readThirdPartySsoSession as _,redirectToThirdPartySso as X}from"@linkfox-web/api-user-center";var b={status:"loading"},G=3e3,H=3e4,o=b,K=!1,h,w,I=new Set;function i(t){o=t,I.forEach(e=>e())}function St(t){return I.add(t),()=>{I.delete(t)}}function F(){return o}function wt(){return b}function It(){return o.status==="ready"?o.identity:""}function a(){clearTimeout(w),h=void 0}function f(){return`linkfox:sso:signed-out:${n().ssoClientId}`}function V(){if(new URLSearchParams(window.location.search).get("login")==="manual")return!1;try{if(window.sessionStorage.getItem(f()))return!1;let t=`linkfox:sso:auto-login:${n().ssoClientId}`;return Date.now()-Number(window.sessionStorage.getItem(t))<H?!1:(window.sessionStorage.setItem(t,String(Date.now())),!0)}catch{return!1}}function q(){try{return!!window.sessionStorage.getItem(f())}catch{return!1}}function z(t){h=t.accessToken;try{window.sessionStorage.removeItem(f())}catch{}clearTimeout(w),w=setTimeout(()=>{d()},Math.min(Math.max(t.expireAt-Date.now(),0),2147483647)),i({status:"ready",identity:`${n().ssoClientId}:${t.sub}`,userName:t.name}),E()}function At(){if(K)return;if(K=!0,s()){d();return}S();let t=n().ssoClientId,e=()=>{if(o.status!=="ready")return;let r=_(t);(!r||r.accessToken!==h)&&d()};window.addEventListener("focus",e),document.addEventListener("visibilitychange",e),window.addEventListener("pageshow",r=>{r.persisted&&o.status==="redirecting"&&i({status:"anonymous"})}),J()}async function J(){let t=n().ssoClientId;if(t){new URLSearchParams(window.location.search).has("state")&&i({status:"callback"});try{let e=await $(t);if(e&&e.returnTo!==window.location.href){window.location.replace(e.returnTo);return}}catch(e){a(),i({status:"error",action:"login",message:m(e)});return}}await d(),F().status==="anonymous"&&V()&&await Z({auto:!0})}async function d(){S();let t=s();if(t){a(),M(),i({status:"ready",apiKey:t,identity:"api-key",userName:"API Key 访问"});return}let e=n().ssoClientId;if(!e){a(),i({status:"error",action:"config",message:"请配置 NEXT_PUBLIC_LINKFOX_SSO_CLIENT_ID(开发使用 .env.local,构建使用 .env),然后重启或重新构建"});return}let r=_(e);if(r){z(r);return}a(),i({status:"anonymous"})}function W(){let t=n().basePath??"";return t?`${window.location.origin}${t}/`:window.location.origin}async function Y(){let t=y();if(t)try{return await B(n().ssoClientId,t,{timeout:G})}catch{return}}async function Z({auto:t=!1}={}){if(o.status!=="redirecting"){a(),i({status:"redirecting",auto:t});try{await X({clientId:n().ssoClientId,redirectUri:W(),replace:t,autoLogin:q()?!1:void 0,teamId:await Y()})}catch(e){i({status:"error",action:"login",message:m(e)})}}}function A(){D(n().ssoClientId),a(),i({status:"anonymous"})}function ht(){try{window.sessionStorage.setItem(f(),"1")}catch{}A()}function xt(t){if(l(t)){if(o.status!=="ready")return;A(),i({status:"error",action:"login",message:c});return}if(!(!g(t)||o.status!=="ready")){if(s()){a(),i({status:"error",action:"config",message:"API Key 已失效,请更新 NEXT_PUBLIC_LINKFOX_API_KEY 后重启开发服务或重新构建部署"});return}A(),i({status:"error",action:"login",message:"登录已失效,请重新登录"})}}function Et(t){return t.length<=8?"****":`${t.slice(0,4)}****${t.slice(-4)}`}function Tt(){return s()??null}export{j as a,n as b,s as c,c as d,l as e,x as f,et as g,O as h,g as i,m as j,nt as k,y as l,E as m,S as n,St as o,F as p,wt as q,It as r,At as s,d as t,Z as u,ht as v,xt as w,Et as x,Tt as y};
@@ -1 +0,0 @@
1
- import{f as B,g as D,h as M,i as K,k as G,r as $,w as L}from"./chunk-7K2XKPOX.js";function ce(e){return e.type==="range"||e.type==="dateRange"?[`${e.id}.gte`,`${e.id}.lte`]:[e.id]}function W(e){return(e??"").split(",").map(t=>t.trim()).filter(Boolean)}function de(e,t,l){let s=W(e).filter(f=>f!==t);return l&&s.push(t),s.join(",")}function ue(e,t){for(let l of e){let s=l.items.find(f=>t===f.href||t.startsWith(`${f.href}/`));if(s)return{group:l,item:s}}return null}async function O(e){try{return await e}catch(t){throw L(t),t}}import*as w from"@linkfox-web/ai-tools/agent-os";var Y=2500,z=5,J=3,he=[{id:"default",name:"通用助手"},{id:"linkfox-product-selection-agent",name:"选品 Agent"},{id:"linkfox-market-analysis-agent",name:"市场分析 Agent"},{id:"linkfox-listing-agent",name:"Listing Agent"},{id:"linkfox-image-agent",name:"图片 Agent"},{id:"linkfox-video-agent",name:"视频 Agent"}],Z={read:"读取文件",execute:"执行命令",edit:"编辑文件",search:"搜索"},V=e=>e?.type==="text"||e?.type===void 0?e?.text??e?.value??"":"";function ee(e){return e.type!=="resource_link"||!e.uri?null:{name:decodeURIComponent(e.uri.split("?")[0].split("/").pop()??"")||e.name||"文件",uri:e.uri}}function te(e){let t=new Map,l="";return e.forEach((s,f)=>{if(s.sessionUpdate==="tool_call"||s.sessionUpdate==="tool_call_update"){let u=s.toolCallId??`step-${f}`,b=t.get(u),I=s.title?.replace(/\(.*\)$/,"")||b?.title||Z[s.kind??""]||"处理中",x=s.status==="completed"?"done":s.status==="failed"?"failed":b?.status??"running";t.set(u,{id:u,title:I,status:x})}else(s.sessionUpdate==="agent_message_chunk"||s.sessionUpdate==null)&&(l+=V(s.content))}),{steps:[...t.values()],text:l}}function ne(e){let t="",l=new Map;for(let{content:s}of e){if(!s)continue;let f=ee(s);f?l.set(f.uri,f):t+=V(s)}return{text:t,files:[...l.values()]}}function we(e){return O(w.cancelTask({messageId:e}))}async function Ie(e){try{return(await O(w.getShareUrl({messageId:e}))).shareUrl||void 0}catch{return}}async function xe(e,t,{signal:l,onUpdate:s,sessionId:f}){let u=await O(w.createTask(f?{prompt:e,modelId:t,sessionId:f}:{prompt:e,modelId:t},{signal:l}));if(!u.id)throw new B(500,"LinkFox OS 没有返回任务 ID");let b=u.id,I=u.sessionId||f||"";s({messageId:b,sessionId:I,steps:[],text:"",files:[],stopReason:""});let x=new Map,y=0,N=0;for(;;){await G(Y,l);let P=Math.max(0,y-z),T;try{T=await O(w.getTask({messageId:b,fromIndex:P},{signal:l})),N=0}catch(p){if(D(p)||K(p)||M(p)||++N>=J)throw p;continue}T.eventList?.forEach((p,R)=>x.set(P+R,p)),y=T.eventTotal??y;let C=[...x.entries()].sort((p,R)=>p[0]-R[0]).map(([,p])=>p),F=te(C),v=T.message?.stopReason??"";if(v){let p=ne(T.message?.agentMessageChunks??[]),R=F.steps.map(E=>E.status==="running"?{...E,status:"done"}:E);return{messageId:b,sessionId:I,steps:R,text:p.text||F.text,files:p.files,stopReason:v}}s({messageId:b,sessionId:I,steps:F.steps,text:F.text,files:[],stopReason:""})}}import{LinkfoxHttpError as re}from"@linkfox-web/http";import*as d from"@linkfox-web/ai-tools/smart-table";function A(e,t){return new re({service:"ai-tools",status:200,code:e,message:t})}var j=(e,t)=>(e.createdTime??"").localeCompare(t.createdTime??""),q=e=>Object.fromEntries(e.map(t=>[t.name,t.fieldId]));function H(e,t,l){let s=e.get(t);return s||(s=l(),e.set(t,s),s.catch(()=>e.delete(t))),s}function se(){return typeof window>"u"?!1:/(^|\.)app\.linkfox\.com$/.test(window.location.hostname)}var oe=new Set(["主图"]);function Se(e){let t=e.fields??{},l=new Map,s=new Map,f=new Map;async function u(r){try{return await r}catch(o){throw L(o),o}}async function b(r){let o=[];for(let n=1;n<=50;n++){let a=await u(d[r]({page:n,perPage:100})),i=a.notebooks??[];if(o.push(...i),i.length===0||o.length>=(a.total??0))break}return o}async function I(){let{notebookId:r,notebookName:o}=e,n=await b("listMyTables");if(r){let k=n.find(h=>h.notebookId===r)??(await b("listSharedTables")).find(h=>h.notebookId===r);if(!k)throw A(404,`找不到配置的多维表 ${r},请检查 .env 的 NEXT_PUBLIC_NOTE_BOOK_ID 或 linkfox.config.ts`);return k}if(se())throw A(500,"应用未绑定多维表(缺少 NEXT_PUBLIC_NOTE_BOOK_ID)。请重新打开应用完成初始化后再试。");let a=n.filter(k=>k.name===o).sort(j);if(a.length)return a[0];let i=(await b("listSharedTables")).filter(k=>k.name===o).sort(j);if(i.length)return i[0];let m=e.requestKeyPrefix??"linkfox-app",g=await u(d.createTable({name:o,requestKey:`${m}-${o}`}));return{notebookId:g.notebookId,name:g.notebookName,tables:[{tableId:g.tableId,name:g.name,url:g.url,refKey:g.refKey}]}}function x(){return H(l,$(),I)}function y(r,o){return H(s,`${$()}:${r}`,async()=>{let n=o??t[r];if(!n)throw A(500,`数据表 ${String(r)} 没有登记列定义,请在 linkfox.config.ts 的 smartTableConfig.fields 里补上`);let a=e.tables[r];if(!a)throw A(500,`数据表 ${String(r)} 没有登记表名,请在 smartTableConfig.tables 里补上`);let i=await x(),m=i.tables.find(c=>c.name===a);if(!m){let c=await u(d.addTable({notebookId:i.notebookId,name:a,fields:n})),S={tableId:c.tableId,name:c.name,url:c.url,refKey:c.refKey};return i.tables.push(S),{...S,fieldIds:q(c.fields??[])}}let{fields:g}=await u(d.listFields({tableId:m.tableId,includeChoices:!1})),k=n.filter(c=>oe.has(c.name)&&g.some(S=>S.name===c.name&&S.type!==c.type)),h=g;if(k.length){let c=k.map(_=>_.name);h=(await u(d.deleteFields({tableId:m.tableId,fieldNames:c,allowBreakingDependents:!0}))).fields??g.filter(_=>!c.includes(_.name))}let Q=new Set(h.map(c=>c.name)),U=n.filter(c=>!Q.has(c.name));for(let c=0;c<U.length;c+=50)h=(await u(d.addFields({tableId:m.tableId,fields:U.slice(c,c+50)}))).fields??h;return{...m,fieldIds:q(h)}})}function N(r){return u(d.listRecords(r))}async function P(r,o=100){let n=[];for(let a=1;a<=o;a++){let i=await N({...r,page:a,perPage:100});if(n.push(...i.records),i.records.length<100||n.length>=i.total)break}return n}async function T(r,o){let n=[];for(let a=0;a<o.length;a+=50){let i=o.slice(a,a+50),m=await u(d.createRecords({tableId:r,records:i.map(g=>({fields:g}))}));if(n.push(...m.records??[]),m.created!==i.length)throw A(500,`已写入 ${n.length} 条,但有 ${i.length-m.created} 条未写入成功`)}return n}async function C(r,o){for(let n=0;n<o.length;n+=100){let a=o.slice(n,n+100),i=await u(d.updateRecords({tableId:r,records:a}));if(i.updated!==a.length)throw A(404,`只更新了 ${i.updated}/${a.length} 条,记录可能已被删除,请刷新后重试`)}}async function F(r,o){for(let n=0;n<o.length;n+=100)await u(d.deleteRecords({tableId:r,recordIds:o.slice(n,n+100)}))}function v(r,o,n,a){let i=`${r}:${o}:${n}`,g=(f.get(i)??Promise.resolve()).catch(()=>{}).then(()=>u(d.uploadAttachment({tableId:r,recordId:o,fieldName:n,imageUrl:a})).then(k=>k.attachment));return f.set(i,g),g.finally(()=>{f.get(i)===g&&f.delete(i)}).catch(()=>{}),g}async function p(r,o,n,a,i){return(await N({tableId:r,perPage:100,fieldNames:i,filter:{conditions:[{fieldName:o,operator:"is",value:n}]}})).records.find(g=>g.recordId===a)??null}function R(){return Promise.all(Object.keys(t).map(r=>y(r)))}async function E(r){return(await y(r)).tableId}return{config:e,TABLE_FIELDS:t,getNotebook:x,ensureTable:y,listRecords:N,listAllRecords:P,createRecords:T,updateRecords:C,deleteRecords:F,uploadAttachment:v,getRecord:p,warmTables:R,tableIdOf:E}}var X;function Ne(e){X=e}function Fe(){return X}function ie(e){return Array.isArray(e)&&e.every(t=>t&&typeof t=="object"&&"token"in t)}function ae(e){return ie(e)?e[0]:void 0}function Ae(e,t="full"){let l=ae(e);return l&&(t==="thumb"?l.smThumbnailUrl??l.lgThumbnailUrl??l.presignedUrl:l.presignedUrl)||void 0}var le=e=>e==null?"":typeof e=="string"?e:String(e),Ee=e=>typeof e=="number"?e:Number(e)||0,Oe=e=>le(e).split(/[,,、\n]/).map(t=>t.trim()).filter(Boolean),Pe=()=>new Date().toISOString();export{ce as a,W as b,de as c,ue as d,O as e,he as f,we as g,Ie as h,xe as i,Se as j,Ne as k,Fe as l,ie as m,ae as n,Ae as o,le as p,Ee as q,Oe as r,Pe as s};
@@ -1,77 +0,0 @@
1
- import { LucideIcon } from 'lucide-react';
2
-
3
- interface NavItem {
4
- title: string;
5
- href: string;
6
- }
7
- interface NavGroup {
8
- title: string;
9
- icon: LucideIcon;
10
- items: NavItem[];
11
- }
12
- /** 根据路径找出面包屑:[菜单组, 页面];菜单由模板传入 */
13
- declare function findNav(nav: NavGroup[], pathname: string): {
14
- group: NavGroup;
15
- item: NavItem;
16
- } | null;
17
-
18
- /** 搜索条件的界面描述(选品页、选品库、自动任务弹窗共用) */
19
- type UiFilterSpec = {
20
- type: "range";
21
- id: string;
22
- label: string;
23
- unit?: string;
24
- price?: boolean;
25
- } | {
26
- type: "dateRange";
27
- id: string;
28
- label: string;
29
- } | {
30
- type: "text";
31
- id: string;
32
- label: string;
33
- placeholder?: string;
34
- } | {
35
- type: "list";
36
- id: string;
37
- label: string;
38
- placeholder?: string;
39
- options?: string[];
40
- multiple?: boolean;
41
- } | {
42
- type: "bool";
43
- id: string;
44
- label: string;
45
- }
46
- /** required:接口必填项,不提供「不限」选项 */
47
- | {
48
- type: "select";
49
- id: string;
50
- label: string;
51
- options: {
52
- value: string;
53
- label: string;
54
- }[];
55
- required?: boolean;
56
- }
57
- /** 一组开关:Keepa 的 buyBoxIsFBA 这类参数只认 true,不选就是不限;值是选中项的逗号拼接 */
58
- | {
59
- type: "flags";
60
- id: string;
61
- label: string;
62
- options: {
63
- value: string;
64
- label: string;
65
- }[];
66
- };
67
- /** 表单值:range / dateRange 用 `${id}.gte` / `${id}.lte`,其它用 id */
68
- type FilterValues = Record<string, string>;
69
- declare function filterKeys(spec: {
70
- type: string;
71
- id: string;
72
- }): string[];
73
- /** flags 的值 → 选中项数组 */
74
- declare function flagList(value: string | undefined): string[];
75
- declare function toggleFlag(value: string | undefined, flag: string, on: boolean): string;
76
-
77
- export { type FilterValues as F, type NavGroup as N, type UiFilterSpec as U, type NavItem as a, filterKeys as b, flagList as c, findNav as f, toggleFlag as t };