@aparte/core 0.19.2 → 0.20.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 (151) hide show
  1. package/README.md +6 -1
  2. package/dist/client/aparte-client.d.ts +76 -97
  3. package/dist/client/aparte-client.d.ts.map +1 -1
  4. package/dist/client/stream-adapter.d.ts +7 -13
  5. package/dist/client/stream-adapter.d.ts.map +1 -1
  6. package/dist/client/wire-history.d.ts +4 -5
  7. package/dist/client/wire-history.d.ts.map +1 -1
  8. package/dist/components/bubble/aparte-chat-bubble.d.ts +89 -58
  9. package/dist/components/bubble/aparte-chat-bubble.d.ts.map +1 -1
  10. package/dist/components/bubble/bubble-sync.d.ts +1 -1
  11. package/dist/components/chat/aparte-chat.d.ts +15 -13
  12. package/dist/components/chat/aparte-chat.d.ts.map +1 -1
  13. package/dist/components/chat/glide-gate.d.ts +13 -0
  14. package/dist/components/chat/glide-gate.d.ts.map +1 -0
  15. package/dist/components/composer/aparte-composer-action.d.ts +3 -3
  16. package/dist/components/composer/aparte-composer-add-attachment.d.ts +2 -2
  17. package/dist/components/composer/aparte-composer-cancel.d.ts +1 -1
  18. package/dist/components/composer/aparte-composer-input.d.ts +4 -7
  19. package/dist/components/composer/aparte-composer-input.d.ts.map +1 -1
  20. package/dist/components/composer/aparte-composer-send.d.ts +9 -11
  21. package/dist/components/composer/aparte-composer-send.d.ts.map +1 -1
  22. package/dist/components/composer/aparte-composer.d.ts +50 -80
  23. package/dist/components/composer/aparte-composer.d.ts.map +1 -1
  24. package/dist/components/context/aparte-context.d.ts +13 -7
  25. package/dist/components/context/aparte-context.d.ts.map +1 -1
  26. package/dist/components/conversation-list/aparte-conversation-list.d.ts +25 -13
  27. package/dist/components/conversation-list/aparte-conversation-list.d.ts.map +1 -1
  28. package/dist/components/elicitation/aparte-elicitation.d.ts +15 -22
  29. package/dist/components/elicitation/aparte-elicitation.d.ts.map +1 -1
  30. package/dist/components/scroll-rail/aparte-scroll-rail.d.ts +10 -11
  31. package/dist/components/scroll-rail/aparte-scroll-rail.d.ts.map +1 -1
  32. package/dist/components/sidebar/aparte-sidebar.d.ts +16 -3
  33. package/dist/components/sidebar/aparte-sidebar.d.ts.map +1 -1
  34. package/dist/components/split/aparte-split.d.ts +12 -3
  35. package/dist/components/split/aparte-split.d.ts.map +1 -1
  36. package/dist/components/status/aparte-chat-status.d.ts +5 -3
  37. package/dist/components/status/aparte-chat-status.d.ts.map +1 -1
  38. package/dist/components/suggestions/aparte-suggestions.d.ts +6 -9
  39. package/dist/components/suggestions/aparte-suggestions.d.ts.map +1 -1
  40. package/dist/components/viewport/aparte-chat-viewport.d.ts +76 -69
  41. package/dist/components/viewport/aparte-chat-viewport.d.ts.map +1 -1
  42. package/dist/config/aparte-config.d.ts +169 -141
  43. package/dist/config/aparte-config.d.ts.map +1 -1
  44. package/dist/config/icon-provider.d.ts +19 -2
  45. package/dist/config/icon-provider.d.ts.map +1 -1
  46. package/dist/config/index.d.ts +1 -1
  47. package/dist/config/index.d.ts.map +1 -1
  48. package/dist/config/locale.d.ts +61 -89
  49. package/dist/config/locale.d.ts.map +1 -1
  50. package/dist/config/sanitize.d.ts.map +1 -1
  51. package/dist/conversations/conversation-controller.d.ts +18 -3
  52. package/dist/conversations/conversation-controller.d.ts.map +1 -1
  53. package/dist/conversations/conversation-manager.d.ts +6 -6
  54. package/dist/conversations/conversation-manager.d.ts.map +1 -1
  55. package/dist/conversations/index.d.ts +1 -1
  56. package/dist/conversations/index.d.ts.map +1 -1
  57. package/dist/custom-elements.json +5656 -4759
  58. package/dist/{dialog-triggers-CEazY76J.js → dialog-triggers-3Rk7PuZa.js} +555 -375
  59. package/dist/dialog-triggers-3Rk7PuZa.js.map +1 -0
  60. package/dist/elicitation/approval-panel.d.ts.map +1 -1
  61. package/dist/elicitation/index.d.ts +6 -1
  62. package/dist/elicitation/index.d.ts.map +1 -1
  63. package/dist/elicitation/panel.d.ts +11 -21
  64. package/dist/elicitation/panel.d.ts.map +1 -1
  65. package/dist/elicitation/types.d.ts +19 -27
  66. package/dist/elicitation/types.d.ts.map +1 -1
  67. package/dist/generated/element-attributes.d.ts +16 -10
  68. package/dist/generated/element-attributes.d.ts.map +1 -1
  69. package/dist/host/aparte-chat-host.d.ts +17 -32
  70. package/dist/host/aparte-chat-host.d.ts.map +1 -1
  71. package/dist/icons/extended.d.ts +1 -2
  72. package/dist/icons/extended.d.ts.map +1 -1
  73. package/dist/icons.d.ts +6 -8
  74. package/dist/icons.d.ts.map +1 -1
  75. package/dist/icons.js.map +1 -1
  76. package/dist/index.css +1 -1
  77. package/dist/index.d.ts +13 -10
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +775 -337
  80. package/dist/index.js.map +1 -1
  81. package/dist/index.node.d.ts +7 -4
  82. package/dist/index.node.d.ts.map +1 -1
  83. package/dist/index.node.js +2 -2
  84. package/dist/index.node.js.map +1 -1
  85. package/dist/interop/dialog-triggers.d.ts +2 -2
  86. package/dist/interop/element-props.d.ts +16 -27
  87. package/dist/interop/element-props.d.ts.map +1 -1
  88. package/dist/parsers/aparte-stream-parser.d.ts.map +1 -1
  89. package/dist/primitives/icon/aparte-icon.d.ts.map +1 -1
  90. package/dist/primitives/select/aparte-option.d.ts +3 -2
  91. package/dist/primitives/select/aparte-option.d.ts.map +1 -1
  92. package/dist/primitives/select/aparte-select.d.ts +24 -21
  93. package/dist/primitives/select/aparte-select.d.ts.map +1 -1
  94. package/dist/renderers/markdown-stream.d.ts.map +1 -1
  95. package/dist/renderers/segment-renderers.d.ts +11 -17
  96. package/dist/renderers/segment-renderers.d.ts.map +1 -1
  97. package/dist/renderers/segments/code.d.ts.map +1 -1
  98. package/dist/renderers/segments/error.d.ts.map +1 -1
  99. package/dist/renderers/segments/text.d.ts.map +1 -1
  100. package/dist/renderers/segments/thinking.d.ts.map +1 -1
  101. package/dist/renderers/segments/tool-call.d.ts.map +1 -1
  102. package/dist/runtime/message-repository.d.ts +8 -15
  103. package/dist/runtime/message-repository.d.ts.map +1 -1
  104. package/dist/transport/agent-handler.d.ts +2 -0
  105. package/dist/transport/agent-handler.d.ts.map +1 -1
  106. package/dist/transport/backend-handler.d.ts +4 -6
  107. package/dist/transport/backend-handler.d.ts.map +1 -1
  108. package/dist/transport/backend-transport.d.ts +15 -1
  109. package/dist/transport/backend-transport.d.ts.map +1 -1
  110. package/dist/transport/types.d.ts +7 -10
  111. package/dist/transport/types.d.ts.map +1 -1
  112. package/dist/types/chat.d.ts +10 -18
  113. package/dist/types/chat.d.ts.map +1 -1
  114. package/dist/types/element-attributes.d.ts +6 -12
  115. package/dist/types/element-attributes.d.ts.map +1 -1
  116. package/dist/types/element-map.d.ts +6 -19
  117. package/dist/types/element-map.d.ts.map +1 -1
  118. package/dist/types/event-map.d.ts +11 -17
  119. package/dist/types/event-map.d.ts.map +1 -1
  120. package/dist/types/events.d.ts +5 -14
  121. package/dist/types/events.d.ts.map +1 -1
  122. package/dist/types/imperative-api.d.ts +3 -1
  123. package/dist/types/imperative-api.d.ts.map +1 -1
  124. package/dist/types/index.d.ts +4 -4
  125. package/dist/types/index.d.ts.map +1 -1
  126. package/dist/types/model-provider.d.ts +7 -9
  127. package/dist/types/model-provider.d.ts.map +1 -1
  128. package/dist/types/segments.d.ts +29 -13
  129. package/dist/types/segments.d.ts.map +1 -1
  130. package/dist/types/tools.d.ts +21 -23
  131. package/dist/types/tools.d.ts.map +1 -1
  132. package/dist/utils/copy-text.d.ts +1 -2
  133. package/dist/utils/copy-text.d.ts.map +1 -1
  134. package/dist/utils/css-escape.d.ts +1 -1
  135. package/dist/utils/escape.d.ts +4 -19
  136. package/dist/utils/escape.d.ts.map +1 -1
  137. package/dist/utils/files-to-attachments.d.ts +2 -2
  138. package/dist/utils/fold-text.d.ts +13 -0
  139. package/dist/utils/fold-text.d.ts.map +1 -0
  140. package/dist/utils/is-awaiting-reply.d.ts +2 -5
  141. package/dist/utils/is-awaiting-reply.d.ts.map +1 -1
  142. package/dist/utils/presence.d.ts +5 -5
  143. package/dist/utils/segments.d.ts +54 -78
  144. package/dist/utils/segments.d.ts.map +1 -1
  145. package/dist/utils/tool-input.d.ts +1 -1
  146. package/dist/utils/tool-input.d.ts.map +1 -1
  147. package/dist/utils/transcript.d.ts +2 -2
  148. package/dist/utils/uuid.d.ts +0 -11
  149. package/dist/utils/uuid.d.ts.map +1 -1
  150. package/package.json +30 -4
  151. package/dist/dialog-triggers-CEazY76J.js.map +0 -1
