Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
5bd8737
✨ feat(website): add LinkedIn links and reorganize social links
Mar 16, 2026
91aac82
🐛 fix(website): pass className prop to submit button in FormRoot
Mar 16, 2026
9c38103
💄 style(website): refine inputPassword and inputToggle styling
Mar 16, 2026
4abb0ac
✨ feat(website): add responsive mobile layout with collapsible sideba…
Mar 16, 2026
5e5eee2
💄 style: refine branding and UI component styling
Mar 17, 2026
2458fab
✨ feat(website): restructure accounting docs into nested sub-sections
Mar 17, 2026
d199981
♻️ refactor(website): reorganize accounting docs into nested director…
Mar 18, 2026
940157a
✨ feat(website): add journal entry examples and summary account banne…
Mar 19, 2026
66b4840
✨ feat(website): add source citations to all accounting documentation…
Mar 19, 2026
fe55763
✨ feat(website): add SEO meta tags, structured data, and refactor doc…
Mar 20, 2026
51393b1
✨ feat(website): add 404 not found page with navigation links
Mar 20, 2026
a79d07d
♻️ refactor(website): consolidate account pages and inline all derive…
Mar 22, 2026
d126edd
♻️ refactor(website): remove PracticalUsageSection and merge usage ti…
Mar 22, 2026
8cd9e2a
✨ feat(website): enable scroll restoration on application router
Mar 22, 2026
e37d47f
🐛 fix(nginx): separate cache policy for unhashed public assets
Mar 23, 2026
56b4ca3
♻️ refactor: rename record/recordRow/recordLabel domain models to ent…
Mar 24, 2026
2e8d8ff
♻️ refactor(website): improve accounting docs with glossary enhanceme…
Mar 24, 2026
0b86289
♻️ refactor(website): extract tab navigation into layout routes with …
Mar 25, 2026
67eedcd
⚡️ perf(website): optimize virtualizer and accounts table rendering
Mar 26, 2026
e7552fb
✨ feat(website): add FEC documentation page and link to FEC validator
Mar 26, 2026
bc085d7
✨ feat: add admin panel, ticket system, and restructure user models
Mar 26, 2026
3de3d98
♻️ refactor: move shared components to ui package and restructure adm…
Mar 30, 2026
89f6922
✨ feat(agent): add dashboard assistant with api and website integration
Mar 31, 2026
b5b8709
✨ feat(agent): redesign agent UI, add session search and AI documenta…
Apr 1, 2026
7e9917a
♻️ refactor(agent): consolidate new-session UI into AgentChat and res…
Apr 2, 2026
9cdb906
feat(agent): add worker-driven sessions and org-scoped dashboard chat
Apr 9, 2026
eeea3cd
refactor(agent): merge user+assistant into single row, fix SSE stream…
Apr 13, 2026
93f79b7
chore: rename .workflows/.dev to dev and .build to build
Apr 13, 2026
8388b47
feat: add premium OCR flow with markdown output and UTF-8 fixes
Apr 13, 2026
4ffc618
feat: add org usage quotas and unify subscription restart flow
Apr 13, 2026
a6b80de
refactor: replace delete modal and add subscription resume confirmation
Apr 14, 2026
dfacc43
feat(agent): file import with OCR, entry dedup, context limit warning…
Apr 14, 2026
eac797d
✨ feat: add report filters by journal/category, refactor combobox com…
Apr 15, 2026
edf45a7
feat: add user profile page with email/password change, delete accoun…
Apr 15, 2026
7d1da67
feat: subagent delegation, token billing, session-level files, tool t…
Apr 16, 2026
5dc72d5
fix: handle nullable idYear in file routes and fix lint issues
Apr 17, 2026
ff36056
feat(agent): @ mentions and file attachments in chat input
Apr 20, 2026
1d47083
feat: add defineEntryTemplate system and agent tool
Apr 20, 2026
e4aab4a
fix(agent-ui): unify pending file chips and send-time upload flow
Apr 21, 2026
8419808
feat: add FEC import and refactor agent message schema
Apr 21, 2026
e8fc3ac
feat(entries): add reverse entry action with dropdown menu
Apr 21, 2026
bf23950
chore(ui): align button and overlay component formatting
Apr 21, 2026
6b7e8bf
feat(ui): add column visibility controls and polish table actions
Apr 21, 2026
af37757
feat(files): drag-and-drop reorder, move dialogs, and upload deduplic…
Apr 22, 2026
1f8877e
feat(table): row selection with custom checkbox and perf fix
Apr 22, 2026
291e81f
feat(docs): global search with virtual index generated from source
Apr 22, 2026
73e2108
chore: biome import ordering and formatting fixes
Apr 22, 2026
5a838c9
Refactor organization billing and payment flows
Apr 24, 2026
8f72ee4
Refactor billing flows and invoice references across API/website
Apr 29, 2026
5275bc1
refactor: unify user tables and add UBL invoicing/admin updates
May 4, 2026
18755e5
Refactor billing domain and add password reset route
May 4, 2026
906f46b
feat: replace server-side document reports with client-side PDF and XML
May 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
14 changes: 7 additions & 7 deletions .agents/AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# Agent Guidelines

