/** * Temporal Assertions and Validity Windows * * Bitemporal semantics for knowledge: distinguishes *assertion time* (when * something was recorded) from *validity time* (when the fact is/was/will be * true in the real world). * * The system tracks two independent timelines: * - Assertion time: when the assertion was recorded and when it was retracted * - Validity time: when the fact becomes true (validFrom) and stops being true * (validUntil) * * Every assertion carries `validFrom`, `validUntil`, `assertedAt`, and * `supersededBy` fields. Status is computed dynamically from the current clock * and the assertion's lifecycle flags (retraction, supersession, expiration). * * TemporalStore: * - Creates assertions with explicit validity windows * - Retrieves assertions active at any point in time (past, present, future) * - Supports supersession chains (old fact replaced by new fact) * - Soft-delete via retraction (preserves full history) * - Conflict detection: finds multiple active assertions in the same namespace * - Export/import for persistence * * TemporalReasoner: * - High-level queries: whatWasTrue, whatIsTrue, whatWillBeTrue * - Change detection since a given timestamp * - Conflict detection at a point in time * - Forward projection of assertion validity * * @module @claude-flow/guidance/temporal */ /** * Computed lifecycle status of a temporal assertion. * * - future: the validity window has not yet opened (validFrom > now) * - active: the assertion is currently valid (validFrom <= now < validUntil) * - expired: the validity window has closed (validUntil <= now) * - superseded: replaced by a newer assertion * - retracted: explicitly withdrawn (soft-deleted, history preserved) */ export type TemporalStatus = 'future' | 'active' | 'expired' | 'superseded' | 'retracted'; /** * The temporal window describing when a fact is valid and when it was recorded. */ export interface ValidityWindow { /** Unix timestamp (ms) when the fact becomes true in the real world */ validFrom: number; /** Unix timestamp (ms) when the fact stops being true, or null for indefinite */ validUntil: number | null; /** Unix timestamp (ms) when the assertion was recorded in the system */ assertedAt: number; /** Unix timestamp (ms) when the assertion was retracted, or null if still standing */ retractedAt: number | null; } /** * A single temporal assertion: a claim with an explicit validity window, * supersession chain, confidence, and provenance metadata. */ export interface TemporalAssertion { /** Unique assertion identifier (UUID v4) */ id: string; /** The claim being asserted, in natural language */ claim: string; /** Namespace for grouping related assertions */ namespace: string; /** The temporal validity window */ window: ValidityWindow; /** Computed lifecycle status (derived from window + retraction + supersession) */ status: TemporalStatus; /** ID of the assertion that replaced this one, or null */ supersededBy: string | null; /** ID of the assertion that this one replaces, or null */ supersedes: string | null; /** Confidence in the assertion (0.0 - 1.0) */ confidence: number; /** Who or what made this assertion */ source: string; /** Searchable tags */ tags: string[]; /** Arbitrary metadata */ metadata: Record; } /** * Query options for filtering temporal assertions. */ export interface TemporalQuery { /** Filter by namespace */ namespace?: string; /** Return only assertions active at this point in time */ pointInTime?: number; /** Filter by status (any match) */ status?: TemporalStatus[]; /** Filter by source */ source?: string; /** Filter by tags (all must be present) */ tags?: string[]; } /** * Configuration for the TemporalStore. */ export interface TemporalConfig { /** Maximum number of assertions to store (default 100000) */ maxAssertions: number; /** Interval (ms) for auto-expire status checks (default 60000) */ autoExpireCheckIntervalMs: number; } /** * A full timeline for an assertion: its predecessors and successors in the * supersession chain. */ export interface TemporalTimeline { /** The assertion at the center of the timeline */ assertion: TemporalAssertion; /** Assertions that were replaced leading up to this one (oldest first) */ predecessors: TemporalAssertion[]; /** Assertions that replaced this one (newest last) */ successors: TemporalAssertion[]; } /** * A detected change in the temporal store since a given timestamp. */ export interface TemporalChange { /** The assertion that changed */ assertion: TemporalAssertion; /** The kind of change */ changeType: 'asserted' | 'superseded' | 'retracted' | 'expired'; /** When the change occurred (assertion time, retraction time, etc.) */ changedAt: number; } /** * Optional parameters when creating a new assertion. */ export interface AssertOptions { /** Custom assertion ID (default: auto-generated UUID) */ id?: string; /** Confidence in the assertion (0.0 - 1.0, default 1.0) */ confidence?: number; /** Who or what is making this assertion (default 'system') */ source?: string; /** Searchable tags */ tags?: string[]; /** Arbitrary metadata */ metadata?: Record; } /** * Serializable representation for export/import. */ export interface SerializedTemporalStore { /** All assertions */ assertions: TemporalAssertion[]; /** When the export was created */ createdAt: string; /** Schema version */ version: number; } /** * In-memory store for temporal assertions with bitemporal semantics. * * Assertions are indexed by ID and support supersession chains, retraction, * temporal queries (what was active at time T), and conflict detection. * Status is computed dynamically from the assertion's window and lifecycle * flags; callers never set status directly. */ export declare class TemporalStore { private readonly config; private readonly assertions; constructor(config?: Partial); /** * Create a new temporal assertion. * * Records a claim with an explicit validity window. The assertion's status * is computed automatically from the window and the current time. * * @param claim - The fact being asserted * @param namespace - Grouping namespace * @param window - Validity window (validFrom and validUntil) * @param opts - Optional parameters (confidence, source, tags, metadata) * @returns The newly created TemporalAssertion */ assert(claim: string, namespace: string, window: { validFrom: number; validUntil: number | null; }, opts?: AssertOptions): TemporalAssertion; /** * Retrieve an assertion by ID. * * The returned assertion has its status recomputed against the current time. * * @param id - The assertion ID * @returns The assertion, or undefined if not found */ get(id: string): TemporalAssertion | undefined; /** * Get all assertions that were active at a specific point in time. * * An assertion is considered "active at time T" if: * - Its validity window contains T (validFrom <= T and (validUntil is null or T < validUntil)) * - It has not been retracted * - It has not been superseded * * @param pointInTime - The reference time (ms epoch) * @param namespace - Optional namespace filter * @returns Active assertions at the specified time */ getActiveAt(pointInTime: number, namespace?: string): TemporalAssertion[]; /** * Get all assertions active right now. * * Convenience wrapper around `getActiveAt(Date.now())`. * * @param namespace - Optional namespace filter * @returns Currently active assertions */ getCurrentTruth(namespace?: string): TemporalAssertion[]; /** * Get the full history of a claim: all assertions (past and present) that * share the same claim text and namespace, regardless of status. * * Results are ordered by assertedAt ascending (oldest first), giving a * timeline of how the claim evolved. * * @param claim - The claim text to search for * @param namespace - The namespace to search in * @returns All matching assertions, oldest first */ getHistory(claim: string, namespace: string): TemporalAssertion[]; /** * Query assertions with multiple optional filters. * * All specified filters are ANDed together. Results are ordered by * assertedAt descending (newest first). * * @param opts - Query filter options * @returns Matching assertions */ query(opts?: TemporalQuery): TemporalAssertion[]; /** * Supersede an existing assertion with a new one. * * Marks the old assertion as superseded and creates a new assertion that * declares it replaces the old one. The supersession chain is bidirectional: * oldAssertion.supersededBy = newAssertion.id * newAssertion.supersedes = oldAssertion.id * * @param oldId - ID of the assertion to supersede * @param newClaim - The replacement claim text * @param newWindow - The validity window for the replacement * @param opts - Optional parameters for the new assertion * @returns The new assertion, or undefined if the old one was not found */ supersede(oldId: string, newClaim: string, newWindow: { validFrom: number; validUntil: number | null; }, opts?: AssertOptions): TemporalAssertion | undefined; /** * Retract an assertion (soft delete). * * The assertion is marked with a retractedAt timestamp and its status * becomes 'retracted'. The assertion remains in the store for historical * queries but is excluded from active truth queries. * * @param id - The assertion to retract * @param _reason - Optional reason for retraction (stored in metadata) * @returns The retracted assertion, or undefined if not found */ retract(id: string, _reason?: string): TemporalAssertion | undefined; /** * Get the full supersession timeline for an assertion. * * Follows the supersedes/supersededBy chain in both directions to build * the complete lineage: all predecessors (oldest first) and all successors * (newest last). Handles cycles by tracking visited IDs. * * @param id - The assertion to build a timeline for * @returns The timeline, or undefined if not found */ getTimeline(id: string): TemporalTimeline | undefined; /** * Detect conflicting assertions: multiple assertions active at the same * time in the same namespace. * * Returns groups of assertions that are simultaneously active, which may * indicate contradictions that need resolution. * * @param namespace - The namespace to check * @param pointInTime - The reference time (defaults to now) * @returns Array of assertions that are concurrently active (empty if no conflicts) */ reconcile(namespace: string, pointInTime?: number): TemporalAssertion[]; /** * Export all assertions for persistence. * * @returns Serializable store representation */ exportAssertions(): SerializedTemporalStore; /** * Import previously exported assertions, replacing all current contents. * * @param data - Serialized store data * @throws If the version is unsupported */ importAssertions(data: SerializedTemporalStore): void; /** * Remove expired assertions whose validity ended before the given timestamp. * * Only assertions with status 'expired' and validUntil before the cutoff * are removed. Retracted and superseded assertions are preserved for * historical traceability. * * @param beforeTimestamp - Remove assertions that expired before this time * @returns Number of assertions pruned */ pruneExpired(beforeTimestamp: number): number; /** * Get the number of stored assertions. */ get size(): number; /** * Get the current configuration. */ getConfig(): TemporalConfig; /** * Remove all assertions from the store. */ clear(): void; /** * Enforce the maximum assertion capacity by pruning the oldest expired * assertions first. */ private enforceCapacity; } /** * High-level temporal reasoning over a TemporalStore. * * Provides semantic queries like "what was true at time T", "what will be * true at time T", change detection, conflict detection, and forward * projection of assertion validity. */ export declare class TemporalReasoner { private readonly store; constructor(store: TemporalStore); /** * What was true at a past point in time? * * Returns all assertions that were active (valid, not retracted, not * superseded) at the specified historical moment. * * @param namespace - The namespace to query * @param pointInTime - The historical moment (ms epoch) * @returns Assertions that were active at that time */ whatWasTrue(namespace: string, pointInTime: number): TemporalAssertion[]; /** * What is true right now? * * Returns all currently active assertions in the given namespace. * * @param namespace - The namespace to query * @returns Currently active assertions */ whatIsTrue(namespace: string): TemporalAssertion[]; /** * What will be true at a future point in time? * * Returns assertions whose validity window includes the specified future * time and that have not been retracted or superseded. * * @param namespace - The namespace to query * @param futureTime - The future moment (ms epoch) * @returns Assertions that will be active at that time */ whatWillBeTrue(namespace: string, futureTime: number): TemporalAssertion[]; /** * Detect changes in a namespace since a given timestamp. * * Returns a list of changes ordered by their change time, including: * - New assertions created after the timestamp * - Assertions superseded after the timestamp * - Assertions retracted after the timestamp * - Assertions that expired after the timestamp * * @param namespace - The namespace to check * @param sinceTimestamp - Only include changes after this time (ms epoch) * @returns List of detected changes */ hasChanged(namespace: string, sinceTimestamp: number): TemporalChange[]; /** * Detect conflicting (contradictory) assertions active at the same time * in the same namespace. * * Returns all concurrently active assertions if there are two or more. * An empty array means no conflicts. * * @param namespace - The namespace to check * @param pointInTime - The reference time (defaults to now) * @returns Conflicting assertions, or empty if no conflicts */ conflictsAt(namespace: string, pointInTime?: number): TemporalAssertion[]; /** * Project an assertion forward: will it still be valid at a future time? * * Checks whether the assertion's validity window includes the future * timestamp and the assertion has not been retracted or superseded. * * @param assertionId - The assertion to project * @param futureTimestamp - The future time to check (ms epoch) * @returns true if the assertion will be active at the future time */ projectForward(assertionId: string, futureTimestamp: number): boolean; } /** * Create a TemporalStore with optional configuration. * * @param config - Partial configuration; unspecified values use defaults * @returns A fresh TemporalStore */ export declare function createTemporalStore(config?: Partial): TemporalStore; /** * Create a TemporalReasoner backed by the given store. * * @param store - The TemporalStore to reason over * @returns A fresh TemporalReasoner */ export declare function createTemporalReasoner(store: TemporalStore): TemporalReasoner; //# sourceMappingURL=temporal.d.ts.map