@tutti-os/agent-gui 0.0.117 → 0.0.118

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.
package/README.md CHANGED
@@ -227,6 +227,11 @@ use `renderAgentsEmpty` for a host-specific loaded-empty state. Use
227
227
  `renderAgentReadinessState` for host-specific availability presentation, and
228
228
  handle install/login/refresh requests through `onAgentAvailabilityAction`.
229
229
 
230
+ Hosts that launch handoffs across session-runtime boundaries may also pass
231
+ `handoffAgentDirectory`. Its ready entries populate only the active-conversation
232
+ Handoff menu; the conversation rail, session queries, and empty composer remain
233
+ owned by `agentDirectory`. When omitted, Handoff uses `agentDirectory`.
234
+
230
235
  The old public `providerTargets`, `providerRailMode`, provider-target renderers,
231
236
  and `defaultProviderTargetId` contract is intentionally unsupported. Workbench
232
237
  state hydration performs a one-time read of legacy `providerTargetId` into
@@ -1006,6 +1006,9 @@ interface AgentGUINodeHostCapabilities {
1006
1006
  accountMenuState?: AgentGUIAccountMenuState | null;
1007
1007
  agentTargets?: readonly AgentGUIAgentTarget[];
1008
1008
  agentTargetsLoading?: boolean;
1009
+ /** Launch-only targets for active-conversation handoff. */
1010
+ handoffAgentTargets?: readonly AgentGUIAgentTarget[];
1011
+ handoffAgentTargetsLoading?: boolean;
1009
1012
  providerRailAllPresentation?: AgentGUIProviderRailAllPresentation | null;
1010
1013
  providerRailMode?: AgentGUIProviderRailMode;
1011
1014
  comingSoonProviders?: readonly AgentGUIProvider[];
@@ -1053,10 +1056,15 @@ interface AgentGUINodeProps {
1053
1056
  renderSlots: AgentGUINodeRenderSlots;
1054
1057
  }
1055
1058
 
1056
- type AgentGUIPublicHostCapabilities = Omit<AgentGUINodeProps["hostCapabilities"], "agentTargets" | "agentTargetsLoading" | "providerRailAllPresentation" | "providerRailMode" | "disabledHomeSuggestions">;
1059
+ type AgentGUIPublicHostCapabilities = Omit<AgentGUINodeProps["hostCapabilities"], "agentTargets" | "agentTargetsLoading" | "handoffAgentTargets" | "handoffAgentTargetsLoading" | "providerRailAllPresentation" | "providerRailMode" | "disabledHomeSuggestions">;
1057
1060
  type AgentGUIPublicRenderSlots = Omit<AgentGUINodeProps["renderSlots"], "providerRailEmpty">;
1058
1061
  interface AgentGUIProps extends Omit<AgentGUINodeProps, "hostCapabilities" | "renderSlots"> {
1059
1062
  agentDirectory: AgentGUIAgentDirectorySnapshot;
1063
+ /**
1064
+ * Host-owned launch catalog for conversation handoff. When omitted, handoff
1065
+ * uses `agentDirectory`, preserving the single-runtime host contract.
1066
+ */
1067
+ handoffAgentDirectory?: AgentGUIAgentDirectorySnapshot;
1060
1068
  allAgentsPresentation?: AgentGUIAllAgentsPresentation | null;
1061
1069
  renderAgentsEmpty?: AgentGUIAgentsEmptyRenderer;
1062
1070
  agentActivityRuntime: AgentActivityRuntime;
@@ -1,6 +1,6 @@
1
1
  import 'react';
2
2
  import '@tutti-os/ui-i18n-runtime';
3
- export { n as AgentGUI, w as AgentGUIProps } from './AgentGUI-Be6O5di1.js';
3
+ export { n as AgentGUI, w as AgentGUIProps } from './AgentGUI-B_K2lEDE.js';
4
4
  import './agentGuiNodeTypes-C_H3DbXt.js';
5
5
  export { l as AgentGUIHomeSuggestionId } from './types-COIp0SYP.js';
6
6
  import './runtime-BBNdWgDU.js';
package/dist/agent-gui.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  AgentGUI
3
- } from "./chunk-7Y3OBABX.js";
3
+ } from "./chunk-AD7EVK67.js";
4
4
  import "./chunk-A4WCTHWS.js";
