@agent-native/toolkit 0.209.1-nightly-20261015153252 → 0.209.1

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 (68) hide show
  1. package/dist/app/agentkit/react/styles.css +1 -1
  2. package/dist/app/chat/AgentKitAssistantChat.d.ts +1 -0
  3. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  4. package/dist/app/chat/AgentKitAssistantChat.js +96 -1
  5. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  6. package/dist/app/chat/MultiTabAssistantChat.d.ts.map +1 -1
  7. package/dist/app/chat/MultiTabAssistantChat.js +21 -0
  8. package/dist/app/chat/MultiTabAssistantChat.js.map +1 -1
  9. package/dist/app/chat/chat/surface-types.d.ts +3 -1
  10. package/dist/app/chat/chat/surface-types.d.ts.map +1 -1
  11. package/dist/app/chat/chat/surface-types.js.map +1 -1
  12. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  13. package/dist/app/i18n/catalogs/ar-SA.js +2 -0
  14. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  15. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  16. package/dist/app/i18n/catalogs/de-DE.js +2 -0
  17. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  18. package/dist/app/i18n/catalogs/en-US.d.ts +2 -0
  19. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  20. package/dist/app/i18n/catalogs/en-US.js +2 -0
  21. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  22. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  23. package/dist/app/i18n/catalogs/es-ES.js +2 -0
  24. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  25. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  26. package/dist/app/i18n/catalogs/fr-FR.js +2 -0
  27. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  28. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  29. package/dist/app/i18n/catalogs/hi-IN.js +2 -0
  30. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  31. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  32. package/dist/app/i18n/catalogs/ja-JP.js +2 -0
  33. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  34. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  35. package/dist/app/i18n/catalogs/ko-KR.js +2 -0
  36. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  37. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  38. package/dist/app/i18n/catalogs/pt-BR.js +2 -0
  39. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  40. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  41. package/dist/app/i18n/catalogs/zh-CN.js +2 -0
  42. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  43. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  44. package/dist/app/i18n/catalogs/zh-TW.js +2 -0
  45. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  46. package/dist/composer/TiptapComposer.d.ts.map +1 -1
  47. package/dist/composer/TiptapComposer.js +2 -4
  48. package/dist/composer/TiptapComposer.js.map +1 -1
  49. package/package.json +4 -4
  50. package/src/app/agentkit/react/styles.css +1 -1
  51. package/src/app/chat/AgentKitAssistantChat.spec.tsx +137 -4
  52. package/src/app/chat/AgentKitAssistantChat.tsx +168 -0
  53. package/src/app/chat/MultiTabAssistantChat.spec.tsx +53 -0
  54. package/src/app/chat/MultiTabAssistantChat.tsx +36 -1
  55. package/src/app/chat/chat/surface-types.ts +6 -1
  56. package/src/app/i18n/catalogs/ar-SA.ts +4 -0
  57. package/src/app/i18n/catalogs/de-DE.ts +4 -0
  58. package/src/app/i18n/catalogs/en-US.ts +4 -0
  59. package/src/app/i18n/catalogs/es-ES.ts +4 -0
  60. package/src/app/i18n/catalogs/fr-FR.ts +4 -0
  61. package/src/app/i18n/catalogs/hi-IN.ts +4 -0
  62. package/src/app/i18n/catalogs/ja-JP.ts +4 -0
  63. package/src/app/i18n/catalogs/ko-KR.ts +4 -0
  64. package/src/app/i18n/catalogs/pt-BR.ts +4 -0
  65. package/src/app/i18n/catalogs/zh-CN.ts +3 -0
  66. package/src/app/i18n/catalogs/zh-TW.ts +3 -0
  67. package/src/composer/TiptapComposer.spec.ts +11 -12
  68. package/src/composer/TiptapComposer.tsx +2 -4
@@ -1974,7 +1974,7 @@ button.agentkit-object {
1974
1974
  }
1975
1975
 
1976
1976
  .agentkit-host-suggestions-slot {
1977
- block-size: 2rem;
1977
+ block-size: 2.5rem;
1978
1978
  min-inline-size: 0;
1979
1979
  }
1980
1980
 
