change semantics

Update README deployment steps and add deploy:secrets script to package.json

update local inference script and README

update lockfile

reconfigure package scripts for development

update test execution

pass server tests

Update README with revised Bun commands and workspace details

remove pnpm package manager designator

create bun server
This commit is contained in:
geoffsee
2025-06-02 18:41:16 -04:00
committed by Geoff Seemueller
parent 1055cda2f1
commit 497eb22ad8
218 changed files with 1273 additions and 4987 deletions

View File

@@ -0,0 +1,4 @@
// runs before anything else
import UserOptionsStore from "../stores/UserOptionsStore";
UserOptionsStore.initialize();

View File

@@ -0,0 +1,24 @@
import Routes from "../renderer/routes";
export { data };
export type Data = Awaited<ReturnType<typeof data>>;
import type { PageContextServer } from "vike/types";
// sets the window title depending on the route
const data = async (pageContext: PageContextServer) => {
const getTitle = (path) => {
return Routes[normalizePath(path)]?.heroLabel || "";
};
const normalizePath = (path) => {
if (!path) return "/";
if (path.length > 1 && path.endsWith("/")) {
path = path.slice(0, -1);
}
return path.toLowerCase();
};
return {
// The page's <title>
title: getTitle(pageContext.urlOriginal),
};
};

View File

@@ -0,0 +1,41 @@
// client error catcher
import { usePageContext } from "../../renderer/usePageContext";
import { Center, Text } from "@chakra-ui/react";
export { Page };
function Page() {
const pageContext = usePageContext();
let msg: string;
const { abortReason, abortStatusCode } = pageContext;
if (abortReason?.notAdmin) {
msg = "You cannot access this page because you aren't an administrator.";
} else if (typeof abortReason === "string") {
msg = abortReason;
} else if (abortStatusCode === 403) {
msg =
"You cannot access this page because you don't have enough privileges.";
} else if (abortStatusCode === 401) {
msg =
"You cannot access this page because you aren't logged in. Please log in.";
} else {
msg = pageContext.is404
? "This page doesn't exist."
: "Something went wrong. Try again (later).";
}
return (
<Center height="100vh">
<Text>{msg}</Text>
</Center>
);
}
declare global {
namespace Vike {
interface PageContext {
abortReason?: string | { notAdmin: true };
}
}
}

View File

@@ -0,0 +1,24 @@
import React from "react";
import { Box, VStack } from "@chakra-ui/react";
import ConnectComponent from "../../components/connect/ConnectComponent";
import { Fragment } from "react";
import { useIsMobile } from "../../components/contexts/MobileContext";
export default function ConnectPage() {
const isMobile = useIsMobile();
return (
<Fragment>
<VStack
minH={"100%"}
maxW={"40rem"}
align="start"
h={!isMobile ? "90vh" : "70vh"}
>
<Box maxW={"710px"} p={2} overflowY={"auto"} mt={isMobile ? 24 : 0}>
<ConnectComponent />
</Box>
</VStack>
</Fragment>
);
}

View File

@@ -0,0 +1,26 @@
import React, { useEffect } from "react";
import { Stack } from "@chakra-ui/react";
import Chat from "../../components/chat/Chat";
import clientChatStore from "../../stores/ClientChatStore";
import { getModelFamily } from "../../components/chat/lib/SupportedModels";
// renders "/"
export default function IndexPage() {
useEffect(() => {
try {
let model = localStorage.getItem("recentModel");
if (getModelFamily(model as string)) {
clientChatStore.setModel(model as string);
}
} catch (_) {
console.log("using default model");
}
}, []);
return (
<Stack direction="column" height="100%" width="100%" spacing={0}>
<Chat height="100%" width="100%" />
</Stack>
);
}

View File

@@ -0,0 +1,27 @@
import React, { Fragment } from "react";
import { Box, VStack } from "@chakra-ui/react";
import PrivacyPolicy from "../../components/legal/LegalDoc";
import privacy_policy from "./privacy_policy";
import { useIsMobile } from "../../components/contexts/MobileContext";
export default function Page() {
const isMobile = useIsMobile();
return (
<Fragment>
<VStack
width={"100%"}
align={"center"}
height={!isMobile ? "100%" : "100%"}
overflowX={"auto"}
>
<Box
overflowY={isMobile ? "scroll" : undefined}
maxH={!isMobile ? "70vh" : "89vh"}
mt={isMobile ? 24 : undefined}
>
<PrivacyPolicy text={privacy_policy} />
</Box>
</VStack>
</Fragment>
);
}

