@agent-native/dispatch 0.27.17 → 0.27.21

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 (31) hide show
  1. package/dist/actions/create_workspace_app_embed_session.d.ts.map +1 -1
  2. package/dist/actions/create_workspace_app_embed_session.js +9 -1
  3. package/dist/actions/create_workspace_app_embed_session.js.map +1 -1
  4. package/dist/actions/provider-api-register.d.ts +2 -2
  5. package/dist/actions/view-screen.js +50 -1
  6. package/dist/actions/view-screen.js.map +1 -1
  7. package/dist/components/layout/Layout.d.ts.map +1 -1
  8. package/dist/components/layout/Layout.js +1 -1
  9. package/dist/components/layout/Layout.js.map +1 -1
  10. package/dist/hooks/use-navigation-state.d.ts +2 -0
  11. package/dist/hooks/use-navigation-state.d.ts.map +1 -1
  12. package/dist/hooks/use-navigation-state.js +18 -0
  13. package/dist/hooks/use-navigation-state.js.map +1 -1
  14. package/dist/shared/chat-first-pane.d.ts +8 -0
  15. package/dist/shared/chat-first-pane.d.ts.map +1 -0
  16. package/dist/shared/chat-first-pane.js +8 -0
  17. package/dist/shared/chat-first-pane.js.map +1 -0
  18. package/dist/shared/feature-flags.d.ts +2 -2
  19. package/dist/shared/feature-flags.d.ts.map +1 -1
  20. package/dist/shared/feature-flags.js +1 -1
  21. package/dist/shared/feature-flags.js.map +1 -1
  22. package/package.json +2 -2
  23. package/src/actions/create_workspace_app_embed_session.spec.ts +12 -0
  24. package/src/actions/create_workspace_app_embed_session.ts +11 -1
  25. package/src/actions/view-screen.spec.ts +93 -1
  26. package/src/actions/view-screen.ts +74 -1
  27. package/src/components/layout/Layout.tsx +1 -1
  28. package/src/hooks/use-navigation-state.spec.ts +33 -0
  29. package/src/hooks/use-navigation-state.ts +28 -1
  30. package/src/shared/chat-first-pane.ts +7 -0
  31. package/src/shared/feature-flags.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"create_workspace_app_embed_session.d.ts","sourceRoot":"","sources":["../../src/actions/create_workspace_app_embed_session.ts"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,OAAO,GAAG,SAAS,GAC3B,OAAO,CAAC,IAAI,CAAC,CAuCf"}
1
+ {"version":3,"file":"create_workspace_app_embed_session.d.ts","sourceRoot":"","sources":["../../src/actions/create_workspace_app_embed_session.ts"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,OAAO,GAAG,SAAS,GAC3B,OAAO,CAAC,IAAI,CAAC,CAiDf"}
@@ -18,8 +18,16 @@ export async function assertWorkspaceEmbedSessionCaller(headers) {
18
18
  if (!headers)
19
19
  return;
20
20
  const fetchSite = headers.get("sec-fetch-site")?.trim().toLowerCase();
21
+ // Electron's Chromium fetch adds Sec-Fetch-Site even for the native broker's
22
+ // server request. The custom header is not sendable by a cross-origin page
23
+ // without a successful CORS preflight, so it is the native CSRF marker.
24
+ if (fetchSite &&
25
+ fetchSite !== "same-origin" &&
26
+ headers.get("x-agent-native-csrf")?.trim() === "1") {
27
+ return;
28
+ }
21
29
  // Browsers always send Sec-Fetch-Site and page scripts cannot forge or strip
22
- // this forbidden header. Native clients do not send it and authenticate
30
+ // this forbidden header. Native clients without fetch metadata authenticate
23
31
  // through the normal action request context below.
24
32
  if (!fetchSite)
25
33
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"create_workspace_app_embed_session.js","sourceRoot":"","sources":["../../src/actions/create_workspace_app_embed_session.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineAction } from \"@agent-native/core\";\nimport { getRequestContext } from \"@agent-native/core/server\";\nimport { z } from \"zod\";\n\nimport { listWorkspaceApps } from \"../server/lib/app-creation-store.js\";\nimport { createWorkspaceSsoEmbedSession } from \"../server/lib/mcp-gateway.js\";\n\nfunction isPathWithinApp(pathname: string, appPath: string): boolean {\n const normalized = appPath.replace(/\\/+$/, \"\") || \"/\";\n return normalized === \"/\"\n ? pathname.startsWith(\"/\")\n : pathname === normalized || pathname.startsWith(`${normalized}/`);\n}\n\n/**\n * Browser callers must come from the Dispatch parent surface. Native callers\n * carry the parent bearer explicitly; direct in-process action calls have no\n * request headers and are already inside the server authorization boundary.\n */\nexport async function assertWorkspaceEmbedSessionCaller(\n headers: Headers | undefined,\n): Promise<void> {\n if (!headers) return;\n\n const fetchSite = headers.get(\"sec-fetch-site\")?.trim().toLowerCase();\n // Browsers always send Sec-Fetch-Site and page scripts cannot forge or strip\n // this forbidden header. Native clients do not send it and authenticate\n // through the normal action request context below.\n if (!fetchSite) return;\n if (fetchSite !== \"same-origin\") {\n throw new Error(\"Workspace app sessions must be requested by Dispatch.\");\n }\n\n const referer = headers.get(\"referer\");\n const requestOrigin = getRequestContext()?.requestOrigin;\n if (!referer || !requestOrigin) {\n throw new Error(\"Workspace app sessions must be requested by Dispatch.\");\n }\n\n let refererUrl: URL;\n try {\n refererUrl = new URL(referer);\n } catch {\n throw new Error(\"Workspace app sessions must be requested by Dispatch.\");\n }\n if (refererUrl.origin !== requestOrigin) {\n throw new Error(\"Workspace app sessions must be requested by Dispatch.\");\n }\n const apps = await listWorkspaceApps({\n includeAgentCards: false,\n audience: \"all\",\n });\n if (\n apps.some(\n (app) =>\n !app.isDispatch && isPathWithinApp(refererUrl.pathname, app.path),\n )\n ) {\n throw new Error(\"Workspace apps cannot mint sessions for themselves.\");\n }\n}\n\nexport default defineAction({\n description:\n \"Create a one-time app-scoped embed session for a workspace app opened inside Dispatch. This browser-only path is rollout-gated and never exposes an app's reusable session to another app.\",\n schema: z.object({\n app: z\n .string()\n .optional()\n .describe(\"Workspace app id when path is app-relative.\"),\n url: z\n .string()\n .optional()\n .describe(\"Absolute app URL or app-relative path.\"),\n path: z\n .string()\n .optional()\n .describe(\"App-relative path. Requires app when url is not provided.\"),\n chrome: z\n .enum([\"full\", \"minimal\"])\n .optional()\n .describe(\"Embed chrome preference. Defaults to full.\"),\n }),\n readOnly: false,\n parallelSafe: false,\n agentTool: false,\n toolCallable: false,\n run: async (args, context) => {\n await assertWorkspaceEmbedSessionCaller(context?.requestHeaders);\n return createWorkspaceSsoEmbedSession(args);\n },\n});\n"]}
1
+ {"version":3,"file":"create_workspace_app_embed_session.js","sourceRoot":"","sources":["../../src/actions/create_workspace_app_embed_session.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineAction } from \"@agent-native/core\";\nimport { getRequestContext } from \"@agent-native/core/server\";\nimport { z } from \"zod\";\n\nimport { listWorkspaceApps } from \"../server/lib/app-creation-store.js\";\nimport { createWorkspaceSsoEmbedSession } from \"../server/lib/mcp-gateway.js\";\n\nfunction isPathWithinApp(pathname: string, appPath: string): boolean {\n const normalized = appPath.replace(/\\/+$/, \"\") || \"/\";\n return normalized === \"/\"\n ? pathname.startsWith(\"/\")\n : pathname === normalized || pathname.startsWith(`${normalized}/`);\n}\n\n/**\n * Browser callers must come from the Dispatch parent surface. Native callers\n * carry the parent bearer explicitly; direct in-process action calls have no\n * request headers and are already inside the server authorization boundary.\n */\nexport async function assertWorkspaceEmbedSessionCaller(\n headers: Headers | undefined,\n): Promise<void> {\n if (!headers) return;\n\n const fetchSite = headers.get(\"sec-fetch-site\")?.trim().toLowerCase();\n // Electron's Chromium fetch adds Sec-Fetch-Site even for the native broker's\n // server request. The custom header is not sendable by a cross-origin page\n // without a successful CORS preflight, so it is the native CSRF marker.\n if (\n fetchSite &&\n fetchSite !== \"same-origin\" &&\n headers.get(\"x-agent-native-csrf\")?.trim() === \"1\"\n ) {\n return;\n }\n // Browsers always send Sec-Fetch-Site and page scripts cannot forge or strip\n // this forbidden header. Native clients without fetch metadata authenticate\n // through the normal action request context below.\n if (!fetchSite) return;\n if (fetchSite !== \"same-origin\") {\n throw new Error(\"Workspace app sessions must be requested by Dispatch.\");\n }\n\n const referer = headers.get(\"referer\");\n const requestOrigin = getRequestContext()?.requestOrigin;\n if (!referer || !requestOrigin) {\n throw new Error(\"Workspace app sessions must be requested by Dispatch.\");\n }\n\n let refererUrl: URL;\n try {\n refererUrl = new URL(referer);\n } catch {\n throw new Error(\"Workspace app sessions must be requested by Dispatch.\");\n }\n if (refererUrl.origin !== requestOrigin) {\n throw new Error(\"Workspace app sessions must be requested by Dispatch.\");\n }\n const apps = await listWorkspaceApps({\n includeAgentCards: false,\n audience: \"all\",\n });\n if (\n apps.some(\n (app) =>\n !app.isDispatch && isPathWithinApp(refererUrl.pathname, app.path),\n )\n ) {\n throw new Error(\"Workspace apps cannot mint sessions for themselves.\");\n }\n}\n\nexport default defineAction({\n description:\n \"Create a one-time app-scoped embed session for a workspace app opened inside Dispatch. This browser-only path is rollout-gated and never exposes an app's reusable session to another app.\",\n schema: z.object({\n app: z\n .string()\n .optional()\n .describe(\"Workspace app id when path is app-relative.\"),\n url: z\n .string()\n .optional()\n .describe(\"Absolute app URL or app-relative path.\"),\n path: z\n .string()\n .optional()\n .describe(\"App-relative path. Requires app when url is not provided.\"),\n chrome: z\n .enum([\"full\", \"minimal\"])\n .optional()\n .describe(\"Embed chrome preference. Defaults to full.\"),\n }),\n readOnly: false,\n parallelSafe: false,\n agentTool: false,\n toolCallable: false,\n run: async (args, context) => {\n await assertWorkspaceEmbedSessionCaller(context?.requestHeaders);\n return createWorkspaceSsoEmbedSession(args);\n },\n});\n"]}
@@ -47,8 +47,8 @@ declare const _default: import("node_modules/@agent-native/core/dist").ActionDef
47
47
  notes?: string | undefined;
48
48
  scope?: "org" | "user" | undefined;
49
49
  }, {
50
- message?: undefined;
51
50
  id?: undefined;
51
+ message?: undefined;
52
52
  deleted?: undefined;
53
53
  providers: {
54
54
  id: string;
@@ -65,9 +65,9 @@ declare const _default: import("node_modules/@agent-native/core/dist").ActionDef
65
65
  registered?: undefined;
66
66
  label?: undefined;
67
67
  } | {
68
+ id?: undefined;
68
69
  message?: undefined;
69
70
  count?: undefined;
70
- id?: undefined;
71
71
  deleted?: undefined;
72
72
  providers?: undefined;
73
73
  found: boolean;
@@ -15,6 +15,7 @@ import { getAgentThreadDebug, listAgentRunFailures, listThreadDebugSources, sear
15
15
  import { listDispatchUsageMetrics } from "../server/lib/usage-metrics-store.js";
16
16
  import { listVaultOverview, listSecretOptions, listGrants, listRequests, getVaultAccessSettings, canManageVault, } from "../server/lib/vault-store.js";
17
17
  import { listWorkspaceResourceOptions, listWorkspaceResourcesForApp, } from "../server/lib/workspace-resources-store.js";
18
+ import { CHAT_FIRST_PANE_STATE_KEY } from "../shared/chat-first-pane.js";
18
19
  async function runLocalDispatchAction(name, args) {
19
20
  const modulePath = `./${name}.js`;
20
21
  const module = (await import(/* @vite-ignore */ modulePath));
@@ -37,8 +38,52 @@ function threadDebugFailureStatus(value) {
37
38
  ? value
38
39
  : "all";
39
40
  }
41
+ async function resolveEmbeddedApp(navigation) {
42
+ if (navigation?.view === "workspace-app") {
43
+ const id = typeof navigation.workspaceAppId === "string"
44
+ ? navigation.workspaceAppId.trim()
45
+ : "";
46
+ if (!id) {
47
+ return {
48
+ status: "unknown",
49
+ source: "route",
50
+ reason: `The route ${navigation.path ?? "/apps/…"} embeds a workspace app, but its id could not be read from the URL.`,
51
+ };
52
+ }
53
+ return {
54
+ status: "open",
55
+ id,
56
+ path: typeof navigation.workspaceAppPath === "string"
57
+ ? navigation.workspaceAppPath
58
+ : "/",
59
+ source: "route",
60
+ };
61
+ }
62
+ // Chat-first mode keeps the route on /chat and opens the app as a surface
63
+ // tab, so the pane state is the only place the open app is named.
64
+ if (navigation?.view !== "chat")
65
+ return null;
66
+ const pane = await readAppState(CHAT_FIRST_PANE_STATE_KEY);
67
+ if (pane === null)
68
+ return null;
69
+ const appId = typeof pane.appId === "string" ? pane.appId.trim() : "";
70
+ if (!appId) {
71
+ return {
72
+ status: "unknown",
73
+ source: "chat-first-pane",
74
+ reason: "A chat-first app pane is recorded, but its stored state does not name an app.",
75
+ };
76
+ }
77
+ return {
78
+ status: "open",
79
+ id: appId,
80
+ path: typeof pane.path === "string" && pane.path ? pane.path : "/",
81
+ ...(typeof pane.view === "string" && pane.view ? { view: pane.view } : {}),
82
+ source: "chat-first-pane",
83
+ };
84
+ }
40
85
  export default defineAction({
41
- description: "See what the user is currently looking at in the dispatch UI, including navigation state and a compact operational summary.",
86
+ description: "See what the user is currently looking at in the dispatch UI, including navigation state, any embedded workspace app, and a compact operational summary.",
42
87
  schema: z.object({}),
43
88
  http: false,
44
89
  run: async () => {
@@ -53,6 +98,9 @@ export default defineAction({
53
98
  };
54
99
  if (navigation)
55
100
  screen.navigation = navigation;
101
+ const embeddedApp = await resolveEmbeddedApp(navigation);
102
+ if (embeddedApp)
103
+ screen.embeddedApp = embeddedApp;
56
104
  if (navigation?.view === "chat" || navigation?.view === "browser-chat") {
57
105
  screen.chatSurface = {
58
106
  view: navigation.view === "browser-chat"
@@ -105,6 +153,7 @@ export default defineAction({
105
153
  if (navigation?.view === "overview" ||
106
154
  navigation?.view === "metrics" ||
107
155
  navigation?.view === "apps" ||
156
+ navigation?.view === "workspace-app" ||
108
157
  navigation?.view === "new-app") {
109
158
  const workspaceApps = await listWorkspaceApps({
110
159
  includeAgentCards: true,
@@ -1 +1 @@
1
- {"version":3,"file":"view-screen.js","sourceRoot":"","sources":["../../src/actions/view-screen.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * See what the user is currently looking at on screen.\n *\n * Reads and returns the current navigation state from application state.\n *\n * Usage:\n * pnpm action view-screen\n */\n\nimport { defineAction } from \"@agent-native/core\";\nimport { readAppState } from \"@agent-native/core/application-state\";\nimport { z } from \"zod\";\n\nimport { listWorkspaceApps } from \"../server/lib/app-creation-store.js\";\nimport { listOverview } from \"../server/lib/dispatch-store.js\";\nimport {\n getAgentThreadDebug,\n listAgentRunFailures,\n listThreadDebugSources,\n searchAgentThreads,\n} from \"../server/lib/thread-debug-store.js\";\nimport { listDispatchUsageMetrics } from \"../server/lib/usage-metrics-store.js\";\nimport {\n listVaultOverview,\n listSecretOptions,\n listGrants,\n listRequests,\n getVaultAccessSettings,\n canManageVault,\n} from \"../server/lib/vault-store.js\";\nimport {\n listWorkspaceResourceOptions,\n listWorkspaceResourcesForApp,\n} from \"../server/lib/workspace-resources-store.js\";\n\nasync function runLocalDispatchAction(\n name: string,\n args: Record<string, unknown>,\n) {\n const modulePath = `./${name}.js`;\n const module = (await import(/* @vite-ignore */ modulePath)) as {\n default?: {\n run: (args: Record<string, unknown>) => unknown | Promise<unknown>;\n };\n };\n if (!module.default) throw new Error(`Dispatch action not found: ${name}`);\n return module.default.run(stripUndefined(args));\n}\n\nfunction stripUndefined(args: Record<string, unknown>) {\n return Object.fromEntries(\n Object.entries(args).filter(([, value]) => value !== undefined),\n );\n}\n\nfunction threadDebugLookbackHours(value: unknown): number {\n if (value === \"7d\") return 168;\n if (value === \"30d\") return 720;\n return 24;\n}\n\nfunction threadDebugFailureStatus(\n value: unknown,\n): \"all\" | \"errored\" | \"aborted\" | \"truncated\" {\n return value === \"errored\" || value === \"aborted\" || value === \"truncated\"\n ? value\n : \"all\";\n}\n\nexport default defineAction({\n description:\n \"See what the user is currently looking at in the dispatch UI, including navigation state and a compact operational summary.\",\n schema: z.object({}),\n http: false,\n run: async () => {\n const [navigation, overview, vaultOverview] = await Promise.all([\n readAppState(\"navigation\"),\n listOverview(),\n listVaultOverview(),\n ]);\n\n const screen: Record<string, unknown> = {\n counts: { ...overview.counts, ...vaultOverview },\n approvalPolicy: overview.settings,\n };\n if (navigation) screen.navigation = navigation;\n if (navigation?.view === \"chat\" || navigation?.view === \"browser-chat\") {\n screen.chatSurface = {\n view:\n navigation.view === \"browser-chat\"\n ? \"embedded browser chat\"\n : \"full-page Dispatch chat\",\n purpose:\n \"Create apps, manage workspace resources, route work to connected agents, and continue Dispatch conversations.\",\n };\n const agentPath =\n typeof navigation.agentPath === \"string\"\n ? navigation.agentPath.trim()\n : \"\";\n if (agentPath) {\n const agents = await listWorkspaceResourceOptions({ kind: \"agent\" });\n const agent = agents.find((resource) => resource.path === agentPath);\n screen.chatSurface = {\n ...(screen.chatSurface as Record<string, unknown>),\n agentPath,\n ...(agent ? { agent } : {}),\n };\n }\n }\n if (navigation?.view === \"overview\") {\n screen.recentAudit = overview.recentAudit.slice(0, 5);\n screen.recentApprovals = overview.recentApprovals.slice(0, 5);\n }\n if (navigation?.view === \"destinations\") {\n screen.recentDestinations = overview.recentDestinations;\n }\n if (navigation?.view === \"connected-agents\") {\n const [connectedAgents, mcpAccess] = await Promise.all([\n runLocalDispatchAction(\"list-connected-agents\", {}),\n runLocalDispatchAction(\"list-mcp-app-access\", {}),\n ]);\n screen.connectedAgents = connectedAgents;\n screen.mcpAppAccess = mcpAccess;\n }\n if (navigation?.view === \"agents\") {\n screen.simpleAgents = await listWorkspaceResourceOptions({\n kind: \"agent\",\n });\n }\n if (navigation?.view === \"operations\") {\n const nav = navigation as { operationsView?: string };\n screen.operatorConsole = {\n view: nav.operationsView === \"database\" ? \"database\" : \"monitoring\",\n monitoring:\n \"The shared observability dashboard provides traces, conversations, evaluations, experiments, and feedback.\",\n database:\n \"The shared database admin is available in Code mode for table browsing and SQL inspection.\",\n relatedTools: [\"thread-debug\", \"audit\", \"destinations\", \"automations\"],\n };\n }\n if (\n navigation?.view === \"overview\" ||\n navigation?.view === \"metrics\" ||\n navigation?.view === \"apps\" ||\n navigation?.view === \"new-app\"\n ) {\n const workspaceApps = await listWorkspaceApps({\n includeAgentCards: true,\n });\n screen.workspaceApps = workspaceApps;\n if (navigation?.view === \"apps\") {\n screen.workspaceAppResources = await Promise.all(\n workspaceApps\n .filter((app) => !app.isDispatch)\n .slice(0, 12)\n .map(async (app) => {\n const result = await listWorkspaceResourcesForApp(app.id);\n return {\n appId: app.id,\n appName: app.name,\n counts: result.counts,\n resources: result.resources.map((resource) => ({\n name: resource.name,\n path: resource.path,\n kind: resource.kind,\n source: resource.source,\n autoLoaded: resource.autoLoaded,\n })),\n };\n }),\n );\n }\n }\n if (navigation?.view === \"metrics\") {\n try {\n const usageScope =\n navigation.usageScope === \"workspace\" ? \"workspace\" : \"me\";\n const usageUserEmail =\n typeof navigation.usageUserEmail === \"string\"\n ? navigation.usageUserEmail\n : undefined;\n const metrics = await listDispatchUsageMetrics({\n sinceDays: 30,\n scope: usageScope,\n userEmail: usageUserEmail,\n });\n screen.usageMetrics = {\n billing: metrics.billing,\n viewScope: metrics.viewScope,\n selectedUserEmail: metrics.selectedUserEmail,\n totals: metrics.totals,\n byApp: metrics.byApp.slice(0, 8),\n byUser: metrics.byUser.slice(0, 8),\n appAccess: metrics.appAccess\n .filter((app) => !app.isDispatch)\n .slice(0, 8),\n };\n } catch (error) {\n screen.usageMetricsError =\n error instanceof Error ? error.message : String(error);\n }\n }\n if (navigation?.view === \"vault\" || navigation?.view === \"new-app\") {\n const isVaultAdmin = await canManageVault();\n const [secrets, grants, requests, access] = await Promise.all([\n listSecretOptions(),\n isVaultAdmin ? listGrants() : Promise.resolve([]),\n listRequests({ status: \"pending\" }),\n getVaultAccessSettings(),\n ]);\n screen.vaultAccessMode = access.mode;\n screen.vaultSecrets = secrets.map((s) => ({\n id: s.id,\n name: s.name,\n credentialKey: s.credentialKey,\n provider: s.provider,\n }));\n screen.vaultActiveGrants = grants\n .filter((g) => g.status === \"active\")\n .map((g) => ({ secretId: g.secretId, appId: g.appId }));\n screen.vaultPendingRequests = requests;\n }\n if (navigation?.view === \"workspace\" || navigation?.view === \"new-app\") {\n screen.workspaceResources = await listWorkspaceResourceOptions();\n screen.workspaceResourceEffectiveContext = {\n action: \"get-workspace-resource-effective-context\",\n description:\n \"Preview workspace -> organization/app -> personal precedence for a resource path and optional app/user. All-app resources are inherited at runtime; selected resources are app-specific exceptions.\",\n };\n screen.workspaceResourceImpactPreview = {\n action: \"preview-workspace-resource-change\",\n description:\n \"Preview All-app reach, overrides, and approval behavior before creating, updating, or deleting a workspace resource.\",\n };\n }\n if (navigation?.view === \"thread-debug\") {\n try {\n const nav = navigation as Record<string, any>;\n screen.threadDebugSources = await listThreadDebugSources();\n if (nav.threadDebugMode !== \"threads\") {\n screen.agentRunFailures = await listAgentRunFailures({\n sourceId: nav.sourceId ?? \"all\",\n ownerEmail: nav.ownerEmail,\n status: threadDebugFailureStatus(nav.failureStatus),\n lookbackHours: threadDebugLookbackHours(nav.range),\n limit: 10,\n });\n } else if (nav.query) {\n screen.threadDebugResults = await searchAgentThreads({\n sourceId: nav.sourceId,\n query: nav.query,\n ownerEmail: nav.ownerEmail,\n limit: 10,\n });\n }\n if (nav.threadId || nav.runId) {\n const detail = await getAgentThreadDebug({\n sourceId:\n nav.runId && nav.inspectSourceId\n ? nav.inspectSourceId\n : nav.sourceId,\n threadId: nav.runId ? undefined : nav.threadId,\n runId: nav.runId,\n ownerEmail: nav.ownerEmail,\n maxRuns: 5,\n maxEvents: 80,\n maxTraceSpans: 50,\n });\n screen.threadDebugSelection = {\n source: detail.source,\n thread: detail.thread,\n messageCount: detail.messages.length,\n runCount: detail.runs.length,\n debug: detail.debug,\n debugRuns: (detail as any).debugRuns?.slice(-5) ?? [],\n messages: detail.messages.slice(-6),\n runs: detail.runs\n .slice(0, 5)\n .map(({ events: _events, ...run }) => run),\n };\n }\n } catch (error) {\n screen.threadDebugError =\n error instanceof Error ? error.message : String(error);\n }\n }\n if (navigation?.view === \"dreams\") {\n try {\n const nav = navigation as Record<string, any>;\n const [sources, candidates, dreams, settings] = await Promise.all([\n listThreadDebugSources(),\n runLocalDispatchAction(\"list-dream-candidates\", {\n sourceId: nav.sourceId,\n ownerEmail: nav.ownerEmail,\n limit: 10,\n }),\n runLocalDispatchAction(\"list-dreams\", {\n status: nav.status,\n limit: 10,\n }),\n runLocalDispatchAction(\"get-dream-settings\", {}),\n ]);\n screen.dreamSources = sources;\n screen.dreamCandidates = candidates;\n screen.latestDreams = dreams;\n screen.dreamSettings = settings;\n\n const dreamId = nav.dreamId ?? nav.id;\n if (dreamId) {\n screen.dreamDetail = await runLocalDispatchAction(\"get-dream\", {\n id: dreamId,\n });\n }\n } catch (error) {\n screen.dreamsError =\n error instanceof Error ? error.message : String(error);\n }\n }\n\n if (Object.keys(screen).length === 0) {\n return \"No application state found. Is the app running?\";\n }\n return JSON.stringify(screen, null, 2);\n },\n});\n"]}
1
+ {"version":3,"file":"view-screen.js","sourceRoot":"","sources":["../../src/actions/view-screen.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * See what the user is currently looking at on screen.\n *\n * Reads and returns the current navigation state from application state.\n *\n * Usage:\n * pnpm action view-screen\n */\n\nimport { defineAction } from \"@agent-native/core\";\nimport { readAppState } from \"@agent-native/core/application-state\";\nimport { z } from \"zod\";\n\nimport { listWorkspaceApps } from \"../server/lib/app-creation-store.js\";\nimport { listOverview } from \"../server/lib/dispatch-store.js\";\nimport {\n getAgentThreadDebug,\n listAgentRunFailures,\n listThreadDebugSources,\n searchAgentThreads,\n} from \"../server/lib/thread-debug-store.js\";\nimport { listDispatchUsageMetrics } from \"../server/lib/usage-metrics-store.js\";\nimport {\n listVaultOverview,\n listSecretOptions,\n listGrants,\n listRequests,\n getVaultAccessSettings,\n canManageVault,\n} from \"../server/lib/vault-store.js\";\nimport {\n listWorkspaceResourceOptions,\n listWorkspaceResourcesForApp,\n} from \"../server/lib/workspace-resources-store.js\";\nimport { CHAT_FIRST_PANE_STATE_KEY } from \"../shared/chat-first-pane.js\";\n\nasync function runLocalDispatchAction(\n name: string,\n args: Record<string, unknown>,\n) {\n const modulePath = `./${name}.js`;\n const module = (await import(/* @vite-ignore */ modulePath)) as {\n default?: {\n run: (args: Record<string, unknown>) => unknown | Promise<unknown>;\n };\n };\n if (!module.default) throw new Error(`Dispatch action not found: ${name}`);\n return module.default.run(stripUndefined(args));\n}\n\nfunction stripUndefined(args: Record<string, unknown>) {\n return Object.fromEntries(\n Object.entries(args).filter(([, value]) => value !== undefined),\n );\n}\n\nfunction threadDebugLookbackHours(value: unknown): number {\n if (value === \"7d\") return 168;\n if (value === \"30d\") return 720;\n return 24;\n}\n\nfunction threadDebugFailureStatus(\n value: unknown,\n): \"all\" | \"errored\" | \"aborted\" | \"truncated\" {\n return value === \"errored\" || value === \"aborted\" || value === \"truncated\"\n ? value\n : \"all\";\n}\n\n/**\n * The workspace app Dispatch has embedded, or `null` when none is open. A\n * surface that is showing an app whose identity could not be read reports\n * `status: \"unknown\"` — never a plausible-looking id and never silence, so the\n * agent can tell \"no app open\" from \"an app is open and I cannot name it\".\n */\ntype EmbeddedApp =\n | {\n status: \"open\";\n id: string;\n /** Path inside the embedded app, not the Dispatch route. */\n path: string;\n /** Named screen the pane was opened at, when it carries one instead of a path. */\n view?: string;\n source: \"route\" | \"chat-first-pane\";\n }\n | { status: \"unknown\"; source: \"route\" | \"chat-first-pane\"; reason: string };\n\nasync function resolveEmbeddedApp(\n navigation: Record<string, any> | null,\n): Promise<EmbeddedApp | null> {\n if (navigation?.view === \"workspace-app\") {\n const id =\n typeof navigation.workspaceAppId === \"string\"\n ? navigation.workspaceAppId.trim()\n : \"\";\n if (!id) {\n return {\n status: \"unknown\",\n source: \"route\",\n reason: `The route ${navigation.path ?? \"/apps/…\"} embeds a workspace app, but its id could not be read from the URL.`,\n };\n }\n return {\n status: \"open\",\n id,\n path:\n typeof navigation.workspaceAppPath === \"string\"\n ? navigation.workspaceAppPath\n : \"/\",\n source: \"route\",\n };\n }\n\n // Chat-first mode keeps the route on /chat and opens the app as a surface\n // tab, so the pane state is the only place the open app is named.\n if (navigation?.view !== \"chat\") return null;\n const pane = await readAppState(CHAT_FIRST_PANE_STATE_KEY);\n if (pane === null) return null;\n const appId = typeof pane.appId === \"string\" ? pane.appId.trim() : \"\";\n if (!appId) {\n return {\n status: \"unknown\",\n source: \"chat-first-pane\",\n reason:\n \"A chat-first app pane is recorded, but its stored state does not name an app.\",\n };\n }\n return {\n status: \"open\",\n id: appId,\n path: typeof pane.path === \"string\" && pane.path ? pane.path : \"/\",\n ...(typeof pane.view === \"string\" && pane.view ? { view: pane.view } : {}),\n source: \"chat-first-pane\",\n };\n}\n\nexport default defineAction({\n description:\n \"See what the user is currently looking at in the dispatch UI, including navigation state, any embedded workspace app, and a compact operational summary.\",\n schema: z.object({}),\n http: false,\n run: async () => {\n const [navigation, overview, vaultOverview] = await Promise.all([\n readAppState(\"navigation\"),\n listOverview(),\n listVaultOverview(),\n ]);\n\n const screen: Record<string, unknown> = {\n counts: { ...overview.counts, ...vaultOverview },\n approvalPolicy: overview.settings,\n };\n if (navigation) screen.navigation = navigation;\n\n const embeddedApp = await resolveEmbeddedApp(navigation);\n if (embeddedApp) screen.embeddedApp = embeddedApp;\n\n if (navigation?.view === \"chat\" || navigation?.view === \"browser-chat\") {\n screen.chatSurface = {\n view:\n navigation.view === \"browser-chat\"\n ? \"embedded browser chat\"\n : \"full-page Dispatch chat\",\n purpose:\n \"Create apps, manage workspace resources, route work to connected agents, and continue Dispatch conversations.\",\n };\n const agentPath =\n typeof navigation.agentPath === \"string\"\n ? navigation.agentPath.trim()\n : \"\";\n if (agentPath) {\n const agents = await listWorkspaceResourceOptions({ kind: \"agent\" });\n const agent = agents.find((resource) => resource.path === agentPath);\n screen.chatSurface = {\n ...(screen.chatSurface as Record<string, unknown>),\n agentPath,\n ...(agent ? { agent } : {}),\n };\n }\n }\n if (navigation?.view === \"overview\") {\n screen.recentAudit = overview.recentAudit.slice(0, 5);\n screen.recentApprovals = overview.recentApprovals.slice(0, 5);\n }\n if (navigation?.view === \"destinations\") {\n screen.recentDestinations = overview.recentDestinations;\n }\n if (navigation?.view === \"connected-agents\") {\n const [connectedAgents, mcpAccess] = await Promise.all([\n runLocalDispatchAction(\"list-connected-agents\", {}),\n runLocalDispatchAction(\"list-mcp-app-access\", {}),\n ]);\n screen.connectedAgents = connectedAgents;\n screen.mcpAppAccess = mcpAccess;\n }\n if (navigation?.view === \"agents\") {\n screen.simpleAgents = await listWorkspaceResourceOptions({\n kind: \"agent\",\n });\n }\n if (navigation?.view === \"operations\") {\n const nav = navigation as { operationsView?: string };\n screen.operatorConsole = {\n view: nav.operationsView === \"database\" ? \"database\" : \"monitoring\",\n monitoring:\n \"The shared observability dashboard provides traces, conversations, evaluations, experiments, and feedback.\",\n database:\n \"The shared database admin is available in Code mode for table browsing and SQL inspection.\",\n relatedTools: [\"thread-debug\", \"audit\", \"destinations\", \"automations\"],\n };\n }\n if (\n navigation?.view === \"overview\" ||\n navigation?.view === \"metrics\" ||\n navigation?.view === \"apps\" ||\n navigation?.view === \"workspace-app\" ||\n navigation?.view === \"new-app\"\n ) {\n const workspaceApps = await listWorkspaceApps({\n includeAgentCards: true,\n });\n screen.workspaceApps = workspaceApps;\n if (navigation?.view === \"apps\") {\n screen.workspaceAppResources = await Promise.all(\n workspaceApps\n .filter((app) => !app.isDispatch)\n .slice(0, 12)\n .map(async (app) => {\n const result = await listWorkspaceResourcesForApp(app.id);\n return {\n appId: app.id,\n appName: app.name,\n counts: result.counts,\n resources: result.resources.map((resource) => ({\n name: resource.name,\n path: resource.path,\n kind: resource.kind,\n source: resource.source,\n autoLoaded: resource.autoLoaded,\n })),\n };\n }),\n );\n }\n }\n if (navigation?.view === \"metrics\") {\n try {\n const usageScope =\n navigation.usageScope === \"workspace\" ? \"workspace\" : \"me\";\n const usageUserEmail =\n typeof navigation.usageUserEmail === \"string\"\n ? navigation.usageUserEmail\n : undefined;\n const metrics = await listDispatchUsageMetrics({\n sinceDays: 30,\n scope: usageScope,\n userEmail: usageUserEmail,\n });\n screen.usageMetrics = {\n billing: metrics.billing,\n viewScope: metrics.viewScope,\n selectedUserEmail: metrics.selectedUserEmail,\n totals: metrics.totals,\n byApp: metrics.byApp.slice(0, 8),\n byUser: metrics.byUser.slice(0, 8),\n appAccess: metrics.appAccess\n .filter((app) => !app.isDispatch)\n .slice(0, 8),\n };\n } catch (error) {\n screen.usageMetricsError =\n error instanceof Error ? error.message : String(error);\n }\n }\n if (navigation?.view === \"vault\" || navigation?.view === \"new-app\") {\n const isVaultAdmin = await canManageVault();\n const [secrets, grants, requests, access] = await Promise.all([\n listSecretOptions(),\n isVaultAdmin ? listGrants() : Promise.resolve([]),\n listRequests({ status: \"pending\" }),\n getVaultAccessSettings(),\n ]);\n screen.vaultAccessMode = access.mode;\n screen.vaultSecrets = secrets.map((s) => ({\n id: s.id,\n name: s.name,\n credentialKey: s.credentialKey,\n provider: s.provider,\n }));\n screen.vaultActiveGrants = grants\n .filter((g) => g.status === \"active\")\n .map((g) => ({ secretId: g.secretId, appId: g.appId }));\n screen.vaultPendingRequests = requests;\n }\n if (navigation?.view === \"workspace\" || navigation?.view === \"new-app\") {\n screen.workspaceResources = await listWorkspaceResourceOptions();\n screen.workspaceResourceEffectiveContext = {\n action: \"get-workspace-resource-effective-context\",\n description:\n \"Preview workspace -> organization/app -> personal precedence for a resource path and optional app/user. All-app resources are inherited at runtime; selected resources are app-specific exceptions.\",\n };\n screen.workspaceResourceImpactPreview = {\n action: \"preview-workspace-resource-change\",\n description:\n \"Preview All-app reach, overrides, and approval behavior before creating, updating, or deleting a workspace resource.\",\n };\n }\n if (navigation?.view === \"thread-debug\") {\n try {\n const nav = navigation as Record<string, any>;\n screen.threadDebugSources = await listThreadDebugSources();\n if (nav.threadDebugMode !== \"threads\") {\n screen.agentRunFailures = await listAgentRunFailures({\n sourceId: nav.sourceId ?? \"all\",\n ownerEmail: nav.ownerEmail,\n status: threadDebugFailureStatus(nav.failureStatus),\n lookbackHours: threadDebugLookbackHours(nav.range),\n limit: 10,\n });\n } else if (nav.query) {\n screen.threadDebugResults = await searchAgentThreads({\n sourceId: nav.sourceId,\n query: nav.query,\n ownerEmail: nav.ownerEmail,\n limit: 10,\n });\n }\n if (nav.threadId || nav.runId) {\n const detail = await getAgentThreadDebug({\n sourceId:\n nav.runId && nav.inspectSourceId\n ? nav.inspectSourceId\n : nav.sourceId,\n threadId: nav.runId ? undefined : nav.threadId,\n runId: nav.runId,\n ownerEmail: nav.ownerEmail,\n maxRuns: 5,\n maxEvents: 80,\n maxTraceSpans: 50,\n });\n screen.threadDebugSelection = {\n source: detail.source,\n thread: detail.thread,\n messageCount: detail.messages.length,\n runCount: detail.runs.length,\n debug: detail.debug,\n debugRuns: (detail as any).debugRuns?.slice(-5) ?? [],\n messages: detail.messages.slice(-6),\n runs: detail.runs\n .slice(0, 5)\n .map(({ events: _events, ...run }) => run),\n };\n }\n } catch (error) {\n screen.threadDebugError =\n error instanceof Error ? error.message : String(error);\n }\n }\n if (navigation?.view === \"dreams\") {\n try {\n const nav = navigation as Record<string, any>;\n const [sources, candidates, dreams, settings] = await Promise.all([\n listThreadDebugSources(),\n runLocalDispatchAction(\"list-dream-candidates\", {\n sourceId: nav.sourceId,\n ownerEmail: nav.ownerEmail,\n limit: 10,\n }),\n runLocalDispatchAction(\"list-dreams\", {\n status: nav.status,\n limit: 10,\n }),\n runLocalDispatchAction(\"get-dream-settings\", {}),\n ]);\n screen.dreamSources = sources;\n screen.dreamCandidates = candidates;\n screen.latestDreams = dreams;\n screen.dreamSettings = settings;\n\n const dreamId = nav.dreamId ?? nav.id;\n if (dreamId) {\n screen.dreamDetail = await runLocalDispatchAction(\"get-dream\", {\n id: dreamId,\n });\n }\n } catch (error) {\n screen.dreamsError =\n error instanceof Error ? error.message : String(error);\n }\n }\n\n if (Object.keys(screen).length === 0) {\n return \"No application state found. Is the app running?\";\n }\n return JSON.stringify(screen, null, 2);\n },\n});\n"]}
@@ -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,6 +17,7 @@ import { Link, useLocation, useNavigate } from "react-router";
17
17
  import { toast } from "sonner";
18
18
  import { cn } from "../../lib/utils.js";
19
19
  import { isDispatchWorkspaceAppId, isWorkspaceAppVisibleInDefaultLaunchers, mergeChatFirstWorkspaceApps, workspaceAppIdFromRoute, workspaceAppRoute, } from "../../lib/workspace-apps.js";
20
+ import { CHAT_FIRST_PANE_STATE_KEY } from "../../shared/chat-first-pane.js";
20
21
  import { AppIcon } from "../app-icon.js";
21
22
  import { CreateAppPopover } from "../create-app-popover.js";
22
23
  import { Sheet, SheetContent, SheetDescription, SheetTitle } from "../ui/sheet.js";
@@ -75,7 +76,6 @@ const DISPATCH_SIDEBAR_LABEL = "Dispatch";
75
76
  const CHROMELESS_PATHS = ["/approval", "/browser-chat", "/browser-connect"];
76
77
  const SIDEBAR_COLLAPSE_KEY = "dispatch.sidebar.collapsed";
77
78
  const CHAT_HISTORY_SOURCE_KEY = "dispatch.chat-history.source";
78
- const CHAT_FIRST_PANE_STATE_KEY = "chat-first-pane";
79
79
  const DispatchExtensionsContext = createContext(undefined);
80
80
  export function useDispatchExtensions() {
81
81
  return useContext(DispatchExtensionsContext);