@agent-native/core 0.12.27 → 0.12.29

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 (52) hide show
  1. package/dist/agent/engine/builder-engine.d.ts +1 -1
  2. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  3. package/dist/agent/model-config.d.ts +3 -3
  4. package/dist/agent/model-config.d.ts.map +1 -1
  5. package/dist/agent/model-config.js +5 -4
  6. package/dist/agent/model-config.js.map +1 -1
  7. package/dist/application-state/emitter.d.ts +3 -2
  8. package/dist/application-state/emitter.d.ts.map +1 -1
  9. package/dist/application-state/emitter.js +4 -2
  10. package/dist/application-state/emitter.js.map +1 -1
  11. package/dist/application-state/store.js +3 -3
  12. package/dist/application-state/store.js.map +1 -1
  13. package/dist/client/AgentPanel.d.ts.map +1 -1
  14. package/dist/client/AgentPanel.js +0 -1
  15. package/dist/client/AgentPanel.js.map +1 -1
  16. package/dist/client/AssistantChat.d.ts.map +1 -1
  17. package/dist/client/AssistantChat.js +45 -7
  18. package/dist/client/AssistantChat.js.map +1 -1
  19. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  20. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  21. package/dist/client/agent-chat-adapter.js +12 -5
  22. package/dist/client/agent-chat-adapter.js.map +1 -1
  23. package/dist/client/use-chat-models.js.map +1 -1
  24. package/dist/client/use-db-sync.d.ts +4 -0
  25. package/dist/client/use-db-sync.d.ts.map +1 -1
  26. package/dist/client/use-db-sync.js +38 -13
  27. package/dist/client/use-db-sync.js.map +1 -1
  28. package/dist/client/use-pausing-interval.d.ts.map +1 -1
  29. package/dist/client/use-pausing-interval.js +5 -2
  30. package/dist/client/use-pausing-interval.js.map +1 -1
  31. package/dist/collab/client.d.ts +2 -0
  32. package/dist/collab/client.d.ts.map +1 -1
  33. package/dist/collab/client.js +37 -4
  34. package/dist/collab/client.js.map +1 -1
  35. package/dist/server/auth.d.ts.map +1 -1
  36. package/dist/server/auth.js +83 -2
  37. package/dist/server/auth.js.map +1 -1
  38. package/dist/server/google-auth-plugin.d.ts.map +1 -1
  39. package/dist/server/google-auth-plugin.js +50 -3
  40. package/dist/server/google-auth-plugin.js.map +1 -1
  41. package/dist/server/google-oauth.d.ts.map +1 -1
  42. package/dist/server/google-oauth.js +10 -4
  43. package/dist/server/google-oauth.js.map +1 -1
  44. package/dist/server/onboarding-html.d.ts.map +1 -1
  45. package/dist/server/onboarding-html.js +50 -3
  46. package/dist/server/onboarding-html.js.map +1 -1
  47. package/dist/server/poll.d.ts.map +1 -1
  48. package/dist/server/poll.js +15 -0
  49. package/dist/server/poll.js.map +1 -1
  50. package/dist/templates/default/app/hooks/use-navigation-state.ts +0 -1
  51. package/package.json +1 -1
  52. package/src/templates/default/app/hooks/use-navigation-state.ts +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AA4Bf,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAwrErE,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,6DAA6D;IAC7D,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,4CAA4C;IAC5C,SAAS,IAAI,OAAO,CAAC;IACrB,+BAA+B;IAC/B,aAAa,IAAI,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wGAAwG;IACxG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,oDAAoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,0CAA0C;IAC1C,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,8EAA8E;IAC9E,YAAY,CAAC,EAAE,CACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;QACJ,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB,KACE,IAAI,CAAC;IACV,+DAA+D;IAC/D,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,8DAA8D;IAC9D,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,8EAA8E;IAC9E,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,+FAA+F;IAC/F,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mEAAmE;IACnE,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IACpD,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0DAA0D;IAC1D,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qFAAqF;IACrF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,uDAAuD;IACvD,eAAe,CAAC,EAAE,KAAK,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;IACH,uDAAuD;IACvD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,kEAAkE;IAClE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAEjD,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,QAI9C;AAqCD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAu6C7B,eAAO,MAAM,aAAa,gGA4DxB,CAAC"}
