@happyvertical/smrt-chat 0.57.35 → 0.57.37

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 (38) hide show
  1. package/agents/tool-loop.md +60 -6
  2. package/dist/assistant-turn-events.d.ts +12 -4
  3. package/dist/assistant-turn-events.d.ts.map +1 -1
  4. package/dist/assistant-turn.d.ts +29 -1
  5. package/dist/assistant-turn.d.ts.map +1 -1
  6. package/dist/chunks/{ChatService-D0XuiCTk.js → ChatService-BGBAqmZq.js} +14 -3
  7. package/dist/chunks/ChatService-BGBAqmZq.js.map +1 -0
  8. package/dist/chunks/assistant-turn-events-BbZUf-Ju.js.map +1 -1
  9. package/dist/chunks/chat-stream-DK67O_WB.js +2689 -0
  10. package/dist/chunks/chat-stream-DK67O_WB.js.map +1 -0
  11. package/dist/collections/ChatMessageCollection.d.ts +5 -1
  12. package/dist/collections/ChatMessageCollection.d.ts.map +1 -1
  13. package/dist/index.d.ts +2 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +12 -5
  16. package/dist/index.js.map +1 -1
  17. package/dist/internal/agent-runtime.js +1 -1
  18. package/dist/manifest.json +2 -1
  19. package/dist/persona-conversation.d.ts +5 -0
  20. package/dist/persona-conversation.d.ts.map +1 -1
  21. package/dist/services/ChatService.d.ts +12 -1
  22. package/dist/services/ChatService.d.ts.map +1 -1
  23. package/dist/smrt-knowledge.json +5 -5
  24. package/dist/svelte/components/assistant/create-assistant-dock-controller.svelte.d.ts +6 -2
  25. package/dist/svelte/components/assistant/create-assistant-dock-controller.svelte.d.ts.map +1 -1
  26. package/dist/svelte/components/assistant/create-assistant-dock-controller.svelte.js +4 -1
  27. package/dist/sveltekit.d.ts +13 -2
  28. package/dist/sveltekit.d.ts.map +1 -1
  29. package/dist/sveltekit.js +7 -3
  30. package/dist/sveltekit.js.map +1 -1
  31. package/dist/tool-loop.d.ts +47 -9
  32. package/dist/tool-loop.d.ts.map +1 -1
  33. package/dist/voice.d.ts +4 -0
  34. package/dist/voice.d.ts.map +1 -1
  35. package/package.json +21 -21
  36. package/dist/chunks/ChatService-D0XuiCTk.js.map +0 -1
  37. package/dist/chunks/chat-stream-Dz7i3-z0.js +0 -2601
  38. package/dist/chunks/chat-stream-Dz7i3-z0.js.map +0 -1
@@ -10,8 +10,8 @@
10
10
  (`DEFAULT_MAX_STEPS = 8`; `initialSteps` counts earlier legs of a resumed
11
11
  turn). `maxTotalTokens` (with `initialTokens`) and `deadline` end the turn
12
12
  early with `stoppedReason: 'budget'`.
