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.
Files changed (146) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/index.d.ts +3 -3
  3. package/dist/agent/index.js +809 -97
  4. package/dist/agent/index.js.map +1 -1
  5. package/dist/cli.js +2395 -316
  6. package/dist/cli.js.map +1 -1
  7. package/dist/db/index.d.ts +2 -2
  8. package/dist/{index-OhuTM4a0.d.ts → index-Bn0Zox8f.d.ts} +32 -23
  9. package/dist/index.d.ts +5 -5
  10. package/dist/index.js +1932 -273
  11. package/dist/index.js.map +1 -1
  12. package/dist/{schema-CohdIL13.d.ts → schema-EmpbnQeQ.d.ts} +3 -3
  13. package/dist/{search-CCffrVJE.d.ts → search-BRnGaIl-.d.ts} +7 -7
  14. package/dist/server/index.js +1932 -273
  15. package/dist/server/index.js.map +1 -1
  16. package/dist/skills/default/computer-use.md +150 -0
  17. package/dist/tools/index.d.ts +196 -3
  18. package/dist/tools/index.js +639 -11
  19. package/dist/tools/index.js.map +1 -1
  20. package/package.json +6 -5
  21. package/src/skills/default/computer-use.md +150 -0
  22. package/web/.next/BUILD_ID +1 -1
  23. package/web/.next/standalone/web/.next/BUILD_ID +1 -1
  24. package/web/.next/standalone/web/.next/build-manifest.json +2 -2
  25. package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
  26. package/web/.next/standalone/web/.next/server/app/(main)/page_client-reference-manifest.js +1 -1
  27. package/web/.next/standalone/web/.next/server/app/(main)/session/[id]/page_client-reference-manifest.js +1 -1
  28. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
  29. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
  30. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  31. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  32. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  33. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  34. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  35. package/web/.next/standalone/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  36. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
  37. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +2 -2
  38. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  39. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  40. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  41. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  42. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  43. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  44. package/web/.next/standalone/web/.next/server/app/api/config/route.js.nft.json +1 -1
  45. package/web/.next/standalone/web/.next/server/app/api/health/route.js.nft.json +1 -1
  46. package/web/.next/standalone/web/.next/server/app/docs/installation/page_client-reference-manifest.js +1 -1
  47. package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
  48. package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +3 -3
  49. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +3 -3
  50. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
  51. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +2 -2
  52. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +1 -1
  53. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +2 -2
  54. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
  55. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +2 -2
  56. package/web/.next/standalone/web/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  57. package/web/.next/standalone/web/.next/server/app/docs/skills/page_client-reference-manifest.js +1 -1
  58. package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
  59. package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +3 -3
  60. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +3 -3
  61. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
  62. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +2 -2
  63. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +1 -1
  64. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
  65. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
  66. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +2 -2
  67. package/web/.next/standalone/web/.next/server/app/docs/tools/page_client-reference-manifest.js +1 -1
  68. package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
  69. package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +3 -3
  70. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +3 -3
  71. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
  72. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +2 -2
  73. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +1 -1
  74. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +2 -2
  75. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
  76. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +2 -2
  77. package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
  78. package/web/.next/standalone/web/.next/server/app/docs.rsc +3 -3
  79. package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +3 -3
  80. package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  81. package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +2 -2
  82. package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
  83. package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +2 -2
  84. package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +2 -2
  85. package/web/.next/standalone/web/.next/server/app/embed/[id]/page.js.nft.json +1 -1
  86. package/web/.next/standalone/web/.next/server/app/embed/[id]/page_client-reference-manifest.js +1 -1
  87. package/web/.next/standalone/web/.next/server/app/index.html +1 -1
  88. package/web/.next/standalone/web/.next/server/app/index.rsc +4 -4
  89. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +2 -2
  90. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +2 -2
  91. package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +4 -4
  92. package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  93. package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +2 -2
  94. package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  95. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__36edac7c._.js +1 -1
  96. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_ecd2bdca._.js → 2374f_317b1fef._.js} +1 -1
  97. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_9adc1edb._.js → 2374f_37dd9702._.js} +1 -1
  98. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_8dc0f9aa._.js → 2374f_4d44e4ed._.js} +1 -1
  99. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_cc6c6363._.js → 2374f_54ac917f._.js} +1 -1
  100. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_00f7fe07._.js → 2374f_86585101._.js} +1 -1
  101. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_369747ce._.js → 2374f_a383a4d9._.js} +1 -1
  102. package/web/.next/standalone/web/.next/server/chunks/ssr/{2374f_d58d0276._.js → 2374f_c59a35bb._.js} +1 -1
  103. package/web/.next/standalone/web/.next/server/chunks/ssr/{[root-of-the-server]__25b25c9d._.js → [root-of-the-server]__9a826344._.js} +2 -2
  104. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__be5e2967._.js +1 -1
  105. package/web/.next/standalone/web/.next/server/chunks/ssr/web_src_app_(main)_page_tsx_5ac4794b._.js +1 -1
  106. package/web/.next/standalone/web/.next/server/chunks/ssr/web_src_components_sessions-sidebar_tsx_92510070._.js +1 -1
  107. package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
  108. package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
  109. package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
  110. package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
  111. package/web/.next/standalone/web/.next/static/chunks/275e8268daf318b2.js +7 -0
  112. package/web/.next/standalone/web/.next/static/{static/chunks/26eb5fab5216f3cc.js → chunks/58fd0aaa2746b444.js} +1 -1
  113. package/web/.next/standalone/web/.next/static/chunks/9fce2ce79c4c834e.js +1 -0
  114. package/web/.next/{static/chunks/8d3efc76109d2efc.js → standalone/web/.next/static/chunks/a888d448ceab1abe.js} +1 -1
  115. package/web/.next/standalone/web/.next/static/static/chunks/275e8268daf318b2.js +7 -0
  116. package/web/.next/{static/chunks/26eb5fab5216f3cc.js → standalone/web/.next/static/static/chunks/58fd0aaa2746b444.js} +1 -1
  117. package/web/.next/standalone/web/.next/static/static/chunks/9fce2ce79c4c834e.js +1 -0
  118. package/web/.next/standalone/web/.next/static/{chunks/8d3efc76109d2efc.js → static/chunks/a888d448ceab1abe.js} +1 -1
  119. package/web/.next/standalone/web/package-lock.json +27 -27
  120. package/web/.next/standalone/web/package.json +1 -1
  121. package/web/.next/standalone/web/src/app/(main)/page.tsx +2 -2
  122. package/web/.next/standalone/web/src/app/api/config/route.ts +3 -2
  123. package/web/.next/standalone/web/src/app/embed/[id]/page.tsx +12 -0
  124. package/web/.next/standalone/web/src/components/sessions-sidebar.tsx +1 -1
  125. package/web/.next/standalone/web/src/lib/config.ts +2 -1
  126. package/web/.next/standalone/web/src/lib/embed-bootstrap.ts +108 -0
  127. package/web/.next/static/chunks/275e8268daf318b2.js +7 -0
  128. package/web/.next/{standalone/web/.next/static/chunks/26eb5fab5216f3cc.js → static/chunks/58fd0aaa2746b444.js} +1 -1
  129. package/web/.next/static/chunks/9fce2ce79c4c834e.js +1 -0
  130. package/web/.next/{standalone/web/.next/static/static/chunks/8d3efc76109d2efc.js → static/chunks/a888d448ceab1abe.js} +1 -1
  131. package/web/package.json +1 -1
  132. package/web/.next/standalone/web/.next/static/chunks/5383c5717758f575.js +0 -7
  133. package/web/.next/standalone/web/.next/static/chunks/b31b0765abe0c427.js +0 -1
  134. package/web/.next/standalone/web/.next/static/static/chunks/5383c5717758f575.js +0 -7
  135. package/web/.next/standalone/web/.next/static/static/chunks/b31b0765abe0c427.js +0 -1
  136. package/web/.next/static/chunks/5383c5717758f575.js +0 -7
  137. package/web/.next/static/chunks/b31b0765abe0c427.js +0 -1
  138. /package/web/.next/standalone/web/.next/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_buildManifest.js +0 -0
  139. /package/web/.next/standalone/web/.next/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_clientMiddlewareManifest.json +0 -0
  140. /package/web/.next/standalone/web/.next/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_ssgManifest.js +0 -0
  141. /package/web/.next/standalone/web/.next/static/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_buildManifest.js +0 -0
  142. /package/web/.next/standalone/web/.next/static/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_clientMiddlewareManifest.json +0 -0
  143. /package/web/.next/standalone/web/.next/static/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_ssgManifest.js +0 -0
  144. /package/web/.next/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_buildManifest.js +0 -0
  145. /package/web/.next/static/{Pt6kwIO6lniM7h7I5E6kk → -ax3tJNqBGukss29jpu41}/_clientMiddlewareManifest.json +0 -0
  146. /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.49",
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.22",
94
- "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.22.tgz",
95
- "integrity": "sha512-NgnlY73JNuooACHqUIz5uMOEWvqR1MMVbb2soGLMozLY1fgwEIF5iJFDAGa5/YArlzw2ATVU7zQu7HkR/FUjgA==",
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.5",
99
- "@ai-sdk/provider-utils": "4.0.9",
100
- "@vercel/oidc": "3.1.0"
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.5",
111
- "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.5.tgz",
112
- "integrity": "sha512-2Xmoq6DBJqmSl80U6V9z5jJSJP7ehaJJQMy2iFUqTay06wdCqTnPVBBQbtEL8RCChenL+q5DC5H5WzU3vV3v8w==",
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.9",
123
- "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.9.tgz",
124
- "integrity": "sha512-bB4r6nfhBOpmoS9mePxjRoCy+LnzP3AfhyMGCkGL4Mn9clVNlqEeKj26zEKEtB6yoSVcT1IQ0Zh9fytwMCDnow==",
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.5",
127
+ "@ai-sdk/provider": "3.0.10",
128
128
  "@standard-schema/spec": "^1.1.0",
129
- "eventsource-parser": "^3.0.6"
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.1.0",
6260
- "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.1.0.tgz",
6261
- "integrity": "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==",
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.49",
6482
- "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.49.tgz",
6483
- "integrity": "sha512-LABniBX/0R6Tv+iUK5keUZhZLaZUe4YjP5M2rZ4wAdZ8iKV3EfTAoJxuL1aaWTSJKIilKa9QUEkCgnp89/32bw==",
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.22",
6487
- "@ai-sdk/provider": "3.0.5",
6488
- "@ai-sdk/provider-utils": "4.0.9",
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.6",
8952
- "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz",
8953
- "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==",
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"
@@ -42,7 +42,7 @@
42
42
  "@visual-json/core": "^0.1.1",
43
43
  "@visual-json/react": "^0.1.1",
44
44
  "@xyflow/react": "^12.10.0",
45
- "ai": "^6.0.49",
45
+ "ai": "^6.0.168",
46
46
  "ansi-to-react": "^6.2.6",
47
47
  "class-variance-authority": "^0.7.1",
48
48
  "clsx": "^2.1.1",
@@ -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-6',
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-6',
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-6',
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-6',
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-6',
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-6',
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
+ }