@cnstra/core 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -948,6 +948,58 @@ var CNS = class {
948
948
  }
949
949
  };
950
950
 
951
+ // src/CNSPersistOptionsRegistry.ts
952
+ var CNSPersistOptionsRegistry = class {
953
+ constructor() {
954
+ this.neurons = /* @__PURE__ */ new Map();
955
+ this.neuronNames = /* @__PURE__ */ new WeakMap();
956
+ this.collaterals = /* @__PURE__ */ new Map();
957
+ this.stimulations = /* @__PURE__ */ new Map();
958
+ }
959
+ addNeuron(neuron2, options) {
960
+ this.neurons.set(options.name, neuron2);
961
+ this.neuronNames.set(neuron2, options.name);
962
+ }
963
+ getNeuron(name) {
964
+ return this.neurons.get(name);
965
+ }
966
+ getNeuronName(neuron2) {
967
+ return this.neuronNames.get(neuron2);
968
+ }
969
+ getNamedNeurons() {
970
+ return this.neurons;
971
+ }
972
+ getCollateralName(collateral2) {
973
+ for (const [name, col] of this.collaterals) {
974
+ if (col === collateral2) return name;
975
+ }
976
+ return void 0;
977
+ }
978
+ removeNeuron(name) {
979
+ const neuron2 = this.neurons.get(name);
980
+ if (neuron2) this.neuronNames.delete(neuron2);
981
+ this.neurons.delete(name);
982
+ }
983
+ addCollateral(collateral2, options) {
984
+ this.collaterals.set(options.name, collateral2);
985
+ }
986
+ getCollateral(name) {
987
+ return this.collaterals.get(name);
988
+ }
989
+ removeCollateral(name) {
990
+ this.collaterals.delete(name);
991
+ }
992
+ addStimulation(stimulation, options) {
993
+ this.stimulations.set(options.stimulationId, stimulation);
994
+ }
995
+ getStimulation(stimulationId) {
996
+ return this.stimulations.get(stimulationId);
997
+ }
998
+ removeStimulation(stimulationId) {
999
+ this.stimulations.delete(stimulationId);
1000
+ }
1001
+ };
1002
+
951
1003
  // src/CNSCollateral.ts
