sparkecoder 0.1.131 → 0.1.132

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 (120) hide show
  1. package/dist/cli.js +348 -92
  2. package/dist/cli.js.map +1 -1
  3. package/dist/index.js +292 -36
  4. package/dist/index.js.map +1 -1
  5. package/dist/server/index.js +292 -36
  6. package/dist/server/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/web/.next/BUILD_ID +1 -1
  9. package/web/.next/standalone/web/.next/BUILD_ID +1 -1
  10. package/web/.next/standalone/web/.next/build-manifest.json +2 -2
  11. package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
  12. package/web/.next/standalone/web/.next/server/app/(main)/agents/page_client-reference-manifest.js +1 -1
  13. package/web/.next/standalone/web/.next/server/app/(main)/page_client-reference-manifest.js +1 -1
  14. package/web/.next/standalone/web/.next/server/app/(main)/session/[id]/page_client-reference-manifest.js +1 -1
  15. package/web/.next/standalone/web/.next/server/app/(main)/settings/page_client-reference-manifest.js +1 -1
  16. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
  17. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
  18. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  19. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  20. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  21. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  22. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  23. package/web/.next/standalone/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
  25. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +2 -2
  26. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  27. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  28. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  29. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  30. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  31. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  32. package/web/.next/standalone/web/.next/server/app/agents.html +1 -1
  33. package/web/.next/standalone/web/.next/server/app/agents.rsc +4 -4
  34. package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p/agents/__PAGE__.segment.rsc +2 -2
  35. package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p/agents.segment.rsc +1 -1
  36. package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p.segment.rsc +2 -2
  37. package/web/.next/standalone/web/.next/server/app/agents.segments/_full.segment.rsc +4 -4
  38. package/web/.next/standalone/web/.next/server/app/agents.segments/_head.segment.rsc +1 -1
  39. package/web/.next/standalone/web/.next/server/app/agents.segments/_index.segment.rsc +2 -2
  40. package/web/.next/standalone/web/.next/server/app/agents.segments/_tree.segment.rsc +1 -1
  41. package/web/.next/standalone/web/.next/server/app/api/config/route.js.nft.json +1 -1
  42. package/web/.next/standalone/web/.next/server/app/api/health/route.js.nft.json +1 -1
  43. package/web/.next/standalone/web/.next/server/app/docs/installation/page_client-reference-manifest.js +1 -1
  44. package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
  45. package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +3 -3
  46. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +3 -3
  47. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
  48. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +2 -2
  49. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +1 -1
  50. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +2 -2
  51. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
  52. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +2 -2
  53. package/web/.next/standalone/web/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  54. package/web/.next/standalone/web/.next/server/app/docs/skills/page_client-reference-manifest.js +1 -1
  55. package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
  56. package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +3 -3
  57. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +3 -3
  58. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
  59. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +2 -2
  60. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +1 -1
  61. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
  62. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
  63. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +2 -2
  64. package/web/.next/standalone/web/.next/server/app/docs/tools/page_client-reference-manifest.js +1 -1
  65. package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
  66. package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +3 -3
  67. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +3 -3
  68. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
  69. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +2 -2
  70. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +1 -1
  71. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +2 -2
  72. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
  73. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +2 -2
  74. package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
  75. package/web/.next/standalone/web/.next/server/app/docs.rsc +3 -3
  76. package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +3 -3
  77. package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  78. package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +2 -2
  79. package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
  80. package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +2 -2
  81. package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +2 -2
  82. package/web/.next/standalone/web/.next/server/app/index.html +1 -1
  83. package/web/.next/standalone/web/.next/server/app/index.rsc +4 -4
  84. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +2 -2
  85. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +2 -2
  86. package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +4 -4
  87. package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  88. package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +2 -2
  89. package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  90. package/web/.next/standalone/web/.next/server/app/settings.html +1 -1
  91. package/web/.next/standalone/web/.next/server/app/settings.rsc +4 -4
  92. package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p/settings/__PAGE__.segment.rsc +2 -2
  93. package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p/settings.segment.rsc +1 -1
  94. package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p.segment.rsc +2 -2
  95. package/web/.next/standalone/web/.next/server/app/settings.segments/_full.segment.rsc +4 -4
  96. package/web/.next/standalone/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  97. package/web/.next/standalone/web/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  98. package/web/.next/standalone/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  99. package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
  100. package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
  101. package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
  102. package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
  103. package/web/.next/standalone/web/.next/static/chunks/185f69f6478ba713.js +1 -0
  104. package/web/.next/standalone/web/.next/static/static/chunks/185f69f6478ba713.js +1 -0
  105. package/web/.next/standalone/web/runtime-config.json +2 -1
  106. package/web/.next/standalone/web/src/app/__sfapi/[...path]/route.ts +96 -0
  107. package/web/.next/standalone/web/src/lib/config.ts +22 -7
  108. package/web/.next/static/chunks/185f69f6478ba713.js +1 -0
  109. package/web/.next/standalone/web/.next/static/chunks/5aece72c38f86fbd.js +0 -1
  110. package/web/.next/standalone/web/.next/static/static/chunks/5aece72c38f86fbd.js +0 -1
  111. package/web/.next/static/chunks/5aece72c38f86fbd.js +0 -1
  112. /package/web/.next/standalone/web/.next/static/{KQbunVSU5tNoYBl7TnhLn → WaAcu3X3K00MDvfn1ik7H}/_buildManifest.js +0 -0
  113. /package/web/.next/standalone/web/.next/static/{KQbunVSU5tNoYBl7TnhLn → WaAcu3X3K00MDvfn1ik7H}/_clientMiddlewareManifest.json +0 -0
  114. /package/web/.next/standalone/web/.next/static/{KQbunVSU5tNoYBl7TnhLn → WaAcu3X3K00MDvfn1ik7H}/_ssgManifest.js +0 -0
  115. /package/web/.next/standalone/web/.next/static/static/{KQbunVSU5tNoYBl7TnhLn → WaAcu3X3K00MDvfn1ik7H}/_buildManifest.js +0 -0
  116. /package/web/.next/standalone/web/.next/static/static/{KQbunVSU5tNoYBl7TnhLn → WaAcu3X3K00MDvfn1ik7H}/_clientMiddlewareManifest.json +0 -0
  117. /package/web/.next/standalone/web/.next/static/static/{KQbunVSU5tNoYBl7TnhLn → WaAcu3X3K00MDvfn1ik7H}/_ssgManifest.js +0 -0
  118. /package/web/.next/static/{KQbunVSU5tNoYBl7TnhLn → WaAcu3X3K00MDvfn1ik7H}/_buildManifest.js +0 -0
  119. /package/web/.next/static/{KQbunVSU5tNoYBl7TnhLn → WaAcu3X3K00MDvfn1ik7H}/_clientMiddlewareManifest.json +0 -0
  120. /package/web/.next/static/{KQbunVSU5tNoYBl7TnhLn → WaAcu3X3K00MDvfn1ik7H}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- <!DOCTYPE html><!--KQbunVSU5tNoYBl7TnhLn--><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5"/><link rel="stylesheet" href="/_next/static/chunks/34d933785a17edf3.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/acb0fc66f5414af6.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/651e187cc15d66de.js"/><script src="/_next/static/chunks/735a2408c315b2f0.js" async=""></script><script src="/_next/static/chunks/186e0c1b3ff43c9c.js" async=""></script><script src="/_next/static/chunks/a14243261b055626.js" async=""></script><script src="/_next/static/chunks/862ced58ce21a270.js" async=""></script><script src="/_next/static/chunks/turbopack-2c0905c7bbebae3f.js" async=""></script><script src="/_next/static/chunks/5aece72c38f86fbd.js" async=""></script><script src="/_next/static/chunks/9b5512fb633ef95d.js" async=""></script><script src="/_next/static/chunks/0f1cf11540868e42.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><meta name="theme-color" media="(prefers-color-scheme: light)" content="#ffffff"/><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#0a0a0a"/><title>SparkeCoder - AI-Powered Coding Agent</title><meta name="description" content="SparkeCoder is your AI-powered coding assistant. Build, debug, and ship code faster with intelligent automation and natural language programming."/><meta name="author" content="SparkeCoder Team"/><link rel="manifest" href="/manifest.json"/><meta name="keywords" content="AI coding assistant,code automation,AI programming,developer tools,coding agent,SparkeCoder,AI pair programming"/><meta name="creator" content="SparkeCoder"/><meta name="publisher" content="SparkeCoder"/><meta name="robots" content="index, follow"/><meta name="googlebot" content="index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1"/><meta name="category" content="technology"/><meta name="format-detection" content="telephone=no"/><meta name="mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-title" content="SparkeCoder"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><meta property="og:title" content="SparkeCoder - AI-Powered Coding Agent"/><meta property="og:description" content="Build, debug, and ship code faster with intelligent AI automation and natural language programming."/><meta property="og:site_name" content="SparkeCoder"/><meta property="og:locale" content="en_US"/><meta property="og:image" content="http://localhost:3001/opengraph-image.png?opengraph-image.ce342317.png"/><meta property="og:image:width" content="512"/><meta property="og:image:height" content="512"/><meta property="og:image:type" content="image/png"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="SparkeCoder - AI-Powered Coding Agent"/><meta name="twitter:description" content="Build, debug, and ship code faster with intelligent AI automation and natural language programming."/><meta name="twitter:image" content="http://localhost:3001/twitter-image.png?twitter-image.ce342317.png"/><meta name="twitter:image:width" content="512"/><meta name="twitter:image:height" content="512"/><meta name="twitter:image:type" content="image/png"/><link rel="icon" href="/favicon.ico?favicon.e3cbed1b.ico" sizes="256x256" type="image/x-icon"/><link rel="icon" href="/icon.png?icon.fdefec0f.png" sizes="32x32" type="image/png"/><link rel="apple-touch-icon" href="/apple-icon.png?apple-icon.d6d14cbd.png" sizes="180x180" type="image/png"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/651e187cc15d66de.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[760800,[\"/_next/static/chunks/5aece72c38f86fbd.js\"],\"ApiInit\"]\n3:I[488287,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"default\"]\n4:I[174895,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"default\"]\n5:I[151858,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n8:I[151858,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"ViewportBoundary\"]\na:I[151858,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"MetadataBoundary\"]\nc:I[552576,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"default\"]\n:HL[\"/_next/static/chunks/34d933785a17edf3.css\",\"style\"]\n:HL[\"/_next/static/chunks/acb0fc66f5414af6.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"KQbunVSU5tNoYBl7TnhLn\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/34d933785a17edf3.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/acb0fc66f5414af6.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/5aece72c38f86fbd.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"children\":[\"$\",\"body\",null,{\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased\",\"children\":[[\"$\",\"$L2\",null,{}],[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=5\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"media\":\"(prefers-color-scheme: light)\",\"content\":\"#ffffff\"}],[\"$\",\"meta\",\"3\",{\"name\":\"theme-color\",\"media\":\"(prefers-color-scheme: dark)\",\"content\":\"#0a0a0a\"}]]\n"])</script><script>self.__next_f.push([1,"d:I[349310,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"IconMark\"]\n7:null\n"])</script><script>self.__next_f.push([1,"b:[[\"$\",\"title\",\"0\",{\"children\":\"SparkeCoder - AI-Powered Coding Agent\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"SparkeCoder is your AI-powered coding assistant. Build, debug, and ship code faster with intelligent automation and natural language programming.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"author\",\"content\":\"SparkeCoder Team\"}],[\"$\",\"link\",\"3\",{\"rel\":\"manifest\",\"href\":\"/manifest.json\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"meta\",\"4\",{\"name\":\"keywords\",\"content\":\"AI coding assistant,code automation,AI programming,developer tools,coding agent,SparkeCoder,AI pair programming\"}],[\"$\",\"meta\",\"5\",{\"name\":\"creator\",\"content\":\"SparkeCoder\"}],[\"$\",\"meta\",\"6\",{\"name\":\"publisher\",\"content\":\"SparkeCoder\"}],[\"$\",\"meta\",\"7\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"8\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"meta\",\"9\",{\"name\":\"category\",\"content\":\"technology\"}],[\"$\",\"meta\",\"10\",{\"name\":\"format-detection\",\"content\":\"telephone=no\"}],[\"$\",\"meta\",\"11\",{\"name\":\"mobile-web-app-capable\",\"content\":\"yes\"}],[\"$\",\"meta\",\"12\",{\"name\":\"apple-mobile-web-app-title\",\"content\":\"SparkeCoder\"}],[\"$\",\"meta\",\"13\",{\"name\":\"apple-mobile-web-app-status-bar-style\",\"content\":\"black-translucent\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:title\",\"content\":\"SparkeCoder - AI-Powered Coding Agent\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:description\",\"content\":\"Build, debug, and ship code faster with intelligent AI automation and natural language programming.\"}],[\"$\",\"meta\",\"16\",{\"property\":\"og:site_name\",\"content\":\"SparkeCoder\"}],[\"$\",\"meta\",\"17\",{\"property\":\"og:locale\",\"content\":\"en_US\"}],[\"$\",\"meta\",\"18\",{\"property\":\"og:image\",\"content\":\"http://localhost:3001/opengraph-image.png?opengraph-image.ce342317.png\"}],[\"$\",\"meta\",\"19\",{\"property\":\"og:image:width\",\"content\":\"512\"}],[\"$\",\"meta\",\"20\",{\"property\":\"og:image:height\",\"content\":\"512\"}],[\"$\",\"meta\",\"21\",{\"property\":\"og:image:type\",\"content\":\"image/png\"}],[\"$\",\"meta\",\"22\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"23\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"24\",{\"name\":\"twitter:title\",\"content\":\"SparkeCoder - AI-Powered Coding Agent\"}],[\"$\",\"meta\",\"25\",{\"name\":\"twitter:description\",\"content\":\"Build, debug, and ship code faster with intelligent AI automation and natural language programming.\"}],[\"$\",\"meta\",\"26\",{\"name\":\"twitter:image\",\"content\":\"http://localhost:3001/twitter-image.png?twitter-image.ce342317.png\"}],[\"$\",\"meta\",\"27\",{\"name\":\"twitter:image:width\",\"content\":\"512\"}],[\"$\",\"meta\",\"28\",{\"name\":\"twitter:image:height\",\"content\":\"512\"}],[\"$\",\"meta\",\"29\",{\"name\":\"twitter:image:type\",\"content\":\"image/png\"}],[\"$\",\"link\",\"30\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.e3cbed1b.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",\"31\",{\"rel\":\"icon\",\"href\":\"/icon.png?icon.fdefec0f.png\",\"sizes\":\"32x32\",\"type\":\"image/png\"}],[\"$\",\"link\",\"32\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-icon.png?apple-icon.d6d14cbd.png\",\"sizes\":\"180x180\",\"type\":\"image/png\"}],[\"$\",\"$Ld\",\"33\",{}]]\n"])</script></body></html>
