From 06e3a51009ff8b5b911e59f90930c89e59c907b2 Mon Sep 17 00:00:00 2001 From: Samyak Jain <56000318+samyakkkk@users.noreply.github.com> Date: Tue, 13 Aug 2024 22:30:26 +0530 Subject: [PATCH 1/7] (feat): first dropdown draft --- .../lib/components/CreateAgentDialog.svelte | 117 ++++++++++-------- web/src/routes/+page.svelte | 2 +- 2 files changed, 65 insertions(+), 54 deletions(-) diff --git a/web/src/lib/components/CreateAgentDialog.svelte b/web/src/lib/components/CreateAgentDialog.svelte index f10215a..274f85b 100644 --- a/web/src/lib/components/CreateAgentDialog.svelte +++ b/web/src/lib/components/CreateAgentDialog.svelte @@ -1,98 +1,109 @@ {#if showModal} -
- dialog.close()} - open={showModal} - > -
-
-

Create Agent with Github

-
- + +
+ {#each platforms as platform} + + {/each} +
+ +
+
+ p.id === selectedPlatform).icon} class="text-gray-400" /> +
addGithubURL(e.currentTarget.value)} + bind:value + placeholder="{selectedPlatform.charAt(0).toUpperCase() + selectedPlatform.slice(1)} Repo URL" + class="w-full pl-10 pr-3 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:text-white" />
+ -
+
-{/if} \ No newline at end of file +{/if} + + \ No newline at end of file diff --git a/web/src/routes/+page.svelte b/web/src/routes/+page.svelte index 90e5e2c..9de7103 100644 --- a/web/src/routes/+page.svelte +++ b/web/src/routes/+page.svelte @@ -116,7 +116,7 @@ showModal = true; }} > - Create Agent + Create Agent
From 97d8415801c7c5f53fd0df1925fa6ebe6bf4320e Mon Sep 17 00:00:00 2001 From: Samyak Jain <56000318+samyakkkk@users.noreply.github.com> Date: Tue, 13 Aug 2024 22:50:53 +0530 Subject: [PATCH 2/7] (feat): custom icons --- .../lib/components/CreateAgentDialog.svelte | 41 +++++++++--------- web/static/github.png | Bin 0 -> 1587 bytes web/static/go.png | Bin 0 -> 23535 bytes web/static/icons8-dart-96.png | Bin 0 -> 1072 bytes web/static/icons8-github-80.png | Bin 0 -> 3145 bytes web/static/npm.png | Bin 0 -> 295 bytes web/static/python.png | Bin 0 -> 1679 bytes 7 files changed, 21 insertions(+), 20 deletions(-) create mode 100644 web/static/github.png create mode 100644 web/static/go.png create mode 100644 web/static/icons8-dart-96.png create mode 100644 web/static/icons8-github-80.png create mode 100644 web/static/npm.png create mode 100644 web/static/python.png diff --git a/web/src/lib/components/CreateAgentDialog.svelte b/web/src/lib/components/CreateAgentDialog.svelte index 274f85b..ae0a47d 100644 --- a/web/src/lib/components/CreateAgentDialog.svelte +++ b/web/src/lib/components/CreateAgentDialog.svelte @@ -5,11 +5,6 @@ import { ToastType } from "$lib/types/Toast"; import appInsights from "$lib/utils/appInsights"; import IconClose from "~icons/carbon/close"; - import CarbonSearch from "~icons/carbon/search"; - import CarbonGithub from "~icons/carbon/logo-github"; - import CarbonNpm from "~icons/carbon/logo-npm"; - import CarbonPypi from "~icons/carbon/logo-python"; - import CarbonPub from "~icons/carbon/logo-delicious"; export let showModal: boolean; export let onClose: () => void; @@ -18,10 +13,11 @@ let selectedPlatform: string = "github"; const platforms = [ - { id: 'github', icon: CarbonGithub, label: 'GitHub' }, - { id: 'npm', icon: CarbonNpm, label: 'NPM' }, - { id: 'pypi', icon: CarbonPypi, label: 'PyPI' }, - { id: 'pub', icon: CarbonPub, label: 'Pub' } + { id: 'github', icon: 'github.png', label: 'GitHub' }, + { id: 'npm', icon: 'npm.png', label: 'NPM' }, + { id: 'pypi', icon: 'python.png', label: 'PyPI' }, + { id: 'pub', icon: 'icons8-dart-96.png', label: 'Pub' }, + { id: 'go', icon: 'go.png', label: 'Go' } ]; const validateURL = (url: string): boolean => { @@ -56,42 +52,46 @@ {#if showModal}
-
+
-

Create Agent with URL

-
-
+
{#each platforms as platform} {/each}
- p.id === selectedPlatform).icon} class="text-gray-400" /> + p.id === selectedPlatform).icon} + alt={selectedPlatform} + class="w-5 h-5" + />
@@ -101,9 +101,10 @@ \ No newline at end of file diff --git a/web/static/github.png b/web/static/github.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b6b05525e770f6839ec2533495fbfa806dce7b GIT binary patch literal 1587 zcmV-32F&@1P)#i1aXnhK%ZunbAwlCSNqs=tP!D&4~?bV7Sb^_nfo# zIcM*C_Xq2TGuLz1TIZboSbMEC5C{YUfj}S-2m}Id(F)8076aYDN5I#>c3=SbM`S>L zW`4I`KD!8*2}~~92%k6tm;Ef=^A5z%YYu>4+{>jC4T{L z0XG26G%zLL0boZCPOl_C0rvwfG}tin2(Y(6$Cr!I<>5vcp3H0ivjYx~D#$LNlRD%S zV4VXFj$+DM;AHBAn}B@|I5kQrgTSqL%s5&4MV`y6vS9FvV}Z{da9(6dJ_9D<3Dacb z6V;h~3!I4KoCWN3z*$j7@(a+0qf7_-9B@*U!&3Dm9AlEaqEUm$j}jSbZZQx1Zb~!ma6F3@}AfFv8|2`Es z2e=66ki(wk^2D2A;#qmR<8WUJ`*!4Yp73bOr>{N1cQjev_BSPP{_wd)8XK3AF(t*S z#XP;fa8*hhcV~UP`JiI_y$*kvt+4antdts~JV3t(f0(bZb9>B*J~3A-lrr)R{;*VO ztJzCf=Vhf*Tk(fil(xQ*#nRJ8($v}b!4{>RgSMBXb1bC@nl-u)d||;}6JN4Mmj#7h z#~-e>V6WNHJM&5&0H)#>pD1nq%9bLn7P6Gh1nwJmDQ*5wvP0C&vhX@yj(;2_wFerz zud$)XVxk@Rq;TukIZO}A2s)%eR(E*x2|S1R!k{?e(m-5f9#z5>c*Tb>i= zD{bFwLkVp@zq6TSF*waa1&*5El}a3kzf4xz{+kUYv`aB3l9y64PHFo=EO4lSZ$L?D zyYZcx{S7<>O;y@%DudMQQ7Ul;{?ewj-DGvB(PlkgfWKU*wEY_!O1!UB;x_zcp3-(x z8LFnorMP&`tWer+GRM_Crc|OAfB95tyXgp^W~Ne!KRxZm&?1dJG`1(n2CT?277k=g zGOuskqO^HP&J?V$)rH9@XS9ot?`~G)-+~rD%VA^Q#VV!mhibWFKbFo%nMv9`tN@8xL zbLr{jZ^GTU!vafBek3c#%(6h1#8ALYU~6KYBdn3yt|E^dlU94y64L}QGsa7eZ8Zgk z9eOcKwgX$OJG|=ff;ZV8AB%{G}C&sM9i5uDMKd zHlvKhbY9GyQjAOqvkRO!;{QC6!k7cn3c*H5*~St&PH9q$OK}nt#vZ0gGUSpN^rofB ztT}^m-idhEhcy)X7dXAF%4Ty+V|JFkL0Tqe+>0XjRs~4MlYI#fW2VK-w40xSz6&#Q z{(vkvoGjZplh>*1cTAU%rS*htFeVC_i=?)mYx3`4q%pe z8>=X3nr*m3hehZ2itSD?1=v2YNKO3l24DehSlR}ZsEyn{NyjQ8(&bOY8&sHN_hD`8t#Z@{)9JK^TVSg9TE zcjyN6%W>4BF?b3LCa)ya1R l0)apv5C{YUfj|I9`5!l1p^eSdFC_o~002ovPDHLkV1hhy?(P5p literal 0 HcmV?d00001 diff --git a/web/static/go.png b/web/static/go.png new file mode 100644 index 0000000000000000000000000000000000000000..ffeb27443c3e6126e6e27de830dc997b5a85b4c3 GIT binary patch literal 23535 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 QO1(BXNj&lNxYN~t1H_=Iz5oCK literal 0 HcmV?d00001 diff --git a/web/static/icons8-dart-96.png b/web/static/icons8-dart-96.png new file mode 100644 index 0000000000000000000000000000000000000000..cee89a24cf4745bf16695469d9a0a0ec86b93c66 GIT binary patch literal 1072 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 WO?2)}Iv#i$BNQ6H0DJu-BFG5lg zr4k_#Nr)o4?#%V2E`bmzL=nAF1W9O`kb#Qpo!K+zx-CI!rJH7NYl#|Urkkndx=);Y z7wPU@Q{0&|XYZXKJg^_m?%wDBpJ!(7oS7lSyN_>7R#LCBVX ztG5EKiXhZ(;Oa-<@)!tp288M@|IF1dz-31u)LP(jS^RrsQ8?Ch3d4)}TUbW4KN4`c z2828aLgCOt_JL44A>TfS6vCYA^wP@{>odUBbHL@{p^JXO_>KrQ)pe@rqY&l-E;m>d z{=XIR540Aaa-DLj2!wh)8S&3YZ>F{VLDzYwgVt@g0axb|HXyEq1Mzr68XXX7dGg}- zM?5e$I)PB1xH2G~(vn68g#2R@| zkZ;yJlUK8BRRLMJbqr}_fXnVGLGr~ZH4hcS5g_C#D+a`s*2sW2AYBFoLcTG`Gc&Dq zLB0ZH_eBR`u1Aa16kRc4Nfw0&x~KJ%pM{jMzNv zAfpX@^!fmjF`zm$J&c+@<}T|-Hz0~lVCPV?xunqnR|cFnflhOmeQU>PXjM-KLaqj( zzV6?x(Cc!34@nwO>5dLz8yS_X@GWhl0fRs$mXzE%C>ErPB^1Cs_Uk=GeE z;GjMA=Wk)a)lt`?fw7RM2EG%0~n$lRb{F%GOfjj-HWEI?TWxHgrR1ALpH$H zcY=VccU_AHCL^zART;27J9)_BR}5HY#ejMmd_l<1NTC2#257p}i~($edG!}|HUXDs z-3zBo#LuKfO{fwdNr0MtWyFAp?K5vczBr{$T7DNbgpQzrV`3_;G|yWokiR2iV@i|$1;S^=x<7+~nj z*udEjYTD*pG^3Hd%bEd!P#>D#g~0aKQS0AGYy!ME+q?m^yH3RK!4kdQssW^>?b@Nf z6{}MNdQsEqWH{XIPP4=V z@m)~LK-YtCqmL!%4e$n#Mh1Na)TsfQ^`T}f<31jXqpz;K>}SXQ7?6|!5v{rU40ZNN zZ$MH8giUwX{IB&SgAqIFXF-WnK<=Iz141$aHT%mOP-OtyZD$OiZ`T@-omKN(N7Fdc z$e^ZMEe^u3V8kY3*gO_Bn}eF2sCn*las_E*Frv%tbU~LiP#-0Y4u Date: Tue, 13 Aug 2024 23:12:40 +0530 Subject: [PATCH 3/7] (feat): horizontal pub options. --- .../lib/components/CreateAgentDialog.svelte | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/web/src/lib/components/CreateAgentDialog.svelte b/web/src/lib/components/CreateAgentDialog.svelte index ae0a47d..86fb31e 100644 --- a/web/src/lib/components/CreateAgentDialog.svelte +++ b/web/src/lib/components/CreateAgentDialog.svelte @@ -5,6 +5,7 @@ import { ToastType } from "$lib/types/Toast"; import appInsights from "$lib/utils/appInsights"; import IconClose from "~icons/carbon/close"; + import CarbonGithub from "~icons/carbon/logo-github"; export let showModal: boolean; export let onClose: () => void; @@ -13,19 +14,19 @@ let selectedPlatform: string = "github"; const platforms = [ - { id: 'github', icon: 'github.png', label: 'GitHub' }, + { id: 'github', icon: CarbonGithub, label: 'GitHub'}, { id: 'npm', icon: 'npm.png', label: 'NPM' }, { id: 'pypi', icon: 'python.png', label: 'PyPI' }, { id: 'pub', icon: 'icons8-dart-96.png', label: 'Pub' }, { id: 'go', icon: 'go.png', label: 'Go' } ]; - const validateURL = (url: string): boolean => { const patterns = { github: /^(https:\/\/github\.com\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+\/?)$/, npm: /^(https:\/\/www\.npmjs\.com\/package\/[A-Za-z0-9_.-]+\/?)$/, pypi: /^(https:\/\/pypi\.org\/project\/[A-Za-z0-9_.-]+\/?)$/, - pub: /^(https:\/\/pub\.dev\/packages\/[A-Za-z0-9_.-]+\/?)$/ + pub: /^(https:\/\/pub\.dev\/packages\/[A-Za-z0-9_.-]+\/?)$/, + go: /^(https:\/\/pkg\.go\.dev\/[A-Za-z0-9_.-\/]+\/?)$/ }; return patterns[selectedPlatform].test(url); }; @@ -60,14 +61,21 @@
-
+
{#each platforms as platform} {/each} @@ -75,16 +83,20 @@
- p.id === selectedPlatform).icon} - alt={selectedPlatform} - class="w-5 h-5" - /> + {#if selectedPlatform === 'github'} + + {:else} + p.id === selectedPlatform).icon} + alt={selectedPlatform} + class="w-5 h-5" + /> + {/if}
From c4b97fdd9d233d5cb16bc363d2a9db69339275fc Mon Sep 17 00:00:00 2001 From: Samyak Jain <56000318+samyakkkk@users.noreply.github.com> Date: Tue, 13 Aug 2024 23:18:17 +0530 Subject: [PATCH 4/7] (feat): add clear placeholders --- web/src/lib/components/CreateAgentDialog.svelte | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/web/src/lib/components/CreateAgentDialog.svelte b/web/src/lib/components/CreateAgentDialog.svelte index 86fb31e..cb3f4b5 100644 --- a/web/src/lib/components/CreateAgentDialog.svelte +++ b/web/src/lib/components/CreateAgentDialog.svelte @@ -14,12 +14,12 @@ let selectedPlatform: string = "github"; const platforms = [ - { id: 'github', icon: CarbonGithub, label: 'GitHub'}, - { id: 'npm', icon: 'npm.png', label: 'NPM' }, - { id: 'pypi', icon: 'python.png', label: 'PyPI' }, - { id: 'pub', icon: 'icons8-dart-96.png', label: 'Pub' }, - { id: 'go', icon: 'go.png', label: 'Go' } + { id: 'github', icon: CarbonGithub, label: 'GitHub', placeholder: 'https://github.com/user/repo' }, + { id: 'npm', icon: 'npm.png', label: 'NPM', placeholder: 'https://www.npmjs.com/package/name' }, + { id: 'pypi', icon: 'python.png', label: 'PyPI', placeholder: 'https://pypi.org/project/name' }, + { id: 'pub', icon: 'icons8-dart-96.png', label: 'Pub', placeholder: 'https://pub.dev/packages/name' }, ]; + const validateURL = (url: string): boolean => { const patterns = { github: /^(https:\/\/github\.com\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+\/?)$/, @@ -96,7 +96,7 @@ p.id === selectedPlatform).placeholder} class="w-full pl-10 pr-3 py-2 bg-gray-800 border border-gray-700 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 text-gray-100 placeholder-gray-500" />
From 2bab7c688dc45907130bc616b8c8c3397b7cc374 Mon Sep 17 00:00:00 2001 From: Samyak Jain <56000318+samyakkkk@users.noreply.github.com> Date: Thu, 15 Aug 2024 12:18:01 +0530 Subject: [PATCH 5/7] (feat): create with package manager logic working --- web/.vscode/launch.json | 19 +++++++++ web/package.json | 1 + .../lib/components/CreateAgentDialog.svelte | 39 ++++++++++++++----- web/src/lib/components/SettingsAgent.svelte | 2 +- .../components/chat/ChatIntroduction.svelte | 2 +- web/src/lib/components/chat/ChatWindow.svelte | 2 +- web/src/lib/utils/validateURL.ts | 0 web/src/routes/+page.svelte | 2 +- web/src/routes/agent/+page.svelte | 35 ++++++++++++++--- web/src/routes/agent/[id]/+page.svelte | 2 +- 10 files changed, 85 insertions(+), 19 deletions(-) create mode 100644 web/.vscode/launch.json create mode 100644 web/src/lib/utils/validateURL.ts diff --git a/web/.vscode/launch.json b/web/.vscode/launch.json new file mode 100644 index 0000000..fbd4428 --- /dev/null +++ b/web/.vscode/launch.json @@ -0,0 +1,19 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [{ + "type": "chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}/src", + "breakOnLoad": true, + "sourceMaps": true, + "sourceMapPathOverrides": { + "webpack:///src/*": "${webRoot}/*" + } + } + ] +} \ No newline at end of file diff --git a/web/package.json b/web/package.json index 817e30c..6629b2b 100644 --- a/web/package.json +++ b/web/package.json @@ -37,6 +37,7 @@ "@lottiefiles/svelte-lottie-player": "^0.3.1", "@microsoft/applicationinsights-web": "^3.3.1", "@tailwindcss/typography": "^0.5.13", + "cheerio": "^1.0.0", "dotenv": "^16.4.5", "highlight.js": "^11.10.0", "isomorphic-dompurify": "^2.14.0", diff --git a/web/src/lib/components/CreateAgentDialog.svelte b/web/src/lib/components/CreateAgentDialog.svelte index cb3f4b5..98a771e 100644 --- a/web/src/lib/components/CreateAgentDialog.svelte +++ b/web/src/lib/components/CreateAgentDialog.svelte @@ -20,24 +20,44 @@ { id: 'pub', icon: 'icons8-dart-96.png', label: 'Pub', placeholder: 'https://pub.dev/packages/name' }, ]; - const validateURL = (url: string): boolean => { + const validateURL = (url: string): { isValid: boolean, packageName: string } => { + // validate against these + // https://pub.dev/packages/webview_flutter  + // https://pub.dev/packages/webview_flutter/install + //  requests for: + //  https://pypi.org/project/requests/  + // https://pypi.org/project/requests/#history  + // mock for:  + // https://www.npmjs.com/package/mock + //  https://www.npmjs.com/package/mock?activeTab=dependencies  + // @octokit/graphql for: + //  https://www.npmjs.com/package/@octokit/graphql const patterns = { github: /^(https:\/\/github\.com\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+\/?)$/, - npm: /^(https:\/\/www\.npmjs\.com\/package\/[A-Za-z0-9_.-]+\/?)$/, - pypi: /^(https:\/\/pypi\.org\/project\/[A-Za-z0-9_.-]+\/?)$/, - pub: /^(https:\/\/pub\.dev\/packages\/[A-Za-z0-9_.-]+\/?)$/, - go: /^(https:\/\/pkg\.go\.dev\/[A-Za-z0-9_.-\/]+\/?)$/ + npm: /^(https:\/\/www\.npmjs\.com\/package\/(@?[A-Za-z0-9_.-]+\/?[A-Za-z0-9_.-]+))\/?.*$/, + pypi: /^(https:\/\/pypi\.org\/project\/([A-Za-z0-9_.-]+))\/?.*$/, + pub: /^(https:\/\/pub\.dev\/packages\/([A-Za-z0-9_.-]+))\/?.*$/, }; - return patterns[selectedPlatform].test(url); + + const match = url.match(patterns[selectedPlatform]); + if (match) { + return { isValid: true, packageName: match[2] }; + } else { + return { isValid: false, packageName: "" }; + } }; const onCreateAgent = () => { - if (validateURL(value)) { + value = value.trim() + const { isValid, packageName } = validateURL(value); + if (isValid) { appInsights.trackEvent({ name: "CreateAgentSubmitted", properties: { platform: selectedPlatform, url: value }, }); - goto(`${base}/agent?platform=${selectedPlatform}&url=${value}`); + const queryParam = selectedPlatform === 'github' ? value : packageName; + console.log(queryParam) + goto(`${base}/agent?${selectedPlatform}=${queryParam}`); } else { toastStore.set({ message: `Please enter a valid ${selectedPlatform} URL`, @@ -74,7 +94,7 @@ {:else} {platform.label} {/if} - +
{platform.label} @@ -93,6 +113,7 @@ /> {/if}
+
{ + const patterns = { + github: /^(https:\/\/github\.com\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+\/?)$/, + npm: /^(https:\/\/www\.npmjs\.com\/package\/(@?[A-Za-z0-9_.-]+\/?[A-Za-z0-9_.-]+))\/?.*$/, + pypi: /^(https:\/\/pypi\.org\/project\/([A-Za-z0-9_.-]+))\/?.*$/, + pub: /^(https:\/\/pub\.dev\/packages\/([A-Za-z0-9_.-]+))\/?.*$/, + }; + + const match = url.match(patterns[platform]); + if (match) { + return { isValid: true, packageName: match[2] }; + } else { + return { isValid: false, packageName: "" }; + } +}; \ No newline at end of file diff --git a/web/src/routes/agent/+page.svelte b/web/src/routes/agent/+page.svelte index 709c46c..a883be0 100644 --- a/web/src/routes/agent/+page.svelte +++ b/web/src/routes/agent/+page.svelte @@ -3,6 +3,7 @@ import { error as pageError } from "@sveltejs/kit"; import { page } from "$app/stores"; import appInsights from "$lib/utils/appInsights"; + import { validateURL } from "$lib/utils/validateURL"; import ChatWindow from "$lib/components/chat/ChatWindow.svelte"; import { type Agent } from "$lib/types/Agent"; @@ -30,13 +31,34 @@ referrer = githubRef; referrer_kind = "github"; } else if (npmRef) { - referrer = npmRef; + const { isValid, packageName } = validateURL(npmRef, "npm"); + if (!isValid) { + loading = false; + errorMessage = "Invalid NPM URL"; + appInsights.trackException({ error: new Error(errorMessage) }); // Track exception + throw pageError(400, errorMessage); + } + referrer = packageName; referrer_kind = "npm"; } else if (pypiRef) { - referrer = pypiRef; + const { isValid, packageName } = validateURL(pypiRef, "pypi"); + if (!isValid) { + loading = false; + errorMessage = "Invalid PyPI URL"; + appInsights.trackException({ error: new Error(errorMessage) }); // Track exception + throw pageError(400, errorMessage); + } + referrer = packageName; referrer_kind = "pypi"; } else if (pubRef) { - referrer = pubRef; + const { isValid, packageName } = validateURL(pubRef, "pub"); + if (!isValid) { + loading = false; + errorMessage = "Invalid Pub URL"; + appInsights.trackException({ error: new Error(errorMessage) }); // Track exception + throw pageError(400, errorMessage); + } + referrer = packageName; referrer_kind = "pub"; } else { loading = false; From 9d38a75e33fd431a33ab3ff4e21e9fb2dd02e4d1 Mon Sep 17 00:00:00 2001 From: Samyak Jain <56000318+samyakkkk@users.noreply.github.com> Date: Thu, 15 Aug 2024 12:41:43 +0530 Subject: [PATCH 7/7] (feat): switch back to prod URL --- web/src/lib/components/SettingsAgent.svelte | 2 +- web/src/lib/components/chat/ChatIntroduction.svelte | 2 +- web/src/lib/components/chat/ChatWindow.svelte | 2 +- web/src/routes/+page.svelte | 2 +- web/src/routes/agent/+page.svelte | 2 +- web/src/routes/agent/[id]/+page.svelte | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/web/src/lib/components/SettingsAgent.svelte b/web/src/lib/components/SettingsAgent.svelte index 9993982..6bdc09d 100644 --- a/web/src/lib/components/SettingsAgent.svelte +++ b/web/src/lib/components/SettingsAgent.svelte @@ -214,7 +214,7 @@ method="POST" on:submit|preventDefault={handleSubmitContribution} class="w-full" - action="http://127.0.0.1:5000/agent/contribute-source" + action="https://api.commanddash.dev/agent/contribute-source" >