@polintpro/proposit-core 0.2.7 → 0.2.9
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 +89 -0
- package/dist/cli/commands/premises.js +2 -2
- package/dist/cli/engine.d.ts +1 -1
- package/dist/cli/engine.js +1 -1
- package/dist/cli/import.d.ts +1 -1
- package/dist/cli/import.js +1 -1
- package/dist/index.d.ts +1 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -12
- package/dist/index.js.map +1 -1
- package/dist/lib/core/ArgumentEngine.d.ts +20 -5
- package/dist/lib/core/ArgumentEngine.d.ts.map +1 -1
- package/dist/lib/core/ArgumentEngine.js +191 -12
- package/dist/lib/core/ArgumentEngine.js.map +1 -1
- package/dist/lib/core/ExpressionManager.d.ts +3 -3
- package/dist/lib/core/ExpressionManager.d.ts.map +1 -1
- package/dist/lib/core/ExpressionManager.js +1 -1
- package/dist/lib/core/ExpressionManager.js.map +1 -1
- package/dist/lib/core/PremiseEngine.d.ts +6 -4
- package/dist/lib/core/PremiseEngine.d.ts.map +1 -1
- package/dist/lib/core/PremiseEngine.js +53 -27
- package/dist/lib/core/PremiseEngine.js.map +1 -1
- package/dist/lib/core/VariableManager.d.ts +2 -2
- package/dist/lib/core/VariableManager.d.ts.map +1 -1
- package/dist/lib/core/VariableManager.js +1 -1
- package/dist/lib/core/VariableManager.js.map +1 -1
- package/dist/lib/core/diff.d.ts +1 -1
- package/dist/lib/core/evaluation/kleene.d.ts +12 -0
- package/dist/lib/core/evaluation/kleene.d.ts.map +1 -0
- package/dist/lib/core/evaluation/kleene.js +29 -0
- package/dist/lib/core/evaluation/kleene.js.map +1 -0
- package/dist/lib/core/evaluation/validation.d.ts +10 -0
- package/dist/lib/core/evaluation/validation.d.ts.map +1 -0
- package/dist/lib/core/evaluation/validation.js +28 -0
- package/dist/lib/core/evaluation/validation.js.map +1 -0
- package/dist/lib/core/relationships.d.ts +2 -2
- package/dist/lib/index.d.ts +10 -8
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +5 -3
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/types/reactive.d.ts +14 -0
- package/dist/lib/types/reactive.d.ts.map +1 -0
- package/dist/lib/types/reactive.js +2 -0
- package/dist/lib/types/reactive.js.map +1 -0
- package/dist/lib/utils/defaultMap.d.ts +17 -0
- package/dist/lib/utils/defaultMap.d.ts.map +1 -0
- package/dist/lib/utils/defaultMap.js +33 -0
- package/dist/lib/utils/defaultMap.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -224,6 +224,79 @@ if (validity.ok) {
|
|
|
224
224
|
}
|
|
225
225
|
```
|
|
226
226
|
|
|
227
|
+
### Using with React
|
|
228
|
+
|
|
229
|
+
`ArgumentEngine` implements the `useSyncExternalStore` contract, so it works as a React external store with no additional dependencies:
|
|
230
|
+
|
|
231
|
+
```tsx
|
|
232
|
+
import { useSyncExternalStore } from "react"
|
|
233
|
+
import { ArgumentEngine } from "@polintpro/proposit-core"
|
|
234
|
+
|
|
235
|
+
// Create the engine outside of React (or in a ref/context)
|
|
236
|
+
const engine = new ArgumentEngine({ id: "arg-1", version: 1 })
|
|
237
|
+
|
|
238
|
+
function ArgumentView() {
|
|
239
|
+
// Subscribe to the full snapshot
|
|
240
|
+
const snapshot = useSyncExternalStore(engine.subscribe, engine.getSnapshot)
|
|
241
|
+
|
|
242
|
+
return (
|
|
243
|
+
<div>
|
|
244
|
+
<h2>Variables</h2>
|
|
245
|
+
<ul>
|
|
246
|
+
{Object.values(snapshot.variables).map((v) => (
|
|
247
|
+
<li key={v.id}>{v.symbol}</li>
|
|
248
|
+
))}
|
|
249
|
+
</ul>
|
|
250
|
+
<h2>Premises</h2>
|
|
251
|
+
{Object.entries(snapshot.premises).map(([id, p]) => (
|
|
252
|
+
<div key={id}>
|
|
253
|
+
Premise {id} — {Object.keys(p.expressions).length} expressions
|
|
254
|
+
</div>
|
|
255
|
+
))}
|
|
256
|
+
</div>
|
|
257
|
+
)
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
For fine-grained reactivity, select a specific slice — React skips re-rendering if the reference is unchanged thanks to structural sharing:
|
|
262
|
+
|
|
263
|
+
```tsx
|
|
264
|
+
function ExpressionView({ premiseId, expressionId }: {
|
|
265
|
+
premiseId: string
|
|
266
|
+
expressionId: string
|
|
267
|
+
}) {
|
|
268
|
+
// Only re-renders when THIS expression changes
|
|
269
|
+
const expression = useSyncExternalStore(
|
|
270
|
+
engine.subscribe,
|
|
271
|
+
() => engine.getSnapshot().premises[premiseId]?.expressions[expressionId]
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
if (!expression) return null
|
|
275
|
+
return <span>{expression.type === "variable" ? expression.variableId : expression.operator}</span>
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
Mutations go through the engine as usual — subscribers are notified automatically:
|
|
280
|
+
|
|
281
|
+
```tsx
|
|
282
|
+
function AddVariableButton() {
|
|
283
|
+
return (
|
|
284
|
+
<button onClick={() => {
|
|
285
|
+
engine.addVariable({
|
|
286
|
+
id: crypto.randomUUID(),
|
|
287
|
+
argumentId: "arg-1",
|
|
288
|
+
argumentVersion: 1,
|
|
289
|
+
symbol: "R",
|
|
290
|
+
})
|
|
291
|
+
}}>
|
|
292
|
+
Add variable R
|
|
293
|
+
</button>
|
|
294
|
+
)
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
227
300
|
### Inserting an expression into the tree
|
|
228
301
|
|
|
229
302
|
`insertExpression` splices a new node between existing nodes. The new expression inherits the **anchor** node's current slot in the tree (`leftNodeId ?? rightNodeId`).
|
|
@@ -489,6 +562,18 @@ Options:
|
|
|
489
562
|
|
|
490
563
|
---
|
|
491
564
|
|
|
565
|
+
#### `subscribe(listener)` → `() => void`
|
|
566
|
+
|
|
567
|
+
Registers a listener that is called synchronously after every mutation (including mutations through child `PremiseEngine` instances). Returns an unsubscribe function. Compatible with React's `useSyncExternalStore`.
|
|
568
|
+
|
|
569
|
+
---
|
|
570
|
+
|
|
571
|
+
#### `getSnapshot()` → `TReactiveSnapshot`
|
|
572
|
+
|
|
573
|
+
Returns a `TReactiveSnapshot` with structurally-shared sub-objects. Unchanged slices keep the same object reference between calls, enabling fine-grained React selectors via `useSyncExternalStore`. The snapshot is lazily rebuilt only when dirty regions exist.
|
|
574
|
+
|
|
575
|
+
---
|
|
576
|
+
|
|
492
577
|
#### `snapshot()` → `TArgumentEngineSnapshot`
|
|
493
578
|
|
|
494
579
|
Returns a serialisable snapshot of the full engine state (`{ argument, variables, premises, conclusionPremiseId, config }`). Each premise snapshot includes its metadata and expression snapshot. Can be used to reconstruct the engine via `ArgumentEngine.fromSnapshot()` or to restore state in place via `rollback()`.
|
|
@@ -786,6 +871,10 @@ Hierarchical snapshot types for capturing and restoring engine state:
|
|
|
786
871
|
| `TVariableManagerSnapshot` | `variables`, `config` |
|
|
787
872
|
| `TPremiseEngineSnapshot` | `premise` metadata, `rootExpressionId`, `expressions` snapshot, `config` |
|
|
788
873
|
| `TArgumentEngineSnapshot` | `argument`, `variables` snapshot, `premises` snapshots, `conclusionPremiseId`, `config` |
|
|
874
|
+
| `TReactiveSnapshot` | `argument`, `variables` (Record by ID), `premises` (Record by ID with expressions), `roles` |
|
|
875
|
+
| `TReactivePremiseSnapshot` | `premise`, `expressions` (Record by ID), `rootExpressionId` |
|
|
876
|
+
|
|
877
|
+
`TReactiveSnapshot` is the type returned by `getSnapshot()` — optimized for React with Record-based lookups and structural sharing. The other snapshot types are for serialization and restoration.
|
|
789
878
|
|
|
790
879
|
Each snapshot captures only what the class **owns**. Dependencies (e.g., variables for a premise) are excluded and must be passed separately during restoration via `fromSnapshot()`.
|
|
791
880
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { Command } from "commander";
|
|
3
|
-
import { PremiseEngine } from "../../lib/core/
|
|
4
|
-
import { VariableManager } from "../../lib/core/
|
|
3
|
+
import { PremiseEngine } from "../../lib/core/premiseEngine.js";
|
|
4
|
+
import { VariableManager } from "../../lib/core/variableManager.js";
|
|
5
5
|
import { errorExit, printJson, printLine, requireConfirmation, } from "../output.js";
|
|
6
6
|
import { readArgumentMeta, readVersionMeta } from "../storage/arguments.js";
|
|
7
7
|
import { deletePremiseDir, listPremiseIds, premiseExists, readPremiseData, readPremiseMeta, writePremiseData, writePremiseMeta, } from "../storage/premises.js";
|
package/dist/cli/engine.d.ts
CHANGED
package/dist/cli/engine.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
|
-
import { ArgumentEngine } from "../lib/core/
|
|
2
|
+
import { ArgumentEngine } from "../lib/core/argumentEngine.js";
|
|
3
3
|
import { getPremisesDir } from "./config.js";
|
|
4
4
|
import { readArgumentMeta, readVersionMeta, writeArgumentMeta, writeVersionMeta, } from "./storage/arguments.js";
|
|
5
5
|
import { listPremiseIds, readPremiseData, readPremiseMeta, writePremiseData, writePremiseMeta, } from "./storage/premises.js";
|
package/dist/cli/import.d.ts
CHANGED
package/dist/cli/import.js
CHANGED
|
@@ -3,7 +3,7 @@ import yaml from "js-yaml";
|
|
|
3
3
|
import { Value } from "typebox/value";
|
|
4
4
|
import { CoreYamlArgumentSchema } from "../lib/schemata/import.js";
|
|
5
5
|
import { parseFormula } from "../lib/core/parser/formula.js";
|
|
6
|
-
import { ArgumentEngine } from "../lib/core/
|
|
6
|
+
import { ArgumentEngine } from "../lib/core/argumentEngine.js";
|
|
7
7
|
import { POSITION_INITIAL } from "../lib/utils/position.js";
|
|
8
8
|
/**
|
|
9
9
|
* Validates that `implies` and `iff` nodes appear only at the AST root.
|
package/dist/index.d.ts
CHANGED
|
@@ -6,20 +6,5 @@
|
|
|
6
6
|
* the primary API, along with all type schemata and the {@link diffArguments}
|
|
7
7
|
* utility.
|
|
8
8
|
*/
|
|
9
|
-
export
|
|
10
|
-
export type { TLogicEngineOptions, TArgumentEngineSnapshot, TPremiseEngineSnapshot, TExpressionManagerSnapshot, TVariableManagerSnapshot, } from "./lib/index.js";
|
|
11
|
-
export * from "./lib/schemata/index.js";
|
|
12
|
-
export * from "./lib/types/diff.js";
|
|
13
|
-
export * from "./lib/types/mutation.js";
|
|
14
|
-
export * from "./lib/types/checksum.js";
|
|
15
|
-
export { computeHash, canonicalSerialize, entityChecksum, } from "./lib/core/checksum.js";
|
|
16
|
-
export { diffArguments, defaultCompareArgument, defaultCompareVariable, defaultComparePremise, defaultCompareExpression, } from "./lib/core/diff.js";
|
|
17
|
-
export * from "./lib/types/relationships.js";
|
|
18
|
-
export { analyzePremiseRelationships, buildPremiseProfile, } from "./lib/core/relationships.js";
|
|
19
|
-
export { DEFAULT_CHECKSUM_CONFIG, createChecksumConfig } from "./lib/consts.js";
|
|
20
|
-
export { parseFormula } from "./lib/core/parser/formula.js";
|
|
21
|
-
export type { FormulaAST } from "./lib/core/parser/formula.js";
|
|
22
|
-
export type { TExpressionInput, TExpressionWithoutPosition, TExpressionUpdate, } from "./lib/core/ExpressionManager.js";
|
|
23
|
-
export { POSITION_MIN, POSITION_MAX, POSITION_INITIAL, DEFAULT_POSITION_CONFIG, midpoint, } from "./lib/utils/position.js";
|
|
24
|
-
export type { TCorePositionConfig } from "./lib/utils/position.js";
|
|
9
|
+
export * from "./lib/index.js";
|
|
25
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,gBAAgB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -6,16 +6,5 @@
|
|
|
6
6
|
* the primary API, along with all type schemata and the {@link diffArguments}
|
|
7
7
|
* utility.
|
|
8
8
|
*/
|
|
9
|
-
export
|
|
10
|
-
export * from "./lib/schemata/index.js";
|
|
11
|
-
export * from "./lib/types/diff.js";
|
|
12
|
-
export * from "./lib/types/mutation.js";
|
|
13
|
-
export * from "./lib/types/checksum.js";
|
|
14
|
-
export { computeHash, canonicalSerialize, entityChecksum, } from "./lib/core/checksum.js";
|
|
15
|
-
export { diffArguments, defaultCompareArgument, defaultCompareVariable, defaultComparePremise, defaultCompareExpression, } from "./lib/core/diff.js";
|
|
16
|
-
export * from "./lib/types/relationships.js";
|
|
17
|
-
export { analyzePremiseRelationships, buildPremiseProfile, } from "./lib/core/relationships.js";
|
|
18
|
-
export { DEFAULT_CHECKSUM_CONFIG, createChecksumConfig } from "./lib/consts.js";
|
|
19
|
-
export { parseFormula } from "./lib/core/parser/formula.js";
|
|
20
|
-
export { POSITION_MIN, POSITION_MAX, POSITION_INITIAL, DEFAULT_POSITION_CONFIG, midpoint, } from "./lib/utils/position.js";
|
|
9
|
+
export * from "./lib/index.js";
|
|
21
10
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,gBAAgB,CAAA"}
|
|
@@ -3,10 +3,11 @@ import type { TCoreArgumentEvaluationOptions, TCoreArgumentEvaluationResult, TCo
|
|
|
3
3
|
import type { TCoreChecksumConfig } from "../types/checksum.js";
|
|
4
4
|
import type { TCorePositionConfig } from "../utils/position.js";
|
|
5
5
|
import type { TCoreMutationResult } from "../types/mutation.js";
|
|
6
|
-
import type {
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
import type {
|
|
6
|
+
import type { TReactiveSnapshot } from "../types/reactive.js";
|
|
7
|
+
import type { TExpressionInput } from "./expressionManager.js";
|
|
8
|
+
import { PremiseEngine } from "./premiseEngine.js";
|
|
9
|
+
import type { TPremiseEngineSnapshot } from "./premiseEngine.js";
|
|
10
|
+
import type { TVariableManagerSnapshot } from "./variableManager.js";
|
|
10
11
|
export type TLogicEngineOptions = {
|
|
11
12
|
checksumConfig?: TCoreChecksumConfig;
|
|
12
13
|
positionConfig?: TCorePositionConfig;
|
|
@@ -35,7 +36,21 @@ export declare class ArgumentEngine<TArg extends TCoreArgument = TCoreArgument,
|
|
|
35
36
|
private checksumDirty;
|
|
36
37
|
private cachedChecksum;
|
|
37
38
|
private expressionIndex;
|
|
39
|
+
private listeners;
|
|
40
|
+
private reactiveDirty;
|
|
41
|
+
private cachedReactiveSnapshot;
|
|
38
42
|
constructor(argument: TOptionalChecksum<TArg>, options?: TLogicEngineOptions);
|
|
43
|
+
/**
|
|
44
|
+
* Registers a listener that is called after every mutation.
|
|
45
|
+
* Returns an unsubscribe function.
|
|
46
|
+
*/
|
|
47
|
+
subscribe: (listener: () => void) => (() => void);
|
|
48
|
+
private notifySubscribers;
|
|
49
|
+
getSnapshot: () => TReactiveSnapshot<TArg, TPremise, TExpr, TVar>;
|
|
50
|
+
private buildVariablesRecord;
|
|
51
|
+
private buildAllPremisesRecord;
|
|
52
|
+
private buildPremiseRecord;
|
|
53
|
+
private markReactiveDirty;
|
|
39
54
|
/** Returns a shallow copy of the argument metadata with checksum attached. */
|
|
40
55
|
getArgument(): TArg;
|
|
41
56
|
/** Renders the argument as a multi-line string with role labels for each premise. */
|
|
@@ -207,4 +222,4 @@ export declare class ArgumentEngine<TArg extends TCoreArgument = TCoreArgument,
|
|
|
207
222
|
*/
|
|
208
223
|
checkValidity(options?: TCoreValidityCheckOptions): TCoreValidityCheckResult;
|
|
209
224
|
}
|
|
210
|
-
//# sourceMappingURL=
|
|
225
|
+
//# sourceMappingURL=argumentEngine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"argumentEngine.d.ts","sourceRoot":"","sources":["../../../src/lib/core/argumentEngine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,aAAa,EACb,YAAY,EACZ,4BAA4B,EAC5B,0BAA0B,EAC1B,iBAAiB,EACpB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EACR,8BAA8B,EAC9B,6BAA6B,EAC7B,sBAAsB,EAEtB,yBAAyB,EAIzB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EAC3B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAE/D,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,sBAAsB,CAAA;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAA4B,MAAM,sBAAsB,CAAA;AASvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAEhE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAEpE,MAAM,MAAM,mBAAmB,GAAG;IAC9B,cAAc,CAAC,EAAE,mBAAmB,CAAA;IACpC,cAAc,CAAC,EAAE,mBAAmB,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,uBAAuB,CAC/B,IAAI,SAAS,aAAa,GAAG,aAAa,EAC1C,QAAQ,SAAS,YAAY,GAAG,YAAY,EAC5C,KAAK,SAAS,4BAA4B,GAAG,4BAA4B,EACzE,IAAI,SAAS,0BAA0B,GAAG,0BAA0B,IACpE;IACA,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACjC,SAAS,EAAE,wBAAwB,CAAC,IAAI,CAAC,CAAA;IACzC,QAAQ,EAAE,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAA;IACnD,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,MAAM,CAAC,EAAE,mBAAmB,CAAA;CAC/B,CAAA;AAED;;;;;;GAMG;AACH,qBAAa,cAAc,CACvB,IAAI,SAAS,aAAa,GAAG,aAAa,EAC1C,QAAQ,SAAS,YAAY,GAAG,YAAY,EAC5C,KAAK,SAAS,4BAA4B,GAAG,4BAA4B,EACzE,IAAI,SAAS,0BAA0B,GAAG,0BAA0B;IAEpE,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,QAAQ,CAAyD;IACzE,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,mBAAmB,CAAoB;IAC/C,OAAO,CAAC,cAAc,CAAC,CAAqB;IAC5C,OAAO,CAAC,cAAc,CAAC,CAAqB;IAC5C,OAAO,CAAC,aAAa,CAAO;IAC5B,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,aAAa,CAMpB;IACD,OAAO,CAAC,sBAAsB,CAA4D;gBAGtF,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,EACjC,OAAO,CAAC,EAAE,mBAAmB;IAcjC;;;OAGG;IACI,SAAS,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAGtD;IAED,OAAO,CAAC,iBAAiB;IAMlB,WAAW,QAAO,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAiEtE;IAED,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,iBAAiB;IA2BzB,8EAA8E;IACvE,WAAW,IAAI,IAAI;IAI1B,qFAAqF;IAC9E,eAAe,IAAI,MAAM;IA0BhC;;;OAGG;IACI,aAAa,CAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,mBAAmB,CAClB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,EAC1C,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,IAAI,CACP;IAID;;;;;OAKG;IACI,mBAAmB,CACtB,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,mBAAmB,CAClB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,EAC1C,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,IAAI,CACP;IA6CD;;;OAGG;IACI,aAAa,CAChB,SAAS,EAAE,MAAM,GAClB,mBAAmB,CAAC,QAAQ,GAAG,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC;IAyBzE,0EAA0E;IACnE,UAAU,CACb,SAAS,EAAE,MAAM,GAClB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,SAAS;IAIzD,4DAA4D;IACrD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C,sDAAsD;IAC/C,cAAc,IAAI,MAAM,EAAE;IAMjC,sDAAsD;IAC/C,YAAY,IAAI,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE;IASnE;;;;;;OAMG;IACI,WAAW,CACd,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,GAClC,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC;IA0BzD;;;;;OAKG;IACI,cAAc,CACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7B,mBAAmB,CAAC,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC;IA0BrE;;;OAGG;IACI,cAAc,CACjB,UAAU,EAAE,MAAM,GACnB,mBAAmB,CAAC,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC;IA+BrE,qDAAqD;IAC9C,YAAY,IAAI,IAAI,EAAE;IAI7B,2EAA2E;IACpE,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIxD,6DAA6D;IACtD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI/C,+EAA+E;IACxE,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAI5D;;;;OAIG;IACI,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;IAQjE,iFAAiF;IAC1E,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAM7D,+EAA+E;IACxE,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAInD,iFAAiF;IAC1E,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvE,iFAAiF;IAC1E,yBAAyB,CAC5B,YAAY,EAAE,MAAM,GACrB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,SAAS;IAMzD,iEAAiE;IAC1D,iBAAiB,IAAI,KAAK,EAAE;IAQnC;;;OAGG;IACI,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,EAAE;IAiB9D,kEAAkE;IAC3D,mBAAmB,IAAI,KAAK,EAAE;IASrC,gGAAgG;IACzF,YAAY,IAAI,sBAAsB;IAQ7C;;;;OAIG;IACI,oBAAoB,CACvB,SAAS,EAAE,MAAM,GAClB,mBAAmB,CAClB,sBAAsB,EACtB,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,IAAI,CACP;IAmBD,yCAAyC;IAClC,sBAAsB,IAAI,mBAAmB,CAChD,sBAAsB,EACtB,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,IAAI,CACP;IAeD,qEAAqE;IAC9D,oBAAoB,IACrB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,GAC1C,SAAS;IAOf;;;OAGG;IACI,sBAAsB,IAAI,aAAa,CAC1C,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,IAAI,CACP,EAAE;IAMH,gEAAgE;IACzD,QAAQ,IAAI,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC;IAevE,wEAAwE;WAC1D,YAAY,CACtB,IAAI,SAAS,aAAa,GAAG,aAAa,EAC1C,QAAQ,SAAS,YAAY,GAAG,YAAY,EAC5C,KAAK,SAAS,4BAA4B,GACtC,4BAA4B,EAChC,IAAI,SAAS,0BAA0B,GAAG,0BAA0B,EAEpE,QAAQ,EAAE,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,GAC/D,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC;IA6B9C;;;;;OAKG;WACW,QAAQ,CAClB,IAAI,SAAS,aAAa,GAAG,aAAa,EAC1C,QAAQ,SAAS,YAAY,GAAG,YAAY,EAC5C,KAAK,SAAS,4BAA4B,GACtC,4BAA4B,EAChC,IAAI,SAAS,0BAA0B,GAAG,0BAA0B,EAEpE,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,EACjC,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,EACpC,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EACvC,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,EACtC,KAAK,EAAE,sBAAsB,EAC7B,MAAM,CAAC,EAAE,mBAAmB,GAC7B,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC;IA4E9C,mEAAmE;IAC5D,QAAQ,CACX,QAAQ,EAAE,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,GAC/D,IAAI;IAmCP;;;;OAIG;IACI,QAAQ,IAAI,MAAM;IAQzB,OAAO,CAAC,eAAe;IA6BvB,OAAO,CAAC,SAAS;IAIjB,sEAAsE;IACtE,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,sBAAsB;IAa9B;;;OAGG;IACI,0BAA0B,IAAI;QACjC,WAAW,EAAE,MAAM,EAAE,CAAA;QACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAA;QAC9D,QAAQ,EAAE,MAAM,CACZ,MAAM,EACN;YAAE,WAAW,EAAE,MAAM,EAAE,CAAC;YAAC,UAAU,EAAE,MAAM,EAAE,CAAA;SAAE,CAClD,CAAA;KACJ;IAuED;;;;;OAKG;IACI,oBAAoB,IAAI,qBAAqB;IAsEpD;;;;;;;;;;;;OAYG;IACI,QAAQ,CACX,UAAU,EAAE,yBAAyB,EACrC,OAAO,CAAC,EAAE,8BAA8B,GACzC,6BAA6B;IA2IhC;;;;;;;;;OASG;IACI,aAAa,CAChB,OAAO,CAAC,EAAE,yBAAyB,GACpC,wBAAwB;CAsJ9B"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { DEFAULT_CHECKSUM_CONFIG } from "../consts.js";
|
|
3
3
|
import { getOrCreate, sortedUnique } from "../utils/collections.js";
|
|
4
|
-
import { ChangeCollector } from "./
|
|
4
|
+
import { ChangeCollector } from "./changeCollector.js";
|
|
5
5
|
import { canonicalSerialize, computeHash, entityChecksum } from "./checksum.js";
|
|
6
|
-
import { kleeneAnd, kleeneNot
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
6
|
+
import { kleeneAnd, kleeneNot } from "./evaluation/kleene.js";
|
|
7
|
+
import { makeErrorIssue, makeValidationResult, } from "./evaluation/validation.js";
|
|
8
|
+
import { PremiseEngine } from "./premiseEngine.js";
|
|
9
|
+
import { VariableManager } from "./variableManager.js";
|
|
9
10
|
/**
|
|
10
11
|
* Manages a propositional logic argument composed of premises, variable
|
|
11
12
|
* assignments, and logical roles (supporting premises and a conclusion).
|
|
@@ -23,6 +24,15 @@ export class ArgumentEngine {
|
|
|
23
24
|
checksumDirty = true;
|
|
24
25
|
cachedChecksum;
|
|
25
26
|
expressionIndex;
|
|
27
|
+
listeners = new Set();
|
|
28
|
+
reactiveDirty = {
|
|
29
|
+
argument: true,
|
|
30
|
+
variables: true,
|
|
31
|
+
roles: true,
|
|
32
|
+
premiseIds: new Set(),
|
|
33
|
+
allPremises: true,
|
|
34
|
+
};
|
|
35
|
+
cachedReactiveSnapshot;
|
|
26
36
|
constructor(argument, options) {
|
|
27
37
|
this.argument = { ...argument };
|
|
28
38
|
this.premises = new Map();
|
|
@@ -35,6 +45,130 @@ export class ArgumentEngine {
|
|
|
35
45
|
this.checksumConfig = options?.checksumConfig;
|
|
36
46
|
this.positionConfig = options?.positionConfig;
|
|
37
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Registers a listener that is called after every mutation.
|
|
50
|
+
* Returns an unsubscribe function.
|
|
51
|
+
*/
|
|
52
|
+
subscribe = (listener) => {
|
|
53
|
+
this.listeners.add(listener);
|
|
54
|
+
return () => { this.listeners.delete(listener); };
|
|
55
|
+
};
|
|
56
|
+
notifySubscribers() {
|
|
57
|
+
for (const listener of this.listeners) {
|
|
58
|
+
listener();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
getSnapshot = () => {
|
|
62
|
+
const dirty = this.reactiveDirty;
|
|
63
|
+
const prev = this.cachedReactiveSnapshot;
|
|
64
|
+
if (prev && !dirty.argument && !dirty.variables && !dirty.roles && dirty.premiseIds.size === 0 && !dirty.allPremises) {
|
|
65
|
+
return prev;
|
|
66
|
+
}
|
|
67
|
+
const argument = dirty.argument || !prev
|
|
68
|
+
? this.getArgument()
|
|
69
|
+
: prev.argument;
|
|
70
|
+
const variables = dirty.variables || !prev
|
|
71
|
+
? this.buildVariablesRecord()
|
|
72
|
+
: prev.variables;
|
|
73
|
+
const roles = dirty.roles || !prev
|
|
74
|
+
? { ...this.getRoleState() }
|
|
75
|
+
: prev.roles;
|
|
76
|
+
let premises;
|
|
77
|
+
if (dirty.allPremises || !prev) {
|
|
78
|
+
premises = this.buildAllPremisesRecord();
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
premises = { ...prev.premises };
|
|
82
|
+
// Remove premises that no longer exist
|
|
83
|
+
for (const id of Object.keys(premises)) {
|
|
84
|
+
if (!this.premises.has(id)) {
|
|
85
|
+
delete premises[id];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Rebuild dirty premises
|
|
89
|
+
for (const id of dirty.premiseIds) {
|
|
90
|
+
const pm = this.premises.get(id);
|
|
91
|
+
if (pm) {
|
|
92
|
+
premises[id] = this.buildPremiseRecord(pm);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
delete premises[id];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Add any new premises not yet in snapshot
|
|
99
|
+
for (const [id, pm] of this.premises) {
|
|
100
|
+
if (!(id in premises)) {
|
|
101
|
+
premises[id] = this.buildPremiseRecord(pm);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const snapshot = {
|
|
106
|
+
argument,
|
|
107
|
+
variables,
|
|
108
|
+
premises,
|
|
109
|
+
roles,
|
|
110
|
+
};
|
|
111
|
+
this.cachedReactiveSnapshot = snapshot;
|
|
112
|
+
this.reactiveDirty = {
|
|
113
|
+
argument: false,
|
|
114
|
+
variables: false,
|
|
115
|
+
roles: false,
|
|
116
|
+
premiseIds: new Set(),
|
|
117
|
+
allPremises: false,
|
|
118
|
+
};
|
|
119
|
+
return snapshot;
|
|
120
|
+
};
|
|
121
|
+
buildVariablesRecord() {
|
|
122
|
+
const result = {};
|
|
123
|
+
for (const v of this.variables.toArray()) {
|
|
124
|
+
result[v.id] = v;
|
|
125
|
+
}
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
buildAllPremisesRecord() {
|
|
129
|
+
const result = {};
|
|
130
|
+
for (const [id, pm] of this.premises) {
|
|
131
|
+
result[id] = this.buildPremiseRecord(pm);
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
buildPremiseRecord(pm) {
|
|
136
|
+
const expressions = {};
|
|
137
|
+
for (const expr of pm.getExpressions()) {
|
|
138
|
+
expressions[expr.id] = expr;
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
premise: pm.toPremiseData(),
|
|
142
|
+
expressions,
|
|
143
|
+
rootExpressionId: pm.getRootExpressionId(),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
markReactiveDirty(changes) {
|
|
147
|
+
if (changes.argument) {
|
|
148
|
+
this.reactiveDirty.argument = true;
|
|
149
|
+
}
|
|
150
|
+
if (changes.variables) {
|
|
151
|
+
this.reactiveDirty.variables = true;
|
|
152
|
+
}
|
|
153
|
+
if (changes.roles) {
|
|
154
|
+
this.reactiveDirty.roles = true;
|
|
155
|
+
}
|
|
156
|
+
if (changes.expressions) {
|
|
157
|
+
const allExprs = [
|
|
158
|
+
...changes.expressions.added,
|
|
159
|
+
...changes.expressions.modified,
|
|
160
|
+
...changes.expressions.removed,
|
|
161
|
+
];
|
|
162
|
+
for (const expr of allExprs) {
|
|
163
|
+
this.reactiveDirty.premiseIds.add(expr.premiseId);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (changes.premises) {
|
|
167
|
+
for (const p of [...changes.premises.added, ...changes.premises.modified, ...changes.premises.removed]) {
|
|
168
|
+
this.reactiveDirty.premiseIds.add(p.id);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
38
172
|
/** Returns a shallow copy of the argument metadata with checksum attached. */
|
|
39
173
|
getArgument() {
|
|
40
174
|
return { ...this.argument, checksum: this.checksum() };
|
|
@@ -94,6 +228,10 @@ export class ArgumentEngine {
|
|
|
94
228
|
positionConfig: this.positionConfig,
|
|
95
229
|
});
|
|
96
230
|
this.premises.set(id, pm);
|
|
231
|
+
pm.setOnMutate(() => {
|
|
232
|
+
this.reactiveDirty.premiseIds.add(id);
|
|
233
|
+
this.notifySubscribers();
|
|
234
|
+
});
|
|
97
235
|
const collector = new ChangeCollector();
|
|
98
236
|
collector.addedPremise(pm.toPremiseData());
|
|
99
237
|
this.markDirty();
|
|
@@ -101,9 +239,12 @@ export class ArgumentEngine {
|
|
|
101
239
|
this.conclusionPremiseId = id;
|
|
102
240
|
collector.setRoles(this.getRoleState());
|
|
103
241
|
}
|
|
242
|
+
const changes = collector.toChangeset();
|
|
243
|
+
this.markReactiveDirty(changes);
|
|
244
|
+
this.notifySubscribers();
|
|
104
245
|
return {
|
|
105
246
|
result: pm,
|
|
106
|
-
changes
|
|
247
|
+
changes,
|
|
107
248
|
};
|
|
108
249
|
}
|
|
109
250
|
/**
|
|
@@ -127,9 +268,12 @@ export class ArgumentEngine {
|
|
|
127
268
|
collector.setRoles(this.getRoleState());
|
|
128
269
|
}
|
|
129
270
|
this.markDirty();
|
|
271
|
+
const changes = collector.toChangeset();
|
|
272
|
+
this.markReactiveDirty(changes);
|
|
273
|
+
this.notifySubscribers();
|
|
130
274
|
return {
|
|
131
275
|
result: data,
|
|
132
|
-
changes
|
|
276
|
+
changes,
|
|
133
277
|
};
|
|
134
278
|
}
|
|
135
279
|
/** Returns the premise with the given ID, or `undefined` if not found. */
|
|
@@ -170,9 +314,12 @@ export class ArgumentEngine {
|
|
|
170
314
|
collector.addedVariable(withChecksum);
|
|
171
315
|
this.markDirty();
|
|
172
316
|
this.markAllPremisesDirty();
|
|
317
|
+
const changes = collector.toChangeset();
|
|
318
|
+
this.markReactiveDirty(changes);
|
|
319
|
+
this.notifySubscribers();
|
|
173
320
|
return {
|
|
174
321
|
result: withChecksum,
|
|
175
|
-
changes
|
|
322
|
+
changes,
|
|
176
323
|
};
|
|
177
324
|
}
|
|
178
325
|
/**
|
|
@@ -193,9 +340,12 @@ export class ArgumentEngine {
|
|
|
193
340
|
collector.modifiedVariable(withChecksum);
|
|
194
341
|
this.markDirty();
|
|
195
342
|
this.markAllPremisesDirty();
|
|
343
|
+
const changes = collector.toChangeset();
|
|
344
|
+
this.markReactiveDirty(changes);
|
|
345
|
+
this.notifySubscribers();
|
|
196
346
|
return {
|
|
197
347
|
result: withChecksum,
|
|
198
|
-
changes
|
|
348
|
+
changes,
|
|
199
349
|
};
|
|
200
350
|
}
|
|
201
351
|
return {
|
|
@@ -226,9 +376,12 @@ export class ArgumentEngine {
|
|
|
226
376
|
collector.removedVariable(variable);
|
|
227
377
|
this.markDirty();
|
|
228
378
|
this.markAllPremisesDirty();
|
|
379
|
+
const changes = collector.toChangeset();
|
|
380
|
+
this.markReactiveDirty(changes);
|
|
381
|
+
this.notifySubscribers();
|
|
229
382
|
return {
|
|
230
383
|
result: variable,
|
|
231
|
-
changes
|
|
384
|
+
changes,
|
|
232
385
|
};
|
|
233
386
|
}
|
|
234
387
|
/** Returns all registered variables sorted by ID. */
|
|
@@ -341,9 +494,12 @@ export class ArgumentEngine {
|
|
|
341
494
|
const collector = new ChangeCollector();
|
|
342
495
|
collector.setRoles(roles);
|
|
343
496
|
this.markDirty();
|
|
497
|
+
const changes = collector.toChangeset();
|
|
498
|
+
this.markReactiveDirty(changes);
|
|
499
|
+
this.notifySubscribers();
|
|
344
500
|
return {
|
|
345
501
|
result: roles,
|
|
346
|
-
changes
|
|
502
|
+
changes,
|
|
347
503
|
};
|
|
348
504
|
}
|
|
349
505
|
/** Clears the conclusion designation. */
|
|
@@ -353,9 +509,12 @@ export class ArgumentEngine {
|
|
|
353
509
|
const collector = new ChangeCollector();
|
|
354
510
|
collector.setRoles(roles);
|
|
355
511
|
this.markDirty();
|
|
512
|
+
const changes = collector.toChangeset();
|
|
513
|
+
this.markReactiveDirty(changes);
|
|
514
|
+
this.notifySubscribers();
|
|
356
515
|
return {
|
|
357
516
|
result: roles,
|
|
358
|
-
changes
|
|
517
|
+
changes,
|
|
359
518
|
};
|
|
360
519
|
}
|
|
361
520
|
/** Returns the conclusion premise, or `undefined` if none is set. */
|
|
@@ -398,6 +557,11 @@ export class ArgumentEngine {
|
|
|
398
557
|
for (const premiseSnap of snapshot.premises) {
|
|
399
558
|
const pe = PremiseEngine.fromSnapshot(premiseSnap, snapshot.argument, engine.variables, engine.expressionIndex);
|
|
400
559
|
engine.premises.set(pe.getId(), pe);
|
|
560
|
+
const premiseId = pe.getId();
|
|
561
|
+
pe.setOnMutate(() => {
|
|
562
|
+
engine.reactiveDirty.premiseIds.add(premiseId);
|
|
563
|
+
engine.notifySubscribers();
|
|
564
|
+
});
|
|
401
565
|
}
|
|
402
566
|
// Restore conclusion role (don't use setConclusionPremise to avoid auto-assign logic)
|
|
403
567
|
engine.conclusionPremiseId = snapshot.conclusionPremiseId;
|
|
@@ -471,7 +635,22 @@ export class ArgumentEngine {
|
|
|
471
635
|
this.premises.set(pe.getId(), pe);
|
|
472
636
|
}
|
|
473
637
|
this.conclusionPremiseId = snapshot.conclusionPremiseId;
|
|
638
|
+
for (const pe of this.premises.values()) {
|
|
639
|
+
const premiseId = pe.getId();
|
|
640
|
+
pe.setOnMutate(() => {
|
|
641
|
+
this.reactiveDirty.premiseIds.add(premiseId);
|
|
642
|
+
this.notifySubscribers();
|
|
643
|
+
});
|
|
644
|
+
}
|
|
474
645
|
this.markDirty();
|
|
646
|
+
this.reactiveDirty = {
|
|
647
|
+
argument: true,
|
|
648
|
+
variables: true,
|
|
649
|
+
roles: true,
|
|
650
|
+
premiseIds: new Set(),
|
|
651
|
+
allPremises: true,
|
|
652
|
+
};
|
|
653
|
+
this.notifySubscribers();
|
|
475
654
|
}
|
|
476
655
|
/**
|
|
477
656
|
* Returns an argument-level checksum combining argument metadata, role
|
|
@@ -856,4 +1035,4 @@ export class ArgumentEngine {
|
|
|
856
1035
|
};
|
|
857
1036
|
}
|
|
858
1037
|
}
|
|
859
|
-
//# sourceMappingURL=
|
|
1038
|
+
//# sourceMappingURL=argumentEngine.js.map
|