@cnstra/core 1.4.0 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/CNSStimulationContextStore.ts","../src/CNSFunctionalQueue.ts","../src/CNSStimulation.ts","../src/CNSTaskQueue.ts","../src/CNSInstanceNeuronQueue.ts","../src/CNS.ts","../src/CNSCollateral.ts","../src/factory/index.ts"],"names":["neuron","collateral","axon"],"mappings":"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","file":"index.cjs","sourcesContent":["import { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\n\nexport class CNSStimulationContextStore implements ICNSStimulationContextStore {\n constructor(private readonly ctx: Map<string, unknown> = new Map()) {}\n\n get(key: string): unknown {\n return this.ctx.get(key);\n }\n\n set(key: string, value: unknown): void {\n this.ctx.set(key, value);\n }\n\n getAll(): Record<string, unknown> {\n return Object.fromEntries(this.ctx);\n }\n\n setAll(values: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(values)) {\n this.ctx.set(key, value);\n }\n }\n\n delete(key: string): void {\n this.ctx.delete(key);\n }\n}\n","import { TCNSStimulationQueueItem } from './types/TCNSStimulationQueueItem';\nimport { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\n\nexport class CNSFunctionalQueue<\n TCollateralType extends string,\n TNeuronName extends string,\n TNeuron extends TCNSNeuron<\n any,\n TNeuronName,\n TCollateralType,\n any,\n any,\n any,\n any\n >,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>\n> {\n private items: TCNSStimulationQueueItem<\n TCollateralType,\n TNeuronName,\n TNeuron,\n TDendrite\n >[] = [];\n private head = 0;\n private tail = 0;\n private size = 0;\n private capacity = 16;\n protected activeOperations = 0;\n\n // NEW: prevent re-entrant pump; defer extra runs\n private pumping = false;\n private needsPump = false;\n\n constructor(\n private readonly processor: (\n item: TCNSStimulationQueueItem<\n TCollateralType,\n TNeuronName,\n TNeuron,\n TDendrite\n >\n ) => (() => void) | Promise<() => void>,\n protected readonly concurrency?: number,\n protected readonly abortSignal?: AbortSignal,\n initialCapacity?: number\n ) {\n if (initialCapacity && initialCapacity > 0) {\n this.capacity = initialCapacity;\n }\n this.items = new Array(this.capacity);\n }\n\n protected get canStartOperation(): boolean {\n const limit = this.concurrency ?? Infinity;\n return this.activeOperations < limit && !this.abortSignal?.aborted;\n }\n\n private resize(): void {\n const oldCapacity = this.capacity;\n this.capacity = oldCapacity * 2;\n const newItems = new Array(this.capacity);\n\n let oldIndex = this.head;\n for (let i = 0; i < this.size; i++) {\n newItems[i] = this.items[oldIndex];\n oldIndex = (oldIndex + 1) % oldCapacity;\n }\n\n this.items = newItems;\n this.head = 0;\n this.tail = this.size;\n }\n\n private dequeue():\n | TCNSStimulationQueueItem<\n TCollateralType,\n TNeuronName,\n TNeuron,\n TDendrite\n >\n | undefined {\n if (this.size === 0) return undefined;\n\n const item = this.items[this.head];\n this.items[this.head] = undefined as any; // Clear reference\n this.head = (this.head + 1) % this.capacity;\n this.size--;\n\n return item;\n }\n\n private enqueueItem(\n item: TCNSStimulationQueueItem<\n TCollateralType,\n TNeuronName,\n TNeuron,\n TDendrite\n >\n ): void {\n if (this.size === this.capacity) {\n this.resize();\n }\n\n this.items[this.tail] = item;\n this.tail = (this.tail + 1) % this.capacity;\n this.size++;\n }\n\n protected pump() {\n if (this.pumping) {\n this.needsPump = true;\n return;\n }\n this.pumping = true;\n\n while (this.canStartOperation && this.size > 0) {\n const item = this.dequeue()!;\n this.activeOperations++;\n\n const ret = this.processor(item);\n\n // Async branch\n if (ret && typeof (ret as any).then === 'function') {\n (ret as Promise<void | (() => void)>).then(\n cb => {\n // finish this item\n this.activeOperations--;\n if (typeof cb === 'function') cb();\n\n // schedule another pass (but don't re-enter if already pumping)\n if (this.size > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n },\n err => {\n this.activeOperations--;\n // resume if there's more work\n if (this.size > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n throw err; // let it crash \"honestly\"\n }\n );\n // Stop the loop; continuation will happen from the promise handler\n break;\n }\n\n // Sync branch\n this.activeOperations--;\n if (typeof ret === 'function') (ret as () => void)();\n // Loop continues; any items added by ret() stay in the same flat loop\n }\n\n this.pumping = false;\n\n // If async completions or enqueues requested another pass, do exactly one more, non-recursively\n if (this.needsPump) {\n this.needsPump = false;\n this.pump();\n }\n }\n\n enqueue(\n x: TCNSStimulationQueueItem<\n TCollateralType,\n TNeuronName,\n TNeuron,\n TDendrite\n >\n ) {\n this.enqueueItem(x);\n // Start pumping only if not already pumping; avoid re-entrant pump\n if (!this.pumping) this.pump();\n else this.needsPump = true;\n }\n\n get length() {\n return this.size;\n }\n\n getActiveOperationsCount() {\n return this.activeOperations;\n }\n}\n","import { CNSStimulationContextStore } from './CNSStimulationContextStore';\nimport { ICNS } from './interfaces/ICNS';\nimport { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\nimport { TCNSStimulationOptions } from './types/TCNSStimulationOptions';\nimport { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { TCNSSubscriber } from './types/TCNSSubscriber';\nimport { CNSFunctionalQueue } from './CNSFunctionalQueue';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSSignal } from './types/TCNSSignal';\nimport { TCNSStimulationQueueItem } from './types/TCNSStimulationQueueItem';\n\nexport class CNSStimulation<\n TCollateralType extends string,\n TNeuronName extends string,\n TNeuron extends TCNSNeuron<\n any,\n TNeuronName,\n TCollateralType,\n any,\n any,\n any,\n any\n >,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>,\n TInputPayload,\n TOutputPayload\n> {\n private readonly ctx: ICNSStimulationContextStore;\n private readonly queue: CNSFunctionalQueue<\n TCollateralType,\n TNeuronName,\n TNeuron,\n TDendrite\n >;\n private readonly nueronVisitMap?: Map<TNeuronName, number>;\n private readonly instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>;\n private scheduledCount = 0;\n\n /**\n * Track active SCCs: SCC index -> count of active neurons in that SCC\n */\n private readonly activeSccCounts = new Map<number, number>();\n\n public readonly id: string;\n\n constructor(\n private readonly cns: ICNS<TNeuron, TDendrite>,\n instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>,\n public readonly options?: TCNSStimulationOptions<\n TCollateralType,\n TInputPayload,\n TOutputPayload\n >\n ) {\n this.ctx =\n options?.ctx ??\n options?.createContextStore?.() ??\n new CNSStimulationContextStore();\n this.id = options?.stimulationId || Math.random().toString(36).slice(2);\n this.queue = new CNSFunctionalQueue(\n item => this.processQueueItem(item),\n options?.concurrency,\n options?.abortSignal\n );\n\n this.instanceNeuronQueue = instanceNeuronQueue;\n\n if (this.options?.maxNeuronHops) {\n this.nueronVisitMap = new Map();\n }\n }\n\n protected get concurrencyEnabled(): boolean {\n return (\n this.options?.concurrency !== undefined &&\n this.options?.concurrency > 0\n );\n }\n\n protected get autoCleanupContextsEnabled(): boolean {\n return this.cns?.options?.autoCleanupContexts ?? false;\n }\n\n /**\n * Mark a neuron as active (being processed)\n */\n protected markNeuronActive(neuronId: TNeuronName): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.incrementSccCount(neuronId);\n }\n\n /**\n * Mark a neuron as inactive (finished processing)\n */\n protected markNeuronInactive(neuronId: TNeuronName): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.decrementSccCount(neuronId);\n }\n\n /**\n * Increment the active count for the SCC containing this neuron\n */\n private incrementSccCount(neuronId: TNeuronName): void {\n const sccIndex = this.cns.getSccIndexByNeuronName(neuronId);\n if (sccIndex === undefined) return;\n\n const currentCount = this.activeSccCounts.get(sccIndex) || 0;\n this.activeSccCounts.set(sccIndex, currentCount + 1);\n }\n\n /**\n * Decrement the active count for the SCC containing this neuron\n */\n private decrementSccCount(neuronId: TNeuronName): void {\n const sccIndex = this.cns.getSccIndexByNeuronName(neuronId);\n if (sccIndex === undefined) return;\n\n const currentCount = this.activeSccCounts.get(sccIndex) || 0;\n const nextCount = Math.max(0, currentCount - 1);\n this.activeSccCounts.set(sccIndex, nextCount);\n\n // Log warning if we're trying to decrement below 0\n if (currentCount === 0) {\n console.warn(\n `[CNSStimulation] Attempting to decrement SCC count below 0 for neuron ${neuronId}`\n );\n }\n }\n\n /**\n * Check if a neuron can be guaranteed not to be visited again\n */\n protected canNeuronBeGuaranteedDone(neuronId: TNeuronName): boolean {\n if (!this.autoCleanupContextsEnabled) return false;\n return this.cns.canNeuronBeGuaranteedDone(\n neuronId,\n this.activeSccCounts\n );\n }\n\n protected cleanupCtxIfNeeded(neuron: TNeuron): void {\n if (\n this.autoCleanupContextsEnabled &&\n this.canNeuronBeGuaranteedDone(neuron.name)\n ) {\n this.ctx.delete(neuron.name);\n }\n }\n\n protected createSubscriberQueueItem(\n subscriber: TCNSSubscriber<TNeuron, TDendrite>,\n inputSignal?: TCNSSignal<TCollateralType, any>\n ) {\n if (this.options?.maxNeuronHops) {\n if (\n this.nueronVisitMap?.get(subscriber.neuron.name) ??\n 0 >= this.options?.maxNeuronHops\n ) {\n throw new Error(\n `Max neuron hops reached for neuron \"${subscriber.neuron.name}\" ` +\n `when trying to enqueue subscriber \"${subscriber.dendrite.collateral.type}\" ` +\n `in stimulation \"${this.id}\"`\n );\n } else {\n this.nueronVisitMap?.set(\n subscriber.neuron.name,\n (this.nueronVisitMap?.get(subscriber.neuron.name) ?? 0) + 1\n );\n }\n }\n\n return {\n neuronId: subscriber.neuron.name,\n subscriber,\n inputSignal,\n };\n }\n\n private processQueueItem(\n item: TCNSStimulationQueueItem<\n TCollateralType,\n TNeuronName,\n TNeuron,\n TDendrite\n >\n ) {\n const { subscriber, inputSignal } = item;\n const { neuron, dendrite } = subscriber;\n\n const starter = () => {\n // Mark neuron as active only when we actually start processing (after gate allows it)\n this.markNeuronActive(neuron.name);\n\n const response = dendrite.response(\n inputSignal?.payload,\n neuron.axon,\n {\n get: () => this.ctx.get(neuron.name),\n set: (value: any) => this.ctx.set(neuron.name, value),\n abortSignal: this.options?.abortSignal,\n cns: this.cns,\n }\n );\n\n if (response instanceof Promise) {\n return response.then(\n signal => {\n return () => {\n // Mark neuron as inactive when async processing completes\n this.markNeuronInactive(neuron.name);\n return this.processResponse(\n inputSignal as TCNSSignal<TCollateralType, any>,\n signal as\n | TCNSSignal<TCollateralType, any>\n | undefined\n );\n };\n },\n error => {\n return () => {\n // Mark neuron as inactive when async processing fails\n this.markNeuronInactive(neuron.name);\n return this.processResponse(\n inputSignal as TCNSSignal<TCollateralType, any>,\n undefined,\n error\n );\n };\n }\n );\n } else {\n return () => {\n // Mark neuron as inactive when sync processing completes\n this.markNeuronInactive(neuron.name);\n return this.processResponse(\n inputSignal as TCNSSignal<TCollateralType, any>,\n response as TCNSSignal<TCollateralType, any> | undefined\n );\n };\n }\n };\n\n // Use CNS-provided per-instance neuron queue for global concurrency gating\n return this.instanceNeuronQueue.run(neuron, starter);\n }\n\n protected processResponse(\n inputSignal?: TCNSSignal<TCollateralType, TInputPayload>,\n outputSignal?: TCNSSignal<TCollateralType, TOutputPayload>,\n error?: any\n ): void {\n const collateral = outputSignal?.collateral;\n const ownerNeuron = collateral\n ? this.cns.getParentNeuronByCollateralId(collateral.type)\n : undefined;\n const subscribers = collateral\n ? this.cns.getSubscribers(collateral.type)\n : [];\n const subscriberQueueItems: TCNSStimulationQueueItem<\n TCollateralType,\n TNeuronName,\n TNeuron,\n TDendrite\n >[] = [];\n\n if (collateral && !error) {\n if (ownerNeuron) {\n this.cleanupCtxIfNeeded(ownerNeuron);\n }\n\n for (let i = 0; i < subscribers.length; i++) {\n subscriberQueueItems.push(\n this.createSubscriberQueueItem(subscribers[i], outputSignal)\n );\n }\n }\n this.scheduledCount += subscriberQueueItems.length;\n\n // After we pre-enqueued all subscribers, we can trace the response\n this.options?.onResponse?.({\n inputSignal: inputSignal,\n outputSignal: outputSignal,\n ctx: this.ctx,\n queueLength: this.queue.length + this.scheduledCount,\n\n hops:\n this.options?.maxNeuronHops && ownerNeuron\n ? this.nueronVisitMap?.get(ownerNeuron.name) ?? 0\n : undefined,\n error,\n });\n\n // After we traced the response, we can enqueue the pre-enqueued subscribers\n // So if we have a synchronous response - the traces would go\n // from start to end and will show the correct queueLength === 0\n // in the end\n for (let i = 0; i < subscriberQueueItems.length; i++) {\n this.scheduledCount--;\n this.queue.enqueue(subscriberQueueItems[i]);\n }\n }\n\n public responseToSignal(\n signal: TCNSSignal<TCollateralType, TOutputPayload>\n ): void {\n // Mark the owner neuron of the initial signal as active\n const ownerNeuron = this.cns.getParentNeuronByCollateralId(\n signal.collateral.type\n );\n if (ownerNeuron) {\n this.markNeuronActive(ownerNeuron.name);\n }\n\n this.processResponse(undefined, signal);\n }\n}\n","export class CNSTaskQueue {\n private pumping = false;\n private needsPump = false;\n private activeOperations = 0;\n\n private items: Array<{\n task: () => (() => void) | Promise<() => void>;\n resolve: () => void;\n reject: (e: any) => void;\n }> = [];\n\n constructor(private readonly concurrency?: number) {}\n\n private get canStartOperation(): boolean {\n const limit = this.concurrency ?? Infinity;\n return this.activeOperations < limit;\n }\n\n enqueue(task: () => (() => void) | Promise<() => void>): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.items.push({ task, resolve, reject });\n if (!this.pumping) this.pump();\n else this.needsPump = true;\n });\n }\n\n private pump() {\n if (this.pumping) {\n this.needsPump = true;\n return;\n }\n this.pumping = true;\n\n while (this.canStartOperation && this.items.length > 0) {\n const { task, resolve, reject } = this.items.shift()!;\n this.activeOperations++;\n\n try {\n const ret = task();\n if (ret && typeof (ret as any).then === 'function') {\n (ret as Promise<() => void>).then(\n cb => {\n try {\n if (typeof cb === 'function') cb();\n resolve();\n } finally {\n this.activeOperations--;\n if (\n this.items.length > 0 &&\n this.canStartOperation\n ) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n }\n },\n err => {\n try {\n reject(err);\n } finally {\n this.activeOperations--;\n if (\n this.items.length > 0 &&\n this.canStartOperation\n ) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n }\n }\n );\n break;\n } else {\n try {\n if (typeof ret === 'function') (ret as () => void)();\n resolve();\n } finally {\n this.activeOperations--;\n }\n }\n } catch (e) {\n try {\n reject(e);\n } finally {\n this.activeOperations--;\n }\n }\n }\n\n this.pumping = false;\n if (this.needsPump) {\n this.needsPump = false;\n this.pump();\n }\n }\n}\n","export class CNSInstanceNeuronQueue<\n TNeuron extends { name: string; concurrency?: number }\n> {\n private readonly gates = new Map<\n string,\n { limit: number; active: number; waiters: (() => void)[] }\n >();\n\n run(\n neuron: TNeuron,\n fn: () => (() => void) | Promise<() => void>\n ): (() => void) | Promise<() => void> {\n const limit = neuron?.concurrency;\n if (limit === undefined || limit <= 0) {\n return fn();\n }\n\n let gate = this.gates.get(neuron.name);\n if (!gate) {\n gate = { limit, active: 0, waiters: [] };\n this.gates.set(neuron.name, gate);\n } else {\n gate.limit = limit;\n }\n\n const wrap = (cb: () => void) => {\n return () => {\n try {\n cb();\n } finally {\n const g = this.gates.get(neuron.name)!;\n g.active = Math.max(0, g.active - 1);\n if (g.waiters.length > 0) {\n const next = g.waiters.shift()!;\n next();\n }\n }\n };\n };\n\n if (gate.active < gate.limit) {\n gate.active++;\n const ret = fn();\n if (ret && typeof (ret as any).then === 'function') {\n return (ret as Promise<() => void>).then(cb => wrap(cb));\n }\n return wrap(ret as () => void);\n }\n\n return new Promise<() => void>(resolve => {\n const starter = () => {\n const g = this.gates.get(neuron.name)!;\n g.active++;\n const ret = fn();\n if (ret && typeof (ret as any).then === 'function') {\n (ret as Promise<() => void>).then(cb => resolve(wrap(cb)));\n } else {\n resolve(wrap(ret as () => void));\n }\n };\n gate!.waiters.push(starter);\n });\n }\n}\n","import { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { ICNS } from './interfaces/ICNS';\nimport { TCNSSubscriber } from './types/TCNSSubscriber';\nimport { TCNSOptions } from './types/TCNSOptions';\nimport { TCNSStimulationOptions } from './types/TCNSStimulationOptions';\nimport { CNSStimulation } from './CNSStimulation';\nimport { CNSCollateral } from './CNSCollateral';\nimport { TCNSSignal } from './types/TCNSSignal';\nimport { CNSTaskQueue } from './CNSTaskQueue';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\n\nexport class CNS<\n TCollateralType extends string,\n TNeuronName extends string,\n TNeuron extends TCNSNeuron<any, TNeuronName, any, any, any, any, any>,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>\n> implements ICNS<TNeuron, TDendrite>\n{\n /**\n * Fast lookup: collateralId -> list of (neuron, dendrite) subscribers.\n * Built once at construction time.\n */\n private subIndex = new Map<\n TCollateralType,\n TCNSSubscriber<TNeuron, TDendrite>[]\n >();\n\n private parentNeuronByCollateralId = new Map<TCollateralType, TNeuron>();\n\n /**\n * Strongly Connected Components of the neuron graph.\n * Each component is a set of neuron IDs that can reach each other.\n */\n public stronglyConnectedComponents: Set<string>[] = [];\n\n /**\n * Quick lookup: neuron ID -> SCC index for fast reachability checks.\n */\n private neuronToSCC = new Map<string, number>();\n\n /**\n * DAG of SCCs: SCC index -> set of SCC indices that can reach this SCC\n */\n private sccDag: Map<number, Set<number>> = new Map();\n\n /**\n * Precomputed ancestor sets for each SCC for fast reachability checks\n */\n private sccAncestors: Map<number, Set<number>> = new Map();\n\n /**\n * Global per-neuron concurrency gates shared across all stimulations.\n */\n private readonly neuronGates = new Map<\n TNeuronName,\n { limit: number; active: number; waiters: (() => void)[] }\n >();\n\n /**\n * Global task queue used by stimulation to schedule per-neuron gated work.\n * Does not replace per-stimulation concurrency; only coordinates global per-neuron limits.\n */\n private readonly globalTaskQueue = new CNSTaskQueue();\n protected readonly instanceNeuronQueue =\n new CNSInstanceNeuronQueue<TNeuron>();\n\n /**\n * Global response listeners applied to every stimulation.\n */\n private readonly globalResponseListeners: Array<(r: any) => void> = [];\n\n constructor(\n protected readonly neurons: TNeuron[],\n public readonly options?: TCNSOptions\n ) {\n this.validateUniqueIdentifiers();\n this.buildIndexes();\n if (this.options?.autoCleanupContexts) {\n this.buildSCC();\n }\n }\n\n /**\n * Validate uniqueness constraints:\n * - neuron names are unique and non-empty\n * - axon collateral types are globally unique (single owner)\n * - the same collateral instance cannot be owned by multiple neurons\n * Throws aggregated error if violations are found.\n */\n private validateUniqueIdentifiers(): void {\n const errors: string[] = [];\n const seenNeuronNames = new Set<string>();\n\n for (const neuron of this.neurons) {\n const name = (neuron?.name as unknown as string) ?? '';\n if (!name || typeof name !== 'string' || name.trim().length === 0) {\n errors.push(`Neuron has empty or invalid name: \"${name}\"`);\n } else if (seenNeuronNames.has(name)) {\n errors.push(`Duplicate neuron name: \"${name}\"`);\n } else {\n seenNeuronNames.add(name);\n }\n }\n\n if (errors.length > 0) {\n throw new Error(\n `[CNS] Topology uniqueness validation failed:\\n - ` +\n errors.join(`\\n - `)\n );\n }\n }\n\n public addResponseListener(listener: (response: any) => void): () => void {\n this.globalResponseListeners.push(listener);\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n const idx = this.globalResponseListeners.indexOf(listener);\n if (idx >= 0) this.globalResponseListeners.splice(idx, 1);\n };\n }\n\n public wrapOnResponse<T>(\n local?: (response: T) => void\n ): (response: T) => void {\n if (this.globalResponseListeners.length === 0 && !local) {\n // No-op fast path\n return () => {};\n }\n return (r: T) => {\n try {\n if (local) local(r);\n } finally {\n // Global listeners should always see the event even if local throws\n for (let i = 0; i < this.globalResponseListeners.length; i++) {\n try {\n this.globalResponseListeners[i](r);\n } catch (e) {\n // Swallow to prevent breaking propagation chain\n }\n }\n }\n };\n }\n\n protected runWithNeuronConcurrency(\n neuron: TNeuron,\n fn: () => (() => void) | Promise<() => void>\n ): Promise<void> {\n const limit = (neuron as any).concurrency as number | undefined;\n if (limit === undefined || limit <= 0) {\n return this.globalTaskQueue.enqueue(fn);\n }\n\n let gate = this.neuronGates.get(neuron.name as TNeuronName);\n if (!gate) {\n gate = { limit, active: 0, waiters: [] };\n this.neuronGates.set(neuron.name as TNeuronName, gate);\n } else {\n gate.limit = limit;\n }\n\n const wrap = (cb: () => void) => {\n return () => {\n try {\n cb();\n } finally {\n gate!.active = Math.max(0, gate!.active - 1);\n if (gate!.waiters.length > 0) {\n const next = gate!.waiters.shift()!;\n next();\n }\n }\n };\n };\n\n if (gate.active < gate.limit) {\n gate.active++;\n return this.globalTaskQueue.enqueue(() => {\n const ret = fn();\n if (ret && typeof (ret as any).then === 'function') {\n return (ret as Promise<() => void>).then(cb => wrap(cb));\n }\n return wrap(ret as () => void);\n });\n }\n\n return new Promise<void>(resolve => {\n const starter = () => {\n gate!.active++;\n this.globalTaskQueue\n .enqueue(() => {\n const ret = fn();\n if (ret && typeof (ret as any).then === 'function') {\n return (ret as Promise<() => void>).then(cb =>\n wrap(cb)\n );\n }\n return wrap(ret as () => void);\n })\n .then(resolve);\n };\n gate!.waiters.push(starter);\n });\n }\n\n private buildIndexes() {\n this.subIndex.clear();\n this.parentNeuronByCollateralId.clear();\n for (const neuron of this.neurons) {\n for (const dendrite of neuron.dendrites) {\n const key = dendrite.collateral.type as TCollateralType;\n const arr = this.subIndex.get(key) ?? [];\n arr.push({ neuron, dendrite: dendrite as TDendrite });\n this.subIndex.set(\n key,\n arr as TCNSSubscriber<TNeuron, TDendrite>[]\n );\n }\n Object.values(neuron.axon).forEach(collateral => {\n this.parentNeuronByCollateralId.set(\n (collateral as CNSCollateral<TCollateralType, unknown>)\n .type,\n neuron\n );\n });\n }\n }\n\n /**\n * Build the neuron graph where neurons are connected if one can stimulate the other.\n */\n private buildNeuronGraph(): Map<string, Set<string>> {\n const graph = new Map<string, Set<string>>();\n const neuronIds = this.neurons.map(n => n.name);\n\n // Initialize graph\n for (const neuronId of neuronIds) {\n graph.set(neuronId, new Set());\n }\n\n // Build edges: neuron -> neurons it can reach via its axons\n for (const neuron of this.neurons) {\n const reachableNeurons = new Set<string>();\n\n // Check what collaterals this neuron can emit\n for (const axonKey in neuron.axon) {\n const collateral = neuron.axon[axonKey];\n const collateralType = collateral.type as TCollateralType;\n\n // Find which neurons listen to this collateral\n const subscribers = this.subIndex.get(collateralType);\n if (subscribers) {\n for (const { neuron: targetNeuron } of subscribers) {\n reachableNeurons.add(targetNeuron.name);\n }\n }\n }\n\n graph.set(neuron.name, reachableNeurons);\n }\n\n return graph;\n }\n\n /**\n * Build strongly connected components using Tarjan's algorithm.\n */\n private buildSCC(): void {\n const graph = this.buildNeuronGraph();\n const neuronIds = this.neurons.map(n => n.name);\n\n // Tarjan's algorithm for SCC\n const index = new Map<string, number>();\n const lowlink = new Map<string, number>();\n const onStack = new Set<string>();\n const stack: string[] = [];\n const components: Set<string>[] = [];\n let currentIndex = 0;\n\n const strongConnect = (neuronId: string) => {\n index.set(neuronId, currentIndex);\n lowlink.set(neuronId, currentIndex);\n currentIndex++;\n stack.push(neuronId);\n onStack.add(neuronId);\n\n const neighbors = graph.get(neuronId) || new Set();\n for (const neighbor of neighbors) {\n if (!index.has(neighbor)) {\n strongConnect(neighbor);\n lowlink.set(\n neuronId,\n Math.min(lowlink.get(neuronId)!, lowlink.get(neighbor)!)\n );\n } else if (onStack.has(neighbor)) {\n lowlink.set(\n neuronId,\n Math.min(lowlink.get(neuronId)!, index.get(neighbor)!)\n );\n }\n }\n\n if (lowlink.get(neuronId) === index.get(neuronId)) {\n const component = new Set<string>();\n let w: string;\n do {\n w = stack.pop()!;\n onStack.delete(w);\n component.add(w);\n } while (w !== neuronId);\n components.push(component);\n }\n };\n\n // Run Tarjan's algorithm on all unvisited neurons\n for (const neuronId of neuronIds) {\n if (!index.has(neuronId)) {\n strongConnect(neuronId);\n }\n }\n\n this.stronglyConnectedComponents = components;\n\n // Build quick lookup map for reachability checks\n for (let i = 0; i < components.length; i++) {\n for (const neuronId of components[i]) {\n this.neuronToSCC.set(neuronId, i);\n }\n }\n\n // Build DAG between SCCs\n this.buildSCCDAG(graph);\n\n // Precompute ancestor sets for fast reachability checks\n this.buildSCCAncestors();\n }\n\n /**\n * Build DAG between SCCs based on the original neuron graph\n */\n private buildSCCDAG(neuronGraph: Map<string, Set<string>>): void {\n this.sccDag.clear();\n\n // Initialize DAG\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n this.sccDag.set(i, new Set());\n }\n\n // Build edges between SCCs\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n const scc = this.stronglyConnectedComponents[i];\n\n for (const neuronId of scc) {\n const neighbors = neuronGraph.get(neuronId) || new Set();\n\n for (const neighborId of neighbors) {\n const neighborSccIndex = this.neuronToSCC.get(neighborId);\n if (\n neighborSccIndex !== undefined &&\n neighborSccIndex !== i\n ) {\n // Add edge: neighborSccIndex -> i (neighbor can reach this SCC)\n this.sccDag.get(neighborSccIndex)!.add(i);\n }\n }\n }\n }\n }\n\n /**\n * Precompute ancestor sets for each SCC for fast reachability checks\n * Uses topological sort for efficient computation\n */\n private buildSCCAncestors(): void {\n this.sccAncestors.clear();\n\n // Initialize ancestor sets\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n this.sccAncestors.set(i, new Set());\n }\n\n // Topological sort to compute ancestors efficiently\n const inDegree = new Map<number, number>();\n const queue: number[] = [];\n\n // Calculate in-degrees\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n const incomingEdges = this.sccDag.get(i) || new Set();\n inDegree.set(i, incomingEdges.size);\n\n if (incomingEdges.size === 0) {\n queue.push(i);\n }\n }\n\n // Process nodes in topological order\n while (queue.length > 0) {\n const current = queue.shift()!;\n const outgoingEdges = this.getOutgoingEdges(current);\n\n for (const neighbor of outgoingEdges) {\n // Add current as ancestor of neighbor\n const neighborAncestors = this.sccAncestors.get(neighbor)!;\n neighborAncestors.add(current);\n\n // Add all ancestors of current to neighbor\n const currentAncestors = this.sccAncestors.get(current)!;\n for (const ancestor of currentAncestors) {\n neighborAncestors.add(ancestor);\n }\n\n // Decrease in-degree\n const newInDegree = (inDegree.get(neighbor) || 0) - 1;\n inDegree.set(neighbor, newInDegree);\n\n if (newInDegree === 0) {\n queue.push(neighbor);\n }\n }\n }\n }\n\n /**\n * Get outgoing edges for a given SCC index\n */\n private getOutgoingEdges(sccIndex: number): Set<number> {\n const outgoing = new Set<number>();\n\n // Find all SCCs that have this SCC as an incoming edge\n for (const [targetScc, incomingEdges] of this.sccDag) {\n if (incomingEdges.has(sccIndex)) {\n outgoing.add(targetScc);\n }\n }\n\n return outgoing;\n }\n\n /**\n * Check if a neuron can be reached again (including self-calling).\n * Returns true if the neuron is in a strongly connected component with more than one member,\n * or if it's in a single-member SCC that can reach itself.\n */\n public getSCCSetByNeuronName(neuronName: string) {\n const sccIndex = this.neuronToSCC.get(neuronName);\n\n if (sccIndex === undefined) return;\n\n return this.stronglyConnectedComponents[sccIndex];\n }\n\n /**\n * Get the SCC index for a given neuron ID\n */\n public getSccIndexByNeuronName(neuronName: string): number | undefined {\n return this.neuronToSCC.get(neuronName);\n }\n\n /**\n * Check if a neuron can be guaranteed not to be visited again during the current propagation.\n * This is the core logic for safe context cleanup.\n */\n public canNeuronBeGuaranteedDone(\n neuronName: string,\n activeSccCounts: Map<number, number>\n ): boolean {\n const sccIndex = this.neuronToSCC.get(neuronName);\n if (sccIndex === undefined) return true; // Neuron not in graph\n\n // Check if this SCC is still active\n if (\n activeSccCounts.get(sccIndex) &&\n activeSccCounts.get(sccIndex)! > 0\n ) {\n return false; // SCC is still active\n }\n\n // Check if any active SCC can reach this SCC\n const ancestors = this.sccAncestors.get(sccIndex);\n if (!ancestors) return true;\n\n for (const ancestorSccIndex of ancestors) {\n if (\n activeSccCounts.get(ancestorSccIndex) &&\n activeSccCounts.get(ancestorSccIndex)! > 0\n ) {\n return false; // An active ancestor can still reach this SCC\n }\n }\n\n return true; // Neuron is guaranteed to be done\n }\n\n public getParentNeuronByCollateralId(collateralType: TCollateralType) {\n return this.parentNeuronByCollateralId.get(collateralType);\n }\n\n public getSubscribers(\n collateralType: TCollateralType\n ): TCNSSubscriber<TNeuron, TDendrite>[] {\n return this.subIndex.get(collateralType) ?? [];\n }\n\n public stimulate<TInputPayload extends TOutputPayload, TOutputPayload>(\n signal: TCNSSignal<TCollateralType, TInputPayload>,\n options?: TCNSStimulationOptions<\n TCollateralType,\n TInputPayload,\n TOutputPayload\n >\n ) {\n const wrapped = this.wrapOnResponse(options?.onResponse);\n const stimulation = new CNSStimulation<\n TCollateralType,\n TNeuronName,\n TNeuron,\n TDendrite,\n TInputPayload,\n TOutputPayload\n >(this, this.instanceNeuronQueue, {\n ...options,\n onResponse: wrapped,\n });\n stimulation.responseToSignal(signal);\n }\n}\n","import { TCNSSignal } from './types/TCNSSignal';\nimport { ICNSCollateral } from './interfaces/ICNSCollateral';\n\nexport class CNSCollateral<TType extends string, TPayload>\n implements ICNSCollateral<TType, TPayload>\n{\n constructor(public readonly type: TType) {}\n\n createSignal(): TCNSSignal<TType, TPayload>;\n createSignal(payload: TPayload): TCNSSignal<TType, TPayload>;\n createSignal(payload?: TPayload): TCNSSignal<TType, TPayload> {\n return { collateral: this, payload };\n }\n}\n","import { CNSCollateral } from '../CNSCollateral';\nimport { TCNSAxon } from '../types/TCNSAxon';\nimport { TCNSDendrite } from '../types/TCNSDendrite';\n\nexport const collateral = <TPayload = undefined, TType extends string = string>(\n type: TType\n) => new CNSCollateral<TType, TPayload>(type);\n\ntype InterNeuronAPI<\n TContextValue,\n TNameType extends string,\n TReceiverCollateralType extends string,\n TReceiverAxonCollateralPayload,\n TAxonType extends TCNSAxon<\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload\n >\n> = {\n name: TNameType;\n axon: TAxonType;\n concurrency?: number;\n dendrites: TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >[];\n setConcurrency: (\n n: number | undefined\n ) => InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n bind: <TFollowAxon extends TCNSAxon<string, any>>(\n axon: TFollowAxon,\n dendrites: {\n [K in keyof TFollowAxon]:\n | TCNSDendrite<\n TContextValue,\n K & string,\n TFollowAxon extends TCNSAxon<any, infer P> ? P : never,\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n | TCNSDendrite<\n TContextValue,\n K & string,\n TFollowAxon extends TCNSAxon<any, infer P> ? P : never,\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >['response'];\n }\n ) => InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n dendrite: <\n TSenderExactCollateralType extends string,\n TSenderExactAxonCollateralPayload\n >(\n s: TCNSDendrite<\n TContextValue,\n TSenderExactCollateralType,\n TSenderExactAxonCollateralPayload,\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n ) => InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n};\n\n// Concrete builder\nexport const neuron = <\n TContextValue,\n TNameType extends string,\n TReceiverCollateralType extends string,\n TReceiverAxonCollateralPayload,\n TAxonType extends TCNSAxon<\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload\n >\n>(\n name: TNameType,\n axon: TAxonType\n): InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload,\n TAxonType\n> => {\n const dendrites: TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >[] = [];\n\n const api: InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload,\n TAxonType\n > = {\n setConcurrency: (n: number | undefined) => {\n api.concurrency = n;\n return api;\n },\n bind: ((axon, newDendrites) => {\n for (const key in newDendrites) {\n const value = newDendrites[key] as any;\n const dendrite =\n typeof value === 'function'\n ? {\n collateral: (axon as any)[key],\n response: value,\n }\n : value;\n dendrites.push(\n dendrite as TCNSDendrite<\n TContextValue,\n string,\n unknown,\n any,\n any,\n any\n >\n );\n }\n return api;\n }) as InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >['bind'],\n axon,\n name,\n concurrency: undefined,\n dendrites,\n dendrite<\n TSenderExactCollateralType extends string,\n TSenderExactAxonCollateralPayload\n >(\n s: TCNSDendrite<\n TContextValue,\n TSenderExactCollateralType,\n TSenderExactAxonCollateralPayload,\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n ) {\n dendrites.push(\n s as TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n );\n return api; // keep full API for chaining\n },\n };\n\n return api;\n};\n\nexport const withCtx = <TContextValue>() => ({\n neuron: <\n TNameType extends string,\n TReceiverCollateralType extends string,\n TReceiverAxonCollateralPayload,\n TAxonType extends TCNSAxon<\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload\n >\n >(\n name: TNameType,\n axon: TAxonType\n ) => {\n return neuron<\n TContextValue,\n TNameType,\n TReceiverCollateralType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >(name, axon);\n },\n});\n\n// Example usage to verify type inference\nconst fa = {\n test1: new CNSCollateral('test1'),\n test2: new CNSCollateral('test2'),\n};\n\nconst fb = {\n test4: collateral<{ test44: string }, 'test4'>('test4'),\n test5: collateral<{ test44: string }, 'test5'>('test5'),\n};\n\nwithCtx()\n .neuron('test', {\n test1: fa.test1,\n test2: fa.test2,\n })\n .bind(fb, {\n test4: (payload, axon) => {\n const ok: string = payload.test44;\n return axon.test1.createSignal(ok);\n },\n test5: (payload, axon) => {\n const ok2: string = payload.test44;\n return axon.test2.createSignal(ok2);\n },\n });\n"]}
1
+ {"version":3,"sources":["../src/CNSStimulationContextStore.ts","../src/CNSFunctionalQueue.ts","../src/CNSStimulation.ts","../src/CNSTaskQueue.ts","../src/CNSInstanceNeuronQueue.ts","../src/CNS.ts","../src/CNSCollateral.ts","../src/factory/index.ts"],"names":["neuron","collateral","axon"],"mappings":"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","file":"index.cjs","sourcesContent":["import { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\n\nexport class CNSStimulationContextStore implements ICNSStimulationContextStore {\n constructor(private readonly ctx: Map<string, unknown> = new Map()) {}\n\n get(key: string): unknown {\n return this.ctx.get(key);\n }\n\n set(key: string, value: unknown): void {\n this.ctx.set(key, value);\n }\n\n getAll(): Record<string, unknown> {\n return Object.fromEntries(this.ctx);\n }\n\n setAll(values: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(values)) {\n this.ctx.set(key, value);\n }\n }\n\n delete(key: string): void {\n this.ctx.delete(key);\n }\n}\n","import { TCNSStimulationQueueItem } from './types/TCNSStimulationQueueItem';\nimport { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\n\nexport class CNSFunctionalQueue<\n TCollateralName extends string,\n TNeuronName extends string,\n TNeuron extends TCNSNeuron<\n any,\n TNeuronName,\n TCollateralName,\n any,\n any,\n any,\n any\n >,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>\n> {\n private items: TCNSStimulationQueueItem<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite\n >[] = [];\n private head = 0;\n private tail = 0;\n private size = 0;\n private capacity = 16;\n protected activeOperations = 0;\n\n // NEW: prevent re-entrant pump; defer extra runs\n private pumping = false;\n private needsPump = false;\n\n constructor(\n private readonly processor: (\n item: TCNSStimulationQueueItem<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite\n >\n ) => (() => void) | Promise<() => void>,\n protected readonly concurrency?: number,\n protected readonly abortSignal?: AbortSignal,\n initialCapacity?: number\n ) {\n if (initialCapacity && initialCapacity > 0) {\n this.capacity = initialCapacity;\n }\n this.items = new Array(this.capacity);\n }\n\n protected get canStartOperation(): boolean {\n const limit = this.concurrency ?? Infinity;\n return this.activeOperations < limit && !this.abortSignal?.aborted;\n }\n\n private resize(): void {\n const oldCapacity = this.capacity;\n this.capacity = oldCapacity * 2;\n const newItems = new Array(this.capacity);\n\n let oldIndex = this.head;\n for (let i = 0; i < this.size; i++) {\n newItems[i] = this.items[oldIndex];\n oldIndex = (oldIndex + 1) % oldCapacity;\n }\n\n this.items = newItems;\n this.head = 0;\n this.tail = this.size;\n }\n\n private dequeue():\n | TCNSStimulationQueueItem<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite\n >\n | undefined {\n if (this.size === 0) return undefined;\n\n const item = this.items[this.head];\n this.items[this.head] = undefined as any; // Clear reference\n this.head = (this.head + 1) % this.capacity;\n this.size--;\n\n return item;\n }\n\n private enqueueItem(\n item: TCNSStimulationQueueItem<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite\n >\n ): void {\n if (this.size === this.capacity) {\n this.resize();\n }\n\n this.items[this.tail] = item;\n this.tail = (this.tail + 1) % this.capacity;\n this.size++;\n }\n\n protected pump() {\n if (this.pumping) {\n this.needsPump = true;\n return;\n }\n this.pumping = true;\n\n while (this.canStartOperation && this.size > 0) {\n const item = this.dequeue()!;\n this.activeOperations++;\n\n const ret = this.processor(item);\n\n // Async branch\n if (ret && typeof (ret as any).then === 'function') {\n (ret as Promise<void | (() => void)>).then(\n cb => {\n // finish this item\n this.activeOperations--;\n if (typeof cb === 'function') cb();\n\n // schedule another pass (but don't re-enter if already pumping)\n if (this.size > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n },\n err => {\n this.activeOperations--;\n // resume if there's more work\n if (this.size > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n throw err; // let it crash \"honestly\"\n }\n );\n // Stop the loop; continuation will happen from the promise handler\n break;\n }\n\n // Sync branch\n this.activeOperations--;\n if (typeof ret === 'function') (ret as () => void)();\n // Loop continues; any items added by ret() stay in the same flat loop\n }\n\n this.pumping = false;\n\n // If async completions or enqueues requested another pass, do exactly one more, non-recursively\n if (this.needsPump) {\n this.needsPump = false;\n this.pump();\n }\n }\n\n enqueue(\n x: TCNSStimulationQueueItem<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite\n >\n ) {\n this.enqueueItem(x);\n // Start pumping only if not already pumping; avoid re-entrant pump\n if (!this.pumping) this.pump();\n else this.needsPump = true;\n }\n\n get length() {\n return this.size;\n }\n\n getActiveOperationsCount() {\n return this.activeOperations;\n }\n}\n","import { CNSStimulationContextStore } from './CNSStimulationContextStore';\nimport { ICNS } from './interfaces/ICNS';\nimport { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\nimport { TCNSStimulationOptions } from './types/TCNSStimulationOptions';\nimport { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { TCNSSubscriber } from './types/TCNSSubscriber';\nimport { CNSFunctionalQueue } from './CNSFunctionalQueue';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSSignal } from './types/TCNSSignal';\nimport { TCNSStimulationQueueItem } from './types/TCNSStimulationQueueItem';\n\nexport class CNSStimulation<\n TCollateralName extends string,\n TNeuronName extends string,\n TNeuron extends TCNSNeuron<\n any,\n TNeuronName,\n TCollateralName,\n any,\n any,\n any,\n any\n >,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>,\n TInputPayload,\n TOutputPayload\n> {\n private readonly ctx: ICNSStimulationContextStore;\n private readonly queue: CNSFunctionalQueue<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite\n >;\n private readonly nueronVisitMap?: Map<TNeuronName, number>;\n private readonly instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>;\n private scheduledCount = 0;\n\n /**\n * Track active SCCs: SCC index -> count of active neurons in that SCC\n */\n private readonly activeSccCounts = new Map<number, number>();\n\n public readonly id: string;\n\n constructor(\n private readonly cns: ICNS<TNeuron, TDendrite>,\n instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>,\n public readonly options?: TCNSStimulationOptions<\n TCollateralName,\n TInputPayload,\n TOutputPayload\n >\n ) {\n this.ctx =\n options?.ctx ??\n options?.createContextStore?.() ??\n new CNSStimulationContextStore();\n this.id = options?.stimulationId || Math.random().toString(36).slice(2);\n this.queue = new CNSFunctionalQueue(\n item => this.processQueueItem(item),\n options?.concurrency,\n options?.abortSignal\n );\n\n this.instanceNeuronQueue = instanceNeuronQueue;\n\n if (this.options?.maxNeuronHops) {\n this.nueronVisitMap = new Map();\n }\n }\n\n protected get concurrencyEnabled(): boolean {\n return (\n this.options?.concurrency !== undefined &&\n this.options?.concurrency > 0\n );\n }\n\n protected get autoCleanupContextsEnabled(): boolean {\n return this.cns?.options?.autoCleanupContexts ?? false;\n }\n\n /**\n * Mark a neuron as active (being processed)\n */\n protected markNeuronActive(neuronId: TNeuronName): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.incrementSccCount(neuronId);\n }\n\n /**\n * Mark a neuron as inactive (finished processing)\n */\n protected markNeuronInactive(neuronId: TNeuronName): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.decrementSccCount(neuronId);\n }\n\n /**\n * Increment the active count for the SCC containing this neuron\n */\n private incrementSccCount(neuronId: TNeuronName): void {\n const sccIndex = this.cns.getSccIndexByNeuronName(neuronId);\n if (sccIndex === undefined) return;\n\n const currentCount = this.activeSccCounts.get(sccIndex) || 0;\n this.activeSccCounts.set(sccIndex, currentCount + 1);\n }\n\n /**\n * Decrement the active count for the SCC containing this neuron\n */\n private decrementSccCount(neuronId: TNeuronName): void {\n const sccIndex = this.cns.getSccIndexByNeuronName(neuronId);\n if (sccIndex === undefined) return;\n\n const currentCount = this.activeSccCounts.get(sccIndex) || 0;\n const nextCount = Math.max(0, currentCount - 1);\n this.activeSccCounts.set(sccIndex, nextCount);\n\n // Log warning if we're trying to decrement below 0\n if (currentCount === 0) {\n console.warn(\n `[CNSStimulation] Attempting to decrement SCC count below 0 for neuron ${neuronId}`\n );\n }\n }\n\n /**\n * Check if a neuron can be guaranteed not to be visited again\n */\n protected canNeuronBeGuaranteedDone(neuronId: TNeuronName): boolean {\n if (!this.autoCleanupContextsEnabled) return false;\n return this.cns.canNeuronBeGuaranteedDone(\n neuronId,\n this.activeSccCounts\n );\n }\n\n protected cleanupCtxIfNeeded(neuron: TNeuron): void {\n if (\n this.autoCleanupContextsEnabled &&\n this.canNeuronBeGuaranteedDone(neuron.name)\n ) {\n this.ctx.delete(neuron.name);\n }\n }\n\n protected createSubscriberQueueItem(\n subscriber: TCNSSubscriber<TNeuron, TDendrite>,\n inputSignal?: TCNSSignal<TCollateralName, any>\n ) {\n if (this.options?.maxNeuronHops) {\n if (\n this.nueronVisitMap?.get(subscriber.neuron.name) ??\n 0 >= this.options?.maxNeuronHops\n ) {\n throw new Error(\n `Max neuron hops reached for neuron \"${subscriber.neuron.name}\" ` +\n `when trying to enqueue subscriber \"${subscriber.dendrite.collateral.name}\" ` +\n `in stimulation \"${this.id}\"`\n );\n } else {\n this.nueronVisitMap?.set(\n subscriber.neuron.name,\n (this.nueronVisitMap?.get(subscriber.neuron.name) ?? 0) + 1\n );\n }\n }\n\n return {\n neuronId: subscriber.neuron.name,\n subscriber,\n inputSignal,\n };\n }\n\n private processQueueItem(\n item: TCNSStimulationQueueItem<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite\n >\n ) {\n const { subscriber, inputSignal } = item;\n const { neuron, dendrite } = subscriber;\n\n const starter = () => {\n // Mark neuron as active only when we actually start processing (after gate allows it)\n this.markNeuronActive(neuron.name);\n\n const response = dendrite.response(\n inputSignal?.payload,\n neuron.axon,\n {\n get: () => this.ctx.get(neuron.name),\n set: (value: any) => this.ctx.set(neuron.name, value),\n delete: () => this.ctx.delete(neuron.name),\n abortSignal: this.options?.abortSignal,\n cns: this.cns,\n }\n );\n\n if (response instanceof Promise) {\n return response.then(\n signal => {\n return () => {\n // Mark neuron as inactive when async processing completes\n this.markNeuronInactive(neuron.name);\n return this.processResponse(\n inputSignal as TCNSSignal<TCollateralName, any>,\n signal as\n | TCNSSignal<TCollateralName, any>\n | undefined\n );\n };\n },\n error => {\n return () => {\n // Mark neuron as inactive when async processing fails\n this.markNeuronInactive(neuron.name);\n return this.processResponse(\n inputSignal as TCNSSignal<TCollateralName, any>,\n undefined,\n error\n );\n };\n }\n );\n } else {\n return () => {\n // Mark neuron as inactive when sync processing completes\n this.markNeuronInactive(neuron.name);\n return this.processResponse(\n inputSignal as TCNSSignal<TCollateralName, any>,\n response as TCNSSignal<TCollateralName, any> | undefined\n );\n };\n }\n };\n\n // Use CNS-provided per-instance neuron queue for global concurrency gating\n return this.instanceNeuronQueue.run(neuron, starter);\n }\n\n protected processResponse(\n inputSignal?: TCNSSignal<TCollateralName, TInputPayload>,\n outputSignal?: TCNSSignal<TCollateralName, TOutputPayload>,\n error?: any\n ): void {\n const collateral = outputSignal?.collateral;\n const ownerNeuron = collateral\n ? this.cns.getParentNeuronByCollateralName(collateral.name)\n : undefined;\n const subscribers = collateral\n ? this.cns.getSubscribers(collateral.name)\n : [];\n const subscriberQueueItems: TCNSStimulationQueueItem<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite\n >[] = [];\n\n if (collateral && !error) {\n if (ownerNeuron) {\n this.cleanupCtxIfNeeded(ownerNeuron);\n }\n\n for (let i = 0; i < subscribers.length; i++) {\n subscriberQueueItems.push(\n this.createSubscriberQueueItem(subscribers[i], outputSignal)\n );\n }\n }\n this.scheduledCount += subscriberQueueItems.length;\n\n // After we pre-enqueued all subscribers, we can trace the response\n this.options?.onResponse?.({\n inputSignal: inputSignal,\n outputSignal: outputSignal,\n ctx: this.ctx,\n queueLength: this.queue.length + this.scheduledCount,\n stimulationId: this.id,\n\n hops:\n this.options?.maxNeuronHops && ownerNeuron\n ? this.nueronVisitMap?.get(ownerNeuron.name) ?? 0\n : undefined,\n error,\n } as any);\n\n // After we traced the response, we can enqueue the pre-enqueued subscribers\n // So if we have a synchronous response - the traces would go\n // from start to end and will show the correct queueLength === 0\n // in the end\n for (let i = 0; i < subscriberQueueItems.length; i++) {\n this.scheduledCount--;\n this.queue.enqueue(subscriberQueueItems[i]);\n }\n }\n\n public responseToSignal(\n signal: TCNSSignal<TCollateralName, TOutputPayload>\n ): void {\n // Mark the owner neuron of the initial signal as active\n const ownerNeuron = this.cns.getParentNeuronByCollateralName(\n signal.collateral.name\n );\n if (ownerNeuron) {\n this.markNeuronActive(ownerNeuron.name);\n }\n\n this.processResponse(undefined, signal);\n }\n}\n","export class CNSTaskQueue {\n private pumping = false;\n private needsPump = false;\n private activeOperations = 0;\n\n private items: Array<{\n task: () => (() => void) | Promise<() => void>;\n resolve: () => void;\n reject: (e: any) => void;\n }> = [];\n\n constructor(private readonly concurrency?: number) {}\n\n private get canStartOperation(): boolean {\n const limit = this.concurrency ?? Infinity;\n return this.activeOperations < limit;\n }\n\n enqueue(task: () => (() => void) | Promise<() => void>): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.items.push({ task, resolve, reject });\n if (!this.pumping) this.pump();\n else this.needsPump = true;\n });\n }\n\n private pump() {\n if (this.pumping) {\n this.needsPump = true;\n return;\n }\n this.pumping = true;\n\n while (this.canStartOperation && this.items.length > 0) {\n const { task, resolve, reject } = this.items.shift()!;\n this.activeOperations++;\n\n try {\n const ret = task();\n if (ret && typeof (ret as any).then === 'function') {\n (ret as Promise<() => void>).then(\n cb => {\n try {\n if (typeof cb === 'function') cb();\n resolve();\n } finally {\n this.activeOperations--;\n if (\n this.items.length > 0 &&\n this.canStartOperation\n ) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n }\n },\n err => {\n try {\n reject(err);\n } finally {\n this.activeOperations--;\n if (\n this.items.length > 0 &&\n this.canStartOperation\n ) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n }\n }\n );\n break;\n } else {\n try {\n if (typeof ret === 'function') (ret as () => void)();\n resolve();\n } finally {\n this.activeOperations--;\n }\n }\n } catch (e) {\n try {\n reject(e);\n } finally {\n this.activeOperations--;\n }\n }\n }\n\n this.pumping = false;\n if (this.needsPump) {\n this.needsPump = false;\n this.pump();\n }\n }\n}\n","export class CNSInstanceNeuronQueue<\n TNeuron extends { name: string; concurrency?: number }\n> {\n private readonly gates = new Map<\n string,\n { limit: number; active: number; waiters: (() => void)[] }\n >();\n\n run(\n neuron: TNeuron,\n fn: () => (() => void) | Promise<() => void>\n ): (() => void) | Promise<() => void> {\n const limit = neuron?.concurrency;\n if (limit === undefined || limit <= 0) {\n return fn();\n }\n\n let gate = this.gates.get(neuron.name);\n if (!gate) {\n gate = { limit, active: 0, waiters: [] };\n this.gates.set(neuron.name, gate);\n } else {\n gate.limit = limit;\n }\n\n const wrap = (cb: () => void) => {\n return () => {\n try {\n cb();\n } finally {\n const g = this.gates.get(neuron.name)!;\n g.active = Math.max(0, g.active - 1);\n if (g.waiters.length > 0) {\n const next = g.waiters.shift()!;\n next();\n }\n }\n };\n };\n\n if (gate.active < gate.limit) {\n gate.active++;\n const ret = fn();\n if (ret && typeof (ret as any).then === 'function') {\n return (ret as Promise<() => void>).then(cb => wrap(cb));\n }\n return wrap(ret as () => void);\n }\n\n return new Promise<() => void>(resolve => {\n const starter = () => {\n const g = this.gates.get(neuron.name)!;\n g.active++;\n const ret = fn();\n if (ret && typeof (ret as any).then === 'function') {\n (ret as Promise<() => void>).then(cb => resolve(wrap(cb)));\n } else {\n resolve(wrap(ret as () => void));\n }\n };\n gate!.waiters.push(starter);\n });\n }\n}\n","import { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { ICNS } from './interfaces/ICNS';\nimport { TCNSSubscriber } from './types/TCNSSubscriber';\nimport { TCNSOptions } from './types/TCNSOptions';\nimport { TCNSStimulationOptions } from './types/TCNSStimulationOptions';\nimport { CNSStimulation } from './CNSStimulation';\nimport { CNSCollateral } from './CNSCollateral';\nimport { TCNSSignal } from './types/TCNSSignal';\nimport { CNSTaskQueue } from './CNSTaskQueue';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSStimulationResponse } from './types/TCNSStimulationResponse';\n\nexport class CNS<\n TCollateralName extends string,\n TNeuronName extends string,\n TNeuron extends TCNSNeuron<any, TNeuronName, any, any, any, any, any>,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>\n> implements ICNS<TNeuron, TDendrite>\n{\n /**\n * Fast lookup: collateralName -> list of (neuron, dendrite) subscribers.\n * Built once at construction time.\n */\n private subIndex = new Map<\n TCollateralName,\n TCNSSubscriber<TNeuron, TDendrite>[]\n >();\n\n private neuronIndex = new Map<TNeuronName, TNeuron>();\n private dendriteIndex = new Map<TCollateralName, TDendrite>();\n private collateralIndex = new Map<\n TCollateralName,\n CNSCollateral<TCollateralName, unknown>\n >();\n\n private parentNeuronByCollateralName = new Map<TCollateralName, TNeuron>();\n\n /**\n * Strongly Connected Components of the neuron graph.\n * Each component is a set of neuron IDs that can reach each other.\n */\n public stronglyConnectedComponents: Set<string>[] = [];\n\n /**\n * Quick lookup: neuron ID -> SCC index for fast reachability checks.\n */\n private neuronToSCC = new Map<string, number>();\n\n /**\n * DAG of SCCs: SCC index -> set of SCC indices that can reach this SCC\n */\n private sccDag: Map<number, Set<number>> = new Map();\n\n /**\n * Precomputed ancestor sets for each SCC for fast reachability checks\n */\n private sccAncestors: Map<number, Set<number>> = new Map();\n\n /**\n * Global per-neuron concurrency gates shared across all stimulations.\n */\n private readonly neuronGates = new Map<\n TNeuronName,\n { limit: number; active: number; waiters: (() => void)[] }\n >();\n\n /**\n * Global task queue used by stimulation to schedule per-neuron gated work.\n * Does not replace per-stimulation concurrency; only coordinates global per-neuron limits.\n */\n private readonly globalTaskQueue = new CNSTaskQueue();\n protected readonly instanceNeuronQueue =\n new CNSInstanceNeuronQueue<TNeuron>();\n\n /**\n * Global response listeners applied to every stimulation.\n */\n private readonly globalResponseListeners: Array<(r: any) => void> = [];\n\n constructor(\n protected readonly neurons: TNeuron[],\n public readonly options?: TCNSOptions\n ) {\n this.validateUniqueIdentifiers();\n this.buildIndexes();\n if (this.options?.autoCleanupContexts) {\n this.buildSCC();\n }\n }\n\n /**\n * Validate uniqueness constraints:\n * - neuron names are unique and non-empty\n * - axon collateral types are globally unique (single owner)\n * - the same collateral instance cannot be owned by multiple neurons\n * Throws aggregated error if violations are found.\n */\n private validateUniqueIdentifiers(): void {\n const errors: string[] = [];\n const seenNeuronNames = new Set<string>();\n\n for (const neuron of this.neurons) {\n const name = (neuron?.name as unknown as string) ?? '';\n if (!name || typeof name !== 'string' || name.trim().length === 0) {\n errors.push(`Neuron has empty or invalid name: \"${name}\"`);\n } else if (seenNeuronNames.has(name)) {\n errors.push(`Duplicate neuron name: \"${name}\"`);\n } else {\n seenNeuronNames.add(name);\n }\n }\n\n if (errors.length > 0) {\n throw new Error(\n `[CNS] Topology uniqueness validation failed:\\n - ` +\n errors.join(`\\n - `)\n );\n }\n }\n\n public addResponseListener(\n listener: <TInputPayload, TOutputPayload>(\n response: TCNSStimulationResponse<\n TCollateralName,\n TInputPayload,\n TOutputPayload\n >\n ) => void\n ): () => void {\n this.globalResponseListeners.push(listener);\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n const idx = this.globalResponseListeners.indexOf(listener);\n if (idx >= 0) this.globalResponseListeners.splice(idx, 1);\n };\n }\n\n public wrapOnResponse<T>(\n local?: (response: T) => void\n ): (response: T) => void {\n if (this.globalResponseListeners.length === 0 && !local) {\n // No-op fast path\n return () => {};\n }\n return (r: T) => {\n try {\n if (local) local(r);\n } finally {\n // Global listeners should always see the event even if local throws\n for (let i = 0; i < this.globalResponseListeners.length; i++) {\n try {\n this.globalResponseListeners[i](r);\n } catch (e) {\n // Swallow to prevent breaking propagation chain\n }\n }\n }\n };\n }\n\n protected runWithNeuronConcurrency(\n neuron: TNeuron,\n fn: () => (() => void) | Promise<() => void>\n ): Promise<void> {\n const limit = (neuron as any).concurrency as number | undefined;\n if (limit === undefined || limit <= 0) {\n return this.globalTaskQueue.enqueue(fn);\n }\n\n let gate = this.neuronGates.get(neuron.name as TNeuronName);\n if (!gate) {\n gate = { limit, active: 0, waiters: [] };\n this.neuronGates.set(neuron.name as TNeuronName, gate);\n } else {\n gate.limit = limit;\n }\n\n const wrap = (cb: () => void) => {\n return () => {\n try {\n cb();\n } finally {\n gate!.active = Math.max(0, gate!.active - 1);\n if (gate!.waiters.length > 0) {\n const next = gate!.waiters.shift()!;\n next();\n }\n }\n };\n };\n\n if (gate.active < gate.limit) {\n gate.active++;\n return this.globalTaskQueue.enqueue(() => {\n const ret = fn();\n if (ret && typeof (ret as any).then === 'function') {\n return (ret as Promise<() => void>).then(cb => wrap(cb));\n }\n return wrap(ret as () => void);\n });\n }\n\n return new Promise<void>(resolve => {\n const starter = () => {\n gate!.active++;\n this.globalTaskQueue\n .enqueue(() => {\n const ret = fn();\n if (ret && typeof (ret as any).then === 'function') {\n return (ret as Promise<() => void>).then(cb =>\n wrap(cb)\n );\n }\n return wrap(ret as () => void);\n })\n .then(resolve);\n };\n gate!.waiters.push(starter);\n });\n }\n\n private buildIndexes() {\n this.subIndex.clear();\n this.parentNeuronByCollateralName.clear();\n for (const neuron of this.neurons) {\n this.neuronIndex.set(neuron.name, neuron);\n for (const dendrite of neuron.dendrites) {\n const key = dendrite.collateral.name as TCollateralName;\n const arr = this.subIndex.get(key) ?? [];\n arr.push({ neuron, dendrite: dendrite as TDendrite });\n this.subIndex.set(\n key,\n arr as TCNSSubscriber<TNeuron, TDendrite>[]\n );\n this.dendriteIndex.set(key, dendrite as TDendrite);\n }\n Object.values(neuron.axon).forEach(collateral => {\n this.parentNeuronByCollateralName.set(\n (collateral as CNSCollateral<TCollateralName, unknown>)\n .name,\n neuron\n );\n this.collateralIndex.set(\n (collateral as CNSCollateral<TCollateralName, unknown>)\n .name,\n collateral as CNSCollateral<TCollateralName, unknown>\n );\n });\n }\n }\n\n /**\n * Build the neuron graph where neurons are connected if one can stimulate the other.\n */\n private buildNeuronGraph(): Map<string, Set<string>> {\n const graph = new Map<string, Set<string>>();\n const neuronIds = this.neurons.map(n => n.name);\n\n // Initialize graph\n for (const neuronId of neuronIds) {\n graph.set(neuronId, new Set());\n }\n\n // Build edges: neuron -> neurons it can reach via its axons\n for (const neuron of this.neurons) {\n const reachableNeurons = new Set<string>();\n\n // Check what collaterals this neuron can emit\n for (const axonKey in neuron.axon) {\n const collateral = neuron.axon[axonKey];\n const collateralName = collateral.name as TCollateralName;\n\n // Find which neurons listen to this collateral\n const subscribers = this.subIndex.get(collateralName);\n if (subscribers) {\n for (const { neuron: targetNeuron } of subscribers) {\n reachableNeurons.add(targetNeuron.name);\n }\n }\n }\n\n graph.set(neuron.name, reachableNeurons);\n }\n\n return graph;\n }\n\n /**\n * Build strongly connected components using Tarjan's algorithm.\n */\n private buildSCC(): void {\n const graph = this.buildNeuronGraph();\n const neuronIds = this.neurons.map(n => n.name);\n\n // Tarjan's algorithm for SCC\n const index = new Map<string, number>();\n const lowlink = new Map<string, number>();\n const onStack = new Set<string>();\n const stack: string[] = [];\n const components: Set<string>[] = [];\n let currentIndex = 0;\n\n const strongConnect = (neuronId: string) => {\n index.set(neuronId, currentIndex);\n lowlink.set(neuronId, currentIndex);\n currentIndex++;\n stack.push(neuronId);\n onStack.add(neuronId);\n\n const neighbors = graph.get(neuronId) || new Set();\n for (const neighbor of neighbors) {\n if (!index.has(neighbor)) {\n strongConnect(neighbor);\n lowlink.set(\n neuronId,\n Math.min(lowlink.get(neuronId)!, lowlink.get(neighbor)!)\n );\n } else if (onStack.has(neighbor)) {\n lowlink.set(\n neuronId,\n Math.min(lowlink.get(neuronId)!, index.get(neighbor)!)\n );\n }\n }\n\n if (lowlink.get(neuronId) === index.get(neuronId)) {\n const component = new Set<string>();\n let w: string;\n do {\n w = stack.pop()!;\n onStack.delete(w);\n component.add(w);\n } while (w !== neuronId);\n components.push(component);\n }\n };\n\n // Run Tarjan's algorithm on all unvisited neurons\n for (const neuronId of neuronIds) {\n if (!index.has(neuronId)) {\n strongConnect(neuronId);\n }\n }\n\n this.stronglyConnectedComponents = components;\n\n // Build quick lookup map for reachability checks\n for (let i = 0; i < components.length; i++) {\n for (const neuronId of components[i]) {\n this.neuronToSCC.set(neuronId, i);\n }\n }\n\n // Build DAG between SCCs\n this.buildSCCDAG(graph);\n\n // Precompute ancestor sets for fast reachability checks\n this.buildSCCAncestors();\n }\n\n /**\n * Build DAG between SCCs based on the original neuron graph\n */\n private buildSCCDAG(neuronGraph: Map<string, Set<string>>): void {\n this.sccDag.clear();\n\n // Initialize DAG\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n this.sccDag.set(i, new Set());\n }\n\n // Build edges between SCCs\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n const scc = this.stronglyConnectedComponents[i];\n\n for (const neuronId of scc) {\n const neighbors = neuronGraph.get(neuronId) || new Set();\n\n for (const neighborId of neighbors) {\n const neighborSccIndex = this.neuronToSCC.get(neighborId);\n if (\n neighborSccIndex !== undefined &&\n neighborSccIndex !== i\n ) {\n // Add edge: neighborSccIndex -> i (neighbor can reach this SCC)\n this.sccDag.get(neighborSccIndex)!.add(i);\n }\n }\n }\n }\n }\n\n /**\n * Precompute ancestor sets for each SCC for fast reachability checks\n * Uses topological sort for efficient computation\n */\n private buildSCCAncestors(): void {\n this.sccAncestors.clear();\n\n // Initialize ancestor sets\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n this.sccAncestors.set(i, new Set());\n }\n\n // Topological sort to compute ancestors efficiently\n const inDegree = new Map<number, number>();\n const queue: number[] = [];\n\n // Calculate in-degrees\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n const incomingEdges = this.sccDag.get(i) || new Set();\n inDegree.set(i, incomingEdges.size);\n\n if (incomingEdges.size === 0) {\n queue.push(i);\n }\n }\n\n // Process nodes in topological order\n while (queue.length > 0) {\n const current = queue.shift()!;\n const outgoingEdges = this.getOutgoingEdges(current);\n\n for (const neighbor of outgoingEdges) {\n // Add current as ancestor of neighbor\n const neighborAncestors = this.sccAncestors.get(neighbor)!;\n neighborAncestors.add(current);\n\n // Add all ancestors of current to neighbor\n const currentAncestors = this.sccAncestors.get(current)!;\n for (const ancestor of currentAncestors) {\n neighborAncestors.add(ancestor);\n }\n\n // Decrease in-degree\n const newInDegree = (inDegree.get(neighbor) || 0) - 1;\n inDegree.set(neighbor, newInDegree);\n\n if (newInDegree === 0) {\n queue.push(neighbor);\n }\n }\n }\n }\n\n /**\n * Get outgoing edges for a given SCC index\n */\n private getOutgoingEdges(sccIndex: number): Set<number> {\n const outgoing = new Set<number>();\n\n // Find all SCCs that have this SCC as an incoming edge\n for (const [targetScc, incomingEdges] of this.sccDag) {\n if (incomingEdges.has(sccIndex)) {\n outgoing.add(targetScc);\n }\n }\n\n return outgoing;\n }\n\n /**\n * Check if a neuron can be reached again (including self-calling).\n * Returns true if the neuron is in a strongly connected component with more than one member,\n * or if it's in a single-member SCC that can reach itself.\n */\n public getSCCSetByNeuronName(neuronName: string) {\n const sccIndex = this.neuronToSCC.get(neuronName);\n\n if (sccIndex === undefined) return;\n\n return this.stronglyConnectedComponents[sccIndex];\n }\n\n /**\n * Get the SCC index for a given neuron ID\n */\n public getSccIndexByNeuronName(neuronName: string): number | undefined {\n return this.neuronToSCC.get(neuronName);\n }\n\n /**\n * Check if a neuron can be guaranteed not to be visited again during the current propagation.\n * This is the core logic for safe context cleanup.\n */\n public canNeuronBeGuaranteedDone(\n neuronName: string,\n activeSccCounts: Map<number, number>\n ): boolean {\n const sccIndex = this.neuronToSCC.get(neuronName);\n if (sccIndex === undefined) return true; // Neuron not in graph\n\n // Check if this SCC is still active\n if (\n activeSccCounts.get(sccIndex) &&\n activeSccCounts.get(sccIndex)! > 0\n ) {\n return false; // SCC is still active\n }\n\n // Check if any active SCC can reach this SCC\n const ancestors = this.sccAncestors.get(sccIndex);\n if (!ancestors) return true;\n\n for (const ancestorSccIndex of ancestors) {\n if (\n activeSccCounts.get(ancestorSccIndex) &&\n activeSccCounts.get(ancestorSccIndex)! > 0\n ) {\n return false; // An active ancestor can still reach this SCC\n }\n }\n\n return true; // Neuron is guaranteed to be done\n }\n\n public getParentNeuronByCollateralName(collateralName: TCollateralName) {\n return this.parentNeuronByCollateralName.get(collateralName);\n }\n\n public getDendrites() {\n return Array.from(this.dendriteIndex.values());\n }\n\n public getCollaterals() {\n return Array.from(this.collateralIndex.values());\n }\n\n public getNeurons() {\n return Array.from(this.neuronIndex.values());\n }\n\n public getSubscribers(\n collateralName: TCollateralName\n ): TCNSSubscriber<TNeuron, TDendrite>[] {\n return this.subIndex.get(collateralName) ?? [];\n }\n\n public stimulate<TInputPayload extends TOutputPayload, TOutputPayload>(\n signal: TCNSSignal<TCollateralName, TInputPayload>,\n options?: TCNSStimulationOptions<\n TCollateralName,\n TInputPayload,\n TOutputPayload\n >\n ) {\n const wrapped = this.wrapOnResponse(options?.onResponse);\n const stimulation = new CNSStimulation<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite,\n TInputPayload,\n TOutputPayload\n >(this, this.instanceNeuronQueue, {\n ...options,\n onResponse: wrapped,\n });\n stimulation.responseToSignal(signal);\n }\n}\n","import { TCNSSignal } from './types/TCNSSignal';\nimport { ICNSCollateral } from './interfaces/ICNSCollateral';\n\nexport class CNSCollateral<TName extends string, TPayload>\n implements ICNSCollateral<TName, TPayload>\n{\n constructor(public readonly name: TName) {}\n\n createSignal(): TCNSSignal<TName, TPayload>;\n createSignal(payload: TPayload): TCNSSignal<TName, TPayload>;\n createSignal(payload?: TPayload): TCNSSignal<TName, TPayload> {\n return { collateral: this, payload };\n }\n}\n","import { CNSCollateral } from '../CNSCollateral';\nimport { TCNSAxon } from '../types/TCNSAxon';\nimport { TCNSDendrite } from '../types/TCNSDendrite';\n\nexport const collateral = <TPayload = undefined, TName extends string = string>(\n name: TName\n) => new CNSCollateral<TName, TPayload>(name);\n\n// Helper types to extract collateral Name/Payload for a given key from a heterogenous axon-like object\ntype PayloadOf<TAxon, K extends keyof TAxon> = TAxon[K] extends CNSCollateral<\n any,\n infer P\n>\n ? P\n : never;\ntype NameOf<TAxon, K extends keyof TAxon> = TAxon[K] extends CNSCollateral<\n infer N,\n any\n>\n ? N\n : never;\n\ntype InterNeuronAPI<\n TContextValue,\n TNameType extends string,\n TReceiverCollateralName extends string,\n TReceiverAxonCollateralPayload,\n TAxonType extends TCNSAxon<\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload\n >\n> = {\n name: TNameType;\n axon: TAxonType;\n concurrency?: number;\n dendrites: TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >[];\n setConcurrency: (\n n: number | undefined\n ) => InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n bind: <TFollowAxon extends Record<string, CNSCollateral<any, any>>>(\n axon: TFollowAxon,\n dendrites: {\n [K in keyof TFollowAxon]:\n | TCNSDendrite<\n TContextValue,\n NameOf<TFollowAxon, K> & string,\n PayloadOf<TFollowAxon, K>,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n | TCNSDendrite<\n TContextValue,\n NameOf<TFollowAxon, K> & string,\n PayloadOf<TFollowAxon, K>,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >['response'];\n }\n ) => InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n dendrite: <\n TSenderExactCollateralName extends string,\n TSenderExactAxonCollateralPayload\n >(\n s: TCNSDendrite<\n TContextValue,\n TSenderExactCollateralName,\n TSenderExactAxonCollateralPayload,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n ) => InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n};\n\n// Concrete builder\nexport const neuron = <\n TContextValue,\n TNameType extends string,\n TProvidedAxon extends Record<string, CNSCollateral<any, any>>,\n TReceiverCollateralName extends keyof TProvidedAxon &\n string = keyof TProvidedAxon & string,\n TReceiverAxonCollateralPayload = TProvidedAxon[keyof TProvidedAxon] extends CNSCollateral<\n any,\n infer P\n >\n ? P\n : never\n>(\n name: TNameType,\n axon: TProvidedAxon\n): InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<TReceiverCollateralName, TReceiverAxonCollateralPayload>\n> => {\n const dendrites: TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<TReceiverCollateralName, TReceiverAxonCollateralPayload>\n >[] = [];\n\n const api: InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<TReceiverCollateralName, TReceiverAxonCollateralPayload>\n > = {\n setConcurrency: (n: number | undefined) => {\n api.concurrency = n;\n return api;\n },\n bind: ((axon, newDendrites) => {\n for (const key in newDendrites) {\n const value = newDendrites[key] as any;\n const dendrite =\n typeof value === 'function'\n ? {\n collateral: (axon as any)[key],\n response: value,\n }\n : value;\n dendrites.push(\n dendrite as TCNSDendrite<\n TContextValue,\n string,\n unknown,\n any,\n any,\n any\n >\n );\n }\n return api;\n }) as InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<TReceiverCollateralName, TReceiverAxonCollateralPayload>\n >['bind'],\n axon: axon as unknown as TCNSAxon<\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload\n >,\n name,\n concurrency: undefined,\n dendrites,\n dendrite<\n TSenderExactCollateralName extends string,\n TSenderExactAxonCollateralPayload\n >(\n s: TCNSDendrite<\n TContextValue,\n TSenderExactCollateralName,\n TSenderExactAxonCollateralPayload,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload\n >\n >\n ) {\n dendrites.push(\n s as TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload\n >\n >\n );\n return api; // keep full API for chaining\n },\n };\n\n return api;\n};\n\nexport const withCtx = <TContextValue>() => ({\n neuron: <\n TNameType extends string,\n TProvidedAxon extends Record<string, CNSCollateral<any, any>>\n >(\n name: TNameType,\n axon: TProvidedAxon\n ) => {\n return neuron<TContextValue, TNameType, TProvidedAxon>(name, axon);\n },\n});\n"]}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  export { CNS } from './CNS';
2
2
  export { CNSCollateral } from './CNSCollateral';
3
+ export { CNSStimulationContextStore } from './CNSStimulationContextStore';
4
+ export type { ICNS } from './interfaces/ICNS';
3
5
  export type { TCNSNeuron } from './types/TCNSNeuron';
4
6
  export type { TCNSAxon } from './types/TCNSAxon';
5
7
  export type { TCNSDendrite } from './types/TCNSDendrite';
6
8
  export type { TCNSSignal } from './types/TCNSSignal';
9
+ export type { TCNSStimulationOptions } from './types/TCNSStimulationOptions';
7
10
  export { collateral, neuron, withCtx } from './factory/index';
8
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,YAAY,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAG7E,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -213,7 +213,7 @@ var CNSStimulation = class {
213
213
  if (this.options?.maxNeuronHops) {
214
214
  if (this.nueronVisitMap?.get(subscriber.neuron.name) ?? 0 >= this.options?.maxNeuronHops) {
215
215
  throw new Error(
216
- `Max neuron hops reached for neuron "${subscriber.neuron.name}" when trying to enqueue subscriber "${subscriber.dendrite.collateral.type}" in stimulation "${this.id}"`
216
+ `Max neuron hops reached for neuron "${subscriber.neuron.name}" when trying to enqueue subscriber "${subscriber.dendrite.collateral.name}" in stimulation "${this.id}"`
217
217
  );
218
218
  } else {
219
219
  this.nueronVisitMap?.set(
@@ -239,6 +239,7 @@ var CNSStimulation = class {
239
239
  {
240
240
  get: () => this.ctx.get(neuron2.name),
241
241
  set: (value) => this.ctx.set(neuron2.name, value),
242
+ delete: () => this.ctx.delete(neuron2.name),
242
243
  abortSignal: this.options?.abortSignal,
243
244
  cns: this.cns
244
245
  }
@@ -279,8 +280,8 @@ var CNSStimulation = class {
279
280
  }
280
281
  processResponse(inputSignal, outputSignal, error) {
281
282
  const collateral2 = outputSignal?.collateral;
282
- const ownerNeuron = collateral2 ? this.cns.getParentNeuronByCollateralId(collateral2.type) : void 0;
283
- const subscribers = collateral2 ? this.cns.getSubscribers(collateral2.type) : [];
283
+ const ownerNeuron = collateral2 ? this.cns.getParentNeuronByCollateralName(collateral2.name) : void 0;
284
+ const subscribers = collateral2 ? this.cns.getSubscribers(collateral2.name) : [];
284
285
  const subscriberQueueItems = [];
285
286
  if (collateral2 && !error) {
286
287
  if (ownerNeuron) {
@@ -298,6 +299,7 @@ var CNSStimulation = class {
298
299
  outputSignal,
299
300
  ctx: this.ctx,
300
301
  queueLength: this.queue.length + this.scheduledCount,
302
+ stimulationId: this.id,
301
303
  hops: this.options?.maxNeuronHops && ownerNeuron ? this.nueronVisitMap?.get(ownerNeuron.name) ?? 0 : void 0,
302
304
  error
303
305
  });
@@ -307,8 +309,8 @@ var CNSStimulation = class {
307
309
  }
308
310
  }
309
311
  responseToSignal(signal) {
310
- const ownerNeuron = this.cns.getParentNeuronByCollateralId(
311
- signal.collateral.type
312
+ const ownerNeuron = this.cns.getParentNeuronByCollateralName(
313
+ signal.collateral.name
312
314
  );
313
315
  if (ownerNeuron) {
314
316
  this.markNeuronActive(ownerNeuron.name);
@@ -460,11 +462,14 @@ var CNS = class {
460
462
  this.neurons = neurons;
461
463
  this.options = options;
462
464
  /**
463
- * Fast lookup: collateralId -> list of (neuron, dendrite) subscribers.
465
+ * Fast lookup: collateralName -> list of (neuron, dendrite) subscribers.
464
466
  * Built once at construction time.
465
467
  */
466
468
  this.subIndex = /* @__PURE__ */ new Map();
467
- this.parentNeuronByCollateralId = /* @__PURE__ */ new Map();
469
+ this.neuronIndex = /* @__PURE__ */ new Map();
470
+ this.dendriteIndex = /* @__PURE__ */ new Map();
471
+ this.collateralIndex = /* @__PURE__ */ new Map();
472
+ this.parentNeuronByCollateralName = /* @__PURE__ */ new Map();
468
473
  /**
469
474
  * Strongly Connected Components of the neuron graph.
470
475
  * Each component is a set of neuron IDs that can reach each other.
@@ -611,22 +616,28 @@ var CNS = class {
611
616
  }
612
617
  buildIndexes() {
613
618
  this.subIndex.clear();
614
- this.parentNeuronByCollateralId.clear();
619
+ this.parentNeuronByCollateralName.clear();
615
620
  for (const neuron2 of this.neurons) {
621
+ this.neuronIndex.set(neuron2.name, neuron2);
616
622
  for (const dendrite of neuron2.dendrites) {
617
- const key = dendrite.collateral.type;
623
+ const key = dendrite.collateral.name;
618
624
  const arr = this.subIndex.get(key) ?? [];
619
625
  arr.push({ neuron: neuron2, dendrite });
620
626
  this.subIndex.set(
621
627
  key,
622
628
  arr
623
629
  );
630
+ this.dendriteIndex.set(key, dendrite);
624
631
  }
625
632
  Object.values(neuron2.axon).forEach((collateral2) => {
626
- this.parentNeuronByCollateralId.set(
627
- collateral2.type,
633
+ this.parentNeuronByCollateralName.set(
634
+ collateral2.name,
628
635
  neuron2
629
636
  );
637
+ this.collateralIndex.set(
638
+ collateral2.name,
639
+ collateral2
640
+ );
630
641
  });
631
642
  }
632
643
  }
@@ -643,8 +654,8 @@ var CNS = class {
643
654
  const reachableNeurons = /* @__PURE__ */ new Set();
644
655
  for (const axonKey in neuron2.axon) {
645
656
  const collateral2 = neuron2.axon[axonKey];
646
- const collateralType = collateral2.type;
647
- const subscribers = this.subIndex.get(collateralType);
657
+ const collateralName = collateral2.name;
658
+ const subscribers = this.subIndex.get(collateralName);
648
659
  if (subscribers) {
649
660
  for (const { neuron: targetNeuron } of subscribers) {
650
661
  reachableNeurons.add(targetNeuron.name);
@@ -817,11 +828,20 @@ var CNS = class {
817
828
  }
818
829
  return true;
819
830
  }
820
- getParentNeuronByCollateralId(collateralType) {
821
- return this.parentNeuronByCollateralId.get(collateralType);
831
+ getParentNeuronByCollateralName(collateralName) {
832
+ return this.parentNeuronByCollateralName.get(collateralName);
833
+ }
834
+ getDendrites() {
835
+ return Array.from(this.dendriteIndex.values());
836
+ }
837
+ getCollaterals() {
838
+ return Array.from(this.collateralIndex.values());
839
+ }
840
+ getNeurons() {
841
+ return Array.from(this.neuronIndex.values());
822
842
  }
823
- getSubscribers(collateralType) {
824
- return this.subIndex.get(collateralType) ?? [];
843
+ getSubscribers(collateralName) {
844
+ return this.subIndex.get(collateralName) ?? [];
825
845
  }
826
846
  stimulate(signal, options) {
827
847
  const wrapped = this.wrapOnResponse(options?.onResponse);
@@ -835,8 +855,8 @@ var CNS = class {
835
855
 
836
856
  // src/CNSCollateral.ts
837
857
  var CNSCollateral = class {
838
- constructor(type) {
839
- this.type = type;
858
+ constructor(name) {
859
+ this.name = name;
840
860
  }
841
861
  createSignal(payload) {
842
862
  return { collateral: this, payload };
@@ -844,7 +864,7 @@ var CNSCollateral = class {
844
864
  };
845
865
 
846
866
  // src/factory/index.ts
847
- var collateral = (type) => new CNSCollateral(type);
867
+ var collateral = (name) => new CNSCollateral(name);
848
868
  var neuron = (name, axon) => {
849
869
  const dendrites = [];
850
870
  const api = {
@@ -883,28 +903,7 @@ var withCtx = () => ({
883
903
  return neuron(name, axon);
884
904
  }
885
905
  });
886
- var fa = {
887
- test1: new CNSCollateral("test1"),
888
- test2: new CNSCollateral("test2")
889
- };
890
- var fb = {
891
- test4: collateral("test4"),
892
- test5: collateral("test5")
893
- };
894
- withCtx().neuron("test", {
895
- test1: fa.test1,
896
- test2: fa.test2
897
- }).bind(fb, {
898
- test4: (payload, axon) => {
899
- const ok = payload.test44;
900
- return axon.test1.createSignal(ok);
901
- },
902
- test5: (payload, axon) => {
903
- const ok2 = payload.test44;
904
- return axon.test2.createSignal(ok2);
905
- }
906
- });
907
906
 
908
- export { CNS, CNSCollateral, collateral, neuron, withCtx };
907
+ export { CNS, CNSCollateral, CNSStimulationContextStore, collateral, neuron, withCtx };
909
908
  //# sourceMappingURL=index.js.map
910
909
  //# sourceMappingURL=index.js.map