## Commands
- Build all: `pnpm build` Dev all: `pnpm dev` Docker: `just dev up` / `just dev down` / `just dev reset`
- CI build (local): `just build` runs Biome check + build in Docker (no Node.js required on host)
- Lint all: `pnpm check` (runs Biome check) Fix: `pnpm check:fix`
- Format all: `pnpm format` Fix: `pnpm format:fix`
- Lint only: `pnpm lint` Fix: `pnpm lint:fix`
- Build all: `pnpm build` - Dev all: `pnpm dev` - Docker: `just dev up` / `just dev down` / `just dev reset`
- CI build (local): `just build` - runs Biome check + build in Docker (no Node.js required on host)
- Lint all: `pnpm check` (runs Biome check) - Fix: `pnpm check:fix`
- Format all: `pnpm format` - Fix: `pnpm format:fix`
- Lint only: `pnpm lint` - Fix: `pnpm lint:fix`
- Typecheck website: `packages/website/node_modules/.bin/tsc --noEmit --project packages/website/tsconfig.json`
- No test framework exists in this repository.

## Monorepo Layout
`packages/{api, website, metadata, tools, ui}` all ESM (`"type": "module"`), TypeScript strict mode.
`packages/{api, website, metadata, tools, ui}` - all ESM (`"type": "module"`), TypeScript strict mode.
- **api** (`@arrhes/application-api`): Hono backend, Drizzle ORM, PostgreSQL, Nodemailer, Puppeteer, S3
- **website** (`@arrhes/application-website`): React 19, TanStack Router/Query/Table, React Hook Form, Radix UI primitives, Panda CSS
- **metadata** (`@arrhes/application-metadata`): Shared models, schemas (valibot), route definitions. Consumed via subpath exports (`@arrhes/application-metadata/models`, `/schemas`, `/routes`, `/components`)
Expand All @@ -22,7 +22,7 @@
- **Files**: all `camelCase.ts[x]` (including components). Barrel files are `_index.ts`.
- **Exports**: components `PascalCase` functions, models/schemas/utilities `camelCase`. Models use `Model` suffix (`accountModel`), schemas have no suffix.
- **Components**: one exported React component per file. Private helper functions are fine in the same file, but not other components.
- **Validation**: `import * as v from "valibot"` use `v.object()`, `v.string()`, `v.InferOutput<>`.
- **Validation**: `import * as v from "valibot"` - use `v.object()`, `v.string()`, `v.InferOutput<>`.
- **Styling**: Panda CSS via `css()` and `cx()` from `@arrhes/ui/utilities/cn.js`.
- **IDs**: nanoid with custom alphabet, 16 chars.
- **Error handling**: try/catch with structured logging in API; toast notifications in website; structured error responses via Hono.
6 changes: 3 additions & 3 deletions .github/workflows/publish-packages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,14 @@ jobs:
VITE_API_BASE_URL: ${{ vars.VITE_API_BASE_URL }}
VITE_WEBSITE_BASE_URL: ${{ vars.VITE_WEBSITE_BASE_URL }}
run: |
docker compose -f .workflows/.build/compose.yml build ci
docker compose -f .workflows/.build/compose.yml build api website
docker compose -f .workflows/build/compose.yml build ci
docker compose -f .workflows/build/compose.yml build api website admin

- name: Tag and push images
env:
VERSION: ${{ steps.version.outputs.version }}
run: |
IMAGES=("api" "website")
IMAGES=("api" "website" "admin")

for img in "${IMAGES[@]}"; do
SRC="arrhes-${img}:${VERSION}"
Expand Down
9 changes: 5 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@ build
.continue
.old
.vscode
.agents

.pnpm-store
.pnpm-store

*.tsbuildinfo

styled-system

