@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,63 @@
|
|
|
1
|
+
import type { UUID } from "../../schemas/common.js";
|
|
2
|
+
import type { TReviewState, TClaimAssignment, TOperatorAssignment, TReviewResult } from "../../schemas/review.js";
|
|
3
|
+
export interface TReviewKey {
|
|
4
|
+
argumentId: UUID;
|
|
5
|
+
argumentVersion: number;
|
|
6
|
+
userId?: UUID;
|
|
7
|
+
}
|
|
8
|
+
export interface TReviewStore {
|
|
9
|
+
load(key: TReviewKey): Promise<TReviewState | undefined>;
|
|
10
|
+
save(key: TReviewKey, state: TReviewState): Promise<void>;
|
|
11
|
+
upsertClaimAssignment(key: TReviewKey, a: TClaimAssignment): Promise<void>;
|
|
12
|
+
upsertOperatorAssignment(key: TReviewKey, a: TOperatorAssignment): Promise<void>;
|
|
13
|
+
saveResult(key: TReviewKey, r: TReviewResult): Promise<void>;
|
|
14
|
+
clear(key: TReviewKey): Promise<void>;
|
|
15
|
+
/** Public key-derivation helper used by the React provider's cross-tab filter. */
|
|
16
|
+
keyFor(key: TReviewKey): string;
|
|
17
|
+
}
|
|
18
|
+
export declare class ReviewStorageQuotaError extends Error {
|
|
19
|
+
constructor(message?: string);
|
|
20
|
+
}
|
|
21
|
+
export declare class ReviewStorageUnavailableError extends Error {
|
|
22
|
+
constructor(message?: string);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Migrate a raw localStorage payload to the current schema shape.
|
|
26
|
+
* Returns `{ state, migrated }`; caller should re-persist when migrated === true.
|
|
27
|
+
* Silently strips unknown reason codes.
|
|
28
|
+
*/
|
|
29
|
+
export declare function migrateReviewState(raw: unknown): {
|
|
30
|
+
state: unknown;
|
|
31
|
+
migrated: boolean;
|
|
32
|
+
};
|
|
33
|
+
export declare class LocalStorageReviewStore implements TReviewStore {
|
|
34
|
+
keyFor(k: TReviewKey): string;
|
|
35
|
+
load(key: TReviewKey): Promise<TReviewState | undefined>;
|
|
36
|
+
save(key: TReviewKey, state: TReviewState): Promise<void>;
|
|
37
|
+
private opKey;
|
|
38
|
+
upsertClaimAssignment(key: TReviewKey, a: TClaimAssignment): Promise<void>;
|
|
39
|
+
upsertOperatorAssignment(key: TReviewKey, a: TOperatorAssignment): Promise<void>;
|
|
40
|
+
saveResult(key: TReviewKey, r: TReviewResult): Promise<void>;
|
|
41
|
+
clear(key: TReviewKey): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* In-memory `TReviewStore` used by readonly review viewers.
|
|
45
|
+
*
|
|
46
|
+
* `load` and `save` round-trip state through a per-instance memory slot (so
|
|
47
|
+
* `ReviewEngine.runEvaluation`'s post-notify persist call succeeds without
|
|
48
|
+
* touching localStorage). The upsert methods (`upsertClaimAssignment`,
|
|
49
|
+
* `upsertOperatorAssignment`, `saveResult`) are true no-ops; they do NOT
|
|
50
|
+
* merge into the in-memory slot. Do NOT use this store with an editable
|
|
51
|
+
* engine — individual assignment upserts would be silently dropped.
|
|
52
|
+
*/
|
|
53
|
+
export declare class InMemoryReviewStore implements TReviewStore {
|
|
54
|
+
private data;
|
|
55
|
+
keyFor(k: TReviewKey): string;
|
|
56
|
+
load(_key: TReviewKey): Promise<TReviewState | undefined>;
|
|
57
|
+
save(_key: TReviewKey, state: TReviewState): Promise<void>;
|
|
58
|
+
upsertClaimAssignment(): Promise<void>;
|
|
59
|
+
upsertOperatorAssignment(): Promise<void>;
|
|
60
|
+
saveResult(): Promise<void>;
|
|
61
|
+
clear(_key: TReviewKey): Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=review-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-store.d.ts","sourceRoot":"","sources":["../../../src/engine/review/review-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,KAAK,EACR,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EAChB,MAAM,yBAAyB,CAAA;AAgChC,MAAM,WAAW,UAAU;IACvB,UAAU,EAAE,IAAI,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,IAAI,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IACzB,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAA;IACxD,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzD,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1E,wBAAwB,CACpB,GAAG,EAAE,UAAU,EACf,CAAC,EAAE,mBAAmB,GACvB,OAAO,CAAC,IAAI,CAAC,CAAA;IAChB,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,KAAK,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,kFAAkF;IAClF,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAAA;CAClC;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBAClC,OAAO,SAAgC;CAItD;AACD,qBAAa,6BAA8B,SAAQ,KAAK;gBACxC,OAAO,SAA6B;CAInD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG;IAC9C,KAAK,EAAE,OAAO,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;CACpB,CA4BA;AAID,qBAAa,uBAAwB,YAAW,YAAY;IACxD,MAAM,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM;IAKvB,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IA4B9D,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzD,OAAO,CAAC,KAAK;IAMP,qBAAqB,CACvB,GAAG,EAAE,UAAU,EACf,CAAC,EAAE,gBAAgB,GACpB,OAAO,CAAC,IAAI,CAAC;IAWV,wBAAwB,CAC1B,GAAG,EAAE,UAAU,EACf,CAAC,EAAE,mBAAmB,GACvB,OAAO,CAAC,IAAI,CAAC;IAeV,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlE,KAAK,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAOxC;AAED;;;;;;;;;GASG;AACH,qBAAa,mBAAoB,YAAW,YAAY;IACpD,OAAO,CAAC,IAAI,CAA0B;IACtC,MAAM,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM;IAG7B,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAGzD,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAGtC,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;IAGzC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAG3B,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAIzC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { ClaimReasonCodeSchema, OperatorReasonCodeSchema, ReviewStateSchema, } from "../../schemas/review.js";
|
|
2
|
+
import { Value } from "typebox/value";
|
|
3
|
+
const browserGlobals = globalThis;
|
|
4
|
+
const isQuotaExceeded = (err) => typeof err === "object" &&
|
|
5
|
+
err !== null &&
|
|
6
|
+
err.name === "QuotaExceededError";
|
|
7
|
+
export class ReviewStorageQuotaError extends Error {
|
|
8
|
+
constructor(message = "localStorage quota exceeded") {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = "ReviewStorageQuotaError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class ReviewStorageUnavailableError extends Error {
|
|
14
|
+
constructor(message = "localStorage unavailable") {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = "ReviewStorageUnavailableError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Migrate a raw localStorage payload to the current schema shape.
|
|
21
|
+
* Returns `{ state, migrated }`; caller should re-persist when migrated === true.
|
|
22
|
+
* Silently strips unknown reason codes.
|
|
23
|
+
*/
|
|
24
|
+
export function migrateReviewState(raw) {
|
|
25
|
+
if (!raw || typeof raw !== "object" || !("draft" in raw)) {
|
|
26
|
+
return { state: raw, migrated: false };
|
|
27
|
+
}
|
|
28
|
+
const s = raw;
|
|
29
|
+
let migrated = false;
|
|
30
|
+
for (const a of Object.values(s.draft.claimAssignments ?? {})) {
|
|
31
|
+
if (a.reasonCode && !Value.Check(ClaimReasonCodeSchema, a.reasonCode)) {
|
|
32
|
+
delete a.reasonCode;
|
|
33
|
+
migrated = true;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
for (const a of s.draft.operatorAssignments ?? []) {
|
|
37
|
+
if (a.reasonCode &&
|
|
38
|
+
!Value.Check(OperatorReasonCodeSchema, a.reasonCode)) {
|
|
39
|
+
delete a.reasonCode;
|
|
40
|
+
migrated = true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return { state: raw, migrated };
|
|
44
|
+
}
|
|
45
|
+
const STORAGE_PREFIX = "proposit.review";
|
|
46
|
+
export class LocalStorageReviewStore {
|
|
47
|
+
keyFor(k) {
|
|
48
|
+
const userSegment = k.userId ?? "anon";
|
|
49
|
+
return `${STORAGE_PREFIX}.${userSegment}.${k.argumentId}.${k.argumentVersion}`;
|
|
50
|
+
}
|
|
51
|
+
async load(key) {
|
|
52
|
+
const ls = browserGlobals.localStorage;
|
|
53
|
+
if (browserGlobals.window === undefined || !ls)
|
|
54
|
+
return undefined;
|
|
55
|
+
let raw;
|
|
56
|
+
try {
|
|
57
|
+
raw = ls.getItem(this.keyFor(key));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
throw new ReviewStorageUnavailableError();
|
|
61
|
+
}
|
|
62
|
+
if (!raw)
|
|
63
|
+
return undefined;
|
|
64
|
+
try {
|
|
65
|
+
const parsed = JSON.parse(raw);
|
|
66
|
+
const { state: migrated, migrated: didMigrate } = migrateReviewState(parsed);
|
|
67
|
+
// Convert before Parse: EncodableDate's Convert rehydrates ISO strings
|
|
68
|
+
// into Date instances (precedent: src/utils/shared/utils.ts::parseResponse).
|
|
69
|
+
const converted = Value.Convert(ReviewStateSchema, migrated);
|
|
70
|
+
const state = Value.Parse(ReviewStateSchema, converted);
|
|
71
|
+
if (didMigrate)
|
|
72
|
+
await this.save(key, state);
|
|
73
|
+
return state;
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
// Corrupted blob: drop it and let caller re-initialize.
|
|
77
|
+
console.warn("review-store: dropping corrupted review state", err);
|
|
78
|
+
await this.clear(key);
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
save(key, state) {
|
|
83
|
+
const ls = browserGlobals.localStorage;
|
|
84
|
+
if (browserGlobals.window === undefined || !ls)
|
|
85
|
+
return Promise.reject(new ReviewStorageUnavailableError("SSR"));
|
|
86
|
+
const serialized = Value.Encode(ReviewStateSchema, state);
|
|
87
|
+
try {
|
|
88
|
+
ls.setItem(this.keyFor(key), JSON.stringify(serialized));
|
|
89
|
+
return Promise.resolve();
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
if (isQuotaExceeded(err)) {
|
|
93
|
+
return Promise.reject(new ReviewStorageQuotaError());
|
|
94
|
+
}
|
|
95
|
+
return Promise.reject(err instanceof Error ? err : new Error(String(err)));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
opKey(a) {
|
|
99
|
+
return a.scope === "premise"
|
|
100
|
+
? a.premiseId
|
|
101
|
+
: `${a.premiseId}:${a.expressionId ?? ""}`;
|
|
102
|
+
}
|
|
103
|
+
async upsertClaimAssignment(key, a) {
|
|
104
|
+
const state = await this.load(key);
|
|
105
|
+
if (!state)
|
|
106
|
+
throw new ReviewStorageUnavailableError("upsertClaimAssignment: no existing state");
|
|
107
|
+
state.draft.claimAssignments[a.claimId] = a;
|
|
108
|
+
state.draft.updatedAt = new Date();
|
|
109
|
+
await this.save(key, state);
|
|
110
|
+
}
|
|
111
|
+
async upsertOperatorAssignment(key, a) {
|
|
112
|
+
const state = await this.load(key);
|
|
113
|
+
if (!state)
|
|
114
|
+
throw new ReviewStorageUnavailableError("upsertOperatorAssignment: no existing state");
|
|
115
|
+
const idx = state.draft.operatorAssignments.findIndex((x) => this.opKey(x) === this.opKey(a));
|
|
116
|
+
if (idx >= 0)
|
|
117
|
+
state.draft.operatorAssignments[idx] = a;
|
|
118
|
+
else
|
|
119
|
+
state.draft.operatorAssignments.push(a);
|
|
120
|
+
state.draft.updatedAt = new Date();
|
|
121
|
+
await this.save(key, state);
|
|
122
|
+
}
|
|
123
|
+
async saveResult(key, r) {
|
|
124
|
+
const state = await this.load(key);
|
|
125
|
+
if (!state)
|
|
126
|
+
throw new ReviewStorageUnavailableError("saveResult: no existing state");
|
|
127
|
+
state.lastResult = r;
|
|
128
|
+
await this.save(key, state);
|
|
129
|
+
}
|
|
130
|
+
clear(key) {
|
|
131
|
+
const ls = browserGlobals.localStorage;
|
|
132
|
+
if (browserGlobals.window !== undefined && ls) {
|
|
133
|
+
ls.removeItem(this.keyFor(key));
|
|
134
|
+
}
|
|
135
|
+
return Promise.resolve();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* In-memory `TReviewStore` used by readonly review viewers.
|
|
140
|
+
*
|
|
141
|
+
* `load` and `save` round-trip state through a per-instance memory slot (so
|
|
142
|
+
* `ReviewEngine.runEvaluation`'s post-notify persist call succeeds without
|
|
143
|
+
* touching localStorage). The upsert methods (`upsertClaimAssignment`,
|
|
144
|
+
* `upsertOperatorAssignment`, `saveResult`) are true no-ops; they do NOT
|
|
145
|
+
* merge into the in-memory slot. Do NOT use this store with an editable
|
|
146
|
+
* engine — individual assignment upserts would be silently dropped.
|
|
147
|
+
*/
|
|
148
|
+
export class InMemoryReviewStore {
|
|
149
|
+
data;
|
|
150
|
+
keyFor(k) {
|
|
151
|
+
return `memory:${k.argumentId}:${k.argumentVersion}:${k.userId ?? "anon"}`;
|
|
152
|
+
}
|
|
153
|
+
load(_key) {
|
|
154
|
+
return Promise.resolve(this.data);
|
|
155
|
+
}
|
|
156
|
+
save(_key, state) {
|
|
157
|
+
this.data = state;
|
|
158
|
+
return Promise.resolve();
|
|
159
|
+
}
|
|
160
|
+
upsertClaimAssignment() {
|
|
161
|
+
return Promise.resolve();
|
|
162
|
+
}
|
|
163
|
+
upsertOperatorAssignment() {
|
|
164
|
+
return Promise.resolve();
|
|
165
|
+
}
|
|
166
|
+
saveResult() {
|
|
167
|
+
return Promise.resolve();
|
|
168
|
+
}
|
|
169
|
+
clear(_key) {
|
|
170
|
+
this.data = undefined;
|
|
171
|
+
return Promise.resolve();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=review-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-store.js","sourceRoot":"","sources":["../../../src/engine/review/review-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ProjectEngine } from "../mutations/types.js";
|
|
2
|
+
import type { UUID } from "../../schemas/common.js";
|
|
3
|
+
export interface TOperatorQueueEntry {
|
|
4
|
+
premiseId: UUID;
|
|
5
|
+
scope: "premise";
|
|
6
|
+
}
|
|
7
|
+
export type TStepQueue = {
|
|
8
|
+
kind: "claim";
|
|
9
|
+
items: UUID[];
|
|
10
|
+
} | {
|
|
11
|
+
kind: "operator";
|
|
12
|
+
items: TOperatorQueueEntry[];
|
|
13
|
+
};
|
|
14
|
+
export declare function buildClaimQueue(argEngine: ProjectEngine): UUID[];
|
|
15
|
+
export declare function buildOperatorQueue(argEngine: ProjectEngine): TOperatorQueueEntry[];
|
|
16
|
+
export declare function advanceQueue(params: {
|
|
17
|
+
queue: TStepQueue;
|
|
18
|
+
currentIndex: number;
|
|
19
|
+
skippedKeys: Set<string>;
|
|
20
|
+
decidedKeys: Set<string>;
|
|
21
|
+
}): {
|
|
22
|
+
nextIndex: number;
|
|
23
|
+
insertRequeueNotice: boolean;
|
|
24
|
+
} | {
|
|
25
|
+
done: true;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=step-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-queue.d.ts","sourceRoot":"","sources":["../../../src/engine/review/step-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAA;AAInD,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,IAAI,CAAA;IACf,KAAK,EAAE,SAAS,CAAA;CACnB;AACD,MAAM,MAAM,UAAU,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,mBAAmB,EAAE,CAAA;CAAE,CAAA;AAExD,wBAAgB,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,EAAE,CAGhE;AAED,wBAAgB,kBAAkB,CAC9B,SAAS,EAAE,aAAa,GACzB,mBAAmB,EAAE,CAcvB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACjC,KAAK,EAAE,UAAU,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACxB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC3B,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAavE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { collectArgumentReferencedClaims } from "@proposit/proposit-core";
|
|
2
|
+
import { toEvaluationContext } from "./evaluation.js";
|
|
3
|
+
export function buildClaimQueue(argEngine) {
|
|
4
|
+
const ctx = toEvaluationContext(argEngine);
|
|
5
|
+
return collectArgumentReferencedClaims(ctx).claimIds;
|
|
6
|
+
}
|
|
7
|
+
export function buildOperatorQueue(argEngine) {
|
|
8
|
+
const out = [];
|
|
9
|
+
const premises = [
|
|
10
|
+
...argEngine.listSupportingPremises(),
|
|
11
|
+
...(argEngine.getConclusionPremise()
|
|
12
|
+
? [argEngine.getConclusionPremise()]
|
|
13
|
+
: []),
|
|
14
|
+
];
|
|
15
|
+
for (const p of premises) {
|
|
16
|
+
if (p.getDecidableOperatorExpressions().length > 0) {
|
|
17
|
+
out.push({ premiseId: p.getId(), scope: "premise" });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
export function advanceQueue(params) {
|
|
23
|
+
const items = params.queue.kind === "claim"
|
|
24
|
+
? params.queue.items
|
|
25
|
+
: params.queue.items.map((i) => i.premiseId);
|
|
26
|
+
const next = params.currentIndex + 1;
|
|
27
|
+
if (next < items.length)
|
|
28
|
+
return { nextIndex: next, insertRequeueNotice: false };
|
|
29
|
+
const remaining = items.findIndex((k) => params.skippedKeys.has(k) && !params.decidedKeys.has(k));
|
|
30
|
+
if (remaining < 0)
|
|
31
|
+
return { done: true };
|
|
32
|
+
return { nextIndex: remaining, insertRequeueNotice: true };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=step-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-queue.js","sourceRoot":"","sources":["../../../src/engine/review/step-queue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAUrD,MAAM,UAAU,eAAe,CAAC,SAAwB;IACpD,MAAM,GAAG,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAA;IAC1C,OAAO,+BAA+B,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAC9B,SAAwB;IAExB,MAAM,GAAG,GAA0B,EAAE,CAAA;IACrC,MAAM,QAAQ,GAAG;QACb,GAAG,SAAS,CAAC,sBAAsB,EAAE;QACrC,GAAG,CAAC,SAAS,CAAC,oBAAoB,EAAE;YAChC,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,EAAG,CAAC;YACrC,CAAC,CAAC,EAAE,CAAC;KACZ,CAAA;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,+BAA+B,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;QACxD,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAA;AACd,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAK5B;IACG,MAAM,KAAK,GACP,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO;QACzB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;QACpB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,GAAG,CAAC,CAAA;IACpC,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM;QACnB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAA;IAC1D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CACjE,CAAA;IACD,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACxC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAA;AAC9D,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Three-valued assignment pill, surfaced on claim nodes. */
|
|
2
|
+
export type TAssignmentPill = "true" | "false" | "unknown" | "skipped";
|
|
3
|
+
/** Verdict rendered on the conclusion premise node after evaluation. */
|
|
4
|
+
export type TConclusionVerdict = "Valid and Sound" | "Failing" | "Logically Invalid" | "Vacuous" | "Indeterminate";
|
|
5
|
+
/** Review-phase data merged into the graph when rendering with review overlay. */
|
|
6
|
+
export interface TReviewOverlay {
|
|
7
|
+
/** User's assignment per claimId. */
|
|
8
|
+
claimValues: Record<string, TAssignmentPill>;
|
|
9
|
+
/** Evaluator-propagated value per variableId. */
|
|
10
|
+
propagatedValues: Record<string, boolean | null>;
|
|
11
|
+
/** Operator accept/reject decision per expressionId. */
|
|
12
|
+
operatorDecisions: Record<string, "accepted" | "rejected">;
|
|
13
|
+
/** Verdict for the conclusion premise node. */
|
|
14
|
+
conclusionVerdict?: TConclusionVerdict;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/engine/review/types.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;AAEtE,wEAAwE;AACxE,MAAM,MAAM,kBAAkB,GACxB,iBAAiB,GACjB,SAAS,GACT,mBAAmB,GACnB,SAAS,GACT,eAAe,CAAA;AAErB,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC3B,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IAC5C,iDAAiD;IACjD,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC,CAAA;IAChD,wDAAwD;IACxD,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC,CAAA;IAC1D,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,kBAAkB,CAAA;CACzC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/engine/review/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { TServerReview } from "../../schemas/model/review.js";
|
|
2
|
+
import type { TReviewDraft } from "../../schemas/review.js";
|
|
3
|
+
import type { TReviewUpdateRequest } from "../../schemas/api/review/index.js";
|
|
4
|
+
export declare function serverReviewToDraft(review: TServerReview): TReviewDraft;
|
|
5
|
+
export declare function draftToUpdatePayload(draft: TReviewDraft): TReviewUpdateRequest;
|
|
6
|
+
export declare function hasAnyDecisions(draft: TReviewDraft): boolean;
|
|
7
|
+
export declare function isFullyDecided(draft: TReviewDraft): boolean;
|
|
8
|
+
//# sourceMappingURL=wire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../../src/engine/review/wire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,KAAK,EACR,YAAY,EAIf,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AAoB7E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,YAAY,CA4CvE;AAED,wBAAgB,oBAAoB,CAChC,KAAK,EAAE,YAAY,GACpB,oBAAoB,CAoBtB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAI5D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAK3D"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
function serverValueToDraft(value) {
|
|
2
|
+
if (value === "true")
|
|
3
|
+
return true;
|
|
4
|
+
if (value === "false")
|
|
5
|
+
return false;
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
function draftValueToServer(value) {
|
|
9
|
+
if (value === true)
|
|
10
|
+
return "true";
|
|
11
|
+
if (value === false)
|
|
12
|
+
return "false";
|
|
13
|
+
if (value === null)
|
|
14
|
+
return "unknown";
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
export function serverReviewToDraft(review) {
|
|
18
|
+
const claimAssignments = {};
|
|
19
|
+
for (const a of review.claimAssignments) {
|
|
20
|
+
const isUndecided = a.value === null && !a.skipped && !a.decidedAt;
|
|
21
|
+
if (isUndecided)
|
|
22
|
+
continue;
|
|
23
|
+
claimAssignments[a.claimId] = {
|
|
24
|
+
assignmentId: a.claimId,
|
|
25
|
+
claimId: a.claimId,
|
|
26
|
+
value: serverValueToDraft(a.value),
|
|
27
|
+
skipped: a.skipped,
|
|
28
|
+
reasonCode: (a.reasonCode ??
|
|
29
|
+
undefined),
|
|
30
|
+
decidedAt: a.decidedAt ?? new Date(),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const operatorAssignments = [];
|
|
34
|
+
for (const o of review.operatorAssignments) {
|
|
35
|
+
if (!o.decision)
|
|
36
|
+
continue;
|
|
37
|
+
operatorAssignments.push({
|
|
38
|
+
assignmentId: `${o.premiseId}:${o.scope}:${o.expressionId ?? ""}`,
|
|
39
|
+
premiseId: o.premiseId,
|
|
40
|
+
expressionId: o.expressionId ?? undefined,
|
|
41
|
+
scope: o.scope,
|
|
42
|
+
decision: o.decision,
|
|
43
|
+
reasonCode: (o.reasonCode ??
|
|
44
|
+
undefined),
|
|
45
|
+
decidedAt: o.decidedAt ?? new Date(),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
schemaVersion: 1,
|
|
50
|
+
reviewId: review.id,
|
|
51
|
+
argumentId: review.argumentId,
|
|
52
|
+
argumentVersion: review.argumentVersion,
|
|
53
|
+
userId: review.userId,
|
|
54
|
+
createdAt: review.createdOn,
|
|
55
|
+
updatedAt: review.updatedOn,
|
|
56
|
+
phase: review.phase,
|
|
57
|
+
currentStepIndex: review.currentStepIndex,
|
|
58
|
+
claimAssignments,
|
|
59
|
+
operatorAssignments,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export function draftToUpdatePayload(draft) {
|
|
63
|
+
return {
|
|
64
|
+
phase: draft.phase,
|
|
65
|
+
currentStepIndex: draft.currentStepIndex,
|
|
66
|
+
claimAssignments: Object.values(draft.claimAssignments).map((a) => ({
|
|
67
|
+
claimId: a.claimId,
|
|
68
|
+
value: draftValueToServer(a.value),
|
|
69
|
+
skipped: a.skipped,
|
|
70
|
+
reasonCode: a.reasonCode ?? null,
|
|
71
|
+
decidedAt: a.decidedAt ?? null,
|
|
72
|
+
})),
|
|
73
|
+
operatorAssignments: draft.operatorAssignments.map((o) => ({
|
|
74
|
+
premiseId: o.premiseId,
|
|
75
|
+
expressionId: o.expressionId ?? null,
|
|
76
|
+
scope: o.scope,
|
|
77
|
+
decision: o.decision,
|
|
78
|
+
reasonCode: o.reasonCode ?? null,
|
|
79
|
+
decidedAt: o.decidedAt ?? null,
|
|
80
|
+
})),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export function hasAnyDecisions(draft) {
|
|
84
|
+
if (Object.keys(draft.claimAssignments).length > 0)
|
|
85
|
+
return true;
|
|
86
|
+
if (draft.operatorAssignments.length > 0)
|
|
87
|
+
return true;
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
export function isFullyDecided(draft) {
|
|
91
|
+
for (const a of Object.values(draft.claimAssignments)) {
|
|
92
|
+
if (a.value === null && !a.skipped)
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../src/engine/review/wire.ts"],"names":[],"mappings":"AAUA,SAAS,kBAAkB,CACvB,KAA0C;IAE1C,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IACjC,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,CAAA;IACnC,OAAO,IAAI,CAAA;AACf,CAAC;AAED,SAAS,kBAAkB,CACvB,KAAsB;IAEtB,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAA;IACjC,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,OAAO,CAAA;IACnC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IACpC,OAAO,IAAI,CAAA;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAqB;IACrD,MAAM,gBAAgB,GAAmC,EAAE,CAAA;IAC3D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;QAClE,IAAI,WAAW;YAAE,SAAQ;QACzB,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;YAC1B,YAAY,EAAE,CAAC,CAAC,OAAO;YACvB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC;YAClC,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU;gBACrB,SAAS,CAAmC;YAChD,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE;SACvC,CAAA;IACL,CAAC;IAED,MAAM,mBAAmB,GAA0B,EAAE,CAAA;IACrD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACzC,IAAI,CAAC,CAAC,CAAC,QAAQ;YAAE,SAAQ;QACzB,mBAAmB,CAAC,IAAI,CAAC;YACrB,YAAY,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE;YACjE,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,SAAS;YACzC,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU;gBACrB,SAAS,CAAsC;YACnD,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE;SACvC,CAAC,CAAA;IACN,CAAC;IAED,OAAO;QACH,aAAa,EAAE,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,gBAAgB;QAChB,mBAAmB;KACtB,CAAA;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAChC,KAAmB;IAEnB,OAAO;QACH,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChE,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC;YAClC,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI;YAChC,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;SACjC,CAAC,CAAC;QACH,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvD,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;YACpC,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI;YAChC,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;SACjC,CAAC,CAAC;KACN,CAAA;AACL,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAmB;IAC/C,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAC/D,IAAI,KAAK,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IACrD,OAAO,KAAK,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAmB;IAC9C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO;YAAE,OAAO,KAAK,CAAA;IACpD,CAAC;IACD,OAAO,IAAI,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { TProjectReactiveSnapshot } from "./engine.js";
|
|
2
|
+
import type { TLogicalOperatorType } from "../schemas/logic.js";
|
|
3
|
+
/** Operator display labels for the text view. */
|
|
4
|
+
export declare const OPERATOR_LABELS: Record<Exclude<TLogicalOperatorType, "not">, string>;
|
|
5
|
+
export type TTextTreeItem = {
|
|
6
|
+
type: "premise-header";
|
|
7
|
+
premiseId: string;
|
|
8
|
+
role: "conclusion" | "supporting";
|
|
9
|
+
title: string | null;
|
|
10
|
+
} | {
|
|
11
|
+
type: "claim";
|
|
12
|
+
expressionId: string;
|
|
13
|
+
variableId: string;
|
|
14
|
+
claimId: string | null;
|
|
15
|
+
claimTitle: string;
|
|
16
|
+
claimBody: string;
|
|
17
|
+
negated: boolean;
|
|
18
|
+
isConclusion: boolean;
|
|
19
|
+
depth: number;
|
|
20
|
+
} | {
|
|
21
|
+
type: "operator";
|
|
22
|
+
operator: Exclude<TLogicalOperatorType, "not">;
|
|
23
|
+
label: string;
|
|
24
|
+
depth: number;
|
|
25
|
+
} | {
|
|
26
|
+
type: "empty-premise";
|
|
27
|
+
premiseId: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Build a text-tree for a single premise. Emits walk items only (no
|
|
31
|
+
* premise-header). Use when rendering a standalone premise preview.
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildPremiseTextTree(snapshot: TProjectReactiveSnapshot, premiseId: string): TTextTreeItem[];
|
|
34
|
+
export declare function buildTextTree(snapshot: TProjectReactiveSnapshot): TTextTreeItem[];
|
|
35
|
+
//# sourceMappingURL=text-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-tree.d.ts","sourceRoot":"","sources":["../../src/engine/text-tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,KAAK,EAER,oBAAoB,EACvB,MAAM,qBAAqB,CAAA;AAE5B,iDAAiD;AACjD,eAAO,MAAM,eAAe,EAAE,MAAM,CAChC,OAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC,EACpC,MAAM,CAMT,CAAA;AAED,MAAM,MAAM,aAAa,GACnB;IACI,IAAI,EAAE,gBAAgB,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,YAAY,GAAG,YAAY,CAAA;IACjC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,GACD;IACI,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,OAAO,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;CAChB,GACD;IACI,IAAI,EAAE,UAAU,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;IAC9C,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CAChB,GACD;IACI,IAAI,EAAE,eAAe,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;CACpB,CAAA;AAEP;;;GAGG;AACH,wBAAgB,oBAAoB,CAChC,QAAQ,EAAE,wBAAwB,EAClC,SAAS,EAAE,MAAM,GAClB,aAAa,EAAE,CAmBjB;AA4GD,wBAAgB,aAAa,CACzB,QAAQ,EAAE,wBAAwB,GACnC,aAAa,EAAE,CA0BjB"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/** Operator display labels for the text view. */
|
|
2
|
+
export const OPERATOR_LABELS = {
|
|
3
|
+
and: "and",
|
|
4
|
+
or: "or",
|
|
5
|
+
implies: "is true if",
|
|
6
|
+
iff: "is true if and only if",
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Build a text-tree for a single premise. Emits walk items only (no
|
|
10
|
+
* premise-header). Use when rendering a standalone premise preview.
|
|
11
|
+
*/
|
|
12
|
+
export function buildPremiseTextTree(snapshot, premiseId) {
|
|
13
|
+
const premiseSnap = snapshot.premises[premiseId];
|
|
14
|
+
if (!premiseSnap)
|
|
15
|
+
return [];
|
|
16
|
+
const isConclusion = snapshot.roles.conclusionPremiseId === premiseId;
|
|
17
|
+
const rootExprId = premiseSnap.rootExpressionId;
|
|
18
|
+
if (!rootExprId)
|
|
19
|
+
return [{ type: "empty-premise", premiseId }];
|
|
20
|
+
const items = [];
|
|
21
|
+
walkPremiseExpression({
|
|
22
|
+
exprId: rootExprId,
|
|
23
|
+
premiseExpressions: premiseSnap.expressions,
|
|
24
|
+
variables: snapshot.variables,
|
|
25
|
+
claims: snapshot.claims,
|
|
26
|
+
negated: false,
|
|
27
|
+
depth: 0,
|
|
28
|
+
isConclusion,
|
|
29
|
+
items,
|
|
30
|
+
});
|
|
31
|
+
return items;
|
|
32
|
+
}
|
|
33
|
+
function getChildExpressions(parentId, premiseExpressions) {
|
|
34
|
+
return Object.values(premiseExpressions)
|
|
35
|
+
.filter((e) => e.parentId === parentId)
|
|
36
|
+
.sort((a, b) => (a.position ?? 0) - (b.position ?? 0));
|
|
37
|
+
}
|
|
38
|
+
function walkPremiseExpression(args) {
|
|
39
|
+
const { exprId, premiseExpressions, variables, claims, negated, depth, isConclusion, items, } = args;
|
|
40
|
+
const expr = premiseExpressions[exprId];
|
|
41
|
+
if (!expr)
|
|
42
|
+
return;
|
|
43
|
+
if (expr.type === "variable") {
|
|
44
|
+
const variable = variables[expr.variableId];
|
|
45
|
+
let claimId = null;
|
|
46
|
+
let claimTitle = "";
|
|
47
|
+
let claimBody = "";
|
|
48
|
+
if (variable && "claimId" in variable) {
|
|
49
|
+
claimId = variable.claimId;
|
|
50
|
+
const claim = claims[variable.claimId];
|
|
51
|
+
if (claim) {
|
|
52
|
+
claimTitle = claim.title;
|
|
53
|
+
claimBody = claim.body;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
items.push({
|
|
57
|
+
type: "claim",
|
|
58
|
+
expressionId: expr.id,
|
|
59
|
+
variableId: expr.variableId,
|
|
60
|
+
claimId,
|
|
61
|
+
claimTitle,
|
|
62
|
+
claimBody,
|
|
63
|
+
negated,
|
|
64
|
+
isConclusion,
|
|
65
|
+
depth,
|
|
66
|
+
});
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (expr.type === "formula") {
|
|
70
|
+
const children = getChildExpressions(exprId, premiseExpressions);
|
|
71
|
+
for (const child of children) {
|
|
72
|
+
walkPremiseExpression({
|
|
73
|
+
...args,
|
|
74
|
+
exprId: child.id,
|
|
75
|
+
depth: depth + 1,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (expr.type === "operator") {
|
|
81
|
+
if (expr.operator === "not") {
|
|
82
|
+
const children = getChildExpressions(exprId, premiseExpressions);
|
|
83
|
+
if (children.length > 0) {
|
|
84
|
+
walkPremiseExpression({
|
|
85
|
+
...args,
|
|
86
|
+
exprId: children[0].id,
|
|
87
|
+
negated: !negated,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const children = getChildExpressions(exprId, premiseExpressions);
|
|
93
|
+
const isInference = expr.operator === "implies" || expr.operator === "iff";
|
|
94
|
+
const orderedChildren = isInference ? [...children].reverse() : children;
|
|
95
|
+
for (let i = 0; i < orderedChildren.length; i++) {
|
|
96
|
+
walkPremiseExpression({
|
|
97
|
+
...args,
|
|
98
|
+
exprId: orderedChildren[i].id,
|
|
99
|
+
negated: false,
|
|
100
|
+
});
|
|
101
|
+
if (i < orderedChildren.length - 1) {
|
|
102
|
+
items.push({
|
|
103
|
+
type: "operator",
|
|
104
|
+
operator: expr.operator,
|
|
105
|
+
label: OPERATOR_LABELS[expr.operator],
|
|
106
|
+
depth,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export function buildTextTree(snapshot) {
|
|
113
|
+
const items = [];
|
|
114
|
+
const conclusionPremiseId = snapshot.roles.conclusionPremiseId;
|
|
115
|
+
// Sort premises: conclusion first, then supporting
|
|
116
|
+
const premiseEntries = Object.entries(snapshot.premises);
|
|
117
|
+
const sortedPremises = premiseEntries.sort(([idA], [idB]) => {
|
|
118
|
+
const aIsConclusion = idA === conclusionPremiseId;
|
|
119
|
+
const bIsConclusion = idB === conclusionPremiseId;
|
|
120
|
+
if (aIsConclusion && !bIsConclusion)
|
|
121
|
+
return -1;
|
|
122
|
+
if (!aIsConclusion && bIsConclusion)
|
|
123
|
+
return 1;
|
|
124
|
+
return 0;
|
|
125
|
+
});
|
|
126
|
+
for (const [premiseId, premiseSnap] of sortedPremises) {
|
|
127
|
+
items.push({
|
|
128
|
+
type: "premise-header",
|
|
129
|
+
premiseId,
|
|
130
|
+
role: premiseId === conclusionPremiseId ? "conclusion" : "supporting",
|
|
131
|
+
title: premiseSnap.premise.title ?? null,
|
|
132
|
+
});
|
|
133
|
+
items.push(...buildPremiseTextTree(snapshot, premiseId));
|
|
134
|
+
}
|
|
135
|
+
return items;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=text-tree.js.map
|