@happyvertical/smrt-chat 0.57.32 → 0.57.34

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 (43) hide show
  1. package/AGENTS.md +1 -1
  2. package/agents/tool-loop.md +224 -0
  3. package/dist/assistant-turn-events.d.ts +10 -1
  4. package/dist/assistant-turn-events.d.ts.map +1 -1
  5. package/dist/assistant-turn.d.ts +42 -5
  6. package/dist/assistant-turn.d.ts.map +1 -1
  7. package/dist/chat-stream.d.ts +15 -0
  8. package/dist/chat-stream.d.ts.map +1 -1
  9. package/dist/chunks/{ChatService-DjGf2AoJ.js → ChatService-D0XuiCTk.js} +3 -2
  10. package/dist/chunks/ChatService-D0XuiCTk.js.map +1 -0
  11. package/dist/chunks/assistant-turn-events-BbZUf-Ju.js.map +1 -1
  12. package/dist/chunks/{chat-stream-DJuup0go.js → chat-stream-CsD8FwnS.js} +552 -77
  13. package/dist/chunks/chat-stream-CsD8FwnS.js.map +1 -0
  14. package/dist/data-surface-tools.d.ts +1 -1
  15. package/dist/data-surface-tools.d.ts.map +1 -1
  16. package/dist/index.d.ts +2 -2
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +9 -5
  19. package/dist/index.js.map +1 -1
  20. package/dist/internal/agent-runtime.js +1 -1
  21. package/dist/manifest.json +1 -1
  22. package/dist/persona-conversation.d.ts +41 -1
  23. package/dist/persona-conversation.d.ts.map +1 -1
  24. package/dist/services/ChatService.d.ts +6 -0
  25. package/dist/services/ChatService.d.ts.map +1 -1
  26. package/dist/smrt-knowledge.json +11 -6
  27. package/dist/svelte/components/assistant/assistant-http-client.d.ts +7 -0
  28. package/dist/svelte/components/assistant/assistant-http-client.d.ts.map +1 -1
  29. package/dist/svelte/components/assistant/assistant-http-client.js +8 -0
  30. package/dist/svelte/components/assistant/assistant-transport.d.ts.map +1 -1
  31. package/dist/svelte/components/assistant/assistant-transport.js +3 -0
  32. package/dist/svelte/components/assistant/create-assistant-dock-controller.svelte.d.ts.map +1 -1
  33. package/dist/svelte/components/assistant/create-assistant-dock-controller.svelte.js +10 -4
  34. package/dist/sveltekit.d.ts +26 -0
  35. package/dist/sveltekit.d.ts.map +1 -1
  36. package/dist/sveltekit.js +27 -10
  37. package/dist/sveltekit.js.map +1 -1
  38. package/dist/tool-loop.d.ts +223 -2
  39. package/dist/tool-loop.d.ts.map +1 -1
  40. package/dist/voice.d.ts.map +1 -1
  41. package/package.json +17 -18
  42. package/dist/chunks/ChatService-DjGf2AoJ.js.map +0 -1
  43. package/dist/chunks/chat-stream-DJuup0go.js.map +0 -1
package/dist/sveltekit.js CHANGED
@@ -1,5 +1,5 @@
1
- import { i as clientRequestMessageId, n as ChatService, t as ChatClientRequestConflictError } from "./chunks/ChatService-DjGf2AoJ.js";
2
- import { D as runAssistantTurn, E as createSessionContinuationStore, P as buildManifestToolCatalog, j as MAX_CLIENT_TOOL_RESULT_CHARS, v as ASSISTANT_TURN_GENERIC_ERROR, w as createAssistantTurnResponse, z as sanitizeClientToolDeclarations } from "./chunks/chat-stream-DJuup0go.js";
1
+ import { i as clientRequestMessageId, n as ChatService, t as ChatClientRequestConflictError } from "./chunks/ChatService-D0XuiCTk.js";
2
+ import { D as createSessionContinuationStore, F as MAX_CLIENT_TOOL_RESULT_CHARS, M as FALLBACK_HISTORY_PLACEHOLDER, O as runAssistantTurn, T as createAssistantTurnResponse, X as isFallbackReply, nt as sanitizeClientToolDeclarations, q as buildManifestToolCatalog, y as ASSISTANT_TURN_GENERIC_ERROR } from "./chunks/chat-stream-CsD8FwnS.js";
3
3
  import { getCurrentSessionPermissionContext, getRequestScopedDatabase } from "@happyvertical/smrt-users";
