@carlonicora/nextjs-jsonapi 1.113.0 → 1.114.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 (62) hide show
  1. package/dist/{AssistantInterface-B1c8FhGA.d.mts → AssistantInterface-B56qznuH.d.mts} +2 -0
  2. package/dist/{AssistantInterface-BBUHxOCd.d.ts → AssistantInterface-CHiJIYDY.d.ts} +2 -0
  3. package/dist/{AssistantMessageInterface-DrgHDjZ5.d.mts → AssistantMessageInterface-BuUZFkE5.d.mts} +16 -1
  4. package/dist/{AssistantMessageInterface-BNzf1etU.d.ts → AssistantMessageInterface-CQwh5tEb.d.ts} +16 -1
  5. package/dist/{BlockNoteEditor-DOAPXS7S.js → BlockNoteEditor-DT5L5AAB.js} +19 -19
  6. package/dist/{BlockNoteEditor-DOAPXS7S.js.map → BlockNoteEditor-DT5L5AAB.js.map} +1 -1
  7. package/dist/{BlockNoteEditor-F3HSL4LX.mjs → BlockNoteEditor-HIEAHXR4.mjs} +4 -4
  8. package/dist/billing/index.js +346 -346
  9. package/dist/billing/index.mjs +3 -3
  10. package/dist/{chunk-6XWW67F2.js → chunk-4BUZUKER.js} +7 -7
  11. package/dist/{chunk-6XWW67F2.js.map → chunk-4BUZUKER.js.map} +1 -1
  12. package/dist/{chunk-U2HR57MY.js → chunk-7EQ46GUL.js} +76 -25
  13. package/dist/chunk-7EQ46GUL.js.map +1 -0
  14. package/dist/{chunk-CWVYU4YZ.mjs → chunk-DJSH6VHF.mjs} +2 -2
  15. package/dist/{chunk-ZYPNVEHB.mjs → chunk-FBTTIGLL.mjs} +53 -2
  16. package/dist/{chunk-ZYPNVEHB.mjs.map → chunk-FBTTIGLL.mjs.map} +1 -1
  17. package/dist/{chunk-CI36BXIG.mjs → chunk-TVOW47AP.mjs} +75 -20
  18. package/dist/chunk-TVOW47AP.mjs.map +1 -0
  19. package/dist/{chunk-UBFVV2DA.js → chunk-VA2KFKHD.js} +881 -826
  20. package/dist/chunk-VA2KFKHD.js.map +1 -0
  21. package/dist/client/index.js +4 -4
  22. package/dist/client/index.mjs +3 -3
  23. package/dist/components/index.d.mts +24 -7
  24. package/dist/components/index.d.ts +24 -7
  25. package/dist/components/index.js +4 -4
  26. package/dist/components/index.mjs +3 -3
  27. package/dist/contexts/index.d.mts +7 -2
  28. package/dist/contexts/index.d.ts +7 -2
  29. package/dist/contexts/index.js +4 -4
  30. package/dist/contexts/index.mjs +3 -3
  31. package/dist/core/index.d.mts +26 -4
  32. package/dist/core/index.d.ts +26 -4
  33. package/dist/core/index.js +2 -2
  34. package/dist/core/index.mjs +1 -1
  35. package/dist/features/help/index.js +36 -36
  36. package/dist/features/help/index.mjs +3 -3
  37. package/dist/index.d.mts +2 -2
  38. package/dist/index.d.ts +2 -2
  39. package/dist/index.js +3 -3
  40. package/dist/index.mjs +2 -2
  41. package/dist/server/index.js +3 -3
  42. package/dist/server/index.mjs +1 -1
  43. package/package.json +1 -1
  44. package/src/features/assistant/components/containers/AssistantContainer.tsx +18 -2
  45. package/src/features/assistant/components/parts/AssistantEmptyState.tsx +22 -1
  46. package/src/features/assistant/components/parts/AssistantThread.tsx +12 -1
  47. package/src/features/assistant/contexts/AssistantContext.tsx +42 -9
  48. package/src/features/assistant/contexts/__tests__/AssistantContext.spec.tsx +94 -3
  49. package/src/features/assistant/data/Assistant.ts +6 -0
  50. package/src/features/assistant/data/AssistantInterface.ts +2 -0
  51. package/src/features/assistant/data/AssistantService.ts +38 -0
  52. package/src/features/assistant/data/__tests__/Assistant.spec.ts +30 -0
  53. package/src/features/assistant-message/AssistantMessageModule.ts +2 -0
  54. package/src/features/assistant-message/components/MessageItem.tsx +26 -4
  55. package/src/features/assistant-message/components/MessageList.tsx +4 -2
  56. package/src/features/assistant-message/data/AssistantMessage.ts +21 -1
  57. package/src/features/assistant-message/data/AssistantMessageInterface.ts +16 -0
  58. package/dist/chunk-CI36BXIG.mjs.map +0 -1
  59. package/dist/chunk-U2HR57MY.js.map +0 -1
  60. package/dist/chunk-UBFVV2DA.js.map +0 -1
  61. /package/dist/{BlockNoteEditor-F3HSL4LX.mjs.map → BlockNoteEditor-HIEAHXR4.mjs.map} +0 -0
  62. /package/dist/{chunk-CWVYU4YZ.mjs.map → chunk-DJSH6VHF.mjs.map} +0 -0
