@cnstra/core 1.5.2 → 1.6.0

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.
package/dist/index.js.map CHANGED
@@ -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.js","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"]}
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","error","ownerNeuron","r","collateral","axon"],"mappings":"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","file":"index.js","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 { TCNSSerializedQueueItem } from './types/TCNSSerializedSignal';\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: TCNSSerializedQueueItem<TCollateralName, TNeuronName>[] = [];\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: TCNSSerializedQueueItem<TCollateralName, TNeuronName>\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 | TCNSSerializedQueueItem<TCollateralName, TNeuronName>\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: TCNSSerializedQueueItem<TCollateralName, TNeuronName>\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 // Do not break: if concurrency allows, start additional items in this pump\n continue;\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(x: TCNSSerializedQueueItem<TCollateralName, TNeuronName>) {\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 { TCNSSerializedQueueItem } from './types/TCNSSerializedSignal';\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 private completed = new Promise<void>((resolve, reject) => {\n this.resolveCompleted = resolve;\n this.rejectCompleted = reject;\n });\n private resolveCompleted!: () => void;\n private rejectCompleted!: (e: any) => void;\n private isCompleted = false;\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 // If aborted, re-check completion condition (to allow graceful shutdown)\n if (this.options?.abortSignal) {\n this.options.abortSignal.addEventListener('abort', () => {\n this.tryResolveCompleted();\n });\n }\n }\n private tryResolveCompleted(): void {\n if (this.isCompleted) return;\n const noActive = this.queue.getActiveOperationsCount() === 0;\n const noPending = this.queue.length + this.scheduledCount === 0;\n const aborted = !!this.options?.abortSignal?.aborted;\n\n if ((noPending && noActive) || (aborted && noActive)) {\n this.isCompleted = true;\n this.resolveCompleted();\n }\n }\n\n public waitUntilComplete(): Promise<void> {\n return this.completed;\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 const serialized: TCNSSerializedQueueItem<\n TCollateralName,\n TNeuronName\n > = {\n neuronId: subscriber.neuron.name,\n dendriteCollateralName: subscriber.dendrite.collateral\n .name as TCollateralName,\n input: inputSignal\n ? {\n collateralName:\n inputSignal.collateralName as TCollateralName,\n payload: inputSignal.payload,\n }\n : undefined,\n };\n\n return serialized;\n }\n\n private processQueueItem(\n item: TCNSSerializedQueueItem<TCollateralName, TNeuronName>\n ) {\n const subscribers = this.cns.getSubscribers(\n item.dendriteCollateralName as any\n );\n const subscriber = subscribers.find(\n s => (s.neuron.name as any) === (item.neuronId as any)\n );\n if (!subscriber) return () => {};\n\n const neuron = subscriber.neuron;\n const dendrite = subscriber.dendrite as TDendrite;\n\n const inputSignal = item.input\n ? ({\n collateralName: item.input.collateralName as any,\n payload: item.input.payload,\n } as TCNSSignal<TCollateralName, any>)\n : undefined;\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 stimulationId: this.id,\n }\n );\n\n const maxDuration = (neuron as any).maxDuration as\n | number\n | undefined;\n\n const asPromise: Promise<\n | TCNSSignal<TCollateralName, any>\n | TCNSSignal<TCollateralName, any>[]\n | undefined\n > =\n response instanceof Promise\n ? response\n : Promise.resolve(response as any);\n\n const timedPromise =\n maxDuration && maxDuration > 0\n ? new Promise<\n | TCNSSignal<TCollateralName, any>\n | TCNSSignal<TCollateralName, any>[]\n | undefined\n >((resolve, reject) => {\n const t = setTimeout(() => {\n const err = new Error(\n `Neuron \"${String(\n neuron.name\n )}\" exceeded maxDuration ${maxDuration}ms`\n );\n reject(err);\n }, maxDuration);\n asPromise.then(\n v => {\n clearTimeout(t);\n resolve(v);\n },\n e => {\n clearTimeout(t);\n reject(e);\n }\n );\n })\n : asPromise;\n\n if (response instanceof Promise || maxDuration) {\n return timedPromise.then(\n signal => {\n return () => {\n // Mark neuron as inactive when async processing completes\n this.markNeuronInactive(neuron.name);\n return this.processResponseOrResponses(\n inputSignal as TCNSSignal<TCollateralName, any>,\n signal as\n | TCNSSignal<TCollateralName, any>\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.processResponseOrResponses(\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.processResponseOrResponses(\n inputSignal as TCNSSignal<TCollateralName, any>,\n response as\n | TCNSSignal<TCollateralName, any>\n | TCNSSignal<TCollateralName, any>[]\n | 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 processResponseOrResponses(\n inputSignal?: TCNSSignal<TCollateralName, TInputPayload>,\n outputSignalOrSignals?:\n | TCNSSignal<TCollateralName, TOutputPayload>\n | TCNSSignal<TCollateralName, TOutputPayload>[],\n error?: any\n ): void {\n // Handle array of signals\n if (Array.isArray(outputSignalOrSignals)) {\n // If array is empty, still call processResponse once to trigger onResponse\n if (outputSignalOrSignals.length === 0) {\n this.processResponse(inputSignal, undefined, error);\n return;\n }\n\n for (const signal of outputSignalOrSignals) {\n this.processResponse(inputSignal, signal, error);\n }\n return;\n }\n\n // Handle single signal\n this.processResponse(inputSignal, outputSignalOrSignals, error);\n }\n\n protected processResponse(\n inputSignal?: TCNSSignal<TCollateralName, TInputPayload>,\n outputSignal?: TCNSSignal<TCollateralName, TOutputPayload>,\n error?: any\n ): void {\n const collateralName = outputSignal?.collateralName as\n | TCollateralName\n | undefined;\n const ownerNeuron = collateralName\n ? this.cns.getParentNeuronByCollateralName(collateralName)\n : undefined;\n const subscribers = collateralName\n ? this.cns.getSubscribers(collateralName)\n : [];\n const subscriberQueueItems: TCNSSerializedQueueItem<\n TCollateralName,\n TNeuronName\n >[] = [];\n\n if (collateralName && !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 let maybePromise: any;\n try {\n maybePromise = 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 } catch (e) {\n this.rejectCompleted(e);\n return;\n }\n\n // If onResponse returned a promise, wait for it before enqueuing subscribers\n if (maybePromise && typeof (maybePromise as any).then === 'function') {\n (maybePromise as Promise<void>).then(\n () => {\n for (let i = 0; i < subscriberQueueItems.length; i++) {\n this.scheduledCount--;\n this.queue.enqueue(subscriberQueueItems[i]);\n }\n this.tryResolveCompleted();\n },\n error => {\n this.rejectCompleted(error);\n }\n );\n return;\n }\n\n // Sync path: enqueue subscribers immediately\n for (let i = 0; i < subscriberQueueItems.length; i++) {\n this.scheduledCount--;\n this.queue.enqueue(subscriberQueueItems[i]);\n }\n this.tryResolveCompleted();\n }\n\n public responseToSignal(\n signalOrSignals:\n | TCNSSignal<TCollateralName, TOutputPayload>\n | TCNSSignal<TCollateralName, TOutputPayload>[]\n ): void {\n // Handle array of signals\n if (Array.isArray(signalOrSignals)) {\n for (const signal of signalOrSignals) {\n const ownerNeuron = this.cns.getParentNeuronByCollateralName(\n signal.collateralName as any\n );\n if (ownerNeuron) {\n this.markNeuronActive(ownerNeuron.name);\n }\n }\n this.processResponseOrResponses(undefined, signalOrSignals);\n return;\n }\n\n // Handle single signal\n const ownerNeuron = this.cns.getParentNeuronByCollateralName(\n signalOrSignals.collateralName as any\n );\n if (ownerNeuron) {\n this.markNeuronActive(ownerNeuron.name);\n }\n\n this.processResponse(undefined, signalOrSignals);\n this.tryResolveCompleted();\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<\n (r: any) => void | Promise<void>\n > = [];\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 | Promise<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 | Promise<void>\n ): (response: T) => void | Promise<void> {\n if (this.globalResponseListeners.length === 0 && !local) {\n // No-op fast path\n return () => {};\n }\n return (r: T) => {\n let anyPromise = false;\n const promises: Promise<void>[] = [];\n\n if (local) {\n const res = local(r);\n if (res && typeof (res as any).then === 'function') {\n anyPromise = true;\n promises.push(res as Promise<void>);\n }\n }\n\n for (let i = 0; i < this.globalResponseListeners.length; i++) {\n const res = this.globalResponseListeners[i](r);\n if (res && typeof (res as any).then === 'function') {\n anyPromise = true;\n promises.push(res as Promise<void>);\n }\n }\n\n if (anyPromise) {\n return Promise.allSettled(promises).then(results => {\n const rejected = results.find(\n r => r.status === 'rejected'\n ) as PromiseRejectedResult | undefined;\n if (rejected) throw rejected.reason;\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 getCollateralByName<TName extends string = string>(\n collateralName: TName\n ) {\n return this.collateralIndex.get(\n collateralName as unknown as TCollateralName\n ) as unknown as CNSCollateral<TName, unknown> | undefined;\n }\n\n public getNeuronByName<TName extends string = string>(neuronName: TName) {\n return this.neuronIndex.get(neuronName as unknown as TNeuronName);\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 signalOrSignals:\n | TCNSSignal<TCollateralName, TInputPayload>\n | TCNSSignal<TCollateralName, TInputPayload>[],\n options?: TCNSStimulationOptions<\n TCollateralName,\n TInputPayload,\n TOutputPayload\n >\n ): Promise<void> {\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(signalOrSignals);\n return stimulation.waitUntilComplete();\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 { collateralName: this.name, 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 maxDuration?: 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 setMaxDuration: (\n ms: 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 setMaxDuration: (ms: number | undefined) => {\n api.maxDuration = ms;\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 maxDuration: 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"]}
@@ -20,10 +20,12 @@ export interface ICNS<TNeuron extends TCNSNeuron<any, any, any, any, any, any, a
20
20
  /**
21
21
  * Wrap a local onResponse with all global listeners.
22
22
  */
