upfynai-code 3.0.2 → 3.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/dist/api-docs.html +838 -838
- package/client/dist/assets/{AppContent-Bvg0CPCO.js → AppContent-CwrTP6TW.js} +43 -43
- package/client/dist/assets/BrowserPanel-0TLEl-IC.js +2 -0
- package/client/dist/assets/{CanvasFullScreen-BdiJ35aq.js → CanvasFullScreen-D1GWQsGL.js} +1 -1
- package/client/dist/assets/{CanvasWorkspace-Bk9R9_e0.js → CanvasWorkspace-D7ORj358.js} +1 -1
- package/client/dist/assets/DashboardPanel-BV7ybUDe.js +1 -0
- package/client/dist/assets/FileTree-5qfhBqdE.js +1 -0
- package/client/dist/assets/{GitPanel-RtyZUIWS.js → GitPanel-C_xFM-N2.js} +1 -1
- package/client/dist/assets/{LoginModal-BWep8a6g.js → LoginModal-CImJHRjX.js} +3 -3
- package/client/dist/assets/{MarkdownPreview-DHmk3qzu.js → MarkdownPreview-CESjI261.js} +1 -1
- package/client/dist/assets/{MermaidBlock-BuBc_G-F.js → MermaidBlock-BFM21cwe.js} +2 -2
- package/client/dist/assets/Onboarding-B3cteLu2.js +1 -0
- package/client/dist/assets/SetupForm-P6dsYgHO.js +1 -0
- package/client/dist/assets/WorkflowsPanel-CBoN80kc.js +1 -0
- package/client/dist/assets/index-46kkVu2i.css +1 -0
- package/client/dist/assets/{index-C5ptjuTl.js → index-HaY-3pK1.js} +20 -20
- package/client/dist/assets/{vendor-canvas-D39yWul6.js → vendor-canvas-DvHJ_Pn2.js} +1 -1
- package/client/dist/assets/{vendor-codemirror-CbtmxxaB.js → vendor-codemirror-D2ALgpaX.js} +1 -1
- package/client/dist/assets/{vendor-icons-BaD0x9SL.js → vendor-icons-GyYE35HP.js} +178 -138
- package/client/dist/assets/{vendor-mermaid-CH7SGc99.js → vendor-mermaid-DucWyDEe.js} +3 -3
- package/client/dist/assets/{vendor-syntax-DuHI9Ok6.js → vendor-syntax-LS_Nt30I.js} +1 -1
- package/client/dist/clear-cache.html +85 -85
- package/client/dist/index.html +17 -17
- package/client/dist/manifest.json +3 -3
- package/client/dist/mcp-docs.html +108 -108
- package/client/dist/offline.html +84 -84
- package/client/dist/sw.js +82 -82
- package/package.json +136 -136
- package/server/browser.js +131 -0
- package/server/database/db.js +108 -10
- package/server/index.js +27 -28
- package/server/middleware/auth.js +5 -2
- package/server/routes/browser.js +419 -0
- package/server/routes/projects.js +118 -19
- package/server/routes/vapi-chat.js +1 -1
- package/server/services/browser-ai.js +154 -0
- package/client/dist/assets/DashboardPanel-CblJfTGi.js +0 -1
- package/client/dist/assets/FileTree-BDUnBheV.js +0 -1
- package/client/dist/assets/Onboarding-Drnlt75a.js +0 -1
- package/client/dist/assets/SetupForm-CtCKitZG.js +0 -1
- package/client/dist/assets/WorkflowsPanel-B2mIXDvD.js +0 -1
- package/client/dist/assets/index-BFuqS0tY.css +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{R as re,c as Te,g as Xd}from"./vendor-react-96lCPsRK.js";import{r as Qd}from"./vendor-markdown-CimbIo6Y.js";const Jd="modulepreload",ep=function(e){return"/"+e},mo={},IS=function(t,r,a){let n=Promise.resolve();if(r&&r.length>0){let s=function(c){return Promise.all(c.map(u=>Promise.resolve(u).then(p=>({status:"fulfilled",value:p}),p=>({status:"rejected",reason:p}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));n=s(r.map(c=>{if(c=ep(c),c in mo)return;mo[c]=!0;const u=c.endsWith(".css"),p=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${p}`))return;const m=document.createElement("link");if(m.rel=u?"stylesheet":Jd,u||(m.as="script"),m.crossOrigin="",m.href=c,l&&m.setAttribute("nonce",l),document.head.appendChild(m),u)return new Promise((h,T)=>{m.addEventListener("load",h),m.addEventListener("error",()=>T(new Error(`Unable to preload CSS for ${c}`)))})}))}function i(s){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=s,window.dispatchEvent(o),!o.defaultPrevented)throw s}return n.then(s=>{for(const o of s||[])o.status==="rejected"&&i(o.reason);return t().catch(i)})};function tp(e,t){if(e==null)return{};var r={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(t.indexOf(a)!==-1)continue;r[a]=e[a]}return r}function rp(e,t){if(e==null)return{};var r,a,n=tp(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}function Xi(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,a=Array(t);r<t;r++)a[r]=e[r];return a}function ap(e){if(Array.isArray(e))return Xi(e)}function np(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function ip(e,t){if(e){if(typeof e=="string")return Xi(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Xi(e,t):void 0}}function op(){throw new TypeError(`Invalid attempt to spread non-iterable instance.
|
|
1
|
+
import{R as re,c as Te,g as Xd}from"./vendor-react-96lCPsRK.js";import{r as Qd}from"./vendor-markdown-CimbIo6Y.js";const Jd="modulepreload",ep=function(e){return"/app/"+e},mo={},IS=function(t,r,a){let n=Promise.resolve();if(r&&r.length>0){let s=function(c){return Promise.all(c.map(u=>Promise.resolve(u).then(p=>({status:"fulfilled",value:p}),p=>({status:"rejected",reason:p}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));n=s(r.map(c=>{if(c=ep(c),c in mo)return;mo[c]=!0;const u=c.endsWith(".css"),p=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${p}`))return;const m=document.createElement("link");if(m.rel=u?"stylesheet":Jd,u||(m.as="script"),m.crossOrigin="",m.href=c,l&&m.setAttribute("nonce",l),document.head.appendChild(m),u)return new Promise((h,T)=>{m.addEventListener("load",h),m.addEventListener("error",()=>T(new Error(`Unable to preload CSS for ${c}`)))})}))}function i(s){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=s,window.dispatchEvent(o),!o.defaultPrevented)throw s}return n.then(s=>{for(const o of s||[])o.status==="rejected"&&i(o.reason);return t().catch(i)})};function tp(e,t){if(e==null)return{};var r={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(t.indexOf(a)!==-1)continue;r[a]=e[a]}return r}function rp(e,t){if(e==null)return{};var r,a,n=tp(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}function Xi(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,a=Array(t);r<t;r++)a[r]=e[r];return a}function ap(e){if(Array.isArray(e))return Xi(e)}function np(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function ip(e,t){if(e){if(typeof e=="string")return Xi(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Xi(e,t):void 0}}function op(){throw new TypeError(`Invalid attempt to spread non-iterable instance.
|
|
2
2
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Qi(e){return ap(e)||np(e)||ip(e)||op()}function he(e){"@babel/helpers - typeof";return he=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},he(e)}function sp(e,t){if(he(e)!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var a=r.call(e,t);if(he(a)!="object")return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function lp(e){var t=sp(e,"string");return he(t)=="symbol"?t:t+""}function Md(e,t,r){return(t=lp(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Ji(){return Ji=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)({}).hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},Ji.apply(null,arguments)}function fo(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),r.push.apply(r,a)}return r}function be(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?fo(Object(r),!0).forEach(function(a){Md(e,a,r[a])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):fo(Object(r)).forEach(function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(r,a))})}return e}function up(e){var t=e.length;if(t===0||t===1)return e;if(t===2)return[e[0],e[1],"".concat(e[0],".").concat(e[1]),"".concat(e[1],".").concat(e[0])];if(t===3)return[e[0],e[1],e[2],"".concat(e[0],".").concat(e[1]),"".concat(e[0],".").concat(e[2]),"".concat(e[1],".").concat(e[0]),"".concat(e[1],".").concat(e[2]),"".concat(e[2],".").concat(e[0]),"".concat(e[2],".").concat(e[1]),"".concat(e[0],".").concat(e[1],".").concat(e[2]),"".concat(e[0],".").concat(e[2],".").concat(e[1]),"".concat(e[1],".").concat(e[0],".").concat(e[2]),"".concat(e[1],".").concat(e[2],".").concat(e[0]),"".concat(e[2],".").concat(e[0],".").concat(e[1]),"".concat(e[2],".").concat(e[1],".").concat(e[0])];if(t>=4)return[e[0],e[1],e[2],e[3],"".concat(e[0],".").concat(e[1]),"".concat(e[0],".").concat(e[2]),"".concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[0]),"".concat(e[1],".").concat(e[2]),"".concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[0]),"".concat(e[2],".").concat(e[1]),"".concat(e[2],".").concat(e[3]),"".concat(e[3],".").concat(e[0]),"".concat(e[3],".").concat(e[1]),"".concat(e[3],".").concat(e[2]),"".concat(e[0],".").concat(e[1],".").concat(e[2]),"".concat(e[0],".").concat(e[1],".").concat(e[3]),"".concat(e[0],".").concat(e[2],".").concat(e[1]),"".concat(e[0],".").concat(e[2],".").concat(e[3]),"".concat(e[0],".").concat(e[3],".").concat(e[1]),"".concat(e[0],".").concat(e[3],".").concat(e[2]),"".concat(e[1],".").concat(e[0],".").concat(e[2]),"".concat(e[1],".").concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[2],".").concat(e[0]),"".concat(e[1],".").concat(e[2],".").concat(e[3]),"".concat(e[1],".").concat(e[3],".").concat(e[0]),"".concat(e[1],".").concat(e[3],".").concat(e[2]),"".concat(e[2],".").concat(e[0],".").concat(e[1]),"".concat(e[2],".").concat(e[0],".").concat(e[3]),"".concat(e[2],".").concat(e[1],".").concat(e[0]),"".concat(e[2],".").concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[3],".").concat(e[0]),"".concat(e[2],".").concat(e[3],".").concat(e[1]),"".concat(e[3],".").concat(e[0],".").concat(e[1]),"".concat(e[3],".").concat(e[0],".").concat(e[2]),"".concat(e[3],".").concat(e[1],".").concat(e[0]),"".concat(e[3],".").concat(e[1],".").concat(e[2]),"".concat(e[3],".").concat(e[2],".").concat(e[0]),"".concat(e[3],".").concat(e[2],".").concat(e[1]),"".concat(e[0],".").concat(e[1],".").concat(e[2],".").concat(e[3]),"".concat(e[0],".").concat(e[1],".").concat(e[3],".").concat(e[2]),"".concat(e[0],".").concat(e[2],".").concat(e[1],".").concat(e[3]),"".concat(e[0],".").concat(e[2],".").concat(e[3],".").concat(e[1]),"".concat(e[0],".").concat(e[3],".").concat(e[1],".").concat(e[2]),"".concat(e[0],".").concat(e[3],".").concat(e[2],".").concat(e[1]),"".concat(e[1],".").concat(e[0],".").concat(e[2],".").concat(e[3]),"".concat(e[1],".").concat(e[0],".").concat(e[3],".").concat(e[2]),"".concat(e[1],".").concat(e[2],".").concat(e[0],".").concat(e[3]),"".concat(e[1],".").concat(e[2],".").concat(e[3],".").concat(e[0]),"".concat(e[1],".").concat(e[3],".").concat(e[0],".").concat(e[2]),"".concat(e[1],".").concat(e[3],".").concat(e[2],".").concat(e[0]),"".concat(e[2],".").concat(e[0],".").concat(e[1],".").concat(e[3]),"".concat(e[2],".").concat(e[0],".").concat(e[3],".").concat(e[1]),"".concat(e[2],".").concat(e[1],".").concat(e[0],".").concat(e[3]),"".concat(e[2],".").concat(e[1],".").concat(e[3],".").concat(e[0]),"".concat(e[2],".").concat(e[3],".").concat(e[0],".").concat(e[1]),"".concat(e[2],".").concat(e[3],".").concat(e[1],".").concat(e[0]),"".concat(e[3],".").concat(e[0],".").concat(e[1],".").concat(e[2]),"".concat(e[3],".").concat(e[0],".").concat(e[2],".").concat(e[1]),"".concat(e[3],".").concat(e[1],".").concat(e[0],".").concat(e[2]),"".concat(e[3],".").concat(e[1],".").concat(e[2],".").concat(e[0]),"".concat(e[3],".").concat(e[2],".").concat(e[0],".").concat(e[1]),"".concat(e[3],".").concat(e[2],".").concat(e[1],".").concat(e[0])]}var De={};function cp(e){if(e.length===0||e.length===1)return e;var t=e.join(".");return De[t]||(De[t]=up(e)),De[t]}function dp(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0,a=e.filter(function(i){return i!=="token"}),n=cp(a);return n.reduce(function(i,s){return be(be({},i),r[s])},t)}function Eo(e){return e.join(" ")}function pp(e,t){var r=0;return function(a){return r+=1,a.map(function(n,i){return Fd({node:n,stylesheet:e,useInlineStyles:t,key:"code-segment-".concat(r,"-").concat(i)})})}}function Fd(e){var t=e.node,r=e.stylesheet,a=e.style,n=a===void 0?{}:a,i=e.useInlineStyles,s=e.key,o=t.properties,l=t.type,c=t.tagName,u=t.value;if(l==="text")return u;if(c){var p=pp(r,i),m;if(!i)m=be(be({},o),{},{className:Eo(o.className)});else{var h=Object.keys(r).reduce(function(A,b){return b.split(".").forEach(function(g){A.includes(g)||A.push(g)}),A},[]),T=o.className&&o.className.includes("token")?["token"]:[],v=o.className&&T.concat(o.className.filter(function(A){return!h.includes(A)}));m=be(be({},o),{},{className:Eo(v)||void 0,style:dp(o.className,Object.assign({},o.style,n),r)})}var R=p(t.children);return re.createElement(c,Ji({key:s},m),R)}}const gp=(function(e,t){var r=e.listLanguages();return r.indexOf(t)!==-1});var bp=["language","children","style","customStyle","codeTagProps","useInlineStyles","showLineNumbers","showInlineLineNumbers","startingLineNumber","lineNumberContainerStyle","lineNumberStyle","wrapLines","wrapLongLines","lineProps","renderer","PreTag","CodeTag","code","astGenerator"];function ho(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),r.push.apply(r,a)}return r}function ae(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?ho(Object(r),!0).forEach(function(a){Md(e,a,r[a])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ho(Object(r)).forEach(function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(r,a))})}return e}var mp=/\n/g;function fp(e){return e.match(mp)}function Ep(e){var t=e.lines,r=e.startingLineNumber,a=e.style;return t.map(function(n,i){var s=i+r;return re.createElement("span",{key:"line-".concat(i),className:"react-syntax-highlighter-line-number",style:typeof a=="function"?a(s):a},"".concat(s,`
|
|
3
3
|
`))})}function hp(e){var t=e.codeString,r=e.codeStyle,a=e.containerStyle,n=a===void 0?{float:"left",paddingRight:"10px"}:a,i=e.numberStyle,s=i===void 0?{}:i,o=e.startingLineNumber;return re.createElement("code",{style:Object.assign({},r,n)},Ep({lines:t.replace(/\n$/,"").split(`
|
|
4
4
|
`),style:s,startingLineNumber:o}))}function Sp(e){return"".concat(e.toString().length,".25em")}function Ud(e,t){return{type:"element",tagName:"span",properties:{key:"line-number--".concat(e),className:["comment","linenumber","react-syntax-highlighter-line-number"],style:t},children:[{type:"text",value:e}]}}function Pd(e,t,r){var a={display:"inline-block",minWidth:Sp(r),paddingRight:"1em",textAlign:"right",userSelect:"none"},n=typeof e=="function"?e(t):e,i=ae(ae({},a),n);return i}function ve(e){var t=e.children,r=e.lineNumber,a=e.lineNumberStyle,n=e.largestLineNumber,i=e.showInlineLineNumbers,s=e.lineProps,o=s===void 0?{}:s,l=e.className,c=l===void 0?[]:l,u=e.showLineNumbers,p=e.wrapLongLines,m=e.wrapLines,h=m===void 0?!1:m,T=h?ae({},typeof o=="function"?o(r):o):{};if(T.className=T.className?[].concat(Qi(T.className.trim().split(/\s+/)),Qi(c)):c,r&&i){var v=Pd(a,r,n);t.unshift(Ud(r,v))}return p&u&&(T.style=ae({display:"flex"},T.style)),{type:"element",tagName:"span",properties:T,children:t}}function Bd(e){for(var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],a=0;a<e.length;a++){var n=e[a];if(n.type==="text")r.push(ve({children:[n],className:Qi(new Set(t))}));else if(n.children){var i=t.concat(n.properties.className);Bd(n.children,i).forEach(function(s){return r.push(s)})}}return r}function yp(e,t,r,a,n,i,s,o,l){var c,u=Bd(e.value),p=[],m=-1,h=0;function T(E,d){var S=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[];return ve({children:E,lineNumber:d,lineNumberStyle:o,largestLineNumber:s,showInlineLineNumbers:n,lineProps:r,className:S,showLineNumbers:a,wrapLongLines:l,wrapLines:t})}function v(E,d){if(a&&d&&n){var S=Pd(o,d,s);E.unshift(Ud(d,S))}return E}function R(E,d){var S=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[];return t||S.length>0?T(E,d,S):v(E,d)}for(var A=function(){var d=u[h],S=d.children[0].value,_=fp(S);if(_){var y=S.split(`
|
|
@@ -1,85 +1,85 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html>
|
|
3
|
-
<head>
|
|
4
|
-
<title>Clear Cache -
|
|
5
|
-
<style>
|
|
6
|
-
body {
|
|
7
|
-
font-family: system-ui, -apple-system, sans-serif;
|
|
8
|
-
max-width: 600px;
|
|
9
|
-
margin: 50px auto;
|
|
10
|
-
padding: 20px;
|
|
11
|
-
line-height: 1.6;
|
|
12
|
-
}
|
|
13
|
-
.success { color: green; }
|
|
14
|
-
.error { color: red; }
|
|
15
|
-
button {
|
|
16
|
-
background: #007bff;
|
|
17
|
-
color: white;
|
|
18
|
-
border: none;
|
|
19
|
-
padding: 10px 20px;
|
|
20
|
-
border-radius: 5px;
|
|
21
|
-
cursor: pointer;
|
|
22
|
-
font-size: 16px;
|
|
23
|
-
margin: 10px 5px;
|
|
24
|
-
}
|
|
25
|
-
button:hover {
|
|
26
|
-
background: #0056b3;
|
|
27
|
-
}
|
|
28
|
-
#status {
|
|
29
|
-
margin-top: 20px;
|
|
30
|
-
padding: 15px;
|
|
31
|
-
border-radius: 5px;
|
|
32
|
-
background: #f0f0f0;
|
|
33
|
-
}
|
|
34
|
-
</style>
|
|
35
|
-
</head>
|
|
36
|
-
<body>
|
|
37
|
-
<h1>Clear Cache & Service Worker</h1>
|
|
38
|
-
<p>If you're seeing a blank page or old content, click the button below to clear all cached data.</p>
|
|
39
|
-
|
|
40
|
-
<button onclick="clearEverything()">Clear Cache & Reload</button>
|
|
41
|
-
|
|
42
|
-
<div id="status"></div>
|
|
43
|
-
|
|
44
|
-
<script>
|
|
45
|
-
async function clearEverything() {
|
|
46
|
-
const status = document.getElementById('status');
|
|
47
|
-
status.innerHTML = '<p>Clearing cache and service workers...</p>';
|
|
48
|
-
|
|
49
|
-
try {
|
|
50
|
-
// Unregister all service workers
|
|
51
|
-
if ('serviceWorker' in navigator) {
|
|
52
|
-
const registrations = await navigator.serviceWorker.getRegistrations();
|
|
53
|
-
for (let registration of registrations) {
|
|
54
|
-
await registration.unregister();
|
|
55
|
-
status.innerHTML += '<p class="success">✓ Unregistered service worker</p>';
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Clear all caches
|
|
60
|
-
if ('caches' in window) {
|
|
61
|
-
const cacheNames = await caches.keys();
|
|
62
|
-
for (let cacheName of cacheNames) {
|
|
63
|
-
await caches.delete(cacheName);
|
|
64
|
-
status.innerHTML += `<p class="success">✓ Deleted cache: ${cacheName}</p>`;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Clear localStorage
|
|
69
|
-
localStorage.clear();
|
|
70
|
-
status.innerHTML += '<p class="success">✓ Cleared localStorage</p>';
|
|
71
|
-
|
|
72
|
-
// Clear sessionStorage
|
|
73
|
-
sessionStorage.clear();
|
|
74
|
-
status.innerHTML += '<p class="success">✓ Cleared sessionStorage</p>';
|
|
75
|
-
|
|
76
|
-
status.innerHTML += '<p class="success"><strong>✓ All caches cleared!</strong></p>';
|
|
77
|
-
status.innerHTML += '<p>Cache cleared successfully. You can now close this tab or <a href="/">go to home page</a>.</p>';
|
|
78
|
-
|
|
79
|
-
} catch (error) {
|
|
80
|
-
status.innerHTML += `<p class="error">✗ Error: ${error.message}</p>`;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
</script>
|
|
84
|
-
</body>
|
|
85
|
-
</html>
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>Clear Cache - UpfynAI</title>
|
|
5
|
+
<style>
|
|
6
|
+
body {
|
|
7
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
8
|
+
max-width: 600px;
|
|
9
|
+
margin: 50px auto;
|
|
10
|
+
padding: 20px;
|
|
11
|
+
line-height: 1.6;
|
|
12
|
+
}
|
|
13
|
+
.success { color: green; }
|
|
14
|
+
.error { color: red; }
|
|
15
|
+
button {
|
|
16
|
+
background: #007bff;
|
|
17
|
+
color: white;
|
|
18
|
+
border: none;
|
|
19
|
+
padding: 10px 20px;
|
|
20
|
+
border-radius: 5px;
|
|
21
|
+
cursor: pointer;
|
|
22
|
+
font-size: 16px;
|
|
23
|
+
margin: 10px 5px;
|
|
24
|
+
}
|
|
25
|
+
button:hover {
|
|
26
|
+
background: #0056b3;
|
|
27
|
+
}
|
|
28
|
+
#status {
|
|
29
|
+
margin-top: 20px;
|
|
30
|
+
padding: 15px;
|
|
31
|
+
border-radius: 5px;
|
|
32
|
+
background: #f0f0f0;
|
|
33
|
+
}
|
|
34
|
+
</style>
|
|
35
|
+
</head>
|
|
36
|
+
<body>
|
|
37
|
+
<h1>Clear Cache & Service Worker</h1>
|
|
38
|
+
<p>If you're seeing a blank page or old content, click the button below to clear all cached data.</p>
|
|
39
|
+
|
|
40
|
+
<button onclick="clearEverything()">Clear Cache & Reload</button>
|
|
41
|
+
|
|
42
|
+
<div id="status"></div>
|
|
43
|
+
|
|
44
|
+
<script>
|
|
45
|
+
async function clearEverything() {
|
|
46
|
+
const status = document.getElementById('status');
|
|
47
|
+
status.innerHTML = '<p>Clearing cache and service workers...</p>';
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
// Unregister all service workers
|
|
51
|
+
if ('serviceWorker' in navigator) {
|
|
52
|
+
const registrations = await navigator.serviceWorker.getRegistrations();
|
|
53
|
+
for (let registration of registrations) {
|
|
54
|
+
await registration.unregister();
|
|
55
|
+
status.innerHTML += '<p class="success">✓ Unregistered service worker</p>';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Clear all caches
|
|
60
|
+
if ('caches' in window) {
|
|
61
|
+
const cacheNames = await caches.keys();
|
|
62
|
+
for (let cacheName of cacheNames) {
|
|
63
|
+
await caches.delete(cacheName);
|
|
64
|
+
status.innerHTML += `<p class="success">✓ Deleted cache: ${cacheName}</p>`;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Clear localStorage
|
|
69
|
+
localStorage.clear();
|
|
70
|
+
status.innerHTML += '<p class="success">✓ Cleared localStorage</p>';
|
|
71
|
+
|
|
72
|
+
// Clear sessionStorage
|
|
73
|
+
sessionStorage.clear();
|
|
74
|
+
status.innerHTML += '<p class="success">✓ Cleared sessionStorage</p>';
|
|
75
|
+
|
|
76
|
+
status.innerHTML += '<p class="success"><strong>✓ All caches cleared!</strong></p>';
|
|
77
|
+
status.innerHTML += '<p>Cache cleared successfully. You can now close this tab or <a href="/">go to home page</a>.</p>';
|
|
78
|
+
|
|
79
|
+
} catch (error) {
|
|
80
|
+
status.innerHTML += `<p class="error">✗ Error: ${error.message}</p>`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
</script>
|
|
84
|
+
</body>
|
|
85
|
+
</html>
|
package/client/dist/index.html
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
|
-
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
6
|
-
<link rel="icon" type="image/png" href="/favicon.png" />
|
|
5
|
+
<link rel="icon" type="image/svg+xml" href="/app/favicon.svg" />
|
|
6
|
+
<link rel="icon" type="image/png" href="/app/favicon.png" />
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, viewport-fit=cover" />
|
|
8
|
-
<title>
|
|
8
|
+
<title>UpfynAI</title>
|
|
9
9
|
|
|
10
10
|
<!-- PWA Manifest -->
|
|
11
|
-
<link rel="manifest" href="/manifest.json" />
|
|
11
|
+
<link rel="manifest" href="/app/manifest.json" />
|
|
12
12
|
|
|
13
13
|
<!-- iOS Safari PWA Meta Tags -->
|
|
14
14
|
<meta name="mobile-web-app-capable" content="yes" />
|
|
15
15
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
|
16
|
-
<meta name="apple-mobile-web-app-title" content="
|
|
16
|
+
<meta name="apple-mobile-web-app-title" content="UpfynAI" />
|
|
17
17
|
|
|
18
18
|
<!-- iOS Safari Icons -->
|
|
19
|
-
<link rel="apple-touch-icon" sizes="152x152" href="/icons/icon-152x152.png" />
|
|
20
|
-
<link rel="apple-touch-icon" sizes="180x180" href="/icons/icon-192x192.png" />
|
|
19
|
+
<link rel="apple-touch-icon" sizes="152x152" href="/app/icons/icon-152x152.png" />
|
|
20
|
+
<link rel="apple-touch-icon" sizes="180x180" href="/app/icons/icon-192x192.png" />
|
|
21
21
|
|
|
22
22
|
<!-- Theme Color -->
|
|
23
23
|
<meta name="theme-color" content="#0a0f1e" />
|
|
@@ -62,13 +62,13 @@
|
|
|
62
62
|
40% { transform: translateY(-8px); }
|
|
63
63
|
}
|
|
64
64
|
</style>
|
|
65
|
-
<script type="module" crossorigin src="/assets/index-
|
|
66
|
-
<link rel="modulepreload" crossorigin href="/assets/vendor-react-96lCPsRK.js">
|
|
67
|
-
<link rel="modulepreload" crossorigin href="/assets/vendor-markdown-CimbIo6Y.js">
|
|
68
|
-
<link rel="modulepreload" crossorigin href="/assets/vendor-syntax-
|
|
69
|
-
<link rel="modulepreload" crossorigin href="/assets/vendor-icons-
|
|
70
|
-
<link rel="modulepreload" crossorigin href="/assets/vendor-i18n-DCFGyhQR.js">
|
|
71
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
65
|
+
<script type="module" crossorigin src="/app/assets/index-HaY-3pK1.js"></script>
|
|
66
|
+
<link rel="modulepreload" crossorigin href="/app/assets/vendor-react-96lCPsRK.js">
|
|
67
|
+
<link rel="modulepreload" crossorigin href="/app/assets/vendor-markdown-CimbIo6Y.js">
|
|
68
|
+
<link rel="modulepreload" crossorigin href="/app/assets/vendor-syntax-LS_Nt30I.js">
|
|
69
|
+
<link rel="modulepreload" crossorigin href="/app/assets/vendor-icons-GyYE35HP.js">
|
|
70
|
+
<link rel="modulepreload" crossorigin href="/app/assets/vendor-i18n-DCFGyhQR.js">
|
|
71
|
+
<link rel="stylesheet" crossorigin href="/app/assets/index-46kkVu2i.css">
|
|
72
72
|
</head>
|
|
73
73
|
<body>
|
|
74
74
|
<!-- Static splash screen: visible INSTANTLY (pure HTML, no JS needed) -->
|
|
@@ -76,9 +76,9 @@
|
|
|
76
76
|
<div id="root">
|
|
77
77
|
<div id="splash">
|
|
78
78
|
<div class="logo-box">
|
|
79
|
-
<img src="/favicon.svg" alt="UpfynAI" />
|
|
79
|
+
<img src="/app/favicon.svg" alt="UpfynAI" />
|
|
80
80
|
</div>
|
|
81
|
-
<h1>
|
|
81
|
+
<h1>UpfynAI</h1>
|
|
82
82
|
<div class="dots">
|
|
83
83
|
<span></span><span></span><span></span>
|
|
84
84
|
</div>
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
window.addEventListener('error', function(e) {
|
|
93
93
|
if (window.__REACT_MOUNTED) return;
|
|
94
94
|
var s = document.getElementById('splash');
|
|
95
|
-
if (s) s.innerHTML = '<h1 style="margin:0">
|
|
95
|
+
if (s) s.innerHTML = '<h1 style="margin:0">UpfynAI</h1><p style="color:#f87171">Failed to load: ' + (e.message || 'Unknown error') + '</p><button onclick="location.reload()" style="padding:10px 24px;border-radius:8px;border:none;background:#3b82f6;color:#fff;cursor:pointer;font-size:14px">Refresh</button>';
|
|
96
96
|
});
|
|
97
97
|
// Timeout: if React hasn't mounted in 20 seconds, show retry
|
|
98
98
|
setTimeout(function() {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "
|
|
3
|
-
"short_name": "
|
|
4
|
-
"description": "
|
|
2
|
+
"name": "UpfynAI",
|
|
3
|
+
"short_name": "UpfynAI",
|
|
4
|
+
"description": "UpfynAI — Visual AI Coding Interface",
|
|
5
5
|
"start_url": "/",
|
|
6
6
|
"display": "standalone",
|
|
7
7
|
"background_color": "#ffffff",
|
|
@@ -1,108 +1,108 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>
|
|
7
|
-
<style>
|
|
8
|
-
:root { --bg: #0d1117; --fg: #c9d1d9; --accent: #58a6ff; --card: #161b22; --border: #30363d; --code-bg: #1c2128; }
|
|
9
|
-
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
10
|
-
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif; background: var(--bg); color: var(--fg); line-height: 1.6; padding: 2rem; max-width: 800px; margin: 0 auto; }
|
|
11
|
-
h1 { color: #fff; margin-bottom: 0.5rem; font-size: 2rem; }
|
|
12
|
-
h2 { color: var(--accent); margin: 2rem 0 1rem; font-size: 1.4rem; border-bottom: 1px solid var(--border); padding-bottom: 0.5rem; }
|
|
13
|
-
h3 { color: #fff; margin: 1.5rem 0 0.5rem; }
|
|
14
|
-
p { margin-bottom: 1rem; }
|
|
15
|
-
a { color: var(--accent); }
|
|
16
|
-
.subtitle { color: #8b949e; margin-bottom: 2rem; }
|
|
17
|
-
pre { background: var(--code-bg); border: 1px solid var(--border); border-radius: 6px; padding: 1rem; overflow-x: auto; margin: 1rem 0; font-size: 0.9rem; }
|
|
18
|
-
code { font-family: 'SF Mono', 'Fira Code', monospace; color: #e6edf3; }
|
|
19
|
-
.card { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 1.5rem; margin: 1rem 0; }
|
|
20
|
-
.tool { margin: 0.75rem 0; }
|
|
21
|
-
.tool-name { color: var(--accent); font-weight: 600; font-family: monospace; }
|
|
22
|
-
.tool-desc { color: #8b949e; margin-left: 1rem; }
|
|
23
|
-
.step { display: flex; gap: 1rem; margin: 1rem 0; }
|
|
24
|
-
.step-num { background: var(--accent); color: var(--bg); width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; flex-shrink: 0; }
|
|
25
|
-
.warn { background: #3d1f00; border: 1px solid #6e3a00; border-radius: 6px; padding: 1rem; margin: 1rem 0; color: #f0883e; }
|
|
26
|
-
</style>
|
|
27
|
-
</head>
|
|
28
|
-
<body>
|
|
29
|
-
<h1>
|
|
30
|
-
<p class="subtitle">Connect any MCP client to control your
|
|
31
|
-
|
|
32
|
-
<h2>Quick Start</h2>
|
|
33
|
-
|
|
34
|
-
<div class="step">
|
|
35
|
-
<div class="step-num">1</div>
|
|
36
|
-
<div><strong>Get your API key</strong> — Log into
|
|
37
|
-
</div>
|
|
38
|
-
<div class="step">
|
|
39
|
-
<div class="step-num">2</div>
|
|
40
|
-
<div><strong>Add MCP config</strong> to your client (see examples below).</div>
|
|
41
|
-
</div>
|
|
42
|
-
<div class="step">
|
|
43
|
-
<div class="step-num">3</div>
|
|
44
|
-
<div><strong>Start using tools</strong> — Your client can now send prompts, manage canvas, and control sessions.</div>
|
|
45
|
-
</div>
|
|
46
|
-
|
|
47
|
-
<h2>Client Configuration</h2>
|
|
48
|
-
|
|
49
|
-
<p>Get your personalized MCP configuration from the <strong>Dashboard</strong> at <code>cli.upfyn.com/dashboard</code>. It includes the exact URL and credentials for your account — just copy and paste into your AI tool's MCP settings.</p>
|
|
50
|
-
|
|
51
|
-
<h3>Claude Desktop</h3>
|
|
52
|
-
<p>Add to <code>~/.claude/mcp_servers.json</code>:</p>
|
|
53
|
-
<pre><code>{
|
|
54
|
-
"upfynai": {
|
|
55
|
-
"type": "streamable-http",
|
|
56
|
-
"url": "YOUR_MCP_URL",
|
|
57
|
-
"headers": {
|
|
58
|
-
"x-api-key": "YOUR_API_KEY_HERE"
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}</code></pre>
|
|
62
|
-
|
|
63
|
-
<h3>Claude Code CLI</h3>
|
|
64
|
-
<pre><code>claude mcp add upfynai \
|
|
65
|
-
--transport streamable-http \
|
|
66
|
-
YOUR_MCP_URL \
|
|
67
|
-
--header "x-api-key: YOUR_API_KEY_HERE"</code></pre>
|
|
68
|
-
|
|
69
|
-
<h3>Cursor</h3>
|
|
70
|
-
<p>Add to <code>.cursor/mcp.json</code> in your project:</p>
|
|
71
|
-
<pre><code>{
|
|
72
|
-
"mcpServers": {
|
|
73
|
-
"upfynai": {
|
|
74
|
-
"url": "YOUR_MCP_URL",
|
|
75
|
-
"headers": { "x-api-key": "YOUR_API_KEY_HERE" }
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}</code></pre>
|
|
79
|
-
|
|
80
|
-
<h3>Any HTTP MCP Client</h3>
|
|
81
|
-
<pre><code>POST YOUR_MCP_URL
|
|
82
|
-
Headers:
|
|
83
|
-
Content-Type: application/json
|
|
84
|
-
x-api-key: YOUR_API_KEY_HERE</code></pre>
|
|
85
|
-
|
|
86
|
-
<h2>Capabilities</h2>
|
|
87
|
-
<div class="card">
|
|
88
|
-
<p>Once connected, your MCP client can:</p>
|
|
89
|
-
<div class="tool"><span class="tool-desc">Send AI prompts and receive streaming responses</span></div>
|
|
90
|
-
<div class="tool"><span class="tool-desc">Browse and manage your projects</span></div>
|
|
91
|
-
<div class="tool"><span class="tool-desc">View and manage active sessions</span></div>
|
|
92
|
-
<div class="tool"><span class="tool-desc">Interact with the Upfyn Canvas</span></div>
|
|
93
|
-
<div class="tool"><span class="tool-desc">Control running AI sessions</span></div>
|
|
94
|
-
<p style="margin-top: 1rem; color: #8b949e; font-size: 0.85rem;">The full list of available tools and resources is auto-discovered by your MCP client when it connects.</p>
|
|
95
|
-
</div>
|
|
96
|
-
|
|
97
|
-
<h2>Authentication</h2>
|
|
98
|
-
<p>All MCP requests require authentication using an API key:</p>
|
|
99
|
-
<div class="card">
|
|
100
|
-
<p><strong>API Key</strong>:<br><code>x-api-key: YOUR_API_KEY_HERE</code></p>
|
|
101
|
-
<p style="color: #8b949e; font-size: 0.85rem;">Generate API keys from Settings → API & Tokens in the web UI.</p>
|
|
102
|
-
</div>
|
|
103
|
-
|
|
104
|
-
<div class="warn">
|
|
105
|
-
<strong>Security:</strong> Keep your API key secret. Each key is tied to your user account. You can revoke keys at any time from Settings.
|
|
106
|
-
</div>
|
|
107
|
-
</body>
|
|
108
|
-
</html>
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>UpfynAI MCP Integration</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root { --bg: #0d1117; --fg: #c9d1d9; --accent: #58a6ff; --card: #161b22; --border: #30363d; --code-bg: #1c2128; }
|
|
9
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
10
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif; background: var(--bg); color: var(--fg); line-height: 1.6; padding: 2rem; max-width: 800px; margin: 0 auto; }
|
|
11
|
+
h1 { color: #fff; margin-bottom: 0.5rem; font-size: 2rem; }
|
|
12
|
+
h2 { color: var(--accent); margin: 2rem 0 1rem; font-size: 1.4rem; border-bottom: 1px solid var(--border); padding-bottom: 0.5rem; }
|
|
13
|
+
h3 { color: #fff; margin: 1.5rem 0 0.5rem; }
|
|
14
|
+
p { margin-bottom: 1rem; }
|
|
15
|
+
a { color: var(--accent); }
|
|
16
|
+
.subtitle { color: #8b949e; margin-bottom: 2rem; }
|
|
17
|
+
pre { background: var(--code-bg); border: 1px solid var(--border); border-radius: 6px; padding: 1rem; overflow-x: auto; margin: 1rem 0; font-size: 0.9rem; }
|
|
18
|
+
code { font-family: 'SF Mono', 'Fira Code', monospace; color: #e6edf3; }
|
|
19
|
+
.card { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 1.5rem; margin: 1rem 0; }
|
|
20
|
+
.tool { margin: 0.75rem 0; }
|
|
21
|
+
.tool-name { color: var(--accent); font-weight: 600; font-family: monospace; }
|
|
22
|
+
.tool-desc { color: #8b949e; margin-left: 1rem; }
|
|
23
|
+
.step { display: flex; gap: 1rem; margin: 1rem 0; }
|
|
24
|
+
.step-num { background: var(--accent); color: var(--bg); width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; flex-shrink: 0; }
|
|
25
|
+
.warn { background: #3d1f00; border: 1px solid #6e3a00; border-radius: 6px; padding: 1rem; margin: 1rem 0; color: #f0883e; }
|
|
26
|
+
</style>
|
|
27
|
+
</head>
|
|
28
|
+
<body>
|
|
29
|
+
<h1>UpfynAI MCP Server</h1>
|
|
30
|
+
<p class="subtitle">Connect any MCP client to control your UpfynAI instance</p>
|
|
31
|
+
|
|
32
|
+
<h2>Quick Start</h2>
|
|
33
|
+
|
|
34
|
+
<div class="step">
|
|
35
|
+
<div class="step-num">1</div>
|
|
36
|
+
<div><strong>Get your API key</strong> — Log into UpfynAI, go to Settings, then API Keys. Click "Generate New Key".</div>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="step">
|
|
39
|
+
<div class="step-num">2</div>
|
|
40
|
+
<div><strong>Add MCP config</strong> to your client (see examples below).</div>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="step">
|
|
43
|
+
<div class="step-num">3</div>
|
|
44
|
+
<div><strong>Start using tools</strong> — Your client can now send prompts, manage canvas, and control sessions.</div>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<h2>Client Configuration</h2>
|
|
48
|
+
|
|
49
|
+
<p>Get your personalized MCP configuration from the <strong>Dashboard</strong> at <code>cli.upfyn.com/dashboard</code>. It includes the exact URL and credentials for your account — just copy and paste into your AI tool's MCP settings.</p>
|
|
50
|
+
|
|
51
|
+
<h3>Claude Desktop</h3>
|
|
52
|
+
<p>Add to <code>~/.claude/mcp_servers.json</code>:</p>
|
|
53
|
+
<pre><code>{
|
|
54
|
+
"upfynai": {
|
|
55
|
+
"type": "streamable-http",
|
|
56
|
+
"url": "YOUR_MCP_URL",
|
|
57
|
+
"headers": {
|
|
58
|
+
"x-api-key": "YOUR_API_KEY_HERE"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}</code></pre>
|
|
62
|
+
|
|
63
|
+
<h3>Claude Code CLI</h3>
|
|
64
|
+
<pre><code>claude mcp add upfynai \
|
|
65
|
+
--transport streamable-http \
|
|
66
|
+
YOUR_MCP_URL \
|
|
67
|
+
--header "x-api-key: YOUR_API_KEY_HERE"</code></pre>
|
|
68
|
+
|
|
69
|
+
<h3>Cursor</h3>
|
|
70
|
+
<p>Add to <code>.cursor/mcp.json</code> in your project:</p>
|
|
71
|
+
<pre><code>{
|
|
72
|
+
"mcpServers": {
|
|
73
|
+
"upfynai": {
|
|
74
|
+
"url": "YOUR_MCP_URL",
|
|
75
|
+
"headers": { "x-api-key": "YOUR_API_KEY_HERE" }
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}</code></pre>
|
|
79
|
+
|
|
80
|
+
<h3>Any HTTP MCP Client</h3>
|
|
81
|
+
<pre><code>POST YOUR_MCP_URL
|
|
82
|
+
Headers:
|
|
83
|
+
Content-Type: application/json
|
|
84
|
+
x-api-key: YOUR_API_KEY_HERE</code></pre>
|
|
85
|
+
|
|
86
|
+
<h2>Capabilities</h2>
|
|
87
|
+
<div class="card">
|
|
88
|
+
<p>Once connected, your MCP client can:</p>
|
|
89
|
+
<div class="tool"><span class="tool-desc">Send AI prompts and receive streaming responses</span></div>
|
|
90
|
+
<div class="tool"><span class="tool-desc">Browse and manage your projects</span></div>
|
|
91
|
+
<div class="tool"><span class="tool-desc">View and manage active sessions</span></div>
|
|
92
|
+
<div class="tool"><span class="tool-desc">Interact with the Upfyn Canvas</span></div>
|
|
93
|
+
<div class="tool"><span class="tool-desc">Control running AI sessions</span></div>
|
|
94
|
+
<p style="margin-top: 1rem; color: #8b949e; font-size: 0.85rem;">The full list of available tools and resources is auto-discovered by your MCP client when it connects.</p>
|
|
95
|
+
</div>
|
|
96
|
+
|
|
97
|
+
<h2>Authentication</h2>
|
|
98
|
+
<p>All MCP requests require authentication using an API key:</p>
|
|
99
|
+
<div class="card">
|
|
100
|
+
<p><strong>API Key</strong>:<br><code>x-api-key: YOUR_API_KEY_HERE</code></p>
|
|
101
|
+
<p style="color: #8b949e; font-size: 0.85rem;">Generate API keys from Settings → API & Tokens in the web UI.</p>
|
|
102
|
+
</div>
|
|
103
|
+
|
|
104
|
+
<div class="warn">
|
|
105
|
+
<strong>Security:</strong> Keep your API key secret. Each key is tied to your user account. You can revoke keys at any time from Settings.
|
|
106
|
+
</div>
|
|
107
|
+
</body>
|
|
108
|
+
</html>
|