View File

@@ -0,0 +1,117 @@
const privacyPolicyUpdateDate = new Date().toISOString().split("T")[0];
export default `
### Privacy Policy
_Last Updated: ${privacyPolicyUpdateDate}_
This Privacy Policy describes how **geoff.seemueller.io LC** ("**we**", "**us**", or "**our**") collects, uses, and shares personal information when you visit or interact with **geoff.seemueller.io** (the "**Site**"). By accessing or using our Site, you agree to the collection and use of information in accordance with this policy.
---
### 1. Information We Collect
**a. Automatically Collected Information**
When you visit our Site, we automatically collect certain information about your device and interaction with the Site:
- **IP Address**: We collect your IP address to understand where our visitors are coming from and to enhance security.
- **Cookies and UUID**: We assign a unique identifier (UUID) to your device, stored in a cookie that expires in 30 years. This helps us recognize you on subsequent visits.
- **User Agent**: Information about your browser type, version, and operating system.
- **Referer**: The URL of the website that referred you to our Site.
- **Performance Metrics**: Page load time, DNS time, page download time, redirect response time, TCP connect time, server response time, DOM interactive time, and content loaded time.
- **Screen and Browser Information**: Screen resolution, viewport size, screen colors, document encoding, user language, and other similar data.
**b. Information Provided by You**
While we do not require you to provide personal information, any data you voluntarily submit through contact forms or other interactive features will be collected and processed in accordance with this Privacy Policy.
---
### 2. How We Use Your Information
We use the collected information for the following purposes:
- **Analytics and Performance Monitoring**: To analyze usage patterns and improve the functionality and user experience of our Site.
- **Security and Fraud Prevention**: To protect our Site and users from malicious activities.
- **Compliance with Legal Obligations**: To comply with applicable laws, regulations, and legal processes.
- **Personalization**: To remember your preferences and personalize your experience on our Site.
---
### 3. Cookies and Similar Technologies
We use cookies to enhance your browsing experience:
- **What Are Cookies?** Cookies are small text files stored on your device when you visit a website.
- **Purpose of Cookies**: We use a cookie to store your UUID, which helps us recognize your device on future visits.
- **Cookie Duration**: Our cookies expire after 30 years unless deleted by you.
- **Managing Cookies**: You can instruct your browser to refuse all cookies or to indicate when a cookie is being sent. However, some features of our Site may not function properly without cookies.
---
### 4. Sharing Your Information
We do not sell, trade, or rent your personal information to third parties.
---
### 5. Data Retention
We retain your personal information only for as long as necessary to fulfill the purposes outlined in this Privacy Policy:
- **UUID and Cookies**: Stored for up to 30 years unless you delete the cookie.
- **Log Data**: Retained for analytical and security purposes for a reasonable period or as required by law.
---
### 6. Your Rights and Choices
Depending on your jurisdiction, you may have the following rights regarding your personal information:
- **Access**: Request access to the personal data we hold about you.
- **Correction**: Request correction of inaccurate personal data.
- **Deletion**: Request deletion of your personal data.
- **Restriction**: Request restriction of processing your personal data.
- **Objection**: Object to the processing of your personal data.
- **Data Portability**: Request the transfer of your personal data to another party.
To exercise these rights, please contact us at **support@seemueller.io**. We may need to verify your identity before fulfilling your request.
---
### 7. Security Measures
We implement reasonable security measures to protect your personal information from unauthorized access, alteration, disclosure, or destruction. However, no method of transmission over the internet or electronic storage is 100% secure.
---
### 8. International Data Transfers
Your information may be transferred to and maintained on servers located outside of your state, province, country, or other governmental jurisdiction where data protection laws may differ. By providing your information, you consent to such transfers.
---
### 9. Children's Privacy
Our Site is not intended for individuals under the age of 16. We do not knowingly collect personal information from children under 16. If you believe we have collected such information, please contact us to delete it.
---
### 10. Third-Party Links
Our Site may contain links to external websites that are not operated by us. We have no control over and assume no responsibility for the content or privacy practices of these sites.
---
### 11. Changes to This Privacy Policy
We may update this Privacy Policy from time to time:
- **Notification**: Changes will be posted on this page with an updated "Last Updated" date.
- **Material Changes**: If significant changes are made, we will provide more prominent notice.
---
### 12. Contact Us
If you have any questions or concerns about this Privacy Policy or our data practices, please contact us:
- **Email**: support@seemueller.io
`;

