Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ OPENROUTER_API_KEY=CHANGEME
# === Integrations ===

# === Integrations: Linear ===
# Get key at: https://linear.app/agentic-engineering-agency/settings/api
# Dashboard: https://linear.app/agentic-engineering-agency/team/TRI/all
LINEAR_API_KEY=CHANGEME
GITHUB_TOKEN=CHANGEME # GitHub PAT for PR comments (repo scope)

Expand All @@ -36,9 +38,18 @@ RESEND_API_KEY=CHANGEME
RESEND_FROM_EMAIL=triage@agenticengineering.lat

# === Integrations: Slack ===
# Create a Slack app at https://api.slack.com/apps — Bot Token Scopes: chat:write
SLACK_BOT_TOKEN=CHANGEME
# Default channel ID for triage notifications (e.g. C07XXXXXXXX or D0XXXXXXXX for DMs)
SLACK_CHANNEL_ID=CHANGEME
# Signing secret from Slack app settings (for webhook verification)
SLACK_SIGNING_SECRET=CHANGEME
# Team member Slack user IDs (for @mentions in notifications)
# Find IDs: click a user profile in Slack → "..." → "Copy member ID"
SLACK_USER_FERNANDO=
SLACK_USER_KOKI=
SLACK_USER_CHENKO=
SLACK_USER_LALO=

# === Integrations: Jira ===
JIRA_BASE_URL=https://your-domain.atlassian.net
Expand Down Expand Up @@ -99,3 +110,11 @@ CADDY_PORT=3001
RUNTIME_HOST=runtime
RUNTIME_PORT=4111

t SPA) or dev (proxies to Vite HMR)
FRONTEND_MODE=static

# === Caddy ===
CADDY_PORT=3001
RUNTIME_HOST=runtime
RUNTIME_PORT=4111

14 changes: 14 additions & 0 deletions Caddyfile
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,20 @@
}
}

