@proposit/shared 0.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/LICENSE +21 -0
- package/README.md +32 -0
- package/dist/api-client/argument/batch.d.ts +661 -0
- package/dist/api-client/argument/batch.d.ts.map +1 -0
- package/dist/api-client/argument/batch.js +14 -0
- package/dist/api-client/argument/batch.js.map +1 -0
- package/dist/api-client/argument/claims.d.ts +175 -0
- package/dist/api-client/argument/claims.d.ts.map +1 -0
- package/dist/api-client/argument/claims.js +20 -0
- package/dist/api-client/argument/claims.js.map +1 -0
- package/dist/api-client/argument/index.d.ts +1344 -0
- package/dist/api-client/argument/index.d.ts.map +1 -0
- package/dist/api-client/argument/index.js +62 -0
- package/dist/api-client/argument/index.js.map +1 -0
- package/dist/api-client/argument/logic/index.d.ts +861 -0
- package/dist/api-client/argument/logic/index.d.ts.map +1 -0
- package/dist/api-client/argument/logic/index.js +73 -0
- package/dist/api-client/argument/logic/index.js.map +1 -0
- package/dist/api-client/argument/logic/repair.d.ts +182 -0
- package/dist/api-client/argument/logic/repair.d.ts.map +1 -0
- package/dist/api-client/argument/logic/repair.js +9 -0
- package/dist/api-client/argument/logic/repair.js.map +1 -0
- package/dist/api-client/argument/reactions.d.ts +38 -0
- package/dist/api-client/argument/reactions.d.ts.map +1 -0
- package/dist/api-client/argument/reactions.js +9 -0
- package/dist/api-client/argument/reactions.js.map +1 -0
- package/dist/api-client/argument/reviews.d.ts +183 -0
- package/dist/api-client/argument/reviews.d.ts.map +1 -0
- package/dist/api-client/argument/reviews.js +21 -0
- package/dist/api-client/argument/reviews.js.map +1 -0
- package/dist/api-client/search.d.ts +64 -0
- package/dist/api-client/search.d.ts.map +1 -0
- package/dist/api-client/search.js +19 -0
- package/dist/api-client/search.js.map +1 -0
- package/dist/api-client/user/claims.d.ts +128 -0
- package/dist/api-client/user/claims.d.ts.map +1 -0
- package/dist/api-client/user/claims.js +10 -0
- package/dist/api-client/user/claims.js.map +1 -0
- package/dist/api-client/user/sources.d.ts +41 -0
- package/dist/api-client/user/sources.d.ts.map +1 -0
- package/dist/api-client/user/sources.js +7 -0
- package/dist/api-client/user/sources.js.map +1 -0
- package/dist/checksum.d.ts +2 -0
- package/dist/checksum.d.ts.map +1 -0
- package/dist/checksum.js +32 -0
- package/dist/checksum.js.map +1 -0
- package/dist/consts/argument.d.ts +9 -0
- package/dist/consts/argument.d.ts.map +1 -0
- package/dist/consts/argument.js +17 -0
- package/dist/consts/argument.js.map +1 -0
- package/dist/consts/identity.d.ts +3 -0
- package/dist/consts/identity.d.ts.map +1 -0
- package/dist/consts/identity.js +6 -0
- package/dist/consts/identity.js.map +1 -0
- package/dist/consts/index.d.ts +6 -0
- package/dist/consts/index.d.ts.map +1 -0
- package/dist/consts/index.js +6 -0
- package/dist/consts/index.js.map +1 -0
- package/dist/consts/roles.d.ts +27 -0
- package/dist/consts/roles.d.ts.map +1 -0
- package/dist/consts/roles.js +52 -0
- package/dist/consts/roles.js.map +1 -0
- package/dist/consts/task-status.d.ts +8 -0
- package/dist/consts/task-status.d.ts.map +1 -0
- package/dist/consts/task-status.js +14 -0
- package/dist/consts/task-status.js.map +1 -0
- package/dist/consts/user-tiers.d.ts +7 -0
- package/dist/consts/user-tiers.d.ts.map +1 -0
- package/dist/consts/user-tiers.js +60 -0
- package/dist/consts/user-tiers.js.map +1 -0
- package/dist/engine/engine.d.ts +94 -0
- package/dist/engine/engine.d.ts.map +1 -0
- package/dist/engine/engine.js +313 -0
- package/dist/engine/engine.js.map +1 -0
- package/dist/engine/library-adapters.d.ts +12 -0
- package/dist/engine/library-adapters.d.ts.map +1 -0
- package/dist/engine/library-adapters.js +11 -0
- package/dist/engine/library-adapters.js.map +1 -0
- package/dist/engine/mutations/claims.d.ts +10 -0
- package/dist/engine/mutations/claims.d.ts.map +1 -0
- package/dist/engine/mutations/claims.js +22 -0
- package/dist/engine/mutations/claims.js.map +1 -0
- package/dist/engine/mutations/expressions.d.ts +109 -0
- package/dist/engine/mutations/expressions.d.ts.map +1 -0
- package/dist/engine/mutations/expressions.js +277 -0
- package/dist/engine/mutations/expressions.js.map +1 -0
- package/dist/engine/mutations/index.d.ts +7 -0
- package/dist/engine/mutations/index.d.ts.map +1 -0
- package/dist/engine/mutations/index.js +6 -0
- package/dist/engine/mutations/index.js.map +1 -0
- package/dist/engine/mutations/premises.d.ts +25 -0
- package/dist/engine/mutations/premises.d.ts.map +1 -0
- package/dist/engine/mutations/premises.js +51 -0
- package/dist/engine/mutations/premises.js.map +1 -0
- package/dist/engine/mutations/types.d.ts +11 -0
- package/dist/engine/mutations/types.d.ts.map +1 -0
- package/dist/engine/mutations/types.js +2 -0
- package/dist/engine/mutations/types.js.map +1 -0
- package/dist/engine/mutations/variables.d.ts +27 -0
- package/dist/engine/mutations/variables.d.ts.map +1 -0
- package/dist/engine/mutations/variables.js +16 -0
- package/dist/engine/mutations/variables.js.map +1 -0
- package/dist/engine/optimistic/index.d.ts +4 -0
- package/dist/engine/optimistic/index.d.ts.map +1 -0
- package/dist/engine/optimistic/index.js +3 -0
- package/dist/engine/optimistic/index.js.map +1 -0
- package/dist/engine/optimistic/reconciliation.d.ts +32 -0
- package/dist/engine/optimistic/reconciliation.d.ts.map +1 -0
- package/dist/engine/optimistic/reconciliation.js +140 -0
- package/dist/engine/optimistic/reconciliation.js.map +1 -0
- package/dist/engine/optimistic/types.d.ts +25 -0
- package/dist/engine/optimistic/types.d.ts.map +1 -0
- package/dist/engine/optimistic/types.js +12 -0
- package/dist/engine/optimistic/types.js.map +1 -0
- package/dist/engine/optimistic/verification.d.ts +13 -0
- package/dist/engine/optimistic/verification.d.ts.map +1 -0
- package/dist/engine/optimistic/verification.js +71 -0
- package/dist/engine/optimistic/verification.js.map +1 -0
- package/dist/engine/review/evaluation.d.ts +27 -0
- package/dist/engine/review/evaluation.d.ts.map +1 -0
- package/dist/engine/review/evaluation.js +122 -0
- package/dist/engine/review/evaluation.js.map +1 -0
- package/dist/engine/review/fingerprint.d.ts +9 -0
- package/dist/engine/review/fingerprint.d.ts.map +1 -0
- package/dist/engine/review/fingerprint.js +27 -0
- package/dist/engine/review/fingerprint.js.map +1 -0
- package/dist/engine/review/overlay.d.ts +19 -0
- package/dist/engine/review/overlay.d.ts.map +1 -0
- package/dist/engine/review/overlay.js +81 -0
- package/dist/engine/review/overlay.js.map +1 -0
- package/dist/engine/review/reasons.d.ts +15 -0
- package/dist/engine/review/reasons.d.ts.map +1 -0
- package/dist/engine/review/reasons.js +211 -0
- package/dist/engine/review/reasons.js.map +1 -0
- package/dist/engine/review/review-engine.d.ts +134 -0
- package/dist/engine/review/review-engine.d.ts.map +1 -0
- package/dist/engine/review/review-engine.js +590 -0
- package/dist/engine/review/review-engine.js.map +1 -0
- package/dist/engine/review/review-store.d.ts +63 -0
- package/dist/engine/review/review-store.d.ts.map +1 -0
- package/dist/engine/review/review-store.js +174 -0
- package/dist/engine/review/review-store.js.map +1 -0
- package/dist/engine/review/step-queue.d.ts +27 -0
- package/dist/engine/review/step-queue.d.ts.map +1 -0
- package/dist/engine/review/step-queue.js +34 -0
- package/dist/engine/review/step-queue.js.map +1 -0
- package/dist/engine/review/types.d.ts +16 -0
- package/dist/engine/review/types.d.ts.map +1 -0
- package/dist/engine/review/types.js +2 -0
- package/dist/engine/review/types.js.map +1 -0
- package/dist/engine/review/wire.d.ts +8 -0
- package/dist/engine/review/wire.d.ts.map +1 -0
- package/dist/engine/review/wire.js +97 -0
- package/dist/engine/review/wire.js.map +1 -0
- package/dist/engine/text-tree.d.ts +35 -0
- package/dist/engine/text-tree.d.ts.map +1 -0
- package/dist/engine/text-tree.js +137 -0
- package/dist/engine/text-tree.js.map +1 -0
- package/dist/engine/types.d.ts +42 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +2 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +61 -0
- package/dist/errors.js.map +1 -0
- package/dist/schemas/api/argument/batch/change-edge-operator.d.ts +281 -0
- package/dist/schemas/api/argument/batch/change-edge-operator.d.ts.map +1 -0
- package/dist/schemas/api/argument/batch/change-edge-operator.js +19 -0
- package/dist/schemas/api/argument/batch/change-edge-operator.js.map +1 -0
- package/dist/schemas/api/argument/batch/create-expression-with-operator.d.ts +280 -0
- package/dist/schemas/api/argument/batch/create-expression-with-operator.d.ts.map +1 -0
- package/dist/schemas/api/argument/batch/create-expression-with-operator.js +22 -0
- package/dist/schemas/api/argument/batch/create-expression-with-operator.js.map +1 -0
- package/dist/schemas/api/argument/batch/provision.d.ts +112 -0
- package/dist/schemas/api/argument/batch/provision.d.ts.map +1 -0
- package/dist/schemas/api/argument/batch/provision.js +10 -0
- package/dist/schemas/api/argument/batch/provision.js.map +1 -0
- package/dist/schemas/api/argument/build.d.ts +50 -0
- package/dist/schemas/api/argument/build.d.ts.map +1 -0
- package/dist/schemas/api/argument/build.js +41 -0
- package/dist/schemas/api/argument/build.js.map +1 -0
- package/dist/schemas/api/argument/claims.d.ts +151 -0
- package/dist/schemas/api/argument/claims.d.ts.map +1 -0
- package/dist/schemas/api/argument/claims.js +24 -0
- package/dist/schemas/api/argument/claims.js.map +1 -0
- package/dist/schemas/api/argument/index.d.ts +682 -0
- package/dist/schemas/api/argument/index.d.ts.map +1 -0
- package/dist/schemas/api/argument/index.js +51 -0
- package/dist/schemas/api/argument/index.js.map +1 -0
- package/dist/schemas/api/argument/logic.d.ts +205 -0
- package/dist/schemas/api/argument/logic.d.ts.map +1 -0
- package/dist/schemas/api/argument/logic.js +77 -0
- package/dist/schemas/api/argument/logic.js.map +1 -0
- package/dist/schemas/api/argument/repair.d.ts +195 -0
- package/dist/schemas/api/argument/repair.d.ts.map +1 -0
- package/dist/schemas/api/argument/repair.js +35 -0
- package/dist/schemas/api/argument/repair.js.map +1 -0
- package/dist/schemas/api/claims.d.ts +250 -0
- package/dist/schemas/api/claims.d.ts.map +1 -0
- package/dist/schemas/api/claims.js +20 -0
- package/dist/schemas/api/claims.js.map +1 -0
- package/dist/schemas/api/reaction/index.d.ts +46 -0
- package/dist/schemas/api/reaction/index.d.ts.map +1 -0
- package/dist/schemas/api/reaction/index.js +15 -0
- package/dist/schemas/api/reaction/index.js.map +1 -0
- package/dist/schemas/api/review/index.d.ts +164 -0
- package/dist/schemas/api/review/index.d.ts.map +1 -0
- package/dist/schemas/api/review/index.js +29 -0
- package/dist/schemas/api/review/index.js.map +1 -0
- package/dist/schemas/api/search.d.ts +109 -0
- package/dist/schemas/api/search.d.ts.map +1 -0
- package/dist/schemas/api/search.js +60 -0
- package/dist/schemas/api/search.js.map +1 -0
- package/dist/schemas/api/sources.d.ts +108 -0
- package/dist/schemas/api/sources.d.ts.map +1 -0
- package/dist/schemas/api/sources.js +28 -0
- package/dist/schemas/api/sources.js.map +1 -0
- package/dist/schemas/api/user/index.d.ts +16 -0
- package/dist/schemas/api/user/index.d.ts.map +1 -0
- package/dist/schemas/api/user/index.js +15 -0
- package/dist/schemas/api/user/index.js.map +1 -0
- package/dist/schemas/common.d.ts +50 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +77 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/gpt.d.ts +10 -0
- package/dist/schemas/gpt.d.ts.map +1 -0
- package/dist/schemas/gpt.js +27 -0
- package/dist/schemas/gpt.js.map +1 -0
- package/dist/schemas/index.d.ts +8 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +8 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/integrations/index.d.ts +159 -0
- package/dist/schemas/integrations/index.d.ts.map +1 -0
- package/dist/schemas/integrations/index.js +72 -0
- package/dist/schemas/integrations/index.js.map +1 -0
- package/dist/schemas/logic.d.ts +195 -0
- package/dist/schemas/logic.d.ts.map +1 -0
- package/dist/schemas/logic.js +77 -0
- package/dist/schemas/logic.js.map +1 -0
- package/dist/schemas/model/arguments.d.ts +457 -0
- package/dist/schemas/model/arguments.d.ts.map +1 -0
- package/dist/schemas/model/arguments.js +100 -0
- package/dist/schemas/model/arguments.js.map +1 -0
- package/dist/schemas/model/claims.d.ts +53 -0
- package/dist/schemas/model/claims.d.ts.map +1 -0
- package/dist/schemas/model/claims.js +40 -0
- package/dist/schemas/model/claims.js.map +1 -0
- package/dist/schemas/model/forks.d.ts +63 -0
- package/dist/schemas/model/forks.d.ts.map +1 -0
- package/dist/schemas/model/forks.js +63 -0
- package/dist/schemas/model/forks.js.map +1 -0
- package/dist/schemas/model/index.d.ts +6 -0
- package/dist/schemas/model/index.d.ts.map +1 -0
- package/dist/schemas/model/index.js +6 -0
- package/dist/schemas/model/index.js.map +1 -0
- package/dist/schemas/model/references.d.ts +49 -0
- package/dist/schemas/model/references.d.ts.map +1 -0
- package/dist/schemas/model/references.js +46 -0
- package/dist/schemas/model/references.js.map +1 -0
- package/dist/schemas/model/review.d.ts +56 -0
- package/dist/schemas/model/review.d.ts.map +1 -0
- package/dist/schemas/model/review.js +50 -0
- package/dist/schemas/model/review.js.map +1 -0
- package/dist/schemas/model/sources.d.ts +456 -0
- package/dist/schemas/model/sources.d.ts.map +1 -0
- package/dist/schemas/model/sources.js +27 -0
- package/dist/schemas/model/sources.js.map +1 -0
- package/dist/schemas/model/users.d.ts +150 -0
- package/dist/schemas/model/users.d.ts.map +1 -0
- package/dist/schemas/model/users.js +136 -0
- package/dist/schemas/model/users.js.map +1 -0
- package/dist/schemas/model.d.ts +2 -0
- package/dist/schemas/model.d.ts.map +1 -0
- package/dist/schemas/model.js +2 -0
- package/dist/schemas/model.js.map +1 -0
- package/dist/schemas/review.d.ts +1403 -0
- package/dist/schemas/review.d.ts.map +1 -0
- package/dist/schemas/review.js +232 -0
- package/dist/schemas/review.js.map +1 -0
- package/dist/schemas/snapshot.d.ts +165 -0
- package/dist/schemas/snapshot.d.ts.map +1 -0
- package/dist/schemas/snapshot.js +80 -0
- package/dist/schemas/snapshot.js.map +1 -0
- package/dist/schemas/tasks.d.ts +551 -0
- package/dist/schemas/tasks.d.ts.map +1 -0
- package/dist/schemas/tasks.js +113 -0
- package/dist/schemas/tasks.js.map +1 -0
- package/dist/utils/embedding-text.d.ts +15 -0
- package/dist/utils/embedding-text.d.ts.map +1 -0
- package/dist/utils/embedding-text.js +86 -0
- package/dist/utils/embedding-text.js.map +1 -0
- package/dist/utils/format-review-share.d.ts +7 -0
- package/dist/utils/format-review-share.d.ts.map +1 -0
- package/dist/utils/format-review-share.js +16 -0
- package/dist/utils/format-review-share.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/tasks/utils.d.ts +4 -0
- package/dist/utils/tasks/utils.d.ts.map +1 -0
- package/dist/utils/tasks/utils.js +12 -0
- package/dist/utils/tasks/utils.js.map +1 -0
- package/dist/utils/utils.d.ts +25 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +115 -0
- package/dist/utils/utils.js.map +1 -0
- package/package.json +128 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { InvariantViolationError } from "@proposit/proposit-core";
|
|
2
|
+
import { ReconciliationError } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Swaps a temp-ID premise with the real server premise in the engine.
|
|
5
|
+
*
|
|
6
|
+
* Performs a snapshot → find-replace → rollback cycle so that all checksums
|
|
7
|
+
* are recomputed against the new ID.
|
|
8
|
+
*
|
|
9
|
+
* If the swapped premise is the conclusion, updates `conclusionPremiseId` in
|
|
10
|
+
* the snapshot accordingly.
|
|
11
|
+
*
|
|
12
|
+
* If `serverVariable` is provided, also swaps the auto-created premise-bound
|
|
13
|
+
* variable's own ID (temp → real) in the same rollback cycle.
|
|
14
|
+
*/
|
|
15
|
+
export function reconcileCreatedPremise(engine, tempId, serverPremise, serverVariable) {
|
|
16
|
+
const snap = engine.snapshot();
|
|
17
|
+
const idx = snap.premises.findIndex((p) => p.premise.id === tempId);
|
|
18
|
+
if (idx === -1)
|
|
19
|
+
return;
|
|
20
|
+
// Replace the temp premise with the server-assigned one (strip checksums
|
|
21
|
+
// so rollback recomputes them)
|
|
22
|
+
snap.premises[idx] = {
|
|
23
|
+
...snap.premises[idx],
|
|
24
|
+
premise: serverPremise,
|
|
25
|
+
};
|
|
26
|
+
// Update conclusionPremiseId if the swapped premise was the conclusion
|
|
27
|
+
if (snap.conclusionPremiseId === tempId) {
|
|
28
|
+
snap.conclusionPremiseId = serverPremise.id;
|
|
29
|
+
}
|
|
30
|
+
// In proposit-core 0.8.0+, creating a premise auto-creates a
|
|
31
|
+
// premise-bound variable with boundPremiseId === premiseId. When we swap
|
|
32
|
+
// the premise ID, we must also update the variable's boundPremiseId and
|
|
33
|
+
// clear its checksum (empty string skips validation) so rollback doesn't
|
|
34
|
+
// fail with a checksum mismatch or a "non-existent premise" error.
|
|
35
|
+
//
|
|
36
|
+
// If the server returned the auto-created variable, also swap the
|
|
37
|
+
// variable's own ID (temp UUID → real server UUID) in the same cycle.
|
|
38
|
+
snap.variables = {
|
|
39
|
+
...snap.variables,
|
|
40
|
+
variables: snap.variables.variables.map((v) => {
|
|
41
|
+
const vAny = v;
|
|
42
|
+
if ("boundPremiseId" in vAny && vAny.boundPremiseId === tempId) {
|
|
43
|
+
if (serverVariable != null && v.id !== serverVariable.id) {
|
|
44
|
+
// Swap both the variable's own ID and its boundPremiseId
|
|
45
|
+
return {
|
|
46
|
+
...serverVariable,
|
|
47
|
+
boundPremiseId: serverPremise.id,
|
|
48
|
+
checksum: "",
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Only fix boundPremiseId (no server variable provided)
|
|
52
|
+
return { ...v, boundPremiseId: serverPremise.id, checksum: "" };
|
|
53
|
+
}
|
|
54
|
+
return v;
|
|
55
|
+
}),
|
|
56
|
+
};
|
|
57
|
+
try {
|
|
58
|
+
engine.rollback(snap);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error instanceof InvariantViolationError) {
|
|
62
|
+
throw new ReconciliationError(`Invariant violation during reconcileCreatedPremise rollback: ${error.violations.map((v) => v.message).join(", ")}`, { cause: error });
|
|
63
|
+
}
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Swaps a temp-ID expression with the real server expression in the engine.
|
|
69
|
+
*
|
|
70
|
+
* Also applies any position-shifted sibling expressions returned by the server.
|
|
71
|
+
* If the expression being swapped was the root of its premise, updates
|
|
72
|
+
* `rootExpressionId` accordingly.
|
|
73
|
+
*
|
|
74
|
+
* Performs a snapshot → find-replace → rollback cycle to recompute checksums.
|
|
75
|
+
*/
|
|
76
|
+
export function reconcileCreatedExpression(engine, tempId, serverExpression, shiftedExpressions) {
|
|
77
|
+
const snap = engine.snapshot();
|
|
78
|
+
// Find the premise that contains the temp expression
|
|
79
|
+
const premiseEntry = snap.premises.find((p) => p.expressions.expressions.some((e) => e.id === tempId));
|
|
80
|
+
if (!premiseEntry)
|
|
81
|
+
return;
|
|
82
|
+
// Replace the temp expression with the server one
|
|
83
|
+
premiseEntry.expressions = {
|
|
84
|
+
...premiseEntry.expressions,
|
|
85
|
+
expressions: premiseEntry.expressions.expressions.map((e) => e.id === tempId ? serverExpression : e),
|
|
86
|
+
};
|
|
87
|
+
// Apply shifted expressions (position updates from the server)
|
|
88
|
+
if (shiftedExpressions && shiftedExpressions.length > 0) {
|
|
89
|
+
const shiftedMap = new Map(shiftedExpressions.map((e) => [e.id, e]));
|
|
90
|
+
premiseEntry.expressions = {
|
|
91
|
+
...premiseEntry.expressions,
|
|
92
|
+
expressions: premiseEntry.expressions.expressions.map((e) => shiftedMap.get(e.id) ?? e),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// Update rootExpressionId if the swapped expression was the root
|
|
96
|
+
if (premiseEntry.rootExpressionId === tempId) {
|
|
97
|
+
premiseEntry.rootExpressionId = serverExpression.id;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
engine.rollback(snap);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
if (error instanceof InvariantViolationError) {
|
|
104
|
+
throw new ReconciliationError(`Invariant violation during reconcileCreatedExpression rollback: ${error.violations.map((v) => v.message).join(", ")}`, { cause: error });
|
|
105
|
+
}
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Swaps a temp-ID variable with the real server variable in the engine.
|
|
111
|
+
*
|
|
112
|
+
* Performs a snapshot → find-replace → rollback cycle to recompute checksums.
|
|
113
|
+
*/
|
|
114
|
+
export function reconcileCreatedVariable(engine, tempId, serverVariable) {
|
|
115
|
+
const snap = engine.snapshot();
|
|
116
|
+
const idx = snap.variables.variables.findIndex((v) => v.id === tempId);
|
|
117
|
+
if (idx === -1)
|
|
118
|
+
return;
|
|
119
|
+
// When swapping the variable ID, the stored checksum (which included the
|
|
120
|
+
// old tempId) is now stale. Setting checksum to "" causes VariableManager
|
|
121
|
+
// .validate() to skip the checksum integrity check for this variable,
|
|
122
|
+
// allowing rollback to succeed. The engine recomputes the checksum on the
|
|
123
|
+
// next flush. In production, the serverVariable from the API has the
|
|
124
|
+
// correct checksum already; in tests that construct the serverVariable
|
|
125
|
+
// locally, clearing to "" avoids a mismatch.
|
|
126
|
+
snap.variables = {
|
|
127
|
+
...snap.variables,
|
|
128
|
+
variables: snap.variables.variables.map((v) => v.id === tempId ? { ...serverVariable, checksum: "" } : v),
|
|
129
|
+
};
|
|
130
|
+
try {
|
|
131
|
+
engine.rollback(snap);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (error instanceof InvariantViolationError) {
|
|
135
|
+
throw new ReconciliationError(`Invariant violation during reconcileCreatedVariable rollback: ${error.violations.map((v) => v.message).join(", ")}`, { cause: error });
|
|
136
|
+
}
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=reconciliation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconciliation.js","sourceRoot":"","sources":["../../../src/engine/optimistic/reconciliation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare class ReconciliationError extends Error {
|
|
2
|
+
constructor(message: string, options?: ErrorOptions);
|
|
3
|
+
}
|
|
4
|
+
export type PendingOpType = "create" | "update" | "delete";
|
|
5
|
+
export type PendingEntityKind = "premise" | "expression" | "variable" | "claim" | "argument";
|
|
6
|
+
export type PendingOp = {
|
|
7
|
+
type: PendingOpType;
|
|
8
|
+
entityKind: PendingEntityKind;
|
|
9
|
+
entityId: string;
|
|
10
|
+
timestamp: number;
|
|
11
|
+
};
|
|
12
|
+
export type SyncStatus = "synced" | "saving" | "error" | "resyncing";
|
|
13
|
+
export type DivergenceScope = {
|
|
14
|
+
level: "none";
|
|
15
|
+
} | {
|
|
16
|
+
level: "entity";
|
|
17
|
+
entityKind: PendingEntityKind;
|
|
18
|
+
entityId: string;
|
|
19
|
+
} | {
|
|
20
|
+
level: "premise";
|
|
21
|
+
premiseId: string;
|
|
22
|
+
} | {
|
|
23
|
+
level: "full";
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/engine/optimistic/types.ts"],"names":[],"mappings":"AAMA,qBAAa,mBAAoB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAItD;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAC1D,MAAM,MAAM,iBAAiB,GACvB,SAAS,GACT,YAAY,GACZ,UAAU,GACV,OAAO,GACP,UAAU,CAAA;AAEhB,MAAM,MAAM,SAAS,GAAG;IACpB,IAAI,EAAE,aAAa,CAAA;IACnB,UAAU,EAAE,iBAAiB,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAA;AAEpE,MAAM,MAAM,eAAe,GACrB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,iBAAiB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Inherited from proposit-server. Legacy type-alias names (PendingOpType,
|
|
2
|
+
// PendingEntityKind, PendingOp, SyncStatus, DivergenceScope) predate the
|
|
3
|
+
// brain-style T-prefix convention; renaming cascades through every consumer.
|
|
4
|
+
// Tracked as tech debt for a dedicated follow-up.
|
|
5
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
6
|
+
export class ReconciliationError extends Error {
|
|
7
|
+
constructor(message, options) {
|
|
8
|
+
super(message, options);
|
|
9
|
+
this.name = "ReconciliationError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/engine/optimistic/types.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AACzE,6EAA6E;AAC7E,kDAAkD;AAClD,yDAAyD;AAEzD,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC1C,YAAY,OAAe,EAAE,OAAsB;QAC/C,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACvB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACrC,CAAC;CACJ"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DivergenceScope } from "./types.js";
|
|
2
|
+
import type { PropositArgumentEngine, TProjectSnapshot } from "../engine.js";
|
|
3
|
+
/**
|
|
4
|
+
* Compares the local engine's checksum tree against a server-provided snapshot.
|
|
5
|
+
*
|
|
6
|
+
* 1. Builds a temporary engine from the server snapshot to get its checksums.
|
|
7
|
+
* 2. Compares `combinedChecksum()` — if they match, returns `{ level: "none" }`.
|
|
8
|
+
* 3. If not, walks premise checksums to find divergent premises.
|
|
9
|
+
* 4. Checks variable checksums (leaf-only: uses `checksum` field).
|
|
10
|
+
* 5. Returns appropriate DivergenceScope.
|
|
11
|
+
*/
|
|
12
|
+
export declare function detectDivergence(engine: PropositArgumentEngine, serverSnapshot: TProjectSnapshot): DivergenceScope;
|
|
13
|
+
//# sourceMappingURL=verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../../src/engine/optimistic/verification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAc5E;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,sBAAsB,EAC9B,cAAc,EAAE,gBAAgB,GACjC,eAAe,CAmFjB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { EMPTY_CLAIM_SOURCE_LOOKUP, EMPTY_SOURCE_LOOKUP, } from "../library-adapters.js";
|
|
2
|
+
import { CHECKSUM_CONFIG } from "../../checksum.js";
|
|
3
|
+
import { ArgumentEngine } from "@proposit/proposit-core";
|
|
4
|
+
/**
|
|
5
|
+
* Compares the local engine's checksum tree against a server-provided snapshot.
|
|
6
|
+
*
|
|
7
|
+
* 1. Builds a temporary engine from the server snapshot to get its checksums.
|
|
8
|
+
* 2. Compares `combinedChecksum()` — if they match, returns `{ level: "none" }`.
|
|
9
|
+
* 3. If not, walks premise checksums to find divergent premises.
|
|
10
|
+
* 4. Checks variable checksums (leaf-only: uses `checksum` field).
|
|
11
|
+
* 5. Returns appropriate DivergenceScope.
|
|
12
|
+
*/
|
|
13
|
+
export function detectDivergence(engine, serverSnapshot) {
|
|
14
|
+
// Build a temporary engine from the server snapshot to compute checksums
|
|
15
|
+
const serverEngine = new ArgumentEngine(serverSnapshot.argument, { get: () => undefined }, EMPTY_SOURCE_LOOKUP, EMPTY_CLAIM_SOURCE_LOOKUP, {
|
|
16
|
+
checksumConfig: CHECKSUM_CONFIG,
|
|
17
|
+
positionConfig: serverSnapshot.config?.positionConfig,
|
|
18
|
+
grammarConfig: {
|
|
19
|
+
autoNormalize: false,
|
|
20
|
+
enforceFormulaBetweenOperators: true,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
serverEngine.rollback(serverSnapshot);
|
|
24
|
+
// Fast path: combined checksums match
|
|
25
|
+
if (engine.combinedChecksum() === serverEngine.combinedChecksum()) {
|
|
26
|
+
return { level: "none" };
|
|
27
|
+
}
|
|
28
|
+
// Walk premise checksums to find specific divergent premises
|
|
29
|
+
const localPremiseIds = new Set(engine.listPremiseIds());
|
|
30
|
+
const serverPremiseIds = new Set(serverEngine.listPremiseIds());
|
|
31
|
+
// Check for premise-level divergence
|
|
32
|
+
for (const premiseId of localPremiseIds) {
|
|
33
|
+
const localPm = engine.getPremise(premiseId);
|
|
34
|
+
const serverPm = serverEngine.getPremise(premiseId);
|
|
35
|
+
if (!localPm || !serverPm) {
|
|
36
|
+
// Premise exists locally but not on server (or vice versa)
|
|
37
|
+
return { level: "premise", premiseId };
|
|
38
|
+
}
|
|
39
|
+
if (localPm.combinedChecksum() !== serverPm.combinedChecksum()) {
|
|
40
|
+
return { level: "premise", premiseId };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Check for premises that exist on server but not locally
|
|
44
|
+
for (const premiseId of serverPremiseIds) {
|
|
45
|
+
if (!localPremiseIds.has(premiseId)) {
|
|
46
|
+
return { level: "premise", premiseId };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Check variable checksums (leaf-only: use checksum field, not combinedChecksum)
|
|
50
|
+
const localVariables = engine.getVariables();
|
|
51
|
+
const serverVariables = serverEngine.getVariables();
|
|
52
|
+
const localVarMap = new Map(localVariables.map((v) => [v.id, v.checksum]));
|
|
53
|
+
const serverVarMap = new Map(serverVariables.map((v) => [
|
|
54
|
+
v.id,
|
|
55
|
+
v.checksum,
|
|
56
|
+
]));
|
|
57
|
+
for (const [id, localChecksum] of localVarMap) {
|
|
58
|
+
const serverChecksum = serverVarMap.get(id);
|
|
59
|
+
if (localChecksum !== serverChecksum) {
|
|
60
|
+
return { level: "entity", entityKind: "variable", entityId: id };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
for (const [id] of serverVarMap) {
|
|
64
|
+
if (!localVarMap.has(id)) {
|
|
65
|
+
return { level: "entity", entityKind: "variable", entityId: id };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Fallback: checksums differ but we couldn't pinpoint the entity
|
|
69
|
+
return { level: "full" };
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../../../src/engine/optimistic/verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type TArgumentEvaluationContext, type TCoreArgumentEvaluationResult, type TCoreExpressionAssignment, type TCoreValidityCheckResult, type TCoreVariableAssignment } from "@proposit/proposit-core";
|
|
2
|
+
import type { ProjectEngine } from "../mutations/types.js";
|
|
3
|
+
import type { TReviewDraft } from "../../schemas/review.js";
|
|
4
|
+
/** Build a read-only TArgumentEvaluationContext from a ProjectEngine. */
|
|
5
|
+
export declare function toEvaluationContext(argEngine: ProjectEngine): TArgumentEvaluationContext;
|
|
6
|
+
/**
|
|
7
|
+
* Build a per-expression core assignment from the draft's mixed-scope entries.
|
|
8
|
+
*
|
|
9
|
+
* Delegates operator fan-out to proposit-core's `canonicalizeOperatorAssignments`
|
|
10
|
+
* (available in 0.9.0+): premise-scope entries expand to every non-NOT operator
|
|
11
|
+
* expression in the premise; expression-scope overrides layer on top.
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildExpressionAssignment(draft: TReviewDraft, argEngine: ProjectEngine): TCoreExpressionAssignment;
|
|
14
|
+
export declare function evaluateArgumentForReview(draft: TReviewDraft, argEngine: ProjectEngine): TCoreArgumentEvaluationResult;
|
|
15
|
+
export declare function checkValidityForReview(argEngine: ProjectEngine, options?: {
|
|
16
|
+
maxVariables?: number;
|
|
17
|
+
maxAssignmentsChecked?: number;
|
|
18
|
+
}): TCoreValidityCheckResult;
|
|
19
|
+
/**
|
|
20
|
+
* Argument-wide propagated values from `evaluateArgument` with `includeDiagnostics: true`.
|
|
21
|
+
* The core populates `propagatedVariableValues` (0.9.0+); callers should already have it
|
|
22
|
+
* on the result. Returns `{}` when a result isn't available.
|
|
23
|
+
*
|
|
24
|
+
* Key set = `referencedVariableIds` (claim-bound and externally-bound premise variables).
|
|
25
|
+
*/
|
|
26
|
+
export declare function computePropagatedVariableValues(result: TCoreArgumentEvaluationResult | undefined): TCoreVariableAssignment;
|
|
27
|
+
//# sourceMappingURL=evaluation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluation.d.ts","sourceRoot":"","sources":["../../../src/engine/review/evaluation.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EAClC,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAE7B,KAAK,uBAAuB,EAE/B,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D,yEAAyE;AACzE,wBAAgB,mBAAmB,CAC/B,SAAS,EAAE,aAAa,GACzB,0BAA0B,CAW5B;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACrC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,aAAa,GACzB,yBAAyB,CAuB3B;AAED,wBAAgB,yBAAyB,CACrC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,aAAa,GACzB,6BAA6B,CAgC/B;AAgDD,wBAAgB,sBAAsB,CAClC,SAAS,EAAE,aAAa,EACxB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAAO,GACxE,wBAAwB,CAQ1B;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC3C,MAAM,EAAE,6BAA6B,GAAG,SAAS,GAClD,uBAAuB,CAEzB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { evaluateArgument, checkArgumentValidity, canonicalizeOperatorAssignments, } from "@proposit/proposit-core";
|
|
2
|
+
/** Build a read-only TArgumentEvaluationContext from a ProjectEngine. */
|
|
3
|
+
export function toEvaluationContext(argEngine) {
|
|
4
|
+
return {
|
|
5
|
+
argumentId: argEngine.getArgument().id,
|
|
6
|
+
getConclusionPremise: () => argEngine.getConclusionPremise(),
|
|
7
|
+
listSupportingPremises: () => argEngine.listSupportingPremises(),
|
|
8
|
+
listPremises: () => argEngine.listPremises(),
|
|
9
|
+
conclusionPremiseId: argEngine.getConclusionPremise()?.getId(),
|
|
10
|
+
getVariable: (id) => argEngine.getVariable(id),
|
|
11
|
+
getPremise: (id) => argEngine.getPremise(id),
|
|
12
|
+
validateEvaluability: () => argEngine.validateEvaluability(),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Build a per-expression core assignment from the draft's mixed-scope entries.
|
|
17
|
+
*
|
|
18
|
+
* Delegates operator fan-out to proposit-core's `canonicalizeOperatorAssignments`
|
|
19
|
+
* (available in 0.9.0+): premise-scope entries expand to every non-NOT operator
|
|
20
|
+
* expression in the premise; expression-scope overrides layer on top.
|
|
21
|
+
*/
|
|
22
|
+
export function buildExpressionAssignment(draft, argEngine) {
|
|
23
|
+
const variables = {};
|
|
24
|
+
for (const v of argEngine.getVariables()) {
|
|
25
|
+
const claimId = "claimId" in v ? v.claimId : undefined;
|
|
26
|
+
const c = claimId ? draft.claimAssignments[claimId] : undefined;
|
|
27
|
+
variables[v.id] = c ? (c.skipped ? null : c.value) : null;
|
|
28
|
+
}
|
|
29
|
+
const premiseScope = {};
|
|
30
|
+
const expressionOverrides = {};
|
|
31
|
+
for (const op of draft.operatorAssignments) {
|
|
32
|
+
if (op.scope === "premise") {
|
|
33
|
+
premiseScope[op.premiseId] = op.decision;
|
|
34
|
+
}
|
|
35
|
+
else if (op.scope === "expression" && op.expressionId) {
|
|
36
|
+
expressionOverrides[op.expressionId] = op.decision;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const operatorAssignments = canonicalizeOperatorAssignments(toEvaluationContext(argEngine), { premiseScope, expressionOverrides });
|
|
40
|
+
return { variables, operatorAssignments };
|
|
41
|
+
}
|
|
42
|
+
export function evaluateArgumentForReview(draft, argEngine) {
|
|
43
|
+
const ctx = toEvaluationContext(argEngine);
|
|
44
|
+
const assignment = buildExpressionAssignment(draft, argEngine);
|
|
45
|
+
// `strictUnknownAssignmentKeys: false` because we pass an argument-wide
|
|
46
|
+
// assignment; per-premise strictness would reject every premise that doesn't
|
|
47
|
+
// reference every claim-bound variable in the argument.
|
|
48
|
+
const result = evaluateArgument(ctx, assignment, {
|
|
49
|
+
validateFirst: true,
|
|
50
|
+
strictUnknownAssignmentKeys: false,
|
|
51
|
+
includeDiagnostics: true,
|
|
52
|
+
includeExpressionValues: true,
|
|
53
|
+
});
|
|
54
|
+
// Diagnostic dump for proposit-core debugging: full argument shape +
|
|
55
|
+
// assignment + evaluation result as a single JSON payload.
|
|
56
|
+
try {
|
|
57
|
+
console.log("[review:evaluation]", JSON.stringify(buildEvaluationDebugPayload(draft, argEngine, assignment, result), null, 2));
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
console.warn("[review:evaluation] dump failed:", err);
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
function buildEvaluationDebugPayload(draft, argEngine, assignment, result) {
|
|
65
|
+
const variables = argEngine.getVariables().map((v) => ({
|
|
66
|
+
id: v.id,
|
|
67
|
+
symbol: v.symbol,
|
|
68
|
+
claimId: "claimId" in v ? v.claimId : undefined,
|
|
69
|
+
boundPremiseId: "boundPremiseId" in v ? v.boundPremiseId : undefined,
|
|
70
|
+
}));
|
|
71
|
+
const premises = argEngine.listPremises().map((p) => {
|
|
72
|
+
const id = p.getId();
|
|
73
|
+
const expressions = p.getExpressions().map((e) => ({
|
|
74
|
+
id: e.id,
|
|
75
|
+
type: e.type,
|
|
76
|
+
operator: "operator" in e ? e.operator : undefined,
|
|
77
|
+
variableId: "variableId" in e ? e.variableId : undefined,
|
|
78
|
+
parentId: e.parentId,
|
|
79
|
+
position: e.position,
|
|
80
|
+
}));
|
|
81
|
+
return {
|
|
82
|
+
id,
|
|
83
|
+
role: argEngine.getConclusionPremise()?.getId() === id
|
|
84
|
+
? "conclusion"
|
|
85
|
+
: "supporting",
|
|
86
|
+
rootExpressionId: p.getRootExpressionId(),
|
|
87
|
+
expressions,
|
|
88
|
+
};
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
argumentId: argEngine.getArgument().id,
|
|
92
|
+
argumentVersion: argEngine.getArgument().version,
|
|
93
|
+
variables,
|
|
94
|
+
premises,
|
|
95
|
+
draft: {
|
|
96
|
+
claimAssignments: draft.claimAssignments,
|
|
97
|
+
operatorAssignments: draft.operatorAssignments,
|
|
98
|
+
},
|
|
99
|
+
canonicalAssignment: assignment,
|
|
100
|
+
result,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export function checkValidityForReview(argEngine, options = {}) {
|
|
104
|
+
return checkArgumentValidity(toEvaluationContext(argEngine), {
|
|
105
|
+
mode: "exhaustive",
|
|
106
|
+
maxVariables: options.maxVariables ?? 16,
|
|
107
|
+
maxAssignmentsChecked: options.maxAssignmentsChecked ?? 10_000,
|
|
108
|
+
includeCounterexampleEvaluations: true,
|
|
109
|
+
validateFirst: true,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Argument-wide propagated values from `evaluateArgument` with `includeDiagnostics: true`.
|
|
114
|
+
* The core populates `propagatedVariableValues` (0.9.0+); callers should already have it
|
|
115
|
+
* on the result. Returns `{}` when a result isn't available.
|
|
116
|
+
*
|
|
117
|
+
* Key set = `referencedVariableIds` (claim-bound and externally-bound premise variables).
|
|
118
|
+
*/
|
|
119
|
+
export function computePropagatedVariableValues(result) {
|
|
120
|
+
return result?.propagatedVariableValues ?? {};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=evaluation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluation.js","sourceRoot":"","sources":["../../../src/engine/review/evaluation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TReviewDraft } from "../../schemas/review.js";
|
|
2
|
+
/**
|
|
3
|
+
* Hashes the material assignment fields (value, decision, scope, expressionId).
|
|
4
|
+
*
|
|
5
|
+
* Reason-code changes are NOT material — editing a reason without changing the
|
|
6
|
+
* underlying decision should not invalidate `lastResult`'s fingerprint.
|
|
7
|
+
*/
|
|
8
|
+
export declare function materialFingerprint(draft: TReviewDraft): string;
|
|
9
|
+
//# sourceMappingURL=fingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../../src/engine/review/fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAyB/D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hashes the material assignment fields (value, decision, scope, expressionId).
|
|
3
|
+
*
|
|
4
|
+
* Reason-code changes are NOT material — editing a reason without changing the
|
|
5
|
+
* underlying decision should not invalidate `lastResult`'s fingerprint.
|
|
6
|
+
*/
|
|
7
|
+
export function materialFingerprint(draft) {
|
|
8
|
+
const parts = [];
|
|
9
|
+
const claims = Object.values(draft.claimAssignments).sort((a, b) => a.claimId.localeCompare(b.claimId));
|
|
10
|
+
for (const c of claims) {
|
|
11
|
+
parts.push(`c:${c.claimId}:${String(c.value)}:${c.skipped ? 1 : 0}`);
|
|
12
|
+
}
|
|
13
|
+
const ops = [...draft.operatorAssignments].sort((a, b) => {
|
|
14
|
+
const ak = a.scope === "premise"
|
|
15
|
+
? a.premiseId
|
|
16
|
+
: `${a.premiseId}:${a.expressionId ?? ""}`;
|
|
17
|
+
const bk = b.scope === "premise"
|
|
18
|
+
? b.premiseId
|
|
19
|
+
: `${b.premiseId}:${b.expressionId ?? ""}`;
|
|
20
|
+
return ak.localeCompare(bk);
|
|
21
|
+
});
|
|
22
|
+
for (const o of ops) {
|
|
23
|
+
parts.push(`o:${o.premiseId}:${o.expressionId ?? ""}:${o.scope}:${o.decision}`);
|
|
24
|
+
}
|
|
25
|
+
return parts.join("|");
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../../src/engine/review/fingerprint.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAmB;IACnD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC/D,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CACrC,CAAA;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACxE,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrD,MAAM,EAAE,GACJ,CAAC,CAAC,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,CAAC,CAAC,SAAS;YACb,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,CAAA;QAClD,MAAM,EAAE,GACJ,CAAC,CAAC,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,CAAC,CAAC,SAAS;YACb,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,CAAA;QAClD,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;IACF,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CACN,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE,CACtE,CAAA;IACL,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { PropositArgumentEngine } from "../engine.js";
|
|
2
|
+
import type { TConclusionVerdict, TReviewOverlay } from "../review/types.js";
|
|
3
|
+
import type { TReviewDraft, TReviewResult } from "../../schemas/review.js";
|
|
4
|
+
export declare function verdictOf(result: TReviewResult | undefined): TConclusionVerdict | undefined;
|
|
5
|
+
/**
|
|
6
|
+
* Build a review overlay suitable for `createArgumentGraph({ reviewOverlay })`.
|
|
7
|
+
* Returns undefined when there's nothing to paint (no draft + no result).
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildReviewOverlay(params: {
|
|
10
|
+
draft: TReviewDraft | undefined;
|
|
11
|
+
result: TReviewResult | undefined;
|
|
12
|
+
argEngine: PropositArgumentEngine;
|
|
13
|
+
}): TReviewOverlay | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* True when the current draft's material fingerprint differs from the stored result's.
|
|
16
|
+
* Used to render the stale-results banner.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isResultStale(draft: TReviewDraft | undefined, result: TReviewResult | undefined): boolean;
|
|
19
|
+
//# sourceMappingURL=overlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../../src/engine/review/overlay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAC1D,OAAO,KAAK,EAER,kBAAkB,EAClB,cAAc,EACjB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAc1E,wBAAgB,SAAS,CACrB,MAAM,EAAE,aAAa,GAAG,SAAS,GAClC,kBAAkB,GAAG,SAAS,CAWhC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACvC,KAAK,EAAE,YAAY,GAAG,SAAS,CAAA;IAC/B,MAAM,EAAE,aAAa,GAAG,SAAS,CAAA;IACjC,SAAS,EAAE,sBAAsB,CAAA;CACpC,GAAG,cAAc,GAAG,SAAS,CAwC7B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CACzB,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,MAAM,EAAE,aAAa,GAAG,SAAS,GAClC,OAAO,CAGT"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { computePropagatedVariableValues } from "./evaluation.js";
|
|
2
|
+
import { materialFingerprint } from "./fingerprint.js";
|
|
3
|
+
function pillForAssignment(value, skipped) {
|
|
4
|
+
if (skipped)
|
|
5
|
+
return "skipped";
|
|
6
|
+
if (value === true)
|
|
7
|
+
return "true";
|
|
8
|
+
if (value === false)
|
|
9
|
+
return "false";
|
|
10
|
+
return "unknown";
|
|
11
|
+
}
|
|
12
|
+
export function verdictOf(result) {
|
|
13
|
+
if (!result)
|
|
14
|
+
return undefined;
|
|
15
|
+
const e = result.evaluation;
|
|
16
|
+
if (e.isCounterexample === true)
|
|
17
|
+
return "Logically Invalid";
|
|
18
|
+
const vacuous = e.conclusion?.inferenceDiagnostic?.kind === "implies" &&
|
|
19
|
+
e.conclusion.inferenceDiagnostic.isVacuouslyTrue === true;
|
|
20
|
+
if (vacuous && e.conclusionTrue === true)
|
|
21
|
+
return "Vacuous";
|
|
22
|
+
if (e.conclusionTrue === true)
|
|
23
|
+
return "Valid and Sound";
|
|
24
|
+
if (e.conclusionTrue === false)
|
|
25
|
+
return "Failing";
|
|
26
|
+
return "Indeterminate";
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Build a review overlay suitable for `createArgumentGraph({ reviewOverlay })`.
|
|
30
|
+
* Returns undefined when there's nothing to paint (no draft + no result).
|
|
31
|
+
*/
|
|
32
|
+
export function buildReviewOverlay(params) {
|
|
33
|
+
const { draft, result, argEngine } = params;
|
|
34
|
+
if (!draft && !result)
|
|
35
|
+
return undefined;
|
|
36
|
+
const claimValues = {};
|
|
37
|
+
if (draft) {
|
|
38
|
+
for (const a of Object.values(draft.claimAssignments)) {
|
|
39
|
+
claimValues[a.claimId] = pillForAssignment(a.value, a.skipped);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const propagatedValues = result
|
|
43
|
+
? { ...computePropagatedVariableValues(result.evaluation) }
|
|
44
|
+
: {};
|
|
45
|
+
const operatorDecisions = {};
|
|
46
|
+
if (draft) {
|
|
47
|
+
// Fan out premise-scope decisions via the engine's decidable operator expressions,
|
|
48
|
+
// then layer expression-scope overrides on top — matches evaluation's canonicalize.
|
|
49
|
+
for (const op of draft.operatorAssignments) {
|
|
50
|
+
if (op.scope !== "premise")
|
|
51
|
+
continue;
|
|
52
|
+
const p = argEngine.getPremise(op.premiseId);
|
|
53
|
+
if (!p)
|
|
54
|
+
continue;
|
|
55
|
+
for (const e of p.getDecidableOperatorExpressions()) {
|
|
56
|
+
operatorDecisions[e.id] = op.decision;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const op of draft.operatorAssignments) {
|
|
60
|
+
if (op.scope === "expression" && op.expressionId) {
|
|
61
|
+
operatorDecisions[op.expressionId] = op.decision;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
claimValues,
|
|
67
|
+
propagatedValues,
|
|
68
|
+
operatorDecisions,
|
|
69
|
+
conclusionVerdict: verdictOf(result),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* True when the current draft's material fingerprint differs from the stored result's.
|
|
74
|
+
* Used to render the stale-results banner.
|
|
75
|
+
*/
|
|
76
|
+
export function isResultStale(draft, result) {
|
|
77
|
+
if (!draft || !result)
|
|
78
|
+
return false;
|
|
79
|
+
return materialFingerprint(draft) !== result.evaluatedFingerprint;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../src/engine/review/overlay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TClaimReasonCode, TClaimTrueReasonCode, TClaimFalseReasonCode, TClaimUnknownReasonCode, TOperatorReasonCode, TOperatorAcceptReasonCode, TOperatorRejectReasonCode, TTrivalentValue } from "../../schemas/review.js";
|
|
2
|
+
export interface TReasonEntry<TCode extends string> {
|
|
3
|
+
code: TCode;
|
|
4
|
+
label: string;
|
|
5
|
+
description: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const CLAIM_TRUE_REASONS: readonly TReasonEntry<TClaimTrueReasonCode>[];
|
|
8
|
+
export declare const CLAIM_FALSE_REASONS: readonly TReasonEntry<TClaimFalseReasonCode>[];
|
|
9
|
+
export declare const CLAIM_UNKNOWN_REASONS: readonly TReasonEntry<TClaimUnknownReasonCode>[];
|
|
10
|
+
export declare const OPERATOR_ACCEPT_REASONS: readonly TReasonEntry<TOperatorAcceptReasonCode>[];
|
|
11
|
+
export declare const OPERATOR_REJECT_REASONS: readonly TReasonEntry<TOperatorRejectReasonCode>[];
|
|
12
|
+
export declare function getClaimReasonsForValue(v: TTrivalentValue): readonly TReasonEntry<TClaimReasonCode>[];
|
|
13
|
+
export declare function getOperatorReasonsForDecision(d: "accepted" | "rejected"): readonly TReasonEntry<TOperatorReasonCode>[];
|
|
14
|
+
export declare function findReasonByCode(code: TClaimReasonCode | TOperatorReasonCode): TReasonEntry<string> | undefined;
|
|
15
|
+
//# sourceMappingURL=reasons.d.ts.map
|