@cnstra/core 3.0.0 → 3.2.1
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/README.md +51 -34
- package/dist/CNS.d.ts +5 -2
- package/dist/CNS.d.ts.map +1 -1
- package/dist/CNSCollateral.d.ts +1 -0
- package/dist/CNSCollateral.d.ts.map +1 -1
- package/dist/CNSInstanceNeuronQueue.d.ts +2 -1
- package/dist/CNSInstanceNeuronQueue.d.ts.map +1 -1
- package/dist/CNSNetwork.d.ts +10 -3
- package/dist/CNSNetwork.d.ts.map +1 -1
- package/dist/CNSStimulation.d.ts +40 -5
- package/dist/CNSStimulation.d.ts.map +1 -1
- package/dist/createCNS.d.ts +4 -0
- package/dist/createCNS.d.ts.map +1 -0
- package/dist/factory/index.d.ts +13 -12
- package/dist/factory/index.d.ts.map +1 -1
- package/dist/index.cjs +512 -254
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +506 -249
- package/dist/index.js.map +1 -1
- package/dist/types/TCNSModalitySelection.d.ts +13 -0
- package/dist/types/TCNSModalitySelection.d.ts.map +1 -0
- package/dist/utils/cnsComposeModalityResponse.d.ts +2 -0
- package/dist/utils/cnsComposeModalityResponse.d.ts.map +1 -0
- package/dist/utils/cnsResolveModalityHandler.d.ts +4 -0
- package/dist/utils/cnsResolveModalityHandler.d.ts.map +1 -0
- package/package.json +3 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/CNSStimulation.ts","../src/CNSInstanceNeuronQueue.ts","../src/CNSNetwork.ts","../src/CNS.ts","../src/CNSCollateral.ts","../src/utils/CNSStimulationGate.ts","../src/factory/index.ts"],"names":["neuron","collateral","error","r","axon"],"mappings":"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","file":"index.js","sourcesContent":["import type { ICNSCollateral } from '@cnstra/types';\nimport { TCNSStimulationOptions } from '@cnstra/types';\nimport { TCNSNeuron } from '@cnstra/types';\nimport { TCNSDendrite } from '@cnstra/types';\nimport { TCNSSubscriber } from '@cnstra/types';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSSignal } from '@cnstra/types';\nimport { TCNSNeuronActivationTask } from '@cnstra/types';\nimport { CNS } from './CNS';\nimport { ICNS } from '@cnstra/types';\nimport { TCNSNeuronActivationTaskFailure } from '@cnstra/types';\nimport { TCNSStimulationResponse } from '@cnstra/types';\nimport { TCNSStimulationDrain } from '@cnstra/types';\n\nimport { TCNSNeuronResponseReturn } from '@cnstra/types';\nimport { TCNSAxon } from '@cnstra/types';\n\n/**\n * Internal, non-enumerable cache of the resolved dendrite on activation tasks we\n * create ourselves. Lets executeActivationTask skip the subscriber lookup on the\n * hot path. Tasks supplied externally via activate() simply lack it and fall\n * back to the lookup. Symbol-keyed so it never shows up in JSON/spread/keys.\n */\nconst TASK_DENDRITE = Symbol('cnstra.taskDendrite');\n\n/**\n * Per-activation context handed to a dendrite's `response`. Implemented as a\n * class so the accessors live once on the prototype and each activation\n * allocates a single object.\n */\nclass CNSDendriteContext {\n constructor(\n public readonly stimulation: any,\n public readonly abortSignal: AbortSignal | undefined,\n public readonly cns: any\n ) {}\n // Prototype getter, not a constructor field: you only pay a single `cns.global`\n // read on the dendrites that actually reach for it. Value getter, so\n // `{ global }` destructuring is safe.\n get global(): unknown {\n return this.cns.global;\n }\n // The caller-supplied per-stimulation context (`stimulate(sig, {stimulationContext})`),\n // the same value on every hop — the environment-agnostic way to correlate logs to a\n // run (pass `{ stimulationId, attemptNumber }`). Prototype getter like `global`:\n // zero extra allocation, read only where a handler reaches for it.\n get stimulationContext(): unknown {\n return this.stimulation.options?.stimulationContext;\n }\n}\n\n/**\n * Response object handed to onResponse listeners. Implemented as a class so\n * instances share a single monomorphic hidden class.\n */\nclass CNSStimulationResponseImpl {\n constructor(\n public readonly stimulation: CNSStimulation<any, any>,\n public readonly inputSignal: TCNSSignal<ICNSCollateral<unknown>> | undefined,\n public readonly outputSignal:\n | TCNSSignal<ICNSCollateral<unknown>>\n | undefined,\n public readonly queueLength: number,\n public readonly pendingActivations: number,\n public readonly activeActivations: number,\n public readonly hops: number | undefined,\n public readonly error: any,\n // The neuron that produced this response (present on both success and\n // throw paths). Lets name-based consumers resolve the task's neuron\n // reliably instead of guessing via the output collateral's owner.\n public readonly neuron: TCNSNeuron<any> | undefined\n ) {}\n}\n\nexport class CNSStimulation<\n TNeuron extends TCNSNeuron<any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> {\n\n // --- Inlined activation queue (formerly CNSNeuronActivationPump) ---\n // Folded into the stimulation so a single run allocates one object instead\n // of also spinning up a separate pump object + its backing array.\n // Ring buffer; the backing array is allocated lazily on first enqueue.\n private qItems?: Array<TCNSNeuronActivationTask<TNeuron> | undefined>;\n private qHead = 0;\n private qTail = 0;\n private qSize = 0;\n private qCapacity = 4;\n private activeOperations = 0;\n // Lazily allocated: only populated while an async task is in flight; purely\n // synchronous stimulations never need it.\n private activeTasks?: Set<TCNSNeuronActivationTask<TNeuron>>;\n // Re-entrancy guard for the pump loop.\n private pumping = false;\n private needsPump = false;\n // Nesting depth of the current synchronous turn. Only the outermost close\n // announces a drain - see beginTurn/endTurn.\n private turnDepth = 0;\n\n private readonly neuronVisitMap?: Map<TNeuron, number>;\n private readonly instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>;\n private scheduledCount = 0;\n // Activations belonging to signals of an in-progress array fan-out that have\n // not been handed to processResponse yet, so the task objects do not exist.\n // processResponse enqueues synchronously, so the first signal's whole subtree\n // drains before the second signal is even looked at; without this counter\n // that subtree's leaf sees an empty queue and reads as \"all work done\".\n // Counted in activations, not signals, so every public counter shares a unit.\n private reservedActivations = 0;\n // Lazily allocated: only needed while subscriber tasks wait for an async\n // onResponse to resolve before being enqueued.\n private pendingTasks?: Set<TCNSNeuronActivationTask<TNeuron>>;\n // Lazily allocated: only allocated when a task actually fails.\n private failedTasks?: Array<TCNSNeuronActivationTaskFailure<TNeuron>>;\n // Completion is tracked eagerly via flags; the Promise is only materialized\n // if someone actually calls waitUntilComplete(). This avoids allocating a\n // Promise (the single most expensive setup cost) on every stimulate().\n private completed?: Promise<void>;\n private resolveCompleted?: () => void;\n private rejectCompleted?: (e: any) => void;\n private isCompleted = false;\n private completionError: any;\n private completionRejected = false;\n private onResponseError: Error | undefined;\n\n /**\n * The (already wrapped) response listener for this stimulation, or\n * undefined when there is neither a local nor any global listener.\n */\n private readonly onResponse?: (\n response: TCNSStimulationResponse\n ) => void | Promise<void>;\n\n /**\n * The (already wrapped) drain listener, or undefined when there is neither a\n * local nor any global one. When undefined, endTurn() bails immediately, so a\n * stimulation with no drain listener pays only the turn depth counter.\n */\n private readonly onDrain?: (drain: TCNSStimulationDrain) => void;\n\n constructor(\n public readonly cns: CNS<TNeuron, TDendrite>,\n instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>,\n public readonly options?: TCNSStimulationOptions<TCNSStimulationResponse>,\n onResponse?: (\n response: TCNSStimulationResponse\n ) => void | Promise<void>,\n onDrain?: (drain: TCNSStimulationDrain) => void\n ) {\n this.onDrain = onDrain;\n this.instanceNeuronQueue = instanceNeuronQueue;\n this.onResponse = onResponse;\n\n if (this.options?.maxNeuronHops) {\n this.neuronVisitMap = new Map();\n }\n }\n\n private pushFailedTask(\n failure: TCNSNeuronActivationTaskFailure<TNeuron>\n ): void {\n (this.failedTasks ??= []).push(failure);\n }\n\n private finalizeResolve(): void {\n this.completionRejected = false;\n this.resolveCompleted?.();\n }\n\n private finalizeReject(error: any): void {\n this.completionRejected = true;\n this.completionError = error;\n this.rejectCompleted?.(error);\n }\n\n // ----- Inlined activation queue / pump -----\n\n private get canStartOperation(): boolean {\n const limit = this.options?.concurrency ?? Infinity;\n return (\n this.activeOperations < limit &&\n !this.options?.abortSignal?.aborted\n );\n }\n\n private qResize(): void {\n const oldCapacity = this.qCapacity;\n const oldItems = this.qItems!;\n this.qCapacity = oldCapacity * 2;\n const newItems = new Array(this.qCapacity);\n\n let oldIndex = this.qHead;\n for (let i = 0; i < this.qSize; i++) {\n newItems[i] = oldItems[oldIndex];\n oldIndex = (oldIndex + 1) % oldCapacity;\n }\n\n this.qItems = newItems;\n this.qHead = 0;\n this.qTail = this.qSize;\n }\n\n private qDequeue(): TCNSNeuronActivationTask<TNeuron> | undefined {\n if (this.qSize === 0) return undefined;\n const items = this.qItems!;\n const task = items[this.qHead];\n items[this.qHead] = undefined; // Clear reference\n this.qHead = (this.qHead + 1) % this.qCapacity;\n this.qSize--;\n return task;\n }\n\n private qEnqueueItem(task: TCNSNeuronActivationTask<TNeuron>): void {\n if (!this.qItems) {\n this.qItems = new Array(this.qCapacity);\n } else if (this.qSize === this.qCapacity) {\n this.qResize();\n }\n this.qItems[this.qTail] = task;\n this.qTail = (this.qTail + 1) % this.qCapacity;\n this.qSize++;\n }\n\n /** Enqueue a task and drive the pump unless one is already running. */\n private qEnqueue(task: TCNSNeuronActivationTask<TNeuron>): void {\n this.qEnqueueItem(task);\n if (!this.pumping) this.pump();\n else this.needsPump = true;\n }\n\n private qGetQueuedTasks(): TCNSNeuronActivationTask<TNeuron>[] {\n const result: TCNSNeuronActivationTask<TNeuron>[] = [];\n if (!this.qItems) return result;\n let index = this.qHead;\n for (let i = 0; i < this.qSize; i++) {\n result.push(this.qItems[index]!);\n index = (index + 1) % this.qCapacity;\n }\n return result;\n }\n\n private pump(): void {\n if (this.pumping) {\n this.needsPump = true;\n return;\n }\n this.pumping = true;\n\n while (this.canStartOperation && this.qSize > 0) {\n const task = this.qDequeue()!;\n this.activeOperations++;\n\n const ret = this.executeActivationTask(task);\n\n // Async branch\n if (ret && typeof (ret as any).then === 'function') {\n // Only track tasks that are actually in flight across a tick;\n // synchronous tasks complete before anyone can observe them.\n (this.activeTasks ??= new Set()).add(task);\n (ret as Promise<void | (() => void)>).then(\n cb => {\n this.activeOperations--;\n this.activeTasks!.delete(task);\n // One turn spans the callback and the follow-up pump:\n // cb() itself enqueues and pumps, so without this the\n // drain would be announced twice for one batch.\n this.beginTurn();\n try {\n if (typeof cb === 'function') cb();\n\n if (this.qSize > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n } finally {\n this.endTurn();\n }\n },\n err => {\n this.activeOperations--;\n this.activeTasks!.delete(task);\n this.beginTurn();\n try {\n if (this.qSize > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n } finally {\n this.endTurn();\n }\n throw err; // let it crash \"honestly\"\n }\n );\n // Do not break: if concurrency allows, start additional items\n continue;\n }\n\n // Sync branch (task was never added to activeTasks)\n this.activeOperations--;\n if (typeof ret === 'function') (ret as () => void)();\n }\n\n this.pumping = false;\n\n // If async completions or enqueues requested another pass, do exactly\n // one more, non-recursively.\n if (this.needsPump) {\n this.needsPump = false;\n this.pump();\n }\n }\n\n /**\n * Open a synchronous turn. Turns nest: a drain is announced only when the\n * outermost one closes, so an enqueue that happens while the pump is already\n * running does not produce its own boundary.\n */\n private beginTurn(): void {\n this.turnDepth++;\n }\n\n /**\n * Close a synchronous turn and, if it was the outermost and nothing more can\n * run without yielding to the event loop, announce the drain.\n *\n * This is the only place the synchronous frontier is observable. A response\n * cannot serve the purpose: responses are emitted when an activation\n * *finishes*, but a turn just as often ends when one *starts* and returns a\n * promise - at which point there is nothing left to emit a response from.\n */\n private endTurn(): void {\n if (--this.turnDepth > 0) return;\n const onDrain = this.onDrain;\n if (!onDrain) return;\n // Still mid-pump, or work is runnable right now: not a boundary.\n if (this.pumping) return;\n if (this.qSize > 0 && this.canStartOperation) return;\n // Hold the turn open across the callback so that a stimulate()/\n // enqueueTasks() call from inside it cannot recurse into another drain.\n this.turnDepth++;\n try {\n onDrain({\n stimulation: this,\n queueLength: this.pendingActivations + this.activeOperations,\n pendingActivations: this.pendingActivations,\n activeActivations: this.activeOperations,\n } as TCNSStimulationDrain);\n } finally {\n this.turnDepth--;\n }\n }\n\n /**\n * Activations that exist (or are reserved) but whose dendrite body has not\n * been invoked yet: sitting in the ring buffer, created and held in\n * pendingTasks, or reserved by an array fan-out mid-dispatch. Subscribers\n * parked behind an async onResponse land here too - their body has not run.\n */\n private get pendingActivations(): number {\n return this.qSize + this.scheduledCount + this.reservedActivations;\n }\n\n private tryResolveCompleted(): void {\n if (this.isCompleted) return;\n const noActive = this.activeOperations === 0;\n const noPending = this.pendingActivations === 0;\n const aborted = !!this.options?.abortSignal?.aborted;\n\n if ((noPending && noActive) || (aborted && noActive && !noPending)) {\n // When completing due to abort, mark all remaining queued tasks as aborted\n if (aborted) {\n const queuedTasks = this.qGetQueuedTasks();\n\n for (const task of [...queuedTasks]) {\n const alreadyTracked = this.failedTasks?.some(\n ft => ft.task === task\n );\n if (!alreadyTracked) {\n this.pushFailedTask({\n task,\n error: new Error(\n 'Task aborted - not started due to abort signal'\n ),\n aborted: true,\n });\n }\n }\n\n this.isCompleted = true;\n this.finalizeReject(new Error('Stimulation aborted'));\n return;\n }\n\n this.isCompleted = true;\n // If there are failed tasks or onResponse error, reject the promise\n // Otherwise resolve it\n const failedCount = this.failedTasks?.length ?? 0;\n if (failedCount > 0 || this.onResponseError) {\n const error =\n this.onResponseError ||\n new Error(\n `Stimulation completed with ${failedCount} failed task(s)`\n );\n this.finalizeReject(error);\n } else {\n this.finalizeResolve();\n }\n }\n }\n\n public waitUntilComplete(): Promise<void> {\n if (this.completed) return this.completed;\n // Already completed before anyone awaited: hand back a settled promise.\n if (this.isCompleted) {\n this.completed = this.completionRejected\n ? Promise.reject(this.completionError)\n : Promise.resolve();\n return this.completed;\n }\n // Materialize the promise now and capture its resolvers for later.\n this.completed = new Promise<void>((resolve, reject) => {\n this.resolveCompleted = resolve;\n this.rejectCompleted = reject;\n });\n return this.completed;\n }\n\n /**\n * Returns all current activation tasks: queued, active, and pending (scheduled but not yet enqueued)\n */\n public getAllActivationTasks(): TCNSNeuronActivationTask<TNeuron>[] {\n const queuedTasks = this.qGetQueuedTasks();\n const activeTasks = (this.activeTasks ? Array.from(this.activeTasks) : []);\n const pendingTasks = this.pendingTasks\n ? Array.from(this.pendingTasks)\n : [];\n return [...queuedTasks, ...activeTasks, ...pendingTasks];\n }\n\n /**\n * Returns all tasks that failed or were aborted\n */\n public getFailedTasks(): Array<TCNSNeuronActivationTaskFailure<TNeuron>> {\n return this.failedTasks ? [...this.failedTasks] : [];\n }\n\n /**\n * The current outstanding frontier — every task that has not completed:\n * queued, active, and pending (awaiting an async onResponse), plus any\n * failed/aborted tasks. This is the set to persist for resume: re-activating\n * it re-runs exactly the not-yet-done work. Safe to call at any point during\n * a run (for progress) or after it fails.\n */\n public getOutstandingTasks(): TCNSNeuronActivationTask<TNeuron>[] {\n return [\n ...this.getAllActivationTasks(),\n ...this.getFailedTasks().map(f => f.task),\n ];\n }\n\n /**\n * Enqueue activation tasks directly into the stimulation queue\n */\n public enqueueTasks(\n tasks: TCNSNeuronActivationTask<TNeuron>[]\n ): void {\n this.beginTurn();\n try {\n for (const task of tasks) {\n this.qEnqueue(task);\n }\n this.tryResolveCompleted();\n } finally {\n this.endTurn();\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 createSubscriberQueueItem(\n subscriber: TCNSSubscriber<TNeuron, TDendrite>,\n inputSignal?: TCNSSignal<ICNSCollateral<unknown>>\n ) {\n if (this.options?.maxNeuronHops) {\n if (\n (this.neuronVisitMap?.get(subscriber.neuron) ?? 0) >=\n this.options?.maxNeuronHops\n ) {\n throw new Error(\n `Max neuron hops reached when trying to enqueue subscriber`\n );\n } else {\n this.neuronVisitMap?.set(\n subscriber.neuron,\n (this.neuronVisitMap?.get(subscriber.neuron) ?? 0) + 1\n );\n }\n }\n\n const neuronActivationTask: TCNSNeuronActivationTask<TNeuron> = {\n neuron: subscriber.neuron,\n dendriteCollateral: subscriber.dendrite.collateral as ICNSCollateral<unknown>,\n input: inputSignal,\n };\n // Cache the resolved subscriber so executeActivationTask can skip the\n // lookup (invisible to JSON/spread thanks to the Symbol key).\n (neuronActivationTask as any)[TASK_DENDRITE] = subscriber;\n return neuronActivationTask;\n }\n\n private executeActivationTask(\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ) {\n // Fast path: tasks we created carry their resolved subscriber. Tasks\n // supplied externally via activate() don't, so fall back to a lookup.\n let subscriber = (neuronActivationTask as any)[TASK_DENDRITE] as\n | TCNSSubscriber<TNeuron, TDendrite>\n | undefined;\n if (!subscriber) {\n const subscribers = this.cns.network.getSubscribers(\n neuronActivationTask.dendriteCollateral\n );\n for (let i = 0; i < subscribers.length; i++) {\n if (subscribers[i].neuron === neuronActivationTask.neuron) {\n subscriber = subscribers[i];\n break;\n }\n }\n }\n if (!subscriber) {\n // Task failed: subscriber not found\n const error = new Error(`Subscriber not found for activation task`);\n this.pushFailedTask({\n task: neuronActivationTask,\n error,\n aborted: false,\n });\n // Report it like every other failure. Skipping this left a lookup\n // failure invisible to listeners, so one in the tail ended the\n // stimulation without a final response and queueLength never hit 0.\n // Reported from the thunk, not inline: pump only decrements\n // activeOperations before invoking what we return.\n return () => {\n this.processResponseOrResponses(\n undefined,\n neuronActivationTask.input,\n undefined,\n error\n );\n };\n }\n\n const neuron = subscriber.neuron;\n const dendrite = subscriber.dendrite as TDendrite;\n\n const inputSignal = neuronActivationTask.input;\n\n // Fast path: with no per-neuron concurrency limit there is nothing to\n // gate, so run inline instead of allocating a starter thunk and going\n // through the queue.\n const concurrency = (neuron as { concurrency?: number }).concurrency;\n if (concurrency === undefined || concurrency <= 0) {\n return this.runStarter(\n neuron,\n dendrite,\n inputSignal,\n neuronActivationTask\n );\n }\n return this.instanceNeuronQueue.run(neuron, () =>\n this.runStarter(\n neuron,\n dendrite,\n inputSignal,\n neuronActivationTask\n )\n );\n }\n\n private runStarter(\n neuron: TNeuron,\n dendrite: TDendrite,\n inputSignal: TCNSSignal<ICNSCollateral<unknown>> | undefined,\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ): (() => void) | Promise<() => void> {\n let response: TCNSNeuronResponseReturn<TCNSAxon>;\n try {\n response = dendrite.response(\n inputSignal?.payload,\n neuron.axon,\n new CNSDendriteContext(\n this,\n this.options?.abortSignal,\n this.cns\n ) as any\n );\n } catch (error) {\n // Sync error occurred\n const isAborted = this.options?.abortSignal?.aborted ?? false;\n this.pushFailedTask({\n task: neuronActivationTask,\n error:\n error instanceof Error\n ? error\n : new Error(String(error)),\n aborted: isAborted,\n });\n // Deferred to the thunk so the response is built after pump has\n // decremented activeOperations for this task - otherwise the error\n // response reports one in-flight operation too many.\n return () => {\n this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n undefined,\n error\n );\n };\n }\n\n const maxDuration = (neuron as any).maxDuration as\n | number\n | undefined;\n\n if (response instanceof Promise || maxDuration) {\n // Only materialize a Promise on the genuinely async path. The\n // sync path below never touches these, so building them here\n // would allocate a throwaway Promise on every activation.\n const asPromise: Promise<\n | TCNSSignal<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[]\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<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[]\n | undefined\n >((resolve, reject) => {\n const t = setTimeout(() => {\n const err = new Error(\n `Neuron 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 return timedPromise.then(\n signal => {\n return () => {\n return this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n signal as\n | TCNSSignal<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[]\n | undefined\n );\n };\n },\n error => {\n return () => {\n // Track failed task\n const isAborted =\n this.options?.abortSignal?.aborted ?? false;\n this.pushFailedTask({\n task: neuronActivationTask,\n error:\n error instanceof Error\n ? error\n : new Error(String(error)),\n aborted: isAborted,\n });\n return this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n undefined,\n error\n );\n };\n }\n );\n } else {\n return () => {\n return this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n response as\n | TCNSSignal<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[]\n | undefined\n );\n };\n }\n }\n\n protected processResponseOrResponses(\n emitter: TNeuron | undefined,\n inputSignal?: TCNSSignal<ICNSCollateral<unknown>>,\n outputSignalOrSignals?:\n | TCNSSignal<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[],\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(emitter, inputSignal, undefined, error);\n return;\n }\n\n // Reserve the whole fan-out before dispatching any of it. Counted in\n // activations rather than signals, so pre-resolve each signal's\n // subscriber count - getSubscribers is a single map lookup. On the\n // error path processResponse schedules nothing, so nothing is reserved.\n let perSignal: number[] | undefined;\n if (!error) {\n perSignal = new Array<number>(outputSignalOrSignals.length);\n let reserved = 0;\n for (let i = 0; i < outputSignalOrSignals.length; i++) {\n const c = outputSignalOrSignals[i]?.collateral;\n const n = c\n ? this.cns.network.getSubscribers(c).length\n : 0;\n perSignal[i] = n;\n reserved += n;\n }\n this.reservedActivations += reserved;\n }\n // The increment/decrement pair is balanced per level, so a nested\n // fan-out inside signal[0]'s subtree composes correctly.\n for (let i = 0; i < outputSignalOrSignals.length; i++) {\n if (perSignal) this.reservedActivations -= perSignal[i];\n this.processResponse(\n emitter,\n inputSignal,\n outputSignalOrSignals[i],\n error\n );\n }\n return;\n }\n\n // Handle single signal\n this.processResponse(emitter, inputSignal, outputSignalOrSignals, error);\n }\n\n protected processResponse(\n emitter: TNeuron | undefined,\n inputSignal?: TCNSSignal<ICNSCollateral<unknown>>,\n outputSignal?: TCNSSignal<ICNSCollateral<unknown>>,\n error?: any\n ): void {\n const collateral = outputSignal?.collateral;\n const subscribers = collateral\n ? this.cns.network.getSubscribers(collateral)\n : [];\n const onResponse = this.onResponse;\n\n // Fast path: with no response listener there is nothing to observe the\n // intermediate state, so we skip building the response object and\n // tracking pending tasks.\n if (!onResponse) {\n if (collateral && !error) {\n const n = subscribers.length;\n if (n > 0) {\n const tasks: TCNSNeuronActivationTask<TNeuron>[] =\n new Array(n);\n for (let i = 0; i < n; i++) {\n tasks[i] = this.createSubscriberQueueItem(\n subscribers[i],\n outputSignal\n );\n }\n this.scheduledCount += n;\n for (let i = 0; i < n; i++) {\n this.scheduledCount--;\n this.qEnqueue(tasks[i]);\n }\n }\n }\n this.tryResolveCompleted();\n return;\n }\n\n const subscriberActivationTasks: TCNSNeuronActivationTask<TNeuron>[] =\n [];\n\n if (collateral && !error) {\n const pending = (this.pendingTasks ??= new Set());\n for (let i = 0; i < subscribers.length; i++) {\n const task = this.createSubscriberQueueItem(\n subscribers[i],\n outputSignal\n );\n subscriberActivationTasks.push(task);\n pending.add(task);\n }\n }\n this.scheduledCount += subscriberActivationTasks.length;\n\n // After we pre-enqueued all subscribers, we can trace the response\n let maybePromise: void | Promise<void>;\n try {\n maybePromise = onResponse(\n new CNSStimulationResponseImpl(\n this,\n inputSignal,\n outputSignal,\n this.pendingActivations + this.activeOperations,\n this.pendingActivations,\n this.activeOperations,\n this.options?.maxNeuronHops && emitter\n ? this.neuronVisitMap?.get(emitter) ?? 0\n : undefined,\n error,\n emitter\n ) as TCNSStimulationResponse\n );\n } catch (e) {\n // Remember the error but don't reject immediately - wait for all tasks to complete\n this.onResponseError =\n e instanceof Error ? e : new Error(String(e));\n // Still enqueue subscribers and continue processing\n for (let i = 0; i < subscriberActivationTasks.length; i++) {\n this.scheduledCount--;\n this.pendingTasks?.delete(subscriberActivationTasks[i]);\n this.qEnqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n return;\n }\n\n // If onResponse returned a promise, wait for it before enqueuing subscribers\n if (maybePromise && typeof maybePromise.then === 'function') {\n // These tasks stay in scheduledCount until the listener settles, so\n // they keep reading as pending activations - correctly: they exist,\n // and their dendrite body has not been invoked.\n (maybePromise as Promise<void>).then(\n () => {\n // Resuming from a settled listener starts a fresh turn, the\n // same as resuming from a settled neuron body.\n this.beginTurn();\n try {\n for (\n let i = 0;\n i < subscriberActivationTasks.length;\n i++\n ) {\n this.scheduledCount--;\n this.pendingTasks?.delete(\n subscriberActivationTasks[i]\n );\n this.qEnqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n } finally {\n this.endTurn();\n }\n },\n error => {\n // Remember the error but don't reject immediately - wait for all tasks to complete\n this.onResponseError =\n error instanceof Error\n ? error\n : new Error(String(error));\n this.beginTurn();\n try {\n // Still enqueue subscribers and continue processing\n for (\n let i = 0;\n i < subscriberActivationTasks.length;\n i++\n ) {\n this.scheduledCount--;\n this.pendingTasks?.delete(\n subscriberActivationTasks[i]\n );\n this.qEnqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n } finally {\n this.endTurn();\n }\n }\n );\n return;\n }\n\n // Sync path: enqueue subscribers immediately\n for (let i = 0; i < subscriberActivationTasks.length; i++) {\n this.scheduledCount--;\n this.pendingTasks?.delete(subscriberActivationTasks[i]);\n this.qEnqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n }\n\n public responseToSignal(\n signalOrSignals:\n | TCNSSignal<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[]\n ): void {\n // The initial dispatch is a turn: everything reachable synchronously from\n // this signal runs before stimulate() returns, and the drain that follows\n // is the first batch boundary.\n this.beginTurn();\n try {\n // Handle array of signals\n if (Array.isArray(signalOrSignals)) {\n // For initial stimulation: signals are outputs (to find subscribers)\n // In onResponse, inputSignal will be undefined for initial stimulation\n this.processResponseOrResponses(\n undefined,\n undefined,\n signalOrSignals\n );\n return;\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, undefined, signalOrSignals);\n this.tryResolveCompleted();\n } finally {\n this.endTurn();\n }\n }\n}\n","export class CNSInstanceNeuronQueue<\n TNeuron extends { concurrency?: number }\n> {\n private readonly gates = new Map<\n TNeuron,\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);\n if (!gate) {\n gate = { limit, active: 0, waiters: [] };\n this.gates.set(neuron, 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)!;\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)!;\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 type { ICNSCollateral } from '@cnstra/types';\nimport { TCNSNeuron } from '@cnstra/types';\nimport { TCNSSubscriber } from '@cnstra/types';\nimport { TCNSDendrite } from '@cnstra/types';\n\nexport class CNSNetwork<\n TNeuron extends TCNSNeuron<any>,\n TDendrite extends TCNSDendrite<any, any, any>\n> {\n /**\n * Strongly Connected Components of the neuron graph.\n * Each component is a set of neuron objects that can reach each other.\n *\n * Computed lazily on first access: the SCC machinery only drives graph\n * introspection (`getSCCSetByNeuron`, `canNeuronBeGuaranteedDone`), so a\n * network that never inspects reachability never pays for it.\n */\n private _stronglyConnectedComponents: Set<TNeuron>[] = [];\n private sccBuilt = false;\n\n public get stronglyConnectedComponents(): Set<TNeuron>[] {\n this.ensureSCC();\n return this._stronglyConnectedComponents;\n }\n\n /**\n * Quick lookup: neuron -> SCC index for fast reachability checks.\n */\n private neuronToSCC = new Map<TNeuron, 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 * Fast lookup: collateral -> list of (neuron, dendrite) subscribers.\n * Built once at construction time.\n */\n private subIndex = new Map<\n ICNSCollateral<unknown>,\n TCNSSubscriber<TNeuron, TDendrite>[]\n >();\n\n private parentNeuronByCollateral = new Map<ICNSCollateral<unknown>, TNeuron>();\n\n constructor(private readonly neurons: TNeuron[]) {\n // Indexes are needed on the hot path (subscriber/parent lookups), so they\n // are built eagerly. SCC analysis is deferred until first use.\n this.buildIndexes();\n }\n\n /** Build the SCC analysis the first time anything needs it. */\n private ensureSCC(): void {\n if (this.sccBuilt) return;\n this.sccBuilt = true;\n this.buildSCC();\n }\n\n /**\n * Build the neuron graph where neurons are connected if one can stimulate the other.\n */\n private buildNeuronGraph(): Map<TNeuron, Set<TNeuron>> {\n const graph = new Map<TNeuron, Set<TNeuron>>();\n\n // Initialize graph\n for (const neuron of this.neurons) {\n graph.set(neuron, 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<TNeuron>();\n\n // Check what collaterals this neuron can emit\n for (const axonKey in neuron.axon) {\n const collateral = neuron.axon[axonKey];\n\n // Find which neurons listen to this collateral\n const subscribers = this.subIndex.get(\n collateral as ICNSCollateral<unknown>\n );\n if (subscribers) {\n for (const { neuron: targetNeuron } of subscribers) {\n reachableNeurons.add(targetNeuron);\n }\n }\n }\n\n graph.set(neuron, 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\n // Tarjan's algorithm for SCC\n const index = new Map<TNeuron, number>();\n const lowlink = new Map<TNeuron, number>();\n const onStack = new Set<TNeuron>();\n const stack: TNeuron[] = [];\n const components: Set<TNeuron>[] = [];\n let currentIndex = 0;\n\n const strongConnect = (neuron: TNeuron) => {\n index.set(neuron, currentIndex);\n lowlink.set(neuron, currentIndex);\n currentIndex++;\n stack.push(neuron);\n onStack.add(neuron);\n\n const neighbors = graph.get(neuron) || new Set();\n for (const neighbor of Array.from(neighbors)) {\n if (!index.has(neighbor)) {\n strongConnect(neighbor);\n lowlink.set(\n neuron,\n Math.min(lowlink.get(neuron)!, lowlink.get(neighbor)!)\n );\n } else if (onStack.has(neighbor)) {\n lowlink.set(\n neuron,\n Math.min(lowlink.get(neuron)!, index.get(neighbor)!)\n );\n }\n }\n\n if (lowlink.get(neuron) === index.get(neuron)) {\n const component = new Set<TNeuron>();\n let w: TNeuron;\n do {\n w = stack.pop()!;\n onStack.delete(w);\n component.add(w);\n } while (w !== neuron);\n components.push(component);\n }\n };\n\n // Run Tarjan's algorithm on all unvisited neurons\n for (const neuron of this.neurons) {\n if (!index.has(neuron)) {\n strongConnect(neuron);\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 Array.from(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<TNeuron, Set<TNeuron>>): 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 neuron of Array.from(scc)) {\n const neighbors = neuronGraph.get(neuron) || new Set();\n\n for (const neighbor of Array.from(neighbors)) {\n const neighborSccIndex = this.neuronToSCC.get(neighbor);\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 // Build forward adjacency (source SCC -> target SCCs) once, instead of\n // re-deriving it per node by scanning the whole DAG. sccDag stores the\n // reverse edges (target -> sources that can reach it).\n const n = this._stronglyConnectedComponents.length;\n const forward: number[][] = Array.from({ length: n }, () => []);\n const inDegree = new Map<number, number>();\n const queue: number[] = [];\n\n for (let target = 0; target < n; target++) {\n const sources = this.sccDag.get(target) || new Set();\n inDegree.set(target, sources.size);\n if (sources.size === 0) queue.push(target);\n for (const source of Array.from(sources)) {\n forward[source].push(target);\n }\n }\n\n // Process nodes in topological order\n while (queue.length > 0) {\n const current = queue.shift()!;\n const currentAncestors = this.sccAncestors.get(current)!;\n\n for (const neighbor of forward[current]) {\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 for (const ancestor of Array.from(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 * 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 getSCCSetByNeuron(neuron: TNeuron) {\n this.ensureSCC();\n const sccIndex = this.neuronToSCC.get(neuron);\n\n if (sccIndex === undefined) return;\n\n return this._stronglyConnectedComponents[sccIndex];\n }\n\n /**\n * Get the SCC index for a given neuron\n */\n public getSccIndexByNeuron(neuron: TNeuron): number | undefined {\n this.ensureSCC();\n return this.neuronToSCC.get(neuron);\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 neuron: TNeuron,\n activeSccCounts: Map<number, number>\n ): boolean {\n this.ensureSCC();\n const sccIndex = this.neuronToSCC.get(neuron);\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 Array.from(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 private buildIndexes() {\n this.subIndex.clear();\n this.parentNeuronByCollateral.clear();\n for (const neuron of this.neurons) {\n for (const dendrite of neuron.dendrites) {\n const key = dendrite.collateral as ICNSCollateral<unknown>;\n const arr = this.subIndex.get(key) ?? [];\n arr.push({ neuron, dendrite: dendrite as TDendrite });\n this.subIndex.set(\n key,\n arr as TCNSSubscriber<TNeuron, TDendrite>[]\n );\n }\n Object.values(neuron.axon).forEach(collateral => {\n this.parentNeuronByCollateral.set(\n collateral as ICNSCollateral<unknown>,\n neuron\n );\n });\n }\n }\n\n public getParentNeuronByCollateral(collateral: ICNSCollateral<unknown>) {\n return this.parentNeuronByCollateral.get(collateral);\n }\n\n // Computed on demand (rarely used): one dendrite per collateral, last wins —\n // preserving the previous index semantics without building it every construct.\n public getDendrites() {\n const byCollateral = new Map<ICNSCollateral<unknown>, TDendrite>();\n for (const neuron of this.neurons) {\n for (const dendrite of neuron.dendrites) {\n byCollateral.set(\n dendrite.collateral as ICNSCollateral<unknown>,\n dendrite as TDendrite\n );\n }\n }\n return Array.from(byCollateral.values());\n }\n\n public getCollaterals() {\n const collaterals = new Set<ICNSCollateral<unknown>>();\n for (const neuron of this.neurons) {\n for (const collateral of Object.values(neuron.axon)) {\n collaterals.add(collateral as ICNSCollateral<unknown>);\n }\n }\n return Array.from(collaterals);\n }\n\n public getSubscribers(\n collateral: ICNSCollateral<unknown>\n ): TCNSSubscriber<TNeuron, TDendrite>[] {\n return this.subIndex.get(collateral) ?? [];\n }\n}\n","import type { ICNSCollateral } from '@cnstra/types';\nimport { TCNSNeuron } from '@cnstra/types';\nimport { TCNSDendrite } from '@cnstra/types';\nimport { TCNSOptions } from '@cnstra/types';\nimport { TCNSStimulationOptions } from '@cnstra/types';\nimport { CNSStimulation } from './CNSStimulation';\nimport { TCNSSignal } from '@cnstra/types';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSStimulationResponse } from '@cnstra/types';\nimport { TCNSStimulationDrain } from '@cnstra/types';\nimport { TCNSNeuronActivationTask } from '@cnstra/types';\nimport { CNSNetwork } from './CNSNetwork';\nimport { ICNS } from '@cnstra/types';\n\nexport class CNS<\n TNeuron extends TCNSNeuron<any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> implements ICNS<TNeuron, TDendrite>\n{\n /**\n * Network graph analysis and strongly connected components.\n */\n public readonly network: CNSNetwork<TNeuron, TDendrite>;\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 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 /**\n * Global batch-boundary listeners applied to every stimulation.\n */\n private readonly globalDrainListeners: Array<\n (d: TCNSStimulationDrain) => void\n > = [];\n\n /**\n * Shared, app/organism-wide value handed to every dendrite as `ctx.global`.\n * Stored untyped (the type is baked into neurons via `neuronFactory().withGlobal<T>()`);\n * CNS is just a passthrough carrier, so injecting it here never touches the hot path.\n */\n public readonly global?: unknown;\n\n constructor(\n protected readonly neurons: TNeuron[],\n public readonly options?: TCNSOptions,\n global?: unknown\n ) {\n this.network = new CNSNetwork(this.neurons);\n this.global = global;\n }\n\n /** Push a listener onto a list; return an idempotent unsubscribe. */\n private addListener<T>(list: T[], listener: T): () => void {\n list.push(listener);\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n const idx = list.indexOf(listener);\n if (idx >= 0) list.splice(idx, 1);\n };\n }\n\n public addResponseListener(\n listener: (response: TCNSStimulationResponse) => void | Promise<void>\n ): () => void {\n return this.addListener(this.globalResponseListeners, listener);\n }\n\n /**\n * Register a listener called once at the end of every synchronous turn of\n * every stimulation - see {@link TCNSStimulationDrain}. This is how an\n * integration (a state manager, an in-memory database) installs a single\n * commit point for the whole organism instead of passing `onDrain` per call.\n *\n * Returns an unsubscribe function.\n */\n public addDrainListener(\n listener: (drain: TCNSStimulationDrain) => void\n ): () => void {\n return this.addListener(this.globalDrainListeners, listener);\n }\n\n /**\n * Fan a drain out to the local and global listeners, or return undefined when\n * there are none so the stimulation can skip the boundary check entirely.\n *\n * Listener errors are isolated: a drain is a notification, and one broken\n * flush must not stop the others or derail the stimulation that triggered it.\n */\n private wrapOnDrain(\n local?: (drain: TCNSStimulationDrain) => void\n ): ((drain: TCNSStimulationDrain) => void) | undefined {\n if (this.globalDrainListeners.length === 0 && !local) return undefined;\n return (d: TCNSStimulationDrain) => {\n if (local) {\n try {\n local(d);\n } catch (error) {\n console.error('[CNS] onDrain listener threw', error);\n }\n }\n for (let i = 0; i < this.globalDrainListeners.length; i++) {\n try {\n this.globalDrainListeners[i](d);\n } catch (error) {\n console.error('[CNS] drain listener threw', error);\n }\n }\n };\n }\n\n private wrapOnResponse<T>(\n local?: (response: T) => void | Promise<void>\n ): ((response: T) => void | Promise<void>) | undefined {\n if (this.globalResponseListeners.length === 0 && !local) {\n // No listener at all: skip wrapping entirely so the stimulation can\n // take its fast path and avoid building response objects per signal.\n return undefined;\n }\n return (r: T) => {\n let anyPromise = false;\n const promises: Promise<void>[] = [];\n\n if (local) {\n try {\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 } catch (error) {\n // Sync error from local - wrap in rejected promise\n anyPromise = true;\n promises.push(Promise.reject(error));\n }\n }\n\n for (let i = 0; i < this.globalResponseListeners.length; i++) {\n try {\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 } catch (error) {\n // Sync error from global listener - wrap in rejected promise\n anyPromise = true;\n promises.push(Promise.reject(error));\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 /** Build a stimulation (wired listeners, unseeded). Shared by stimulate/activate. */\n private createStimulation(\n options?: TCNSStimulationOptions<TCNSStimulationResponse>\n ): CNSStimulation<TNeuron, TDendrite> {\n return new CNSStimulation<TNeuron, TDendrite>(\n this,\n this.instanceNeuronQueue,\n options,\n this.wrapOnResponse(options?.onResponse),\n this.wrapOnDrain(options?.onDrain)\n );\n }\n\n public stimulate(\n signalOrSignals:\n | TCNSSignal<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[],\n options?: TCNSStimulationOptions<TCNSStimulationResponse>\n ): CNSStimulation<TNeuron, TDendrite> {\n const stimulation = this.createStimulation(options);\n stimulation.responseToSignal(signalOrSignals);\n return stimulation;\n }\n\n /**\n * Start a stimulation with activation tasks directly\n */\n public activate(\n tasks: TCNSNeuronActivationTask<TNeuron>[],\n options?: TCNSStimulationOptions<TCNSStimulationResponse>\n ): CNSStimulation<TNeuron, TDendrite> {\n const stimulation = this.createStimulation(options);\n stimulation.enqueueTasks(tasks);\n return stimulation;\n }\n}\n","import { TCNSSignal } from '@cnstra/types';\nimport { ICNSCollateral } from '@cnstra/types';\n\nexport class CNSCollateral<TPayload> implements ICNSCollateral<TPayload> {\n createSignal(): TCNSSignal<CNSCollateral<TPayload>>;\n createSignal(payload: TPayload): TCNSSignal<CNSCollateral<TPayload>>;\n createSignal(payload?: TPayload): TCNSSignal<CNSCollateral<TPayload>> {\n return { collateral: this, payload };\n }\n}\n","import type { ICNSCollateral } from '@cnstra/types';\nimport type { CNS } from '../CNS';\n\nimport type { CNSStimulation } from '../CNSStimulation';\nimport type { TCNSDendrite } from '@cnstra/types';\nimport type { TCNSNeuron } from '@cnstra/types';\nimport type { TCNSSignal } from '@cnstra/types';\nimport type { TCNSStimulationOptions } from '@cnstra/types';\nimport type { TCNSStimulationResponse } from '@cnstra/types';\n\nexport type TCNSStimulationGateSignal =\n | TCNSSignal<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[];\n\nexport type TCNSStimulationGateOptions<\n TNeuron extends TCNSNeuron<any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> = {\n cns: CNS<TNeuron, TDendrite>;\n signal: TCNSStimulationGateSignal;\n options?: TCNSStimulationOptions<TCNSStimulationResponse>;\n};\n\nexport class CNSStimulationGate<\n TNeuron extends TCNSNeuron<any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> {\n private currentStimulation?: CNSStimulation<TNeuron, TDendrite>;\n private currentDrain?: Promise<void>;\n private currentAbortController?: AbortController;\n\n constructor(\n private readonly guardOptions: TCNSStimulationGateOptions<TNeuron, TDendrite>\n ) {}\n\n public isDraining(): boolean {\n return this.currentDrain !== undefined;\n }\n\n public getCurrentStimulation():\n | CNSStimulation<TNeuron, TDendrite>\n | undefined {\n return this.currentStimulation;\n }\n\n public drain(): Promise<void> {\n if (this.currentDrain) return this.currentDrain;\n\n const stimulation = this.guardOptions.cns.stimulate(\n this.guardOptions.signal,\n this.createStimulationOptions()\n );\n\n const drain = stimulation.waitUntilComplete().finally(() => {\n if (this.currentDrain !== drain) return;\n this.currentDrain = undefined;\n this.currentStimulation = undefined;\n this.currentAbortController = undefined;\n });\n\n this.currentStimulation = stimulation;\n this.currentDrain = drain;\n\n return drain;\n }\n\n public abort(reason?: any): boolean {\n if (!this.currentAbortController) return false;\n if (this.currentAbortController.signal.aborted) return false;\n\n this.currentAbortController.abort(reason);\n return true;\n }\n\n private createStimulationOptions(): TCNSStimulationOptions<TCNSStimulationResponse> {\n const options = this.guardOptions.options;\n\n if (options?.abortSignal) {\n return options;\n }\n\n if (typeof AbortController === 'undefined') {\n return options ?? {};\n }\n\n this.currentAbortController = new AbortController();\n\n return {\n ...options,\n abortSignal: this.currentAbortController.signal,\n };\n }\n}\n","import { CNS } from '../CNS';\nimport { CNSCollateral } from '../CNSCollateral';\nimport type { ICNSCollateral } from '@cnstra/types';\nimport { TCNSAxon } from '@cnstra/types';\nimport { TCNSOptions } from '@cnstra/types';\nimport { TCNSDendrite } from '@cnstra/types';\nimport { TCNSHandlerContext } from '@cnstra/types';\nimport { TCNSNeuronResponseReturn } from '@cnstra/types';\nimport { TCNSNeuron } from '@cnstra/types';\nimport { TCNSModality } from '@cnstra/types';\nimport { TCNSAfferentPath } from '@cnstra/types';\nimport { TCNSStimulationOptions } from '@cnstra/types';\n\nexport const collateral = <TPayload = undefined>() =>\n new CNSCollateral<TPayload>();\n\n// Helper type to extract payload union from an array of collaterals\n// Uses distributive conditional type to properly extract union, not intersection\n// Works with both arrays and tuples\ntype CollateralPayloadUnion<\n TCollaterals extends readonly ICNSCollateral<unknown>[]\n> = {\n [K in keyof TCollaterals]: TCollaterals[K] extends ICNSCollateral<infer P>\n ? P\n : never;\n}[number];\n\ntype InterNeuronAPI<\n TAxonType extends TCNSAxon = TCNSAxon,\n TGlobal = unknown\n> = {\n axon: TAxonType;\n concurrency?: number;\n maxDuration?: number;\n dendrites: TCNSDendrite<\n ICNSCollateral<unknown>,\n TAxonType,\n TGlobal\n >[];\n setConcurrency: (\n n: number | undefined\n ) => InterNeuronAPI<TAxonType, TGlobal>;\n setMaxDuration: (\n ms: number | undefined\n ) => InterNeuronAPI<TAxonType, TGlobal>;\n bind: <TFollowAxon extends Record<string, ICNSCollateral<unknown>>>(\n axon: TFollowAxon,\n dendrites: {\n [K in keyof TFollowAxon]:\n | TCNSDendrite<TFollowAxon[K], TAxonType, TGlobal>\n | TCNSDendrite<\n TFollowAxon[K],\n TAxonType,\n TGlobal\n >['response'];\n }\n ) => InterNeuronAPI<TAxonType, TGlobal>;\n dendrite: {\n <TSenderCollateral extends ICNSCollateral<unknown>>(s: {\n collateral: TSenderCollateral;\n response: (\n payload: TSenderCollateral extends ICNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TCNSNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TAxonType, TGlobal>;\n <\n TCollaterals extends readonly [\n ICNSCollateral<unknown>,\n ...ICNSCollateral<unknown>[]\n ]\n >(s: {\n collateral: TCollaterals;\n response: (\n payload: CollateralPayloadUnion<TCollaterals>,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TCNSNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TAxonType, TGlobal>;\n <TPayloadUnion>(s: {\n collateral: ICNSCollateral<unknown>[];\n response: (\n payload: TPayloadUnion,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TCNSNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TAxonType, TGlobal>;\n (\n s: TCNSDendrite<\n ICNSCollateral<unknown>,\n TAxonType,\n TGlobal\n >\n ): InterNeuronAPI<TAxonType, TGlobal>;\n };\n modalityDendrite: {\n <TSenderCollateral extends ICNSCollateral<unknown>, TResult>(s: {\n collateral: TSenderCollateral;\n modality: TCNSModality;\n afferentPaths?: Map<\n TCNSAfferentPath,\n (\n payload: TSenderCollateral extends ICNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TResult | Promise<TResult>\n >;\n default?: (\n payload: TSenderCollateral extends ICNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TResult | Promise<TResult>;\n output: (\n result: TResult,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TCNSNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TAxonType, TGlobal>;\n <TSenderCollateral extends ICNSCollateral<unknown>, TResult>(s: {\n collateral: TSenderCollateral;\n modalities: Array<{\n modality: TCNSModality;\n afferentPaths?: Map<\n TCNSAfferentPath,\n (\n payload: TSenderCollateral extends ICNSCollateral<\n infer P\n >\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TResult | Promise<TResult>\n >;\n default?: (\n payload: TSenderCollateral extends ICNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TResult | Promise<TResult>;\n }>;\n default?: (\n payload: TSenderCollateral extends ICNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TResult | Promise<TResult>;\n output: (\n result: TResult,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TCNSNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TAxonType, TGlobal>;\n };\n};\n\n// Helper type to extract result type from output function\ntype ExtractResultFromOutput<T> = T extends (\n result: infer R,\n ...args: any[]\n) => any\n ? R\n : never;\n\n// Concrete builder\nexport const neuron = <\n TProvidedAxon extends Record<string, ICNSCollateral<unknown>>,\n TGlobal = unknown\n>(\n axon: TProvidedAxon\n): InterNeuronAPI<TCNSAxon<TProvidedAxon>, TGlobal> => {\n const dendrites: TCNSDendrite<\n ICNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>,\n TGlobal\n >[] = [];\n\n const api: InterNeuronAPI<TCNSAxon<TProvidedAxon>, TGlobal> = {\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 ICNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>,\n TGlobal\n >\n );\n }\n return api;\n }) as InterNeuronAPI<\n TCNSAxon<TProvidedAxon>,\n TGlobal\n >['bind'],\n axon: axon as unknown as TCNSAxon<TProvidedAxon>,\n concurrency: undefined,\n maxDuration: undefined,\n dendrites,\n dendrite(s: any) {\n // Check if it's a shorthand format with multiple collaterals\n if (\n 'collateral' in s &&\n 'response' in s &&\n Array.isArray(s.collateral)\n ) {\n // Shorthand format with multiple collaterals - create one dendrite per collateral\n for (const collateral of s.collateral) {\n dendrites.push({\n collateral,\n response: s.response,\n } as TCNSDendrite<ICNSCollateral<unknown>, TCNSAxon<TProvidedAxon>, TGlobal>);\n }\n } else {\n // Either full dendrite object or shorthand with single collateral\n // Both have the same structure, so we handle them the same way\n dendrites.push(\n s as TCNSDendrite<\n ICNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>,\n TGlobal\n >\n );\n }\n return api; // keep full API for chaining\n },\n modalityDendrite(s: any) {\n const {\n collateral,\n modality: singleModality,\n modalities: multipleModalities,\n afferentPaths: singleAfferentPaths,\n default: defaultHandler,\n output,\n } = s;\n\n // Normalize to array format for unified processing\n const modalityConfigs: Array<{\n modality: TCNSModality;\n afferentPaths?: Map<TCNSAfferentPath, any>;\n default?: any;\n }> = multipleModalities\n ? multipleModalities\n : singleModality\n ? [\n {\n modality: singleModality,\n afferentPaths: singleAfferentPaths,\n default: defaultHandler,\n },\n ]\n : [];\n\n const response = (payload: any, axon: any, ctx: any) => {\n const stimulation = ctx.stimulation as\n | {\n options?: TCNSStimulationOptions<any>;\n }\n | undefined;\n\n const stimOptions = stimulation?.options;\n\n const runGlobalDefault = () => {\n if (!defaultHandler) {\n throw new Error(\n `modalityDendrite: No handler found for modality and no default handler provided`\n );\n }\n\n const res = defaultHandler(payload, axon, ctx);\n if (res && typeof (res as any).then === 'function') {\n return (res as Promise<any>).then((result: any) =>\n output(result, axon, ctx)\n );\n }\n return output(res, axon, ctx);\n };\n\n if (!stimOptions || !stimOptions.modality) {\n return runGlobalDefault();\n }\n\n // Find matching modality config by object reference\n const matchingConfig = modalityConfigs.find(\n config => config.modality === stimOptions.modality\n );\n\n if (!matchingConfig) {\n return runGlobalDefault();\n }\n\n const stimAfferentPath = stimOptions.afferentPath;\n\n // Find handler by afferent path object reference\n const handler =\n stimAfferentPath && matchingConfig.afferentPaths\n ? matchingConfig.afferentPaths.get(stimAfferentPath)\n : undefined;\n\n const effectiveHandler =\n handler ?? matchingConfig.default ?? defaultHandler;\n\n if (!effectiveHandler) {\n throw new Error(\n `modalityDendrite: No handler found for afferent path in modality and no default handler provided`\n );\n }\n\n const maybeResult = effectiveHandler(payload, axon, ctx);\n\n if (\n maybeResult &&\n typeof (maybeResult as any).then === 'function'\n ) {\n return (maybeResult as Promise<any>).then((result: any) =>\n output(result, axon, ctx)\n );\n }\n\n try {\n return output(maybeResult, axon, ctx);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\n 'Cannot read properties of undefined'\n )\n ) {\n const axonKeys =\n axon && typeof axon === 'object'\n ? Object.keys(axon)\n : 'not an object';\n throw new Error(\n `modalityDendrite: axon.output is undefined. Axon type: ${typeof axon}, Axon keys: ${\n Array.isArray(axonKeys)\n ? axonKeys.join(', ')\n : axonKeys\n }. Make sure the neuron was created with the correct axon structure. Original error: ${\n error.message\n }`\n );\n }\n throw error;\n }\n };\n\n dendrites.push({\n collateral,\n response,\n } as TCNSDendrite<ICNSCollateral<unknown>, TCNSAxon<TProvidedAxon>, TGlobal>);\n\n return api;\n },\n };\n\n return api;\n};\n\n/**\n * A composable neuron factory. Each `.withX<T>()` returns a *new typed view* of\n * the same underlying builder (the layers are type-only — zero runtime cost, no\n * per-activation overhead), so you bake your ctx additions once and reuse them\n * everywhere. Layers compose in any order and never touch the handler signature.\n *\n * `TExt` is the accumulated ctx extension: each layer *intersects* its own fields\n * into it, so a base factory (`TExt = unknown`) hands neurons the plain ctx bag —\n * nothing is forced onto anyone who didn't ask for it. `withGlobal<T>()` is the\n * built-in layer; make `T` an object to carry as much as you want (store, clock,\n * logger, …) through the single runtime channel wired at `createCNS`/`new CNS`.\n *\n * @example\n * // src/neurons/factory.ts — ctx shape baked once\n * type TGlobal = { store: Store; now(): number; newId(): string };\n * export const { neuron } = neuronFactory().withGlobal<TGlobal>();\n *\n * // any neuron file — plain value, reaches deps via ctx.global\n * export const taskNeuron = neuron({ taskCreated }).bind({ createTask }, {\n * createTask: ({ title }, axon, { global }) =>\n * axon.taskCreated.createSignal({ id: global.newId(), title, at: global.now() }),\n * });\n */\nexport type TNeuronFactory<TExt = unknown> = {\n /** Add `{ global: T }` to ctx; the value is injected once at `createCNS`/`new CNS`. */\n withGlobal: <T>() => TNeuronFactory<TExt & { global: T }>;\n neuron: <TProvidedAxon extends Record<string, ICNSCollateral<unknown>>>(\n axon: TProvidedAxon\n ) => InterNeuronAPI<TCNSAxon<TProvidedAxon>, TExt>;\n};\n\nexport const neuronFactory = <TExt = unknown>(): TNeuronFactory<TExt> => {\n // Single stateless object reused across every layer call: `.withX()` only\n // re-types it, so there is nothing to allocate or carry at runtime.\n const factory: TNeuronFactory<TExt> = {\n withGlobal: () => factory as unknown as TNeuronFactory<any>,\n neuron: axon => neuron(axon) as any,\n };\n return factory;\n};\n\n/** Sugar: `neuronFactory().withGlobal<T>()`. */\nexport const withGlobal = <T>(): TNeuronFactory<{ global: T }> =>\n neuronFactory<{ global: T }>();\n\nexport const afferentPath = (\n parentAfferentPath?: TCNSAfferentPath\n): TCNSAfferentPath => {\n return {\n ...(parentAfferentPath !== undefined && {\n parentAfferentPath,\n }),\n };\n};\n\nexport const modality = (\n afferentPaths: Record<string | number, TCNSAfferentPath>\n): TCNSModality => {\n return {\n afferentPaths,\n };\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/CNSStimulation.ts","../src/CNSInstanceNeuronQueue.ts","../src/utils/cnsResolveModalityHandler.ts","../src/utils/cnsComposeModalityResponse.ts","../src/CNSNetwork.ts","../src/CNS.ts","../src/createCNS.ts","../src/CNSCollateral.ts","../src/utils/CNSStimulationGate.ts","../src/factory/index.ts"],"names":["error","r","axon"],"mappings":"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","file":"index.js","sourcesContent":["import type { ICNSCollateral } from '@cnstra/types';\nimport { TCNSStimulationOptions } from '@cnstra/types';\nimport { TCNSNeuron } from '@cnstra/types';\nimport { TCNSDendrite } from '@cnstra/types';\nimport { TCNSSubscriber } from '@cnstra/types';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSSignal } from '@cnstra/types';\nimport { TCNSNeuronActivationTask } from '@cnstra/types';\nimport { TCNSContextStore } from '@cnstra/types';\nimport { CNS } from './CNS';\nimport { ICNS } from '@cnstra/types';\nimport { TCNSNeuronActivationTaskFailure } from '@cnstra/types';\nimport { TCNSStimulationResponse } from '@cnstra/types';\nimport { TCNSStimulationDrain } from '@cnstra/types';\n\nimport { TCNSNeuronResponseReturn } from '@cnstra/types';\nimport { TCNSAxon } from '@cnstra/types';\n\n/**\n * Internal, non-enumerable cache of the resolved dendrite on activation tasks we\n * create ourselves. Lets executeActivationTask skip the subscriber lookup on the\n * hot path. Tasks supplied externally via activate() simply lack it and fall\n * back to the lookup. Symbol-keyed so it never shows up in JSON/spread/keys.\n */\nconst TASK_DENDRITE = Symbol('cnstra.taskDendrite');\nconst TASK_ACTIVE_POSITION = Symbol('cnstra.taskActivePosition');\nconst TASK_PENDING_POSITION = Symbol('cnstra.taskPendingPosition');\n\n/**\n * Per-activation context handed to a dendrite's `response`. Implemented as a\n * class so the accessors live once on the prototype and each activation\n * allocates a single object.\n */\nclass CNSDendriteContext {\n constructor(\n public readonly stimulation: any,\n public readonly abortSignal: AbortSignal | undefined,\n public readonly cns: any,\n // The activation this handler is running as. Held so `activationContext`\n // can be read off it; nothing else on the task is exposed.\n private readonly task?: TCNSNeuronActivationTask<any>\n ) {}\n // Prototype getter, not a constructor field: you only pay a single `cns.global`\n // read on the dendrites that actually reach for it. Value getter, so\n // `{ global }` destructuring is safe.\n get global(): unknown {\n return this.cns.global;\n }\n // The caller-supplied per-stimulation context (`stimulate(sig, {stimulationContext})`),\n // the same value on every hop — the environment-agnostic way to correlate logs to a\n // run (pass `{ stimulationId, attemptNumber }`). Prototype getter like `global`:\n // zero extra allocation, read only where a handler reaches for it.\n get stimulationContext(): unknown {\n return this.stimulation.options?.stimulationContext;\n }\n // This activation's own store - written by a response listener before the\n // activation ran. Prototype getter like the two above: nothing is allocated\n // for a handler that never reaches for it.\n get activationContext(): TCNSContextStore | undefined {\n return this.task?.activationContext;\n }\n}\n\n/**\n * Response object handed to onResponse listeners. Implemented as a class so\n * instances share a single monomorphic hidden class.\n */\nclass CNSStimulationResponseImpl {\n constructor(\n public readonly stimulation: CNSStimulation<any, any>,\n public readonly inputSignal: TCNSSignal<ICNSCollateral<unknown>> | undefined,\n public readonly outputSignal:\n | TCNSSignal<ICNSCollateral<unknown>>\n | undefined,\n public readonly queueLength: number,\n public readonly pendingActivations: number,\n public readonly activeActivations: number,\n public readonly hops: number | undefined,\n public readonly error: any,\n // The neuron that produced this response (present on both success and\n // throw paths). Lets name-based consumers resolve the task's neuron\n // reliably instead of guessing via the output collateral's owner.\n public readonly neuron: TCNSNeuron<any> | undefined,\n // When the dendrite response was invoked, and how long it took. Measured in\n // runStarter, the single entry point into a body, so every path -\n // sync, async, throw, rejection - reports the same way. Undefined for\n // responses that are not an activation.\n public readonly startedAt: number | undefined,\n public readonly duration: number | undefined,\n /**\n * The activations this response is about to create - already built, not\n * yet run. A listener can write into their `activationContext` here and\n * the dendrite reads it back; the engine enqueues these very objects\n * afterwards, on every path, and waits for an async listener first.\n *\n * Empty on a response that starts nothing (a sink, a failure, abort).\n */\n public readonly scheduledActivationTasks: readonly TCNSNeuronActivationTask<any>[] = EMPTY_TASKS,\n /**\n * The store of the activation that produced this response - what its own\n * handler reads as `ctx.activationContext`. Undefined when nothing was\n * attached, and on responses that are not an activation.\n */\n public readonly activationContext: TCNSContextStore | undefined = undefined\n ) {}\n}\n\n/** Shared empty array so a response that starts nothing allocates none. */\nconst EMPTY_TASKS: readonly TCNSNeuronActivationTask<any>[] = [];\n\n/** The same, for a response whose signal has no output collateral. */\nconst EMPTY_SUBSCRIBERS: any[] = [];\n\nexport class CNSStimulation<\n TNeuron extends TCNSNeuron<any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> {\n\n // --- Inlined activation queue (formerly CNSNeuronActivationPump) ---\n // Folded into the stimulation so a single run allocates one object instead\n // of also spinning up a separate pump object + its backing array.\n // Ring buffer; the backing array is allocated lazily on first enqueue.\n private qItems?: Array<TCNSNeuronActivationTask<TNeuron> | undefined>;\n private qHead = 0;\n private qTail = 0;\n private qSize = 0;\n private qCapacity = 4;\n private activeOperations = 0;\n // Lazily allocated: only populated while an async task is in flight; purely\n // synchronous stimulations never need it.\n private activeTasks?: TCNSNeuronActivationTask<TNeuron>[];\n // Re-entrancy guard for the pump loop.\n private pumping = false;\n private needsPump = false;\n // Nesting depth of the current synchronous turn. Only the outermost close\n // announces a drain - see beginTurn/endTurn.\n private turnDepth = 0;\n\n private readonly neuronVisitCounts?: number[];\n private readonly subscribersByCollateralIndex: TCNSSubscriber<TNeuron, TDendrite>[][];\n /** Read on every dequeue; both are fixed for the life of the stimulation. */\n private readonly concurrencyLimit: number;\n private readonly abortSignal?: AbortSignal;\n private readonly instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>;\n private scheduledCount = 0;\n // Activations belonging to signals of an in-progress array fan-out that have\n // not been handed to processResponse yet, so the task objects do not exist.\n // processResponse enqueues synchronously, so the first signal's whole subtree\n // drains before the second signal is even looked at; without this counter\n // that subtree's leaf sees an empty queue and reads as \"all work done\".\n // Counted in activations, not signals, so every public counter shares a unit.\n private reservedActivations = 0;\n // Lazily allocated: only needed while subscriber tasks wait for an async\n // onResponse to resolve before being enqueued.\n private pendingTasks?: TCNSNeuronActivationTask<TNeuron>[];\n // Lazily allocated: only allocated when a task actually fails.\n private failedTasks?: Array<TCNSNeuronActivationTaskFailure<TNeuron>>;\n // Completion is tracked eagerly via flags; the Promise is only materialized\n // if someone actually calls waitUntilComplete(). This avoids allocating a\n // Promise (the single most expensive setup cost) on every stimulate().\n private completed?: Promise<void>;\n private resolveCompleted?: () => void;\n private rejectCompleted?: (e: any) => void;\n private isCompleted = false;\n private completionError: any;\n private completionRejected = false;\n private onResponseError: Error | undefined;\n\n /**\n * The (already wrapped) response listener for this stimulation, or\n * undefined when there is neither a local nor any global listener.\n */\n private readonly onResponse?: (\n response: TCNSStimulationResponse\n ) => void | Promise<void>;\n\n /**\n * The (already wrapped) drain listener, or undefined when there is neither a\n * local nor any global one. When undefined, endTurn() bails immediately, so a\n * stimulation with no drain listener pays only the turn depth counter.\n */\n private readonly onDrain?: (drain: TCNSStimulationDrain) => void;\n\n constructor(\n public readonly cns: CNS<TNeuron, TDendrite>,\n instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>,\n public readonly options?: TCNSStimulationOptions<TCNSStimulationResponse>,\n onResponse?: (\n response: TCNSStimulationResponse\n ) => void | Promise<void>,\n onDrain?: (drain: TCNSStimulationDrain) => void\n ) {\n this.onDrain = onDrain;\n this.instanceNeuronQueue = instanceNeuronQueue;\n this.onResponse = onResponse;\n this.concurrencyLimit = this.options?.concurrency ?? Infinity;\n this.abortSignal = this.options?.abortSignal;\n this.subscribersByCollateralIndex = cns.network.getSubscriberTable(\n this.options?.modality,\n this.options?.afferentPath\n );\n\n if (this.options?.maxNeuronHops) {\n this.neuronVisitCounts = [];\n }\n }\n\n private pushFailedTask(\n failure: TCNSNeuronActivationTaskFailure<TNeuron>\n ): void {\n (this.failedTasks ??= []).push(failure);\n }\n\n private finalizeResolve(): void {\n this.completionRejected = false;\n this.resolveCompleted?.();\n }\n\n private finalizeReject(error: any): void {\n this.completionRejected = true;\n this.completionError = error;\n this.rejectCompleted?.(error);\n }\n\n // ----- Inlined activation queue / pump -----\n\n private get canStartOperation(): boolean {\n // Both were read through an optional chain on every dequeue, and both are\n // fixed at construction.\n return (\n this.activeOperations < this.concurrencyLimit &&\n !this.abortSignal?.aborted\n );\n }\n\n private qResize(): void {\n const oldCapacity = this.qCapacity;\n const oldItems = this.qItems!;\n this.qCapacity = oldCapacity * 2;\n const newItems = new Array(this.qCapacity);\n\n let oldIndex = this.qHead;\n for (let i = 0; i < this.qSize; i++) {\n newItems[i] = oldItems[oldIndex];\n oldIndex = (oldIndex + 1) % oldCapacity;\n }\n\n this.qItems = newItems;\n this.qHead = 0;\n this.qTail = this.qSize;\n }\n\n private qDequeue(): TCNSNeuronActivationTask<TNeuron> | undefined {\n if (this.qSize === 0) return undefined;\n const items = this.qItems!;\n const task = items[this.qHead];\n items[this.qHead] = undefined; // Clear reference\n this.qHead = (this.qHead + 1) % this.qCapacity;\n this.qSize--;\n return task;\n }\n\n private qEnqueueItem(task: TCNSNeuronActivationTask<TNeuron>): void {\n if (!this.qItems) {\n this.qItems = new Array(this.qCapacity);\n } else if (this.qSize === this.qCapacity) {\n this.qResize();\n }\n this.qItems[this.qTail] = task;\n this.qTail = (this.qTail + 1) % this.qCapacity;\n this.qSize++;\n }\n\n /** Enqueue a task and drive the pump unless one is already running. */\n private qEnqueue(task: TCNSNeuronActivationTask<TNeuron>): void {\n this.qEnqueueItem(task);\n if (!this.pumping) this.pump();\n else this.needsPump = true;\n }\n\n private qGetQueuedTasks(): TCNSNeuronActivationTask<TNeuron>[] {\n const result: TCNSNeuronActivationTask<TNeuron>[] = [];\n if (!this.qItems) return result;\n let index = this.qHead;\n for (let i = 0; i < this.qSize; i++) {\n result.push(this.qItems[index]!);\n index = (index + 1) % this.qCapacity;\n }\n return result;\n }\n\n private pump(): void {\n if (this.pumping) {\n this.needsPump = true;\n return;\n }\n this.pumping = true;\n\n try {\n while (this.canStartOperation && this.qSize > 0) {\n const task = this.qDequeue()!;\n this.activeOperations++;\n\n const ret = this.executeActivationTask(task);\n\n // Async branch\n if (ret && typeof (ret as any).then === 'function') {\n // Only track tasks that are actually in flight across a\n // tick; synchronous tasks complete before anyone can\n // observe them.\n this.addPositionedTask((this.activeTasks ??= []), task, TASK_ACTIVE_POSITION);\n (ret as Promise<void | (() => void)>).then(\n cb => {\n this.activeOperations--;\n this.removeActiveTask(task);\n // One turn spans the callback and the follow-up\n // pump: cb() itself enqueues and pumps, so without\n // this the drain would be announced twice for one\n // batch.\n this.beginTurn();\n try {\n if (typeof cb === 'function') cb();\n\n if (this.qSize > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n } catch (error) {\n // The same machinery throw pump() guards below,\n // but reached from a settled async activation.\n // Rethrowing here would only turn into an\n // unhandled rejection nobody can catch, so the\n // run's error channel is the completion promise.\n this.endRunWithError(error);\n } finally {\n this.endTurn();\n }\n },\n err => {\n this.activeOperations--;\n this.removeActiveTask(task);\n this.beginTurn();\n try {\n if (this.qSize > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n } finally {\n this.endTurn();\n }\n throw err; // let it crash \"honestly\"\n }\n );\n // Do not break: if concurrency allows, start additional items\n continue;\n }\n\n // Sync branch (task was never added to activeTasks)\n this.activeOperations--;\n if (typeof ret === 'function') (ret as () => void)();\n }\n } catch (error) {\n // A throw out of the loop - today that is the hop-limit guard in\n // createSubscriberQueueItem, firing while a settled activation\n // dispatches its subscribers - used to unwind straight past the\n // `pumping = false` that lived here, leaving the flag set forever:\n // every later enqueue and async completion then took the \"already\n // pumping\" branch, so tryResolveCompleted was never reached again\n // and waitUntilComplete() never settled. Now the flag is reset in\n // `finally`, the run ends with this error, and the error still\n // propagates to whoever drove the pump.\n this.endRunWithError(error);\n throw error;\n } finally {\n this.pumping = false;\n }\n\n // If async completions or enqueues requested another pass, do exactly\n // one more, non-recursively.\n if (this.needsPump) {\n this.needsPump = false;\n this.pump();\n }\n }\n\n /**\n * Open a synchronous turn. Turns nest: a drain is announced only when the\n * outermost one closes, so an enqueue that happens while the pump is already\n * running does not produce its own boundary.\n */\n private beginTurn(): void {\n this.turnDepth++;\n }\n\n /**\n * Close a synchronous turn and, if it was the outermost and nothing more can\n * run without yielding to the event loop, announce the drain.\n *\n * This is the only place the synchronous frontier is observable. A response\n * cannot serve the purpose: responses are emitted when an activation\n * *finishes*, but a turn just as often ends when one *starts* and returns a\n * promise - at which point there is nothing left to emit a response from.\n */\n private endTurn(): void {\n if (--this.turnDepth > 0) return;\n const onDrain = this.onDrain;\n if (!onDrain) return;\n // Still mid-pump, or work is runnable right now: not a boundary.\n if (this.pumping) return;\n if (this.qSize > 0 && this.canStartOperation) return;\n // Hold the turn open across the callback so that a stimulate()/\n // enqueueTasks() call from inside it cannot recurse into another drain.\n this.turnDepth++;\n try {\n onDrain({\n stimulation: this,\n queueLength: this.pendingActivations + this.activeOperations,\n pendingActivations: this.pendingActivations,\n activeActivations: this.activeOperations,\n } as TCNSStimulationDrain);\n } finally {\n this.turnDepth--;\n }\n }\n\n /**\n * Activations that exist (or are reserved) but whose dendrite response has\n * not been invoked yet: sitting in the ring buffer, created and held in\n * pendingTasks, or reserved by an array fan-out mid-dispatch. Subscribers\n * parked behind an async onResponse land here too - their body has not run.\n */\n private get pendingActivations(): number {\n return this.qSize + this.scheduledCount + this.reservedActivations;\n }\n\n /**\n * End the run because the machinery itself threw. Dendrite bodies never get\n * here - runStarter catches those and records them as failed tasks; what\n * lands here is a throw from dispatch, today the hop-limit guard in\n * createSubscriberQueueItem. Nothing settles the counters after such a\n * throw, so completion has to be forced: without it the stimulation neither\n * resolves nor rejects, and a worker holds a job that never finishes and\n * never fails.\n */\n private endRunWithError(error: unknown): void {\n if (this.isCompleted) return;\n this.isCompleted = true;\n this.finalizeReject(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n\n private tryResolveCompleted(): void {\n if (this.isCompleted) return;\n const noActive = this.activeOperations === 0;\n const noPending = this.pendingActivations === 0;\n const aborted = !!this.options?.abortSignal?.aborted;\n\n if ((noPending && noActive) || (aborted && noActive && !noPending)) {\n // When completing due to abort, mark all remaining queued tasks as aborted\n if (aborted) {\n const queuedTasks = this.qGetQueuedTasks();\n\n for (const task of [...queuedTasks]) {\n const alreadyTracked = this.failedTasks?.some(\n ft => ft.task === task\n );\n if (!alreadyTracked) {\n this.pushFailedTask({\n task,\n error: new Error(\n 'Task aborted - not started due to abort signal'\n ),\n aborted: true,\n });\n }\n }\n\n this.isCompleted = true;\n // Announce the ending ONLY when nothing else did. An abort that\n // lands after the queue already drained still ends through a real\n // activation, which emitted its own `queueLength === 0` response;\n // adding a second one there would double-count the hop, race two\n // terminal flushes against each other, and open a second root span\n // for one run. It is the queued-work case — where no activation\n // ever settles to zero — that would otherwise wait forever.\n if (!noPending) this.emitAbortedResponse();\n this.finalizeReject(new Error('Stimulation aborted'));\n return;\n }\n\n this.isCompleted = true;\n // If there are failed tasks or onResponse error, reject the promise\n // Otherwise resolve it\n const failedCount = this.failedTasks?.length ?? 0;\n if (failedCount > 0 || this.onResponseError) {\n const error =\n this.onResponseError ||\n new Error(\n `Stimulation completed with ${failedCount} failed task(s)`\n );\n this.finalizeReject(error);\n } else {\n this.finalizeResolve();\n }\n }\n }\n\n public waitUntilComplete(): Promise<void> {\n if (this.completed) return this.completed;\n // Already completed before anyone awaited: hand back a settled promise.\n if (this.isCompleted) {\n this.completed = this.completionRejected\n ? Promise.reject(this.completionError)\n : Promise.resolve();\n return this.completed;\n }\n // Materialize the promise now and capture its resolvers for later.\n this.completed = new Promise<void>((resolve, reject) => {\n this.resolveCompleted = resolve;\n this.rejectCompleted = reject;\n });\n return this.completed;\n }\n\n /**\n * Returns all current activation tasks: queued, active, and pending (scheduled but not yet enqueued)\n */\n public getAllActivationTasks(): TCNSNeuronActivationTask<TNeuron>[] {\n const queuedTasks = this.qGetQueuedTasks();\n const activeTasks = this.activeTasks ?? EMPTY_TASKS;\n const pendingTasks = this.pendingTasks ?? EMPTY_TASKS;\n return [...queuedTasks, ...activeTasks, ...pendingTasks];\n }\n\n private getSubscribers(collateral: ICNSCollateral<unknown>): TCNSSubscriber<TNeuron, TDendrite>[] {\n return this.subscribersByCollateralIndex[collateral.index] ?? (EMPTY_SUBSCRIBERS as TCNSSubscriber<TNeuron, TDendrite>[]);\n }\n\n private addPositionedTask(\n tasks: TCNSNeuronActivationTask<TNeuron>[],\n task: TCNSNeuronActivationTask<TNeuron>,\n positionKey: symbol\n ): void {\n (task as any)[positionKey] = tasks.length;\n tasks.push(task);\n }\n\n private removePositionedTask(\n tasks: TCNSNeuronActivationTask<TNeuron>[] | undefined,\n task: TCNSNeuronActivationTask<TNeuron>,\n positionKey: symbol\n ): void {\n if (tasks === undefined) return;\n const position = (task as any)[positionKey] as number | undefined;\n if (position === undefined || tasks[position] !== task) return;\n const lastTask = tasks.pop()!;\n if (lastTask !== task) {\n tasks[position] = lastTask;\n (lastTask as any)[positionKey] = position;\n }\n (task as any)[positionKey] = undefined;\n }\n\n private removeActiveTask(task: TCNSNeuronActivationTask<TNeuron>): void {\n this.removePositionedTask(this.activeTasks, task, TASK_ACTIVE_POSITION);\n }\n\n private removePendingTask(task: TCNSNeuronActivationTask<TNeuron>): void {\n this.removePositionedTask(this.pendingTasks, task, TASK_PENDING_POSITION);\n }\n\n /**\n * Returns all tasks that failed or were aborted\n */\n public getFailedTasks(): Array<TCNSNeuronActivationTaskFailure<TNeuron>> {\n return this.failedTasks ? [...this.failedTasks] : [];\n }\n\n /**\n * The current outstanding frontier — every task that has not completed:\n * queued, active, and pending (awaiting an async onResponse), plus any\n * failed/aborted tasks. This is the set to persist for resume: re-activating\n * it re-runs exactly the not-yet-done work. Safe to call at any point during\n * a run (for progress) or after it fails.\n *\n * Each task appears exactly once. The two sources overlap: aborting marks\n * every still-queued task as failed without dequeuing it, so a task sits in\n * the ring buffer AND in failedTasks. Concatenating them blindly handed the\n * broker a checkpoint with the whole queued frontier listed twice, and the\n * resumed run re-executed every one of those tasks a second time - duplicate\n * charges, emails and POSTs on every graceful shutdown.\n */\n public getOutstandingTasks(): TCNSNeuronActivationTask<TNeuron>[] {\n const seen = new Set<TCNSNeuronActivationTask<TNeuron>>();\n const outstanding: TCNSNeuronActivationTask<TNeuron>[] = [];\n const add = (task: TCNSNeuronActivationTask<TNeuron>) => {\n if (seen.has(task)) return;\n seen.add(task);\n outstanding.push(task);\n };\n for (const task of this.getAllActivationTasks()) add(task);\n for (const failure of this.getFailedTasks()) add(failure.task);\n return outstanding;\n }\n\n /**\n * Enqueue activation tasks directly into the stimulation queue\n */\n public enqueueTasks(\n tasks: TCNSNeuronActivationTask<TNeuron>[]\n ): void {\n this.beginTurn();\n try {\n for (const task of tasks) {\n this.qEnqueue(task);\n }\n this.tryResolveCompleted();\n } finally {\n this.endTurn();\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 createSubscriberQueueItem(\n subscriber: TCNSSubscriber<TNeuron, TDendrite>,\n inputSignal?: TCNSSignal<ICNSCollateral<unknown>>\n ) {\n const neuronVisitCounts = this.neuronVisitCounts;\n if (neuronVisitCounts !== undefined) {\n const neuronIndex = subscriber.neuron.index;\n const neuronVisitCount = neuronVisitCounts[neuronIndex] ?? 0;\n if (neuronVisitCount >= this.options!.maxNeuronHops!) {\n throw new Error(\n `Max neuron hops reached when trying to enqueue subscriber`\n );\n }\n neuronVisitCounts[neuronIndex] = neuronVisitCount + 1;\n }\n\n const neuronActivationTask: TCNSNeuronActivationTask<TNeuron> = {\n neuron: subscriber.neuron,\n dendriteCollateral: subscriber.dendrite.collateral as ICNSCollateral<unknown>,\n input: inputSignal,\n };\n // Cache the resolved subscriber so executeActivationTask can skip the\n // lookup (invisible to JSON/spread thanks to the Symbol key).\n (neuronActivationTask as any)[TASK_DENDRITE] = subscriber;\n (neuronActivationTask as any)[TASK_ACTIVE_POSITION] = undefined;\n (neuronActivationTask as any)[TASK_PENDING_POSITION] = undefined;\n return neuronActivationTask;\n }\n\n private executeActivationTask(\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ) {\n // Fast path: tasks we created carry their resolved subscriber. Tasks\n // supplied externally via activate() don't, so fall back to a lookup.\n let subscriber = (neuronActivationTask as any)[TASK_DENDRITE] as\n | TCNSSubscriber<TNeuron, TDendrite>\n | undefined;\n if (!subscriber) {\n const subscribers = this.getSubscribers(\n neuronActivationTask.dendriteCollateral\n );\n for (let i = 0; i < subscribers.length; i++) {\n if (subscribers[i].neuron === neuronActivationTask.neuron) {\n subscriber = subscribers[i];\n break;\n }\n }\n }\n if (!subscriber) {\n // Task failed: subscriber not found\n const error = new Error(`Subscriber not found for activation task`);\n this.pushFailedTask({\n task: neuronActivationTask,\n error,\n aborted: false,\n });\n // Report it like every other failure. Skipping this left a lookup\n // failure invisible to listeners, so one in the tail ended the\n // stimulation without a final response and queueLength never hit 0.\n // Reported from the thunk, not inline: pump only decrements\n // activeOperations before invoking what we return.\n return () => {\n this.processResponseOrResponses(\n undefined,\n neuronActivationTask.input,\n undefined,\n error,\n undefined,\n neuronActivationTask.activationContext\n );\n };\n }\n\n const neuron = subscriber.neuron;\n const dendrite = subscriber.dendrite as TDendrite;\n\n const inputSignal = neuronActivationTask.input;\n\n // Fast path: with no per-neuron concurrency limit there is nothing to\n // gate, so run inline instead of allocating a starter thunk and going\n // through the queue.\n const concurrency = (neuron as { concurrency?: number }).concurrency;\n if (concurrency === undefined || concurrency <= 0) {\n return this.runStarter(\n neuron,\n dendrite,\n inputSignal,\n neuronActivationTask\n );\n }\n return this.instanceNeuronQueue.run(neuron, () =>\n this.runStarter(\n neuron,\n dendrite,\n inputSignal,\n neuronActivationTask\n )\n );\n }\n\n private runStarter(\n neuron: TNeuron,\n dendrite: TDendrite,\n inputSignal: TCNSSignal<ICNSCollateral<unknown>> | undefined,\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ): (() => void) | Promise<() => void> {\n let response: TCNSNeuronResponseReturn<TCNSAxon>;\n // The single point where a dendrite response is entered — so one stamp here\n // covers the sync, async, throw and rejection paths alike.\n //\n // Read only when something will look at it. Both this stamp and the\n // `Date.now()` that turns it into a duration escape solely into the\n // response object, which is built only when a listener exists: with none,\n // `processResponse` returns at its fast path without touching either. A\n // synchronous organism with no observer is the engine's headline case and\n // should not pay two clock reads per hop for numbers nobody reads.\n const startedAt = this.onResponse === undefined ? undefined : Date.now();\n try {\n response = dendrite.response(\n inputSignal?.payload,\n neuron.axon,\n new CNSDendriteContext(\n this,\n this.options?.abortSignal,\n this.cns,\n neuronActivationTask\n ) as any\n );\n } catch (error) {\n // Sync error occurred\n const isAborted = this.options?.abortSignal?.aborted ?? false;\n this.pushFailedTask({\n task: neuronActivationTask,\n error:\n error instanceof Error\n ? error\n : new Error(String(error)),\n aborted: isAborted,\n });\n // Deferred to the thunk so the response is built after pump has\n // decremented activeOperations for this task - otherwise the error\n // response reports one in-flight operation too many.\n return () => {\n this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n undefined,\n error,\n startedAt,\n neuronActivationTask.activationContext\n );\n };\n }\n\n const maxDuration = (neuron as any).maxDuration as\n | number\n | undefined;\n\n if (response instanceof Promise || maxDuration) {\n // Only materialize a Promise on the genuinely async path. The\n // sync path below never touches these, so building them here\n // would allocate a throwaway Promise on every activation.\n const asPromise: Promise<\n | TCNSSignal<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[]\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<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[]\n | undefined\n >((resolve, reject) => {\n const t = setTimeout(() => {\n const err = new Error(\n `Neuron 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 return timedPromise.then(\n signal => {\n return () => {\n return this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n signal as\n | TCNSSignal<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[]\n | undefined,\n undefined,\n startedAt,\n neuronActivationTask.activationContext\n );\n };\n },\n error => {\n return () => {\n // Track failed task\n const isAborted =\n this.options?.abortSignal?.aborted ?? false;\n this.pushFailedTask({\n task: neuronActivationTask,\n error:\n error instanceof Error\n ? error\n : new Error(String(error)),\n aborted: isAborted,\n });\n return this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n undefined,\n error,\n startedAt,\n neuronActivationTask.activationContext\n );\n };\n }\n );\n } else {\n return () => {\n return this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n response as\n | TCNSSignal<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[]\n | undefined,\n undefined,\n startedAt,\n neuronActivationTask.activationContext\n );\n };\n }\n }\n\n protected processResponseOrResponses(\n emitter: TNeuron | undefined,\n inputSignal?: TCNSSignal<ICNSCollateral<unknown>>,\n outputSignalOrSignals?:\n | TCNSSignal<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[],\n error?: any,\n startedAt?: number,\n // The store of the activation that produced this response — the same\n // object its own handler reads as `ctx.activationContext`. Carried so a\n // recorder can put it in the task's history row without having to hold\n // the task itself.\n activationContext?: TCNSContextStore\n ): void {\n // The activation settled HERE, once, whatever it returned. Measuring\n // inside the per-signal loop below would charge each later signal for the\n // synchronous subtree the earlier ones already drained — one activation\n // reported as several, each longer than the last.\n const duration =\n startedAt === undefined ? undefined : Date.now() - startedAt;\n\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(\n emitter,\n inputSignal,\n undefined,\n error,\n startedAt,\n duration,\n activationContext\n );\n return;\n }\n\n // Reserve the whole fan-out before dispatching any of it. Counted in\n // activations rather than signals, so pre-resolve each signal's\n // subscriber count - getSubscribers is a single map lookup. On the\n // error path processResponse schedules nothing, so nothing is reserved.\n let perSignal: number[] | undefined;\n if (!error) {\n perSignal = new Array<number>(outputSignalOrSignals.length);\n let reserved = 0;\n for (let i = 0; i < outputSignalOrSignals.length; i++) {\n const c = outputSignalOrSignals[i]?.collateral;\n const n = c\n ? this.getSubscribers(c).length\n : 0;\n perSignal[i] = n;\n reserved += n;\n }\n this.reservedActivations += reserved;\n }\n // The increment/decrement pair is balanced per level, so a nested\n // fan-out inside signal[0]'s subtree composes correctly.\n let dispatchIndex = 0;\n try {\n for (\n ;\n dispatchIndex < outputSignalOrSignals.length;\n dispatchIndex++\n ) {\n if (perSignal)\n this.reservedActivations -= perSignal[dispatchIndex];\n this.processResponse(\n emitter,\n inputSignal,\n outputSignalOrSignals[dispatchIndex],\n error,\n startedAt,\n duration,\n activationContext\n );\n }\n } finally {\n // A throw out of a dispatch (the hop-limit guard) skips the\n // decrements for the signals we never reached. Leaving them\n // reserved keeps pendingActivations permanently above zero, so\n // every later count - the drain payload, the completion check -\n // reports work that will never exist. Release the remainder on\n // the way out; on the normal path dispatchIndex is past the\n // end and this loop does nothing.\n if (perSignal) {\n for (\n let j = dispatchIndex + 1;\n j < perSignal.length;\n j++\n ) {\n this.reservedActivations -= perSignal[j];\n }\n }\n }\n return;\n }\n\n // Handle single signal\n this.processResponse(\n emitter,\n inputSignal,\n outputSignalOrSignals,\n error,\n startedAt,\n duration,\n activationContext\n );\n }\n\n /**\n * The one response an aborted run emits: no neuron, no signals, an empty\n * queue. It exists so `queueLength === 0` — the completion condition every\n * listener uses — is reached on the abort path too. Listener errors are\n * swallowed: the run is already over and rejecting, and there is nothing\n * left to fail.\n */\n private emitAbortedResponse(): void {\n const onResponse = this.onResponse;\n if (!onResponse) return;\n\n try {\n void onResponse(\n new CNSStimulationResponseImpl(\n this,\n undefined,\n undefined,\n 0,\n 0,\n 0,\n undefined,\n new Error('Stimulation aborted'),\n undefined,\n undefined,\n undefined\n ) as TCNSStimulationResponse\n );\n } catch (e) {\n this.onResponseError =\n e instanceof Error ? e : new Error(String(e));\n }\n }\n\n protected processResponse(\n emitter: TNeuron | undefined,\n inputSignal?: TCNSSignal<ICNSCollateral<unknown>>,\n outputSignal?: TCNSSignal<ICNSCollateral<unknown>>,\n error?: any,\n startedAt?: number,\n duration?: number,\n activationContext?: TCNSContextStore\n ): void {\n const collateral = outputSignal?.collateral;\n // `getSubscribers` already answers with a shared empty array, and a\n // response with no output collateral is every terminal and every failed\n // one — so neither branch should allocate.\n const subscribers = collateral\n ? this.getSubscribers(collateral)\n : EMPTY_SUBSCRIBERS;\n const onResponse = this.onResponse;\n\n // Fast path: with no response listener there is nothing to observe the\n // intermediate state, so we skip building the response object and\n // tracking pending tasks.\n if (!onResponse) {\n if (collateral && !error) {\n const n = subscribers.length;\n if (n > 0) {\n const tasks: TCNSNeuronActivationTask<TNeuron>[] =\n new Array(n);\n for (let i = 0; i < n; i++) {\n tasks[i] = this.createSubscriberQueueItem(\n subscribers[i],\n outputSignal\n );\n }\n this.scheduledCount += n;\n for (let i = 0; i < n; i++) {\n this.scheduledCount--;\n this.qEnqueue(tasks[i]);\n }\n }\n }\n this.tryResolveCompleted();\n return;\n }\n\n // Built only when there is something to put in it. A response that\n // schedules nothing — a sink neuron, a failure, the terminal signal —\n // hands the shared empty array to the response object instead.\n let subscriberActivationTasks: TCNSNeuronActivationTask<TNeuron>[] =\n EMPTY_TASKS as TCNSNeuronActivationTask<TNeuron>[];\n\n if (collateral && !error && subscribers.length > 0) {\n // Held in `pendingTasks` from the moment they exist, not only while\n // an async listener parks them: `queueLength` counts them as pending\n // activations immediately, and `getAllActivationTasks()` has to\n // agree with that count — a synchronous listener can read both.\n const pending = (this.pendingTasks ??= []);\n subscriberActivationTasks = new Array(subscribers.length);\n for (let i = 0; i < subscribers.length; i++) {\n const task = this.createSubscriberQueueItem(\n subscribers[i],\n outputSignal\n );\n subscriberActivationTasks[i] = task;\n this.addPositionedTask(pending, task, TASK_PENDING_POSITION);\n }\n }\n this.scheduledCount += subscriberActivationTasks.length;\n\n // After we pre-enqueued all subscribers, we can trace the response\n let maybePromise: void | Promise<void>;\n try {\n maybePromise = onResponse(\n new CNSStimulationResponseImpl(\n this,\n inputSignal,\n outputSignal,\n this.pendingActivations + this.activeOperations,\n this.pendingActivations,\n this.activeOperations,\n this.options?.maxNeuronHops && emitter\n ? this.neuronVisitCounts?.[emitter.index] ?? 0\n : undefined,\n error,\n emitter,\n startedAt,\n duration,\n subscriberActivationTasks,\n activationContext\n ) as TCNSStimulationResponse\n );\n } catch (e) {\n // Remember the error but don't reject immediately - wait for all tasks to complete\n this.onResponseError =\n e instanceof Error ? e : new Error(String(e));\n // Still enqueue subscribers and continue processing\n for (let i = 0; i < subscriberActivationTasks.length; i++) {\n this.scheduledCount--;\n this.removePendingTask(subscriberActivationTasks[i]);\n this.qEnqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n return;\n }\n\n // If onResponse returned a promise, wait for it before enqueuing subscribers\n if (maybePromise && typeof maybePromise.then === 'function') {\n // These tasks stay in scheduledCount until the listener settles, so\n // they keep reading as pending activations - correctly: they exist,\n // and their dendrite response has not been invoked.\n (maybePromise as Promise<void>).then(\n () => {\n // Resuming from a settled listener starts a fresh turn, the\n // same as resuming from a settled neuron body.\n this.beginTurn();\n try {\n for (\n let i = 0;\n i < subscriberActivationTasks.length;\n i++\n ) {\n this.scheduledCount--;\n this.removePendingTask(\n subscriberActivationTasks[i]\n );\n this.qEnqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n } finally {\n this.endTurn();\n }\n },\n error => {\n // Remember the error but don't reject immediately - wait for all tasks to complete\n this.onResponseError =\n error instanceof Error\n ? error\n : new Error(String(error));\n this.beginTurn();\n try {\n // Still enqueue subscribers and continue processing\n for (\n let i = 0;\n i < subscriberActivationTasks.length;\n i++\n ) {\n this.scheduledCount--;\n this.removePendingTask(\n subscriberActivationTasks[i]\n );\n this.qEnqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n } finally {\n this.endTurn();\n }\n }\n );\n return;\n }\n\n // Sync path: enqueue subscribers immediately\n for (let i = 0; i < subscriberActivationTasks.length; i++) {\n this.scheduledCount--;\n this.removePendingTask(subscriberActivationTasks[i]);\n this.qEnqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n }\n\n public responseToSignal(\n signalOrSignals:\n | TCNSSignal<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[]\n ): void {\n // The initial dispatch is a turn: everything reachable synchronously from\n // this signal runs before stimulate() returns, and the drain that follows\n // is the first batch boundary.\n this.beginTurn();\n try {\n // Handle array of signals\n if (Array.isArray(signalOrSignals)) {\n // For initial stimulation: signals are outputs (to find subscribers)\n // In onResponse, inputSignal will be undefined for initial stimulation\n this.processResponseOrResponses(\n undefined,\n undefined,\n signalOrSignals\n );\n return;\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, undefined, signalOrSignals);\n this.tryResolveCompleted();\n } finally {\n this.endTurn();\n }\n }\n}\n","export class CNSInstanceNeuronQueue<\n TNeuron extends { readonly index: number; concurrency?: number }\n> {\n private readonly gatesByNeuronIndex: { limit: number; active: number; waiters: (() => void)[] }[] = [];\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.gatesByNeuronIndex[neuron.index];\n if (!gate) {\n gate = { limit, active: 0, waiters: [] };\n this.gatesByNeuronIndex[neuron.index] = gate;\n } else {\n gate.limit = limit;\n }\n const ownGate = gate;\n\n const wrap = (cb: () => void) => {\n return () => {\n try {\n cb();\n } finally {\n ownGate.active = Math.max(0, ownGate.active - 1);\n if (ownGate.waiters.length > 0) {\n const next = ownGate.waiters.shift()!;\n next();\n }\n }\n };\n };\n\n if (ownGate.active < ownGate.limit) {\n ownGate.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 ownGate.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 ownGate.waiters.push(starter);\n });\n }\n}\n","import type { TCNSAfferentPath, TCNSModality } from '@cnstra/types';\nimport type { TCNSModalitySelection } from '../types/TCNSModalitySelection';\n\nexport function cnsResolveModalityHandler(\n modalitySelection: TCNSModalitySelection,\n modality: TCNSModality | undefined,\n afferentPath: TCNSAfferentPath | undefined\n): ((payload: any, axon: any, ctx: any) => any) | undefined {\n if (modality !== undefined) {\n const modalityConfigs = modalitySelection.modalityConfigs;\n for (let i = 0; i < modalityConfigs.length; i++) {\n const modalityConfig = modalityConfigs[i];\n if (modalityConfig.modality !== modality) continue;\n for (let path = afferentPath; path !== undefined; path = path.parentAfferentPath) {\n const handler = modalityConfig.afferentPaths?.get(path);\n if (handler !== undefined) return handler;\n }\n if (modalityConfig.default !== undefined) return modalityConfig.default;\n break;\n }\n }\n return modalitySelection.defaultHandler;\n}\n","export function cnsComposeModalityResponse(\n handler: (payload: any, axon: any, ctx: any) => any,\n output: (result: any, axon: any, ctx: any) => any\n): (payload: any, axon: any, ctx: any) => any {\n return (payload, axon, ctx) => {\n const maybeResult = handler(payload, axon, ctx);\n if (maybeResult && typeof maybeResult.then === 'function') {\n return maybeResult.then((result: any) => output(result, axon, ctx));\n }\n try {\n return output(maybeResult, axon, ctx);\n } catch (error) {\n if (error instanceof Error && error.message.includes('Cannot read properties of undefined')) {\n const axonKeys = axon && typeof axon === 'object' ? Object.keys(axon) : 'not an object';\n throw new Error(\n `modalityDendrite: axon.output is undefined. Axon type: ${typeof axon}, Axon keys: ${\n Array.isArray(axonKeys) ? axonKeys.join(', ') : axonKeys\n }. Make sure the neuron was created with the correct axon structure. Original error: ${\n error.message\n }`\n );\n }\n throw error;\n }\n };\n}\n","import type { ICNSCollateral, TCNSAfferentPath, TCNSModality } from '@cnstra/types';\nimport { TCNSNeuron } from '@cnstra/types';\nimport type { TCNSModalitySelection } from './types/TCNSModalitySelection';\nimport { cnsResolveModalityHandler } from './utils/cnsResolveModalityHandler';\nimport { cnsComposeModalityResponse } from './utils/cnsComposeModalityResponse';\nimport { TCNSSubscriber } from '@cnstra/types';\nimport { TCNSDendrite } from '@cnstra/types';\n\n/** The answer for a collateral with no subscribers. Never mutated. */\nconst NO_SUBSCRIBERS: any[] = [];\n\nexport class CNSNetwork<\n TNeuron extends TCNSNeuron<any>,\n TDendrite extends TCNSDendrite<any, any, any>\n> {\n /**\n * Strongly Connected Components of the neuron graph.\n * Each component is a set of neuron objects that can reach each other.\n *\n * Computed lazily on first access: the SCC machinery only drives graph\n * introspection (`getSCCSetByNeuron`, `canNeuronBeGuaranteedDone`), so a\n * network that never inspects reachability never pays for it.\n */\n private _stronglyConnectedComponents: Set<TNeuron>[] = [];\n private sccBuilt = false;\n\n public get stronglyConnectedComponents(): Set<TNeuron>[] {\n this.buildSccIndex();\n return this._stronglyConnectedComponents;\n }\n\n /**\n * Quick lookup: neuron -> SCC index for fast reachability checks.\n */\n private neuronToSCC = new Map<TNeuron, 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 * Fast lookup: collateral -> list of (neuron, dendrite) subscribers.\n * Built once at construction time.\n */\n private subscribersByCollateralIndex: TCNSSubscriber<TNeuron, TDendrite>[][] = [];\n\n private allSubscribersByCollateralIndex: TCNSSubscriber<TNeuron, TDendrite>[][] = [];\n\n private modalityCollateralIndices: number[] = [];\n\n private subscriberTablesByModalityIndex: TCNSSubscriber<TNeuron, TDendrite>[][][][] = [];\n\n private parentNeuronByCollateral = new Map<ICNSCollateral<unknown>, TNeuron>();\n\n constructor(private readonly neurons: TNeuron[]) {\n // Indexes are needed on the hot path (subscriber/parent lookups), so they\n // are built eagerly. SCC analysis is deferred until first use.\n this.buildIndexes();\n }\n\n /** Build the SCC analysis the first time anything needs it. */\n private buildSccIndex(): void {\n if (this.sccBuilt) return;\n this.sccBuilt = true;\n this.buildSCC();\n }\n\n /**\n * Build the neuron graph where neurons are connected if one can stimulate the other.\n */\n private buildNeuronGraph(): Map<TNeuron, Set<TNeuron>> {\n const graph = new Map<TNeuron, Set<TNeuron>>();\n\n // Initialize graph\n for (const neuron of this.neurons) {\n graph.set(neuron, 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<TNeuron>();\n\n // Check what collaterals this neuron can emit\n for (const axonKey in neuron.axon) {\n const collateral = neuron.axon[axonKey];\n\n // Find which neurons listen to this collateral\n const subscribers = this.allSubscribersByCollateralIndex[\n (collateral as ICNSCollateral<unknown>).index\n ];\n if (subscribers) {\n for (const { neuron: targetNeuron } of subscribers) {\n reachableNeurons.add(targetNeuron);\n }\n }\n }\n\n graph.set(neuron, 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\n // Tarjan's algorithm for SCC\n const index = new Map<TNeuron, number>();\n const lowlink = new Map<TNeuron, number>();\n const onStack = new Set<TNeuron>();\n const stack: TNeuron[] = [];\n const components: Set<TNeuron>[] = [];\n let currentIndex = 0;\n\n const strongConnect = (neuron: TNeuron) => {\n index.set(neuron, currentIndex);\n lowlink.set(neuron, currentIndex);\n currentIndex++;\n stack.push(neuron);\n onStack.add(neuron);\n\n const neighbors = graph.get(neuron) || new Set();\n for (const neighbor of Array.from(neighbors)) {\n if (!index.has(neighbor)) {\n strongConnect(neighbor);\n lowlink.set(\n neuron,\n Math.min(lowlink.get(neuron)!, lowlink.get(neighbor)!)\n );\n } else if (onStack.has(neighbor)) {\n lowlink.set(\n neuron,\n Math.min(lowlink.get(neuron)!, index.get(neighbor)!)\n );\n }\n }\n\n if (lowlink.get(neuron) === index.get(neuron)) {\n const component = new Set<TNeuron>();\n let w: TNeuron;\n do {\n w = stack.pop()!;\n onStack.delete(w);\n component.add(w);\n } while (w !== neuron);\n components.push(component);\n }\n };\n\n // Run Tarjan's algorithm on all unvisited neurons\n for (const neuron of this.neurons) {\n if (!index.has(neuron)) {\n strongConnect(neuron);\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 Array.from(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<TNeuron, Set<TNeuron>>): 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 neuron of Array.from(scc)) {\n const neighbors = neuronGraph.get(neuron) || new Set();\n\n for (const neighbor of Array.from(neighbors)) {\n const neighborSccIndex = this.neuronToSCC.get(neighbor);\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 // Build forward adjacency (source SCC -> target SCCs) once, instead of\n // re-deriving it per node by scanning the whole DAG. sccDag stores the\n // reverse edges (target -> sources that can reach it).\n const n = this._stronglyConnectedComponents.length;\n const forward: number[][] = Array.from({ length: n }, () => []);\n const inDegree = new Map<number, number>();\n const queue: number[] = [];\n\n for (let target = 0; target < n; target++) {\n const sources = this.sccDag.get(target) || new Set();\n inDegree.set(target, sources.size);\n if (sources.size === 0) queue.push(target);\n for (const source of Array.from(sources)) {\n forward[source].push(target);\n }\n }\n\n // Process nodes in topological order\n while (queue.length > 0) {\n const current = queue.shift()!;\n const currentAncestors = this.sccAncestors.get(current)!;\n\n for (const neighbor of forward[current]) {\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 for (const ancestor of Array.from(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 * 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 getSCCSetByNeuron(neuron: TNeuron) {\n this.buildSccIndex();\n const sccIndex = this.neuronToSCC.get(neuron);\n\n if (sccIndex === undefined) return;\n\n return this._stronglyConnectedComponents[sccIndex];\n }\n\n /**\n * Get the SCC index for a given neuron\n */\n public getSccIndexByNeuron(neuron: TNeuron): number | undefined {\n this.buildSccIndex();\n return this.neuronToSCC.get(neuron);\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 neuron: TNeuron,\n activeSccCounts: Map<number, number>\n ): boolean {\n this.buildSccIndex();\n const sccIndex = this.neuronToSCC.get(neuron);\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 Array.from(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 private describeNeuron(neuron: TNeuron): string {\n const axonKeys = Object.keys(neuron.axon);\n return `neuron #${neuron.index} (${axonKeys.length === 0 ? 'no axon' : `axon: ${axonKeys.join(', ')}`})`;\n }\n\n private describeCollateral(neuron: TNeuron, collateral: ICNSCollateral<unknown>): string {\n const axonKey = Object.keys(neuron.axon).find(key => neuron.axon[key] === collateral);\n return `\"${axonKey}\" #${collateral.index}`;\n }\n\n private buildIndexes() {\n this.allSubscribersByCollateralIndex = [];\n this.modalityCollateralIndices = [];\n this.subscriberTablesByModalityIndex = [];\n this.parentNeuronByCollateral.clear();\n const listedNeurons = new Set<TNeuron>();\n for (const neuron of this.neurons) {\n if (listedNeurons.has(neuron)) {\n throw new Error(`${this.describeNeuron(neuron)} is listed twice; every dendrite of it would run twice`);\n }\n listedNeurons.add(neuron);\n for (const dendrite of neuron.dendrites) {\n const index = (dendrite.collateral as ICNSCollateral<unknown>).index;\n const subscribers = (this.allSubscribersByCollateralIndex[index] ??= []);\n subscribers.push({ neuron, dendrite: dendrite as TDendrite } as TCNSSubscriber<TNeuron, TDendrite>);\n if ((dendrite as { modalitySelection?: TCNSModalitySelection }).modalitySelection !== undefined\n && this.modalityCollateralIndices.indexOf(index) < 0) {\n this.modalityCollateralIndices.push(index);\n }\n }\n Object.values(neuron.axon).forEach(collateral => {\n const owner = this.parentNeuronByCollateral.get(collateral as ICNSCollateral<unknown>);\n if (owner !== undefined && owner !== neuron) {\n throw new Error(\n `collateral ${this.describeCollateral(neuron, collateral as ICNSCollateral<unknown>)} is in the axons of ${this.describeNeuron(owner)} and ${this.describeNeuron(neuron)}; a collateral is owned by one neuron`\n );\n }\n this.parentNeuronByCollateral.set(\n collateral as ICNSCollateral<unknown>,\n neuron\n );\n });\n }\n this.subscribersByCollateralIndex = this.buildSubscriberTable(undefined, undefined);\n }\n\n public getSubscriberTable(\n modality: TCNSModality | undefined,\n afferentPath: TCNSAfferentPath | undefined\n ): TCNSSubscriber<TNeuron, TDendrite>[][] {\n if (modality === undefined) return this.subscribersByCollateralIndex;\n const subscriberTablesByAfferentPathIndex = (this.subscriberTablesByModalityIndex[modality.index] ??= []);\n const afferentPathSlot = afferentPath === undefined ? 0 : afferentPath.index + 1;\n return (subscriberTablesByAfferentPathIndex[afferentPathSlot] ??= this.buildSubscriberTable(modality, afferentPath));\n }\n\n private buildSubscriberTable(\n modality: TCNSModality | undefined,\n afferentPath: TCNSAfferentPath | undefined\n ): TCNSSubscriber<TNeuron, TDendrite>[][] {\n const subscriberTable = this.allSubscribersByCollateralIndex.slice();\n const modalityCollateralIndices = this.modalityCollateralIndices;\n for (let i = 0; i < modalityCollateralIndices.length; i++) {\n const index = modalityCollateralIndices[i];\n const resolvedSubscribers: TCNSSubscriber<TNeuron, TDendrite>[] = [];\n const subscribers = this.allSubscribersByCollateralIndex[index];\n for (let j = 0; j < subscribers.length; j++) {\n const subscriber = subscribers[j];\n const modalitySelection = (subscriber.dendrite as { modalitySelection?: TCNSModalitySelection }).modalitySelection;\n if (modalitySelection === undefined) {\n resolvedSubscribers.push(subscriber);\n continue;\n }\n const handler = cnsResolveModalityHandler(modalitySelection, modality, afferentPath);\n if (handler === undefined) continue;\n resolvedSubscribers.push({\n neuron: subscriber.neuron,\n dendrite: {\n collateral: subscriber.dendrite.collateral,\n response: cnsComposeModalityResponse(handler, modalitySelection.output),\n } as TDendrite,\n } as TCNSSubscriber<TNeuron, TDendrite>);\n }\n subscriberTable[index] = resolvedSubscribers;\n }\n return subscriberTable;\n }\n\n public getParentNeuronByCollateral(collateral: ICNSCollateral<unknown>) {\n return this.parentNeuronByCollateral.get(collateral);\n }\n\n // Computed on demand (rarely used): one dendrite per collateral, last wins —\n // preserving the previous index semantics without building it every construct.\n public getDendrites() {\n const byCollateral = new Map<ICNSCollateral<unknown>, TDendrite>();\n for (const neuron of this.neurons) {\n for (const dendrite of neuron.dendrites) {\n byCollateral.set(\n dendrite.collateral as ICNSCollateral<unknown>,\n dendrite as TDendrite\n );\n }\n }\n return Array.from(byCollateral.values());\n }\n\n public getCollaterals() {\n const collaterals = new Set<ICNSCollateral<unknown>>();\n for (const neuron of this.neurons) {\n for (const collateral of Object.values(neuron.axon)) {\n collaterals.add(collateral as ICNSCollateral<unknown>);\n }\n }\n return Array.from(collaterals);\n }\n\n public getSubscribers(\n collateral: ICNSCollateral<unknown>\n ): TCNSSubscriber<TNeuron, TDendrite>[] {\n // Shared empty array rather than a new one: every leaf of every run asks\n // about a collateral nobody subscribes to, and each answer was an\n // allocation.\n return this.subscribersByCollateralIndex[collateral.index] ?? NO_SUBSCRIBERS;\n }\n}\n","import type { ICNSCollateral } from '@cnstra/types';\nimport { TCNSNeuron } from '@cnstra/types';\nimport { TCNSDendrite } from '@cnstra/types';\nimport { TCNSOptions } from '@cnstra/types';\nimport { TCNSStimulationOptions } from '@cnstra/types';\nimport { CNSStimulation } from './CNSStimulation';\nimport { TCNSSignal } from '@cnstra/types';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSStimulationResponse } from '@cnstra/types';\nimport { TCNSStimulationDrain } from '@cnstra/types';\nimport { TCNSNeuronActivationTask } from '@cnstra/types';\nimport { CNSNetwork } from './CNSNetwork';\nimport { ICNS } from '@cnstra/types';\n\nexport class CNS<\n TNeuron extends TCNSNeuron<any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> implements ICNS<TNeuron, TDendrite>\n{\n /**\n * Network graph analysis and strongly connected components.\n */\n public readonly network: CNSNetwork<TNeuron, TDendrite>;\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 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 /**\n * Global batch-boundary listeners applied to every stimulation.\n */\n private readonly globalDrainListeners: Array<\n (d: TCNSStimulationDrain) => void\n > = [];\n\n private batchDepth = 0;\n\n private batchedDrains: [announce: (drain: TCNSStimulationDrain) => void, drain: TCNSStimulationDrain][] = [];\n\n /**\n * Shared, app/organism-wide value handed to every dendrite as `ctx.global`.\n * Stored untyped (the type is baked into neurons via `cnsNeuronFactory().withGlobal<T>()`);\n * CNS is just a passthrough carrier, so injecting it here never touches the hot path.\n */\n public readonly global?: unknown;\n\n constructor(\n protected readonly neurons: TNeuron[],\n public readonly options?: TCNSOptions,\n global?: unknown\n ) {\n this.network = new CNSNetwork(this.neurons);\n this.global = global;\n }\n\n /** Push a listener onto a list; return an idempotent unsubscribe. */\n private addListener<T>(list: T[], listener: T): () => void {\n list.push(listener);\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n const idx = list.indexOf(listener);\n if (idx >= 0) list.splice(idx, 1);\n };\n }\n\n public addResponseListener(\n listener: (response: TCNSStimulationResponse) => void | Promise<void>\n ): () => void {\n return this.addListener(this.globalResponseListeners, listener);\n }\n\n /**\n * Register a listener called once at the end of every synchronous turn of\n * every stimulation (inside `batch`, when the batch ends) - see {@link TCNSStimulationDrain}. This is how an\n * integration (a state manager, an in-memory database) installs a single\n * commit point for the whole organism instead of passing `onDrain` per call.\n *\n * Returns an unsubscribe function.\n */\n public addDrainListener(\n listener: (drain: TCNSStimulationDrain) => void\n ): () => void {\n return this.addListener(this.globalDrainListeners, listener);\n }\n\n public batch<TResult>(run: () => TResult): TResult {\n this.batchDepth++;\n try {\n return run();\n } finally {\n if (--this.batchDepth === 0) {\n const batchedDrains = this.batchedDrains;\n this.batchedDrains = [];\n for (const [announce, drain] of batchedDrains) announce(drain);\n }\n }\n }\n\n /**\n * Fan a drain out to the local and global listeners, or return undefined when\n * there are none so the stimulation can skip the boundary check entirely.\n *\n * Listener errors are isolated: a drain is a notification, and one broken\n * flush must not stop the others or derail the stimulation that triggered it.\n */\n private wrapOnDrain(\n local?: (drain: TCNSStimulationDrain) => void\n ): ((drain: TCNSStimulationDrain) => void) | undefined {\n if (this.globalDrainListeners.length === 0 && !local) return undefined;\n const announce = (d: TCNSStimulationDrain) => {\n if (local) {\n try {\n local(d);\n } catch (error) {\n console.error('[CNS] onDrain listener threw', error);\n }\n }\n for (let i = 0; i < this.globalDrainListeners.length; i++) {\n try {\n this.globalDrainListeners[i](d);\n } catch (error) {\n console.error('[CNS] drain listener threw', error);\n }\n }\n };\n return (d: TCNSStimulationDrain) => {\n if (this.batchDepth > 0) this.batchedDrains.push([announce, d]);\n else announce(d);\n };\n }\n\n private wrapOnResponse<T>(\n local?: (response: T) => void | Promise<void>\n ): ((response: T) => void | Promise<void>) | undefined {\n if (this.globalResponseListeners.length === 0 && !local) {\n // No listener at all: skip wrapping entirely so the stimulation can\n // take its fast path and avoid building response objects per signal.\n return undefined;\n }\n return (r: T) => {\n // Allocated on first need, not on every response: all three of our\n // own listeners (devtools, otel metrics, otel tracing) are\n // synchronous, and this runs once per signal.\n let promises: Promise<void>[] | undefined;\n\n if (local) {\n try {\n const res = local(r);\n if (res && typeof (res as any).then === 'function') {\n (promises ??= []).push(res as Promise<void>);\n }\n } catch (error) {\n // Sync error from local - wrap in rejected promise\n (promises ??= []).push(Promise.reject(error));\n }\n }\n\n for (let i = 0; i < this.globalResponseListeners.length; i++) {\n try {\n const res = this.globalResponseListeners[i](r);\n if (res && typeof (res as any).then === 'function') {\n (promises ??= []).push(res as Promise<void>);\n }\n } catch (error) {\n // Sync error from global listener - wrap in rejected promise\n (promises ??= []).push(Promise.reject(error));\n }\n }\n\n if (promises) {\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 /** Build a stimulation (wired listeners, unseeded). Shared by stimulate/activate. */\n private createStimulation(\n options?: TCNSStimulationOptions<TCNSStimulationResponse>\n ): CNSStimulation<TNeuron, TDendrite> {\n return new CNSStimulation<TNeuron, TDendrite>(\n this,\n this.instanceNeuronQueue,\n options,\n this.wrapOnResponse(options?.onResponse),\n this.wrapOnDrain(options?.onDrain)\n );\n }\n\n public stimulate(\n signalOrSignals:\n | TCNSSignal<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[],\n options?: TCNSStimulationOptions<TCNSStimulationResponse>\n ): CNSStimulation<TNeuron, TDendrite> {\n const stimulation = this.createStimulation(options);\n stimulation.responseToSignal(signalOrSignals);\n return stimulation;\n }\n\n /**\n * Start a stimulation with activation tasks directly\n */\n public activate(\n tasks: TCNSNeuronActivationTask<TNeuron>[],\n options?: TCNSStimulationOptions<TCNSStimulationResponse>\n ): CNSStimulation<TNeuron, TDendrite> {\n const stimulation = this.createStimulation(options);\n stimulation.enqueueTasks(tasks);\n return stimulation;\n }\n}\n","import type { TCNSNeuron, TCNSOptions } from '@cnstra/types';\nimport { CNS } from './CNS';\n\nexport const createCNS = <TDependencies>(\n neuronFactories: readonly ((dependencies: TDependencies) => TCNSNeuron<any>)[],\n dependencies: TDependencies,\n options?: TCNSOptions\n): CNS<TCNSNeuron<any>> => {\n if (new Set(neuronFactories).size !== neuronFactories.length) {\n throw new Error('createCNS: a neuron factory is listed twice; every dendrite of its neuron would run twice');\n }\n return new CNS(neuronFactories.map(createNeuron => createNeuron(dependencies)), options);\n};\n","import { TCNSSignal } from '@cnstra/types';\nimport { ICNSCollateral } from '@cnstra/types';\n\nlet nextCollateralIndex = 0;\n\nexport class CNSCollateral<TPayload> implements ICNSCollateral<TPayload> {\n public readonly index = nextCollateralIndex++;\n\n createSignal(): TCNSSignal<CNSCollateral<TPayload>>;\n createSignal(payload: TPayload): TCNSSignal<CNSCollateral<TPayload>>;\n createSignal(payload?: TPayload): TCNSSignal<CNSCollateral<TPayload>> {\n return { collateral: this, payload };\n }\n}\n","import type { ICNSCollateral } from '@cnstra/types';\nimport type { CNS } from '../CNS';\n\nimport type { CNSStimulation } from '../CNSStimulation';\nimport type { TCNSDendrite } from '@cnstra/types';\nimport type { TCNSNeuron } from '@cnstra/types';\nimport type { TCNSSignal } from '@cnstra/types';\nimport type { TCNSStimulationOptions } from '@cnstra/types';\nimport type { TCNSStimulationResponse } from '@cnstra/types';\n\nexport type TCNSStimulationGateSignal =\n | TCNSSignal<ICNSCollateral<unknown>>\n | TCNSSignal<ICNSCollateral<unknown>>[];\n\nexport type TCNSStimulationGateOptions<\n TNeuron extends TCNSNeuron<any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> = {\n cns: CNS<TNeuron, TDendrite>;\n signal: TCNSStimulationGateSignal;\n options?: TCNSStimulationOptions<TCNSStimulationResponse>;\n};\n\nexport class CNSStimulationGate<\n TNeuron extends TCNSNeuron<any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> {\n private currentStimulation?: CNSStimulation<TNeuron, TDendrite>;\n private currentDrain?: Promise<void>;\n private currentAbortController?: AbortController;\n\n constructor(\n private readonly guardOptions: TCNSStimulationGateOptions<TNeuron, TDendrite>\n ) {}\n\n public isDraining(): boolean {\n return this.currentDrain !== undefined;\n }\n\n public getCurrentStimulation():\n | CNSStimulation<TNeuron, TDendrite>\n | undefined {\n return this.currentStimulation;\n }\n\n public drain(): Promise<void> {\n if (this.currentDrain) return this.currentDrain;\n\n const stimulation = this.guardOptions.cns.stimulate(\n this.guardOptions.signal,\n this.createStimulationOptions()\n );\n\n const drain = stimulation.waitUntilComplete().finally(() => {\n if (this.currentDrain !== drain) return;\n this.currentDrain = undefined;\n this.currentStimulation = undefined;\n this.currentAbortController = undefined;\n });\n\n this.currentStimulation = stimulation;\n this.currentDrain = drain;\n\n return drain;\n }\n\n public abort(reason?: any): boolean {\n if (!this.currentAbortController) return false;\n if (this.currentAbortController.signal.aborted) return false;\n\n this.currentAbortController.abort(reason);\n return true;\n }\n\n private createStimulationOptions(): TCNSStimulationOptions<TCNSStimulationResponse> {\n const options = this.guardOptions.options;\n\n if (options?.abortSignal) {\n return options;\n }\n\n if (typeof AbortController === 'undefined') {\n return options ?? {};\n }\n\n this.currentAbortController = new AbortController();\n\n return {\n ...options,\n abortSignal: this.currentAbortController.signal,\n };\n }\n}\n","import { CNS } from '../CNS';\nimport { CNSCollateral } from '../CNSCollateral';\nimport type { ICNSCollateral } from '@cnstra/types';\nimport { TCNSAxon } from '@cnstra/types';\nimport { TCNSOptions } from '@cnstra/types';\nimport { TCNSDendrite } from '@cnstra/types';\nimport { TCNSHandlerContext } from '@cnstra/types';\nimport { TCNSNeuronResponseReturn } from '@cnstra/types';\nimport { TCNSNeuron } from '@cnstra/types';\nimport { TCNSModality } from '@cnstra/types';\nimport { TCNSAfferentPath } from '@cnstra/types';\nimport { TCNSStimulationOptions } from '@cnstra/types';\nimport type { TCNSModalitySelection } from '../types/TCNSModalitySelection';\nimport { cnsResolveModalityHandler } from '../utils/cnsResolveModalityHandler';\nimport { cnsComposeModalityResponse } from '../utils/cnsComposeModalityResponse';\n\nlet nextNeuronIndex = 0;\nlet nextAfferentPathIndex = 0;\nlet nextModalityIndex = 0;\n\nexport const cnsCollateral = <TPayload = undefined>() =>\n new CNSCollateral<TPayload>();\n\n// Helper type to extract payload union from an array of collaterals\n// Uses distributive conditional type to properly extract union, not intersection\n// Works with both arrays and tuples\ntype CollateralPayloadUnion<\n TCollaterals extends readonly ICNSCollateral<unknown>[]\n> = {\n [K in keyof TCollaterals]: TCollaterals[K] extends ICNSCollateral<infer P>\n ? P\n : never;\n}[number];\n\ntype InterNeuronAPI<\n TAxonType extends TCNSAxon = TCNSAxon,\n TGlobal = unknown\n> = {\n readonly index: number;\n axon: TAxonType;\n concurrency?: number;\n maxDuration?: number;\n dendrites: TCNSDendrite<\n ICNSCollateral<unknown>,\n TAxonType,\n TGlobal\n >[];\n setConcurrency: (\n n: number | undefined\n ) => InterNeuronAPI<TAxonType, TGlobal>;\n setMaxDuration: (\n ms: number | undefined\n ) => InterNeuronAPI<TAxonType, TGlobal>;\n bind: <TFollowAxon extends Record<string, ICNSCollateral<unknown>>>(\n axon: TFollowAxon,\n dendrites: {\n [K in keyof TFollowAxon]:\n | TCNSDendrite<TFollowAxon[K], TAxonType, TGlobal>\n | TCNSDendrite<\n TFollowAxon[K],\n TAxonType,\n TGlobal\n >['response'];\n }\n ) => InterNeuronAPI<TAxonType, TGlobal>;\n dendrite: {\n <TSenderCollateral extends ICNSCollateral<unknown>>(s: {\n collateral: TSenderCollateral;\n response: (\n payload: TSenderCollateral extends ICNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TCNSNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TAxonType, TGlobal>;\n <\n TCollaterals extends readonly [\n ICNSCollateral<unknown>,\n ...ICNSCollateral<unknown>[]\n ]\n >(s: {\n collateral: TCollaterals;\n response: (\n payload: CollateralPayloadUnion<TCollaterals>,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TCNSNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TAxonType, TGlobal>;\n <TPayloadUnion>(s: {\n collateral: ICNSCollateral<unknown>[];\n response: (\n payload: TPayloadUnion,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TCNSNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TAxonType, TGlobal>;\n (\n s: TCNSDendrite<\n ICNSCollateral<unknown>,\n TAxonType,\n TGlobal\n >\n ): InterNeuronAPI<TAxonType, TGlobal>;\n };\n modalityDendrite: {\n <TSenderCollateral extends ICNSCollateral<unknown>, TResult>(s: {\n collateral: TSenderCollateral;\n modality: TCNSModality;\n afferentPaths?: Map<\n TCNSAfferentPath,\n (\n payload: TSenderCollateral extends ICNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TResult | Promise<TResult>\n >;\n default?: (\n payload: TSenderCollateral extends ICNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TResult | Promise<TResult>;\n output: (\n result: TResult,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TCNSNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TAxonType, TGlobal>;\n <TSenderCollateral extends ICNSCollateral<unknown>, TResult>(s: {\n collateral: TSenderCollateral;\n modalities: Array<{\n modality: TCNSModality;\n afferentPaths?: Map<\n TCNSAfferentPath,\n (\n payload: TSenderCollateral extends ICNSCollateral<\n infer P\n >\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TResult | Promise<TResult>\n >;\n default?: (\n payload: TSenderCollateral extends ICNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TResult | Promise<TResult>;\n }>;\n default?: (\n payload: TSenderCollateral extends ICNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TResult | Promise<TResult>;\n output: (\n result: TResult,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TGlobal>\n ) => TCNSNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TAxonType, TGlobal>;\n };\n};\n\n// Helper type to extract result type from output function\ntype ExtractResultFromOutput<T> = T extends (\n result: infer R,\n ...args: any[]\n) => any\n ? R\n : never;\n\n// Concrete builder\nexport const cnsNeuron = <\n TProvidedAxon extends Record<string, ICNSCollateral<unknown>>,\n TGlobal = unknown\n>(\n axon: TProvidedAxon\n): InterNeuronAPI<TCNSAxon<TProvidedAxon>, TGlobal> => {\n const dendrites: TCNSDendrite<\n ICNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>,\n TGlobal\n >[] = [];\n\n const api: InterNeuronAPI<TCNSAxon<TProvidedAxon>, TGlobal> = {\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 ICNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>,\n TGlobal\n >\n );\n }\n return api;\n }) as InterNeuronAPI<\n TCNSAxon<TProvidedAxon>,\n TGlobal\n >['bind'],\n index: nextNeuronIndex++,\n axon: axon as unknown as TCNSAxon<TProvidedAxon>,\n concurrency: undefined,\n maxDuration: undefined,\n dendrites,\n dendrite(s: any) {\n // Check if it's a shorthand format with multiple collaterals\n if (\n 'collateral' in s &&\n 'response' in s &&\n Array.isArray(s.collateral)\n ) {\n // Shorthand format with multiple collaterals - create one dendrite per collateral\n for (const collateral of s.collateral) {\n dendrites.push({\n collateral,\n response: s.response,\n } as TCNSDendrite<ICNSCollateral<unknown>, TCNSAxon<TProvidedAxon>, TGlobal>);\n }\n } else {\n // Either full dendrite object or shorthand with single collateral\n // Both have the same structure, so we handle them the same way\n dendrites.push(\n s as TCNSDendrite<\n ICNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>,\n TGlobal\n >\n );\n }\n return api; // keep full API for chaining\n },\n modalityDendrite(s: any) {\n const {\n collateral,\n modality: singleModality,\n modalities: multipleModalities,\n afferentPaths: singleAfferentPaths,\n default: defaultHandler,\n output,\n } = s;\n\n // Normalize to array format for unified processing\n const modalityConfigs: Array<{\n modality: TCNSModality;\n afferentPaths?: Map<TCNSAfferentPath, any>;\n default?: any;\n }> = multipleModalities\n ? multipleModalities\n : singleModality\n ? [\n {\n modality: singleModality,\n afferentPaths: singleAfferentPaths,\n default: defaultHandler,\n },\n ]\n : [];\n\n const response = (payload: any, axon: any, ctx: any) => {\n const stimulation = ctx.stimulation as\n | {\n options?: TCNSStimulationOptions<any>;\n }\n | undefined;\n\n const stimOptions = stimulation?.options;\n const handler = cnsResolveModalityHandler(\n modalitySelection,\n stimOptions?.modality,\n stimOptions?.afferentPath\n );\n if (handler === undefined) {\n throw new Error(\n `modalityDendrite: No handler found for afferent path in modality and no default handler provided`\n );\n }\n return cnsComposeModalityResponse(handler, output)(payload, axon, ctx);\n };\n\n const modalitySelection: TCNSModalitySelection = {\n modalityConfigs,\n defaultHandler,\n output,\n };\n\n dendrites.push({\n collateral,\n response,\n modalitySelection,\n } as TCNSDendrite<ICNSCollateral<unknown>, TCNSAxon<TProvidedAxon>, TGlobal>);\n\n return api;\n },\n };\n\n return api;\n};\n\n/**\n * A composable neuron factory. Each `.withX<T>()` returns a *new typed view* of\n * the same underlying builder (the layers are type-only — zero runtime cost, no\n * per-activation overhead), so you bake your ctx additions once and reuse them\n * everywhere. Layers compose in any order and never touch the handler signature.\n *\n * `TExt` is the accumulated ctx extension: each layer *intersects* its own fields\n * into it, so a base factory (`TExt = unknown`) hands neurons the plain ctx bag —\n * nothing is forced onto anyone who didn't ask for it. `withGlobal<T>()` is the\n * built-in layer; make `T` an object to carry as much as you want (store, clock,\n * logger, …) through the single runtime channel wired at `new CNS`/`CNSFactory.create`.\n *\n * @example\n * // src/neurons/factory.ts — ctx shape baked once\n * type TGlobal = { store: Store; now(): number; newId(): string };\n * export const { neuron } = cnsNeuronFactory().withGlobal<TGlobal>();\n *\n * // any neuron file — plain value, reaches deps via ctx.global\n * export const taskNeuron = neuron({ taskCreated }).bind({ createTask }, {\n * createTask: ({ title }, axon, { global }) =>\n * axon.taskCreated.createSignal({ id: global.newId(), title, at: global.now() }),\n * });\n */\nexport type TCNSNeuronFactory<TExt = unknown> = {\n /** Add `{ global: T }` to ctx; the value is injected once at `new CNS`/`CNSFactory.create`. */\n withGlobal: <T>() => TCNSNeuronFactory<TExt & { global: T }>;\n neuron: <TProvidedAxon extends Record<string, ICNSCollateral<unknown>>>(\n axon: TProvidedAxon\n ) => InterNeuronAPI<TCNSAxon<TProvidedAxon>, TExt>;\n};\n\nexport const cnsNeuronFactory = <TExt = unknown>(): TCNSNeuronFactory<TExt> => {\n // Single stateless object reused across every layer call: `.withX()` only\n // re-types it, so there is nothing to allocate or carry at runtime.\n const factory: TCNSNeuronFactory<TExt> = {\n withGlobal: () => factory as unknown as TCNSNeuronFactory<any>,\n neuron: axon => cnsNeuron(axon) as any,\n };\n return factory;\n};\n\n/** Sugar: `cnsNeuronFactory().withGlobal<T>()`. */\nexport const withCNSGlobal = <T>(): TCNSNeuronFactory<{ global: T }> =>\n cnsNeuronFactory<{ global: T }>();\n\nexport const cnsAfferentPath = (\n parentAfferentPath?: TCNSAfferentPath\n): TCNSAfferentPath => {\n return {\n index: nextAfferentPathIndex++,\n ...(parentAfferentPath !== undefined && {\n parentAfferentPath,\n }),\n };\n};\n\nexport const cnsModality = (\n afferentPaths: Record<string | number, TCNSAfferentPath>\n): TCNSModality => {\n return {\n index: nextModalityIndex++,\n afferentPaths,\n };\n};\n"]}
|