# Project management API — only proxy XHR/fetch (not browser navigation)
@projects_api {
path /projects /projects/*
header Accept *application/json*
}
handle @projects_api {
reverse_proxy runtime:4111
}

# Webhook callbacks (Linear, manual resume, etc.)
handle /webhooks/* {
reverse_proxy runtime:4111
}

# Frontend: static or dev mode
handle {
import {$FRONTEND_MODE:static}-frontend
Expand Down
2 changes: 2 additions & 0 deletions Dockerfile.runtime
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Stage 1: Builder
FROM node:22-alpine AS builder
RUN apk add --no-cache git && npm install -g pnpm
WORKDIR /app
COPY . .
RUN if [ -f runtime/src/mastra/index.ts ]; then \
Expand All @@ -13,6 +14,7 @@ RUN if [ -f runtime/src/mastra/index.ts ]; then \

# Stage 2: Production
FROM node:22-alpine
RUN apk add --no-cache git
WORKDIR /app
COPY --from=builder /app/output/ ./
COPY runtime/init-db.mjs ./init-db.mjs
Expand Down
5 changes: 1 addition & 4 deletions docker-compose.override.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ services:
- "127.0.0.1:5173:5173"
volumes:
- ./frontend:/app
- vite_node_modules:/app/node_modules
- /app/node_modules
networks:
- app

Expand All @@ -34,6 +34,3 @@ services:
volumes:
- ./runtime/src:/app/runtime/src
- ./runtime/init-db.mjs:/app/runtime/init-db.mjs

volumes:
vite_node_modules:
22 changes: 9 additions & 13 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ services:
SQLD_HTTP_LISTEN_ADDR: 0.0.0.0:8080
SQLD_GRPC_LISTEN_ADDR: 0.0.0.0:5001
volumes:
- libsql_data:/var/lib/sqld
- /var/lib/sqld
healthcheck:
test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/127.0.0.1/8080'"]
interval: 10s
Expand Down Expand Up @@ -179,8 +179,8 @@ services:
retries: 3
start_period: 30s
volumes:
- langfuse_clickhouse_data:/var/lib/clickhouse
- langfuse_clickhouse_logs:/var/log/clickhouse-server
- /var/lib/clickhouse
- /var/log/clickhouse-server
restart: always
networks:
- langfuse
Expand All @@ -196,7 +196,7 @@ services:
timeout: 5s
retries: 3
volumes:
- langfuse_redis_data:/data
- /data
restart: always
networks:
- langfuse
Expand All @@ -214,7 +214,7 @@ services:
timeout: 5s
retries: 3
volumes:
- langfuse_minio_data:/data
- /data
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minio}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
Expand All @@ -232,7 +232,7 @@ services:
timeout: 5s
retries: 3
volumes:
- langfuse_postgres_data:/var/lib/postgresql/data
- /var/lib/postgresql/data
environment:
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
Expand Down Expand Up @@ -261,10 +261,6 @@ networks:
langfuse:
driver: bridge

volumes:
libsql_data:
langfuse_postgres_data:
langfuse_clickhouse_data:
langfuse_clickhouse_logs:
langfuse_minio_data:
langfuse_redis_data:

# No named volumes — all data is ephemeral (recreated on restart).
# Wiki vectors regenerate via Projects page, Langfuse auto-seeds from env vars.
37 changes: 35 additions & 2 deletions frontend/src/routeTree.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,19 @@ import { Route as ChatRouteImport } from './routes/chat'
import { Route as IndexRouteImport } from './routes/index'

const SettingsLazyRouteImport = createFileRoute('/settings')()
const ProjectsLazyRouteImport = createFileRoute('/projects')()
const BoardLazyRouteImport = createFileRoute('/board')()

const SettingsLazyRoute = SettingsLazyRouteImport.update({
id: '/settings',
path: '/settings',
getParentRoute: () => rootRouteImport,
} as any).lazy(() => import('./routes/settings.lazy').then((d) => d.Route))
const ProjectsLazyRoute = ProjectsLazyRouteImport.update({
id: '/projects',
path: '/projects',
getParentRoute: () => rootRouteImport,
} as any).lazy(() => import('./routes/projects.lazy').then((d) => d.Route))
const BoardLazyRoute = BoardLazyRouteImport.update({
id: '/board',
path: '/board',
Expand Down Expand Up @@ -56,6 +62,7 @@ export interface FileRoutesByFullPath {
'/login': typeof LoginRoute
'/register': typeof RegisterRoute
'/board': typeof BoardLazyRoute
'/projects': typeof ProjectsLazyRoute
'/settings': typeof SettingsLazyRoute
}
export interface FileRoutesByTo {
Expand All @@ -64,6 +71,7 @@ export interface FileRoutesByTo {
'/login': typeof LoginRoute
'/register': typeof RegisterRoute
'/board': typeof BoardLazyRoute
'/projects': typeof ProjectsLazyRoute
'/settings': typeof SettingsLazyRoute
}
export interface FileRoutesById {
Expand All @@ -73,20 +81,36 @@ export interface FileRoutesById {
'/login': typeof LoginRoute
'/register': typeof RegisterRoute
'/board': typeof BoardLazyRoute
'/projects': typeof ProjectsLazyRoute
'/settings': typeof SettingsLazyRoute
}
export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
fullPaths: '/' | '/chat' | '/login' | '/register' | '/board' | '/settings'
fullPaths:
| '/'
| '/chat'
| '/login'
| '/register'
| '/board'
| '/projects'
| '/settings'
fileRoutesByTo: FileRoutesByTo
to: '/' | '/chat' | '/login' | '/register' | '/board' | '/settings'
to:
| '/'
| '/chat'
| '/login'
| '/register'
| '/board'
| '/projects'
| '/settings'
id:
| '__root__'
| '/'
| '/chat'
| '/login'
| '/register'
| '/board'
| '/projects'
| '/settings'
fileRoutesById: FileRoutesById
}
Expand All @@ -96,6 +120,7 @@ export interface RootRouteChildren {
LoginRoute: typeof LoginRoute
RegisterRoute: typeof RegisterRoute
BoardLazyRoute: typeof BoardLazyRoute
ProjectsLazyRoute: typeof ProjectsLazyRoute
SettingsLazyRoute: typeof SettingsLazyRoute
}

Expand All @@ -108,6 +133,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof SettingsLazyRouteImport
parentRoute: typeof rootRouteImport
}
'/projects': {
id: '/projects'
path: '/projects'
fullPath: '/projects'
preLoaderRoute: typeof ProjectsLazyRouteImport
parentRoute: typeof rootRouteImport
}
'/board': {
id: '/board'
path: '/board'
Expand Down Expand Up @@ -152,6 +184,7 @@ const rootRouteChildren: RootRouteChildren = {
LoginRoute: LoginRoute,
RegisterRoute: RegisterRoute,
BoardLazyRoute: BoardLazyRoute,
ProjectsLazyRoute: ProjectsLazyRoute,
SettingsLazyRoute: SettingsLazyRoute,
}
export const routeTree = rootRouteImport
Expand Down
5 changes: 4 additions & 1 deletion frontend/src/routes/__root.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { createRootRoute, Link, Navigate, Outlet, useLocation, useNavigate } from "@tanstack/react-router"
import { TanStackRouterDevtools } from "@tanstack/router-devtools"
import { MessageSquare, LayoutGrid, Settings, Sun, Moon, LogOut, Plus, Trash2, Activity } from "lucide-react"
import { MessageSquare, LayoutGrid, Settings, Sun, Moon, FolderGit2, LogOut, Plus, Trash2, Activity } from "lucide-react"
import { useAuth, signOut } from "@/hooks/use-auth"
import { useTheme } from "@/components/theme-provider"
import { ConversationProvider, useConversations } from "@/hooks/use-conversations"
Expand Down Expand Up @@ -98,6 +98,9 @@ function AuthenticatedLayout() {
<NavLink to="/board" icon={<LayoutGrid className="h-4 w-4" />}>
Board
</NavLink>
<NavLink to="/projects" icon={<FolderGit2 className="h-4 w-4" />}>
Projects
</NavLink>
<NavLink to="/settings" icon={<Settings className="h-4 w-4" />}>
Settings
</NavLink>
Expand Down
Loading