@principles/core 1.287.7 → 1.288.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/principle-tree-ledger.d.ts +50 -0
- package/dist/principle-tree-ledger.d.ts.map +1 -1
- package/dist/principle-tree-ledger.js +133 -1
- package/dist/principle-tree-ledger.js.map +1 -1
- package/dist/runtime-v2/adapter/output-schema-registry.d.ts.map +1 -1
- package/dist/runtime-v2/adapter/output-schema-registry.js +4 -0
- package/dist/runtime-v2/adapter/output-schema-registry.js.map +1 -1
- package/dist/runtime-v2/adapter/principle-tree-ledger-adapter.d.ts +24 -0
- package/dist/runtime-v2/adapter/principle-tree-ledger-adapter.d.ts.map +1 -1
- package/dist/runtime-v2/adapter/principle-tree-ledger-adapter.js +36 -1
- package/dist/runtime-v2/adapter/principle-tree-ledger-adapter.js.map +1 -1
- package/dist/runtime-v2/candidate-intake-service.d.ts +102 -3
- package/dist/runtime-v2/candidate-intake-service.d.ts.map +1 -1
- package/dist/runtime-v2/candidate-intake-service.js +280 -47
- package/dist/runtime-v2/candidate-intake-service.js.map +1 -1
- package/dist/runtime-v2/candidate-intake.d.ts +44 -0
- package/dist/runtime-v2/candidate-intake.d.ts.map +1 -1
- package/dist/runtime-v2/candidate-intake.js +7 -0
- package/dist/runtime-v2/candidate-intake.js.map +1 -1
- package/dist/runtime-v2/config/index.d.ts +2 -2
- package/dist/runtime-v2/config/index.d.ts.map +1 -1
- package/dist/runtime-v2/config/index.js +1 -1
- package/dist/runtime-v2/config/index.js.map +1 -1
- package/dist/runtime-v2/config/pd-config-defaults.d.ts +7 -1
- package/dist/runtime-v2/config/pd-config-defaults.d.ts.map +1 -1
- package/dist/runtime-v2/config/pd-config-defaults.js +11 -0
- package/dist/runtime-v2/config/pd-config-defaults.js.map +1 -1
- package/dist/runtime-v2/config/pd-config-effective.d.ts.map +1 -1
- package/dist/runtime-v2/config/pd-config-effective.js +19 -1
- package/dist/runtime-v2/config/pd-config-effective.js.map +1 -1
- package/dist/runtime-v2/config/pd-config-redaction.d.ts.map +1 -1
- package/dist/runtime-v2/config/pd-config-redaction.js +2 -0
- package/dist/runtime-v2/config/pd-config-redaction.js.map +1 -1
- package/dist/runtime-v2/config/pd-config-types.d.ts +39 -0
- package/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -1
- package/dist/runtime-v2/config/pd-config-types.js.map +1 -1
- package/dist/runtime-v2/config/pd-config-validate.d.ts.map +1 -1
- package/dist/runtime-v2/config/pd-config-validate.js +44 -0
- package/dist/runtime-v2/config/pd-config-validate.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +12 -1
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +16 -1
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
- package/dist/runtime-v2/pain-signal-bridge.js +14 -1
- package/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
- package/dist/runtime-v2/pain-signal-runtime-factory.d.ts +8 -9
- package/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
- package/dist/runtime-v2/pain-signal-runtime-factory.js +69 -35
- package/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
- package/dist/runtime-v2/principle-reuse/reuse-domain.d.ts +89 -0
- package/dist/runtime-v2/principle-reuse/reuse-domain.d.ts.map +1 -0
- package/dist/runtime-v2/principle-reuse/reuse-domain.js +16 -0
- package/dist/runtime-v2/principle-reuse/reuse-domain.js.map +1 -0
- package/dist/runtime-v2/principle-reuse/reuse-evaluation-output.d.ts +40 -0
- package/dist/runtime-v2/principle-reuse/reuse-evaluation-output.d.ts.map +1 -0
- package/dist/runtime-v2/principle-reuse/reuse-evaluation-output.js +97 -0
- package/dist/runtime-v2/principle-reuse/reuse-evaluation-output.js.map +1 -0
- package/dist/runtime-v2/principle-reuse/reuse-evaluation-runner.d.ts +111 -0
- package/dist/runtime-v2/principle-reuse/reuse-evaluation-runner.d.ts.map +1 -0
- package/dist/runtime-v2/principle-reuse/reuse-evaluation-runner.js +230 -0
- package/dist/runtime-v2/principle-reuse/reuse-evaluation-runner.js.map +1 -0
- package/dist/runtime-v2/principle-reuse/reuse-proposal.d.ts +87 -0
- package/dist/runtime-v2/principle-reuse/reuse-proposal.d.ts.map +1 -0
- package/dist/runtime-v2/principle-reuse/reuse-proposal.js +99 -0
- package/dist/runtime-v2/principle-reuse/reuse-proposal.js.map +1 -0
- package/dist/runtime-v2/principle-reuse/reuse-retrieval.d.ts +36 -0
- package/dist/runtime-v2/principle-reuse/reuse-retrieval.d.ts.map +1 -0
- package/dist/runtime-v2/principle-reuse/reuse-retrieval.js +118 -0
- package/dist/runtime-v2/principle-reuse/reuse-retrieval.js.map +1 -0
- package/dist/runtime-v2/principle-reuse/reuse-shortlist.d.ts +40 -0
- package/dist/runtime-v2/principle-reuse/reuse-shortlist.d.ts.map +1 -0
- package/dist/runtime-v2/principle-reuse/reuse-shortlist.js +184 -0
- package/dist/runtime-v2/principle-reuse/reuse-shortlist.js.map +1 -0
- package/dist/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.d.ts +7 -0
- package/dist/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.d.ts.map +1 -1
- package/dist/runtime-v2/store/pain-diagnosis/pain-diagnosis-store.js.map +1 -1
- package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.d.ts +1 -0
- package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.d.ts.map +1 -1
- package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.js +12 -0
- package/dist/runtime-v2/store/pain-diagnosis/sqlite-pain-diagnosis-store.js.map +1 -1
- package/dist/runtime-v2/store/runtime-state-manager.d.ts +5 -0
- package/dist/runtime-v2/store/runtime-state-manager.d.ts.map +1 -1
- package/dist/runtime-v2/store/runtime-state-manager.js +8 -0
- package/dist/runtime-v2/store/runtime-state-manager.js.map +1 -1
- package/dist/runtime-v2/types/principle-schema.d.ts +65 -0
- package/dist/runtime-v2/types/principle-schema.d.ts.map +1 -1
- package/dist/runtime-v2/types/principle-schema.js +14 -0
- package/dist/runtime-v2/types/principle-schema.js.map +1 -1
- package/dist/runtime-v2/types/principle-tree-store.d.ts +12 -0
- package/dist/runtime-v2/types/principle-tree-store.d.ts.map +1 -1
- package/dist/telemetry-event.d.ts +2 -2
- package/dist/telemetry-event.d.ts.map +1 -1
- package/dist/telemetry-event.js +8 -0
- package/dist/telemetry-event.js.map +1 -1
- package/package.json +2 -2
|
@@ -4,12 +4,20 @@
|
|
|
4
4
|
* Workflow:
|
|
5
5
|
* 1. Validate input
|
|
6
6
|
* 2. Check idempotency (existsForCandidate) — O(1) lookup
|
|
7
|
+
* 2b. Check durable reuse resolution replay (PRI-917 PR3B Phase 2) —
|
|
8
|
+
* a candidate already resolved into an existing Principle returns that
|
|
9
|
+
* resolution; no decision is re-asked, no Principle is created
|
|
7
10
|
* 3. Load candidate from DB (RuntimeStateManager)
|
|
8
11
|
* 3b. ★ Principle Ledger write boundary (Phase 1 / PR1) — see below
|
|
9
12
|
* 4. Load artifact from DB and parse recommendation
|
|
10
13
|
* 5. Build 11-field LedgerPrincipleEntry
|
|
11
14
|
* 6. Write via adapter.writeProbationEntry()
|
|
12
15
|
*
|
|
16
|
+
* 4d (PRI-917 Slice 2 + PR3B Phase 2) — the reuse gate sits between 4c and 5:
|
|
17
|
+
* a credible proposal + a `reuse` verdict is materialised as durable evidence
|
|
18
|
+
* on the selected Principle (appendReuseEvidence) and reported as a
|
|
19
|
+
* `reuse_selected` refusal; a `create` verdict proceeds exactly as before.
|
|
20
|
+
*
|
|
13
21
|
* ── Principle Ledger write boundary (Phase 1 / PR1) ─────────────────────────
|
|
14
22
|
* This service is the single shared chokepoint through which EVERY
|
|
15
23
|
* candidate-origin write to the Principle Ledger flows (pd-cli `candidate
|
|
@@ -33,8 +41,11 @@
|
|
|
33
41
|
* - No promotion to active principle (M8+)
|
|
34
42
|
* - No pain signal bridge
|
|
35
43
|
*/
|
|
36
|
-
import type { LedgerAdapter, LedgerPrincipleEntry } from './candidate-intake.js';
|
|
44
|
+
import type { LedgerAdapter, LedgerPrincipleEntry, Recommendation } from './candidate-intake.js';
|
|
45
|
+
import { CandidateIntakeError } from './candidate-intake.js';
|
|
37
46
|
import type { RuntimeStateManager } from './store/runtime-state-manager.js';
|
|
47
|
+
import type { ReuseDecision, ReuseProposal } from './principle-reuse/reuse-proposal.js';
|
|
48
|
+
import type { ReuseEvidenceEntry } from './types/principle-schema.js';
|
|
38
49
|
/**
|
|
39
50
|
* Why the Principle Ledger write boundary refused a candidate (Phase 1 / PR1).
|
|
40
51
|
*
|
|
@@ -43,8 +54,26 @@ import type { RuntimeStateManager } from './store/runtime-state-manager.js';
|
|
|
43
54
|
* candidate keeps flowing through its existing route / defer handling.
|
|
44
55
|
* - `unknown_kind` — no usable kind at all (missing / non-string / not in the
|
|
45
56
|
* known set). This is the case that previously FAILED OPEN into a principle.
|
|
57
|
+
* - `reuse_selected` (PRI-917 Slice 2) — the reuse gate produced a credible
|
|
58
|
+
* proposal and the injected decision function answered `reuse`, so no new
|
|
59
|
+
* Principle was written. Encoded as a refusal rather than a new result
|
|
60
|
+
* variant, which keeps the result-union shape stable for every consumer.
|
|
61
|
+
* PRI-917 PR3B Phase 2: the verdict is now ALSO materialised as durable
|
|
62
|
+
* evidence on the selected Principle (`reuseEvidence[]`) before this
|
|
63
|
+
* disposition is returned, and this reason doubles as the replay
|
|
64
|
+
* disposition when a candidate's resolution already exists (no new decision
|
|
65
|
+
* is asked, no Principle is created — INV-R07).
|
|
66
|
+
*
|
|
67
|
+
* ⚠ That is shape compatibility ONLY, not message compatibility. Known
|
|
68
|
+
* counter-example (verified, not fixed here): `pd candidate` presents ANY
|
|
69
|
+
* refusal as "this candidate kind does not target the Principle Ledger" and
|
|
70
|
+
* re-throws it as INPUT_INVALID — both wrong for a reuse decision, which
|
|
71
|
+
* DOES target the Ledger. No production caller injects `reuseDecision`
|
|
72
|
+
* yet, so this cannot surface today; but any consumer that renders
|
|
73
|
+
* refusal-specific operator messages MUST branch on
|
|
74
|
+
* `reason === 'reuse_selected'` BEFORE production reuse is enabled.
|
|
46
75
|
*/
|
|
47
|
-
export type LedgerRefusalReason = 'non_principle_kind' | 'unknown_kind';
|
|
76
|
+
export type LedgerRefusalReason = 'non_principle_kind' | 'unknown_kind' | 'reuse_selected';
|
|
48
77
|
/**
|
|
49
78
|
* Explicit disposition returned by {@link CandidateIntakeService.intake}.
|
|
50
79
|
*
|
|
@@ -57,18 +86,88 @@ export type CandidateIntakeResult = {
|
|
|
57
86
|
/** `true` when THIS call wrote a new entry; `false` for the idempotent no-op. */
|
|
58
87
|
readonly written: boolean;
|
|
59
88
|
readonly entry: LedgerPrincipleEntry;
|
|
89
|
+
/**
|
|
90
|
+
* PRI-917 Slice 2 — what the reuse gate did, for observability.
|
|
91
|
+
* Optional so every existing producer of this variant stays valid.
|
|
92
|
+
*/
|
|
93
|
+
readonly reuseCheck?: ReuseCheckOutcome;
|
|
60
94
|
} | {
|
|
61
95
|
readonly outcome: 'refused';
|
|
62
96
|
readonly reason: LedgerRefusalReason;
|
|
63
97
|
readonly candidateId: string;
|
|
64
|
-
/** The raw persisted kind, or `null` when it was absent / not a string. */
|
|
98
|
+
/** The raw persisted kind, or `null` when it was absent / not a string / not loaded. */
|
|
65
99
|
readonly rawRecommendationKind: string | null;
|
|
66
100
|
readonly message: string;
|
|
101
|
+
/** PRI-917 Slice 2 — present only when `reason === 'reuse_selected'`. */
|
|
102
|
+
readonly reuseProposal?: ReuseProposal;
|
|
103
|
+
/** The Principle the decision function selected, when it chose reuse. */
|
|
104
|
+
readonly selectedPrincipleId?: string;
|
|
105
|
+
/**
|
|
106
|
+
* PRI-917 PR3B Phase 2 — present only when `reason === 'reuse_selected'`:
|
|
107
|
+
* the evidence entry just written (fresh decision), or the pre-existing
|
|
108
|
+
* resolution (replay). This is the durable record that the candidate was
|
|
109
|
+
* resolved into `selectedPrincipleId` instead of creating a Principle.
|
|
110
|
+
*/
|
|
111
|
+
readonly reuseEvidence?: ReuseEvidenceEntry;
|
|
67
112
|
};
|
|
113
|
+
/**
|
|
114
|
+
* PRI-917 Slice 2 — what the reuse gate did before a ledger write.
|
|
115
|
+
*
|
|
116
|
+
* - `not_configured` — no decision function was injected, so no gate ran. This
|
|
117
|
+
* is the current production shape; it is reported rather than assumed, so a
|
|
118
|
+
* caller can never mistake "gate absent" for "gate found nothing".
|
|
119
|
+
* - `no_candidates` — the gate ran and found nothing credible.
|
|
120
|
+
* - `create_decided` — the gate found candidates and the decision function
|
|
121
|
+
* answered `create`; the write proceeded exactly as before.
|
|
122
|
+
*/
|
|
123
|
+
export type ReuseCheckOutcome = 'not_configured' | 'no_candidates' | 'create_decided';
|
|
68
124
|
export interface CandidateIntakeServiceOptions {
|
|
69
125
|
stateManager: RuntimeStateManager;
|
|
70
126
|
ledgerAdapter: LedgerAdapter;
|
|
127
|
+
/**
|
|
128
|
+
* PRI-917 Slice 2 — optional reuse decision function.
|
|
129
|
+
*
|
|
130
|
+
* When omitted (the current production shape) the reuse gate does not run
|
|
131
|
+
* and intake behaves exactly as before; the result still reports
|
|
132
|
+
* `reuseCheck: 'not_configured'` so "no gate" is never mistaken for "no
|
|
133
|
+
* duplicate found".
|
|
134
|
+
*
|
|
135
|
+
* When provided, it receives the bounded proposal and MUST answer `reuse`
|
|
136
|
+
* or `create` — there is no automatic option and no default.
|
|
137
|
+
*/
|
|
138
|
+
reuseDecision?: (proposal: ReuseProposal) => ReuseDecision;
|
|
139
|
+
/** Workspace state dir used for read-only reuse retrieval. */
|
|
140
|
+
reuseStateDir?: string;
|
|
71
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* PRI-917 PR3A (surface audit C4): the candidate-semantics extraction shared
|
|
144
|
+
* by BOTH the intake flow (steps 4b/4c) and the `pd candidate review`
|
|
145
|
+
* surface — one implementation, so the retrieval input shown to the Owner can
|
|
146
|
+
* never drift from what intake actually consumes.
|
|
147
|
+
*
|
|
148
|
+
* Resolution order (identical to intake steps 4b→4c):
|
|
149
|
+
* 1. candidate.sourceRecommendationJson — validated directly, then via the
|
|
150
|
+
* diagnostician description→text normalization; malformed JSON warns and
|
|
151
|
+
* falls through (rc-9 observable degradation);
|
|
152
|
+
* 2. artifact.contentJson — the three historical shapes.
|
|
153
|
+
*
|
|
154
|
+
* Pure apart from the rc-9 warn; never throws — failures come back as
|
|
155
|
+
* `{ ok: false, error }` carrying the exact CandidateIntakeError intake
|
|
156
|
+
* itself would throw.
|
|
157
|
+
*/
|
|
158
|
+
export type CandidateRecommendationExtraction = {
|
|
159
|
+
ok: true;
|
|
160
|
+
recommendation: Recommendation;
|
|
161
|
+
} | {
|
|
162
|
+
ok: false;
|
|
163
|
+
error: CandidateIntakeError;
|
|
164
|
+
};
|
|
165
|
+
export declare function extractIntakeRecommendation(candidate: {
|
|
166
|
+
candidateId: string;
|
|
167
|
+
sourceRecommendationJson?: string | null;
|
|
168
|
+
}, artifact: {
|
|
169
|
+
contentJson: string;
|
|
170
|
+
} | null): CandidateRecommendationExtraction;
|
|
72
171
|
export declare class CandidateIntakeService {
|
|
73
172
|
#private;
|
|
74
173
|
constructor(opts: CandidateIntakeServiceOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidate-intake-service.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/candidate-intake-service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"candidate-intake-service.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/candidate-intake-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAwD,MAAM,uBAAuB,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAQ5E,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAE3F;;;;;;GAMG;AACH,MAAM,MAAM,qBAAqB,GAC7B;IACE,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;CACzC,GACD;IACE,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wFAAwF;IACxF,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IACvC,yEAAyE;IACzE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC;CAC7C,CAAC;AAEN;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAGtF,MAAM,WAAW,6BAA6B;IAC5C,YAAY,EAAE,mBAAmB,CAAC;IAClC,aAAa,EAAE,aAAa,CAAC;IAC7B;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,aAAa,CAAC;IAC3D,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAyDD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,iCAAiC,GACzC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,cAAc,EAAE,cAAc,CAAA;CAAE,GAC5C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAE/C,wBAAgB,2BAA2B,CACzC,SAAS,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC5E,QAAQ,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GACvC,iCAAiC,CAgEnC;AAED,qBAAa,sBAAsB;;IAMjC,YAAY,IAAI,EAAE,6BAA6B,EAK9C;IAED;;;;;;;;;;;;;;;;OAgBG;IACG,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA0ShE;CAuDF"}
|
|
@@ -4,12 +4,20 @@
|
|
|
4
4
|
* Workflow:
|
|
5
5
|
* 1. Validate input
|
|
6
6
|
* 2. Check idempotency (existsForCandidate) — O(1) lookup
|
|
7
|
+
* 2b. Check durable reuse resolution replay (PRI-917 PR3B Phase 2) —
|
|
8
|
+
* a candidate already resolved into an existing Principle returns that
|
|
9
|
+
* resolution; no decision is re-asked, no Principle is created
|
|
7
10
|
* 3. Load candidate from DB (RuntimeStateManager)
|
|
8
11
|
* 3b. ★ Principle Ledger write boundary (Phase 1 / PR1) — see below
|
|
9
12
|
* 4. Load artifact from DB and parse recommendation
|
|
10
13
|
* 5. Build 11-field LedgerPrincipleEntry
|
|
11
14
|
* 6. Write via adapter.writeProbationEntry()
|
|
12
15
|
*
|
|
16
|
+
* 4d (PRI-917 Slice 2 + PR3B Phase 2) — the reuse gate sits between 4c and 5:
|
|
17
|
+
* a credible proposal + a `reuse` verdict is materialised as durable evidence
|
|
18
|
+
* on the selected Principle (appendReuseEvidence) and reported as a
|
|
19
|
+
* `reuse_selected` refusal; a `create` verdict proceeds exactly as before.
|
|
20
|
+
*
|
|
13
21
|
* ── Principle Ledger write boundary (Phase 1 / PR1) ─────────────────────────
|
|
14
22
|
* This service is the single shared chokepoint through which EVERY
|
|
15
23
|
* candidate-origin write to the Principle Ledger flows (pd-cli `candidate
|
|
@@ -36,6 +44,9 @@
|
|
|
36
44
|
import { randomUUID } from 'crypto';
|
|
37
45
|
import { CandidateIntakeError, INTAKE_ERROR_CODES, isRecord, validateRecommendation } from './candidate-intake.js';
|
|
38
46
|
import { isPrincipleLedgerEligibleKind, validateRecommendationKind, } from './store/candidate/recommendation-kind-resolver.js';
|
|
47
|
+
import { buildReuseProposal, proposalNeedsDecision } from './principle-reuse/reuse-proposal.js';
|
|
48
|
+
import { buildReuseShortlist } from './principle-reuse/reuse-retrieval.js';
|
|
49
|
+
import { validateReuseDecision } from './principle-reuse/reuse-proposal.js';
|
|
39
50
|
/**
|
|
40
51
|
* Normalize a DiagnosticianRecommendation-shaped object to the Recommendation
|
|
41
52
|
* contract by mapping `description` → `text`. The diagnostician-committer stores
|
|
@@ -98,12 +109,72 @@ function extractRecommendationFromContentJson(parsed) {
|
|
|
98
109
|
return validateRecommendation(norm);
|
|
99
110
|
return null;
|
|
100
111
|
}
|
|
112
|
+
export function extractIntakeRecommendation(candidate, artifact) {
|
|
113
|
+
const { candidateId } = candidate;
|
|
114
|
+
// 4b: the canonical source first.
|
|
115
|
+
const sourceRecJson = candidate.sourceRecommendationJson;
|
|
116
|
+
if (sourceRecJson && sourceRecJson.trim() !== '') {
|
|
117
|
+
try {
|
|
118
|
+
const parsed = JSON.parse(sourceRecJson);
|
|
119
|
+
const fromCandidate = validateRecommendation(parsed);
|
|
120
|
+
if (fromCandidate)
|
|
121
|
+
return { ok: true, recommendation: fromCandidate };
|
|
122
|
+
// diagnostician-committer stores a DiagnosticianRecommendation, whose
|
|
123
|
+
// body field is `description` (not `text`). Normalize that shape to the
|
|
124
|
+
// Recommendation contract. rc-4: validate the normalized value too.
|
|
125
|
+
const normalized = normalizeDiagnosticianRecommendation(parsed);
|
|
126
|
+
const fromNorm = normalized ? validateRecommendation(normalized) : null;
|
|
127
|
+
if (fromNorm)
|
|
128
|
+
return { ok: true, recommendation: fromNorm };
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
// sourceRecommendationJson is non-empty but malformed — warn and fall through
|
|
132
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
133
|
+
console.warn(`[CandidateIntakeService] sourceRecommendationJson parse failed for candidate ${candidateId}: ${detail}. Falling back to artifact.contentJson.`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// 4c: fall back to artifact.contentJson.
|
|
137
|
+
if (!artifact) {
|
|
138
|
+
return {
|
|
139
|
+
ok: false,
|
|
140
|
+
error: new CandidateIntakeError(INTAKE_ERROR_CODES.INPUT_INVALID, `Cannot extract recommendation for candidate ${candidateId}: no artifact content available`, { candidateId }),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
try {
|
|
144
|
+
const parsed = JSON.parse(artifact.contentJson);
|
|
145
|
+
// Three historical shapes can land in contentJson:
|
|
146
|
+
// 1. { recommendation: {...} } — manual E2E wrapper
|
|
147
|
+
// 2. DiagnosticianOutputV1 — { summary, rootCause, recommendations: [...] }
|
|
148
|
+
// 3. bare Recommendation-like object
|
|
149
|
+
// rc-1/rc-2: parsed is untrusted — validate, never cast. rc-5: Object.hasOwn.
|
|
150
|
+
const rec = extractRecommendationFromContentJson(parsed);
|
|
151
|
+
if (!rec) {
|
|
152
|
+
return {
|
|
153
|
+
ok: false,
|
|
154
|
+
error: new CandidateIntakeError(INTAKE_ERROR_CODES.INPUT_INVALID, `Failed to parse artifact content for candidate ${candidateId}: contentJson is not a valid recommendation object`, { candidateId }),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
return { ok: true, recommendation: rec };
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
if (err instanceof CandidateIntakeError)
|
|
161
|
+
return { ok: false, error: err };
|
|
162
|
+
return {
|
|
163
|
+
ok: false,
|
|
164
|
+
error: new CandidateIntakeError(INTAKE_ERROR_CODES.INPUT_INVALID, `Failed to parse artifact content for candidate ${candidateId}: ${err instanceof Error ? err.message : String(err)}`, { candidateId, cause: err }),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
101
168
|
export class CandidateIntakeService {
|
|
102
169
|
#stateManager;
|
|
103
170
|
#ledgerAdapter;
|
|
171
|
+
#reuseDecision;
|
|
172
|
+
#reuseStateDir;
|
|
104
173
|
constructor(opts) {
|
|
105
174
|
this.#stateManager = opts.stateManager;
|
|
106
175
|
this.#ledgerAdapter = opts.ledgerAdapter;
|
|
176
|
+
this.#reuseDecision = opts.reuseDecision;
|
|
177
|
+
this.#reuseStateDir = opts.reuseStateDir;
|
|
107
178
|
}
|
|
108
179
|
/**
|
|
109
180
|
* Consume a pending candidate: load it and its artifact, build a
|
|
@@ -132,6 +203,34 @@ export class CandidateIntakeService {
|
|
|
132
203
|
if (existing) {
|
|
133
204
|
return { outcome: 'ledger_entry', written: false, entry: existing };
|
|
134
205
|
}
|
|
206
|
+
// 2b. PRI-917 PR3B Phase 2 — durable reuse resolution replay (INV-R07).
|
|
207
|
+
//
|
|
208
|
+
// A candidate resolved by a recorded REUSE decision left its evidence on
|
|
209
|
+
// the target Principle and NO ledger principle of its own, so step 2
|
|
210
|
+
// cannot see it — without this check a replay would reach the gate again
|
|
211
|
+
// (re-asking the Owner) or, with the gate absent, fall through to CREATE
|
|
212
|
+
// and manufacture the very duplicate this feature exists to prevent.
|
|
213
|
+
//
|
|
214
|
+
// Unconditional (not gated on reuseDecision being injected): the
|
|
215
|
+
// resolution is durable persisted state, and honouring it is idempotency,
|
|
216
|
+
// not gate behaviour. Gate-unconfigured candidates WITHOUT a recorded
|
|
217
|
+
// resolution keep the exact pre-Phase-2 flow.
|
|
218
|
+
const resolved = this.#ledgerAdapter.findReuseResolutionForCandidate(candidateId);
|
|
219
|
+
if (resolved) {
|
|
220
|
+
return {
|
|
221
|
+
outcome: 'refused',
|
|
222
|
+
reason: 'reuse_selected',
|
|
223
|
+
candidateId,
|
|
224
|
+
// The candidate row is intentionally not loaded for a replay: the
|
|
225
|
+
// recorded evidence is itself the authoritative proof that this
|
|
226
|
+
// candidate was fully validated and resolved before.
|
|
227
|
+
rawRecommendationKind: null,
|
|
228
|
+
message: `Candidate ${candidateId} was already resolved into existing Principle ${resolved.principleId} by a ` +
|
|
229
|
+
'recorded reuse decision; the decision was NOT asked again and no new Principle was created (INV-R07 replay).',
|
|
230
|
+
selectedPrincipleId: resolved.principleId,
|
|
231
|
+
reuseEvidence: resolved.evidence,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
135
234
|
// 3. Load candidate from DB
|
|
136
235
|
const candidate = await this.#stateManager.getCandidate(candidateId);
|
|
137
236
|
if (!candidate) {
|
|
@@ -171,57 +270,144 @@ export class CandidateIntakeService {
|
|
|
171
270
|
if (!artifact) {
|
|
172
271
|
throw new CandidateIntakeError(INTAKE_ERROR_CODES.ARTIFACT_NOT_FOUND, `Artifact ${candidate.artifactId} not found for candidate ${candidateId}`, { candidateId, artifactId: candidate.artifactId });
|
|
173
272
|
}
|
|
174
|
-
// 4b.
|
|
175
|
-
//
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
// a null result falls through to the contentJson branch below.
|
|
183
|
-
const parsed = JSON.parse(sourceRecJson);
|
|
184
|
-
const fromCandidate = validateRecommendation(parsed);
|
|
185
|
-
if (fromCandidate) {
|
|
186
|
-
recommendation = fromCandidate;
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
// diagnostician-committer stores a DiagnosticianRecommendation, whose
|
|
190
|
-
// body field is `description` (not `text`). Normalize that shape to the
|
|
191
|
-
// Recommendation contract so the canonical source path is preferred over
|
|
192
|
-
// the contentJson fallback. rc-4: validate the normalized value too.
|
|
193
|
-
const normalized = normalizeDiagnosticianRecommendation(parsed);
|
|
194
|
-
const fromNorm = normalized ? validateRecommendation(normalized) : null;
|
|
195
|
-
if (fromNorm) {
|
|
196
|
-
recommendation = fromNorm;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
273
|
+
// 4b/4c. Extract the recommendation via the SHARED semantics extraction
|
|
274
|
+
// (PRI-917 PR3A C4) — the exact logic `pd candidate review` uses to show
|
|
275
|
+
// the Owner what this candidate claims, so proposal and intake can never
|
|
276
|
+
// disagree about the input. Failures carry the same CandidateIntakeError
|
|
277
|
+
// this method always threw.
|
|
278
|
+
const extracted = extractIntakeRecommendation(candidate, artifact);
|
|
279
|
+
if (!extracted.ok) {
|
|
280
|
+
throw extracted.error;
|
|
200
281
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
282
|
+
const recommendation = extracted.recommendation;
|
|
283
|
+
// 4d. PRI-917 Slice 2 — reuse gate.
|
|
284
|
+
//
|
|
285
|
+
// Sits between "we know what this candidate claims" (4c) and "we mint a new
|
|
286
|
+
// canonical identity for it" (5), which is the only place a duplicate can
|
|
287
|
+
// still be prevented without changing any downstream contract.
|
|
288
|
+
//
|
|
289
|
+
// Three shapes, and the default one is "no gate":
|
|
290
|
+
// not_configured — no decision function injected (today's production);
|
|
291
|
+
// the write proceeds EXACTLY as before.
|
|
292
|
+
// no_candidates — the gate ran and found nothing credible.
|
|
293
|
+
// reuse_selected — the Owner/AI Owner answered `reuse`; nothing is
|
|
294
|
+
// written. Encoded as a refusal disposition to keep
|
|
295
|
+
// the result-union shape stable. See the ⚠ note on
|
|
296
|
+
// LedgerRefusalReason: shape-compatible does NOT
|
|
297
|
+
// mean message-compatible — consumers with
|
|
298
|
+
// refusal-specific wording must branch on
|
|
299
|
+
// `reason === 'reuse_selected'` before reuse ships.
|
|
300
|
+
//
|
|
301
|
+
// A retrieval failure NEVER falls through to create (rc-9): it throws, so
|
|
302
|
+
// the candidate stays pending and visible instead of silently manufacturing
|
|
303
|
+
// the duplicate this gate exists to prevent.
|
|
304
|
+
//
|
|
305
|
+
// PRI-917 hardening: a HALF-configured gate is a configuration error, not
|
|
306
|
+
// a disabled one. Previously a decision function without a state dir
|
|
307
|
+
// skipped the gate silently while still reporting 'not_configured', so a
|
|
308
|
+
// one-option misconfiguration looked exactly like "the gate is off" and
|
|
309
|
+
// wrote duplicates without ever asking.
|
|
310
|
+
if (this.#reuseDecision && !this.#reuseStateDir) {
|
|
311
|
+
throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse gate is misconfigured: reuseDecision was provided without reuseStateDir; no Principle was created for candidate ${candidateId}. nextAction: pass reuseStateDir, or remove reuseDecision to disable the gate.`, { candidateId, reason: 'reuse_gate_misconfigured' });
|
|
205
312
|
}
|
|
206
|
-
|
|
207
|
-
if (
|
|
313
|
+
let reuseCheck = 'not_configured';
|
|
314
|
+
if (this.#reuseDecision && this.#reuseStateDir) {
|
|
315
|
+
let proposal;
|
|
208
316
|
try {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
//
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
317
|
+
proposal = buildReuseProposal(candidateId, buildReuseShortlist({
|
|
318
|
+
text: recommendation.text || candidate.description || '',
|
|
319
|
+
triggerPattern: recommendation.triggerPattern ?? '',
|
|
320
|
+
action: recommendation.action ?? '',
|
|
321
|
+
}, this.#reuseStateDir,
|
|
322
|
+
// Single truth: the persisted candidate's own kind. Step 3b has
|
|
323
|
+
// already proved eligibility fail-closed, so this is a restatement,
|
|
324
|
+
// never a second source a caller can override.
|
|
325
|
+
{ recommendationKind: candidate.rawRecommendationKind }));
|
|
326
|
+
}
|
|
327
|
+
catch (reuseErr) {
|
|
328
|
+
throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse check could not be completed for candidate ${candidateId}; no Principle was created. Cause: ${reuseErr instanceof Error ? reuseErr.message : String(reuseErr)}`, { candidateId, cause: reuseErr });
|
|
329
|
+
}
|
|
330
|
+
if (proposalNeedsDecision(proposal)) {
|
|
331
|
+
// PRI-917 hardening: the decision function is an UNTRUSTED boundary
|
|
332
|
+
// (an AI Owner parses model output), so its return value is validated
|
|
333
|
+
// at runtime. Previously anything that was not exactly 'reuse' fell
|
|
334
|
+
// through to 'create' — a malformed answer silently manufactured the
|
|
335
|
+
// very duplicate this gate exists to prevent (rc-1/rc-2/rc-3).
|
|
336
|
+
let decision;
|
|
337
|
+
try {
|
|
338
|
+
const raw = this.#reuseDecision(proposal);
|
|
339
|
+
const validated = validateReuseDecision(raw);
|
|
340
|
+
if (!validated.ok) {
|
|
341
|
+
throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse decision for candidate ${candidateId} is not a valid reuse|create decision (${validated.reason}); no Principle was created.`, { candidateId, reason: validated.reason });
|
|
342
|
+
}
|
|
343
|
+
({ decision } = validated);
|
|
344
|
+
}
|
|
345
|
+
catch (decisionErr) {
|
|
346
|
+
if (decisionErr instanceof CandidateIntakeError)
|
|
347
|
+
throw decisionErr;
|
|
348
|
+
// A throwing decision function (LLM timeout, parse crash) is a reuse
|
|
349
|
+
// check failure, not an internal error: it must fail closed with a
|
|
350
|
+
// candidate-scoped code rather than escaping as an arbitrary throw.
|
|
351
|
+
throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse decision for candidate ${candidateId} failed (${decisionErr instanceof Error ? decisionErr.message : String(decisionErr)}); no Principle was created.`, { candidateId, cause: decisionErr });
|
|
218
352
|
}
|
|
219
|
-
|
|
353
|
+
if (decision.decision === 'reuse') {
|
|
354
|
+
const known = new Set(proposal.candidates.map((c) => c.principleId));
|
|
355
|
+
if (!known.has(decision.selectedPrincipleId)) {
|
|
356
|
+
// INV-R08: a selection outside the proposal fails closed. It must
|
|
357
|
+
// NOT silently degrade into "create". This is a defect in the
|
|
358
|
+
// reuse decision contract, not a malformed intake input, so it
|
|
359
|
+
// carries REUSE_CHECK_FAILED rather than INPUT_INVALID — the
|
|
360
|
+
// latter would file a governance error under "bad input".
|
|
361
|
+
throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse decision selected principle '${decision.selectedPrincipleId}' which is not in the proposal for candidate ${candidateId}; no Principle was created.`, { candidateId, selectedPrincipleId: decision.selectedPrincipleId, reason: 'selected_principle_not_in_proposal' });
|
|
362
|
+
}
|
|
363
|
+
// PRI-917 PR3B Phase 2 — materialise the verdict as durable evidence
|
|
364
|
+
// BEFORE reporting it. A reuse verdict that is not persisted would
|
|
365
|
+
// leave the resolution invisible: replay would re-ask the Owner, and
|
|
366
|
+
// the SPEC §11/§12 asymmetry (REUSE must be auditable, CREATE's
|
|
367
|
+
// artifact speaks for itself) would silently break. The write runs
|
|
368
|
+
// INSIDE the ledger's single-writer lock (appendReuseEvidence) and is
|
|
369
|
+
// fail-closed: an integrity/shape failure propagates and the
|
|
370
|
+
// candidate stays pending — it NEVER degrades into creating a
|
|
371
|
+
// Principle (INV-R03/INV-R08).
|
|
372
|
+
const painId = await this.#resolveReusePainId(candidateId, candidate);
|
|
373
|
+
let evidence;
|
|
374
|
+
try {
|
|
375
|
+
const appended = this.#ledgerAdapter.appendReuseEvidence(decision.selectedPrincipleId, {
|
|
376
|
+
painId,
|
|
377
|
+
candidateId,
|
|
378
|
+
decision: 'reuse',
|
|
379
|
+
actor: decision.actor,
|
|
380
|
+
reason: decision.reason,
|
|
381
|
+
decidedAt: decision.decidedAt,
|
|
382
|
+
});
|
|
383
|
+
// The writer either appended this candidate's entry or returned the
|
|
384
|
+
// already-recorded one (concurrent-intake dedupe) — the entry for
|
|
385
|
+
// THIS candidateId must be present; anything else is a broken
|
|
386
|
+
// adapter and fails loud instead of reporting a fabricated record.
|
|
387
|
+
const recorded = appended.reuseEvidence.find((e) => e.candidateId === candidateId);
|
|
388
|
+
if (!recorded) {
|
|
389
|
+
throw new Error(`appendReuseEvidence returned no evidence entry for candidate ${candidateId} (adapter contract violation)`);
|
|
390
|
+
}
|
|
391
|
+
evidence = recorded;
|
|
392
|
+
}
|
|
393
|
+
catch (evidenceErr) {
|
|
394
|
+
throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse decision for candidate ${candidateId} could not be recorded on principle '${decision.selectedPrincipleId}'; no Principle was created and the decision is not durable. Cause: ${evidenceErr instanceof Error ? evidenceErr.message : String(evidenceErr)}`, { candidateId, selectedPrincipleId: decision.selectedPrincipleId, cause: evidenceErr });
|
|
395
|
+
}
|
|
396
|
+
return {
|
|
397
|
+
outcome: 'refused',
|
|
398
|
+
reason: 'reuse_selected',
|
|
399
|
+
candidateId,
|
|
400
|
+
rawRecommendationKind: typeof candidate.rawRecommendationKind === 'string' ? candidate.rawRecommendationKind : null,
|
|
401
|
+
message: `Candidate ${candidateId} was resolved to existing Principle ${decision.selectedPrincipleId}; the reuse decision was recorded on that Principle's reuseEvidence and no new Principle was created. This candidate DOES target the Principle Ledger — review the reuse proposal, and do not re-run intake to force a new Principle.`,
|
|
402
|
+
reuseProposal: proposal,
|
|
403
|
+
selectedPrincipleId: decision.selectedPrincipleId,
|
|
404
|
+
reuseEvidence: evidence,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
reuseCheck = 'create_decided';
|
|
220
408
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
throw err;
|
|
224
|
-
throw new CandidateIntakeError(INTAKE_ERROR_CODES.INPUT_INVALID, `Failed to parse artifact content for candidate ${candidateId}: ${err instanceof Error ? err.message : String(err)}`, { candidateId, cause: err });
|
|
409
|
+
else {
|
|
410
|
+
reuseCheck = 'no_candidates';
|
|
225
411
|
}
|
|
226
412
|
}
|
|
227
413
|
// 5. Build 11-field LedgerPrincipleEntry (E-06)
|
|
@@ -241,7 +427,7 @@ export class CandidateIntakeService {
|
|
|
241
427
|
// 6. Write to ledger via adapter (E-01, D-09)
|
|
242
428
|
try {
|
|
243
429
|
const written = this.#ledgerAdapter.writeProbationEntry(entry);
|
|
244
|
-
return { outcome: 'ledger_entry', written: true, entry: written };
|
|
430
|
+
return { outcome: 'ledger_entry', written: true, entry: written, reuseCheck };
|
|
245
431
|
}
|
|
246
432
|
catch (err) {
|
|
247
433
|
if (err instanceof CandidateIntakeError) {
|
|
@@ -250,5 +436,52 @@ export class CandidateIntakeService {
|
|
|
250
436
|
throw new CandidateIntakeError(INTAKE_ERROR_CODES.LEDGER_WRITE_FAILED, `Failed to write ledger entry for candidate ${candidateId}`, { candidateId, cause: err });
|
|
251
437
|
}
|
|
252
438
|
}
|
|
439
|
+
/**
|
|
440
|
+
* PRI-917 PR3B Phase 2 — resolve the Pain behind a candidate for its reuse
|
|
441
|
+
* evidence entry (SPEC v0.2.1 §12 requires a non-empty `painId`).
|
|
442
|
+
*
|
|
443
|
+
* `principle_candidates` carries NO pain column (audit F5); the durable
|
|
444
|
+
* bridge is `pain_diagnoses(task_id → pain_id)`, written by the diagnosis
|
|
445
|
+
* persistence path. Rows for one task are re-diagnoses / mixed attributions,
|
|
446
|
+
* so the LATEST row wins — ordered by (createdAt, id) for determinism.
|
|
447
|
+
*
|
|
448
|
+
* Fail-closed: a candidate with no resolvable Pain cannot produce a
|
|
449
|
+
* self-contained evidence entry, so the reuse decision is refused
|
|
450
|
+
* (`reuse_pain_unresolvable`) instead of writing a fabricated painId (rc-3).
|
|
451
|
+
* The candidate stays pending; no Principle is created.
|
|
452
|
+
*/
|
|
453
|
+
async #resolveReusePainId(candidateId, candidate) {
|
|
454
|
+
const refuse = (detail) => {
|
|
455
|
+
throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse decision for candidate ${candidateId} cannot be recorded: ${detail} ` +
|
|
456
|
+
'The evidence entry requires the Pain that re-validated the Principle. ' +
|
|
457
|
+
'nextAction: ensure the candidate\'s diagnostician task has a persisted pain diagnosis (pain_diagnoses), then retry intake.', { candidateId, reason: 'reuse_pain_unresolvable' });
|
|
458
|
+
};
|
|
459
|
+
if (typeof candidate.taskId !== 'string' || candidate.taskId === '') {
|
|
460
|
+
refuse('the candidate has no diagnostician task reference');
|
|
461
|
+
}
|
|
462
|
+
let diagnoses;
|
|
463
|
+
try {
|
|
464
|
+
diagnoses = await this.#stateManager.getDiagnosesByTaskId(candidate.taskId);
|
|
465
|
+
}
|
|
466
|
+
catch (err) {
|
|
467
|
+
throw new CandidateIntakeError(INTAKE_ERROR_CODES.REUSE_CHECK_FAILED, `Reuse decision for candidate ${candidateId} cannot be recorded: the pain diagnosis lookup failed. Cause: ${err instanceof Error ? err.message : String(err)}`, { candidateId, reason: 'reuse_pain_unresolvable', cause: err });
|
|
468
|
+
}
|
|
469
|
+
if (diagnoses.length === 0) {
|
|
470
|
+
refuse('no persisted pain diagnosis exists for its task');
|
|
471
|
+
}
|
|
472
|
+
const sorted = [...diagnoses].sort((a, b) => {
|
|
473
|
+
if (a.createdAt !== b.createdAt)
|
|
474
|
+
return a.createdAt < b.createdAt ? -1 : 1;
|
|
475
|
+
return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
|
|
476
|
+
});
|
|
477
|
+
const latest = sorted.at(-1);
|
|
478
|
+
const latestPainId = typeof latest?.painId === 'string' ? latest.painId : '';
|
|
479
|
+
if (latestPainId === '') {
|
|
480
|
+
// Empty history or a latest row without a usable pain id — either way
|
|
481
|
+
// no fabricated value is written (rc-3).
|
|
482
|
+
refuse('no usable pain id in the candidate\'s diagnosis history');
|
|
483
|
+
}
|
|
484
|
+
return latestPainId;
|
|
485
|
+
}
|
|
253
486
|
}
|
|
254
487
|
//# sourceMappingURL=candidate-intake-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidate-intake-service.js","sourceRoot":"","sources":["../../src/runtime-v2/candidate-intake-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"candidate-intake-service.js","sourceRoot":"","sources":["../../src/runtime-v2/candidate-intake-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEnH,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAwG5E;;;;;;;;;GASG;AACH,SAAS,oCAAoC,CAAC,GAAY;IACxD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC;IAC7B,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,oCAAoC,CAAC,MAAe;IAC3D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,8CAA8C;IAC9C,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;QACpC,MAAM,GAAG,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;QACpB,MAAM,IAAI,GAAG,oCAAoC,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,IAAI;YAAE,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,yDAAyD;IACzD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;YACpB,MAAM,GAAG,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;YACpB,MAAM,IAAI,GAAG,oCAAoC,CAAC,KAAK,CAAC,CAAC;YACzD,IAAI,IAAI;gBAAE,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,4CAA4C;IAC5C,MAAM,IAAI,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,IAAI,GAAG,oCAAoC,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,IAAI;QAAE,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC;AAsBD,MAAM,UAAU,2BAA2B,CACzC,SAA4E,EAC5E,QAAwC;IAExC,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IAElC,kCAAkC;IAClC,MAAM,aAAa,GAAG,SAAS,CAAC,wBAAwB,CAAC;IACzD,IAAI,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAY,CAAC;YACpD,MAAM,aAAa,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,aAAa;gBAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;YACtE,sEAAsE;YACtE,wEAAwE;YACxE,oEAAoE;YACpE,MAAM,UAAU,GAAG,oCAAoC,CAAC,MAAM,CAAC,CAAC;YAChE,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACxE,IAAI,QAAQ;gBAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,8EAA8E;YAC9E,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,gFAAgF,WAAW,KAAK,MAAM,yCAAyC,CAAC,CAAC;QAChK,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,IAAI,oBAAoB,CAC7B,kBAAkB,CAAC,aAAa,EAChC,+CAA+C,WAAW,iCAAiC,EAC3F,EAAE,WAAW,EAAE,CAChB;SACF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAY,CAAC;QAC3D,mDAAmD;QACnD,uDAAuD;QACvD,mFAAmF;QACnF,uCAAuC;QACvC,8EAA8E;QAC9E,MAAM,GAAG,GAAG,oCAAoC,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,IAAI,oBAAoB,CAC7B,kBAAkB,CAAC,aAAa,EAChC,kDAAkD,WAAW,oDAAoD,EACjH,EAAE,WAAW,EAAE,CAChB;aACF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,GAAG,YAAY,oBAAoB;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAC1E,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,IAAI,oBAAoB,CAC7B,kBAAkB,CAAC,aAAa,EAChC,kDAAkD,WAAW,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACpH,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,CAC5B;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,OAAO,sBAAsB;IACxB,aAAa,CAAsB;IACnC,cAAc,CAAgB;IAC9B,cAAc,CAA2D;IACzE,cAAc,CAAqB;IAE5C,YAAY,IAAmC;QAC7C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;IAC3C,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,6BAA6B;QAC7B,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACjF,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,CAAC,aAAa,EAChC,wCAAwC,EACxC,EAAE,WAAW,EAAE,CAChB,CAAC;QACJ,CAAC;QAED,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACtE,CAAC;QAED,wEAAwE;QACxE,EAAE;QACF,yEAAyE;QACzE,qEAAqE;QACrE,yEAAyE;QACzE,yEAAyE;QACzE,qEAAqE;QACrE,EAAE;QACF,iEAAiE;QACjE,0EAA0E;QAC1E,sEAAsE;QACtE,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,+BAA+B,CAAC,WAAW,CAAC,CAAC;QAClF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,SAAS;gBAClB,MAAM,EAAE,gBAAgB;gBACxB,WAAW;gBACX,kEAAkE;gBAClE,gEAAgE;gBAChE,qDAAqD;gBACrD,qBAAqB,EAAE,IAAI;gBAC3B,OAAO,EACL,aAAa,WAAW,iDAAiD,QAAQ,CAAC,WAAW,QAAQ;oBACrG,8GAA8G;gBAChH,mBAAmB,EAAE,QAAQ,CAAC,WAAW;gBACzC,aAAa,EAAE,QAAQ,CAAC,QAAQ;aACjC,CAAC;QACJ,CAAC;QAED,4BAA4B;QAC5B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,CAAC,mBAAmB,EACtC,aAAa,WAAW,YAAY,EACpC,EAAE,WAAW,EAAE,CAChB,CAAC;QACJ,CAAC;QAED,yDAAyD;QACzD,EAAE;QACF,2EAA2E;QAC3E,qDAAqD;QACrD,0EAA0E;QAC1E,4EAA4E;QAC5E,EAAE;QACF,0EAA0E;QAC1E,mEAAmE;QACnE,EAAE;QACF,yEAAyE;QACzE,0EAA0E;QAC1E,sEAAsE;QACtE,2EAA2E;QAC3E,kDAAkD;QAClD,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACpE,MAAM,aAAa,GAAG,0BAA0B,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAClF,MAAM,MAAM,GAAwB,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,oBAAoB,CAAC;YACnG,MAAM,OAAO,GAAG,OAAO,SAAS,CAAC,qBAAqB,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7G,OAAO;gBACL,OAAO,EAAE,SAAS;gBAClB,MAAM;gBACN,WAAW;gBACX,qBAAqB,EAAE,OAAO;gBAC9B,OAAO,EAAE,MAAM,KAAK,oBAAoB;oBACtC,CAAC,CAAC,aAAa,WAAW,6BAA6B,OAAO,iHAAiH;oBAC/K,CAAC,CAAC,aAAa,WAAW,6CAA6C,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,gDAAgD;aACtK,CAAC;QACJ,CAAC;QAED,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC5E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,CAAC,kBAAkB,EACrC,YAAY,SAAS,CAAC,UAAU,4BAA4B,WAAW,EAAE,EACzE,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,CAClD,CAAC;QACJ,CAAC;QAED,wEAAwE;QACxE,yEAAyE;QACzE,yEAAyE;QACzE,yEAAyE;QACzE,4BAA4B;QAC5B,MAAM,SAAS,GAAG,2BAA2B,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACnE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,SAAS,CAAC,KAAK,CAAC;QACxB,CAAC;QACD,MAAM,cAAc,GAAmB,SAAS,CAAC,cAAc,CAAC;QAEhE,oCAAoC;QACpC,EAAE;QACF,4EAA4E;QAC5E,0EAA0E;QAC1E,+DAA+D;QAC/D,EAAE;QACF,kDAAkD;QAClD,0EAA0E;QAC1E,6DAA6D;QAC7D,gEAAgE;QAChE,uEAAuE;QACvE,yEAAyE;QACzE,wEAAwE;QACxE,sEAAsE;QACtE,gEAAgE;QAChE,+DAA+D;QAC/D,yEAAyE;QACzE,EAAE;QACF,0EAA0E;QAC1E,4EAA4E;QAC5E,6CAA6C;QAC7C,EAAE;QACF,0EAA0E;QAC1E,qEAAqE;QACrE,yEAAyE;QACzE,wEAAwE;QACxE,wCAAwC;QACxC,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,CAAC,kBAAkB,EACrC,yHAAyH,WAAW,gFAAgF,EACpN,EAAE,WAAW,EAAE,MAAM,EAAE,0BAA0B,EAAE,CACpD,CAAC;QACJ,CAAC;QAED,IAAI,UAAU,GAAsB,gBAAgB,CAAC;QACrD,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/C,IAAI,QAAuB,CAAC;YAC5B,IAAI,CAAC;gBACH,QAAQ,GAAG,kBAAkB,CAC3B,WAAW,EACX,mBAAmB,CACjB;oBACE,IAAI,EAAE,cAAc,CAAC,IAAI,IAAI,SAAS,CAAC,WAAW,IAAI,EAAE;oBACxD,cAAc,EAAE,cAAc,CAAC,cAAc,IAAI,EAAE;oBACnD,MAAM,EAAE,cAAc,CAAC,MAAM,IAAI,EAAE;iBACpC,EACD,IAAI,CAAC,cAAc;gBACnB,gEAAgE;gBAChE,oEAAoE;gBACpE,+CAA+C;gBAC/C,EAAE,kBAAkB,EAAE,SAAS,CAAC,qBAAqB,EAAE,CACxD,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,QAAiB,EAAE,CAAC;gBAC3B,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,CAAC,kBAAkB,EACrC,oDAAoD,WAAW,sCAAsC,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EACtK,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,CACjC,CAAC;YACJ,CAAC;YAED,IAAI,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,oEAAoE;gBACpE,sEAAsE;gBACtE,oEAAoE;gBACpE,qEAAqE;gBACrE,+DAA+D;gBAC/D,IAAI,QAAuB,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,GAAG,GAAY,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;oBACnD,MAAM,SAAS,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;oBAC7C,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;wBAClB,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,CAAC,kBAAkB,EACrC,gCAAgC,WAAW,0CAA0C,SAAS,CAAC,MAAM,8BAA8B,EACnI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAC1C,CAAC;oBACJ,CAAC;oBACD,CAAC,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,CAAC;gBAC7B,CAAC;gBAAC,OAAO,WAAoB,EAAE,CAAC;oBAC9B,IAAI,WAAW,YAAY,oBAAoB;wBAAE,MAAM,WAAW,CAAC;oBACnE,qEAAqE;oBACrE,mEAAmE;oBACnE,oEAAoE;oBACpE,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,CAAC,kBAAkB,EACrC,gCAAgC,WAAW,YAAY,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,8BAA8B,EAC7J,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,CACpC,CAAC;gBACJ,CAAC;gBAED,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;oBAClC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;oBACrE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;wBAC7C,kEAAkE;wBAClE,8DAA8D;wBAC9D,+DAA+D;wBAC/D,6DAA6D;wBAC7D,0DAA0D;wBAC1D,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,CAAC,kBAAkB,EACrC,sCAAsC,QAAQ,CAAC,mBAAmB,gDAAgD,WAAW,6BAA6B,EAC1J,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB,EAAE,MAAM,EAAE,oCAAoC,EAAE,CACjH,CAAC;oBACJ,CAAC;oBAED,qEAAqE;oBACrE,mEAAmE;oBACnE,qEAAqE;oBACrE,gEAAgE;oBAChE,mEAAmE;oBACnE,sEAAsE;oBACtE,6DAA6D;oBAC7D,8DAA8D;oBAC9D,+BAA+B;oBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;oBACtE,IAAI,QAA4B,CAAC;oBACjC,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,QAAQ,CAAC,mBAAmB,EAAE;4BACrF,MAAM;4BACN,WAAW;4BACX,QAAQ,EAAE,OAAO;4BACjB,KAAK,EAAE,QAAQ,CAAC,KAAK;4BACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;4BACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;yBAC9B,CAAC,CAAC;wBACH,oEAAoE;wBACpE,kEAAkE;wBAClE,8DAA8D;wBAC9D,mEAAmE;wBACnE,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;wBACnF,IAAI,CAAC,QAAQ,EAAE,CAAC;4BACd,MAAM,IAAI,KAAK,CACb,gEAAgE,WAAW,+BAA+B,CAC3G,CAAC;wBACJ,CAAC;wBACD,QAAQ,GAAG,QAAQ,CAAC;oBACtB,CAAC;oBAAC,OAAO,WAAoB,EAAE,CAAC;wBAC9B,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,CAAC,kBAAkB,EACrC,gCAAgC,WAAW,wCAAwC,QAAQ,CAAC,mBAAmB,uEAAuE,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAChQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB,EAAE,KAAK,EAAE,WAAW,EAAE,CACvF,CAAC;oBACJ,CAAC;oBACD,OAAO;wBACL,OAAO,EAAE,SAAS;wBAClB,MAAM,EAAE,gBAAgB;wBACxB,WAAW;wBACX,qBAAqB,EAAE,OAAO,SAAS,CAAC,qBAAqB,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI;wBACnH,OAAO,EAAE,aAAa,WAAW,uCAAuC,QAAQ,CAAC,mBAAmB,uOAAuO;wBAC3U,aAAa,EAAE,QAAQ;wBACvB,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;wBACjD,aAAa,EAAE,QAAQ;qBACxB,CAAC;gBACJ,CAAC;gBACD,UAAU,GAAG,gBAAgB,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,UAAU,GAAG,eAAe,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,MAAM,KAAK,GAAyB;YAClC,EAAE,EAAE,UAAU,EAAE;YAChB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,IAAI,EAAE,cAAc,CAAC,IAAI,IAAI,SAAS,CAAC,WAAW,IAAI,EAAE;YACxD,cAAc,EAAE,cAAc,CAAC,cAAc;YAC7C,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,MAAM,EAAE,WAAW;YACnB,YAAY,EAAE,gBAAgB;YAC9B,SAAS,EAAE,eAAe,WAAW,EAAE;YACvC,WAAW,EAAE,cAAc,SAAS,CAAC,UAAU,EAAE;YACjD,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;YACpE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,8CAA8C;QAC9C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC/D,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QAChF,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,GAAG,YAAY,oBAAoB,EAAE,CAAC;gBACxC,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,CAAC,mBAAmB,EACtC,8CAA8C,WAAW,EAAE,EAC3D,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,CAC5B,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,mBAAmB,CAAC,WAAmB,EAAE,SAA6B;QAC1E,MAAM,MAAM,GAAG,CAAC,MAAc,EAAS,EAAE;YACvC,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,CAAC,kBAAkB,EACrC,gCAAgC,WAAW,wBAAwB,MAAM,GAAG;gBAC1E,wEAAwE;gBACxE,4HAA4H,EAC9H,EAAE,WAAW,EAAE,MAAM,EAAE,yBAAyB,EAAE,CACnD,CAAC;QACJ,CAAC,CAAC;QACF,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YACpE,MAAM,CAAC,mDAAmD,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,SAAS,CAAC;QACd,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,CAAC,kBAAkB,EACrC,gCAAgC,WAAW,iEAAiE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAC9J,EAAE,WAAW,EAAE,MAAM,EAAE,yBAAyB,EAAE,KAAK,EAAE,GAAG,EAAE,CAC/D,CAAC;QACJ,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,iDAAiD,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1C,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;gBAAE,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,YAAY,GAAG,OAAO,MAAM,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,IAAI,YAAY,KAAK,EAAE,EAAE,CAAC;YACxB,sEAAsE;YACtE,yCAAyC;YACzC,MAAM,CAAC,yDAAyD,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;CACF"}
|