@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.
Files changed (165) hide show
  1. package/dist/actions/provider-api-register.d.ts +12 -12
  2. package/dist/components/admin-navigation.d.ts.map +1 -1
  3. package/dist/components/admin-navigation.js +21 -5
  4. package/dist/components/admin-navigation.js.map +1 -1
  5. package/dist/components/agents-panel.d.ts.map +1 -1
  6. package/dist/components/agents-panel.js +7 -2
  7. package/dist/components/agents-panel.js.map +1 -1
  8. package/dist/components/app-list-row.d.ts +1 -1
  9. package/dist/components/app-list-row.d.ts.map +1 -1
  10. package/dist/components/app-list-row.js +1 -1
  11. package/dist/components/app-list-row.js.map +1 -1
  12. package/dist/components/app-open-actions.d.ts +1 -17
  13. package/dist/components/app-open-actions.d.ts.map +1 -1
  14. package/dist/components/app-open-actions.js +1 -20
  15. package/dist/components/app-open-actions.js.map +1 -1
  16. package/dist/components/app-row-settings.d.ts +6 -0
  17. package/dist/components/app-row-settings.d.ts.map +1 -0
  18. package/dist/components/app-row-settings.js +11 -0
  19. package/dist/components/app-row-settings.js.map +1 -0
  20. package/dist/components/automation-run-history-dialog.d.ts.map +1 -1
  21. package/dist/components/automation-run-history-dialog.js +3 -2
  22. package/dist/components/automation-run-history-dialog.js.map +1 -1
  23. package/dist/components/connected-app-card.d.ts.map +1 -1
  24. package/dist/components/connected-app-card.js +1 -1
  25. package/dist/components/connected-app-card.js.map +1 -1
  26. package/dist/components/create-app-popover.js +2 -2
  27. package/dist/components/create-app-popover.js.map +1 -1
  28. package/dist/components/dispatch-control-plane.d.ts.map +1 -1
  29. package/dist/components/dispatch-control-plane.js +23 -7
  30. package/dist/components/dispatch-control-plane.js.map +1 -1
  31. package/dist/components/dispatch-shell.d.ts.map +1 -1
  32. package/dist/components/dispatch-shell.js +5 -1
  33. package/dist/components/dispatch-shell.js.map +1 -1
  34. package/dist/components/docs-link.d.ts +16 -0
  35. package/dist/components/docs-link.d.ts.map +1 -0
  36. package/dist/components/docs-link.js +34 -0
  37. package/dist/components/docs-link.js.map +1 -0
  38. package/dist/components/layout/Layout.d.ts +1 -0
  39. package/dist/components/layout/Layout.d.ts.map +1 -1
  40. package/dist/components/layout/Layout.js +37 -28
  41. package/dist/components/layout/Layout.js.map +1 -1
  42. package/dist/components/messaging-setup-panel.d.ts.map +1 -1
  43. package/dist/components/messaging-setup-panel.js +3 -2
  44. package/dist/components/messaging-setup-panel.js.map +1 -1
  45. package/dist/components/usage-alerts-panel.d.ts +11 -0
  46. package/dist/components/usage-alerts-panel.d.ts.map +1 -0
  47. package/dist/components/usage-alerts-panel.js +125 -0
  48. package/dist/components/usage-alerts-panel.js.map +1 -0
  49. package/dist/components/workspace-app-card.d.ts +3 -1
  50. package/dist/components/workspace-app-card.d.ts.map +1 -1
  51. package/dist/components/workspace-app-card.js +70 -29
  52. package/dist/components/workspace-app-card.js.map +1 -1
  53. package/dist/components/workspace-app-search.d.ts +10 -0
  54. package/dist/components/workspace-app-search.d.ts.map +1 -0
  55. package/dist/components/workspace-app-search.js +27 -0
  56. package/dist/components/workspace-app-search.js.map +1 -0
  57. package/dist/components/workspace-resource-effective-stack.d.ts.map +1 -1
  58. package/dist/components/workspace-resource-effective-stack.js +3 -2
  59. package/dist/components/workspace-resource-effective-stack.js.map +1 -1
  60. package/dist/components/workspace-template-card.d.ts.map +1 -1
  61. package/dist/components/workspace-template-card.js +2 -1
  62. package/dist/components/workspace-template-card.js.map +1 -1
  63. package/dist/lib/workspace-app-layout.d.ts +19 -0
  64. package/dist/lib/workspace-app-layout.d.ts.map +1 -0
  65. package/dist/lib/workspace-app-layout.js +75 -0
  66. package/dist/lib/workspace-app-layout.js.map +1 -0
  67. package/dist/lib/workspace-apps.d.ts +10 -0
  68. package/dist/lib/workspace-apps.d.ts.map +1 -1
  69. package/dist/lib/workspace-apps.js +59 -0
  70. package/dist/lib/workspace-apps.js.map +1 -1
  71. package/dist/lib/workspace-apps.test.js +18 -1
  72. package/dist/lib/workspace-apps.test.js.map +1 -1
  73. package/dist/routes/pages/$appId.d.ts.map +1 -1
  74. package/dist/routes/pages/$appId.js +4 -2
  75. package/dist/routes/pages/$appId.js.map +1 -1
  76. package/dist/routes/pages/agents.d.ts.map +1 -1
  77. package/dist/routes/pages/agents.js +2 -3
  78. package/dist/routes/pages/agents.js.map +1 -1
  79. package/dist/routes/pages/apps.$appId.d.ts.map +1 -1
  80. package/dist/routes/pages/apps.$appId.js +8 -3
  81. package/dist/routes/pages/apps.$appId.js.map +1 -1
  82. package/dist/routes/pages/apps.d.ts.map +1 -1
  83. package/dist/routes/pages/apps.js +31 -16
  84. package/dist/routes/pages/apps.js.map +1 -1
  85. package/dist/routes/pages/audit.d.ts.map +1 -1
  86. package/dist/routes/pages/audit.js +2 -1
  87. package/dist/routes/pages/audit.js.map +1 -1
  88. package/dist/routes/pages/dreams.d.ts.map +1 -1
  89. package/dist/routes/pages/dreams.js +14 -18
  90. package/dist/routes/pages/dreams.js.map +1 -1
  91. package/dist/routes/pages/integrations.d.ts.map +1 -1
  92. package/dist/routes/pages/integrations.js +51 -14
  93. package/dist/routes/pages/integrations.js.map +1 -1
  94. package/dist/routes/pages/metrics.d.ts.map +1 -1
  95. package/dist/routes/pages/metrics.js +4 -1
  96. package/dist/routes/pages/metrics.js.map +1 -1
  97. package/dist/routes/pages/operations.js +1 -1
  98. package/dist/routes/pages/operations.js.map +1 -1
  99. package/dist/routes/pages/settings.d.ts.map +1 -1
  100. package/dist/routes/pages/settings.js +7 -2
  101. package/dist/routes/pages/settings.js.map +1 -1
  102. package/dist/routes/pages/thread-debug.d.ts.map +1 -1
  103. package/dist/routes/pages/thread-debug.js +5 -8
  104. package/dist/routes/pages/thread-debug.js.map +1 -1
  105. package/dist/routes/pages/vault.d.ts.map +1 -1
  106. package/dist/routes/pages/vault.js +1 -1
  107. package/dist/routes/pages/vault.js.map +1 -1
  108. package/dist/routes/pages/workspace.d.ts.map +1 -1
  109. package/dist/routes/pages/workspace.js +13 -10
  110. package/dist/routes/pages/workspace.js.map +1 -1
  111. package/dist/server/index.d.ts.map +1 -1
  112. package/dist/server/index.js +3 -0
  113. package/dist/server/index.js.map +1 -1
  114. package/dist/server/lib/app-creation-store.d.ts.map +1 -1
  115. package/dist/server/lib/app-creation-store.js +12 -52
  116. package/dist/server/lib/app-creation-store.js.map +1 -1
  117. package/dist/shared/app-roles.d.ts +9 -0
  118. package/dist/shared/app-roles.d.ts.map +1 -0
  119. package/dist/shared/app-roles.js +7 -0
  120. package/dist/shared/app-roles.js.map +1 -0
  121. package/package.json +4 -3
  122. package/src/components/admin-navigation.tsx +57 -11
  123. package/src/components/agents-panel.tsx +54 -29
  124. package/src/components/app-list-row.tsx +1 -2
  125. package/src/components/app-open-actions.tsx +5 -114
  126. package/src/components/app-row-settings.tsx +54 -0
  127. package/src/components/automation-run-history-dialog.tsx +8 -4
  128. package/src/components/connected-app-card.tsx +0 -1
  129. package/src/components/create-app-popover.spec.tsx +1 -1
  130. package/src/components/create-app-popover.tsx +2 -2
  131. package/src/components/dispatch-control-plane.spec.tsx +36 -2
  132. package/src/components/dispatch-control-plane.tsx +83 -27
  133. package/src/components/dispatch-shell.tsx +7 -1
  134. package/src/components/docs-link.tsx +52 -0
  135. package/src/components/layout/Layout.spec.tsx +10 -0
  136. package/src/components/layout/Layout.tsx +50 -23
  137. package/src/components/messaging-setup-panel.tsx +10 -3
  138. package/src/components/usage-alerts-panel.tsx +445 -0
  139. package/src/components/workspace-app-card.spec.tsx +130 -9
  140. package/src/components/workspace-app-card.tsx +128 -71
  141. package/src/components/workspace-app-search.tsx +96 -0
  142. package/src/components/workspace-resource-effective-stack.tsx +10 -5
  143. package/src/components/workspace-template-card.spec.tsx +52 -23
  144. package/src/components/workspace-template-card.tsx +7 -10
  145. package/src/lib/workspace-app-layout.spec.ts +47 -0
  146. package/src/lib/workspace-app-layout.ts +121 -0
  147. package/src/lib/workspace-apps.test.ts +45 -1
  148. package/src/lib/workspace-apps.ts +72 -0
  149. package/src/routes/pages/$appId.tsx +3 -6
  150. package/src/routes/pages/agents.tsx +6 -3
  151. package/src/routes/pages/apps.$appId.tsx +6 -6
  152. package/src/routes/pages/apps.tsx +116 -62
  153. package/src/routes/pages/audit.tsx +28 -8
  154. package/src/routes/pages/dreams.tsx +92 -142
  155. package/src/routes/pages/integrations.tsx +147 -68
  156. package/src/routes/pages/metrics.tsx +8 -0
  157. package/src/routes/pages/operations.tsx +2 -2
  158. package/src/routes/pages/settings.tsx +14 -9
  159. package/src/routes/pages/thread-debug.tsx +18 -36
  160. package/src/routes/pages/vault.tsx +7 -2
  161. package/src/routes/pages/workspace.tsx +92 -56
  162. package/src/server/index.ts +4 -0
  163. package/src/server/lib/app-creation-store.spec.ts +90 -43
  164. package/src/server/lib/app-creation-store.ts +15 -61
  165. 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;AAGrD,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,eAAe,CACb,eAAK,SAAS,EAAC,iCAAiC,aAC9C,aAAI,SAAS,EAAC,+DAA+D,YAC1E,KAAK,GACH,EACJ,WAAW,CAAC,CAAC,CAAC,CACb,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\";\n\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 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 {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"]}
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":"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"}
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, 15), [activeThreadId, threads]);
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: cn("min-w-0", chatFirstMode && "px-2") }))] }));
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 = localPathname.startsWith("/apps/");
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: chatFirstEmbedError
1212
- ? "error"
1213
- : chatFirstEmbedUrl
1214
- ? "ready"
1220
+ return (_jsx(ChatFirstAppPane, { app: app, status: chatFirstEmbedUrl
1221
+ ? "ready"
1222
+ : chatFirstEmbedError
1223
+ ? "error"
1215
1224
  : chatFirstAppsQuery.isLoading
1216
1225
  ? "loading"
1217
1226
  : app