13
- - **Forced final call (#4378).** At the cap, or once the budget is spent, the
14
- next round is offered no tools (`tools: undefined`, `toolChoice: 'none'`),
13
+ - **Forced final call (#4378).** At the cap, once the budget is spent, or
14
+ after repeated calls (below, #4391), the next round is offered no tools (`tools: undefined`, `toolChoice: 'none'`),
15
15
  and any tool calls the model still emits are discarded. That call alone gets
16
16
  the fixed `TOOL_LOOP_ANSWER_NOW_INSTRUCTION` as a temporary `user`
17
17
  instruction. If the transcript already ends with a user turn, it is added
@@ -37,8 +37,8 @@
37
37
  `TimeoutError`, or an `AbortError` the caller's signal did not cause) ends
38
38
  `stoppedReason: 'timeout'` instead of failing or passing as an empty
39
39
  success; other errors still throw. When the final round was the forced
40
- no-tools call, `capReason` (`max_steps` | `budget`) keeps that cause
41
- alongside `empty`/`timeout`.
40
+ no-tools call, `capReason` (`max_steps` | `budget` | `repeated_calls`)
41
+ keeps that cause alongside `empty`/`timeout`.
42
42
  - **Quiet stream ends (older SDKs).** SDKs <= 0.108.0 can end a timed-out
43
43
  stream quietly: no text, no tool calls, no finish reason. That shape is a
44
44
  suspected timeout only for an AI boundary that has already reported a
@@ -61,10 +61,18 @@
61
61
  `'Done.'`. The plain chat-stream path retries a blank stream once, then
62
62
  sends the fallback, or `CHAT_STREAM_TIMEOUT_ERROR` only under the
63
63
  quiet-end rule above.
64
+ - **Provider errors (#4454).** A model call that throws is not answered by
65
+ default (an `error` event, nothing stored). `runAssistantTurn` /
66
+ `mountAssistantRoutes` take `providerErrorFallback`: text, or
67
+ `(code, error) => text | undefined` (blank or `undefined` declines and the
68
+ turn fails as before). The text is stored as the assistant row with
69
+ `metadata.fallback: 'provider_error'` (so `isFallbackReply` is true and
70
+ history skips it), the turn ends `stoppedReason: 'provider_error'`, and the
71
+ error still goes to `onError`. A cancelled turn is never answered this way.
64
72
  - **Stored metadata.** Every authored assistant reply carries
65
73
  `replyMetadataFor(result, reply)`: `metadata.stoppedReason` (enum),
66
74
  `metadata.capReason` when set, and `metadata.fallback` (`empty` |
67
- `timeout`) when the content is the fallback. Hosts read the stop reason
75
+ `timeout` | `provider_error`) when the content is the fallback. Hosts read the stop reason
68
76
  from `turn.result.stoppedReason` (persona), `AssistantTurnResult` / the
69
77
  `done` event's `stoppedReason` and `capReason` (assistant), or the stored
70
78
  message's metadata. `isFallbackReply(message)` tells a fallback apart; the
@@ -78,8 +86,18 @@
78
86
  templates (Gemma, Anthropic) reject. Hosts should hide feedback
79
87
  controls (thumbs, corrections) on a message where `isFallbackReply` is
80
88
  true: there is no model answer to rate.
89
+ - **History budget (#4458).** `historyLimit` counts replayed turns, not
90
+ raw rows, so persisted tool rows (`authorInvocation`, failed calls) never
91
+ take a slot. The assistant route and voice pass `roles` to
92
+ `getThreadMessages` / `getRoomMessages`, which filter in SQL: the read
93
+ returns at most `limit` rows whatever the thread holds. A fallback reply
94
+ is one replayed turn (its marker). The chat-stream paths cap the
95
+ browser's array at `MAX_CHAT_STREAM_MESSAGES` kept messages, scanning
96
+ back at most 10× that many entries. Threads holding only replayed roles
97
+ see the same history as before.
81
98
  - **Dock.** The `done` event's `capReason` reaches the dock, which offers
82
- Continue for a capped turn even when it ended `empty` or `timeout`.
99
+ Continue for a `max_steps`/`budget` capped turn even when it ended `empty`
100
+ or `timeout` (never for `repeated_calls`, #4391).
83
101
  - **Reasoning.** `AIResponse.reasoning` (newer SDKs, sdk#1459) is read
84
102
  defensively, capped at `MAX_TOOL_LOOP_REASONING_CHARS` code points, passed
85
103
  to `onReasoning` (forwarded by both callers; a throw is ignored) and
@@ -175,6 +193,42 @@ second copy of the result.
175
193
  resume leg starts a fresh cache).
176
194
  - Deduped calls count toward the step cap: a round of repeats is still a
177
195
  round, so a model stuck repeating a call still stops at `maxSteps`.
196
+ - The note points at the earlier result and says to change the arguments
197
+ (for example, add a filter), because a repeat returns the same result.
198
+
199
+ ## Repeated calls end the tool phase (#4391)
200
+
201
+ A model stuck on one call (an unfiltered count, sent again and again) used
202
+ to burn every step to `maxSteps`. Now, once a single dedupe key (same tool,
203
+ same canonical arguments) has been deduped `maxRepeatedCalls` times in one
204
+ `runToolLoop` call, the rest of that round still runs — every tool call gets
205
+ its tool result — and the next model call is the forced no-tools call with
206
+ `TOOL_LOOP_ANSWER_NOW_INSTRUCTION` plus, on this path only (and its blank
207
+ retry), `TOOL_LOOP_REPEATED_CALLS_INSTRUCTION`: if the results do not match
208
+ what was asked (a total where a filtered count was asked), say the figure
209
+ could not be got rather than presenting the result as the answer.
210
+
211
+ - **Option.** `maxRepeatedCalls` on `runToolLoop`, `runAssistantTurn`,
212
+ `runPersonaConversationTurn` and `mountAssistantRoutes`. Default
213
+ `DEFAULT_MAX_REPEATED_CALLS` (2); `0` (or less) turns it off; otherwise it
214
+ is floored and capped at `MAX_REPEATED_CALLS_LIMIT` (16). Non-numbers use
215
+ the default.
216
+ - **What counts.** Only deduped repeats, counted per key: a different
217
+ argument is a different key, mutating and other non-dedupable calls never
218
+ count, and a non-read-only call clears the counts with the dedupe cache.
219
+ Counts live inside one `runToolLoop` call; an assistant resume leg starts
220
+ at zero.
221
+ - **Report.** `stoppedReason: 'repeated_calls'` and `capReason:
222
+ 'repeated_calls'`; `capReason` stays when the forced call then ends `empty`
223
+ or `timeout`. When the step cap or budget is reached in the same round,
224
+ `repeated_calls` wins: more steps would only repeat the call. Stored
225
+ replies carry it in `metadata.stoppedReason`/`metadata.capReason`, like the
226
+ other caps; the `done` event carries both.
227
+ - **Dock: no Continue.** The dock records `run.stoppedReason:
228
+ 'repeated_calls'` but does not offer Continue (`waitingFor` stays null):
229
+ the model already had the result it kept asking for, so another leg would
230
+ repeat the call. Continue stays for `max_steps` and `budget` only. Hosts
231
+ with their own UI should do the same.
178
232
  - The audit sink gets `action: 'chat.tool_call_deduped'` (not a fresh
179
233
  execution or failure); the persona path's tool row carries
180
234
  `toolCallData.deduped: true`.
@@ -86,11 +86,18 @@ export interface AssistantClientToolResult {
86
86
  /** Why a turn finished. */
87
87
  export type AssistantTurnStopReason = 'stop' | 'max_steps'
88
88
  /** The turn's token or time budget ran out (`maxTurnTokens`/`maxTurnMs`). */
89
- | 'budget' | 'no_tools' | 'cancelled'
89
+ | 'budget'
90
+ /**
91
+ * One read-only call was repeated `maxRepeatedCalls` times; the model
92
+ * answered without tools (#4391). Not continuable: repeating won't help.
93
+ */
94
+ | 'repeated_calls' | 'no_tools' | 'cancelled'
90
95
  /** The model returned no answer, even after one retry; the reply is the fallback (#4379). */
91
96
  | 'empty'
92
97
  /** A model call timed out; the reply is the fallback (#4379). */
93
- | 'timeout';
98
+ | 'timeout'
99
+ /** A model call failed and the host's `providerErrorFallback` answered (#4454). */
100
+ | 'provider_error';
94
101
  /** One event of a streamed assistant turn. `M` is the host's message shape. */
95
102
  export type AssistantTurnEvent<M = Record<string, unknown>> = {
96
103
  type: 'status';
@@ -114,9 +121,10 @@ export type AssistantTurnEvent<M = Record<string, unknown>> = {
114
121
  stoppedReason: AssistantTurnStopReason;
115
122
  /**
116
123
  * Why tools were withdrawn on the final round, kept when the turn then
117
- * ends `empty` or `timeout` (#4379).
124
+ * ends `empty` or `timeout` (#4379). `repeated_calls` (#4391) is not
125
+ * continuable; `max_steps` and `budget` are.
118
126
  */
119
- capReason?: 'max_steps' | 'budget';
127
+ capReason?: 'max_steps' | 'budget' | 'repeated_calls';
120
128
  } | {
121
129
  type: 'error';
122
130
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-turn-events.d.ts","sourceRoot":"","sources":["../src/assistant-turn-events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assistant-turn-events.d.ts","sourceRoot":"","sources":["../src/assistant-turn-events.ts"],"names":[],"mappings":"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"}
@@ -203,6 +203,12 @@ export interface AssistantTurnOptions<M = Record<string, unknown>> {
203
203
  /** Scope for `continuations` (e.g. the thread id). */
204
204
  continuationKey?: string;
205
205
  maxSteps?: number;
206
+ /**
207
+ * Deduped repeats of one read-only call that end the tool phase (#4391;
208
+ * forwarded to `runToolLoop`). Default `DEFAULT_MAX_REPEATED_CALLS` (2);
209
+ * `0` turns it off. Counted per leg: a resume starts at zero.
210
+ */
211
+ maxRepeatedCalls?: number;
206
212
  /**
207
213
  * Token budget for the whole turn, across every browser round trip. Once
208
214
  * spent, the model gets one last round without tools to answer, and the
@@ -230,6 +236,18 @@ export interface AssistantTurnOptions<M = Record<string, unknown>> {
230
236
  * `DEFAULT_EMPTY_ANSWER_FALLBACK`. Replaces the old `'Done.'`.
231
237
  */
232
238
  emptyAnswerFallback?: string;
239
+ /**
240
+ * Reply stored when a model call throws (#4454): a provider failure such
241
+ * as an `AIError` with code `API_ERROR`. A string, or a function of the
242
+ * error's `code` (and the error itself) returning the text; a blank or
243
+ * `undefined` result declines, and the turn fails as it does with no option
244
+ * set. The reply is stored like `emptyAnswerFallback`, with
245
+ * `metadata.fallback: 'provider_error'`, and the turn ends with
246
+ * `stoppedReason: 'provider_error'`. The error is still passed to
247
+ * `onError`. Unset: an `error` event and nothing stored. A cancelled turn
248
+ * and the turn's own user-facing errors are never answered this way.
249
+ */
250
+ providerErrorFallback?: ProviderErrorFallback;
233
251
  /**
234
252
  * Host opt-in: answer from the model's reasoning text when the final round
235
253
  * and its retry are blank (forwarded, see `ToolLoopOptions`). Default false.
@@ -281,11 +299,21 @@ export interface AssistantTurnState {
281
299
  resumedFrom: string | null;
282
300
  continuationId?: string;
283
301
  }
302
+ /** `tool` of a step for a call whose name is not a registered tool (#4453). */
303
+ export declare const UNKNOWN_TOOL_STEP_NAME = "unknown_tool";
304
+ /** `label` of that step; the model's requested name is never echoed. */
305
+ export declare const UNKNOWN_TOOL_STEP_LABEL = "Unknown tool";
306
+ /**
307
+ * Host text for a failed model call (see
308
+ * {@link AssistantTurnOptions.providerErrorFallback}). The function gets the
309
+ * error's string `code` when it has one.
310
+ */
311
+ export type ProviderErrorFallback = string | ((code: string | undefined, error: unknown) => string | undefined);
284
312
  /** What {@link runAssistantTurn} returns when its generator completes. */
285
313
  export interface AssistantTurnResult {
286
314
  stoppedReason: AssistantTurnStopReason | 'client_tools' | 'error';
287
315
  /** Why tools were withdrawn on the final round, when they were (#4379). */
288
- capReason?: 'max_steps' | 'budget';
316
+ capReason?: 'max_steps' | 'budget' | 'repeated_calls';
289
317
  content: string;
290
318
  loop?: ToolLoopResult;
291
319
  /** The turn's origin message (from the continuation on a resume). */
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-turn.d.ts","sourceRoot":"","sources":["../src/assistant-turn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assistant-turn.d.ts","sourceRoot":"","sources":["../src/assistant-turn.ts"],"names":[],"mappings":"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"}
@@ -876,6 +876,9 @@ var ChatMessageCollection = class extends SmrtCollection {
876
876
  * lookup (S5 #1392): room ids are not globally unique, so a roomId-only read
877
877
  * could surface another tenant's messages for a same-id room. The caller's
878
878
  * membership gate is tenant-scoped, so the read MUST be too.
879
+ *
880
+ * `roles` (non-empty) keeps only those roles, in SQL, so `limit` counts
881
+ * them alone (#4458); omitted or empty reads every role.
879
882
  */
880
883
  async getByRoom(roomId, tenantId, options) {
881
884
  const where = {
@@ -884,6 +887,7 @@ var ChatMessageCollection = class extends SmrtCollection {
884
887
  isDeleted: false,
885
888
  threadId: null
886
889
  };
890
+ if (options?.roles?.length) where.role = [...options.roles];
887
891
  if (options?.before) {
888
892
  const cursorMsg = await this.get({
889
893
  id: options.before,
@@ -2005,7 +2009,8 @@ var ChatService = class ChatService {
2005
2009
  await this.#requireActiveMembership(params.roomId, params.actorProfileId, params.tenantId);
2006
2010
  return this.#messages.getByRoom(params.roomId, params.tenantId, {
2007
2011
  limit: params.limit,
2008
- before: params.before
2012
+ before: params.before,
2013
+ roles: params.roles
2009
2014
  });
2010
2015
  }
2011
2016
  /**
@@ -2094,6 +2099,11 @@ var ChatService = class ChatService {
2094
2099
  * the thread's room. Messages are returned oldest-first (chronological).
2095
2100
  * Replaces direct `messages.list({ where: { threadId } })` reach-ins that
2096
2101
  * could read another tenant's/room's thread history by raw id.
2102
+ *
2103
+ * `roles` (non-empty) keeps only those roles, in SQL, so `limit` counts
2104
+ * them alone: a history builder passes the roles it replays and gets the
2105
+ * newest `limit` of those, however many tool rows sit between (#4458).
2106
+ * Omitted or empty reads every role.
2097
2107
  */
2098
2108
  async getThreadMessages(params) {
2099
2109
  const thread = await this.#threads.get({
@@ -2106,7 +2116,8 @@ var ChatService = class ChatService {
2106
2116
  where: {
2107
2117
  tenantId: params.tenantId,
2108
2118
  threadId: params.threadId,
2109
- isDeleted: false
2119
+ isDeleted: false,
2120
+ ...params.roles?.length ? { role: [...params.roles] } : {}
2110
2121
  },
2111
2122
  orderBy: "created_at DESC",
2112
2123
  limit: params.limit
@@ -2250,4 +2261,4 @@ function sendAgentReply(service, params) {
2250
2261
  //#endregion
2251
2262
  export { sendAgentReply as a, ChatThread as c, ChatParticipant as d, ChatMessage as f, clientRequestMessageId as i, ChatRoom as l, ChatService as n, VoiceSessionCollection as o, AgentSession as p, ChatService_exports as r, VoiceSession as s, ChatClientRequestConflictError as t, ChatReaction as u };
2252
2263
 
2253
- //# sourceMappingURL=ChatService-D0XuiCTk.js.map
2264
+ //# sourceMappingURL=ChatService-BGBAqmZq.js.map