23
- wrapOnResponse<T>(local?: (response: T) => void): (response: T) => void;
23
+ wrapOnResponse<T>(local?: (response: T) => void | Promise<void>): (response: T) => void | Promise<void>;
24
24
  getDendrites(): TDendrite[];
25
25
  getCollaterals(): CNSCollateral<any, any>[];
26
26
  getNeurons(): TNeuron[];
27
- stimulate(signal: TCNSSignal<any, any>): void;
27
+ getCollateralByName<TName extends string = string>(collateralName: TName): CNSCollateral<TName, unknown> | undefined;
28
+ getNeuronByName<TName extends string = string>(neuronName: TName): TNeuron | undefined;
29
+ stimulate(signal: TCNSSignal<any, any>): Promise<void>;
28
30
  }
29
31
  //# sourceMappingURL=ICNS.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ICNS.d.ts","sourceRoot":"","sources":["../../src/interfaces/ICNS.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,WAAW,IAAI,CACjB,OAAO,SAAS,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC7D,SAAS,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAE5D,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,+BAA+B,CAC3B,cAAc,EAAE,MAAM,GACvB,OAAO,GAAG,SAAS,CAAC;IACvB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACnE,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAChE,cAAc,CACV,cAAc,EAAE,MAAM,GACvB,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;IACxC,yBAAyB,CACrB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,OAAO,CAAC;IACX,QAAQ,CAAC,2BAA2B,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IAEpD;;;OAGG;IACH,mBAAmB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAEnE;;OAEG;IACH,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC;IAExE,YAAY,IAAI,SAAS,EAAE,CAAC;IAC5B,cAAc,IAAI,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IAC5C,UAAU,IAAI,OAAO,EAAE,CAAC;IACxB,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;CACjD"}
