@agent-native/core 0.12.15 → 0.12.17

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 (85) hide show
  1. package/dist/agent/production-agent.d.ts +1 -1
  2. package/dist/agent/production-agent.d.ts.map +1 -1
  3. package/dist/agent/production-agent.js +1 -1
  4. package/dist/agent/production-agent.js.map +1 -1
  5. package/dist/agent/run-manager.d.ts.map +1 -1
  6. package/dist/agent/run-manager.js +56 -42
  7. package/dist/agent/run-manager.js.map +1 -1
  8. package/dist/cli/create.js +1 -1
  9. package/dist/cli/create.js.map +1 -1
  10. package/dist/cli/index.js +13 -2
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/cli/workspace-dev.d.ts +40 -1
  13. package/dist/cli/workspace-dev.d.ts.map +1 -1
  14. package/dist/cli/workspace-dev.js +506 -363
  15. package/dist/cli/workspace-dev.js.map +1 -1
  16. package/dist/client/AgentPanel.d.ts +16 -0
  17. package/dist/client/AgentPanel.d.ts.map +1 -1
  18. package/dist/client/AgentPanel.js +30 -9
  19. package/dist/client/AgentPanel.js.map +1 -1
  20. package/dist/client/AssistantChat.d.ts +4 -0
  21. package/dist/client/AssistantChat.d.ts.map +1 -1
  22. package/dist/client/AssistantChat.js +49 -14
  23. package/dist/client/AssistantChat.js.map +1 -1
  24. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  25. package/dist/client/MultiTabAssistantChat.js +17 -3
  26. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  27. package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
  28. package/dist/client/NewWorkspaceAppFlow.js +4 -1
  29. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  30. package/dist/client/agent-chat.d.ts +1 -1
  31. package/dist/client/agent-chat.js.map +1 -1
  32. package/dist/client/components/CodeRequiredDialog.d.ts +3 -2
  33. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  34. package/dist/client/components/CodeRequiredDialog.js +4 -3
  35. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  36. package/dist/client/composer/PromptComposer.d.ts +2 -0
  37. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  38. package/dist/client/composer/PromptComposer.js +2 -2
  39. package/dist/client/composer/PromptComposer.js.map +1 -1
  40. package/dist/client/composer/TiptapComposer.d.ts +6 -1
  41. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  42. package/dist/client/composer/TiptapComposer.js +21 -12
  43. package/dist/client/composer/TiptapComposer.js.map +1 -1
  44. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  45. package/dist/client/settings/SettingsPanel.js +3 -0
  46. package/dist/client/settings/SettingsPanel.js.map +1 -1
  47. package/dist/client/sharing/ShareButton.js +6 -1
  48. package/dist/client/sharing/ShareButton.js.map +1 -1
  49. package/dist/client/sharing/ShareButton.spec.d.ts +2 -0
  50. package/dist/client/sharing/ShareButton.spec.d.ts.map +1 -0
  51. package/dist/client/sharing/ShareButton.spec.js +90 -0
  52. package/dist/client/sharing/ShareButton.spec.js.map +1 -0
  53. package/dist/client/sse-event-processor.d.ts.map +1 -1
  54. package/dist/client/sse-event-processor.js +10 -2
  55. package/dist/client/sse-event-processor.js.map +1 -1
  56. package/dist/client/use-chat-threads.d.ts.map +1 -1
  57. package/dist/client/use-chat-threads.js +19 -2
  58. package/dist/client/use-chat-threads.js.map +1 -1
  59. package/dist/client/use-send-to-agent-chat.d.ts +3 -3
  60. package/dist/client/use-send-to-agent-chat.js +3 -3
  61. package/dist/client/use-send-to-agent-chat.js.map +1 -1
  62. package/dist/deploy/workspace-deploy.js +4 -1
  63. package/dist/deploy/workspace-deploy.js.map +1 -1
  64. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  65. package/dist/server/agent-chat-plugin.js +11 -7
  66. package/dist/server/agent-chat-plugin.js.map +1 -1
  67. package/dist/templates/default/AGENTS.md +7 -1
  68. package/dist/templates/default/DEVELOPING.md +12 -0
  69. package/dist/templates/default/app/hooks/use-navigation-state.ts +81 -0
  70. package/dist/templates/default/app/root.tsx +11 -5
  71. package/dist/templates/workspace-root/AGENTS.md +3 -1
  72. package/dist/templates/workspace-root/README.md +4 -4
  73. package/dist/vite/client.d.ts.map +1 -1
  74. package/dist/vite/client.js +34 -6
  75. package/dist/vite/client.js.map +1 -1
  76. package/docs/content/multi-app-workspace.md +1 -1
  77. package/package.json +1 -1
  78. package/src/templates/default/AGENTS.md +7 -1
  79. package/src/templates/default/DEVELOPING.md +12 -0
  80. package/src/templates/default/app/hooks/use-navigation-state.ts +81 -0
  81. package/src/templates/default/app/root.tsx +11 -5
  82. package/src/templates/workspace-root/AGENTS.md +3 -1
  83. package/src/templates/workspace-root/README.md +4 -4
  84. package/dist/templates/workspace-root/netlify.toml +0 -11
  85. package/src/templates/workspace-root/netlify.toml +0 -11
