@agent-native/dispatch 0.40.20-nightly-20261011124220 → 0.40.20
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/CHANGELOG.md +8 -79
- package/dist/components/layout/Header.d.ts +1 -1
- package/dist/components/layout/Header.d.ts.map +1 -1
- package/dist/components/layout/Header.js +3 -6
- package/dist/components/layout/Header.js.map +1 -1
- package/dist/components/layout/Layout.d.ts.map +1 -1
- package/dist/components/layout/Layout.js +3 -6
- package/dist/components/layout/Layout.js.map +1 -1
- package/dist/lib/dispatch-run-thread.d.ts +8 -0
- package/dist/lib/dispatch-run-thread.d.ts.map +1 -0
- package/dist/lib/dispatch-run-thread.js +18 -0
- package/dist/lib/dispatch-run-thread.js.map +1 -0
- package/dist/routes/pages/chat.d.ts.map +1 -1
- package/dist/routes/pages/chat.js +18 -4
- package/dist/routes/pages/chat.js.map +1 -1
- package/package.json +4 -4
- package/src/components/layout/Header.tsx +4 -8
- package/src/components/layout/Layout.tsx +4 -8
- package/src/lib/dispatch-run-thread.spec.ts +49 -0
- package/src/lib/dispatch-run-thread.ts +33 -0
- package/src/routes/pages/chat.spec.tsx +40 -0
- package/src/routes/pages/chat.tsx +22 -5
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AgentRun } from "@agent-native/core/progress/types";
|
|
2
|
+
export interface DispatchRunThreadContext {
|
|
3
|
+
parentThreadId: string;
|
|
4
|
+
description: string;
|
|
5
|
+
name: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function getDispatchRunThreadContext(threadId: string, run: AgentRun): DispatchRunThreadContext | undefined;
|
|
8
|
+
//# sourceMappingURL=dispatch-run-thread.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-run-thread.d.ts","sourceRoot":"","sources":["../../src/lib/dispatch-run-thread.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAElE,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,QAAQ,GACZ,wBAAwB,GAAG,SAAS,CAqBtC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function getDispatchRunThreadContext(threadId, run) {
|
|
2
|
+
const metadata = run.metadata ?? {};
|
|
3
|
+
const isAgentTeam = metadata.kind === "agent-team" || metadata.source === "agent-teams";
|
|
4
|
+
const parentThreadId = typeof metadata.parentThreadId === "string"
|
|
5
|
+
? metadata.parentThreadId.trim()
|
|
6
|
+
: "";
|
|
7
|
+
if (!isAgentTeam || !parentThreadId || parentThreadId === threadId) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
parentThreadId,
|
|
12
|
+
description: typeof metadata.description === "string"
|
|
13
|
+
? metadata.description
|
|
14
|
+
: run.title,
|
|
15
|
+
name: typeof metadata.name === "string" ? metadata.name : "",
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=dispatch-run-thread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-run-thread.js","sourceRoot":"","sources":["../../src/lib/dispatch-run-thread.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,2BAA2B,CACzC,QAAgB,EAChB,GAAa;IAEb,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IACpC,MAAM,WAAW,GACf,QAAQ,CAAC,IAAI,KAAK,YAAY,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa,CAAC;IACtE,MAAM,cAAc,GAClB,OAAO,QAAQ,CAAC,cAAc,KAAK,QAAQ;QACzC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE;QAChC,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,CAAC,WAAW,IAAI,CAAC,cAAc,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;QACnE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,cAAc;QACd,WAAW,EACT,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ;YACtC,CAAC,CAAC,QAAQ,CAAC,WAAW;YACtB,CAAC,CAAC,GAAG,CAAC,KAAK;QACf,IAAI,EAAE,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;KAC7D,CAAC;AACJ,CAAC","sourcesContent":["import type { AgentRun } from \"@agent-native/core/progress/types\";\n\nexport interface DispatchRunThreadContext {\n parentThreadId: string;\n description: string;\n name: string;\n}\n\nexport function getDispatchRunThreadContext(\n threadId: string,\n run: AgentRun,\n): DispatchRunThreadContext | undefined {\n const metadata = run.metadata ?? {};\n const isAgentTeam =\n metadata.kind === \"agent-team\" || metadata.source === \"agent-teams\";\n const parentThreadId =\n typeof metadata.parentThreadId === \"string\"\n ? metadata.parentThreadId.trim()\n : \"\";\n\n if (!isAgentTeam || !parentThreadId || parentThreadId === threadId) {\n return undefined;\n }\n\n return {\n parentThreadId,\n description:\n typeof metadata.description === \"string\"\n ? metadata.description\n : run.title,\n name: typeof metadata.name === \"string\" ? metadata.name : \"\",\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/chat.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/chat.tsx"],"names":[],"mappings":"AA2FA,wBAAgB,IAAI;;IAEnB;AAED,MAAM,CAAC,OAAO,UAAU,SAAS,oDAgQhC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { insertAgentComposerReference, markAgentChatHomeHandoff, readChatFirstMode, } from "@agent-native/core/client/agent-chat";
|
|
2
|
+
import { insertAgentComposerReference, markAgentChatHomeHandoff, readChatFirstMode, requestAgentTaskOpen, } from "@agent-native/core/client/agent-chat";
|
|
3
3
|
import { appBasePath, appPath } from "@agent-native/core/client/api-path";
|
|
4
4
|
import { useActionQuery } from "@agent-native/core/client/hooks";
|
|
5
5
|
import { useT } from "@agent-native/core/client/i18n";
|
|
@@ -107,9 +107,20 @@ export default function ChatRoute() {
|
|
|
107
107
|
handledStateIds.current.add(stateId);
|
|
108
108
|
const timer = window.setTimeout(() => {
|
|
109
109
|
if (threadId) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
110
|
+
const parentThreadId = thread?.parentThreadId?.trim();
|
|
111
|
+
if (parentThreadId && parentThreadId !== threadId) {
|
|
112
|
+
requestAgentTaskOpen({
|
|
113
|
+
threadId,
|
|
114
|
+
parentThreadId,
|
|
115
|
+
description: thread?.description,
|
|
116
|
+
name: thread?.name,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
window.dispatchEvent(new CustomEvent("agent-chat:open-thread", {
|
|
121
|
+
detail: { threadId },
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
113
124
|
}
|
|
114
125
|
if (message) {
|
|
115
126
|
setPendingOverviewPrompt(prompt ?? null);
|
|
@@ -138,6 +149,9 @@ export default function ChatRoute() {
|
|
|
138
149
|
prompt?.selectedEffort,
|
|
139
150
|
thread?.id,
|
|
140
151
|
thread?.threadId,
|
|
152
|
+
thread?.parentThreadId,
|
|
153
|
+
thread?.description,
|
|
154
|
+
thread?.name,
|
|
141
155
|
]);
|
|
142
156
|
useEffect(() => {
|
|
143
157
|
function handleChatRunning(event) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/routes/pages/chat.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n insertAgentComposerReference,\n markAgentChatHomeHandoff,\n readChatFirstMode,\n} from \"@agent-native/core/client/agent-chat\";\nimport { appBasePath, appPath } from \"@agent-native/core/client/api-path\";\nimport { useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport {\n AgentChatHome,\n type AgentChatHomeProps,\n} from \"@agent-native/toolkit/app/chat/AgentChatHome\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useLocation, useNavigate } from \"react-router\";\n\nimport { ActionQueryError } from \"../../components/action-query-error\";\nimport { DispatchChatHomeApps } from \"../../components/chat-home-apps\";\nimport { useDispatchExtensions } from \"../../components/layout/Layout\";\nimport { Skeleton } from \"../../components/ui/skeleton\";\nimport { submitOverviewPrompt } from \"../../lib/overview-chat\";\n\ninterface WorkspaceAgentResource {\n id: string;\n name: string;\n description: string | null;\n path: string;\n content: string;\n scope: \"all\" | \"selected\";\n updatedAt: number;\n}\n\nfunction chatThreadPath(threadId: string | null, agentPath?: string): string {\n const path = threadId ? `/chat/${encodeURIComponent(threadId)}` : \"/chat\";\n return agentPath ? `${path}?agent=${encodeURIComponent(agentPath)}` : path;\n}\n\nfunction stripBasePath(pathname: string): string {\n const basePath = appBasePath();\n if (!basePath) return pathname;\n if (pathname === basePath) return \"/\";\n if (pathname.startsWith(`${basePath}/`)) {\n return pathname.slice(basePath.length) || \"/\";\n }\n return pathname;\n}\n\nfunction threadIdFromPath(pathname: string): string | null {\n const match = stripBasePath(pathname).match(/^\\/chat\\/([^/]+)/);\n if (!match) return null;\n try {\n const value = decodeURIComponent(match[1]).trim();\n return value || null;\n } catch {\n return null;\n }\n}\n\nfunction dispatchNavTarget(path: string): string {\n if (typeof window === \"undefined\") return path;\n const basePath = appBasePath();\n if (!basePath) return path;\n const pathname = window.location.pathname;\n const routerHasBasename =\n pathname === basePath || pathname.startsWith(`${basePath}/`);\n return routerHasBasename ? path : appPath(path);\n}\n\ninterface DispatchThreadUrlSync {\n routeThreadId: string | null;\n getPath: (threadId: string | null) => string;\n navigate: (path: string, options?: { replace?: boolean }) => void;\n}\n\ninterface DispatchChatLocationState {\n dispatchPrompt?: {\n id?: string | number;\n message?: string;\n selectedModel?: string | null;\n selectedEngine?: string | null;\n selectedEffort?: AgentChatHomeProps[\"selectedEffort\"];\n };\n dispatchThread?: {\n id?: string | number;\n threadId?: string;\n };\n}\n\nexport function meta() {\n return [{ title: \"Chat — Dispatch\" }];\n}\n\nexport default function ChatRoute() {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const routeThreadId = threadIdFromPath(location.pathname);\n const agentPath = new URLSearchParams(location.search).get(\"agent\");\n const agentsQuery = useActionQuery<WorkspaceAgentResource[]>(\n \"list-workspace-resources\",\n { kind: \"agent\" },\n { enabled: Boolean(agentPath), staleTime: 30_000 },\n );\n const agent = useMemo(\n () =>\n agentPath\n ? (agentsQuery.data ?? []).find((resource) => {\n const profileId = resource.path\n .replace(/^agents\\//, \"\")\n .replace(/\\.md$/, \"\");\n return (\n resource.path === agentPath ||\n resource.id === agentPath ||\n profileId === agentPath\n );\n })\n : undefined,\n [agentPath, agentsQuery.data],\n );\n const agentScope = useMemo(\n () =>\n agent\n ? {\n type: \"agent\",\n id: agent.id,\n label: agent.name,\n contextKey: `dispatch-agent:${agent.id}`,\n }\n : null,\n [agent],\n );\n const handledStateIds = useRef(new Set<string>());\n const extensions = useDispatchExtensions();\n const suppressInlineOpenApp =\n extensions?.chatFirst === true ||\n readChatFirstMode() ||\n new URLSearchParams(location.search).get(\"chatFirst\") === \"1\";\n\n const navigateThreadUrl = useCallback(\n (path: string, options?: { replace?: boolean }) =>\n navigate(dispatchNavTarget(path), options),\n [navigate],\n );\n const threadUrlSync = useMemo<DispatchThreadUrlSync>(\n () => ({\n routeThreadId: routeThreadId ?? null,\n getPath: (threadId) => chatThreadPath(threadId, agentPath ?? undefined),\n navigate: navigateThreadUrl,\n }),\n [agentPath, routeThreadId, navigateThreadUrl],\n );\n const state = location.state as DispatchChatLocationState | null;\n const prompt = state?.dispatchPrompt;\n const thread = state?.dispatchThread;\n const [pendingOverviewPrompt, setPendingOverviewPrompt] = useState<\n DispatchChatLocationState[\"dispatchPrompt\"] | null\n >(null);\n const activePrompt = prompt?.message ? prompt : pendingOverviewPrompt;\n\n useEffect(() => {\n if (routeThreadId) setPendingOverviewPrompt(null);\n }, [routeThreadId]);\n\n useEffect(() => {\n const message = prompt?.message?.trim();\n const threadId = thread?.threadId?.trim();\n if (!message && !threadId) return;\n\n const stateId = String(\n prompt?.id ?? thread?.id ?? `${message ?? \"\"}:${threadId ?? \"\"}`,\n );\n if (handledStateIds.current.has(stateId)) return;\n handledStateIds.current.add(stateId);\n\n const timer = window.setTimeout(() => {\n if (threadId) {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId },\n }),\n );\n }\n if (message) {\n setPendingOverviewPrompt(prompt ?? null);\n submitOverviewPrompt(message, prompt?.selectedModel, {\n openSidebar: false,\n reuseEmptyTab: true,\n selectedEngine: prompt?.selectedEngine,\n selectedEffort: prompt?.selectedEffort,\n });\n }\n void navigate(`${location.pathname}${location.search}${location.hash}`, {\n replace: true,\n state: null,\n });\n }, 0);\n\n return () => window.clearTimeout(timer);\n }, [\n location.hash,\n location.pathname,\n location.search,\n navigate,\n prompt?.id,\n prompt?.message,\n prompt?.selectedModel,\n prompt?.selectedEngine,\n prompt?.selectedEffort,\n thread?.id,\n thread?.threadId,\n ]);\n\n useEffect(() => {\n function handleChatRunning(event: Event) {\n const detail = (event as CustomEvent).detail;\n if (detail?.isRunning === true) markAgentChatHomeHandoff(\"dispatch\");\n }\n\n window.addEventListener(\"agentNative.chatRunning\", handleChatRunning);\n return () =>\n window.removeEventListener(\"agentNative.chatRunning\", handleChatRunning);\n }, []);\n\n useEffect(() => {\n if (!agent) return;\n const timer = window.setTimeout(() => {\n insertAgentComposerReference(\n {\n label: agent.name,\n icon: \"agent\",\n source: \"agent:custom\",\n refType: \"custom-agent\",\n refId: agent.id,\n refPath: agent.path,\n slotKey: \"dispatch-agent\",\n slotLabel: \"Agent\",\n },\n { openSidebar: false },\n );\n }, 0);\n return () => window.clearTimeout(timer);\n }, [agent?.id, agent?.name, agent?.path]);\n\n if (agentPath && agentsQuery.isLoading) {\n return (\n <div className=\"flex h-full min-h-0 flex-col gap-4 bg-background px-4 py-6 sm:px-6\">\n <Skeleton className=\"mx-auto h-6 w-48\" />\n <Skeleton className=\"mx-auto h-12 w-full max-w-2xl\" />\n </div>\n );\n }\n\n if (agentPath && agentsQuery.isError) {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center bg-background px-4\">\n <ActionQueryError\n error={agentsQuery.error}\n onRetry={() => void agentsQuery.refetch()}\n />\n </div>\n );\n }\n\n if (agentPath && !agent) {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center bg-background px-4 text-sm text-muted-foreground\">\n This agent is no longer available.\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-background\">\n <AgentChatHome\n key={agent ? `agent-${agent.id}` : \"dispatch\"}\n className=\"flex-1 min-h-0\"\n contentClassName=\"max-w-none\"\n surfaceClassName=\"dispatch-chat-panel\"\n chatViewTransition\n defaultMode=\"chat\"\n storageKey={agent ? `dispatch-agent-${agent.id}` : \"dispatch\"}\n scope={agentScope}\n threadUrlSync={threadUrlSync}\n showHeader={false}\n showTabBar={false}\n dynamicSuggestions={false}\n suppressInlineOpenApp={suppressInlineOpenApp}\n suggestions={\n agent || routeThreadId || activePrompt?.message\n ? []\n : [\n t(\"dispatch.pages.suggestionWorkspaceHealth\"),\n t(\"dispatch.pages.suggestionOnboardingApp\"),\n t(\"dispatch.pages.suggestionAnalyticsAgents\"),\n ]\n }\n emptyStateText={t(\"dispatch.pages.chatAcrossAppsDescription\", {\n defaultValue:\n \"Route work, inspect status, or create something new from one place.\",\n })}\n centerComposerWhenEmpty={!activePrompt?.message && !routeThreadId}\n composerLayoutVariant={\n activePrompt?.message || routeThreadId ? \"default\" : \"hero\"\n }\n composerPlaceholder={\n agent\n ? `Ask ${agent.name}...`\n : t(\"dispatch.pages.chatPromptPlaceholder\", {\n defaultValue: \"Tell Dispatch what you’d like to make happen…\",\n })\n }\n homeIntroSlot={\n agent ? (\n <div className=\"dispatch-chat-intro\">\n <h1>{agent.name}</h1>\n {agent.description ? <p>{agent.description}</p> : null}\n </div>\n ) : !activePrompt?.message && !routeThreadId ? (\n <div className=\"dispatch-chat-intro\">\n <h1>\n {t(\"dispatch.pages.chatHomeTitle\", {\n defaultValue: \"What should we do today?\",\n })}\n </h1>\n </div>\n ) : null\n }\n afterComposerSlot={\n !agent && !prompt?.message && !threadUrlSync.routeThreadId ? (\n <DispatchChatHomeApps />\n ) : null\n }\n />\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/routes/pages/chat.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AACtD,OAAO,EACL,aAAa,GAEd,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAY/D,SAAS,cAAc,CAAC,QAAuB,EAAE,SAAkB;IACjE,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1E,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,UAAU,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7E,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/B,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACtC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;IAChD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,OAAO,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC1C,MAAM,iBAAiB,GACrB,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC/D,OAAO,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AAyBD,MAAM,UAAU,IAAI;IAClB,OAAO,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,SAAS;IAC/B,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,cAAc,CAChC,0BAA0B,EAC1B,EAAE,IAAI,EAAE,OAAO,EAAE,EACjB,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CACnD,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CACH,SAAS;QACP,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YACzC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI;iBAC5B,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;iBACxB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACxB,OAAO,CACL,QAAQ,CAAC,IAAI,KAAK,SAAS;gBAC3B,QAAQ,CAAC,EAAE,KAAK,SAAS;gBACzB,SAAS,KAAK,SAAS,CACxB,CAAC;QACJ,CAAC,CAAC;QACJ,CAAC,CAAC,SAAS,EACf,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAC9B,CAAC;IACF,MAAM,UAAU,GAAG,OAAO,CACxB,GAAG,EAAE,CACH,KAAK;QACH,CAAC,CAAC;YACE,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,UAAU,EAAE,kBAAkB,KAAK,CAAC,EAAE,EAAE;SACzC;QACH,CAAC,CAAC,IAAI,EACV,CAAC,KAAK,CAAC,CACR,CAAC;IACF,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,GAAG,EAAU,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAC;IAC3C,MAAM,qBAAqB,GACzB,UAAU,EAAE,SAAS,KAAK,IAAI;QAC9B,iBAAiB,EAAE;QACnB,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC;IAEhE,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,IAAY,EAAE,OAA+B,EAAE,EAAE,CAChD,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAC5C,CAAC,QAAQ,CAAC,CACX,CAAC;IACF,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,CAAC;QACL,aAAa,EAAE,aAAa,IAAI,IAAI;QACpC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,IAAI,SAAS,CAAC;QACvE,QAAQ,EAAE,iBAAiB;KAC5B,CAAC,EACF,CAAC,SAAS,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAC9C,CAAC;IACF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAyC,CAAC;IACjE,MAAM,MAAM,GAAG,KAAK,EAAE,cAAc,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,EAAE,cAAc,CAAC;IACrC,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GAAG,QAAQ,CAEhE,IAAI,CAAC,CAAC;IACR,MAAM,YAAY,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC;IAEtE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,aAAa;YAAE,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;YAAE,OAAO;QAElC,MAAM,OAAO,GAAG,MAAM,CACpB,MAAM,EAAE,EAAE,IAAI,MAAM,EAAE,EAAE,IAAI,GAAG,OAAO,IAAI,EAAE,IAAI,QAAQ,IAAI,EAAE,EAAE,CACjE,CAAC;QACF,IAAI,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO;QACjD,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAErC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACnC,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,cAAc,GAAG,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;gBACtD,IAAI,cAAc,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;oBAClD,oBAAoB,CAAC;wBACnB,QAAQ;wBACR,cAAc;wBACd,WAAW,EAAE,MAAM,EAAE,WAAW;wBAChC,IAAI,EAAE,MAAM,EAAE,IAAI;qBACnB,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,aAAa,CAClB,IAAI,WAAW,CAAC,wBAAwB,EAAE;wBACxC,MAAM,EAAE,EAAE,QAAQ,EAAE;qBACrB,CAAC,CACH,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,wBAAwB,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;gBACzC,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE;oBACnD,WAAW,EAAE,KAAK;oBAClB,aAAa,EAAE,IAAI;oBACnB,cAAc,EAAE,MAAM,EAAE,cAAc;oBACtC,cAAc,EAAE,MAAM,EAAE,cAAc;iBACvC,CAAC,CAAC;YACL,CAAC;YACD,KAAK,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE;gBACtE,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC,EAAE,CAAC,CAAC,CAAC;QAEN,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,EAAE;QACD,QAAQ,CAAC,IAAI;QACb,QAAQ,CAAC,QAAQ;QACjB,QAAQ,CAAC,MAAM;QACf,QAAQ;QACR,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,iBAAiB,CAAC,KAAY;YACrC,MAAM,MAAM,GAAI,KAAqB,CAAC,MAAM,CAAC;YAC7C,IAAI,MAAM,EAAE,SAAS,KAAK,IAAI;gBAAE,wBAAwB,CAAC,UAAU,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,CAAC,gBAAgB,CAAC,yBAAyB,EAAE,iBAAiB,CAAC,CAAC;QACtE,OAAO,GAAG,EAAE,CACV,MAAM,CAAC,mBAAmB,CAAC,yBAAyB,EAAE,iBAAiB,CAAC,CAAC;IAC7E,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACnC,4BAA4B,CAC1B;gBACE,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,cAAc;gBACtB,OAAO,EAAE,cAAc;gBACvB,KAAK,EAAE,KAAK,CAAC,EAAE;gBACf,OAAO,EAAE,KAAK,CAAC,IAAI;gBACnB,OAAO,EAAE,gBAAgB;gBACzB,SAAS,EAAE,OAAO;aACnB,EACD,EAAE,WAAW,EAAE,KAAK,EAAE,CACvB,CAAC;QACJ,CAAC,EAAE,CAAC,CAAC,CAAC;QACN,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1C,IAAI,SAAS,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;QACvC,OAAO,CACL,eAAK,SAAS,EAAC,oEAAoE,aACjF,KAAC,QAAQ,IAAC,SAAS,EAAC,kBAAkB,GAAG,EACzC,KAAC,QAAQ,IAAC,SAAS,EAAC,+BAA+B,GAAG,IAClD,CACP,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACrC,OAAO,CACL,cAAK,SAAS,EAAC,oEAAoE,YACjF,KAAC,gBAAgB,IACf,KAAK,EAAE,WAAW,CAAC,KAAK,EACxB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,WAAW,CAAC,OAAO,EAAE,GACzC,GACE,CACP,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,CACL,cAAK,SAAS,EAAC,kGAAkG,mDAE3G,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAC,4CAA4C,YACzD,KAAC,aAAa,IAEZ,SAAS,EAAC,gBAAgB,EAC1B,gBAAgB,EAAC,YAAY,EAC7B,gBAAgB,EAAC,qBAAqB,EACtC,kBAAkB,QAClB,WAAW,EAAC,MAAM,EAClB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,kBAAkB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAC7D,KAAK,EAAE,UAAU,EACjB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,KAAK,EACjB,UAAU,EAAE,KAAK,EACjB,kBAAkB,EAAE,KAAK,EACzB,qBAAqB,EAAE,qBAAqB,EAC5C,WAAW,EACT,KAAK,IAAI,aAAa,IAAI,YAAY,EAAE,OAAO;gBAC7C,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE,CAAC,CAAC,0CAA0C,CAAC;oBAC7C,CAAC,CAAC,wCAAwC,CAAC;oBAC3C,CAAC,CAAC,0CAA0C,CAAC;iBAC9C,EAEP,cAAc,EAAE,CAAC,CAAC,0CAA0C,EAAE;gBAC5D,YAAY,EACV,qEAAqE;aACxE,CAAC,EACF,uBAAuB,EAAE,CAAC,YAAY,EAAE,OAAO,IAAI,CAAC,aAAa,EACjE,qBAAqB,EACnB,YAAY,EAAE,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAE7D,mBAAmB,EACjB,KAAK;gBACH,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK;gBACxB,CAAC,CAAC,CAAC,CAAC,sCAAsC,EAAE;oBACxC,YAAY,EAAE,+CAA+C;iBAC9D,CAAC,EAER,aAAa,EACX,KAAK,CAAC,CAAC,CAAC,CACN,eAAK,SAAS,EAAC,qBAAqB,aAClC,uBAAK,KAAK,CAAC,IAAI,GAAM,EACpB,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,sBAAI,KAAK,CAAC,WAAW,GAAK,CAAC,CAAC,CAAC,IAAI,IAClD,CACP,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAC7C,cAAK,SAAS,EAAC,qBAAqB,YAClC,uBACG,CAAC,CAAC,8BAA8B,EAAE;wBACjC,YAAY,EAAE,0BAA0B;qBACzC,CAAC,GACC,GACD,CACP,CAAC,CAAC,CAAC,IAAI,EAEV,iBAAiB,EACf,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAC3D,KAAC,oBAAoB,KAAG,CACzB,CAAC,CAAC,CAAC,IAAI,IAxDL,KAAK,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CA0D7C,GACE,CACP,CAAC;AACJ,CAAC","sourcesContent":["import {\n insertAgentComposerReference,\n markAgentChatHomeHandoff,\n readChatFirstMode,\n requestAgentTaskOpen,\n} from \"@agent-native/core/client/agent-chat\";\nimport { appBasePath, appPath } from \"@agent-native/core/client/api-path\";\nimport { useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport {\n AgentChatHome,\n type AgentChatHomeProps,\n} from \"@agent-native/toolkit/app/chat/AgentChatHome\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useLocation, useNavigate } from \"react-router\";\n\nimport { ActionQueryError } from \"../../components/action-query-error\";\nimport { DispatchChatHomeApps } from \"../../components/chat-home-apps\";\nimport { useDispatchExtensions } from \"../../components/layout/Layout\";\nimport { Skeleton } from \"../../components/ui/skeleton\";\nimport { submitOverviewPrompt } from \"../../lib/overview-chat\";\n\ninterface WorkspaceAgentResource {\n id: string;\n name: string;\n description: string | null;\n path: string;\n content: string;\n scope: \"all\" | \"selected\";\n updatedAt: number;\n}\n\nfunction chatThreadPath(threadId: string | null, agentPath?: string): string {\n const path = threadId ? `/chat/${encodeURIComponent(threadId)}` : \"/chat\";\n return agentPath ? `${path}?agent=${encodeURIComponent(agentPath)}` : path;\n}\n\nfunction stripBasePath(pathname: string): string {\n const basePath = appBasePath();\n if (!basePath) return pathname;\n if (pathname === basePath) return \"/\";\n if (pathname.startsWith(`${basePath}/`)) {\n return pathname.slice(basePath.length) || \"/\";\n }\n return pathname;\n}\n\nfunction threadIdFromPath(pathname: string): string | null {\n const match = stripBasePath(pathname).match(/^\\/chat\\/([^/]+)/);\n if (!match) return null;\n try {\n const value = decodeURIComponent(match[1]).trim();\n return value || null;\n } catch {\n return null;\n }\n}\n\nfunction dispatchNavTarget(path: string): string {\n if (typeof window === \"undefined\") return path;\n const basePath = appBasePath();\n if (!basePath) return path;\n const pathname = window.location.pathname;\n const routerHasBasename =\n pathname === basePath || pathname.startsWith(`${basePath}/`);\n return routerHasBasename ? path : appPath(path);\n}\n\ninterface DispatchThreadUrlSync {\n routeThreadId: string | null;\n getPath: (threadId: string | null) => string;\n navigate: (path: string, options?: { replace?: boolean }) => void;\n}\n\ninterface DispatchChatLocationState {\n dispatchPrompt?: {\n id?: string | number;\n message?: string;\n selectedModel?: string | null;\n selectedEngine?: string | null;\n selectedEffort?: AgentChatHomeProps[\"selectedEffort\"];\n };\n dispatchThread?: {\n id?: string | number;\n threadId?: string;\n parentThreadId?: string;\n description?: string;\n name?: string;\n };\n}\n\nexport function meta() {\n return [{ title: \"Chat — Dispatch\" }];\n}\n\nexport default function ChatRoute() {\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n const routeThreadId = threadIdFromPath(location.pathname);\n const agentPath = new URLSearchParams(location.search).get(\"agent\");\n const agentsQuery = useActionQuery<WorkspaceAgentResource[]>(\n \"list-workspace-resources\",\n { kind: \"agent\" },\n { enabled: Boolean(agentPath), staleTime: 30_000 },\n );\n const agent = useMemo(\n () =>\n agentPath\n ? (agentsQuery.data ?? []).find((resource) => {\n const profileId = resource.path\n .replace(/^agents\\//, \"\")\n .replace(/\\.md$/, \"\");\n return (\n resource.path === agentPath ||\n resource.id === agentPath ||\n profileId === agentPath\n );\n })\n : undefined,\n [agentPath, agentsQuery.data],\n );\n const agentScope = useMemo(\n () =>\n agent\n ? {\n type: \"agent\",\n id: agent.id,\n label: agent.name,\n contextKey: `dispatch-agent:${agent.id}`,\n }\n : null,\n [agent],\n );\n const handledStateIds = useRef(new Set<string>());\n const extensions = useDispatchExtensions();\n const suppressInlineOpenApp =\n extensions?.chatFirst === true ||\n readChatFirstMode() ||\n new URLSearchParams(location.search).get(\"chatFirst\") === \"1\";\n\n const navigateThreadUrl = useCallback(\n (path: string, options?: { replace?: boolean }) =>\n navigate(dispatchNavTarget(path), options),\n [navigate],\n );\n const threadUrlSync = useMemo<DispatchThreadUrlSync>(\n () => ({\n routeThreadId: routeThreadId ?? null,\n getPath: (threadId) => chatThreadPath(threadId, agentPath ?? undefined),\n navigate: navigateThreadUrl,\n }),\n [agentPath, routeThreadId, navigateThreadUrl],\n );\n const state = location.state as DispatchChatLocationState | null;\n const prompt = state?.dispatchPrompt;\n const thread = state?.dispatchThread;\n const [pendingOverviewPrompt, setPendingOverviewPrompt] = useState<\n DispatchChatLocationState[\"dispatchPrompt\"] | null\n >(null);\n const activePrompt = prompt?.message ? prompt : pendingOverviewPrompt;\n\n useEffect(() => {\n if (routeThreadId) setPendingOverviewPrompt(null);\n }, [routeThreadId]);\n\n useEffect(() => {\n const message = prompt?.message?.trim();\n const threadId = thread?.threadId?.trim();\n if (!message && !threadId) return;\n\n const stateId = String(\n prompt?.id ?? thread?.id ?? `${message ?? \"\"}:${threadId ?? \"\"}`,\n );\n if (handledStateIds.current.has(stateId)) return;\n handledStateIds.current.add(stateId);\n\n const timer = window.setTimeout(() => {\n if (threadId) {\n const parentThreadId = thread?.parentThreadId?.trim();\n if (parentThreadId && parentThreadId !== threadId) {\n requestAgentTaskOpen({\n threadId,\n parentThreadId,\n description: thread?.description,\n name: thread?.name,\n });\n } else {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId },\n }),\n );\n }\n }\n if (message) {\n setPendingOverviewPrompt(prompt ?? null);\n submitOverviewPrompt(message, prompt?.selectedModel, {\n openSidebar: false,\n reuseEmptyTab: true,\n selectedEngine: prompt?.selectedEngine,\n selectedEffort: prompt?.selectedEffort,\n });\n }\n void navigate(`${location.pathname}${location.search}${location.hash}`, {\n replace: true,\n state: null,\n });\n }, 0);\n\n return () => window.clearTimeout(timer);\n }, [\n location.hash,\n location.pathname,\n location.search,\n navigate,\n prompt?.id,\n prompt?.message,\n prompt?.selectedModel,\n prompt?.selectedEngine,\n prompt?.selectedEffort,\n thread?.id,\n thread?.threadId,\n thread?.parentThreadId,\n thread?.description,\n thread?.name,\n ]);\n\n useEffect(() => {\n function handleChatRunning(event: Event) {\n const detail = (event as CustomEvent).detail;\n if (detail?.isRunning === true) markAgentChatHomeHandoff(\"dispatch\");\n }\n\n window.addEventListener(\"agentNative.chatRunning\", handleChatRunning);\n return () =>\n window.removeEventListener(\"agentNative.chatRunning\", handleChatRunning);\n }, []);\n\n useEffect(() => {\n if (!agent) return;\n const timer = window.setTimeout(() => {\n insertAgentComposerReference(\n {\n label: agent.name,\n icon: \"agent\",\n source: \"agent:custom\",\n refType: \"custom-agent\",\n refId: agent.id,\n refPath: agent.path,\n slotKey: \"dispatch-agent\",\n slotLabel: \"Agent\",\n },\n { openSidebar: false },\n );\n }, 0);\n return () => window.clearTimeout(timer);\n }, [agent?.id, agent?.name, agent?.path]);\n\n if (agentPath && agentsQuery.isLoading) {\n return (\n <div className=\"flex h-full min-h-0 flex-col gap-4 bg-background px-4 py-6 sm:px-6\">\n <Skeleton className=\"mx-auto h-6 w-48\" />\n <Skeleton className=\"mx-auto h-12 w-full max-w-2xl\" />\n </div>\n );\n }\n\n if (agentPath && agentsQuery.isError) {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center bg-background px-4\">\n <ActionQueryError\n error={agentsQuery.error}\n onRetry={() => void agentsQuery.refetch()}\n />\n </div>\n );\n }\n\n if (agentPath && !agent) {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center bg-background px-4 text-sm text-muted-foreground\">\n This agent is no longer available.\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-background\">\n <AgentChatHome\n key={agent ? `agent-${agent.id}` : \"dispatch\"}\n className=\"flex-1 min-h-0\"\n contentClassName=\"max-w-none\"\n surfaceClassName=\"dispatch-chat-panel\"\n chatViewTransition\n defaultMode=\"chat\"\n storageKey={agent ? `dispatch-agent-${agent.id}` : \"dispatch\"}\n scope={agentScope}\n threadUrlSync={threadUrlSync}\n showHeader={false}\n showTabBar={false}\n dynamicSuggestions={false}\n suppressInlineOpenApp={suppressInlineOpenApp}\n suggestions={\n agent || routeThreadId || activePrompt?.message\n ? []\n : [\n t(\"dispatch.pages.suggestionWorkspaceHealth\"),\n t(\"dispatch.pages.suggestionOnboardingApp\"),\n t(\"dispatch.pages.suggestionAnalyticsAgents\"),\n ]\n }\n emptyStateText={t(\"dispatch.pages.chatAcrossAppsDescription\", {\n defaultValue:\n \"Route work, inspect status, or create something new from one place.\",\n })}\n centerComposerWhenEmpty={!activePrompt?.message && !routeThreadId}\n composerLayoutVariant={\n activePrompt?.message || routeThreadId ? \"default\" : \"hero\"\n }\n composerPlaceholder={\n agent\n ? `Ask ${agent.name}...`\n : t(\"dispatch.pages.chatPromptPlaceholder\", {\n defaultValue: \"Tell Dispatch what you’d like to make happen…\",\n })\n }\n homeIntroSlot={\n agent ? (\n <div className=\"dispatch-chat-intro\">\n <h1>{agent.name}</h1>\n {agent.description ? <p>{agent.description}</p> : null}\n </div>\n ) : !activePrompt?.message && !routeThreadId ? (\n <div className=\"dispatch-chat-intro\">\n <h1>\n {t(\"dispatch.pages.chatHomeTitle\", {\n defaultValue: \"What should we do today?\",\n })}\n </h1>\n </div>\n ) : null\n }\n afterComposerSlot={\n !agent && !prompt?.message && !threadUrlSync.routeThreadId ? (\n <DispatchChatHomeApps />\n ) : null\n }\n />\n </div>\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/dispatch",
|
|
3
|
-
"version": "0.40.20
|
|
3
|
+
"version": "0.40.20",
|
|
4
4
|
"description": "Dispatch — workspace control plane for agent-native apps. Vault, integrations, destinations, scheduled jobs, and cross-app delegation, shipped as a single drop-in package.",
|
|
5
5
|
"homepage": "https://github.com/BuilderIO/agent-native#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"tailwind-merge": "^3.5.0",
|
|
90
90
|
"vaul": "^1.1.2",
|
|
91
91
|
"zod": "^4.3.6",
|
|
92
|
-
"@agent-native/toolkit": "0.207.0
|
|
92
|
+
"@agent-native/toolkit": "0.207.0"
|
|
93
93
|
},
|
|
94
94
|
"devDependencies": {
|
|
95
95
|
"@react-router/dev": "^8.1.0",
|
|
@@ -103,10 +103,10 @@
|
|
|
103
103
|
"typescript-7": "npm:typescript@^7.0.2",
|
|
104
104
|
"vite": "8.1.0",
|
|
105
105
|
"vitest": "^4.1.5",
|
|
106
|
-
"@agent-native/core": "0.207.0
|
|
106
|
+
"@agent-native/core": "0.207.0"
|
|
107
107
|
},
|
|
108
108
|
"peerDependencies": {
|
|
109
|
-
"@agent-native/core": "0.
|
|
109
|
+
"@agent-native/core": ">=0.198.6",
|
|
110
110
|
"react": ">=19.2.7",
|
|
111
111
|
"react-dom": ">=19.2.7",
|
|
112
112
|
"react-router": ">=8"
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import type { AgentRun } from "@agent-native/core/progress/types";
|
|
1
2
|
import { AgentToggleButton } from "@agent-native/toolkit/app/chat/AgentSidebar";
|
|
2
3
|
import { RunsTray } from "@agent-native/toolkit/app/progress";
|
|
3
4
|
import { IconLayoutSidebar } from "@tabler/icons-react";
|
|
4
5
|
import { useLocation, useNavigate } from "react-router";
|
|
5
6
|
|
|
7
|
+
import { getDispatchRunThreadContext } from "../../lib/dispatch-run-thread.js";
|
|
6
8
|
import { Button } from "../ui/button";
|
|
7
9
|
import { useHeaderTitle, useHeaderActions } from "./HeaderActions";
|
|
8
10
|
|
|
@@ -49,22 +51,16 @@ export function Header({
|
|
|
49
51
|
const title = useHeaderTitle();
|
|
50
52
|
const actions = useHeaderActions();
|
|
51
53
|
|
|
52
|
-
function openRunThread(threadId: string) {
|
|
54
|
+
function openRunThread(threadId: string, run: AgentRun) {
|
|
53
55
|
void navigate("/chat", {
|
|
54
56
|
state: {
|
|
55
57
|
dispatchThread: {
|
|
56
58
|
id: `${Date.now()}-${threadId}`,
|
|
57
59
|
threadId,
|
|
60
|
+
...getDispatchRunThreadContext(threadId, run),
|
|
58
61
|
},
|
|
59
62
|
},
|
|
60
63
|
});
|
|
61
|
-
window.requestAnimationFrame(() => {
|
|
62
|
-
window.dispatchEvent(
|
|
63
|
-
new CustomEvent("agent-chat:open-thread", {
|
|
64
|
-
detail: { threadId },
|
|
65
|
-
}),
|
|
66
|
-
);
|
|
67
|
-
});
|
|
68
64
|
}
|
|
69
65
|
|
|
70
66
|
return (
|
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
import { useActionQuery } from "@agent-native/core/client/hooks";
|
|
42
42
|
import { useT } from "@agent-native/core/client/i18n";
|
|
43
43
|
import { SETTINGS_REDESIGN_FLAG } from "@agent-native/core/feature-flags/registry";
|
|
44
|
+
import type { AgentRun } from "@agent-native/core/progress/types";
|
|
44
45
|
import {
|
|
45
46
|
AgentToggleButton,
|
|
46
47
|
AgentSidebar,
|
|
@@ -101,6 +102,7 @@ import { Link, useLocation, useNavigate } from "react-router";
|
|
|
101
102
|
import { toast } from "sonner";
|
|
102
103
|
|
|
103
104
|
import { useIsMobile } from "../../hooks/use-mobile";
|
|
105
|
+
import { getDispatchRunThreadContext } from "../../lib/dispatch-run-thread.js";
|
|
104
106
|
import {
|
|
105
107
|
filterBuiltInApps,
|
|
106
108
|
type ConnectedAppSummary,
|
|
@@ -2456,22 +2458,16 @@ function DispatchLayout({
|
|
|
2456
2458
|
dispatchNavLinkTarget("/chat"),
|
|
2457
2459
|
);
|
|
2458
2460
|
}
|
|
2459
|
-
function openRunThread(threadId: string) {
|
|
2461
|
+
function openRunThread(threadId: string, run: AgentRun) {
|
|
2460
2462
|
void navigate("/chat", {
|
|
2461
2463
|
state: {
|
|
2462
2464
|
dispatchThread: {
|
|
2463
2465
|
id: `${Date.now()}-${threadId}`,
|
|
2464
2466
|
threadId,
|
|
2467
|
+
...getDispatchRunThreadContext(threadId, run),
|
|
2465
2468
|
},
|
|
2466
2469
|
},
|
|
2467
2470
|
});
|
|
2468
|
-
window.requestAnimationFrame(() => {
|
|
2469
|
-
window.dispatchEvent(
|
|
2470
|
-
new CustomEvent("agent-chat:open-thread", {
|
|
2471
|
-
detail: { threadId },
|
|
2472
|
-
}),
|
|
2473
|
-
);
|
|
2474
|
-
});
|
|
2475
2471
|
}
|
|
2476
2472
|
const sidebarSuggestions = [
|
|
2477
2473
|
t("dispatch.sidebar.suggestionBuildApp"),
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { getDispatchRunThreadContext } from "./dispatch-run-thread.js";
|
|
4
|
+
|
|
5
|
+
describe("getDispatchRunThreadContext", () => {
|
|
6
|
+
it("preserves the parent and task label for Agent Teams runs", () => {
|
|
7
|
+
expect(
|
|
8
|
+
getDispatchRunThreadContext("child-thread", {
|
|
9
|
+
id: "run-1",
|
|
10
|
+
owner: "owner@example.test",
|
|
11
|
+
title: "Review Slides task",
|
|
12
|
+
percent: null,
|
|
13
|
+
status: "running",
|
|
14
|
+
startedAt: "2026-10-11T00:00:00.000Z",
|
|
15
|
+
updatedAt: "2026-10-11T00:00:00.000Z",
|
|
16
|
+
completedAt: null,
|
|
17
|
+
metadata: {
|
|
18
|
+
kind: "agent-team",
|
|
19
|
+
parentThreadId: " parent-thread ",
|
|
20
|
+
description: "Review the Slides task",
|
|
21
|
+
name: "Slides review",
|
|
22
|
+
},
|
|
23
|
+
}),
|
|
24
|
+
).toEqual({
|
|
25
|
+
parentThreadId: "parent-thread",
|
|
26
|
+
description: "Review the Slides task",
|
|
27
|
+
name: "Slides review",
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("does not attach task context to standard or self-parented runs", () => {
|
|
32
|
+
const run = {
|
|
33
|
+
id: "run-1",
|
|
34
|
+
owner: "owner@example.test",
|
|
35
|
+
title: "Build deck",
|
|
36
|
+
percent: null,
|
|
37
|
+
status: "running" as const,
|
|
38
|
+
startedAt: "2026-10-11T00:00:00.000Z",
|
|
39
|
+
updatedAt: "2026-10-11T00:00:00.000Z",
|
|
40
|
+
completedAt: null,
|
|
41
|
+
metadata: { kind: "agent-team", parentThreadId: "same-thread" },
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
expect(
|
|
45
|
+
getDispatchRunThreadContext("child-thread", { ...run, metadata: {} }),
|
|
46
|
+
).toBeUndefined();
|
|
47
|
+
expect(getDispatchRunThreadContext("same-thread", run)).toBeUndefined();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AgentRun } from "@agent-native/core/progress/types";
|
|
2
|
+
|
|
3
|
+
export interface DispatchRunThreadContext {
|
|
4
|
+
parentThreadId: string;
|
|
5
|
+
description: string;
|
|
6
|
+
name: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function getDispatchRunThreadContext(
|
|
10
|
+
threadId: string,
|
|
11
|
+
run: AgentRun,
|
|
12
|
+
): DispatchRunThreadContext | undefined {
|
|
13
|
+
const metadata = run.metadata ?? {};
|
|
14
|
+
const isAgentTeam =
|
|
15
|
+
metadata.kind === "agent-team" || metadata.source === "agent-teams";
|
|
16
|
+
const parentThreadId =
|
|
17
|
+
typeof metadata.parentThreadId === "string"
|
|
18
|
+
? metadata.parentThreadId.trim()
|
|
19
|
+
: "";
|
|
20
|
+
|
|
21
|
+
if (!isAgentTeam || !parentThreadId || parentThreadId === threadId) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
parentThreadId,
|
|
27
|
+
description:
|
|
28
|
+
typeof metadata.description === "string"
|
|
29
|
+
? metadata.description
|
|
30
|
+
: run.title,
|
|
31
|
+
name: typeof metadata.name === "string" ? metadata.name : "",
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -9,6 +9,7 @@ import ChatRoute from "./chat";
|
|
|
9
9
|
const clientState = vi.hoisted(() => ({
|
|
10
10
|
surfaceProps: null as Record<string, unknown> | null,
|
|
11
11
|
openWorkspaceApp: vi.fn(),
|
|
12
|
+
requestAgentTaskOpen: vi.fn(),
|
|
12
13
|
workspaceApps: [
|
|
13
14
|
{
|
|
14
15
|
id: "content",
|
|
@@ -39,6 +40,7 @@ vi.mock("@agent-native/core/client/agent-chat", () => ({
|
|
|
39
40
|
path: string,
|
|
40
41
|
) => navigate(path),
|
|
41
42
|
sendToAgentChat: vi.fn(),
|
|
43
|
+
requestAgentTaskOpen: clientState.requestAgentTaskOpen,
|
|
42
44
|
}));
|
|
43
45
|
|
|
44
46
|
vi.mock("@agent-native/toolkit/app/chat/AgentChatHome", () => ({
|
|
@@ -122,6 +124,7 @@ describe("Dispatch ChatRoute", () => {
|
|
|
122
124
|
clientState.surfaceProps = null;
|
|
123
125
|
clientState.agents = [];
|
|
124
126
|
clientState.openWorkspaceApp.mockReset();
|
|
127
|
+
clientState.requestAgentTaskOpen.mockReset();
|
|
125
128
|
clientState.retryWorkspaceApps.mockReset();
|
|
126
129
|
clientState.workspaceAppsError = null;
|
|
127
130
|
clientState.workspaceApps = [
|
|
@@ -170,6 +173,43 @@ describe("Dispatch ChatRoute", () => {
|
|
|
170
173
|
expect(clientState.surfaceProps?.afterComposerSlot).toBeTruthy();
|
|
171
174
|
});
|
|
172
175
|
|
|
176
|
+
it("opens a Dispatch run with its Agent Teams parent context", async () => {
|
|
177
|
+
await act(async () => {
|
|
178
|
+
root.render(
|
|
179
|
+
<MemoryRouter
|
|
180
|
+
initialEntries={[
|
|
181
|
+
{
|
|
182
|
+
pathname: "/chat",
|
|
183
|
+
state: {
|
|
184
|
+
dispatchThread: {
|
|
185
|
+
id: "run-open-1",
|
|
186
|
+
threadId: "child-thread",
|
|
187
|
+
parentThreadId: "parent-thread",
|
|
188
|
+
description: "Review the Slides task",
|
|
189
|
+
name: "Slides review",
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
]}
|
|
194
|
+
>
|
|
195
|
+
<ChatRoute />
|
|
196
|
+
</MemoryRouter>,
|
|
197
|
+
);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
await act(async () => {
|
|
201
|
+
await vi.advanceTimersByTimeAsync(1);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
expect(clientState.requestAgentTaskOpen).toHaveBeenCalledOnce();
|
|
205
|
+
expect(clientState.requestAgentTaskOpen).toHaveBeenCalledWith({
|
|
206
|
+
threadId: "child-thread",
|
|
207
|
+
parentThreadId: "parent-thread",
|
|
208
|
+
description: "Review the Slides task",
|
|
209
|
+
name: "Slides review",
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
|
|
173
213
|
it("renders the colored app directory below the empty chat composer", async () => {
|
|
174
214
|
await act(async () => {
|
|
175
215
|
root.render(
|
|
@@ -2,6 +2,7 @@ import {
|
|
|
2
2
|
insertAgentComposerReference,
|
|
3
3
|
markAgentChatHomeHandoff,
|
|
4
4
|
readChatFirstMode,
|
|
5
|
+
requestAgentTaskOpen,
|
|
5
6
|
} from "@agent-native/core/client/agent-chat";
|
|
6
7
|
import { appBasePath, appPath } from "@agent-native/core/client/api-path";
|
|
7
8
|
import { useActionQuery } from "@agent-native/core/client/hooks";
|
|
@@ -82,6 +83,9 @@ interface DispatchChatLocationState {
|
|
|
82
83
|
dispatchThread?: {
|
|
83
84
|
id?: string | number;
|
|
84
85
|
threadId?: string;
|
|
86
|
+
parentThreadId?: string;
|
|
87
|
+
description?: string;
|
|
88
|
+
name?: string;
|
|
85
89
|
};
|
|
86
90
|
}
|
|
87
91
|
|
|
@@ -173,11 +177,21 @@ export default function ChatRoute() {
|
|
|
173
177
|
|
|
174
178
|
const timer = window.setTimeout(() => {
|
|
175
179
|
if (threadId) {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
180
|
+
const parentThreadId = thread?.parentThreadId?.trim();
|
|
181
|
+
if (parentThreadId && parentThreadId !== threadId) {
|
|
182
|
+
requestAgentTaskOpen({
|
|
183
|
+
threadId,
|
|
184
|
+
parentThreadId,
|
|
185
|
+
description: thread?.description,
|
|
186
|
+
name: thread?.name,
|
|
187
|
+
});
|
|
188
|
+
} else {
|
|
189
|
+
window.dispatchEvent(
|
|
190
|
+
new CustomEvent("agent-chat:open-thread", {
|
|
191
|
+
detail: { threadId },
|
|
192
|
+
}),
|
|
193
|
+
);
|
|
194
|
+
}
|
|
181
195
|
}
|
|
182
196
|
if (message) {
|
|
183
197
|
setPendingOverviewPrompt(prompt ?? null);
|
|
@@ -207,6 +221,9 @@ export default function ChatRoute() {
|
|
|
207
221
|
prompt?.selectedEffort,
|
|
208
222
|
thread?.id,
|
|
209
223
|
thread?.threadId,
|
|
224
|
+
thread?.parentThreadId,
|
|
225
|
+
thread?.description,
|
|
226
|
+
thread?.name,
|
|
210
227
|
]);
|
|
211
228
|
|
|
212
229
|
useEffect(() => {
|