4
4
  import { getConfig, loadConfig, resolveConfiguredAIProvider, toAIClientOptions } from "@happyvertical/smrt-config";
5
5
  //#region src/sveltekit.ts
@@ -15,6 +15,7 @@ var AssistantRouteError = class extends Error {
15
15
  };
16
16
  var DEFAULT_ASSISTANT_AGENT_ID = "smrt-assistant";
17
17
  var ASSISTANT_DOCK_SESSION_KEY = "assistant-dock";
18
+ var MAX_ASSISTANT_REQUEST_CONTEXT_BYTES = 8 * 1024;
18
19
  var DEFAULT_ASSISTANT_MAX_BODY_BYTES = 1024 * 1024;
19
20
  var DEFAULT_ASSISTANT_MAX_ATTACHMENT_BYTES = 10 * 1024 * 1024;
20
21
  var MAX_TITLE_LENGTH = 200;
@@ -246,6 +247,8 @@ function mountAssistantRoutes(options = {}) {
246
247
  }
247
248
  }
248
249
  const agentId = options.agentId ?? "smrt-assistant";
250
+ const dockSessionKey = options.sessionKey === void 0 ? ASSISTANT_DOCK_SESSION_KEY : options.sessionKey;
251
+ if (dockSessionKey !== null && !dockSessionKey.trim()) throw new Error("mountAssistantRoutes: sessionKey must be a non-empty string or null.");
249
252
  const paramName = options.paramName ?? "path";
250
253
  const maxBody = options.maxBodyBytes ?? 1048576;
251
254
  const maxContent = options.maxContentLength ?? 12e3;
@@ -299,7 +302,7 @@ function mountAssistantRoutes(options = {}) {
299
302
  tenantId: principal.tenantId,
300
303
  agentId,
301
304
  participantProfileId: principal.profileId
302
- })).find((session) => session.getSessionKey() === "assistant-dock" && session.participantProfileId === principal.profileId && session.tenantId === principal.tenantId && Boolean(session.chatRoomId)) ?? null;
305
+ })).find((session) => session.getSessionKey() === dockSessionKey && session.participantProfileId === principal.profileId && session.tenantId === principal.tenantId && Boolean(session.chatRoomId)) ?? null;
303
306
  };
304
307
  const requireOwnThread = async (chat, principal, session, threadId) => {
305
308
  if (!session?.chatRoomId) throw notFound();
@@ -366,6 +369,15 @@ function mountAssistantRoutes(options = {}) {
366
369
  return current && current.participantProfileId === principal.profileId && current.isActive() ? current : null;
367
370
  });
368
371
  };