1
+ <!DOCTYPE html><!--WaAcu3X3K00MDvfn1ik7H--><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5"/><link rel="stylesheet" href="/_next/static/chunks/34d933785a17edf3.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/acb0fc66f5414af6.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/651e187cc15d66de.js"/><script src="/_next/static/chunks/735a2408c315b2f0.js" async=""></script><script src="/_next/static/chunks/186e0c1b3ff43c9c.js" async=""></script><script src="/_next/static/chunks/a14243261b055626.js" async=""></script><script src="/_next/static/chunks/862ced58ce21a270.js" async=""></script><script src="/_next/static/chunks/turbopack-2c0905c7bbebae3f.js" async=""></script><script src="/_next/static/chunks/185f69f6478ba713.js" async=""></script><script src="/_next/static/chunks/9b5512fb633ef95d.js" async=""></script><script src="/_next/static/chunks/0f1cf11540868e42.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><meta name="theme-color" media="(prefers-color-scheme: light)" content="#ffffff"/><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#0a0a0a"/><title>SparkeCoder - AI-Powered Coding Agent</title><meta name="description" content="SparkeCoder is your AI-powered coding assistant. Build, debug, and ship code faster with intelligent automation and natural language programming."/><meta name="author" content="SparkeCoder Team"/><link rel="manifest" href="/manifest.json"/><meta name="keywords" content="AI coding assistant,code automation,AI programming,developer tools,coding agent,SparkeCoder,AI pair programming"/><meta name="creator" content="SparkeCoder"/><meta name="publisher" content="SparkeCoder"/><meta name="robots" content="index, follow"/><meta name="googlebot" content="index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1"/><meta name="category" content="technology"/><meta name="format-detection" content="telephone=no"/><meta name="mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-title" content="SparkeCoder"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><meta property="og:title" content="SparkeCoder - AI-Powered Coding Agent"/><meta property="og:description" content="Build, debug, and ship code faster with intelligent AI automation and natural language programming."/><meta property="og:site_name" content="SparkeCoder"/><meta property="og:locale" content="en_US"/><meta property="og:image" content="http://localhost:3001/opengraph-image.png?opengraph-image.ce342317.png"/><meta property="og:image:width" content="512"/><meta property="og:image:height" content="512"/><meta property="og:image:type" content="image/png"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="SparkeCoder - AI-Powered Coding Agent"/><meta name="twitter:description" content="Build, debug, and ship code faster with intelligent AI automation and natural language programming."/><meta name="twitter:image" content="http://localhost:3001/twitter-image.png?twitter-image.ce342317.png"/><meta name="twitter:image:width" content="512"/><meta name="twitter:image:height" content="512"/><meta name="twitter:image:type" content="image/png"/><link rel="icon" href="/favicon.ico?favicon.e3cbed1b.ico" sizes="256x256" type="image/x-icon"/><link rel="icon" href="/icon.png?icon.fdefec0f.png" sizes="32x32" type="image/png"/><link rel="apple-touch-icon" href="/apple-icon.png?apple-icon.d6d14cbd.png" sizes="180x180" type="image/png"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/651e187cc15d66de.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[760800,[\"/_next/static/chunks/185f69f6478ba713.js\"],\"ApiInit\"]\n3:I[488287,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"default\"]\n4:I[174895,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"default\"]\n5:I[151858,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n8:I[151858,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"ViewportBoundary\"]\na:I[151858,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"MetadataBoundary\"]\nc:I[552576,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"default\"]\n:HL[\"/_next/static/chunks/34d933785a17edf3.css\",\"style\"]\n:HL[\"/_next/static/chunks/acb0fc66f5414af6.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"WaAcu3X3K00MDvfn1ik7H\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/34d933785a17edf3.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/acb0fc66f5414af6.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/185f69f6478ba713.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"children\":[\"$\",\"body\",null,{\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased\",\"children\":[[\"$\",\"$L2\",null,{}],[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=5\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"media\":\"(prefers-color-scheme: light)\",\"content\":\"#ffffff\"}],[\"$\",\"meta\",\"3\",{\"name\":\"theme-color\",\"media\":\"(prefers-color-scheme: dark)\",\"content\":\"#0a0a0a\"}]]\n"])</script><script>self.__next_f.push([1,"d:I[349310,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"IconMark\"]\n7:null\n"])</script><script>self.__next_f.push([1,"b:[[\"$\",\"title\",\"0\",{\"children\":\"SparkeCoder - AI-Powered Coding Agent\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"SparkeCoder is your AI-powered coding assistant. Build, debug, and ship code faster with intelligent automation and natural language programming.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"author\",\"content\":\"SparkeCoder Team\"}],[\"$\",\"link\",\"3\",{\"rel\":\"manifest\",\"href\":\"/manifest.json\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"meta\",\"4\",{\"name\":\"keywords\",\"content\":\"AI coding assistant,code automation,AI programming,developer tools,coding agent,SparkeCoder,AI pair programming\"}],[\"$\",\"meta\",\"5\",{\"name\":\"creator\",\"content\":\"SparkeCoder\"}],[\"$\",\"meta\",\"6\",{\"name\":\"publisher\",\"content\":\"SparkeCoder\"}],[\"$\",\"meta\",\"7\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"8\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"meta\",\"9\",{\"name\":\"category\",\"content\":\"technology\"}],[\"$\",\"meta\",\"10\",{\"name\":\"format-detection\",\"content\":\"telephone=no\"}],[\"$\",\"meta\",\"11\",{\"name\":\"mobile-web-app-capable\",\"content\":\"yes\"}],[\"$\",\"meta\",\"12\",{\"name\":\"apple-mobile-web-app-title\",\"content\":\"SparkeCoder\"}],[\"$\",\"meta\",\"13\",{\"name\":\"apple-mobile-web-app-status-bar-style\",\"content\":\"black-translucent\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:title\",\"content\":\"SparkeCoder - AI-Powered Coding Agent\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:description\",\"content\":\"Build, debug, and ship code faster with intelligent AI automation and natural language programming.\"}],[\"$\",\"meta\",\"16\",{\"property\":\"og:site_name\",\"content\":\"SparkeCoder\"}],[\"$\",\"meta\",\"17\",{\"property\":\"og:locale\",\"content\":\"en_US\"}],[\"$\",\"meta\",\"18\",{\"property\":\"og:image\",\"content\":\"http://localhost:3001/opengraph-image.png?opengraph-image.ce342317.png\"}],[\"$\",\"meta\",\"19\",{\"property\":\"og:image:width\",\"content\":\"512\"}],[\"$\",\"meta\",\"20\",{\"property\":\"og:image:height\",\"content\":\"512\"}],[\"$\",\"meta\",\"21\",{\"property\":\"og:image:type\",\"content\":\"image/png\"}],[\"$\",\"meta\",\"22\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"23\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"24\",{\"name\":\"twitter:title\",\"content\":\"SparkeCoder - AI-Powered Coding Agent\"}],[\"$\",\"meta\",\"25\",{\"name\":\"twitter:description\",\"content\":\"Build, debug, and ship code faster with intelligent AI automation and natural language programming.\"}],[\"$\",\"meta\",\"26\",{\"name\":\"twitter:image\",\"content\":\"http://localhost:3001/twitter-image.png?twitter-image.ce342317.png\"}],[\"$\",\"meta\",\"27\",{\"name\":\"twitter:image:width\",\"content\":\"512\"}],[\"$\",\"meta\",\"28\",{\"name\":\"twitter:image:height\",\"content\":\"512\"}],[\"$\",\"meta\",\"29\",{\"name\":\"twitter:image:type\",\"content\":\"image/png\"}],[\"$\",\"link\",\"30\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.e3cbed1b.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",\"31\",{\"rel\":\"icon\",\"href\":\"/icon.png?icon.fdefec0f.png\",\"sizes\":\"32x32\",\"type\":\"image/png\"}],[\"$\",\"link\",\"32\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-icon.png?apple-icon.d6d14cbd.png\",\"sizes\":\"180x180\",\"type\":\"image/png\"}],[\"$\",\"$Ld\",\"33\",{}]]\n"])</script></body></html>
@@ -1,2 +1,2 @@
1
- <!DOCTYPE html><!--KQbunVSU5tNoYBl7TnhLn--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/651e187cc15d66de.js"/><script src="/_next/static/chunks/735a2408c315b2f0.js" async=""></script><script src="/_next/static/chunks/186e0c1b3ff43c9c.js" async=""></script><script src="/_next/static/chunks/a14243261b055626.js" async=""></script><script src="/_next/static/chunks/862ced58ce21a270.js" async=""></script><script src="/_next/static/chunks/turbopack-2c0905c7bbebae3f.js" async=""></script><script src="/_next/static/chunks/9b5512fb633ef95d.js" async=""></script><script src="/_next/static/chunks/0f1cf11540868e42.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><link rel="icon" href="/favicon.ico?favicon.e3cbed1b.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
- @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/651e187cc15d66de.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[488287,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"default\"]\n3:I[174895,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"default\"]\n4:I[151858,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[151858,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"ViewportBoundary\"]\n9:I[151858,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"MetadataBoundary\"]\nb:I[552576,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"KQbunVSU5tNoYBl7TnhLn\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"c:I[349310,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"IconMark\"]\n6:null\na:[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.e3cbed1b.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Lc\",\"1\",{}]]\n"])</script></body></html>
1
+ <!DOCTYPE html><!--WaAcu3X3K00MDvfn1ik7H--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/651e187cc15d66de.js"/><script src="/_next/static/chunks/735a2408c315b2f0.js" async=""></script><script src="/_next/static/chunks/186e0c1b3ff43c9c.js" async=""></script><script src="/_next/static/chunks/a14243261b055626.js" async=""></script><script src="/_next/static/chunks/862ced58ce21a270.js" async=""></script><script src="/_next/static/chunks/turbopack-2c0905c7bbebae3f.js" async=""></script><script src="/_next/static/chunks/9b5512fb633ef95d.js" async=""></script><script src="/_next/static/chunks/0f1cf11540868e42.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><link rel="icon" href="/favicon.ico?favicon.e3cbed1b.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
+ @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/651e187cc15d66de.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[488287,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"default\"]\n3:I[174895,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"default\"]\n4:I[151858,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[151858,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"ViewportBoundary\"]\n9:I[151858,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"MetadataBoundary\"]\nb:I[552576,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"WaAcu3X3K00MDvfn1ik7H\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"c:I[349310,[\"/_next/static/chunks/9b5512fb633ef95d.js\",\"/_next/static/chunks/0f1cf11540868e42.js\"],\"IconMark\"]\n6:null\na:[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.e3cbed1b.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Lc\",\"1\",{}]]\n"])</script></body></html>
@@ -1 +1 @@
1
- self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"vQH2jW2K01b1tr6Y6GNG8n4+HO7Bxn/Nwv/yZyda1xA=\"\n}"
1
+ self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"zrH1TR5UZvwVGPd7+yiGvO37EA+28f2EcGpjBlZsyZA=\"\n}"
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "node": {},
3
3
  "edge": {},
