@cnstra/core 1.3.0 → 1.4.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/README.md +73 -2
- package/dist/CNS.d.ts +33 -7
- package/dist/CNS.d.ts.map +1 -1
- package/dist/CNSCollateral.d.ts +5 -5
- package/dist/CNSCollateral.d.ts.map +1 -1
- package/dist/CNSFunctionalQueue.d.ts +3 -3
- package/dist/CNSFunctionalQueue.d.ts.map +1 -1
- package/dist/CNSInstanceNeuronQueue.d.ts +8 -0
- package/dist/CNSInstanceNeuronQueue.d.ts.map +1 -0
- package/dist/CNSStimulation.d.ts +13 -11
- package/dist/CNSStimulation.d.ts.map +1 -1
- package/dist/CNSTaskQueue.d.ts +12 -0
- package/dist/CNSTaskQueue.d.ts.map +1 -0
- package/dist/factory/index.d.ts +12 -7
- package/dist/factory/index.d.ts.map +1 -1
- package/dist/index.cjs +386 -79
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +386 -79
- package/dist/index.js.map +1 -1
- package/dist/interfaces/ICNS.d.ts +14 -5
- package/dist/interfaces/ICNS.d.ts.map +1 -1
- package/dist/interfaces/ICNSCollateral.d.ts +3 -3
- package/dist/interfaces/ICNSCollateral.d.ts.map +1 -1
- package/dist/types/TCNSAxon.d.ts +3 -1
- package/dist/types/TCNSAxon.d.ts.map +1 -1
- package/dist/types/TCNSDendrite.d.ts +6 -3
- package/dist/types/TCNSDendrite.d.ts.map +1 -1
- package/dist/types/TCNSNeuron.d.ts +5 -3
- package/dist/types/TCNSNeuron.d.ts.map +1 -1
- package/dist/types/TCNSNeuronResponseReturn.d.ts +1 -1
- package/dist/types/TCNSNeuronResponseReturn.d.ts.map +1 -1
- package/dist/types/TCNSSignal.d.ts +2 -2
- package/dist/types/TCNSSignal.d.ts.map +1 -1
- package/dist/types/TCNSStimulationOptions.d.ts +2 -2
- package/dist/types/TCNSStimulationOptions.d.ts.map +1 -1
- package/dist/types/TCNSStimulationQueueItem.d.ts +3 -3
- package/dist/types/TCNSStimulationQueueItem.d.ts.map +1 -1
- package/dist/types/TCNSStimulationResponse.d.ts +3 -3
- package/dist/types/TCNSStimulationResponse.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,6 +11,16 @@ You explicitly start a run with `cns.stimulate(...)`; CNStra then performs a **d
|
|
|
11
11
|
|
|
12
12
|
> **Not pub/sub:** there are no ambient listeners or global `emit`. Only the **signal you return** from a dendrite continues the traversal; returning `null`/`undefined` ends that branch. Hop limits guard against cycles.
|
|
13
13
|
|
|
14
|
+
## 💡 Why CNStra
|
|
15
|
+
|
|
16
|
+
We follow the ERG approach (Event → Reaction → Graph), not a raw Flux/event-bus.
|
|
17
|
+
|
|
18
|
+
- **Deterministic routing**: signals are delivered along an explicit neuron graph, not broadcast to whoever “happens to listen”.
|
|
19
|
+
- **Readable, reliable flows**: each step is local and typed; branches are explicit, so debugging feels like reading a storyboard, not a log stream.
|
|
20
|
+
- **Backpressure & concurrency**: built‑in per‑stimulation and per‑neuron concurrency limits keep workloads controlled without custom plumbing.
|
|
21
|
+
- **Saga‑grade orchestration**: ERG already models long‑running, multi‑step reactions with retries/cancellation hooks (abort), so you rarely need to hand‑roll “sagas”.
|
|
22
|
+
- **Safer than ad‑hoc events**: no hidden global listeners, no accidental fan‑out; every continuation must be returned explicitly.
|
|
23
|
+
|
|
14
24
|
## 🏗️ Core Model
|
|
15
25
|
|
|
16
26
|
### Neurons
|
|
@@ -103,13 +113,57 @@ myNeuron
|
|
|
103
113
|
.dendrite({
|
|
104
114
|
collateral: inputCollateral,
|
|
105
115
|
response: async (payload, axon, ctx) => {
|
|
106
|
-
//
|
|
107
|
-
|
|
116
|
+
// ctx: { get, set, abortSignal?, cns? }
|
|
117
|
+
if (ctx.abortSignal?.aborted) return; // graceful cancel
|
|
118
|
+
const prev = ctx.get();
|
|
119
|
+
ctx.set({ ...prev, handled: true });
|
|
108
120
|
return axon.output.createSignal(result);
|
|
109
121
|
}
|
|
110
122
|
});
|
|
111
123
|
```
|
|
112
124
|
|
|
125
|
+
### `neuron.bind(axon, map)` — exhaustive subscriptions (with shorthand)
|
|
126
|
+
|
|
127
|
+
Bind this neuron to every collateral of another neuron's axon in one place. The `map` must be exhaustive: you must provide a handler for each collateral key of `axon`. This gives you compile-time safety: if someone adds a new collateral later, TypeScript will immediately flag missing handlers.
|
|
128
|
+
|
|
129
|
+
- You can pass either a full dendrite object per key or just a response function shorthand.
|
|
130
|
+
- Payload types are inferred from the followed axon.
|
|
131
|
+
|
|
132
|
+
This pattern is especially useful for domain-oriented neurons that must react to every way a record can be created/changed. For example, an email-notifier neuron can safely ensure emails are sent for every creation path; if a new creation collateral is introduced, the build will fail until the notifier adds a corresponding handler.
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
import { withCtx, collateral } from '@cnstra/core';
|
|
136
|
+
|
|
137
|
+
// Order domain model (axon)
|
|
138
|
+
const order = {
|
|
139
|
+
created: collateral<{ id: string; amount: number }>('order:created'),
|
|
140
|
+
updated: collateral<{ id: string; changes: Record<string, unknown> }>('order:updated'),
|
|
141
|
+
cancelled: collateral<{ id: string; reason?: string }>('order:cancelled'),
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// Mailer neuron must react to ALL order events
|
|
145
|
+
withCtx()
|
|
146
|
+
.neuron('order-mailer', { /* your axon if you emit follow-up signals */ })
|
|
147
|
+
.bind(order, {
|
|
148
|
+
created: (payload) => {
|
|
149
|
+
sendEmail(`Order created #${payload.id} for $${payload.amount}`);
|
|
150
|
+
return undefined;
|
|
151
|
+
},
|
|
152
|
+
updated: (payload) => {
|
|
153
|
+
sendEmail(`Order updated #${payload.id} (changes: ${Object.keys(payload.changes).join(', ')})`);
|
|
154
|
+
return undefined;
|
|
155
|
+
},
|
|
156
|
+
cancelled: (payload) => {
|
|
157
|
+
sendEmail(`Order cancelled #${payload.id}${payload.reason ? `: ${payload.reason}` : ''}`);
|
|
158
|
+
return undefined;
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// If later someone adds a new event variant, e.g. refunds:
|
|
163
|
+
// const order = { ...order, refunded: collateral<{ id: string; amount: number }>('order:refunded') };
|
|
164
|
+
// TypeScript will now error until you also add a `refunded` handler in the .bind(...) map.
|
|
165
|
+
```
|
|
166
|
+
|
|
113
167
|
### `CNS` Class
|
|
114
168
|
|
|
115
169
|
The main orchestrator that manages signal flow between neurons.
|
|
@@ -123,6 +177,14 @@ new CNS(neurons, options?)
|
|
|
123
177
|
- `neurons`: Array of neurons that process signals
|
|
124
178
|
- `options`: Optional CNS configuration
|
|
125
179
|
|
|
180
|
+
#### Global listeners
|
|
181
|
+
```typescript
|
|
182
|
+
const unsubscribe = cns.addResponseListener(r => {
|
|
183
|
+
// fires for every stimulation (input + outputs)
|
|
184
|
+
});
|
|
185
|
+
// unsubscribe();
|
|
186
|
+
```
|
|
187
|
+
|
|
126
188
|
#### `stimulate()` Method
|
|
127
189
|
```typescript
|
|
128
190
|
cns.stimulate(signal, options?)
|
|
@@ -192,6 +254,7 @@ cns.stimulate(signal, {
|
|
|
192
254
|
// Cancel after 5 seconds
|
|
193
255
|
setTimeout(() => controller.abort(), 5000);
|
|
194
256
|
```
|
|
257
|
+
Inside dendrites, read it via `ctx.abortSignal`.
|
|
195
258
|
|
|
196
259
|
### `stimulationId?: string`
|
|
197
260
|
Custom identifier for this stimulation cascade. Auto-generated if not provided.
|
|
@@ -220,6 +283,14 @@ await cns.stimulate(signal, {
|
|
|
220
283
|
});
|
|
221
284
|
```
|
|
222
285
|
|
|
286
|
+
#### Per‑neuron global concurrency
|
|
287
|
+
Set a limit per neuron; parallel stimulations share the same gate.
|
|
288
|
+
```typescript
|
|
289
|
+
const worker = neuron('worker', { out })
|
|
290
|
+
.setConcurrency(2)
|
|
291
|
+
.dendrite({ /* ... */ });
|
|
292
|
+
```
|
|
293
|
+
|
|
223
294
|
### `ctx?: ICNSStimulationContextStore`
|
|
224
295
|
Provide existing context store for recovery/retry scenarios.
|
|
225
296
|
|
package/dist/CNS.d.ts
CHANGED
|
@@ -5,7 +5,8 @@ import { TCNSSubscriber } from './types/TCNSSubscriber';
|
|
|
5
5
|
import { TCNSOptions } from './types/TCNSOptions';
|
|
6
6
|
import { TCNSStimulationOptions } from './types/TCNSStimulationOptions';
|
|
7
7
|
import { TCNSSignal } from './types/TCNSSignal';
|
|
8
|
-
|
|
8
|
+
import { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';
|
|
9
|
+
export declare class CNS<TCollateralType extends string, TNeuronName extends string, TNeuron extends TCNSNeuron<any, TNeuronName, any, any, any, any, any>, TDendrite extends TCNSDendrite<any, any, any, any, any, any>> implements ICNS<TNeuron, TDendrite> {
|
|
9
10
|
protected readonly neurons: TNeuron[];
|
|
10
11
|
readonly options?: TCNSOptions | undefined;
|
|
11
12
|
/**
|
|
@@ -31,7 +32,32 @@ export declare class CNS<TCollateralId extends string, TNeuronId extends string,
|
|
|
31
32
|
* Precomputed ancestor sets for each SCC for fast reachability checks
|
|
32
33
|
*/
|
|
33
34
|
private sccAncestors;
|
|
35
|
+
/**
|
|
36
|
+
* Global per-neuron concurrency gates shared across all stimulations.
|
|
37
|
+
*/
|
|
38
|
+
private readonly neuronGates;
|
|
39
|
+
/**
|
|
40
|
+
* Global task queue used by stimulation to schedule per-neuron gated work.
|
|
41
|
+
* Does not replace per-stimulation concurrency; only coordinates global per-neuron limits.
|
|
42
|
+
*/
|
|
43
|
+
private readonly globalTaskQueue;
|
|
44
|
+
protected readonly instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>;
|
|
45
|
+
/**
|
|
46
|
+
* Global response listeners applied to every stimulation.
|
|
47
|
+
*/
|
|
48
|
+
private readonly globalResponseListeners;
|
|
34
49
|
constructor(neurons: TNeuron[], options?: TCNSOptions | undefined);
|
|
50
|
+
/**
|
|
51
|
+
* Validate uniqueness constraints:
|
|
52
|
+
* - neuron names are unique and non-empty
|
|
53
|
+
* - axon collateral types are globally unique (single owner)
|
|
54
|
+
* - the same collateral instance cannot be owned by multiple neurons
|
|
55
|
+
* Throws aggregated error if violations are found.
|
|
56
|
+
*/
|
|
57
|
+
private validateUniqueIdentifiers;
|
|
58
|
+
addResponseListener(listener: (response: any) => void): () => void;
|
|
59
|
+
wrapOnResponse<T>(local?: (response: T) => void): (response: T) => void;
|
|
60
|
+
protected runWithNeuronConcurrency(neuron: TNeuron, fn: () => (() => void) | Promise<() => void>): Promise<void>;
|
|
35
61
|
private buildIndexes;
|
|
36
62
|
/**
|
|
37
63
|
* Build the neuron graph where neurons are connected if one can stimulate the other.
|
|
@@ -59,18 +85,18 @@ export declare class CNS<TCollateralId extends string, TNeuronId extends string,
|
|
|
59
85
|
* Returns true if the neuron is in a strongly connected component with more than one member,
|
|
60
86
|
* or if it's in a single-member SCC that can reach itself.
|
|
61
87
|
*/
|
|
62
|
-
|
|
88
|
+
getSCCSetByNeuronName(neuronName: string): Set<string> | undefined;
|
|
63
89
|
/**
|
|
64
90
|
* Get the SCC index for a given neuron ID
|
|
65
91
|
*/
|
|
66
|
-
|
|
92
|
+
getSccIndexByNeuronName(neuronName: string): number | undefined;
|
|
67
93
|
/**
|
|
68
94
|
* Check if a neuron can be guaranteed not to be visited again during the current propagation.
|
|
69
95
|
* This is the core logic for safe context cleanup.
|
|
70
96
|
*/
|
|
71
|
-
canNeuronBeGuaranteedDone(
|
|
72
|
-
getParentNeuronByCollateralId(
|
|
73
|
-
getSubscribers(
|
|
74
|
-
stimulate<TInputPayload extends TOutputPayload, TOutputPayload>(signal: TCNSSignal<
|
|
97
|
+
canNeuronBeGuaranteedDone(neuronName: string, activeSccCounts: Map<number, number>): boolean;
|
|
98
|
+
getParentNeuronByCollateralId(collateralType: TCollateralType): TNeuron | undefined;
|
|
99
|
+
getSubscribers(collateralType: TCollateralType): TCNSSubscriber<TNeuron, TDendrite>[];
|
|
100
|
+
stimulate<TInputPayload extends TOutputPayload, TOutputPayload>(signal: TCNSSignal<TCollateralType, TInputPayload>, options?: TCNSStimulationOptions<TCollateralType, TInputPayload, TOutputPayload>): void;
|
|
75
101
|
}
|
|
76
102
|
//# sourceMappingURL=CNS.d.ts.map
|
package/dist/CNS.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CNS.d.ts","sourceRoot":"","sources":["../src/CNS.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGxE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,qBAAa,GAAG,CACZ,
|
|
1
|
+
{"version":3,"file":"CNS.d.ts","sourceRoot":"","sources":["../src/CNS.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGxE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,qBAAa,GAAG,CACZ,eAAe,SAAS,MAAM,EAC9B,WAAW,SAAS,MAAM,EAC1B,OAAO,SAAS,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACrE,SAAS,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAC9D,YAAW,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;IAwD7B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE;aACrB,OAAO,CAAC,EAAE,WAAW;IAvDzC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAGZ;IAEJ,OAAO,CAAC,0BAA0B,CAAuC;IAEzE;;;OAGG;IACI,2BAA2B,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAM;IAEvD;;OAEG;IACH,OAAO,CAAC,WAAW,CAA6B;IAEhD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAuC;IAErD;;OAEG;IACH,OAAO,CAAC,YAAY,CAAuC;IAE3D;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGxB;IAEJ;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;IACtD,SAAS,CAAC,QAAQ,CAAC,mBAAmB,kCACI;IAE1C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA+B;gBAGhD,OAAO,EAAE,OAAO,EAAE,EACrB,OAAO,CAAC,EAAE,WAAW,YAAA;IASzC;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB;IAuB1B,mBAAmB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAWlE,cAAc,CAAC,CAAC,EACnB,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,GAC9B,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI;IAqBxB,SAAS,CAAC,wBAAwB,CAC9B,MAAM,EAAE,OAAO,EACf,EAAE,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,GAC7C,OAAO,CAAC,IAAI,CAAC;IA0DhB,OAAO,CAAC,YAAY;IAuBpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiCxB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAsEhB;;OAEG;IACH,OAAO,CAAC,WAAW;IA6BnB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAiDzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;;OAIG;IACI,qBAAqB,CAAC,UAAU,EAAE,MAAM;IAQ/C;;OAEG;IACI,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAItE;;;OAGG;IACI,yBAAyB,CAC5B,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,OAAO;IA4BH,6BAA6B,CAAC,cAAc,EAAE,eAAe;IAI7D,cAAc,CACjB,cAAc,EAAE,eAAe,GAChC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE;IAIhC,SAAS,CAAC,aAAa,SAAS,cAAc,EAAE,cAAc,EACjE,MAAM,EAAE,UAAU,CAAC,eAAe,EAAE,aAAa,CAAC,EAClD,OAAO,CAAC,EAAE,sBAAsB,CAC5B,eAAe,EACf,aAAa,EACb,cAAc,CACjB;CAgBR"}
|
package/dist/CNSCollateral.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { TCNSSignal } from './types/TCNSSignal';
|
|
2
2
|
import { ICNSCollateral } from './interfaces/ICNSCollateral';
|
|
3
|
-
export declare class CNSCollateral<
|
|
4
|
-
readonly
|
|
5
|
-
constructor(
|
|
6
|
-
createSignal(): TCNSSignal<
|
|
7
|
-
createSignal(payload: TPayload): TCNSSignal<
|
|
3
|
+
export declare class CNSCollateral<TType extends string, TPayload> implements ICNSCollateral<TType, TPayload> {
|
|
4
|
+
readonly type: TType;
|
|
5
|
+
constructor(type: TType);
|
|
6
|
+
createSignal(): TCNSSignal<TType, TPayload>;
|
|
7
|
+
createSignal(payload: TPayload): TCNSSignal<TType, TPayload>;
|
|
8
8
|
}
|
|
9
9
|
//# sourceMappingURL=CNSCollateral.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CNSCollateral.d.ts","sourceRoot":"","sources":["../src/CNSCollateral.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,qBAAa,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"CNSCollateral.d.ts","sourceRoot":"","sources":["../src/CNSCollateral.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,qBAAa,aAAa,CAAC,KAAK,SAAS,MAAM,EAAE,QAAQ,CACrD,YAAW,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC;aAEd,IAAI,EAAE,KAAK;gBAAX,IAAI,EAAE,KAAK;IAEvC,YAAY,IAAI,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC;IAC3C,YAAY,CAAC,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC;CAI/D"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { TCNSStimulationQueueItem } from './types/TCNSStimulationQueueItem';
|
|
2
2
|
import { TCNSNeuron } from './types/TCNSNeuron';
|
|
3
3
|
import { TCNSDendrite } from './types/TCNSDendrite';
|
|
4
|
-
export declare class CNSFunctionalQueue<
|
|
4
|
+
export declare class CNSFunctionalQueue<TCollateralType extends string, TNeuronName extends string, TNeuron extends TCNSNeuron<any, TNeuronName, TCollateralType, any, any, any, any>, TDendrite extends TCNSDendrite<any, any, any, any, any, any>> {
|
|
5
5
|
private readonly processor;
|
|
6
6
|
protected readonly concurrency?: number | undefined;
|
|
7
7
|
protected readonly abortSignal?: AbortSignal | undefined;
|
|
@@ -13,13 +13,13 @@ export declare class CNSFunctionalQueue<TCollateralId extends string, TNeuronId
|
|
|
13
13
|
protected activeOperations: number;
|
|
14
14
|
private pumping;
|
|
15
15
|
private needsPump;
|
|
16
|
-
constructor(processor: (item: TCNSStimulationQueueItem<
|
|
16
|
+
constructor(processor: (item: TCNSStimulationQueueItem<TCollateralType, TNeuronName, TNeuron, TDendrite>) => (() => void) | Promise<() => void>, concurrency?: number | undefined, abortSignal?: AbortSignal | undefined, initialCapacity?: number);
|
|
17
17
|
protected get canStartOperation(): boolean;
|
|
18
18
|
private resize;
|
|
19
19
|
private dequeue;
|
|
20
20
|
private enqueueItem;
|
|
21
21
|
protected pump(): void;
|
|
22
|
-
enqueue(x: TCNSStimulationQueueItem<
|
|
22
|
+
enqueue(x: TCNSStimulationQueueItem<TCollateralType, TNeuronName, TNeuron, TDendrite>): void;
|
|
23
23
|
get length(): number;
|
|
24
24
|
getActiveOperationsCount(): number;
|
|
25
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CNSFunctionalQueue.d.ts","sourceRoot":"","sources":["../src/CNSFunctionalQueue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,qBAAa,kBAAkB,CAC3B,
|
|
1
|
+
{"version":3,"file":"CNSFunctionalQueue.d.ts","sourceRoot":"","sources":["../src/CNSFunctionalQueue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,qBAAa,kBAAkB,CAC3B,eAAe,SAAS,MAAM,EAC9B,WAAW,SAAS,MAAM,EAC1B,OAAO,SAAS,UAAU,CACtB,GAAG,EACH,WAAW,EACX,eAAe,EACf,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,CACN,EACD,SAAS,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAmBxD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAQ1B,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM;IACvC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW;IA1BhD,OAAO,CAAC,KAAK,CAKJ;IACT,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,QAAQ,CAAM;IACtB,SAAS,CAAC,gBAAgB,SAAK;IAG/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;gBAGL,SAAS,EAAE,CACxB,IAAI,EAAE,wBAAwB,CAC1B,eAAe,EACf,WAAW,EACX,OAAO,EACP,SAAS,CACZ,KACA,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,EACpB,WAAW,CAAC,EAAE,MAAM,YAAA,EACpB,WAAW,CAAC,EAAE,WAAW,YAAA,EAC5C,eAAe,CAAC,EAAE,MAAM;IAQ5B,SAAS,KAAK,iBAAiB,IAAI,OAAO,CAGzC;IAED,OAAO,CAAC,MAAM;IAgBd,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,WAAW;IAiBnB,SAAS,CAAC,IAAI;IAwDd,OAAO,CACH,CAAC,EAAE,wBAAwB,CACvB,eAAe,EACf,WAAW,EACX,OAAO,EACP,SAAS,CACZ;IAQL,IAAI,MAAM,WAET;IAED,wBAAwB;CAG3B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare class CNSInstanceNeuronQueue<TNeuron extends {
|
|
2
|
+
name: string;
|
|
3
|
+
concurrency?: number;
|
|
4
|
+
}> {
|
|
5
|
+
private readonly gates;
|
|
6
|
+
run(neuron: TNeuron, fn: () => (() => void) | Promise<() => void>): (() => void) | Promise<() => void>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=CNSInstanceNeuronQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CNSInstanceNeuronQueue.d.ts","sourceRoot":"","sources":["../src/CNSInstanceNeuronQueue.ts"],"names":[],"mappings":"AAAA,qBAAa,sBAAsB,CAC/B,OAAO,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;IAEtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAGlB;IAEJ,GAAG,CACC,MAAM,EAAE,OAAO,EACf,EAAE,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,GAC7C,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;CAoDxC"}
|
package/dist/CNSStimulation.d.ts
CHANGED
|
@@ -3,30 +3,32 @@ import { TCNSStimulationOptions } from './types/TCNSStimulationOptions';
|
|
|
3
3
|
import { TCNSNeuron } from './types/TCNSNeuron';
|
|
4
4
|
import { TCNSDendrite } from './types/TCNSDendrite';
|
|
5
5
|
import { TCNSSubscriber } from './types/TCNSSubscriber';
|
|
6
|
+
import { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';
|
|
6
7
|
import { TCNSSignal } from './types/TCNSSignal';
|
|
7
|
-
export declare class CNSStimulation<
|
|
8
|
+
export declare class CNSStimulation<TCollateralType extends string, TNeuronName extends string, TNeuron extends TCNSNeuron<any, TNeuronName, TCollateralType, any, any, any, any>, TDendrite extends TCNSDendrite<any, any, any, any, any, any>, TInputPayload, TOutputPayload> {
|
|
8
9
|
private readonly cns;
|
|
9
|
-
readonly options?: TCNSStimulationOptions<
|
|
10
|
+
readonly options?: TCNSStimulationOptions<TCollateralType, TInputPayload, TOutputPayload> | undefined;
|
|
10
11
|
private readonly ctx;
|
|
11
12
|
private readonly queue;
|
|
12
13
|
private readonly nueronVisitMap?;
|
|
14
|
+
private readonly instanceNeuronQueue;
|
|
13
15
|
private scheduledCount;
|
|
14
16
|
/**
|
|
15
17
|
* Track active SCCs: SCC index -> count of active neurons in that SCC
|
|
16
18
|
*/
|
|
17
19
|
private readonly activeSccCounts;
|
|
18
20
|
readonly id: string;
|
|
19
|
-
constructor(cns: ICNS<TNeuron, TDendrite>, options?: TCNSStimulationOptions<
|
|
21
|
+
constructor(cns: ICNS<TNeuron, TDendrite>, instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>, options?: TCNSStimulationOptions<TCollateralType, TInputPayload, TOutputPayload> | undefined);
|
|
20
22
|
protected get concurrencyEnabled(): boolean;
|
|
21
23
|
protected get autoCleanupContextsEnabled(): boolean;
|
|
22
24
|
/**
|
|
23
25
|
* Mark a neuron as active (being processed)
|
|
24
26
|
*/
|
|
25
|
-
protected markNeuronActive(neuronId:
|
|
27
|
+
protected markNeuronActive(neuronId: TNeuronName): void;
|
|
26
28
|
/**
|
|
27
29
|
* Mark a neuron as inactive (finished processing)
|
|
28
30
|
*/
|
|
29
|
-
protected markNeuronInactive(neuronId:
|
|
31
|
+
protected markNeuronInactive(neuronId: TNeuronName): void;
|
|
30
32
|
/**
|
|
31
33
|
* Increment the active count for the SCC containing this neuron
|
|
32
34
|
*/
|
|
@@ -38,15 +40,15 @@ export declare class CNSStimulation<TCollateralId extends string, TNeuronId exte
|
|
|
38
40
|
/**
|
|
39
41
|
* Check if a neuron can be guaranteed not to be visited again
|
|
40
42
|
*/
|
|
41
|
-
protected canNeuronBeGuaranteedDone(neuronId:
|
|
43
|
+
protected canNeuronBeGuaranteedDone(neuronId: TNeuronName): boolean;
|
|
42
44
|
protected cleanupCtxIfNeeded(neuron: TNeuron): void;
|
|
43
|
-
protected createSubscriberQueueItem(subscriber: TCNSSubscriber<TNeuron, TDendrite>, inputSignal?: TCNSSignal<
|
|
44
|
-
neuronId:
|
|
45
|
+
protected createSubscriberQueueItem(subscriber: TCNSSubscriber<TNeuron, TDendrite>, inputSignal?: TCNSSignal<TCollateralType, any>): {
|
|
46
|
+
neuronId: TNeuronName;
|
|
45
47
|
subscriber: TCNSSubscriber<TNeuron, TDendrite>;
|
|
46
|
-
inputSignal: TCNSSignal<
|
|
48
|
+
inputSignal: TCNSSignal<TCollateralType, any> | undefined;
|
|
47
49
|
};
|
|
48
50
|
private processQueueItem;
|
|
49
|
-
protected processResponse(inputSignal?: TCNSSignal<
|
|
50
|
-
responseToSignal(signal: TCNSSignal<
|
|
51
|
+
protected processResponse(inputSignal?: TCNSSignal<TCollateralType, TInputPayload>, outputSignal?: TCNSSignal<TCollateralType, TOutputPayload>, error?: any): void;
|
|
52
|
+
responseToSignal(signal: TCNSSignal<TCollateralType, TOutputPayload>): void;
|
|
51
53
|
}
|
|
52
54
|
//# sourceMappingURL=CNSStimulation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CNSStimulation.d.ts","sourceRoot":"","sources":["../src/CNSStimulation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,qBAAa,cAAc,CACvB,
|
|
1
|
+
{"version":3,"file":"CNSStimulation.d.ts","sourceRoot":"","sources":["../src/CNSStimulation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,qBAAa,cAAc,CACvB,eAAe,SAAS,MAAM,EAC9B,WAAW,SAAS,MAAM,EAC1B,OAAO,SAAS,UAAU,CACtB,GAAG,EACH,WAAW,EACX,eAAe,EACf,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,CACN,EACD,SAAS,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC5D,aAAa,EACb,cAAc;IAqBV,OAAO,CAAC,QAAQ,CAAC,GAAG;aAEJ,OAAO,CAAC,EAAE,sBAAsB,CAC5C,eAAe,EACf,aAAa,EACb,cAAc,CACjB;IAzBL,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA8B;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAKpB;IACF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA2B;IAC3D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAkC;IACtE,OAAO,CAAC,cAAc,CAAK;IAE3B;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAE7D,SAAgB,EAAE,EAAE,MAAM,CAAC;gBAGN,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAC9C,mBAAmB,EAAE,sBAAsB,CAAC,OAAO,CAAC,EACpC,OAAO,CAAC,EAAE,sBAAsB,CAC5C,eAAe,EACf,aAAa,EACb,cAAc,CACjB,YAAA;IAoBL,SAAS,KAAK,kBAAkB,IAAI,OAAO,CAK1C;IAED,SAAS,KAAK,0BAA0B,IAAI,OAAO,CAElD;IAED;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAMvD;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAMzD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,SAAS,CAAC,yBAAyB,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO;IAQnE,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IASnD,SAAS,CAAC,yBAAyB,CAC/B,UAAU,EAAE,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAC9C,WAAW,CAAC,EAAE,UAAU,CAAC,eAAe,EAAE,GAAG,CAAC;;;;;IA2BlD,OAAO,CAAC,gBAAgB;IAoExB,SAAS,CAAC,eAAe,CACrB,WAAW,CAAC,EAAE,UAAU,CAAC,eAAe,EAAE,aAAa,CAAC,EACxD,YAAY,CAAC,EAAE,UAAU,CAAC,eAAe,EAAE,cAAc,CAAC,EAC1D,KAAK,CAAC,EAAE,GAAG,GACZ,IAAI;IAoDA,gBAAgB,CACnB,MAAM,EAAE,UAAU,CAAC,eAAe,EAAE,cAAc,CAAC,GACpD,IAAI;CAWV"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare class CNSTaskQueue {
|
|
2
|
+
private readonly concurrency?;
|
|
3
|
+
private pumping;
|
|
4
|
+
private needsPump;
|
|
5
|
+
private activeOperations;
|
|
6
|
+
private items;
|
|
7
|
+
constructor(concurrency?: number | undefined);
|
|
8
|
+
private get canStartOperation();
|
|
9
|
+
enqueue(task: () => (() => void) | Promise<() => void>): Promise<void>;
|
|
10
|
+
private pump;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=CNSTaskQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CNSTaskQueue.d.ts","sourceRoot":"","sources":["../src/CNSTaskQueue.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IAWT,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAVzC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAK;IAE7B,OAAO,CAAC,KAAK,CAIL;gBAEqB,WAAW,CAAC,EAAE,MAAM,YAAA;IAEjD,OAAO,KAAK,iBAAiB,GAG5B;IAED,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtE,OAAO,CAAC,IAAI;CAqEf"}
|
package/dist/factory/index.d.ts
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import { CNSCollateral } from '../CNSCollateral';
|
|
2
2
|
import { TCNSAxon } from '../types/TCNSAxon';
|
|
3
3
|
import { TCNSDendrite } from '../types/TCNSDendrite';
|
|
4
|
-
export declare const collateral: <TPayload = undefined,
|
|
5
|
-
type InterNeuronAPI<TContextValue,
|
|
6
|
-
|
|
4
|
+
export declare const collateral: <TPayload = undefined, TType extends string = string>(type: TType) => CNSCollateral<TType, TPayload>;
|
|
5
|
+
type InterNeuronAPI<TContextValue, TNameType extends string, TReceiverCollateralType extends string, TReceiverAxonCollateralPayload, TAxonType extends TCNSAxon<TReceiverCollateralType, TReceiverAxonCollateralPayload>> = {
|
|
6
|
+
name: TNameType;
|
|
7
7
|
axon: TAxonType;
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
concurrency?: number;
|
|
9
|
+
dendrites: TCNSDendrite<TContextValue, string, unknown, TReceiverCollateralType, TReceiverAxonCollateralPayload, TAxonType>[];
|
|
10
|
+
setConcurrency: (n: number | undefined) => InterNeuronAPI<TContextValue, TNameType, TReceiverCollateralType, TReceiverAxonCollateralPayload, TAxonType>;
|
|
11
|
+
bind: <TFollowAxon extends TCNSAxon<string, any>>(axon: TFollowAxon, dendrites: {
|
|
12
|
+
[K in keyof TFollowAxon]: TCNSDendrite<TContextValue, K & string, TFollowAxon extends TCNSAxon<any, infer P> ? P : never, TReceiverCollateralType, TReceiverAxonCollateralPayload, TAxonType> | TCNSDendrite<TContextValue, K & string, TFollowAxon extends TCNSAxon<any, infer P> ? P : never, TReceiverCollateralType, TReceiverAxonCollateralPayload, TAxonType>['response'];
|
|
13
|
+
}) => InterNeuronAPI<TContextValue, TNameType, TReceiverCollateralType, TReceiverAxonCollateralPayload, TAxonType>;
|
|
14
|
+
dendrite: <TSenderExactCollateralType extends string, TSenderExactAxonCollateralPayload>(s: TCNSDendrite<TContextValue, TSenderExactCollateralType, TSenderExactAxonCollateralPayload, TReceiverCollateralType, TReceiverAxonCollateralPayload, TAxonType>) => InterNeuronAPI<TContextValue, TNameType, TReceiverCollateralType, TReceiverAxonCollateralPayload, TAxonType>;
|
|
10
15
|
};
|
|
11
|
-
export declare const neuron: <TContextValue,
|
|
16
|
+
export declare const neuron: <TContextValue, TNameType extends string, TReceiverCollateralType extends string, TReceiverAxonCollateralPayload, TAxonType extends TCNSAxon<TReceiverCollateralType, TReceiverAxonCollateralPayload>>(name: TNameType, axon: TAxonType) => InterNeuronAPI<TContextValue, TNameType, TReceiverCollateralType, TReceiverAxonCollateralPayload, TAxonType>;
|
|
12
17
|
export declare const withCtx: <TContextValue>() => {
|
|
13
|
-
neuron: <
|
|
18
|
+
neuron: <TNameType extends string, TReceiverCollateralType extends string, TReceiverAxonCollateralPayload, TAxonType extends TCNSAxon<TReceiverCollateralType, TReceiverAxonCollateralPayload>>(name: TNameType, axon: TAxonType) => InterNeuronAPI<TContextValue, TNameType, TReceiverCollateralType, TReceiverAxonCollateralPayload, TAxonType>;
|
|
14
19
|
};
|
|
15
20
|
export {};
|
|
16
21
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/factory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,eAAO,MAAM,UAAU,GAAI,QAAQ,GAAG,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/factory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,eAAO,MAAM,UAAU,GAAI,QAAQ,GAAG,SAAS,EAAE,KAAK,SAAS,MAAM,GAAG,MAAM,EAC1E,MAAM,KAAK,mCAC8B,CAAC;AAE9C,KAAK,cAAc,CACf,aAAa,EACb,SAAS,SAAS,MAAM,EACxB,uBAAuB,SAAS,MAAM,EACtC,8BAA8B,EAC9B,SAAS,SAAS,QAAQ,CACtB,uBAAuB,EACvB,8BAA8B,CACjC,IACD;IACA,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,YAAY,CACnB,aAAa,EACb,MAAM,EACN,OAAO,EACP,uBAAuB,EACvB,8BAA8B,EAC9B,SAAS,CACZ,EAAE,CAAC;IACJ,cAAc,EAAE,CACZ,CAAC,EAAE,MAAM,GAAG,SAAS,KACpB,cAAc,CACf,aAAa,EACb,SAAS,EACT,uBAAuB,EACvB,8BAA8B,EAC9B,SAAS,CACZ,CAAC;IACF,IAAI,EAAE,CAAC,WAAW,SAAS,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5C,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE;SACN,CAAC,IAAI,MAAM,WAAW,GACjB,YAAY,CACR,aAAa,EACb,CAAC,GAAG,MAAM,EACV,WAAW,SAAS,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,EACtD,uBAAuB,EACvB,8BAA8B,EAC9B,SAAS,CACZ,GACD,YAAY,CACR,aAAa,EACb,CAAC,GAAG,MAAM,EACV,WAAW,SAAS,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,EACtD,uBAAuB,EACvB,8BAA8B,EAC9B,SAAS,CACZ,CAAC,UAAU,CAAC;KACtB,KACA,cAAc,CACf,aAAa,EACb,SAAS,EACT,uBAAuB,EACvB,8BAA8B,EAC9B,SAAS,CACZ,CAAC;IACF,QAAQ,EAAE,CACN,0BAA0B,SAAS,MAAM,EACzC,iCAAiC,EAEjC,CAAC,EAAE,YAAY,CACX,aAAa,EACb,0BAA0B,EAC1B,iCAAiC,EACjC,uBAAuB,EACvB,8BAA8B,EAC9B,SAAS,CACZ,KACA,cAAc,CACf,aAAa,EACb,SAAS,EACT,uBAAuB,EACvB,8BAA8B,EAC9B,SAAS,CACZ,CAAC;CACL,CAAC;AAGF,eAAO,MAAM,MAAM,GACf,aAAa,EACb,SAAS,SAAS,MAAM,EACxB,uBAAuB,SAAS,MAAM,EACtC,8BAA8B,EAC9B,SAAS,SAAS,QAAQ,CACtB,uBAAuB,EACvB,8BAA8B,CACjC,EAED,MAAM,SAAS,EACf,MAAM,SAAS,KAChB,cAAc,CACb,aAAa,EACb,SAAS,EACT,uBAAuB,EACvB,8BAA8B,EAC9B,SAAS,CAmFZ,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,aAAa;aAE7B,SAAS,SAAS,MAAM,EACxB,uBAAuB,SAAS,MAAM,EACtC,8BAA8B,EAC9B,SAAS,SAAS,QAAQ,CACtB,uBAAuB,EACvB,8BAA8B,CACjC,QAEK,SAAS,QACT,SAAS;CAUrB,CAAC"}
|