@tai42/studio-sdk 16.0.0 → 16.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/explorer-body.d.ts +49 -0
- package/dist/components/explorer-body.d.ts.map +1 -0
- package/dist/components/explorer-body.js +67 -0
- package/dist/components/explorer-body.js.map +1 -0
- package/dist/components/explorer-page-size.d.ts +4 -0
- package/dist/components/explorer-page-size.d.ts.map +1 -0
- package/dist/components/explorer-page-size.js +36 -0
- package/dist/components/explorer-page-size.js.map +1 -0
- package/dist/components/explorer-tag-filter.d.ts +17 -0
- package/dist/components/explorer-tag-filter.d.ts.map +1 -0
- package/dist/components/explorer-tag-filter.js +29 -0
- package/dist/components/explorer-tag-filter.js.map +1 -0
- package/dist/components/explorer-tags.d.ts +22 -0
- package/dist/components/explorer-tags.d.ts.map +1 -0
- package/dist/components/explorer-tags.js +51 -0
- package/dist/components/explorer-tags.js.map +1 -0
- package/dist/components/explorer-view.d.ts +3 -17
- package/dist/components/explorer-view.d.ts.map +1 -1
- package/dist/components/explorer-view.js +53 -170
- package/dist/components/explorer-view.js.map +1 -1
- package/dist/components/extension-combo-builder.d.ts +0 -5
- package/dist/components/extension-combo-builder.d.ts.map +1 -1
- package/dist/components/extension-combo-builder.js +4 -42
- package/dist/components/extension-combo-builder.js.map +1 -1
- package/dist/components/extension-combo-parts.d.ts +44 -0
- package/dist/components/extension-combo-parts.d.ts.map +1 -0
- package/dist/components/extension-combo-parts.js +57 -0
- package/dist/components/extension-combo-parts.js.map +1 -0
- package/dist/components/fleet-report.d.ts.map +1 -1
- package/dist/components/fleet-report.js +51 -37
- package/dist/components/fleet-report.js.map +1 -1
- package/dist/components/icons/chrome-marks.d.ts +50 -0
- package/dist/components/icons/chrome-marks.d.ts.map +1 -0
- package/dist/components/icons/chrome-marks.js +51 -0
- package/dist/components/icons/chrome-marks.js.map +1 -0
- package/dist/components/icons/icon-frame.d.ts +29 -0
- package/dist/components/icons/icon-frame.d.ts.map +1 -0
- package/dist/components/icons/icon-frame.js +19 -0
- package/dist/components/icons/icon-frame.js.map +1 -0
- package/dist/components/icons/index.d.ts +40 -0
- package/dist/components/icons/index.d.ts.map +1 -0
- package/dist/components/icons/index.js +6 -0
- package/dist/components/icons/index.js.map +1 -0
- package/dist/components/icons/nav-map.d.ts +14 -0
- package/dist/components/icons/nav-map.d.ts.map +1 -0
- package/dist/components/icons/nav-map.js +28 -0
- package/dist/components/icons/nav-map.js.map +1 -0
- package/dist/components/icons/nav-marks.d.ts +44 -0
- package/dist/components/icons/nav-marks.d.ts.map +1 -0
- package/dist/components/icons/nav-marks.js +45 -0
- package/dist/components/icons/nav-marks.js.map +1 -0
- package/dist/components/icons/status-marks.d.ts +21 -0
- package/dist/components/icons/status-marks.d.ts.map +1 -0
- package/dist/components/icons/status-marks.js +22 -0
- package/dist/components/icons/status-marks.js.map +1 -0
- package/dist/components/icons/theme-marks.d.ts +9 -0
- package/dist/components/icons/theme-marks.d.ts.map +1 -0
- package/dist/components/icons/theme-marks.js +10 -0
- package/dist/components/icons/theme-marks.js.map +1 -0
- package/dist/components/json-diff.d.ts.map +1 -1
- package/dist/components/json-diff.js +1 -3
- package/dist/components/json-diff.js.map +1 -1
- package/dist/components/json-tree-context.d.ts +13 -0
- package/dist/components/json-tree-context.d.ts.map +1 -0
- package/dist/components/json-tree-context.js +15 -0
- package/dist/components/json-tree-context.js.map +1 -0
- package/dist/components/json-tree-model.d.ts +56 -0
- package/dist/components/json-tree-model.d.ts.map +1 -0
- package/dist/components/json-tree-model.js +125 -0
- package/dist/components/json-tree-model.js.map +1 -0
- package/dist/components/json-tree-nodes.d.ts +30 -0
- package/dist/components/json-tree-nodes.d.ts.map +1 -0
- package/dist/components/json-tree-nodes.js +118 -0
- package/dist/components/json-tree-nodes.js.map +1 -0
- package/dist/components/json-tree.d.ts.map +1 -1
- package/dist/components/json-tree.js +7 -295
- package/dist/components/json-tree.js.map +1 -1
- package/dist/components/json-value-format.d.ts +20 -0
- package/dist/components/json-value-format.d.ts.map +1 -0
- package/dist/components/json-value-format.js +63 -0
- package/dist/components/json-value-format.js.map +1 -0
- package/dist/components/markdown-blocks.d.ts +38 -0
- package/dist/components/markdown-blocks.d.ts.map +1 -0
- package/dist/components/markdown-blocks.js +168 -0
- package/dist/components/markdown-blocks.js.map +1 -0
- package/dist/components/markdown-inline.d.ts +24 -0
- package/dist/components/markdown-inline.d.ts.map +1 -0
- package/dist/components/markdown-inline.js +257 -0
- package/dist/components/markdown-inline.js.map +1 -0
- package/dist/components/markdown.d.ts +3 -52
- package/dist/components/markdown.d.ts.map +1 -1
- package/dist/components/markdown.js +4 -376
- package/dist/components/markdown.js.map +1 -1
- package/dist/components/observer-registry.d.ts +38 -0
- package/dist/components/observer-registry.d.ts.map +1 -0
- package/dist/components/observer-registry.js +131 -0
- package/dist/components/observer-registry.js.map +1 -0
- package/dist/components/overflow-measure.d.ts +38 -0
- package/dist/components/overflow-measure.d.ts.map +1 -0
- package/dist/components/overflow-measure.js +54 -0
- package/dist/components/overflow-measure.js.map +1 -0
- package/dist/components/prose-regions.d.ts +81 -0
- package/dist/components/prose-regions.d.ts.map +1 -0
- package/dist/components/prose-regions.js +128 -0
- package/dist/components/prose-regions.js.map +1 -0
- package/dist/components/scroll-region.d.ts.map +1 -1
- package/dist/components/scroll-region.js +3 -298
- package/dist/components/scroll-region.js.map +1 -1
- package/dist/components/tab-stop-parse.d.ts +53 -0
- package/dist/components/tab-stop-parse.d.ts.map +1 -0
- package/dist/components/tab-stop-parse.js +202 -0
- package/dist/components/tab-stop-parse.js.map +1 -0
- package/dist/components/templated-text-field.d.ts.map +1 -1
- package/dist/components/templated-text-field.js +10 -148
- package/dist/components/templated-text-field.js.map +1 -1
- package/dist/components/templated-text-kwargs-editor.d.ts +24 -0
- package/dist/components/templated-text-kwargs-editor.d.ts.map +1 -0
- package/dist/components/templated-text-kwargs-editor.js +48 -0
- package/dist/components/templated-text-kwargs-editor.js.map +1 -0
- package/dist/components/templated-text-kwargs.d.ts +37 -0
- package/dist/components/templated-text-kwargs.d.ts.map +1 -0
- package/dist/components/templated-text-kwargs.js +66 -0
- package/dist/components/templated-text-kwargs.js.map +1 -0
- package/dist/components/templated-text-source.d.ts +33 -0
- package/dist/components/templated-text-source.d.ts.map +1 -0
- package/dist/components/templated-text-source.js +53 -0
- package/dist/components/templated-text-source.js.map +1 -0
- package/dist/components/tool-picker-parts.d.ts +39 -0
- package/dist/components/tool-picker-parts.d.ts.map +1 -0
- package/dist/components/tool-picker-parts.js +87 -0
- package/dist/components/tool-picker-parts.js.map +1 -0
- package/dist/components/tool-picker.d.ts +1 -2
- package/dist/components/tool-picker.d.ts.map +1 -1
- package/dist/components/tool-picker.js +4 -66
- package/dist/components/tool-picker.js.map +1 -1
- package/dist/components/version-history-panel.d.ts.map +1 -1
- package/dist/components/version-history-panel.js +7 -34
- package/dist/components/version-history-panel.js.map +1 -1
- package/dist/components/version-history-rows.d.ts +48 -0
- package/dist/components/version-history-rows.d.ts.map +1 -0
- package/dist/components/version-history-rows.js +51 -0
- package/dist/components/version-history-rows.js.map +1 -0
- package/dist/guards.d.ts +6 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +8 -0
- package/dist/guards.js.map +1 -0
- package/dist/hooks/interactions-connection.d.ts +43 -0
- package/dist/hooks/interactions-connection.d.ts.map +1 -0
- package/dist/hooks/interactions-connection.js +171 -0
- package/dist/hooks/interactions-connection.js.map +1 -0
- package/dist/hooks/interactions-stream.d.ts +80 -0
- package/dist/hooks/interactions-stream.d.ts.map +1 -0
- package/dist/hooks/interactions-stream.js +233 -0
- package/dist/hooks/interactions-stream.js.map +1 -0
- package/dist/hooks/useApi.d.ts +2192 -2192
- package/dist/hooks/useApi.d.ts.map +1 -1
- package/dist/hooks/useSse.d.ts +3 -6
- package/dist/hooks/useSse.d.ts.map +1 -1
- package/dist/hooks/useSse.js +38 -451
- package/dist/hooks/useSse.js.map +1 -1
- package/dist/navigation/app-link.d.ts +25 -0
- package/dist/navigation/app-link.d.ts.map +1 -0
- package/dist/navigation/app-link.js +33 -0
- package/dist/navigation/app-link.js.map +1 -0
- package/dist/navigation/context.d.ts +3 -20
- package/dist/navigation/context.d.ts.map +1 -1
- package/dist/navigation/context.js +7 -267
- package/dist/navigation/context.js.map +1 -1
- package/dist/navigation/entry-state.d.ts +23 -0
- package/dist/navigation/entry-state.d.ts.map +1 -0
- package/dist/navigation/entry-state.js +39 -0
- package/dist/navigation/entry-state.js.map +1 -0
- package/dist/navigation/guard-registry.d.ts +30 -0
- package/dist/navigation/guard-registry.d.ts.map +1 -0
- package/dist/navigation/guard-registry.js +46 -0
- package/dist/navigation/guard-registry.js.map +1 -0
- package/dist/navigation/guarded-navigation.d.ts +24 -0
- package/dist/navigation/guarded-navigation.d.ts.map +1 -0
- package/dist/navigation/guarded-navigation.js +102 -0
- package/dist/navigation/guarded-navigation.js.map +1 -0
- package/dist/navigation/index.d.ts +3 -2
- package/dist/navigation/index.d.ts.map +1 -1
- package/dist/navigation/index.js +2 -1
- package/dist/navigation/index.js.map +1 -1
- package/dist/navigation/types.d.ts +8 -11
- package/dist/navigation/types.d.ts.map +1 -1
- package/dist/navigation/use-back-forward-guard.d.ts +5 -0
- package/dist/navigation/use-back-forward-guard.d.ts.map +1 -0
- package/dist/navigation/use-back-forward-guard.js +82 -0
- package/dist/navigation/use-back-forward-guard.js.map +1 -0
- package/dist/plugin/registry.d.ts +6 -15
- package/dist/plugin/registry.d.ts.map +1 -1
- package/dist/plugin/registry.js +83 -75
- package/dist/plugin/registry.js.map +1 -1
- package/dist/schema-form/SecretRefField.d.ts +2 -3
- package/dist/schema-form/SecretRefField.d.ts.map +1 -1
- package/dist/schema-form/SecretRefField.js +23 -12
- package/dist/schema-form/SecretRefField.js.map +1 -1
- package/dist/schema-form/classify.d.ts +1 -122
- package/dist/schema-form/classify.d.ts.map +1 -1
- package/dist/schema-form/classify.js +174 -237
- package/dist/schema-form/classify.js.map +1 -1
- package/dist/schema-form/default-value.d.ts.map +1 -1
- package/dist/schema-form/default-value.js +42 -19
- package/dist/schema-form/default-value.js.map +1 -1
- package/dist/schema-form/enum-field.d.ts +1 -1
- package/dist/schema-form/enum-field.d.ts.map +1 -1
- package/dist/schema-form/field-model.d.ts +121 -0
- package/dist/schema-form/field-model.d.ts.map +1 -0
- package/dist/schema-form/field-model.js +2 -0
- package/dist/schema-form/field-model.js.map +1 -0
- package/dist/schema-form/field-node.d.ts.map +1 -1
- package/dist/schema-form/field-node.js +25 -14
- package/dist/schema-form/field-node.js.map +1 -1
- package/dist/schema-form/media-field.d.ts +1 -1
- package/dist/schema-form/media-field.d.ts.map +1 -1
- package/dist/schema-form/media-field.js +47 -28
- package/dist/schema-form/media-field.js.map +1 -1
- package/dist/schema-form/string-annotations.d.ts +20 -0
- package/dist/schema-form/string-annotations.d.ts.map +1 -0
- package/dist/schema-form/string-annotations.js +105 -0
- package/dist/schema-form/string-annotations.js.map +1 -0
- package/dist/schema-form/string-field.d.ts +1 -1
- package/dist/schema-form/string-field.d.ts.map +1 -1
- package/dist/schema-form/union-field.d.ts +1 -1
- package/dist/schema-form/union-field.d.ts.map +1 -1
- package/dist/schema-form/union-field.js.map +1 -1
- package/dist/schema-form/union.d.ts +1 -1
- package/dist/schema-form/union.d.ts.map +1 -1
- package/dist/schema-form/validate.d.ts.map +1 -1
- package/dist/schema-form/validate.js +126 -105
- package/dist/schema-form/validate.js.map +1 -1
- package/dist/state-binding/AdapterMapping.d.ts.map +1 -1
- package/dist/state-binding/AdapterMapping.js +0 -0
- package/dist/state-binding/AdapterMapping.js.map +1 -1
- package/dist/state-binding/StateAttachRow.d.ts.map +1 -1
- package/dist/state-binding/StateAttachRow.js +52 -36
- package/dist/state-binding/StateAttachRow.js.map +1 -1
- package/dist/state-binding/adapter-mapping-row.d.ts +17 -0
- package/dist/state-binding/adapter-mapping-row.d.ts.map +1 -0
- package/dist/state-binding/adapter-mapping-row.js +87 -0
- package/dist/state-binding/adapter-mapping-row.js.map +1 -0
- package/dist/structured-output/StructuredOutput.d.ts.map +1 -1
- package/dist/structured-output/StructuredOutput.js +1 -3
- package/dist/structured-output/StructuredOutput.js.map +1 -1
- package/package.json +2 -2
- package/src/components/explorer-body.tsx +239 -0
- package/src/components/explorer-page-size.ts +39 -0
- package/src/components/explorer-tag-filter.tsx +80 -0
- package/src/components/explorer-tags.ts +64 -0
- package/src/components/explorer-view.tsx +114 -366
- package/src/components/extension-combo-builder.tsx +35 -152
- package/src/components/extension-combo-parts.tsx +237 -0
- package/src/components/fleet-report.tsx +97 -54
- package/src/components/icons/chrome-marks.tsx +195 -0
- package/src/components/icons/icon-frame.tsx +50 -0
- package/src/components/icons/index.ts +84 -0
- package/src/components/icons/nav-map.ts +55 -0
- package/src/components/icons/nav-marks.tsx +205 -0
- package/src/components/icons/status-marks.tsx +46 -0
- package/src/components/icons/theme-marks.tsx +33 -0
- package/src/components/json-diff.tsx +1 -4
- package/src/components/json-tree-context.ts +26 -0
- package/src/components/json-tree-model.ts +139 -0
- package/src/components/json-tree-nodes.tsx +224 -0
- package/src/components/json-tree.tsx +15 -434
- package/src/components/json-value-format.ts +64 -0
- package/src/components/markdown-blocks.ts +198 -0
- package/src/components/markdown-inline.tsx +365 -0
- package/src/components/markdown.tsx +5 -471
- package/src/components/observer-registry.ts +139 -0
- package/src/components/overflow-measure.ts +69 -0
- package/src/components/prose-regions.ts +153 -0
- package/src/components/scroll-region.tsx +20 -360
- package/src/components/tab-stop-parse.ts +217 -0
- package/src/components/templated-text-field.tsx +38 -330
- package/src/components/templated-text-kwargs-editor.tsx +147 -0
- package/src/components/templated-text-kwargs.ts +92 -0
- package/src/components/templated-text-source.tsx +226 -0
- package/src/components/tool-picker-parts.tsx +184 -0
- package/src/components/tool-picker.tsx +22 -114
- package/src/components/version-history-panel.tsx +38 -142
- package/src/components/version-history-rows.tsx +220 -0
- package/src/guards.ts +7 -0
- package/src/hooks/interactions-connection.ts +227 -0
- package/src/hooks/interactions-stream.ts +274 -0
- package/src/hooks/useSse.ts +50 -477
- package/src/navigation/app-link.tsx +70 -0
- package/src/navigation/context.tsx +11 -330
- package/src/navigation/entry-state.ts +42 -0
- package/src/navigation/guard-registry.ts +65 -0
- package/src/navigation/guarded-navigation.ts +147 -0
- package/src/navigation/index.ts +2 -2
- package/src/navigation/types.ts +8 -11
- package/src/navigation/use-back-forward-guard.ts +90 -0
- package/src/plugin/registry.ts +111 -90
- package/src/schema-form/SecretRefField.tsx +121 -71
- package/src/schema-form/classify.ts +244 -395
- package/src/schema-form/default-value.ts +48 -17
- package/src/schema-form/enum-field.tsx +1 -1
- package/src/schema-form/field-model.ts +133 -0
- package/src/schema-form/field-node.tsx +94 -38
- package/src/schema-form/media-field.tsx +134 -65
- package/src/schema-form/string-annotations.ts +111 -0
- package/src/schema-form/string-field.tsx +1 -1
- package/src/schema-form/union-field.tsx +2 -1
- package/src/schema-form/union.ts +1 -1
- package/src/schema-form/validate.ts +184 -103
- package/src/state-binding/AdapterMapping.tsx +0 -0
- package/src/state-binding/StateAttachRow.tsx +222 -147
- package/src/state-binding/adapter-mapping-row.tsx +232 -0
- package/src/structured-output/StructuredOutput.tsx +1 -4
- package/dist/components/icons.d.ts +0 -160
- package/dist/components/icons.d.ts.map +0 -1
- package/dist/components/icons.js +0 -160
- package/dist/components/icons.js.map +0 -1
- package/src/components/icons.tsx +0 -586
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { isRecord } from '../guards';
|
|
2
|
+
// The server emits no removal for an answered card — only `interaction.answered`,
|
|
3
|
+
// never `interaction.removed` for it — and the paged base never carries answered
|
|
4
|
+
// items, so answered cards would otherwise pile up unbounded in the always-mounted
|
|
5
|
+
// badge/inbox. The client ages them out: drop an answered card
|
|
6
|
+
// ANSWERED_RETENTION_MS after its answered frame, keeping at most ANSWERED_CAP as a
|
|
7
|
+
// hard flood backstop. Swept lazily on frame/reconnect ticks (the stream carries no
|
|
8
|
+
// idle heartbeat frame), never a per-item timer.
|
|
9
|
+
const ANSWERED_RETENTION_MS = 10 * 60 * 1000;
|
|
10
|
+
const ANSWERED_CAP = 200;
|
|
11
|
+
// The wire `answer_format` values. Duplicated from the api-client enum by design:
|
|
12
|
+
// the SDK is the leaf and must not import api-client at runtime. The `satisfies`
|
|
13
|
+
// pin against `Interaction['answer_format']` fails to compile if a listed value
|
|
14
|
+
// leaves the union, so this runtime guard cannot silently drift from the type.
|
|
15
|
+
const ANSWER_FORMATS = new Set([
|
|
16
|
+
'text',
|
|
17
|
+
'confirm',
|
|
18
|
+
'select',
|
|
19
|
+
'form',
|
|
20
|
+
'external',
|
|
21
|
+
]);
|
|
22
|
+
/** Parse a frame's JSON to a plain object, or null when it is not one. */
|
|
23
|
+
function parseJson(data) {
|
|
24
|
+
if (!data)
|
|
25
|
+
return null;
|
|
26
|
+
try {
|
|
27
|
+
const obj = JSON.parse(data);
|
|
28
|
+
return isRecord(obj) ? obj : null;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The strict-required fields: `interaction_id`, `group_id`, `created_at`,
|
|
36
|
+
* `timeout_at` must each be a string and `answer_format` a known enum value.
|
|
37
|
+
* `question` is `z.string().default('')` — a missing question is valid (normalized
|
|
38
|
+
* to `''` on assembly) but a present non-string is malformed; `format_payload` is
|
|
39
|
+
* nullish — absent/null is valid but a present non-object is malformed.
|
|
40
|
+
*/
|
|
41
|
+
function requiredFieldsValid(obj) {
|
|
42
|
+
if (typeof obj.interaction_id !== 'string')
|
|
43
|
+
return false;
|
|
44
|
+
if (typeof obj.group_id !== 'string')
|
|
45
|
+
return false;
|
|
46
|
+
if (obj.question !== undefined && typeof obj.question !== 'string')
|
|
47
|
+
return false;
|
|
48
|
+
if (typeof obj.created_at !== 'string')
|
|
49
|
+
return false;
|
|
50
|
+
if (typeof obj.timeout_at !== 'string')
|
|
51
|
+
return false;
|
|
52
|
+
if (typeof obj.answer_format !== 'string' || !ANSWER_FORMATS.has(obj.answer_format))
|
|
53
|
+
return false;
|
|
54
|
+
if (obj.format_payload != null && !isRecord(obj.format_payload))
|
|
55
|
+
return false;
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The optional fields, each rejected only when PRESENT with the wrong type: an
|
|
60
|
+
* absent value stays absent (or takes its schema default on assembly). `media`
|
|
61
|
+
* items stay unknown by design — each is validated per item by the renderer.
|
|
62
|
+
*/
|
|
63
|
+
function optionalFieldsValid(obj) {
|
|
64
|
+
if (obj.sensitive !== undefined && typeof obj.sensitive !== 'boolean')
|
|
65
|
+
return false;
|
|
66
|
+
if (obj.server_verified !== undefined && typeof obj.server_verified !== 'boolean')
|
|
67
|
+
return false;
|
|
68
|
+
if (obj.channel !== undefined && typeof obj.channel !== 'string')
|
|
69
|
+
return false;
|
|
70
|
+
if (obj.recipient !== undefined && typeof obj.recipient !== 'string')
|
|
71
|
+
return false;
|
|
72
|
+
if (obj.origin !== undefined && typeof obj.origin !== 'string')
|
|
73
|
+
return false;
|
|
74
|
+
if (obj.audience !== undefined && typeof obj.audience !== 'string')
|
|
75
|
+
return false;
|
|
76
|
+
if (obj.media !== undefined && !Array.isArray(obj.media))
|
|
77
|
+
return false;
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
/** Assemble the validated frame into an `Interaction`, applying the schema defaults. */
|
|
81
|
+
function buildInteraction(obj) {
|
|
82
|
+
return {
|
|
83
|
+
interaction_id: obj.interaction_id,
|
|
84
|
+
group_id: obj.group_id,
|
|
85
|
+
question: typeof obj.question === 'string' ? obj.question : '',
|
|
86
|
+
answer_format: obj.answer_format,
|
|
87
|
+
format_payload: isRecord(obj.format_payload) ? obj.format_payload : {},
|
|
88
|
+
created_at: obj.created_at,
|
|
89
|
+
timeout_at: obj.timeout_at,
|
|
90
|
+
sensitive: typeof obj.sensitive === 'boolean' ? obj.sensitive : false,
|
|
91
|
+
...(typeof obj.server_verified === 'boolean' ? { server_verified: obj.server_verified } : {}),
|
|
92
|
+
...(typeof obj.channel === 'string' ? { channel: obj.channel } : {}),
|
|
93
|
+
...(typeof obj.recipient === 'string' ? { recipient: obj.recipient } : {}),
|
|
94
|
+
...(typeof obj.origin === 'string' ? { origin: obj.origin } : {}),
|
|
95
|
+
...(typeof obj.audience === 'string' ? { audience: obj.audience } : {}),
|
|
96
|
+
...(Array.isArray(obj.media) ? { media: obj.media } : {}),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Validate an `interaction.add` frame into an `Interaction`, or null when it is
|
|
101
|
+
* malformed. This mirrors the api-client `interaction` zod schema exactly — it
|
|
102
|
+
* accepts what that schema accepts, no more, no less — so the caller surfaces a
|
|
103
|
+
* malformed frame as an error rather than rendering a blank card, and never
|
|
104
|
+
* silently coerces one.
|
|
105
|
+
*/
|
|
106
|
+
export function parseAddFrame(data) {
|
|
107
|
+
const obj = parseJson(data);
|
|
108
|
+
if (obj === null)
|
|
109
|
+
return null;
|
|
110
|
+
if (!requiredFieldsValid(obj) || !optionalFieldsValid(obj))
|
|
111
|
+
return null;
|
|
112
|
+
return buildInteraction(obj);
|
|
113
|
+
}
|
|
114
|
+
/** The interaction id from an `answered` / `removed` frame, or null. */
|
|
115
|
+
export function parseId(data) {
|
|
116
|
+
const id = parseJson(data)?.interaction_id;
|
|
117
|
+
return typeof id === 'string' ? id : null;
|
|
118
|
+
}
|
|
119
|
+
export function emptyOverlay() {
|
|
120
|
+
return {
|
|
121
|
+
adds: new Map(),
|
|
122
|
+
addEpoch: new Map(),
|
|
123
|
+
answeredAt: new Map(),
|
|
124
|
+
removed: new Set(),
|
|
125
|
+
goneEpoch: new Map(),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/** Record an `interaction.add`: a live add overwrites any prior copy in place. */
|
|
129
|
+
export function overlayApplyAdd(overlay, interaction, epoch) {
|
|
130
|
+
overlay.adds.set(interaction.interaction_id, interaction);
|
|
131
|
+
overlay.addEpoch.set(interaction.interaction_id, epoch);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Record an `interaction.answered`. The answered time and terminal epoch are
|
|
135
|
+
* stamped on the FIRST answered frame only (a redelivery keeps the original stamp,
|
|
136
|
+
* so the retention window is not extended and a later terminal never re-dates it
|
|
137
|
+
* into a fresher resync). A seed-origin card is promoted into the overlay so it
|
|
138
|
+
* lingers uniformly with a live-add card, since the paged base never carries
|
|
139
|
+
* answered items and a refetch would otherwise drop it before its window elapses.
|
|
140
|
+
*/
|
|
141
|
+
export function overlayApplyAnswered(overlay, id, epoch, seed) {
|
|
142
|
+
if (!overlay.answeredAt.has(id))
|
|
143
|
+
overlay.answeredAt.set(id, Date.now());
|
|
144
|
+
if (!overlay.goneEpoch.has(id))
|
|
145
|
+
overlay.goneEpoch.set(id, epoch);
|
|
146
|
+
if (!overlay.adds.has(id)) {
|
|
147
|
+
const seeded = seed.find((item) => item.interaction_id === id);
|
|
148
|
+
if (seeded !== undefined) {
|
|
149
|
+
overlay.adds.set(id, seeded);
|
|
150
|
+
overlay.addEpoch.set(id, epoch);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** Record an `interaction.removed`: tombstone the id and stamp its first terminal epoch. */
|
|
155
|
+
export function overlayApplyRemoved(overlay, id, epoch) {
|
|
156
|
+
overlay.adds.delete(id);
|
|
157
|
+
overlay.addEpoch.delete(id);
|
|
158
|
+
overlay.answeredAt.delete(id);
|
|
159
|
+
overlay.removed.add(id);
|
|
160
|
+
if (!overlay.goneEpoch.has(id))
|
|
161
|
+
overlay.goneEpoch.set(id, epoch);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Age answered cards out (the server sends no removal for them): tombstone any past
|
|
165
|
+
* the retention window, then — as a flood backstop — the oldest beyond the count
|
|
166
|
+
* cap. A tombstone (not a bare delete) so a still-stale seed cannot resurrect a card
|
|
167
|
+
* the client has retired; the id keeps its original `goneEpoch` so moving
|
|
168
|
+
* answered→removed never re-dates it into a fresher resync.
|
|
169
|
+
*/
|
|
170
|
+
export function sweepAnswered(overlay) {
|
|
171
|
+
const now = Date.now();
|
|
172
|
+
const retire = (id) => {
|
|
173
|
+
overlay.answeredAt.delete(id);
|
|
174
|
+
overlay.adds.delete(id);
|
|
175
|
+
overlay.addEpoch.delete(id);
|
|
176
|
+
overlay.removed.add(id);
|
|
177
|
+
};
|
|
178
|
+
for (const [id, at] of overlay.answeredAt) {
|
|
179
|
+
if (now - at >= ANSWERED_RETENTION_MS)
|
|
180
|
+
retire(id);
|
|
181
|
+
}
|
|
182
|
+
if (overlay.answeredAt.size > ANSWERED_CAP) {
|
|
183
|
+
const oldest = [...overlay.answeredAt.entries()].sort((a, b) => a[1] - b[1]);
|
|
184
|
+
for (const [id] of oldest.slice(0, oldest.length - ANSWERED_CAP))
|
|
185
|
+
retire(id);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/** Fold the paged base and the live overlay into the published, ordered list. */
|
|
189
|
+
export function merge(seed, live) {
|
|
190
|
+
const out = new Map();
|
|
191
|
+
for (const item of seed) {
|
|
192
|
+
if (live.removed.has(item.interaction_id))
|
|
193
|
+
continue;
|
|
194
|
+
out.set(item.interaction_id, { ...item, answered: live.answeredAt.has(item.interaction_id) });
|
|
195
|
+
}
|
|
196
|
+
for (const [id, item] of live.adds) {
|
|
197
|
+
if (live.removed.has(id))
|
|
198
|
+
continue;
|
|
199
|
+
out.set(id, { ...item, answered: live.answeredAt.has(id) });
|
|
200
|
+
}
|
|
201
|
+
return Array.from(out.values());
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* The live pending tally: the door's `total` for the seed, plus live adds whose id
|
|
205
|
+
* is absent from the seed AND stamped at or after `countEpoch` (a new question not
|
|
206
|
+
* yet folded into `total`), minus one for every terminal id — answered OR removed —
|
|
207
|
+
* stamped at or after `countEpoch`, deduped per id so an id counts once however many
|
|
208
|
+
* terminal frames it drew. `countEpoch` is the epoch of the last resync whose refetch
|
|
209
|
+
* LANDED (a failed refetch never advances it): a delta stamped before it is already
|
|
210
|
+
* reflected in the fresh `total`, so it is NOT applied again — this is what stops a
|
|
211
|
+
* resync from re-subtracting a terminal it already dropped from `total`, while a
|
|
212
|
+
* failed refetch keeps the prior-epoch deltas applying against the prior total. One
|
|
213
|
+
* residual race remains: a frame arriving while a refetch is in flight may already be
|
|
214
|
+
* reflected in that refetch's `total`, so the raw tally can transiently dip below zero
|
|
215
|
+
* until the next resync reconciles. A pending tally below zero is meaningless, so the
|
|
216
|
+
* published count clamps at 0; the clamp covers only the negative symptom (a transient
|
|
217
|
+
* positive under-count reconciles on the next resync, not here).
|
|
218
|
+
*/
|
|
219
|
+
export function pendingCount(seed, total, live, countEpoch) {
|
|
220
|
+
const seedIds = new Set(seed.map((item) => item.interaction_id));
|
|
221
|
+
let count = total;
|
|
222
|
+
for (const id of live.adds.keys()) {
|
|
223
|
+
if (!seedIds.has(id) && (live.addEpoch.get(id) ?? 0) >= countEpoch)
|
|
224
|
+
count += 1;
|
|
225
|
+
}
|
|
226
|
+
const gone = new Set([...live.answeredAt.keys(), ...live.removed]);
|
|
227
|
+
for (const id of gone) {
|
|
228
|
+
if ((live.goneEpoch.get(id) ?? 0) >= countEpoch)
|
|
229
|
+
count -= 1;
|
|
230
|
+
}
|
|
231
|
+
return Math.max(count, 0);
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=interactions-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactions-stream.js","sourceRoot":"","sources":["../../src/hooks/interactions-stream.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAKrC,kFAAkF;AAClF,iFAAiF;AACjF,mFAAmF;AACnF,+DAA+D;AAC/D,oFAAoF;AACpF,oFAAoF;AACpF,iDAAiD;AACjD,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC7C,MAAM,YAAY,GAAG,GAAG,CAAC;AAEzB,kFAAkF;AAClF,iFAAiF;AACjF,gFAAgF;AAChF,+EAA+E;AAC/E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAS;IACrC,MAAM;IACN,SAAS;IACT,QAAQ;IACR,MAAM;IACN,UAAU;CACgD,CAAC,CAAC;AAE9D,0EAA0E;AAC1E,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAWD;;;;;;GAMG;AACH,SAAS,mBAAmB,CAC1B,GAA4B;IAE5B,IAAI,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzD,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACjF,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC;QAAE,OAAO,KAAK,CAAC;IAClG,IAAI,GAAG,CAAC,cAAc,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,GAA4B;IACvD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACpF,IAAI,GAAG,CAAC,eAAe,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,eAAe,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAChG,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC/E,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACnF,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC7E,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACjF,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACvE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wFAAwF;AACxF,SAAS,gBAAgB,CAAC,GAAkD;IAC1E,OAAO;QACL,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,QAAQ,EAAE,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;QAC9D,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,cAAc,EAAE,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;QACtE,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,SAAS,EAAE,OAAO,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;QACrE,GAAG,CAAC,OAAO,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,GAAG,CAAC,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACxE,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC;IAC3C,OAAO,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC;AAoBD,MAAM,UAAU,YAAY;IAC1B,OAAO;QACL,IAAI,EAAE,IAAI,GAAG,EAAE;QACf,QAAQ,EAAE,IAAI,GAAG,EAAE;QACnB,UAAU,EAAE,IAAI,GAAG,EAAE;QACrB,OAAO,EAAE,IAAI,GAAG,EAAE;QAClB,SAAS,EAAE,IAAI,GAAG,EAAE;KACrB,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAC7B,OAAoB,EACpB,WAAwB,EACxB,KAAa;IAEb,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAC1D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAoB,EACpB,EAAU,EACV,KAAa,EACb,IAA4B;IAE5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACjE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,KAAK,EAAE,CAAC,CAAC;QAC/D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;AACH,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,mBAAmB,CAAC,OAAoB,EAAE,EAAU,EAAE,KAAa;IACjF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5B,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,OAAoB;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAE;QAC5B,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAC1C,IAAI,GAAG,GAAG,EAAE,IAAI,qBAAqB;YAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,YAAY,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC;YAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,KAAK,CAAC,IAA4B,EAAE,IAAiB;IACnE,MAAM,GAAG,GAAG,IAAI,GAAG,EAA6B,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC;YAAE,SAAS;QACpD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QACnC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,YAAY,CAC1B,IAA4B,EAC5B,KAAa,EACb,IAAiB,EACjB,UAAkB;IAElB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACjE,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,UAAU;YAAE,KAAK,IAAI,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,UAAU;YAAE,KAAK,IAAI,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC5B,CAAC"}
|