{"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.cjs","sourcesContent":["import { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\n\nexport class CNSStimulationContextStore implements ICNSStimulationContextStore {\n    constructor(private readonly ctx: Map<string, unknown> = new Map()) {}\n\n    get(key: string): unknown {\n        return this.ctx.get(key);\n    }\n\n    set(key: string, value: unknown): void {\n        this.ctx.set(key, value);\n    }\n\n    getAll(): Record<string, unknown> {\n        return Object.fromEntries(this.ctx);\n    }\n\n    setAll(values: Record<string, unknown>): void {\n        for (const [key, value] of Object.entries(values)) {\n            this.ctx.set(key, value);\n        }\n    }\n\n    delete(key: string): void {\n        this.ctx.delete(key);\n    }\n}\n","import { 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            // For initial stimulation: signals are outputs (to find subscribers)\n            // In onResponse, inputSignal will be undefined for initial stimulation\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        // For initial stimulation: signal is the output (to find subscribers)\n        // In onResponse, inputSignal will be undefined for initial stimulation\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"]}