1
+ {"version":3,"file":"AssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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"}
@@ -23,7 +23,7 @@ import { ThumbsFeedback } from "./observability/ThumbsFeedback.js";
23
23
  import { TiptapComposer, } from "./composer/TiptapComposer.js";
24
24
  import { isPastedTextAttachmentName } from "./composer/pasted-text.js";
25
25
  import { PastedTextChip } from "./composer/PastedTextChip.js";
26
- import { IconMessage, IconX, IconPlayerStop, IconCheck, IconChevronDown, IconCopy, IconTerminal, IconLoader2, IconCircleX, IconSquareFilled, IconClock, IconFile, IconFolder, IconFileText, IconCheckbox, IconMail, IconUser, IconPresentation, IconStack2, IconMessageChatbot, IconLock, IconArrowBackUp, IconExternalLink, IconDots, IconGitFork, IconId, IconQuote, IconGauge, IconArrowRight, IconSettings, IconAlertTriangle, IconRefresh, IconPlayerPlay, } from "@tabler/icons-react";
26
+ import { IconMessage, IconX, IconPlayerStop, IconCheck, IconChevronDown, IconCopy, IconTerminal, IconLoader2, IconCircleX, IconSquareFilled, IconClock, IconFile, IconFolder, IconFileText, IconCheckbox, IconMail, IconUser, IconPresentation, IconStack2, IconMessageChatbot, IconLock, IconArrowBackUp, IconExternalLink, IconDots, IconGitFork, IconId, IconQuote, IconGauge, IconArrowRight, IconSettings, IconAlertTriangle, IconRefresh, IconPlayerPlay, IconClipboardList, } from "@tabler/icons-react";
27
27
  class BinaryDocumentAttachmentAdapter {
28
28
  accept = "application/pdf,.pdf";
29
29
  async add(state) {
@@ -69,6 +69,16 @@ function getFileDataURL(file) {
69
69
  reader.readAsDataURL(file);
70
70
  });
71
71
  }
72
+ function createUserMessageRunConfig(references, requestMode) {
73
+ const custom = {};
74
+ if (references && references.length > 0) {
75
+ custom.references = references;
76
+ }
77
+ if (requestMode) {
78
+ custom.requestMode = requestMode;
79
+ }
80
+ return Object.keys(custom).length > 0 ? { runConfig: { custom } } : {};
81
+ }
72
82
  function escapeQueuedAttachmentAttribute(value) {
73
83
  return value.replace(/&/g, "&").replace(/"/g, """);
74
84
  }
@@ -1160,6 +1170,11 @@ function LoopLimitContinueCard({ info, onContinue, }) {
1160
1170
  setError(null);
1161
1171
  }, className: "h-8 w-full rounded-md border border-border bg-background px-2 text-xs text-foreground outline-none focus:ring-1 focus:ring-ring disabled:opacity-60" })] }), _jsx("button", { type: "button", onClick: saveLimit, disabled: !hasPendingChange || saving, className: "inline-flex h-8 items-center gap-1 rounded-md border border-border px-2.5 text-xs font-medium text-foreground hover:bg-accent disabled:opacity-50", children: saving ? (_jsx(IconLoader2, { size: 12, className: "animate-spin" })) : saved ? (_jsx(IconCheck, { size: 12 })) : ("Save") }), _jsxs("button", { type: "button", onClick: openSettings, className: "inline-flex h-8 items-center gap-1 rounded-md border border-border px-2.5 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-foreground", children: [_jsx(IconSettings, { size: 12 }), "Settings"] }), _jsxs("button", { type: "button", onClick: handleContinue, disabled: saving, className: "ml-auto inline-flex h-8 items-center gap-1 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90 disabled:opacity-60", children: [hasPendingChange ? "Save and keep going" : "Keep going", _jsx(IconArrowRight, { size: 12 })] })] }), settings && !settings.canUpdate && (_jsx("p", { className: "mt-2 text-[11px] text-muted-foreground", children: "Only organization owners and admins can change this limit." })), error && _jsx("p", { className: "mt-2 text-[11px] text-destructive", children: error })] }));
1162
1172
  }
