feat(infra,database): DO deploy + memory schema
infra: Dockerfile (backend from monorepo root) + DigitalOcean App Platform spec with health check and secret env vars. database: MongoDB Atlas + Voyage vector-memory schema and the continual-learning loop notes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,32 @@
|
|||||||
|
# database
|
||||||
|
|
||||||
|
Continual-learning memory for PodMan: **MongoDB Atlas** for the team model and
|
||||||
|
outcomes, **Voyage** embeddings for vector recall. This is what makes PodMan
|
||||||
|
"more useful the more you use it" (the track requirement).
|
||||||
|
|
||||||
|
## Collections
|
||||||
|
|
||||||
|
| Collection | Holds | Notes |
|
||||||
|
| ---------------- | ---------------------------------------------- | ----------------------------- |
|
||||||
|
| `pods` | `Pod` docs (members, repo) | one per pod |
|
||||||
|
| `observations` | `EngineerContext` snapshots over time | sampled, append-only |
|
||||||
|
| `collisions` | detected `Collision`s | for replay + precision tuning |
|
||||||
|
| `interventions` | `Intervention`s + outcome (accepted/dismissed) | drives the self-tuning policy |
|
||||||
|
| `memory_vectors` | Voyage embeddings of file/feature notes | Atlas Vector Search index |
|
||||||
|
|
||||||
|
Types live in [`shared/`](../shared/src). Each engineer/file/feature note is
|
||||||
|
embedded with Voyage and stored alongside its source doc for retrieval by the
|
||||||
|
PodMan brain.
|
||||||
|
|
||||||
|
## The continual-learning loop
|
||||||
|
|
||||||
|
1. **Observe** → write `observations`.
|
||||||
|
2. **Store** → embed notes into `memory_vectors`.
|
||||||
|
3. **Predict** → collision detector + brain decide whether to intervene.
|
||||||
|
4. **Outcome** → update the `interventions` doc with accepted/dismissed.
|
||||||
|
5. **Adapt** → tune thresholds + ownership attribution from outcomes.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
Create an Atlas cluster + a Vector Search index on `memory_vectors.embedding`,
|
||||||
|
then set `MONGODB_URI` and `VOYAGE_API_KEY` in `.env`.
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# PodMan backend agent — built from the monorepo root.
|
||||||
|
# Build: docker build -f infra/Dockerfile -t podman-backend .
|
||||||
|
FROM node:24-slim AS base
|
||||||
|
ENV PNPM_HOME=/pnpm
|
||||||
|
ENV PATH="$PNPM_HOME:$PATH"
|
||||||
|
RUN corepack enable
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Install workspace deps (cached on lockfile)
|
||||||
|
FROM base AS deps
|
||||||
|
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./
|
||||||
|
COPY shared/package.json shared/
|
||||||
|
COPY backend/package.json backend/
|
||||||
|
RUN pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
# Build shared + backend
|
||||||
|
FROM deps AS build
|
||||||
|
COPY . .
|
||||||
|
RUN pnpm --filter @podman/shared build && pnpm --filter @podman/backend build
|
||||||
|
|
||||||
|
# Runtime
|
||||||
|
FROM base AS runtime
|
||||||
|
ENV NODE_ENV=production
|
||||||
|
COPY --from=build /app /app
|
||||||
|
EXPOSE 8787
|
||||||
|
CMD ["node", "backend/dist/index.js"]
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# infra
|
||||||
|
|
||||||
|
Deploy targets for PodMan (DigitalOcean prize track).
|
||||||
|
|
||||||
|
- `Dockerfile` — builds the backend agent from the monorepo root.
|
||||||
|
- `app.yaml` — DigitalOcean App Platform spec (auto-deploy on push to `main`).
|
||||||
|
|
||||||
|
## Local container
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build -f infra/Dockerfile -t podman-backend .
|
||||||
|
docker run --env-file .env -p 8787:8787 podman-backend
|
||||||
|
```
|
||||||
|
|
||||||
|
## DigitalOcean
|
||||||
|
|
||||||
|
```bash
|
||||||
|
doctl apps create --spec infra/app.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Set the `SECRET` env vars (LiveKit, Gemini, GitHub, Atlas, Voyage) in the DO
|
||||||
|
dashboard or via `doctl` after the app is created.
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# DigitalOcean App Platform spec for the PodMan backend.
|
||||||
|
# Deploy: doctl apps create --spec infra/app.yaml
|
||||||
|
name: podman
|
||||||
|
region: nyc
|
||||||
|
services:
|
||||||
|
- name: backend
|
||||||
|
dockerfile_path: infra/Dockerfile
|
||||||
|
source_dir: /
|
||||||
|
github:
|
||||||
|
repo: karti-ai/podman
|
||||||
|
branch: main
|
||||||
|
deploy_on_push: true
|
||||||
|
http_port: 8787
|
||||||
|
instance_size_slug: basic-xxs
|
||||||
|
instance_count: 1
|
||||||
|
health_check:
|
||||||
|
http_path: /health
|
||||||
|
envs:
|
||||||
|
- { key: LIVEKIT_URL, scope: RUN_TIME }
|
||||||
|
- { key: LIVEKIT_API_KEY, scope: RUN_TIME, type: SECRET }
|
||||||
|
- { key: LIVEKIT_API_SECRET, scope: RUN_TIME, type: SECRET }
|
||||||
|
- { key: GEMINI_API_KEY, scope: RUN_TIME, type: SECRET }
|
||||||
|
- { key: GITHUB_TOKEN, scope: RUN_TIME, type: SECRET }
|
||||||
|
- { key: GITHUB_REPO, scope: RUN_TIME }
|
||||||
|
- { key: MONGODB_URI, scope: RUN_TIME, type: SECRET }
|
||||||
|
- { key: VOYAGE_API_KEY, scope: RUN_TIME, type: SECRET }
|
||||||
Reference in New Issue
Block a user