@agent-native/dispatch 0.24.0 → 0.24.3
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/dist/actions/provider-api-register.d.ts +12 -12
- package/dist/components/admin-navigation.d.ts.map +1 -1
- package/dist/components/admin-navigation.js +21 -5
- package/dist/components/admin-navigation.js.map +1 -1
- package/dist/components/agents-panel.d.ts.map +1 -1
- package/dist/components/agents-panel.js +7 -2
- package/dist/components/agents-panel.js.map +1 -1
- package/dist/components/app-list-row.d.ts +1 -1
- package/dist/components/app-list-row.d.ts.map +1 -1
- package/dist/components/app-list-row.js +1 -1
- package/dist/components/app-list-row.js.map +1 -1
- package/dist/components/app-open-actions.d.ts +1 -17
- package/dist/components/app-open-actions.d.ts.map +1 -1
- package/dist/components/app-open-actions.js +1 -20
- package/dist/components/app-open-actions.js.map +1 -1
- package/dist/components/app-row-settings.d.ts +6 -0
- package/dist/components/app-row-settings.d.ts.map +1 -0
- package/dist/components/app-row-settings.js +11 -0
- package/dist/components/app-row-settings.js.map +1 -0
- package/dist/components/automation-run-history-dialog.d.ts.map +1 -1
- package/dist/components/automation-run-history-dialog.js +3 -2
- package/dist/components/automation-run-history-dialog.js.map +1 -1
- package/dist/components/connected-app-card.d.ts.map +1 -1
- package/dist/components/connected-app-card.js +1 -1
- package/dist/components/connected-app-card.js.map +1 -1
- package/dist/components/create-app-popover.js +2 -2
- package/dist/components/create-app-popover.js.map +1 -1
- package/dist/components/dispatch-control-plane.d.ts.map +1 -1
- package/dist/components/dispatch-control-plane.js +23 -7
- package/dist/components/dispatch-control-plane.js.map +1 -1
- package/dist/components/dispatch-shell.d.ts.map +1 -1
- package/dist/components/dispatch-shell.js +5 -1
- package/dist/components/dispatch-shell.js.map +1 -1
- package/dist/components/docs-link.d.ts +16 -0
- package/dist/components/docs-link.d.ts.map +1 -0
- package/dist/components/docs-link.js +34 -0
- package/dist/components/docs-link.js.map +1 -0
- package/dist/components/layout/Layout.d.ts +1 -0
- package/dist/components/layout/Layout.d.ts.map +1 -1
- package/dist/components/layout/Layout.js +37 -28
- package/dist/components/layout/Layout.js.map +1 -1
- package/dist/components/messaging-setup-panel.d.ts.map +1 -1
- package/dist/components/messaging-setup-panel.js +3 -2
- package/dist/components/messaging-setup-panel.js.map +1 -1
- package/dist/components/usage-alerts-panel.d.ts +11 -0
- package/dist/components/usage-alerts-panel.d.ts.map +1 -0
- package/dist/components/usage-alerts-panel.js +125 -0
- package/dist/components/usage-alerts-panel.js.map +1 -0
- package/dist/components/workspace-app-card.d.ts +3 -1
- package/dist/components/workspace-app-card.d.ts.map +1 -1
- package/dist/components/workspace-app-card.js +70 -29
- package/dist/components/workspace-app-card.js.map +1 -1
- package/dist/components/workspace-app-search.d.ts +10 -0
- package/dist/components/workspace-app-search.d.ts.map +1 -0
- package/dist/components/workspace-app-search.js +27 -0
- package/dist/components/workspace-app-search.js.map +1 -0
- package/dist/components/workspace-resource-effective-stack.d.ts.map +1 -1
- package/dist/components/workspace-resource-effective-stack.js +3 -2
- package/dist/components/workspace-resource-effective-stack.js.map +1 -1
- package/dist/components/workspace-template-card.d.ts.map +1 -1
- package/dist/components/workspace-template-card.js +2 -1
- package/dist/components/workspace-template-card.js.map +1 -1
- package/dist/lib/workspace-app-layout.d.ts +19 -0
- package/dist/lib/workspace-app-layout.d.ts.map +1 -0
- package/dist/lib/workspace-app-layout.js +75 -0
- package/dist/lib/workspace-app-layout.js.map +1 -0
- package/dist/lib/workspace-apps.d.ts +10 -0
- package/dist/lib/workspace-apps.d.ts.map +1 -1
- package/dist/lib/workspace-apps.js +59 -0
- package/dist/lib/workspace-apps.js.map +1 -1
- package/dist/lib/workspace-apps.test.js +18 -1
- package/dist/lib/workspace-apps.test.js.map +1 -1
- package/dist/routes/pages/$appId.d.ts.map +1 -1
- package/dist/routes/pages/$appId.js +4 -2
- package/dist/routes/pages/$appId.js.map +1 -1
- package/dist/routes/pages/agents.d.ts.map +1 -1
- package/dist/routes/pages/agents.js +2 -3
- package/dist/routes/pages/agents.js.map +1 -1
- package/dist/routes/pages/apps.$appId.d.ts.map +1 -1
- package/dist/routes/pages/apps.$appId.js +8 -3
- package/dist/routes/pages/apps.$appId.js.map +1 -1
- package/dist/routes/pages/apps.d.ts.map +1 -1
- package/dist/routes/pages/apps.js +31 -16
- package/dist/routes/pages/apps.js.map +1 -1
- package/dist/routes/pages/audit.d.ts.map +1 -1
- package/dist/routes/pages/audit.js +2 -1
- package/dist/routes/pages/audit.js.map +1 -1
- package/dist/routes/pages/dreams.d.ts.map +1 -1
- package/dist/routes/pages/dreams.js +14 -18
- package/dist/routes/pages/dreams.js.map +1 -1
- package/dist/routes/pages/integrations.d.ts.map +1 -1
- package/dist/routes/pages/integrations.js +51 -14
- package/dist/routes/pages/integrations.js.map +1 -1
- package/dist/routes/pages/metrics.d.ts.map +1 -1
- package/dist/routes/pages/metrics.js +4 -1
- package/dist/routes/pages/metrics.js.map +1 -1
- package/dist/routes/pages/operations.js +1 -1
- package/dist/routes/pages/operations.js.map +1 -1
- package/dist/routes/pages/settings.d.ts.map +1 -1
- package/dist/routes/pages/settings.js +7 -2
- package/dist/routes/pages/settings.js.map +1 -1
- package/dist/routes/pages/thread-debug.d.ts.map +1 -1
- package/dist/routes/pages/thread-debug.js +5 -8
- package/dist/routes/pages/thread-debug.js.map +1 -1
- package/dist/routes/pages/vault.d.ts.map +1 -1
- package/dist/routes/pages/vault.js +1 -1
- package/dist/routes/pages/vault.js.map +1 -1
- package/dist/routes/pages/workspace.d.ts.map +1 -1
- package/dist/routes/pages/workspace.js +13 -10
- package/dist/routes/pages/workspace.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/app-creation-store.d.ts.map +1 -1
- package/dist/server/lib/app-creation-store.js +12 -52
- package/dist/server/lib/app-creation-store.js.map +1 -1
- package/dist/shared/app-roles.d.ts +9 -0
- package/dist/shared/app-roles.d.ts.map +1 -0
- package/dist/shared/app-roles.js +7 -0
- package/dist/shared/app-roles.js.map +1 -0
- package/package.json +4 -3
- package/src/components/admin-navigation.tsx +57 -11
- package/src/components/agents-panel.tsx +54 -29
- package/src/components/app-list-row.tsx +1 -2
- package/src/components/app-open-actions.tsx +5 -114
- package/src/components/app-row-settings.tsx +54 -0
- package/src/components/automation-run-history-dialog.tsx +8 -4
- package/src/components/connected-app-card.tsx +0 -1
- package/src/components/create-app-popover.spec.tsx +1 -1
- package/src/components/create-app-popover.tsx +2 -2
- package/src/components/dispatch-control-plane.spec.tsx +36 -2
- package/src/components/dispatch-control-plane.tsx +83 -27
- package/src/components/dispatch-shell.tsx +7 -1
- package/src/components/docs-link.tsx +52 -0
- package/src/components/layout/Layout.spec.tsx +10 -0
- package/src/components/layout/Layout.tsx +50 -23
- package/src/components/messaging-setup-panel.tsx +10 -3
- package/src/components/usage-alerts-panel.tsx +445 -0
- package/src/components/workspace-app-card.spec.tsx +130 -9
- package/src/components/workspace-app-card.tsx +128 -71
- package/src/components/workspace-app-search.tsx +96 -0
- package/src/components/workspace-resource-effective-stack.tsx +10 -5
- package/src/components/workspace-template-card.spec.tsx +52 -23
- package/src/components/workspace-template-card.tsx +7 -10
- package/src/lib/workspace-app-layout.spec.ts +47 -0
- package/src/lib/workspace-app-layout.ts +121 -0
- package/src/lib/workspace-apps.test.ts +45 -1
- package/src/lib/workspace-apps.ts +72 -0
- package/src/routes/pages/$appId.tsx +3 -6
- package/src/routes/pages/agents.tsx +6 -3
- package/src/routes/pages/apps.$appId.tsx +6 -6
- package/src/routes/pages/apps.tsx +116 -62
- package/src/routes/pages/audit.tsx +28 -8
- package/src/routes/pages/dreams.tsx +92 -142
- package/src/routes/pages/integrations.tsx +147 -68
- package/src/routes/pages/metrics.tsx +8 -0
- package/src/routes/pages/operations.tsx +2 -2
- package/src/routes/pages/settings.tsx +14 -9
- package/src/routes/pages/thread-debug.tsx +18 -36
- package/src/routes/pages/vault.tsx +7 -2
- package/src/routes/pages/workspace.tsx +92 -56
- package/src/server/index.ts +4 -0
- package/src/server/lib/app-creation-store.spec.ts +90 -43
- package/src/server/lib/app-creation-store.ts +15 -61
- package/src/shared/app-roles.ts +8 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch-shell.js","sourceRoot":"","sources":["../../src/components/dispatch-shell.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatch-shell.js","sourceRoot":"","sources":["../../src/components/dispatch-shell.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,QAAQ,GAKT;IACC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5D,eAAe,CACb,eAAK,SAAS,EAAC,iCAAiC,aAC9C,aAAI,SAAS,EAAC,+DAA+D,YAC1E,KAAK,GACH,EACJ,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,QAAQ,IAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,KAAK,gBAAgB,GAAI,CACnE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAChB,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,0IAA0I,gBACxI,CAAC,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,CAAC,YAEtD,KAAC,cAAc,IAAC,SAAS,EAAC,aAAa,GAAG,GACnC,GACM,EACjB,KAAC,cAAc,IACb,IAAI,EAAC,QAAQ,EACb,KAAK,EAAC,OAAO,EACb,SAAS,EAAC,kCAAkC,YAE3C,WAAW,GACG,IACT,CACX,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;IAEF,OAAO,4BAAG,QAAQ,GAAI,CAAC;AACzB,CAAC","sourcesContent":["import { useT } from \"@agent-native/core/client/i18n\";\nimport { IconInfoCircle } from \"@tabler/icons-react\";\nimport { type ReactNode } from \"react\";\nimport { useLocation } from \"react-router\";\n\nimport { dispatchDocsHrefForPath, DocsLink } from \"./docs-link\";\nimport { useSetPageTitle } from \"./layout/HeaderActions\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./ui/popover\";\n\n/**\n * DispatchShell renders the per-page title (with an optional click-to-open\n * description popover) into the global header via the HeaderActions store.\n * The actual chrome (sidebar, AgentSidebar, header bar with AgentToggleButton)\n * is provided by `Layout` mounted in `root.tsx`.\n */\nexport function DispatchShell({\n title,\n description,\n children,\n}: {\n title: string;\n description?: string;\n children: ReactNode;\n}) {\n const t = useT();\n const location = useLocation();\n const docsHref = dispatchDocsHrefForPath(location.pathname);\n useSetPageTitle(\n <div className=\"flex items-center gap-2 min-w-0\">\n <h1 className=\"text-lg font-semibold tracking-tight truncate text-foreground\">\n {title}\n </h1>\n {docsHref ? (\n <DocsLink href={docsHref} label={`Open ${title} documentation`} />\n ) : description ? (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground/70 hover:bg-accent hover:text-foreground cursor-pointer\"\n aria-label={t(\"dispatch.sidebar.aboutPage\", { title })}\n >\n <IconInfoCircle className=\"h-3.5 w-3.5\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n side=\"bottom\"\n align=\"start\"\n className=\"max-w-72 text-xs leading-relaxed\"\n >\n {description}\n </PopoverContent>\n </Popover>\n ) : null}\n </div>,\n );\n\n return <>{children}</>;\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const DISPATCH_DOCS: {
|
|
2
|
+
readonly dispatch: "https://agent-native.com/docs/dispatch#what-it-does";
|
|
3
|
+
readonly workspace: "https://agent-native.com/docs/agent-resources#global-resources";
|
|
4
|
+
readonly integrations: "https://agent-native.com/docs/dispatch#secret-vault";
|
|
5
|
+
readonly audit: "https://agent-native.com/docs/audit-log";
|
|
6
|
+
readonly threadDebug: "https://agent-native.com/docs/dispatch#reliability";
|
|
7
|
+
readonly dreams: "https://agent-native.com/docs/dispatch#dreams";
|
|
8
|
+
readonly settings: "https://agent-native.com/docs/agent-surfaces";
|
|
9
|
+
};
|
|
10
|
+
export declare function dispatchDocsHrefForPath(pathname: string): string | undefined;
|
|
11
|
+
export declare function DocsLink({ href, label, className, }: {
|
|
12
|
+
href: string;
|
|
13
|
+
label: string;
|
|
14
|
+
className?: string;
|
|
15
|
+
}): import("node_modules/@types/react").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=docs-link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-link.d.ts","sourceRoot":"","sources":["../../src/components/docs-link.tsx"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa;aACxB,QAAQ,EAAE,qDAAqD;aAC/D,SAAS,EAAE,gEAAgE;aAC3E,YAAY,EAAE,qDAAqD;aACnE,KAAK,EAAE,yCAAyC;aAChD,WAAW,EAAE,oDAAoD;aACjE,MAAM,EAAE,+CAA+C;aACvD,QAAQ,EAAE,8CAA8C;CAChD,CAAC;AAEX,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAW5E;AAED,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,KAAK,EACL,SAAS,GACV,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,mDAgBA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { IconHelpCircle } from "@tabler/icons-react";
|
|
3
|
+
import { cn } from "../lib/utils.js";
|
|
4
|
+
export const DISPATCH_DOCS = {
|
|
5
|
+
dispatch: "https://agent-native.com/docs/dispatch#what-it-does",
|
|
6
|
+
workspace: "https://agent-native.com/docs/agent-resources#global-resources",
|
|
7
|
+
integrations: "https://agent-native.com/docs/dispatch#secret-vault",
|
|
8
|
+
audit: "https://agent-native.com/docs/audit-log",
|
|
9
|
+
threadDebug: "https://agent-native.com/docs/dispatch#reliability",
|
|
10
|
+
dreams: "https://agent-native.com/docs/dispatch#dreams",
|
|
11
|
+
settings: "https://agent-native.com/docs/agent-surfaces",
|
|
12
|
+
};
|
|
13
|
+
export function dispatchDocsHrefForPath(pathname) {
|
|
14
|
+
if (pathname === "/admin/workspace")
|
|
15
|
+
return DISPATCH_DOCS.workspace;
|
|
16
|
+
if (pathname === "/admin/integrations")
|
|
17
|
+
return DISPATCH_DOCS.integrations;
|
|
18
|
+
if (pathname === "/admin/audit")
|
|
19
|
+
return DISPATCH_DOCS.audit;
|
|
20
|
+
if (pathname === "/admin/thread-debug")
|
|
21
|
+
return DISPATCH_DOCS.threadDebug;
|
|
22
|
+
if (pathname === "/admin/dreams")
|
|
23
|
+
return DISPATCH_DOCS.dreams;
|
|
24
|
+
if (pathname.startsWith("/admin/"))
|
|
25
|
+
return DISPATCH_DOCS.dispatch;
|
|
26
|
+
if (pathname === "/settings" || pathname.startsWith("/settings/")) {
|
|
27
|
+
return DISPATCH_DOCS.settings;
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
export function DocsLink({ href, label, className, }) {
|
|
32
|
+
return (_jsx("a", { href: href, target: "_blank", rel: "noopener noreferrer", "aria-label": label, title: label, className: cn("inline-flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground/70 transition-colors hover:bg-accent/60 hover:text-foreground", className), children: _jsx(IconHelpCircle, { className: "size-3" }) }));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=docs-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-link.js","sourceRoot":"","sources":["../../src/components/docs-link.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,QAAQ,EAAE,qDAAqD;IAC/D,SAAS,EAAE,gEAAgE;IAC3E,YAAY,EAAE,qDAAqD;IACnE,KAAK,EAAE,yCAAyC;IAChD,WAAW,EAAE,oDAAoD;IACjE,MAAM,EAAE,+CAA+C;IACvD,QAAQ,EAAE,8CAA8C;CAChD,CAAC;AAEX,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,IAAI,QAAQ,KAAK,kBAAkB;QAAE,OAAO,aAAa,CAAC,SAAS,CAAC;IACpE,IAAI,QAAQ,KAAK,qBAAqB;QAAE,OAAO,aAAa,CAAC,YAAY,CAAC;IAC1E,IAAI,QAAQ,KAAK,cAAc;QAAE,OAAO,aAAa,CAAC,KAAK,CAAC;IAC5D,IAAI,QAAQ,KAAK,qBAAqB;QAAE,OAAO,aAAa,CAAC,WAAW,CAAC;IACzE,IAAI,QAAQ,KAAK,eAAe;QAAE,OAAO,aAAa,CAAC,MAAM,CAAC;IAC9D,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,aAAa,CAAC,QAAQ,CAAC;IAClE,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAClE,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EACvB,IAAI,EACJ,KAAK,EACL,SAAS,GAKV;IACC,OAAO,CACL,YACE,IAAI,EAAE,IAAI,EACV,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,gBACb,KAAK,EACjB,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,EAAE,CACX,wJAAwJ,EACxJ,SAAS,CACV,YAED,KAAC,cAAc,IAAC,SAAS,EAAC,QAAQ,GAAG,GACnC,CACL,CAAC;AACJ,CAAC","sourcesContent":["import { IconHelpCircle } from \"@tabler/icons-react\";\n\nimport { cn } from \"../lib/utils\";\n\nexport const DISPATCH_DOCS = {\n dispatch: \"https://agent-native.com/docs/dispatch#what-it-does\",\n workspace: \"https://agent-native.com/docs/agent-resources#global-resources\",\n integrations: \"https://agent-native.com/docs/dispatch#secret-vault\",\n audit: \"https://agent-native.com/docs/audit-log\",\n threadDebug: \"https://agent-native.com/docs/dispatch#reliability\",\n dreams: \"https://agent-native.com/docs/dispatch#dreams\",\n settings: \"https://agent-native.com/docs/agent-surfaces\",\n} as const;\n\nexport function dispatchDocsHrefForPath(pathname: string): string | undefined {\n if (pathname === \"/admin/workspace\") return DISPATCH_DOCS.workspace;\n if (pathname === \"/admin/integrations\") return DISPATCH_DOCS.integrations;\n if (pathname === \"/admin/audit\") return DISPATCH_DOCS.audit;\n if (pathname === \"/admin/thread-debug\") return DISPATCH_DOCS.threadDebug;\n if (pathname === \"/admin/dreams\") return DISPATCH_DOCS.dreams;\n if (pathname.startsWith(\"/admin/\")) return DISPATCH_DOCS.dispatch;\n if (pathname === \"/settings\" || pathname.startsWith(\"/settings/\")) {\n return DISPATCH_DOCS.settings;\n }\n return undefined;\n}\n\nexport function DocsLink({\n href,\n label,\n className,\n}: {\n href: string;\n label: string;\n className?: string;\n}) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={label}\n title={label}\n className={cn(\n \"inline-flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground/70 transition-colors hover:bg-accent/60 hover:text-foreground\",\n className,\n )}\n >\n <IconHelpCircle className=\"size-3\" />\n </a>\n );\n}\n"]}
|
|
@@ -37,6 +37,7 @@ interface ChatFirstEmbedSessionInput {
|
|
|
37
37
|
export declare function buildChatFirstEmbedSessionInput(appId: string, path: string): ChatFirstEmbedSessionInput;
|
|
38
38
|
export declare function useDispatchExtensions(): DispatchExtensionConfig | undefined;
|
|
39
39
|
export declare function isElectronEmbeddedSearch(search: string): boolean;
|
|
40
|
+
export declare function shouldAutoCollapseDispatchSidebar(pathname: string): boolean;
|
|
40
41
|
export declare function formatThreadAge(updatedAt: number, now?: number): string;
|
|
41
42
|
export declare function NavContent({ onNavigate, extensions, chatFirstMode, chatFirstEmbedded, collapsed, collapsible, onCollapsedChange, chatFirstAppLayout, onChatFirstAppLayoutChange, chatFirstApps, chatFirstAppsLoading, chatFirstAppsError, chatFirstActiveAppId, chatFirstActivePrimaryTab, onChatFirstNewChat, onChatFirstAppOpen, onChatFirstAppsRetry, }: {
|
|
42
43
|
onNavigate?: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAuBL,KAAK,4BAA4B,EAYlC,MAAM,sCAAsC,CAAC;AAM9C,OAAO,EAaL,KAAK,gBAAgB,EAGrB,KAAK,mBAAmB,EACzB,MAAM,sCAAsC,CAAC;AAgC9C,OAAO,EAQL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ import { Link, useLocation, useNavigate } from "react-router";
|
|
|
17
17
|
import { toast } from "sonner";
|
|
18
18
|
import { isEmbedSessionExpiredMessage } from "../../lib/embed-session-recovery.js";
|
|
19
19
|
import { cn } from "../../lib/utils.js";
|
|
20
|
-
import { isDispatchWorkspaceAppId, isWorkspaceAppVisibleInDefaultLaunchers, mergeChatFirstWorkspaceApps, workspaceAppIdFromRoute, workspaceAppRoute, } from "../../lib/workspace-apps.js";
|
|
20
|
+
import { isDispatchWorkspaceAppId, isWorkspaceAppVisibleInDefaultLaunchers, mergeChatFirstWorkspaceApps, workspaceAppDirectHref, workspaceAppIdFromRoute, workspaceAppRoute, } from "../../lib/workspace-apps.js";
|
|
21
21
|
import { AppIcon } from "../app-icon.js";
|
|
22
22
|
import { CreateAppPopover } from "../create-app-popover.js";
|
|
23
23
|
import { Sheet, SheetContent, SheetDescription, SheetTitle } from "../ui/sheet.js";
|
|
@@ -119,6 +119,9 @@ function localDispatchPath(pathname) {
|
|
|
119
119
|
export function isElectronEmbeddedSearch(search) {
|
|
120
120
|
return new URLSearchParams(search).get("electron") === "1";
|
|
121
121
|
}
|
|
122
|
+
export function shouldAutoCollapseDispatchSidebar(pathname) {
|
|
123
|
+
return localDispatchPath(pathname).startsWith("/apps/");
|
|
124
|
+
}
|
|
122
125
|
function chatFirstPrimaryTabForPath(pathname) {
|
|
123
126
|
if (pathname === "/chat" || pathname.startsWith("/chat/")) {
|
|
124
127
|
return "new-chat";
|
|
@@ -330,17 +333,6 @@ export function formatThreadAge(updatedAt, now = Date.now()) {
|
|
|
330
333
|
function threadTitle(thread, fallback) {
|
|
331
334
|
return thread.title || thread.preview || fallback;
|
|
332
335
|
}
|
|
333
|
-
function readChatHistoryIncludesExternal() {
|
|
334
|
-
if (typeof window === "undefined")
|
|
335
|
-
return false;
|
|
336
|
-
try {
|
|
337
|
-
return localStorage.getItem(CHAT_HISTORY_SOURCE_KEY) === "all";
|
|
338
|
-
}
|
|
339
|
-
catch {
|
|
340
|
-
// coercion-ok: localStorage is optional browser persistence.
|
|
341
|
-
return false;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
336
|
function threadSourceIcon(platform) {
|
|
345
337
|
const normalized = platform?.trim().toLowerCase();
|
|
346
338
|
if (!normalized)
|
|
@@ -353,6 +345,17 @@ function threadSourceIcon(platform) {
|
|
|
353
345
|
}
|
|
354
346
|
return _jsx(IconWorld, { size: 13, "aria-hidden": "true" });
|
|
355
347
|
}
|
|
348
|
+
function readChatHistoryIncludesExternal() {
|
|
349
|
+
if (typeof window === "undefined")
|
|
350
|
+
return false;
|
|
351
|
+
try {
|
|
352
|
+
return localStorage.getItem(CHAT_HISTORY_SOURCE_KEY) === "all";
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
// coercion-ok: localStorage is optional browser persistence.
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
356
359
|
function threadUpdatedAt(thread) {
|
|
357
360
|
return Number.isFinite(thread.updatedAt)
|
|
358
361
|
? thread.updatedAt
|
|
@@ -368,14 +371,14 @@ function DispatchChatsSection({ onNavigate, showNewChat = false, prelude, chatFi
|
|
|
368
371
|
const [includeExternal, setIncludeExternal] = useState(false);
|
|
369
372
|
const [historyPreferenceReady, setHistoryPreferenceReady] = useState(false);
|
|
370
373
|
const historyModeRef = useRef(includeExternal);
|
|
371
|
-
const { threads, activeThreadId, isLoading: chatsLoading, createThread, switchThread, renameThread, refreshThreads, } = useChatThreads(undefined, "dispatch", undefined, {
|
|
374
|
+
const { threads, activeThreadId, isLoading: chatsLoading, threadsLoadError, createThread, switchThread, renameThread, refreshThreads, } = useChatThreads(undefined, "dispatch", undefined, {
|
|
372
375
|
autoCreate: false,
|
|
373
376
|
includeExternal,
|
|
374
377
|
});
|
|
375
378
|
const visibleThreads = useMemo(() => threads
|
|
376
379
|
.filter((thread) => thread.messageCount > 0 || thread.id === activeThreadId)
|
|
377
380
|
.sort((a, b) => threadUpdatedAt(b) - threadUpdatedAt(a))
|
|
378
|
-
.slice(0,
|
|
381
|
+
.slice(0, 8), [activeThreadId, threads]);
|
|
379
382
|
const localPathname = localDispatchPath(location.pathname);
|
|
380
383
|
const displayedActiveThreadId = threadIdFromPath(localPathname) ??
|
|
381
384
|
(localPathname === "/chat" ? null : activeThreadId);
|
|
@@ -395,6 +398,7 @@ function DispatchChatsSection({ onNavigate, showNewChat = false, prelude, chatFi
|
|
|
395
398
|
: formatThreadAge(threadUpdatedAt(thread)),
|
|
396
399
|
};
|
|
397
400
|
});
|
|
401
|
+
const chatHistoryError = threadsLoadError ? (_jsxs("button", { type: "button", onClick: () => void refreshThreads(), className: "flex w-full items-center justify-between gap-2 rounded-md px-2 py-1.5 text-xs text-sidebar-foreground/65 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", children: [_jsx("span", { children: "Could not load chats" }), _jsx("span", { className: "font-medium", children: "Retry" })] })) : undefined;
|
|
398
402
|
useEffect(() => {
|
|
399
403
|
setIncludeExternal(readChatHistoryIncludesExternal());
|
|
400
404
|
setHistoryPreferenceReady(true);
|
|
@@ -460,7 +464,7 @@ function DispatchChatsSection({ onNavigate, showNewChat = false, prelude, chatFi
|
|
|
460
464
|
}) })] }) })) : null, !chatFirstMode &&
|
|
461
465
|
chatsLoading &&
|
|
462
466
|
visibleThreads.length === 0 &&
|
|
463
|
-
Array.from({ length: 3 }).map((_, index) => (_jsxs("div", { className: "flex items-center gap-2 px-3 py-1", children: [_jsx(Skeleton, { className: "size-3.5 shrink-0 rounded-sm" }), _jsx(Skeleton, { className: "h-3 w-3/4 rounded" })] }, `chat-skeleton-${index}`))), chatFirstMode && (chatsLoading || visibleThreads.length > 0) ? (_jsx(ChatFirstChatHistory, { items: chatItems, activeId: displayedActiveThreadId, loading: chatsLoading && visibleThreads.length === 0, loadingLabel: _jsx("div", { className: "space-y-1 px-2 py-1", children: [0, 1, 2].map((index) => (_jsxs("div", { className: "flex items-center gap-2 px-1 py-1", children: [_jsx(Skeleton, { className: "size-3.5 shrink-0 rounded-sm" }), _jsx(Skeleton, { className: "h-3 w-3/4 rounded" })] }, index))) }), label: t("dispatch.sidebar.chats", { defaultValue: "Chats" }), onSelect: (threadId) => openThread(threadId), renameMaxLength: 160, onRename: (threadId, title) => void renameThread(threadId, title), labels: {
|
|
467
|
+
Array.from({ length: 3 }).map((_, index) => (_jsxs("div", { className: "flex items-center gap-2 px-3 py-1", children: [_jsx(Skeleton, { className: "size-3.5 shrink-0 rounded-sm" }), _jsx(Skeleton, { className: "h-3 w-3/4 rounded" })] }, `chat-skeleton-${index}`))), chatFirstMode && (chatsLoading || visibleThreads.length > 0) ? (_jsx(ChatFirstChatHistory, { items: chatItems, activeId: displayedActiveThreadId, loading: chatsLoading && visibleThreads.length === 0, loadingLabel: _jsx("div", { className: "space-y-1 px-2 py-1", children: [0, 1, 2].map((index) => (_jsxs("div", { className: "flex items-center gap-2 px-1 py-1", children: [_jsx(Skeleton, { className: "size-3.5 shrink-0 rounded-sm" }), _jsx(Skeleton, { className: "h-3 w-3/4 rounded" })] }, index))) }), label: t("dispatch.sidebar.chats", { defaultValue: "Chats" }), error: chatHistoryError, onSelect: (threadId) => openThread(threadId), renameMaxLength: 160, onRename: (threadId, title) => void renameThread(threadId, title), labels: {
|
|
464
468
|
options: (item) => t("dispatch.sidebar.chatOptions", {
|
|
465
469
|
title: item.titleText ?? "",
|
|
466
470
|
}),
|
|
@@ -487,7 +491,7 @@ function DispatchChatsSection({ onNavigate, showNewChat = false, prelude, chatFi
|
|
|
487
491
|
newChat: t("dispatch.sidebar.newChat"),
|
|
488
492
|
showMore: t("dispatch.sidebar.chats"),
|
|
489
493
|
showLess: t("dispatch.sidebar.chats"),
|
|
490
|
-
}, renameMaxLength: 160, onRename: (threadId, title) => void renameThread(threadId, title), labels: {
|
|
494
|
+
}, error: chatHistoryError, renameMaxLength: 160, onRename: (threadId, title) => void renameThread(threadId, title), labels: {
|
|
491
495
|
options: (item) => t("dispatch.sidebar.chatOptions", {
|
|
492
496
|
title: item.titleText ?? "",
|
|
493
497
|
}),
|
|
@@ -510,7 +514,7 @@ function DispatchChatsSection({ onNavigate, showNewChat = false, prelude, chatFi
|
|
|
510
514
|
kind: "agent-chat",
|
|
511
515
|
sourceSessionId: displayedActiveThreadId ?? undefined,
|
|
512
516
|
});
|
|
513
|
-
}, children: [_jsx(IconEye, { size: 13, strokeWidth: 1.8 }), _jsx("span", { children: "Watch and message session" })] })) : null] })), className:
|
|
517
|
+
}, children: [_jsx(IconEye, { size: 13, strokeWidth: 1.8 }), _jsx("span", { children: "Watch and message session" })] })) : null] })), className: "min-w-0 px-2" }))] }));
|
|
514
518
|
}
|
|
515
519
|
export function NavContent({ onNavigate, extensions, chatFirstMode = false, chatFirstEmbedded = false, collapsed = false, collapsible = false, onCollapsedChange, chatFirstAppLayout, onChatFirstAppLayoutChange, chatFirstApps = [], chatFirstAppsLoading = false, chatFirstAppsError, chatFirstActiveAppId, chatFirstActivePrimaryTab, onChatFirstNewChat, onChatFirstAppOpen, onChatFirstAppsRetry, }) {
|
|
516
520
|
const t = useT();
|
|
@@ -617,7 +621,7 @@ export function Layout({ children, extensions, agentPageHref, }) {
|
|
|
617
621
|
: false);
|
|
618
622
|
const isChatRoute = localPathname === "/chat" || localPathname.startsWith("/chat/");
|
|
619
623
|
const chatFirstSurfaceScope = threadIdFromPath(localPathname) ?? "new";
|
|
620
|
-
const isWorkspaceAppRoute =
|
|
624
|
+
const isWorkspaceAppRoute = shouldAutoCollapseDispatchSidebar(location.pathname);
|
|
621
625
|
const isWorkspaceAppHostRoute = isWorkspaceAppRoute &&
|
|
622
626
|
typeof window !== "undefined" &&
|
|
623
627
|
new URLSearchParams(window.location.search).get("embedded") === "1";
|
|
@@ -635,12 +639,6 @@ export function Layout({ children, extensions, agentPageHref, }) {
|
|
|
635
639
|
url.searchParams.set("electron", "1");
|
|
636
640
|
window.history.replaceState(window.history.state, "", `${url.pathname}${url.search}${url.hash}`);
|
|
637
641
|
}, [electronEmbedded, location.pathname, location.search]);
|
|
638
|
-
useEffect(() => {
|
|
639
|
-
if (!chatFirstMode || chatFirstEmbedded || localPathname !== "/overview") {
|
|
640
|
-
return;
|
|
641
|
-
}
|
|
642
|
-
navigate(dispatchNavLinkTarget("/chat"), { replace: true });
|
|
643
|
-
}, [chatFirstEmbedded, chatFirstMode, localPathname, navigate]);
|
|
644
642
|
const [chatFirstAppLayout, setChatFirstAppLayout] = useState(() => readChatFirstAppLayout());
|
|
645
643
|
const chatFirstAppLayoutHydratedRef = useRef(false);
|
|
646
644
|
const chatFirstAppsQuery = useActionQuery("list-workspace-apps", { includeAgentCards: false }, { enabled: chatFirstMode });
|
|
@@ -762,6 +760,11 @@ export function Layout({ children, extensions, agentPageHref, }) {
|
|
|
762
760
|
})
|
|
763
761
|
.catch((cause) => {
|
|
764
762
|
if (!cancelled) {
|
|
763
|
+
const directAppUrl = activeChatFirstAppRegistration
|
|
764
|
+
? workspaceAppDirectHref(activeChatFirstAppRegistration, chatFirstEmbedPath)
|
|
765
|
+
: null;
|
|
766
|
+
if (directAppUrl)
|
|
767
|
+
setChatFirstEmbedUrl(directAppUrl);
|
|
765
768
|
setChatFirstEmbedError(cause instanceof Error
|
|
766
769
|
? cause.message
|
|
767
770
|
: chatFirstCopy("appUnavailable"));
|
|
@@ -811,6 +814,7 @@ export function Layout({ children, extensions, agentPageHref, }) {
|
|
|
811
814
|
const openChatFirstPane = useCallback((pane, placement = "side") => {
|
|
812
815
|
if (placement === "side" && !chatFirstHasActiveChat)
|
|
813
816
|
return;
|
|
817
|
+
setSidebarCollapsed(true);
|
|
814
818
|
setChatFirstNotice(null);
|
|
815
819
|
closeChatFirstSessionWatch();
|
|
816
820
|
if (!isChatRoute) {
|
|
@@ -1135,6 +1139,11 @@ export function Layout({ children, extensions, agentPageHref, }) {
|
|
|
1135
1139
|
chatFirstSurfaceTabsStore,
|
|
1136
1140
|
isChatRoute,
|
|
1137
1141
|
]);
|
|
1142
|
+
useEffect(() => {
|
|
1143
|
+
if (!isWorkspaceAppRoute)
|
|
1144
|
+
return;
|
|
1145
|
+
setSidebarCollapsed(true);
|
|
1146
|
+
}, [isWorkspaceAppRoute, localPathname]);
|
|
1138
1147
|
useEffect(() => {
|
|
1139
1148
|
if (typeof window === "undefined" || isWorkspaceAppHostRoute)
|
|
1140
1149
|
return;
|
|
@@ -1208,10 +1217,10 @@ export function Layout({ children, extensions, agentPageHref, }) {
|
|
|
1208
1217
|
name: registration.name ?? registration.id,
|
|
1209
1218
|
}
|
|
1210
1219
|
: null;
|
|
1211
|
-
return (_jsx(ChatFirstAppPane, { app: app, status:
|
|
1212
|
-
? "
|
|
1213
|
-
:
|
|
1214
|
-
? "
|
|
1220
|
+
return (_jsx(ChatFirstAppPane, { app: app, status: chatFirstEmbedUrl
|
|
1221
|
+
? "ready"
|
|
1222
|
+
: chatFirstEmbedError
|
|
1223
|
+
? "error"
|
|
1215
1224
|
: chatFirstAppsQuery.isLoading
|
|
1216
1225
|
? "loading"
|
|
1217
1226
|
: app
|