5
5
  import "./chunk-NNIXG27Q.js";
6
6
  import "./chunk-TUWQV2MC.js";
@@ -11859,7 +11859,9 @@ function useAgentGUIProviderCatalogSelection(input) {
11859
11859
  providerRailMode,
11860
11860
  providerReadinessGates,
11861
11861
  agentTargets,
11862
- agentTargetsLoading
11862
+ agentTargetsLoading,
11863
+ handoffAgentTargets,
11864
+ handoffAgentTargetsLoading
11863
11865
  } = input;
11864
11866
  const normalizedComingSoonProviders = useMemo15(
11865
11867
  () => comingSoonProviders && comingSoonProviders.length > 0 ? [...comingSoonProviders] : emptyComingSoonProviders,
@@ -11895,11 +11897,23 @@ function useAgentGUIProviderCatalogSelection(input) {
11895
11897
  agentTargetsLoading
11896
11898
  ]);
11897
11899
  const shouldUseStaticProviderTargets = !isExactProviderRailMode && !agentTargetsLoading && (agentTargets === void 0 || normalizedExplicitProviderTargets.length === 0);
11898
- const handoffAgentTargets = useMemo15(
11899
- () => agentTargetsLoading ? [] : normalizedExplicitProviderTargets.filter(
11900
+ const normalizedHandoffAgentTargets = useMemo15(
11901
+ () => handoffAgentTargets === void 0 ? normalizedExplicitProviderTargets : normalizeAgentGUIAgentTargets(handoffAgentTargets, {
11902
+ includeDisabledPlaceholders: false,
11903
+ useStaticCatalog: false
11904
+ }),
11905
+ [handoffAgentTargets, normalizedExplicitProviderTargets]
11906
+ );
11907
+ const enabledHandoffAgentTargets = useMemo15(
11908
+ () => (handoffAgentTargets === void 0 ? agentTargetsLoading : handoffAgentTargetsLoading) ? [] : normalizedHandoffAgentTargets.filter(
11900
11909
  (target) => target.disabled !== true
11901
11910
  ),
11902
- [normalizedExplicitProviderTargets, agentTargetsLoading]
11911
+ [
11912
+ agentTargetsLoading,
11913
+ handoffAgentTargets,
11914
+ handoffAgentTargetsLoading,
11915
+ normalizedHandoffAgentTargets
11916
+ ]
11903
11917
  );
11904
11918
  const selectedAgentTarget = useMemo15(
11905
11919
  () => resolveAgentGUIAgentTarget({
@@ -11981,7 +11995,7 @@ function useAgentGUIProviderCatalogSelection(input) {
11981
11995
  return {
11982
11996
  effectiveSelectedProviderTarget,
11983
11997
  firstReadyHomeComposerProviderTarget,
11984
- handoffAgentTargets,
11998
+ handoffAgentTargets: enabledHandoffAgentTargets,
11985
11999
  homeComposerTargetOverride,
11986
12000
  homeComposerTargetOverrideIsExplicit,
11987
12001
  normalizedComingSoonProviders,
@@ -12643,6 +12657,8 @@ function useAgentGUINodeController({
12643
12657
  data,
12644
12658
  agentTargets,
12645
12659
  agentTargetsLoading = false,
12660
+ handoffAgentTargets,
12661
+ handoffAgentTargetsLoading = false,
12646
12662
  providerRailMode = "catalog",
12647
12663
  comingSoonProviders,
12648
12664
  providerReadinessGates = null,
@@ -12675,7 +12691,9 @@ function useAgentGUINodeController({
12675
12691
  providerRailMode,
12676
12692
  providerReadinessGates,
12677
12693
  agentTargets,
12678
- agentTargetsLoading
12694
+ agentTargetsLoading,
12695
+ handoffAgentTargets,
12696
+ handoffAgentTargetsLoading
12679
12697
  });
12680
12698
  const {
12681
12699
  effectiveSelectedProviderTarget,
@@ -35397,7 +35415,7 @@ function areAgentGUINodePropsEqual(previous, next) {
35397
35415
  const pc = previous.hostCapabilities, nc = next.hostCapabilities;
35398
35416
  const pa = previous.hostActions, na = next.hostActions;
35399
35417
  const ps = previous.renderSlots, ns = next.renderSlots;
35400
- return pi.nodeId === ni.nodeId && pi.workspaceId === ni.workspaceId && pi.currentUserId === ni.currentUserId && pi.title === ni.title && pw.path === nw.path && pw.fileReferenceAdapter === nw.fileReferenceAdapter && pw.onRequestGitBranches === nw.onRequestGitBranches && pw.selectProjectDirectory === nw.selectProjectDirectory && pw.resolveDroppedFileReferences === nw.resolveDroppedFileReferences && pw.referenceSourceAggregator === nw.referenceSourceAggregator && pw.resolveReferenceEntryIconUrl === nw.resolveReferenceEntryIconUrl && pw.resolveMentionReferenceTarget === nw.resolveMentionReferenceTarget && pw.resolveReferenceInitialTarget === nw.resolveReferenceInitialTarget && pw.onFileReferencesAdded === nw.onFileReferencesAdded && pw.agentSettings.avoidGroupingEdits === nw.agentSettings.avoidGroupingEdits && pc.referenceProvenanceFilterCatalog === nc.referenceProvenanceFilterCatalog && pc.referenceProvenanceFilterEnabled === nc.referenceProvenanceFilterEnabled && agentGuiStateEquals(previous.state, next.state) && pf.position.x === nf.position.x && pf.position.y === nf.position.y && pf.width === nf.width && pf.height === nf.height && pf.desktopSize.width === nf.desktopSize.width && pf.desktopSize.height === nf.desktopSize.height && pf.isMaximized === nf.isMaximized && pf.isActive === nf.isActive && pf.isVisible === nf.isVisible && pf.embedded === nf.embedded && pf.previewMode === nf.previewMode && pf.conversationRailAutoCollapseWidthPx === nf.conversationRailAutoCollapseWidthPx && pr.composerFocusSequence === nr.composerFocusSequence && pr.composerAppend === nr.composerAppend && pr.newConversationSequence === nr.newConversationSequence && pr.openSession === nr.openSession && pr.prefillPrompt === nr.prefillPrompt && pr.agentProbes === nr.agentProbes && pr.onProbeDemandChange === nr.onProbeDemandChange && pr.onProbeRefreshRequest === nr.onProbeRefreshRequest && pc.capabilityMenuState === nc.capabilityMenuState && pc.accountMenuState === nc.accountMenuState && pc.agentTargets === nc.agentTargets && pc.agentTargetsLoading === nc.agentTargetsLoading && pc.providerRailAllPresentation?.iconUrl === nc.providerRailAllPresentation?.iconUrl && pc.providerRailMode === nc.providerRailMode && pc.comingSoonProviders === nc.comingSoonProviders && pc.providerReadinessGates === nc.providerReadinessGates && pc.defaultAgentTargetId === nc.defaultAgentTargetId && pc.providerAuthAccountLabels === nc.providerAuthAccountLabels && pc.contextMentionProviders === nc.contextMentionProviders && pc.workspaceAppIcons === nc.workspaceAppIcons && pc.disabledHomeSuggestions === nc.disabledHomeSuggestions && pa.onLinkAction === na.onLinkAction && pa.onHandoffConversation === na.onHandoffConversation && pa.onCapabilitySettingsRequest === na.onCapabilitySettingsRequest && pa.onAgentProviderLogin === na.onAgentProviderLogin && pa.onOpenConversationWindow === na.onOpenConversationWindow && pa.onClose === na.onClose && pa.onResize === na.onResize && pa.onUpdateNode === na.onUpdateNode && pa.onRememberComposerDefaults === na.onRememberComposerDefaults && pa.isMuted === na.isMuted && pa.onMinimize === na.onMinimize && pa.onToggleMaximize === na.onToggleMaximize && pa.onShowMessage === na.onShowMessage && pa.onEngagementEvent === na.onEngagementEvent && ps.providerRailEmpty === ns.providerRailEmpty && ps.providerUnavailableState === ns.providerUnavailableState && ps.sidebarFooter === ns.sidebarFooter;
35418
+ return pi.nodeId === ni.nodeId && pi.workspaceId === ni.workspaceId && pi.currentUserId === ni.currentUserId && pi.title === ni.title && pw.path === nw.path && pw.fileReferenceAdapter === nw.fileReferenceAdapter && pw.onRequestGitBranches === nw.onRequestGitBranches && pw.selectProjectDirectory === nw.selectProjectDirectory && pw.resolveDroppedFileReferences === nw.resolveDroppedFileReferences && pw.referenceSourceAggregator === nw.referenceSourceAggregator && pw.resolveReferenceEntryIconUrl === nw.resolveReferenceEntryIconUrl && pw.resolveMentionReferenceTarget === nw.resolveMentionReferenceTarget && pw.resolveReferenceInitialTarget === nw.resolveReferenceInitialTarget && pw.onFileReferencesAdded === nw.onFileReferencesAdded && pw.agentSettings.avoidGroupingEdits === nw.agentSettings.avoidGroupingEdits && pc.referenceProvenanceFilterCatalog === nc.referenceProvenanceFilterCatalog && pc.referenceProvenanceFilterEnabled === nc.referenceProvenanceFilterEnabled && agentGuiStateEquals(previous.state, next.state) && pf.position.x === nf.position.x && pf.position.y === nf.position.y && pf.width === nf.width && pf.height === nf.height && pf.desktopSize.width === nf.desktopSize.width && pf.desktopSize.height === nf.desktopSize.height && pf.isMaximized === nf.isMaximized && pf.isActive === nf.isActive && pf.isVisible === nf.isVisible && pf.embedded === nf.embedded && pf.previewMode === nf.previewMode && pf.conversationRailAutoCollapseWidthPx === nf.conversationRailAutoCollapseWidthPx && pr.composerFocusSequence === nr.composerFocusSequence && pr.composerAppend === nr.composerAppend && pr.newConversationSequence === nr.newConversationSequence && pr.openSession === nr.openSession && pr.prefillPrompt === nr.prefillPrompt && pr.agentProbes === nr.agentProbes && pr.onProbeDemandChange === nr.onProbeDemandChange && pr.onProbeRefreshRequest === nr.onProbeRefreshRequest && pc.capabilityMenuState === nc.capabilityMenuState && pc.accountMenuState === nc.accountMenuState && pc.agentTargets === nc.agentTargets && pc.agentTargetsLoading === nc.agentTargetsLoading && pc.handoffAgentTargets === nc.handoffAgentTargets && pc.handoffAgentTargetsLoading === nc.handoffAgentTargetsLoading && pc.providerRailAllPresentation?.iconUrl === nc.providerRailAllPresentation?.iconUrl && pc.providerRailMode === nc.providerRailMode && pc.comingSoonProviders === nc.comingSoonProviders && pc.providerReadinessGates === nc.providerReadinessGates && pc.defaultAgentTargetId === nc.defaultAgentTargetId && pc.providerAuthAccountLabels === nc.providerAuthAccountLabels && pc.contextMentionProviders === nc.contextMentionProviders && pc.workspaceAppIcons === nc.workspaceAppIcons && pc.disabledHomeSuggestions === nc.disabledHomeSuggestions && pa.onLinkAction === na.onLinkAction && pa.onHandoffConversation === na.onHandoffConversation && pa.onCapabilitySettingsRequest === na.onCapabilitySettingsRequest && pa.onAgentProviderLogin === na.onAgentProviderLogin && pa.onOpenConversationWindow === na.onOpenConversationWindow && pa.onClose === na.onClose && pa.onResize === na.onResize && pa.onUpdateNode === na.onUpdateNode && pa.onRememberComposerDefaults === na.onRememberComposerDefaults && pa.isMuted === na.isMuted && pa.onMinimize === na.onMinimize && pa.onToggleMaximize === na.onToggleMaximize && pa.onShowMessage === na.onShowMessage && pa.onEngagementEvent === na.onEngagementEvent && ps.providerRailEmpty === ns.providerRailEmpty && ps.providerUnavailableState === ns.providerUnavailableState && ps.sidebarFooter === ns.sidebarFooter;
35401
35419
  }
35402
35420
 
35403
35421
  // agent-gui/agentGuiNode/AgentGUINode.labels.ts
@@ -36304,6 +36322,8 @@ var AgentGUINode = memo14(function AgentGUINode2({
36304
36322
  accountMenuState = null,
36305
36323
  agentTargets,
36306
36324
  agentTargetsLoading = false,
36325
+ handoffAgentTargets,
36326
+ handoffAgentTargetsLoading = false,
36307
36327
  providerRailAllPresentation = null,
36308
36328
  providerRailMode = "catalog",
36309
36329
  comingSoonProviders,
@@ -36479,6 +36499,8 @@ var AgentGUINode = memo14(function AgentGUINode2({
36479
36499
  prefillPromptRequest,
36480
36500
  agentTargets,
36481
36501
  agentTargetsLoading,
36502
+ handoffAgentTargets,
36503
+ handoffAgentTargetsLoading,
36482
36504
  providerRailMode,
36483
36505
  comingSoonProviders,
36484
36506
  providerReadinessGates,
@@ -36785,6 +36807,7 @@ var AgentGUI = memo15(function AgentGUI2({
36785
36807
  agentActivityRuntime,
36786
36808
  agentHostApi,
36787
36809
  agentDirectory,
36810
+ handoffAgentDirectory,
36788
36811
  allAgentsPresentation = null,
36789
36812
  renderAgentsEmpty,
36790
36813
  disabled,
@@ -36793,6 +36816,10 @@ var AgentGUI = memo15(function AgentGUI2({
36793
36816
  ...props
36794
36817
  }) {
36795
36818
  const normalizedAgents = normalizeAgentGUIAgents(agentDirectory.agents);
36819
+ const effectiveHandoffAgentDirectory = handoffAgentDirectory ?? agentDirectory;
36820
+ const normalizedHandoffAgents = normalizeAgentGUIAgents(
36821
+ effectiveHandoffAgentDirectory.agents
36822
+ );
36796
36823
  const hostCapabilities = props.hostCapabilities;
36797
36824
  const renderSlots = props.renderSlots;
36798
36825
  const nodeProps = {
@@ -36801,6 +36828,10 @@ var AgentGUI = memo15(function AgentGUI2({
36801
36828
  ...hostCapabilities,
36802
36829
  agentTargets: projectAgentGUIAgentsToInternalTargets(normalizedAgents),
36803
36830
  agentTargetsLoading: agentDirectory.agents.length === 0 && (agentDirectory.status === "idle" || agentDirectory.status === "loading"),
36831
+ handoffAgentTargets: projectAgentGUIAgentsToInternalTargets(
36832
+ normalizedHandoffAgents
36833
+ ),
36834
+ handoffAgentTargetsLoading: effectiveHandoffAgentDirectory.agents.length === 0 && (effectiveHandoffAgentDirectory.status === "idle" || effectiveHandoffAgentDirectory.status === "loading"),
36804
36835
  disabledHomeSuggestions: disabled,
36805
36836
  providerRailAllPresentation: allAgentsPresentation ?? null,
36806
36837
  providerRailMode: "exact"
@@ -36831,4 +36862,4 @@ export {
36831
36862
  resolveAgentGUIAgentTarget,
36832
36863
  AgentGUI
36833
36864
  };
36834
- //# sourceMappingURL=chunk-7Y3OBABX.js.map
36865
+ //# sourceMappingURL=chunk-AD7EVK67.js.map