952
1004
  var CNSCollateral = class {
953
1005
  createSignal(payload) {
@@ -955,8 +1007,8 @@ var CNSCollateral = class {
955
1007
  }
956
1008
  };
957
1009
 
958
- // src/utils/CNSDrainGuard.ts
959
- var CNSDrainGuard = class {
1010
+ // src/utils/CNSStimulationGate.ts
1011
+ var CNSStimulationGate = class {
960
1012
  constructor(guardOptions) {
961
1013
  this.guardOptions = guardOptions;
962
1014
  }
@@ -1146,7 +1198,20 @@ var modality = (afferentPaths) => {
1146
1198
  afferentPaths
1147
1199
  };
1148
1200
  };
1201
+ var createPersistRegistry = (namedNeurons) => {
1202
+ const registry = new CNSPersistOptionsRegistry();
1203
+ for (const [name, neuron2] of Object.entries(namedNeurons)) {
1204
+ registry.addNeuron(neuron2, { name, neuron: neuron2 });
1205
+ for (const [key, col] of Object.entries(neuron2.axon)) {
1206
+ registry.addCollateral(col, {
1207
+ name: key,
1208
+ collateral: col
1209
+ });
1210
+ }
1211
+ }
1212
+ return registry;
1213
+ };
1149
1214
 
1150
- export { CNS, CNSCollateral, CNSDrainGuard, CNSStimulationContextStore, afferentPath, collateral, modality, neuron, withCtx };
1215
+ export { CNS, CNSCollateral, CNSPersistOptionsRegistry, CNSStimulationContextStore, CNSStimulationGate, afferentPath, collateral, createPersistRegistry, modality, neuron, withCtx };
1151
1216
  //# sourceMappingURL=index.js.map
1152
1217
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/CNSStimulationContextStore.ts","../src/CNSNeuronActivationPump.ts","../src/CNSStimulation.ts","../src/CNSInstanceNeuronQueue.ts","../src/CNSNetwork.ts","../src/CNS.ts","../src/CNSCollateral.ts","../src/utils/CNSDrainGuard.ts","../src/factory/index.ts"],"names":["neuron","collateral","error","r","axon"],"mappings":"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","file":"index.js","sourcesContent":["import { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\n\nexport class CNSStimulationContextStore implements ICNSStimulationContextStore {\n constructor(private readonly ctx: Map<object, unknown> = new Map()) {}\n\n get(key: object): unknown {\n return this.ctx.get(key);\n }\n\n set(key: object, value: unknown): void {\n this.ctx.set(key, value);\n }\n\n getAll(): Map<object, unknown> {\n return new Map(this.ctx);\n }\n\n setAll(values: Map<object, unknown>): void {\n this.ctx.clear();\n for (const [key, value] of values) this.ctx.set(key, value);\n }\n\n delete(key: object): void {\n this.ctx.delete(key);\n }\n}\n","import { TCNSNeuronActivationTask } from './types/TCNSNeuronActivationTask';\n\nexport class CNSNeuronActivationPump<TNeuron extends object> {\n private items: TCNSNeuronActivationTask<TNeuron>[] = [];\n private head = 0;\n private tail = 0;\n private size = 0;\n private capacity = 16;\n protected activeOperations = 0;\n private activeTasks = new Set<TCNSNeuronActivationTask<TNeuron>>();\n\n // NEW: prevent re-entrant pump; defer extra runs\n private pumping = false;\n private needsPump = false;\n\n constructor(\n private readonly processor: (\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ) => (() => void) | Promise<() => void>,\n protected readonly concurrency?: number,\n protected readonly abortSignal?: AbortSignal,\n initialCapacity?: number\n ) {\n if (initialCapacity && initialCapacity > 0) {\n this.capacity = initialCapacity;\n }\n this.items = new Array(this.capacity);\n }\n\n protected get canStartOperation(): boolean {\n const limit = this.concurrency ?? Infinity;\n return this.activeOperations < limit && !this.abortSignal?.aborted;\n }\n\n private resize(): void {\n const oldCapacity = this.capacity;\n this.capacity = oldCapacity * 2;\n const newItems = new Array(this.capacity);\n\n let oldIndex = this.head;\n for (let i = 0; i < this.size; i++) {\n newItems[i] = this.items[oldIndex];\n oldIndex = (oldIndex + 1) % oldCapacity;\n }\n\n this.items = newItems;\n this.head = 0;\n this.tail = this.size;\n }\n\n private dequeue():\n | TCNSNeuronActivationTask<TNeuron>\n | undefined {\n if (this.size === 0) return undefined;\n\n const neuronActivationTask = this.items[this.head];\n this.items[this.head] = undefined as any; // Clear reference\n this.head = (this.head + 1) % this.capacity;\n this.size--;\n\n return neuronActivationTask;\n }\n\n private enqueueItem(\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ): void {\n if (this.size === this.capacity) {\n this.resize();\n }\n\n this.items[this.tail] = neuronActivationTask;\n this.tail = (this.tail + 1) % this.capacity;\n this.size++;\n }\n\n protected pump() {\n if (this.pumping) {\n this.needsPump = true;\n return;\n }\n this.pumping = true;\n\n while (this.canStartOperation && this.size > 0) {\n const neuronActivationTask = this.dequeue()!;\n this.activeOperations++;\n this.activeTasks.add(neuronActivationTask);\n\n const ret = this.processor(neuronActivationTask);\n\n // Async branch\n if (ret && typeof (ret as any).then === 'function') {\n (ret as Promise<void | (() => void)>).then(\n cb => {\n // finish this item\n this.activeOperations--;\n this.activeTasks.delete(neuronActivationTask);\n if (typeof cb === 'function') cb();\n\n // schedule another pass (but don't re-enter if already pumping)\n if (this.size > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n },\n err => {\n this.activeOperations--;\n this.activeTasks.delete(neuronActivationTask);\n // resume if there's more work\n if (this.size > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n throw err; // let it crash \"honestly\"\n }\n );\n // Do not break: if concurrency allows, start additional items in this pump\n continue;\n }\n\n // Sync branch\n this.activeOperations--;\n this.activeTasks.delete(neuronActivationTask);\n if (typeof ret === 'function') (ret as () => void)();\n // Loop continues; any items added by ret() stay in the same flat loop\n }\n\n this.pumping = false;\n\n // If async completions or enqueues requested another pass, do exactly one more, non-recursively\n if (this.needsPump) {\n this.needsPump = false;\n this.pump();\n }\n }\n\n enqueue(\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ) {\n this.enqueueItem(neuronActivationTask);\n // Start pumping only if not already pumping; avoid re-entrant pump\n if (!this.pumping) this.pump();\n else this.needsPump = true;\n }\n\n get length() {\n return this.size;\n }\n\n getActiveOperationsCount() {\n return this.activeOperations;\n }\n\n public getQueuedTasks(): TCNSNeuronActivationTask<TNeuron>[] {\n const result: TCNSNeuronActivationTask<TNeuron>[] = [];\n let index = this.head;\n for (let i = 0; i < this.size; i++) {\n result.push(this.items[index]);\n index = (index + 1) % this.capacity;\n }\n return result;\n }\n\n public getActiveTasks(): TCNSNeuronActivationTask<TNeuron>[] {\n return Array.from(this.activeTasks);\n }\n}\n","import { CNSStimulationContextStore } from './CNSStimulationContextStore';\nimport { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\nimport { TCNSStimulationOptions } from './types/TCNSStimulationOptions';\nimport { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { TCNSSubscriber } from './types/TCNSSubscriber';\nimport { CNSNeuronActivationPump } from './CNSNeuronActivationPump';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSSignal } from './types/TCNSSignal';\nimport { TCNSNeuronActivationTask } from './types/TCNSNeuronActivationTask';\nimport { CNS } from './CNS';\nimport { ICNS } from './interfaces/ICNS';\nimport { TCNSNeuronActivationTaskFailure } from './types/TCNSNeuronActivationTaskFailure';\nimport { TCNSStimulationResponse } from './types/TCNSStimulationResponse';\nimport { CNSCollateral } from './CNSCollateral';\nimport { TNCNeuronResponseReturn } from './types/TCNSNeuronResponseReturn';\nimport { TCNSAxon } from './types/TCNSAxon';\n\nexport class CNSStimulation<\n TNeuron extends TCNSNeuron<any, any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> {\n private readonly ctx: ICNSStimulationContextStore;\n private readonly queue: CNSNeuronActivationPump<TNeuron>;\n\n private readonly nueronVisitMap?: Map<TNeuron, number>;\n private readonly instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>;\n private scheduledCount = 0;\n private readonly pendingTasks = new Set<\n TCNSNeuronActivationTask<TNeuron>\n >();\n private readonly failedTasks: Array<\n TCNSNeuronActivationTaskFailure<TNeuron>\n > = [];\n private completed = new Promise<void>((resolve, reject) => {\n this.resolveCompleted = resolve;\n this.rejectCompleted = reject;\n });\n private resolveCompleted!: () => void;\n private rejectCompleted!: (e: any) => void;\n private isCompleted = false;\n private onResponseError: Error | undefined;\n\n /**\n * Track active SCCs: SCC index -> count of active neurons in that SCC\n */\n private readonly activeSccCounts = new Map<number, number>();\n\n constructor(\n public readonly cns: CNS<TNeuron, TDendrite>,\n instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>,\n public readonly options?: TCNSStimulationOptions<TCNSStimulationResponse>\n ) {\n this.ctx = options?.ctx ?? new CNSStimulationContextStore();\n this.queue = new CNSNeuronActivationPump<TNeuron>(\n neuronActivationTask =>\n this.executeActivationTask(neuronActivationTask),\n options?.concurrency,\n options?.abortSignal\n );\n\n this.instanceNeuronQueue = instanceNeuronQueue;\n\n if (this.options?.maxNeuronHops) {\n this.nueronVisitMap = new Map();\n }\n }\n\n private tryResolveCompleted(): void {\n if (this.isCompleted) return;\n const noActive = this.queue.getActiveOperationsCount() === 0;\n const noPending = this.queue.length + this.scheduledCount === 0;\n const aborted = !!this.options?.abortSignal?.aborted;\n\n if ((noPending && noActive) || (aborted && noActive && !noPending)) {\n // When completing due to abort, mark all remaining queued tasks as aborted\n if (aborted) {\n const queuedTasks = this.queue.getQueuedTasks();\n\n for (const task of [...queuedTasks]) {\n const alreadyTracked = this.failedTasks.some(\n ft => ft.task === task\n );\n if (!alreadyTracked) {\n this.failedTasks.push({\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.rejectCompleted(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 if (this.failedTasks.length > 0 || this.onResponseError) {\n const error =\n this.onResponseError ||\n new Error(\n `Stimulation completed with ${this.failedTasks.length} failed task(s)`\n );\n this.rejectCompleted(error);\n } else {\n this.resolveCompleted();\n }\n }\n }\n\n public waitUntilComplete(): Promise<void> {\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.queue.getQueuedTasks();\n const activeTasks = this.queue.getActiveTasks();\n const pendingTasks = Array.from(this.pendingTasks);\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];\n }\n\n /**\n * Get the context store for this stimulation\n */\n public getContext(): ICNSStimulationContextStore {\n return this.ctx;\n }\n\n /**\n * Enqueue activation tasks directly into the stimulation queue\n */\n public enqueueTasks(\n tasks: TCNSNeuronActivationTask<TNeuron>[]\n ): void {\n for (const task of tasks) {\n this.queue.enqueue(task);\n }\n this.tryResolveCompleted();\n }\n\n protected get concurrencyEnabled(): boolean {\n return (\n this.options?.concurrency !== undefined &&\n this.options?.concurrency > 0\n );\n }\n\n protected get autoCleanupContextsEnabled(): boolean {\n return this.cns?.options?.autoCleanupContexts ?? false;\n }\n\n /**\n * Mark a neuron as active (being processed)\n */\n protected markNeuronActive(neuron: TNeuron): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.incrementSccCount(neuron);\n }\n\n /**\n * Mark a neuron as inactive (finished processing)\n */\n protected markNeuronInactive(neuron: TNeuron): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.decrementSccCount(neuron);\n }\n\n /**\n * Increment the active count for the SCC containing this neuron\n */\n private incrementSccCount(neuron: TNeuron): void {\n const sccIndex = this.cns.network.getSccIndexByNeuron(neuron);\n if (sccIndex === undefined) return;\n\n const currentCount = this.activeSccCounts.get(sccIndex) || 0;\n this.activeSccCounts.set(sccIndex, currentCount + 1);\n }\n\n /**\n * Decrement the active count for the SCC containing this neuron\n */\n private decrementSccCount(neuron: TNeuron): void {\n const sccIndex = this.cns.network.getSccIndexByNeuron(neuron);\n if (sccIndex === undefined) return;\n\n const currentCount = this.activeSccCounts.get(sccIndex) || 0;\n const nextCount = Math.max(0, currentCount - 1);\n this.activeSccCounts.set(sccIndex, nextCount);\n\n // Log warning if we're trying to decrement below 0\n if (currentCount === 0) {\n console.warn(\n `[CNSStimulation] Attempting to decrement SCC count below 0 for neuron`\n );\n }\n }\n\n /**\n * Check if a neuron can be guaranteed not to be visited again\n */\n protected canNeuronBeGuaranteedDone(neuron: TNeuron): boolean {\n if (!this.autoCleanupContextsEnabled) return false;\n return this.cns.network.canNeuronBeGuaranteedDone(\n neuron,\n this.activeSccCounts\n );\n }\n\n protected cleanupCtxIfNeeded(neuron: TNeuron): void {\n if (\n this.autoCleanupContextsEnabled &&\n this.canNeuronBeGuaranteedDone(neuron)\n ) {\n this.ctx.delete(neuron);\n }\n }\n\n protected createSubscriberQueueItem(\n subscriber: TCNSSubscriber<TNeuron, TDendrite>,\n inputSignal?: TCNSSignal<CNSCollateral<unknown>>\n ) {\n if (this.options?.maxNeuronHops) {\n if (\n (this.nueronVisitMap?.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.nueronVisitMap?.set(\n subscriber.neuron,\n (this.nueronVisitMap?.get(subscriber.neuron) ?? 0) + 1\n );\n }\n }\n\n const neuronActivationTask: TCNSNeuronActivationTask<TNeuron> = {\n neuron: subscriber.neuron,\n dendriteCollateral: subscriber.dendrite.collateral as CNSCollateral<unknown>,\n input: inputSignal,\n };\n return neuronActivationTask;\n }\n\n private executeActivationTask(\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ) {\n const subscribers = this.cns.network.getSubscribers(\n neuronActivationTask.dendriteCollateral\n );\n const subscriber = subscribers.find(\n s => s.neuron === neuronActivationTask.neuron\n );\n if (!subscriber) {\n // Task failed: subscriber not found\n this.failedTasks.push({\n task: neuronActivationTask,\n error: new Error(\n `Subscriber not found for activation task`\n ),\n aborted: false,\n });\n return () => {};\n }\n\n const neuron = subscriber.neuron;\n const dendrite = subscriber.dendrite as TDendrite;\n\n const inputSignal = neuronActivationTask.input;\n\n const starter = () => {\n // Mark neuron as active only when we actually start processing (after gate allows it)\n this.markNeuronActive(neuron);\n\n let response: TNCNeuronResponseReturn<TCNSAxon>;\n try {\n response = dendrite.response(\n inputSignal?.payload,\n neuron.axon,\n {\n get: () => this.ctx.get(neuron),\n set: (value: any) => this.ctx.set(neuron, value),\n delete: () => this.ctx.delete(neuron),\n abortSignal: this.options?.abortSignal,\n cns: this.cns as ICNS<TNeuron, TDendrite>,\n stimulation: this,\n } as any\n );\n } catch (error) {\n // Sync error occurred\n this.markNeuronInactive(neuron);\n const isAborted = this.options?.abortSignal?.aborted ?? false;\n this.failedTasks.push({\n task: neuronActivationTask,\n error:\n error instanceof Error\n ? error\n : new Error(String(error)),\n aborted: isAborted,\n });\n this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n undefined,\n error\n );\n return () => {};\n }\n\n const maxDuration = (neuron as any).maxDuration as\n | number\n | undefined;\n\n const asPromise: Promise<\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<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<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<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 if (response instanceof Promise || maxDuration) {\n return timedPromise.then(\n signal => {\n return () => {\n // Mark neuron as inactive when async processing completes\n this.markNeuronInactive(neuron);\n return this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n signal as\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\n | undefined\n );\n };\n },\n error => {\n return () => {\n // Mark neuron as inactive when async processing fails\n this.markNeuronInactive(neuron);\n // Track failed task\n const isAborted =\n this.options?.abortSignal?.aborted ?? false;\n this.failedTasks.push({\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 // Mark neuron as inactive when sync processing completes\n this.markNeuronInactive(neuron);\n return this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n response as\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\n | undefined\n );\n };\n }\n };\n\n // Use CNS-provided per-instance neuron queue for global concurrency gating\n return this.instanceNeuronQueue.run(neuron, starter);\n }\n\n protected processResponseOrResponses(\n emitter: TNeuron | undefined,\n inputSignal?: TCNSSignal<CNSCollateral<unknown>>,\n outputSignalOrSignals?:\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<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 for (const signal of outputSignalOrSignals) {\n this.processResponse(emitter, inputSignal, signal, error);\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<CNSCollateral<unknown>>,\n outputSignal?: TCNSSignal<CNSCollateral<unknown>>,\n error?: any\n ): void {\n const collateral = outputSignal?.collateral;\n const subscribers = collateral\n ? this.cns.network.getSubscribers(collateral)\n : [];\n const subscriberActivationTasks: TCNSNeuronActivationTask<TNeuron>[] =\n [];\n\n if (collateral && !error) {\n if (emitter) this.cleanupCtxIfNeeded(emitter);\n\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 this.pendingTasks.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 = this.options?.onResponse?.({\n inputSignal: inputSignal,\n outputSignal: outputSignal,\n contextValue: this.ctx.getAll(),\n queueLength: this.queue.length + this.scheduledCount,\n stimulation: this,\n\n hops:\n this.options?.maxNeuronHops && emitter\n ? this.nueronVisitMap?.get(emitter) ?? 0\n : undefined,\n error,\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.queue.enqueue(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 (maybePromise as Promise<void>).then(\n () => {\n for (let i = 0; i < subscriberActivationTasks.length; i++) {\n this.scheduledCount--;\n this.pendingTasks.delete(subscriberActivationTasks[i]);\n this.queue.enqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\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 // 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.queue.enqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\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.queue.enqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n }\n\n public responseToSignal(\n signalOrSignals:\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\n ): void {\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(undefined, undefined, signalOrSignals);\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 }\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 { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSSubscriber } from './types/TCNSSubscriber';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { CNSCollateral } from './CNSCollateral';\n\nexport class CNSNetwork<\n TNeuron extends TCNSNeuron<any, 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 public stronglyConnectedComponents: Set<TNeuron>[] = [];\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 CNSCollateral<unknown>,\n TCNSSubscriber<TNeuron, TDendrite>[]\n >();\n\n private dendriteIndex = new Map<CNSCollateral<unknown>, TDendrite>();\n private collateralIndex = new Set<CNSCollateral<unknown>>();\n\n private parentNeuronByCollateral = new Map<CNSCollateral<unknown>, TNeuron>();\n\n constructor(private readonly neurons: TNeuron[]) {\n this.validateUniqueIdentifiers();\n this.buildIndexes();\n this.buildSCC();\n }\n\n /**\n * Validate uniqueness constraints:\n * - (legacy) collateral instances used to be single-owner; in object-identity routing\n * a collateral can be emitted by multiple neurons (fan-in), so we no longer\n * enforce single ownership here.\n * Throws aggregated error if violations are found.\n */\n private validateUniqueIdentifiers(): void {\n // Intentionally no-op.\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 CNSCollateral<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 // Topological sort to compute ancestors efficiently\n const inDegree = new Map<number, number>();\n const queue: number[] = [];\n\n // Calculate in-degrees\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n const incomingEdges = this.sccDag.get(i) || new Set();\n inDegree.set(i, incomingEdges.size);\n\n if (incomingEdges.size === 0) {\n queue.push(i);\n }\n }\n\n // Process nodes in topological order\n while (queue.length > 0) {\n const current = queue.shift()!;\n const outgoingEdges = this.getOutgoingEdges(current);\n\n for (const neighbor of Array.from(outgoingEdges)) {\n // Add current as ancestor of neighbor\n const neighborAncestors = this.sccAncestors.get(neighbor)!;\n neighborAncestors.add(current);\n\n // Add all ancestors of current to neighbor\n const currentAncestors = this.sccAncestors.get(current)!;\n for (const ancestor of 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 * Get outgoing edges for a given SCC index\n */\n private getOutgoingEdges(sccIndex: number): Set<number> {\n const outgoing = new Set<number>();\n\n // Find all SCCs that have this SCC as an incoming edge\n for (const [targetScc, incomingEdges] of Array.from(this.sccDag)) {\n if (incomingEdges.has(sccIndex)) {\n outgoing.add(targetScc);\n }\n }\n\n return outgoing;\n }\n\n /**\n * Check if a neuron can be reached again (including self-calling).\n * Returns true if the neuron is in a strongly connected component with more than one member,\n * or if it's in a single-member SCC that can reach itself.\n */\n public getSCCSetByNeuron(neuron: TNeuron) {\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 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 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 this.dendriteIndex.clear();\n this.collateralIndex.clear();\n for (const neuron of this.neurons) {\n for (const dendrite of neuron.dendrites) {\n const key = dendrite.collateral as CNSCollateral<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 this.dendriteIndex.set(key, dendrite as TDendrite);\n }\n Object.values(neuron.axon).forEach(collateral => {\n this.parentNeuronByCollateral.set(\n collateral as CNSCollateral<unknown>,\n neuron\n );\n this.collateralIndex.add(collateral as CNSCollateral<unknown>);\n });\n }\n }\n\n public getParentNeuronByCollateral(collateral: CNSCollateral<unknown>) {\n return this.parentNeuronByCollateral.get(collateral);\n }\n\n public getDendrites() {\n return Array.from(this.dendriteIndex.values());\n }\n\n public getCollaterals() {\n return Array.from(this.collateralIndex.values());\n }\n\n public getSubscribers(\n collateral: CNSCollateral<unknown>\n ): TCNSSubscriber<TNeuron, TDendrite>[] {\n return this.subIndex.get(collateral) ?? [];\n }\n}\n","import { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { TCNSOptions } from './types/TCNSOptions';\nimport { TCNSStimulationOptions } from './types/TCNSStimulationOptions';\nimport { CNSStimulation } from './CNSStimulation';\nimport { TCNSSignal } from './types/TCNSSignal';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSStimulationResponse } from './types/TCNSStimulationResponse';\nimport { TCNSNeuronActivationTask } from './types/TCNSNeuronActivationTask';\nimport { CNSNetwork } from './CNSNetwork';\nimport { ICNS } from './interfaces/ICNS';\nimport { CNSCollateral } from './CNSCollateral';\n\nexport class CNS<\n TNeuron extends TCNSNeuron<any, 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 constructor(\n protected readonly neurons: TNeuron[],\n public readonly options?: TCNSOptions\n ) {\n this.network = new CNSNetwork(this.neurons);\n }\n\n public addResponseListener(\n listener: (response: TCNSStimulationResponse) => void | Promise<void>\n ): () => void {\n this.globalResponseListeners.push(listener);\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n const idx = this.globalResponseListeners.indexOf(listener);\n if (idx >= 0) this.globalResponseListeners.splice(idx, 1);\n };\n }\n\n private wrapOnResponse<T>(\n local?: (response: T) => void | Promise<void>\n ): (response: T) => void | Promise<void> {\n if (this.globalResponseListeners.length === 0 && !local) {\n // No-op fast path\n return () => {};\n }\n return (r: T) => {\n let anyPromise = false;\n const promises: Promise<void>[] = [];\n\n if (local) {\n 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 public stimulate(\n signalOrSignals:\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[],\n options?: TCNSStimulationOptions<TCNSStimulationResponse>\n ): CNSStimulation<TNeuron, TDendrite> {\n const wrapped = this.wrapOnResponse(options?.onResponse);\n const stimulation = new CNSStimulation<TNeuron, TDendrite>(\n this,\n this.instanceNeuronQueue,\n {\n ...options,\n onResponse: wrapped,\n }\n );\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 wrapped = this.wrapOnResponse(options?.onResponse);\n const stimulation = new CNSStimulation<TNeuron, TDendrite>(\n this,\n this.instanceNeuronQueue,\n {\n ...options,\n onResponse: wrapped,\n }\n );\n stimulation.enqueueTasks(tasks);\n return stimulation;\n }\n}\n","import { TCNSSignal } from './types/TCNSSignal';\nimport { ICNSCollateral } from './interfaces/ICNSCollateral';\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 { CNS } from '../CNS';\nimport type { CNSCollateral } from '../CNSCollateral';\nimport type { CNSStimulation } from '../CNSStimulation';\nimport type { TCNSDendrite } from '../types/TCNSDendrite';\nimport type { TCNSNeuron } from '../types/TCNSNeuron';\nimport type { TCNSSignal } from '../types/TCNSSignal';\nimport type { TCNSStimulationOptions } from '../types/TCNSStimulationOptions';\nimport type { TCNSStimulationResponse } from '../types/TCNSStimulationResponse';\n\nexport type TCNSDrainGuardSignal =\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[];\n\nexport type TCNSDrainGuardOptions<\n TNeuron extends TCNSNeuron<any, any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> = {\n cns: CNS<TNeuron, TDendrite>;\n signal: TCNSDrainGuardSignal;\n options?: TCNSStimulationOptions<TCNSStimulationResponse>;\n};\n\nexport class CNSDrainGuard<\n TNeuron extends TCNSNeuron<any, 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: TCNSDrainGuardOptions<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 { CNSCollateral } from '../CNSCollateral';\nimport { TCNSAxon } from '../types/TCNSAxon';\nimport { TCNSDendrite } from '../types/TCNSDendrite';\nimport { TCNSLocalContextValueStore } from '../types/TCNSLocalContextValueStore';\nimport { TNCNeuronResponseReturn } from '../types/TCNSNeuronResponseReturn';\nimport { ICNS } from '../interfaces/ICNS';\nimport { TCNSModality } from '../types/TCNSModality';\nimport { TCNSAfferentPath } from '../types/TCNSAfferentPath';\nimport { TCNSStimulationOptions } from '../types/TCNSStimulationOptions';\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 CNSCollateral<unknown>[]\n> = {\n [K in keyof TCollaterals]: TCollaterals[K] extends CNSCollateral<infer P>\n ? P\n : never;\n}[number];\n\ntype InterNeuronAPI<TContextValue, TAxonType extends TCNSAxon = TCNSAxon> = {\n axon: TAxonType;\n concurrency?: number;\n maxDuration?: number;\n dendrites: TCNSDendrite<TContextValue, CNSCollateral<unknown>, TAxonType>[];\n setConcurrency: (\n n: number | undefined\n ) => InterNeuronAPI<TContextValue, TAxonType>;\n setMaxDuration: (\n ms: number | undefined\n ) => InterNeuronAPI<TContextValue, TAxonType>;\n bind: <TFollowAxon extends Record<string, CNSCollateral<unknown>>>(\n axon: TFollowAxon,\n dendrites: {\n [K in keyof TFollowAxon]:\n | TCNSDendrite<TContextValue, TFollowAxon[K], TAxonType>\n | TCNSDendrite<\n TContextValue,\n TFollowAxon[K],\n TAxonType\n >['response'];\n }\n ) => InterNeuronAPI<TContextValue, TAxonType>;\n dendrite: {\n <TSenderCollateral extends CNSCollateral<unknown>>(s: {\n collateral: TSenderCollateral;\n response: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\n <\n TCollaterals extends readonly [\n CNSCollateral<unknown>,\n ...CNSCollateral<unknown>[]\n ]\n >(s: {\n collateral: TCollaterals;\n response: (\n payload: CollateralPayloadUnion<TCollaterals>,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\n <TPayloadUnion>(s: {\n collateral: CNSCollateral<unknown>[];\n response: (\n payload: TPayloadUnion,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\n (\n s: TCNSDendrite<TContextValue, CNSCollateral<unknown>, TAxonType>\n ): InterNeuronAPI<TContextValue, TAxonType>;\n };\n modalityDendrite: {\n <TSenderCollateral extends CNSCollateral<unknown>, TResult>(s: {\n collateral: TSenderCollateral;\n modality: TCNSModality;\n afferentPaths?: Map<\n TCNSAfferentPath,\n (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>\n >;\n default?: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>;\n output: (\n result: TResult,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\n <TSenderCollateral extends CNSCollateral<unknown>, TResult>(s: {\n collateral: TSenderCollateral;\n modalities: Array<{\n modality: TCNSModality;\n afferentPaths?: Map<\n TCNSAfferentPath,\n (\n payload: TSenderCollateral extends CNSCollateral<\n infer P\n >\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>\n >;\n default?: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>;\n }>;\n default?: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>;\n output: (\n result: TResult,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\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 TContextValue,\n TProvidedAxon extends Record<string, CNSCollateral<unknown>>\n>(\n axon: TProvidedAxon\n): InterNeuronAPI<TContextValue, TCNSAxon<TProvidedAxon>> => {\n const dendrites: TCNSDendrite<\n TContextValue,\n CNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>\n >[] = [];\n\n const api: InterNeuronAPI<TContextValue, TCNSAxon<TProvidedAxon>> = {\n setConcurrency: (n: number | undefined) => {\n api.concurrency = n;\n return api;\n },\n setMaxDuration: (ms: number | undefined) => {\n api.maxDuration = ms;\n return api;\n },\n bind: ((axon, newDendrites) => {\n for (const key in newDendrites) {\n const value = newDendrites[key] as any;\n const dendrite =\n typeof value === 'function'\n ? {\n collateral: (axon as any)[key],\n response: value,\n }\n : value;\n dendrites.push(\n dendrite as TCNSDendrite<\n TContextValue,\n CNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>\n >\n );\n }\n return api;\n }) as InterNeuronAPI<TContextValue, TCNSAxon<TProvidedAxon>>['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<TContextValue, CNSCollateral<unknown>, TCNSAxon<TProvidedAxon>>);\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 TContextValue,\n CNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>\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: singleDefaultHandler,\n default: globalDefaultHandler,\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: singleDefaultHandler,\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 (!globalDefaultHandler) {\n throw new Error(\n `modalityDendrite: No handler found for modality and no default handler provided`\n );\n }\n\n const res = globalDefaultHandler(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 ?? globalDefaultHandler;\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<TContextValue, CNSCollateral<unknown>, TCNSAxon<TProvidedAxon>>);\n\n return api;\n },\n };\n\n return api;\n};\n\nexport const withCtx = <TContextValue>() => ({\n neuron: <TProvidedAxon extends Record<string, CNSCollateral<unknown>>>(\n axon: TProvidedAxon\n ) => {\n return neuron<TContextValue, TProvidedAxon>(axon);\n },\n});\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/CNSStimulationContextStore.ts","../src/CNSNeuronActivationPump.ts","../src/CNSStimulation.ts","../src/CNSInstanceNeuronQueue.ts","../src/CNSNetwork.ts","../src/CNS.ts","../src/CNSPersistOptionsRegistry.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 { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\n\nexport class CNSStimulationContextStore implements ICNSStimulationContextStore {\n constructor(private readonly ctx: Map<object, unknown> = new Map()) {}\n\n get(key: object): unknown {\n return this.ctx.get(key);\n }\n\n set(key: object, value: unknown): void {\n this.ctx.set(key, value);\n }\n\n getAll(): Map<object, unknown> {\n return new Map(this.ctx);\n }\n\n setAll(values: Map<object, unknown>): void {\n this.ctx.clear();\n for (const [key, value] of values) this.ctx.set(key, value);\n }\n\n delete(key: object): void {\n this.ctx.delete(key);\n }\n}\n","import { TCNSNeuronActivationTask } from './types/TCNSNeuronActivationTask';\n\nexport class CNSNeuronActivationPump<TNeuron extends object> {\n private items: TCNSNeuronActivationTask<TNeuron>[] = [];\n private head = 0;\n private tail = 0;\n private size = 0;\n private capacity = 16;\n protected activeOperations = 0;\n private activeTasks = new Set<TCNSNeuronActivationTask<TNeuron>>();\n\n // NEW: prevent re-entrant pump; defer extra runs\n private pumping = false;\n private needsPump = false;\n\n constructor(\n private readonly processor: (\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ) => (() => void) | Promise<() => void>,\n protected readonly concurrency?: number,\n protected readonly abortSignal?: AbortSignal,\n initialCapacity?: number\n ) {\n if (initialCapacity && initialCapacity > 0) {\n this.capacity = initialCapacity;\n }\n this.items = new Array(this.capacity);\n }\n\n protected get canStartOperation(): boolean {\n const limit = this.concurrency ?? Infinity;\n return this.activeOperations < limit && !this.abortSignal?.aborted;\n }\n\n private resize(): void {\n const oldCapacity = this.capacity;\n this.capacity = oldCapacity * 2;\n const newItems = new Array(this.capacity);\n\n let oldIndex = this.head;\n for (let i = 0; i < this.size; i++) {\n newItems[i] = this.items[oldIndex];\n oldIndex = (oldIndex + 1) % oldCapacity;\n }\n\n this.items = newItems;\n this.head = 0;\n this.tail = this.size;\n }\n\n private dequeue():\n | TCNSNeuronActivationTask<TNeuron>\n | undefined {\n if (this.size === 0) return undefined;\n\n const neuronActivationTask = this.items[this.head];\n this.items[this.head] = undefined as any; // Clear reference\n this.head = (this.head + 1) % this.capacity;\n this.size--;\n\n return neuronActivationTask;\n }\n\n private enqueueItem(\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ): void {\n if (this.size === this.capacity) {\n this.resize();\n }\n\n this.items[this.tail] = neuronActivationTask;\n this.tail = (this.tail + 1) % this.capacity;\n this.size++;\n }\n\n protected pump() {\n if (this.pumping) {\n this.needsPump = true;\n return;\n }\n this.pumping = true;\n\n while (this.canStartOperation && this.size > 0) {\n const neuronActivationTask = this.dequeue()!;\n this.activeOperations++;\n this.activeTasks.add(neuronActivationTask);\n\n const ret = this.processor(neuronActivationTask);\n\n // Async branch\n if (ret && typeof (ret as any).then === 'function') {\n (ret as Promise<void | (() => void)>).then(\n cb => {\n // finish this item\n this.activeOperations--;\n this.activeTasks.delete(neuronActivationTask);\n if (typeof cb === 'function') cb();\n\n // schedule another pass (but don't re-enter if already pumping)\n if (this.size > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n },\n err => {\n this.activeOperations--;\n this.activeTasks.delete(neuronActivationTask);\n // resume if there's more work\n if (this.size > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n throw err; // let it crash \"honestly\"\n }\n );\n // Do not break: if concurrency allows, start additional items in this pump\n continue;\n }\n\n // Sync branch\n this.activeOperations--;\n this.activeTasks.delete(neuronActivationTask);\n if (typeof ret === 'function') (ret as () => void)();\n // Loop continues; any items added by ret() stay in the same flat loop\n }\n\n this.pumping = false;\n\n // If async completions or enqueues requested another pass, do exactly one more, non-recursively\n if (this.needsPump) {\n this.needsPump = false;\n this.pump();\n }\n }\n\n enqueue(\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ) {\n this.enqueueItem(neuronActivationTask);\n // Start pumping only if not already pumping; avoid re-entrant pump\n if (!this.pumping) this.pump();\n else this.needsPump = true;\n }\n\n get length() {\n return this.size;\n }\n\n getActiveOperationsCount() {\n return this.activeOperations;\n }\n\n public getQueuedTasks(): TCNSNeuronActivationTask<TNeuron>[] {\n const result: TCNSNeuronActivationTask<TNeuron>[] = [];\n let index = this.head;\n for (let i = 0; i < this.size; i++) {\n result.push(this.items[index]);\n index = (index + 1) % this.capacity;\n }\n return result;\n }\n\n public getActiveTasks(): TCNSNeuronActivationTask<TNeuron>[] {\n return Array.from(this.activeTasks);\n }\n}\n","import { CNSStimulationContextStore } from './CNSStimulationContextStore';\nimport { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\nimport { TCNSStimulationOptions } from './types/TCNSStimulationOptions';\nimport { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { TCNSSubscriber } from './types/TCNSSubscriber';\nimport { CNSNeuronActivationPump } from './CNSNeuronActivationPump';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSSignal } from './types/TCNSSignal';\nimport { TCNSNeuronActivationTask } from './types/TCNSNeuronActivationTask';\nimport { CNS } from './CNS';\nimport { ICNS } from './interfaces/ICNS';\nimport { TCNSNeuronActivationTaskFailure } from './types/TCNSNeuronActivationTaskFailure';\nimport { TCNSStimulationResponse } from './types/TCNSStimulationResponse';\nimport { CNSCollateral } from './CNSCollateral';\nimport { TNCNeuronResponseReturn } from './types/TCNSNeuronResponseReturn';\nimport { TCNSAxon } from './types/TCNSAxon';\n\nexport class CNSStimulation<\n TNeuron extends TCNSNeuron<any, any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> {\n private readonly ctx: ICNSStimulationContextStore;\n private readonly queue: CNSNeuronActivationPump<TNeuron>;\n\n private readonly nueronVisitMap?: Map<TNeuron, number>;\n private readonly instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>;\n private scheduledCount = 0;\n private readonly pendingTasks = new Set<\n TCNSNeuronActivationTask<TNeuron>\n >();\n private readonly failedTasks: Array<\n TCNSNeuronActivationTaskFailure<TNeuron>\n > = [];\n private completed = new Promise<void>((resolve, reject) => {\n this.resolveCompleted = resolve;\n this.rejectCompleted = reject;\n });\n private resolveCompleted!: () => void;\n private rejectCompleted!: (e: any) => void;\n private isCompleted = false;\n private onResponseError: Error | undefined;\n\n /**\n * Track active SCCs: SCC index -> count of active neurons in that SCC\n */\n private readonly activeSccCounts = new Map<number, number>();\n\n constructor(\n public readonly cns: CNS<TNeuron, TDendrite>,\n instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>,\n public readonly options?: TCNSStimulationOptions<TCNSStimulationResponse>\n ) {\n this.ctx = options?.ctx ?? new CNSStimulationContextStore();\n this.queue = new CNSNeuronActivationPump<TNeuron>(\n neuronActivationTask =>\n this.executeActivationTask(neuronActivationTask),\n options?.concurrency,\n options?.abortSignal\n );\n\n this.instanceNeuronQueue = instanceNeuronQueue;\n\n if (this.options?.maxNeuronHops) {\n this.nueronVisitMap = new Map();\n }\n }\n\n private tryResolveCompleted(): void {\n if (this.isCompleted) return;\n const noActive = this.queue.getActiveOperationsCount() === 0;\n const noPending = this.queue.length + this.scheduledCount === 0;\n const aborted = !!this.options?.abortSignal?.aborted;\n\n if ((noPending && noActive) || (aborted && noActive && !noPending)) {\n // When completing due to abort, mark all remaining queued tasks as aborted\n if (aborted) {\n const queuedTasks = this.queue.getQueuedTasks();\n\n for (const task of [...queuedTasks]) {\n const alreadyTracked = this.failedTasks.some(\n ft => ft.task === task\n );\n if (!alreadyTracked) {\n this.failedTasks.push({\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.rejectCompleted(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 if (this.failedTasks.length > 0 || this.onResponseError) {\n const error =\n this.onResponseError ||\n new Error(\n `Stimulation completed with ${this.failedTasks.length} failed task(s)`\n );\n this.rejectCompleted(error);\n } else {\n this.resolveCompleted();\n }\n }\n }\n\n public waitUntilComplete(): Promise<void> {\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.queue.getQueuedTasks();\n const activeTasks = this.queue.getActiveTasks();\n const pendingTasks = Array.from(this.pendingTasks);\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];\n }\n\n /**\n * Get the context store for this stimulation\n */\n public getContext(): ICNSStimulationContextStore {\n return this.ctx;\n }\n\n /**\n * Enqueue activation tasks directly into the stimulation queue\n */\n public enqueueTasks(\n tasks: TCNSNeuronActivationTask<TNeuron>[]\n ): void {\n for (const task of tasks) {\n this.queue.enqueue(task);\n }\n this.tryResolveCompleted();\n }\n\n protected get concurrencyEnabled(): boolean {\n return (\n this.options?.concurrency !== undefined &&\n this.options?.concurrency > 0\n );\n }\n\n protected get autoCleanupContextsEnabled(): boolean {\n return this.cns?.options?.autoCleanupContexts ?? false;\n }\n\n /**\n * Mark a neuron as active (being processed)\n */\n protected markNeuronActive(neuron: TNeuron): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.incrementSccCount(neuron);\n }\n\n /**\n * Mark a neuron as inactive (finished processing)\n */\n protected markNeuronInactive(neuron: TNeuron): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.decrementSccCount(neuron);\n }\n\n /**\n * Increment the active count for the SCC containing this neuron\n */\n private incrementSccCount(neuron: TNeuron): void {\n const sccIndex = this.cns.network.getSccIndexByNeuron(neuron);\n if (sccIndex === undefined) return;\n\n const currentCount = this.activeSccCounts.get(sccIndex) || 0;\n this.activeSccCounts.set(sccIndex, currentCount + 1);\n }\n\n /**\n * Decrement the active count for the SCC containing this neuron\n */\n private decrementSccCount(neuron: TNeuron): void {\n const sccIndex = this.cns.network.getSccIndexByNeuron(neuron);\n if (sccIndex === undefined) return;\n\n const currentCount = this.activeSccCounts.get(sccIndex) || 0;\n const nextCount = Math.max(0, currentCount - 1);\n this.activeSccCounts.set(sccIndex, nextCount);\n\n // Log warning if we're trying to decrement below 0\n if (currentCount === 0) {\n console.warn(\n `[CNSStimulation] Attempting to decrement SCC count below 0 for neuron`\n );\n }\n }\n\n /**\n * Check if a neuron can be guaranteed not to be visited again\n */\n protected canNeuronBeGuaranteedDone(neuron: TNeuron): boolean {\n if (!this.autoCleanupContextsEnabled) return false;\n return this.cns.network.canNeuronBeGuaranteedDone(\n neuron,\n this.activeSccCounts\n );\n }\n\n protected cleanupCtxIfNeeded(neuron: TNeuron): void {\n if (\n this.autoCleanupContextsEnabled &&\n this.canNeuronBeGuaranteedDone(neuron)\n ) {\n this.ctx.delete(neuron);\n }\n }\n\n protected createSubscriberQueueItem(\n subscriber: TCNSSubscriber<TNeuron, TDendrite>,\n inputSignal?: TCNSSignal<CNSCollateral<unknown>>\n ) {\n if (this.options?.maxNeuronHops) {\n if (\n (this.nueronVisitMap?.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.nueronVisitMap?.set(\n subscriber.neuron,\n (this.nueronVisitMap?.get(subscriber.neuron) ?? 0) + 1\n );\n }\n }\n\n const neuronActivationTask: TCNSNeuronActivationTask<TNeuron> = {\n neuron: subscriber.neuron,\n dendriteCollateral: subscriber.dendrite.collateral as CNSCollateral<unknown>,\n input: inputSignal,\n };\n return neuronActivationTask;\n }\n\n private executeActivationTask(\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ) {\n const subscribers = this.cns.network.getSubscribers(\n neuronActivationTask.dendriteCollateral\n );\n const subscriber = subscribers.find(\n s => s.neuron === neuronActivationTask.neuron\n );\n if (!subscriber) {\n // Task failed: subscriber not found\n this.failedTasks.push({\n task: neuronActivationTask,\n error: new Error(\n `Subscriber not found for activation task`\n ),\n aborted: false,\n });\n return () => {};\n }\n\n const neuron = subscriber.neuron;\n const dendrite = subscriber.dendrite as TDendrite;\n\n const inputSignal = neuronActivationTask.input;\n\n const starter = () => {\n // Mark neuron as active only when we actually start processing (after gate allows it)\n this.markNeuronActive(neuron);\n\n let response: TNCNeuronResponseReturn<TCNSAxon>;\n try {\n response = dendrite.response(\n inputSignal?.payload,\n neuron.axon,\n {\n get: () => this.ctx.get(neuron),\n set: (value: any) => this.ctx.set(neuron, value),\n delete: () => this.ctx.delete(neuron),\n abortSignal: this.options?.abortSignal,\n cns: this.cns as ICNS<TNeuron, TDendrite>,\n stimulation: this,\n } as any\n );\n } catch (error) {\n // Sync error occurred\n this.markNeuronInactive(neuron);\n const isAborted = this.options?.abortSignal?.aborted ?? false;\n this.failedTasks.push({\n task: neuronActivationTask,\n error:\n error instanceof Error\n ? error\n : new Error(String(error)),\n aborted: isAborted,\n });\n this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n undefined,\n error\n );\n return () => {};\n }\n\n const maxDuration = (neuron as any).maxDuration as\n | number\n | undefined;\n\n const asPromise: Promise<\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<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<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<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 if (response instanceof Promise || maxDuration) {\n return timedPromise.then(\n signal => {\n return () => {\n // Mark neuron as inactive when async processing completes\n this.markNeuronInactive(neuron);\n return this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n signal as\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\n | undefined\n );\n };\n },\n error => {\n return () => {\n // Mark neuron as inactive when async processing fails\n this.markNeuronInactive(neuron);\n // Track failed task\n const isAborted =\n this.options?.abortSignal?.aborted ?? false;\n this.failedTasks.push({\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 // Mark neuron as inactive when sync processing completes\n this.markNeuronInactive(neuron);\n return this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n response as\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\n | undefined\n );\n };\n }\n };\n\n // Use CNS-provided per-instance neuron queue for global concurrency gating\n return this.instanceNeuronQueue.run(neuron, starter);\n }\n\n protected processResponseOrResponses(\n emitter: TNeuron | undefined,\n inputSignal?: TCNSSignal<CNSCollateral<unknown>>,\n outputSignalOrSignals?:\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<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 for (const signal of outputSignalOrSignals) {\n this.processResponse(emitter, inputSignal, signal, error);\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<CNSCollateral<unknown>>,\n outputSignal?: TCNSSignal<CNSCollateral<unknown>>,\n error?: any\n ): void {\n const collateral = outputSignal?.collateral;\n const subscribers = collateral\n ? this.cns.network.getSubscribers(collateral)\n : [];\n const subscriberActivationTasks: TCNSNeuronActivationTask<TNeuron>[] =\n [];\n\n if (collateral && !error) {\n if (emitter) this.cleanupCtxIfNeeded(emitter);\n\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 this.pendingTasks.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 = this.options?.onResponse?.({\n inputSignal: inputSignal,\n outputSignal: outputSignal,\n contextValue: this.ctx.getAll(),\n queueLength: this.queue.length + this.scheduledCount,\n stimulation: this,\n\n hops:\n this.options?.maxNeuronHops && emitter\n ? this.nueronVisitMap?.get(emitter) ?? 0\n : undefined,\n error,\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.queue.enqueue(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 (maybePromise as Promise<void>).then(\n () => {\n for (let i = 0; i < subscriberActivationTasks.length; i++) {\n this.scheduledCount--;\n this.pendingTasks.delete(subscriberActivationTasks[i]);\n this.queue.enqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\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 // 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.queue.enqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\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.queue.enqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n }\n\n public responseToSignal(\n signalOrSignals:\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\n ): void {\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(undefined, undefined, signalOrSignals);\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 }\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 { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSSubscriber } from './types/TCNSSubscriber';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { CNSCollateral } from './CNSCollateral';\n\nexport class CNSNetwork<\n TNeuron extends TCNSNeuron<any, 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 public stronglyConnectedComponents: Set<TNeuron>[] = [];\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 CNSCollateral<unknown>,\n TCNSSubscriber<TNeuron, TDendrite>[]\n >();\n\n private dendriteIndex = new Map<CNSCollateral<unknown>, TDendrite>();\n private collateralIndex = new Set<CNSCollateral<unknown>>();\n\n private parentNeuronByCollateral = new Map<CNSCollateral<unknown>, TNeuron>();\n\n constructor(private readonly neurons: TNeuron[]) {\n this.validateUniqueIdentifiers();\n this.buildIndexes();\n this.buildSCC();\n }\n\n /**\n * Validate uniqueness constraints:\n * - (legacy) collateral instances used to be single-owner; in object-identity routing\n * a collateral can be emitted by multiple neurons (fan-in), so we no longer\n * enforce single ownership here.\n * Throws aggregated error if violations are found.\n */\n private validateUniqueIdentifiers(): void {\n // Intentionally no-op.\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 CNSCollateral<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 // Topological sort to compute ancestors efficiently\n const inDegree = new Map<number, number>();\n const queue: number[] = [];\n\n // Calculate in-degrees\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n const incomingEdges = this.sccDag.get(i) || new Set();\n inDegree.set(i, incomingEdges.size);\n\n if (incomingEdges.size === 0) {\n queue.push(i);\n }\n }\n\n // Process nodes in topological order\n while (queue.length > 0) {\n const current = queue.shift()!;\n const outgoingEdges = this.getOutgoingEdges(current);\n\n for (const neighbor of Array.from(outgoingEdges)) {\n // Add current as ancestor of neighbor\n const neighborAncestors = this.sccAncestors.get(neighbor)!;\n neighborAncestors.add(current);\n\n // Add all ancestors of current to neighbor\n const currentAncestors = this.sccAncestors.get(current)!;\n for (const ancestor of 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 * Get outgoing edges for a given SCC index\n */\n private getOutgoingEdges(sccIndex: number): Set<number> {\n const outgoing = new Set<number>();\n\n // Find all SCCs that have this SCC as an incoming edge\n for (const [targetScc, incomingEdges] of Array.from(this.sccDag)) {\n if (incomingEdges.has(sccIndex)) {\n outgoing.add(targetScc);\n }\n }\n\n return outgoing;\n }\n\n /**\n * Check if a neuron can be reached again (including self-calling).\n * Returns true if the neuron is in a strongly connected component with more than one member,\n * or if it's in a single-member SCC that can reach itself.\n */\n public getSCCSetByNeuron(neuron: TNeuron) {\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 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 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 this.dendriteIndex.clear();\n this.collateralIndex.clear();\n for (const neuron of this.neurons) {\n for (const dendrite of neuron.dendrites) {\n const key = dendrite.collateral as CNSCollateral<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 this.dendriteIndex.set(key, dendrite as TDendrite);\n }\n Object.values(neuron.axon).forEach(collateral => {\n this.parentNeuronByCollateral.set(\n collateral as CNSCollateral<unknown>,\n neuron\n );\n this.collateralIndex.add(collateral as CNSCollateral<unknown>);\n });\n }\n }\n\n public getParentNeuronByCollateral(collateral: CNSCollateral<unknown>) {\n return this.parentNeuronByCollateral.get(collateral);\n }\n\n public getDendrites() {\n return Array.from(this.dendriteIndex.values());\n }\n\n public getCollaterals() {\n return Array.from(this.collateralIndex.values());\n }\n\n public getSubscribers(\n collateral: CNSCollateral<unknown>\n ): TCNSSubscriber<TNeuron, TDendrite>[] {\n return this.subIndex.get(collateral) ?? [];\n }\n}\n","import { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { TCNSOptions } from './types/TCNSOptions';\nimport { TCNSStimulationOptions } from './types/TCNSStimulationOptions';\nimport { CNSStimulation } from './CNSStimulation';\nimport { TCNSSignal } from './types/TCNSSignal';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSStimulationResponse } from './types/TCNSStimulationResponse';\nimport { TCNSNeuronActivationTask } from './types/TCNSNeuronActivationTask';\nimport { CNSNetwork } from './CNSNetwork';\nimport { ICNS } from './interfaces/ICNS';\nimport { CNSCollateral } from './CNSCollateral';\n\nexport class CNS<\n TNeuron extends TCNSNeuron<any, 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 constructor(\n protected readonly neurons: TNeuron[],\n public readonly options?: TCNSOptions\n ) {\n this.network = new CNSNetwork(this.neurons);\n }\n\n public addResponseListener(\n listener: (response: TCNSStimulationResponse) => void | Promise<void>\n ): () => void {\n this.globalResponseListeners.push(listener);\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n const idx = this.globalResponseListeners.indexOf(listener);\n if (idx >= 0) this.globalResponseListeners.splice(idx, 1);\n };\n }\n\n private wrapOnResponse<T>(\n local?: (response: T) => void | Promise<void>\n ): (response: T) => void | Promise<void> {\n if (this.globalResponseListeners.length === 0 && !local) {\n // No-op fast path\n return () => {};\n }\n return (r: T) => {\n let anyPromise = false;\n const promises: Promise<void>[] = [];\n\n if (local) {\n 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 public stimulate(\n signalOrSignals:\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[],\n options?: TCNSStimulationOptions<TCNSStimulationResponse>\n ): CNSStimulation<TNeuron, TDendrite> {\n const wrapped = this.wrapOnResponse(options?.onResponse);\n const stimulation = new CNSStimulation<TNeuron, TDendrite>(\n this,\n this.instanceNeuronQueue,\n {\n ...options,\n onResponse: wrapped,\n }\n );\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 wrapped = this.wrapOnResponse(options?.onResponse);\n const stimulation = new CNSStimulation<TNeuron, TDendrite>(\n this,\n this.instanceNeuronQueue,\n {\n ...options,\n onResponse: wrapped,\n }\n );\n stimulation.enqueueTasks(tasks);\n return stimulation;\n }\n}\n","import { CNSCollateral } from './CNSCollateral';\nimport { CNSStimulation } from './CNSStimulation';\nimport { TCNSAxon } from './types/TCNSAxon';\nimport { TCNSNeuron } from './types/TCNSNeuron';\nimport {\n TCNSCollateralPersistOptions,\n TCNSNeuronPersistOptions,\n TCNSStimulationPersistOptions,\n} from './types/TCNSPersist';\n\nexport class CNSPersistOptionsRegistry {\n private neurons = new Map<string, TCNSNeuron<unknown, TCNSAxon>>();\n private neuronNames = new WeakMap<TCNSNeuron<unknown, TCNSAxon>, string>();\n\n private collaterals = new Map<string, CNSCollateral<unknown>>();\n\n private stimulations = new Map<\n string,\n CNSStimulation<TCNSNeuron<unknown, TCNSAxon>>\n >();\n\n addNeuron(\n neuron: TCNSNeuron<unknown, TCNSAxon>,\n options: TCNSNeuronPersistOptions<TCNSNeuron<unknown, TCNSAxon>>\n ): void {\n this.neurons.set(options.name, neuron);\n this.neuronNames.set(neuron, options.name);\n }\n\n getNeuron(name: string): TCNSNeuron<unknown, TCNSAxon> | undefined {\n return this.neurons.get(name);\n }\n\n getNeuronName(neuron: TCNSNeuron<unknown, TCNSAxon>): string | undefined {\n return this.neuronNames.get(neuron);\n }\n\n getNamedNeurons(): ReadonlyMap<string, TCNSNeuron<unknown, TCNSAxon>> {\n return this.neurons;\n }\n\n getCollateralName(collateral: CNSCollateral<unknown>): string | undefined {\n for (const [name, col] of this.collaterals) {\n if (col === collateral) return name;\n }\n return undefined;\n }\n\n removeNeuron(name: string): void {\n const neuron = this.neurons.get(name);\n if (neuron) this.neuronNames.delete(neuron);\n this.neurons.delete(name);\n }\n\n addCollateral(\n collateral: CNSCollateral<unknown>,\n options: TCNSCollateralPersistOptions\n ): void {\n this.collaterals.set(options.name, collateral);\n }\n\n getCollateral(name: string): CNSCollateral<unknown> | undefined {\n return this.collaterals.get(name);\n }\n\n removeCollateral(name: string): void {\n this.collaterals.delete(name);\n }\n\n addStimulation(\n stimulation: CNSStimulation<TCNSNeuron<unknown, TCNSAxon>>,\n options: TCNSStimulationPersistOptions\n ): void {\n this.stimulations.set(options.stimulationId, stimulation);\n }\n\n getStimulation(\n stimulationId: string\n ): CNSStimulation<TCNSNeuron<unknown, TCNSAxon>> | undefined {\n return this.stimulations.get(stimulationId);\n }\n\n removeStimulation(stimulationId: string): void {\n this.stimulations.delete(stimulationId);\n }\n}\n","import { TCNSSignal } from './types/TCNSSignal';\nimport { ICNSCollateral } from './interfaces/ICNSCollateral';\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 { CNS } from '../CNS';\nimport type { CNSCollateral } from '../CNSCollateral';\nimport type { CNSStimulation } from '../CNSStimulation';\nimport type { TCNSDendrite } from '../types/TCNSDendrite';\nimport type { TCNSNeuron } from '../types/TCNSNeuron';\nimport type { TCNSSignal } from '../types/TCNSSignal';\nimport type { TCNSStimulationOptions } from '../types/TCNSStimulationOptions';\nimport type { TCNSStimulationResponse } from '../types/TCNSStimulationResponse';\n\nexport type TCNSStimulationGateSignal =\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[];\n\nexport type TCNSStimulationGateOptions<\n TNeuron extends TCNSNeuron<any, 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, 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 { CNSCollateral } from '../CNSCollateral';\nimport { CNSPersistOptionsRegistry } from '../CNSPersistOptionsRegistry';\nimport { TCNSAxon } from '../types/TCNSAxon';\nimport { TCNSDendrite } from '../types/TCNSDendrite';\nimport { TCNSLocalContextValueStore } from '../types/TCNSLocalContextValueStore';\nimport { TNCNeuronResponseReturn } from '../types/TCNSNeuronResponseReturn';\nimport { TCNSNeuron } from '../types/TCNSNeuron';\nimport { ICNS } from '../interfaces/ICNS';\nimport { TCNSModality } from '../types/TCNSModality';\nimport { TCNSAfferentPath } from '../types/TCNSAfferentPath';\nimport { TCNSStimulationOptions } from '../types/TCNSStimulationOptions';\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 CNSCollateral<unknown>[]\n> = {\n [K in keyof TCollaterals]: TCollaterals[K] extends CNSCollateral<infer P>\n ? P\n : never;\n}[number];\n\ntype InterNeuronAPI<TContextValue, TAxonType extends TCNSAxon = TCNSAxon> = {\n axon: TAxonType;\n concurrency?: number;\n maxDuration?: number;\n dendrites: TCNSDendrite<TContextValue, CNSCollateral<unknown>, TAxonType>[];\n setConcurrency: (\n n: number | undefined\n ) => InterNeuronAPI<TContextValue, TAxonType>;\n setMaxDuration: (\n ms: number | undefined\n ) => InterNeuronAPI<TContextValue, TAxonType>;\n bind: <TFollowAxon extends Record<string, CNSCollateral<unknown>>>(\n axon: TFollowAxon,\n dendrites: {\n [K in keyof TFollowAxon]:\n | TCNSDendrite<TContextValue, TFollowAxon[K], TAxonType>\n | TCNSDendrite<\n TContextValue,\n TFollowAxon[K],\n TAxonType\n >['response'];\n }\n ) => InterNeuronAPI<TContextValue, TAxonType>;\n dendrite: {\n <TSenderCollateral extends CNSCollateral<unknown>>(s: {\n collateral: TSenderCollateral;\n response: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\n <\n TCollaterals extends readonly [\n CNSCollateral<unknown>,\n ...CNSCollateral<unknown>[]\n ]\n >(s: {\n collateral: TCollaterals;\n response: (\n payload: CollateralPayloadUnion<TCollaterals>,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\n <TPayloadUnion>(s: {\n collateral: CNSCollateral<unknown>[];\n response: (\n payload: TPayloadUnion,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\n (\n s: TCNSDendrite<TContextValue, CNSCollateral<unknown>, TAxonType>\n ): InterNeuronAPI<TContextValue, TAxonType>;\n };\n modalityDendrite: {\n <TSenderCollateral extends CNSCollateral<unknown>, TResult>(s: {\n collateral: TSenderCollateral;\n modality: TCNSModality;\n afferentPaths?: Map<\n TCNSAfferentPath,\n (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>\n >;\n default?: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>;\n output: (\n result: TResult,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\n <TSenderCollateral extends CNSCollateral<unknown>, TResult>(s: {\n collateral: TSenderCollateral;\n modalities: Array<{\n modality: TCNSModality;\n afferentPaths?: Map<\n TCNSAfferentPath,\n (\n payload: TSenderCollateral extends CNSCollateral<\n infer P\n >\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>\n >;\n default?: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>;\n }>;\n default?: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>;\n output: (\n result: TResult,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\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 TContextValue,\n TProvidedAxon extends Record<string, CNSCollateral<unknown>>\n>(\n axon: TProvidedAxon\n): InterNeuronAPI<TContextValue, TCNSAxon<TProvidedAxon>> => {\n const dendrites: TCNSDendrite<\n TContextValue,\n CNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>\n >[] = [];\n\n const api: InterNeuronAPI<TContextValue, TCNSAxon<TProvidedAxon>> = {\n setConcurrency: (n: number | undefined) => {\n api.concurrency = n;\n return api;\n },\n setMaxDuration: (ms: number | undefined) => {\n api.maxDuration = ms;\n return api;\n },\n bind: ((axon, newDendrites) => {\n for (const key in newDendrites) {\n const value = newDendrites[key] as any;\n const dendrite =\n typeof value === 'function'\n ? {\n collateral: (axon as any)[key],\n response: value,\n }\n : value;\n dendrites.push(\n dendrite as TCNSDendrite<\n TContextValue,\n CNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>\n >\n );\n }\n return api;\n }) as InterNeuronAPI<TContextValue, TCNSAxon<TProvidedAxon>>['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<TContextValue, CNSCollateral<unknown>, TCNSAxon<TProvidedAxon>>);\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 TContextValue,\n CNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>\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: singleDefaultHandler,\n default: globalDefaultHandler,\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: singleDefaultHandler,\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 (!globalDefaultHandler) {\n throw new Error(\n `modalityDendrite: No handler found for modality and no default handler provided`\n );\n }\n\n const res = globalDefaultHandler(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 ?? globalDefaultHandler;\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<TContextValue, CNSCollateral<unknown>, TCNSAxon<TProvidedAxon>>);\n\n return api;\n },\n };\n\n return api;\n};\n\nexport const withCtx = <TContextValue>() => ({\n neuron: <TProvidedAxon extends Record<string, CNSCollateral<unknown>>>(\n axon: TProvidedAxon\n ) => {\n return neuron<TContextValue, TProvidedAxon>(axon);\n },\n});\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\n/**\n * Creates a CNSPersistOptionsRegistry from a plain object of named neurons.\n * All axon collaterals of each neuron are registered automatically.\n *\n * Use this for both production persistence and devtools/AI inspection —\n * the same registry serves both purposes.\n *\n * @example\n * // src/neurons/registry.ts\n * import { createPersistRegistry } from '@cnstra/core';\n * import { deckNeuron, cardNeuron } from './index';\n *\n * export const registry = createPersistRegistry({ deckNeuron, cardNeuron });\n */\nexport const createPersistRegistry = (\n namedNeurons: Record<string, TCNSNeuron<any, any>>\n): CNSPersistOptionsRegistry => {\n const registry = new CNSPersistOptionsRegistry();\n for (const [name, neuron] of Object.entries(namedNeurons)) {\n registry.addNeuron(neuron, { name, neuron });\n for (const [key, col] of Object.entries(neuron.axon)) {\n registry.addCollateral(col as CNSCollateral<unknown>, {\n name: key,\n collateral: col as CNSCollateral<unknown>,\n });\n }\n }\n return registry;\n};\n"]}