From c51c3c21b39a795ce942ff167c5e4730c156bb2f Mon Sep 17 00:00:00 2001 From: mawkone Date: Thu, 14 May 2026 11:34:42 -0700 Subject: [PATCH] fix(ai): strip deepseek xml tags from chat history & secure git tools This commit addresses the issue where DeepSeek's raw XML markup (like and ) was leaking into chat history, causing hallucinations in subsequent turns. It also patches a vulnerability in the git commit tool where arbitrary shell injection was possible. Additionally, it includes UX copy and color contrast adjustments for the marketing homepage breadcrumbs. --- check_coolify_logs.js | 36 + market_data_assets/camp_market_sizes.csv | 47 + new-site/Beta Signup.html | 167 ++++ new-site/app.jsx | 227 +++++ new-site/audience.jsx | 177 ++++ new-site/beta.jsx | 809 ++++++++++++++++++ new-site/closing.jsx | 150 ++++ new-site/crossed.jsx | 134 +++ new-site/hero.jsx | 370 ++++++++ new-site/index.html | 219 +++++ new-site/journey.jsx | 333 +++++++ new-site/primitives.jsx | 108 +++ new-site/tweaks-panel.jsx | 568 ++++++++++++ new-site/wall.jsx | 251 ++++++ patch_stripe_keys.js | 17 + vibn-agent-runner/src/agent-session-runner.ts | 597 +++++++------ vibn-agent-runner/src/llm.ts | 752 +++++++++------- vibn-agent-runner/src/tools/git-api.ts | 136 +-- vibn-frontend/app/api/chat/route.ts | 8 +- .../projects/[projectId]/atlas-chat/route.ts | 105 ++- .../lib/ai/openai-compatible-chat.ts | 9 +- .../marketing/components/new-site/index.tsx | 6 +- 22 files changed, 4559 insertions(+), 667 deletions(-) create mode 100644 check_coolify_logs.js create mode 100644 market_data_assets/camp_market_sizes.csv create mode 100644 new-site/Beta Signup.html create mode 100644 new-site/app.jsx create mode 100644 new-site/audience.jsx create mode 100644 new-site/beta.jsx create mode 100644 new-site/closing.jsx create mode 100644 new-site/crossed.jsx create mode 100644 new-site/hero.jsx create mode 100644 new-site/index.html create mode 100644 new-site/journey.jsx create mode 100644 new-site/primitives.jsx create mode 100644 new-site/tweaks-panel.jsx create mode 100644 new-site/wall.jsx create mode 100644 patch_stripe_keys.js diff --git a/check_coolify_logs.js b/check_coolify_logs.js new file mode 100644 index 0000000..f0df1c7 --- /dev/null +++ b/check_coolify_logs.js @@ -0,0 +1,36 @@ +const DFS_LOGIN = process.env.COOLIFY_API_TOKEN; + +async function checkDeployment() { + const url = `${process.env.COOLIFY_URL}/api/v1/deployments?resource_uuid=y4cscsc8s08c8808go0448s0&per_page=1`; + console.log(`Pinging Coolify API at ${url}...`); + + const response = await fetch(url, { + headers: { + "Authorization": `Bearer ${DFS_LOGIN}` + } + }); + + const data = await response.json(); + if (data && data.length > 0) { + const deploy = data[0]; + console.log(`\nDeployment UUID: ${deploy.deployment_uuid}`); + console.log(`Status: ${deploy.status}`); + console.log(`Created At: ${deploy.created_at}`); + + // Parse the logs array to see what it's currently doing + try { + const logs = JSON.parse(deploy.logs); + if (logs && logs.length > 0) { + console.log("\nLast 5 log lines from the build container:"); + logs.slice(-5).forEach(log => { + console.log(`[${log.timestamp}] ${log.type}: ${log.output.substring(0, 100)}`); + }); + } + } catch(e) { + console.log("Could not parse logs array."); + } + } else { + console.log("No deployments found."); + } +} +checkDeployment().catch(console.error); diff --git a/market_data_assets/camp_market_sizes.csv b/market_data_assets/camp_market_sizes.csv new file mode 100644 index 0000000..2acca62 --- /dev/null +++ b/market_data_assets/camp_market_sizes.csv @@ -0,0 +1,47 @@ +Category,Tier,Canada,United States,Total Market Size +"day_care_center",1,8875,49542,58417 +"martial_arts_school",2,2763,22131,24894 +"dance_school",2,2785,18951,21736 +"after_school_program",1,1765,18992,20757 +"community_center",2,2510,12556,15066 +"summer_camp",1,1301,12109,13410 +"music_school",2,2381,11015,13396 +"recreation_center",1,1672,8824,10496 +"camp",1,1133,7801,8934 +"sports_complex",2,1160,7013,8173 +"youth_organization",1,576,7351,7927 +"art_school",2,857,5538,6395 +"gymnastics_center",2,323,4655,4978 +"boxing_gym",2,519,4171,4690 +"equestrian_facility",2,666,3625,4291 +"children_amusement_center",1,262,3271,3533 +"swimming_school",2,385,2531,2916 +"ballet_school",2,231,2290,2521 +"adventure_sports_center",2,448,2000,2448 +"tennis_club",2,264,2043,2307 +"boot_camp",1,206,1971,2177 +"athletic_club",2,213,1959,2172 +"drum_school",2,147,1593,1740 +"baseball_club",2,105,1596,1701 +"boat_club",2,97,1477,1574 +"basketball_club",2,200,1349,1549 +"childrens_club",1,185,1211,1396 +"drama_school",2,268,1100,1368 +"baby_swimming_school",2,159,1202,1361 +"archery_range",2,76,844,920 +"surf_school",2,62,755,817 +"sailing_school",2,121,583,704 +"aquatic_center",2,93,506,599 +"cooking_school",2,84,479,563 +"drawing_lessons",2,86,379,465 +"equestrian_club",2,73,380,453 +"aikido_school",2,44,348,392 +"bicycle_club",2,64,318,382 +"archery_club",2,57,254,311 +"chess_club",2,53,218,271 +"childrens_farm",1,61,191,252 +"canoe_and_kayak_club",2,64,157,221 +"badminton_club",2,97,82,179 +"english_language_camp",1,31,101,132 +"capoeira_school",2,11,92,103 +"riding_school",2,0,0,0 diff --git a/new-site/Beta Signup.html b/new-site/Beta Signup.html new file mode 100644 index 0000000..c6d36d1 --- /dev/null +++ b/new-site/Beta Signup.html @@ -0,0 +1,167 @@ + + + + + + Vibn — Request an invite + + + + + + + + + + + + +
+ + + diff --git a/new-site/app.jsx b/new-site/app.jsx new file mode 100644 index 0000000..61e5d90 --- /dev/null +++ b/new-site/app.jsx @@ -0,0 +1,227 @@ +// App — composes the page. Includes the sticky nav, the success modal that +// appears when the user submits the hero prompt, and the Tweaks panel. + +const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ + "accent": ["#ff6b47", "#ffae9a", "#9c3a1f"], + "heroVariant": "promise", + "showStopMarker": true, + "showLivePill": false +}/*EDITMODE-END*/; + +const ACCENT_PRESETS = { + coral: ["#ff6b47", "#ffae9a", "#9c3a1f"], // warm coral (default) + amber: ["#ffb347", "#ffd9a3", "#9c6e1f"], // soft amber + lime: ["#9ee649", "#d2f3a6", "#3f7a1c"], // electric lime + violet: ["#b07cff", "#dabfff", "#5a2fa3"], // violet +}; + +function applyAccent(arr) { + // arr[0] is the hero color we map to var(--accent); compute soft + glow + fg. + const hero = arr[0]; + const soft = `${hero}24`; // 14% alpha + const glow = `${hero}59`; // 35% alpha + const root = document.documentElement; + root.style.setProperty("--accent", hero); + root.style.setProperty("--accent-soft", soft); + root.style.setProperty("--accent-glow", glow); + // Foreground on accent: derive a dark-on-accent for primary buttons. + root.style.setProperty("--accent-fg", "#1a0f0a"); +} + +function App() { + const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); + const [scrolled, setScrolled] = React.useState(false); + const [showLaunch, setShowLaunch] = React.useState(null); + + React.useEffect(() => { + applyAccent(t.accent); + }, [t.accent]); + + React.useEffect(() => { + const onScroll = () => setScrolled(window.scrollY > 8); + onScroll(); + window.addEventListener("scroll", onScroll, { passive: true }); + return () => window.removeEventListener("scroll", onScroll); + }, []); + + const handleStart = (prompt) => { + setShowLaunch(prompt || "Build me a tool for my business."); + }; + + return ( + <> +