sparkecoder 0.1.86 → 0.1.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/agent/index.d.ts +3 -3
- package/dist/agent/index.js +809 -97
- package/dist/agent/index.js.map +1 -1
- package/dist/cli.js +2395 -316
- package/dist/cli.js.map +1 -1
- package/dist/db/index.d.ts +2 -2
- package/dist/{index-OhuTM4a0.d.ts → index-Bn0Zox8f.d.ts} +32 -23
- package/dist/index.d.ts +5 -5
- package/dist/index.js +1932 -273
- package/dist/index.js.map +1 -1
- package/dist/{schema-CohdIL13.d.ts → schema-EmpbnQeQ.d.ts} +3 -3
- package/dist/{search-CCffrVJE.d.ts → search-BRnGaIl-.d.ts} +7 -7
- package/dist/server/index.js +1932 -273
- package/dist/server/index.js.map +1 -1
- package/dist/skills/default/computer-use.md +150 -0
- package/dist/tools/index.d.ts +196 -3
- package/dist/tools/index.js +639 -11
- package/dist/tools/index.js.map +1 -1
- package/package.json +6 -5
- package/src/skills/default/computer-use.md +150 -0
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/web/.next/server/app/(main)/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/(main)/session/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/api/config/route.js.nft.json +1 -1
- package/web/.next/standalone/web/.next/server/app/api/health/route.js.nft.json +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/embed/[id]/page.js.nft.json +1 -1
- package/web/.next/standalone/web/.next/server/app/embed/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/index.html +1 -1
- package/web/.next/standalone/web/.next/server/app/index.rsc +4 -4
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__36edac7c._.js +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_ecd2bdca._.js → 2374f_317b1fef._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_9adc1edb._.js → 2374f_37dd9702._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_8dc0f9aa._.js → 2374f_4d44e4ed._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_cc6c6363._.js → 2374f_54ac917f._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_00f7fe07._.js → 2374f_86585101._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_369747ce._.js → 2374f_a383a4d9._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_d58d0276._.js → 2374f_c59a35bb._.js} +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/{[root-of-the-server]__25b25c9d._.js → [root-of-the-server]__9a826344._.js} +2 -2
- package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__be5e2967._.js +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_src_app_(main)_page_tsx_5ac4794b._.js +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_src_components_sessions-sidebar_tsx_92510070._.js +1 -1
- package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
- package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
- package/web/.next/standalone/web/.next/static/chunks/275e8268daf318b2.js +7 -0
- package/web/.next/standalone/web/.next/static/{static/chunks/26eb5fab5216f3cc.js → chunks/58fd0aaa2746b444.js} +1 -1
- package/web/.next/standalone/web/.next/static/chunks/9fce2ce79c4c834e.js +1 -0
- package/web/.next/{static/chunks/8d3efc76109d2efc.js → standalone/web/.next/static/chunks/a888d448ceab1abe.js} +1 -1
- package/web/.next/standalone/web/.next/static/static/chunks/275e8268daf318b2.js +7 -0
- package/web/.next/{static/chunks/26eb5fab5216f3cc.js → standalone/web/.next/static/static/chunks/58fd0aaa2746b444.js} +1 -1
- package/web/.next/standalone/web/.next/static/static/chunks/9fce2ce79c4c834e.js +1 -0
- package/web/.next/standalone/web/.next/static/{chunks/8d3efc76109d2efc.js → static/chunks/a888d448ceab1abe.js} +1 -1
- package/web/.next/standalone/web/package-lock.json +27 -27
- package/web/.next/standalone/web/package.json +1 -1
- package/web/.next/standalone/web/src/app/(main)/page.tsx +2 -2
- package/web/.next/standalone/web/src/app/api/config/route.ts +3 -2
- package/web/.next/standalone/web/src/app/embed/[id]/page.tsx +12 -0
- package/web/.next/standalone/web/src/components/sessions-sidebar.tsx +1 -1
- package/web/.next/standalone/web/src/lib/config.ts +2 -1
- package/web/.next/standalone/web/src/lib/embed-bootstrap.ts +108 -0
- package/web/.next/static/chunks/275e8268daf318b2.js +7 -0
- package/web/.next/{standalone/web/.next/static/chunks/26eb5fab5216f3cc.js → static/chunks/58fd0aaa2746b444.js} +1 -1
- package/web/.next/static/chunks/9fce2ce79c4c834e.js +1 -0
- package/web/.next/{standalone/web/.next/static/static/chunks/8d3efc76109d2efc.js → static/chunks/a888d448ceab1abe.js} +1 -1
- package/web/package.json +1 -1
- package/web/.next/standalone/web/.next/static/chunks/5383c5717758f575.js +0 -7
- package/web/.next/standalone/web/.next/static/chunks/b31b0765abe0c427.js +0 -1
- package/web/.next/standalone/web/.next/static/static/chunks/5383c5717758f575.js +0 -7
- package/web/.next/standalone/web/.next/static/static/chunks/b31b0765abe0c427.js +0 -1
- package/web/.next/static/chunks/5383c5717758f575.js +0 -7
- package/web/.next/static/chunks/b31b0765abe0c427.js +0 -1
- /package/web/.next/standalone/web/.next/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_ssgManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_ssgManifest.js +0 -0
- /package/web/.next/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_buildManifest.js +0 -0
- /package/web/.next/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,739963,e=>{"use strict";let o="sparkecoder_api_url",i="http://localhost:3141",a=!1;function t(){if(a)return;a=!0;let e=new URLSearchParams(window.location.search),i=e.get("apiUrl");if(i){localStorage.setItem(o,i),e.delete("apiUrl");let a=e.toString()?`${window.location.pathname}?${e.toString()}`:window.location.pathname;window.history.replaceState({},"",a),console.log(`[SparkECoder] API URL set to: ${i}`)}}function r(){return a||t(),localStorage.getItem(o)||i}let n={availableModels:[{id:"anthropic/claude-opus-4.7",name:"Claude Opus 4.7",provider:"Anthropic"},{id:"anthropic/claude-opus-4-6",name:"Claude Opus 4.6",provider:"Anthropic"},{id:"anthropic/claude-opus-4-5",name:"Claude Opus 4.5",provider:"Anthropic"},{id:"anthropic/claude-sonnet-4",name:"Claude Sonnet 4",provider:"Anthropic"},{id:"anthropic/claude-haiku-4-5",name:"Claude Haiku 4.5",provider:"Anthropic"},{id:"openai/gpt-5-2-codex",name:"GPT-5.2 Codex",provider:"OpenAI"},{id:"google/gemini-3-flash",name:"Gemini 3 Flash",provider:"Google"},{id:"xai/grok-code-fast-1",name:"Grok Code Fast",provider:"xAI"}],availableTools:[{id:"bash",name:"Bash",description:"Execute shell commands",dangerous:!0},{id:"write_file",name:"Write File",description:"Create or edit files",dangerous:!0},{id:"read_file",name:"Read File",description:"Read file contents",dangerous:!1}],defaultModel:"anthropic/claude-opus-4.7",defaultToolApprovals:{},serverConnected:!1,apiKeyConfigured:!1,apiBaseUrl:i};async function l(){let e=r();try{let o=new AbortController,i=setTimeout(()=>o.abort(),3e3),a=await fetch(`${e}/health`,{signal:o.signal});if(clearTimeout(i),!a.ok)return{...n,apiBaseUrl:e};let t=await a.json();return{...n,defaultModel:t.config?.defaultModel||n.defaultModel,defaultToolApprovals:t.config?.defaultToolApprovals||{},serverConnected:!0,apiKeyConfigured:t.apiKeyConfigured??!1,apiBaseUrl:e}}catch{return{...n,apiBaseUrl:e}}}e.s(["getApiUrl",()=>r,"getConfig",()=>l,"initApiUrl",()=>t])},760800,e=>{"use strict";var o=e.i(430878),i=e.i(739963);function a(){return(0,o.useEffect)(()=>{(0,i.initApiUrl)()},[]),null}e.s(["ApiInit",()=>a])}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,77589,e=>{"use strict";let t=(0,e.i(292511).default)("external-link",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);e.s(["default",()=>t])},416667,e=>{"use strict";let t=(0,e.i(292511).default)("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);e.s(["default",()=>t])},191729,772857,e=>{"use strict";let t=(0,e.i(292511).default)("clock",[["path",{d:"M12 6v6l4 2",key:"mmk7yg"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);e.s(["default",()=>t],191729);var r=e.i(414294),l=e.i(430878);e.i(773340);var o=e.i(309945),n=Symbol("radix.slottable");function s(e){return l.isValidElement(e)&&"function"==typeof e.type&&"__radixId"in e.type&&e.type.__radixId===n}var i=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"].reduce((e,t)=>{var n,i;let a,c,d,u=(i=n=`Primitive.${t}`,(a=l.forwardRef((e,t)=>{let{children:r,...n}=e;if(l.isValidElement(r)){var s;let e,i,a=(s=r,(i=(e=Object.getOwnPropertyDescriptor(s.props,"ref")?.get)&&"isReactWarning"in e&&e.isReactWarning)?s.ref:(i=(e=Object.getOwnPropertyDescriptor(s,"ref")?.get)&&"isReactWarning"in e&&e.isReactWarning)?s.props.ref:s.props.ref||s.ref),c=function(e,t){let r={...t};for(let l in t){let o=e[l],n=t[l];/^on[A-Z]/.test(l)?o&&n?r[l]=(...e)=>{let t=n(...e);return o(...e),t}:o&&(r[l]=o):"style"===l?r[l]={...o,...n}:"className"===l&&(r[l]=[o,n].filter(Boolean).join(" "))}return{...e,...r}}(n,r.props);return r.type!==l.Fragment&&(c.ref=t?(0,o.composeRefs)(t,a):a),l.cloneElement(r,c)}return l.Children.count(r)>1?l.Children.only(null):null})).displayName=`${i}.SlotClone`,c=a,(d=l.forwardRef((e,t)=>{let{children:o,...n}=e,i=l.Children.toArray(o),a=i.find(s);if(a){let e=a.props.children,o=i.map(t=>t!==a?t:l.Children.count(e)>1?l.Children.only(null):l.isValidElement(e)?e.props.children:null);return(0,r.jsx)(c,{...n,ref:t,children:l.isValidElement(e)?l.cloneElement(e,void 0,o):null})}return(0,r.jsx)(c,{...n,ref:t,children:o})})).displayName=`${n}.Slot`,d),p=l.forwardRef((e,l)=>{let{asChild:o,...n}=e;return"u">typeof window&&(window[Symbol.for("radix-ui")]=!0),(0,r.jsx)(o?u:t,{...n,ref:l})});return p.displayName=`Primitive.${t}`,{...e,[t]:p}},{}),a=e.i(395509),c=e.i(897462),d=e.i(542899),u=e.i(995945),p=e.i(992421),f=e.i(241416),m="ScrollArea",[h,x]=function(e,t=[]){let o=[],n=()=>{let t=o.map(e=>l.createContext(e));return function(r){let o=r?.[e]||t;return l.useMemo(()=>({[`__scope${e}`]:{...r,[e]:o}}),[r,o])}};return n.scopeName=e,[function(t,n){let s=l.createContext(n),i=o.length;o=[...o,n];let a=t=>{let{scope:o,children:n,...a}=t,c=o?.[e]?.[i]||s,d=l.useMemo(()=>a,Object.values(a));return(0,r.jsx)(c.Provider,{value:d,children:n})};return a.displayName=t+"Provider",[a,function(r,o){let a=o?.[e]?.[i]||s,c=l.useContext(a);if(c)return c;if(void 0!==n)return n;throw Error(`\`${r}\` must be used within \`${t}\``)}]},function(...e){let t=e[0];if(1===e.length)return t;let r=()=>{let r=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return function(e){let o=r.reduce((t,{useScope:r,scopeName:l})=>{let o=r(e)[`__scope${l}`];return{...t,...o}},{});return l.useMemo(()=>({[`__scope${t.scopeName}`]:o}),[o])}};return r.scopeName=t.scopeName,r}(n,...t)]}(m),[v,g]=h(m),w=l.forwardRef((e,t)=>{let{__scopeScrollArea:n,type:s="hover",dir:a,scrollHideDelay:c=600,...u}=e,[p,f]=l.useState(null),[m,h]=l.useState(null),[x,g]=l.useState(null),[w,b]=l.useState(null),[y,j]=l.useState(null),[S,C]=l.useState(0),[N,E]=l.useState(0),[R,T]=l.useState(!1),[P,k]=l.useState(!1),A=(0,o.useComposedRefs)(t,e=>f(e)),L=(0,d.useDirection)(a);return(0,r.jsx)(v,{scope:n,type:s,dir:L,scrollHideDelay:c,scrollArea:p,viewport:m,onViewportChange:h,content:x,onContentChange:g,scrollbarX:w,onScrollbarXChange:b,scrollbarXEnabled:R,onScrollbarXEnabledChange:T,scrollbarY:y,onScrollbarYChange:j,scrollbarYEnabled:P,onScrollbarYEnabledChange:k,onCornerWidthChange:C,onCornerHeightChange:E,children:(0,r.jsx)(i.div,{dir:L,...u,ref:A,style:{position:"relative","--radix-scroll-area-corner-width":S+"px","--radix-scroll-area-corner-height":N+"px",...e.style}})})});w.displayName=m;var b="ScrollAreaViewport",y=l.forwardRef((e,t)=>{let{__scopeScrollArea:n,children:s,nonce:a,...c}=e,d=g(b,n),u=l.useRef(null),p=(0,o.useComposedRefs)(t,u,d.onViewportChange);return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:a}),(0,r.jsx)(i.div,{"data-radix-scroll-area-viewport":"",...c,ref:p,style:{overflowX:d.scrollbarXEnabled?"scroll":"hidden",overflowY:d.scrollbarYEnabled?"scroll":"hidden",...e.style},children:(0,r.jsx)("div",{ref:d.onContentChange,style:{minWidth:"100%",display:"table"},children:s})})]})});y.displayName=b;var j="ScrollAreaScrollbar",S=l.forwardRef((e,t)=>{let{forceMount:o,...n}=e,s=g(j,e.__scopeScrollArea),{onScrollbarXEnabledChange:i,onScrollbarYEnabledChange:a}=s,c="horizontal"===e.orientation;return l.useEffect(()=>(c?i(!0):a(!0),()=>{c?i(!1):a(!1)}),[c,i,a]),"hover"===s.type?(0,r.jsx)(C,{...n,ref:t,forceMount:o}):"scroll"===s.type?(0,r.jsx)(N,{...n,ref:t,forceMount:o}):"auto"===s.type?(0,r.jsx)(E,{...n,ref:t,forceMount:o}):"always"===s.type?(0,r.jsx)(R,{...n,ref:t}):null});S.displayName=j;var C=l.forwardRef((e,t)=>{let{forceMount:o,...n}=e,s=g(j,e.__scopeScrollArea),[i,c]=l.useState(!1);return l.useEffect(()=>{let e=s.scrollArea,t=0;if(e){let r=()=>{window.clearTimeout(t),c(!0)},l=()=>{t=window.setTimeout(()=>c(!1),s.scrollHideDelay)};return e.addEventListener("pointerenter",r),e.addEventListener("pointerleave",l),()=>{window.clearTimeout(t),e.removeEventListener("pointerenter",r),e.removeEventListener("pointerleave",l)}}},[s.scrollArea,s.scrollHideDelay]),(0,r.jsx)(a.Presence,{present:o||i,children:(0,r.jsx)(E,{"data-state":i?"visible":"hidden",...n,ref:t})})}),N=l.forwardRef((e,t)=>{var o;let{forceMount:n,...s}=e,i=g(j,e.__scopeScrollArea),c="horizontal"===e.orientation,d=V(()=>p("SCROLL_END"),100),[u,p]=(o={hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}},l.useReducer((e,t)=>o[e][t]??e,"hidden"));return l.useEffect(()=>{if("idle"===u){let e=window.setTimeout(()=>p("HIDE"),i.scrollHideDelay);return()=>window.clearTimeout(e)}},[u,i.scrollHideDelay,p]),l.useEffect(()=>{let e=i.viewport,t=c?"scrollLeft":"scrollTop";if(e){let r=e[t],l=()=>{let l=e[t];r!==l&&(p("SCROLL"),d()),r=l};return e.addEventListener("scroll",l),()=>e.removeEventListener("scroll",l)}},[i.viewport,c,p,d]),(0,r.jsx)(a.Presence,{present:n||"hidden"!==u,children:(0,r.jsx)(R,{"data-state":"hidden"===u?"hidden":"visible",...s,ref:t,onPointerEnter:(0,f.composeEventHandlers)(e.onPointerEnter,()=>p("POINTER_ENTER")),onPointerLeave:(0,f.composeEventHandlers)(e.onPointerLeave,()=>p("POINTER_LEAVE"))})})}),E=l.forwardRef((e,t)=>{let o=g(j,e.__scopeScrollArea),{forceMount:n,...s}=e,[i,c]=l.useState(!1),d="horizontal"===e.orientation,u=V(()=>{if(o.viewport){let e=o.viewport.offsetWidth<o.viewport.scrollWidth,t=o.viewport.offsetHeight<o.viewport.scrollHeight;c(d?e:t)}},10);return Y(o.viewport,u),Y(o.content,u),(0,r.jsx)(a.Presence,{present:n||i,children:(0,r.jsx)(R,{"data-state":i?"visible":"hidden",...s,ref:t})})}),R=l.forwardRef((e,t)=>{let{orientation:o="vertical",...n}=e,s=g(j,e.__scopeScrollArea),i=l.useRef(null),a=l.useRef(0),[c,d]=l.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),u=$(c.viewport,c.content),p={...n,sizes:c,onSizesChange:d,hasThumb:!!(u>0&&u<1),onThumbChange:e=>i.current=e,onThumbPointerUp:()=>a.current=0,onThumbPointerDown:e=>a.current=e};function f(e,t){return function(e,t,r,l="ltr"){let o=O(r),n=t||o/2,s=r.scrollbar.paddingStart+n,i=r.scrollbar.size-r.scrollbar.paddingEnd-(o-n),a=r.content-r.viewport;return B([s,i],"ltr"===l?[0,a]:[-1*a,0])(e)}(e,a.current,c,t)}return"horizontal"===o?(0,r.jsx)(T,{...p,ref:t,onThumbPositionChange:()=>{if(s.viewport&&i.current){let e=F(s.viewport.scrollLeft,c,s.dir);i.current.style.transform=`translate3d(${e}px, 0, 0)`}},onWheelScroll:e=>{s.viewport&&(s.viewport.scrollLeft=e)},onDragScroll:e=>{s.viewport&&(s.viewport.scrollLeft=f(e,s.dir))}}):"vertical"===o?(0,r.jsx)(P,{...p,ref:t,onThumbPositionChange:()=>{if(s.viewport&&i.current){let e=F(s.viewport.scrollTop,c);i.current.style.transform=`translate3d(0, ${e}px, 0)`}},onWheelScroll:e=>{s.viewport&&(s.viewport.scrollTop=e)},onDragScroll:e=>{s.viewport&&(s.viewport.scrollTop=f(e))}}):null}),T=l.forwardRef((e,t)=>{let{sizes:n,onSizesChange:s,...i}=e,a=g(j,e.__scopeScrollArea),[c,d]=l.useState(),u=l.useRef(null),p=(0,o.useComposedRefs)(t,u,a.onScrollbarXChange);return l.useEffect(()=>{u.current&&d(getComputedStyle(u.current))},[u]),(0,r.jsx)(L,{"data-orientation":"horizontal",...i,ref:p,sizes:n,style:{bottom:0,left:"rtl"===a.dir?"var(--radix-scroll-area-corner-width)":0,right:"ltr"===a.dir?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":O(n)+"px",...e.style},onThumbPointerDown:t=>e.onThumbPointerDown(t.x),onDragScroll:t=>e.onDragScroll(t.x),onWheelScroll:(t,r)=>{if(a.viewport){var l,o;let n=a.viewport.scrollLeft+t.deltaX;e.onWheelScroll(n),l=n,o=r,l>0&&l<o&&t.preventDefault()}},onResize:()=>{u.current&&a.viewport&&c&&s({content:a.viewport.scrollWidth,viewport:a.viewport.offsetWidth,scrollbar:{size:u.current.clientWidth,paddingStart:W(c.paddingLeft),paddingEnd:W(c.paddingRight)}})}})}),P=l.forwardRef((e,t)=>{let{sizes:n,onSizesChange:s,...i}=e,a=g(j,e.__scopeScrollArea),[c,d]=l.useState(),u=l.useRef(null),p=(0,o.useComposedRefs)(t,u,a.onScrollbarYChange);return l.useEffect(()=>{u.current&&d(getComputedStyle(u.current))},[u]),(0,r.jsx)(L,{"data-orientation":"vertical",...i,ref:p,sizes:n,style:{top:0,right:"ltr"===a.dir?0:void 0,left:"rtl"===a.dir?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":O(n)+"px",...e.style},onThumbPointerDown:t=>e.onThumbPointerDown(t.y),onDragScroll:t=>e.onDragScroll(t.y),onWheelScroll:(t,r)=>{if(a.viewport){var l,o;let n=a.viewport.scrollTop+t.deltaY;e.onWheelScroll(n),l=n,o=r,l>0&&l<o&&t.preventDefault()}},onResize:()=>{u.current&&a.viewport&&c&&s({content:a.viewport.scrollHeight,viewport:a.viewport.offsetHeight,scrollbar:{size:u.current.clientHeight,paddingStart:W(c.paddingTop),paddingEnd:W(c.paddingBottom)}})}})}),[k,A]=h(j),L=l.forwardRef((e,t)=>{let{__scopeScrollArea:n,sizes:s,hasThumb:a,onThumbChange:d,onThumbPointerUp:u,onThumbPointerDown:p,onThumbPositionChange:m,onDragScroll:h,onWheelScroll:x,onResize:v,...w}=e,b=g(j,n),[y,S]=l.useState(null),C=(0,o.useComposedRefs)(t,e=>S(e)),N=l.useRef(null),E=l.useRef(""),R=b.viewport,T=s.content-s.viewport,P=(0,c.useCallbackRef)(x),A=(0,c.useCallbackRef)(m),L=V(v,10);function _(e){N.current&&h({x:e.clientX-N.current.left,y:e.clientY-N.current.top})}return l.useEffect(()=>{let e=e=>{let t=e.target;y?.contains(t)&&P(e,T)};return document.addEventListener("wheel",e,{passive:!1}),()=>document.removeEventListener("wheel",e,{passive:!1})},[R,y,T,P]),l.useEffect(A,[s,A]),Y(y,L),Y(b.content,L),(0,r.jsx)(k,{scope:n,scrollbar:y,hasThumb:a,onThumbChange:(0,c.useCallbackRef)(d),onThumbPointerUp:(0,c.useCallbackRef)(u),onThumbPositionChange:A,onThumbPointerDown:(0,c.useCallbackRef)(p),children:(0,r.jsx)(i.div,{...w,ref:C,style:{position:"absolute",...w.style},onPointerDown:(0,f.composeEventHandlers)(e.onPointerDown,e=>{0===e.button&&(e.target.setPointerCapture(e.pointerId),N.current=y.getBoundingClientRect(),E.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",b.viewport&&(b.viewport.style.scrollBehavior="auto"),_(e))}),onPointerMove:(0,f.composeEventHandlers)(e.onPointerMove,_),onPointerUp:(0,f.composeEventHandlers)(e.onPointerUp,e=>{let t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),document.body.style.webkitUserSelect=E.current,b.viewport&&(b.viewport.style.scrollBehavior=""),N.current=null})})})}),_="ScrollAreaThumb",D=l.forwardRef((e,t)=>{let{forceMount:l,...o}=e,n=A(_,e.__scopeScrollArea);return(0,r.jsx)(a.Presence,{present:l||n.hasThumb,children:(0,r.jsx)(z,{ref:t,...o})})}),z=l.forwardRef((e,t)=>{let{__scopeScrollArea:n,style:s,...a}=e,c=g(_,n),d=A(_,n),{onThumbPositionChange:u}=d,p=(0,o.useComposedRefs)(t,e=>d.onThumbChange(e)),m=l.useRef(void 0),h=V(()=>{m.current&&(m.current(),m.current=void 0)},100);return l.useEffect(()=>{let e=c.viewport;if(e){let t=()=>{h(),m.current||(m.current=U(e,u),u())};return u(),e.addEventListener("scroll",t),()=>e.removeEventListener("scroll",t)}},[c.viewport,h,u]),(0,r.jsx)(i.div,{"data-state":d.hasThumb?"visible":"hidden",...a,ref:p,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...s},onPointerDownCapture:(0,f.composeEventHandlers)(e.onPointerDownCapture,e=>{let t=e.target.getBoundingClientRect(),r=e.clientX-t.left,l=e.clientY-t.top;d.onThumbPointerDown({x:r,y:l})}),onPointerUp:(0,f.composeEventHandlers)(e.onPointerUp,d.onThumbPointerUp)})});D.displayName=_;var I="ScrollAreaCorner",H=l.forwardRef((e,t)=>{let l=g(I,e.__scopeScrollArea),o=!!(l.scrollbarX&&l.scrollbarY);return"scroll"!==l.type&&o?(0,r.jsx)(M,{...e,ref:t}):null});H.displayName=I;var M=l.forwardRef((e,t)=>{let{__scopeScrollArea:o,...n}=e,s=g(I,o),[a,c]=l.useState(0),[d,u]=l.useState(0),p=!!(a&&d);return Y(s.scrollbarX,()=>{let e=s.scrollbarX?.offsetHeight||0;s.onCornerHeightChange(e),u(e)}),Y(s.scrollbarY,()=>{let e=s.scrollbarY?.offsetWidth||0;s.onCornerWidthChange(e),c(e)}),p?(0,r.jsx)(i.div,{...n,ref:t,style:{width:a,height:d,position:"absolute",right:"ltr"===s.dir?0:void 0,left:"rtl"===s.dir?0:void 0,bottom:0,...e.style}}):null});function W(e){return e?parseInt(e,10):0}function $(e,t){let r=e/t;return isNaN(r)?0:r}function O(e){let t=$(e.viewport,e.content),r=e.scrollbar.paddingStart+e.scrollbar.paddingEnd;return Math.max((e.scrollbar.size-r)*t,18)}function F(e,t,r="ltr"){let l=O(t),o=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,n=t.scrollbar.size-o,s=t.content-t.viewport,i=(0,p.clamp)(e,"ltr"===r?[0,s]:[-1*s,0]);return B([0,s],[0,n-l])(i)}function B(e,t){return r=>{if(e[0]===e[1]||t[0]===t[1])return t[0];let l=(t[1]-t[0])/(e[1]-e[0]);return t[0]+l*(r-e[0])}}var U=(e,t=()=>{})=>{let r={left:e.scrollLeft,top:e.scrollTop},l=0;return!function o(){let n={left:e.scrollLeft,top:e.scrollTop},s=r.left!==n.left,i=r.top!==n.top;(s||i)&&t(),r=n,l=window.requestAnimationFrame(o)}(),()=>window.cancelAnimationFrame(l)};function V(e,t){let r=(0,c.useCallbackRef)(e),o=l.useRef(0);return l.useEffect(()=>()=>window.clearTimeout(o.current),[]),l.useCallback(()=>{window.clearTimeout(o.current),o.current=window.setTimeout(r,t)},[r,t])}function Y(e,t){let r=(0,c.useCallbackRef)(t);(0,u.useLayoutEffect)(()=>{let t=0;if(e){let l=new ResizeObserver(()=>{cancelAnimationFrame(t),t=window.requestAnimationFrame(r)});return l.observe(e),()=>{window.cancelAnimationFrame(t),l.unobserve(e)}}},[e,r])}var X=e.i(555552);function K({className:e,children:t,...l}){return(0,r.jsxs)(w,{"data-slot":"scroll-area",className:(0,X.cn)("relative",e),...l,children:[(0,r.jsx)(y,{"data-slot":"scroll-area-viewport",className:"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1",children:t}),(0,r.jsx)(q,{}),(0,r.jsx)(H,{})]})}function q({className:e,orientation:t="vertical",...l}){return(0,r.jsx)(S,{"data-slot":"scroll-area-scrollbar",orientation:t,className:(0,X.cn)("flex touch-none p-px transition-colors select-none","vertical"===t&&"h-full w-2.5 border-l border-l-transparent","horizontal"===t&&"h-2.5 flex-col border-t border-t-transparent",e),...l,children:(0,r.jsx)(D,{"data-slot":"scroll-area-thumb",className:"bg-border relative flex-1 rounded-full"})})}e.s(["ScrollArea",()=>K,"ScrollBar",()=>q],772857)},375635,e=>{"use strict";var t=e.i(414294),r=e.i(430878),l=e.i(353913),o=e.i(292623),n=e.i(504561),s=e.i(996720),i=e.i(461957),a=e.i(846193),c=e.i(77589),c=c,d=e.i(416667),d=d,u=e.i(667249),p=e.i(191729),p=p,f=e.i(904781),m=e.i(87614),h=e.i(666904),x=e.i(77982),v=e.i(772857),g=e.i(524741),w=e.i(739963),b=e.i(300739),y=e.i(555552);function j(){let e=(0,l.useRouter)(),j=(0,l.useSearchParams)(),{sessions:S,isLoading:C}=(0,b.useSessions)(),[N,E]=(0,r.useState)(!1),[R,T]=(0,r.useState)(null),[P,k]=(0,r.useState)(""),[A,L]=(0,r.useState)(!1),[_,D]=(0,r.useState)(null),[z,I]=(0,r.useState)(null),H=(0,r.useRef)(!1),M=async(e,t)=>{e.preventDefault(),e.stopPropagation();try{await (0,g.deleteSession)(t),(0,b.mutateSessions)()}catch(e){console.error("Failed to delete session:",e)}};(0,r.useEffect)(()=>{(0,w.getConfig)().then(T)},[]),(0,r.useEffect)(()=>{j.has("new")&&R&&R.apiKeyConfigured&&!H.current&&!N&&(H.current=!0,(async()=>{E(!0);try{let t=await (0,g.createSession)({name:`Session ${S.length+1}`,model:R.defaultModel||"anthropic/claude-opus-4-6",toolApprovals:R.defaultToolApprovals||{}});(0,b.mutateSessions)(),e.replace(`/session/${t.id}`)}catch(e){console.error("Failed to auto-create session:",e),E(!1)}})())},[j,R,S.length,N,e]),(0,r.useEffect)(()=>{j.has("latest")&&!C&&S.length>0&&e.replace(`/session/${S[0].id}`)},[j,C,S,e]);let W=async()=>{if(P.trim()&&!A){L(!0),D(null);try{if((await (0,g.setApiKey)("ai-gateway",P.trim())).success){let e=await (0,w.getConfig)();T(e),k("")}else D("Failed to save API key. Please try again.")}catch(e){D("Failed to save API key. Please try again.")}finally{L(!1)}}},$=async()=>{if(!N){E(!0);try{let t=await (0,g.createSession)({name:`Session ${S.length+1}`,model:R?.defaultModel||"anthropic/claude-opus-4-6",toolApprovals:R?.defaultToolApprovals||{}});(0,b.mutateSessions)(),e.push(`/session/${t.id}`)}catch(e){console.error("Failed to create session:",e)}finally{E(!1)}}};return((0,r.useEffect)(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&"t"===e.key&&(e.preventDefault(),$())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[N,S.length,R]),R&&!R.apiKeyConfigured)?(0,t.jsx)("div",{className:"flex items-center justify-center h-full bg-gradient-to-b from-background to-muted/20",children:(0,t.jsxs)("div",{className:"text-center max-w-lg mx-auto p-8",children:[(0,t.jsx)("div",{className:"flex justify-center mb-8",children:(0,t.jsx)("div",{className:"relative size-28 rounded-2xl overflow-hidden shadow-xl ring-1 ring-white/10",children:(0,t.jsx)(o.default,{src:"/sparke-coder.png",alt:"Sparke - AI Coding Assistant",fill:!0,className:"object-cover",priority:!0})})}),(0,t.jsx)("h1",{className:"text-3xl font-bold mb-3 text-primary",children:"Welcome to SparkECoder"}),(0,t.jsxs)("div",{className:"bg-muted/50 rounded-lg p-6 mb-6 text-left",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,t.jsx)(a.Key,{className:"size-5 text-amber-500"}),(0,t.jsx)("h2",{className:"font-semibold",children:"API Key Required"})]}),(0,t.jsx)("p",{className:"text-sm text-muted-foreground mb-4",children:"SparkECoder uses the Vercel AI Gateway. Enter your API key to get started."}),(0,t.jsxs)("div",{className:"flex gap-2 mb-3",children:[(0,t.jsx)(x.Input,{type:"password",placeholder:"Enter your AI Gateway API key",value:P,onChange:e=>k(e.target.value),onKeyDown:e=>"Enter"===e.key&&W(),className:"flex-1"}),(0,t.jsx)(h.Button,{onClick:W,disabled:!P.trim()||A,children:A?(0,t.jsx)(i.Loader2,{className:"size-4 animate-spin"}):"Save"})]}),_&&(0,t.jsxs)("div",{className:"flex items-center gap-2 text-sm text-destructive mb-3",children:[(0,t.jsx)(d.default,{className:"size-4"}),_]}),(0,t.jsxs)("a",{href:"https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%2Fapi-keys",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 text-sm text-primary hover:underline",children:["Get an API key from Vercel",(0,t.jsx)(c.default,{className:"size-3"})]})]})]})}):(0,t.jsx)("div",{className:"flex items-center justify-center h-full bg-gradient-to-b from-background to-muted/20 overflow-auto",children:(0,t.jsxs)("div",{className:"text-center max-w-lg mx-auto p-8",children:[(0,t.jsx)("div",{className:"flex justify-center mb-8",children:(0,t.jsx)(m.TooltipProvider,{children:(0,t.jsxs)(m.Tooltip,{children:[(0,t.jsx)(m.TooltipTrigger,{asChild:!0,children:(0,t.jsxs)("div",{className:"relative group cursor-pointer",children:[(0,t.jsx)("div",{className:"absolute inset-0 rounded-3xl blur-2xl opacity-40 group-hover:opacity-60 transition-opacity bg-primary/30"}),(0,t.jsx)("div",{className:"relative size-28 rounded-2xl overflow-hidden shadow-xl ring-1 ring-white/10 hover-lift",children:(0,t.jsx)(o.default,{src:"/sparke-coder.png",alt:"Sparke - AI Coding Assistant",fill:!0,className:"object-cover sparke-idle",priority:!0})})]})}),(0,t.jsx)(m.TooltipContent,{children:"Meet Sparke, your coding companion!"})]})})}),(0,t.jsx)("h1",{className:"text-3xl font-bold mb-3 text-primary",children:"Welcome to SparkECoder"}),(0,t.jsx)("p",{className:"text-muted-foreground mb-8 leading-relaxed",children:"Your AI-powered coding assistant. Start a new session to begin building amazing things."}),(0,t.jsx)(h.Button,{size:"lg",onClick:$,disabled:N,className:"gap-2 px-8",children:N?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.Loader2,{className:"size-4 animate-spin"}),"Creating..."]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.Plus,{className:"size-4"}),"Start a Session"]})}),(0,t.jsxs)("p",{className:"mt-6 text-xs text-muted-foreground/70",children:["Press ",(0,t.jsx)("kbd",{className:"px-1.5 py-0.5 bg-muted rounded text-[10px] font-mono",children:"⌘"})," + ",(0,t.jsx)("kbd",{className:"px-1.5 py-0.5 bg-muted rounded text-[10px] font-mono",children:"T"})," to create a new session"]}),!C&&S.length>0&&(0,t.jsxs)("div",{className:"mt-10 text-left",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,t.jsx)(p.default,{className:"size-4 text-muted-foreground"}),(0,t.jsx)("h2",{className:"text-sm font-medium text-muted-foreground",children:"Recent Sessions"})]}),(0,t.jsx)("div",{className:"rounded-xl border border-border/60 bg-card/50 backdrop-blur-sm overflow-hidden",children:(0,t.jsx)(v.ScrollArea,{className:(0,y.cn)(S.length>5?"h-[280px]":""),children:(0,t.jsx)("div",{className:"divide-y divide-border/40",children:S.map(e=>{let r,l,o,s,i=z===e.id,a=!0===e.isStreaming;return(0,t.jsxs)(n.default,{href:`/session/${e.id}`,className:(0,y.cn)("flex items-center gap-3 p-3 transition-colors hover:bg-accent/50 group",a&&"bg-emerald-500/5"),onMouseEnter:()=>I(e.id),onMouseLeave:()=>I(null),children:[(0,t.jsx)("div",{className:(0,y.cn)("size-9 rounded-lg flex items-center justify-center shrink-0 transition-colors",a?"bg-emerald-500/10":"bg-muted/60 group-hover:bg-muted"),children:a?(0,t.jsx)("span",{className:"size-2.5 rounded-full bg-emerald-500 animate-pulse"}):(0,t.jsx)(u.MessageSquare,{className:"size-4 text-muted-foreground"})}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("p",{className:(0,y.cn)("text-sm font-medium truncate",a&&"text-emerald-600 dark:text-emerald-400"),children:e.name||"Untitled Session"}),(0,t.jsx)("p",{className:"text-xs text-muted-foreground truncate",children:a?(0,t.jsx)("span",{className:"text-emerald-600 dark:text-emerald-400",children:"Active now"}):"waiting"===e.status?(0,t.jsx)("span",{className:"text-amber-600 dark:text-amber-400",children:"Waiting for input"}):(r=new Date(e.updatedAt||e.createdAt),s=Math.floor((o=Math.floor((l=Math.floor(Math.floor((new Date().getTime()-r.getTime())/1e3)/60))/60))/24),l<1?"just now":1===l?"1 minute ago":l<60?`${l} minutes ago`:1===o?"1 hour ago":o<24?`${o} hours ago`:1===s?"yesterday":s<7?`${s} days ago`:`${Math.floor(s/7)} weeks ago`)})]}),i&&(0,t.jsx)(m.TooltipProvider,{children:(0,t.jsxs)(m.Tooltip,{children:[(0,t.jsx)(m.TooltipTrigger,{asChild:!0,children:(0,t.jsx)(h.Button,{size:"icon",variant:"ghost",className:"size-7 shrink-0 hover:bg-destructive/10 hover:text-destructive transition-colors",onClick:t=>M(t,e.id),children:(0,t.jsx)(f.Trash2,{className:"size-3.5"})})}),(0,t.jsx)(m.TooltipContent,{children:"Delete session"})]})})]},e.id)})})})})]})]})})}function S(){return(0,t.jsx)(r.Suspense,{fallback:(0,t.jsx)("div",{className:"flex items-center justify-center h-full",children:(0,t.jsx)(i.Loader2,{className:"size-6 animate-spin text-muted-foreground"})}),children:(0,t.jsx)(j,{})})}e.s(["default",()=>S],375635)}]);
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,77589,e=>{"use strict";let t=(0,e.i(292511).default)("external-link",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);e.s(["default",()=>t])},416667,e=>{"use strict";let t=(0,e.i(292511).default)("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);e.s(["default",()=>t])},191729,772857,e=>{"use strict";let t=(0,e.i(292511).default)("clock",[["path",{d:"M12 6v6l4 2",key:"mmk7yg"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);e.s(["default",()=>t],191729);var r=e.i(414294),l=e.i(430878);e.i(773340);var o=e.i(309945),n=Symbol("radix.slottable");function s(e){return l.isValidElement(e)&&"function"==typeof e.type&&"__radixId"in e.type&&e.type.__radixId===n}var i=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"].reduce((e,t)=>{var n,i;let a,c,d,u=(i=n=`Primitive.${t}`,(a=l.forwardRef((e,t)=>{let{children:r,...n}=e;if(l.isValidElement(r)){var s;let e,i,a=(s=r,(i=(e=Object.getOwnPropertyDescriptor(s.props,"ref")?.get)&&"isReactWarning"in e&&e.isReactWarning)?s.ref:(i=(e=Object.getOwnPropertyDescriptor(s,"ref")?.get)&&"isReactWarning"in e&&e.isReactWarning)?s.props.ref:s.props.ref||s.ref),c=function(e,t){let r={...t};for(let l in t){let o=e[l],n=t[l];/^on[A-Z]/.test(l)?o&&n?r[l]=(...e)=>{let t=n(...e);return o(...e),t}:o&&(r[l]=o):"style"===l?r[l]={...o,...n}:"className"===l&&(r[l]=[o,n].filter(Boolean).join(" "))}return{...e,...r}}(n,r.props);return r.type!==l.Fragment&&(c.ref=t?(0,o.composeRefs)(t,a):a),l.cloneElement(r,c)}return l.Children.count(r)>1?l.Children.only(null):null})).displayName=`${i}.SlotClone`,c=a,(d=l.forwardRef((e,t)=>{let{children:o,...n}=e,i=l.Children.toArray(o),a=i.find(s);if(a){let e=a.props.children,o=i.map(t=>t!==a?t:l.Children.count(e)>1?l.Children.only(null):l.isValidElement(e)?e.props.children:null);return(0,r.jsx)(c,{...n,ref:t,children:l.isValidElement(e)?l.cloneElement(e,void 0,o):null})}return(0,r.jsx)(c,{...n,ref:t,children:o})})).displayName=`${n}.Slot`,d),p=l.forwardRef((e,l)=>{let{asChild:o,...n}=e;return"u">typeof window&&(window[Symbol.for("radix-ui")]=!0),(0,r.jsx)(o?u:t,{...n,ref:l})});return p.displayName=`Primitive.${t}`,{...e,[t]:p}},{}),a=e.i(395509),c=e.i(897462),d=e.i(542899),u=e.i(995945),p=e.i(992421),f=e.i(241416),m="ScrollArea",[h,x]=function(e,t=[]){let o=[],n=()=>{let t=o.map(e=>l.createContext(e));return function(r){let o=r?.[e]||t;return l.useMemo(()=>({[`__scope${e}`]:{...r,[e]:o}}),[r,o])}};return n.scopeName=e,[function(t,n){let s=l.createContext(n),i=o.length;o=[...o,n];let a=t=>{let{scope:o,children:n,...a}=t,c=o?.[e]?.[i]||s,d=l.useMemo(()=>a,Object.values(a));return(0,r.jsx)(c.Provider,{value:d,children:n})};return a.displayName=t+"Provider",[a,function(r,o){let a=o?.[e]?.[i]||s,c=l.useContext(a);if(c)return c;if(void 0!==n)return n;throw Error(`\`${r}\` must be used within \`${t}\``)}]},function(...e){let t=e[0];if(1===e.length)return t;let r=()=>{let r=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return function(e){let o=r.reduce((t,{useScope:r,scopeName:l})=>{let o=r(e)[`__scope${l}`];return{...t,...o}},{});return l.useMemo(()=>({[`__scope${t.scopeName}`]:o}),[o])}};return r.scopeName=t.scopeName,r}(n,...t)]}(m),[v,g]=h(m),w=l.forwardRef((e,t)=>{let{__scopeScrollArea:n,type:s="hover",dir:a,scrollHideDelay:c=600,...u}=e,[p,f]=l.useState(null),[m,h]=l.useState(null),[x,g]=l.useState(null),[w,b]=l.useState(null),[y,j]=l.useState(null),[S,C]=l.useState(0),[N,E]=l.useState(0),[R,T]=l.useState(!1),[P,k]=l.useState(!1),A=(0,o.useComposedRefs)(t,e=>f(e)),L=(0,d.useDirection)(a);return(0,r.jsx)(v,{scope:n,type:s,dir:L,scrollHideDelay:c,scrollArea:p,viewport:m,onViewportChange:h,content:x,onContentChange:g,scrollbarX:w,onScrollbarXChange:b,scrollbarXEnabled:R,onScrollbarXEnabledChange:T,scrollbarY:y,onScrollbarYChange:j,scrollbarYEnabled:P,onScrollbarYEnabledChange:k,onCornerWidthChange:C,onCornerHeightChange:E,children:(0,r.jsx)(i.div,{dir:L,...u,ref:A,style:{position:"relative","--radix-scroll-area-corner-width":S+"px","--radix-scroll-area-corner-height":N+"px",...e.style}})})});w.displayName=m;var b="ScrollAreaViewport",y=l.forwardRef((e,t)=>{let{__scopeScrollArea:n,children:s,nonce:a,...c}=e,d=g(b,n),u=l.useRef(null),p=(0,o.useComposedRefs)(t,u,d.onViewportChange);return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:a}),(0,r.jsx)(i.div,{"data-radix-scroll-area-viewport":"",...c,ref:p,style:{overflowX:d.scrollbarXEnabled?"scroll":"hidden",overflowY:d.scrollbarYEnabled?"scroll":"hidden",...e.style},children:(0,r.jsx)("div",{ref:d.onContentChange,style:{minWidth:"100%",display:"table"},children:s})})]})});y.displayName=b;var j="ScrollAreaScrollbar",S=l.forwardRef((e,t)=>{let{forceMount:o,...n}=e,s=g(j,e.__scopeScrollArea),{onScrollbarXEnabledChange:i,onScrollbarYEnabledChange:a}=s,c="horizontal"===e.orientation;return l.useEffect(()=>(c?i(!0):a(!0),()=>{c?i(!1):a(!1)}),[c,i,a]),"hover"===s.type?(0,r.jsx)(C,{...n,ref:t,forceMount:o}):"scroll"===s.type?(0,r.jsx)(N,{...n,ref:t,forceMount:o}):"auto"===s.type?(0,r.jsx)(E,{...n,ref:t,forceMount:o}):"always"===s.type?(0,r.jsx)(R,{...n,ref:t}):null});S.displayName=j;var C=l.forwardRef((e,t)=>{let{forceMount:o,...n}=e,s=g(j,e.__scopeScrollArea),[i,c]=l.useState(!1);return l.useEffect(()=>{let e=s.scrollArea,t=0;if(e){let r=()=>{window.clearTimeout(t),c(!0)},l=()=>{t=window.setTimeout(()=>c(!1),s.scrollHideDelay)};return e.addEventListener("pointerenter",r),e.addEventListener("pointerleave",l),()=>{window.clearTimeout(t),e.removeEventListener("pointerenter",r),e.removeEventListener("pointerleave",l)}}},[s.scrollArea,s.scrollHideDelay]),(0,r.jsx)(a.Presence,{present:o||i,children:(0,r.jsx)(E,{"data-state":i?"visible":"hidden",...n,ref:t})})}),N=l.forwardRef((e,t)=>{var o;let{forceMount:n,...s}=e,i=g(j,e.__scopeScrollArea),c="horizontal"===e.orientation,d=V(()=>p("SCROLL_END"),100),[u,p]=(o={hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}},l.useReducer((e,t)=>o[e][t]??e,"hidden"));return l.useEffect(()=>{if("idle"===u){let e=window.setTimeout(()=>p("HIDE"),i.scrollHideDelay);return()=>window.clearTimeout(e)}},[u,i.scrollHideDelay,p]),l.useEffect(()=>{let e=i.viewport,t=c?"scrollLeft":"scrollTop";if(e){let r=e[t],l=()=>{let l=e[t];r!==l&&(p("SCROLL"),d()),r=l};return e.addEventListener("scroll",l),()=>e.removeEventListener("scroll",l)}},[i.viewport,c,p,d]),(0,r.jsx)(a.Presence,{present:n||"hidden"!==u,children:(0,r.jsx)(R,{"data-state":"hidden"===u?"hidden":"visible",...s,ref:t,onPointerEnter:(0,f.composeEventHandlers)(e.onPointerEnter,()=>p("POINTER_ENTER")),onPointerLeave:(0,f.composeEventHandlers)(e.onPointerLeave,()=>p("POINTER_LEAVE"))})})}),E=l.forwardRef((e,t)=>{let o=g(j,e.__scopeScrollArea),{forceMount:n,...s}=e,[i,c]=l.useState(!1),d="horizontal"===e.orientation,u=V(()=>{if(o.viewport){let e=o.viewport.offsetWidth<o.viewport.scrollWidth,t=o.viewport.offsetHeight<o.viewport.scrollHeight;c(d?e:t)}},10);return Y(o.viewport,u),Y(o.content,u),(0,r.jsx)(a.Presence,{present:n||i,children:(0,r.jsx)(R,{"data-state":i?"visible":"hidden",...s,ref:t})})}),R=l.forwardRef((e,t)=>{let{orientation:o="vertical",...n}=e,s=g(j,e.__scopeScrollArea),i=l.useRef(null),a=l.useRef(0),[c,d]=l.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),u=$(c.viewport,c.content),p={...n,sizes:c,onSizesChange:d,hasThumb:!!(u>0&&u<1),onThumbChange:e=>i.current=e,onThumbPointerUp:()=>a.current=0,onThumbPointerDown:e=>a.current=e};function f(e,t){return function(e,t,r,l="ltr"){let o=O(r),n=t||o/2,s=r.scrollbar.paddingStart+n,i=r.scrollbar.size-r.scrollbar.paddingEnd-(o-n),a=r.content-r.viewport;return B([s,i],"ltr"===l?[0,a]:[-1*a,0])(e)}(e,a.current,c,t)}return"horizontal"===o?(0,r.jsx)(T,{...p,ref:t,onThumbPositionChange:()=>{if(s.viewport&&i.current){let e=F(s.viewport.scrollLeft,c,s.dir);i.current.style.transform=`translate3d(${e}px, 0, 0)`}},onWheelScroll:e=>{s.viewport&&(s.viewport.scrollLeft=e)},onDragScroll:e=>{s.viewport&&(s.viewport.scrollLeft=f(e,s.dir))}}):"vertical"===o?(0,r.jsx)(P,{...p,ref:t,onThumbPositionChange:()=>{if(s.viewport&&i.current){let e=F(s.viewport.scrollTop,c);i.current.style.transform=`translate3d(0, ${e}px, 0)`}},onWheelScroll:e=>{s.viewport&&(s.viewport.scrollTop=e)},onDragScroll:e=>{s.viewport&&(s.viewport.scrollTop=f(e))}}):null}),T=l.forwardRef((e,t)=>{let{sizes:n,onSizesChange:s,...i}=e,a=g(j,e.__scopeScrollArea),[c,d]=l.useState(),u=l.useRef(null),p=(0,o.useComposedRefs)(t,u,a.onScrollbarXChange);return l.useEffect(()=>{u.current&&d(getComputedStyle(u.current))},[u]),(0,r.jsx)(L,{"data-orientation":"horizontal",...i,ref:p,sizes:n,style:{bottom:0,left:"rtl"===a.dir?"var(--radix-scroll-area-corner-width)":0,right:"ltr"===a.dir?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":O(n)+"px",...e.style},onThumbPointerDown:t=>e.onThumbPointerDown(t.x),onDragScroll:t=>e.onDragScroll(t.x),onWheelScroll:(t,r)=>{if(a.viewport){var l,o;let n=a.viewport.scrollLeft+t.deltaX;e.onWheelScroll(n),l=n,o=r,l>0&&l<o&&t.preventDefault()}},onResize:()=>{u.current&&a.viewport&&c&&s({content:a.viewport.scrollWidth,viewport:a.viewport.offsetWidth,scrollbar:{size:u.current.clientWidth,paddingStart:W(c.paddingLeft),paddingEnd:W(c.paddingRight)}})}})}),P=l.forwardRef((e,t)=>{let{sizes:n,onSizesChange:s,...i}=e,a=g(j,e.__scopeScrollArea),[c,d]=l.useState(),u=l.useRef(null),p=(0,o.useComposedRefs)(t,u,a.onScrollbarYChange);return l.useEffect(()=>{u.current&&d(getComputedStyle(u.current))},[u]),(0,r.jsx)(L,{"data-orientation":"vertical",...i,ref:p,sizes:n,style:{top:0,right:"ltr"===a.dir?0:void 0,left:"rtl"===a.dir?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":O(n)+"px",...e.style},onThumbPointerDown:t=>e.onThumbPointerDown(t.y),onDragScroll:t=>e.onDragScroll(t.y),onWheelScroll:(t,r)=>{if(a.viewport){var l,o;let n=a.viewport.scrollTop+t.deltaY;e.onWheelScroll(n),l=n,o=r,l>0&&l<o&&t.preventDefault()}},onResize:()=>{u.current&&a.viewport&&c&&s({content:a.viewport.scrollHeight,viewport:a.viewport.offsetHeight,scrollbar:{size:u.current.clientHeight,paddingStart:W(c.paddingTop),paddingEnd:W(c.paddingBottom)}})}})}),[k,A]=h(j),L=l.forwardRef((e,t)=>{let{__scopeScrollArea:n,sizes:s,hasThumb:a,onThumbChange:d,onThumbPointerUp:u,onThumbPointerDown:p,onThumbPositionChange:m,onDragScroll:h,onWheelScroll:x,onResize:v,...w}=e,b=g(j,n),[y,S]=l.useState(null),C=(0,o.useComposedRefs)(t,e=>S(e)),N=l.useRef(null),E=l.useRef(""),R=b.viewport,T=s.content-s.viewport,P=(0,c.useCallbackRef)(x),A=(0,c.useCallbackRef)(m),L=V(v,10);function _(e){N.current&&h({x:e.clientX-N.current.left,y:e.clientY-N.current.top})}return l.useEffect(()=>{let e=e=>{let t=e.target;y?.contains(t)&&P(e,T)};return document.addEventListener("wheel",e,{passive:!1}),()=>document.removeEventListener("wheel",e,{passive:!1})},[R,y,T,P]),l.useEffect(A,[s,A]),Y(y,L),Y(b.content,L),(0,r.jsx)(k,{scope:n,scrollbar:y,hasThumb:a,onThumbChange:(0,c.useCallbackRef)(d),onThumbPointerUp:(0,c.useCallbackRef)(u),onThumbPositionChange:A,onThumbPointerDown:(0,c.useCallbackRef)(p),children:(0,r.jsx)(i.div,{...w,ref:C,style:{position:"absolute",...w.style},onPointerDown:(0,f.composeEventHandlers)(e.onPointerDown,e=>{0===e.button&&(e.target.setPointerCapture(e.pointerId),N.current=y.getBoundingClientRect(),E.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",b.viewport&&(b.viewport.style.scrollBehavior="auto"),_(e))}),onPointerMove:(0,f.composeEventHandlers)(e.onPointerMove,_),onPointerUp:(0,f.composeEventHandlers)(e.onPointerUp,e=>{let t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),document.body.style.webkitUserSelect=E.current,b.viewport&&(b.viewport.style.scrollBehavior=""),N.current=null})})})}),_="ScrollAreaThumb",D=l.forwardRef((e,t)=>{let{forceMount:l,...o}=e,n=A(_,e.__scopeScrollArea);return(0,r.jsx)(a.Presence,{present:l||n.hasThumb,children:(0,r.jsx)(z,{ref:t,...o})})}),z=l.forwardRef((e,t)=>{let{__scopeScrollArea:n,style:s,...a}=e,c=g(_,n),d=A(_,n),{onThumbPositionChange:u}=d,p=(0,o.useComposedRefs)(t,e=>d.onThumbChange(e)),m=l.useRef(void 0),h=V(()=>{m.current&&(m.current(),m.current=void 0)},100);return l.useEffect(()=>{let e=c.viewport;if(e){let t=()=>{h(),m.current||(m.current=U(e,u),u())};return u(),e.addEventListener("scroll",t),()=>e.removeEventListener("scroll",t)}},[c.viewport,h,u]),(0,r.jsx)(i.div,{"data-state":d.hasThumb?"visible":"hidden",...a,ref:p,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...s},onPointerDownCapture:(0,f.composeEventHandlers)(e.onPointerDownCapture,e=>{let t=e.target.getBoundingClientRect(),r=e.clientX-t.left,l=e.clientY-t.top;d.onThumbPointerDown({x:r,y:l})}),onPointerUp:(0,f.composeEventHandlers)(e.onPointerUp,d.onThumbPointerUp)})});D.displayName=_;var I="ScrollAreaCorner",H=l.forwardRef((e,t)=>{let l=g(I,e.__scopeScrollArea),o=!!(l.scrollbarX&&l.scrollbarY);return"scroll"!==l.type&&o?(0,r.jsx)(M,{...e,ref:t}):null});H.displayName=I;var M=l.forwardRef((e,t)=>{let{__scopeScrollArea:o,...n}=e,s=g(I,o),[a,c]=l.useState(0),[d,u]=l.useState(0),p=!!(a&&d);return Y(s.scrollbarX,()=>{let e=s.scrollbarX?.offsetHeight||0;s.onCornerHeightChange(e),u(e)}),Y(s.scrollbarY,()=>{let e=s.scrollbarY?.offsetWidth||0;s.onCornerWidthChange(e),c(e)}),p?(0,r.jsx)(i.div,{...n,ref:t,style:{width:a,height:d,position:"absolute",right:"ltr"===s.dir?0:void 0,left:"rtl"===s.dir?0:void 0,bottom:0,...e.style}}):null});function W(e){return e?parseInt(e,10):0}function $(e,t){let r=e/t;return isNaN(r)?0:r}function O(e){let t=$(e.viewport,e.content),r=e.scrollbar.paddingStart+e.scrollbar.paddingEnd;return Math.max((e.scrollbar.size-r)*t,18)}function F(e,t,r="ltr"){let l=O(t),o=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,n=t.scrollbar.size-o,s=t.content-t.viewport,i=(0,p.clamp)(e,"ltr"===r?[0,s]:[-1*s,0]);return B([0,s],[0,n-l])(i)}function B(e,t){return r=>{if(e[0]===e[1]||t[0]===t[1])return t[0];let l=(t[1]-t[0])/(e[1]-e[0]);return t[0]+l*(r-e[0])}}var U=(e,t=()=>{})=>{let r={left:e.scrollLeft,top:e.scrollTop},l=0;return!function o(){let n={left:e.scrollLeft,top:e.scrollTop},s=r.left!==n.left,i=r.top!==n.top;(s||i)&&t(),r=n,l=window.requestAnimationFrame(o)}(),()=>window.cancelAnimationFrame(l)};function V(e,t){let r=(0,c.useCallbackRef)(e),o=l.useRef(0);return l.useEffect(()=>()=>window.clearTimeout(o.current),[]),l.useCallback(()=>{window.clearTimeout(o.current),o.current=window.setTimeout(r,t)},[r,t])}function Y(e,t){let r=(0,c.useCallbackRef)(t);(0,u.useLayoutEffect)(()=>{let t=0;if(e){let l=new ResizeObserver(()=>{cancelAnimationFrame(t),t=window.requestAnimationFrame(r)});return l.observe(e),()=>{window.cancelAnimationFrame(t),l.unobserve(e)}}},[e,r])}var X=e.i(555552);function K({className:e,children:t,...l}){return(0,r.jsxs)(w,{"data-slot":"scroll-area",className:(0,X.cn)("relative",e),...l,children:[(0,r.jsx)(y,{"data-slot":"scroll-area-viewport",className:"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1",children:t}),(0,r.jsx)(q,{}),(0,r.jsx)(H,{})]})}function q({className:e,orientation:t="vertical",...l}){return(0,r.jsx)(S,{"data-slot":"scroll-area-scrollbar",orientation:t,className:(0,X.cn)("flex touch-none p-px transition-colors select-none","vertical"===t&&"h-full w-2.5 border-l border-l-transparent","horizontal"===t&&"h-2.5 flex-col border-t border-t-transparent",e),...l,children:(0,r.jsx)(D,{"data-slot":"scroll-area-thumb",className:"bg-border relative flex-1 rounded-full"})})}e.s(["ScrollArea",()=>K,"ScrollBar",()=>q],772857)},375635,e=>{"use strict";var t=e.i(414294),r=e.i(430878),l=e.i(353913),o=e.i(292623),n=e.i(504561),s=e.i(996720),i=e.i(461957),a=e.i(846193),c=e.i(77589),c=c,d=e.i(416667),d=d,u=e.i(667249),p=e.i(191729),p=p,f=e.i(904781),m=e.i(87614),h=e.i(666904),x=e.i(77982),v=e.i(772857),g=e.i(524741),w=e.i(739963),b=e.i(300739),y=e.i(555552);function j(){let e=(0,l.useRouter)(),j=(0,l.useSearchParams)(),{sessions:S,isLoading:C}=(0,b.useSessions)(),[N,E]=(0,r.useState)(!1),[R,T]=(0,r.useState)(null),[P,k]=(0,r.useState)(""),[A,L]=(0,r.useState)(!1),[_,D]=(0,r.useState)(null),[z,I]=(0,r.useState)(null),H=(0,r.useRef)(!1),M=async(e,t)=>{e.preventDefault(),e.stopPropagation();try{await (0,g.deleteSession)(t),(0,b.mutateSessions)()}catch(e){console.error("Failed to delete session:",e)}};(0,r.useEffect)(()=>{(0,w.getConfig)().then(T)},[]),(0,r.useEffect)(()=>{j.has("new")&&R&&R.apiKeyConfigured&&!H.current&&!N&&(H.current=!0,(async()=>{E(!0);try{let t=await (0,g.createSession)({name:`Session ${S.length+1}`,model:R.defaultModel||"anthropic/claude-opus-4.7",toolApprovals:R.defaultToolApprovals||{}});(0,b.mutateSessions)(),e.replace(`/session/${t.id}`)}catch(e){console.error("Failed to auto-create session:",e),E(!1)}})())},[j,R,S.length,N,e]),(0,r.useEffect)(()=>{j.has("latest")&&!C&&S.length>0&&e.replace(`/session/${S[0].id}`)},[j,C,S,e]);let W=async()=>{if(P.trim()&&!A){L(!0),D(null);try{if((await (0,g.setApiKey)("ai-gateway",P.trim())).success){let e=await (0,w.getConfig)();T(e),k("")}else D("Failed to save API key. Please try again.")}catch(e){D("Failed to save API key. Please try again.")}finally{L(!1)}}},$=async()=>{if(!N){E(!0);try{let t=await (0,g.createSession)({name:`Session ${S.length+1}`,model:R?.defaultModel||"anthropic/claude-opus-4.7",toolApprovals:R?.defaultToolApprovals||{}});(0,b.mutateSessions)(),e.push(`/session/${t.id}`)}catch(e){console.error("Failed to create session:",e)}finally{E(!1)}}};return((0,r.useEffect)(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&"t"===e.key&&(e.preventDefault(),$())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[N,S.length,R]),R&&!R.apiKeyConfigured)?(0,t.jsx)("div",{className:"flex items-center justify-center h-full bg-gradient-to-b from-background to-muted/20",children:(0,t.jsxs)("div",{className:"text-center max-w-lg mx-auto p-8",children:[(0,t.jsx)("div",{className:"flex justify-center mb-8",children:(0,t.jsx)("div",{className:"relative size-28 rounded-2xl overflow-hidden shadow-xl ring-1 ring-white/10",children:(0,t.jsx)(o.default,{src:"/sparke-coder.png",alt:"Sparke - AI Coding Assistant",fill:!0,className:"object-cover",priority:!0})})}),(0,t.jsx)("h1",{className:"text-3xl font-bold mb-3 text-primary",children:"Welcome to SparkECoder"}),(0,t.jsxs)("div",{className:"bg-muted/50 rounded-lg p-6 mb-6 text-left",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,t.jsx)(a.Key,{className:"size-5 text-amber-500"}),(0,t.jsx)("h2",{className:"font-semibold",children:"API Key Required"})]}),(0,t.jsx)("p",{className:"text-sm text-muted-foreground mb-4",children:"SparkECoder uses the Vercel AI Gateway. Enter your API key to get started."}),(0,t.jsxs)("div",{className:"flex gap-2 mb-3",children:[(0,t.jsx)(x.Input,{type:"password",placeholder:"Enter your AI Gateway API key",value:P,onChange:e=>k(e.target.value),onKeyDown:e=>"Enter"===e.key&&W(),className:"flex-1"}),(0,t.jsx)(h.Button,{onClick:W,disabled:!P.trim()||A,children:A?(0,t.jsx)(i.Loader2,{className:"size-4 animate-spin"}):"Save"})]}),_&&(0,t.jsxs)("div",{className:"flex items-center gap-2 text-sm text-destructive mb-3",children:[(0,t.jsx)(d.default,{className:"size-4"}),_]}),(0,t.jsxs)("a",{href:"https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%2Fapi-keys",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 text-sm text-primary hover:underline",children:["Get an API key from Vercel",(0,t.jsx)(c.default,{className:"size-3"})]})]})]})}):(0,t.jsx)("div",{className:"flex items-center justify-center h-full bg-gradient-to-b from-background to-muted/20 overflow-auto",children:(0,t.jsxs)("div",{className:"text-center max-w-lg mx-auto p-8",children:[(0,t.jsx)("div",{className:"flex justify-center mb-8",children:(0,t.jsx)(m.TooltipProvider,{children:(0,t.jsxs)(m.Tooltip,{children:[(0,t.jsx)(m.TooltipTrigger,{asChild:!0,children:(0,t.jsxs)("div",{className:"relative group cursor-pointer",children:[(0,t.jsx)("div",{className:"absolute inset-0 rounded-3xl blur-2xl opacity-40 group-hover:opacity-60 transition-opacity bg-primary/30"}),(0,t.jsx)("div",{className:"relative size-28 rounded-2xl overflow-hidden shadow-xl ring-1 ring-white/10 hover-lift",children:(0,t.jsx)(o.default,{src:"/sparke-coder.png",alt:"Sparke - AI Coding Assistant",fill:!0,className:"object-cover sparke-idle",priority:!0})})]})}),(0,t.jsx)(m.TooltipContent,{children:"Meet Sparke, your coding companion!"})]})})}),(0,t.jsx)("h1",{className:"text-3xl font-bold mb-3 text-primary",children:"Welcome to SparkECoder"}),(0,t.jsx)("p",{className:"text-muted-foreground mb-8 leading-relaxed",children:"Your AI-powered coding assistant. Start a new session to begin building amazing things."}),(0,t.jsx)(h.Button,{size:"lg",onClick:$,disabled:N,className:"gap-2 px-8",children:N?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.Loader2,{className:"size-4 animate-spin"}),"Creating..."]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.Plus,{className:"size-4"}),"Start a Session"]})}),(0,t.jsxs)("p",{className:"mt-6 text-xs text-muted-foreground/70",children:["Press ",(0,t.jsx)("kbd",{className:"px-1.5 py-0.5 bg-muted rounded text-[10px] font-mono",children:"⌘"})," + ",(0,t.jsx)("kbd",{className:"px-1.5 py-0.5 bg-muted rounded text-[10px] font-mono",children:"T"})," to create a new session"]}),!C&&S.length>0&&(0,t.jsxs)("div",{className:"mt-10 text-left",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,t.jsx)(p.default,{className:"size-4 text-muted-foreground"}),(0,t.jsx)("h2",{className:"text-sm font-medium text-muted-foreground",children:"Recent Sessions"})]}),(0,t.jsx)("div",{className:"rounded-xl border border-border/60 bg-card/50 backdrop-blur-sm overflow-hidden",children:(0,t.jsx)(v.ScrollArea,{className:(0,y.cn)(S.length>5?"h-[280px]":""),children:(0,t.jsx)("div",{className:"divide-y divide-border/40",children:S.map(e=>{let r,l,o,s,i=z===e.id,a=!0===e.isStreaming;return(0,t.jsxs)(n.default,{href:`/session/${e.id}`,className:(0,y.cn)("flex items-center gap-3 p-3 transition-colors hover:bg-accent/50 group",a&&"bg-emerald-500/5"),onMouseEnter:()=>I(e.id),onMouseLeave:()=>I(null),children:[(0,t.jsx)("div",{className:(0,y.cn)("size-9 rounded-lg flex items-center justify-center shrink-0 transition-colors",a?"bg-emerald-500/10":"bg-muted/60 group-hover:bg-muted"),children:a?(0,t.jsx)("span",{className:"size-2.5 rounded-full bg-emerald-500 animate-pulse"}):(0,t.jsx)(u.MessageSquare,{className:"size-4 text-muted-foreground"})}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("p",{className:(0,y.cn)("text-sm font-medium truncate",a&&"text-emerald-600 dark:text-emerald-400"),children:e.name||"Untitled Session"}),(0,t.jsx)("p",{className:"text-xs text-muted-foreground truncate",children:a?(0,t.jsx)("span",{className:"text-emerald-600 dark:text-emerald-400",children:"Active now"}):"waiting"===e.status?(0,t.jsx)("span",{className:"text-amber-600 dark:text-amber-400",children:"Waiting for input"}):(r=new Date(e.updatedAt||e.createdAt),s=Math.floor((o=Math.floor((l=Math.floor(Math.floor((new Date().getTime()-r.getTime())/1e3)/60))/60))/24),l<1?"just now":1===l?"1 minute ago":l<60?`${l} minutes ago`:1===o?"1 hour ago":o<24?`${o} hours ago`:1===s?"yesterday":s<7?`${s} days ago`:`${Math.floor(s/7)} weeks ago`)})]}),i&&(0,t.jsx)(m.TooltipProvider,{children:(0,t.jsxs)(m.Tooltip,{children:[(0,t.jsx)(m.TooltipTrigger,{asChild:!0,children:(0,t.jsx)(h.Button,{size:"icon",variant:"ghost",className:"size-7 shrink-0 hover:bg-destructive/10 hover:text-destructive transition-colors",onClick:t=>M(t,e.id),children:(0,t.jsx)(f.Trash2,{className:"size-3.5"})})}),(0,t.jsx)(m.TooltipContent,{children:"Delete session"})]})})]},e.id)})})})})]})]})})}function S(){return(0,t.jsx)(r.Suspense,{fallback:(0,t.jsx)("div",{className:"flex items-center justify-center h-full",children:(0,t.jsx)(i.Loader2,{className:"size-6 animate-spin text-muted-foreground"})}),children:(0,t.jsx)(j,{})})}e.s(["default",()=>S],375635)}]);
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"@visual-json/core": "^0.1.1",
|
|
38
38
|
"@visual-json/react": "^0.1.1",
|
|
39
39
|
"@xyflow/react": "^12.10.0",
|
|
40
|
-
"ai": "^6.0.
|
|
40
|
+
"ai": "^6.0.168",
|
|
41
41
|
"ansi-to-react": "^6.2.6",
|
|
42
42
|
"class-variance-authority": "^0.7.1",
|
|
43
43
|
"clsx": "^2.1.1",
|
|
@@ -90,14 +90,14 @@
|
|
|
90
90
|
"license": "MIT"
|
|
91
91
|
},
|
|
92
92
|
"node_modules/@ai-sdk/gateway": {
|
|
93
|
-
"version": "3.0.
|
|
94
|
-
"resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.
|
|
95
|
-
"integrity": "sha512-
|
|
93
|
+
"version": "3.0.109",
|
|
94
|
+
"resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.109.tgz",
|
|
95
|
+
"integrity": "sha512-r6dOqThjODp1vOhGRJg2OCmyB/ZOQtGx1esZ2SDvwDX5XoX8dBqYaYjLg8MPXTzMGJSgOkJyCxWgUcZtAl16pw==",
|
|
96
96
|
"license": "Apache-2.0",
|
|
97
97
|
"dependencies": {
|
|
98
|
-
"@ai-sdk/provider": "3.0.
|
|
99
|
-
"@ai-sdk/provider-utils": "4.0.
|
|
100
|
-
"@vercel/oidc": "3.
|
|
98
|
+
"@ai-sdk/provider": "3.0.10",
|
|
99
|
+
"@ai-sdk/provider-utils": "4.0.26",
|
|
100
|
+
"@vercel/oidc": "3.2.0"
|
|
101
101
|
},
|
|
102
102
|
"engines": {
|
|
103
103
|
"node": ">=18"
|
|
@@ -107,9 +107,9 @@
|
|
|
107
107
|
}
|
|
108
108
|
},
|
|
109
109
|
"node_modules/@ai-sdk/provider": {
|
|
110
|
-
"version": "3.0.
|
|
111
|
-
"resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.
|
|
112
|
-
"integrity": "sha512-
|
|
110
|
+
"version": "3.0.10",
|
|
111
|
+
"resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.10.tgz",
|
|
112
|
+
"integrity": "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==",
|
|
113
113
|
"license": "Apache-2.0",
|
|
114
114
|
"dependencies": {
|
|
115
115
|
"json-schema": "^0.4.0"
|
|
@@ -119,14 +119,14 @@
|
|
|
119
119
|
}
|
|
120
120
|
},
|
|
121
121
|
"node_modules/@ai-sdk/provider-utils": {
|
|
122
|
-
"version": "4.0.
|
|
123
|
-
"resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.
|
|
124
|
-
"integrity": "sha512-
|
|
122
|
+
"version": "4.0.26",
|
|
123
|
+
"resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.26.tgz",
|
|
124
|
+
"integrity": "sha512-CsKNLKsOpvPujRlIYvoz+Ybw+kGn7J4/fIZa/58+R7iWLLfwn6ifE2G6Yq8K9XvH/I/3bzaDAJ3NhRwEMsLBKQ==",
|
|
125
125
|
"license": "Apache-2.0",
|
|
126
126
|
"dependencies": {
|
|
127
|
-
"@ai-sdk/provider": "3.0.
|
|
127
|
+
"@ai-sdk/provider": "3.0.10",
|
|
128
128
|
"@standard-schema/spec": "^1.1.0",
|
|
129
|
-
"eventsource-parser": "^3.0.
|
|
129
|
+
"eventsource-parser": "^3.0.8"
|
|
130
130
|
},
|
|
131
131
|
"engines": {
|
|
132
132
|
"node": ">=18"
|
|
@@ -6256,9 +6256,9 @@
|
|
|
6256
6256
|
]
|
|
6257
6257
|
},
|
|
6258
6258
|
"node_modules/@vercel/oidc": {
|
|
6259
|
-
"version": "3.
|
|
6260
|
-
"resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.
|
|
6261
|
-
"integrity": "sha512-
|
|
6259
|
+
"version": "3.2.0",
|
|
6260
|
+
"resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz",
|
|
6261
|
+
"integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==",
|
|
6262
6262
|
"license": "Apache-2.0",
|
|
6263
6263
|
"engines": {
|
|
6264
6264
|
"node": ">= 20"
|
|
@@ -6478,14 +6478,14 @@
|
|
|
6478
6478
|
}
|
|
6479
6479
|
},
|
|
6480
6480
|
"node_modules/ai": {
|
|
6481
|
-
"version": "6.0.
|
|
6482
|
-
"resolved": "https://registry.npmjs.org/ai/-/ai-6.0.
|
|
6483
|
-
"integrity": "sha512-
|
|
6481
|
+
"version": "6.0.174",
|
|
6482
|
+
"resolved": "https://registry.npmjs.org/ai/-/ai-6.0.174.tgz",
|
|
6483
|
+
"integrity": "sha512-bTrfLUWHWtkjzWyCY4bmyuk4Qvmj4S4NSNsXyNSVVqkmftQNtxRj7dzUoMeQDBBwlJO6fC7m2Q/lNOPqQQfAGA==",
|
|
6484
6484
|
"license": "Apache-2.0",
|
|
6485
6485
|
"dependencies": {
|
|
6486
|
-
"@ai-sdk/gateway": "3.0.
|
|
6487
|
-
"@ai-sdk/provider": "3.0.
|
|
6488
|
-
"@ai-sdk/provider-utils": "4.0.
|
|
6486
|
+
"@ai-sdk/gateway": "3.0.109",
|
|
6487
|
+
"@ai-sdk/provider": "3.0.10",
|
|
6488
|
+
"@ai-sdk/provider-utils": "4.0.26",
|
|
6489
6489
|
"@opentelemetry/api": "1.9.0"
|
|
6490
6490
|
},
|
|
6491
6491
|
"engines": {
|
|
@@ -8948,9 +8948,9 @@
|
|
|
8948
8948
|
}
|
|
8949
8949
|
},
|
|
8950
8950
|
"node_modules/eventsource-parser": {
|
|
8951
|
-
"version": "3.0.
|
|
8952
|
-
"resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.
|
|
8953
|
-
"integrity": "sha512-
|
|
8951
|
+
"version": "3.0.8",
|
|
8952
|
+
"resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.8.tgz",
|
|
8953
|
+
"integrity": "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==",
|
|
8954
8954
|
"license": "MIT",
|
|
8955
8955
|
"engines": {
|
|
8956
8956
|
"node": ">=18.0.0"
|
|
@@ -78,7 +78,7 @@ function HomeContent() {
|
|
|
78
78
|
try {
|
|
79
79
|
const session = await createSession({
|
|
80
80
|
name: `Session ${sessions.length + 1}`,
|
|
81
|
-
model: config.defaultModel || 'anthropic/claude-opus-4
|
|
81
|
+
model: config.defaultModel || 'anthropic/claude-opus-4.7',
|
|
82
82
|
toolApprovals: config.defaultToolApprovals || {},
|
|
83
83
|
});
|
|
84
84
|
mutateSessions();
|
|
@@ -130,7 +130,7 @@ function HomeContent() {
|
|
|
130
130
|
try {
|
|
131
131
|
const session = await createSession({
|
|
132
132
|
name: `Session ${sessions.length + 1}`,
|
|
133
|
-
model: config?.defaultModel || 'anthropic/claude-opus-4
|
|
133
|
+
model: config?.defaultModel || 'anthropic/claude-opus-4.7',
|
|
134
134
|
toolApprovals: config?.defaultToolApprovals || {},
|
|
135
135
|
});
|
|
136
136
|
mutateSessions();
|
|
@@ -11,6 +11,7 @@ import * as path from 'path';
|
|
|
11
11
|
|
|
12
12
|
// Available models for the UI
|
|
13
13
|
const AVAILABLE_MODELS = [
|
|
14
|
+
{ id: 'anthropic/claude-opus-4.7', name: 'Claude Opus 4.7', provider: 'Anthropic' },
|
|
14
15
|
{ id: 'anthropic/claude-opus-4-6', name: 'Claude Opus 4.6', provider: 'Anthropic' },
|
|
15
16
|
{ id: 'anthropic/claude-opus-4-5', name: 'Claude Opus 4.5', provider: 'Anthropic' },
|
|
16
17
|
{ id: 'anthropic/claude-sonnet-4', name: 'Claude Sonnet 4', provider: 'Anthropic' },
|
|
@@ -87,7 +88,7 @@ export async function GET() {
|
|
|
87
88
|
return NextResponse.json({
|
|
88
89
|
availableModels: AVAILABLE_MODELS,
|
|
89
90
|
availableTools: AVAILABLE_TOOLS,
|
|
90
|
-
defaultModel: healthData.config?.defaultModel || 'anthropic/claude-opus-4
|
|
91
|
+
defaultModel: healthData.config?.defaultModel || 'anthropic/claude-opus-4.7',
|
|
91
92
|
defaultToolApprovals: healthData.config?.defaultToolApprovals || {},
|
|
92
93
|
serverConnected: true,
|
|
93
94
|
apiKeyConfigured: healthData.apiKeyConfigured ?? false,
|
|
@@ -97,7 +98,7 @@ export async function GET() {
|
|
|
97
98
|
return NextResponse.json({
|
|
98
99
|
availableModels: AVAILABLE_MODELS,
|
|
99
100
|
availableTools: AVAILABLE_TOOLS,
|
|
100
|
-
defaultModel: 'anthropic/claude-opus-4
|
|
101
|
+
defaultModel: 'anthropic/claude-opus-4.7',
|
|
101
102
|
defaultToolApprovals: {},
|
|
102
103
|
serverConnected: false,
|
|
103
104
|
apiKeyConfigured: false,
|
|
@@ -3,10 +3,19 @@
|
|
|
3
3
|
import { use, useEffect, useState } from 'react';
|
|
4
4
|
import { ChatInterface } from '@/components/chat-interface';
|
|
5
5
|
import { getSession, type Session } from '@/lib/api';
|
|
6
|
+
import { installEmbedTokenBootstrap } from '@/lib/embed-bootstrap';
|
|
6
7
|
import { Loader2 } from 'lucide-react';
|
|
7
8
|
import { SidebarProvider, SidebarInset } from '@/components/ui/sidebar';
|
|
8
9
|
import { SessionsSidebar } from '@/components/sessions-sidebar';
|
|
9
10
|
|
|
11
|
+
// Lift `?token=` into sessionStorage and patch window.fetch BEFORE the
|
|
12
|
+
// component renders. Doing it inside `useEffect` would race the first
|
|
13
|
+
// `getSession` call below (which fires inside its own effect) on Strict
|
|
14
|
+
// Mode double-renders.
|
|
15
|
+
if (typeof window !== 'undefined') {
|
|
16
|
+
installEmbedTokenBootstrap();
|
|
17
|
+
}
|
|
18
|
+
|
|
10
19
|
export default function EmbedSessionPage({
|
|
11
20
|
params,
|
|
12
21
|
}: {
|
|
@@ -18,6 +27,9 @@ export default function EmbedSessionPage({
|
|
|
18
27
|
const [error, setError] = useState<string | null>(null);
|
|
19
28
|
|
|
20
29
|
useEffect(() => {
|
|
30
|
+
// Re-run on every mount in case the dashboard re-minted the token
|
|
31
|
+
// and navigated us to a fresh URL.
|
|
32
|
+
installEmbedTokenBootstrap();
|
|
21
33
|
async function loadSession() {
|
|
22
34
|
try {
|
|
23
35
|
const data = await getSession(id);
|
|
@@ -191,7 +191,7 @@ export function SessionsSidebar() {
|
|
|
191
191
|
try {
|
|
192
192
|
const session = await createSession({
|
|
193
193
|
name: `Session ${sessions.length + 1}`,
|
|
194
|
-
model: config?.defaultModel || 'anthropic/claude-opus-4
|
|
194
|
+
model: config?.defaultModel || 'anthropic/claude-opus-4.7',
|
|
195
195
|
toolApprovals, // Use current tool approval settings from global config
|
|
196
196
|
});
|
|
197
197
|
mutateSessions(); // Refresh the sessions list
|
|
@@ -98,6 +98,7 @@ export interface AppConfig {
|
|
|
98
98
|
|
|
99
99
|
const DEFAULT_CONFIG: AppConfig = {
|
|
100
100
|
availableModels: [
|
|
101
|
+
{ id: 'anthropic/claude-opus-4.7', name: 'Claude Opus 4.7', provider: 'Anthropic' },
|
|
101
102
|
{ id: 'anthropic/claude-opus-4-6', name: 'Claude Opus 4.6', provider: 'Anthropic' },
|
|
102
103
|
{ id: 'anthropic/claude-opus-4-5', name: 'Claude Opus 4.5', provider: 'Anthropic' },
|
|
103
104
|
{ id: 'anthropic/claude-sonnet-4', name: 'Claude Sonnet 4', provider: 'Anthropic' },
|
|
@@ -111,7 +112,7 @@ const DEFAULT_CONFIG: AppConfig = {
|
|
|
111
112
|
{ id: 'write_file', name: 'Write File', description: 'Create or edit files', dangerous: true },
|
|
112
113
|
{ id: 'read_file', name: 'Read File', description: 'Read file contents', dangerous: false },
|
|
113
114
|
],
|
|
114
|
-
defaultModel: 'anthropic/claude-opus-4
|
|
115
|
+
defaultModel: 'anthropic/claude-opus-4.7',
|
|
115
116
|
defaultToolApprovals: {},
|
|
116
117
|
serverConnected: false,
|
|
117
118
|
apiKeyConfigured: false,
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embed-token bootstrap for the SparkECoder web UI when iframed from the
|
|
3
|
+
* personal-agents dashboard.
|
|
4
|
+
*
|
|
5
|
+
* The dashboard (which holds the Ed25519 signing key) mints a short-lived
|
|
6
|
+
* token bound to the session id and passes it as `?token=` in the embed
|
|
7
|
+
* URL: `http://device:6969/embed/<sid>?token=<...>`.
|
|
8
|
+
*
|
|
9
|
+
* This module:
|
|
10
|
+
* 1. On first load (sync, before React renders) lifts `?token=` from
|
|
11
|
+
* `window.location.search` into sessionStorage (per-tab, so it
|
|
12
|
+
* doesn't leak across user accounts on the same device) and strips
|
|
13
|
+
* it from the URL bar so it doesn't end up in screenshots / logs.
|
|
14
|
+
* 2. Monkey-patches `window.fetch` ONCE so every call to the
|
|
15
|
+
* configured API base (`http://device:3141`) carries an
|
|
16
|
+
* `X-Embed-Token` header.
|
|
17
|
+
*
|
|
18
|
+
* The device's signature middleware accepts the header for read-only
|
|
19
|
+
* (GET/HEAD) requests whose path references the bound session id.
|
|
20
|
+
*
|
|
21
|
+
* No-op outside the browser. No-op when there's no token (so the standalone
|
|
22
|
+
* SparkECoder UI keeps working unmodified).
|
|
23
|
+
*/
|
|
24
|
+
import { getApiUrl } from './config';
|
|
25
|
+
|
|
26
|
+
const TOKEN_KEY = 'sparkecoder_embed_token';
|
|
27
|
+
let installed = false;
|
|
28
|
+
|
|
29
|
+
function readTokenFromUrl(): string | null {
|
|
30
|
+
if (typeof window === 'undefined') return null;
|
|
31
|
+
try {
|
|
32
|
+
const params = new URLSearchParams(window.location.search);
|
|
33
|
+
const tok = params.get('token');
|
|
34
|
+
if (!tok) return null;
|
|
35
|
+
// Strip from URL so it doesn't sit in the address bar / browser
|
|
36
|
+
// history. We keep any other query params untouched.
|
|
37
|
+
params.delete('token');
|
|
38
|
+
const rest = params.toString();
|
|
39
|
+
const newUrl = rest
|
|
40
|
+
? `${window.location.pathname}?${rest}${window.location.hash}`
|
|
41
|
+
: `${window.location.pathname}${window.location.hash}`;
|
|
42
|
+
window.history.replaceState({}, '', newUrl);
|
|
43
|
+
return tok;
|
|
44
|
+
} catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function getStoredToken(): string | null {
|
|
50
|
+
if (typeof window === 'undefined') return null;
|
|
51
|
+
try {
|
|
52
|
+
return window.sessionStorage.getItem(TOKEN_KEY);
|
|
53
|
+
} catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function storeToken(token: string): void {
|
|
59
|
+
if (typeof window === 'undefined') return;
|
|
60
|
+
try {
|
|
61
|
+
window.sessionStorage.setItem(TOKEN_KEY, token);
|
|
62
|
+
} catch {
|
|
63
|
+
/* sessionStorage unavailable (e.g. cross-origin iframe sandbox) */
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Idempotently install the fetch patch and lift the URL token. Safe to
|
|
69
|
+
* call multiple times.
|
|
70
|
+
*/
|
|
71
|
+
export function installEmbedTokenBootstrap(): void {
|
|
72
|
+
if (typeof window === 'undefined') return;
|
|
73
|
+
// Always re-check the URL — navigations within the embed may carry a
|
|
74
|
+
// refreshed token (the dashboard re-mints when polling /events).
|
|
75
|
+
const fromUrl = readTokenFromUrl();
|
|
76
|
+
if (fromUrl) storeToken(fromUrl);
|
|
77
|
+
|
|
78
|
+
if (installed) return;
|
|
79
|
+
installed = true;
|
|
80
|
+
|
|
81
|
+
const originalFetch = window.fetch.bind(window);
|
|
82
|
+
// Resolve the API base ONCE here; config.getApiUrl() reads localStorage
|
|
83
|
+
// synchronously and won't change inside an embed page.
|
|
84
|
+
const apiBase = getApiUrl();
|
|
85
|
+
|
|
86
|
+
window.fetch = async function patchedFetch(
|
|
87
|
+
input: RequestInfo | URL,
|
|
88
|
+
init?: RequestInit,
|
|
89
|
+
): Promise<Response> {
|
|
90
|
+
const token = getStoredToken();
|
|
91
|
+
if (!token) return originalFetch(input, init);
|
|
92
|
+
|
|
93
|
+
// Only attach the header to requests targeting the API base. We
|
|
94
|
+
// don't want to leak the token to third parties or to the same-
|
|
95
|
+
// origin assets the embed loads.
|
|
96
|
+
const url =
|
|
97
|
+
typeof input === 'string'
|
|
98
|
+
? input
|
|
99
|
+
: input instanceof URL
|
|
100
|
+
? input.toString()
|
|
101
|
+
: input.url;
|
|
102
|
+
if (!url.startsWith(apiBase)) return originalFetch(input, init);
|
|
103
|
+
|
|
104
|
+
const headers = new Headers(init?.headers ?? (input as Request).headers);
|
|
105
|
+
if (!headers.has('x-embed-token')) headers.set('x-embed-token', token);
|
|
106
|
+
return originalFetch(input, { ...init, headers });
|
|
107
|
+
};
|
|
108
|
+
}
|