@happyvertical/smrt-ingestion 0.57.44 → 0.57.46
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/FEEDBACK.md +30 -0
- package/PROPOSALS.md +29 -0
- package/REVIEW.md +79 -0
- package/agents/execution.md +3 -1
- package/dist/chunks/{execution-DKWz2cz0.js → execution-Clcmi0sj.js} +2 -2
- package/dist/chunks/{execution-DKWz2cz0.js.map → execution-Clcmi0sj.js.map} +1 -1
- package/dist/chunks/{feedback-DHcSKgVU.js → feedback-hDSMYjiG.js} +94 -34
- package/dist/chunks/feedback-hDSMYjiG.js.map +1 -0
- package/dist/chunks/{proposal-contracts-CPH3ckgH.js → proposal-contracts-DREPLG56.js} +75 -2
- package/dist/chunks/proposal-contracts-DREPLG56.js.map +1 -0
- package/dist/chunks/{reviewer-instruction-Deoe4NPv.js → reviewer-instruction-BeOYVCVk.js} +2 -2
- package/dist/chunks/{reviewer-instruction-Deoe4NPv.js.map → reviewer-instruction-BeOYVCVk.js.map} +1 -1
- package/dist/execution-contracts.d.ts +7 -0
- package/dist/execution-contracts.d.ts.map +1 -1
- package/dist/execution.js +1 -1
- package/dist/feedback-contracts.d.ts +32 -3
- package/dist/feedback-contracts.d.ts.map +1 -1
- package/dist/feedback.d.ts +28 -0
- package/dist/feedback.d.ts.map +1 -1
- package/dist/generation-retry.d.ts +45 -0
- package/dist/generation-retry.d.ts.map +1 -0
- package/dist/manifest.json +1 -1
- package/dist/models.js +1 -1
- package/dist/models.js.map +1 -1
- package/dist/proposal-contracts.d.ts +15 -0
- package/dist/proposal-contracts.d.ts.map +1 -1
- package/dist/proposal-dto.d.ts +6 -0
- package/dist/proposal-dto.d.ts.map +1 -1
- package/dist/proposals.d.ts +7 -0
- package/dist/proposals.d.ts.map +1 -1
- package/dist/proposals.js +61 -18
- package/dist/proposals.js.map +1 -1
- package/dist/review-dto.d.ts +56 -0
- package/dist/review-dto.d.ts.map +1 -1
- package/dist/review-host.d.ts +14 -1
- package/dist/review-host.d.ts.map +1 -1
- package/dist/server.d.ts +27 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +127 -5
- package/dist/server.js.map +1 -1
- package/dist/smrt-knowledge.json +16 -16
- package/dist/svelte/argument-fields.d.ts +48 -0
- package/dist/svelte/argument-fields.d.ts.map +1 -0
- package/dist/svelte/argument-fields.js +96 -0
- package/dist/svelte/components/ActionReview.svelte +81 -11
- package/dist/svelte/components/ActionReview.svelte.d.ts +30 -1
- package/dist/svelte/components/ActionReview.svelte.d.ts.map +1 -1
- package/dist/svelte/components/ArgumentFields.svelte +176 -0
- package/dist/svelte/components/ArgumentFields.svelte.d.ts +27 -0
- package/dist/svelte/components/ArgumentFields.svelte.d.ts.map +1 -0
- package/dist/svelte/components/InboxView.svelte +137 -17
- package/dist/svelte/components/InboxView.svelte.d.ts +17 -0
- package/dist/svelte/components/InboxView.svelte.d.ts.map +1 -1
- package/dist/svelte/components/IntakeInbox.svelte +26 -2
- package/dist/svelte/components/IntakeInbox.svelte.d.ts +10 -1
- package/dist/svelte/components/IntakeInbox.svelte.d.ts.map +1 -1
- package/dist/svelte/components/IntakeWorkspace.svelte +23 -1
- package/dist/svelte/components/IntakeWorkspace.svelte.d.ts +13 -1
- package/dist/svelte/components/IntakeWorkspace.svelte.d.ts.map +1 -1
- package/dist/svelte/components/ReviewView.svelte +88 -10
- package/dist/svelte/components/ReviewView.svelte.d.ts.map +1 -1
- package/dist/svelte/components/TriageView.svelte +43 -3
- package/dist/svelte/components/TriageView.svelte.d.ts +10 -1
- package/dist/svelte/components/TriageView.svelte.d.ts.map +1 -1
- package/dist/svelte/i18n.d.ts +33 -0
- package/dist/svelte/i18n.d.ts.map +1 -1
- package/dist/svelte/i18n.js +36 -0
- package/dist/svelte/index.d.ts +2 -1
- package/dist/svelte/index.d.ts.map +1 -1
- package/dist/svelte/index.js +1 -0
- package/dist/svelte/upload-refusal.d.ts +25 -0
- package/dist/svelte/upload-refusal.d.ts.map +1 -0
- package/dist/svelte/upload-refusal.js +40 -0
- package/dist/svelte/view-utils.d.ts +8 -0
- package/dist/svelte/view-utils.d.ts.map +1 -1
- package/dist/svelte/view-utils.js +36 -0
- package/package.json +13 -13
- package/dist/chunks/feedback-DHcSKgVU.js.map +0 -1
- package/dist/chunks/proposal-contracts-CPH3ckgH.js.map +0 -1
|
@@ -28,8 +28,20 @@ export interface Props {
|
|
|
28
28
|
/** Told about every selection change, e.g. to keep a URL in step; never navigates. */
|
|
29
29
|
onselect?: (itemId: string | undefined) => void;
|
|
30
30
|
rowAside?: Snippet<[InboxEntry]>;
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
/** File types the upload picker offers; defaults to the host's `uploadAccept`. */
|
|
32
|
+
accept?: string;
|
|
33
|
+
/** Re-read the listed page on this interval while a row is processing; off when absent. */
|
|
34
|
+
listPollMs?: number;
|
|
35
|
+
}
|
|
36
|
+
let {
|
|
37
|
+
host,
|
|
38
|
+
itemId,
|
|
39
|
+
pollMs = 2000,
|
|
40
|
+
onselect,
|
|
41
|
+
rowAside,
|
|
42
|
+
accept,
|
|
43
|
+
listPollMs,
|
|
44
|
+
}: Props = $props();
|
|
33
45
|
const { t } = useI18n();
|
|
34
46
|
/**
|
|
35
47
|
* Most followed items read per watch tick. Followed items are read in
|
|
@@ -267,6 +279,22 @@ function left(id: string, view: ItemReviewView | undefined, busy: boolean) {
|
|
|
267
279
|
// tick, or one already scheduled, picks the new item up).
|
|
268
280
|
if (!following && watchTimer === undefined) schedule();
|
|
269
281
|
}
|
|
282
|
+
/**
|
|
283
|
+
* Event: a displayed row (not the open item) shows a stage in flight. It is
|
|
284
|
+
* followed like an item left mid-stage, so it does not keep "Interpreting…"
|
|
285
|
+
* until the next refresh (#4504). Rows beyond WATCH_CAP are not followed
|
|
286
|
+
* (nothing already followed is evicted for them); follow reads still take at
|
|
287
|
+
* most WATCH_LIMIT items per tick.
|
|
288
|
+
*/
|
|
289
|
+
function processing(id: string) {
|
|
290
|
+
if (id === selected || watched.includes(id) || started.length >= WATCH_CAP)
|
|
291
|
+
return;
|
|
292
|
+
bump(id);
|
|
293
|
+
staged.add(id);
|
|
294
|
+
watched = [...watched, id];
|
|
295
|
+
started = [...started, id];
|
|
296
|
+
if (!following && watchTimer === undefined) schedule();
|
|
297
|
+
}
|
|
270
298
|
/** Event: the open pane, or a follow read, was denied (returned or thrown). */
|
|
271
299
|
function denied(id: string) {
|
|
272
300
|
if (id === selected) {
|
|
@@ -339,6 +367,8 @@ function pageLanded(page: {
|
|
|
339
367
|
}
|
|
340
368
|
for (const id of [...newest.keys()]) if (!displayed(id)) newest.delete(id);
|
|
341
369
|
for (const id of [...watched]) if (!displayed(id)) rowRemoved(id);
|
|
370
|
+
for (const row of rows)
|
|
371
|
+
if (statusOf(row).kind === 'pending') processing(row.item.id);
|
|
342
372
|
}
|
|
343
373
|
/** Event: a page read failed and the list failed closed (no rows). */
|
|
344
374
|
function listFailed() {
|
|
@@ -613,6 +643,16 @@ function outcome(_kind: ReviewOutcome, view: ItemReviewView) {
|
|
|
613
643
|
}
|
|
614
644
|
void advance();
|
|
615
645
|
}
|
|
646
|
+
/**
|
|
647
|
+
* Re-read the list's first page, like its Refresh button (host-callable via
|
|
648
|
+
* `IntakeWorkspace.refresh()`). See `InboxView.refresh` for the result.
|
|
649
|
+
*/
|
|
650
|
+
export async function refresh(): Promise<{
|
|
651
|
+
items: InboxEntry[];
|
|
652
|
+
result: 'shown' | 'failed' | 'pending';
|
|
653
|
+
}> {
|
|
654
|
+
return inbox ? inbox.refresh() : { items: [], result: 'pending' as const };
|
|
655
|
+
}
|
|
616
656
|
function keydown(event: KeyboardEvent) {
|
|
617
657
|
if (event.defaultPrevented || event.ctrlKey || event.metaKey) return;
|
|
618
658
|
const target = event.target;
|
|
@@ -643,7 +683,7 @@ function keydown(event: KeyboardEvent) {
|
|
|
643
683
|
<svelte:window onkeydown={keydown} />
|
|
644
684
|
<div class="workspace" bind:this={root} data-testid="intake-workspace">
|
|
645
685
|
<div class="list-pane">
|
|
646
|
-
<InboxView bind:this={inbox} {host} {rowAside} selectedId={selected} onselect={(id) => request(id)} onitems={listed} onreadstart={readStarted} {stamp} status={rowStatus} resolveInRow={false} />
|
|
686
|
+
<InboxView bind:this={inbox} {host} {rowAside} {accept} {listPollMs} selectedId={selected} onselect={(id) => request(id)} onitems={listed} onreadstart={readStarted} {stamp} status={rowStatus} resolveInRow={false} />
|
|
647
687
|
</div>
|
|
648
688
|
<section class="item-pane" bind:this={pane} tabindex="-1" aria-label={label ?? t(M['ingestion.selectedItem'])} data-testid="workspace-item" onfocusin={noteField}>
|
|
649
689
|
<div class="queue-nav" role="group" aria-label={t(M['ingestion.workspace'])}>
|
|
@@ -9,8 +9,17 @@ export interface Props {
|
|
|
9
9
|
/** Told about every selection change, e.g. to keep a URL in step; never navigates. */
|
|
10
10
|
onselect?: (itemId: string | undefined) => void;
|
|
11
11
|
rowAside?: Snippet<[InboxEntry]>;
|
|
12
|
+
/** File types the upload picker offers; defaults to the host's `uploadAccept`. */
|
|
13
|
+
accept?: string;
|
|
14
|
+
/** Re-read the listed page on this interval while a row is processing; off when absent. */
|
|
15
|
+
listPollMs?: number;
|
|
12
16
|
}
|
|
13
|
-
declare const TriageView: import("svelte").Component<Props, {
|
|
17
|
+
declare const TriageView: import("svelte").Component<Props, {
|
|
18
|
+
refresh: () => Promise<{
|
|
19
|
+
items: InboxEntry[];
|
|
20
|
+
result: "shown" | "failed" | "pending";
|
|
21
|
+
}>;
|
|
22
|
+
}, "">;
|
|
14
23
|
type TriageView = ReturnType<typeof TriageView>;
|
|
15
24
|
export default TriageView;
|
|
16
25
|
//# sourceMappingURL=TriageView.svelte.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TriageView.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/TriageView.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,EAAa,KAAK,OAAO,EAAiB,MAAM,QAAQ,CAAC;AAChE,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAEjB,MAAM,qBAAqB,CAAC;AAc7B,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,gBAAgB,CAAC;IACvB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"TriageView.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/TriageView.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,EAAa,KAAK,OAAO,EAAiB,MAAM,QAAQ,CAAC;AAChE,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAEjB,MAAM,qBAAqB,CAAC;AAc7B,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,gBAAgB,CAAC;IACvB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IACjC,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA6qBD,QAAA,MAAM,UAAU;mBA1DW,OAAO,CAAC;QACjC,KAAK,EAAE,UAAU,EAAE,CAAC;QACpB,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;KACxC,CAAC;MAuDsD,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|
package/dist/svelte/i18n.d.ts
CHANGED
|
@@ -70,6 +70,7 @@ export declare const M: {
|
|
|
70
70
|
readonly 'ingestion.saveSplit': "ingestion.saveSplit";
|
|
71
71
|
readonly 'ingestion.instructions': "ingestion.instructions";
|
|
72
72
|
readonly 'ingestion.reinterpret': "ingestion.reinterpret";
|
|
73
|
+
readonly 'ingestion.tryAgain': "ingestion.tryAgain";
|
|
73
74
|
readonly 'ingestion.reinterpreting': "ingestion.reinterpreting";
|
|
74
75
|
readonly 'ingestion.appliedInstruction': "ingestion.appliedInstruction";
|
|
75
76
|
readonly 'ingestion.pendingInstruction': "ingestion.pendingInstruction";
|
|
@@ -130,5 +131,37 @@ export declare const M: {
|
|
|
130
131
|
readonly 'ingestion.triage.apply': "ingestion.triage.apply";
|
|
131
132
|
readonly 'ingestion.triage.failed': "ingestion.triage.failed";
|
|
132
133
|
readonly 'ingestion.triage.missing': "ingestion.triage.missing";
|
|
134
|
+
readonly 'ingestion.fields': "ingestion.fields";
|
|
135
|
+
readonly 'ingestion.advanced': "ingestion.advanced";
|
|
136
|
+
readonly 'ingestion.fieldsUnavailable': "ingestion.fieldsUnavailable";
|
|
137
|
+
readonly 'ingestion.unset': "ingestion.unset";
|
|
138
|
+
readonly 'ingestion.searching': "ingestion.searching";
|
|
139
|
+
readonly 'ingestion.noMatches': "ingestion.noMatches";
|
|
140
|
+
readonly 'ingestion.assigneeName': "ingestion.assigneeName";
|
|
141
|
+
readonly 'ingestion.anyAssignee': "ingestion.anyAssignee";
|
|
142
|
+
readonly 'ingestion.reviewState.proposed': "ingestion.reviewState.proposed";
|
|
143
|
+
readonly 'ingestion.reviewState.waiting_review': "ingestion.reviewState.waiting_review";
|
|
144
|
+
readonly 'ingestion.reviewState.authorized': "ingestion.reviewState.authorized";
|
|
145
|
+
readonly 'ingestion.reviewState.deferred': "ingestion.reviewState.deferred";
|
|
146
|
+
readonly 'ingestion.reviewState.rejected': "ingestion.reviewState.rejected";
|
|
147
|
+
readonly 'ingestion.reviewState.claimed': "ingestion.reviewState.claimed";
|
|
148
|
+
readonly 'ingestion.reviewState.executing': "ingestion.reviewState.executing";
|
|
149
|
+
readonly 'ingestion.reviewState.outcome_unknown': "ingestion.reviewState.outcome_unknown";
|
|
150
|
+
readonly 'ingestion.reviewState.succeeded': "ingestion.reviewState.succeeded";
|
|
151
|
+
readonly 'ingestion.reviewState.failed': "ingestion.reviewState.failed";
|
|
152
|
+
readonly 'ingestion.reviewState.stale': "ingestion.reviewState.stale";
|
|
153
|
+
readonly 'ingestion.reviewState.expired': "ingestion.reviewState.expired";
|
|
154
|
+
readonly 'ingestion.reviewState.unavailable': "ingestion.reviewState.unavailable";
|
|
155
|
+
readonly 'ingestion.outcome.proposals': "ingestion.outcome.proposals";
|
|
156
|
+
readonly 'ingestion.outcome.needs_review': "ingestion.outcome.needs_review";
|
|
157
|
+
readonly 'ingestion.outcome.unknown': "ingestion.outcome.unknown";
|
|
158
|
+
readonly 'ingestion.outcome.ambiguous': "ingestion.outcome.ambiguous";
|
|
159
|
+
readonly 'ingestion.outcome.no_action': "ingestion.outcome.no_action";
|
|
160
|
+
readonly 'ingestion.outcome.provider_error': "ingestion.outcome.provider_error";
|
|
133
161
|
};
|
|
162
|
+
/**
|
|
163
|
+
* The message key for a server value (a review state, a generation outcome),
|
|
164
|
+
* or undefined when none exists; callers then draw the value itself.
|
|
165
|
+
*/
|
|
166
|
+
export declare function messageKey(prefix: 'ingestion.reviewState.' | 'ingestion.outcome.', value: string): keyof typeof M | undefined;
|
|
134
167
|
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/svelte/i18n.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,CAAC
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/svelte/i18n.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmLZ,CAAC;AACH;;;GAGG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,wBAAwB,GAAG,oBAAoB,EACvD,KAAK,EAAE,MAAM,GACZ,MAAM,OAAO,CAAC,GAAG,SAAS,CAG5B"}
|
package/dist/svelte/i18n.js
CHANGED
|
@@ -71,6 +71,7 @@ export const M = defineMessages({
|
|
|
71
71
|
'ingestion.saveSplit': 'Save split and reprocess',
|
|
72
72
|
'ingestion.instructions': 'Instructions for the assistant',
|
|
73
73
|
'ingestion.reinterpret': 'Re-read with these instructions',
|
|
74
|
+
'ingestion.tryAgain': 'Try again',
|
|
74
75
|
'ingestion.reinterpreting': 'Reinterpreting…',
|
|
75
76
|
'ingestion.appliedInstruction': 'Suggestions were produced under this instruction',
|
|
76
77
|
'ingestion.pendingInstruction': 'Latest instruction, not yet applied',
|
|
@@ -131,4 +132,39 @@ export const M = defineMessages({
|
|
|
131
132
|
'ingestion.triage.apply': 'Approved, not yet applied',
|
|
132
133
|
'ingestion.triage.failed': 'Failed',
|
|
133
134
|
'ingestion.triage.missing': 'missing {fields}',
|
|
135
|
+
'ingestion.fields': 'Arguments',
|
|
136
|
+
'ingestion.advanced': 'Advanced: edit as JSON',
|
|
137
|
+
'ingestion.fieldsUnavailable': 'Fix the JSON under Advanced to edit these fields.',
|
|
138
|
+
'ingestion.unset': 'Not set',
|
|
139
|
+
'ingestion.searching': 'Searching…',
|
|
140
|
+
'ingestion.noMatches': 'No matches',
|
|
141
|
+
'ingestion.assigneeName': 'Assignee',
|
|
142
|
+
'ingestion.anyAssignee': 'Anyone',
|
|
143
|
+
'ingestion.reviewState.proposed': 'Proposed',
|
|
144
|
+
'ingestion.reviewState.waiting_review': 'Waiting for review',
|
|
145
|
+
'ingestion.reviewState.authorized': 'Approved, not yet applied',
|
|
146
|
+
'ingestion.reviewState.deferred': 'Deferred',
|
|
147
|
+
'ingestion.reviewState.rejected': 'Rejected',
|
|
148
|
+
'ingestion.reviewState.claimed': 'Starting',
|
|
149
|
+
'ingestion.reviewState.executing': 'Applying',
|
|
150
|
+
'ingestion.reviewState.outcome_unknown': 'Outcome unknown',
|
|
151
|
+
'ingestion.reviewState.succeeded': 'Applied',
|
|
152
|
+
'ingestion.reviewState.failed': 'Failed',
|
|
153
|
+
'ingestion.reviewState.stale': 'Out of date',
|
|
154
|
+
'ingestion.reviewState.expired': 'Expired',
|
|
155
|
+
'ingestion.reviewState.unavailable': 'Unavailable',
|
|
156
|
+
'ingestion.outcome.proposals': 'Suggestions ready',
|
|
157
|
+
'ingestion.outcome.needs_review': 'Needs review',
|
|
158
|
+
'ingestion.outcome.unknown': 'Not understood',
|
|
159
|
+
'ingestion.outcome.ambiguous': 'Ambiguous',
|
|
160
|
+
'ingestion.outcome.no_action': 'No action suggested',
|
|
161
|
+
'ingestion.outcome.provider_error': 'Interpretation failed',
|
|
134
162
|
});
|
|
163
|
+
/**
|
|
164
|
+
* The message key for a server value (a review state, a generation outcome),
|
|
165
|
+
* or undefined when none exists; callers then draw the value itself.
|
|
166
|
+
*/
|
|
167
|
+
export function messageKey(prefix, value) {
|
|
168
|
+
const key = `${prefix}${value}`;
|
|
169
|
+
return Object.hasOwn(M, key) ? key : undefined;
|
|
170
|
+
}
|
package/dist/svelte/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
export type { Assignment, EvidenceView, HandlerArgumentIssue, InboxEntry, InboxEvidence, InboxState, IntakeReviewHost, ItemReviewView, LogicalSplitInput, PreviewRejection, ReviewAction, ReviewerInstruction, ReviewerInstructionInput, ReviewerInstructionView, ReviewPage, } from '../review-dto.js';
|
|
1
|
+
export type { AssigneeOption, Assignment, EvidenceView, HandlerArgumentIssue, InboxEntry, InboxEvidence, InboxState, IntakeReviewHost, InterpretationRetryInput, ItemReviewView, LogicalSplitInput, PreviewRejection, ReviewAction, ReviewerInstruction, ReviewerInstructionInput, ReviewerInstructionView, ReviewFeedback, ReviewPage, } from '../review-dto.js';
|
|
2
2
|
export { default as EvidenceViewer } from './components/EvidenceViewer.svelte';
|
|
3
3
|
export { default as IntakeInbox } from './components/IntakeInbox.svelte';
|
|
4
4
|
export { default as IntakeReview } from './components/IntakeReview.svelte';
|
|
5
5
|
export { default as IntakeWorkspace } from './components/IntakeWorkspace.svelte';
|
|
6
|
+
export { INTAKE_UPLOAD_REFUSED, IntakeUploadRefusedError, UPLOAD_REFUSAL_MAX_LENGTH, uploadRefusalMessage, } from './upload-refusal.js';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/svelte/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,qCAAqC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/svelte/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,UAAU,EACV,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,wBAAwB,EACxB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,cAAc,EACd,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC"}
|
package/dist/svelte/index.js
CHANGED
|
@@ -2,3 +2,4 @@ export { default as EvidenceViewer } from './components/EvidenceViewer.svelte';
|
|
|
2
2
|
export { default as IntakeInbox } from './components/IntakeInbox.svelte';
|
|
3
3
|
export { default as IntakeReview } from './components/IntakeReview.svelte';
|
|
4
4
|
export { default as IntakeWorkspace } from './components/IntakeWorkspace.svelte';
|
|
5
|
+
export { INTAKE_UPLOAD_REFUSED, IntakeUploadRefusedError, UPLOAD_REFUSAL_MAX_LENGTH, uploadRefusalMessage, } from './upload-refusal.js';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** `code` a transport may set on a reconstructed error to mark its `message` as user-facing. */
|
|
2
|
+
export declare const INTAKE_UPLOAD_REFUSED = "INTAKE_UPLOAD_REFUSED";
|
|
3
|
+
/**
|
|
4
|
+
* A host's refusal of the files offered to `IntakeReviewHost.upload` (a type
|
|
5
|
+
* or size the host's allowlist does not accept, say), carrying a reason the
|
|
6
|
+
* reviewer may read. Throw it (or any error with a string `userMessage`) from
|
|
7
|
+
* `upload`; the inbox shows the reason instead of the generic unavailable
|
|
8
|
+
* line and keeps the listed rows. Any other thrown error still fails the list
|
|
9
|
+
* closed. Presentation only: never put storage keys or server internals in it.
|
|
10
|
+
*/
|
|
11
|
+
export declare class IntakeUploadRefusedError extends Error {
|
|
12
|
+
readonly userMessage: string;
|
|
13
|
+
readonly code = "INTAKE_UPLOAD_REFUSED";
|
|
14
|
+
constructor(userMessage: string, options?: ErrorOptions);
|
|
15
|
+
}
|
|
16
|
+
/** Longest reason shown; longer host text is cut. */
|
|
17
|
+
export declare const UPLOAD_REFUSAL_MAX_LENGTH = 500;
|
|
18
|
+
/**
|
|
19
|
+
* The reviewer-facing reason an upload error carries, or undefined when it
|
|
20
|
+
* carries none: a nonblank string `userMessage`, else the `message` of an
|
|
21
|
+
* error whose `name` is `IntakeUploadRefusedError` or whose `code` is
|
|
22
|
+
* `INTAKE_UPLOAD_REFUSED`. Works across realms and transports (duck-typed).
|
|
23
|
+
*/
|
|
24
|
+
export declare function uploadRefusalMessage(error: unknown): string | undefined;
|
|
25
|
+
//# sourceMappingURL=upload-refusal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-refusal.d.ts","sourceRoot":"","sources":["../../src/svelte/upload-refusal.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAC7D;;;;;;;GAOG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,2BAAyB;gBAC1B,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAKxD;AACD,qDAAqD;AACrD,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAmBvE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** `code` a transport may set on a reconstructed error to mark its `message` as user-facing. */
|
|
2
|
+
export const INTAKE_UPLOAD_REFUSED = 'INTAKE_UPLOAD_REFUSED';
|
|
3
|
+
/**
|
|
4
|
+
* A host's refusal of the files offered to `IntakeReviewHost.upload` (a type
|
|
5
|
+
* or size the host's allowlist does not accept, say), carrying a reason the
|
|
6
|
+
* reviewer may read. Throw it (or any error with a string `userMessage`) from
|
|
7
|
+
* `upload`; the inbox shows the reason instead of the generic unavailable
|
|
8
|
+
* line and keeps the listed rows. Any other thrown error still fails the list
|
|
9
|
+
* closed. Presentation only: never put storage keys or server internals in it.
|
|
10
|
+
*/
|
|
11
|
+
export class IntakeUploadRefusedError extends Error {
|
|
12
|
+
userMessage;
|
|
13
|
+
code = INTAKE_UPLOAD_REFUSED;
|
|
14
|
+
constructor(userMessage, options) {
|
|
15
|
+
super(userMessage, options);
|
|
16
|
+
this.name = 'IntakeUploadRefusedError';
|
|
17
|
+
this.userMessage = userMessage;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Longest reason shown; longer host text is cut. */
|
|
21
|
+
export const UPLOAD_REFUSAL_MAX_LENGTH = 500;
|
|
22
|
+
/**
|
|
23
|
+
* The reviewer-facing reason an upload error carries, or undefined when it
|
|
24
|
+
* carries none: a nonblank string `userMessage`, else the `message` of an
|
|
25
|
+
* error whose `name` is `IntakeUploadRefusedError` or whose `code` is
|
|
26
|
+
* `INTAKE_UPLOAD_REFUSED`. Works across realms and transports (duck-typed).
|
|
27
|
+
*/
|
|
28
|
+
export function uploadRefusalMessage(error) {
|
|
29
|
+
if (!error || typeof error !== 'object')
|
|
30
|
+
return undefined;
|
|
31
|
+
const value = error;
|
|
32
|
+
const text = (input) => typeof input === 'string' && input.trim()
|
|
33
|
+
? input.trim().slice(0, UPLOAD_REFUSAL_MAX_LENGTH)
|
|
34
|
+
: undefined;
|
|
35
|
+
return (text(value.userMessage) ??
|
|
36
|
+
(value.name === 'IntakeUploadRefusedError' ||
|
|
37
|
+
value.code === INTAKE_UPLOAD_REFUSED
|
|
38
|
+
? text(value.message)
|
|
39
|
+
: undefined));
|
|
40
|
+
}
|
|
@@ -81,4 +81,12 @@ export declare function triageSettled(view: ItemReviewView): boolean;
|
|
|
81
81
|
* any is shown without page navigation.
|
|
82
82
|
*/
|
|
83
83
|
export declare function observedPages(view: ItemReviewView): Record<string, number>;
|
|
84
|
+
/**
|
|
85
|
+
* Rows of a reviewer display for a definition list (#4503). The handler's own
|
|
86
|
+
* preview fields (`display.preview`, or `display.step.preview` for a plan
|
|
87
|
+
* step; a flat record is taken as is) come first, text as is and anything
|
|
88
|
+
* else as JSON; non-empty framework metadata (`dependencies`, `plan`) follows
|
|
89
|
+
* as JSON under its key (`metadata.<key>` when a preview field has that name).
|
|
90
|
+
*/
|
|
91
|
+
export declare function displayEntries(display: unknown): Array<[string, string]>;
|
|
84
92
|
//# sourceMappingURL=view-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-utils.d.ts","sourceRoot":"","sources":["../../src/svelte/view-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE/E;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,oBAAoB,EAC3B,WAAW,EAAE,SAAS,mBAAmB,EAAE,EAC3C,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB;AACD,gEAAgE;AAChE,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,oBAAoB,EAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,EAAE,CAQV;AACD,oFAAoF;AACpF,wBAAgB,WAAW,CACzB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAmBpB;AACD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKtE;AACD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,EAAE,MAAM,GACZ,MAAM,EAAE,CAWV;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAcpD;AAED,+FAA+F;AAC/F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CAsED;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,OAAO,CAQxE;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC;AAEzC,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAU3D;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAyC7D;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAK5D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAkB3D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiB1E"}
|
|
1
|
+
{"version":3,"file":"view-utils.d.ts","sourceRoot":"","sources":["../../src/svelte/view-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -255,3 +255,39 @@ export function observedPages(view) {
|
|
|
255
255
|
note(split.evidenceId, page);
|
|
256
256
|
return pages;
|
|
257
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* Rows of a reviewer display for a definition list (#4503). The handler's own
|
|
260
|
+
* preview fields (`display.preview`, or `display.step.preview` for a plan
|
|
261
|
+
* step; a flat record is taken as is) come first, text as is and anything
|
|
262
|
+
* else as JSON; non-empty framework metadata (`dependencies`, `plan`) follows
|
|
263
|
+
* as JSON under its key (`metadata.<key>` when a preview field has that name).
|
|
264
|
+
*/
|
|
265
|
+
export function displayEntries(display) {
|
|
266
|
+
const isRecord = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
|
|
267
|
+
const shown = (value) => typeof value === 'string' ? value : JSON.stringify(value);
|
|
268
|
+
const empty = (value) => value === undefined ||
|
|
269
|
+
value === null ||
|
|
270
|
+
(Array.isArray(value) && !value.length) ||
|
|
271
|
+
(isRecord(value) && !Object.keys(value).length);
|
|
272
|
+
if (!isRecord(display))
|
|
273
|
+
return [];
|
|
274
|
+
const source = isRecord(display.step) ? display.step : display;
|
|
275
|
+
if (!isRecord(source.preview))
|
|
276
|
+
return Object.entries(source).map(([key, value]) => [key, shown(value)]);
|
|
277
|
+
const rows = Object.entries(source.preview).map(([key, value]) => [key, shown(value)]);
|
|
278
|
+
for (const [key, value] of [
|
|
279
|
+
...Object.entries(source).filter(([key]) => key !== 'preview'),
|
|
280
|
+
...(source === display
|
|
281
|
+
? []
|
|
282
|
+
: Object.entries(display).filter(([key]) => key !== 'step')),
|
|
283
|
+
])
|
|
284
|
+
if (!empty(value)) {
|
|
285
|
+
// A preview field of the same name wins; metadata is then qualified,
|
|
286
|
+
// so every row name stays unique (it keys the rendered list).
|
|
287
|
+
let name = key;
|
|
288
|
+
while (rows.some(([shownName]) => shownName === name))
|
|
289
|
+
name = `metadata.${name}`;
|
|
290
|
+
rows.push([name, shown(value)]);
|
|
291
|
+
}
|
|
292
|
+
return rows;
|
|
293
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happyvertical/smrt-ingestion",
|
|
3
|
-
"version": "0.57.
|
|
3
|
+
"version": "0.57.46",
|
|
4
4
|
"description": "Durable tenant-scoped intake and evidence foundations",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -50,32 +50,32 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@happyvertical/smrt-core": "0.57.
|
|
54
|
-
"@happyvertical/smrt-types": "0.57.
|
|
55
|
-
"@happyvertical/smrt-tenancy": "0.57.
|
|
56
|
-
"@happyvertical/smrt-assets": "0.57.
|
|
57
|
-
"@happyvertical/smrt-jobs": "0.57.
|
|
53
|
+
"@happyvertical/smrt-core": "0.57.46",
|
|
54
|
+
"@happyvertical/smrt-types": "0.57.46",
|
|
55
|
+
"@happyvertical/smrt-tenancy": "0.57.46",
|
|
56
|
+
"@happyvertical/smrt-assets": "0.57.46",
|
|
57
|
+
"@happyvertical/smrt-jobs": "0.57.46",
|
|
58
58
|
"@happyvertical/sql": "^0.111.0",
|
|
59
59
|
"@happyvertical/pdf": "^0.65.9",
|
|
60
60
|
"@happyvertical/ocr": "^0.62.1",
|
|
61
61
|
"@happyvertical/speech": "^0.111.0",
|
|
62
62
|
"@happyvertical/ai": "^0.111.0",
|
|
63
63
|
"sharp": "^0.35.5",
|
|
64
|
-
"@happyvertical/smrt-agents": "0.57.
|
|
65
|
-
"@happyvertical/smrt-playbooks": "0.57.
|
|
64
|
+
"@happyvertical/smrt-agents": "0.57.46",
|
|
65
|
+
"@happyvertical/smrt-playbooks": "0.57.46",
|
|
66
66
|
"ajv": "8.20.0",
|
|
67
|
-
"@happyvertical/smrt-ui": "0.57.
|
|
67
|
+
"@happyvertical/smrt-ui": "0.57.46"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
|
-
"@happyvertical/smrt-vitest": "0.57.
|
|
70
|
+
"@happyvertical/smrt-vitest": "0.57.46",
|
|
71
71
|
"@types/node": "24.13.6",
|
|
72
72
|
"typescript": "6.0.3",
|
|
73
73
|
"vite": "8.1.6",
|
|
74
74
|
"vitest": "4.1.10",
|
|
75
|
-
"@happyvertical/smrt-content": "0.57.
|
|
76
|
-
"@happyvertical/smrt-messages": "0.57.
|
|
75
|
+
"@happyvertical/smrt-content": "0.57.46",
|
|
76
|
+
"@happyvertical/smrt-messages": "0.57.46",
|
|
77
77
|
"@happyvertical/email": "^0.111.0",
|
|
78
|
-
"@happyvertical/smrt-users": "0.57.
|
|
78
|
+
"@happyvertical/smrt-users": "0.57.46",
|
|
79
79
|
"@sveltejs/package": "^2.5.8",
|
|
80
80
|
"@sveltejs/vite-plugin-svelte": "^7.3.0",
|
|
81
81
|
"svelte": "^5.57.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"feedback-DHcSKgVU.js","names":["handler","reference","candidate","row","digest","id"],"sources":["../../src/feedback.ts"],"sourcesContent":["/** Initial optional-example denial; revocation after selection must remain fatal. */\nexport class FeedbackRetrievalDeniedError extends Error {\n constructor() {\n super('Feedback unavailable');\n this.name = 'FeedbackRetrievalDeniedError';\n }\n}\n\nimport { randomUUID } from 'node:crypto';\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport {\n intakeBindingDigest as digest,\n IntakeExecutionService,\n} from './execution.js';\nimport type { FeedbackConfiguration } from './feedback-contracts.js';\nimport type {\n AdoptRuleInput,\n FeedbackBinding,\n FeedbackExample,\n FeedbackReceipt,\n FeedbackReferences,\n FeedbackSelection,\n ObserveFeedbackInput,\n ReadRuleInput,\n RecordFeedbackInput,\n RoutingRule,\n RuleAdoption,\n RuleSuggestion,\n SuggestRuleInput,\n} from './feedback-dto.js';\nimport {\n type FeedbackActionContext,\n feedbackActionTransaction,\n feedbackDiscoveryContext,\n} from './feedback-internal.js';\nimport type { GenerationOutput } from './proposal-dto.js';\nimport { reviewerInstructionView } from './reviewer-instruction.js';\nimport type { IngestionOptions } from './server.js';\n\ntype Row = Record<string, unknown>;\nfunction object(value: unknown): Row {\n const result = typeof value === 'string' ? JSON.parse(value) : value;\n if (!result || typeof result !== 'object' || Array.isArray(result))\n throw new Error('Feedback unavailable');\n return result as Row;\n}\nfunction text(value: unknown, max = 512): asserts value is string {\n if (typeof value !== 'string' || !value.trim() || value.length > max)\n throw new Error('Invalid feedback');\n}\nfunction resultData(data: Row): Row {\n return {\n status: data.status,\n provider: data.provider,\n model: data.model,\n version: data.version,\n output: data.output,\n usage: data.usage,\n ...(Object.hasOwn(data, 'error') ? { error: data.error } : {}),\n ...(Object.hasOwn(data, 'confidence')\n ? { confidence: data.confidence }\n : {}),\n };\n}\nexport function feedbackTerms(value: string): string[] {\n return [\n ...new Set(value.toLowerCase().match(/[\\p{L}\\p{N}]+/gu) ?? []),\n ].sort();\n}\nexport function feedbackSimilarity(left: string, right: string): number {\n const a = new Set(feedbackTerms(left)),\n b = new Set(feedbackTerms(right));\n const union = new Set([...a, ...b]);\n return union.size\n ? [...a].filter((value) => b.has(value)).length / union.size\n : 0;\n}\nexport interface RetrieveFeedbackInput {\n itemId: string;\n query: string;\n offered: GenerationOutput['offered'];\n promptVersion: string;\n configurationVersion: string;\n model: { provider: string; model: string; version: string };\n providers?: string[];\n}\n/** Owning ingestion ledger. Generic LearningMemory's success/ancestor fallback semantics are deliberately not used. */\nexport class IntakeFeedbackService {\n private readonly execution: IntakeExecutionService;\n private readonly config: FeedbackConfiguration;\n private readonly lineage = new Set<string>();\n private exampleChecks = 0;\n constructor(\n private readonly options: IngestionOptions,\n execution?: IntakeExecutionService,\n ) {\n if (!options.execution || !options.feedback)\n throw new Error('Feedback not configured');\n this.config = { ...options.feedback };\n this.execution =\n execution ?? new IntakeExecutionService(options, options.execution);\n text(this.config.version);\n for (const [value, max] of [\n [this.config.maxExamples, 20],\n [this.config.maxScan, 1000],\n [this.config.maxBytes, 1000000],\n ])\n if (!Number.isSafeInteger(value) || value < 1 || value > max)\n throw new Error('Invalid feedback limits');\n if (\n !Number.isFinite(this.config.minimumSimilarity) ||\n this.config.minimumSimilarity < 0.2 ||\n this.config.minimumSimilarity > 1\n )\n throw new Error('Invalid feedback similarity');\n }\n private configurationDigest() {\n const { version, maxExamples, maxScan, maxBytes, minimumSimilarity } =\n this.config;\n return digest({\n version,\n maxExamples,\n maxScan,\n maxBytes,\n minimumSimilarity,\n });\n }\n private routing(\n ctx: FeedbackActionContext,\n ): Pick<RoutingRule, 'args' | 'projection'> {\n // Read live trusted configuration again at publication/replay boundaries.\n const declarations = this.options.feedback?.routing;\n if (declarations === undefined) return { args: ctx.args };\n if (!Array.isArray(declarations))\n throw new Error('Invalid routing projection');\n const seen = new Set<string>();\n for (const declaration of declarations) {\n const entry = object(declaration);\n text(entry.handlerId);\n text(entry.handlerVersion);\n text(entry.version);\n const key = digest([entry.handlerId, entry.handlerVersion]);\n const handler = this.options.execution!.handlers.find(\n (handler) =>\n handler.id === entry.handlerId &&\n handler.version === entry.handlerVersion,\n );\n if (!handler || seen.has(key))\n throw new Error('Invalid routing projection');\n seen.add(key);\n const properties = object(handler.argsSchema.properties);\n if (\n !Array.isArray(entry.fields) ||\n !entry.fields.length ||\n entry.fields.length > 64 ||\n new Set(entry.fields).size !== entry.fields.length\n )\n throw new Error('Invalid routing projection');\n for (const field of entry.fields) {\n text(field);\n if (\n ['__proto__', 'prototype', 'constructor'].includes(field) ||\n !Object.hasOwn(properties, field)\n )\n throw new Error('Invalid routing projection');\n }\n }\n const selected = declarations.find(\n (entry) =>\n entry.handlerId === ctx.handlerId &&\n entry.handlerVersion === ctx.handlerVersion,\n );\n if (!selected) return { args: ctx.args };\n const fields = [...selected.fields].sort();\n const args = Object.fromEntries(\n fields\n .filter((field) => Object.hasOwn(ctx.args, field))\n .map((field) => [field, structuredClone(ctx.args[field])]),\n );\n if (!Object.keys(args).length)\n throw new Error('Routing values unavailable');\n return { args, projection: { version: selected.version, fields } };\n }\n private scope() {\n return this.options.scope;\n }\n private async rows(\n db: DatabaseInterface,\n where: string,\n params: unknown[] = [],\n ): Promise<Row[]> {\n const scope = this.scope();\n return (\n await db.query(\n `SELECT * FROM intake_feedback WHERE tenant_id=? AND confidential_scope_id=? AND ${where}`,\n scope.tenantId,\n scope.confidentialScopeId,\n ...params,\n )\n ).rows;\n }\n private async authorize(\n ctx: FeedbackActionContext,\n operation: 'capture' | 'retrieve' | 'suggest' | 'adopt',\n ) {\n if (\n !(await this.config.authorize({\n db: ctx.db,\n scope: this.scope(),\n itemId: ctx.itemId,\n operation,\n }))\n )\n throw new Error('Feedback unavailable');\n }\n private checkBinding(input: FeedbackBinding, ctx: FeedbackActionContext) {\n if (\n input.itemId !== ctx.itemId ||\n input.actionId !== ctx.review.actionId ||\n input.expectedRevision !== ctx.review.revision ||\n input.expectedReviewVersion !== ctx.review.reviewVersion ||\n input.bindingHash !== ctx.review.bindingHash\n )\n throw new Error('Stale feedback binding');\n }\n private async insert(\n ctx: FeedbackActionContext,\n key: string,\n kind: string,\n data: Row,\n supersedesId: string | null = null,\n ): Promise<Row> {\n const serialized = JSON.stringify(data);\n if (\n Buffer.byteLength(serialized) >\n Math.min(this.config.maxBytes, ctx.context.policy.maxBytes)\n )\n throw new Error('Feedback limit');\n const scope = this.scope(),\n now = (this.options.now?.() ?? new Date()).toISOString();\n const row = {\n id: randomUUID(),\n slug: randomUUID(),\n context: '',\n created_at: now,\n updated_at: now,\n tenant_id: scope.tenantId,\n confidential_scope_id: scope.confidentialScopeId,\n item_id: ctx.itemId,\n request_key: key,\n supersedes_id: supersedesId,\n kind,\n data: serialized,\n };\n return (\n await ctx.db.query(\n `INSERT INTO intake_feedback (${Object.keys(row).join(',')}) VALUES (${Object.keys(\n row,\n )\n .map(() => '?')\n .join(',')}) RETURNING *`,\n ...Object.values(row),\n )\n ).rows[0];\n }\n private receipt(row: Row): FeedbackReceipt {\n return {\n id: String(row.id),\n digest: String(object(row.data).digest),\n kind: row.kind as FeedbackReceipt['kind'],\n };\n }\n /** Source text, pin and (when a model suggestion exists) generation versions. */\n private async provenance(ctx: FeedbackActionContext) {\n const output = object(ctx.result.output);\n // A reviewer-selected action on an extraction-only item carries no generation.\n const generation = output.proposals ? object(output.proposals) : undefined;\n const pin = generation\n ? object(generation.source)\n : { attemptId: ctx.attemptId, outputDigest: digest(ctx.result) };\n const provenance = generation ? object(generation.provenance) : undefined;\n if (generation && provenance?.feedback) {\n const inherited = object(provenance.feedback);\n const key = ctx.attemptId;\n if (this.lineage.has(key) || this.lineage.size >= 8)\n throw new Error('Feedback lineage unavailable');\n this.lineage.add(key);\n try {\n await this.assertSelection(\n {\n itemId: ctx.itemId,\n query: String(inherited.query),\n offered: generation.offered as GenerationOutput['offered'],\n promptVersion: String(provenance.promptVersion),\n configurationVersion: String(provenance.configurationVersion),\n model: provenance.generative as RetrieveFeedbackInput['model'],\n providers: [\n String(object(provenance.generative).provider),\n ...(object(provenance.decision).configured\n ? [String(object(provenance.decision).provider)]\n : []),\n ],\n },\n inherited.selection as unknown as FeedbackReferences,\n ctx.db,\n );\n } finally {\n this.lineage.delete(key);\n }\n }\n const scope = this.scope();\n const [source] = (\n await ctx.db.query(\n 'SELECT data,output_digest FROM intake_analysis_attempts WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND id=?',\n scope.tenantId,\n scope.confidentialScopeId,\n ctx.itemId,\n pin.attemptId,\n )\n ).rows;\n if (!source || source.output_digest !== pin.outputDigest)\n throw new Error('Feedback source unavailable');\n const sourceResult = resultData(object(source.data));\n if (digest(sourceResult) !== pin.outputDigest)\n throw new Error('Feedback source integrity');\n const results = object(sourceResult.output).results;\n if (!Array.isArray(results))\n throw new Error('Feedback extraction unavailable');\n const query = results\n .flatMap((entry) => {\n const segments = object(entry).segments;\n return Array.isArray(segments)\n ? segments.map((segment) => String(object(segment).text ?? ''))\n : [];\n })\n .join('\\n')\n .slice(0, 4096);\n if (!provenance)\n return {\n generation: false as const,\n query,\n attemptId: ctx.attemptId,\n evidence: object(ctx.analysis).inputs,\n source: pin,\n };\n const model = object(provenance.generative);\n for (const field of ['provider', 'model', 'version']) text(model[field]);\n text(provenance.promptVersion);\n text(provenance.configurationVersion);\n // A judgment made under reviewer guidance references that guidance by id\n // and digest only; retrieval joins the text from the source's own record,\n // so instruction text never counts against the write budget.\n const instruction = this.instructionFor(ctx);\n return {\n generation: true as const,\n query,\n ...(instruction\n ? { instruction: { id: instruction.id, digest: instruction.digest } }\n : {}),\n model: {\n provider: String(model.provider),\n model: String(model.model),\n version: String(model.version),\n },\n promptVersion: String(provenance.promptVersion),\n configurationVersion: String(provenance.configurationVersion),\n attemptId: ctx.attemptId,\n evidence: object(ctx.analysis).inputs,\n source: pin,\n };\n }\n /** The example exactly as retrieval returns it; shared by the write-time size check. */\n private exampleOf(\n id: string,\n stored: string,\n data: Row,\n ctx: FeedbackActionContext,\n guidance?: { id: string; digest: string; text: string },\n ): FeedbackExample {\n return {\n feedbackId: id,\n digest: stored,\n itemId: ctx.itemId,\n actionId: ctx.review.actionId,\n revision: ctx.review.revision,\n handlerId: ctx.handlerId,\n handlerVersion: ctx.handlerVersion,\n judgment: data.judgment as 'correct' | 'incorrect',\n query: String(data.query),\n args: object(data.args),\n model: data.model as FeedbackExample['model'],\n promptVersion: String(data.promptVersion),\n configurationVersion: String(data.configurationVersion),\n ...(guidance ? { instruction: guidance } : {}),\n };\n }\n /**\n * The verified reviewer instruction the action's generation ran under: the\n * authenticated extraction record must match the generation's provenance.\n */\n private instructionFor(\n ctx: FeedbackActionContext,\n ): { id: string; digest: string; text: string } | undefined {\n const provenance = object(\n object(object(ctx.result.output).proposals).provenance,\n );\n const instructionRecord = object(\n object(ctx.analysis).configuration,\n ).reviewerInstruction;\n const recorded = provenance.reviewerInstruction\n ? object(provenance.reviewerInstruction)\n : undefined;\n if (!instructionRecord && !recorded) return undefined;\n const view = reviewerInstructionView(instructionRecord);\n if (!recorded || recorded.id !== view.id || recorded.digest !== view.digest)\n throw new Error('Feedback instruction integrity');\n return { id: view.id, digest: view.digest, text: view.text };\n }\n /** Internal saved-action gate; the execution owner supplies its transaction. */\n async assertActionLineage(\n actionId: string,\n db: DatabaseInterface,\n proposalId: string,\n ): Promise<void> {\n await this.execution[feedbackActionTransaction](\n actionId,\n false,\n async (ctx) => {\n await this.provenance(ctx);\n },\n db,\n undefined,\n proposalId,\n );\n }\n async record(input: RecordFeedbackInput): Promise<FeedbackReceipt> {\n digest(input);\n text(input.requestId);\n if (\n !['correct', 'incorrect'].includes(input.judgment) ||\n (input.comment !== undefined &&\n (typeof input.comment !== 'string' || input.comment.length > 4000))\n )\n throw new Error('Invalid feedback');\n const frozen = structuredClone(input);\n return this.execution[feedbackActionTransaction](\n input.actionId,\n true,\n async (ctx) => {\n await this.authorize(ctx, 'capture');\n this.checkBinding(frozen, ctx);\n const requestHash = digest(frozen),\n key = `judgment:${frozen.requestId}`;\n const [replay] = await this.rows(\n ctx.db,\n 'item_id=? AND request_key=?',\n [ctx.itemId, key],\n );\n if (replay) {\n const data = object(replay.data);\n if (\n data.requestHash !== requestHash ||\n data.reviewer !== this.scope().actorId\n )\n throw new Error('Feedback request conflict');\n return this.receipt(replay);\n }\n if (frozen.supersedesId) {\n const [old] = await this.rows(\n ctx.db,\n 'item_id=? AND id=? AND kind=?',\n [ctx.itemId, frozen.supersedesId, 'interpretation'],\n );\n if (\n !old ||\n object(old.data).actionId !== frozen.actionId ||\n (await this.rows(ctx.db, 'supersedes_id=?', [old.id])).length\n )\n throw new Error('Feedback supersession conflict');\n }\n const { generation, ...provenance } = await this.provenance(ctx),\n routing = this.routing(ctx);\n // Interpretation judgments label a model suggestion; reviewer-selected\n // actions are captured as routing choices by their owning operation,\n // even when the item also carries a (different) model generation.\n if (!generation || ctx.origin === 'reviewer-selected')\n throw new Error('Feedback requires a model suggestion');\n const body = {\n version: 1,\n requestHash,\n reviewer: this.scope().actorId,\n actionId: ctx.review.actionId,\n revision: ctx.review.revision,\n reviewVersion: ctx.review.reviewVersion,\n bindingHash: ctx.review.bindingHash,\n handlerId: ctx.handlerId,\n handlerVersion: ctx.handlerVersion,\n args: ctx.args,\n ...(routing.projection ? { routing } : {}),\n judgment: frozen.judgment,\n comment: frozen.comment ?? '',\n ...provenance,\n };\n const row = await this.insert(\n ctx,\n key,\n 'interpretation',\n { ...body, digest: digest(body) },\n frozen.supersedesId ?? null,\n );\n // The judgment stores only the instruction reference, but retrieval\n // joins its text. Refuse here, inside the transaction, if that single\n // joined example could never fit the handler's read budget; otherwise\n // every later retrieval ranking it would fail closed scope-wide.\n const guidance = this.instructionFor(ctx);\n if (guidance) {\n const data = object(row.data);\n const selection = {\n version: this.config.version,\n configurationDigest: this.configurationDigest(),\n examples: [\n this.exampleOf(\n String(row.id),\n String(data.digest),\n data,\n ctx,\n guidance,\n ),\n ],\n };\n if (\n Buffer.byteLength(JSON.stringify(selection)) >\n Math.min(this.config.maxBytes, ctx.context.policy.maxBytes)\n )\n throw new Error('Feedback instruction exceeds retrieval budget');\n }\n await this.authorize(ctx, 'capture');\n if (digest(routing) !== digest(this.routing(ctx)))\n throw new Error('Routing projection changed');\n return this.receipt(row);\n },\n );\n }\n /** Consume a durable owner event idempotently. Never derive correctness from these signals. */\n async observe(input: ObserveFeedbackInput): Promise<FeedbackReceipt> {\n digest(input);\n text(input.eventId);\n if (!['action_decision', 'downstream_outcome'].includes(input.kind))\n throw new Error('Invalid feedback kind');\n return this.execution[feedbackActionTransaction](\n input.actionId,\n true,\n async (ctx) => {\n await this.authorize(ctx, 'capture');\n this.checkBinding(input, ctx);\n const scope = this.scope();\n const table =\n input.kind === 'action_decision'\n ? 'intake_review_decisions'\n : 'intake_executions';\n const [event] = (\n await ctx.db.query(\n `SELECT * FROM ${table} WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND action_id=? AND id=?`,\n scope.tenantId,\n scope.confidentialScopeId,\n ctx.itemId,\n input.actionId,\n input.eventId,\n )\n ).rows;\n if (!event || event.binding_hash !== ctx.review.bindingHash)\n throw new Error('Feedback event unavailable');\n const state =\n input.kind === 'action_decision' ? event.decision : event.state;\n if (\n input.kind === 'downstream_outcome' &&\n !['succeeded', 'failed', 'outcome_unknown'].includes(String(state))\n )\n throw new Error('Outcome is not terminal');\n const body = {\n version: 1,\n eventId: input.eventId,\n actionId: input.actionId,\n revision: ctx.review.revision,\n reviewer:\n input.kind === 'action_decision'\n ? object(event.data).reviewer\n : null,\n decisionMode:\n input.kind === 'action_decision'\n ? (object(event.data).mode ?? 'review')\n : null,\n selfDecision:\n input.kind === 'action_decision' &&\n object(event.data).selfDecision === true,\n observedBy: this.scope().actorId,\n principalId: object(event.data).principalId ?? null,\n signal: state,\n provenance: await this.provenance(ctx),\n };\n const key = `event:${input.kind}:${input.eventId}:${String(state)}`;\n const [existing] = await this.rows(\n ctx.db,\n 'item_id=? AND request_key=?',\n [ctx.itemId, key],\n );\n if (existing) return this.receipt(existing);\n const row = await this.insert(ctx, key, input.kind, {\n ...body,\n digest: digest(body),\n });\n await this.authorize(ctx, 'capture');\n return this.receipt(row);\n },\n );\n }\n private async example(\n row: Row,\n input: RetrieveFeedbackInput,\n executor?: DatabaseInterface,\n ): Promise<FeedbackExample | undefined> {\n if (++this.exampleChecks > this.config.maxScan) return undefined;\n try {\n const candidate = object(row.data);\n // Retention deliberately redacts ledger payloads. Reject tombstones before\n // issuing a UUID query: catching a PostgreSQL cast error cannot repair its transaction.\n if (\n typeof candidate.actionId !== 'string' ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(\n candidate.actionId,\n )\n )\n return undefined;\n return await this.execution[feedbackActionTransaction](\n candidate.actionId,\n false,\n async (ctx) => {\n await this.authorize(ctx, 'retrieve');\n await this.provenance(ctx);\n const guidance = this.instructionFor(ctx);\n const [current] = await this.rows(\n ctx.db,\n 'id=? AND kind=? AND NOT EXISTS (SELECT 1 FROM intake_feedback successor WHERE successor.tenant_id=intake_feedback.tenant_id AND successor.confidential_scope_id=intake_feedback.confidential_scope_id AND successor.supersedes_id=intake_feedback.id)',\n [row.id, 'interpretation'],\n );\n if (!current) return undefined;\n const data = object(current.data);\n const { digest: stored, ...body } = data;\n if (digest(body) !== stored) throw new Error('Feedback integrity');\n if (\n // A reviewer-selected action never labels a model suggestion. A\n // disposition says nothing about whether the suggestion was right.\n ctx.origin === 'reviewer-selected' ||\n data.revision !== ctx.review.revision ||\n data.bindingHash !== ctx.review.bindingHash ||\n data.attemptId !== ctx.attemptId ||\n data.promptVersion !== input.promptVersion ||\n data.configurationVersion !== input.configurationVersion ||\n digest(data.model) !== digest(input.model)\n )\n return undefined;\n // The stored reference must still name the source's verified record.\n const reference = data.instruction\n ? object(data.instruction)\n : undefined;\n if (\n !!reference !== !!guidance ||\n (reference &&\n (reference.id !== guidance?.id ||\n reference.digest !== guidance?.digest))\n )\n return undefined;\n const offered = input.offered.find(\n (entry) =>\n entry.handler.id === data.handlerId &&\n entry.handler.version === data.handlerVersion,\n );\n if (!offered) return undefined;\n const args = object(data.args);\n for (const [field, reference] of Object.entries(\n offered.handler.references,\n )) {\n if (\n reference.kind === 'candidate' &&\n Object.hasOwn(args, field) &&\n !offered.candidates.some(\n (candidate) =>\n candidate.id === args[field] &&\n candidate.model === reference.model,\n )\n )\n return undefined;\n }\n return this.exampleOf(\n String(current.id),\n String(stored),\n data,\n ctx,\n guidance,\n );\n },\n executor,\n input.providers ?? [input.model.provider],\n );\n } catch {\n return undefined;\n }\n }\n /** Reviewer routing choice, reusable without a model suggestion; fails closed like `example`. */\n private async routingExample(\n row: Row,\n input: RetrieveFeedbackInput,\n executor?: DatabaseInterface,\n /** Re-checking an earlier selection: only integrity and revocation count. */\n lineage = false,\n ): Promise<FeedbackExample | undefined> {\n if (++this.exampleChecks > this.config.maxScan) return undefined;\n try {\n const data = object(row.data);\n const { digest: stored, ...body } = data;\n const itemId = String(row.item_id);\n const uuid =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n // Redacted tombstones carry no digest; reject before any UUID query.\n if (typeof stored !== 'string' || digest(body) !== stored)\n return undefined;\n const chosen = data.choice === 'handler';\n if (\n chosen &&\n (typeof data.actionId !== 'string' || !uuid.test(data.actionId))\n )\n return undefined;\n const offered = chosen\n ? input.offered.find(\n (entry) =>\n entry.handler.id === data.handlerId &&\n entry.handler.version === data.handlerVersion,\n )\n : undefined;\n if (chosen && !offered) return undefined;\n const args = chosen ? object(data.args) : {};\n if (offered)\n for (const [field, reference] of Object.entries(\n offered.handler.references,\n ))\n if (\n reference.kind === 'candidate' &&\n Object.hasOwn(args, field) &&\n !offered.candidates.some(\n (candidate) =>\n candidate.id === args[field] &&\n candidate.model === reference.model,\n )\n )\n return undefined;\n const providers = input.providers ?? [input.model.provider];\n const scope = this.scope();\n const current = async (db: DatabaseInterface) => {\n if (\n !(await this.config.authorize({\n db,\n scope,\n itemId,\n operation: 'retrieve',\n }))\n )\n throw new Error('Feedback unavailable');\n const [attempt] = (\n await db.query(\n 'SELECT output_digest FROM intake_analysis_attempts WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND id=?',\n scope.tenantId,\n scope.confidentialScopeId,\n itemId,\n data.attemptId,\n )\n ).rows;\n if (!attempt || attempt.output_digest !== data.attemptDigest)\n throw new Error('Feedback source unavailable');\n const evidence = data.evidence;\n if (!Array.isArray(evidence) || !evidence.length)\n throw new Error('Feedback source unavailable');\n for (const frozen of evidence) {\n const pinned = object(frozen);\n const [row] = (\n await db.query(\n \"SELECT content_hash FROM intake_evidence WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND id=? AND state='durable'\",\n scope.tenantId,\n scope.confidentialScopeId,\n itemId,\n pinned.id,\n )\n ).rows;\n if (!row || row.content_hash !== pinned.hash)\n throw new Error('Feedback source unavailable');\n }\n if ((await this.rows(db, 'supersedes_id=?', [row.id])).length)\n throw new Error('Feedback superseded');\n };\n const example: FeedbackExample = {\n feedbackId: String(row.id),\n digest: stored,\n itemId,\n actionId: chosen ? String(data.actionId) : '',\n revision: chosen ? Number(data.revision) : 0,\n handlerId: chosen ? String(data.handlerId) : 'none',\n handlerVersion: chosen ? String(data.handlerVersion) : '',\n judgment: 'correct',\n query: String(data.query),\n args,\n kind: 'reviewer_routing',\n routing: {\n choice: chosen ? 'handler' : 'none',\n reason: typeof data.reason === 'string' ? data.reason : '',\n },\n };\n if (chosen)\n // The action binding, handler access, targets, providers and retention\n // are rechecked by the owning execution boundary.\n return await this.execution[feedbackActionTransaction](\n String(data.actionId),\n false,\n async (ctx) => {\n // Only an approved (or applied) reviewer choice is a routing example;\n // a later correction changes the revision and retires it until the\n // new revision is approved and captured again.\n if (\n ctx.itemId !== itemId ||\n ctx.origin !== 'reviewer-selected' ||\n // Settledness gates selection only; a later resolution, lapse or\n // outcome change must not revoke an example already used.\n (!lineage && !ctx.settled) ||\n data.revision !== ctx.review.revision ||\n data.bindingHash !== ctx.review.bindingHash ||\n data.attemptId !== ctx.attemptId ||\n data.handlerId !== ctx.handlerId ||\n data.handlerVersion !== ctx.handlerVersion ||\n digest(args) !== digest(ctx.args)\n )\n return undefined;\n await current(ctx.db);\n return example;\n },\n executor,\n providers,\n undefined,\n !lineage,\n );\n // No handler was chosen: the source item must still be readable under a\n // currently offered handler, with the generation recipients allowed.\n for (const entry of input.offered) {\n try {\n return await this.execution[feedbackDiscoveryContext](\n executor,\n itemId,\n entry.handler.id,\n entry.handler.version,\n async (context) => {\n if (\n providers.some(\n (provider) => !context.policy.providers.includes(provider),\n )\n )\n throw new Error('Feedback source provider unavailable');\n await current(context.db);\n return example;\n },\n async (context) => {\n if (\n providers.some(\n (provider) => !context.policy.providers.includes(provider),\n )\n )\n throw new Error('Feedback source provider unavailable');\n await current(context.db);\n },\n );\n } catch {\n /* try the next currently offered handler; none means excluded */\n }\n }\n return undefined;\n } catch {\n return undefined;\n }\n }\n private receivingContext(\n input: RetrieveFeedbackInput,\n executor: DatabaseInterface | undefined,\n work: (\n context: import('./execution-contracts.js').HandlerContext,\n ) => Promise<FeedbackSelection>,\n ): Promise<FeedbackSelection> {\n let limit = this.config.maxBytes;\n let bytes: number | undefined;\n const validate = async (\n context: import('./execution-contracts.js').HandlerContext,\n ) => {\n if (\n (input.providers ?? [input.model.provider]).some(\n (provider) => !context.policy.providers.includes(provider),\n )\n )\n throw new Error('Feedback recipient unavailable');\n limit = Math.min(limit, context.policy.maxBytes);\n if (bytes !== undefined && bytes > limit)\n throw new Error('Feedback limit');\n };\n const visit = (\n index: number,\n db: DatabaseInterface | undefined,\n ): Promise<FeedbackSelection> => {\n const entry = input.offered[index];\n return this.execution[feedbackDiscoveryContext](\n db,\n input.itemId,\n entry.handler.id,\n entry.handler.version,\n async (context) => {\n await validate(context);\n const selection =\n index + 1 < input.offered.length\n ? await visit(index + 1, context.db)\n : await work(context);\n bytes = Buffer.byteLength(JSON.stringify(selection));\n if (bytes > limit) throw new Error('Feedback limit');\n return selection;\n },\n validate,\n );\n };\n return visit(0, executor);\n }\n async retrieve(\n input: RetrieveFeedbackInput,\n executor?: DatabaseInterface,\n ): Promise<FeedbackSelection> {\n text(input.query, 4096);\n const offered = input.offered[0];\n if (!offered)\n return {\n version: this.config.version,\n configurationDigest: this.configurationDigest(),\n examples: [],\n };\n const work = async (\n context: import('./execution-contracts.js').HandlerContext,\n ) => {\n const authorize = async (phase: 'initial' | 'final') => {\n if (\n !(await this.config.authorize({\n db: context.db,\n scope: this.scope(),\n itemId: input.itemId,\n operation: 'retrieve',\n }))\n ) {\n if (phase === 'initial') throw new FeedbackRetrievalDeniedError();\n throw new Error('Feedback unavailable');\n }\n };\n await authorize('initial');\n const scope = this.scope();\n const rows = (\n await context.db.query(\n \"SELECT * FROM intake_feedback WHERE tenant_id=? AND confidential_scope_id=? AND kind IN ('interpretation','reviewer_routing') ORDER BY id LIMIT ?\",\n scope.tenantId,\n scope.confidentialScopeId,\n this.config.maxScan,\n )\n ).rows;\n const ranked: Array<{ example: FeedbackExample; score: number }> = [];\n for (const row of rows) {\n const example =\n row.kind === 'reviewer_routing'\n ? await this.routingExample(row, input, context.db)\n : await this.example(row, input, context.db);\n if (!example) continue;\n const score = feedbackSimilarity(input.query, example.query);\n if (score >= this.config.minimumSimilarity)\n ranked.push({ example, score });\n }\n ranked.sort(\n (a, b) =>\n b.score - a.score ||\n a.example.feedbackId.localeCompare(b.example.feedbackId),\n );\n const selection = {\n version: this.config.version,\n configurationDigest: this.configurationDigest(),\n examples: ranked\n .slice(0, this.config.maxExamples)\n .map((entry) => entry.example),\n };\n await authorize('final');\n return selection;\n };\n return this.receivingContext(input, executor, work);\n }\n async assertSelection(\n input: RetrieveFeedbackInput,\n selection: FeedbackReferences,\n executor?: DatabaseInterface,\n ): Promise<void> {\n if (\n selection.version !== this.config.version ||\n selection.configurationDigest !== this.configurationDigest() ||\n !Array.isArray(selection.examples) ||\n selection.examples.length > this.config.maxExamples ||\n new Set(selection.examples.map((example) => example.feedbackId)).size !==\n selection.examples.length ||\n Buffer.byteLength(JSON.stringify(selection)) > this.config.maxBytes\n )\n throw new Error('Feedback eligibility changed');\n const offered = input.offered[0];\n if (!offered) {\n if (selection.examples.length)\n throw new Error('Feedback eligibility changed');\n return;\n }\n const work = async (\n context: import('./execution-contracts.js').HandlerContext,\n ) => {\n if (\n !(await this.config.authorize({\n db: context.db,\n scope: this.scope(),\n itemId: input.itemId,\n operation: 'retrieve',\n }))\n )\n throw new Error('Feedback unavailable');\n const examples: FeedbackExample[] = [];\n for (const expected of selection.examples) {\n const [row] = await this.rows(\n context.db,\n \"id=? AND kind IN ('interpretation','reviewer_routing')\",\n [expected.feedbackId],\n );\n const current = !row\n ? undefined\n : row.kind === 'reviewer_routing'\n ? await this.routingExample(row, input, context.db, true)\n : await this.example(row, input, context.db);\n if (\n !current ||\n current.digest !== expected.digest ||\n feedbackSimilarity(input.query, current.query) <\n this.config.minimumSimilarity\n )\n throw new Error('Feedback eligibility changed');\n examples.push(current);\n }\n if (\n !(await this.config.authorize({\n db: context.db,\n scope: this.scope(),\n itemId: input.itemId,\n operation: 'retrieve',\n }))\n )\n throw new Error('Feedback unavailable');\n return { ...selection, examples };\n };\n await this.receivingContext(input, executor, work);\n }\n private async support(\n ctx: FeedbackActionContext,\n ids: string[],\n /** Re-checking stored support (read/adopt): only integrity and revocation count. */\n lineage = false,\n ): Promise<Array<{ id: string; digest: string; query: string }>> {\n if (\n !Array.isArray(ids) ||\n ids.length < 2 ||\n ids.length > this.config.maxExamples ||\n new Set(ids).size !== ids.length\n )\n throw new Error('Insufficient rule evidence');\n const provenance = await this.provenance(ctx),\n origins = new Set<string>(),\n result: Array<{ id: string; digest: string; query: string }> = [];\n for (const id of [...ids].sort()) {\n text(id);\n const [row] = await this.rows(\n ctx.db,\n \"id=? AND kind IN ('interpretation','reviewer_routing')\",\n [id],\n );\n if (!row) throw new Error('Rule evidence unavailable');\n const data = object(row.data);\n // A reviewer routing choice supports a rule only when it chose this handler.\n const routing = row.kind === 'reviewer_routing';\n if (\n routing &&\n (data.choice !== 'handler' || typeof data.actionId !== 'string')\n )\n throw new Error('Rule evidence unavailable');\n await this.execution[feedbackActionTransaction](\n String(data.actionId),\n false,\n async (source) => {\n await this.authorize(source, 'retrieve');\n await this.provenance(source);\n if (origins.has(source.itemId))\n throw new Error('Independent rule evidence required');\n origins.add(source.itemId);\n const { digest: stored, ...body } = data;\n const generationMatch = routing\n ? source.origin === 'reviewer-selected' &&\n (lineage || source.settled)\n : source.origin !== 'reviewer-selected' &&\n provenance.generation &&\n data.judgment === 'correct' &&\n data.promptVersion === provenance.promptVersion &&\n data.configurationVersion === provenance.configurationVersion &&\n digest(data.model) === digest(provenance.model) &&\n digest(data.routing ?? { args: data.args }) ===\n digest(this.routing(source));\n if (\n digest(body) !== stored ||\n !generationMatch ||\n data.revision !== source.review.revision ||\n data.bindingHash !== source.review.bindingHash ||\n data.attemptId !== source.attemptId ||\n data.handlerId !== source.handlerId ||\n data.handlerVersion !== source.handlerVersion ||\n data.handlerId !== ctx.handlerId ||\n data.handlerVersion !== ctx.handlerVersion ||\n digest(data.args) !== digest(source.args) ||\n digest(this.routing(source)) !== digest(this.routing(ctx)) ||\n (await this.rows(ctx.db, 'supersedes_id=?', [id])).length\n )\n throw new Error('Rule evidence unavailable');\n result.push({\n id,\n digest: String(stored),\n query: String(data.query),\n });\n },\n ctx.db,\n undefined,\n undefined,\n !(lineage && routing),\n );\n }\n return result;\n }\n async suggest(input: SuggestRuleInput): Promise<RuleSuggestion> {\n digest(input);\n text(input.requestId);\n if (!this.config.policy) throw new Error('Rule policy owner unavailable');\n return this.execution[feedbackActionTransaction](\n input.actionId,\n true,\n async (ctx) => {\n this.checkBinding(input, ctx);\n await this.authorize(ctx, 'suggest');\n const key = `rule:${input.requestId}`;\n // A replay returns the stored suggestion; its support is re-checked\n // as lineage (integrity and revocation), never re-selected.\n const [stored] = await this.rows(\n ctx.db,\n 'item_id=? AND request_key=?',\n [ctx.itemId, key],\n );\n if (stored) {\n if (object(stored.data).requestHash !== digest(input))\n throw new Error('Rule request conflict');\n await this.rule(ctx, String(stored.id));\n return this.ruleDTO(stored);\n }\n const support = await this.support(ctx, input.supportingFeedbackIds);\n const terms = feedbackTerms(support[0].query).filter((term) =>\n support.every((example) =>\n feedbackTerms(example.query).includes(term),\n ),\n );\n if (!terms.length) throw new Error('No shared routing evidence');\n const rule: RoutingRule = {\n handlerId: ctx.handlerId,\n handlerVersion: ctx.handlerVersion,\n matchTerms: terms,\n ...this.routing(ctx),\n };\n const preview = await this.config.policy!.preview({\n db: ctx.db,\n scope: this.scope(),\n rule: structuredClone(rule),\n });\n text(preview.version);\n text(preview.preview, 4000);\n const body = {\n version: 1,\n actionId: input.actionId,\n revision: ctx.review.revision,\n bindingHash: ctx.review.bindingHash,\n rule,\n supportingFeedback: support.map(({ id, digest }) => ({ id, digest })),\n expectedPolicyVersion: preview.version,\n preview: preview.preview,\n reviewer: this.scope().actorId,\n requestHash: digest(input),\n };\n const row = await this.insert(ctx, key, 'rule_suggestion', {\n ...body,\n digest: digest(body),\n });\n await this.authorize(ctx, 'suggest');\n await this.rule(ctx, String(row.id));\n return this.ruleDTO(row);\n },\n );\n }\n private ruleDTO(row: Row): RuleSuggestion {\n const data = object(row.data);\n return {\n id: String(row.id),\n digest: String(data.digest),\n itemId: String(row.item_id),\n rule: data.rule as unknown as RoutingRule,\n supportingFeedback:\n data.supportingFeedback as RuleSuggestion['supportingFeedback'],\n expectedPolicyVersion: String(data.expectedPolicyVersion),\n preview: String(data.preview),\n automaticActionEligible: false,\n };\n }\n private async rule(ctx: FeedbackActionContext, id: string): Promise<Row> {\n const [row] = await this.rows(ctx.db, 'item_id=? AND id=? AND kind=?', [\n ctx.itemId,\n id,\n 'rule_suggestion',\n ]);\n if (!row) throw new Error('Rule unavailable');\n const data = object(row.data),\n { digest: stored, ...body } = data;\n if (\n digest(body) !== stored ||\n data.actionId !== ctx.review.actionId ||\n data.revision !== ctx.review.revision ||\n data.bindingHash !== ctx.review.bindingHash\n )\n throw new Error('Stale rule');\n const rule = object(data.rule);\n if (\n rule.handlerId !== ctx.handlerId ||\n rule.handlerVersion !== ctx.handlerVersion ||\n digest({\n args: rule.args,\n ...(rule.projection ? { projection: rule.projection } : {}),\n }) !== digest(this.routing(ctx))\n )\n throw new Error('Rule routing projection changed');\n const support = data.supportingFeedback as Array<{\n id: string;\n digest: string;\n }>;\n const current = await this.support(\n ctx,\n support.map((entry) => entry.id),\n true,\n );\n if (\n digest(current.map(({ id, digest }) => ({ id, digest }))) !==\n digest(support)\n )\n throw new Error('Rule evidence changed');\n return row;\n }\n async readRule(input: ReadRuleInput): Promise<RuleSuggestion> {\n return this.execution[feedbackActionTransaction](\n input.actionId,\n true,\n async (ctx) => {\n this.checkBinding(input, ctx);\n await this.authorize(ctx, 'suggest');\n const suggestion = this.ruleDTO(\n await this.rule(ctx, input.suggestionId),\n );\n if (!this.config.policy)\n throw new Error('Rule policy owner unavailable');\n const current = await this.config.policy.preview({\n db: ctx.db,\n scope: this.scope(),\n rule: structuredClone(suggestion.rule),\n });\n if (\n current.version !== suggestion.expectedPolicyVersion ||\n current.preview !== suggestion.preview\n )\n throw new Error('Rule policy changed');\n await this.authorize(ctx, 'suggest');\n await this.rule(ctx, input.suggestionId);\n return suggestion;\n },\n );\n }\n async adopt(input: AdoptRuleInput): Promise<RuleAdoption> {\n digest(input);\n text(input.requestId);\n if (!this.config.policy) throw new Error('Rule policy owner unavailable');\n return this.execution[feedbackActionTransaction](\n input.actionId,\n true,\n async (ctx) => {\n this.checkBinding(input, ctx);\n await this.authorize(ctx, 'adopt');\n const row = await this.rule(ctx, input.suggestionId),\n suggestion = this.ruleDTO(row);\n if (\n input.expectedDigest !== suggestion.digest ||\n input.expectedPolicyVersion !== suggestion.expectedPolicyVersion\n )\n throw new Error('Stale rule');\n const requestHash = digest(input),\n key = `adopt:${input.requestId}`;\n const [replay] = await this.rows(\n ctx.db,\n 'item_id=? AND request_key=?',\n [ctx.itemId, key],\n );\n if (replay) {\n const data = object(replay.data);\n if (\n data.requestHash !== requestHash ||\n data.reviewer !== this.scope().actorId\n )\n throw new Error('Rule request conflict');\n return {\n id: String(replay.id),\n policyVersion: String(data.policyVersion),\n auditId: String(data.auditId),\n automaticActionEligible: false,\n };\n }\n const current = await this.config.policy!.preview({\n db: ctx.db,\n scope: this.scope(),\n rule: structuredClone(suggestion.rule),\n });\n if (current.version !== input.expectedPolicyVersion)\n throw new Error('Policy version changed');\n const applied = await this.config.policy!.adopt({\n db: ctx.db,\n scope: this.scope(),\n rule: structuredClone(suggestion.rule),\n expectedVersion: input.expectedPolicyVersion,\n requestId: input.requestId,\n });\n text(applied.version);\n text(applied.auditId);\n if (applied.version === input.expectedPolicyVersion)\n throw new Error('Policy version did not advance');\n const verified = await this.config.policy!.preview({\n db: ctx.db,\n scope: this.scope(),\n rule: structuredClone(suggestion.rule),\n });\n if (verified.version !== applied.version)\n throw new Error('Policy adoption mismatch');\n const body = {\n version: 1,\n requestHash,\n suggestionId: suggestion.id,\n suggestionDigest: suggestion.digest,\n previousPolicyVersion: input.expectedPolicyVersion,\n policyVersion: applied.version,\n auditId: applied.auditId,\n reviewer: this.scope().actorId,\n automaticActionEligible: false,\n };\n const saved = await this.insert(ctx, key, 'rule_adoption', {\n ...body,\n digest: digest(body),\n });\n await this.authorize(ctx, 'adopt');\n await this.rule(ctx, input.suggestionId);\n return {\n id: String(saved.id),\n policyVersion: applied.version,\n auditId: applied.auditId,\n automaticActionEligible: false,\n };\n },\n );\n }\n}\n"],"mappings":";;;;;;;;;;AACO,IAAM,+BAAN,cAA2C,MAAM;CACtD,cAAc;EACZ,MAAM,sBAAsB;EAC5B,KAAK,OAAO;CACd;AACF;AAkCA,SAAS,OAAO,OAAqB;CACnC,MAAM,SAAS,OAAO,UAAU,WAAW,KAAK,MAAM,KAAK,IAAI;CAC/D,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAC/D,MAAM,IAAI,MAAM,sBAAsB;CACxC,OAAO;AACT;AACA,SAAS,KAAK,OAAgB,MAAM,KAA8B;CAChE,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,KAAK,MAAM,SAAS,KAC/D,MAAM,IAAI,MAAM,kBAAkB;AACtC;AACA,SAAS,WAAW,MAAgB;CAClC,OAAO;EACL,QAAQ,KAAK;EACb,UAAU,KAAK;EACf,OAAO,KAAK;EACZ,SAAS,KAAK;EACd,QAAQ,KAAK;EACb,OAAO,KAAK;EACZ,GAAI,OAAO,OAAO,MAAM,OAAO,IAAI,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;EAC5D,GAAI,OAAO,OAAO,MAAM,YAAY,IAChC,EAAE,YAAY,KAAK,WAAW,IAC9B,CAAC;CACP;AACF;AACO,SAAS,cAAc,OAAyB;CACrD,OAAO,CACL,GAAG,IAAI,IAAI,MAAM,YAAY,CAAA,CAAE,MAAM,iBAAiB,KAAK,CAAC,CAAC,CAC/D,CAAA,CAAE,KAAK;AACT;AACO,SAAS,mBAAmB,MAAc,OAAuB;CACtE,MAAM,IAAI,IAAI,IAAI,cAAc,IAAI,CAAC,GACnC,IAAI,IAAI,IAAI,cAAc,KAAK,CAAC;CAClC,MAAM,wBAAQ,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;CAClC,OAAO,MAAM,OACT,CAAC,GAAG,CAAC,CAAA,CAAE,QAAQ,UAAU,EAAE,IAAI,KAAK,CAAC,CAAA,CAAE,SAAS,MAAM,OACtD;AACN;AAWO,IAAM,wBAAN,MAA4B;CAKjC,YACmB,SACjB,WACA;EAFiB,KAAA,UAAA;EAGjB,IAAI,CAAC,QAAQ,aAAa,CAAC,QAAQ,UACjC,MAAM,IAAI,MAAM,yBAAyB;EAC3C,KAAK,SAAS,EAAE,GAAG,QAAQ,SAAS;EACpC,KAAK,YACH,aAAa,IAAI,uBAAuB,SAAS,QAAQ,SAAS;EACpE,KAAK,KAAK,OAAO,OAAO;EACxB,KAAA,MAAW,CAAC,OAAO,QAAQ;GACzB,CAAC,KAAK,OAAO,aAAa,EAAE;GAC5B,CAAC,KAAK,OAAO,SAAS,GAAI;GAC1B,CAAC,KAAK,OAAO,UAAU,GAAO;EAChC,GACE,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,KAAK,QAAQ,KACvD,MAAM,IAAI,MAAM,yBAAyB;EAC7C,IACE,CAAC,OAAO,SAAS,KAAK,OAAO,iBAAiB,KAC9C,KAAK,OAAO,oBAAoB,MAChC,KAAK,OAAO,oBAAoB,GAEhC,MAAM,IAAI,MAAM,6BAA6B;CACjD;CAtBmB;CALF;CACA;CACA,0BAAU,IAAI,IAAY;CACnC,gBAAgB;CAyBhB,sBAAsB;EAC5B,MAAM,EAAE,SAAS,aAAa,SAAS,UAAU,sBAC/C,KAAK;EACP,OAAO,oBAAO;GACZ;GACA;GACA;GACA;GACA;EACF,CAAC;CACH;CACQ,QACN,KAC0C;EAE1C,MAAM,eAAe,KAAK,QAAQ,UAAU;EAC5C,IAAI,iBAAiB,KAAA,GAAW,OAAO,EAAE,MAAM,IAAI,KAAK;EACxD,IAAI,CAAC,MAAM,QAAQ,YAAY,GAC7B,MAAM,IAAI,MAAM,4BAA4B;EAC9C,MAAM,uBAAO,IAAI,IAAY;EAC7B,KAAA,MAAW,eAAe,cAAc;GACtC,MAAM,QAAQ,OAAO,WAAW;GAChC,KAAK,MAAM,SAAS;GACpB,KAAK,MAAM,cAAc;GACzB,KAAK,MAAM,OAAO;GAClB,MAAM,MAAM,oBAAO,CAAC,MAAM,WAAW,MAAM,cAAc,CAAC;GAC1D,MAAM,UAAU,KAAK,QAAQ,UAAW,SAAS,MAC9CA,aACCA,SAAQ,OAAO,MAAM,aACrBA,SAAQ,YAAY,MAAM,cAC9B;GACA,IAAI,CAAC,WAAW,KAAK,IAAI,GAAG,GAC1B,MAAM,IAAI,MAAM,4BAA4B;GAC9C,KAAK,IAAI,GAAG;GACZ,MAAM,aAAa,OAAO,QAAQ,WAAW,UAAU;GACvD,IACE,CAAC,MAAM,QAAQ,MAAM,MAAM,KAC3B,CAAC,MAAM,OAAO,UACd,MAAM,OAAO,SAAS,MACtB,IAAI,IAAI,MAAM,MAAM,CAAA,CAAE,SAAS,MAAM,OAAO,QAE5C,MAAM,IAAI,MAAM,4BAA4B;GAC9C,KAAA,MAAW,SAAS,MAAM,QAAQ;IAChC,KAAK,KAAK;IACV,IACE;KAAC;KAAa;KAAa;IAAa,CAAA,CAAE,SAAS,KAAK,KACxD,CAAC,OAAO,OAAO,YAAY,KAAK,GAEhC,MAAM,IAAI,MAAM,4BAA4B;GAChD;EACF;EACA,MAAM,WAAW,aAAa,MAC3B,UACC,MAAM,cAAc,IAAI,aACxB,MAAM,mBAAmB,IAAI,cACjC;EACA,IAAI,CAAC,UAAU,OAAO,EAAE,MAAM,IAAI,KAAK;EACvC,MAAM,SAAS,CAAC,GAAG,SAAS,MAAM,CAAA,CAAE,KAAK;EACzC,MAAM,OAAO,OAAO,YAClB,OACG,QAAQ,UAAU,OAAO,OAAO,IAAI,MAAM,KAAK,CAAC,CAAA,CAChD,KAAK,UAAU,CAAC,OAAO,gBAAgB,IAAI,KAAK,MAAM,CAAC,CAAC,CAC7D;EACA,IAAI,CAAC,OAAO,KAAK,IAAI,CAAA,CAAE,QACrB,MAAM,IAAI,MAAM,4BAA4B;EAC9C,OAAO;GAAE;GAAM,YAAY;IAAE,SAAS,SAAS;IAAS;GAAO;EAAE;CACnE;CACQ,QAAQ;EACd,OAAO,KAAK,QAAQ;CACtB;CACA,MAAc,KACZ,IACA,OACA,SAAoB,CAAC,GACL;EAChB,MAAM,QAAQ,KAAK,MAAM;EACzB,QACE,MAAM,GAAG,MACP,mFAAmF,SACnF,MAAM,UACN,MAAM,qBACN,GAAG,MACL,EAAA,CACA;CACJ;CACA,MAAc,UACZ,KACA,WACA;EACA,IACE,CAAE,MAAM,KAAK,OAAO,UAAU;GAC5B,IAAI,IAAI;GACR,OAAO,KAAK,MAAM;GAClB,QAAQ,IAAI;GACZ;EACF,CAAC,GAED,MAAM,IAAI,MAAM,sBAAsB;CAC1C;CACQ,aAAa,OAAwB,KAA4B;EACvE,IACE,MAAM,WAAW,IAAI,UACrB,MAAM,aAAa,IAAI,OAAO,YAC9B,MAAM,qBAAqB,IAAI,OAAO,YACtC,MAAM,0BAA0B,IAAI,OAAO,iBAC3C,MAAM,gBAAgB,IAAI,OAAO,aAEjC,MAAM,IAAI,MAAM,wBAAwB;CAC5C;CACA,MAAc,OACZ,KACA,KACA,MACA,MACA,eAA8B,MAChB;EACd,MAAM,aAAa,KAAK,UAAU,IAAI;EACtC,IACE,OAAO,WAAW,UAAU,IAC5B,KAAK,IAAI,KAAK,OAAO,UAAU,IAAI,QAAQ,OAAO,QAAQ,GAE1D,MAAM,IAAI,MAAM,gBAAgB;EAClC,MAAM,QAAQ,KAAK,MAAM,GACvB,OAAO,KAAK,QAAQ,MAAM,qBAAK,IAAI,KAAK,EAAA,CAAG,YAAY;EACzD,MAAM,MAAM;GACV,IAAI,WAAW;GACf,MAAM,WAAW;GACjB,SAAS;GACT,YAAY;GACZ,YAAY;GACZ,WAAW,MAAM;GACjB,uBAAuB,MAAM;GAC7B,SAAS,IAAI;GACb,aAAa;GACb,eAAe;GACf;GACA,MAAM;EACR;EACA,QACE,MAAM,IAAI,GAAG,MACX,gCAAgC,OAAO,KAAK,GAAG,CAAA,CAAE,KAAK,GAAG,EAAC,YAAa,OAAO,KAC5E,GACF,CAAA,CACG,UAAU,GAAG,CAAA,CACb,KAAK,GAAG,EAAC,gBACZ,GAAG,OAAO,OAAO,GAAG,CACtB,EAAA,CACA,KAAK;CACT;CACQ,QAAQ,KAA2B;EACzC,OAAO;GACL,IAAI,OAAO,IAAI,EAAE;GACjB,QAAQ,OAAO,OAAO,IAAI,IAAI,CAAA,CAAE,MAAM;GACtC,MAAM,IAAI;EACZ;CACF;;CAEA,MAAc,WAAW,KAA4B;EACnD,MAAM,SAAS,OAAO,IAAI,OAAO,MAAM;EAEvC,MAAM,aAAa,OAAO,YAAY,OAAO,OAAO,SAAS,IAAI,KAAA;EACjE,MAAM,MAAM,aACR,OAAO,WAAW,MAAM,IACxB;GAAE,WAAW,IAAI;GAAW,cAAc,oBAAO,IAAI,MAAM;EAAE;EACjE,MAAM,aAAa,aAAa,OAAO,WAAW,UAAU,IAAI,KAAA;EAChE,IAAI,cAAc,YAAY,UAAU;GACtC,MAAM,YAAY,OAAO,WAAW,QAAQ;GAC5C,MAAM,MAAM,IAAI;GAChB,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK,KAAK,QAAQ,QAAQ,GAChD,MAAM,IAAI,MAAM,8BAA8B;GAChD,KAAK,QAAQ,IAAI,GAAG;GACpB,IAAI;IACF,MAAM,KAAK,gBACT;KACE,QAAQ,IAAI;KACZ,OAAO,OAAO,UAAU,KAAK;KAC7B,SAAS,WAAW;KACpB,eAAe,OAAO,WAAW,aAAa;KAC9C,sBAAsB,OAAO,WAAW,oBAAoB;KAC5D,OAAO,WAAW;KAClB,WAAW,CACT,OAAO,OAAO,WAAW,UAAU,CAAA,CAAE,QAAQ,GAC7C,GAAI,OAAO,WAAW,QAAQ,CAAA,CAAE,aAC5B,CAAC,OAAO,OAAO,WAAW,QAAQ,CAAA,CAAE,QAAQ,CAAC,IAC7C,CAAC,CACP;IACF,GACA,UAAU,WACV,IAAI,EACN;GACF,UAAE;IACA,KAAK,QAAQ,OAAO,GAAG;GACzB;EACF;EACA,MAAM,QAAQ,KAAK,MAAM;EACzB,MAAM,CAAC,WACL,MAAM,IAAI,GAAG,MACX,gIACA,MAAM,UACN,MAAM,qBACN,IAAI,QACJ,IAAI,SACN,EAAA,CACA;EACF,IAAI,CAAC,UAAU,OAAO,kBAAkB,IAAI,cAC1C,MAAM,IAAI,MAAM,6BAA6B;EAC/C,MAAM,eAAe,WAAW,OAAO,OAAO,IAAI,CAAC;EACnD,IAAI,oBAAO,YAAY,MAAM,IAAI,cAC/B,MAAM,IAAI,MAAM,2BAA2B;EAC7C,MAAM,UAAU,OAAO,aAAa,MAAM,CAAA,CAAE;EAC5C,IAAI,CAAC,MAAM,QAAQ,OAAO,GACxB,MAAM,IAAI,MAAM,iCAAiC;EACnD,MAAM,QAAQ,QACX,SAAS,UAAU;GAClB,MAAM,WAAW,OAAO,KAAK,CAAA,CAAE;GAC/B,OAAO,MAAM,QAAQ,QAAQ,IACzB,SAAS,KAAK,YAAY,OAAO,OAAO,OAAO,CAAA,CAAE,QAAQ,EAAE,CAAC,IAC5D,CAAC;EACP,CAAC,CAAA,CACA,KAAK,IAAI,CAAA,CACT,MAAM,GAAG,IAAI;EAChB,IAAI,CAAC,YACH,OAAO;GACL,YAAY;GACZ;GACA,WAAW,IAAI;GACf,UAAU,OAAO,IAAI,QAAQ,CAAA,CAAE;GAC/B,QAAQ;EACV;EACF,MAAM,QAAQ,OAAO,WAAW,UAAU;EAC1C,KAAA,MAAW,SAAS;GAAC;GAAY;GAAS;EAAS,GAAG,KAAK,MAAM,MAAM;EACvE,KAAK,WAAW,aAAa;EAC7B,KAAK,WAAW,oBAAoB;EAIpC,MAAM,cAAc,KAAK,eAAe,GAAG;EAC3C,OAAO;GACL,YAAY;GACZ;GACA,GAAI,cACA,EAAE,aAAa;IAAE,IAAI,YAAY;IAAI,QAAQ,YAAY;GAAO,EAAE,IAClE,CAAC;GACL,OAAO;IACL,UAAU,OAAO,MAAM,QAAQ;IAC/B,OAAO,OAAO,MAAM,KAAK;IACzB,SAAS,OAAO,MAAM,OAAO;GAC/B;GACA,eAAe,OAAO,WAAW,aAAa;GAC9C,sBAAsB,OAAO,WAAW,oBAAoB;GAC5D,WAAW,IAAI;GACf,UAAU,OAAO,IAAI,QAAQ,CAAA,CAAE;GAC/B,QAAQ;EACV;CACF;;CAEQ,UACN,IACA,QACA,MACA,KACA,UACiB;EACjB,OAAO;GACL,YAAY;GACZ,QAAQ;GACR,QAAQ,IAAI;GACZ,UAAU,IAAI,OAAO;GACrB,UAAU,IAAI,OAAO;GACrB,WAAW,IAAI;GACf,gBAAgB,IAAI;GACpB,UAAU,KAAK;GACf,OAAO,OAAO,KAAK,KAAK;GACxB,MAAM,OAAO,KAAK,IAAI;GACtB,OAAO,KAAK;GACZ,eAAe,OAAO,KAAK,aAAa;GACxC,sBAAsB,OAAO,KAAK,oBAAoB;GACtD,GAAI,WAAW,EAAE,aAAa,SAAS,IAAI,CAAC;EAC9C;CACF;;;;;CAKQ,eACN,KAC0D;EAC1D,MAAM,aAAa,OACjB,OAAO,OAAO,IAAI,OAAO,MAAM,CAAA,CAAE,SAAS,CAAA,CAAE,UAC9C;EACA,MAAM,oBAAoB,OACxB,OAAO,IAAI,QAAQ,CAAA,CAAE,aACvB,CAAA,CAAE;EACF,MAAM,WAAW,WAAW,sBACxB,OAAO,WAAW,mBAAmB,IACrC,KAAA;EACJ,IAAI,CAAC,qBAAqB,CAAC,UAAU,OAAO,KAAA;EAC5C,MAAM,OAAO,wBAAwB,iBAAiB;EACtD,IAAI,CAAC,YAAY,SAAS,OAAO,KAAK,MAAM,SAAS,WAAW,KAAK,QACnE,MAAM,IAAI,MAAM,gCAAgC;EAClD,OAAO;GAAE,IAAI,KAAK;GAAI,QAAQ,KAAK;GAAQ,MAAM,KAAK;EAAK;CAC7D;;CAEA,MAAM,oBACJ,UACA,IACA,YACe;EACf,MAAM,KAAK,UAAU,0BAAyB,CAC5C,UACA,OACA,OAAO,QAAQ;GACb,MAAM,KAAK,WAAW,GAAG;EAC3B,GACA,IACA,KAAA,GACA,UACF;CACF;CACA,MAAM,OAAO,OAAsD;EACjE,oBAAO,KAAK;EACZ,KAAK,MAAM,SAAS;EACpB,IACE,CAAC,CAAC,WAAW,WAAW,CAAA,CAAE,SAAS,MAAM,QAAQ,KAChD,MAAM,YAAY,KAAA,MAChB,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,SAAS,MAE/D,MAAM,IAAI,MAAM,kBAAkB;EACpC,MAAM,SAAS,gBAAgB,KAAK;EACpC,OAAO,KAAK,UAAU,0BAAyB,CAC7C,MAAM,UACN,MACA,OAAO,QAAQ;GACb,MAAM,KAAK,UAAU,KAAK,SAAS;GACnC,KAAK,aAAa,QAAQ,GAAG;GAC7B,MAAM,cAAc,oBAAO,MAAM,GAC/B,MAAM,YAAY,OAAO;GAC3B,MAAM,CAAC,UAAU,MAAM,KAAK,KAC1B,IAAI,IACJ,+BACA,CAAC,IAAI,QAAQ,GAAG,CAClB;GACA,IAAI,QAAQ;IACV,MAAM,OAAO,OAAO,OAAO,IAAI;IAC/B,IACE,KAAK,gBAAgB,eACrB,KAAK,aAAa,KAAK,MAAM,CAAA,CAAE,SAE/B,MAAM,IAAI,MAAM,2BAA2B;IAC7C,OAAO,KAAK,QAAQ,MAAM;GAC5B;GACA,IAAI,OAAO,cAAc;IACvB,MAAM,CAAC,OAAO,MAAM,KAAK,KACvB,IAAI,IACJ,iCACA;KAAC,IAAI;KAAQ,OAAO;KAAc;IAAgB,CACpD;IACA,IACE,CAAC,OACD,OAAO,IAAI,IAAI,CAAA,CAAE,aAAa,OAAO,aACpC,MAAM,KAAK,KAAK,IAAI,IAAI,mBAAmB,CAAC,IAAI,EAAE,CAAC,EAAA,CAAG,QAEvD,MAAM,IAAI,MAAM,gCAAgC;GACpD;GACA,MAAM,EAAE,YAAY,GAAG,eAAe,MAAM,KAAK,WAAW,GAAG,GAC7D,UAAU,KAAK,QAAQ,GAAG;GAI5B,IAAI,CAAC,cAAc,IAAI,WAAW,qBAChC,MAAM,IAAI,MAAM,sCAAsC;GACxD,MAAM,OAAO;IACX,SAAS;IACT;IACA,UAAU,KAAK,MAAM,CAAA,CAAE;IACvB,UAAU,IAAI,OAAO;IACrB,UAAU,IAAI,OAAO;IACrB,eAAe,IAAI,OAAO;IAC1B,aAAa,IAAI,OAAO;IACxB,WAAW,IAAI;IACf,gBAAgB,IAAI;IACpB,MAAM,IAAI;IACV,GAAI,QAAQ,aAAa,EAAE,QAAQ,IAAI,CAAC;IACxC,UAAU,OAAO;IACjB,SAAS,OAAO,WAAW;IAC3B,GAAG;GACL;GACA,MAAM,MAAM,MAAM,KAAK,OACrB,KACA,KACA,kBACA;IAAE,GAAG;IAAM,QAAQ,oBAAO,IAAI;GAAE,GAChC,OAAO,gBAAgB,IACzB;GAKA,MAAM,WAAW,KAAK,eAAe,GAAG;GACxC,IAAI,UAAU;IACZ,MAAM,OAAO,OAAO,IAAI,IAAI;IAC5B,MAAM,YAAY;KAChB,SAAS,KAAK,OAAO;KACrB,qBAAqB,KAAK,oBAAoB;KAC9C,UAAU,CACR,KAAK,UACH,OAAO,IAAI,EAAE,GACb,OAAO,KAAK,MAAM,GAClB,MACA,KACA,QACF,CACF;IACF;IACA,IACE,OAAO,WAAW,KAAK,UAAU,SAAS,CAAC,IAC3C,KAAK,IAAI,KAAK,OAAO,UAAU,IAAI,QAAQ,OAAO,QAAQ,GAE1D,MAAM,IAAI,MAAM,+CAA+C;GACnE;GACA,MAAM,KAAK,UAAU,KAAK,SAAS;GACnC,IAAI,oBAAO,OAAO,MAAM,oBAAO,KAAK,QAAQ,GAAG,CAAC,GAC9C,MAAM,IAAI,MAAM,4BAA4B;GAC9C,OAAO,KAAK,QAAQ,GAAG;EACzB,CACF;CACF;;CAEA,MAAM,QAAQ,OAAuD;EACnE,oBAAO,KAAK;EACZ,KAAK,MAAM,OAAO;EAClB,IAAI,CAAC,CAAC,mBAAmB,oBAAoB,CAAA,CAAE,SAAS,MAAM,IAAI,GAChE,MAAM,IAAI,MAAM,uBAAuB;EACzC,OAAO,KAAK,UAAU,0BAAyB,CAC7C,MAAM,UACN,MACA,OAAO,QAAQ;GACb,MAAM,KAAK,UAAU,KAAK,SAAS;GACnC,KAAK,aAAa,OAAO,GAAG;GAC5B,MAAM,QAAQ,KAAK,MAAM;GACzB,MAAM,QACJ,MAAM,SAAS,oBACX,4BACA;GACN,MAAM,CAAC,UACL,MAAM,IAAI,GAAG,MACX,iBAAiB,MAAK,wFACtB,MAAM,UACN,MAAM,qBACN,IAAI,QACJ,MAAM,UACN,MAAM,OACR,EAAA,CACA;GACF,IAAI,CAAC,SAAS,MAAM,iBAAiB,IAAI,OAAO,aAC9C,MAAM,IAAI,MAAM,4BAA4B;GAC9C,MAAM,QACJ,MAAM,SAAS,oBAAoB,MAAM,WAAW,MAAM;GAC5D,IACE,MAAM,SAAS,wBACf,CAAC;IAAC;IAAa;IAAU;GAAiB,CAAA,CAAE,SAAS,OAAO,KAAK,CAAC,GAElE,MAAM,IAAI,MAAM,yBAAyB;GAC3C,MAAM,OAAO;IACX,SAAS;IACT,SAAS,MAAM;IACf,UAAU,MAAM;IAChB,UAAU,IAAI,OAAO;IACrB,UACE,MAAM,SAAS,oBACX,OAAO,MAAM,IAAI,CAAA,CAAE,WACnB;IACN,cACE,MAAM,SAAS,oBACV,OAAO,MAAM,IAAI,CAAA,CAAE,QAAQ,WAC5B;IACN,cACE,MAAM,SAAS,qBACf,OAAO,MAAM,IAAI,CAAA,CAAE,iBAAiB;IACtC,YAAY,KAAK,MAAM,CAAA,CAAE;IACzB,aAAa,OAAO,MAAM,IAAI,CAAA,CAAE,eAAe;IAC/C,QAAQ;IACR,YAAY,MAAM,KAAK,WAAW,GAAG;GACvC;GACA,MAAM,MAAM,SAAS,MAAM,KAAI,GAAI,MAAM,QAAO,GAAI,OAAO,KAAK;GAChE,MAAM,CAAC,YAAY,MAAM,KAAK,KAC5B,IAAI,IACJ,+BACA,CAAC,IAAI,QAAQ,GAAG,CAClB;GACA,IAAI,UAAU,OAAO,KAAK,QAAQ,QAAQ;GAC1C,MAAM,MAAM,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM,MAAM;IAClD,GAAG;IACH,QAAQ,oBAAO,IAAI;GACrB,CAAC;GACD,MAAM,KAAK,UAAU,KAAK,SAAS;GACnC,OAAO,KAAK,QAAQ,GAAG;EACzB,CACF;CACF;CACA,MAAc,QACZ,KACA,OACA,UACsC;EACtC,IAAI,EAAE,KAAK,gBAAgB,KAAK,OAAO,SAAS,OAAO,KAAA;EACvD,IAAI;GACF,MAAM,YAAY,OAAO,IAAI,IAAI;GAGjC,IACE,OAAO,UAAU,aAAa,YAC9B,CAAC,kEAAkE,KACjE,UAAU,QACZ,GAEA,OAAO,KAAA;GACT,OAAO,MAAM,KAAK,UAAU,0BAAyB,CACnD,UAAU,UACV,OACA,OAAO,QAAQ;IACb,MAAM,KAAK,UAAU,KAAK,UAAU;IACpC,MAAM,KAAK,WAAW,GAAG;IACzB,MAAM,WAAW,KAAK,eAAe,GAAG;IACxC,MAAM,CAAC,WAAW,MAAM,KAAK,KAC3B,IAAI,IACJ,yPACA,CAAC,IAAI,IAAI,gBAAgB,CAC3B;IACA,IAAI,CAAC,SAAS,OAAO,KAAA;IACrB,MAAM,OAAO,OAAO,QAAQ,IAAI;IAChC,MAAM,EAAE,QAAQ,QAAQ,GAAG,SAAS;IACpC,IAAI,oBAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,MAAM,oBAAoB;IACjE,IAGE,IAAI,WAAW,uBACf,KAAK,aAAa,IAAI,OAAO,YAC7B,KAAK,gBAAgB,IAAI,OAAO,eAChC,KAAK,cAAc,IAAI,aACvB,KAAK,kBAAkB,MAAM,iBAC7B,KAAK,yBAAyB,MAAM,wBACpC,oBAAO,KAAK,KAAK,MAAM,oBAAO,MAAM,KAAK,GAEzC,OAAO,KAAA;IAET,MAAM,YAAY,KAAK,cACnB,OAAO,KAAK,WAAW,IACvB,KAAA;IACJ,IACE,CAAC,CAAC,cAAc,CAAC,CAAC,YACjB,cACE,UAAU,OAAO,UAAU,MAC1B,UAAU,WAAW,UAAU,SAEnC,OAAO,KAAA;IACT,MAAM,UAAU,MAAM,QAAQ,MAC3B,UACC,MAAM,QAAQ,OAAO,KAAK,aAC1B,MAAM,QAAQ,YAAY,KAAK,cACnC;IACA,IAAI,CAAC,SAAS,OAAO,KAAA;IACrB,MAAM,OAAO,OAAO,KAAK,IAAI;IAC7B,KAAA,MAAW,CAAC,OAAOC,eAAc,OAAO,QACtC,QAAQ,QAAQ,UAClB,GACE,IACEA,WAAU,SAAS,eACnB,OAAO,OAAO,MAAM,KAAK,KACzB,CAAC,QAAQ,WAAW,MACjBC,eACCA,WAAU,OAAO,KAAK,UACtBA,WAAU,UAAUD,WAAU,KAClC,GAEA,OAAO,KAAA;IAEX,OAAO,KAAK,UACV,OAAO,QAAQ,EAAE,GACjB,OAAO,MAAM,GACb,MACA,KACA,QACF;GACF,GACA,UACA,MAAM,aAAa,CAAC,MAAM,MAAM,QAAQ,CAC1C;EACF,QAAQ;GACN;EACF;CACF;;CAEA,MAAc,eACZ,KACA,OACA,UAEA,UAAU,OAC4B;EACtC,IAAI,EAAE,KAAK,gBAAgB,KAAK,OAAO,SAAS,OAAO,KAAA;EACvD,IAAI;GACF,MAAM,OAAO,OAAO,IAAI,IAAI;GAC5B,MAAM,EAAE,QAAQ,QAAQ,GAAG,SAAS;GACpC,MAAM,SAAS,OAAO,IAAI,OAAO;GACjC,MAAM,OACJ;GAEF,IAAI,OAAO,WAAW,YAAY,oBAAO,IAAI,MAAM,QACjD,OAAO,KAAA;GACT,MAAM,SAAS,KAAK,WAAW;GAC/B,IACE,WACC,OAAO,KAAK,aAAa,YAAY,CAAC,KAAK,KAAK,KAAK,QAAQ,IAE9D,OAAO,KAAA;GACT,MAAM,UAAU,SACZ,MAAM,QAAQ,MACX,UACC,MAAM,QAAQ,OAAO,KAAK,aAC1B,MAAM,QAAQ,YAAY,KAAK,cACnC,IACA,KAAA;GACJ,IAAI,UAAU,CAAC,SAAS,OAAO,KAAA;GAC/B,MAAM,OAAO,SAAS,OAAO,KAAK,IAAI,IAAI,CAAC;GAC3C,IAAI;SACF,MAAW,CAAC,OAAO,cAAc,OAAO,QACtC,QAAQ,QAAQ,UAClB,GACE,IACE,UAAU,SAAS,eACnB,OAAO,OAAO,MAAM,KAAK,KACzB,CAAC,QAAQ,WAAW,MACjB,cACC,UAAU,OAAO,KAAK,UACtB,UAAU,UAAU,UAAU,KAClC,GAEA,OAAO,KAAA;GAAA;GACb,MAAM,YAAY,MAAM,aAAa,CAAC,MAAM,MAAM,QAAQ;GAC1D,MAAM,QAAQ,KAAK,MAAM;GACzB,MAAM,UAAU,OAAO,OAA0B;IAC/C,IACE,CAAE,MAAM,KAAK,OAAO,UAAU;KAC5B;KACA;KACA;KACA,WAAW;IACb,CAAC,GAED,MAAM,IAAI,MAAM,sBAAsB;IACxC,MAAM,CAAC,YACL,MAAM,GAAG,MACP,2HACA,MAAM,UACN,MAAM,qBACN,QACA,KAAK,SACP,EAAA,CACA;IACF,IAAI,CAAC,WAAW,QAAQ,kBAAkB,KAAK,eAC7C,MAAM,IAAI,MAAM,6BAA6B;IAC/C,MAAM,WAAW,KAAK;IACtB,IAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,CAAC,SAAS,QACxC,MAAM,IAAI,MAAM,6BAA6B;IAC/C,KAAA,MAAW,UAAU,UAAU;KAC7B,MAAM,SAAS,OAAO,MAAM;KAC5B,MAAM,CAACE,SACL,MAAM,GAAG,MACP,qIACA,MAAM,UACN,MAAM,qBACN,QACA,OAAO,EACT,EAAA,CACA;KACF,IAAI,CAACA,QAAOA,KAAI,iBAAiB,OAAO,MACtC,MAAM,IAAI,MAAM,6BAA6B;IACjD;IACA,KAAK,MAAM,KAAK,KAAK,IAAI,mBAAmB,CAAC,IAAI,EAAE,CAAC,EAAA,CAAG,QACrD,MAAM,IAAI,MAAM,qBAAqB;GACzC;GACA,MAAM,UAA2B;IAC/B,YAAY,OAAO,IAAI,EAAE;IACzB,QAAQ;IACR;IACA,UAAU,SAAS,OAAO,KAAK,QAAQ,IAAI;IAC3C,UAAU,SAAS,OAAO,KAAK,QAAQ,IAAI;IAC3C,WAAW,SAAS,OAAO,KAAK,SAAS,IAAI;IAC7C,gBAAgB,SAAS,OAAO,KAAK,cAAc,IAAI;IACvD,UAAU;IACV,OAAO,OAAO,KAAK,KAAK;IACxB;IACA,MAAM;IACN,SAAS;KACP,QAAQ,SAAS,YAAY;KAC7B,QAAQ,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;IAC1D;GACF;GACA,IAAI,QAGF,OAAO,MAAM,KAAK,UAAU,0BAAyB,CACnD,OAAO,KAAK,QAAQ,GACpB,OACA,OAAO,QAAQ;IAIb,IACE,IAAI,WAAW,UACf,IAAI,WAAW,uBAGd,CAAC,WAAW,CAAC,IAAI,WAClB,KAAK,aAAa,IAAI,OAAO,YAC7B,KAAK,gBAAgB,IAAI,OAAO,eAChC,KAAK,cAAc,IAAI,aACvB,KAAK,cAAc,IAAI,aACvB,KAAK,mBAAmB,IAAI,kBAC5B,oBAAO,IAAI,MAAM,oBAAO,IAAI,IAAI,GAEhC,OAAO,KAAA;IACT,MAAM,QAAQ,IAAI,EAAE;IACpB,OAAO;GACT,GACA,UACA,WACA,KAAA,GACA,CAAC,OACH;GAGF,KAAA,MAAW,SAAS,MAAM,SACxB,IAAI;IACF,OAAO,MAAM,KAAK,UAAU,yBAAwB,CAClD,UACA,QACA,MAAM,QAAQ,IACd,MAAM,QAAQ,SACd,OAAO,YAAY;KACjB,IACE,UAAU,MACP,aAAa,CAAC,QAAQ,OAAO,UAAU,SAAS,QAAQ,CAC3D,GAEA,MAAM,IAAI,MAAM,sCAAsC;KACxD,MAAM,QAAQ,QAAQ,EAAE;KACxB,OAAO;IACT,GACA,OAAO,YAAY;KACjB,IACE,UAAU,MACP,aAAa,CAAC,QAAQ,OAAO,UAAU,SAAS,QAAQ,CAC3D,GAEA,MAAM,IAAI,MAAM,sCAAsC;KACxD,MAAM,QAAQ,QAAQ,EAAE;IAC1B,CACF;GACF,QAAQ,CAER;GAEF;EACF,QAAQ;GACN;EACF;CACF;CACQ,iBACN,OACA,UACA,MAG4B;EAC5B,IAAI,QAAQ,KAAK,OAAO;EACxB,IAAI;EACJ,MAAM,WAAW,OACf,YACG;GACH,KACG,MAAM,aAAa,CAAC,MAAM,MAAM,QAAQ,EAAA,CAAG,MACzC,aAAa,CAAC,QAAQ,OAAO,UAAU,SAAS,QAAQ,CAC3D,GAEA,MAAM,IAAI,MAAM,gCAAgC;GAClD,QAAQ,KAAK,IAAI,OAAO,QAAQ,OAAO,QAAQ;GAC/C,IAAI,UAAU,KAAA,KAAa,QAAQ,OACjC,MAAM,IAAI,MAAM,gBAAgB;EACpC;EACA,MAAM,SACJ,OACA,OAC+B;GAC/B,MAAM,QAAQ,MAAM,QAAQ;GAC5B,OAAO,KAAK,UAAU,yBAAwB,CAC5C,IACA,MAAM,QACN,MAAM,QAAQ,IACd,MAAM,QAAQ,SACd,OAAO,YAAY;IACjB,MAAM,SAAS,OAAO;IACtB,MAAM,YACJ,QAAQ,IAAI,MAAM,QAAQ,SACtB,MAAM,MAAM,QAAQ,GAAG,QAAQ,EAAE,IACjC,MAAM,KAAK,OAAO;IACxB,QAAQ,OAAO,WAAW,KAAK,UAAU,SAAS,CAAC;IACnD,IAAI,QAAQ,OAAO,MAAM,IAAI,MAAM,gBAAgB;IACnD,OAAO;GACT,GACA,QACF;EACF;EACA,OAAO,MAAM,GAAG,QAAQ;CAC1B;CACA,MAAM,SACJ,OACA,UAC4B;EAC5B,KAAK,MAAM,OAAO,IAAI;EAEtB,IAAI,CADY,MAAM,QAAQ,IAE5B,OAAO;GACL,SAAS,KAAK,OAAO;GACrB,qBAAqB,KAAK,oBAAoB;GAC9C,UAAU,CAAC;EACb;EACF,MAAM,OAAO,OACX,YACG;GACH,MAAM,YAAY,OAAO,UAA+B;IACtD,IACE,CAAE,MAAM,KAAK,OAAO,UAAU;KAC5B,IAAI,QAAQ;KACZ,OAAO,KAAK,MAAM;KAClB,QAAQ,MAAM;KACd,WAAW;IACb,CAAC,GACD;KACA,IAAI,UAAU,WAAW,MAAM,IAAI,6BAA6B;KAChE,MAAM,IAAI,MAAM,sBAAsB;IACxC;GACF;GACA,MAAM,UAAU,SAAS;GACzB,MAAM,QAAQ,KAAK,MAAM;GACzB,MAAM,QACJ,MAAM,QAAQ,GAAG,MACf,qJACA,MAAM,UACN,MAAM,qBACN,KAAK,OAAO,OACd,EAAA,CACA;GACF,MAAM,SAA6D,CAAC;GACpE,KAAA,MAAW,OAAO,MAAM;IACtB,MAAM,UACJ,IAAI,SAAS,qBACT,MAAM,KAAK,eAAe,KAAK,OAAO,QAAQ,EAAE,IAChD,MAAM,KAAK,QAAQ,KAAK,OAAO,QAAQ,EAAE;IAC/C,IAAI,CAAC,SAAS;IACd,MAAM,QAAQ,mBAAmB,MAAM,OAAO,QAAQ,KAAK;IAC3D,IAAI,SAAS,KAAK,OAAO,mBACvB,OAAO,KAAK;KAAE;KAAS;IAAM,CAAC;GAClC;GACA,OAAO,MACJ,GAAG,MACF,EAAE,QAAQ,EAAE,SACZ,EAAE,QAAQ,WAAW,cAAc,EAAE,QAAQ,UAAU,CAC3D;GACA,MAAM,YAAY;IAChB,SAAS,KAAK,OAAO;IACrB,qBAAqB,KAAK,oBAAoB;IAC9C,UAAU,OACP,MAAM,GAAG,KAAK,OAAO,WAAW,CAAA,CAChC,KAAK,UAAU,MAAM,OAAO;GACjC;GACA,MAAM,UAAU,OAAO;GACvB,OAAO;EACT;EACA,OAAO,KAAK,iBAAiB,OAAO,UAAU,IAAI;CACpD;CACA,MAAM,gBACJ,OACA,WACA,UACe;EACf,IACE,UAAU,YAAY,KAAK,OAAO,WAClC,UAAU,wBAAwB,KAAK,oBAAoB,KAC3D,CAAC,MAAM,QAAQ,UAAU,QAAQ,KACjC,UAAU,SAAS,SAAS,KAAK,OAAO,eACxC,IAAI,IAAI,UAAU,SAAS,KAAK,YAAY,QAAQ,UAAU,CAAC,CAAA,CAAE,SAC/D,UAAU,SAAS,UACrB,OAAO,WAAW,KAAK,UAAU,SAAS,CAAC,IAAI,KAAK,OAAO,UAE3D,MAAM,IAAI,MAAM,8BAA8B;EAEhD,IAAI,CADY,MAAM,QAAQ,IAChB;GACZ,IAAI,UAAU,SAAS,QACrB,MAAM,IAAI,MAAM,8BAA8B;GAChD;EACF;EACA,MAAM,OAAO,OACX,YACG;GACH,IACE,CAAE,MAAM,KAAK,OAAO,UAAU;IAC5B,IAAI,QAAQ;IACZ,OAAO,KAAK,MAAM;IAClB,QAAQ,MAAM;IACd,WAAW;GACb,CAAC,GAED,MAAM,IAAI,MAAM,sBAAsB;GACxC,MAAM,WAA8B,CAAC;GACrC,KAAA,MAAW,YAAY,UAAU,UAAU;IACzC,MAAM,CAAC,OAAO,MAAM,KAAK,KACvB,QAAQ,IACR,0DACA,CAAC,SAAS,UAAU,CACtB;IACA,MAAM,UAAU,CAAC,MACb,KAAA,IACA,IAAI,SAAS,qBACX,MAAM,KAAK,eAAe,KAAK,OAAO,QAAQ,IAAI,IAAI,IACtD,MAAM,KAAK,QAAQ,KAAK,OAAO,QAAQ,EAAE;IAC/C,IACE,CAAC,WACD,QAAQ,WAAW,SAAS,UAC5B,mBAAmB,MAAM,OAAO,QAAQ,KAAK,IAC3C,KAAK,OAAO,mBAEd,MAAM,IAAI,MAAM,8BAA8B;IAChD,SAAS,KAAK,OAAO;GACvB;GACA,IACE,CAAE,MAAM,KAAK,OAAO,UAAU;IAC5B,IAAI,QAAQ;IACZ,OAAO,KAAK,MAAM;IAClB,QAAQ,MAAM;IACd,WAAW;GACb,CAAC,GAED,MAAM,IAAI,MAAM,sBAAsB;GACxC,OAAO;IAAE,GAAG;IAAW;GAAS;EAClC;EACA,MAAM,KAAK,iBAAiB,OAAO,UAAU,IAAI;CACnD;CACA,MAAc,QACZ,KACA,KAEA,UAAU,OACqD;EAC/D,IACE,CAAC,MAAM,QAAQ,GAAG,KAClB,IAAI,SAAS,KACb,IAAI,SAAS,KAAK,OAAO,eACzB,IAAI,IAAI,GAAG,CAAA,CAAE,SAAS,IAAI,QAE1B,MAAM,IAAI,MAAM,4BAA4B;EAC9C,MAAM,aAAa,MAAM,KAAK,WAAW,GAAG,GAC1C,0BAAU,IAAI,IAAY,GAC1B,SAA+D,CAAC;EAClE,KAAA,MAAW,MAAM,CAAC,GAAG,GAAG,CAAA,CAAE,KAAK,GAAG;GAChC,KAAK,EAAE;GACP,MAAM,CAAC,OAAO,MAAM,KAAK,KACvB,IAAI,IACJ,0DACA,CAAC,EAAE,CACL;GACA,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,2BAA2B;GACrD,MAAM,OAAO,OAAO,IAAI,IAAI;GAE5B,MAAM,UAAU,IAAI,SAAS;GAC7B,IACE,YACC,KAAK,WAAW,aAAa,OAAO,KAAK,aAAa,WAEvD,MAAM,IAAI,MAAM,2BAA2B;GAC7C,MAAM,KAAK,UAAU,0BAAyB,CAC5C,OAAO,KAAK,QAAQ,GACpB,OACA,OAAO,WAAW;IAChB,MAAM,KAAK,UAAU,QAAQ,UAAU;IACvC,MAAM,KAAK,WAAW,MAAM;IAC5B,IAAI,QAAQ,IAAI,OAAO,MAAM,GAC3B,MAAM,IAAI,MAAM,oCAAoC;IACtD,QAAQ,IAAI,OAAO,MAAM;IACzB,MAAM,EAAE,QAAQ,QAAQ,GAAG,SAAS;IACpC,MAAM,kBAAkB,UACpB,OAAO,WAAW,wBACjB,WAAW,OAAO,WACnB,OAAO,WAAW,uBAClB,WAAW,cACX,KAAK,aAAa,aAClB,KAAK,kBAAkB,WAAW,iBAClC,KAAK,yBAAyB,WAAW,wBACzC,oBAAO,KAAK,KAAK,MAAM,oBAAO,WAAW,KAAK,KAC9C,oBAAO,KAAK,WAAW,EAAE,MAAM,KAAK,KAAK,CAAC,MACxC,oBAAO,KAAK,QAAQ,MAAM,CAAC;IACjC,IACE,oBAAO,IAAI,MAAM,UACjB,CAAC,mBACD,KAAK,aAAa,OAAO,OAAO,YAChC,KAAK,gBAAgB,OAAO,OAAO,eACnC,KAAK,cAAc,OAAO,aAC1B,KAAK,cAAc,OAAO,aAC1B,KAAK,mBAAmB,OAAO,kBAC/B,KAAK,cAAc,IAAI,aACvB,KAAK,mBAAmB,IAAI,kBAC5B,oBAAO,KAAK,IAAI,MAAM,oBAAO,OAAO,IAAI,KACxC,oBAAO,KAAK,QAAQ,MAAM,CAAC,MAAM,oBAAO,KAAK,QAAQ,GAAG,CAAC,MACxD,MAAM,KAAK,KAAK,IAAI,IAAI,mBAAmB,CAAC,EAAE,CAAC,EAAA,CAAG,QAEnD,MAAM,IAAI,MAAM,2BAA2B;IAC7C,OAAO,KAAK;KACV;KACA,QAAQ,OAAO,MAAM;KACrB,OAAO,OAAO,KAAK,KAAK;IAC1B,CAAC;GACH,GACA,IAAI,IACJ,KAAA,GACA,KAAA,GACA,EAAE,WAAW,QACf;EACF;EACA,OAAO;CACT;CACA,MAAM,QAAQ,OAAkD;EAC9D,oBAAO,KAAK;EACZ,KAAK,MAAM,SAAS;EACpB,IAAI,CAAC,KAAK,OAAO,QAAQ,MAAM,IAAI,MAAM,+BAA+B;EACxE,OAAO,KAAK,UAAU,0BAAyB,CAC7C,MAAM,UACN,MACA,OAAO,QAAQ;GACb,KAAK,aAAa,OAAO,GAAG;GAC5B,MAAM,KAAK,UAAU,KAAK,SAAS;GACnC,MAAM,MAAM,QAAQ,MAAM;GAG1B,MAAM,CAAC,UAAU,MAAM,KAAK,KAC1B,IAAI,IACJ,+BACA,CAAC,IAAI,QAAQ,GAAG,CAClB;GACA,IAAI,QAAQ;IACV,IAAI,OAAO,OAAO,IAAI,CAAA,CAAE,gBAAgB,oBAAO,KAAK,GAClD,MAAM,IAAI,MAAM,uBAAuB;IACzC,MAAM,KAAK,KAAK,KAAK,OAAO,OAAO,EAAE,CAAC;IACtC,OAAO,KAAK,QAAQ,MAAM;GAC5B;GACA,MAAM,UAAU,MAAM,KAAK,QAAQ,KAAK,MAAM,qBAAqB;GACnE,MAAM,QAAQ,cAAc,QAAQ,EAAC,CAAE,KAAK,CAAA,CAAE,QAAQ,SACpD,QAAQ,OAAO,YACb,cAAc,QAAQ,KAAK,CAAA,CAAE,SAAS,IAAI,CAC5C,CACF;GACA,IAAI,CAAC,MAAM,QAAQ,MAAM,IAAI,MAAM,4BAA4B;GAC/D,MAAM,OAAoB;IACxB,WAAW,IAAI;IACf,gBAAgB,IAAI;IACpB,YAAY;IACZ,GAAG,KAAK,QAAQ,GAAG;GACrB;GACA,MAAM,UAAU,MAAM,KAAK,OAAO,OAAQ,QAAQ;IAChD,IAAI,IAAI;IACR,OAAO,KAAK,MAAM;IAClB,MAAM,gBAAgB,IAAI;GAC5B,CAAC;GACD,KAAK,QAAQ,OAAO;GACpB,KAAK,QAAQ,SAAS,GAAI;GAC1B,MAAM,OAAO;IACX,SAAS;IACT,UAAU,MAAM;IAChB,UAAU,IAAI,OAAO;IACrB,aAAa,IAAI,OAAO;IACxB;IACA,oBAAoB,QAAQ,KAAK,EAAE,IAAI,QAAAC,eAAc;KAAE;KAAI,QAAAA;IAAO,EAAE;IACpE,uBAAuB,QAAQ;IAC/B,SAAS,QAAQ;IACjB,UAAU,KAAK,MAAM,CAAA,CAAE;IACvB,aAAa,oBAAO,KAAK;GAC3B;GACA,MAAM,MAAM,MAAM,KAAK,OAAO,KAAK,KAAK,mBAAmB;IACzD,GAAG;IACH,QAAQ,oBAAO,IAAI;GACrB,CAAC;GACD,MAAM,KAAK,UAAU,KAAK,SAAS;GACnC,MAAM,KAAK,KAAK,KAAK,OAAO,IAAI,EAAE,CAAC;GACnC,OAAO,KAAK,QAAQ,GAAG;EACzB,CACF;CACF;CACQ,QAAQ,KAA0B;EACxC,MAAM,OAAO,OAAO,IAAI,IAAI;EAC5B,OAAO;GACL,IAAI,OAAO,IAAI,EAAE;GACjB,QAAQ,OAAO,KAAK,MAAM;GAC1B,QAAQ,OAAO,IAAI,OAAO;GAC1B,MAAM,KAAK;GACX,oBACE,KAAK;GACP,uBAAuB,OAAO,KAAK,qBAAqB;GACxD,SAAS,OAAO,KAAK,OAAO;GAC5B,yBAAyB;EAC3B;CACF;CACA,MAAc,KAAK,KAA4B,IAA0B;EACvE,MAAM,CAAC,OAAO,MAAM,KAAK,KAAK,IAAI,IAAI,iCAAiC;GACrE,IAAI;GACJ;GACA;EACF,CAAC;EACD,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,kBAAkB;EAC5C,MAAM,OAAO,OAAO,IAAI,IAAI,GAC1B,EAAE,QAAQ,QAAQ,GAAG,SAAS;EAChC,IACE,oBAAO,IAAI,MAAM,UACjB,KAAK,aAAa,IAAI,OAAO,YAC7B,KAAK,aAAa,IAAI,OAAO,YAC7B,KAAK,gBAAgB,IAAI,OAAO,aAEhC,MAAM,IAAI,MAAM,YAAY;EAC9B,MAAM,OAAO,OAAO,KAAK,IAAI;EAC7B,IACE,KAAK,cAAc,IAAI,aACvB,KAAK,mBAAmB,IAAI,kBAC5B,oBAAO;GACL,MAAM,KAAK;GACX,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;EAC3D,CAAC,MAAM,oBAAO,KAAK,QAAQ,GAAG,CAAC,GAE/B,MAAM,IAAI,MAAM,iCAAiC;EACnD,MAAM,UAAU,KAAK;EASrB,IACE,qBAAO,MANa,KAAK,QACzB,KACA,QAAQ,KAAK,UAAU,MAAM,EAAE,GAC/B,IACF,EAAA,CAEiB,KAAK,EAAE,IAAAC,KAAI,QAAAD,eAAc;GAAE,IAAAC;GAAI,QAAAD;EAAO,EAAE,CAAC,MACxD,oBAAO,OAAO,GAEd,MAAM,IAAI,MAAM,uBAAuB;EACzC,OAAO;CACT;CACA,MAAM,SAAS,OAA+C;EAC5D,OAAO,KAAK,UAAU,0BAAyB,CAC7C,MAAM,UACN,MACA,OAAO,QAAQ;GACb,KAAK,aAAa,OAAO,GAAG;GAC5B,MAAM,KAAK,UAAU,KAAK,SAAS;GACnC,MAAM,aAAa,KAAK,QACtB,MAAM,KAAK,KAAK,KAAK,MAAM,YAAY,CACzC;GACA,IAAI,CAAC,KAAK,OAAO,QACf,MAAM,IAAI,MAAM,+BAA+B;GACjD,MAAM,UAAU,MAAM,KAAK,OAAO,OAAO,QAAQ;IAC/C,IAAI,IAAI;IACR,OAAO,KAAK,MAAM;IAClB,MAAM,gBAAgB,WAAW,IAAI;GACvC,CAAC;GACD,IACE,QAAQ,YAAY,WAAW,yBAC/B,QAAQ,YAAY,WAAW,SAE/B,MAAM,IAAI,MAAM,qBAAqB;GACvC,MAAM,KAAK,UAAU,KAAK,SAAS;GACnC,MAAM,KAAK,KAAK,KAAK,MAAM,YAAY;GACvC,OAAO;EACT,CACF;CACF;CACA,MAAM,MAAM,OAA8C;EACxD,oBAAO,KAAK;EACZ,KAAK,MAAM,SAAS;EACpB,IAAI,CAAC,KAAK,OAAO,QAAQ,MAAM,IAAI,MAAM,+BAA+B;EACxE,OAAO,KAAK,UAAU,0BAAyB,CAC7C,MAAM,UACN,MACA,OAAO,QAAQ;GACb,KAAK,aAAa,OAAO,GAAG;GAC5B,MAAM,KAAK,UAAU,KAAK,OAAO;GACjC,MAAM,MAAM,MAAM,KAAK,KAAK,KAAK,MAAM,YAAY,GACjD,aAAa,KAAK,QAAQ,GAAG;GAC/B,IACE,MAAM,mBAAmB,WAAW,UACpC,MAAM,0BAA0B,WAAW,uBAE3C,MAAM,IAAI,MAAM,YAAY;GAC9B,MAAM,cAAc,oBAAO,KAAK,GAC9B,MAAM,SAAS,MAAM;GACvB,MAAM,CAAC,UAAU,MAAM,KAAK,KAC1B,IAAI,IACJ,+BACA,CAAC,IAAI,QAAQ,GAAG,CAClB;GACA,IAAI,QAAQ;IACV,MAAM,OAAO,OAAO,OAAO,IAAI;IAC/B,IACE,KAAK,gBAAgB,eACrB,KAAK,aAAa,KAAK,MAAM,CAAA,CAAE,SAE/B,MAAM,IAAI,MAAM,uBAAuB;IACzC,OAAO;KACL,IAAI,OAAO,OAAO,EAAE;KACpB,eAAe,OAAO,KAAK,aAAa;KACxC,SAAS,OAAO,KAAK,OAAO;KAC5B,yBAAyB;IAC3B;GACF;GAMA,KAAI,MALkB,KAAK,OAAO,OAAQ,QAAQ;IAChD,IAAI,IAAI;IACR,OAAO,KAAK,MAAM;IAClB,MAAM,gBAAgB,WAAW,IAAI;GACvC,CAAC,EAAA,CACW,YAAY,MAAM,uBAC5B,MAAM,IAAI,MAAM,wBAAwB;GAC1C,MAAM,UAAU,MAAM,KAAK,OAAO,OAAQ,MAAM;IAC9C,IAAI,IAAI;IACR,OAAO,KAAK,MAAM;IAClB,MAAM,gBAAgB,WAAW,IAAI;IACrC,iBAAiB,MAAM;IACvB,WAAW,MAAM;GACnB,CAAC;GACD,KAAK,QAAQ,OAAO;GACpB,KAAK,QAAQ,OAAO;GACpB,IAAI,QAAQ,YAAY,MAAM,uBAC5B,MAAM,IAAI,MAAM,gCAAgC;GAMlD,KAAI,MALmB,KAAK,OAAO,OAAQ,QAAQ;IACjD,IAAI,IAAI;IACR,OAAO,KAAK,MAAM;IAClB,MAAM,gBAAgB,WAAW,IAAI;GACvC,CAAC,EAAA,CACY,YAAY,QAAQ,SAC/B,MAAM,IAAI,MAAM,0BAA0B;GAC5C,MAAM,OAAO;IACX,SAAS;IACT;IACA,cAAc,WAAW;IACzB,kBAAkB,WAAW;IAC7B,uBAAuB,MAAM;IAC7B,eAAe,QAAQ;IACvB,SAAS,QAAQ;IACjB,UAAU,KAAK,MAAM,CAAA,CAAE;IACvB,yBAAyB;GAC3B;GACA,MAAM,QAAQ,MAAM,KAAK,OAAO,KAAK,KAAK,iBAAiB;IACzD,GAAG;IACH,QAAQ,oBAAO,IAAI;GACrB,CAAC;GACD,MAAM,KAAK,UAAU,KAAK,OAAO;GACjC,MAAM,KAAK,KAAK,KAAK,MAAM,YAAY;GACvC,OAAO;IACL,IAAI,OAAO,MAAM,EAAE;IACnB,eAAe,QAAQ;IACvB,SAAS,QAAQ;IACjB,yBAAyB;GAC3B;EACF,CACF;CACF;AACF"}
|