@witqq/agent-sdk 0.8.0 → 0.9.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 (113) hide show
  1. package/dist/{agent-DxY68NZL.d.cts → agent-C6H2CgJA.d.cts} +2 -0
  2. package/dist/{agent-CW9XbmG_.d.ts → agent-F7oB6eKp.d.ts} +2 -0
  3. package/dist/backends/claude.cjs.map +1 -1
  4. package/dist/backends/claude.d.cts +2 -2
  5. package/dist/backends/claude.d.ts +2 -2
  6. package/dist/backends/claude.js.map +1 -1
  7. package/dist/backends/copilot.cjs +8 -15
  8. package/dist/backends/copilot.cjs.map +1 -1
  9. package/dist/backends/copilot.d.cts +2 -2
  10. package/dist/backends/copilot.d.ts +2 -2
  11. package/dist/backends/copilot.js +8 -15
  12. package/dist/backends/copilot.js.map +1 -1
  13. package/dist/backends/mock-llm.cjs +719 -0
  14. package/dist/backends/mock-llm.cjs.map +1 -0
  15. package/dist/backends/mock-llm.d.cts +37 -0
  16. package/dist/backends/mock-llm.d.ts +37 -0
  17. package/dist/backends/mock-llm.js +717 -0
  18. package/dist/backends/mock-llm.js.map +1 -0
  19. package/dist/backends/vercel-ai.cjs +8 -1
  20. package/dist/backends/vercel-ai.cjs.map +1 -1
  21. package/dist/backends/vercel-ai.d.cts +2 -2
  22. package/dist/backends/vercel-ai.d.ts +2 -2
  23. package/dist/backends/vercel-ai.js +8 -1
  24. package/dist/backends/vercel-ai.js.map +1 -1
  25. package/dist/backends-Cno0gZjy.d.cts +114 -0
  26. package/dist/backends-Cno0gZjy.d.ts +114 -0
  27. package/dist/chat/accumulator.cjs.map +1 -1
  28. package/dist/chat/accumulator.d.cts +2 -2
  29. package/dist/chat/accumulator.d.ts +2 -2
  30. package/dist/chat/accumulator.js.map +1 -1
  31. package/dist/chat/backends.cjs +350 -77
  32. package/dist/chat/backends.cjs.map +1 -1
  33. package/dist/chat/backends.d.cts +7 -7
  34. package/dist/chat/backends.d.ts +7 -7
  35. package/dist/chat/backends.js +349 -78
  36. package/dist/chat/backends.js.map +1 -1
  37. package/dist/chat/context.d.cts +2 -2
  38. package/dist/chat/context.d.ts +2 -2
  39. package/dist/chat/core.cjs +35 -25
  40. package/dist/chat/core.cjs.map +1 -1
  41. package/dist/chat/core.d.cts +15 -5
  42. package/dist/chat/core.d.ts +15 -5
  43. package/dist/chat/core.js +35 -26
  44. package/dist/chat/core.js.map +1 -1
  45. package/dist/chat/events.d.cts +2 -2
  46. package/dist/chat/events.d.ts +2 -2
  47. package/dist/chat/index.cjs +418 -122
  48. package/dist/chat/index.cjs.map +1 -1
  49. package/dist/chat/index.d.cts +7 -7
  50. package/dist/chat/index.d.ts +7 -7
  51. package/dist/chat/index.js +418 -124
  52. package/dist/chat/index.js.map +1 -1
  53. package/dist/chat/react.cjs +216 -12
  54. package/dist/chat/react.cjs.map +1 -1
  55. package/dist/chat/react.d.cts +78 -4
  56. package/dist/chat/react.d.ts +78 -4
  57. package/dist/chat/react.js +215 -13
  58. package/dist/chat/react.js.map +1 -1
  59. package/dist/chat/runtime.cjs +6 -2
  60. package/dist/chat/runtime.cjs.map +1 -1
  61. package/dist/chat/runtime.d.cts +2 -2
  62. package/dist/chat/runtime.d.ts +2 -2
  63. package/dist/chat/runtime.js +6 -2
  64. package/dist/chat/runtime.js.map +1 -1
  65. package/dist/chat/server.cjs +15 -5
  66. package/dist/chat/server.cjs.map +1 -1
  67. package/dist/chat/server.d.cts +3 -3
  68. package/dist/chat/server.d.ts +3 -3
  69. package/dist/chat/server.js +15 -5
  70. package/dist/chat/server.js.map +1 -1
  71. package/dist/chat/sessions.cjs +39 -23
  72. package/dist/chat/sessions.cjs.map +1 -1
  73. package/dist/chat/sessions.d.cts +2 -2
  74. package/dist/chat/sessions.d.ts +2 -2
  75. package/dist/chat/sessions.js +40 -24
  76. package/dist/chat/sessions.js.map +1 -1
  77. package/dist/chat/sqlite.cjs +95 -0
  78. package/dist/chat/sqlite.cjs.map +1 -1
  79. package/dist/chat/sqlite.d.cts +39 -3
  80. package/dist/chat/sqlite.d.ts +39 -3
  81. package/dist/chat/sqlite.js +93 -1
  82. package/dist/chat/sqlite.js.map +1 -1
  83. package/dist/chat/state.d.cts +2 -2
  84. package/dist/chat/state.d.ts +2 -2
  85. package/dist/chat/storage.cjs +39 -23
  86. package/dist/chat/storage.cjs.map +1 -1
  87. package/dist/chat/storage.d.cts +7 -3
  88. package/dist/chat/storage.d.ts +7 -3
  89. package/dist/chat/storage.js +40 -24
  90. package/dist/chat/storage.js.map +1 -1
  91. package/dist/{in-process-transport-C1JnJGVR.d.ts → in-process-transport-7EIit9Xk.d.ts} +51 -17
  92. package/dist/{in-process-transport-C7DSqPyX.d.cts → in-process-transport-Ct9YcX8I.d.cts} +51 -17
  93. package/dist/index.cjs +14 -14
  94. package/dist/index.cjs.map +1 -1
  95. package/dist/index.d.cts +4 -2
  96. package/dist/index.d.ts +4 -2
  97. package/dist/index.js +13 -13
  98. package/dist/index.js.map +1 -1
  99. package/dist/testing.cjs +724 -0
  100. package/dist/testing.cjs.map +1 -1
  101. package/dist/testing.d.cts +14 -2
  102. package/dist/testing.d.ts +14 -2
  103. package/dist/testing.js +724 -0
  104. package/dist/testing.js.map +1 -1
  105. package/dist/{transport-Cdh3M0tS.d.cts → transport-DLWCN18G.d.cts} +1 -1
  106. package/dist/{transport-Ciap4PWK.d.ts → transport-DsuS-GeM.d.ts} +1 -1
  107. package/dist/{types-ajANVzf7.d.ts → types-DgtI1hzh.d.ts} +2 -1
  108. package/dist/{types-DRgd_9R7.d.cts → types-DkSXALKg.d.cts} +2 -1
  109. package/package.json +18 -7
  110. package/LICENSE +0 -21
  111. package/README.md +0 -1054
  112. package/dist/backends-BSrsBYFn.d.cts +0 -39
  113. package/dist/backends-BSrsBYFn.d.ts +0 -39