4
- "encryptionKey": "vQH2jW2K01b1tr6Y6GNG8n4+HO7Bxn/Nwv/yZyda1xA="
4
+ "encryptionKey": "zrH1TR5UZvwVGPd7+yiGvO37EA+28f2EcGpjBlZsyZA="
5
5
  }
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,739963,e=>{"use strict";let t="sparkecoder_api_url",i="http://localhost:3141",o=!1;function a(){if(o)return;o=!0;let e=new URLSearchParams(window.location.search),i=e.get("apiUrl");if(i){localStorage.setItem(t,i),e.delete("apiUrl");let o=e.toString()?`${window.location.pathname}?${e.toString()}`:window.location.pathname;window.history.replaceState({},"",o),console.log(`[SparkECoder] API URL set to: ${i}`)}}function l(){o||a();let e=localStorage.getItem(t),l=function(){let{protocol:e,hostname:t,port:i}=window.location;return"localhost"===t||"127.0.0.1"===t||"0.0.0.0"===t?null:/^\d{1,3}(\.\d{1,3}){3}$/.test(t)?`${e}//${t}:${"6969"===i?"3141":i||"3141"}`:`${window.location.origin}/__sfapi`}();if(e){try{if(new URL(e).hostname.startsWith("api-")&&l&&l.endsWith("/__sfapi"))return l}catch{}return e}return l||i}function r(e){localStorage.setItem(t,e)}function n(){localStorage.removeItem(t)}let s={availableModels:[{id:"claude-opus-4-8",name:"Claude Opus 4.8",provider:"Anthropic"},{id:"gpt-5.5",name:"GPT-5.5",provider:"OpenAI"},{id:"claude-fable-5",name:"Claude Fable 5",provider:"Anthropic"}],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:"gpt-5.5",defaultToolApprovals:{},serverConnected:!1,apiKeyConfigured:!1,apiBaseUrl:i};async function c(){let e=l();try{let t=new AbortController,i=setTimeout(()=>t.abort(),3e3),o=await fetch(`${e}/health`,{signal:t.signal});if(clearTimeout(i),!o.ok)return{...s,apiBaseUrl:e};let a=await o.json();return{...s,defaultModel:a.config?.defaultModel||s.defaultModel,defaultToolApprovals:a.config?.defaultToolApprovals||{},serverConnected:!0,apiKeyConfigured:a.apiKeyConfigured??!1,apiBaseUrl:e}}catch{return{...s,apiBaseUrl:e}}}async function d(){return l()}function u(){}e.s(["clearApiUrl",()=>n,"getApiBaseUrl",()=>d,"getApiUrl",()=>l,"getConfig",()=>c,"initApiUrl",()=>a,"resetConfigCache",()=>u,"setApiUrl",()=>r])},760800,e=>{"use strict";var t=e.i(430878),i=e.i(739963);function o(){return(0,t.useEffect)(()=>{(0,i.initApiUrl)()},[]),null}e.s(["ApiInit",()=>o])}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,739963,e=>{"use strict";let t="sparkecoder_api_url",i="http://localhost:3141",o=!1;function a(){if(o)return;o=!0;let e=new URLSearchParams(window.location.search),i=e.get("apiUrl");if(i){localStorage.setItem(t,i),e.delete("apiUrl");let o=e.toString()?`${window.location.pathname}?${e.toString()}`:window.location.pathname;window.history.replaceState({},"",o),console.log(`[SparkECoder] API URL set to: ${i}`)}}function l(){o||a();let e=localStorage.getItem(t),l=function(){let{protocol:e,hostname:t,port:i}=window.location;return"localhost"===t||"127.0.0.1"===t||"0.0.0.0"===t?null:/^\d{1,3}(\.\d{1,3}){3}$/.test(t)?`${e}//${t}:${"6969"===i?"3141":i||"3141"}`:`${window.location.origin}/__sfapi`}();if(e){try{if(new URL(e).hostname.startsWith("api-")&&l&&l.endsWith("/__sfapi"))return l}catch{}return e}return l||i}function r(e){localStorage.setItem(t,e)}function n(){localStorage.removeItem(t)}let s={availableModels:[{id:"claude-opus-4-8",name:"Claude Opus 4.8",provider:"Anthropic"},{id:"gpt-5.5",name:"GPT-5.5",provider:"OpenAI"},{id:"claude-fable-5",name:"Claude Fable 5",provider:"Anthropic"}],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:"gpt-5.5",defaultToolApprovals:{},serverConnected:!1,apiKeyConfigured:!1,apiBaseUrl:i};async function c(){let e=l();try{let t=new AbortController,i=setTimeout(()=>t.abort(),3e3),o=await fetch(`${e}/health`,{signal:t.signal});if(clearTimeout(i),!o.ok)return{...s,apiBaseUrl:e};let a=await o.json();return{...s,defaultModel:a.config?.defaultModel||s.defaultModel,defaultToolApprovals:a.config?.defaultToolApprovals||{},serverConnected:!0,apiKeyConfigured:a.apiKeyConfigured??!1,apiBaseUrl:e}}catch{return{...s,apiBaseUrl:e}}}async function d(){return l()}function u(){}e.s(["clearApiUrl",()=>n,"getApiBaseUrl",()=>d,"getApiUrl",()=>l,"getConfig",()=>c,"initApiUrl",()=>a,"resetConfigCache",()=>u,"setApiUrl",()=>r])},760800,e=>{"use strict";var t=e.i(430878),i=e.i(739963);function o(){return(0,t.useEffect)(()=>{(0,i.initApiUrl)()},[]),null}e.s(["ApiInit",()=>o])}]);
@@ -1,3 +1,4 @@
1
1
  {
2
- "apiBaseUrl": "http://127.0.0.1:3144"
2
+ "apiBaseUrl": "http://127.0.0.1:3144",
3
+ "localApiBaseUrl": "http://127.0.0.1:3144"
3
4
  }