@@ -20,7 +20,7 @@ import {
20
20
  useI18nLocale,
21
21
  useI18nRouter,
22
22
  useI18nTranslations
23
- } from "./chunk-CWVYU4YZ.mjs";
23
+ } from "./chunk-DJSH6VHF.mjs";
24
24
  import {
25
25
  AVAILABLE_OAUTH_SCOPES,
26
26
  AssistantMessage,
@@ -60,7 +60,7 @@ import {
60
60
  showToast,
61
61
  useComposedRefs,
62
62
  useIsMobile
63
- } from "./chunk-ZYPNVEHB.mjs";
63
+ } from "./chunk-FBTTIGLL.mjs";
64
64
  import {
65
65
  JsonApiContext
66
66
  } from "./chunk-VOXD3ZLY.mjs";
@@ -9691,7 +9691,7 @@ import { useRef as useRef15 } from "react";
9691
9691
  import dynamic from "next/dynamic";
9692
9692
  import React16 from "react";
9693
9693
  import { jsx as jsx77 } from "react/jsx-runtime";
9694
- var BlockNoteEditor = dynamic(() => import("./BlockNoteEditor-F3HSL4LX.mjs"), {
9694
+ var BlockNoteEditor = dynamic(() => import("./BlockNoteEditor-HIEAHXR4.mjs"), {
9695
9695
  ssr: false
9696
9696
  });
9697
9697
  var BlockNoteEditorContainer = React16.memo(/* @__PURE__ */ __name(function EditorContainer(props) {
@@ -13391,6 +13391,9 @@ function AssistantProvider({ children, dehydratedAssistant, dehydratedMessages,
13391
13391
  const [sending, setSending] = useState42(false);
13392
13392
  const [status, setStatus] = useState42(void 0);
13393
13393
  const [failedMessageIds, setFailedMessageIds] = useState42(() => /* @__PURE__ */ new Set());
13394
+ const [operatorMode, setOperatorMode] = useState42(
13395
+ () => dehydratedAssistant?.jsonApi?.attributes?.engine === "operator"
13396
+ );
13394
13397
  const { socket } = useSocketContext();
13395
13398
  const sendMessage = useCallback24(
13396
13399
  async (content, opts) => {
@@ -13411,11 +13414,12 @@ function AssistantProvider({ children, dehydratedAssistant, dehydratedMessages,
13411
13414
  socket?.on("assistant:status", handler);
13412
13415
  try {
13413
13416
  if (!assistant) {
13414
- const created = await AssistantService.create({
13417
+ const input = {
13415
13418
  firstMessage: trimmed,
13416
13419
  howToMode: opts?.howToMode,
13417
13420
  limitToHowToId: opts?.limitToHowToId
13418
- });
13421
+ };
13422
+ const created = operatorMode ? await AssistantService.createOperator(input) : await AssistantService.create(input);
13419
13423
  const msgs = await AssistantMessageService.findByAssistant({ assistantId: created.id });
13420
13424
  setAssistant(created);
13421
13425
  setMessages(msgs);
@@ -13424,7 +13428,10 @@ function AssistantProvider({ children, dehydratedAssistant, dehydratedMessages,
13424
13428
  window.history.replaceState(null, "", `/assistants/${created.id}`);
13425
13429
  }
13426
13430
  } else {
13427
- const result = await AssistantService.appendMessage({
13431
+ const result = operatorMode ? await AssistantService.appendMessageOperator({
13432
+ assistantId: assistant.id,
13433
+ content: trimmed
13434
+ }) : await AssistantService.appendMessage({
13428
13435
  assistantId: assistant.id,
13429
13436
  content: trimmed,
13430
13437
  howToMode: opts?.howToMode,
@@ -13444,8 +13451,11 @@ function AssistantProvider({ children, dehydratedAssistant, dehydratedMessages,
13444
13451
  setStatus(void 0);
13445
13452
  }
13446
13453
  },
13447
- [assistant, messages, socket]
13454
+ [assistant, messages, socket, operatorMode]
13448
13455
  );
13456
+ const appendResolvedMessage = useCallback24((message) => {
13457
+ setMessages((prev) => prev.some((m) => m.id === message.id) ? prev : [...prev, message]);
13458
+ }, []);
13449
13459
  const retrySend = useCallback24(
13450
13460
  async (tempId) => {
13451
13461
  const failed = messages.find((m) => m.id === tempId);
@@ -13469,6 +13479,7 @@ function AssistantProvider({ children, dehydratedAssistant, dehydratedMessages,
13469
13479
  ]);
13470
13480
  setAssistant(target);
13471
13481
  setMessages(msgs);
13482
+ setOperatorMode(target.engine === "operator");
13472
13483
  if (manageUrl && typeof window !== "undefined") {
13473
13484
  window.history.replaceState(null, "", `/assistants/${id}`);
13474
13485
  }
@@ -13484,6 +13495,7 @@ function AssistantProvider({ children, dehydratedAssistant, dehydratedMessages,
13484
13495
  setAssistant(void 0);
13485
13496
  setMessages([]);
13486
13497
  setFailedMessageIds(/* @__PURE__ */ new Set());
13498
+ setOperatorMode(false);
13487
13499
  if (manageUrl && typeof window !== "undefined") {
13488
13500
  window.history.replaceState(null, "", "/assistants");
13489
13501
  }
@@ -13528,7 +13540,10 @@ function AssistantProvider({ children, dehydratedAssistant, dehydratedMessages,
13528
13540
  selectThread,
13529
13541
  startNew,
13530
13542
  renameThread,
13531
- deleteThread
13543
+ deleteThread,
13544
+ operatorMode,
13545
+ setOperatorMode,
13546
+ appendResolvedMessage
13532
13547
  }),
13533
13548
  [
13534
13549
  assistant,
@@ -13543,7 +13558,9 @@ function AssistantProvider({ children, dehydratedAssistant, dehydratedMessages,
13543
13558
  selectThread,
13544
13559
  startNew,
13545
13560
  renameThread,
13546
- deleteThread
13561
+ deleteThread,
13562
+ operatorMode,
13563
+ appendResolvedMessage
13547
13564
  ]
13548
13565
  );
13549
13566
  const breadcrumbs = [
@@ -18758,7 +18775,7 @@ __name(AssistantComposer, "AssistantComposer");
18758
18775
  // src/features/assistant/components/parts/AssistantEmptyState.tsx
18759
18776
  import { jsx as jsx211, jsxs as jsxs126 } from "react/jsx-runtime";
18760
18777
  var STARTER_KEYS = ["a", "b", "c", "d"];
18761
- function AssistantEmptyState({ onSend }) {
18778
+ function AssistantEmptyState({ onSend, operatorMode = false, onOperatorModeChange }) {
18762
18779
  const t = useTranslations86();
18763
18780
  const [draft, setDraft] = useState80("");
18764
18781
  return /* @__PURE__ */ jsx211("div", { className: "flex h-full w-full items-center justify-center p-10", children: /* @__PURE__ */ jsxs126("div", { className: "flex w-full max-w-2xl flex-col gap-6", children: [
@@ -18768,6 +18785,18 @@ function AssistantEmptyState({ onSend }) {
18768
18785
  /* @__PURE__ */ jsx211("p", { className: "text-muted-foreground mt-1 text-sm", children: t("features.assistant.empty_state.subtitle") })
18769
18786
  ] }),
18770
18787
  /* @__PURE__ */ jsx211(AssistantComposer, { value: draft, onValueChange: setDraft, onSend }),
18788
+ onOperatorModeChange && /* @__PURE__ */ jsxs126("div", { className: "flex items-center justify-end gap-2", children: [
18789
+ /* @__PURE__ */ jsx211(
18790
+ Switch,
18791
+ {
18792
+ id: "assistant-operator-mode",
18793
+ size: "sm",
18794
+ checked: operatorMode,
18795
+ onCheckedChange: (checked) => onOperatorModeChange(checked === true)
18796
+ }
18797
+ ),
18798
+ /* @__PURE__ */ jsx211(Label, { htmlFor: "assistant-operator-mode", className: "text-muted-foreground text-xs", children: t("features.assistant.operator_mode") })
18799
+ ] }),
18771
18800
  /* @__PURE__ */ jsx211("div", { className: "grid grid-cols-2 gap-2", children: STARTER_KEYS.map((k) => {
18772
18801
  const text = t(`features.assistant.starters.${k}`);
18773
18802
  return /* @__PURE__ */ jsx211(
@@ -19332,7 +19361,14 @@ __name(MessageSourcesContainer, "MessageSourcesContainer");
19332
19361
 
19333
19362
  // src/features/assistant-message/components/MessageItem.tsx
19334
19363
  import { jsx as jsx221, jsxs as jsxs134 } from "react/jsx-runtime";
19335
- function MessageItem({ message, isLatestAssistant, onSelectFollowUp, failedMessageIds, onRetry }) {
19364
+ function MessageItem({
19365
+ message,
19366
+ isLatestAssistant,
19367
+ onSelectFollowUp,
19368
+ failedMessageIds,
19369
+ onRetry,
19370
+ renderApprovalAction
19371
+ }) {
19336
19372
  const t = useTranslations93();
19337
19373
  const isUser = message.role === "user";
19338
19374
  const isFailed = isUser && !!failedMessageIds?.has(message.id);
@@ -19346,12 +19382,13 @@ function MessageItem({ message, isLatestAssistant, onSelectFollowUp, failedMessa
19346
19382
  ] })
19347
19383
  ] });
19348
19384
  }
19385
+ const isApprovalRequest = message.messageType === "approval-request" && !!renderApprovalAction;
19349
19386
  return /* @__PURE__ */ jsxs134("div", { className: "flex min-w-0 max-w-[78%] flex-col gap-1.5", children: [
19350
19387
  /* @__PURE__ */ jsxs134("div", { className: "text-muted-foreground flex items-center gap-2 pl-1 text-xs", children: [
19351
19388
  /* @__PURE__ */ jsx221("span", { className: "flex h-4 w-4 items-center justify-center rounded-full bg-gradient-to-br from-blue-400 to-violet-500 text-white", children: /* @__PURE__ */ jsx221(Sparkles2, { className: "h-2.5 w-2.5" }) }),
19352
19389
  /* @__PURE__ */ jsx221("span", { children: t("features.assistant.agent_name") })
19353
19390
  ] }),
19354
- /* @__PURE__ */ jsx221("div", { className: "bg-muted text-foreground rounded-2xl rounded-bl-sm px-3.5 py-2.5 text-sm leading-relaxed", children: /* @__PURE__ */ jsx221(ReactMarkdown3, { remarkPlugins: [remarkGfm3], children: message.content }) }),
19391
+ isApprovalRequest ? renderApprovalAction(message) : /* @__PURE__ */ jsx221("div", { className: "bg-muted text-foreground rounded-2xl rounded-bl-sm px-3.5 py-2.5 text-sm leading-relaxed", children: /* @__PURE__ */ jsx221(ReactMarkdown3, { remarkPlugins: [remarkGfm3], children: message.content }) }),
19355
19392
  /* @__PURE__ */ jsx221(
19356
19393
  MessageSourcesContainer,
19357
19394
  {
@@ -19366,7 +19403,7 @@ __name(MessageItem, "MessageItem");
19366
19403
 
19367
19404
  // src/features/assistant-message/components/MessageList.tsx
19368
19405
  import { jsx as jsx222 } from "react/jsx-runtime";
19369
- function MessageList({ messages, onSelectFollowUp, failedMessageIds, onRetry }) {
19406
+ function MessageList({ messages, onSelectFollowUp, failedMessageIds, onRetry, renderApprovalAction }) {
19370
19407
  const ordered = [...messages].sort((a, b) => a.position - b.position);
19371
19408
  let lastAssistantIndex = -1;
19372
19409
  for (let i = ordered.length - 1; i >= 0; i--) {
@@ -19382,7 +19419,8 @@ function MessageList({ messages, onSelectFollowUp, failedMessageIds, onRetry })
19382
19419
  isLatestAssistant: i === lastAssistantIndex,
19383
19420
  onSelectFollowUp,
19384
19421
  failedMessageIds,
19385
- onRetry
19422
+ onRetry,
19423
+ renderApprovalAction
19386
19424
  },
19387
19425
  m.id
19388
19426
  )) });
@@ -19405,7 +19443,15 @@ __name(AssistantStatusLine, "AssistantStatusLine");
19405
19443
 
19406
19444
  // src/features/assistant/components/parts/AssistantThread.tsx
19407
19445
  import { jsx as jsx224, jsxs as jsxs136 } from "react/jsx-runtime";
19408
- function AssistantThread({ messages, sending, status, onSelectFollowUp, failedMessageIds, onRetry }) {
19446
+ function AssistantThread({
19447
+ messages,
19448
+ sending,
19449
+ status,
19450
+ onSelectFollowUp,
19451
+ failedMessageIds,
19452
+ onRetry,
19453
+ renderApprovalAction
19454
+ }) {
19409
19455
  const endRef = useRef34(null);
19410
19456
  useEffect63(() => {
19411
19457
  endRef.current?.scrollIntoView({ behavior: "smooth" });
@@ -19417,7 +19463,8 @@ function AssistantThread({ messages, sending, status, onSelectFollowUp, failedMe
19417
19463
  messages,
19418
19464
  onSelectFollowUp,
19419
19465
  failedMessageIds,
19420
- onRetry
19466
+ onRetry,
19467
+ renderApprovalAction
19421
19468
  }
19422
19469
  ),
19423
19470
  sending && /* @__PURE__ */ jsx224(AssistantStatusLine, { status }),
@@ -19428,7 +19475,7 @@ __name(AssistantThread, "AssistantThread");
19428
19475
 
19429
19476
  // src/features/assistant/components/containers/AssistantContainer.tsx
19430
19477
  import { Fragment as Fragment45, jsx as jsx225, jsxs as jsxs137 } from "react/jsx-runtime";
19431
- function AssistantContainer() {
19478
+ function AssistantContainer({ renderApprovalAction } = {}) {
19432
19479
  const ctx = useAssistantContext();
19433
19480
  const showThread = !!ctx.assistant || ctx.sending || ctx.messages.length > 0;
19434
19481
  return /* @__PURE__ */ jsx225(RoundPageContainer, { module: Modules.Assistant, fullWidth: true, children: /* @__PURE__ */ jsxs137("div", { className: "bg-background flex h-full w-full overflow-hidden rounded-lg border", children: [
@@ -19441,7 +19488,14 @@ function AssistantContainer() {
19441
19488
  onNew: ctx.startNew
19442
19489
  }
19443
19490
  ),
19444
- /* @__PURE__ */ jsx225("main", { className: "flex flex-1 flex-col", children: !showThread ? /* @__PURE__ */ jsx225(AssistantEmptyState, { onSend: ctx.sendMessage }) : /* @__PURE__ */ jsxs137(Fragment45, { children: [
19491
+ /* @__PURE__ */ jsx225("main", { className: "flex flex-1 flex-col", children: !showThread ? /* @__PURE__ */ jsx225(
19492
+ AssistantEmptyState,
19493
+ {
19494
+ onSend: ctx.sendMessage,
19495
+ operatorMode: ctx.operatorMode,
19496
+ onOperatorModeChange: ctx.setOperatorMode
19497
+ }
19498
+ ) : /* @__PURE__ */ jsxs137(Fragment45, { children: [
19445
19499
  ctx.assistant ? /* @__PURE__ */ jsx225(
19446
19500
  AssistantThreadHeader,
19447
19501
  {
@@ -19458,7 +19512,8 @@ function AssistantContainer() {
19458
19512
  status: ctx.status,
19459
19513
  onSelectFollowUp: ctx.sendMessage,
19460
19514
  failedMessageIds: ctx.failedMessageIds,
19461
- onRetry: ctx.retrySend
19515
+ onRetry: ctx.retrySend,
19516
+ renderApprovalAction
19462
19517
  }
19463
19518
  ),
19464
19519
  /* @__PURE__ */ jsx225(AssistantComposer, { onSend: ctx.sendMessage, disabled: ctx.sending })
@@ -22787,4 +22842,4 @@ export {
22787
22842
  useOAuthClients,
22788
22843
  useOAuthClient
22789
22844
  };
22790
- //# sourceMappingURL=chunk-CI36BXIG.mjs.map
22845
+ //# sourceMappingURL=chunk-TVOW47AP.mjs.map