546aeeed70
Adds the team_model graph layer (the "it learned" view) and its visualization,
per docs/graph.md. Demo-backed first; built on origin/main conventions.
- shared: PodGraph / node / edge / metric types + GraphNodeDoc / GraphEdgeDoc
- backend/src/graph: demo graph data; Mongo store (loadPodGraph w/ demo
fallback, seedGraph, reachFrom via $graphLookup); graph:seed script
- backend/src/server.ts: additive GET /api/pods/:id/graph + /graph/reach/:node
- frontend: dark-Bauhaus GraphView + fetch helper, reachable from a
"Team memory" toggle in App.tsx
- docs/graph.md: spec (data model, $graphLookup, API, demo-first plan)
Demo-backed: the route serves a grounded demo graph when team_model has no
graph yet; graph:seed writes team_model + graph_nodes/graph_edges so the
$graphLookup traversal is real. Swap loadPodGraph to live team_model later.
Known follow-ups before merge: branch is based on 65a0791; origin/main is now
at 1294b84, so this needs a rebase + App.tsx conflict resolution (teammate
rewrote App.tsx with live room view / one-click join).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
70 lines
2.1 KiB
TypeScript
70 lines
2.1 KiB
TypeScript
/**
|
||
* Continual-learning graph: PodMan's visible "it learned" surface. A render of
|
||
* the per-pod team_model — who owns/edits which files, where work collides, and
|
||
* what PodMan learned from accepted interventions (the `learned_from` edges).
|
||
*
|
||
* Served embedded in the `team_model` document; mirrored into `graph_nodes` /
|
||
* `graph_edges` collections so the model can be walked with MongoDB
|
||
* `$graphLookup`. See docs/graph.md.
|
||
*/
|
||
|
||
export type PodGraphNodeKind = 'engineer' | 'feature' | 'file' | 'collision' | 'intervention';
|
||
|
||
export type PodGraphEdgeKind =
|
||
'owns' | 'editing' | 'touches' | 'collides' | 'warns' | 'learned_from';
|
||
|
||
/** `learned` marks a node PodMan retained from a past accepted intervention. */
|
||
export type PodGraphNodeStatus = 'stable' | 'active' | 'risk' | 'learned';
|
||
|
||
export interface PodGraphNode {
|
||
/** Stable graph id, e.g. "engineer:karti" or "file:auth.ts". */
|
||
id: string;
|
||
kind: PodGraphNodeKind;
|
||
label: string;
|
||
summary: string;
|
||
/** 0–1 relative importance — drives node size in the viz. */
|
||
weight: number;
|
||
status: PodGraphNodeStatus;
|
||
/** Layout position on the SVG canvas (viewBox 0..720 x 0..472). */
|
||
x: number;
|
||
y: number;
|
||
}
|
||
|
||
export interface PodGraphEdge {
|
||
id: string;
|
||
/** Source node id. */
|
||
source: string;
|
||
/** Target node id. */
|
||
target: string;
|
||
kind: PodGraphEdgeKind;
|
||
label: string;
|
||
/** 0–1 confidence/strength — drives edge thickness. */
|
||
strength: number;
|
||
}
|
||
|
||
export interface PodGraphMetric {
|
||
label: string;
|
||
value: string;
|
||
detail: string;
|
||
}
|
||
|
||
/** A point-in-time render of a pod's team_model. */
|
||
export interface PodGraph {
|
||
podId: string;
|
||
/** ISO timestamp the snapshot was generated. */
|
||
generatedAt: string;
|
||
nodes: PodGraphNode[];
|
||
edges: PodGraphEdge[];
|
||
metrics: PodGraphMetric[];
|
||
}
|
||
|
||
/** One node as a standalone document in the `graph_nodes` collection. */
|
||
export interface GraphNodeDoc extends PodGraphNode {
|
||
podId: string;
|
||
}
|
||
|
||
/** One edge as a standalone document in the `graph_edges` collection (for $graphLookup). */
|
||
export interface GraphEdgeDoc extends PodGraphEdge {
|
||
podId: string;
|
||
}
|