@@ -0,0 +1,96 @@
1
+ import { NextRequest } from 'next/server';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+
5
+ /**
6
+ * Same-origin reverse proxy to the local sparkecoder API.
7
+ *
8
+ * The browser calls `/__sfapi/<path>` on the WEB origin (e.g.
9
+ * `https://sf-abc.sparkecode.com/__sfapi/sessions`). This route forwards the
10
+ * request to the local API over loopback (`http://127.0.0.1:3141/sessions`).
11
+ *
12
+ * Why: when Cloudflare Access is enabled, the web app and the `api-<host>`
13
+ * subdomain are SEPARATE Access applications. A browser `fetch()` to the API
14
+ * subdomain gets an interactive Access login redirect it can't follow (CORS /
15
+ * "access control checks" errors). Proxying through the web origin keeps the
16
+ * browser on ONE Access-gated origin (the web app, already logged in), and the
17
+ * loopback hop is exempt from Access on the device.
18
+ *
19
+ * Streams responses (SSE) and forwards request bodies, methods, and query.
20
+ */
21
+
22
+ export const dynamic = 'force-dynamic';
23
+
24
+ const DEFAULT_LOCAL_API = 'http://127.0.0.1:3141';
25
+
26
+ function getLocalApiBase(): string {
27
+ const cwd = process.cwd();
28
+ const candidates = [
29
+ path.join(cwd, 'runtime-config.json'),
30
+ path.join(cwd, '..', 'runtime-config.json'),
31
+ path.join(cwd, '..', '..', 'runtime-config.json'),
32
+ path.join(cwd, '..', '..', '..', 'runtime-config.json'),
33
+ ];
34
+ for (const p of candidates) {
35
+ try {
36
+ if (fs.existsSync(p)) {
37
+ const cfg = JSON.parse(fs.readFileSync(p, 'utf-8'));
38
+ // Prefer the explicit loopback URL; fall back to apiBaseUrl only if it
39
+ // is itself a localhost URL (never proxy to a public api-<host>, that
40
+ // would re-trigger the Access redirect server-side).
41
+ if (cfg.localApiBaseUrl) return cfg.localApiBaseUrl;
42
+ if (typeof cfg.apiBaseUrl === 'string' && /^https?:\/\/(localhost|127\.0\.0\.1)/.test(cfg.apiBaseUrl)) {
43
+ return cfg.apiBaseUrl;
44
+ }
45
+ }
46
+ } catch {
47
+ // try next candidate
48
+ }
49
+ }
50
+ return DEFAULT_LOCAL_API;
51
+ }
52
+
53
+ async function proxy(req: NextRequest, ctx: { params: Promise<{ path?: string[] }> }) {
54
+ const { path: parts = [] } = await ctx.params;
55
+ const base = getLocalApiBase().replace(/\/$/, '');
56
+ const search = req.nextUrl.search || '';
57
+ const target = `${base}/${parts.join('/')}${search}`;
58
+
59
+ const headers = new Headers();
60
+ const ct = req.headers.get('content-type');
61
+ if (ct) headers.set('content-type', ct);
62
+ const accept = req.headers.get('accept');
63
+ if (accept) headers.set('accept', accept);
64
+
65
+ const init: RequestInit = { method: req.method, headers, redirect: 'manual' };
66
+ if (req.method !== 'GET' && req.method !== 'HEAD') {
67
+ init.body = await req.arrayBuffer();
68
+ }
69
+
70
+ let upstream: Response;
71
+ try {
72
+ upstream = await fetch(target, init);
73
+ } catch (err) {
74
+ return new Response(
75
+ JSON.stringify({ error: 'local API unreachable', detail: err instanceof Error ? err.message : String(err) }),
76
+ { status: 502, headers: { 'content-type': 'application/json' } },
77
+ );
78
+ }
79
+
80
+ // Stream the response body through (SSE, downloads, JSON all work). Pass
81
+ // only safe headers; let the runtime handle transfer-encoding/length.
82
+ const respHeaders = new Headers();
83
+ for (const h of ['content-type', 'cache-control', 'content-disposition']) {
84
+ const v = upstream.headers.get(h);
85
+ if (v) respHeaders.set(h, v);
86
+ }
87
+ return new Response(upstream.body, { status: upstream.status, headers: respHeaders });
88
+ }
89
+
90
+ export const GET = proxy;
91
+ export const POST = proxy;
92
+ export const PUT = proxy;
93
+ export const PATCH = proxy;
94
+ export const DELETE = proxy;
95
+ export const HEAD = proxy;
96
+ export const OPTIONS = proxy;
@@ -46,11 +46,12 @@ function deriveApiUrlFromLocation(): string | null {
46
46
  return `${protocol}//${hostname}:${apiPort}`;
47
47
  }
