@wearesage/schema
Version:
A flexible schema definition and validation system for TypeScript with multi-database support
146 lines (112 loc) • 4.6 kB
text/typescript
import { Affordance } from './Affordance';
import { CodeFile } from './CodeFile';
import { ContextRule } from './ContextRule';
import { Entity, Property, Id, ManyToOne, OneToMany, ManyToMany, Index, Timestamp, Auth, Labels } from '../core/decorators';
import { Event } from './Event';
import { RelationshipType } from '../adapters/neo4j';
import { SpaceType, SpaceTypeString } from '../test-types/space.types';
import { Team } from './Team';
import { User } from './User';
// Users can access spaces they participate in
export class Space {
id!: string;
name!: string;
description?: string;
spaceType!: SpaceTypeString;
// Ownership can be by User or Team
ownedByType!: 'user' | 'team';
ownedById!: string;
// Direct relationship to owner (User)
owner?: User;
// Direct relationship to team
team?: Team;
// Users who participate in this space
participants!: User[];
visibility!: 'public' | 'private';
// Recursive relationship - parent space
parentSpace?: Space;
// Recursive relationship - child spaces
childSpaces!: Space[];
// Entrypoint properties - for spaces that serve as system entry points
isEntrypoint?: boolean;
entrypointType?: 'auth' | 'main' | 'admin' | 'guest' | 'api';
targetUserState?: 'unauthenticated' | 'authenticated' | 'admin' | 'any';
transitionRules?: {
onSuccess?: { action: 'redirect' | 'stay', target?: string, message?: string };
onFailure?: { action: 'stay' | 'exit', message?: string };
};
// Status tracking for relevant space types
status?: 'pending' | 'active' | 'blocked' | 'completed' | 'failed';
attemptCount: number = 0;
// Universal Space features - Context System
contextRules!: ContextRule[];
// Universal Space features - Affordance System
availableAffordances!: Affordance[];
// GRAPH RELATIONSHIPS - Code dependencies discovered via static analysis
imports!: Space[];
exportedTo!: Space[];
calls!: Space[];
tests!: Space[];
dependencies!: Space[];
deploysTo!: Space[];
// Legacy: Context subscriptions - what events this space listens to
subscribedEvents: string[] = [];
// Absolute path for project-related spaces
projectPath?: string;
// Flexible metadata for type-specific data
metadata: Record<string, any> = {};
// Events related to this space
events!: Event[];
// Code files in this space (for codebase spaces)
files!: CodeFile[];
createdAt!: Date;
updatedAt!: Date;
}