test-results
styled-system
test-results
playwright-report
19 changes: 14 additions & 5 deletions .workflows/.build/compose.yml → .workflows/build/compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,38 @@
# ci - Lint + unit tests + build (gate before packaging)
# api - Production API image
# website - Production Website image (nginx + static)
# admin - Production Admin image (nginx + static)
#
# Usage:
# docker compose -f .workflows/.build/compose.yml build ci
# docker compose -f .workflows/.build/compose.yml build api website
# docker compose -f .workflows/build/compose.yml build ci
# docker compose -f .workflows/build/compose.yml build api website admin
# ==============================================================================

services:
ci:
build:
context: ../..
dockerfile: .workflows/.build/packages/ci/Dockerfile
dockerfile: .workflows/build/packages/ci/Dockerfile

api:
image: arrhes-api:${ARRHES_VERSION:-dev}
build:
context: ../..
dockerfile: .workflows/.build/packages/api/Dockerfile
dockerfile: .workflows/build/packages/api/Dockerfile

website:
image: arrhes-website:${ARRHES_VERSION:-dev}
build:
context: ../..
dockerfile: .workflows/.build/packages/website/Dockerfile
dockerfile: .workflows/build/packages/website/Dockerfile
args:
- VITE_WEBSITE_BASE_URL=${VITE_WEBSITE_BASE_URL:-}
- VITE_API_BASE_URL=${VITE_API_BASE_URL:-}

admin:
image: arrhes-admin:${ARRHES_VERSION:-dev}
build:
context: ../..
dockerfile: .workflows/build/packages/admin/Dockerfile
args:
- VITE_API_BASE_URL=${VITE_API_BASE_URL:-}
31 changes: 31 additions & 0 deletions .workflows/build/packages/admin/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Use an official Node.js image to build our image from
FROM node:25-alpine AS base
RUN npm install -g pnpm@10.26.1
ENV NODE_OPTIONS="--max-old-space-size=4096"

# Build the repo
FROM base AS build

# Build arguments for Vite environment variables
ARG VITE_API_BASE_URL

WORKDIR /root
COPY . .
RUN pnpm install

# Write VITE_* build args to .env so Vite can read them during build.
# Vite reads import.meta.env from .env files, not from process.env.
RUN printf "VITE_API_BASE_URL=%s\n" \
"$VITE_API_BASE_URL" \
> packages/admin/.env

RUN pnpm run build