@@ -40,6 +40,10 @@ export interface AssistantChatProps {
40
40
  onGenerateTitle?: (threadId: string, message: string) => void;
41
41
  /** Optional content rendered just above the composer input */
42
42
  composerSlot?: React.ReactNode;
43
+ /** Disable the composer for capability-gated surfaces while still showing history. */
44
+ composerDisabled?: boolean;
45
+ /** Placeholder to show while the composer is disabled by the host surface. */
46
+ composerDisabledPlaceholder?: string;
43
47
  /** When true, skip the restore skeleton (used for freshly created threads with no messages) */
44
48
  isNewThread?: boolean;
45
49
  /** Called when a slash command (e.g. /clear, /help) is executed */
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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"}
@@ -807,7 +807,15 @@ function AssistantMessage() {
807
807
  "");
808
808
  })(), messageSeq: thread.messages.findIndex((m) => m.id === msg.id) }) }))] }))] }));
809
809
  }
810
- // ─── Thinking Indicator ─────────────────────────────────────────────────────
810
+ function ActivitySteps({ steps }) {
811
+ if (steps.length === 0)
812
+ return null;
813
+ const visibleSteps = steps.slice(-4);
814
+ return (_jsx("div", { className: "max-w-[85%] rounded-md border border-border/60 bg-muted/30 px-2.5 py-2 text-xs text-muted-foreground", "aria-live": "polite", children: _jsx("div", { className: "space-y-1", children: visibleSteps.map((step, index) => {
815
+ const isCurrent = index === visibleSteps.length - 1;
816
+ return (_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [isCurrent ? (_jsx(IconLoader2, { className: "h-3 w-3 shrink-0 animate-spin" })) : (_jsx(IconCheck, { className: "h-3 w-3 shrink-0 text-emerald-500" })), _jsx("span", { className: "truncate", children: step.label })] }, step.id));
817
+ }) }) }));
818
+ }
811
819
  function ThinkingIndicator({ label = "Thinking" } = {}) {
812
820
  const [dots, setDots] = useState(0);
813
821
  useEffect(() => {
@@ -846,6 +854,10 @@ function BuilderConnectCta({ variant = "primary", onConnected, }) {
846
854
  // ─── Builder Setup Card ─────────────────────────────────────────────────────
847
855
  function BuilderSetupCard({ onConnected, bouncePulse, }) {
848
856
  const openSettings = useCallback(() => {
857
+ try {
858
+ window.location.hash = "llm";
859
+ }
860
+ catch { }
849
861
  window.dispatchEvent(new CustomEvent("agent-panel:open-settings"));
850
862
  }, []);
851
863
  const cardRef = useRef(null);
@@ -1064,13 +1076,14 @@ function ensureMessageMetadata(repo) {
1064
1076
  // Re-export for backwards compatibility
1065
1077
  import { extractThreadMeta } from "../agent/thread-data-builder.js";
1066
1078
  export { extractThreadMeta };
1067
- const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateText, suggestions, showHeader = true, onSwitchToCli, className, apiUrl, tabId, threadId, onMessageCountChange, onSaveThread, onGenerateTitle, composerSlot, isNewThread, onSlashCommand, execMode, onExecModeChange, selectedModel, defaultModel, selectedEngine, selectedEffort, availableModels, onModelChange, onEffortChange, onForkChat, }, ref) {
1079
+ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateText, suggestions, showHeader = true, onSwitchToCli, className, apiUrl, tabId, threadId, onMessageCountChange, onSaveThread, onGenerateTitle, composerSlot, composerDisabled = false, composerDisabledPlaceholder, isNewThread, onSlashCommand, execMode, onExecModeChange, selectedModel, defaultModel, selectedEngine, selectedEffort, availableModels, onModelChange, onEffortChange, onForkChat, }, ref) {
1068
1080
  const scrollRef = useRef(null);
1069
1081
  const thread = useThread();
1070
1082
  const threadRuntime = useThreadRuntime();
1071
1083
  const isRuntimeRunning = thread.isRunning;
1072
1084
  const messages = thread.messages;
1073
1085
  const [missingApiKey, setMissingApiKey] = useState(false);
1086
+ const isComposerDisabled = missingApiKey || composerDisabled;
1074
1087
  // Increments each time the user clicks the (disabled) composer while no LLM
1075
1088
  // is connected — `BuilderSetupCard` watches this to replay a one-shot bounce.
1076
1089
  const [missingKeyBouncePulse, setMissingKeyBouncePulse] = useState(0);
@@ -1106,6 +1119,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1106
1119
  const wasRunningRef = useRef(false);
1107
1120
  const lastBroadcastRunningRef = useRef(isRunning);
1108
1121
  const tiptapRef = useRef(null);
1122
+ const [activitySteps, setActivitySteps] = useState([]);
1109
1123
  useEffect(() => {
1110
1124
  if (lastBroadcastRunningRef.current === isRunning)
1111
1125
  return;
@@ -1623,15 +1637,32 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1623
1637
  if (tabId && detail?.tabId && detail.tabId !== tabId)
1624
1638
  return;
1625
1639
  if (typeof detail?.label === "string" && detail.label.trim()) {
1626
- setActivityLabel(detail.label.trim());
1640
+ const label = detail.label.trim();
1641
+ const tool = detail.tool?.trim() || undefined;
1642
+ setActivityLabel(label);
1643
+ setActivitySteps((prev) => {
1644
+ const last = prev[prev.length - 1];
1645
+ if (last?.label === label && last.tool === tool)
1646
+ return prev;
1647
+ return [
1648
+ ...prev,
1649
+ {
1650
+ id: `${Date.now()}-${prev.length}`,
1651
+ label,
1652
+ ...(tool ? { tool } : {}),
1653
+ },
1654
+ ].slice(-6);
1655
+ });
1627
1656
  }
1628
1657
  };
1629
1658
  window.addEventListener("agent-chat:activity", handler);
1630
1659
  return () => window.removeEventListener("agent-chat:activity", handler);
1631
1660
  }, [tabId]);
1632
1661
  useEffect(() => {
1633
- if (!showRunningInUI)
1662
+ if (!showRunningInUI) {
1634
1663
  setActivityLabel(null);
1664
+ setActivitySteps([]);
1665
+ }
1635
1666
  }, [showRunningInUI]);
1636
1667
  // Auto-dequeue: when agent finishes running, send the next queued message
1637
1668
  useEffect(() => {
@@ -1699,6 +1730,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1699
1730
  setRunErrorInfo(null);
1700
1731
  setDismissedRunErrorKey(null);
1701
1732
  setActivityLabel(null);
1733
+ setActivitySteps([]);
1702
1734
  userStoppedRunRef.current = null;
1703
1735
  // Selection context attached via Cmd+I is one-shot — clear it as soon
1704
1736
  // as the user actually sends a message so it can't be re-used.
@@ -1915,23 +1947,26 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1915
1947
  }
1916
1948
  setRunErrorInfo(null);
1917
1949
  } })), (isReconnecting || reconnectFrozen) &&