1
+ {"version":3,"file":"ICNS.d.ts","sourceRoot":"","sources":["../../src/interfaces/ICNS.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,WAAW,IAAI,CACjB,OAAO,SAAS,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC7D,SAAS,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAE5D,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,+BAA+B,CAC3B,cAAc,EAAE,MAAM,GACvB,OAAO,GAAG,SAAS,CAAC;IACvB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACnE,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAChE,cAAc,CACV,cAAc,EAAE,MAAM,GACvB,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;IACxC,yBAAyB,CACrB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,OAAO,CAAC;IACX,QAAQ,CAAC,2BAA2B,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IAEpD;;;OAGG;IACH,mBAAmB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAEnE;;OAEG;IACH,cAAc,CAAC,CAAC,EACZ,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC9C,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC,YAAY,IAAI,SAAS,EAAE,CAAC;IAC5B,cAAc,IAAI,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IAC5C,UAAU,IAAI,OAAO,EAAE,CAAC;IACxB,mBAAmB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7C,cAAc,EAAE,KAAK,GACtB,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC7C,eAAe,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,EACzC,UAAU,EAAE,KAAK,GAClB,OAAO,GAAG,SAAS,CAAC;IACvB,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D"}
@@ -8,6 +8,7 @@ export type TCNSDendrite<TContextValue, TSenderCollateralName extends string, TS
8
8
  response: (payload: TSenderAxonCollateralPayload, axon: TAxonType, ctx: TCNSLocalContextValueStore<TContextValue> & {
9
9
  abortSignal?: AbortSignal;
10
10
  cns?: ICNS<any, any>;
11
+ stimulationId?: string;
11
12
  }) => TNCNeuronResponseReturn<TReceiverCollateralName, TReceiverAxonCollateralPayload>;
12
13
  };