View File

@@ -0,0 +1,27 @@
import React, { Fragment } from "react";
import { Box, VStack } from "@chakra-ui/react";
import TermsOfService from "../../components/legal/LegalDoc";
import terms_of_service from "./terms_of_service";
import { useIsMobile } from "../../components/contexts/MobileContext";
export default function Page() {
const isMobile = useIsMobile();
return (
<Fragment>
<VStack
width={"100%"}
align={"center"}
height={!isMobile ? "100%" : "100%"}
overflowX={"auto"}
>
<Box
overflowY={isMobile ? "scroll" : undefined}
maxH={!isMobile ? "70vh" : "89vh"}
mt={isMobile ? 24 : undefined}
>
<TermsOfService text={terms_of_service} />
</Box>
</VStack>
</Fragment>
);
}

View File

@@ -0,0 +1,107 @@
const tosUpdateDate = new Date().toISOString().split("T")[0];
export default `
### Terms of Service
_Last Updated: ${tosUpdateDate}_
Welcome to **geoff.seemueller.io** (the "Site"), operated by **geoff.seemueller.io LC** ("**we**", "**us**", or "**our**"). By accessing or using our Site, you agree to be bound by these Terms of Service ("Terms"). If you do not agree with these Terms, please do not use the Site.
---
### 1. Acceptance of Terms
By accessing or using the Site, you acknowledge that you have read, understood, and agree to be bound by these Terms and all applicable laws and regulations.
---
### 2. Use of the Site
**a. Eligibility**
You must be at least 16 years old to use this Site. By using the Site, you represent and warrant that you meet this requirement.
**b. Permitted Use**
You agree to use the Site solely for lawful purposes and in a way that does not infringe the rights of others or restrict or inhibit their use and enjoyment of the Site.
**c. Prohibited Activities**
You agree not to:
- Upload or transmit any harmful or malicious code.
- Interfere with the security or integrity of the Site.
- Use any automated means to access the Site without our permission.
- Attempt to gain unauthorized access to any portion of the Site.
---
### 3. Intellectual Property Rights
All content on the Site—including text, graphics, logos, images, and software—is the property of **geoff.seemueller.io LC** or its content suppliers and is protected by intellectual property laws. Unauthorized use of any materials on the Site may violate copyright, trademark, and other laws.
---
### 4. User Content
**a. Submissions**
Any content you submit to the Site, such as comments or feedback, is your responsibility. By submitting content, you grant us a non-exclusive, royalty-free, worldwide license to use, reproduce, modify, and display such content.
**b. Content Standards**
Your submitted content must not be unlawful, threatening, defamatory, obscene, or otherwise objectionable.
---
### 5. Disclaimer of Warranties
The Site is provided on an "as is" and "as available" basis. We make no warranties, express or implied, regarding the Site's operation or the information, content, or materials included.
---
### 6. Limitation of Liability
In no event shall **geoff.seemueller.io LC** or its affiliates be liable for any indirect, incidental, special, consequential, or punitive damages arising out of or related to your use of the Site.
---
### 7. Indemnification
You agree to indemnify, defend, and hold harmless **geoff.seemueller.io LC** and its affiliates from any claims, liabilities, damages, losses, or expenses arising from your use of the Site or violation of these Terms.
---
### 8. Modifications to the Terms
We reserve the right to modify these Terms at any time:
- **Notification**: Changes will be posted on this page with an updated "Last Updated" date.
- **Continued Use**: Your continued use of the Site after any changes signifies your acceptance of the new Terms.
---
### 9. Governing Law
These Terms are governed by and construed in accordance with the laws of the jurisdiction in which **geoff.seemueller.io LC** operates, without regard to its conflict of law principles.
---
### 10. Severability
If any provision of these Terms is found to be invalid or unenforceable, the remaining provisions shall remain in full force and effect.
---
### 11. Entire Agreement
These Terms constitute the entire agreement between you and **geoff.seemueller.io LC** regarding your use of the Site and supersede all prior agreements.
---
### 12. Contact Information
If you have any questions or concerns about these Terms, please contact us:
- **Email**: support@seemueller.io
`;