1173
+ function PlanModeCallout({ canImplementPlan, onImplementPlan, onSwitchToAct, }) {
1174
+ return (_jsx("div", { className: "shrink-0 px-3 pt-2", children: _jsx("div", { className: "rounded-lg border border-blue-500/25 bg-blue-500/[0.06] px-3 py-2.5 shadow-sm", children: _jsxs("div", { className: "flex items-center gap-2.5", children: [_jsx("span", { className: "flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-blue-500/10 text-blue-600 dark:text-blue-300", children: _jsx(IconClipboardList, { size: 15 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-sm font-medium text-foreground", children: canImplementPlan ? "Plan ready" : "Plan mode is on" }), _jsx("p", { className: "mt-0.5 text-xs leading-relaxed text-muted-foreground", children: canImplementPlan
1175
+ ? "Switch to Act and run the proposed plan."
1176
+ : "The next turn will stay read-only until you switch to Act." })] }), canImplementPlan ? (_jsxs("button", { type: "button", onClick: onImplementPlan, className: "inline-flex h-8 shrink-0 items-center gap-1.5 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90", children: [_jsx(IconPlayerPlay, { size: 13 }), "Implement Plan"] })) : (_jsxs("button", { type: "button", onClick: onSwitchToAct, className: "inline-flex h-8 shrink-0 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent", children: ["Act", _jsx(IconArrowRight, { size: 13 })] }))] }) }) }));
1177
+ }
1163
1178
  export const CHAT_STORAGE_PREFIX = "agent-chat:";
1164
1179
  /** Remove persisted chat for a given tabId (or "default"). */
1165
1180
  export function clearChatStorage(tabId) {
@@ -1860,9 +1875,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1860
1875
  ...(next.attachments && next.attachments.length > 0
1861
1876
  ? { attachments: next.attachments }
1862
1877
  : {}),
1863
- ...(next.references && next.references.length > 0
1864
- ? { runConfig: { custom: { references: next.references } } }
1865
- : {}),
1878
+ ...createUserMessageRunConfig(next.references, next.requestMode),
1866
1879
  });
1867
1880
  })();
1868
1881
  }, 100);
@@ -1898,7 +1911,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1898
1911
  setForceStopped(false);
1899
1912
  }
1900
1913
  }, [isReconnecting, forceStopped]);
1901
- const addToQueue = useCallback(async (text, images, references, attachments) => {
1914
+ const addToQueue = useCallback(async (text, images, references, attachments, requestMode) => {
1902
1915
  setShowContinue(false);
1903
1916
  setLoopLimitInfo(null);
1904
1917
  setRunErrorInfo(null);
@@ -1910,6 +1923,16 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1910
1923
  // as the user actually sends a message so it can't be re-used.
1911
1924
  clearPendingSelection();
1912
1925
  const queuedAttachments = await serializeQueuedAttachments(attachments);
1926
+ // Snapshot the exec mode at enqueue time when the caller didn't
1927
+ // pass an explicit override. Without this, a plan-mode message that
1928
+ // sits in the queue runs as 'act' if the user flips the global toggle
1929
+ // before the queue flushes — turning a read-only message into a write.
1930
+ const effectiveRequestMode = requestMode ??
1931
+ (execMode === "plan"
1932
+ ? "plan"
1933
+ : execMode === "build"
1934
+ ? "act"
1935
+ : undefined);
1913
1936
  if (isRunning) {
1914
1937
  setQueuedMessages((prev) => [
1915
1938
  ...prev,
@@ -1921,6 +1944,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1921
1944
  images,
1922
1945
  attachments: queuedAttachments,
1923
1946
  references,
1947
+ requestMode: effectiveRequestMode,
1924
1948
  },
1925
1949
  ]);
1926
1950
  }
@@ -1937,9 +1961,10 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1937
1961
  ...(queuedAttachments && queuedAttachments.length > 0
1938
1962
  ? { attachments: queuedAttachments }
1939
1963
  : {}),
1964
+ ...createUserMessageRunConfig(references, effectiveRequestMode),
1940
1965
  });
1941
1966
  }
1942
- }, [isRunning, threadRuntime]);
1967
+ }, [execMode, isRunning, threadRuntime]);
1943
1968
  // Expose imperative handle