@@ -39,6 +39,7 @@ interface PendingProviderSubmission {
39
39
  id: string;
40
40
  threadId: string;
41
41
  text: string;
42
+ submissionExpiresAt?: number;
42
43
  fileParts: FilePart[];
43
44
  requestAttachments?: AgentRequestAttachment[];
44
45
  references: Reference[];
@@ -1 +1 @@
1
- {"version":3,"file":"AgentKitAssistantChat.d.ts","sourceRoot":"","sources":["../../../src/app/chat/AgentKitAssistantChat.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AgentKitAssistantChat.d.ts","sourceRoot":"","sources":["../../../src/app/chat/AgentKitAssistantChat.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { AgentKitUploadError, hasActiveAgentRuns, selectAgentSuggestions, isCurrentAgentSuggestion, splitAgentKitMessageContext, } from "@agent-native/agentkit";
2
+ import { AgentKitUploadError, hasActiveAgentRuns, selectAgentSuggestions, isCurrentAgentSuggestion, AGENT_NATIVE_SUBMISSION_EXPIRES_AT_METADATA_KEY, splitAgentKitMessageContext, } from "@agent-native/agentkit";
3
3
  import { MAX_AGENT_REQUEST_ATTACHMENT_DATA_CHARS, isPersistableAttachmentUrl, persistableFilePart, } from "@agent-native/agentkit/protocol";
4
4
  import { CHATGPT_SUBSCRIPTION_ENGINE_NAME } from "@agent-native/core/agent/chatgpt-subscription-contract";
5
5
  import { isCreditsLimitErrorCode } from "@agent-native/core/agent/engine/error-detail";
@@ -368,6 +368,13 @@ function withCoreSnapshotPersistence(customTransport, coreTransport, persistence
368
368
  },
369
369
  });
370
370
  }
371
+ function isSubmissionExpired(submissionExpiresAt) {
372
+ return (submissionExpiresAt !== undefined &&
373
+ (!Number.isFinite(submissionExpiresAt) || submissionExpiresAt <= Date.now()));
374
+ }
375
+ function isSubmissionExpiredError(error) {
376
+ return asRecord(error)?.code === "submission_expired";
377
+ }
371
378
  function createPendingSelectionHydration(threadId) {
372
379
  let resolve;
373
380
  const promise = new Promise((resolvePromise) => {
@@ -532,6 +539,9 @@ function parseDeferredProviderSubmissions(value, threadId) {
532
539
  !Array.isArray(submission.references) ||
533
540
  !composerOptions ||
534
541
  !options ||
542
+ (submission.submissionExpiresAt !== undefined &&
543
+ (typeof submission.submissionExpiresAt !== "number" ||
544
+ !Number.isFinite(submission.submissionExpiresAt))) ||
535
545
  (submission.attempts !== undefined &&
536
546
  (!Number.isSafeInteger(submission.attempts) ||
537
547
  submission.attempts < 0)) ||
@@ -548,6 +558,9 @@ function parseDeferredProviderSubmissions(value, threadId) {
548
558
  id: submission.id,
549
559
  threadId,
550
560
  text: submission.text,
561
+ ...(typeof submission.submissionExpiresAt === "number"
562
+ ? { submissionExpiresAt: submission.submissionExpiresAt }
563
+ : {}),
551
564
  fileParts: fileParts,
552
565
  ...(Array.isArray(requestAttachments)
553
566
  ? {
@@ -2459,6 +2472,11 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
2459
2472
  : props.selectedAgent;
2460
2473
  const actionScope = options.actionScope ?? contextScope;
2461
2474
  const customMetadata = {
2475
+ ...(typeof options.submissionExpiresAt === "number"
2476
+ ? {
2477
+ [AGENT_NATIVE_SUBMISSION_EXPIRES_AT_METADATA_KEY]: options.submissionExpiresAt,
2478
+ }
2479
+ : {}),
2462
2480
  ...(options.recoveryAction
2463
2481
  ? { agentNativeRecoveryAction: options.recoveryAction }
2464
2482
  : {}),
@@ -2520,12 +2538,18 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
2520
2538
  };
2521
2539
  if (!queuedMessageReservationId)
2522
2540
  localSubmissionRef.current = true;
2541
+ if (isSubmissionExpired(options.submissionExpiresAt)) {
2542
+ throw Object.assign(new Error("The prompt expired before it could be sent."), { code: "submission_expired", retryable: false });
2543
+ }
2523
2544
  await control.sendMessage({
2524
2545
  text: message,
2525
2546
  attachments: fileParts,
2526
2547
  ...(requestAttachments.length ? { requestAttachments } : {}),
2527
2548
  queuedWhileRunActive: composerOptions.queuedWhileRunActive ||
2528
2549
  composerOptions.intent === "queued",
2550
+ ...(options.submissionExpiresAt !== undefined
2551
+ ? { queueWhileRunning: false }
2552
+ : {}),
2529
2553
  interruptActiveRun: composerOptions.steer,
2530
2554
  options: {
2531
2555
  model,
@@ -2587,9 +2611,17 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
2587
2611
  requestPendingSelectionClear,
2588
2612
  ]);
2589
2613
  const submit = useCallback(async (text, files, references, composerOptions, options = {}) => {
2614
+ if (isSubmissionExpired(options.submissionExpiresAt)) {
2615
+ reportAgentChatSubmitResult(options.submitMessageId, false, "submission-expired");
2616
+ return { status: "rejected", reason: "submission-expired" };
2617
+ }
2590
2618
  const submittedComposerOptions = captureQueuedRunState(composerOptions, isThreadRunning());
2591
2619
  const release = await acquireSubmission();
2592
2620
  if (!release) {
2621
+ if (isSubmissionExpired(options.submissionExpiresAt)) {
2622
+ reportAgentChatSubmitResult(options.submitMessageId, false, "submission-expired");
2623
+ return { status: "rejected", reason: "submission-expired" };
2624
+ }
2593
2625
  if (isRestoring) {
2594
2626
  try {
2595
2627
  const selectedEngine = submittedComposerOptions.engine ?? props.selectedEngine;
@@ -2627,9 +2659,17 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
2627
2659
  uploadedAttachments.requestAttachments.some((attachment) => attachment.data)) {
2628
2660
  throw new Error(t("onboarding.fileStorage.title"));
2629
2661
  }
2662
+ if (isSubmissionExpired(options.submissionExpiresAt)) {
2663
+ reportAgentChatSubmitResult(options.submitMessageId, false, "submission-expired");
2664
+ return { status: "rejected", reason: "submission-expired" };
2665
+ }
2630
2666
  const requestAttachments = normalizeRequestAttachmentReferences(options.deferredRequestAttachments ??
2631
2667
  (await uploadRequestAttachments(control, uploadedAttachments.requestAttachments)));
2632
2668
  submittedComposerOptions.validateSubmissionScope?.();
2669
+ if (isSubmissionExpired(options.submissionExpiresAt)) {
2670
+ reportAgentChatSubmitResult(options.submitMessageId, false, "submission-expired");
2671
+ return { status: "rejected", reason: "submission-expired" };
2672
+ }
2633
2673
  const selectionChangedDuringUpload = selectionRevision !== selectionRevisionRef.current;
2634
2674
  const context = options.recoveryAction
2635
2675
  ? ""
@@ -2673,21 +2713,39 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
2673
2713
  id: deferredOptions.deferredSubmissionId,
2674
2714
  threadId,
2675
2715
  text: appendAgentChatContextToMessage(text, context),
2716
+ ...(typeof options.submissionExpiresAt === "number"
2717
+ ? { submissionExpiresAt: options.submissionExpiresAt }
2718
+ : {}),
2676
2719
  fileParts,
2677
2720
  ...(requestAttachments.length ? { requestAttachments } : {}),
2678
2721
  references: [...references],
2679
2722
  composerOptions: deferredComposerOptions,
2680
2723
  options: deferredOptions,
2681
2724
  };
2725
+ if (isSubmissionExpired(options.submissionExpiresAt)) {
2726
+ reportAgentChatSubmitResult(submitMessageId, false, "submission-expired");
2727
+ return { status: "rejected", reason: "submission-expired" };
2728
+ }
2682
2729
  const submissions = await updateDeferredProviderSubmissions(threadId, (current) => current.some(({ id }) => id === submission.id)
2683
2730
  ? current
2684
2731
  : [...current, submission]);
2732
+ if (isSubmissionExpired(options.submissionExpiresAt)) {
2733
+ pendingProviderSubmissionsRef.current =
2734
+ await updateDeferredProviderSubmissions(threadId, (current) => current.filter(({ id }) => id !== submission.id));
2735
+ setPendingProviderSubmissionVersion((version) => version + 1);
2736
+ reportAgentChatSubmitResult(submitMessageId, false, "submission-expired");
2737
+ return { status: "rejected", reason: "submission-expired" };
2738
+ }
2685
2739
  pendingProviderSubmissionsRef.current = submissions;
2686
2740
  setDeferredSubmissionsLoadedThread(threadId);
2687
2741
  reportAgentChatSubmitResult(submitMessageId, true);
2688
2742
  return { status: "submitted" };
2689
2743
  }
2690
2744
  catch (error) {
2745
+ if (isSubmissionExpiredError(error)) {
2746
+ reportAgentChatSubmitResult(options.submitMessageId, false, "submission-expired");
2747
+ return { status: "rejected", reason: "submission-expired" };
2748
+ }
2691
2749
  reportAgentChatSubmitResult(options.submitMessageId, false, submitFailureReason(error));
2692
2750
  dispatchSetupRequiredEvent(error, props.tabId, threadId);
2693
2751
  throw error;
@@ -2712,10 +2770,18 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
2712
2770
  }
2713
2771
  }
2714
2772
  try {
2773
+ if (isSubmissionExpired(options.submissionExpiresAt)) {
2774
+ reportAgentChatSubmitResult(options.submitMessageId, false, "submission-expired");
2775
+ return { status: "rejected", reason: "submission-expired" };
2776
+ }
2715
2777
  await dispatch(text, files, references, submittedComposerOptions, options);
2716
2778
  return { status: "submitted" };
2717
2779
  }
2718
2780
  catch (error) {
2781
+ if (isSubmissionExpiredError(error)) {
2782
+ reportAgentChatSubmitResult(options.submitMessageId, false, "submission-expired");
2783
+ return { status: "rejected", reason: "submission-expired" };
2784
+ }
2719
2785
  reportAgentChatSubmitResult(options.submitMessageId, false, submitFailureReason(error));
2720
2786
  dispatchSetupRequiredEvent(error, props.tabId, threadId);
2721
2787
  throw error;
@@ -3011,6 +3077,13 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
3011
3077
  let claimToken;
3012
3078
  let claimRenewalTimer;
3013
3079
  try {
3080
+ if (isSubmissionExpired(submission.submissionExpiresAt)) {
3081
+ const submissions = await updateDeferredProviderSubmissions(threadId, (current) => current.filter(({ id }) => id !== submission.id));
3082
+ pendingProviderSubmissionsRef.current = submissions;
3083
+ reportAgentChatSubmitResult(submission.id, false, "submission-expired");
3084
+ setPendingProviderSubmissionVersion((version) => version + 1);
3085
+ return;
3086
+ }
3014
3087
  release = await acquireSubmission();
3015
3088
  if (!release) {
3016
3089
  if (active)
@@ -3060,6 +3133,13 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
3060
3133
  scheduleProviderSubmissionRetry(Math.max(1000, Math.min(10_000, waitMs)));
3061
3134
  return;
3062
3135
  }
3136
+ if (isSubmissionExpired(currentSubmission.submissionExpiresAt)) {
3137
+ const submissions = await updateDeferredProviderSubmissions(threadId, (current) => current.filter(({ id }) => id !== submission.id));
3138
+ pendingProviderSubmissionsRef.current = submissions;
3139
+ reportAgentChatSubmitResult(submission.id, false, "submission-expired");
3140
+ setPendingProviderSubmissionVersion((version) => version + 1);
3141
+ return;
3142
+ }
3063
3143
  claimRenewalTimer = window.setInterval(() => {
3064
3144
  void updateDeferredProviderSubmissions(threadId, (current) => current.map((candidate) => candidate.id === submission.id &&
3065
3145
  candidate.claim?.token === claimToken
@@ -3089,6 +3169,18 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
3089
3169
  setPendingProviderSubmissionVersion((version) => version + 1);
3090
3170
  }
3091
3171
  catch (error) {
3172
+ if (isSubmissionExpiredError(error)) {
3173
+ const submissions = await updateDeferredProviderSubmissions(threadId, (current) => current.filter((candidate) => candidate.id !== submission.id ||
3174
+ !claimToken ||
3175
+ candidate.claim?.token !== claimToken));
3176
+ pendingProviderSubmissionsRef.current = submissions;
3177
+ reportAgentChatSubmitResult(submission.id, false, "submission-expired");
3178
+ if (active) {
3179
+ setDeferredProviderSubmissionFailureId(null);
3180
+ setPendingProviderSubmissionVersion((version) => version + 1);
3181
+ }
3182
+ return;
3183
+ }
3092
3184
  let snapshotReadFailed = false;
3093
3185
  const latestThread = await props
3094
3186
  .getThreadSnapshot(threadId)
@@ -4641,6 +4733,9 @@ async function attachmentToFile(attachment) {
4641
4733
  const ATTACHMENT_UNREADABLE_SUBMIT_REASON = "attachment-unreadable";
4642
4734
  function submitFailureReason(error) {
4643
4735
  const record = asRecord(error);
4736
+ if (record?.code === "submission_expired") {
4737
+ return "submission-expired";
4738
+ }
4644
4739
  if (record?.code === ATTACHMENT_UNREADABLE_SUBMIT_REASON) {
4645
4740
  return ATTACHMENT_UNREADABLE_SUBMIT_REASON;
4646
4741
  }