48
48
 
49
- // Tunneled / DNS hostname. Apply the api- prefix convention. If the
50
- // hostname already starts with "api-" (someone shared the API URL),
51
- // leave it alone.
52
- const apiHostname = hostname.startsWith('api-') ? hostname : `api-${hostname}`;
53
- return `${protocol}//${apiHostname}`;
49
+ // Tunneled / DNS hostname. Route API calls back through THIS origin via the
50
+ // `/__sfapi` reverse proxy instead of the separate `api-<host>` subdomain.
51
+ // With Cloudflare Access enabled, api-<host> is its own Access app and a
52
+ // browser fetch to it gets an interactive login redirect it can't follow.
53
+ // Staying same-origin uses the web app's existing Access session, no CORS.
54
+ return `${window.location.origin}/__sfapi`;
54
55
  }
55
56
 
56
57
  // Flag to track if we've initialized
@@ -97,9 +98,23 @@ export function getApiUrl(): string {
97
98
  }
98
99
 
99
100
  const stored = localStorage.getItem(STORAGE_KEY);
100
- if (stored) return stored;
101
-
102
101
  const derived = deriveApiUrlFromLocation();
102
+
103
+ if (stored) {
104
+ // Self-heal stale values: if a previous session cached the separate
105
+ // `api-<host>` origin (now broken behind Cloudflare Access) but we can
106
+ // derive a same-origin proxy URL, prefer the proxy.
107
+ try {
108
+ const u = new URL(stored);
109
+ if (u.hostname.startsWith('api-') && derived && derived.endsWith('/__sfapi')) {
110
+ return derived;
111
+ }
112
+ } catch {
113
+ // stored isn't an absolute URL — fall through and use it as-is
114
+ }
115
+ return stored;
116
+ }
117
+
103
118
  if (derived) return derived;