# Start application
FROM nginx:alpine AS deploy
WORKDIR /
COPY .workflows/build/packages/admin/nginx/default.conf /etc/nginx/nginx.conf
RUN rm -rf /usr/share/nginx/html/*
COPY --from=build /root/packages/admin/build /usr/share/nginx/html
EXPOSE 3102
CMD ["nginx"]
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ http {
index index.html;

# Immutable hashed assets (JS, CSS, fonts, images) - cache for 1 year
location ~* \.(?:js|css|woff2?|ttf|eot|svg|png|jpg|jpeg|gif|webp|ico|webmanifest)$ {
location ~* \.(?:js|css|woff2?|ttf|eot|svg|png|jpg|jpeg|gif|webp|webmanifest)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
try_files $uri =404;
}
Expand All @@ -37,4 +37,4 @@ http {
try_files $uri $uri/ /index.html =404;
}
}
}
}
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ RUN pnpm install --frozen-lockfile
# Build all packages (must run before tests so workspace deps are compiled)
RUN pnpm run build

# Run Biome check (lint + format)
RUN pnpm check
# Auto-format, then run Biome check (lint)
RUN pnpm format:fix && pnpm check

# Run unit tests
RUN pnpm --recursive --if-present --filter='./packages/**' run test:unit
17 changes: 17 additions & 0 deletions .workflows/build/packages/website/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Include any files or directories that you don't want to be copied to your
# container here (e.g., local build artifacts, temporary files, etc.).
#
# For more help, visit the .dockerignore file reference guide at
# https://docs.docker.com/go/build-context-dockerignore/

**/.dockerignore
**/.env
**/.vscode
**/.git
**/.gitignore
**/docker-compose*
**/compose*
**/Dockerfile*
**/node_modules
**/build
README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ RUN pnpm run build
# Start application
FROM nginx:alpine AS deploy
WORKDIR /
COPY .workflows/.build/packages/website/nginx/default.conf /etc/nginx/nginx.conf
COPY .workflows/build/packages/website/nginx/default.conf /etc/nginx/nginx.conf
RUN rm -rf /usr/share/nginx/html/*
COPY --from=build /root/packages/website/build /usr/share/nginx/html
EXPOSE 3101
Expand Down
45 changes: 45 additions & 0 deletions .workflows/build/packages/website/nginx/default.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# default.conf
worker_processes auto;

daemon off;

events {
worker_connections 1024;
}

http {
include mime.types;

server {
listen 80;

gzip on;
gzip_http_version 1.1;
gzip_disable "MSIE6";
gzip_min_length 256;
gzip_vary on;
gzip_proxied any;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript font/woff2;
gzip_comp_level 9;

root /usr/share/nginx/html;
index index.html;

# Unhashed public assets (favicon, OG images) - cache for 1 day
location = /favicon.ico { add_header Cache-Control "public, max-age=86400"; try_files $uri =404; }
location = /og.png { add_header Cache-Control "public, max-age=86400"; try_files $uri =404; }
location = /og.webp { add_header Cache-Control "public, max-age=86400"; try_files $uri =404; }

# Immutable hashed assets (JS, CSS, fonts, images) - cache for 1 year
location ~* \.(?:js|css|woff2?|ttf|eot|svg|png|jpg|jpeg|gif|webp|webmanifest)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
try_files $uri =404;
}

# HTML and other mutable files - always revalidate
location / {
add_header Cache-Control "no-cache";
try_files $uri $uri/ /index.html =404;
}
}
}
File renamed without changes.
26 changes: 13 additions & 13 deletions .workflows/.dev/README.md → .workflows/dev/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Docker-based development environment for the Arrhes application.
## Architecture

```
.workflows/.dev/
.workflows/dev/
├── compose.yml # Docker Compose config (services + env vars)
├── compose.tunnel.yml # Cloudflare tunnel overlay
├── .dockerignore # Build context exclusions
Expand Down Expand Up @@ -63,30 +63,30 @@ pnpm install
just dev up

# Or with Docker Compose directly
docker compose -f .workflows/.dev/compose.yml up -d
docker compose -f .workflows/dev/compose.yml up -d
```

### Rebuild images (after Node.js or PNPM version changes)
```bash
docker compose -f .workflows/.dev/compose.yml build
docker compose -f .workflows/.dev/compose.yml up -d
docker compose -f .workflows/dev/compose.yml build
docker compose -f .workflows/dev/compose.yml up -d
```

### View logs
```bash
# All services
docker compose -f .workflows/.dev/compose.yml logs -f
docker compose -f .workflows/dev/compose.yml logs -f

# Specific service
docker compose -f .workflows/.dev/compose.yml logs -f api
docker compose -f .workflows/dev/compose.yml logs -f api
```

### Stop services
```bash
just dev down

# Or with Docker Compose directly
docker compose -f .workflows/.dev/compose.yml down
docker compose -f .workflows/dev/compose.yml down
```

### Reset database
Expand All @@ -96,7 +96,7 @@ just dev reset

### Access running containers
```bash
docker compose -f .workflows/.dev/compose.yml exec api bash
docker compose -f .workflows/dev/compose.yml exec api bash
```

## How It Works
Expand Down Expand Up @@ -133,20 +133,20 @@ lsof -i :3000
pnpm install

# Restart containers to pick up changes
docker compose -f .workflows/.dev/compose.yml restart api
docker compose -f .workflows/dev/compose.yml restart api
```

### Database reset
```bash
# Remove database volume (WARNING: deletes all data)
docker compose -f .workflows/.dev/compose.yml down
docker compose -f .workflows/dev/compose.yml down
docker volume rm application_postgres_data
docker compose -f .workflows/.dev/compose.yml up -d
docker compose -f .workflows/dev/compose.yml up -d
```

### Clean slate
```bash
# Remove all containers and volumes, then rebuild
docker compose -f .workflows/.dev/compose.yml down -v
docker compose -f .workflows/.dev/compose.yml up -d --build
docker compose -f .workflows/dev/compose.yml down -v
docker compose -f .workflows/dev/compose.yml up -d --build
```
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
# 2. Waits for cloudflared to print the *.trycloudflare.com URL
# 3. Starts all remaining services with API_BASE_URL set to the tunnel URL
#
# The tunnel container does NOT depend on the API cloudflared establishes
# The tunnel container does NOT depend on the API - cloudflared establishes
# the tunnel immediately and retries backend connections as needed.
# ==============================================================================

Expand Down
Loading
Loading