package/README.md CHANGED
@@ -2,9 +2,14 @@
2
2
 
3
3
  [![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://www.webcomponents.org/element/@aparte/core)
4
4
 
5
- Framework-agnostic AI chat UI as **vanilla Web Components, with the agent loop inside** —
5
+ AI chat and agent UI components as **vanilla Web Components, with the agent loop inside** —
6
6
  zero third-party dependencies, ESM-only, usable in any framework or none.
7
7
 
8
+ The conversation, messages, reasoning, tool calls a human approves, the questions an agent
9
+ asks, the composer, the layout around the chat (app shell, sidebar, conversation list) and a
10
+ UI kit for the rest of the app — each one [shown live with its variants](https://apartejs.dev/components/),
11
+ and assembled into [templates](https://apartejs.dev/templates/) you can copy.
12
+
8
13
  > **Beta.** On npm, released in lockstep with every other `@aparte/*` package — the
9
14
  > version number is a plain `0.x`, and the declared surface is
10
15
  > [frozen as of 0.17.0](https://apartejs.dev/reference/stability/): it leaves only
@@ -22,8 +22,8 @@ export type AparteToolApprovalResolver = (call: {
22
22
  * What the user said to do instead, on a refusal.
23
23
  *
24
24
  * It becomes the `tool` message the model reads, which is possible at all only
25
- * because a refusal now hands the model a turn. Optional and additive: a resolver
26
- * that returns a bare `{ approved }` behaves exactly as before.
25
+ * because a refusal hands the model a turn. Optional: a resolver that returns a
26
+ * bare `{ approved }` is valid.
27
27
  */
28
28
  instruction?: string;
29
29
  /**
@@ -91,7 +91,7 @@ export interface AparteClientOptions {
91
91
  * that cutoff; a turn a host seeded with NO `status` counts
92
92
  * as answered, so a restored or server-rendered transcript
93
93
  * goes out as history without inventing a status for it.
94
- * - 'none' — sends only the current message (original behavior)
94
+ * - 'none' — sends only the current message
95
95
  * - function — custom: receives viewport messages, returns AparteChatMessage[]
96
96
  */
97
97
  history?: 'viewport' | 'none' | ((viewportMessages: AparteMessage[]) => AparteChatMessage[]);
@@ -133,10 +133,9 @@ export interface AparteClientOptions {
133
133
  /**
134
134
  * Whether a send appends the optimistic USER bubble before the reply streams.
135
135
  *
136
- * Default `true` — and opt-OUT on purpose: the bubble used to be the host's job
137
- * on every path, everyone wrote the same `aparte-send` handler, and whoever
138
- * forgot shipped a chat where the person cannot see what they typed. It
139
- * compiles, it streams, and nothing errors.
136
+ * Default `true` — and opt-OUT on purpose: if the host had to append the bubble,
137
+ * whoever forgot would ship a chat where the person cannot see what they typed.
138
+ * It compiles, it streams, and nothing errors.
140
139
  *
141
140
  * Pass `false` when the host owns its transcript and appends the user message
142
141
  * itself — the four framework wrappers do (their ConversationController is
@@ -155,8 +154,7 @@ export interface AparteClientOptions {
155
154
  * types (including images) are routed to the application layer. Used
156
155
  * when images go through a captioning pipeline before RAG ingest, so
157
156
  * the chat context only ever sees retrieved text — never raw image
158
- * bytes. Saves bytes on every turn and matches the offline-first
159
- * intent (read file once at upload, retrieve text-only forever after).
157
+ * bytes. Saves bytes on every turn.
160
158
  *
161
159
  * Set `'images-only'` when a `requestInterceptor` retrieves relevant
162
160
  * document chunks and injects them as a system message instead, to avoid
@@ -214,15 +212,13 @@ export declare class AparteClient {
214
212
  /**
215
213
  * Does this window event belong to this client?
216
214
  *
217
- * One rule for all four handlers, because it used to be near-copies and
218
- * one omission: `aparte-compact` (answered here until 0.16.0) had no guard at all, so in the two-client
219
- * layout the JSDoc documents, a single compact event made BOTH clients run —
220
- * two paid summarisation calls against whichever chat the DOM scan found
221
- * first, and a global reset that wiped the other conversation.
215
+ * One rule for all the window-event handlers, so none of them can lack the guard:
216
+ * in a two-client layout an unguarded event would make BOTH clients run — two paid
217
+ * calls against whichever chat the DOM scan found first.
222
218
  *
223
- * A scoped client also answers only events ADDRESSED to it. The old guard let
224
- * an untargeted event through to every scoped client, which turned one
225
- * broadcast into an action on every chat on the page.
219
+ * A scoped client also answers only events ADDRESSED to it; an untargeted event is
220
+ * not let through to every scoped client, or one broadcast would act on every chat
221
+ * on the page.
226
222
  */
227
223
  private _isForThisInstance;
228
224
  /** Aborts the in-flight vendor/transport fetch when the user stops a stream. */
@@ -230,31 +226,33 @@ export declare class AparteClient {
230
226
  private options;
231
227
  /** Config read by this client — an instance config, or the global default. */
232
228
  private readonly _config;
229
+ /**
230
+ * A `keyResolver` becomes a key source on the client's config at once, before `start()`,
231
+ * so everything that needs a key can use it — the model selector's list included.
232
+ * `autoRegister` (on by default) installs core's built-in renderers on that config.
233
+ */
233
234
  constructor(options?: AparteClientOptions);
234
235
  /**
235
236
  * What every fresh user action does before it starts a turn.
236
237
  *
237
- * Clearing the abort flag has to happen at the START of the action rather than inside
238
+ * Clearing the abort flag happens at the START of the action rather than inside
238
239
  * `_streamTurn`, which runs after the auth and file-reading awaits — a reset there
239
- * erased an abort that arrived while the user was still waiting for a large attachment
240
- * to be read.
240
+ * would erase an abort that arrived while the user was still waiting for a large
241
+ * attachment to be read.
241
242
  *
242
243
  * The superseded turn's TOOL handlers are not cancelled here, and do not need a
243
244
  * registry of their own: `_streamTurn` aborts the previous `_streamController`, and
244
245
  * the engine links every tool handler's controller to that run signal
245
- * (`invokeToolHandler`), so cutting the stream cuts its tools. A `Set<AbortController>`
246
- * used to sit here for that job and was never added to — three lines of loop over an
247
- * empty set, plus a paragraph describing a cancellation the method did not perform.
246
+ * (`invokeToolHandler`), so cutting the stream cuts its tools.
248
247
  */
249
248
  private _beginUserTurn;
250
249
  /**
251
250
  * Put this client's `keyResolver` on its config, and hold the teardown so
252
251
  * `stop()` can take it back off.
253
252
  *
254
- * The registration used to be fire-and-forget, so it outlived the client that
255
- * made it: a stopped client kept signing model-list requests, and a remount —
256
- * the way the wrappers document swapping options — added a source behind the
257
- * one it meant to replace instead of replacing it. Idempotent, so the usual
253
+ * The teardown means a stopped client stops signing model-list requests, and a
254
+ * remount — the way the wrappers document swapping options — replaces the source
255
+ * instead of adding one behind it. Idempotent, so the usual
258
256
  * `new AparteClient({…}).start()` registers once.
259
257
  */
260
258
  private _registerKeyResolver;
@@ -264,11 +262,14 @@ export declare class AparteClient {
264
262
  */
265
263
  private _setupListeners;
266
264
  /**
267
- * Start listening for aparte-send events on the window.
265
+ * Answer the chats: listen on `window` for `aparte-send`, `aparte-retry`, `aparte-edit`,
266
+ * `aparte-abort` and `aparte-conversation-loaded`. Nothing streams before this is
267
+ * called. Starting a stopped client puts its `keyResolver` back on the config.
268
268
  */
269
269
  start(): void;
270
270
  /**
271
- * Stop listening.
271
+ * Stop answering: abort the reply in flight, take this client's `keyResolver` off the
272
+ * config, and remove the listeners.
272
273
  */
273
274
  stop(): void;
274
275
  /**
@@ -279,27 +280,21 @@ export declare class AparteClient {
279
280
  /**
280
281
  * Ask the human at the COMPOSER, and report what they decided.
281
282
  *
282
- * The default channel, replacing a `document` listener for `aparte-tool-decision`
283
- * that existed only because the buttons lived in a segment renderer with no
284
- * reference to this client. Routing through `requestUserInput` puts the decision
283
+ * The default channel. Routing through `requestUserInput` puts the decision
285
284
  * where every other request for the user already goes, which is the whole point:
286
285
  * one queue, one panel slot, one teardown, and the same behaviour whether the
287
286
  * request came from a tool handler or from this gate.
288
287
  *
289
288
  * The tool NAME is the question and its ARGUMENTS are the body, because the
290
289
  * arguments are what is being approved — a decision surface that names the act and
291
- * hides its subject asks for a signature on a blank page. This paragraph used to
292
- * say the opposite ("the arguments stay in the transcript"), and the guide beside
293
- * it had always promised what the panel did not do. The transcript row stays the
294
- * anchor; it is no longer the only place the call can be read. The panel is capped
290
+ * hides its subject asks for a signature on a blank page. The transcript row stays the
291
+ * anchor, but it is not the only place the call can be read. The panel is capped
295
292
  * at 50vh and the block inside it scrolls, so a long input cannot push the options
296
293
  * off the surface they are asked on.
297
294
  *
298
- * `aparte-tool-decision` is GONE with the buttons that dispatched it, and so is the
299
- * `document` listener that answered it. It existed only because a segment renderer
300
- * has no reference to this client; two seams that can disagree about who answers a
301
- * decision are one seam too many, and the ratified elicitation rule already said so
302
- * — "a typed presenter registered per config instance, never window events". A host
295
+ * There is no `aparte-tool-decision` event and no `document` listener that answers
296
+ * one: a decision is answered by a typed presenter registered per config instance,
297
+ * never by a window event. A host
303
298
  * that wants to answer programmatically registers an `approvalResolver` (headless,
304
299
  * no DOM) or its own presenter, both strictly more capable than an id on an event.
305
300
  */
@@ -340,29 +335,21 @@ export declare class AparteClient {
340
335
  /**
341
336
  * The registered tools, unless the current model says it cannot call one.
342
337
  *
343
- * Single source for the gate, so send / retry / edit cannot drift — that drift
344
- * is what once shipped `tools` on the initial send while retry and edit omitted
345
- * them.
346
- *
347
- * The gate used to be "the model DECLARES function_calling", defaulting to
348
- * stripping — and that made the whole tool surface unreachable on the primary
349
- * documented path. Three things had to line up for a tool to be sent, and one
350
- * never did: the app sets a model id by hand (`setModelConfig`) or a selector
351
- * sets it from a fetched list, and in both cases the model's declared
352
- * capabilities are commonly unknown. `undefined` capabilities then read as "no
353
- * function calling", so `tools: []` went on the wire while `getTools()` held
354
- * the tool the app had explicitly registered. The model answered, correctly,
355
- * that it had no such tool, and nothing anywhere said why.
356
- *
357
- * So the question is now "did this model say it cannot", not "did it say it
358
- * can". Registering a tool is an explicit act by the app; silently dropping it
338
+ * Single source for the gate, so send / retry / edit cannot drift.
339
+ *
340
+ * The question is "did this model say it cannot", not "did it say it can": the
341
+ * app sets a model id by hand (`setModelConfig`) or a selector sets it from a
342
+ * fetched list, and in both cases the model's declared capabilities are commonly
343
+ * unknown. `undefined` capabilities read as "can", or `tools: []` would go on
344
+ * the wire while `getTools()` held the tool the app had explicitly registered,
345
+ * and the model would answer that it had no such tool. Registering a tool is an explicit act by the app; silently dropping it
359
346
  * because a `/models` listing is terse is the library second-guessing the
360
347
  * developer. A model that declares its capabilities and omits function calling
361
348
  * is still honoured — that is a statement, and it is respected.
362
349
  *
363
350
  * Failure modes, both ways round: over-sending means a model that cannot use
364
351
  * tools does not call one, or its own endpoint rejects the array with an error
365
- * the developer can read. Under-sending was silent, total, and looked like a
352
+ * the developer can read. Under-sending would be silent, total, and look like a
366
353
  * lying model.
367
354
  */
368
355
  private _toolsForCurrentModel;
@@ -371,10 +358,9 @@ export declare class AparteClient {
371
358
  * The system messages a turn opens with: the app's own template, then the registered
372
359
  * tools' `systemPrompt`s.
373
360
  *
374
- * A helper rather than three copies. The two lines it replaces were written out at each
375
- * of the three turn entry points (send, retry, edit), which is exactly how the tool half
376
- * would have been added to two of them and forgotten in the third — the same shape as
377
- * the abort-flag asymmetry `_beginUserTurn` exists to prevent.
361
+ * One helper for the three turn entry points (send, retry, edit), so the tool half
362
+ * cannot be added to two of them and forgotten in the third — the same shape as the
363
+ * abort-flag asymmetry `_beginUserTurn` exists to prevent.
378
364
  */
379
365
  private _systemMessages;
380
366
  /**
@@ -396,11 +382,11 @@ export declare class AparteClient {
396
382
  * The trees a lookup must search, the one the gesture came from FIRST.
397
383
  *
398
384
  * `document.getElementById` and `document.querySelectorAll` cannot see into a shadow
399
- * root, so a chat mounted in one — the arrangement the theming guide endorses — was
400
- * invisible to both: alone, the send was dropped with a warning; on a page that also
401
- * holds a chat in the light DOM, the scan answered with the WRONG chat, so the
402
- * person's message AND the model's reply landed in a transcript they never typed
403
- * into. Nearest tree first is what keeps it from swapping the other way round.
385
+ * root, so a chat mounted in one — the arrangement the theming guide endorses — is
386
+ * invisible to both: alone, the send would be dropped with a warning; on a page that
387
+ * also holds a chat in the light DOM, the scan would answer with the WRONG chat, and
388
+ * the person's message AND the model's reply would land in a transcript they never
389
+ * typed into. Nearest tree first keeps it from swapping the other way round.
404
390
  */
405
391
  private _rootsFor;
406
392
  /** The element an id names, looked up in the gesture's own tree before the document. */
@@ -442,8 +428,8 @@ export declare class AparteClient {
442
428
  * The SLICE is each caller's own business — retry cuts before the reply it is
443
429
  * regenerating, edit cuts after the message being reworded, send cuts at the last
444
430
  * answered turn. What a message CONTRIBUTES to the wire is not: send, retry and
445
- * edit must not disagree about it, and they did. This one had no filter at all,
446
- * so a failed turn and a turn stopped before its first token both went out as
431
+ * edit must not disagree about it. A failed turn and a turn stopped before its
432
+ * first token are filtered out rather than sent as
447
433
  * `{ role: 'assistant', content: '' }` — a claim the assistant said nothing, which
448
434
  * some providers reject outright and the rest read as an empty reply worth
449
435
  * imitating.
@@ -472,12 +458,12 @@ export declare class AparteClient {
472
458
  * the question the history gates can ask is "is this still in flight?", never
473
459
  * "is this completed?".
474
460
  *
475
- * The gates below used to ask the second one, and a host that SEEDS a transcript
461
+ * The gates below ask the first, because a host that SEEDS a transcript
476
462
  * — restoring a saved conversation, hydrating a server-rendered one — has no
477
- * reason to invent a status for turns that are already over. With none, the
478
- * cutoff never advanced past 0 and the whole transcript was sliced away: the
479
- * model got the new question with no context, and nothing in the UI said so,
480
- * because the viewport still showed every message.
463
+ * reason to invent a status for turns that are already over. Asking "is this
464
+ * completed?" would leave the cutoff at 0 and slice away the whole transcript: the
465
+ * model would get the new question with no context, and nothing in the UI would say
466
+ * so, because the viewport still shows every message.
481
467
  */
482
468
  private static _inFlight;
483
469
  private _toHistoryMessages;
@@ -492,23 +478,9 @@ export declare class AparteClient {
492
478
  * What the model is told it said last turn — reconstructed from what was
493
479
  * RENDERED, not from the raw-text field.
494
480
  *
495
- * The order used to be the other way round, and it silently corrupted the
496
- * context on the most common opening in a coding chat: a reply starting with a
497
- * code fence was sent back as three backticks and nothing else. Three
498
- * correct-in-isolation decisions composed into it:
499
- *
500
- * 1. the parser withholds an ambiguous prefix (``` ``` ```, `` ` ``, `<`)
501
- * waiting for the next delta, and creates no active segment while it waits;
502
- * 2. so `_streamLoop` sees zero segments, concludes the parser produced
503
- * nothing, and appends the raw delta straight to `message.content`;
504
- * 3. and this method preferred `content`.
505
- *
506
- * The bubble hides its content element as soon as segments exist, so the UI was
507
- * perfect and only the NEXT request showed it. No unit test, no example and
508
- * no browser test could see it.
509
- *
510
- * `content` stays as the fallback, and that is not vestigial: a non-streaming
511
- * transport writes the whole reply there and creates no segments at all.
481
+ * The segments are what the reader saw, so they come first. `content` is the
482
+ * fallback, and that is not vestigial: a non-streaming transport writes the whole
483
+ * reply there and creates no segments at all.
512
484
  */
513
485
  private _extractText;
514
486
  /**
@@ -521,10 +493,9 @@ export declare class AparteClient {
521
493
  * A type core does not know — a registered block grammar's (an artifact, a
522
494
  * citation, a file), a consumer's custom segment — follows one rule: its
523
495
  * `content` if it has one, else its `fallback`, else nothing. Dropping such a
524
- * segment made a document the model had just produced invisible on the very next
525
- * turn, so it could not be asked to change the thing it had built; there used to
526
- * be an `artifact` branch here for exactly that, and the rule is what replaces it
527
- * now that the artifact is a plugin's type like any other.
496
+ * segment would make a document the model had just produced invisible on the very
497
+ * next turn, so it could not be asked to change the thing it had built. An artifact
498
+ * is a plugin's type like any other and follows this rule.
528
499
  *
529
500
  * `thinking` and `tool_call` stay out on purpose — the first is the model's own
530
501
  * scratchpad, and most APIs neither want it back nor bill for it kindly; the
@@ -597,6 +568,14 @@ export declare class AparteClient {
597
568
  * resume. A channel that CRASHES fails the turn, as it does for a run in the page.
598
569
  */
599
570
  private _answerDeferred;
571
+ /**
572
+ * Whether a browser tool a paused run asked for may run, decided as a run in the page
573
+ * decides it. With a host `approvalResolver`, the tool's own `needsApproval` says whether
574
+ * to ask and the resolver answers; without one, the approval policy and `needsApproval`
575
+ * rule (`ruleOnToolCall`) and the default channel asks. `null` when nothing gates the
576
+ * call, the decision when something did, `undefined` when nobody answered.
577
+ */
578
+ private _gateBrowserTool;
600
579
  /**
601
580
  * The ticket is spent the moment the resume leaves: the server answers these calls
602
581
  * now, so a pause saved from here on — the conversation manager saves before it cuts a
@@ -608,8 +587,8 @@ export declare class AparteClient {
608
587
  * Close the reply's calls that can no longer finish — paused, queued, or running on a
609
588
  * server the page stopped listening to: each says it stopped, and forgets the pause.
610
589
  * A cut connection carries none of their last events, so nothing else would: the rows
611
- * spun, and a queued call kept its ticket, which a reload then resumed against a
612
- * server that had moved on. By the reply's id, not the chat's head — a retry during
590
+ * would spin, and a queued call would keep its ticket, which a reload would then
591
+ * resume against a server that had moved on. By the reply's id, not the chat's head — a retry during
613
592
  * the wait moves the head. A run in the page ends every call itself: nothing to do.
614
593
  */
615
594
  private _closeOpenCalls;
@@ -1 +1 @@
1
- {"version":3,"file":"aparte-client.d.ts","sourceRoot":"","sources":["../../src/client/aparte-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aparte-client.d.ts","sourceRoot":"","sources":["../../src/client/aparte-client.ts"],"names":[],"mappings":"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"}
@@ -3,18 +3,15 @@
3
3
  *
4
4
  * `@aparte/engine`'s `runStreamAgent` is the headless loop: it emits high-level,
5
5
  * DOM-free run events. This adapter is the other half — it turns each event into
6
- * the exact `targetElement.*` calls + CustomEvents that core's inline loop
7
- * performed, using the **real** `AparteStreamParser` and tool renderers. So
8
- * `runStreamAgent` (engine, pure Node) + this adapter (core, DOM) reproduce that
9
- * loop byte-for-byte — and have replaced it (audit 2026-08-28, D1).
6
+ * the `targetElement.*` calls + CustomEvents the transcript needs, using the
7
+ * **real** `AparteStreamParser` and tool renderers. `runStreamAgent` (engine, pure
8
+ * Node) + this adapter (core, DOM) are the one agent loop `AparteClient` runs.
10
9
  *
11
10
  * DEPENDENCY DIRECTION: `@aparte/core` depends on `@aparte/engine` — first-party, so
12
11
  * the zero-third-party-dependency promise is untouched — never the reverse. The
13
12
  * run-event contract is engine's: {@link AparteStreamRunEvent} and its siblings below
14
13
  * are `StreamRunEvent` & co under core's names, so there is nothing to keep in sync by
15
- * hand any more. The hand-mirrored union this file used to carry, and the compile-time
16
- * guard in engine that policed it, went with the mirror (audit 2026-08-28, D1). A
17
- * consumer wires a runner through `AparteClientOptions.streamRunner` — the same
14
+ * hand. A consumer wires a runner through `AparteClientOptions.streamRunner` — the same
18
15
  * pattern as `approvalResolver` (HITL).
19
16
  */
20
17
  import type { AparteConfig } from '../config/aparte-config.js';
@@ -24,7 +21,7 @@ import type { StreamRunEvent, StreamRunEmitter, StreamRunOptions, StreamUsage }
24
21
  /**
25
22
  * The DOM-free run events `@aparte/engine`'s `runStreamAgent` emits — engine's
26
23
  * `StreamRunEvent`, under core's name. See `packages/engine/src/agent/stream-events.ts`
27
- * for the per-event `_streamLoop` mapping notes.
24
+ * for the per-event documentation.
28
25
  */
29
26
  export type AparteStreamRunEvent = StreamRunEvent;
30
27
  /** Synchronous, ordered event sink — engine's `StreamRunEmitter`. */
@@ -42,11 +39,8 @@ export type AparteStreamRunOptions = StreamRunOptions;
42
39
  * — the seam by which a host wraps or replaces the loop `AparteClient` runs,
43
40
  * which is `@aparte/engine`'s `runStreamAgent` by default.
44
41
  *
45
- * `runStreamAgent` IS this type — pass it, do not cast it. An earlier version of this
46
- * comment advised a cast "if the duck-typed shapes don't line up", which is how the
47
- * two packages' message types drifted apart unnoticed and shipped a
48
- * `streamRunner: runStreamAgent` that did not compile on five docs pages and a
49
- * README. The alias makes that drift a typecheck error in the composition itself.
42
+ * `runStreamAgent` IS this type — pass it, do not cast it. The alias makes any drift
43
+ * between the two packages' message types a typecheck error in the composition itself.
50
44
  */
51
45
  export type AparteStreamRunner = (opts: AparteStreamRunOptions) => Promise<StreamUsage | undefined>;
52
46
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"stream-adapter.d.ts","sourceRoot":"","sources":["../../src/client/stream-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAKzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKtG;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC;AAElD,qEAAqE;AACrE,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AAEtD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,sBAAsB,KAAK,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;AAEpG;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAChC,aAAa,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IAClE,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1E,UAAU,CAAC,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IACzE,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAChD,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,0BAA0B;IACvC,4DAA4D;IAC5D,MAAM,EAAE,mBAAmB,CAAC;IAC5B,kEAAkE;IAClE,MAAM,EAAE,YAAY,CAAC;IACrB,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,0BAA0B,GAAG,sBAAsB,CAmN5F;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACnC,MAAM,EAAE,cAAc,CAAC,iBAAiB,CAAC,EACzC,MAAM,EAAE,WAAW,GACpB,aAAa,CAAC,iBAAiB,CAAC,CAkClC"}
1
+ {"version":3,"file":"stream-adapter.d.ts","sourceRoot":"","sources":["../../src/client/stream-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAKzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAMtG;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC;AAElD,qEAAqE;AACrE,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,sBAAsB,KAAK,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;AAEpG;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAChC,aAAa,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IAClE,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1E,UAAU,CAAC,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IACzE,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAChD,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,0BAA0B;IACvC,4DAA4D;IAC5D,MAAM,EAAE,mBAAmB,CAAC;IAC5B,kEAAkE;IAClE,MAAM,EAAE,YAAY,CAAC;IACrB,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,0BAA0B,GAAG,sBAAsB,CA2N5F;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACnC,MAAM,EAAE,cAAc,CAAC,iBAAiB,CAAC,EACzC,MAAM,EAAE,WAAW,GACpB,aAAa,CAAC,iBAAiB,CAAC,CAkClC"}
@@ -1,11 +1,10 @@
1
1
  /**
2
2
  * What one message contributes to the history a turn sends — its tool calls included.
3
3
  *
4
- * The history used to carry user and assistant TEXT only, so a tool's result was on
5
- * screen and gone from the model's context one turn later: "what did the file say?" had
6
- * no answer. A reply now goes out in the order it was shown: the text before some calls
7
- * and those calls as an assistant envelope, each call's answer as a `tool` message, the
8
- * text after them as the next envelope.
4
+ * A reply goes out in the order it was shown, so a tool's result stays in the model's
5
+ * context on later turns: the text before some calls and those calls as an assistant
6
+ * envelope, each call's answer as a `tool` message, the text after them as the next
7
+ * envelope.
9
8
  *
10
9
  * Every call is answered, because a provider rejects a request that declares a call
11
10
  * with no `tool` message after it: a refusal sends its reason, a crash its error line,
@@ -1 +1 @@
1
- {"version":3,"file":"wire-history.d.ts","sourceRoot":"","sources":["../../src/client/wire-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAEhH,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,6CAA6C,CAAC;AAE5E,0GAA0G;AAC1G,eAAO,MAAM,eAAe,iCAAiC,CAAC;AAU9D,gGAAgG;AAChG,eAAO,MAAM,cAAc,YAAa,aAAa,KAAG,OAAO,IAAI,qBAGkE,CAAC;AAEtI;;;;GAIG;AACH,wBAAgB,SAAS,CACrB,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,MAAM,EAC7C,OAAO,GAAE;IACL;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACrB,GACP,iBAAiB,EAAE,CA2CrB"}
1
+ {"version":3,"file":"wire-history.d.ts","sourceRoot":"","sources":["../../src/client/wire-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAEhH,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,6CAA6C,CAAC;AAE5E,0GAA0G;AAC1G,eAAO,MAAM,eAAe,iCAAiC,CAAC;AAU9D,gGAAgG;AAChG,eAAO,MAAM,cAAc,YAAa,aAAa,KAAG,OAAO,IAAI,qBAGkE,CAAC;AAEtI;;;;GAIG;AACH,wBAAgB,SAAS,CACrB,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,MAAM,EAC7C,OAAO,GAAE;IACL;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACrB,GACP,iBAAiB,EAAE,CA2CrB"}