From 7d8d74b601238dbcbfe115dfc53165599bd5dc5b Mon Sep 17 00:00:00 2001 From: Ashwin Shirke Date: Fri, 19 Jun 2026 21:25:18 +0200 Subject: [PATCH 1/2] test --- .gitignore | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ cogneemind | 1 + 2 files changed, 85 insertions(+) create mode 100644 .gitignore create mode 160000 cogneemind diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6b5ba2a --- /dev/null +++ b/.gitignore @@ -0,0 +1,84 @@ +# ─── secrets ────────────────────────────────────────────────────────── +# NEVER commit any env or credential file. Track .env.example instead. +.env +.env.* +!.env.example +*.pem +*.key +*.crt +secrets/ +credentials.json +service-account*.json + +# ─── python ─────────────────────────────────────────────────────────── +.venv/ +venv/ +env/ +__pycache__/ +*.py[cod] +*$py.class +*.egg +*.egg-info/ +.eggs/ +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ +.coverage +.coverage.* +htmlcov/ +build/ +develop-eggs/ +.installed.cfg +.tox/ +.nox/ +pip-log.txt +pip-delete-this-directory.txt + +# ─── node / vite / frontend build ───────────────────────────────────── +node_modules/ +dist/ +dist-ssr/ +.vite/ +.cache/ +.parcel-cache/ +.turbo/ +*.tsbuildinfo +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +.pnpm-store/ + +# ─── runtime / generated data ───────────────────────────────────────── +# Wiki + evidence are regenerated at runtime — keep them out of git. +backend/data/wiki*.json +backend/data/evidence.json +backend/data/wiki_evidence.json + +# Cognee local graph DB / logs (created next to the package) +.cognee/ +.cognee_system/ +*.cognee_lock + +# ─── logs ───────────────────────────────────────────────────────────── +logs/ +*.log + +# ─── os / editor ────────────────────────────────────────────────────── +.DS_Store +Thumbs.db +ehthumbs.db +desktop.ini + +.idea/ +.vscode/ +!.vscode/extensions.json +!.vscode/settings.shared.json +*.swp +*.swo +*~ + +# ─── misc ───────────────────────────────────────────────────────────── +tmp/ +.tmp/ +.scratch/ diff --git a/cogneemind b/cogneemind new file mode 160000 index 0000000..e76b1c0 --- /dev/null +++ b/cogneemind @@ -0,0 +1 @@ +Subproject commit e76b1c0299c5d968503ac7ac9368a4fc2859e95a From deb75102072aae7dda1ec63b5a6075bcfc53afc3 Mon Sep 17 00:00:00 2001 From: Ashwin Shirke Date: Fri, 19 Jun 2026 21:25:59 +0200 Subject: [PATCH 2/2] Add cogneemind as regular files (not submodule) --- cogneemind | 1 - cogneemind/.gitignore | 84 + cogneemind/README.md | 116 + cogneemind/SUBMISSION.md | 191 + cogneemind/backend/.env.example | 17 + cogneemind/backend/agents.py | 193 + cogneemind/backend/api.py | 419 ++ cogneemind/backend/brain.py | 184 + cogneemind/backend/chat_intent.py | 397 ++ cogneemind/backend/data/flights.json | 17 + cogneemind/backend/data/gates.json | 9 + cogneemind/backend/data/rules.md | 37 + cogneemind/backend/disruptions.py | 73 + cogneemind/backend/evidence.py | 74 + cogneemind/backend/memory.py | 114 + cogneemind/backend/my_skills/linter/SKILL.md | 16 + .../backend/my_skills/observer/SKILL.md | 17 + cogneemind/backend/my_skills/planner/SKILL.md | 18 + .../backend/my_skills/researcher/SKILL.md | 24 + cogneemind/backend/simulator.py | 244 ++ cogneemind/backend/test_chat_intents.py | 96 + cogneemind/backend/test_cognee.py | 98 + cogneemind/frontend/.gitignore | 24 + cogneemind/frontend/README.md | 73 + cogneemind/frontend/eslint.config.js | 22 + cogneemind/frontend/final.png | Bin 0 -> 243278 bytes cogneemind/frontend/index.html | 19 + cogneemind/frontend/package-lock.json | 3716 +++++++++++++++++ cogneemind/frontend/package.json | 35 + cogneemind/frontend/public/JetBrainsMono.ttf | Bin 0 -> 187208 bytes cogneemind/frontend/public/favicon.svg | 1 + cogneemind/frontend/public/icons.svg | 24 + cogneemind/frontend/smoke.mjs | 48 + cogneemind/frontend/smoke.png | Bin 0 -> 243278 bytes cogneemind/frontend/smoke2.mjs | 16 + cogneemind/frontend/src/App.tsx | 262 ++ cogneemind/frontend/src/Gantt3D.tsx | 221 + cogneemind/frontend/src/GanttFallback.tsx | 87 + cogneemind/frontend/src/GanttStage.tsx | 27 + cogneemind/frontend/src/api.ts | 31 + cogneemind/frontend/src/assets/hero.png | Bin 0 -> 13057 bytes cogneemind/frontend/src/assets/react.svg | 1 + cogneemind/frontend/src/assets/vite.svg | 1 + cogneemind/frontend/src/index.css | 403 ++ cogneemind/frontend/src/main.tsx | 10 + cogneemind/frontend/src/types.ts | 51 + cogneemind/frontend/tsconfig.app.json | 25 + cogneemind/frontend/tsconfig.json | 7 + cogneemind/frontend/tsconfig.node.json | 24 + cogneemind/frontend/vite.config.ts | 7 + 50 files changed, 7573 insertions(+), 1 deletion(-) delete mode 160000 cogneemind create mode 100644 cogneemind/.gitignore create mode 100644 cogneemind/README.md create mode 100644 cogneemind/SUBMISSION.md create mode 100644 cogneemind/backend/.env.example create mode 100644 cogneemind/backend/agents.py create mode 100644 cogneemind/backend/api.py create mode 100644 cogneemind/backend/brain.py create mode 100644 cogneemind/backend/chat_intent.py create mode 100644 cogneemind/backend/data/flights.json create mode 100644 cogneemind/backend/data/gates.json create mode 100644 cogneemind/backend/data/rules.md create mode 100644 cogneemind/backend/disruptions.py create mode 100644 cogneemind/backend/evidence.py create mode 100644 cogneemind/backend/memory.py create mode 100644 cogneemind/backend/my_skills/linter/SKILL.md create mode 100644 cogneemind/backend/my_skills/observer/SKILL.md create mode 100644 cogneemind/backend/my_skills/planner/SKILL.md create mode 100644 cogneemind/backend/my_skills/researcher/SKILL.md create mode 100644 cogneemind/backend/simulator.py create mode 100644 cogneemind/backend/test_chat_intents.py create mode 100644 cogneemind/backend/test_cognee.py create mode 100644 cogneemind/frontend/.gitignore create mode 100644 cogneemind/frontend/README.md create mode 100644 cogneemind/frontend/eslint.config.js create mode 100644 cogneemind/frontend/final.png create mode 100644 cogneemind/frontend/index.html create mode 100644 cogneemind/frontend/package-lock.json create mode 100644 cogneemind/frontend/package.json create mode 100644 cogneemind/frontend/public/JetBrainsMono.ttf create mode 100644 cogneemind/frontend/public/favicon.svg create mode 100644 cogneemind/frontend/public/icons.svg create mode 100644 cogneemind/frontend/smoke.mjs create mode 100644 cogneemind/frontend/smoke.png create mode 100644 cogneemind/frontend/smoke2.mjs create mode 100644 cogneemind/frontend/src/App.tsx create mode 100644 cogneemind/frontend/src/Gantt3D.tsx create mode 100644 cogneemind/frontend/src/GanttFallback.tsx create mode 100644 cogneemind/frontend/src/GanttStage.tsx create mode 100644 cogneemind/frontend/src/api.ts create mode 100644 cogneemind/frontend/src/assets/hero.png create mode 100644 cogneemind/frontend/src/assets/react.svg create mode 100644 cogneemind/frontend/src/assets/vite.svg create mode 100644 cogneemind/frontend/src/index.css create mode 100644 cogneemind/frontend/src/main.tsx create mode 100644 cogneemind/frontend/src/types.ts create mode 100644 cogneemind/frontend/tsconfig.app.json create mode 100644 cogneemind/frontend/tsconfig.json create mode 100644 cogneemind/frontend/tsconfig.node.json create mode 100644 cogneemind/frontend/vite.config.ts diff --git a/cogneemind b/cogneemind deleted file mode 160000 index e76b1c0..0000000 --- a/cogneemind +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e76b1c0299c5d968503ac7ac9368a4fc2859e95a diff --git a/cogneemind/.gitignore b/cogneemind/.gitignore new file mode 100644 index 0000000..6b5ba2a --- /dev/null +++ b/cogneemind/.gitignore @@ -0,0 +1,84 @@ +# ─── secrets ────────────────────────────────────────────────────────── +# NEVER commit any env or credential file. Track .env.example instead. +.env +.env.* +!.env.example +*.pem +*.key +*.crt +secrets/ +credentials.json +service-account*.json + +# ─── python ─────────────────────────────────────────────────────────── +.venv/ +venv/ +env/ +__pycache__/ +*.py[cod] +*$py.class +*.egg +*.egg-info/ +.eggs/ +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ +.coverage +.coverage.* +htmlcov/ +build/ +develop-eggs/ +.installed.cfg +.tox/ +.nox/ +pip-log.txt +pip-delete-this-directory.txt + +# ─── node / vite / frontend build ───────────────────────────────────── +node_modules/ +dist/ +dist-ssr/ +.vite/ +.cache/ +.parcel-cache/ +.turbo/ +*.tsbuildinfo +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +.pnpm-store/ + +# ─── runtime / generated data ───────────────────────────────────────── +# Wiki + evidence are regenerated at runtime — keep them out of git. +backend/data/wiki*.json +backend/data/evidence.json +backend/data/wiki_evidence.json + +# Cognee local graph DB / logs (created next to the package) +.cognee/ +.cognee_system/ +*.cognee_lock + +# ─── logs ───────────────────────────────────────────────────────────── +logs/ +*.log + +# ─── os / editor ────────────────────────────────────────────────────── +.DS_Store +Thumbs.db +ehthumbs.db +desktop.ini + +.idea/ +.vscode/ +!.vscode/extensions.json +!.vscode/settings.shared.json +*.swp +*.swo +*~ + +# ─── misc ───────────────────────────────────────────────────────────── +tmp/ +.tmp/ +.scratch/ diff --git a/cogneemind/README.md b/cogneemind/README.md new file mode 100644 index 0000000..68c5a9d --- /dev/null +++ b/cogneemind/README.md @@ -0,0 +1,116 @@ +# CogneeMind — Airport Gate-Ops Brain + +A self-improving Company Brain (Cognee Cloud Hackathon) that assigns airport +gates **and discovers its own assignment algorithm**, getting better the more +disruptions it sees. Three agents — **Researcher / Planner / Observer** — share +an LLM wiki; the Researcher warm-starts each search from what the wiki already +learned, so discovery **compounds**: fewer evaluations and better plans over time. + +> Lower score = better plan. `Score = 1000·U + 500·C + 1·W + 5·R` +> (U=no-gate, C=conflicts, W=walking, R=reassignments) + +![ops deck](frontend/smoke.png) + +## What's inside + +``` +backend/ + simulator.py # gate assignment (greedy by strategy) + scoring + disruptions.py # add_flight / close_gate / apply_delays + signatures + agents.py # Researcher (warm-start discovery) / Planner / Observer + optimize() + memory.py # LocalWiki: recall priors, distill winners + dead-ends, lint + brain.py # Cognee integration: ingest, SkillRunEntry propose->apply, distill + api.py # FastAPI + WebSocket (/scenario, /chat, /compounding, /events) + evidence.py # prints + writes the before/after evidence + test_cognee.py # standalone proof of the Cognee loop (ingest->improve->recall) + my_skills/ # researcher | planner | observer | linter (SKILL.md each) + data/ # gates.json, flights.json, rules.md +frontend/ + src/Gantt3D.tsx # three.js / r3f Gantt (glowing bars over a grid deck) + src/GanttFallback.tsx # 2D Gantt if WebGL is unavailable + src/GanttStage.tsx # WebGL detection + error boundary -> 3D or 2D + src/App.tsx # ops-deck UI: readout, agent deck, wiki timeline, chat +``` + +## Run it (two terminals) + +**Terminal 1 — backend** (Python 3.10–3.14). First time only: +```bash +cd backend +uv venv && uv pip install --python .venv/bin/python fastapi "uvicorn[standard]" +# optional but recommended — turns on the Cognee brain: +uv pip install --python .venv/bin/python cognee==1.2.0.dev1 +``` +Add your key to `backend/.env` (auto-loaded; gitignored): +``` +LLM_API_KEY=sk-... +``` +Then start it (wait ~25–30s for `cognee ready — ingested rulebook + 4 skills`): +```bash +.venv/bin/python -m uvicorn api:app --port 8077 +``` + +**Terminal 2 — frontend**: +```bash +cd frontend && npm install && npm run dev +``` +Open the URL Vite prints (e.g. **http://localhost:5173**). + +> No `.env`/Cognee? It still runs **fully** on the local wiki — boots instantly, +> same demo. Cognee just adds the durable graph + skill self-rewrite on top. + +## Demo flow +Click **Base → +Flight → Close G3 → Storm** and watch the **Agent Deck** narrate +the loop (Observer flags chaos → Researcher discovers → Planner heals) while the +Gantt heals to green. Then hit **run cold vs warm** in the Compounding card. + +| Step | Score | Point at | +|------|-------|----------| +| Base | 6 (U=0) | calm opening plan | +| + Flight | 70 (U=0) | naive would strand it; brain heals | +| Close G3 | 31 (U=0) | reuses learned strategy, no re-search | +| Storm | 36 (U=0) | bars shift in time, heals again | +| **cold vs warm** | **1003 → 6** | same storm, same 2-try budget — memory wins | + +Type in the **Ops Console**: `close G3`, `storm`, `add flight 09:15`, +`what is the best strategy?` (the last shows a live `[cognee recall: …]`). + +## Evidence (no server needed) +```bash +cd backend && python evidence.py # -> data/evidence.json +``` +- **Self-improvement:** storm under naive `earliest_arrival` strands a flight + (**1003**) → discovered `latest_departure` (**6**, all gated). +- **Compounding:** same storm, 2-try budget — cold **1003** vs warm **6**; + full-budget cold needs **6** evals to reach what warm finds in **2**. + +## Cognee — verified working +With `LLM_API_KEY` set, the full judged loop runs against a local +cognee 1.2.0.dev1 graph (verified live): +- **Ingest** rulebook + 4 skills (`content_type="skills"`). +- **Agentic search** reasons over skills + graph (`SearchType.AGENTIC_COMPLETION`). +- **Self-improve** — a stranded-flight failure records `SkillRunEntry(success=0.0)`; + a proposal is generated and **applied** via `improve_skill(apply=True)` + (`{'applied': True, 'skill': 'researcher'}`). +- **Distill + recall** — winners → permanent graph (no `session_id`); raw trials → + session memory (`session_id=run-…`). `cognee.recall(...)` returns the learned strategy. + +Prove it standalone: `cd backend && .venv/bin/python test_cognee.py`. + +## How it maps to the hackathon +- **Ingest** — rules + skills into the brain. +- **Query + self-improve** — score each run → `SkillRunEntry` proposes a skill + rewrite → `improve_skill(apply=True)`. +- **Lint** — dedupe/prune/conflict-resolve the wiki (`/lint`). +- **Two tiers** — raw trials in session memory; winning strategies + + disruption→strategy index + dead-ends distilled into the permanent graph. + +See `SUBMISSION.md` for the filled-in template and reproducible numbers. + +## Troubleshooting +- **`Could not set lock on file … Lock is held by PID`** — only one backend can + use the local Cognee graph at a time. A previous server is still alive: + `pkill -9 -f "uvicorn api:app"`, then start again. +- **Blank 3D area** — WebGL unavailable; it auto-falls back to the 2D Gantt. +- **`recomputing…` stuck / brain not ready** — backend still ingesting (~30s on + boot) or not started; check Terminal 1. diff --git a/cogneemind/SUBMISSION.md b/cogneemind/SUBMISSION.md new file mode 100644 index 0000000..93f7d0e --- /dev/null +++ b/cogneemind/SUBMISSION.md @@ -0,0 +1,191 @@ +# Team Submission + +## Team + +- Team name: CogneeMind +- Participants: Ashwin Shirke (+ team) +- Company Brain / project name: **CogneeMind — Airport Gate-Ops Brain** + +## Company Brain Overview + +CogneeMind is a Company Brain for an airport operations team. It assigns flights +to gates, and — crucially — it **discovers the assignment *algorithm* and gets +better at discovering it the more disruptions it sees.** Three agents share the +brain: a **Researcher** (discovers the strategy), a **Planner** (executes it into +a live Gantt chart), and an **Observer** (watches the plan and triggers +re-planning on chaos). Every winning strategy, plus the dead-ends that failed, +is distilled into the Cognee knowledge graph. The next disruption is then +**warm-started from memory** instead of cold-searching — so discovery compounds: +fewer candidate evaluations and better plans over time. + +- Domain or data sources: gates + flight schedule + an ops rulebook (hard rules: + capacity, one-gate-per-flight, compatibility; soft goals: walking, stability). +- Primary use case: legal, low-pain gate plans that self-heal under new flights, + gate closures, and cascading delays. +- What makes it stand out: it's not retrieval — it's an **auto-researcher** whose + search space narrows as the wiki grows. One numeric **score** grounds every + decision, so "smarter" is measurable, not vibes. + +## The Three Operations + +### Ingest +- What goes in: the rulebook (`data/rules.md`) and four agent **skills** + (`my_skills/{researcher,planner,observer,linter}/SKILL.md`). +- How: `cognee.remember(rules)` → permanent graph; `cognee.remember(SKILLS_DIR, + content_type="skills")` → skills. Raw discovery trials → session memory. +- Code entry point: `brain.py::CogneeBrain.setup()`. + +### Query + Self-improve +- How users query: `POST /chat` (natural language: "close G3", "storm", "add + flight 09:15") and the scenario buttons; the agent loop reoptimizes. +- Where feedback comes from: the penalty **score** `1000*U + 500*C + 1*W + 5*R`, + mapped into a 0..1 `success_score`. +- How feedback updates the brain: `SkillRunEntry(success_score=..., + skill_improvement={apply:False})` **proposes** a rewrite of the Researcher + skill; `improve_skill(proposal_id, apply=True)` **applies** it. In parallel the + winning strategy is distilled to the permanent graph as a reusable + disruption→strategy mapping + dead-end list. +- Code entry point: `agents.py::optimize()` + `brain.py::self_improve()`. + +### Lint +- What it means: dedupe identical strategies, keep only the best winner per + disruption signature, drop orphan library entries. +- How it runs: on-demand (`POST /lint`, "lint wiki" button). +- Code entry point: `memory.py::LocalWiki.lint()` / linter skill. + +## Self-Improvement Evidence + +Reproduce with `python backend/evidence.py` (writes `data/evidence.json`). + +### Baseline Run +- Query / task: a storm delays 4 international arrivals +30 min; re-plan with the + naive default (`earliest_arrival`, which was fine on the calm base schedule). +- Result: naive `earliest_arrival` strands a flight at a remote stand. +- Score (penalty, lower=better): **1003.0** (U=1). +- Recorded feedback: + +```text +error_type: stranded_flight +error_message: 1 flight with no gate under earliest_arrival +feedback: -1.0 +success_score: 0.0 +``` + +### Improved Run +- Query / task: same storm, after discovery. +- Result: discovered **`latest_departure`** — every flight gated, zero remote stands. +- Score: **6.0** (U=0) → **~167× lower penalty.** +- What changed in the brain between runs: + +```text +Before: Researcher had no prior; cold-searched the menu. +After: Wiki holds {signature: delay:storm:heavy -> winner: latest_departure, + score 6}, with the strategies that stranded a flight recorded as dead-ends. +``` + +### Compounding proof (the headline — memory makes discovery cheaper) +Same storm, same 2-try re-planning budget: + +```text +COLD wiki : score 1003 (2 evals) tried [earliest_arrival, earliest_departure] -> strands a flight +WARM wiki : score 6 (2 evals) tried [latest_departure, latest_departure+walk] -> all gated +full-budget cold reaches score 6 only after 6 evals — the warm brain gets there in 2. +``` + +→ With memory, the brain finds a **~167× better plan in the same budget**, and the +**same optimum in 3× fewer evaluations**. + +## Architecture + +```text +[scenario / chat turn] + | + v +[ session memory (session_id=run-...) ] <- raw trials, per-run scratchpad + | + | distillation: winner + disruption->strategy + dead-ends + v +[ permanent graph (no session_id) ] <- rulebook, best strategies, score log + | + v +[ Researcher recalls priors -> Planner builds Gantt -> Observer watches ] + | + v +[ score -> SkillRunEntry (propose) -> improve_skill (apply) ] +``` + +Three agents = three skills, scored by one penalty number. The Researcher's +recall step is what makes discovery compound. + +### Cognee — verified working +With `LLM_API_KEY` set, `brain.py` runs the full Cognee loop against a local +cognee 1.2.0.dev1 instance (we kept the graph local; `cognee.push("cogneemind")` +would upload it to Cloud unchanged). Verified end-to-end: + +- **Ingest** — rulebook + 4 SKILL.md files → `cognee.remember(... content_type="skills")` + ingests skills `[linter, observer, planner, researcher]`. +- **Agentic search** — `cognee.search(AGENTIC_COMPLETION, skills=[...])` answers + *"the Researcher should adopt the `latest_departure` strategy…"* reasoning over + the skills + graph. +- **Self-improve (applied)** — a stranded-flight failure records + `SkillRunEntry(success_score=0.0)`; `cognee.remember(..., skill_improvement={apply:False})` + proposes a researcher-skill rewrite and `improve_skill(apply=True)` **applies it** + (live run: `{'applied': True, 'skill': 'researcher', 'success_score': 0.0}`). +- **Distill + recall** — winners go to the permanent graph (no session_id); + `cognee.recall("best gate strategy for a storm")` returns the distilled + *latest_departure* guidance. Session trials use `session_id=run-...`. + +## Agents / Skills + +```text +Skill path(s): backend/my_skills/{researcher,planner,observer,linter}/SKILL.md +Roles: + - Ingestor: setup() ingests rules + skills + - Querier: Researcher (recall+propose) + Planner (execute) + - Linter: dedupe / prune / conflict-resolve + - Critic: Observer (chaos detection -> triggers re-discovery) +``` + +## Reproduction + +```bash +# backend +cd backend +uv venv && uv pip install --python .venv/bin/python fastapi "uvicorn[standard]" +# (at the event also: uv pip install cognee==1.2.0.dev1 ; export LLM_API_KEY=...) +.venv/bin/python -m uvicorn api:app --port 8077 + +# evidence +python evidence.py + +# frontend +cd ../frontend && npm install && npm run dev # open http://localhost:5173 +``` + +Environment variables (optional — Cognee lights up if present): + +```text +LLM_API_KEY # OpenAI key (provided at kickoff) +COGNEE_CLOUD_URL # only if pushing to Cognee Cloud +COGNEE_API_KEY +``` + +## Demo + +- Local: open the frontend, click **Base → +Flight → Close G3 → Storm**, then + **run cold vs warm** in the Compounding card. +- 3-minute pitch outline: + +```text +1. Problem: gates + disruptions; hook = "discovery that compounds via memory" +2. Base scenario: Gantt + score 10 (Researcher found latest_departure) +3. Storm: overlaps + a flight to remote stand; Observer flags chaos, brain heals +4. Money shot: cold vs warm on the same storm — 1003 (strands a flight) vs 6 (all gated), same budget +5. Open the wiki timeline: the brain literally got smarter from memory +6. Lint + Cognee distillation + what's next +``` + +## Links + +- Repo: (this folder) `cogneemind/` +- Slides / writeup: `PROPOSAL.md`, `README.md` diff --git a/cogneemind/backend/.env.example b/cogneemind/backend/.env.example new file mode 100644 index 0000000..0772e7e --- /dev/null +++ b/cogneemind/backend/.env.example @@ -0,0 +1,17 @@ +# Copy this file to backend/.env and fill in real values. The .env file is +# gitignored and must NEVER be committed. + +# ── LLM / Cognee brain (optional but recommended) ───────────────────── +# Without a key the brain runs in local-only mode (LocalWiki). +# With a key, brain.py wires up cognee 1.2.0.dev1 + the chat intent parser +# uses the same key for typo-tolerant LLM-first parsing. +LLM_API_KEY=sk-... + +# ── Optional overrides ──────────────────────────────────────────────── +# Pick which OpenAI-compatible model the chat intent parser uses. +# Defaults to gpt-4o-mini (fast, cheap, JSON-mode capable). +# LLM_MODEL=gpt-4o-mini + +# Push the Cognee graph to Cognee Cloud instead of staying local. +# COGNEE_CLOUD_URL=https://cloud.cognee.ai +# COGNEE_API_KEY=... diff --git a/cogneemind/backend/agents.py b/cogneemind/backend/agents.py new file mode 100644 index 0000000..d7670e2 --- /dev/null +++ b/cogneemind/backend/agents.py @@ -0,0 +1,193 @@ +"""The three-agent loop: Researcher, Planner, Observer (+ Linter). + +The Researcher does WARM-STARTED discovery: it recalls past winning strategies +and known dead-ends from the wiki and seeds its (small) candidate search from +them, instead of cold-searching the full menu every time. That memory is why +discovery compounds — fewer candidate evals and equal-or-better scores as the +wiki grows. +""" +from __future__ import annotations + +from dataclasses import dataclass +from typing import Callable, Optional + +import simulator as S +from memory import Memory, strategy_key + +# A re-planning compute budget: under a disruption you can only try so many +# candidates. Cold search burns evals on naive heuristics; a warm wiki spends +# them on the candidates memory already knows are good. Full menu = 6, so the +# default budget lets a cold brain eventually find the winner (just slowly). +EVAL_BUDGET = 6 + +# "Naive-first" menu a cold brain explores. The non-obvious 'latest_departure' +# winner sits LAST, so cold search only reaches it after trying everything else +# — exactly the cost that memory removes. +COLD_MENU_KEYS = [ + "earliest_arrival", "earliest_departure", "tightest_turnaround", + "longest_first", "constrained_first", "latest_departure", +] + + +def _strat(priority_key: str, walking=1.0, stability=1.0, applies_to="base", name=None) -> dict: + return { + "name": name or priority_key, + "priority_key": priority_key, + "soft_weights": {"walking": walking, "stability": stability}, + "applies_to": applies_to, + } + + +Event = Callable[[str, str, dict], None] # (agent, message, data) + + +@dataclass +class DiscoveryResult: + strategy: dict + plan: dict + evals: int + source: str # "cold" | "warm" + trace: list # [{key, score}] in evaluation order + dead_ends: list + + +# --------------------------------------------------------------------------- # +# Researcher +# --------------------------------------------------------------------------- # +def _candidate_order(priors: dict, signature: str) -> list[dict]: + """Warm: recalled winners first, then a tuned mutation, then the rest of the + menu (skipping dead-ends). Cold: the naive-first menu.""" + dead = set(priors.get("dead_ends", [])) + seeds = priors.get("strategies", []) + cands: list[dict] = [] + seen: set[str] = set() + + def push(s: dict): + k = strategy_key(s) + if k in seen or k in dead: + return + seen.add(k) + cands.append(s) + + if seeds: # WARM start — jump straight to what worked before + for s in seeds: + push({**s, "applies_to": signature}) + # one mutation of the top seed: emphasise passenger walking + top = seeds[0] + push(_strat(top["priority_key"], walking=2.0, stability=1.0, + applies_to=signature, name=top["priority_key"] + "+walk")) + + for k in COLD_MENU_KEYS: # fill the rest of the menu (cold uses only this) + push(_strat(k, applies_to=signature)) + return cands + + +def researcher_discover(flights, gates, signature: str, memory: Memory, + prev: Optional[dict] = None, budget: int = EVAL_BUDGET, + emit: Optional[Event] = None) -> DiscoveryResult: + priors = memory.recall(signature) + source = priors.get("source", "cold") + if emit: + emit("researcher", f"recall({signature}) → {source}", { + "source": source, "priors": [s.get("name") for s in priors.get("strategies", [])], + "dead_ends": priors.get("dead_ends", []), + }) + + candidates = _candidate_order(priors, signature) + trace, best = [], None + for cand in candidates[:budget]: + plan = S.assign(flights, gates, cand, prev=prev) + total = plan["score"]["total"] + trace.append({"key": strategy_key(cand), "name": cand["name"], "score": total}) + if emit: + emit("researcher", f"try {cand['name']} → {total}", {"score": total}) + if best is None or total < best[0]: + best = (total, cand, plan) + + best_score, best_strat, best_plan = best + # Anything clearly worse than the winner (or that strands a flight it didn't + # need to) becomes a recorded dead-end for this signature. + dead_ends = [t["key"] for t in trace + if t["score"] > best_score and (t["score"] >= best_score * 3 or t["score"] >= 1000)] + if emit: + emit("researcher", f"winner: {best_strat['name']} (score {best_score}, {len(trace)} evals, {source})", + {"strategy": best_strat, "score": best_score, "evals": len(trace), "source": source}) + return DiscoveryResult(best_strat, best_plan, len(trace), source, trace, dead_ends) + + +# --------------------------------------------------------------------------- # +# Planner +# --------------------------------------------------------------------------- # +def planner_build(flights, gates, strategy: dict, prev: Optional[dict] = None, + emit: Optional[Event] = None) -> dict: + plan = S.assign(flights, gates, strategy, prev=prev) + if emit: + sc = plan["score"] + emit("planner", f"built plan with {strategy['name']} → score {sc['total']} " + f"(U={sc['U']} C={sc['C']} W={sc['W']} R={sc['R']})", {"score": sc}) + return plan + + +# --------------------------------------------------------------------------- # +# Observer +# --------------------------------------------------------------------------- # +CHAOS_THRESHOLD = 100 # score above this (or any conflict/unassigned) = chaos + + +def observer_inspect(plan: dict, emit: Optional[Event] = None) -> dict: + sc = plan["score"] + chaos = sc["U"] > 0 or sc["C"] > 0 or sc["total"] > CHAOS_THRESHOLD + reasons = [] + if sc["U"]: + reasons.append(f"{sc['U']} flight(s) with no gate") + if sc["C"]: + reasons.append(f"{sc['C']} gate conflict(s)") + if not reasons and sc["total"] > CHAOS_THRESHOLD: + reasons.append(f"score {sc['total']} over threshold {CHAOS_THRESHOLD}") + verdict = {"chaos": chaos, "reasons": reasons, "score": sc} + if emit: + emit("observer", ("CHAOS: " + "; ".join(reasons)) if chaos else "plan healthy ✓", verdict) + return verdict + + +# --------------------------------------------------------------------------- # +# Full optimization step: Observe → (if chaos) Discover → Plan → Distill +# --------------------------------------------------------------------------- # +def optimize(flights, gates, signature: str, memory: Memory, + prev_plan: Optional[dict] = None, emit: Optional[Event] = None) -> dict: + prev_assign = (prev_plan or {}).get("assignment") if prev_plan else None + fail_score = None # the chaos that triggered re-research -> drives skill self-improvement + + # 1. Observe the current (possibly stale) plan if one exists. + if prev_plan is not None: + stale = S.assign(flights, gates, prev_plan["strategy"], prev=prev_assign) + verdict = observer_inspect(stale, emit) + if not verdict["chaos"]: + return {"plan": S.public_plan(stale), "discovery": None, "verdict": verdict} + fail_score = stale["score"] # the failed attempt the Researcher must beat + + # 2. Researcher discovers (warm-started from the wiki). + result = researcher_discover(flights, gates, signature, memory, prev=prev_assign, emit=emit) + + # 3. Planner commits the winning strategy. + plan = planner_build(flights, gates, result.strategy, prev=prev_assign, emit=emit) + + # 4. Distill the winner + dead-ends into the wiki (permanent graph). + note = f"{result.source} discovery, {result.evals} evals" + promo = memory.promote(signature, result.strategy, result.dead_ends, + plan["score"]["total"], note) + if emit: + emit("brain", f"distilled → wiki v{promo['version']} ({note})", + {"version": promo["version"], "signature": signature}) + + return { + "plan": S.public_plan(plan), + "discovery": { + "strategy": result.strategy, "evals": result.evals, "source": result.source, + "trace": result.trace, "score": plan["score"]["total"], + }, + "verdict": observer_inspect(plan, emit=None), + "wiki_version": promo["version"], + # the failed prior attempt (if any) — graded by Cognee to rewrite the skill + "fail_score": fail_score, + } diff --git a/cogneemind/backend/api.py b/cogneemind/backend/api.py new file mode 100644 index 0000000..e2114e0 --- /dev/null +++ b/cogneemind/backend/api.py @@ -0,0 +1,419 @@ +"""CogneeMind API — FastAPI + WebSocket. + +Endpoints: + GET /state current plan + wiki timeline/index + brain status + POST /scenario/{stage} apply a demo disruption (base|new_flight|gate_closed|storm) and heal + POST /chat natural-language interaction (add flight / close gate / storm / query) + POST /reset cold-start the world + wiki + POST /lint run the wiki linter + GET /compounding cold-vs-warm A/B numbers (the headline evidence) + WS /events live agent-activity stream +""" +from __future__ import annotations + +import asyncio +import time +from dataclasses import dataclass, field + +from fastapi import FastAPI, WebSocket, WebSocketDisconnect +from fastapi.middleware.cors import CORSMiddleware +from pydantic import BaseModel + +import agents as A +import disruptions as D +import simulator as S +from brain import brain +from chat_intent import extract_intent +from memory import LocalWiki + +app = FastAPI(title="CogneeMind") +app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"]) + + +# --------------------------------------------------------------------------- # +# World + wiki state +# --------------------------------------------------------------------------- # +@dataclass +class World: + flights: list = field(default_factory=S.load_flights) + gates: list = field(default_factory=S.load_gates) + plan: dict | None = None + signature: str = "base" + + +wiki = LocalWiki() +world = World() + + +def reset_world(cold_wiki: bool = True): + global world + world = World() + if cold_wiki: + wiki.reset() + + +# --------------------------------------------------------------------------- # +# WebSocket connection manager + event streaming +# --------------------------------------------------------------------------- # +class Hub: + def __init__(self): + self.conns: list[WebSocket] = [] + + async def connect(self, ws: WebSocket): + await ws.accept() + self.conns.append(ws) + + def drop(self, ws: WebSocket): + if ws in self.conns: + self.conns.remove(ws) + + async def broadcast(self, payload: dict): + for ws in list(self.conns): + try: + await ws.send_json(payload) + except Exception: + self.drop(ws) + + +hub = Hub() + + +async def stream_events(events: list[dict], result: dict): + """Replay collected agent events over WS with a small delay, then push the + final plan + wiki — so the frontend animates the agents 'thinking'.""" + for ev in events: + await hub.broadcast({"type": "agent", **ev}) + await asyncio.sleep(0.18) + await hub.broadcast({"type": "plan", "plan": result.get("plan"), + "discovery": result.get("discovery"), + "wiki_version": result.get("wiki_version")}) + await hub.broadcast({"type": "wiki", "timeline": wiki.history(), "index": wiki.index()}) + + +def run_optimize(signature: str) -> dict: + """Run the agent loop synchronously, collecting events for streaming.""" + events: list[dict] = [] + + def emit(agent, message, data): + events.append({"agent": agent, "message": message, "data": data, "ts": time.time()}) + + result = A.optimize(world.flights, world.gates, signature, wiki, + prev_plan=world.plan, emit=emit) + world.plan = result["plan"] + world.signature = signature + return {"result": result, "events": events} + + +async def optimize_and_stream(signature: str) -> dict: + out = run_optimize(signature) + result, events = out["result"], out["events"] + asyncio.create_task(stream_events(events, result)) + # Mirror to Cognee (judged loop) in the background — never blocks the demo. + if result.get("discovery"): + asyncio.create_task(_cognee_mirror(signature, result)) + return {"plan": result["plan"], "discovery": result.get("discovery"), + "verdict": result.get("verdict"), "wiki_version": result.get("wiki_version"), + "events": events} + + +async def _cognee_mirror(signature: str, result: dict): + disc = result["discovery"] + sid = f"run-{signature}-{int(time.time())}" + await brain.remember_trial(signature, disc["strategy"]["name"], disc["score"], sid) + await brain.distill(signature, disc["strategy"], disc["score"]) + # Grade the prior FAILURE that triggered re-research (low success -> proposal), + # not the healed plan. Falls back to the healed score for cold/base runs. + graded = result.get("fail_score") or result["plan"]["score"] + imp = await brain.self_improve(signature, disc["strategy"], graded, sid) + await hub.broadcast({"type": "agent", "agent": "brain", + "message": f"cognee self-improve (graded penalty {graded['total']}): {imp}", + "data": imp, "ts": time.time()}) + + +# --------------------------------------------------------------------------- # +# Scenarios +# --------------------------------------------------------------------------- # +# Scenario buttons apply ONE disruption to a fresh base schedule (non-cumulative), +# so each stage cleanly shows the brain healing. `prev` is the current plan, so the +# R term measures churn vs. base. (Chat disruptions stay freeform/cumulative.) +def _base_plan(): + return S.public_plan(S.assign(S.load_flights(), S.load_gates(), S.default_strategy())) + + +SCENARIOS = { + "base": lambda: ("base", World()), + "new_flight": lambda: ( + D.signature("new_flight", window="busy"), + World(flights=D.add_flight(S.load_flights(), id="ZZ999", airline="ZetaAir", + arrival="08:30", departure="10:00", type="domestic", + preferred=["G1", "G2"]), gates=S.load_gates())), + "gate_closed": lambda: ( + D.signature("gate_closed", where="central"), + World(flights=S.load_flights(), gates=D.close_gate(S.load_gates(), "G3", "08:00", "13:00"))), + "storm": lambda: ( + D.signature("delay", weather="storm", severity="heavy"), + World(flights=D.apply_delays(S.load_flights(), ["CD201", "GH401", "IJ501", "CD202"], 30), + gates=S.load_gates())), +} + + +@app.post("/scenario/{stage}") +async def scenario(stage: str): + global world + if stage not in SCENARIOS: + return {"error": f"unknown stage '{stage}'", "stages": list(SCENARIOS)} + if stage == "base": + reset_world(cold_wiki=False) + sig, neww = SCENARIOS[stage]() + world = neww # base: prev=None -> Researcher discovers the opening plan + return await optimize_and_stream(sig) + sig, neww = SCENARIOS[stage]() + neww.plan = world.plan if world.plan else _base_plan() # prev plan -> measures churn (R) + world = neww + return await optimize_and_stream(sig) + + +# --------------------------------------------------------------------------- # +# Chat — LLM-first intent parser, rule fallback (see chat_intent.py) +# --------------------------------------------------------------------------- # +class ChatMsg(BaseModel): + text: str + + +HELP_TEXT = ( + "I take messy ops chatter and turn it into actions. Try:\n" + " • delay AB104 by 1 hr • close G3 • reopen G3\n" + " • add flight 09:15 to G2 • move AB104 to G2\n" + " • storm • new day • reset / lint\n" + " • what is the best strategy?" +) + + +def _flight_id_list() -> list[str]: + return [f.id for f in world.flights] + + +def _gate_id_list() -> list[str]: + return [g.id for g in world.gates] + + +def _resolve_close_window(intent: dict) -> tuple[str, str]: + """Pick a meaningful close window. If the user gave one, use it; otherwise + derive it from the LIVE schedule — span = first arrival to last departure + (+buffer) — so 'G4 is closed' means closed for the whole operational day, + not a hardcoded 08:00–13:00 fiction. Always returns a non-degenerate window.""" + s = (intent.get("start") or "").strip() + e = (intent.get("end") or "").strip() + if s and e and S.hhmm_to_min(s) < S.hhmm_to_min(e): + return s, e + if world.flights: + start_min = min(f.arrival for f in world.flights) + end_min = max(f.departure for f in world.flights) + S.BUFFER_MIN + return S.min_to_hhmm(start_min), S.min_to_hhmm(end_min) + # No flights at all — fall back to a generic ops day. + return "06:00", "23:00" + + +def _summarize_optimize(out: dict) -> str: + """One human line summarizing what the optimize loop just produced.""" + plan = out.get("plan") or {} + sc = plan.get("score") or {} + disc = out.get("discovery") or {} + strat = (disc.get("strategy") or {}).get("name") or plan.get("strategy", {}).get("name") or "existing" + bits = [f"score {sc.get('total', '?')}", + f"U={sc.get('U', 0)} C={sc.get('C', 0)} W={sc.get('W', 0)} R={sc.get('R', 0)}", + f"strategy '{strat}'"] + if disc: + bits.append(f"{disc.get('source', 'cold')}, {disc.get('evals', 0)} evals") + return " · ".join(bits) + + +def _condense_recall(ans: str | None) -> str: + """Trim Cognee recall to a short citation tail.""" + if not ans: + return "" + s = ans.strip().strip('"').strip("'") + if len(s) > 240: + s = s[:237].rstrip() + "…" + return f' [cognee: "{s}"]' + + +@app.post("/chat") +async def chat(msg: ChatMsg): + global world + text = (msg.text or "").strip() + if not text: + return {"reply": HELP_TEXT, "plan": world.plan} + + intent = await extract_intent(text, _flight_id_list(), _gate_id_list()) + action = intent.get("action") + + # --- world-only commands ------------------------------------------------ # + if action == "reset": + reset_world(cold_wiki=True) + world.plan = S.public_plan(S.assign(world.flights, world.gates, S.default_strategy())) + return {"reply": "Reset: fresh schedule, cold wiki. The brain has forgotten everything.", + "plan": world.plan, "discovery": None} + + if action == "new_day": + # Keep the wiki (memory survives), reset the world to the base schedule. + world = World() + world.plan = S.public_plan(S.assign(world.flights, world.gates, S.default_strategy())) + return {"reply": "New day: schedule reset to base. Wiki memory kept — the brain " + f"still remembers {len(wiki.history())} learned strategies.", + "plan": world.plan, "discovery": None} + + if action == "lint": + summary = wiki.lint() + return {"reply": f"Linted the wiki: pruned {summary['pruned_winners']} superseded " + f"winner(s) and {summary['pruned_library']} orphan strategy entries.", + "wiki": {"timeline": wiki.history(), "index": wiki.index()}} + + if action == "help": + return {"reply": HELP_TEXT, "plan": world.plan} + + # --- disruptions -> re-optimize ----------------------------------------- # + if action == "delay": + fid = intent["flight"] + mins = intent["minutes"] + world.flights = D.delay_flight(world.flights, fid, mins) + sig = D.signature("delay", flight=fid, minutes=str(mins)) + out = await optimize_and_stream(sig) + return {"reply": f"{fid} delayed +{mins} min → re-optimized: {_summarize_optimize(out)}", + **out} + + if action == "close": + gid = intent["gate"] + start, end = _resolve_close_window(intent) + world.gates = D.close_gate(world.gates, gid, start, end) + out = await optimize_and_stream(D.signature("gate_closed", where=gid)) + return {"reply": f"{gid} closed {start}–{end} (operational window). " + f"Observer flagged it → {_summarize_optimize(out)}", **out} + + if action == "open": + gid = intent["gate"] + world.gates = D.open_gate(world.gates, gid) + out = await optimize_and_stream(D.signature("gate_opened", where=gid)) + return {"reply": f"{gid} reopened → {_summarize_optimize(out)}", **out} + + if action == "add": + arr = intent["arrival"] + dep = intent.get("departure") or arr + gate = intent.get("gate") + new_id = "NEW" + str(len([f for f in world.flights if f.id.startswith("NEW")]) + 1) + world.flights = D.add_flight( + world.flights, id=new_id, airline="AdHoc", arrival=arr, departure=dep, + type="domestic", preferred=[gate] if gate else ["G1", "G2"]) + out = await optimize_and_stream(D.signature("new_flight", window="busy")) + gate_note = f" (preferring {gate})" if gate else "" + return {"reply": f"Added {new_id} arriving {arr}{gate_note} → " + f"{_summarize_optimize(out)}", **out} + + if action == "move": + fid, gid = intent["flight"], intent["gate"] + world.flights = D.move_flight(world.flights, fid, gid) + out = await optimize_and_stream(D.signature("move", flight=fid, where=gid)) + return {"reply": f"Moving {fid} → {gid}. Re-optimized: {_summarize_optimize(out)}", + **out} + + if action == "storm": + mins = intent.get("minutes", 30) + world.flights = D.apply_delays(world.flights, ["CD201", "GH401", "IJ501", "CD202"], mins) + out = await optimize_and_stream(D.signature("delay", weather="storm", severity="heavy")) + return {"reply": f"Storm applied: international arrivals +{mins} min → " + f"{_summarize_optimize(out)}", **out} + + # --- query / unknown: clean wiki + cognee answer ------------------------ # + hist = wiki.history() + best = hist[-1] if hist else None + cognee_ans = await brain.recall_priors(world.signature) + if best is None: + base = "No strategy learned yet — trigger a disruption first (e.g. 'close G3', 'storm')." + else: + base = (f"Best for '{best['signature']}' → '{best['strategy']}' (score {best['score']}). " + f"The wiki holds {len(hist)} learned version(s).") + if action == "unknown": + base = f"Didn't catch that. {HELP_TEXT}\n\n{base}" + return {"reply": base + _condense_recall(cognee_ans), "plan": world.plan} + + +# --------------------------------------------------------------------------- # +# State / wiki / lint / compounding +# --------------------------------------------------------------------------- # +@app.get("/state") +async def state(): + if world.plan is None: + world.plan = S.public_plan(S.assign(world.flights, world.gates, S.default_strategy())) + return {"plan": world.plan, "signature": world.signature, + "wiki": {"timeline": wiki.history(), "index": wiki.index()}, + "brain": {"enabled": brain.enabled, "ready": brain.ready, "skills": brain.skill_names}} + + +@app.post("/reset") +async def reset(): + reset_world(cold_wiki=True) + world.plan = S.public_plan(S.assign(world.flights, world.gates, S.default_strategy())) + return {"ok": True, "plan": world.plan} + + +@app.post("/lint") +async def lint(): + return {"summary": wiki.lint(), "wiki": {"timeline": wiki.history(), "index": wiki.index()}} + + +@app.get("/compounding") +async def compounding(): + """Headline evidence: same storm, cold wiki vs warm wiki.""" + tmp = LocalWiki(path=wiki.path.parent / "wiki_ab.json") + tmp.reset() + gates = S.load_gates() + storm = D.apply_delays(S.load_flights(), ["CD201", "GH401", "IJ501", "CD202"], 30) + sig = D.signature("delay", weather="storm", severity="heavy") + + cold = A.researcher_discover(storm, gates, sig, tmp, budget=2) + cold_full = A.researcher_discover(storm, gates, sig, tmp) # full-budget cold to seed wiki + tmp.promote(sig, cold_full.strategy, cold_full.dead_ends, cold_full.plan["score"]["total"], "seed") + warm = A.researcher_discover(storm, gates, sig, tmp, budget=2) + return { + "scenario": sig, + "budget": 2, + "cold": {"score": cold.plan["score"]["total"], "evals": cold.evals, + "tried": [t["name"] for t in cold.trace]}, + "warm": {"score": warm.plan["score"]["total"], "evals": warm.evals, + "tried": [t["name"] for t in warm.trace]}, + "full_budget": {"cold_evals": cold_full.evals, + "cold_score": cold_full.plan["score"]["total"]}, + } + + +@app.websocket("/events") +async def events(ws: WebSocket): + await hub.connect(ws) + try: + await ws.send_json({"type": "hello", "msg": "CogneeMind event stream connected"}) + while True: + await ws.receive_text() # keepalive; we don't expect client messages + except WebSocketDisconnect: + hub.drop(ws) + except Exception: + hub.drop(ws) + + +@app.on_event("startup") +async def _startup(): + # Never let a Cognee failure (e.g. a leftover process holding the graph DB + # lock) crash the demo — degrade to local-only and keep serving. + try: + status = await brain.setup() + except Exception as e: + brain.enabled = False + brain.ready = False + status = (f"cognee setup failed ({type(e).__name__}: {str(e)[:120]}) — " + f"running local-only. Tip: kill leftover `uvicorn api:app` processes.") + print("[CogneeMind]", status) + + +@app.get("/") +async def root(): + return {"service": "CogneeMind", "stages": list(SCENARIOS), + "brain_enabled": brain.enabled} diff --git a/cogneemind/backend/brain.py b/cogneemind/backend/brain.py new file mode 100644 index 0000000..c793bef --- /dev/null +++ b/cogneemind/backend/brain.py @@ -0,0 +1,184 @@ +"""Cognee integration for CogneeMind — the judged "Company Brain" layer. + +Design: the structured optimization loop always runs on the LocalWiki mirror +(fast, reliable, demo-safe). This module mirrors every result into Cognee and +runs the self-improvement loop the hackathon scores: + + * Ingest — rules -> permanent graph; skills -> graph via content_type="skills" + * Session memory — raw discovery trials written with session_id=... + * Distill — winning strategy promoted to the permanent graph (no session_id) + * Self-improve — SkillRunEntry (apply=False) proposes a researcher-skill + rewrite; improve_skill(apply=True) applies it. + +Everything is wrapped so that a missing cognee install or missing LLM key +degrades gracefully to "local only" without breaking the demo. +""" +from __future__ import annotations + +import os +from pathlib import Path +from typing import Optional + +HERE = Path(__file__).parent + +# Load a local .env (LLM_API_KEY etc.) so the brain auto-enables when present. +_ENV = HERE / ".env" +if _ENV.exists(): + for _line in _ENV.read_text().splitlines(): + if "=" in _line and not _line.strip().startswith("#"): + _k, _v = _line.split("=", 1) + os.environ.setdefault(_k.strip(), _v.strip()) +SKILLS_DIR = str(HERE / "my_skills") +RULES_PATH = HERE / "data" / "rules.md" +DATASET = "cogneemind" + +# Penalty baseline for mapping our (lower=better) score into SkillRunEntry's +# 0..1 success_score (higher=better). A stranded flight (~1000) -> ~0. +PENALTY_BASELINE = 1000.0 + + +def cognee_available() -> bool: + try: + import cognee # noqa: F401 + return bool(os.environ.get("LLM_API_KEY") or os.environ.get("OPENAI_API_KEY") + or os.environ.get("COGNEE_CLOUD_URL")) + except Exception: + return False + + +def success_score(penalty: float) -> float: + return max(0.0, min(1.0, 1.0 - penalty / PENALTY_BASELINE)) + + +class CogneeBrain: + """Async wrapper around cognee. Constructed once at startup; methods no-op + (returning a status string) if cognee is unavailable.""" + + def __init__(self): + self.enabled = cognee_available() + self.skill_names: list[str] = [] + self.ready = False + + async def setup(self) -> str: + if not self.enabled: + return "cognee disabled (no package or LLM key) — running local-only" + import cognee + from cognee.modules.engine.operations.setup import setup as cognee_setup + + await cognee.prune.prune_data() + await cognee.prune.prune_system(metadata=True) + await cognee_setup() + + # Ingest the rulebook into the permanent graph. + await cognee.remember(RULES_PATH.read_text(), dataset_name=DATASET) + + # Ingest the agent skills. + remembered = await cognee.remember(SKILLS_DIR, dataset_name=DATASET, content_type="skills") + items = getattr(remembered, "items", None) or remembered.get("items", []) + self.skill_names = [it["name"] for it in items if it.get("kind") == "skill"] + self.ready = True + return f"cognee ready — ingested rulebook + {len(self.skill_names)} skills" + + async def recall_priors(self, signature: str) -> Optional[str]: + """Narrative warm-start from the permanent graph — returns a short, + human-readable sentence (just the answer text, no metadata blob).""" + if not (self.enabled and self.ready): + return None + import cognee + try: + res = await cognee.recall(f"best gate strategy for disruption {signature}") + if not res: + return None + answers: list[str] = [] + for r in res[:3]: + # Cognee Recall items expose `.raw["value"]` (string answer). + # Fall back to `.text` / str(r) if the shape is different. + raw = getattr(r, "raw", None) + if isinstance(raw, dict) and raw.get("value"): + answers.append(str(raw["value"]).strip()) + continue + txt = getattr(r, "text", None) + if isinstance(txt, str) and txt.strip(): + answers.append(txt.strip()) + continue + answers.append(str(r).strip()) + answers = [a for a in answers if a] + return " ".join(answers) if answers else None + except Exception as e: + return f"(recall error: {type(e).__name__})" + + async def remember_trial(self, signature: str, strategy_name: str, score: float, session_id: str): + """Raw trial -> session memory (the per-run scratchpad tier).""" + if not (self.enabled and self.ready): + return + import cognee + try: + await cognee.remember( + f"Tried strategy '{strategy_name}' for {signature}: penalty score {score}.", + dataset_name=DATASET, session_id=session_id, + ) + except Exception: + pass + + async def distill(self, signature: str, strategy: dict, score: float) -> str: + """Promote the winning strategy to the permanent graph (no session_id).""" + if not (self.enabled and self.ready): + return "local-only" + import cognee + text = (f"Winning gate-assignment strategy for disruption '{signature}': " + f"priority rule '{strategy['priority_key']}' with weights " + f"{strategy.get('soft_weights')} achieved penalty score {score}. " + f"Prefer this strategy when this disruption recurs.") + try: + await cognee.remember(text, dataset_name=DATASET) + return "distilled to permanent graph" + except Exception as e: + return f"(distill error: {e})" + + async def self_improve(self, signature: str, strategy: dict, score_breakdown: dict, + session_id: str) -> dict: + """The judged loop: SkillRunEntry (propose) -> improve_skill (apply).""" + if not (self.enabled and self.ready and self.skill_names): + return {"applied": False, "reason": "local-only"} + import cognee + from cognee.memory import SkillRunEntry + + penalty = score_breakdown["total"] + succ = success_score(penalty) + researcher = next((s for s in self.skill_names if "research" in s.lower()), self.skill_names[0]) + try: + proposal_result = await cognee.remember( + SkillRunEntry( + selected_skill_id=researcher, + task_text=f"Choose a gate strategy for {signature}", + result_summary=(f"Strategy {strategy['priority_key']} scored {penalty} " + f"(U={score_breakdown['U']} C={score_breakdown['C']})."), + success_score=succ, + feedback=-1.0 if succ < 0.7 else 1.0, + ), + dataset_name=DATASET, session_id=session_id, + skill_improvement={"skill_name": researcher, "apply": False, "score_threshold": 0.9}, + ) + items = getattr(proposal_result, "items", None) or ( + proposal_result.get("items", []) if isinstance(proposal_result, dict) else []) + proposal_id = next((it.get("proposal_id") for it in items + if it.get("kind") == "skill_improvement_proposal"), None) + if proposal_id is None: + return {"applied": False, "reason": "no proposal (score above threshold)"} + + # improve_skill is internal and needs the Dataset object (not a name). + from cognee.modules.memify.skill_improvement import improve_skill + from cognee.modules.pipelines.layers.resolve_authorized_user_datasets import ( + resolve_authorized_user_datasets, + ) + user, datasets = await resolve_authorized_user_datasets(DATASET, None) + await improve_skill(researcher, dataset=datasets[0], user=user, + proposal_id=proposal_id, apply=True) + return {"applied": True, "skill": researcher, "proposal_id": str(proposal_id), + "success_score": round(succ, 3)} + except Exception as e: + return {"applied": False, "reason": f"cognee error: {e}"} + + +# Singleton used by the API. +brain = CogneeBrain() diff --git a/cogneemind/backend/chat_intent.py b/cogneemind/backend/chat_intent.py new file mode 100644 index 0000000..5e6b845 --- /dev/null +++ b/cogneemind/backend/chat_intent.py @@ -0,0 +1,397 @@ +"""Chat intent extraction for the Ops Console. + +Two-stage pipeline: + 1. LLM-first — uses the OpenAI client (already a cognee dep) with the same + LLM_API_KEY the brain uses, returns a strict JSON action. + 2. Rule fallback — typo-tolerant regex parser. Always runs if the LLM is + unavailable, errors, returns garbage, or names an entity + that doesn't exist in the live world. + +Returned `Intent` is a flat dict the api.py dispatcher consumes: + + {"action": "delay", "flight": "AB104", "minutes": 60} + {"action": "close", "gate": "G3", "start": "08:00", "end": "13:00"} + {"action": "open", "gate": "G3"} + {"action": "add", "arrival": "09:15", "departure": "10:15", "gate": "G2" | None} + {"action": "move", "flight": "AB104", "gate": "G2"} + {"action": "storm", "minutes": 30} + {"action": "new_day"} + {"action": "reset"} + {"action": "lint"} + {"action": "help"} + {"action": "query", "text": ""} + {"action": "unknown", "text": ""} +""" +from __future__ import annotations + +import json +import os +import re +from typing import Any, Optional + +# --------------------------------------------------------------------------- # +# Helpers shared by both paths +# --------------------------------------------------------------------------- # +ACTIONS = { + "delay", "close", "open", "add", "move", "storm", + "new_day", "reset", "lint", "help", "query", +} + +_DUR_UNITS = { + "h": 60, "hr": 60, "hrs": 60, "hour": 60, "hours": 60, + "m": 1, "min": 1, "mins": 1, "minute": 1, "minutes": 1, +} +_TIME_RE = re.compile(r"\b(\d{1,2})[:h](\d{2})\b") +_DUR_RE = re.compile(r"(\d+(?:\.\d+)?)\s*(hours?|hrs?|h|minutes?|mins?|m)\b", re.I) +_FLIGHT_RE = re.compile(r"\b([A-Z]{2}\s?\d{2,4})\b") +_GATE_RE = re.compile(r"\b(g\s?\d{1,2})\b", re.I) + + +def _normalize_flight(s: str) -> str: + return s.replace(" ", "").upper() + + +def _normalize_gate(s: str) -> str: + return s.replace(" ", "").upper() + + +def _parse_minutes(text: str) -> Optional[int]: + """Best-effort duration: '1 hr', '40 mins', '1h30m', 'an hour', 'half an hour'.""" + text = text.lower() + # check 'half an hour' BEFORE 'an hour' so the half-prefix wins + if re.search(r"\bhalf\s+(an\s+)?hour\b", text): + return 30 + if re.search(r"\b(an?|one)\s+hour\b", text): + return 60 + total = 0 + for n, u in _DUR_RE.findall(text): + u = u.lower() + mult = _DUR_UNITS.get(u, _DUR_UNITS.get(u.rstrip("s"), 1)) + total += int(float(n) * mult) + return total or None + + +def _parse_time(text: str) -> Optional[str]: + m = _TIME_RE.search(text) + if not m: + return None + h, mn = int(m.group(1)), int(m.group(2)) + if 0 <= h < 24 and 0 <= mn < 60: + return f"{h:02d}:{mn:02d}" + return None + + +def _bump_hhmm(t: str, minutes: int) -> str: + h, m = t.split(":") + total = int(h) * 60 + int(m) + minutes + total %= 24 * 60 + return f"{total // 60:02d}:{total % 60:02d}" + + +def _hhmm_min(t: str) -> int: + """Convert HH:MM to minutes-since-midnight; defensive on garbage input.""" + try: + h, m = t.split(":") + return int(h) * 60 + int(m) + except Exception: + return -1 + + +# --------------------------------------------------------------------------- # +# World-aware validation: fixes typos by matching against live IDs +# --------------------------------------------------------------------------- # +def _resolve_flight(raw: str, flight_ids: list[str]) -> Optional[str]: + if not raw: + return None + target = _normalize_flight(raw) + if target in flight_ids: + return target + # tolerate a single edit: AB10 vs AB104, AB1O4 vs AB104, etc. + for fid in flight_ids: + if _close_enough(target, fid, max_edits=1): + return fid + return None + + +def _resolve_gate(raw: str, gate_ids: list[str]) -> Optional[str]: + if not raw: + return None + target = _normalize_gate(raw) + if target in gate_ids: + return target + if _close_enough(target, "G" + target.lstrip("G"), max_edits=0): + # already handled above; this just keeps the symmetry simple + pass + for gid in gate_ids: + if _close_enough(target, gid, max_edits=1): + return gid + return None + + +def _close_enough(a: str, b: str, max_edits: int = 1) -> bool: + if a == b: + return True + if abs(len(a) - len(b)) > max_edits: + return False + # Levenshtein with early exit; tiny strings, fine to be naive. + n, m = len(a), len(b) + prev = list(range(m + 1)) + for i in range(1, n + 1): + cur = [i] + [0] * m + for j in range(1, m + 1): + cost = 0 if a[i - 1] == b[j - 1] else 1 + cur[j] = min(cur[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost) + if min(cur) > max_edits: + return False + prev = cur + return prev[m] <= max_edits + + +# --------------------------------------------------------------------------- # +# Rule-based parser (deterministic fallback / "no LLM" mode) +# --------------------------------------------------------------------------- # +_DELAY_STEMS = ("delay", "delaz", "deal", "late", "push", "slip", "slip ") +_CLOSE_STEMS = ("clos", "cls", "shut", "block") # 'cls' tolerates 'clsoed'/'clsed' typos +_OPEN_STEMS = ("open", "reopen", "unblock", "restore") +_ADD_STEMS = ("add", "new flight", "insert", "schedul") +_MOVE_STEMS = ("move", "swap", "reassign", "shift to", "send to") +_STORM_STEMS = ("storm", "weather", "cascading") +_NEW_DAY = ("new day", "fresh day", "fresh schedule", "tomorrow", "rollover") +_HELP_STEMS = ("help", "what can you", "how do i") + + +def parse_rules(text: str, flight_ids: list[str], gate_ids: list[str]) -> dict: + """Deterministic parser. Always returns a valid Intent dict.""" + raw = text.strip() + t = raw.lower() + + if not t: + return {"action": "unknown", "text": raw} + + if any(s in t for s in _NEW_DAY): + return {"action": "new_day"} + if "reset" in t: + return {"action": "reset"} + if "lint" in t: + return {"action": "lint"} + if any(s in t for s in _HELP_STEMS): + return {"action": "help"} + + fmatch = _FLIGHT_RE.search(raw.upper()) + flight_raw = fmatch.group(1) if fmatch else None + flight = _resolve_flight(flight_raw, flight_ids) if flight_raw else None + + gates_in_text = [_resolve_gate(m.group(1), gate_ids) for m in _GATE_RE.finditer(raw)] + gates_in_text = [g for g in gates_in_text if g] + gate = gates_in_text[0] if gates_in_text else None + + minutes = _parse_minutes(t) + time_str = _parse_time(t) + + # CLOSE / OPEN gate + if gate and any(s in t for s in _OPEN_STEMS): + return {"action": "open", "gate": gate} + if gate and any(s in t for s in _CLOSE_STEMS): + out: dict[str, Any] = {"action": "close", "gate": gate} + # Only attach explicit times if the user actually wrote a window + # ("from HH:MM to HH:MM"); otherwise let the dispatcher derive it. + m_range = re.search(r"(\d{1,2}:\d{2})\s*(?:to|-|until|till|–)\s*(\d{1,2}:\d{2})", t) + if m_range: + s, e = m_range.group(1), m_range.group(2) + if _hhmm_min(s) < _hhmm_min(e): + out["start"], out["end"] = s, e + return out + + # DELAY a specific flight + if flight and (any(s in t for s in _DELAY_STEMS) or minutes): + return {"action": "delay", "flight": flight, "minutes": minutes or 30} + + # MOVE flight to gate + if flight and gate and any(s in t for s in _MOVE_STEMS): + return {"action": "move", "flight": flight, "gate": gate} + + # STORM (delay 4 internationals 30 min — same as the demo button) + if any(s in t for s in _STORM_STEMS): + return {"action": "storm", "minutes": minutes or 30} + + # ADD a flight + if any(s in t for s in _ADD_STEMS): + arr = time_str or "08:30" + out: dict[str, Any] = {"action": "add", "arrival": arr, + "departure": _bump_hhmm(arr, 60)} + if gate: + out["gate"] = gate + return out + + # Looks like a question (best/strategy/recall/why/what)? + if any(w in t for w in ("best", "strateg", "recall", "why", "what", "wiki", "memory", "?")): + return {"action": "query", "text": raw} + + return {"action": "unknown", "text": raw} + + +# --------------------------------------------------------------------------- # +# LLM parser (primary path when LLM_API_KEY is set) +# --------------------------------------------------------------------------- # +_SYSTEM_PROMPT = """You translate messy airport-ops chatter into a single JSON action. + +Schema (return ONE of these, no prose, no code fences): + {"action":"delay","flight":"","minutes":} + {"action":"close","gate":"G","start":"HH:MM","end":"HH:MM"} + {"action":"open","gate":"G"} + {"action":"add","arrival":"HH:MM","departure":"HH:MM","gate":"G"|null} + {"action":"move","flight":"","gate":"G"} + {"action":"storm","minutes":} + {"action":"new_day"} + {"action":"reset"} + {"action":"lint"} + {"action":"help"} + {"action":"query","text":""} + +Rules: +- The user often types with heavy typos: "deallzed bs 40 mins" = delay 40 min, + "g4 gate is clsoed" = close G4, "ab104 dealz bs 1hr" = delay AB104 60 min. +- Flight IDs and gate IDs MUST be from the lists provided. If you can't match + one confidently, return action="query". +- For action=close: only set "start"/"end" if the user EXPLICITLY gave times + ("close G4 from 09:00 to 11:00"). Otherwise OMIT both fields — the server + will derive the operational window from the live schedule. NEVER fabricate + "00:00" or any default times yourself. +- For action=delay: minutes MUST be > 0. Default to 30 if unspecified. +- "1 hr"/"an hour" = 60 min. "half an hour" = 30. "40 mins" = 40. +- "storm"/"weather"/"cascading delays" without a flight ID = action=storm. +- "new day"/"tomorrow"/"fresh schedule" = new_day (keeps the wiki). +- If unclear, choose action="query" with the original text — never guess IDs. +- Output ONLY the JSON object. No commentary.""" + + +def _llm_available() -> bool: + if not os.environ.get("LLM_API_KEY") and not os.environ.get("OPENAI_API_KEY"): + return False + try: + import openai # noqa: F401 + return True + except Exception: + return False + + +async def parse_llm(text: str, flight_ids: list[str], gate_ids: list[str]) -> Optional[dict]: + """Returns a validated Intent dict, or None on any failure.""" + if not _llm_available(): + return None + try: + from openai import AsyncOpenAI + except Exception: + return None + api_key = os.environ.get("LLM_API_KEY") or os.environ.get("OPENAI_API_KEY") + model = os.environ.get("LLM_MODEL", "gpt-4o-mini") + client = AsyncOpenAI(api_key=api_key) + user_msg = ( + f"Live flight IDs: {', '.join(flight_ids)}\n" + f"Live gate IDs: {', '.join(gate_ids)}\n" + f"User: {text}" + ) + try: + resp = await client.chat.completions.create( + model=model, + response_format={"type": "json_object"}, + temperature=0, + timeout=8, + messages=[ + {"role": "system", "content": _SYSTEM_PROMPT}, + {"role": "user", "content": user_msg}, + ], + ) + raw = resp.choices[0].message.content or "{}" + data = json.loads(raw) + except Exception: + return None + + return _validate(data, text, flight_ids, gate_ids) + + +def _validate(data: Any, text: str, flight_ids: list[str], gate_ids: list[str]) -> Optional[dict]: + if not isinstance(data, dict): + return None + action = data.get("action") + if action not in ACTIONS and action != "unknown": + return None + + if action == "delay": + flight = _resolve_flight(str(data.get("flight", "")), flight_ids) + mins = data.get("minutes") + try: + mins = int(mins) + except Exception: + mins = 30 + if not flight: + return None + if mins <= 0: + mins = 30 # default to a real disruption rather than a no-op + return {"action": "delay", "flight": flight, "minutes": mins} + + if action == "close": + gate = _resolve_gate(str(data.get("gate", "")), gate_ids) + if not gate: + return None + out: dict[str, Any] = {"action": "close", "gate": gate} + # Only carry start/end forward if the user (or LLM) supplied a real, + # non-degenerate window. Otherwise omit — the dispatcher will derive + # the closure window from the live schedule. + start = (data.get("start") or "").strip() + end = (data.get("end") or "").strip() + if (_TIME_RE.match(start) and _TIME_RE.match(end) + and _hhmm_min(start) < _hhmm_min(end)): + out["start"], out["end"] = start, end + return out + + if action == "open": + gate = _resolve_gate(str(data.get("gate", "")), gate_ids) + if not gate: + return None + return {"action": "open", "gate": gate} + + if action == "add": + arr = data.get("arrival") or "08:30" + dep = data.get("departure") or _bump_hhmm(arr, 60) + if not _TIME_RE.match(arr) or not _TIME_RE.match(dep): + return None + out: dict[str, Any] = {"action": "add", "arrival": arr, "departure": dep} + gate = _resolve_gate(str(data.get("gate") or ""), gate_ids) + if gate: + out["gate"] = gate + return out + + if action == "move": + flight = _resolve_flight(str(data.get("flight", "")), flight_ids) + gate = _resolve_gate(str(data.get("gate", "")), gate_ids) + if not (flight and gate): + return None + return {"action": "move", "flight": flight, "gate": gate} + + if action == "storm": + mins = data.get("minutes") or 30 + try: + mins = int(mins) + except Exception: + mins = 30 + return {"action": "storm", "minutes": mins} + + if action in ("new_day", "reset", "lint", "help"): + return {"action": action} + + if action == "query": + return {"action": "query", "text": str(data.get("text") or text)} + + return None + + +# --------------------------------------------------------------------------- # +# Public entry point used by api.py +# --------------------------------------------------------------------------- # +async def extract_intent(text: str, flight_ids: list[str], gate_ids: list[str]) -> dict: + """LLM-first, rule-fallback. Always returns a valid Intent.""" + intent = await parse_llm(text, flight_ids, gate_ids) + if intent and intent.get("action") not in (None, "unknown"): + return intent + return parse_rules(text, flight_ids, gate_ids) diff --git a/cogneemind/backend/data/flights.json b/cogneemind/backend/data/flights.json new file mode 100644 index 0000000..45f6ea9 --- /dev/null +++ b/cogneemind/backend/data/flights.json @@ -0,0 +1,17 @@ +[ + { "id": "AB101", "airline": "AeroBlue", "arrival": "06:30", "departure": "07:45", "type": "domestic", "preferred": ["G1", "G2"] }, + { "id": "AB102", "airline": "AeroBlue", "arrival": "07:00", "departure": "08:30", "type": "domestic", "preferred": ["G1", "G2"] }, + { "id": "CD201", "airline": "CloudAir", "arrival": "07:15", "departure": "09:30", "type": "international", "preferred": ["G4"] }, + { "id": "EF301", "airline": "EastFly", "arrival": "07:45", "departure": "08:40", "type": "domestic", "preferred": ["G2", "G3"] }, + { "id": "GH401", "airline": "GoHop", "arrival": "08:00", "departure": "10:15", "type": "international", "preferred": ["G4", "G5"] }, + { "id": "AB103", "airline": "AeroBlue", "arrival": "08:20", "departure": "09:10", "type": "domestic", "preferred": ["G1", "G3"] }, + { "id": "IJ501", "airline": "IslandJet", "arrival": "08:45", "departure": "11:00", "type": "international", "preferred": ["G4", "G5"] }, + { "id": "EF302", "airline": "EastFly", "arrival": "09:00", "departure": "10:05", "type": "domestic", "preferred": ["G3", "G6"] }, + { "id": "CD202", "airline": "CloudAir", "arrival": "09:30", "departure": "12:00", "type": "international", "preferred": ["G4"] }, + { "id": "AB104", "airline": "AeroBlue", "arrival": "09:45", "departure": "10:50", "type": "domestic", "preferred": ["G1", "G2"] }, + { "id": "GH402", "airline": "GoHop", "arrival": "10:10", "departure": "11:40", "type": "domestic", "preferred": ["G3", "G6"] }, + { "id": "IJ502", "airline": "IslandJet", "arrival": "10:30", "departure": "13:15", "type": "international", "preferred": ["G5"] }, + { "id": "EF303", "airline": "EastFly", "arrival": "11:00", "departure": "12:10", "type": "domestic", "preferred": ["G2", "G3"] }, + { "id": "AB105", "airline": "AeroBlue", "arrival": "11:20", "departure": "12:45", "type": "domestic", "preferred": ["G1", "G6"] }, + { "id": "CD203", "airline": "CloudAir", "arrival": "11:45", "departure": "14:00", "type": "international", "preferred": ["G4", "G5"] } +] diff --git a/cogneemind/backend/data/gates.json b/cogneemind/backend/data/gates.json new file mode 100644 index 0000000..6a0077b --- /dev/null +++ b/cogneemind/backend/data/gates.json @@ -0,0 +1,9 @@ +[ + { "id": "G1", "position": 1, "type": "both", "terminal": "A", "label": "near main terminal" }, + { "id": "G2", "position": 2, "type": "domestic", "terminal": "A", "label": "domestic only" }, + { "id": "G3", "position": 3, "type": "both", "terminal": "A", "label": "central" }, + { "id": "G4", "position": 4, "type": "international", "terminal": "B", "label": "international only" }, + { "id": "G5", "position": 5, "type": "both", "terminal": "B", "label": "far" }, + { "id": "G6", "position": 6, "type": "domestic", "terminal": "B", "label": "far domestic" }, + { "id": "G7", "position": 7, "type": "both", "terminal": "B", "label": "overflow stand" } +] diff --git a/cogneemind/backend/data/rules.md b/cogneemind/backend/data/rules.md new file mode 100644 index 0000000..13e80b0 --- /dev/null +++ b/cogneemind/backend/data/rules.md @@ -0,0 +1,37 @@ +# CogneeMind — Gate Assignment Rulebook + +This is the durable rulebook for the Airport Gate-Ops Brain. Hard rules are +never broken; soft goals are optimization targets that the score trades off. + +## Hard rules (never violated) + +1. **Gate capacity** — a gate serves at most one flight at a time. A flight + occupies its gate from arrival to departure, plus a **15-minute buffer** + afterwards for turnaround/cleaning. +2. **One gate per flight** — every flight is assigned to exactly one gate, or + explicitly flagged "no gate" (remote stand / bus boarding). +3. **Compatibility** — a flight may only use a gate whose `type` accepts it. + `domestic` gates take domestic flights, `international` gates take + international flights, `both` gates take either. + +## Soft goals (minimize, weighted in the score) + +- **Passenger walking** — prefer assigning a flight to one of its `preferred` + gates; penalty grows with distance (gate `position`) from the nearest + preferred gate. +- **Operational stability** — avoid changing a flight's gate between plans; + each reassignment is penalized. + +## Score (lower is better) + +``` +Score = 1000*U + 500*C + 1*W + 5*R +``` + +- `U` = flights with no gate (remote stand) +- `C` = gate conflicts (overlapping flights on one gate) +- `W` = total walking penalty (distance from preferred gates) +- `R` = reassignments vs the previous plan + +Missing gates and conflicts are catastrophic; walking is mildly bad; churn is +penalized so the plan stays stable for staff. diff --git a/cogneemind/backend/disruptions.py b/cogneemind/backend/disruptions.py new file mode 100644 index 0000000..14d4876 --- /dev/null +++ b/cogneemind/backend/disruptions.py @@ -0,0 +1,73 @@ +"""Disruption injectors + disruption-signature for the wiki index. + +A disruption mutates the flight/gate world. Applied on top of an existing +assignment it can produce a *stale* plan with conflicts/unassigned flights — +which the Observer detects and the Researcher then heals. +""" +from __future__ import annotations + +from simulator import Flight, Gate, hhmm_to_min + + +def add_flight(flights: list[Flight], *, id: str, airline: str, arrival: str, + departure: str, type: str = "domestic", preferred=None) -> list[Flight]: + flights = list(flights) + flights.append(Flight(id, airline, hhmm_to_min(arrival), hhmm_to_min(departure), + type, list(preferred or []))) + return flights + + +def close_gate(gates: list[Gate], gate_id: str, start: str, end: str) -> list[Gate]: + gates = [Gate(g.id, g.position, g.type, g.terminal, g.label, list(g.closed_windows)) for g in gates] + for g in gates: + if g.id == gate_id: + g.closed_windows.append((hhmm_to_min(start), hhmm_to_min(end))) + return gates + + +def apply_delays(flights: list[Flight], ids: list[str], minutes: int) -> list[Flight]: + out = [] + for f in flights: + if f.id in ids: + out.append(Flight(f.id, f.airline, f.arrival + minutes, f.departure + minutes, + f.type, list(f.preferred), delay=f.delay + minutes)) + else: + out.append(f) + return out + + +def delay_flight(flights: list[Flight], flight_id: str, minutes: int) -> list[Flight]: + """Delay a single flight by `minutes` (negative = pull earlier).""" + return apply_delays(flights, [flight_id], minutes) + + +def open_gate(gates: list[Gate], gate_id: str) -> list[Gate]: + """Re-open a gate by clearing its closed windows.""" + out = [Gate(g.id, g.position, g.type, g.terminal, g.label, list(g.closed_windows)) for g in gates] + for g in out: + if g.id == gate_id: + g.closed_windows = [] + return out + + +def move_flight(flights: list[Flight], flight_id: str, gate_id: str) -> list[Flight]: + """Pin a flight's preference to a single gate so the next assignment + places it there if feasible (falls back to other gates otherwise).""" + out = [] + for f in flights: + if f.id == flight_id: + out.append(Flight(f.id, f.airline, f.arrival, f.departure, f.type, + [gate_id], delay=f.delay)) + else: + out.append(f) + return out + + +def signature(kind: str, **meta) -> str: + """Short, recall-friendly disruption signature used as the wiki index key. + + e.g. 'delay:storm:heavy', 'gate_closed:central', 'new_flight:busy_window'. + The Researcher recalls past winning strategies by this signature. + """ + tags = ":".join(str(v) for v in meta.values() if v is not None) + return f"{kind}:{tags}" if tags else kind diff --git a/cogneemind/backend/evidence.py b/cogneemind/backend/evidence.py new file mode 100644 index 0000000..8e8c9fd --- /dev/null +++ b/cogneemind/backend/evidence.py @@ -0,0 +1,74 @@ +"""Capture the self-improvement / compounding evidence for the submission. + +Run: python evidence.py +Prints a judge-readable before/after block and writes evidence.json. +""" +from __future__ import annotations + +import json + +import agents as A +import disruptions as D +import simulator as S +from memory import LocalWiki, strategy_key + + +def baseline_vs_improved(): + """A storm hits: the naive default (what worked on the calm base) strands a + flight; the strategy the brain discovers heals it back to zero remote stands.""" + gates = S.load_gates() + storm = D.apply_delays(S.load_flights(), ["CD201", "GH401", "IJ501", "CD202"], 30) + naive = {"name": "earliest_arrival", "priority_key": "earliest_arrival", + "soft_weights": {"walking": 1.0, "stability": 1.0}, "applies_to": "storm"} + storm_naive = S.assign(storm, gates, naive) + + sig = D.signature("delay", weather="storm", severity="heavy") + wiki = LocalWiki(path=S.DATA_DIR / "wiki_evidence.json"); wiki.reset() + res = A.researcher_discover(storm, gates, sig, wiki) # cold discovery + return { + "baseline": {"strategy": "earliest_arrival", "score": storm_naive["score"]}, + "improved": {"strategy": res.strategy["name"], "score": res.plan["score"], "evals": res.evals}, + } + + +def cold_vs_warm(budget=2): + """Same storm, same tiny re-planning budget — cold wiki vs warm wiki.""" + gates = S.load_gates() + storm = D.apply_delays(S.load_flights(), ["CD201", "GH401", "IJ501", "CD202"], 30) + sig = D.signature("delay", weather="storm", severity="heavy") + + wiki = LocalWiki(path=S.DATA_DIR / "wiki_evidence.json"); wiki.reset() + cold = A.researcher_discover(storm, gates, sig, wiki, budget=budget) + full = A.researcher_discover(storm, gates, sig, wiki) # full-budget cold to learn + wiki.promote(sig, full.strategy, full.dead_ends, full.plan["score"]["total"], "seed") + warm = A.researcher_discover(storm, gates, sig, wiki, budget=budget) + return { + "scenario": sig, "budget": budget, + "cold": {"score": cold.plan["score"]["total"], "evals": cold.evals, + "tried": [t["name"] for t in cold.trace], "dead_ends_known": 0}, + "warm": {"score": warm.plan["score"]["total"], "evals": warm.evals, + "tried": [t["name"] for t in warm.trace], + "recalled": warm.source == "warm"}, + "full_budget_cold": {"score": full.plan["score"]["total"], "evals": full.evals}, + } + + +if __name__ == "__main__": + bi = baseline_vs_improved() + cw = cold_vs_warm() + out = {"baseline_vs_improved": bi, "cold_vs_warm": cw} + + print("\n=== SELF-IMPROVEMENT (base schedule) ===") + print(f" baseline earliest_arrival -> {bi['baseline']['score']['total']} " + f"(U={bi['baseline']['score']['U']})") + print(f" improved {bi['improved']['strategy']:16s} -> {bi['improved']['score']['total']} " + f"(U={bi['improved']['score']['U']}, {bi['improved']['evals']} evals)") + + print("\n=== COMPOUNDING (storm, 2-try budget) ===") + print(f" COLD wiki : score {cw['cold']['score']:>7} ({cw['cold']['evals']} evals) tried {cw['cold']['tried']}") + print(f" WARM wiki : score {cw['warm']['score']:>7} ({cw['warm']['evals']} evals) tried {cw['warm']['tried']}") + print(f" full cold : score {cw['full_budget_cold']['score']} took {cw['full_budget_cold']['evals']} evals " + f"-> warm reaches it in {cw['warm']['evals']}") + + (S.DATA_DIR / "evidence.json").write_text(json.dumps(out, indent=2)) + print("\nwrote data/evidence.json") diff --git a/cogneemind/backend/memory.py b/cogneemind/backend/memory.py new file mode 100644 index 0000000..469b493 --- /dev/null +++ b/cogneemind/backend/memory.py @@ -0,0 +1,114 @@ +"""Memory backends for the CogneeMind wiki. + +Two interchangeable implementations behind the same small interface: + * LocalWiki — JSON file on disk, always works (no external deps). Default. + * CogneeWiki — Cognee permanent graph + session memory (brain.py). + +The agent loop only talks to this interface, so we can develop/demo without +Cognee and swap it in when the kickoff packages land. +""" +from __future__ import annotations + +import json +import time +from pathlib import Path +from typing import Protocol + +WIKI_PATH = Path(__file__).parent / "data" / "wiki.json" + + +def strategy_key(s: dict) -> str: + w = s.get("soft_weights", {}) + return f"{s.get('priority_key')}|w{w.get('walking',1)}|s{w.get('stability',1)}" + + +class Memory(Protocol): + def recall(self, signature: str) -> dict: ... + def promote(self, signature: str, winner: dict, dead_ends: list[str], + score: float, note: str) -> dict: ... + def history(self) -> list: ... + def lint(self) -> dict: ... + + +class LocalWiki: + """File-backed fallback wiki. Mirrors what the Cognee permanent graph holds: + a disruption->strategy index, a reusable strategy library, a dead-end list, + and a version timeline.""" + + def __init__(self, path: Path = WIKI_PATH): + self.path = path + self._load() + + def _load(self): + if self.path.exists(): + self.db = json.loads(self.path.read_text()) + else: + self.db = {"index": {}, "library": {}, "timeline": [], "version": 0} + + def _save(self): + self.path.write_text(json.dumps(self.db, indent=2)) + + def reset(self): + """Cold-start the brain (empty wiki) — used for the compounding A/B test.""" + self.db = {"index": {}, "library": {}, "timeline": [], "version": 0} + self._save() + + # -- warm start ------------------------------------------------------- # + def recall(self, signature: str) -> dict: + idx = self.db["index"] + entry = idx.get(signature) + if entry is None: + # fuzzy: fall back to same disruption kind (text before first ':') + kind = signature.split(":")[0] + cands = [v for k, v in idx.items() if k.split(":")[0] == kind] + entry = min(cands, key=lambda e: e.get("best_score", 1e9), default=None) + if entry is None: + return {"strategies": [], "dead_ends": [], "source": "cold"} + winners = [self.db["library"][k] for k in entry["winners"] if k in self.db["library"]] + return {"strategies": winners, "dead_ends": entry.get("dead_ends", []), + "source": "warm", "best_score": entry.get("best_score")} + + # -- distillation ----------------------------------------------------- # + def promote(self, signature: str, winner: dict, dead_ends: list[str], + score: float, note: str) -> dict: + wkey = strategy_key(winner) + self.db["library"][wkey] = winner + entry = self.db["index"].setdefault(signature, {"winners": [], "dead_ends": [], "best_score": 1e9}) + if wkey not in entry["winners"]: + entry["winners"].insert(0, wkey) + entry["dead_ends"] = sorted(set(entry["dead_ends"]) | set(dead_ends)) + entry["best_score"] = min(entry["best_score"], score) + self.db["version"] += 1 + version = self.db["version"] + self.db["timeline"].append({ + "version": version, "signature": signature, + "strategy": winner.get("name", wkey), "priority_key": winner.get("priority_key"), + "score": score, "note": note, "ts": time.time(), + }) + self._save() + return {"version": version} + + def history(self) -> list: + return self.db["timeline"] + + def index(self) -> dict: + return self.db["index"] + + # -- lint ------------------------------------------------------------- # + def lint(self) -> dict: + """Dedupe library, prune dead-end strategies from winner lists, keep + only the best winner per signature; report what changed.""" + removed = 0 + for sig, entry in self.db["index"].items(): + before = len(entry["winners"]) + entry["winners"] = [w for w in entry["winners"] if w not in entry["dead_ends"]] + # collapse to a single best winner (the head) — older ones are superseded + if len(entry["winners"]) > 1: + entry["winners"] = entry["winners"][:1] + removed += before - len(entry["winners"]) + used = {w for e in self.db["index"].values() for w in e["winners"]} + orphans = [k for k in self.db["library"] if k not in used] + for k in orphans: + del self.db["library"][k] + self._save() + return {"pruned_winners": removed, "pruned_library": len(orphans)} diff --git a/cogneemind/backend/my_skills/linter/SKILL.md b/cogneemind/backend/my_skills/linter/SKILL.md new file mode 100644 index 0000000..7a24686 --- /dev/null +++ b/cogneemind/backend/my_skills/linter/SKILL.md @@ -0,0 +1,16 @@ +--- +description: Keep the gate-ops wiki coherent — dedupe strategies, prune superseded versions, resolve conflicts. +allowed-tools: memory_search +--- + +# Instructions + +You are the **Linter**. Keep the Company Brain clean so recall stays sharp. + +1. **Dedupe** strategies that are effectively identical (same priority rule and + weights) into one library entry. +2. **Prune** superseded winners — keep only the best strategy per disruption + signature; demote the rest. +3. **Resolve conflicts** — if two wiki entries disagree on a rule, keep the one + with the better verified score and flag the contradiction. +4. Never delete a hard rule from the rulebook; only consolidate strategies. diff --git a/cogneemind/backend/my_skills/observer/SKILL.md b/cogneemind/backend/my_skills/observer/SKILL.md new file mode 100644 index 0000000..9b653cd --- /dev/null +++ b/cogneemind/backend/my_skills/observer/SKILL.md @@ -0,0 +1,17 @@ +--- +description: Watch the live gate plan against new events and decide when chaos warrants re-planning. +allowed-tools: memory_search +--- + +# Instructions + +You are the **Observer**. You watch the active plan as disruptions arrive (new +flights, gate closures, delays). + +1. Re-score the current plan against current reality after every event. +2. Raise **CHAOS** if any flight lost its gate (`U > 0`), any gate has an overlap + (`C > 0`), or the score crosses the chaos threshold. +3. On chaos, describe exactly what broke and where, then hand off to the + Researcher to re-discover a strategy. Otherwise report the plan healthy. +4. Note recurring disruption patterns (e.g. "storms 18:00–20:00 break tight + plans") so the Researcher can recall them next time. diff --git a/cogneemind/backend/my_skills/planner/SKILL.md b/cogneemind/backend/my_skills/planner/SKILL.md new file mode 100644 index 0000000..16d8f7d --- /dev/null +++ b/cogneemind/backend/my_skills/planner/SKILL.md @@ -0,0 +1,18 @@ +--- +description: Execute a chosen gate-assignment strategy into a concrete, valid plan (Gantt) and score it. +allowed-tools: memory_search +--- + +# Instructions + +You are the **Planner**. Take the strategy the Researcher chose and turn it into +a concrete gate plan. + +1. Apply the strategy's priority rule to order flights, then greedily place each + on the best feasible gate — never violate a hard rule (capacity, one gate per + flight, compatibility, gate closures). +2. Any flight with no feasible gate is flagged **remote stand**, not forced into + a conflict. +3. Compute the penalty score `1000*U + 500*C + 1*W + 5*R` and return the plan + + score breakdown for the Gantt. +4. Prefer keeping a flight on its previous gate when it's free (minimize churn). diff --git a/cogneemind/backend/my_skills/researcher/SKILL.md b/cogneemind/backend/my_skills/researcher/SKILL.md new file mode 100644 index 0000000..a62ae48 --- /dev/null +++ b/cogneemind/backend/my_skills/researcher/SKILL.md @@ -0,0 +1,24 @@ +--- +description: Discover the best gate-assignment strategy for a disruption, warm-started from the wiki of past winners and dead-ends. +allowed-tools: memory_search +--- + +# Instructions + +You are the **Researcher**. Your job is to pick the gate-assignment *strategy* +(a priority rule + soft-goal weights), not to assign gates yourself. + +1. **Recall first (warm start).** Search the Company Brain for strategies that + won on this disruption signature before, the building blocks they used, and + the dead-ends already proven bad. Start from those — never search from a + blank menu when memory exists. +2. **Propose few candidates.** Mutate/recombine the recalled winners (swap the + priority rule, reweight walking vs stability). Skip anything on the dead-end + list. Prefer the smallest search that could beat the current best. +3. **Hand off** the chosen strategy spec to the Planner for scoring. +4. After scoring, record the winner and any newly-proven dead-ends so the next + discovery starts smarter. + +Known strong rule so far: **`latest_departure`** (assign flights leaving latest +first) consistently beats naive `earliest_arrival`, especially under delays and +gate closures. Cite the wiki entry you relied on. diff --git a/cogneemind/backend/simulator.py b/cogneemind/backend/simulator.py new file mode 100644 index 0000000..8eabc5c --- /dev/null +++ b/cogneemind/backend/simulator.py @@ -0,0 +1,244 @@ +"""CogneeMind simulator: gate-assignment optimization + scoring. + +The actual assignment is deterministic Python (greedy by a priority rule), so +scoring is fast and reproducible. The *brain* (agents + Cognee wiki) only +chooses and tunes the STRATEGY spec that this module executes. +""" +from __future__ import annotations + +import json +from dataclasses import dataclass, field +from pathlib import Path +from typing import Optional + +DATA_DIR = Path(__file__).parent / "data" +BUFFER_MIN = 15 # turnaround buffer after departure before the gate frees up + + +# --------------------------------------------------------------------------- # +# Time helpers (internal representation is minutes since midnight) +# --------------------------------------------------------------------------- # +def hhmm_to_min(s: str) -> int: + h, m = s.split(":") + return int(h) * 60 + int(m) + + +def min_to_hhmm(t: int) -> str: + t = int(round(t)) + return f"{t // 60:02d}:{t % 60:02d}" + + +# --------------------------------------------------------------------------- # +# Data models +# --------------------------------------------------------------------------- # +@dataclass +class Gate: + id: str + position: int # 1 = closest to terminal, higher = farther + type: str # "domestic" | "international" | "both" + terminal: str + label: str = "" + closed_windows: list[tuple[int, int]] = field(default_factory=list) + + def accepts(self, flight: "Flight") -> bool: + if self.type != "both" and self.type != flight.type: + return False + return True + + def is_open(self, start: int, end: int) -> bool: + for cs, ce in self.closed_windows: + if start < ce and cs < end: # overlaps a closed window + return False + return True + + +@dataclass +class Flight: + id: str + airline: str + arrival: int # minutes + departure: int # minutes + type: str # "domestic" | "international" + preferred: list[str] = field(default_factory=list) + delay: int = 0 # minutes shifted by disruptions (already folded into arr/dep) + + @property + def turnaround(self) -> int: + return self.departure - self.arrival + + def occupies(self) -> tuple[int, int]: + """Window the gate is busy, including buffer.""" + return (self.arrival, self.departure + BUFFER_MIN) + + +# --------------------------------------------------------------------------- # +# Strategy spec — this is what the Researcher agent discovers / mutates and +# what the Cognee wiki stores as a reusable building block. +# --------------------------------------------------------------------------- # +PRIORITY_KEYS = { + "earliest_arrival": lambda f: (f.arrival, f.departure), + "earliest_departure": lambda f: (f.departure, f.arrival), + "tightest_turnaround": lambda f: (f.turnaround, f.arrival), + "longest_first": lambda f: (-f.turnaround, f.arrival), + "latest_departure": lambda f: (-f.departure, f.arrival), + # international flights fit fewer gates -> place the most constrained first + "constrained_first": lambda f: (0 if f.type == "international" else 1, f.arrival), +} + + +def default_strategy() -> dict: + return { + "name": "baseline", + "priority_key": "earliest_arrival", + "soft_weights": {"walking": 1.0, "stability": 1.0}, + "applies_to": "base", + } + + +# --------------------------------------------------------------------------- # +# Loading +# --------------------------------------------------------------------------- # +def load_gates(path: Optional[Path] = None) -> list[Gate]: + raw = json.loads((path or DATA_DIR / "gates.json").read_text()) + return [Gate(g["id"], g["position"], g["type"], g["terminal"], g.get("label", "")) for g in raw] + + +def load_flights(path: Optional[Path] = None) -> list[Flight]: + raw = json.loads((path or DATA_DIR / "flights.json").read_text()) + return [ + Flight(f["id"], f["airline"], hhmm_to_min(f["arrival"]), hhmm_to_min(f["departure"]), + f["type"], list(f.get("preferred", []))) + for f in raw + ] + + +# --------------------------------------------------------------------------- # +# Assignment (greedy by strategy) + scoring +# --------------------------------------------------------------------------- # +def _walking_penalty(gate: Gate, flight: Flight, gates_by_id: dict[str, Gate]) -> float: + if not flight.preferred: + return 0.0 + if gate.id in flight.preferred: + return 0.0 + prefs = [gates_by_id[g].position for g in flight.preferred if g in gates_by_id] + if not prefs: + return 0.0 + return float(min(abs(gate.position - p) for p in prefs)) + + +def assign(flights: list[Flight], gates: list[Gate], strategy: dict, + prev: Optional[dict[str, str]] = None) -> dict: + """Return a plan dict. Greedy: order flights by the strategy priority key, + then place each on the best feasible gate (compatible, open, no overlap).""" + prev = prev or {} + gates_by_id = {g.id: g for g in gates} + key_fn = PRIORITY_KEYS.get(strategy.get("priority_key", "earliest_arrival"), + PRIORITY_KEYS["earliest_arrival"]) + weights = strategy.get("soft_weights", {"walking": 1.0, "stability": 1.0}) + + order = sorted(flights, key=key_fn) + busy: dict[str, list[tuple[int, int]]] = {g.id: [] for g in gates} + assignment: dict[str, str] = {} + unassigned: list[str] = [] + + for fl in order: + start, end = fl.occupies() + feasible = [] + for g in gates: + if not g.accepts(fl) or not g.is_open(start, end): + continue + if any(start < be and bs < end for bs, be in busy[g.id]): + continue + feasible.append(g) + if not feasible: + unassigned.append(fl.id) + continue + # pick gate minimizing walking; prefer the previous gate only as a final + # tie-breaker so stability never costs us a worse packing (more no-gate). + def cost(g: Gate): + walk = _walking_penalty(g, fl, gates_by_id) * weights.get("walking", 1.0) + keep = 0 if prev.get(fl.id) == g.id else 1 # last tie-breaker + return (walk, g.position, keep) + best = min(feasible, key=cost) + assignment[fl.id] = best.id + busy[best.id].append((start, end)) + + return build_plan(flights, gates, assignment, unassigned, strategy, prev) + + +def conflicts(assignment: dict[str, str], flights_by_id: dict[str, Flight]) -> list[tuple[str, str]]: + """Pairs of flights that overlap on the same gate (should be empty after assign).""" + by_gate: dict[str, list[str]] = {} + for fid, gid in assignment.items(): + by_gate.setdefault(gid, []).append(fid) + out = [] + for gid, fids in by_gate.items(): + fids.sort(key=lambda f: flights_by_id[f].arrival) + for i in range(len(fids)): + for j in range(i + 1, len(fids)): + a, b = flights_by_id[fids[i]], flights_by_id[fids[j]] + as_, ae = a.occupies() + bs, be = b.occupies() + if as_ < be and bs < ae: + out.append((fids[i], fids[j])) + return out + + +def score(plan: dict, prev: Optional[dict[str, str]] = None) -> dict: + """Penalty score. Lower is better. Returns breakdown + total.""" + prev = prev or {} + flights_by_id = {f.id: f for f in plan["_flights"]} + gates_by_id = {g.id: g for g in plan["_gates"]} + assignment = plan["assignment"] + + U = len(plan["unassigned"]) + C = len(conflicts(assignment, flights_by_id)) + W = sum(_walking_penalty(gates_by_id[gid], flights_by_id[fid], gates_by_id) + for fid, gid in assignment.items()) + R = sum(1 for fid, gid in assignment.items() if fid in prev and prev[fid] != gid) + + total = 1000 * U + 500 * C + 1 * W + 5 * R + return {"total": round(total, 1), "U": U, "C": C, "W": round(W, 1), "R": R} + + +# --------------------------------------------------------------------------- # +# Plan packaging (JSON-friendly for the API/Gantt) +# --------------------------------------------------------------------------- # +def build_plan(flights, gates, assignment, unassigned, strategy, prev=None) -> dict: + flights_by_id = {f.id: f for f in flights} + conf_pairs = conflicts(assignment, flights_by_id) + conflicted = {f for pair in conf_pairs for f in pair} + bars = [] + for fl in flights: + gid = assignment.get(fl.id) + bars.append({ + "flight": fl.id, + "airline": fl.airline, + "gate": gid, + "arrival": min_to_hhmm(fl.arrival), + "departure": min_to_hhmm(fl.departure), + "arrival_min": fl.arrival, + "departure_min": fl.departure, + "type": fl.type, + "preferred": fl.preferred, + "status": "unassigned" if gid is None else ("conflict" if fl.id in conflicted else "ok"), + "delayed": fl.delay > 0, + }) + plan = { + "assignment": assignment, + "unassigned": unassigned, + "bars": bars, + "strategy": strategy, + "gates": [{"id": g.id, "position": g.position, "type": g.type, "label": g.label, + "closed": [[min_to_hhmm(s), min_to_hhmm(e)] for s, e in g.closed_windows]} + for g in gates], + "_flights": flights, + "_gates": gates, + } + plan["score"] = score(plan, prev) + return plan + + +def public_plan(plan: dict) -> dict: + """Strip internal objects for JSON serialization.""" + return {k: v for k, v in plan.items() if not k.startswith("_")} diff --git a/cogneemind/backend/test_chat_intents.py b/cogneemind/backend/test_chat_intents.py new file mode 100644 index 0000000..4aa24a5 --- /dev/null +++ b/cogneemind/backend/test_chat_intents.py @@ -0,0 +1,96 @@ +"""Standalone test for the chat intent parser (rule path). + +Runs without a server, without an LLM key, without cognee. Exercises the +typo-tolerant fallback parser against the exact garbage messages that broke +the Ops Console — plus the clean cases. + + .venv/bin/python test_chat_intents.py +""" +from __future__ import annotations + +from chat_intent import parse_rules + +FLIGHTS = [ + "AB101", "AB102", "AB103", "AB104", "AB105", + "CD201", "CD202", "CD203", + "EF301", "EF302", "EF303", + "GH401", "GH402", + "IJ501", "IJ502", +] +GATES = ["G1", "G2", "G3", "G4", "G5", "G6", "G7"] + + +CASES: list[tuple[str, dict]] = [ + # The exact messes from the user transcript: + ("AB104 IS deallzed ba 1 hr", {"action": "delay", "flight": "AB104", "minutes": 60}), + ("G4 FLIGHT AB104 DEALZED BS 40 MINS", + {"action": "delay", "flight": "AB104", "minutes": 40}), + ("ok then update", {"action": "unknown"}), + + # The basic verbs. Close WITHOUT an explicit window must omit start/end + # so the dispatcher derives them from the live schedule (no hardcoded times). + ("close G3", {"action": "close", "gate": "G3"}), + ("g4 gate is clsoed", {"action": "close", "gate": "G4"}), + ("close g4", {"action": "close", "gate": "G4"}), + # Explicit window: parser MUST carry it through. + ("close G3 from 09:00 to 11:30", {"action": "close", "gate": "G3", "start": "09:00", "end": "11:30"}), + ("reopen G3", {"action": "open", "gate": "G3"}), + ("open g3", {"action": "open", "gate": "G3"}), + + # Per-flight delay variants: + ("delay AB104 by 30 min", {"action": "delay", "flight": "AB104", "minutes": 30}), + ("ab104 late half an hour", {"action": "delay", "flight": "AB104", "minutes": 30}), + ("push CD202 30m", {"action": "delay", "flight": "CD202", "minutes": 30}), + + # Add / move / storm / new day: + ("add flight 09:15", {"action": "add", "arrival": "09:15"}), + ("new flight 10:30 to G2", {"action": "add", "arrival": "10:30", "gate": "G2"}), + ("move AB104 to G2", {"action": "move", "flight": "AB104", "gate": "G2"}), + ("storm", {"action": "storm"}), + ("cascading delays 45 min", {"action": "storm", "minutes": 45}), + ("new day", {"action": "new_day"}), + ("tomorrow please", {"action": "new_day"}), + ("reset", {"action": "reset"}), + ("lint wiki", {"action": "lint"}), + ("help", {"action": "help"}), + + # Query phrasings (must NOT dump raw recall — that's the dispatcher's job): + ("what is the best strategy?", {"action": "query"}), + ("why did the brain pick that?", {"action": "query"}), +] + + +def _matches(actual: dict, expected: dict) -> bool: + return all(actual.get(k) == v for k, v in expected.items()) + + +def main() -> int: + fails = 0 + for text, expected in CASES: + got = parse_rules(text, FLIGHTS, GATES) + ok = _matches(got, expected) + status = "ok " if ok else "FAIL" + print(f" [{status}] {text!r:50s} -> {got}") + if not ok: + print(f" expected superset: {expected}") + fails += 1 + + # Negative assertion: 'close g4' (no times given) must NOT carry hardcoded + # start/end forward; the dispatcher derives the window from live schedule. + no_window = parse_rules("close g4", FLIGHTS, GATES) + if "start" in no_window or "end" in no_window: + print(f" [FAIL] 'close g4' leaked hardcoded times: {no_window}") + fails += 1 + else: + print(f" [ok ] 'close g4' correctly omits start/end (dispatcher derives them)") + + print() + if fails: + print(f"{fails} test case(s) failed.") + return 1 + print(f"All {len(CASES)} cases passed.") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/cogneemind/backend/test_cognee.py b/cogneemind/backend/test_cognee.py new file mode 100644 index 0000000..2f5fb91 --- /dev/null +++ b/cogneemind/backend/test_cognee.py @@ -0,0 +1,98 @@ +"""Standalone de-risk test for the Cognee path: ingest -> agentic search -> +SkillRunEntry (propose) -> improve_skill (apply) -> recall. + +Run from backend/: python test_cognee.py +Loads .env for LLM_API_KEY. +""" +import asyncio +import os +from pathlib import Path + +# Load .env into the environment. +for line in Path(".env").read_text().splitlines(): + if "=" in line and not line.strip().startswith("#"): + k, v = line.split("=", 1) + os.environ.setdefault(k.strip(), v.strip()) + +import cognee +from cognee import SearchType +from cognee.memory import SkillRunEntry +from cognee.modules.engine.operations.setup import setup +from cognee.modules.pipelines.layers.resolve_authorized_user_datasets import ( + resolve_authorized_user_datasets, +) +from cognee.modules.memify.skill_improvement import improve_skill + +DATASET = "cogneemind" +SESSION = "storm-run-1" +SKILLS_DIR = "./my_skills" + + +def items_of(result): + return getattr(result, "items", None) or (result.get("items", []) if isinstance(result, dict) else []) + + +async def main(): + print("→ prune + setup") + await cognee.prune.prune_data() + await cognee.prune.prune_system(metadata=True) + await setup() + + print("→ ingest rulebook (permanent graph)") + await cognee.remember(Path("data/rules.md").read_text(), dataset_name=DATASET) + + print("→ ingest skills") + remembered = await cognee.remember(SKILLS_DIR, dataset_name=DATASET, content_type="skills") + skills = [it["name"] for it in items_of(remembered) if it.get("kind") == "skill"] + print(" skills:", skills) + assert skills, "no skills ingested" + researcher = next((s for s in skills if "research" in s.lower()), skills[0]) + + print("→ agentic search over skills (session memory)") + answer = await cognee.search( + "A storm delayed 4 international arrivals. Which gate strategy should the Researcher pick? Answer briefly.", + query_type=SearchType.AGENTIC_COMPLETION, + datasets=[DATASET], skills=skills, max_iter=4, session_id=SESSION, + ) + print(" answer:", str(answer)[:240]) + + print("→ record SkillRunEntry (propose, apply=False)") + user, datasets = await resolve_authorized_user_datasets(DATASET, None) + dataset = datasets[0] + proposal_result = await cognee.remember( + SkillRunEntry( + selected_skill_id=researcher, + task_text="Choose a gate strategy for delay:storm:heavy", + result_summary="earliest_arrival stranded 1 flight (penalty 1003).", + success_score=0.2, + feedback=-1.0, + ), + dataset_name=DATASET, session_id=SESSION, + skill_improvement={"skill_name": researcher, "apply": False, "score_threshold": 0.9}, + ) + pid = next((it.get("proposal_id") for it in items_of(proposal_result) + if it.get("kind") == "skill_improvement_proposal"), None) + print(" proposal_id:", pid) + + if pid: + print("→ apply proposal (improve_skill apply=True)") + applied = await improve_skill(researcher, dataset=dataset, user=user, + proposal_id=pid, apply=True) + print(" applied:", str(applied)[:200]) + else: + print(" (no proposal generated)") + + print("→ distill winner to permanent graph + recall") + await cognee.remember( + "Winning strategy for disruption delay:storm:heavy: priority rule " + "'latest_departure' achieved penalty 6 with zero remote stands.", + dataset_name=DATASET, + ) + recalled = await cognee.recall("best gate strategy for a storm") + print(" recall:", str(recalled)[:240]) + + print("\n✅ Cognee path works end-to-end.") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/cogneemind/frontend/.gitignore b/cogneemind/frontend/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/cogneemind/frontend/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/cogneemind/frontend/README.md b/cogneemind/frontend/README.md new file mode 100644 index 0000000..7dbf7eb --- /dev/null +++ b/cogneemind/frontend/README.md @@ -0,0 +1,73 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/cogneemind/frontend/eslint.config.js b/cogneemind/frontend/eslint.config.js new file mode 100644 index 0000000..ef614d2 --- /dev/null +++ b/cogneemind/frontend/eslint.config.js @@ -0,0 +1,22 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + globals: globals.browser, + }, + }, +]) diff --git a/cogneemind/frontend/final.png b/cogneemind/frontend/final.png new file mode 100644 index 0000000000000000000000000000000000000000..4c640f91764b7f9d6182ed516f6f809ac39c2ab8 GIT binary patch literal 243278 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 z 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