@aparte/core 0.19.3 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/dist/client/aparte-client.d.ts +66 -95
  2. package/dist/client/aparte-client.d.ts.map +1 -1
  3. package/dist/client/stream-adapter.d.ts +7 -13
  4. package/dist/client/stream-adapter.d.ts.map +1 -1
  5. package/dist/client/wire-history.d.ts +4 -5
  6. package/dist/client/wire-history.d.ts.map +1 -1
  7. package/dist/components/bubble/aparte-chat-bubble.d.ts +88 -57
  8. package/dist/components/bubble/aparte-chat-bubble.d.ts.map +1 -1
  9. package/dist/components/chat/aparte-chat.d.ts +15 -13
  10. package/dist/components/chat/aparte-chat.d.ts.map +1 -1
  11. package/dist/components/chat/glide-gate.d.ts +13 -0
  12. package/dist/components/chat/glide-gate.d.ts.map +1 -0
  13. package/dist/components/composer/aparte-composer-action.d.ts +2 -2
  14. package/dist/components/composer/aparte-composer-add-attachment.d.ts +1 -1
  15. package/dist/components/composer/aparte-composer-input.d.ts +1 -5
  16. package/dist/components/composer/aparte-composer-input.d.ts.map +1 -1
  17. package/dist/components/composer/aparte-composer-send.d.ts +8 -10
  18. package/dist/components/composer/aparte-composer-send.d.ts.map +1 -1
  19. package/dist/components/composer/aparte-composer.d.ts +48 -80
  20. package/dist/components/composer/aparte-composer.d.ts.map +1 -1
  21. package/dist/components/context/aparte-context.d.ts +9 -4
  22. package/dist/components/context/aparte-context.d.ts.map +1 -1
  23. package/dist/components/conversation-list/aparte-conversation-list.d.ts +23 -13
  24. package/dist/components/conversation-list/aparte-conversation-list.d.ts.map +1 -1
  25. package/dist/components/elicitation/aparte-elicitation.d.ts +15 -22
  26. package/dist/components/elicitation/aparte-elicitation.d.ts.map +1 -1
  27. package/dist/components/scroll-rail/aparte-scroll-rail.d.ts +10 -11
  28. package/dist/components/scroll-rail/aparte-scroll-rail.d.ts.map +1 -1
  29. package/dist/components/sidebar/aparte-sidebar.d.ts +16 -3
  30. package/dist/components/sidebar/aparte-sidebar.d.ts.map +1 -1
  31. package/dist/components/split/aparte-split.d.ts +12 -3
  32. package/dist/components/split/aparte-split.d.ts.map +1 -1
  33. package/dist/components/status/aparte-chat-status.d.ts.map +1 -1
  34. package/dist/components/suggestions/aparte-suggestions.d.ts +6 -9
  35. package/dist/components/suggestions/aparte-suggestions.d.ts.map +1 -1
  36. package/dist/components/viewport/aparte-chat-viewport.d.ts +70 -70
  37. package/dist/components/viewport/aparte-chat-viewport.d.ts.map +1 -1
  38. package/dist/config/aparte-config.d.ts +88 -67
  39. package/dist/config/aparte-config.d.ts.map +1 -1
  40. package/dist/config/icon-provider.d.ts +19 -2
  41. package/dist/config/icon-provider.d.ts.map +1 -1
  42. package/dist/config/index.d.ts +1 -1
  43. package/dist/config/index.d.ts.map +1 -1
  44. package/dist/config/locale.d.ts +57 -89
  45. package/dist/config/locale.d.ts.map +1 -1
  46. package/dist/config/sanitize.d.ts.map +1 -1
  47. package/dist/conversations/conversation-controller.d.ts +18 -3
  48. package/dist/conversations/conversation-controller.d.ts.map +1 -1
  49. package/dist/conversations/conversation-manager.d.ts +3 -3
  50. package/dist/conversations/conversation-manager.d.ts.map +1 -1
  51. package/dist/custom-elements.json +7626 -6906
  52. package/dist/{dialog-triggers-ChnPFG9M.js → dialog-triggers-3Rk7PuZa.js} +444 -287
  53. package/dist/dialog-triggers-3Rk7PuZa.js.map +1 -0
  54. package/dist/elicitation/approval-panel.d.ts.map +1 -1
  55. package/dist/elicitation/index.d.ts +6 -1
  56. package/dist/elicitation/index.d.ts.map +1 -1
  57. package/dist/elicitation/panel.d.ts +11 -21
  58. package/dist/elicitation/panel.d.ts.map +1 -1
  59. package/dist/elicitation/types.d.ts +19 -27
  60. package/dist/elicitation/types.d.ts.map +1 -1
  61. package/dist/generated/element-attributes.d.ts +11 -5
  62. package/dist/generated/element-attributes.d.ts.map +1 -1
  63. package/dist/host/aparte-chat-host.d.ts +17 -32
  64. package/dist/host/aparte-chat-host.d.ts.map +1 -1
  65. package/dist/icons/extended.d.ts +1 -2
  66. package/dist/icons/extended.d.ts.map +1 -1
  67. package/dist/icons.d.ts +6 -8
  68. package/dist/icons.d.ts.map +1 -1
  69. package/dist/icons.js.map +1 -1
  70. package/dist/index.css +1 -1
  71. package/dist/index.d.ts +12 -9
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +682 -327
  74. package/dist/index.js.map +1 -1
  75. package/dist/index.node.d.ts +6 -3
  76. package/dist/index.node.d.ts.map +1 -1
  77. package/dist/index.node.js +2 -2
  78. package/dist/index.node.js.map +1 -1
  79. package/dist/interop/dialog-triggers.d.ts +2 -2
  80. package/dist/interop/element-props.d.ts +16 -27
  81. package/dist/interop/element-props.d.ts.map +1 -1
  82. package/dist/primitives/icon/aparte-icon.d.ts.map +1 -1
  83. package/dist/primitives/select/aparte-option.d.ts +3 -2
  84. package/dist/primitives/select/aparte-option.d.ts.map +1 -1
  85. package/dist/primitives/select/aparte-select.d.ts +24 -21
  86. package/dist/primitives/select/aparte-select.d.ts.map +1 -1
  87. package/dist/renderers/markdown-stream.d.ts.map +1 -1
  88. package/dist/renderers/segment-renderers.d.ts +11 -17
  89. package/dist/renderers/segment-renderers.d.ts.map +1 -1
  90. package/dist/renderers/segments/code.d.ts.map +1 -1
  91. package/dist/renderers/segments/error.d.ts.map +1 -1
  92. package/dist/renderers/segments/text.d.ts.map +1 -1
  93. package/dist/renderers/segments/tool-call.d.ts.map +1 -1
  94. package/dist/runtime/message-repository.d.ts +8 -15
  95. package/dist/runtime/message-repository.d.ts.map +1 -1
  96. package/dist/transport/backend-handler.d.ts +4 -6
  97. package/dist/transport/backend-handler.d.ts.map +1 -1
  98. package/dist/transport/backend-transport.d.ts +14 -0
  99. package/dist/transport/backend-transport.d.ts.map +1 -1
  100. package/dist/transport/types.d.ts +7 -10
  101. package/dist/transport/types.d.ts.map +1 -1
  102. package/dist/types/chat.d.ts +10 -18
  103. package/dist/types/chat.d.ts.map +1 -1
  104. package/dist/types/element-attributes.d.ts +6 -12
  105. package/dist/types/element-attributes.d.ts.map +1 -1
  106. package/dist/types/element-map.d.ts +6 -19
  107. package/dist/types/element-map.d.ts.map +1 -1
  108. package/dist/types/event-map.d.ts +11 -17
  109. package/dist/types/event-map.d.ts.map +1 -1
  110. package/dist/types/events.d.ts +5 -14
  111. package/dist/types/events.d.ts.map +1 -1
  112. package/dist/types/index.d.ts +2 -2
  113. package/dist/types/index.d.ts.map +1 -1
  114. package/dist/types/model-provider.d.ts +7 -9
  115. package/dist/types/model-provider.d.ts.map +1 -1
  116. package/dist/types/segments.d.ts +21 -13
  117. package/dist/types/segments.d.ts.map +1 -1
  118. package/dist/types/tools.d.ts +20 -22
  119. package/dist/types/tools.d.ts.map +1 -1
  120. package/dist/utils/copy-text.d.ts +1 -2
  121. package/dist/utils/copy-text.d.ts.map +1 -1
  122. package/dist/utils/css-escape.d.ts +1 -1
  123. package/dist/utils/escape.d.ts +4 -19
  124. package/dist/utils/escape.d.ts.map +1 -1
  125. package/dist/utils/files-to-attachments.d.ts +2 -2
  126. package/dist/utils/fold-text.d.ts +13 -0
  127. package/dist/utils/fold-text.d.ts.map +1 -0
  128. package/dist/utils/is-awaiting-reply.d.ts +2 -5
  129. package/dist/utils/is-awaiting-reply.d.ts.map +1 -1
  130. package/dist/utils/presence.d.ts +5 -5
  131. package/dist/utils/segments.d.ts +54 -78
  132. package/dist/utils/segments.d.ts.map +1 -1
  133. package/dist/utils/tool-input.d.ts +1 -1
  134. package/dist/utils/tool-input.d.ts.map +1 -1
  135. package/dist/utils/transcript.d.ts +2 -2
  136. package/dist/utils/uuid.d.ts +0 -11
  137. package/dist/utils/uuid.d.ts.map +1 -1
  138. package/package.json +29 -3
  139. package/dist/dialog-triggers-ChnPFG9M.js.map +0 -1