1918
- reconnectContent.length > 0 && (_jsx(ReconnectStreamMessage, { content: reconnectContent })), showRunningInUI && (_jsx(ThinkingIndicator, { label: isReconnecting
1919
- ? "Reconnecting"
1920
- : (activityLabel ?? "Thinking") })), queuedMessages.map((msg) => {
1950
+ reconnectContent.length > 0 && (_jsx(ReconnectStreamMessage, { content: reconnectContent })), showRunningInUI && (_jsxs(_Fragment, { children: [_jsx(ActivitySteps, { steps: activitySteps }), _jsx(ThinkingIndicator, { label: isReconnecting
1951
+ ? "Reconnecting"
1952
+ : (activityLabel ?? "Thinking") })] })), queuedMessages.map((msg) => {
1921
1953
  const displayText = msg.text
1922
1954
  .replace(/<context>[\s\S]*?<\/context>\n?/g, "")
1923
1955
  .trim();
1924
1956
  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));
1925
- })] })) }), 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 opacity-70"), onClick: missingApiKey
1957
+ })] })) }), 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
1926
1958
  ? () => setMissingKeyBouncePulse((p) => p + 1)
1927
1959
  : undefined, children: _jsxs(ComposerPrimitive.Root, { className: cn("flex flex-col rounded-lg border border-input bg-background focus-within:ring-1 focus-within:ring-ring", execMode === "plan" &&
1928
- "border-amber-500/50 bg-amber-500/[0.03] focus-within:ring-amber-500/30"), children: [_jsx(ComposerAttachmentPreviewStrip, {}), _jsx(TiptapComposer, { focusRef: tiptapRef, disabled: missingApiKey, placeholder: missingApiKey
1960
+ "border-amber-500/50 bg-amber-500/[0.03] focus-within:ring-amber-500/30"), children: [_jsx(ComposerAttachmentPreviewStrip, {}), _jsx(TiptapComposer, { focusRef: tiptapRef, disabled: isComposerDisabled, placeholder: missingApiKey
1929
1961
  ? "Connect an AI engine above to start chatting…"
1930
- : isRunning
1931
- ? queuedMessages.length > 0
1932
- ? `${queuedMessages.length} queued type another...`
1933
- : "Queue a message..."
1934
- : undefined, onSubmit: isRunning
1962
+ : composerDisabled
1963
+ ? (composerDisabledPlaceholder ??
1964
+ "Open Desktop to use this chat.")
1965
+ : isRunning
1966
+ ? queuedMessages.length > 0
1967
+ ? `${queuedMessages.length} queued — type another...`
1968
+ : "Queue a message..."
1969
+ : undefined, onSubmit: isRunning
1935
1970
  ? (text, references) => addToQueue(text, undefined, references.length > 0 ? references : undefined)
1936
1971
  : undefined, onSlashCommand: onSlashCommand, execMode: execMode, onExecModeChange: onExecModeChange, selectedModel: selectedModel ?? defaultModel, selectedEffort: selectedEffort, availableModels: availableModels, onModelChange: onModelChange, onEffortChange: onEffortChange, draftScope: threadId || tabId, interceptBuildRequestsForBuilder: true, extraActionButton: showRunningInUI ? (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => {
1937
1972
  // Nuclear stop: flip forceStopped so isRunning is false