feat(shared): add core domain types
Pod/Engineer, EngineerContext (live pre-push signal), Collision, and Intervention — the type contract between frontend and backend. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"name": "@podman/shared",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"main": "./dist/index.js",
|
||||||
|
"types": "./dist/index.d.ts",
|
||||||
|
"exports": {
|
||||||
|
".": {
|
||||||
|
"types": "./dist/index.d.ts",
|
||||||
|
"import": "./dist/index.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc -p tsconfig.json",
|
||||||
|
"dev": "tsc -p tsconfig.json --watch",
|
||||||
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
export type CollisionSeverity = 'info' | 'warn' | 'critical';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A detected overlap between two or more engineers' live work, fused from
|
||||||
|
* vision-derived contexts and GitHub state.
|
||||||
|
*/
|
||||||
|
export interface Collision {
|
||||||
|
id: string;
|
||||||
|
podId: string;
|
||||||
|
/** File both engineers are touching. */
|
||||||
|
file: string;
|
||||||
|
/** Symbol-level overlap, if known. */
|
||||||
|
symbol?: string;
|
||||||
|
/** Engineer ids involved in the overlap. */
|
||||||
|
engineers: string[];
|
||||||
|
severity: CollisionSeverity;
|
||||||
|
/** Snapshot of relevant GitHub state at detection time. */
|
||||||
|
githubState?: GithubStateSnapshot;
|
||||||
|
detectedAt: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface GithubStateSnapshot {
|
||||||
|
/** Open branches touching the file, keyed by engineer/login. */
|
||||||
|
branches?: Record<string, string>;
|
||||||
|
/** Open PR numbers touching the file. */
|
||||||
|
openPrs?: number[];
|
||||||
|
/** Whether any involved engineer has unpushed local changes. */
|
||||||
|
unpushed?: boolean;
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* What PodMan currently believes an engineer is doing, derived from vision on
|
||||||
|
* their shared screen and refreshed every few seconds. This is the live,
|
||||||
|
* pre-push signal that the GitHub API cannot see.
|
||||||
|
*/
|
||||||
|
export interface EngineerContext {
|
||||||
|
engineerId: string;
|
||||||
|
podId: string;
|
||||||
|
/** File path PodMan sees open/active in the editor, e.g. "src/auth.ts". */
|
||||||
|
currentFile?: string;
|
||||||
|
/** Function/class/symbol being edited, if vision can resolve it. */
|
||||||
|
currentSymbol?: string;
|
||||||
|
/** Higher-level feature/action inferred from the screen. */
|
||||||
|
activity?: string;
|
||||||
|
/** Whether the screen shows uncommitted/unpushed changes (gutter/diff). */
|
||||||
|
hasUnpushedChanges?: boolean;
|
||||||
|
/** 0–1 confidence in this read of the screen. */
|
||||||
|
confidence: number;
|
||||||
|
/** ISO timestamp of the observation this context came from. */
|
||||||
|
observedAt: string;
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
export type { Pod, Engineer } from './pod.js';
|
||||||
|
export type { EngineerContext } from './engineer.js';
|
||||||
|
export type {
|
||||||
|
Collision,
|
||||||
|
CollisionSeverity,
|
||||||
|
GithubStateSnapshot,
|
||||||
|
} from './collision.js';
|
||||||
|
export type {
|
||||||
|
Intervention,
|
||||||
|
InterventionKind,
|
||||||
|
InterventionStatus,
|
||||||
|
SuggestedAction,
|
||||||
|
SuggestedActionKind,
|
||||||
|
} from './intervention.js';
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
export type InterventionKind = 'voice' | 'card';
|
||||||
|
|
||||||
|
export type InterventionStatus = 'pending' | 'delivered' | 'accepted' | 'dismissed';
|
||||||
|
|
||||||
|
export type SuggestedActionKind = 'open_sync_pr' | 'ping_teammate' | 'none';
|
||||||
|
|
||||||
|
/** What PodMan says/does about a collision — the product's hero output. */
|
||||||
|
export interface Intervention {
|
||||||
|
id: string;
|
||||||
|
collisionId: string;
|
||||||
|
podId: string;
|
||||||
|
kind: InterventionKind;
|
||||||
|
/** Spoken/displayed message, e.g. "Karti and Yahya are both in auth.ts...". */
|
||||||
|
message: string;
|
||||||
|
suggestedAction: SuggestedAction;
|
||||||
|
status: InterventionStatus;
|
||||||
|
createdAt: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SuggestedAction {
|
||||||
|
kind: SuggestedActionKind;
|
||||||
|
/** Free-form payload for the action (e.g. branch names for a sync PR). */
|
||||||
|
params?: Record<string, unknown>;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
/** A pod is one room of engineers working together (one LiveKit room per pod). */
|
||||||
|
export interface Pod {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
/** GitHub repo the pod is working in, as "owner/name". */
|
||||||
|
repo: string;
|
||||||
|
members: Engineer[];
|
||||||
|
createdAt: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Engineer {
|
||||||
|
id: string;
|
||||||
|
/** Display name PodMan uses when it speaks ("Karti and Yahya are both..."). */
|
||||||
|
name: string;
|
||||||
|
/** GitHub login, used to map vision context to GitHub state. */
|
||||||
|
githubLogin?: string;
|
||||||
|
/** LiveKit participant identity for this engineer in the pod room. */
|
||||||
|
participantId?: string;
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"extends": "../tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "./dist",
|
||||||
|
"rootDir": "./src"
|
||||||
|
},
|
||||||
|
"include": ["src/**/*"]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user