372
+ const withRequestContext = (context, value) => {
373
+ if (value === void 0 || value === null) return context;
374
+ if (typeof value !== "object" || Array.isArray(value)) throw badRequest("context must be an object.", "invalid_context");
375
+ if (new TextEncoder().encode(JSON.stringify(value)).length > 8192) throw badRequest(`context is limited to ${MAX_ASSISTANT_REQUEST_CONTEXT_BYTES} bytes.`, "invalid_context");
376
+ return {
377
+ ...context,
378
+ requestContext: value
379
+ };
380
+ };
369
381
  const prepareTurn = async (context, body) => {
370
382
  const model = resolveModel(body.model);
371
383
  const allowedTools = await allowedToolsFor(context);
@@ -427,6 +439,8 @@ function mountAssistantRoutes(options = {}) {
427
439
  ...options.maxSteps !== void 0 ? { maxSteps: options.maxSteps } : {},
428
440
  ...options.maxTurnTokens !== void 0 ? { maxTurnTokens: options.maxTurnTokens } : {},
429
441
  ...options.maxTurnMs !== void 0 ? { maxTurnMs: options.maxTurnMs } : {},
442
+ ...options.requestTimeoutMs !== void 0 ? { requestTimeoutMs: options.requestTimeoutMs } : {},
443
+ ...options.emptyAnswerFallback !== void 0 ? { emptyAnswerFallback: options.emptyAnswerFallback } : {},
430
444
  ...options.maxTokens !== void 0 ? { maxTokens: options.maxTokens } : {},
431
445
  ...options.temperature !== void 0 ? { temperature: options.temperature } : {},
432
446
  ...principal.permissions ? { permissions: principal.permissions } : {},
@@ -515,6 +529,7 @@ function mountAssistantRoutes(options = {}) {
515
529
  await runtime.runAsPrincipal(bound, async (granted) => {
516
530
  const turnContext = {
517
531
  event: context.event,
532
+ ...context.requestContext ? { requestContext: context.requestContext } : {},
518
533
  principal: {
519
534
  ...principal,
520
535
  permissions: effectiveScopes(granted, bound.scopes)
@@ -576,7 +591,7 @@ function mountAssistantRoutes(options = {}) {
576
591
  agentId,
577
592
  actorProfileId: principal.profileId,
578
593
  allowedTools,
579
- sessionKey: ASSISTANT_DOCK_SESSION_KEY
594
+ sessionKey: dockSessionKey
580
595
  });
581
596
  if (!session.chatRoomId) throw new Error("Assistant session has no room");
582
597
  return json({ thread: toAssistantThreadWire(await chat.startThread({
@@ -666,8 +681,9 @@ function mountAssistantRoutes(options = {}) {
666
681
  continuationId: state.continuationId ?? null
667
682
  });
668
683
  };
669
- const sendMessage = async (context, threadId) => {
670
- const body = await readJsonObject(context.event.request, maxBody);
684
+ const sendMessage = async (baseContext, threadId) => {
685
+ const body = await readJsonObject(baseContext.event.request, maxBody);
686
+ const context = withRequestContext(baseContext, body.context);
671
687
  const content = typeof body.content === "string" ? body.content.trim() : "";
672
688
  if (!content) throw badRequest("The message is empty.", "empty_message");
673
689
  if (content.length > maxContent) throw new AssistantRouteError(413, "message_too_long", `Messages are limited to ${maxContent} characters.`);
@@ -742,7 +758,7 @@ function mountAssistantRoutes(options = {}) {
742
758
  if (!message.content) continue;
743
759
  history.push({
744
760
  role: message.role,
745
- content: message.content
761
+ content: message.role === "assistant" && isFallbackReply(message) ? FALLBACK_HISTORY_PLACEHOLDER : message.content
746
762
  });
747
763
  }
748
764
  }
@@ -762,8 +778,9 @@ function mountAssistantRoutes(options = {}) {
762
778
  throw error;
763
779
  }
764
780
  };
765
- const resumeTurn = async (context, threadId) => {
766
- const body = await readJsonObject(context.event.request, maxBody);
781
+ const resumeTurn = async (baseContext, threadId) => {
782
+ const body = await readJsonObject(baseContext.event.request, maxBody);
783
+ const context = withRequestContext(baseContext, body.context);
767
784
  const continuationId = requireId(body.continuationId, "continuationId");
768
785
  if (!Array.isArray(body.results) || body.results.length > 64) throw badRequest("results must be a list of tool results.");
769
786
  const results = body.results.map((raw) => {
@@ -968,6 +985,6 @@ function detached(first, produce) {
968
985
  };
969
986
  }
970
987
  //#endregion
971
- export { ASSISTANT_DOCK_SESSION_KEY, AssistantRouteError, DEFAULT_ASSISTANT_ABANDONED_TURN_MS, DEFAULT_ASSISTANT_AGENT_ID, DEFAULT_ASSISTANT_MAX_ATTACHMENT_BYTES, DEFAULT_ASSISTANT_MAX_BODY_BYTES, DEFAULT_ASSISTANT_TURN_START_TIMEOUT_MS, mountAssistantRoutes, resolveAssistantPrincipalFromLocals, toAssistantMessageWire, toAssistantThreadWire };
988
+ export { ASSISTANT_DOCK_SESSION_KEY, AssistantRouteError, DEFAULT_ASSISTANT_ABANDONED_TURN_MS, DEFAULT_ASSISTANT_AGENT_ID, DEFAULT_ASSISTANT_MAX_ATTACHMENT_BYTES, DEFAULT_ASSISTANT_MAX_BODY_BYTES, DEFAULT_ASSISTANT_TURN_START_TIMEOUT_MS, MAX_ASSISTANT_REQUEST_CONTEXT_BYTES, mountAssistantRoutes, resolveAssistantPrincipalFromLocals, toAssistantMessageWire, toAssistantThreadWire };
972
989
 
973
990
  //# sourceMappingURL=sveltekit.js.map