27 isEmailAlreadyInvited,
28 isEmailAlreadyParticipant
29} from "../database/queries.ts";
30
31const api = new Hono();
274 }
275
276 // Add user message to database
277 const userMessage = await addMessage(currentConversationId, 'user', message);
278
305 }
306
307 // Add assistant message to database
308 const assistantMessage = await addMessage(currentConversationId, 'assistant', assistantResponse);
309
1# Backend
2
3Hono-based API server with LastLogin authentication, SQLite database, and group chat functionality.
4
5## Structure
6
7- `index.ts` - Main HTTP handler with LastLogin wrapper
8- `database/` - Database migrations and query functions
9- `routes/` - API route handlers
10
34- `GET /api/conversations/:id/stream` - Server-Sent Events for real-time updates
35
36## Database Schema
37
38### Core Tables
39- **Backend**: Hono, LastLogin auth, SQLite, OpenAI, Server-Sent Events
40- **Frontend**: React, TailwindCSS, Real-time SSE connections
41- **Database**: SQLite with participant and invitation tables
42
43## Getting Started
2import { lastlogin } from "https://esm.town/v/stevekrouse/lastlogin_safe";
3import { readFile, serveFile } from "https://esm.town/v/std/utils@85-main/index.ts";
4import { runMigrations } from "./database/migrations.ts";
5import api from "./routes/api.ts";
6
10app.onError((err) => Promise.reject(err));
11
12// Run database migrations on startup
13await runMigrations();
14
71 `);
72
73 console.log('Database migrations completed');
74}
90 // ---- Query Firestore publicLenses ----
91 const pubDocRes = await fetch(
92 `https://firestore.googleapis.com/v1/projects/${projectId}/databases/(default)/documents/publicLenses/${id}`,
93 { headers: { Authorization: `Bearer ${access_token}` } },
94 );
106 // ---- Query Firestore private user doc ----
107 const privDocRes = await fetch(
108 `https://firestore.googleapis.com/v1/projects/${projectId}/databases/(default)/documents/users/${owner}/lenses/${id}`,
109 { headers: { Authorization: `Bearer ${access_token}` } },
110 );
53- `POST /api/threads/:id/messages` - Send message and get AI response
54
55## Database Schema
56
57**Tables:**
11app.onError((err) => Promise.reject(err));
12
13// Initialize database tables
14async function initDatabase() {
15 // Create threads table
16 await sqlite.execute(`
37}
38
39// Initialize database on startup
40await initDatabase();
41
42// Serve static files
9- [ ] make it one click to branch off like old jp townie demos
10- [ ] opentownie as a pr bot
11- [ ] give it the ability to see its own client-side and server-side logs by building a middleware that shoves them into a SQL light database date and then give it a tool to access them
12- [ ] do a browser use or screenshot thing to give it access to its own visual output
13- [ ] Have it default to creating a new branch off main
7export const thinkTool = tool({
8 description:
9 "Use the tool to think about something. It will not obtain new information or change the database, but just append the thought to the log. Use it when complex reasoning or some cache memory is needed.",
10 parameters: z.object({
11 thought: z.string().describe("A thought to think about."),