13
14
  //# sourceMappingURL=TCNSDendrite.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TCNSDendrite.d.ts","sourceRoot":"","sources":["../../src/types/TCNSDendrite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE,MAAM,MAAM,YAAY,CACpB,aAAa,EACb,qBAAqB,SAAS,MAAM,EACpC,4BAA4B,EAC5B,uBAAuB,SAAS,MAAM,EACtC,8BAA8B,EAE9B,SAAS,SAAS,QAAQ,CACtB,uBAAuB,EACvB,8BAA8B,CACjC,IACD;IACA,UAAU,EAAE,aAAa,CACrB,qBAAqB,EACrB,4BAA4B,CAC/B,CAAC;IACF,QAAQ,EAAE,CACN,OAAO,EAAE,4BAA4B,EACrC,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,0BAA0B,CAAC,aAAa,CAAC,GAAG;QAC7C,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;KACxB,KACA,uBAAuB,CACxB,uBAAuB,EACvB,8BAA8B,CACjC,CAAC;CACL,CAAC"}
1
+ {"version":3,"file":"TCNSDendrite.d.ts","sourceRoot":"","sources":["../../src/types/TCNSDendrite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE,MAAM,MAAM,YAAY,CACpB,aAAa,EACb,qBAAqB,SAAS,MAAM,EACpC,4BAA4B,EAC5B,uBAAuB,SAAS,MAAM,EACtC,8BAA8B,EAE9B,SAAS,SAAS,QAAQ,CACtB,uBAAuB,EACvB,8BAA8B,CACjC,IACD;IACA,UAAU,EAAE,aAAa,CACrB,qBAAqB,EACrB,4BAA4B,CAC/B,CAAC;IACF,QAAQ,EAAE,CACN,OAAO,EAAE,4BAA4B,EACrC,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,0BAA0B,CAAC,aAAa,CAAC,GAAG;QAC7C,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;KAC1B,KACA,uBAAuB,CACxB,uBAAuB,EACvB,8BAA8B,CACjC,CAAC;CACL,CAAC"}
@@ -5,6 +5,8 @@ export type TCNSNeuron<TContextValue, TName extends string, TCollateralName exte
5
5
  axon: TAxonType;
6
6
  /** Optional per-neuron concurrency limit. If undefined or <= 0, no limit is applied. */
7
7
  concurrency?: number;
8
+ /** Optional per-neuron max processing duration in milliseconds. */
9
+ maxDuration?: number;
8
10
  dendrites: TCNSDendrite<TContextValue, TSenderCollateralName, TSenderCollateralPayload, TCollateralName, TCollateralPayload, TAxonType>[];
9
11
  };
