@agent-native/core 0.146.7 → 0.147.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.
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/analytics/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/analytics/DEVELOPING.md +59 -0
- package/corpus/templates/analytics/app/routes/status.$slug.tsx +4 -2
- package/corpus/templates/analytics/package.json +1 -0
- package/corpus/templates/analytics/scripts/first-party-analytics-bigquery-backfill.ts +889 -0
- package/corpus/templates/analytics/server/jobs/analytics-bigquery-backfill.ts +70 -0
- package/corpus/templates/analytics/server/lib/first-party-analytics-backend.ts +117 -12
- package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/assets/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +9 -0
- package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/brain/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/calendar/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +9 -0
- package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/clips/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +16 -4
- package/corpus/templates/clips/app/routes/share.meeting.$meetingId.tsx +14 -5
- package/corpus/templates/clips/package.json +1 -0
- package/corpus/templates/clips/react-router.config.ts +7 -0
- package/corpus/templates/clips/server/plugins/auth.ts +6 -1
- package/corpus/templates/clips/shared/prerendered-public-paths.ts +21 -0
- package/corpus/templates/clips/shared/share-meta.ts +8 -3
- package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/content/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/crm/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/design/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/dispatch/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/dispatch/app/chat-first-pages.ts +747 -0
- package/corpus/templates/dispatch/app/i18n-data.ts +181 -0
- package/corpus/templates/dispatch/app/routes/settings.tsx +62 -1
- package/corpus/templates/dispatch/changelog/2026-08-08-chat-first-navigation-keeps-conversations-central-while-open.md +6 -0
- package/corpus/templates/factory/.agents/skills/adding-a-feature/SKILL.md +9 -0
- package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/factory/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/factory/actions/run-factory-automation.ts +1 -0
- package/corpus/templates/factory/app/routes/factory.tsx +108 -76
- package/corpus/templates/factory/changelog/2026-08-08-scheduler-health-moves-to-settings.md +6 -0
- package/corpus/templates/factory/netlify.toml +1 -1
- package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/forms/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/macros/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/mail/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +9 -0
- package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/plan/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/plan/app/lib/plan-document-title.ts +3 -1
- package/corpus/templates/plan/app/root.tsx +1 -0
- package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/slides/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/corpus/templates/tasks/.agents/skills/adding-a-feature/SKILL.md +9 -0
- package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/corpus/templates/tasks/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/dist/agent/engine/builder-engine.d.ts +11 -1
- package/dist/agent/engine/builder-engine.js +11 -4
- package/dist/chat-threads/store.d.ts +2 -0
- package/dist/chat-threads/store.js +1 -1
- package/dist/cli/agent-plugin.d.ts +5 -2
- package/dist/cli/agent-plugin.js +17 -9
- package/dist/cli/code-agent-executor.js +25 -5
- package/dist/cli/code-agent-mcp-config.d.ts +21 -0
- package/dist/cli/code-agent-mcp-config.js +103 -0
- package/dist/client/NewWorkspaceAppFlow.js +4 -1
- package/dist/client/agent-chat/index.d.ts +4 -1
- package/dist/client/agent-chat/index.js +4 -1
- package/dist/client/agent-page/AgentTabsPage.d.ts +1 -0
- package/dist/client/agent-page/AgentTabsPage.js +4 -3
- package/dist/client/app-providers.d.ts +3 -1
- package/dist/client/app-providers.js +50 -5
- package/dist/client/chat/runtime.js +63 -0
- package/dist/client/chat-first/agents-pane.d.ts +2 -0
- package/dist/client/chat-first/agents-pane.js +6 -0
- package/dist/client/chat-first/app-pane.d.ts +2 -0
- package/dist/client/chat-first/app-pane.js +6 -0
- package/dist/client/chat-first/apps-rail.d.ts +2 -0
- package/dist/client/chat-first/apps-rail.js +103 -0
- package/dist/client/chat-first/browser-pane.d.ts +2 -0
- package/dist/client/chat-first/browser-pane.js +64 -0
- package/dist/client/chat-first/chat-history.d.ts +12 -0
- package/dist/client/chat-first/chat-history.js +10 -0
- package/dist/client/chat-first/copy.d.ts +2 -0
- package/dist/client/chat-first/copy.js +117 -0
- package/dist/client/chat-first/index.d.ts +13 -0
- package/dist/client/chat-first/index.js +12 -0
- package/dist/client/chat-first/primary-nav.d.ts +8 -0
- package/dist/client/chat-first/primary-nav.js +6 -0
- package/dist/client/chat-first/session-watch-pane.d.ts +2 -0
- package/dist/client/chat-first/session-watch-pane.js +9 -0
- package/dist/client/chat-first/surface-panel.d.ts +9 -0
- package/dist/client/chat-first/surface-panel.js +9 -0
- package/dist/client/chat-first/surface-tabs.d.ts +9 -0
- package/dist/client/chat-first/surface-tabs.js +74 -0
- package/dist/client/chat-first/types.d.ts +74 -0
- package/dist/client/chat-first/types.js +1 -0
- package/dist/client/chat-first-agent-activity.d.ts +11 -0
- package/dist/client/chat-first-agent-activity.js +51 -0
- package/dist/client/chat-first-surface-panel-toggle.d.ts +5 -0
- package/dist/client/chat-first-surface-panel-toggle.js +6 -0
- package/dist/client/chat-first.d.ts +208 -0
- package/dist/client/chat-first.js +816 -0
- package/dist/client/extensions/ExtensionViewer.js +8 -1
- package/dist/client/resources/McpIntegrationDialog.js +3 -2
- package/dist/client/resources/McpServerDetail.js +6 -11
- package/dist/client/resources/index.d.ts +1 -0
- package/dist/client/resources/index.js +1 -0
- package/dist/client/resources/use-mcp-servers.d.ts +20 -0
- package/dist/client/resources/use-mcp-servers.js +82 -46
- package/dist/client/settings/index.d.ts +1 -0
- package/dist/client/settings/index.js +1 -0
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/routes.d.ts +1 -1
- package/dist/jobs/background-automation-runner.js +19 -2
- package/dist/jobs/scheduler-health.d.ts +20 -0
- package/dist/jobs/scheduler-health.js +86 -1
- package/dist/jobs/scheduler.js +38 -1
- package/dist/mcp-client/routes.d.ts +3 -0
- package/dist/mcp-client/routes.js +14 -0
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/provider-api/actions/provider-api.d.ts +2 -2
- package/dist/server/agents-bundle.d.ts +2 -0
- package/dist/server/agents-bundle.js +31 -2
- package/dist/server/credential-provider.d.ts +8 -2
- package/dist/server/credential-provider.js +13 -9
- package/dist/shared/chat-first-app-creation.d.ts +19 -0
- package/dist/shared/chat-first-app-creation.js +75 -0
- package/dist/shared/document-title.d.ts +7 -0
- package/dist/shared/document-title.js +29 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.js +2 -0
- package/dist/styles/chat-history-list.css +16 -0
- package/dist/templates/chat/.agents/skills/adding-a-feature/SKILL.md +9 -0
- package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/dist/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +9 -0
- package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/dist/templates/default/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/dist/templates/default/react-router.config.ts +18 -0
- package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/dist/templates/headless/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +9 -0
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/dist/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +7 -0
- package/package.json +4 -3
- package/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +9 -0
- package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/src/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +9 -0
- package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/src/templates/default/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/src/templates/default/react-router.config.ts +18 -0
- package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/src/templates/headless/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +9 -0
- package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +18 -6
- package/src/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +8 -1
- package/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +7 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuSeparator, ContextMenuTrigger, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@agent-native/toolkit/ui";
|
|
3
|
+
import { IconFiles, IconGitCompare, IconMessageCircle, IconTerminal2, IconUsersGroup, IconWorld, IconX, } from "@tabler/icons-react";
|
|
4
|
+
import { CHAT_FIRST_SURFACE_CATALOG, } from "../chat-first.js";
|
|
5
|
+
import { cn } from "../utils.js";
|
|
6
|
+
import { defaultChatFirstCopy } from "./copy.js";
|
|
7
|
+
const ICONS = {
|
|
8
|
+
app: IconFiles,
|
|
9
|
+
browser: IconWorld,
|
|
10
|
+
terminal: IconTerminal2,
|
|
11
|
+
diff: IconGitCompare,
|
|
12
|
+
files: IconFiles,
|
|
13
|
+
"side-chat": IconMessageCircle,
|
|
14
|
+
agents: IconUsersGroup,
|
|
15
|
+
};
|
|
16
|
+
function SurfaceIcon({ kind }) {
|
|
17
|
+
const Icon = ICONS[kind];
|
|
18
|
+
return _jsx(Icon, { size: 14, "aria-hidden": "true" });
|
|
19
|
+
}
|
|
20
|
+
export function ChatFirstSurfaceTabs({ tabs, activeTabId, onActivate, onClose, onCloseOthers, onCloseToRight, onCloseAll, onOpenSurface, copy = defaultChatFirstCopy, }) {
|
|
21
|
+
return (_jsx(TooltipProvider, { delayDuration: 400, children: _jsx("div", { "data-chat-first-surface-tabs": true, className: "shrink-0 border-b border-border bg-card", children: tabs.length > 0 ? (_jsx("div", { className: "flex min-w-0 items-center gap-1 overflow-x-auto px-2 py-1.5", role: "tablist", "aria-label": copy("openSideSurfaces"), children: tabs.map((tab, index) => (_jsxs(ContextMenu, { children: [_jsx(ContextMenuTrigger, { asChild: true, children: _jsxs("div", { role: "tab", tabIndex: activeTabId === tab.id ? 0 : -1, "aria-selected": activeTabId === tab.id, "data-surface-tab-id": tab.id, "data-active": activeTabId === tab.id ? "true" : "false", className: cn("group flex h-8 min-w-0 max-w-48 shrink-0 items-center rounded-md text-xs transition-colors", activeTabId === tab.id
|
|
22
|
+
? "bg-accent text-foreground"
|
|
23
|
+
: "text-muted-foreground hover:bg-accent hover:text-foreground"), onKeyDown: (event) => {
|
|
24
|
+
const nextIndex = event.key === "ArrowRight"
|
|
25
|
+
? (index + 1) % tabs.length
|
|
26
|
+
: event.key === "ArrowLeft"
|
|
27
|
+
? (index - 1 + tabs.length) % tabs.length
|
|
28
|
+
: event.key === "Home"
|
|
29
|
+
? 0
|
|
30
|
+
: event.key === "End"
|
|
31
|
+
? tabs.length - 1
|
|
32
|
+
: -1;
|
|
33
|
+
if (nextIndex < 0)
|
|
34
|
+
return;
|
|
35
|
+
event.preventDefault();
|
|
36
|
+
onActivate(tabs[nextIndex]);
|
|
37
|
+
requestAnimationFrame(() => {
|
|
38
|
+
document
|
|
39
|
+
.querySelector(`[data-chat-first-surface-tab-id="${CSS.escape(tabs[nextIndex].id)}"]`)
|
|
40
|
+
?.focus();
|
|
41
|
+
});
|
|
42
|
+
}, "data-chat-first-surface-tab-id": tab.id, onMouseDown: (event) => {
|
|
43
|
+
if (event.button === 1) {
|
|
44
|
+
event.preventDefault();
|
|
45
|
+
onClose(tab);
|
|
46
|
+
}
|
|
47
|
+
}, title: tab.title, children: [_jsxs("button", { type: "button", className: "flex min-w-0 flex-1 items-center gap-1.5 truncate px-2 text-start", onClick: () => onActivate(tab), tabIndex: -1, children: [_jsx(SurfaceIcon, { kind: tab.kind }), _jsx("span", { className: "truncate", children: tab.title })] }), _jsx("button", { type: "button", className: "mr-1 flex size-5 shrink-0 items-center justify-center rounded text-muted-foreground/65 opacity-0 transition-opacity hover:bg-background/70 hover:text-foreground group-hover:opacity-100 focus-visible:opacity-100", "aria-label": copy("closeTab", { name: tab.title }), title: copy("closeTab", { name: tab.title }), onClick: (event) => {
|
|
48
|
+
event.stopPropagation();
|
|
49
|
+
onClose(tab);
|
|
50
|
+
}, children: _jsx(IconX, { size: 12, "aria-hidden": "true" }) })] }) }), _jsxs(ContextMenuContent, { children: [_jsx(ContextMenuItem, { onSelect: () => onClose(tab), children: copy("close") }), _jsx(ContextMenuItem, { disabled: tabs.length < 2, onSelect: () => onCloseOthers(tab), children: copy("closeOthers") }), _jsx(ContextMenuItem, { disabled: tabs[tabs.length - 1]?.id === tab.id, onSelect: () => onCloseToRight(tab), children: copy("closeToRight") }), _jsx(ContextMenuSeparator, {}), _jsx(ContextMenuItem, { onSelect: onCloseAll, children: copy("closeAll") })] })] }, tab.id))) })) : (_jsx("div", { className: "flex flex-col px-2 py-1", "data-surface-empty-state": true, "aria-label": copy("openSideSurfaces"), children: CHAT_FIRST_SURFACE_CATALOG.map((surface) => {
|
|
51
|
+
const label = copy(`surface.${surface.kind}.label`);
|
|
52
|
+
const reason = surface.availability === "deferred"
|
|
53
|
+
? copy(`surface.${surface.kind}.reason`)
|
|
54
|
+
: copy(`surface.${surface.kind}.reason`);
|
|
55
|
+
const isDeferred = surface.availability === "deferred";
|
|
56
|
+
const row = (_jsxs("div", { className: cn("flex h-7 min-w-0 items-center gap-2 rounded px-2 text-xs transition-colors", surface.kind === "agents" && onOpenSurface
|
|
57
|
+
? "text-foreground hover:bg-accent"
|
|
58
|
+
: isDeferred
|
|
59
|
+
? "text-muted-foreground/60"
|
|
60
|
+
: "text-muted-foreground hover:bg-accent hover:text-foreground"), title: !isDeferred ? reason : undefined, "aria-label": `${label}: ${reason}`, children: [_jsx(SurfaceIcon, { kind: surface.kind }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: label }), isDeferred ? (_jsx("span", { "data-surface-availability": "deferred", className: "size-1.5 shrink-0 rounded-full bg-muted-foreground/45", "aria-label": copy("deferred") })) : null] }));
|
|
61
|
+
if (surface.kind === "agents" && onOpenSurface) {
|
|
62
|
+
return (_jsx("button", { type: "button", className: "text-start", title: copy("openActivity"), "aria-label": copy("openActivity"), onClick: () => onOpenSurface(surface.kind), children: row }, surface.kind));
|
|
63
|
+
}
|
|
64
|
+
if (!isDeferred)
|
|
65
|
+
return _jsx("div", { children: row }, surface.kind);
|
|
66
|
+
return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("div", { className: "text-start", children: row }) }), _jsx(TooltipContent, { side: "left", className: "max-w-72", children: reason })] }, surface.kind));
|
|
67
|
+
}) })) }) }));
|
|
68
|
+
}
|
|
69
|
+
export function ChatFirstSurfaceContent({ tabs, activeTabId, renderTab, }) {
|
|
70
|
+
return (_jsx("div", { className: "min-h-0 flex-1 overflow-hidden", children: tabs.map((tab) => {
|
|
71
|
+
const active = tab.id === activeTabId;
|
|
72
|
+
return (_jsx("div", { "data-chat-first-surface-content": tab.id, "aria-hidden": !active, className: cn("h-full min-h-0", !active && "hidden"), children: renderTab(tab) }, tab.id));
|
|
73
|
+
}) }));
|
|
74
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { ChatFirstAgentActivity, ChatFirstAppLayoutPreference, ChatFirstSessionReference, ChatFirstSurfaceKind, ChatFirstSurfaceTab } from "../chat-first.js";
|
|
3
|
+
export type { ChatFirstAgentActivity, ChatFirstSurfaceTab };
|
|
4
|
+
export interface ChatFirstAppItem {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
icon?: string;
|
|
8
|
+
color?: string;
|
|
9
|
+
}
|
|
10
|
+
export type ChatFirstCopy = (key: string, values?: Record<string, string>) => string;
|
|
11
|
+
export interface ChatFirstEmbedTarget {
|
|
12
|
+
url: string;
|
|
13
|
+
title?: string;
|
|
14
|
+
key?: string | number;
|
|
15
|
+
}
|
|
16
|
+
export interface ChatFirstAppPaneProps {
|
|
17
|
+
app: ChatFirstAppItem | null;
|
|
18
|
+
status: "loading" | "ready" | "unresolved" | "error";
|
|
19
|
+
embedUrl?: string | null;
|
|
20
|
+
errorMessage?: string | null;
|
|
21
|
+
onRetry?: () => void;
|
|
22
|
+
renderEmbed: (target: ChatFirstEmbedTarget) => ReactNode;
|
|
23
|
+
copy?: ChatFirstCopy;
|
|
24
|
+
}
|
|
25
|
+
export interface ChatFirstSurfaceTabsProps {
|
|
26
|
+
tabs: ChatFirstSurfaceTab[];
|
|
27
|
+
activeTabId: string | null;
|
|
28
|
+
onActivate: (tab: ChatFirstSurfaceTab) => void;
|
|
29
|
+
onClose: (tab: ChatFirstSurfaceTab) => void;
|
|
30
|
+
onCloseOthers: (tab: ChatFirstSurfaceTab) => void;
|
|
31
|
+
onCloseToRight: (tab: ChatFirstSurfaceTab) => void;
|
|
32
|
+
onCloseAll: () => void;
|
|
33
|
+
onOpenSurface?: (kind: ChatFirstSurfaceKind) => void;
|
|
34
|
+
copy?: ChatFirstCopy;
|
|
35
|
+
}
|
|
36
|
+
export interface ChatFirstAppRailProps {
|
|
37
|
+
apps: readonly ChatFirstAppItem[];
|
|
38
|
+
activeAppId?: string;
|
|
39
|
+
loading?: boolean;
|
|
40
|
+
error?: string | null;
|
|
41
|
+
collapsed?: boolean;
|
|
42
|
+
layout?: ChatFirstAppLayoutPreference;
|
|
43
|
+
onLayoutChange?: (layout: ChatFirstAppLayoutPreference) => void;
|
|
44
|
+
onLayoutError?: (reason: "unavailable" | "write-failed") => void;
|
|
45
|
+
onRetry?: () => void;
|
|
46
|
+
onOpenApp: (app: ChatFirstAppItem) => void;
|
|
47
|
+
onCreateApp?: () => void;
|
|
48
|
+
createAppTrigger?: ReactNode;
|
|
49
|
+
renderIcon: (app: ChatFirstAppItem) => ReactNode;
|
|
50
|
+
copy?: ChatFirstCopy;
|
|
51
|
+
}
|
|
52
|
+
export interface ChatFirstBrowserPaneProps {
|
|
53
|
+
url: string;
|
|
54
|
+
title?: string;
|
|
55
|
+
status?: "starting" | "ready" | "error";
|
|
56
|
+
statusMessage?: string;
|
|
57
|
+
onClose: () => void;
|
|
58
|
+
renderEmbed: (target: ChatFirstEmbedTarget) => ReactNode;
|
|
59
|
+
copy?: ChatFirstCopy;
|
|
60
|
+
}
|
|
61
|
+
export interface ChatFirstSessionWatchPaneProps {
|
|
62
|
+
target: ChatFirstSessionReference | null;
|
|
63
|
+
onClose: () => void;
|
|
64
|
+
renderChat: (target: ChatFirstSessionReference) => ReactNode;
|
|
65
|
+
copy?: ChatFirstCopy;
|
|
66
|
+
}
|
|
67
|
+
export interface ChatFirstAgentsPaneProps {
|
|
68
|
+
activities: readonly ChatFirstAgentActivity[];
|
|
69
|
+
loading?: boolean;
|
|
70
|
+
error?: string | null;
|
|
71
|
+
onRefresh?: () => void;
|
|
72
|
+
onWatch: (activity: ChatFirstAgentActivity) => void;
|
|
73
|
+
copy?: ChatFirstCopy;
|
|
74
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ChatFirstAgentActivity } from "./chat-first.js";
|
|
2
|
+
import type { ChatFirstCopy } from "./chat-first/types.js";
|
|
3
|
+
export interface ChatFirstAgentActivityPanelProps {
|
|
4
|
+
activities: readonly ChatFirstAgentActivity[];
|
|
5
|
+
loading?: boolean;
|
|
6
|
+
error?: string | null;
|
|
7
|
+
onRefresh?: () => void;
|
|
8
|
+
onWatch?: (activity: ChatFirstAgentActivity) => void;
|
|
9
|
+
copy?: ChatFirstCopy;
|
|
10
|
+
}
|
|
11
|
+
export declare function ChatFirstAgentActivityPanel({ activities, loading, error, onRefresh, onWatch, copy, }: ChatFirstAgentActivityPanelProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { IconAlertCircle, IconAsteriskSimple, IconCopy, IconDiamond, IconEye, IconFlower, IconHexagon, IconRosette, IconRefresh, IconSparkles, } from "@tabler/icons-react";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { defaultChatFirstCopy } from "./chat-first/copy.js";
|
|
5
|
+
import { writeClipboardText } from "./clipboard.js";
|
|
6
|
+
import { cn } from "./utils.js";
|
|
7
|
+
const STATUS_KEYS = {
|
|
8
|
+
queued: "agentActivityStatusQueued",
|
|
9
|
+
running: "agentActivityStatusRunning",
|
|
10
|
+
paused: "agentActivityStatusPaused",
|
|
11
|
+
"needs-approval": "agentActivityStatusNeedsApproval",
|
|
12
|
+
completed: "agentActivityStatusCompleted",
|
|
13
|
+
errored: "agentActivityStatusErrored",
|
|
14
|
+
recent: "agentActivityStatusRecent",
|
|
15
|
+
unknown: "agentActivityStatusUnknown",
|
|
16
|
+
};
|
|
17
|
+
const AGENT_GLYPHS = [
|
|
18
|
+
{ icon: IconSparkles, color: "text-primary" },
|
|
19
|
+
{ icon: IconFlower, color: "text-destructive" },
|
|
20
|
+
{ icon: IconRosette, color: "text-accent-foreground" },
|
|
21
|
+
{ icon: IconHexagon, color: "text-ring" },
|
|
22
|
+
{ icon: IconDiamond, color: "text-primary/70" },
|
|
23
|
+
{ icon: IconAsteriskSimple, color: "text-muted-foreground" },
|
|
24
|
+
];
|
|
25
|
+
function glyphForSession(sessionId) {
|
|
26
|
+
let hash = 0;
|
|
27
|
+
for (const character of sessionId) {
|
|
28
|
+
hash = (hash * 31 + character.codePointAt(0)) | 0;
|
|
29
|
+
}
|
|
30
|
+
return AGENT_GLYPHS[Math.abs(hash) % AGENT_GLYPHS.length];
|
|
31
|
+
}
|
|
32
|
+
export function ChatFirstAgentActivityPanel({ activities, loading = false, error = null, onRefresh, onWatch, copy = defaultChatFirstCopy, }) {
|
|
33
|
+
const [copiedSessionId, setCopiedSessionId] = useState(null);
|
|
34
|
+
async function copySessionId(sessionId) {
|
|
35
|
+
const copied = await writeClipboardText(sessionId);
|
|
36
|
+
if (!copied)
|
|
37
|
+
return;
|
|
38
|
+
setCopiedSessionId(sessionId);
|
|
39
|
+
window.setTimeout(() => {
|
|
40
|
+
setCopiedSessionId((current) => (current === sessionId ? null : current));
|
|
41
|
+
}, 1600);
|
|
42
|
+
}
|
|
43
|
+
const statusLabel = (status) => copy(STATUS_KEYS[status]);
|
|
44
|
+
return (_jsxs("section", { className: "flex min-h-0 flex-col overflow-auto px-3 pb-3 pt-2", "data-chat-first-agents-surface": true, "aria-label": copy("agentsTitle"), children: [_jsxs("header", { className: "flex min-h-7 items-center justify-between gap-2 px-2", children: [_jsx("p", { className: "m-0 text-[11px] font-medium text-muted-foreground", children: copy("agentsTitle") }), onRefresh ? (_jsx("button", { type: "button", className: "flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", onClick: onRefresh, "aria-label": copy("refreshAgentActivity"), title: copy("refreshAgentActivity"), children: _jsx(IconRefresh, { size: 15, "aria-hidden": "true" }) })) : null] }), error ? (_jsxs("div", { className: "flex items-center gap-1.5 px-2 py-2 text-[11px] text-destructive", role: "alert", "data-chat-first-agents-error": true, children: [_jsx(IconAlertCircle, { size: 15, "aria-hidden": "true" }), _jsx("span", { children: error }), onRefresh ? (_jsx("button", { type: "button", className: "font-semibold underline underline-offset-2", onClick: onRefresh, children: copy("retry") })) : null] })) : null, loading && activities.length === 0 ? (_jsx("div", { className: "grid min-h-0 gap-px", "aria-busy": "true", children: Array.from({ length: 4 }, (_, index) => (_jsxs("div", { className: "flex h-7 items-center gap-2 px-2", children: [_jsx("span", { className: "size-3 animate-pulse rounded-full bg-muted" }), _jsx("span", { className: "h-2.5 w-28 animate-pulse rounded bg-muted" })] }, index))) })) : activities.length === 0 ? (_jsx("p", { className: "m-0 px-2 py-3 text-[11px] text-muted-foreground", children: copy("noAgentSessions") })) : (_jsx("div", { className: "grid min-h-0 gap-px", children: activities.map((activity) => {
|
|
45
|
+
const { icon: AgentGlyph, color } = glyphForSession(activity.sessionId);
|
|
46
|
+
const copied = copiedSessionId === activity.sessionId;
|
|
47
|
+
return (_jsxs("div", { className: "group flex min-h-7 items-center gap-2 rounded-md px-2 py-0.5 transition-colors hover:bg-accent/50 focus-within:bg-accent/50", children: [_jsx(AgentGlyph, { size: 14, strokeWidth: 1.9, "aria-hidden": "true", className: cn("shrink-0", color) }), _jsx("strong", { className: "min-w-0 flex-1 truncate text-[12px] font-medium text-foreground", title: activity.title, children: activity.title }), _jsx("span", { className: "shrink-0 text-[10px] text-muted-foreground group-hover:hidden group-focus-within:hidden", children: statusLabel(activity.status) }), _jsxs("div", { className: "ms-auto flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100", children: [onWatch ? (_jsx("button", { type: "button", onClick: () => onWatch(activity), className: "flex size-6 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", "aria-label": copy("watchSession"), title: copy("watchSession"), children: _jsx(IconEye, { size: 14, "aria-hidden": "true" }) })) : null, _jsx("button", { type: "button", onClick: () => void copySessionId(activity.sessionId), className: "flex size-6 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", "aria-label": copy("copySessionIdFor", {
|
|
48
|
+
name: activity.title,
|
|
49
|
+
}), title: copied ? copy("sessionIdCopied") : copy("copySessionId"), children: _jsx(IconCopy, { size: 14, "aria-hidden": "true" }) })] })] }, activity.sessionId));
|
|
50
|
+
}) }))] }));
|
|
51
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { IconLayoutSidebarRightCollapse } from "@tabler/icons-react";
|
|
3
|
+
import { cn } from "./utils.js";
|
|
4
|
+
export function ChatFirstSurfacePanelToggle({ open, onToggle, className, }) {
|
|
5
|
+
return (_jsx("button", { type: "button", className: cn("flex size-7 items-center justify-center rounded-md border border-border bg-card/95 text-muted-foreground shadow-sm transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", className), "data-chat-first-surface-toggle": true, "aria-label": open ? "Hide side surface" : "Show side surface", "aria-pressed": open, title: `${open ? "Hide" : "Show"} side surface · ⌘⌥B`, onClick: onToggle, children: _jsx(IconLayoutSidebarRightCollapse, { size: 15, "aria-hidden": "true" }) }));
|
|
6
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
export declare const CHAT_FIRST_MODE_STORAGE_KEY = "agent-native:chat-first-mode:v1";
|
|
2
|
+
export declare const CHAT_FIRST_APP_LAYOUT_STORAGE_KEY = "agent-native:chat-first-app-layout:v1";
|
|
3
|
+
export declare const CHAT_FIRST_SURFACE_TABS_STORAGE_KEY = "agent-native:chat-first-surface-tabs:v1";
|
|
4
|
+
export declare const CHAT_FIRST_SURFACE_WIDTH_STORAGE_KEY = "agent-native:chat-first-surface-width:v2";
|
|
5
|
+
export declare const CHAT_FIRST_SURFACE_PANEL_STORAGE_KEY = "agent-native:chat-first-surface-panel:v1";
|
|
6
|
+
export declare const CHAT_FIRST_MODE_CHANGED_EVENT = "agentNative:chatFirstModeChanged";
|
|
7
|
+
export declare const CHAT_FIRST_OPEN_APP_EVENT = "agentNative:openApp";
|
|
8
|
+
export declare const CHAT_FIRST_OPEN_BROWSER_EVENT = "agentNative:openBrowser";
|
|
9
|
+
export declare const CHAT_FIRST_WATCH_SESSION_EVENT = "agentNative:watchSession";
|
|
10
|
+
export type ChatFirstOpenAppDetail = {
|
|
11
|
+
app?: string;
|
|
12
|
+
path?: string;
|
|
13
|
+
url?: string;
|
|
14
|
+
view?: string;
|
|
15
|
+
};
|
|
16
|
+
export type ChatFirstOpenBrowserDetail = {
|
|
17
|
+
url?: string;
|
|
18
|
+
title?: string;
|
|
19
|
+
};
|
|
20
|
+
export type ChatFirstSessionKind = "code-agent" | "agent-chat" | "external";
|
|
21
|
+
export interface ChatFirstSessionReference {
|
|
22
|
+
sessionId: string;
|
|
23
|
+
title?: string;
|
|
24
|
+
kind?: ChatFirstSessionKind;
|
|
25
|
+
goalId?: string;
|
|
26
|
+
sourceSessionId?: string;
|
|
27
|
+
}
|
|
28
|
+
export type ChatFirstSessionWatchState = {
|
|
29
|
+
target: ChatFirstSessionReference | null;
|
|
30
|
+
};
|
|
31
|
+
export interface ChatFirstSessionWatchStore {
|
|
32
|
+
getSnapshot: () => ChatFirstSessionWatchState;
|
|
33
|
+
subscribe: (listener: () => void) => () => void;
|
|
34
|
+
hasSubscribers: () => boolean;
|
|
35
|
+
open: (target: ChatFirstSessionReference) => void;
|
|
36
|
+
close: () => void;
|
|
37
|
+
}
|
|
38
|
+
export type ChatFirstSurfaceKind = "app" | "browser" | "terminal" | "diff" | "files" | "side-chat" | "agents";
|
|
39
|
+
export interface ChatFirstSurfaceTab {
|
|
40
|
+
id: string;
|
|
41
|
+
kind: ChatFirstSurfaceKind;
|
|
42
|
+
title: string;
|
|
43
|
+
appId?: string;
|
|
44
|
+
path?: string;
|
|
45
|
+
view?: string;
|
|
46
|
+
url?: string;
|
|
47
|
+
session?: ChatFirstSessionReference;
|
|
48
|
+
disabledReason?: string;
|
|
49
|
+
}
|
|
50
|
+
export type ChatFirstAgentActivityStatus = "queued" | "running" | "paused" | "needs-approval" | "completed" | "errored" | "recent" | "unknown";
|
|
51
|
+
/** The renderer-neutral subset used by the shared agent activity surface. */
|
|
52
|
+
export interface ChatFirstAgentActivity {
|
|
53
|
+
sessionId: string;
|
|
54
|
+
title: string;
|
|
55
|
+
subtitle?: string;
|
|
56
|
+
status: ChatFirstAgentActivityStatus;
|
|
57
|
+
updatedAt?: string | number;
|
|
58
|
+
progressPercent?: number;
|
|
59
|
+
goalId?: string;
|
|
60
|
+
}
|
|
61
|
+
export interface ChatFirstSurfaceTabsState {
|
|
62
|
+
tabs: ChatFirstSurfaceTab[];
|
|
63
|
+
activeTabId: string | null;
|
|
64
|
+
}
|
|
65
|
+
export interface ChatFirstSurfaceTabsStore {
|
|
66
|
+
getSnapshot: () => ChatFirstSurfaceTabsState;
|
|
67
|
+
subscribe: (listener: () => void) => () => void;
|
|
68
|
+
open: (tab: ChatFirstSurfaceTab) => void;
|
|
69
|
+
activate: (tabId: string) => void;
|
|
70
|
+
close: (tabId: string) => void;
|
|
71
|
+
closeOthers: (tabId: string) => void;
|
|
72
|
+
closeToRight: (tabId: string) => void;
|
|
73
|
+
closeAll: () => void;
|
|
74
|
+
}
|
|
75
|
+
export interface ChatFirstSurfacePanelState {
|
|
76
|
+
open: boolean;
|
|
77
|
+
}
|
|
78
|
+
export interface ChatFirstSurfacePanelStore {
|
|
79
|
+
getSnapshot: () => ChatFirstSurfacePanelState;
|
|
80
|
+
subscribe: (listener: () => void) => () => void;
|
|
81
|
+
setOpen: (open: boolean) => void;
|
|
82
|
+
toggle: () => void;
|
|
83
|
+
}
|
|
84
|
+
export declare const CHAT_FIRST_SURFACE_CATALOG: readonly {
|
|
85
|
+
kind: ChatFirstSurfaceKind;
|
|
86
|
+
label: string;
|
|
87
|
+
description: string;
|
|
88
|
+
availability: "both" | "desktop" | "deferred";
|
|
89
|
+
disabledReason?: string;
|
|
90
|
+
}[];
|
|
91
|
+
export declare function chatFirstSurfaceTabId(kind: ChatFirstSurfaceKind, value: string): string;
|
|
92
|
+
export declare const CHAT_FIRST_SURFACE_WIDTH_DEFAULT = 380;
|
|
93
|
+
export declare const CHAT_FIRST_SURFACE_WIDTH_MIN = 320;
|
|
94
|
+
/**
|
|
95
|
+
* The first-run rail is intentionally opinionated. These are the five
|
|
96
|
+
* everyday workspace apps shown before the user expands the rest of the
|
|
97
|
+
* catalog; an explicit ordered layout still wins after the first change.
|
|
98
|
+
*/
|
|
99
|
+
export declare const CHAT_FIRST_DEFAULT_APP_IDS: readonly ["content", "design", "mail", "calendar", "clips"];
|
|
100
|
+
export declare function clampChatFirstSurfaceWidth(value: number, viewportWidth?: number): number;
|
|
101
|
+
export declare function readChatFirstSurfaceWidth(scope?: string, storage?: StringStorage | null): number;
|
|
102
|
+
export declare function writeChatFirstSurfaceWidth(width: number, scope?: string, storage?: StringStorage | null): {
|
|
103
|
+
ok: true;
|
|
104
|
+
} | {
|
|
105
|
+
ok: false;
|
|
106
|
+
reason: "unavailable" | "write-failed";
|
|
107
|
+
};
|
|
108
|
+
export declare function useChatFirstSurfaceResize(scope?: string): {
|
|
109
|
+
width: number;
|
|
110
|
+
isResizing: boolean;
|
|
111
|
+
onPointerDown: (event: {
|
|
112
|
+
clientX: number;
|
|
113
|
+
preventDefault: () => void;
|
|
114
|
+
}) => void;
|
|
115
|
+
};
|
|
116
|
+
export declare function getChatFirstSurfacePanelStore(scope?: string): ChatFirstSurfacePanelStore;
|
|
117
|
+
export declare function useChatFirstSurfacePanel(scope?: string): {
|
|
118
|
+
open: boolean;
|
|
119
|
+
setOpen: (open: boolean) => void;
|
|
120
|
+
toggle: () => void;
|
|
121
|
+
};
|
|
122
|
+
export interface ChatFirstSessionWatchDelivery {
|
|
123
|
+
delivered: boolean;
|
|
124
|
+
reason?: "empty-detail" | "no-listener";
|
|
125
|
+
}
|
|
126
|
+
export type ChatFirstBrowserResolution = {
|
|
127
|
+
status: "ready";
|
|
128
|
+
target: {
|
|
129
|
+
url: string;
|
|
130
|
+
title?: string;
|
|
131
|
+
};
|
|
132
|
+
} | {
|
|
133
|
+
status: "unresolved";
|
|
134
|
+
reason: "empty-detail" | "invalid-url";
|
|
135
|
+
};
|
|
136
|
+
export interface ChatFirstAppRegistration {
|
|
137
|
+
id: string;
|
|
138
|
+
name?: string;
|
|
139
|
+
enabled?: boolean;
|
|
140
|
+
/** The app's current production or mounted URL. */
|
|
141
|
+
url?: string | null;
|
|
142
|
+
/** Optional local development URL used by the desktop shell. */
|
|
143
|
+
devUrl?: string | null;
|
|
144
|
+
/** Mounted path used when an app has no absolute URL. */
|
|
145
|
+
path?: string | null;
|
|
146
|
+
}
|
|
147
|
+
export interface ChatFirstAppTarget {
|
|
148
|
+
appId: string;
|
|
149
|
+
path?: string;
|
|
150
|
+
view?: string;
|
|
151
|
+
}
|
|
152
|
+
export type ChatFirstAppResolution = {
|
|
153
|
+
status: "ready";
|
|
154
|
+
target: ChatFirstAppTarget;
|
|
155
|
+
} | {
|
|
156
|
+
status: "unresolved";
|
|
157
|
+
reason: "empty-detail" | "unknown-app" | "invalid-url";
|
|
158
|
+
};
|
|
159
|
+
export interface ChatFirstOpenAppDelivery {
|
|
160
|
+
delivered: boolean;
|
|
161
|
+
reason?: "empty-detail" | "no-listener";
|
|
162
|
+
}
|
|
163
|
+
export interface ChatFirstAppLayoutPreference {
|
|
164
|
+
pinnedIds: string[];
|
|
165
|
+
orderedIds: string[];
|
|
166
|
+
}
|
|
167
|
+
export interface ChatFirstModeReadResult {
|
|
168
|
+
enabled: boolean;
|
|
169
|
+
availability: "available" | "unavailable";
|
|
170
|
+
}
|
|
171
|
+
type StringStorage = Pick<Storage, "getItem" | "setItem">;
|
|
172
|
+
export declare function readChatFirstModeState(storage?: StringStorage | null): ChatFirstModeReadResult;
|
|
173
|
+
export declare function readChatFirstMode(storage?: StringStorage | null): boolean;
|
|
174
|
+
export declare function writeChatFirstMode(enabled: boolean, storage?: StringStorage | null): {
|
|
175
|
+
ok: true;
|
|
176
|
+
} | {
|
|
177
|
+
ok: false;
|
|
178
|
+
reason: "unavailable" | "write-failed";
|
|
179
|
+
};
|
|
180
|
+
export declare function readChatFirstAppLayout(storage?: StringStorage | null): ChatFirstAppLayoutPreference;
|
|
181
|
+
export declare function writeChatFirstAppLayout(layout: ChatFirstAppLayoutPreference, storage?: StringStorage | null): {
|
|
182
|
+
ok: true;
|
|
183
|
+
} | {
|
|
184
|
+
ok: false;
|
|
185
|
+
reason: "unavailable" | "write-failed";
|
|
186
|
+
};
|
|
187
|
+
export declare function orderChatFirstAppIds(appIds: readonly string[], layout: ChatFirstAppLayoutPreference): string[];
|
|
188
|
+
export declare function resolveChatFirstBrowserTarget(detail: ChatFirstOpenBrowserDetail): ChatFirstBrowserResolution;
|
|
189
|
+
type ChatFirstOpenAppListener = (detail: ChatFirstOpenAppDetail) => void;
|
|
190
|
+
type ChatFirstOpenBrowserListener = (detail: ChatFirstOpenBrowserDetail) => void;
|
|
191
|
+
/** Resolve ids from run/thread payloads without treating an absent id as a session. */
|
|
192
|
+
export declare function resolveChatFirstSessionId(value: unknown): string | null;
|
|
193
|
+
export declare function normalizeChatFirstSessionReference(value: unknown): ChatFirstSessionReference | null;
|
|
194
|
+
export declare function getChatFirstSessionWatchStore(): ChatFirstSessionWatchStore;
|
|
195
|
+
export declare function useChatFirstSessionWatch(): ChatFirstSessionWatchState;
|
|
196
|
+
export declare function subscribeChatFirstSessionWatch(listener: (target: ChatFirstSessionReference) => void): () => void;
|
|
197
|
+
export declare function emitChatFirstSessionWatch(detail: unknown): ChatFirstSessionWatchDelivery;
|
|
198
|
+
export declare function closeChatFirstSessionWatch(): void;
|
|
199
|
+
export declare function getChatFirstSurfaceTabsStore(scope?: string): ChatFirstSurfaceTabsStore;
|
|
200
|
+
export declare function useChatFirstSurfaceTabs(scope?: string): ChatFirstSurfaceTabsState;
|
|
201
|
+
export declare function subscribeChatFirstOpenApp(listener: ChatFirstOpenAppListener): () => void;
|
|
202
|
+
export declare function emitChatFirstOpenApp(detail: ChatFirstOpenAppDetail): ChatFirstOpenAppDelivery;
|
|
203
|
+
export declare function subscribeChatFirstOpenBrowser(listener: ChatFirstOpenBrowserListener): () => void;
|
|
204
|
+
export declare function emitChatFirstOpenBrowser(detail: ChatFirstOpenBrowserDetail): ChatFirstOpenAppDelivery;
|
|
205
|
+
export declare function resolveChatFirstAppTarget(detail: ChatFirstOpenAppDetail, apps: readonly ChatFirstAppRegistration[], options?: {
|
|
206
|
+
currentOrigin?: string;
|
|
207
|
+
}): ChatFirstAppResolution;
|
|
208
|
+
export {};
|