104
119
 
105
120
  return DEFAULT_API_URL;
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,739963,e=>{"use strict";let t="sparkecoder_api_url",i="http://localhost:3141",o=!1;function a(){if(o)return;o=!0;let e=new URLSearchParams(window.location.search),i=e.get("apiUrl");if(i){localStorage.setItem(t,i),e.delete("apiUrl");let o=e.toString()?`${window.location.pathname}?${e.toString()}`:window.location.pathname;window.history.replaceState({},"",o),console.log(`[SparkECoder] API URL set to: ${i}`)}}function l(){o||a();let e=localStorage.getItem(t),l=function(){let{protocol:e,hostname:t,port:i}=window.location;return"localhost"===t||"127.0.0.1"===t||"0.0.0.0"===t?null:/^\d{1,3}(\.\d{1,3}){3}$/.test(t)?`${e}//${t}:${"6969"===i?"3141":i||"3141"}`:`${window.location.origin}/__sfapi`}();if(e){try{if(new URL(e).hostname.startsWith("api-")&&l&&l.endsWith("/__sfapi"))return l}catch{}return e}return l||i}function r(e){localStorage.setItem(t,e)}function n(){localStorage.removeItem(t)}let s={availableModels:[{id:"claude-opus-4-8",name:"Claude Opus 4.8",provider:"Anthropic"},{id:"gpt-5.5",name:"GPT-5.5",provider:"OpenAI"},{id:"claude-fable-5",name:"Claude Fable 5",provider:"Anthropic"}],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:"gpt-5.5",defaultToolApprovals:{},serverConnected:!1,apiKeyConfigured:!1,apiBaseUrl:i};async function c(){let e=l();try{let t=new AbortController,i=setTimeout(()=>t.abort(),3e3),o=await fetch(`${e}/health`,{signal:t.signal});if(clearTimeout(i),!o.ok)return{...s,apiBaseUrl:e};let a=await o.json();return{...s,defaultModel:a.config?.defaultModel||s.defaultModel,defaultToolApprovals:a.config?.defaultToolApprovals||{},serverConnected:!0,apiKeyConfigured:a.apiKeyConfigured??!1,apiBaseUrl:e}}catch{return{...s,apiBaseUrl:e}}}async function d(){return l()}function u(){}e.s(["clearApiUrl",()=>n,"getApiBaseUrl",()=>d,"getApiUrl",()=>l,"getConfig",()=>c,"initApiUrl",()=>a,"resetConfigCache",()=>u,"setApiUrl",()=>r])},760800,e=>{"use strict";var t=e.i(430878),i=e.i(739963);function o(){return(0,t.useEffect)(()=>{(0,i.initApiUrl)()},[]),null}e.s(["ApiInit",()=>o])}]);
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,739963,e=>{"use strict";let t="sparkecoder_api_url",i="http://localhost:3141",a=!1;function o(){if(a)return;a=!0;let e=new URLSearchParams(window.location.search),i=e.get("apiUrl");if(i){localStorage.setItem(t,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 l(){a||o();let e=localStorage.getItem(t);if(e)return e;let l=function(){let{protocol:e,hostname:t,port:i}=window.location;if("localhost"===t||"127.0.0.1"===t||"0.0.0.0"===t)return null;if(/^\d{1,3}(\.\d{1,3}){3}$/.test(t))return`${e}//${t}:${"6969"===i?"3141":i||"3141"}`;let a=t.startsWith("api-")?t:`api-${t}`;return`${e}//${a}`}();return l||i}function r(e){localStorage.setItem(t,e)}function n(){localStorage.removeItem(t)}let s={availableModels:[{id:"claude-opus-4-8",name:"Claude Opus 4.8",provider:"Anthropic"},{id:"gpt-5.5",name:"GPT-5.5",provider:"OpenAI"},{id:"claude-fable-5",name:"Claude Fable 5",provider:"Anthropic"}],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:"gpt-5.5",defaultToolApprovals:{},serverConnected:!1,apiKeyConfigured:!1,apiBaseUrl:i};async function c(){let e=l();try{let t=new AbortController,i=setTimeout(()=>t.abort(),3e3),a=await fetch(`${e}/health`,{signal:t.signal});if(clearTimeout(i),!a.ok)return{...s,apiBaseUrl:e};let o=await a.json();return{...s,defaultModel:o.config?.defaultModel||s.defaultModel,defaultToolApprovals:o.config?.defaultToolApprovals||{},serverConnected:!0,apiKeyConfigured:o.apiKeyConfigured??!1,apiBaseUrl:e}}catch{return{...s,apiBaseUrl:e}}}async function d(){return l()}function u(){}e.s(["clearApiUrl",()=>n,"getApiBaseUrl",()=>d,"getApiUrl",()=>l,"getConfig",()=>c,"initApiUrl",()=>o,"resetConfigCache",()=>u,"setApiUrl",()=>r])},760800,e=>{"use strict";var t=e.i(430878),i=e.i(739963);function a(){return(0,t.useEffect)(()=>{(0,i.initApiUrl)()},[]),null}e.s(["ApiInit",()=>a])}]);
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,739963,e=>{"use strict";let t="sparkecoder_api_url",i="http://localhost:3141",a=!1;function o(){if(a)return;a=!0;let e=new URLSearchParams(window.location.search),i=e.get("apiUrl");if(i){localStorage.setItem(t,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 l(){a||o();let e=localStorage.getItem(t);if(e)return e;let l=function(){let{protocol:e,hostname:t,port:i}=window.location;if("localhost"===t||"127.0.0.1"===t||"0.0.0.0"===t)return null;if(/^\d{1,3}(\.\d{1,3}){3}$/.test(t))return`${e}//${t}:${"6969"===i?"3141":i||"3141"}`;let a=t.startsWith("api-")?t:`api-${t}`;return`${e}//${a}`}();return l||i}function r(e){localStorage.setItem(t,e)}function n(){localStorage.removeItem(t)}let s={availableModels:[{id:"claude-opus-4-8",name:"Claude Opus 4.8",provider:"Anthropic"},{id:"gpt-5.5",name:"GPT-5.5",provider:"OpenAI"},{id:"claude-fable-5",name:"Claude Fable 5",provider:"Anthropic"}],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:"gpt-5.5",defaultToolApprovals:{},serverConnected:!1,apiKeyConfigured:!1,apiBaseUrl:i};async function c(){let e=l();try{let t=new AbortController,i=setTimeout(()=>t.abort(),3e3),a=await fetch(`${e}/health`,{signal:t.signal});if(clearTimeout(i),!a.ok)return{...s,apiBaseUrl:e};let o=await a.json();return{...s,defaultModel:o.config?.defaultModel||s.defaultModel,defaultToolApprovals:o.config?.defaultToolApprovals||{},serverConnected:!0,apiKeyConfigured:o.apiKeyConfigured??!1,apiBaseUrl:e}}catch{return{...s,apiBaseUrl:e}}}async function d(){return l()}function u(){}e.s(["clearApiUrl",()=>n,"getApiBaseUrl",()=>d,"getApiUrl",()=>l,"getConfig",()=>c,"initApiUrl",()=>o,"resetConfigCache",()=>u,"setApiUrl",()=>r])},760800,e=>{"use strict";var t=e.i(430878),i=e.i(739963);function a(){return(0,t.useEffect)(()=>{(0,i.initApiUrl)()},[]),null}e.s(["ApiInit",()=>a])}]);
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,739963,e=>{"use strict";let t="sparkecoder_api_url",i="http://localhost:3141",a=!1;function o(){if(a)return;a=!0;let e=new URLSearchParams(window.location.search),i=e.get("apiUrl");if(i){localStorage.setItem(t,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 l(){a||o();let e=localStorage.getItem(t);if(e)return e;let l=function(){let{protocol:e,hostname:t,port:i}=window.location;if("localhost"===t||"127.0.0.1"===t||"0.0.0.0"===t)return null;if(/^\d{1,3}(\.\d{1,3}){3}$/.test(t))return`${e}//${t}:${"6969"===i?"3141":i||"3141"}`;let a=t.startsWith("api-")?t:`api-${t}`;return`${e}//${a}`}();return l||i}function r(e){localStorage.setItem(t,e)}function n(){localStorage.removeItem(t)}let s={availableModels:[{id:"claude-opus-4-8",name:"Claude Opus 4.8",provider:"Anthropic"},{id:"gpt-5.5",name:"GPT-5.5",provider:"OpenAI"},{id:"claude-fable-5",name:"Claude Fable 5",provider:"Anthropic"}],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:"gpt-5.5",defaultToolApprovals:{},serverConnected:!1,apiKeyConfigured:!1,apiBaseUrl:i};async function c(){let e=l();try{let t=new AbortController,i=setTimeout(()=>t.abort(),3e3),a=await fetch(`${e}/health`,{signal:t.signal});if(clearTimeout(i),!a.ok)return{...s,apiBaseUrl:e};let o=await a.json();return{...s,defaultModel:o.config?.defaultModel||s.defaultModel,defaultToolApprovals:o.config?.defaultToolApprovals||{},serverConnected:!0,apiKeyConfigured:o.apiKeyConfigured??!1,apiBaseUrl:e}}catch{return{...s,apiBaseUrl:e}}}async function d(){return l()}function u(){}e.s(["clearApiUrl",()=>n,"getApiBaseUrl",()=>d,"getApiUrl",()=>l,"getConfig",()=>c,"initApiUrl",()=>o,"resetConfigCache",()=>u,"setApiUrl",()=>r])},760800,e=>{"use strict";var t=e.i(430878),i=e.i(739963);function a(){return(0,t.useEffect)(()=>{(0,i.initApiUrl)()},[]),null}e.s(["ApiInit",()=>a])}]);