1944
1969
  useImperativeHandle(ref, () => ({
1945
1970
  sendMessage(text) {
@@ -2068,6 +2093,19 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
2068
2093
  }
2069
2094
  return "";
2070
2095
  }, [messages]);
2096
+ const latestMessageRole = messages[messages.length - 1]?.role;
2097
+ const showPlanModeCallout = execMode === "plan" &&
2098
+ !planModeDisabled &&
2099
+ !isComposerDisabled &&
2100
+ !showRunningInUI;
2101
+ const canImplementPlan = showPlanModeCallout && latestMessageRole === "assistant";
2102
+ const handleImplementPlan = useCallback(() => {
2103
+ onExecModeChange?.("build");
2104
+ void addToQueue("Implement the plan.", undefined, undefined, undefined, "act");
2105
+ }, [addToQueue, onExecModeChange]);
2106
+ const handleSwitchToAct = useCallback(() => {
2107
+ onExecModeChange?.("build");
2108
+ }, [onExecModeChange]);
2071
2109
  const visibleLoopLimit = showContinue
2072
2110
  ? (loopLimitInfo ?? lastMessageLoopLimit ?? {})
2073
2111
  : lastMessageLoopLimit;
@@ -2142,7 +2180,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
2142
2180
  .replace(/<context>[\s\S]*?<\/context>\n?/g, "")
2143
2181
  .trim();
2144
2182
  return (_jsx("div", { className: "flex justify-end group", children: _jsxs("div", { className: "relative max-w-[85%] rounded-lg bg-accent/50 text-foreground/60 px-3 py-2 text-sm leading-relaxed whitespace-pre-wrap break-words", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-[10px] text-muted-foreground mb-1 font-medium uppercase tracking-wide", children: [_jsx(IconClock, { className: "h-3 w-3" }), "Queued"] }), displayText, msg.images && msg.images.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-1.5 mt-1.5", children: msg.images.map((img, j) => (_jsx("img", { src: img, alt: "", className: "h-12 w-12 rounded object-cover border border-border/50" }, j))) })), _jsx("button", { type: "button", onClick: () => setQueuedMessages((prev) => prev.filter((m) => m.id !== msg.id)), "aria-label": "Remove from queue", className: "absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full border border-border bg-background text-muted-foreground opacity-0 group-hover:opacity-100 focus-visible:opacity-100 hover:text-foreground hover:bg-accent shadow-sm", children: _jsx(IconX, { className: "h-3 w-3" }) })] }) }, msg.id));
2145
- })] })) }), showScrollToBottom && (_jsx("div", { className: "shrink-0 flex justify-center -mb-1", children: _jsx("button", { type: "button", onClick: scrollToBottom, className: "flex h-7 w-7 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent", "aria-label": "Scroll to bottom", children: _jsx(IconChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground" }) }) })), composerSlot, _jsx(SelectionAttachedPill, {}), _jsx("div", { className: cn("agent-composer-area shrink-0 px-3 py-2", missingApiKey && "cursor-pointer", isComposerDisabled && "opacity-70"), onClick: missingApiKey
2183
+ })] })) }), showScrollToBottom && (_jsx("div", { className: "shrink-0 flex justify-center -mb-1", children: _jsx("button", { type: "button", onClick: scrollToBottom, className: "flex h-7 w-7 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent", "aria-label": "Scroll to bottom", children: _jsx(IconChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground" }) }) })), composerSlot, showPlanModeCallout && (_jsx(PlanModeCallout, { canImplementPlan: canImplementPlan, onImplementPlan: handleImplementPlan, onSwitchToAct: handleSwitchToAct })), _jsx(SelectionAttachedPill, {}), _jsx("div", { className: cn("agent-composer-area shrink-0 px-3 py-2", missingApiKey && "cursor-pointer", isComposerDisabled && "opacity-70"), onClick: missingApiKey
2146
2184
  ? () => setMissingKeyBouncePulse((p) => p + 1)
2147
2185
  : undefined, children: _jsxs(ComposerPrimitive.Root, { className: "flex flex-col rounded-lg border border-input bg-background focus-within:ring-1 focus-within:ring-ring", children: [_jsx(ComposerAttachmentPreviewStrip, {}), _jsx(TiptapComposer, { focusRef: tiptapRef, disabled: isComposerDisabled, placeholder: missingApiKey
2148
2186
  ? "Connect an AI engine above to start chatting…"