@@ -3,20 +3,15 @@
3
3
  * there at all.
4
4
  *
5
5
  * `'submit'` answers, and `'none'` says this panel has NO act left for that button,
6
- * so it is not drawn. (`'advance'` — the button as a "next" through a form — is gone:
7
- * the chips are the navigation, and a button that changes meaning under the pointer
8
- * was one more thing to explain.)
6
+ * so it is not drawn. The chips are the navigation through a form's questions, so the
7
+ * button never means "next".
9
8
  *
10
- * `'none'` exists because a panel could not previously say it. The composer's panel
11
- * mode was one fixed policy — hide the input and the attachment picker, keep the
12
- * strip and the toolbar, and ALWAYS keep the send button — and the approval panel
13
- * showed what that costs: its options settle on the first click by design, so the
14
- * button beside them sat permanently disabled, meaning nothing, until the optional
15
- * instruction field was opened. A control that is never the way forward is not
16
- * disabled, it is absent (ratified decision #8).
9
+ * `'none'` is for a panel whose options settle on the first click (an approval, a
10
+ * single-choice question): a button beside them would sit permanently disabled,
11
+ * meaning nothing. A control that is never the way forward is not disabled, it is
12
+ * absent.
17
13
  *
18
- * Named rather than inlined at each of its six readers: this union is exactly the
19
- * kind of list this repo has watched drift when every reader kept its own copy.
14
+ * Named rather than inlined at each of its six readers, so they share one list.
20
15
  */
21
16
  export type AparteComposerPanelMode = 'submit' | 'none';
22
17
  export interface AparteComposerEventMap {
@@ -120,10 +115,6 @@ export interface AparteComposerChangeEventDetail {
120
115
  * an `id` — otherwise it answers to every chat's events, and one chat's Stop resets the
121
116
  * other's composer and evicts its open panel.
122
117
  *
123
- * Prose first, on purpose: when `@element` opens a docblock there is no free text
124
- * left for the analyser to use, and this component's description came out empty in
125
- * the manifest and blank on the generated reference page.
126
- *
127
118
  * `aparte-abort` and `aparte-message-aborted` have to be declared by hand and always
128
119
  * will: they go out through `window.dispatchEvent` (they concern the whole page, not
129
120
  * this subtree), and the analyser's fallback only recognises `this.dispatchEvent`.
@@ -139,8 +130,7 @@ export interface AparteComposerChangeEventDetail {
139
130
  * @attr {string} target - The id of the `<aparte-chat>` this composer drives.
140
131
  * @attr {boolean} submit-on-enter - Enter sends and Shift+Enter breaks the line (the
141
132
  * default); set it to the string `"false"` to swap them. Read lazily by the
142
- * `submitOnEnter` getter rather than observed, which is why it was missing from the
143
- * manifest — and so from every typed surface — while all four wrappers wrote it.
133
+ * `submitOnEnter` getter rather than observed.
144
134
  * @attr {boolean} data-panel-active - Reflected BY the element while a panel (an elicitation, an
145
135
  * approval) is mounted inside it; the shipped stylesheet keys off it. Read-only.
146
136
  * @attr {string} data-panel-mode - Reflected BY the element while a panel is active: what the send
@@ -210,14 +200,11 @@ export declare class AparteComposer extends HTMLElement {
210
200
  /**
211
201
  * Who owns the one panel slot, and how to tell them they lost it.
212
202
  *
213
- * There is exactly one slot, `showPanel` empties it unconditionally, and nothing
214
- * used to say whose it was. Three paths therefore closed a panel whose owner was
215
- * still awaiting an answer, and none of them told the owner: a second `showPanel`,
216
- * the owner-of-record's own `hidePanel`, and — the one that actually bit —
217
- * `_handleMessageDone`, which fires on EVERY turn end. A question still open when a
218
- * turn finished lost its panel while `<aparte-elicitation>` kept `_pending` set,
219
- * so the request never settled AND every later request was short-circuited for the
220
- * life of the page.
203
+ * There is exactly one slot and `showPanel` empties it unconditionally, so every
204
+ * path that closes a panel whose owner is still awaiting an answer — a second
205
+ * `showPanel`, `hidePanel` without the owner's token, `_handleMessageDone` (which
206
+ * fires on EVERY turn end) — must tell the owner. An owner that is not told keeps
207
+ * its request pending, and every later request is short-circuited behind it.
221
208
  */
222
209
  private _panelToken;
223
210
  private _panelOnEvict;
@@ -230,10 +217,10 @@ export declare class AparteComposer extends HTMLElement {
230
217
  *
231
218
  * A wrapper runs `AparteChatHost.bind()` — which calls `attachConfig` — from its
232
219
  * POST-mount hook, so this element connects BEFORE the boundary exists. Caching
233
- * here latched the global config forever: an instance `config` carrying an RTL
234
- * locale flipped the transcript and not the composer, and the
235
- * `requireModelSelection` gate was read off the wrong object. `aparte-chat-bubble`
236
- * has always resolved live, and its JSDoc names this exact race.
220
+ * would latch the global config forever: an instance `config` carrying an RTL
221
+ * locale would flip the transcript and not the composer, and the
222
+ * `requireModelSelection` gate would be read off the wrong object.
223
+ * `aparte-chat-bubble` resolves live too, and its JSDoc names this race.
237
224
  */
238
225
  private get _cfg();
239
226
  /** Only OUR config: a change on another chat's instance must not touch us. */
@@ -245,10 +232,10 @@ export declare class AparteComposer extends HTMLElement {
245
232
  * Mirror `locale.direction` onto ourselves, so everything inside — input, buttons,
246
233
  * the toolbar row and whatever the consumer put in it — inherits it.
247
234
  *
248
- * The direction used to stop at the transcript: only the viewport applied `dir`, so
249
- * an RTL locale flipped the conversation and left the composer left-to-right. It is
250
- * also what makes the toolbar's placement idiom real: `margin-inline-start: auto` in
251
- * a subtree that inherits no direction is just `margin-left`.
235
+ * Without it an RTL locale flips the conversation and leaves the composer
236
+ * left-to-right. It is also what makes the toolbar's placement idiom real:
237
+ * `margin-inline-start: auto` in a subtree that inherits no direction is just
238
+ * `margin-left`.
252
239
  *
253
240
  * One attribute on the host rather than a stamp per child: inheritance is the
254
241
  * mechanism, so nothing needs to know about the consumer's markup.
@@ -264,9 +251,9 @@ export declare class AparteComposer extends HTMLElement {
264
251
  /**
265
252
  * The attribute is the state, so the property writes it. It has to exist: React 19
266
253
  * and Svelte assign the PROPERTY whenever the element has one of that name, and a
267
- * getter alone made `<aparte-composer disabled="">` — a spelling the wrappers type
268
- * as valid — throw and take the render down. `presenceOn` because `''` is what
269
- * those templates hand a presence property (#62).
254
+ * getter alone would make `<aparte-composer disabled="">` — a spelling the wrappers
255
+ * type as valid — throw and take the render down. `presenceOn` because `''` is what
256
+ * those templates hand a presence property.
270
257
  */
271
258
  set disabled(value: boolean);
272
259
  /**
@@ -318,27 +305,23 @@ export declare class AparteComposer extends HTMLElement {
318
305
  *
319
306
  * While a panel is up, the composer is answering a QUESTION, not composing a
320
307
  * message — so the affordances that lead nowhere go away with the text input:
321
- * the attachment picker above all, which stayed clickable while the user was
322
- * being asked something ("on voyait encore l'icône de upload", reported from a
323
- * real session). Ratified decision #8: an affordance nothing can honour is not
324
- * rendered.
308
+ * the attachment picker above all, which would otherwise stay clickable while the
309
+ * user is being asked something. An affordance nothing can honour is not rendered.
325
310
  *
326
311
  * What STAYS, deliberately: the attachments strip, because pending attachments
327
312
  * are the user's state and not an action to offer — hiding them would look like
328
313
  * losing them; and the toolbar, because switching model still does something.
329
314
  *
330
315
  * The send button is the part the PANEL decides, through `mode`. `'submit'`
331
- * keeps it; `'none'` says this panel has no act for it and it is not drawn. That third value is what a panel whose options settle on the first click
332
- * needs — a single-choice question, an approval — and until it existed such a
333
- * panel left a permanently disabled button beside options that never routed
334
- * through it. Flip between them at any time with {@link setPanelSubmitEnabled},
335
- * which is how a panel that grows an act (an "Other…" field, a written
336
- * instruction) turns the button back on.
316
+ * keeps it; `'none'` says this panel has no act for it and it is not drawn. `'none'`
317
+ * is what a panel whose options settle on the first click needs — a single-choice
318
+ * question, an approval. Flip between them at any time with
319
+ * {@link setPanelSubmitEnabled}, which is how a panel that grows an act (an
320
+ * "Other…" field, a written instruction) turns the button back on.
337
321
  *
338
- * Declared with an attribute + CSS rather than the inline `style.display` this
339
- * used to set on a child: an attribute is themeable, is visible to a consumer's
340
- * own rules, and does not clobber a `display` the consumer had set (the restore
341
- * wrote `''`, not the previous value).
322
+ * The mode is declared with an attribute + CSS rather than inline `style.display`
323
+ * on a child: an attribute is themeable, is visible to a consumer's own rules, and
324
+ * does not clobber a `display` the consumer set.
342
325
  *
343
326
  * Returns the TOKEN for this panel. Pass it back to `hidePanel` so a presenter
344
327
  * that has already lost the slot cannot close the panel that replaced it, and
@@ -365,18 +348,6 @@ export declare class AparteComposer extends HTMLElement {
365
348
  * no token it closes whatever is there, which is what a consumer driving the
366
349
  * composer directly means.
367
350
  *
368
- * BOTH forms notify. The no-token form used to call `_teardownPanel` directly,
369
- * which nulls `_panelOnEvict` without ever calling it — so the documented public
370
- * `hidePanel()` closed an open approval panel and left its request pending
371
- * forever. The turn hung on "waiting for you", and because
372
- * `AparteConfig.requestUserInput` chains each request on the previous one, NO
373
- * further question or approval on that config was ever presented again, for the
374
- * life of the page.
375
- *
376
- * The old JSDoc justified the silent branch as "what `reset()` needs". It was not:
377
- * `reset()` calls `_evictPanel()`, which notifies. The branch had no consumer and
378
- * one failure mode.
379
- *
380
351
  * The two forms differ on purpose, and the difference is who already knows:
381
352
  *
382
353
  * - **With a matching token** the OWNER is closing its own panel, which is what
@@ -404,10 +375,10 @@ export declare class AparteComposer extends HTMLElement {
404
375
  /**
405
376
  * Publish the panel mode as an attribute, so CSS can act on it.
406
377
  *
407
- * The same reasoning `data-panel-active` is set for and the same one that took
408
- * the old `style.display` off a child: an attribute is themeable, is visible to
409
- * a consumer's own rules, and does not clobber what the consumer set. It is what
410
- * lets `'none'` remove the send button without this component reaching into it.
378
+ * The same reasoning `data-panel-active` is set for: an attribute is themeable, is
379
+ * visible to a consumer's own rules, and does not clobber what the consumer set. It
380
+ * is what lets `'none'` remove the send button without this component reaching
381
+ * into it.
411
382
  */
412
383
  private _reflectPanelMode;
413
384
  get panelActive(): boolean;
@@ -442,15 +413,12 @@ export declare class AparteComposer extends HTMLElement {
442
413
  * Which chat this composer belongs to: its `target` attribute, or the id of the
443
414
  * chat host above it.
444
415
  *
445
- * All four wrappers set `target` themselves, so the attribute alone identified a
446
- * composer there. In RAW core — the documented quick start, where the markup is
447
- * hand-written — nothing sets it, so `!this.targetId` was true and this composer
448
- * accepted every chat's lifecycle events: on a two-chat page, one chat's Stop
449
- * tore down the other's open elicitation panel while its tool call kept waiting,
450
- * i.e. the question vanished and the turn hung.
416
+ * All four wrappers set `target` themselves. In RAW core — the documented quick
417
+ * start, where the markup is hand-written — nothing sets it, so the chat host above
418
+ * is what identifies the composer; without either, it would accept every chat's
419
+ * lifecycle events and, on a two-chat page, one chat's Stop would tear down the
420
+ * other's open elicitation panel.
451
421
  *
452
- * Found by a two-chat test written for the elicitation presenter, which is the
453
- * only reason it surfaced: raw core with two chats is a shape nothing exercised.
454
422
  * The hosts matched are the ones `aparte-chat-bubble._resolveTargetId()` matches,
455
423
  * for the reason written there — Angular's wrapper root IS `<aparte-chat>`, the
456
424
  * other three render a `[data-aparte-chat]` div.
@@ -473,11 +441,11 @@ export declare class AparteComposer extends HTMLElement {
473
441
  * Whether a terminal event ends the turn this composer is following.
474
442
  *
475
443
  * `_isForThisComposer` answers "is this chat's?", and both turns of a retry belong
476
- * to the same chat: the client aborts the superseded reply, the engine emits
477
- * `run-aborted` for it, and that unwind turned Stop back into Send while the new
478
- * reply was still streaming — and evicted the open panel, i.e. the approval question
479
- * a tool was still waiting on. An event with no `messageId` still ends the turn: a
480
- * loop of one's own saying "done" has always meant this one.
444
+ * to the same chat: the client aborts the superseded reply and the engine emits
445
+ * `run-aborted` for it, which must not turn Stop back into Send while the new reply
446
+ * is still streaming, nor evict the open panel (the approval question a tool is
447
+ * still waiting on). An event with no `messageId` still ends the turn: a loop of
448
+ * one's own saying "done" means this one.
481
449
  */
482
450
  private _isForThisTurn;
483
451
  private _handleMessageStart;
@@ -1 +1 @@
1
- {"version":3,"file":"aparte-composer.d.ts","sourceRoot":"","sources":["../../../src/components/composer/aparte-composer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aparte-composer.d.ts","sourceRoot":"","sources":["../../../src/components/composer/aparte-composer.ts"],"names":[],"mappings":"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"}
@@ -25,8 +25,7 @@ export interface AparteContextThresholdEventDetail {
25
25
  * Two thresholds turn it `warn` then `danger` (`data-level`), and crossing one fires
26
26
  * `aparte-context-threshold`. With `auto-compact`, a turn that ends in `danger` dispatches
27
27
  * `aparte-compact` for its chat — one request at a time, asked again on the next turn in
28
- * `danger` once the plugin has answered — which is what
29
- * a gauge that turns red and then does nothing was missing. What answers the command
28
+ * `danger` once the plugin has answered. What answers the command
30
29
  * is `@aparte/plugin-compaction` (`setupCompaction()`): it summarises what no longer
31
30
  * fits the window and keeps the recent turns. Core itself does not compact — the
32
31
  * gauge asks, the plugin does, and a page without the plugin gets a gauge that only
@@ -40,6 +39,7 @@ export interface AparteContextThresholdEventDetail {
40
39
  * @element aparte-context
41
40
  *
42
41
  * @attr {number} window - The context window, in tokens. Overrides the current model's `contextWindow`.
42
+ * @attr {number} used - Tokens in use before a turn of this page has reported any: a restored conversation's last usage. The next turn's usage replaces it.
43
43
  * @attr {number} warn - Fraction of the window at which the level turns `warn`. Default `0.75`.
44
44
  * @attr {number} danger - Fraction at which it turns `danger`. Default `0.9`.
45
45
  * @attr {boolean} auto-compact - Dispatch `aparte-compact` on each turn that ends in `danger`, one request at a time.
@@ -86,8 +86,13 @@ export declare class AparteContext extends HTMLElement {
86
86
  /** A failed compaction spends the request too; the next `danger` asks again. */
87
87
  private _onCompactError;
88
88
  private _onRerender;
89
- /** Tokens the last turn reported, or `null` before the first turn. */
89
+ /** Tokens the last turn reported — or `used` set, until a turn reports — else `null`. */
90
90
  get used(): number | null;
91
+ /**
92
+ * Writes the `used` attribute: a reading for a conversation restored without a turn of
93
+ * this page, which had nothing to report until the next one. `null` clears it.
94
+ */
95
+ set used(value: number | null);
91
96
  /** The window in force — the attribute, else the current model's. */
92
97
  get window(): number | null;
93
98
  /**
@@ -102,7 +107,7 @@ export declare class AparteContext extends HTMLElement {
102
107
  get level(): AparteContextLevel | null;
103
108
  connectedCallback(): void;
104
109
  disconnectedCallback(): void;
105
- attributeChangedCallback(): void;
110
+ attributeChangedCallback(name: string): void;
106
111
  private _window;
107
112
  /** The chat this gauge watches: `target`, else the chat host above it — the composer's rule. */
108
113
  private _ownTargetId;
@@ -1 +1 @@
1
- {"version":3,"file":"aparte-context.d.ts","sourceRoot":"","sources":["../../../src/components/context/aparte-context.ts"],"names":[],"mappings":"AAGA,0DAA0D;AAC1D,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1D,+FAA+F;AAC/F,MAAM,WAAW,iCAAiC;IAC9C,KAAK,EAAE,kBAAkB,CAAC;IAC1B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAoCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC1C,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,OAAO,CAMb;IAEF;;;;;;OAMG;IACH,OAAO,CAAC,YAAY,CAWlB;IAEF,gFAAgF;IAChF,OAAO,CAAC,eAAe,CAIrB;IAEF,OAAO,CAAC,WAAW,CAA8B;IAEjD,sEAAsE;IACtE,IAAI,IAAI,IAAI,MAAM,GAAG,IAAI,CAExB;IAED,qEAAqE;IACrE,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IAED;;;;;;OAMG;IACH,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAG9B;IAED,2DAA2D;IAC3D,IAAI,KAAK,IAAI,kBAAkB,GAAG,IAAI,CAErC;IAED,iBAAiB,IAAI,IAAI;IAUzB,oBAAoB,IAAI,IAAI;IAO5B,wBAAwB,IAAI,IAAI;IAIhC,OAAO,CAAC,OAAO;IAOf,gGAAgG;IAChG,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,OAAO;CA2FlB"}
1
+ {"version":3,"file":"aparte-context.d.ts","sourceRoot":"","sources":["../../../src/components/context/aparte-context.ts"],"names":[],"mappings":"AAGA,0DAA0D;AAC1D,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1D,+FAA+F;AAC/F,MAAM,WAAW,iCAAiC;IAC9C,KAAK,EAAE,kBAAkB,CAAC;IAC1B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAoCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC1C,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,OAAO,CAMb;IAEF;;;;;;OAMG;IACH,OAAO,CAAC,YAAY,CAWlB;IAEF,gFAAgF;IAChF,OAAO,CAAC,eAAe,CAIrB;IAEF,OAAO,CAAC,WAAW,CAA8B;IAEjD,yFAAyF;IACzF,IAAI,IAAI,IAAI,MAAM,GAAG,IAAI,CAExB;IAED;;;OAGG;IACH,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAG5B;IAED,qEAAqE;IACrE,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IAED;;;;;;OAMG;IACH,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAG9B;IAED,2DAA2D;IAC3D,IAAI,KAAK,IAAI,kBAAkB,GAAG,IAAI,CAErC;IAED,iBAAiB,IAAI,IAAI;IAUzB,oBAAoB,IAAI,IAAI;IAO5B,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ5C,OAAO,CAAC,OAAO;IAOf,gGAAgG;IAChG,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,OAAO;CA2FlB"}
@@ -49,7 +49,7 @@ export interface AparteConversationRenameDetail {
49
49
  * What it is not: a store. Selecting, renaming, pinning, archiving and deleting all
50
50
  * leave the array untouched — the events carry an id (and, for rename, the title) and
51
51
  * stop. Set `manage` and the menu's write gestures are carried out on the conversation
52
- * manager you registered, so those six listeners are no longer yours to write; the
52
+ * manager you registered, so you do not write those six listeners; the
53
53
  * event still goes out first and `preventDefault()` takes the gesture back. The array
54
54
  * is still not this element's: the manager's own change is what re-renders it.
55
55
  * A row's text comes from the array, so it changes when the host assigns
@@ -65,6 +65,7 @@ export interface AparteConversationRenameDetail {
65
65
  * @element aparte-conversation-list
66
66
  * @attr {string} active-id - The id of the conversation to render as selected.
67
67
  * @attr {boolean} flat - Render the rows flat, in host order, with no date headings.
68
+ * @attr {boolean} data-no-match - Reflected BY the element while `filter()` holds a query no title matches. Read-only.
68
69
  * @attr {boolean} loading - The list is on its way: six skeleton rows stand where the rows will be, the
69
70
  * element is `aria-busy` and a visually hidden line names the wait. A list that is
70
71
  * not there yet is not an empty list. Set it while your store answers, clear it when
@@ -149,11 +150,10 @@ export declare class AparteConversationList extends HTMLElement {
149
150
  * Let the list finish the gesture through the registered conversation manager.
150
151
  * Reflected as the `manage` attribute.
151
152
  *
152
- * The property is not a nicety here: this is the attribute that authorises a WRITE,
153
- * and Vue and both Sveltes stringify a bound `false` onto an element that has no
154
- * property of that name — `manage="false"`, which `hasAttribute` reads as on. So
155
- * turning management off turned it on, and a delete the host meant to handle itself
156
- * was also done by the list. `presenceOn`, like `loading` above it.
153
+ * The property exists because this is the attribute that authorises a WRITE, and Vue
154
+ * and both Sveltes stringify a bound `false` onto an element that has no property of
155
+ * that name — `manage="false"`, which `hasAttribute` reads as on. Without it,
156
+ * turning management off would turn it on. `presenceOn`, like `loading` above it.
157
157
  */
158
158
  get manage(): boolean;
159
159
  set manage(value: boolean);
@@ -173,13 +173,12 @@ export declare class AparteConversationList extends HTMLElement {
173
173
  /**
174
174
  * A press holds every render until its click has landed. The host re-assigns
175
175
  * `conversations` on every manager change (a save moves a row, a select marks one),
176
- * and a row replaced between `mousedown` and `mouseup` lost its click: Chromium sent
177
- * it to the list, where the delegated handler matched nothing, and WebKit sent none.
178
- * A conversation clicked while the list settled did not open. Keeping the row node
179
- * would not have saved it: a row moved to its new place leaves the document on the
180
- * way, and the row that moves is often the one pressed (the conversation just
181
- * saved). So nothing changes under a pointer that is down, and the render runs once,
182
- * after the click.
176
+ * and a row replaced between `mousedown` and `mouseup` loses its click: Chromium
177
+ * sends it to the list, where the delegated handler matches nothing, and WebKit
178
+ * sends none. Keeping the row node would not help: a row moved to its new place
179
+ * leaves the document on the way, and the row that moves is often the one pressed
180
+ * (the conversation just saved). So nothing changes under a pointer that is down,
181
+ * and the render runs once, after the click.
183
182
  */
184
183
  private _pressed;
185
184
  private _renderAfterPress;
@@ -188,6 +187,17 @@ export declare class AparteConversationList extends HTMLElement {
188
187
  /** The name this element last wrote, so one the app wrote — before or after connect — is left alone. */
189
188
  private _ownLabel;
190
189
  private _render;
190
+ /** The query `filter()` holds, folded; re-applied on every render, so new rows obey it. */
191
+ private _query;
192
+ /**
193
+ * Show only the conversations whose title contains `query`, case- and
194
+ * accent-insensitive, and the date groups that still hold one; return how many match.
195
+ * An empty query shows everything. The query is kept through every render — a new
196
+ * conversation, a rename — and when nothing matches the list says so in a status line
197
+ * (the locale's `conversationSearchEmpty`) and carries `data-no-match`.
198
+ */
199
+ filter(query: string): number;
200
+ private _applyFilter;
191
201
  private _t;
192
202
  /**
193
203
  * Pinned first, then the calendar buckets every chat product uses, then a heading
@@ -1 +1 @@
1
- {"version":3,"file":"aparte-conversation-list.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-list/aparte-conversation-list.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,0BAA0B;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,8BAA8B;IAC3C,EAAE,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,8BAA8B;IAC3C,EAAE,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,+BAA+B;IAC5C,EAAE,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,2BAA2B;IACxC,EAAE,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,8BAA8B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,0FAA0F;IAC1F,KAAK,EAAE,MAAM,CAAC;CACjB;AAkCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwGG;AACH,qBAAa,sBAAuB,SAAQ,WAAW;IACnD,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,SAAS,CAAuE;IACxF,OAAO,CAAC,gBAAgB,CAAS;IAEjC,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED;;;;;OAKG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAKzB;IAED;;;;;;;;;OASG;IACH,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,EAExB;IAID,iBAAiB,IAAI,IAAI;IAezB,oBAAoB,IAAI,IAAI;IAa5B,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAU9F;;;;;OAKG;IACH,OAAO,CAAC,eAAe,CAIrB;IAIF,sEAAsE;IACtE,IAAI,aAAa,CAAC,KAAK,EAAE,0BAA0B,EAAE,EAGpD;IAED,IAAI,aAAa,IAAI,0BAA0B,EAAE,CAEhD;IAID;;;;;;;;;;OAUG;IACH,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,QAAQ,CAKd;IAEF,OAAO,CAAC,UAAU,CAUhB;IAEF,wGAAwG;IACxG,OAAO,CAAC,SAAS,CAAuB;IAExC,OAAO,CAAC,OAAO;IAmFf,OAAO,CAAC,EAAE;IAKV;;;;;OAKG;IACH,OAAO,CAAC,OAAO;IA6Cf,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,WAAW;IAoCnB,OAAO,CAAC,WAAW;IAkBnB,2FAA2F;IAC3F,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,SAAS;IAsBjB;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,UAAU;IAelB;;;;;;OAMG;IACH,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,oBAAoB,CAE1B;IAEF,OAAO,CAAC,sBAAsB,CAW5B;IAEF,OAAO,CAAC,eAAe,CAErB;IAEF,OAAO,CAAC,WAAW,CAWjB;IAEF;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,aAAa;IAsGrB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,cAAc;IA6BtB,OAAO,CAAC,YAAY;IAsBpB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,QAAQ,CA2Bd;IAEF,OAAO,CAAC,UAAU,CAYhB;IAEF,sEAAsE;IACtE,OAAO,CAAC,kBAAkB;CAQ7B"}
1
+ {"version":3,"file":"aparte-conversation-list.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-list/aparte-conversation-list.ts"],"names":[],"mappings":"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"}
@@ -3,19 +3,18 @@
3
3
  *
4
4
  * Registers itself as the presenter for the config governing its subtree
5
5
  * (`resolveConfig(this)`), so `requestUserInput()` from a tool handler is routed
6
- * here WITHOUT any window events — the typed presenter contract replaces the
7
- * stringly-typed `aparte-ask-user-*` events that drifted in Phase 1.
6
+ * here, through the typed presenter contract rather than window events.
8
7
  *
9
8
  * On a request it builds the schema-appropriate panel (enum / boolean / string /
10
9
  * object) and mounts it inside the nearest `<aparte-composer>` via its
11
10
  * `showPanel` API, resolving:
12
11
  * - accept — the send button (panel submit), when all fields are complete
13
12
  * - decline — the inline "Skip" affordance
14
- * - cancel — the assistant turn was stopped/errored while pending
13
+ * and rejecting with an `AparteElicitationAbortError` when the turn is stopped or
14
+ * errors while the question is open, or when the panel is evicted.
15
15
  *
16
- * Its CSS ships in `@aparte/core/styles.css` like every other component — it used
17
- * to inject its own <style> from here, which made it the one surface that could not
18
- * be themed and whose variables were missing from the generated CSS reference.
16
+ * Its CSS ships in `@aparte/core/styles.css` like every other component, so it can be
17
+ * themed and its variables appear in the generated CSS reference.
19
18
  *
20
19
  * Place anywhere inside the chat (it renders nothing itself):
21
20
  * <aparte-elicitation></aparte-elicitation>
@@ -29,9 +28,7 @@ import type { AparteConfig } from '../../config/aparte-config.js';
29
28
  * `requestUserInput`, or core's own approval gate.
30
29
  *
31
30
  * It dispatches no events on purpose. A request is answered through the typed presenter
32
- * contract, not by listening for one; the `aparte-tool-decision` event this replaced
33
- * existed only because the buttons used to live in a segment renderer with no reference
34
- * to the client.
31
+ * contract, not by listening for one.
35
32
  *
36
33
  * It has no children to project: `connectedCallback` sets
37
34
  * `display: none`, and the composer it presents in is found by walking UP from
@@ -74,7 +71,7 @@ import type { AparteConfig } from '../../config/aparte-config.js';
74
71
  * @cssprop [--aparte-elic-step-padding=var(--aparte-space-2) var(--aparte-space-1)] - Padding of a step tab.
75
72
  * @cssprop [--aparte-elic-step-gap=var(--aparte-space-7)] - Gap between step tabs.
76
73
  * @cssprop [--aparte-elic-step-underline=2px] - Thickness of the current step's underline (a tab, not a pill).
77
- * @cssprop [--aparte-elic-dismiss-room=72px] - Space the tab rail and the question message keep clear for the corner escape. Widen it for a locale whose "Skip" word is wider.
74
+ * @cssprop [--aparte-elic-dismiss-room=104px] - Space the tab rail and the question message keep clear for the corner: the hide button and, on a question, Skip. Widen it for a locale whose "Skip" word is wider.
78
75
  * @cssprop [--aparte-approval-gap=4px] - Gap between the stacked options of an approval request.
79
76
  * @cssprop [--aparte-approval-option-size=0.85rem] - Font size of an approval option button.
80
77
  * @cssprop [--aparte-approval-option-padding=8px 10px] - Padding of an approval option button.
@@ -119,12 +116,9 @@ export declare class AparteElicitation extends HTMLElement implements AparteConf
119
116
  /**
120
117
  * A turn ended — cancel the open question only if it was OUR turn.
121
118
  *
122
- * These two listeners sit on `window` and had no instance filter at all, so a
123
- * Stop (or an error) in one chat cancelled the question a DIFFERENT chat was
124
- * waiting on — and that chat's model was told the user had refused a question
125
- * the user was still looking at. Same defect as the `compact()` handler that
126
- * emptied both chats, which its four sibling handlers in `AparteClient` already
127
- * guarded against.
119
+ * These two listeners sit on `window`, so they filter by instance: a Stop (or an
120
+ * error) in one chat must not cancel the question a DIFFERENT chat is waiting on,
121
+ * whose model would be told the user refused a question they were still looking at.
128
122
  *
129
123
  * The leniency rule is the composer's, deliberately: an event with no
130
124
  * `targetId` is for everyone (a single-chat app never sets one), and a chat we
@@ -174,12 +168,11 @@ export declare class AparteElicitation extends HTMLElement implements AparteConf
174
168
  * The composer to present in: the nearest one in an ancestor subtree, and
175
169
  * nothing else.
176
170
  *
177
- * There used to be a `document.querySelector('aparte-composer')` fallback, which
178
- * is the "first chat on the page" bug this repo has now fixed in four other
179
- * places: on a page with two chats, an elicitation that could not find its own
180
- * composer mounted its panel in the OTHER chat's — so one conversation's question
181
- * appeared under the other conversation, and answering it resolved a tool call
182
- * belonging to a chat the user was not looking at.
171
+ * There is no `document.querySelector('aparte-composer')` fallback: on a page with
172
+ * two chats, an elicitation that could not find its own composer would mount its
173
+ * panel in the OTHER chat's, so one conversation's question would appear under the
174
+ * other conversation, and answering it would resolve a tool call belonging to a
175
+ * chat the user was not looking at.
183
176
  *
184
177
  * Returning `null` instead REJECTS the request, which is honest: nothing was
185
178
  * shown, so nothing was answered. The warning names the fix, because this is a
@@ -1 +1 @@
1
- {"version":3,"file":"aparte-elicitation.d.ts","sourceRoot":"","sources":["../../../src/components/elicitation/aparte-elicitation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAgC,KAAK,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEtG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAiDlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2FG;AACH,qBAAa,iBAAkB,SAAQ,WAAY,YAAW,iBAAiB;IAC3E,OAAO,CAAC,QAAQ,CAAwB;IACxC;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,UAAU,CAKhB;IAEF,OAAO,CAAC,kBAAkB,CAA6B;IAEvD,iBAAiB,IAAI,IAAI;IAiBzB;;;;;;;;;;;OAWG;IACH,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAQrE,oBAAoB,IAAI,IAAI;IAY5B;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,QAAQ,CAwPd;IAEF,OAAO,CAAC,cAAc;IAItB;;;;;;;;;OASG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,YAAY;CAwBvB"}
1
+ {"version":3,"file":"aparte-elicitation.d.ts","sourceRoot":"","sources":["../../../src/components/elicitation/aparte-elicitation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAgC,KAAK,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEtG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAgGlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyFG;AACH,qBAAa,iBAAkB,SAAQ,WAAY,YAAW,iBAAiB;IAC3E,OAAO,CAAC,QAAQ,CAAwB;IACxC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,UAAU,CAKhB;IAEF,OAAO,CAAC,kBAAkB,CAA6B;IAEvD,iBAAiB,IAAI,IAAI;IAiBzB;;;;;;;;;;;OAWG;IACH,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAQrE,oBAAoB,IAAI,IAAI;IAY5B;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,QAAQ,CAmQd;IAEF,OAAO,CAAC,cAAc;IAItB;;;;;;;;;OASG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,YAAY;CAwBvB"}
@@ -21,7 +21,7 @@ export type AparteScrollRailEvery = 'user' | 'message';
21
21
  * surface, never scroll arithmetic), and the first few words of each for the tick's
22
22
  * name. A click is a `scrollIntoView` on the bubble, announced first by a cancelable
23
23
  * `aparte-scroll-rail-jump` so a host that pages history in can load it before the
24
- * jump. Honoured by core alone, so it is live by default (ratified decision #8, tier a).
24
+ * jump. Honoured by core alone, so it is live by default.
25
25
  *
26
26
  * Place it as a direct child of `<aparte-chat>` (or the wrapper's `[data-aparte-chat]`
27
27
  * host): the stylesheet floats it on the transcript's end edge, centred on the transcript
@@ -46,6 +46,7 @@ export type AparteScrollRailEvery = 'user' | 'message';
46
46
  * @cssprop [--aparte-scroll-rail-tick-thickness=2px] - Thickness of a tick.
47
47
  * @cssprop [--aparte-scroll-rail-hit-size=24px] - The pressable zone around a tick (WCAG 2.5.8). The drawn line keeps its own size; this one sizes the pseudo-element and, through the gap below, the pitch — so raising it spaces the ticks out rather than overlapping them. When the ticks would not fit, the rail sets it on itself to the pitch that does, never under 6px.
48
48
  * @cssprop [--aparte-scroll-rail-gap=calc(var(--aparte-scroll-rail-hit-size) - var(--aparte-scroll-rail-tick-thickness))] - Space between ticks: the zone minus the line, so gap + thickness is exactly the pitch. Set it smaller and the zones overlap.
49
+ * @cssprop [--aparte-scroll-rail-room=calc(var(--aparte-scroll-rail-width) + var(--aparte-space-2))] - The lane the chat leaves at its end edge while the rail is in it, the rail sitting there, so no line runs under the ticks. `0px` lets the rail float over the text.
49
50
  * @cssprop [--aparte-scroll-rail-share=.6] - The share of the transcript's height the rail may take. It is the height of its list up to this, centred on the transcript; past it the pitch tightens, then the rail scrolls.
50
51
  * @cssprop [--aparte-scroll-rail-bar=0px] - Published BY the element: the width of the transcript's scrollbar when it is a classic one (0 for an overlay bar), which the stylesheet adds to the rail's end inset so the ticks never sit on the bar.
51
52
  * @cssprop [--aparte-scroll-rail-block-start=0px] - Published BY the element: the distance from the host's top edge to the transcript's, so the rail centres on the transcript rather than on the composer too.
@@ -131,12 +132,11 @@ export declare class AparteScrollRail extends HTMLElement {
131
132
  * intersection observer reports which bubbles reach a reading band — the top 30% of
132
133
  * the surface, from its very top so that the bubble a jump aligned there counts. The
133
134
  * rule is a scrollspy's: the LAST question that has reached the band is the one the
134
- * reader is under. "The largest visible share" was the rule before, and at the bottom
135
- * of a thread of short turns, where three questions sit in the band, it named the
136
- * first of them. Scroll arithmetic was the alternative, and every scroll-position
137
- * rule in the viewport carries a regression note; the one read here is the bottom,
138
- * because at the bottom the reader is under the latest question whatever the band
139
- * holds, and the observer has nothing to report on the last few pixels.
135
+ * reader is under. (The largest visible share would name the first of three questions
136
+ * sitting in the band at the bottom of a thread of short turns.) The one scroll
137
+ * position read is the bottom, because there the reader is under the latest question
138
+ * whatever the band holds, and the observer has nothing to report on the last few
139
+ * pixels.
140
140
  */
141
141
  private _observe;
142
142
  private _unobserve;
@@ -170,14 +170,13 @@ export declare class AparteScrollRail extends HTMLElement {
170
170
  * Scroll the transcript to a message. Announced first, cancelable; then a
171
171
  * `scrollIntoView` on the bubble, smooth unless the reader prefers reduced motion.
172
172
  * The clicked tick is the mark until the transcript has stopped moving: while a
173
- * smooth scroll crosses other questions the band would name each in turn, and it
174
- * ended on the wrong one two times in three before this hold.
173
+ * smooth scroll crosses other questions the band would name each in turn.
175
174
  *
176
175
  * Where the scroll lands is checked once it has settled, and corrected. The bubbles
177
176
  * carry `content-visibility: auto`, so a bubble far from the reader has an estimated
178
177
  * height until it is rendered: the scroll aims at an estimate, the bubbles above it
179
- * take their real size on the way, and the message ends up above or below the top —
180
- * measured from 36px to 1,213px off, in all three engines, the further the worse.
178
+ * take their real size on the way, and the message ends up above or below the top,
179
+ * the further away the worse.
181
180
  * A second `scrollIntoView` from a rendered neighbourhood lands; a few are allowed.
182
181
  */
183
182
  jumpTo(messageId: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"aparte-scroll-rail.d.ts","sourceRoot":"","sources":["../../../src/components/scroll-rail/aparte-scroll-rail.ts"],"names":[],"mappings":"AAIA,yEAAyE;AACzE,MAAM,WAAW,0BAA0B;IACvC,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,qFAAqF;AACrF,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,SAAS,CAAC;AAYvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC7C,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,cAAc,CAAqC;IAC3D,oHAAoH;IACpH,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,mFAAmF;IACnF,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAuB;IACzC,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAA6B;IAC7C,yFAAyF;IACzF,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,iBAAiB,CAAqC;IAC9D,+EAA+E;IAC/E,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,cAAc,CAA4B;IAClD,iDAAiD;IACjD,OAAO,CAAC,YAAY,CAAK;IACzB,8FAA8F;IAC9F,OAAO,CAAC,QAAQ,CAA6B;IAE7C,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,gBAAgB,CAAkC;IAE1D,iEAAiE;IACjE,IAAI,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEpC;IAED,iBAAiB,IAAI,IAAI;IASzB,oBAAoB,IAAI,IAAI;IAO5B,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ5C,uFAAuF;IACvF,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,OAAO;IA8Bf,OAAO,CAAC,OAAO;IAUf,2FAA2F;IAC3F,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,SAAS;IAIjB,+FAA+F;IAC/F,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,QAAQ;IAUhB,sFAAsF;IACtF,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,KAAK;IAIb;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAoEhB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,QAAQ;IAkChB,OAAO,CAAC,UAAU;IAYlB,kGAAkG;IAClG,OAAO,CAAC,aAAa,CAOnB;IAEF,6GAA6G;IAC7G,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,WAAW;IAanB,0FAA0F;IAC1F,OAAO,CAAC,OAAO;IAWf,0FAA0F;IAC1F,OAAO,CAAC,MAAM;IAOd;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,OAAO;IA2Cf,OAAO,CAAC,QAAQ,CAMd;IAEF,sEAAsE;IACtE,OAAO,CAAC,UAAU,CAchB;IAEF;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAe/B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,SAAS;IAKjB,qFAAqF;IACrF,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,WAAW;IAKnB,iGAAiG;IACjG,OAAO,CAAC,OAAO;IAiBf,OAAO,CAAC,QAAQ;CAOnB"}
1
+ {"version":3,"file":"aparte-scroll-rail.d.ts","sourceRoot":"","sources":["../../../src/components/scroll-rail/aparte-scroll-rail.ts"],"names":[],"mappings":"AAIA,yEAAyE;AACzE,MAAM,WAAW,0BAA0B;IACvC,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,qFAAqF;AACrF,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,SAAS,CAAC;AAYvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC7C,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,cAAc,CAAqC;IAC3D,oHAAoH;IACpH,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,mFAAmF;IACnF,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAuB;IACzC,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAA6B;IAC7C,yFAAyF;IACzF,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,iBAAiB,CAAqC;IAC9D,+EAA+E;IAC/E,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,cAAc,CAA4B;IAClD,iDAAiD;IACjD,OAAO,CAAC,YAAY,CAAK;IACzB,8FAA8F;IAC9F,OAAO,CAAC,QAAQ,CAA6B;IAE7C,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,gBAAgB,CAAkC;IAE1D,iEAAiE;IACjE,IAAI,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEpC;IAED,iBAAiB,IAAI,IAAI;IASzB,oBAAoB,IAAI,IAAI;IAO5B,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ5C,uFAAuF;IACvF,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,OAAO;IA8Bf,OAAO,CAAC,OAAO;IAUf,2FAA2F;IAC3F,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,SAAS;IAIjB,+FAA+F;IAC/F,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,QAAQ;IAUhB,sFAAsF;IACtF,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,KAAK;IAIb;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAoEhB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,QAAQ;IAkChB,OAAO,CAAC,UAAU;IAYlB,kGAAkG;IAClG,OAAO,CAAC,aAAa,CAOnB;IAEF,6GAA6G;IAC7G,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,WAAW;IAanB,0FAA0F;IAC1F,OAAO,CAAC,OAAO;IAWf,0FAA0F;IAC1F,OAAO,CAAC,MAAM;IAOd;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,OAAO;IA2Cf,OAAO,CAAC,QAAQ,CAMd;IAEF,sEAAsE;IACtE,OAAO,CAAC,UAAU,CAchB;IAEF;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAoB/B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,SAAS;IAKjB,qFAAqF;IACrF,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,WAAW;IAKnB,iGAAiG;IACjG,OAAO,CAAC,OAAO;IAoBf,OAAO,CAAC,QAAQ;CAOnB"}
@@ -124,6 +124,10 @@ export declare class AparteSidebar extends HTMLElement {
124
124
  * Same convention as `_relabel`, which leaves a host-authored `aria-label` alone.
125
125
  */
126
126
  private _ownHidden;
127
+ /** The query `filter()` was last given, kept so the sidebar's no-match can follow its lists. */
128
+ private _query;
129
+ /** Watches the lists' own `data-no-match` and `loading`, which change with their renders. */
130
+ private _listWatch;
127
131
  /** Whether the sidebar is collapsed (hidden in the flow, or closed as a drawer). */
128
132
  get collapsed(): boolean;
129
133
  set collapsed(value: boolean);
@@ -190,10 +194,19 @@ export declare class AparteSidebar extends HTMLElement {
190
194
  private _onDocumentClick;
191
195
  private _onInput;
192
196
  /**
193
- * Hide the conversation rows whose title does not contain `query`, and the date
194
- * groups left empty. Case- and accent-insensitive. An empty query shows everything.
197
+ * Filter the conversation lists inside by title (case- and accent-insensitive; an
198
+ * empty query shows everything), and return how many conversations match. Each list
199
+ * keeps the query through its own renders and says when nothing matches; the
200
+ * sidebar carries `data-no-match` then too.
195
201
  */
196
- filter(query: string): void;
202
+ filter(query: string): number;
203
+ private _lists;
204
+ /**
205
+ * `data-no-match` while the held query matches nothing in any list — read from the lists
206
+ * themselves, so it follows their renders (a conversation that matches arriving, the last
207
+ * match leaving) and is never set while one of them is still loading.
208
+ */
209
+ private _syncNoMatch;
197
210
  private _onConfigChange;
198
211
  private _relabel;
199
212
  }
@@ -1 +1 @@
1
- {"version":3,"file":"aparte-sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/aparte-sidebar.ts"],"names":[],"mappings":"AAIA,iEAAiE;AACjE,MAAM,WAAW,yBAAyB;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,MAAM,EAAE,OAAO,CAAC;CACnB;AAKD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC1C,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAA4B;IAC1C,0EAA0E;IAC1E,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,cAAc,CAAwB;IAE9C;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAS;IAEvB;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAAS;IAE9B;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB,CAAS;IAElC,qGAAqG;IACrG,OAAO,CAAC,KAAK,CAAS;IAEtB;;;;;OAKG;IACH,OAAO,CAAC,UAAU,CAAS;IAE3B,oFAAoF;IACpF,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,OAAO,EAE3B;IAED,iFAAiF;IACjF,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,iBAAiB,IAAI,IAAI;IA2BzB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAexB,oBAAoB,IAAI,IAAI;IAU5B,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA+B5C,0FAA0F;IAC1F,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI;IAKhC,KAAK,IAAI,IAAI;IAIb,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI;IAOlC,OAAO,CAAC,cAAc,CAAkE;IAExF;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAepB;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAgBpB,wFAAwF;IACxF,OAAO,CAAC,OAAO;IAKf;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,WAAW;IAYnB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,UAAU,CAiChB;IAEF,8FAA8F;IAC9F,OAAO,CAAC,gBAAgB,CAOtB;IAIF,OAAO,CAAC,QAAQ,CAId;IAEF;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAe3B,OAAO,CAAC,eAAe,CAA+B;IAEtD,OAAO,CAAC,QAAQ;CAMnB"}
1
+ {"version":3,"file":"aparte-sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/aparte-sidebar.ts"],"names":[],"mappings":"AAKA,iEAAiE;AACjE,MAAM,WAAW,yBAAyB;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,MAAM,EAAE,OAAO,CAAC;CACnB;AAKD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC1C,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAA4B;IAC1C,0EAA0E;IAC1E,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,cAAc,CAAwB;IAE9C;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAS;IAEvB;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAAS;IAE9B;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB,CAAS;IAElC,qGAAqG;IACrG,OAAO,CAAC,KAAK,CAAS;IAEtB;;;;;OAKG;IACH,OAAO,CAAC,UAAU,CAAS;IAC3B,gGAAgG;IAChG,OAAO,CAAC,MAAM,CAAM;IACpB,6FAA6F;IAC7F,OAAO,CAAC,UAAU,CAAiC;IAEnD,oFAAoF;IACpF,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,OAAO,EAE3B;IAED,iFAAiF;IACjF,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,iBAAiB,IAAI,IAAI;IAiCzB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAexB,oBAAoB,IAAI,IAAI;IAY5B,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA+B5C,0FAA0F;IAC1F,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI;IAKhC,KAAK,IAAI,IAAI;IAIb,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI;IAOlC,OAAO,CAAC,cAAc,CAAkE;IAExF;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAepB;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAgBpB,wFAAwF;IACxF,OAAO,CAAC,OAAO;IAKf;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,WAAW;IAYnB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,UAAU,CAiChB;IAEF,8FAA8F;IAC9F,OAAO,CAAC,gBAAgB,CAOtB;IAIF,OAAO,CAAC,QAAQ,CAId;IAEF;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAqB7B,OAAO,CAAC,MAAM;IAId;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,eAAe,CAA+B;IAEtD,OAAO,CAAC,QAAQ;CAMnB"}