@@ -283,6 +283,9 @@ function useChat(options = {}) {
283
283
  }
284
284
  const agentEvent = chatEventToAgentEvent(event);
285
285
  if (agentEvent) {
286
+ if (agentEvent.type === "error" && !agentEvent.recoverable) {
287
+ throw new Error(agentEvent.error || "Stream error");
288
+ }
286
289
  accumulator.apply(agentEvent);
287
290
  hasEvents = true;
288
291
  const snapshot = accumulator.snapshot();
@@ -801,25 +804,98 @@ function useThreadSlots() {
801
804
  function useOptionalThreadSlots() {
802
805
  return react.useContext(ThreadSlotsContext);
803
806
  }
807
+ function useVirtualMessages(items, options = {}) {
808
+ const { estimatedItemHeight = 80, overscan = 3 } = options;
809
+ const [scrollTop, setScrollTop] = react.useState(0);
810
+ const [containerHeight, setContainerHeight] = react.useState(0);
811
+ const containerElRef = react.useRef(null);
812
+ const containerRef = react.useCallback((el) => {
813
+ containerElRef.current = el;
814
+ if (el) {
815
+ setContainerHeight(el.clientHeight);
816
+ }
817
+ }, []);
818
+ react.useEffect(() => {
819
+ const el = containerElRef.current;
820
+ if (!el || typeof ResizeObserver === "undefined") return;
821
+ const ro = new ResizeObserver(() => {
822
+ setContainerHeight(el.clientHeight);
823
+ });
824
+ ro.observe(el);
825
+ return () => ro.disconnect();
826
+ }, []);
827
+ const onScroll = react.useCallback(
828
+ (event) => {
829
+ setScrollTop(event.currentTarget.scrollTop);
830
+ setContainerHeight(event.currentTarget.clientHeight);
831
+ },
832
+ []
833
+ );
834
+ const result = react.useMemo(() => {
835
+ const totalCount = items.length;
836
+ const totalHeight = totalCount * estimatedItemHeight;
837
+ if (totalCount === 0 || containerHeight === 0) {
838
+ return {
839
+ visibleItems: items.slice(),
840
+ startIndex: 0,
841
+ endIndex: totalCount,
842
+ topSpacerHeight: 0,
843
+ bottomSpacerHeight: 0,
844
+ totalHeight
845
+ };
846
+ }
847
+ const rawStart = Math.floor(scrollTop / estimatedItemHeight) - overscan;
848
+ const startIndex = Math.max(0, rawStart);
849
+ const visibleCount = Math.ceil(containerHeight / estimatedItemHeight);
850
+ const rawEnd = Math.floor(scrollTop / estimatedItemHeight) + visibleCount + overscan;
851
+ const endIndex = Math.min(totalCount, rawEnd);
852
+ return {
853
+ visibleItems: items.slice(startIndex, endIndex),
854
+ startIndex,
855
+ endIndex,
856
+ topSpacerHeight: startIndex * estimatedItemHeight,
857
+ bottomSpacerHeight: (totalCount - endIndex) * estimatedItemHeight,
858
+ totalHeight
859
+ };
860
+ }, [items, scrollTop, containerHeight, estimatedItemHeight, overscan]);
861
+ return {
862
+ ...result,
863
+ onScroll,
864
+ containerRef
865
+ };
866
+ }
804
867
 
805
868
  // src/chat/react/Thread.ts
806
869
  function Thread({
807
870
  messages,
808
871
  isGenerating,
809
872
  autoScroll = true,
810
- className
873
+ className,
874
+ virtualize
811
875
  }) {
812
876
  const sentinelRef = react.useRef(null);
813
877
  const containerRef = react.useRef(null);
814
878
  const [userScrolledUp, setUserScrolledUp] = react.useState(false);
815
879
  const isScrollingProgrammatically = react.useRef(false);
816
- const handleScroll = react.useCallback(() => {
817
- if (isScrollingProgrammatically.current) return;
818
- const el = containerRef.current;
819
- if (!el) return;
820
- const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 1;
821
- setUserScrolledUp(!atBottom);
822
- }, []);
880
+ const isVirtualized = virtualize != null && virtualize !== false;
881
+ const virtualizeOpts = virtualize === true ? {} : !isVirtualized ? false : virtualize;
882
+ const virtual = useVirtualMessages(
883
+ messages,
884
+ virtualizeOpts || void 0
885
+ );
886
+ const handleScroll = react.useCallback(
887
+ (e) => {
888
+ if (isVirtualized) {
889
+ virtual.onScroll(e);
890
+ }
891
+ if (isScrollingProgrammatically.current) return;
892
+ const el = containerRef.current;
893
+ if (!el) return;
894
+ const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 1;
895
+ setUserScrolledUp(!atBottom);
896
+ },
897
+ [isVirtualized, virtual.onScroll]
898
+ );
823
899
  const scrollToBottom = react.useCallback(() => {
824
900
  isScrollingProgrammatically.current = true;
825
901
  sentinelRef.current?.scrollIntoView({ behavior: "smooth" });
@@ -833,11 +909,23 @@ function Thread({
833
909
  sentinelRef.current?.scrollIntoView({ behavior: "smooth" });
834
910
  }, [messages, autoScroll, userScrolledUp]);
835
911
  const slots = useOptionalThreadSlots();
912
+ const mergedRef = react.useCallback(
913
+ (el) => {
914
+ containerRef.current = el;
915
+ if (isVirtualized) {
916
+ virtual.containerRef(el);
917
+ }
918
+ },
919
+ [isVirtualized, virtual.containerRef]
920
+ );
836
921
  const attrs = { "data-thread": "true", className };
837
922
  if (isGenerating) {
838
923
  attrs["data-thread-loading"] = "true";
839
924
  }
840
- attrs.ref = containerRef;
925
+ if (virtualizeOpts) {
926
+ attrs["data-thread-virtualized"] = "true";
927
+ }
928
+ attrs.ref = mergedRef;
841
929
  attrs.onScroll = handleScroll;
842
930
  const children = [];
843
931
  if (messages.length === 0 && !isGenerating) {
@@ -849,9 +937,21 @@ function Thread({
849
937
  )
850
938
  );
851
939
  }
852
- for (let i = 0; i < messages.length; i++) {
853
- const msg = messages[i];
854
- const content = slots?.renderMessage ? slots.renderMessage(msg, i) : react.createElement(Message, {
940
+ const renderMessages = virtualizeOpts ? virtual.visibleItems : messages;
941
+ const startOffset = virtualizeOpts ? virtual.startIndex : 0;
942
+ if (virtualizeOpts && virtual.topSpacerHeight > 0) {
943
+ children.push(
944
+ react.createElement("div", {
945
+ key: "__virtual-top",
946
+ "data-virtual-spacer": "top",
947
+ style: { height: virtual.topSpacerHeight }
948
+ })
949
+ );
950
+ }
951
+ for (let i = 0; i < renderMessages.length; i++) {
952
+ const msg = renderMessages[i];
953
+ const originalIndex = startOffset + i;
954
+ const content = slots?.renderMessage ? slots.renderMessage(msg, originalIndex) : react.createElement(Message, {
855
955
  key: msg.id,
856
956
  message: msg,
857
957
  renderToolCall: slots?.renderToolCall,
@@ -865,6 +965,15 @@ function Thread({
865
965
  )
866
966
  );
867
967
  }
968
+ if (virtualizeOpts && virtual.bottomSpacerHeight > 0) {
969
+ children.push(
970
+ react.createElement("div", {
971
+ key: "__virtual-bottom",
972
+ "data-virtual-spacer": "bottom",
973
+ style: { height: virtual.bottomSpacerHeight }
974
+ })
975
+ );
976
+ }
868
977
  if (isGenerating) {
869
978
  children.push(
870
979
  react.createElement(
@@ -3543,6 +3652,99 @@ function ChatUI({ runtime, ...rest }) {
3543
3652
  children: react.createElement(ChatUIInner, rest)
3544
3653
  });
3545
3654
  }
3655
+ function PermissionDialog({
3656
+ requests,
3657
+ onApprove,
3658
+ onDeny,
3659
+ onApproveAll,
3660
+ onDenyAll,
3661
+ renderArgs,
3662
+ className
3663
+ }) {
3664
+ if (requests.length === 0) return null;
3665
+ const items = requests.map(
3666
+ (req) => react.createElement(
3667
+ "div",
3668
+ {
3669
+ key: req.toolCallId,
3670
+ "data-permission-request": "true",
3671
+ "data-tool-name": req.toolName
3672
+ },
3673
+ // Tool name
3674
+ react.createElement(
3675
+ "div",
3676
+ { "data-permission-tool-name": "true" },
3677
+ req.toolName
3678
+ ),
3679
+ // Arguments display
3680
+ react.createElement(
3681
+ "div",
3682
+ { "data-permission-tool-args": "true" },
3683
+ renderArgs ? renderArgs(req.toolArgs, req.toolName) : react.createElement("pre", null, JSON.stringify(req.toolArgs, null, 2))
3684
+ ),
3685
+ // Action buttons
3686
+ react.createElement(
3687
+ "div",
3688
+ { "data-permission-actions": "true" },
3689
+ react.createElement(
3690
+ "button",
3691
+ {
3692
+ type: "button",
3693
+ "data-action": "approve",
3694
+ onClick: () => onApprove(req.toolCallId),
3695
+ "aria-label": `Approve ${req.toolName}`
3696
+ },
3697
+ "Allow"
3698
+ ),
3699
+ react.createElement(
3700
+ "button",
3701
+ {
3702
+ type: "button",
3703
+ "data-action": "deny",
3704
+ onClick: () => onDeny(req.toolCallId),
3705
+ "aria-label": `Deny ${req.toolName}`
3706
+ },
3707
+ "Deny"
3708
+ )
3709
+ )
3710
+ )
3711
+ );
3712
+ const bulkActions = requests.length > 1 && (onApproveAll || onDenyAll) ? react.createElement(
3713
+ "div",
3714
+ { "data-permission-bulk-actions": "true" },
3715
+ onApproveAll ? react.createElement(
3716
+ "button",
3717
+ {
3718
+ type: "button",
3719
+ "data-action": "approve-all",
3720
+ onClick: onApproveAll,
3721
+ "aria-label": "Approve all tool calls"
3722
+ },
3723
+ "Allow All"
3724
+ ) : null,
3725
+ onDenyAll ? react.createElement(
3726
+ "button",
3727
+ {
3728
+ type: "button",
3729
+ "data-action": "deny-all",
3730
+ onClick: onDenyAll,
3731
+ "aria-label": "Deny all tool calls"
3732
+ },
3733
+ "Deny All"
3734
+ ) : null
3735
+ ) : null;
3736
+ return react.createElement(
3737
+ "div",
3738
+ {
3739
+ "data-permission-dialog": "true",
3740
+ role: "dialog",
3741
+ "aria-label": "Tool permission requests",
3742
+ className
3743
+ },
3744
+ ...items,
3745
+ bulkActions
3746
+ );
3747
+ }
3546
3748
 
3547
3749
  exports.BackendSelector = BackendSelector;
3548
3750
  exports.ChatHeader = ChatHeader;
@@ -3558,6 +3760,7 @@ exports.CopilotAuthForm = CopilotAuthForm;
3558
3760
  exports.MarkdownRenderer = MarkdownRenderer;
3559
3761
  exports.Message = Message;
3560
3762
  exports.ModelSelector = ModelSelector;
3763
+ exports.PermissionDialog = PermissionDialog;
3561
3764
  exports.ProviderModelSelector = ProviderModelSelector;
3562
3765
  exports.ProviderSelector = ProviderSelector;
3563
3766
  exports.ProviderSettings = ProviderSettings;
@@ -3585,5 +3788,6 @@ exports.useSSE = useSSE;
3585
3788
  exports.useSessions = useSessions;
3586
3789
  exports.useThreadSlots = useThreadSlots;
3587
3790
  exports.useToolApproval = useToolApproval;
3791
+ exports.useVirtualMessages = useVirtualMessages;
3588
3792
  //# sourceMappingURL=react.cjs.map
3589
3793
  //# sourceMappingURL=react.cjs.map