10
12
  //# sourceMappingURL=TCNSNeuron.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TCNSNeuron.d.ts","sourceRoot":"","sources":["../../src/types/TCNSNeuron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,MAAM,UAAU,CAClB,aAAa,EACb,KAAK,SAAS,MAAM,EACpB,eAAe,SAAS,MAAM,EAC9B,kBAAkB,EAClB,qBAAqB,SAAS,MAAM,EACpC,wBAAwB,EACxB,SAAS,SAAS,QAAQ,CAAC,eAAe,EAAE,kBAAkB,CAAC,IAC/D;IACA,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,SAAS,CAAC;IAChB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,YAAY,CACnB,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,SAAS,CACZ,EAAE,CAAC;CACP,CAAC"}
1
+ {"version":3,"file":"TCNSNeuron.d.ts","sourceRoot":"","sources":["../../src/types/TCNSNeuron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,MAAM,UAAU,CAClB,aAAa,EACb,KAAK,SAAS,MAAM,EACpB,eAAe,SAAS,MAAM,EAC9B,kBAAkB,EAClB,qBAAqB,SAAS,MAAM,EACpC,wBAAwB,EACxB,SAAS,SAAS,QAAQ,CAAC,eAAe,EAAE,kBAAkB,CAAC,IAC/D;IACA,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,SAAS,CAAC;IAChB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,YAAY,CACnB,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,SAAS,CACZ,EAAE,CAAC;CACP,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import { CNSCollateral } from '../CNSCollateral';
2
- export type TNCNeuronResponseReturn<TCollateralName extends string, TPayload> = Promise<ReturnType<CNSCollateral<TCollateralName, TPayload>['createSignal']>> | ReturnType<CNSCollateral<TCollateralName, TPayload>['createSignal']> | Promise<void> | void;
2
+ export type TNCNeuronResponseReturn<TCollateralName extends string, TPayload> = Promise<ReturnType<CNSCollateral<TCollateralName, TPayload>['createSignal']>> | ReturnType<CNSCollateral<TCollateralName, TPayload>['createSignal']> | Promise<ReturnType<CNSCollateral<TCollateralName, TPayload>['createSignal']>[]> | ReturnType<CNSCollateral<TCollateralName, TPayload>['createSignal']>[] | Promise<void> | void;
3
3
  //# sourceMappingURL=TCNSNeuronResponseReturn.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TCNSNeuronResponseReturn.d.ts","sourceRoot":"","sources":["../../src/types/TCNSNeuronResponseReturn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,MAAM,uBAAuB,CAAC,eAAe,SAAS,MAAM,EAAE,QAAQ,IACtE,OAAO,CACH,UAAU,CAAC,aAAa,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC,CACvE,GACD,UAAU,CAAC,aAAa,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC,GACpE,OAAO,CAAC,IAAI,CAAC,GACb,IAAI,CAAC"}
1
+ {"version":3,"file":"TCNSNeuronResponseReturn.d.ts","sourceRoot":"","sources":["../../src/types/TCNSNeuronResponseReturn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,MAAM,uBAAuB,CAAC,eAAe,SAAS,MAAM,EAAE,QAAQ,IACtE,OAAO,CACH,UAAU,CAAC,aAAa,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC,CACvE,GACD,UAAU,CAAC,aAAa,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC,GACpE,OAAO,CACH,UAAU,CAAC,aAAa,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,CACzE,GACD,UAAU,CAAC,aAAa,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,GACtE,OAAO,CAAC,IAAI,CAAC,GACb,IAAI,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type TCNSSerializedSignal<TCollateralName extends string = string, TPayload = any> = {
2
+ collateralName: TCollateralName;
3
+ payload: TPayload | undefined;
4
+ };
5
+ export type TCNSSerializedQueueItem<TCollateralName extends string = string, TNeuronName extends string = string> = {
6
+ neuronId: TNeuronName;
7
+ dendriteCollateralName: TCollateralName;
8
+ input?: TCNSSerializedSignal<TCollateralName, any>;
9
+ };
10
+ //# sourceMappingURL=TCNSSerializedSignal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TCNSSerializedSignal.d.ts","sourceRoot":"","sources":["../../src/types/TCNSSerializedSignal.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,CAC5B,eAAe,SAAS,MAAM,GAAG,MAAM,EACvC,QAAQ,GAAG,GAAG,IACd;IACA,cAAc,EAAE,eAAe,CAAC;IAChC,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,uBAAuB,CAC/B,eAAe,SAAS,MAAM,GAAG,MAAM,EACvC,WAAW,SAAS,MAAM,GAAG,MAAM,IACnC;IACA,QAAQ,EAAE,WAAW,CAAC;IACtB,sBAAsB,EAAE,eAAe,CAAC;IACxC,KAAK,CAAC,EAAE,oBAAoB,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;CACtD,CAAC"}
@@ -1,6 +1,5 @@
1
- import { ICNSCollateral } from '../interfaces/ICNSCollateral';
2
1
  export type TCNSSignal<TCollateralName extends string, TPayload> = {
3
- collateral: ICNSCollateral<TCollateralName, TPayload>;
2
+ collateralName: TCollateralName;
4
3
  payload?: TPayload;
5
4
  };
6
5
  //# sourceMappingURL=TCNSSignal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TCNSSignal.d.ts","sourceRoot":"","sources":["../../src/types/TCNSSignal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,MAAM,UAAU,CAAC,eAAe,SAAS,MAAM,EAAE,QAAQ,IAAI;IAC/D,UAAU,EAAE,cAAc,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IACtD,OAAO,CAAC,EAAE,QAAQ,CAAC;CACtB,CAAC"}
1
+ {"version":3,"file":"TCNSSignal.d.ts","sourceRoot":"","sources":["../../src/types/TCNSSignal.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,CAAC,eAAe,SAAS,MAAM,EAAE,QAAQ,IAAI;IAC/D,cAAc,EAAE,eAAe,CAAC;IAChC,OAAO,CAAC,EAAE,QAAQ,CAAC;CACtB,CAAC"}
@@ -3,7 +3,7 @@ import { TCNSStimulationResponse } from './TCNSStimulationResponse';
3
3
  export type TCNSStimulationOptions<TCollateralName extends string, TInputPayload, TOutputPayload> = {
4
4
  maxNeuronHops?: number;
5
5
  allowName?: (t: string) => boolean;
6
- onResponse?: (response: TCNSStimulationResponse<TCollateralName, TInputPayload, TOutputPayload>) => void;
6
+ onResponse?: (response: TCNSStimulationResponse<TCollateralName, TInputPayload, TOutputPayload>) => void | Promise<void>;
7
7
  abortSignal?: AbortSignal;
8
8
  stimulationId?: string;
9
9
  ctx?: ICNSStimulationContextStore;
@@ -1 +1 @@
1
- {"version":3,"file":"TCNSStimulationOptions.d.ts","sourceRoot":"","sources":["../../src/types/TCNSStimulationOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,MAAM,sBAAsB,CAC9B,eAAe,SAAS,MAAM,EAC9B,aAAa,EACb,cAAc,IACd;IACA,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,UAAU,CAAC,EAAE,CACT,QAAQ,EAAE,uBAAuB,CAC7B,eAAe,EACf,aAAa,EACb,cAAc,CACjB,KACA,IAAI,CAAC;IACV,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,2BAA2B,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,2BAA2B,CAAC;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC"}
1
+ {"version":3,"file":"TCNSStimulationOptions.d.ts","sourceRoot":"","sources":["../../src/types/TCNSStimulationOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,MAAM,sBAAsB,CAC9B,eAAe,SAAS,MAAM,EAC9B,aAAa,EACb,cAAc,IACd;IACA,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,UAAU,CAAC,EAAE,CACT,QAAQ,EAAE,uBAAuB,CAC7B,eAAe,EACf,aAAa,EACb,cAAc,CACjB,KACA,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,2BAA2B,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,2BAA2B,CAAC;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cnstra/core",
3
- "version": "1.5.2",
3
+ "version": "1.6.0",
4
4
  "description": "Neural network-inspired event flow system for building reactive applications with dependency-injected neurons and synapses",
5
5
  "keywords": [
6
6
  "neural-network",