@athenaintel/react 0.17.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +179 -43
  2. package/dist/AthenaContext-B1QMhIP-.cjs.map +1 -1
  3. package/dist/AthenaContext-MOslgOmE.js.map +1 -1
  4. package/dist/SuperGroupingCard-BsWbHyV_.js +795 -0
  5. package/dist/SuperGroupingCard-BsWbHyV_.js.map +1 -0
  6. package/dist/SuperGroupingCard-CRRFUgjN.cjs +794 -0
  7. package/dist/SuperGroupingCard-CRRFUgjN.cjs.map +1 -0
  8. package/dist/chat/StatewireApprovalCard.d.ts +59 -2
  9. package/dist/chat/StatewireClientToolBridge.d.ts +3 -3
  10. package/dist/chat/StatewireQueuedMessages.d.ts +105 -6
  11. package/dist/chat/statewire-approval.d.ts +1 -1
  12. package/dist/chat/statewire-banners.d.ts +5 -9
  13. package/dist/chat/statewire-client-tools.d.ts +15 -21
  14. package/dist/chat/super-grouping/CollapsibleGroup.d.ts +52 -11
  15. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +78 -21
  16. package/dist/chat/super-grouping/activity-timeline.d.ts +91 -0
  17. package/dist/chat/super-grouping/grouping-function.d.ts +13 -10
  18. package/dist/chat/super-grouping/index.d.ts +12 -0
  19. package/dist/chat/super-grouping/toolkit-map.d.ts +8 -1
  20. package/dist/chat/use-statewire-approval-request.d.ts +44 -0
  21. package/dist/chat-ui/header/conversation-history-panel.d.ts +11 -1
  22. package/dist/chat-ui/index.d.ts +9 -0
  23. package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +24 -0
  24. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +5 -0
  25. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +1 -1
  26. package/dist/chat-ui/mentions/suggestions/shims.d.ts +0 -4
  27. package/dist/chat-ui/messages/continue-pill.d.ts +13 -0
  28. package/dist/chat-ui/messages/message-components.d.ts +7 -2
  29. package/dist/chat-ui/messages/runtime-message.d.ts +21 -0
  30. package/dist/chat-ui/messages/statewire-continue-run.d.ts +82 -0
  31. package/dist/chat-ui/messages/user-edit-composer.d.ts +5 -2
  32. package/dist/chat-ui/statewire.d.ts +19 -0
  33. package/dist/chat-ui/thread/chat-composer-dock.d.ts +1 -1
  34. package/dist/chat-ui/thread/chat-thread-shell.d.ts +7 -1
  35. package/dist/chat-ui/thread/statewire-history-edge.d.ts +52 -0
  36. package/dist/chat-ui-statewire.cjs +25 -0
  37. package/dist/chat-ui-statewire.cjs.map +1 -0
  38. package/dist/chat-ui-statewire.js +25 -0
  39. package/dist/chat-ui-statewire.js.map +1 -0
  40. package/dist/chat-ui.cjs +292 -252
  41. package/dist/chat-ui.cjs.map +1 -1
  42. package/dist/chat-ui.js +289 -248
  43. package/dist/chat-ui.js.map +1 -1
  44. package/dist/diagnostics/athena-diagnostics.d.ts +1 -1
  45. package/dist/diagnostics/errors.d.ts +4 -4
  46. package/dist/index.cjs +20237 -26233
  47. package/dist/index.cjs.map +1 -1
  48. package/dist/index.d.ts +25 -14
  49. package/dist/index.js +18465 -24458
  50. package/dist/index.js.map +1 -1
  51. package/dist/lib/athena-urls.d.ts +0 -2
  52. package/dist/lib/posthog/wrap-posthog-client.d.ts +3 -1
  53. package/dist/misc-tool-uis-B2e0Okkn.cjs +43 -0
  54. package/dist/misc-tool-uis-B2e0Okkn.cjs.map +1 -0
  55. package/dist/misc-tool-uis-gAiQw0Yl.js +44 -0
  56. package/dist/misc-tool-uis-gAiQw0Yl.js.map +1 -0
  57. package/dist/provider/AthenaContext.d.ts +0 -7
  58. package/dist/provider/AthenaProvider.d.ts +28 -52
  59. package/dist/provider/config.d.ts +19 -15
  60. package/dist/provider/statewire-lifecycle-context.d.ts +3 -4
  61. package/dist/provider/statewire-window-context.d.ts +12 -0
  62. package/dist/provider/types.d.ts +0 -1
  63. package/dist/runtime/statewire-auth-headers.d.ts +38 -0
  64. package/dist/runtime/statewire-lifecycle.d.ts +25 -1
  65. package/dist/runtime/statewire-run-config.d.ts +18 -5
  66. package/dist/runtime/statewire-session-key.d.ts +13 -0
  67. package/dist/runtime/useAthenaStatewireRuntime.d.ts +42 -16
  68. package/dist/statewire-continue-run-D34gS7_1.js +132 -0
  69. package/dist/statewire-continue-run-D34gS7_1.js.map +1 -0
  70. package/dist/statewire-continue-run-nE9VCKUh.cjs +131 -0
  71. package/dist/statewire-continue-run-nE9VCKUh.cjs.map +1 -0
  72. package/dist/statewire-history-edge-C8uyTEjX.cjs +1711 -0
  73. package/dist/statewire-history-edge-C8uyTEjX.cjs.map +1 -0
  74. package/dist/statewire-history-edge-CPohUKMt.js +1712 -0
  75. package/dist/statewire-history-edge-CPohUKMt.js.map +1 -0
  76. package/dist/styles.css +1 -1
  77. package/dist/super-grouping.cjs +22 -0
  78. package/dist/super-grouping.cjs.map +1 -0
  79. package/dist/super-grouping.js +22 -0
  80. package/dist/super-grouping.js.map +1 -0
  81. package/dist/threads/ThreadList.d.ts +6 -1
  82. package/dist/threads/mint-thread-id.d.ts +8 -0
  83. package/dist/threads/statewire-thread-list.d.ts +26 -9
  84. package/dist/threads/thread-id-context.d.ts +9 -0
  85. package/dist/threads/use-statewire-conversation-history.d.ts +2 -0
  86. package/dist/threads/useAthenaThreadManager.d.ts +24 -12
  87. package/dist/tool-fallback-DkQ3DLkn.js +4281 -0
  88. package/dist/tool-fallback-DkQ3DLkn.js.map +1 -0
  89. package/dist/tool-fallback-kfhpJQZa.cjs +4297 -0
  90. package/dist/tool-fallback-kfhpJQZa.cjs.map +1 -0
  91. package/dist/tools/index.d.ts +14 -0
  92. package/dist/tools/misc-tool-uis.d.ts +2 -0
  93. package/dist/tools/primitives.d.ts +41 -0
  94. package/dist/tools/tool-fallback.d.ts +78 -6
  95. package/dist/tools/tool-icons.d.ts +10 -0
  96. package/dist/tools/tool-uis.d.ts +1 -23
  97. package/dist/tools.cjs +41 -0
  98. package/dist/tools.cjs.map +1 -0
  99. package/dist/tools.js +41 -0
  100. package/dist/tools.js.map +1 -0
  101. package/dist/trash-2-B5OaNAL7.cjs +5096 -0
  102. package/dist/trash-2-B5OaNAL7.cjs.map +1 -0
  103. package/dist/trash-2-CCwSURL-.js +5081 -0
  104. package/dist/trash-2-CCwSURL-.js.map +1 -0
  105. package/dist/{use-rest-conversation-history-BdnG8jEP.cjs → use-rest-conversation-history-Cm8qMRxp.cjs} +985 -5405
  106. package/dist/use-rest-conversation-history-Cm8qMRxp.cjs.map +1 -0
  107. package/dist/{use-rest-conversation-history-DpEswBqQ.js → use-rest-conversation-history-veDZS-oL.js} +1035 -5455
  108. package/dist/use-rest-conversation-history-veDZS-oL.js.map +1 -0
  109. package/dist/wrench-BEf72cyP.cjs +417 -0
  110. package/dist/wrench-BEf72cyP.cjs.map +1 -0
  111. package/dist/wrench-CbrOlVYm.js +418 -0
  112. package/dist/wrench-CbrOlVYm.js.map +1 -0
  113. package/dist/x-Dfd2NzK0.cjs +42 -0
  114. package/dist/x-Dfd2NzK0.cjs.map +1 -0
  115. package/dist/x-_DntAa_a.js +43 -0
  116. package/dist/x-_DntAa_a.js.map +1 -0
  117. package/package.json +29 -11
  118. package/dist/chat/super-grouping/tool-status-labels.d.ts +0 -1
  119. package/dist/runtime/converter.d.ts +0 -5
  120. package/dist/runtime/external-message-converter.d.ts +0 -21
  121. package/dist/runtime/schemas.d.ts +0 -24
  122. package/dist/runtime/transport.d.ts +0 -39
  123. package/dist/runtime/useAthenaRuntime.d.ts +0 -47
  124. package/dist/threads/adapter.d.ts +0 -42
  125. package/dist/threads/useActiveThreadStateHydration.d.ts +0 -12
  126. package/dist/threads/useThreadTitlePolling.d.ts +0 -14
  127. package/dist/use-rest-conversation-history-BdnG8jEP.cjs.map +0 -1
  128. package/dist/use-rest-conversation-history-DpEswBqQ.js.map +0 -1
@@ -1,35 +1,92 @@
1
- import type { ReasoningMessagePartComponent, TextMessagePartComponent, ToolCallMessagePartComponent } from '@assistant-ui/react';
1
+ import type { ReasoningMessagePartComponent, TextMessagePartComponent, ThreadAssistantMessagePart, ToolCallMessagePartComponent, ToolCallMessagePartProps } from '@assistant-ui/react';
2
+ import { type ComponentType, type ReactNode } from 'react';
3
+ import { type ActivityPhase } from './activity-timeline';
4
+ import { type CollapsibleGroupProps } from './CollapsibleGroup';
5
+ import { type GroupingFunction } from './grouping-function';
2
6
  import { type GetToolGroupKey } from './toolkit-map';
7
+ export declare function resetRememberedExpansionsForTests(): void;
3
8
  /**
4
- * Renders only the text emitted after the last tool-call as the assistant's
5
- * final response. Ported from olympus `SuperGroupingFinalText`. Hidden while
6
- * the message is still running call it as a sibling of `SuperGroupingCard`
7
- * after the run completes.
9
+ * The details disclosure: remembered per expansion key, and when the host
10
+ * opts in opened once when the turn starts waiting on the person, so the
11
+ * approval controls inside the details are visible without a click.
8
12
  */
9
- export declare const SuperGroupingFinalText: import("react").MemoExoticComponent<({ TextComponent, }: {
10
- TextComponent: TextMessagePartComponent;
11
- }) => import("react/jsx-runtime").JSX.Element | null>;
13
+ export declare function useActivityExpansion({ expansionKey, phase, expandWhileWaiting, }: {
14
+ expansionKey: string;
15
+ phase: ActivityPhase;
16
+ expandWhileWaiting?: boolean;
17
+ }): {
18
+ expanded: boolean;
19
+ toggleExpanded: () => void;
20
+ };
12
21
  export interface SuperGroupingCardProps {
13
- /** Tool UIs to render inside the details panel. */
14
- toolUIs: Record<string, ToolCallMessagePartComponent>;
22
+ /** Tool UIs to render inside the details panel, by tool name (registered tool UIs still apply). */
23
+ toolUIs?: Record<string, ToolCallMessagePartComponent>;
24
+ /** Fallback for tools without a UI; the SDK's `ToolFallback` by default. */
25
+ ToolFallback?: ComponentType<ToolCallMessagePartProps>;
15
26
  /** Text renderer for the details panel. */
16
27
  TextComponent: TextMessagePartComponent;
17
28
  /** Reasoning renderer for the details panel. */
18
29
  ReasoningComponent?: ReasoningMessagePartComponent;
19
- /** Override the default toolkit lookup used to drive sub-grouping. */
30
+ /** Per-toolkit block inside the details panel; the SDK's `CollapsibleGroup` by default. */
31
+ GroupComponent?: ComponentType<CollapsibleGroupProps>;
32
+ /** Toolkit lookup driving the per-toolkit sub-grouping; the SDK's static map by default. */
20
33
  getToolGroupKey?: GetToolGroupKey;
34
+ /** A complete grouping function, when the host builds its own (overrides `getToolGroupKey`). */
35
+ groupingFunction?: GroupingFunction;
36
+ /** Tools whose unresolved call means the turn is waiting on the person (see `buildActivityTimeline`). */
37
+ waitingTools?: ReadonlySet<string>;
38
+ /** Tools whose result is a relayed application payload (see `buildActivityTimeline`). */
39
+ passThroughTools?: ReadonlySet<string>;
40
+ /** Host assertion that the turn is waiting on the person (Olympus's allotment store). */
41
+ waitingForInput?: boolean;
42
+ /** Names tools the shared registry has no entry for (Olympus's tool catalog). */
43
+ resolveToolDisplayName?: (toolName: string) => string | undefined;
44
+ /** Key the disclosure choice is remembered under; the message id by default. */
45
+ expansionKey?: string;
46
+ /** Open the details once when the turn starts waiting on the person. */
47
+ expandWhileWaiting?: boolean;
48
+ /** How many latest steps the live list shows before folding the rest into "N earlier steps". */
49
+ maxVisibleSteps?: number;
50
+ /** Extra segments after the collapsed summary ("1m 23s", "12.4k tokens"), joined with " · ". */
51
+ summaryDetails?: readonly string[];
52
+ /** Header controls beside the title (a stop button while running, a changes button once done). */
53
+ renderHeaderActions?: (context: {
54
+ phase: ActivityPhase;
55
+ messageContent: readonly ThreadAssistantMessagePart[];
56
+ }) => ReactNode;
57
+ /** A line under the header while the turn is live (an elapsed timer). */
58
+ renderRunningMeta?: (context: {
59
+ phase: ActivityPhase;
60
+ }) => ReactNode;
61
+ className?: string;
62
+ classNames?: {
63
+ root?: string;
64
+ details?: string;
65
+ };
21
66
  }
22
67
  /**
23
- * Ported from `olympus/src/components/chat/sidebar/SuperGroupingCard.tsx`.
68
+ * The grouped ("conversational") view of an assistant turn: one "Athena is
69
+ * working" card while the turn runs, listing its latest steps; a collapsed
70
+ * "Used N tools" summary once it ends, with the full tool cards behind a
71
+ * details disclosure. The answer itself renders below the card
72
+ * (`SuperGroupingFinalText`). Shared by the SDK's `AthenaChat`, Olympus, and
73
+ * the Chrome extension, which supply their own text/tool renderers and the
74
+ * host-specific controls through the slots.
24
75
  *
25
- * Trimmed to drop Olympus-only deps:
26
- * - `useChatAllotmentStore.isWaitingForUserInput` (Olympus allotment system)dropped.
27
- * - `useUserIsAdmin` admin-only details toggle replaced with always-visible toggle.
28
- * - `stopActiveComposerRun` stop button — dropped; users stop from the composer.
76
+ * The details panel stays mounted (visually hidden) while the turn is live so
77
+ * the tool UIs inside run their effects an asset-streaming card's follow
78
+ * mode must not wait for "Show details".
29
79
  *
30
- * Renders a single "Athena is working" card during execution and collapses to
31
- * "Used N tools" on completion. The expanded details panel uses
32
- * `MessagePrimitive.Unstable_PartsGrouped` (assistant-ui's legacy grouping
33
- * API, still exported as deprecated) with a per-toolkit `CollapsibleGroup`.
80
+ * Selector discipline: raw reads only (`message.content`, `message.status`,
81
+ * `message.id`); every derivation runs in `useMemo` a selector that returned
82
+ * a fresh array would tear through `useSyncExternalStore`.
83
+ */
84
+ export declare const SuperGroupingCard: import("react").MemoExoticComponent<({ toolUIs, ToolFallback: ToolFallbackComponent, TextComponent, ReasoningComponent, GroupComponent, getToolGroupKey, groupingFunction, waitingTools, passThroughTools, waitingForInput, resolveToolDisplayName, expansionKey: expansionKeyProp, expandWhileWaiting, maxVisibleSteps, summaryDetails, renderHeaderActions, renderRunningMeta, className, classNames, }: SuperGroupingCardProps) => import("react/jsx-runtime").JSX.Element | null>;
85
+ /**
86
+ * The turn's visible answer, rendered below the card: the text after the last
87
+ * tool call (all of it when the turn called no tools), streaming while the
88
+ * turn is live so the person reads the answer as it arrives.
34
89
  */
35
- export declare const SuperGroupingCard: import("react").MemoExoticComponent<({ toolUIs, TextComponent, ReasoningComponent, getToolGroupKey, }: SuperGroupingCardProps) => import("react/jsx-runtime").JSX.Element | null>;
90
+ export declare const SuperGroupingFinalText: import("react").MemoExoticComponent<({ TextComponent, }: {
91
+ TextComponent: TextMessagePartComponent;
92
+ }) => import("react/jsx-runtime").JSX.Element | null>;
@@ -0,0 +1,91 @@
1
+ /**
2
+ * The assistant turn's activity timeline — the one derivation of "what did
3
+ * this turn do, and how did each step end" behind the grouped
4
+ * ("conversational") view on every surface: the SDK's `AthenaChat`, Olympus's
5
+ * Spaces chat, and the Chrome extension. Pure functions over assistant-ui
6
+ * message parts; `SuperGroupingCard` renders them.
7
+ *
8
+ * Step states come from the shared classifier (`classifyToolResult`) plus the
9
+ * approval outcomes a part carries (`approval`, `interrupt`, a rejection
10
+ * result), so a call that reads as failed, paused, or rejected on one surface
11
+ * cannot read as a green check on another. Copy comes from the shared tool
12
+ * display registry (`toolStatusLabel`).
13
+ */
14
+ import type { MessageStatus, ThreadAssistantMessagePart } from '@assistant-ui/react';
15
+ import { type ToolStatusLabelState } from '@athenaintel/agent-runtime';
16
+ import type { GroupingFunction } from './grouping-function';
17
+ export type ActivityToolState = ToolStatusLabelState;
18
+ export type ActivityItem = {
19
+ kind: 'reasoning';
20
+ text: string;
21
+ state: 'running' | 'complete';
22
+ } | {
23
+ kind: 'tool';
24
+ toolName: string;
25
+ state: ActivityToolState;
26
+ };
27
+ /** The turn as a whole: still working, parked on the person, ended in error, or done. */
28
+ export type ActivityPhase = 'running' | 'waiting' | 'complete' | 'error';
29
+ type ToolCallPart = Extract<ThreadAssistantMessagePart, {
30
+ type: 'tool-call';
31
+ }>;
32
+ export interface ActivityTimelineOptions {
33
+ /**
34
+ * Tools whose unresolved call means the turn is waiting on the person even
35
+ * without an interrupt or approval on the part (the Chrome extension's
36
+ * device plan approval, which the tool UI itself collects).
37
+ */
38
+ waitingTools?: ReadonlySet<string>;
39
+ /**
40
+ * Tools whose result is an application payload relayed verbatim (the Chrome
41
+ * extension's page JavaScript), so a `success: false` flag counts only with
42
+ * an error detail — see `classifyToolResult`'s `passThroughPayload`.
43
+ */
44
+ passThroughTools?: ReadonlySet<string>;
45
+ }
46
+ /** How one tool call ended (or is going), reading the approval fields before the result. */
47
+ export declare function getActivityToolState(part: ToolCallPart, messageStatus: MessageStatus | undefined, { waitingTools, passThroughTools }?: ActivityTimelineOptions): ActivityToolState;
48
+ /**
49
+ * The compact reasoning/tool timeline in the order the parts streamed.
50
+ *
51
+ * A reasoning part is still streaming only while it is the final part of a
52
+ * running message — once any later part appears, the thought has settled.
53
+ * Settled reasoning parts with no text are dropped so the list never shows an
54
+ * empty thinking row.
55
+ */
56
+ export declare function buildActivityTimeline(content: readonly ThreadAssistantMessagePart[] | undefined, messageStatus: MessageStatus | undefined, options?: ActivityTimelineOptions): ActivityItem[];
57
+ /** Number of tool calls in the timeline. */
58
+ export declare function countActivityTools(timeline: readonly ActivityItem[]): number;
59
+ /**
60
+ * The turn's phase. Waiting on the person wins over everything (a host can
61
+ * also assert it — Olympus's allotment store knows about `ask`), then the
62
+ * message's own status.
63
+ */
64
+ export declare function resolveActivityPhase(status: MessageStatus | undefined, timeline: readonly ActivityItem[], { waitingForInput }?: {
65
+ waitingForInput?: boolean;
66
+ }): ActivityPhase;
67
+ /**
68
+ * The status-row copy for one step. `resolveToolDisplayName` lets a host with
69
+ * a richer tool catalog name tools the shared registry has no entry for.
70
+ */
71
+ export declare function getActivityItemLabel(item: ActivityItem, resolveToolDisplayName?: (toolName: string) => string | undefined): string;
72
+ /** The collapsed-card summary of a finished turn. */
73
+ export declare function getActivitySummary(timeline: readonly ActivityItem[]): string;
74
+ /** The part shape the final-text read needs; any message role's parts satisfy it. */
75
+ export type FinalTextPart = {
76
+ readonly type: string;
77
+ readonly text?: string;
78
+ };
79
+ /**
80
+ * The visible answer of a grouped turn: the text after the final tool call,
81
+ * or all of it when the turn never called a tool. Intermediate text (before
82
+ * or between tool calls) stays available in the details panel.
83
+ */
84
+ export declare function getFinalText(content: readonly FinalTextPart[] | undefined): string | null;
85
+ /**
86
+ * Keep the final answer out of the details panel: it renders below the card
87
+ * (`SuperGroupingFinalText`), so the details grouping drops every text part
88
+ * after the last tool call and any group that becomes empty.
89
+ */
90
+ export declare function excludeFinalTextFromGroups(grouping: GroupingFunction): GroupingFunction;
91
+ export {};
@@ -1,19 +1,22 @@
1
1
  import type { GetToolGroupKey } from './toolkit-map';
2
- type AnyPart = {
2
+ /** The part shape grouping needs; assistant-ui's `ThreadAssistantMessagePart` satisfies it. */
3
+ export type GroupablePart = {
3
4
  type: string;
4
5
  toolName?: string;
5
6
  };
6
- type MessagePartGroup = {
7
+ /** One group `MessagePrimitive.Unstable_PartsGrouped` renders through its `Group` component. */
8
+ export type MessagePartGroup = {
7
9
  groupKey: string | undefined;
8
10
  indices: number[];
9
11
  };
12
+ /** The grouping contract `MessagePrimitive.Unstable_PartsGrouped` consumes. */
13
+ export type GroupingFunction = (parts: readonly GroupablePart[]) => MessagePartGroup[];
10
14
  /**
11
- * Ported from Olympus `toolBasedGroupingFunction` in
12
- * `olympus/src/utils/assistantGrouping.ts`. Groups adjacent parts by their
13
- * toolkit group key, lets reasoning parts join the active group, and pulls
14
- * text parts into a group when both surrounding tool-call groups share the
15
- * same key. Returns the group descriptor that `MessagePrimitive.Unstable_PartsGrouped`
16
- * consumes.
15
+ * Groups adjacent parts by their toolkit group key: reasoning parts join the
16
+ * open group, and a text part joins when the tool calls on both sides of it
17
+ * share a key. Every `getToolGroupKey` call sees the open group's key and the
18
+ * set of tools the message called, so a tool shared by several toolkits can
19
+ * resolve to the one actually in play (Olympus attributes shared citation
20
+ * tools to the enabled toolkit that way).
17
21
  */
18
- export declare const createToolBasedGroupingFunction: (getToolGroupKey: GetToolGroupKey) => (parts: readonly AnyPart[]) => MessagePartGroup[];
19
- export {};
22
+ export declare const createToolBasedGroupingFunction: (getToolGroupKey: GetToolGroupKey) => GroupingFunction;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `@athenaintel/react/super-grouping` — the grouped ("conversational") view of
3
+ * an assistant turn: the activity card, its per-toolkit collapsible blocks,
4
+ * the timeline derivation behind them, and the tool-based grouping function.
5
+ * A lean entry so hosts with their own thread (Olympus, the Chrome extension)
6
+ * mount it from source without the SDK's composer stack.
7
+ */
8
+ export { type ActivityItem, type ActivityPhase, type ActivityTimelineOptions, type ActivityToolState, buildActivityTimeline, countActivityTools, excludeFinalTextFromGroups, type FinalTextPart, getActivityItemLabel, getActivitySummary, getActivityToolState, getFinalText, resolveActivityPhase, } from './activity-timeline';
9
+ export { CollapsibleGroup, type CollapsibleGroupProps, DEFAULT_TOOLKIT_THEME, SuperGroupingProvider, TOOLKIT_THEMES, type ToolkitTheme, } from './CollapsibleGroup';
10
+ export { createToolBasedGroupingFunction, type GroupablePart, type GroupingFunction, type MessagePartGroup, } from './grouping-function';
11
+ export { resetRememberedExpansionsForTests, SuperGroupingCard, type SuperGroupingCardProps, SuperGroupingFinalText, useActivityExpansion, } from './SuperGroupingCard';
12
+ export { defaultGetToolGroupKey, type GetToolGroupKey, type ToolGroupKeyOptions } from './toolkit-map';
@@ -1,6 +1,12 @@
1
1
  export type ToolGroupKeyOptions = {
2
2
  /** Display name of the surrounding group, when one is already open. */
3
3
  preferredGroupKey?: string;
4
+ /**
5
+ * Distinct tool names the message called. Hosts with a toolkit catalog use
6
+ * it to attribute a tool shared by several toolkits to the one the message
7
+ * leans on; the default map ignores it.
8
+ */
9
+ calledToolNames?: ReadonlySet<string>;
4
10
  };
5
11
  /**
6
12
  * Default `getToolGroupKey` implementation used by the SDK's tool grouping.
@@ -8,7 +14,8 @@ export type ToolGroupKeyOptions = {
8
14
  * is ungrouped or unknown. Context-only tools inherit the surrounding group
9
15
  * and are otherwise ungrouped.
10
16
  *
11
- * Override per-app by passing `getToolGroupKey` to `<AthenaChat>`.
17
+ * Override per-app by passing `getToolGroupKey` (or a whole `groupingFunction`) to
18
+ * `SuperGroupingCard`.
12
19
  */
13
20
  export declare const defaultGetToolGroupKey: (toolName: string, options?: ToolGroupKeyOptions) => string | undefined;
14
21
  export type GetToolGroupKey = (toolName: string, options?: ToolGroupKeyOptions) => string | undefined;
@@ -0,0 +1,44 @@
1
+ import type { StatewireThread } from '@assistant-ui/react-statewire';
2
+ import { type AbandonedInputRequest, type HitlApprovalPayload, type PendingActionRequest } from '@athenaintel/agent-runtime';
3
+ /** Selects which pending interrupt an approval surface answers. */
4
+ export type StatewireInterruptPredicate = (request: StatewireThread.InputRequestState) => request is StatewireThread.CustomInputRequest;
5
+ export interface UseStatewireApprovalRequestOptions {
6
+ /**
7
+ * Which pending interrupt to answer. Defaults to `isApprovalCardInterrupt`
8
+ * (client-tool parks excluded — the client-tool bridge owns those, and a
9
+ * generic resume would corrupt the parked tool call).
10
+ */
11
+ interruptPredicate?: StatewireInterruptPredicate;
12
+ /**
13
+ * How long a sent decision keeps the actions locked when no resume run ever
14
+ * starts. Defaults to {@link HITL_PENDING_RESUME_GRACE_MS}.
15
+ */
16
+ pendingResumeGraceMs?: number;
17
+ }
18
+ export interface StatewireApprovalRequest<TValue> {
19
+ /** The pending interrupt this surface answers, if any. */
20
+ request: StatewireThread.CustomInputRequest | undefined;
21
+ requestId: string | undefined;
22
+ /** The payload narrowed to the Athena HITL approval shape, or `null`. */
23
+ hitl: HitlApprovalPayload | null;
24
+ /** Every gated call the approval covers, in decision order (empty for non-HITL parks). */
25
+ actionRequests: PendingActionRequest[];
26
+ /** An interrupt a non-resume dispatch dropped — the "approval was cancelled" notice. */
27
+ abandonedInterrupt: AbandonedInputRequest | undefined;
28
+ /** True after a resume until the request identity changes (or recovery fires). */
29
+ pending: boolean;
30
+ /** Answer the request with `{ type: 'run/input', requestId, response: { type: 'resume', value } }`. */
31
+ resume: (value: TValue) => void;
32
+ }
33
+ /**
34
+ * The headless half of every statewire approval surface: selects the pending
35
+ * interrupt from the runs projection, narrows its payload, reads the
36
+ * host-published abandoned interrupts, and wires the shared optimistic resume
37
+ * lock to the thread's `run/input` command. `StatewireApprovalCard` renders
38
+ * over it; hosts with their own decision UI (per-lane subagent cards) build
39
+ * on it directly so the selection and lock semantics cannot drift.
40
+ *
41
+ * Requires a statewire aui scope (throws outside one, like every
42
+ * `useStatewire*` hook) — gate the mount with `hasStatewireThreadExtras`.
43
+ */
44
+ export declare function useStatewireApprovalRequest<TValue extends StatewireThread.InputResponse = Record<string, string>>(options?: UseStatewireApprovalRequestOptions): StatewireApprovalRequest<TValue>;
@@ -23,5 +23,15 @@ export interface ConversationHistoryPanelProps {
23
23
  hasNextPage?: boolean;
24
24
  isFetchingNextPage?: boolean;
25
25
  onLoadMore?: () => void;
26
+ /**
27
+ * The pointer has rested on a conversation row for `hoverIntentDelayMs`:
28
+ * the user is likely to open it next. Hosts wake and pre-dial the thread
29
+ * here so the click lands on a warm instance with its hello in hand.
30
+ */
31
+ onHoverIntent?: (threadId: string) => void;
32
+ /** The pointer left a row whose intent had fired. */
33
+ onHoverIntentEnd?: (threadId: string) => void;
34
+ /** Dwell before a hover counts as intent; a pass-through never fires. */
35
+ hoverIntentDelayMs?: number;
26
36
  }
27
- export declare function ConversationHistoryPanel({ conversations, activeThreadId, search, onSearchChange, activityFilter, onActivityFilterChange, originFilter, onOriginFilterChange, onSelect, onNewChat, onRefresh, onArchive, onSetReadState, isLoading, isRefreshing, hasNextPage, isFetchingNextPage, onLoadMore, }: ConversationHistoryPanelProps): import("react/jsx-runtime").JSX.Element;
37
+ export declare function ConversationHistoryPanel({ conversations, activeThreadId, search, onSearchChange, activityFilter, onActivityFilterChange, originFilter, onOriginFilterChange, onSelect, onNewChat, onRefresh, onArchive, onSetReadState, isLoading, isRefreshing, hasNextPage, isFetchingNextPage, onLoadMore, onHoverIntent, onHoverIntentEnd, hoverIntentDelayMs, }: ConversationHistoryPanelProps): import("react/jsx-runtime").JSX.Element;
@@ -11,6 +11,8 @@ export { ChatThreadShell } from "./thread/chat-thread-shell";
11
11
  export type { ChatThreadMessageComponents, ChatThreadShellProps, } from "./thread/chat-thread-shell";
12
12
  export { ChatComposerDock } from "./thread/chat-composer-dock";
13
13
  export type { ChatComposerDockProps } from "./thread/chat-composer-dock";
14
+ export { HISTORY_EDGE_NEAR_MARGIN_PX, HistoryEdgeRow, type HistoryEdgeRowProps, StatewireHistoryEdge, type StatewireHistoryEdgeProps, THREAD_VIEWPORT_ATTR, } from "./thread/statewire-history-edge";
15
+ export { StatewireToolOutputsContext, useStatewireToolOutputs, } from "../provider/statewire-window-context";
14
16
  export { ComposerSendOrStop } from "./thread/composer-send-or-stop";
15
17
  export type { ComposerSendOrStopComponents, ComposerSendOrStopProps, ComposerStopControls, ComposerSubmitHandle, } from "./thread/composer-send-or-stop";
16
18
  export { ChatHeader, ChatHeaderActions, ChatHeaderIdentity, ChatHeaderRoot, } from './header/chat-header';
@@ -36,3 +38,10 @@ export { UserEditComposer } from "./messages/user-edit-composer";
36
38
  export { MessageActionsReadOnlyProvider, useMessageActionsReadOnly, } from "./messages/message-actions-config";
37
39
  export { TextShimmerLoader, ThreadRunningIndicator, } from "./messages/running-indicator";
38
40
  export { SignInCard, SignInConsent, SignInFallbackSection, SignInSecondaryButton, SignInSelect, SignInTextField, } from "./auth/sign-in-card";
41
+ export { RuntimeMessageCard, type RuntimeMessageCardProps } from "./messages/runtime-message";
42
+ export { ContinuePill } from "./messages/continue-pill";
43
+ export { type ReadStatewireTailEnding, StatewireContinueRunAffordance, StatewireContinueRunButton, type StatewireContinueRunButtonProps, StatewireRunEndedFooter, type StatewireRunEndedFooterActionsContext, type StatewireRunEndedFooterProps, type StatewireTailEnding, } from "./messages/statewire-continue-run";
44
+ export { StatewireApprovalCard, type StatewireApprovalCardProps, type StatewireApprovalRequestContext, } from "../chat/StatewireApprovalCard";
45
+ export { type StatewireApprovalRequest, type StatewireInterruptPredicate, type UseStatewireApprovalRequestOptions, useStatewireApprovalRequest, } from "../chat/use-statewire-approval-request";
46
+ export { StatewireQueuedMessages, type StatewireQueueEditorContext, type StatewireQueueEvent, type StatewireQueueRowContentContext, type StatewireQueuedMessagesProps, } from "../chat/StatewireQueuedMessages";
47
+ export { HITL_PENDING_RESUME_GRACE_MS } from "@athenaintel/agent-runtime";
@@ -20,6 +20,30 @@ export declare function fetchGraphQL<T = any>(auth: MentionAuthContext, query: s
20
20
  export declare const SIMPLE_SEARCH_QUERY = "\n query SimpleSearch($input: SimpleSearchRequestInput!) {\n simpleSearch(input: $input) {\n assets {\n \n id\n title\n athenaOriginalType\n athenaConvertedType\n parentFolderId\n updatedAt\n isFavorited\n isArchived\n isHidden\n\n }\n totalCount\n }\n }\n";
21
21
  export declare const PAGINATED_ASSETS_QUERY = "\n query GetPaginatedAssetsForWorkspace(\n $limit: Int!\n $offset: Int!\n $parentFolderId: String\n $filterTypes: [String!]\n $filterColumns: ColumnFilter\n ) {\n getPaginatedAssetsForWorkspace(\n limit: $limit\n offset: $offset\n parentFolderId: $parentFolderId\n filterTypes: $filterTypes\n filterColumns: $filterColumns\n ) {\n \n id\n title\n athenaOriginalType\n athenaConvertedType\n parentFolderId\n updatedAt\n isFavorited\n isArchived\n isHidden\n\n }\n }\n";
22
22
  export declare const WORKSPACE_MEMBERS_QUERY = "\n query GetUsersInWorkspace($workspaceId: String!) {\n getUsersInWorkspace(workspaceId: $workspaceId) {\n id\n email\n firstName\n lastName\n isAdmin\n avatarUrl\n }\n }\n";
23
+ export declare const TOOL_CATALOG_QUERY = "\n query MentionToolCatalog {\n getToolkitToToolsMapping {\n tools {\n id\n name\n description\n icon\n adminOnly\n isMentionable\n }\n toolkits {\n name\n displayName\n description\n icon\n onlyAdmin\n hideFromMenu\n isMentionable\n }\n }\n }\n";
24
+ export interface ToolCatalogTool {
25
+ id: string;
26
+ name: string;
27
+ description: string | null;
28
+ icon: string;
29
+ adminOnly: boolean;
30
+ isMentionable: boolean;
31
+ }
32
+ export interface ToolCatalogToolkit {
33
+ name: string;
34
+ displayName: string;
35
+ description: string;
36
+ icon: string;
37
+ onlyAdmin: boolean;
38
+ hideFromMenu: boolean;
39
+ isMentionable: boolean;
40
+ }
41
+ export interface ToolCatalogResult {
42
+ getToolkitToToolsMapping: {
43
+ tools: ToolCatalogTool[];
44
+ toolkits: ToolCatalogToolkit[];
45
+ };
46
+ }
23
47
  export interface AssetResult {
24
48
  id: string;
25
49
  title: string | null;
@@ -49,6 +49,11 @@ export interface TeamConfig {
49
49
  auth: MentionAuthContext;
50
50
  }
51
51
  export declare const fetchTeam: SourceFn<TeamConfig>;
52
+ export interface ToolCatalogConfig {
53
+ auth: MentionAuthContext;
54
+ }
55
+ export declare const fetchTools: SourceFn<ToolCatalogConfig>;
56
+ export declare const fetchToolkits: SourceFn<ToolCatalogConfig>;
52
57
  export interface DrivesConfig {
53
58
  auth: MentionAuthContext;
54
59
  }
@@ -21,7 +21,7 @@ export type MentionSuggestionsStore = Store<MentionSuggestionsStoreState>;
21
21
  /**
22
22
  * All mention menu categories, in display order.
23
23
  */
24
- export declare const ROOT_MENTION_CATEGORIES: readonly ["favorites", "assets", "projects", "browse_profiles", "folders", "team", "drives"];
24
+ export declare const ROOT_MENTION_CATEGORIES: readonly ["favorites", "assets", "projects", "browse_profiles", "folders", "tools", "toolkits", "team", "drives"];
25
25
  export type MentionRootCategory = (typeof ROOT_MENTION_CATEGORIES)[number];
26
26
  /**
27
27
  * Creates a stable MentionSuggestionsStore.
@@ -13,7 +13,3 @@ export declare const useDebugMenuStore: () => {
13
13
  export declare function Spinner({ className }: {
14
14
  className?: string;
15
15
  }): import("react/jsx-runtime").JSX.Element;
16
- export declare const toast: {
17
- error: (msg: string) => void;
18
- success: (msg: string) => void;
19
- };
@@ -0,0 +1,13 @@
1
+ import { type FC } from "react";
2
+ /**
3
+ * Shared Continue action for recoverable chat states.
4
+ *
5
+ * The dispatch waits for the exit animation to paint. If the owning runtime
6
+ * does not leave the recoverable state (for example, the command is rejected),
7
+ * the control resets so the user can try again.
8
+ */
9
+ export declare const ContinuePill: FC<{
10
+ onClick: () => void;
11
+ ariaLabel: string;
12
+ dataTestId?: string;
13
+ }>;
@@ -1,6 +1,6 @@
1
1
  import { type ToolCallMessagePartComponent } from "@assistant-ui/react";
2
2
  import "@assistant-ui/react-markdown/styles/dot.css";
3
- import type { ButtonHTMLAttributes, FC, ReactNode } from "react";
3
+ import { type ButtonHTMLAttributes, type FC, type ReactNode } from "react";
4
4
  import type { ComposerAction } from "../composer/composer-action";
5
5
  export declare function IconButton({ children, tooltip, className, ...props }: ButtonHTMLAttributes<HTMLButtonElement> & {
6
6
  tooltip: string;
@@ -22,12 +22,17 @@ export interface CreateAssistantMessageOptions {
22
22
  * timelines supply their own; the default renders markdown and tool cards.
23
23
  */
24
24
  content?: FC;
25
+ /**
26
+ * Inline affordance rendered inside a runtime-ending card (e.g. a Continue
27
+ * button). Hosts without one leave it unset.
28
+ */
29
+ runtimeMessageAction?: ReactNode;
25
30
  }
26
31
  /**
27
32
  * Builds the assistant bubble. Call this once per host (memoized on its
28
33
  * inputs) so the returned component identity stays stable across renders.
29
34
  */
30
- export declare function createAssistantMessage({ toolFallback, extraActions, content: Content, }: CreateAssistantMessageOptions): FC;
35
+ export declare function createAssistantMessage({ toolFallback, extraActions, content: Content, runtimeMessageAction, }: CreateAssistantMessageOptions): FC;
31
36
  /** Panel chrome: the thread card and the header row that sits inside it. */
32
37
  export declare const THREAD_PANEL_CLASS = "m-1 flex min-h-0 flex-1 flex-col overflow-hidden rounded-[18px] border border-dashed border-amber-500 bg-background shadow-[0_1px_10px_rgba(54,45,33,0.08)]";
33
38
  export declare const THREAD_HEADER_CLASS = "flex items-center justify-between gap-2 px-3 py-2";
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shared DOM rendering for a runtime ending (see
3
+ * `@athenaintel/agent-runtime`'s `runtime-messages.ts`): the status row for a
4
+ * stop / pause / failure, and the banner that frames a handoff summary. Hosts
5
+ * that build their assistant row with `createAssistantMessage` get these for
6
+ * free; hosts with their own row (Olympus, mobile) render their own presenter
7
+ * from the same {@link AthenaRuntimeMessage} so the taxonomy cannot drift.
8
+ */
9
+ import { type AthenaRuntimeMessage } from "@athenaintel/agent-runtime";
10
+ import type { ComponentPropsWithoutRef, FC, ReactNode } from "react";
11
+ export interface RuntimeMessageCardProps extends Omit<ComponentPropsWithoutRef<"div">, "children" | "role"> {
12
+ message: AthenaRuntimeMessage;
13
+ /** An inline affordance (e.g. a Continue button) rendered inside the card. */
14
+ action?: ReactNode;
15
+ }
16
+ /**
17
+ * The status row for a runtime ending. For `stopped` / `paused` / `failed` it
18
+ * replaces the assistant bubble; for `handoff` it sits above the closing
19
+ * summary, which keeps rendering as ordinary prose.
20
+ */
21
+ export declare const RuntimeMessageCard: FC<RuntimeMessageCardProps>;
@@ -0,0 +1,82 @@
1
+ import { type ThreadMessage } from "@assistant-ui/react";
2
+ import { type AthenaRuntimeMessageKind, type DeepAgentThreadStatus } from "@athenaintel/agent-runtime";
3
+ import type { ReactElement, ReactNode } from "react";
4
+ export interface StatewireContinueRunButtonProps {
5
+ /**
6
+ * Also offer Continue while the thread projects `ready`. An old snapshot
7
+ * can report a resting thread whose last persisted ending is still
8
+ * continuable; the marker row that mounts this button knows that.
9
+ */
10
+ allowReadyFallback?: boolean;
11
+ /**
12
+ * Called as the continue dispatches (after the pill's exit animation) —
13
+ * the host's telemetry hook. Receives the settled status and live run id.
14
+ */
15
+ onContinue?: (context: {
16
+ status: DeepAgentThreadStatus;
17
+ runId: string | null;
18
+ }) => void;
19
+ }
20
+ /**
21
+ * Dispatches the bare `run/continue` for the live Statewire thread — the
22
+ * heal-then-continue recovery for stopped, errored, and pod-drained runs. The
23
+ * command is exactly what the library's `onResume` emits, so it inherits the
24
+ * optimistic running-flip (the pill unmounts once the dispatch is accepted)
25
+ * and routes rejections to the runtime's shared `onError` policy.
26
+ *
27
+ * Gated on the LIVE thread status, never on the persisted marker: markers live
28
+ * in the transcript forever, while continuability is a property of the
29
+ * current run state. Requires `capabilities.continue` on the host thread and
30
+ * a statewire aui scope (throws outside one, like every `useStatewire*` hook).
31
+ */
32
+ export declare function StatewireContinueRunButton({ allowReadyFallback, onContinue, }?: StatewireContinueRunButtonProps): ReactElement | null;
33
+ /**
34
+ * Recovery affordance for the latest persisted stopped/failed run marker,
35
+ * for the `runtimeMessageAction` slot of `createAssistantMessage`.
36
+ *
37
+ * Marker messages remain in history forever, so only the current last message
38
+ * may continue. The extras guard keeps Statewire hooks out of read-only or
39
+ * legacy runtimes where they would throw.
40
+ */
41
+ export declare function StatewireContinueRunAffordance(): ReactElement | null;
42
+ /** The ending a transcript row paints, as the footer needs to know it. */
43
+ export interface StatewireTailEnding {
44
+ kind: AthenaRuntimeMessageKind;
45
+ /** A send-now cancellation: kept in the data, painted as nothing. */
46
+ silent: boolean;
47
+ }
48
+ /** Reads the runtime ending (marker or handoff) a message row renders, if any. */
49
+ export type ReadStatewireTailEnding = (message: ThreadMessage) => StatewireTailEnding | null;
50
+ export interface StatewireRunEndedFooterActionsContext {
51
+ /** The live settled status the footer describes. */
52
+ status: "stopped" | "error";
53
+ /** The ending the tail row renders, when it renders one (silent markers read as none). */
54
+ tailEndingKind: AthenaRuntimeMessageKind | null;
55
+ }
56
+ export interface StatewireRunEndedFooterProps {
57
+ /** Merged onto the recovery card's default classes. */
58
+ className?: string;
59
+ /**
60
+ * How the host's assistant row paints the transcript tail. The default reads
61
+ * the runtime ending only (a persisted marker or handoff); a host whose row
62
+ * also styles an assistant-ui error status as a failed ending passes a
63
+ * reader that reports it, so the footer never doubles that row's recovery.
64
+ */
65
+ readTailEnding?: ReadStatewireTailEnding;
66
+ /**
67
+ * The recovery controls. The default renders Continue unless the tail row
68
+ * (a marker of another kind) already carries it; hosts with richer recovery
69
+ * (Retry + Continue) supply their own and decide ownership from the context.
70
+ */
71
+ renderActions?: (context: StatewireRunEndedFooterActionsContext) => ReactNode;
72
+ }
73
+ /**
74
+ * Recovery row for a settled run whose persisted ending is no longer the
75
+ * transcript tail — rendered after the messages (`renderMessages`). Rewinds,
76
+ * compaction, and older snapshots can all leave the durable run state
77
+ * recoverable without a marker row that owns the action. The failure copy
78
+ * comes from the replicated run error (`runs.error.message`) — the same text
79
+ * the marker would have carried. Renders nothing on legacy (non-statewire)
80
+ * threads.
81
+ */
82
+ export declare function StatewireRunEndedFooter({ className, readTailEnding, renderActions, }?: StatewireRunEndedFooterProps): ReactElement | null;
@@ -2,7 +2,10 @@ import type { FC } from "react";
2
2
  /**
3
3
  * Rendered in place of a user message while it is being edited (entered via
4
4
  * the action bar's Edit control, which seeds this composer with the message
5
- * text). Sending submits the message-scoped composer, which the Statewire
6
- * runtime maps to a `run/edit` rewind; Escape/Cancel exits edit mode.
5
+ * text). Sending leaves as a `run/edit` anchored on the host's own parent of
6
+ * the message (`useDeepAgentMessageEditSubmit`) on a windowed wire the
7
+ * lane's `anchorBefore` at the window edge — so the rewind is never rejected
8
+ * `wrong-anchor` the way the library's converted-message anchor is after a
9
+ * chunked assistant turn; Escape/Cancel exits edit mode.
7
10
  */
8
11
  export declare const UserEditComposer: FC;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * The statewire chat surfaces every Athena host mounts — the HITL approval
3
+ * card, the queued-messages tray, the continue affordances and the run-ended
4
+ * footer, with the runtime-message card and Continue pill they render — as a
5
+ * lean entry point. Hosts that already have their own composer and mention
6
+ * stack (Olympus) import this instead of the full `chat-ui` barrel, so the
7
+ * SDK's Tiptap and mention modules never enter their build graph.
8
+ *
9
+ * Published as the `@athenaintel/react/chat-ui/statewire` sub-path.
10
+ */
11
+ export { StatewireApprovalCard, type StatewireApprovalCardProps, type StatewireApprovalRequestContext, } from "../chat/StatewireApprovalCard";
12
+ export { type StatewireApprovalRequest, type StatewireInterruptPredicate, type UseStatewireApprovalRequestOptions, useStatewireApprovalRequest, } from "../chat/use-statewire-approval-request";
13
+ export { StatewireQueuedMessages, type StatewireQueueEditorContext, type StatewireQueueEvent, type StatewireQueueRowContentContext, type StatewireQueuedMessagesProps, } from "../chat/StatewireQueuedMessages";
14
+ export { HistoryEdgeRow, type HistoryEdgeRowProps, StatewireHistoryEdge, type StatewireHistoryEdgeProps, } from "./thread/statewire-history-edge";
15
+ export { StatewireToolOutputsContext, useStatewireToolOutputs, } from "../provider/statewire-window-context";
16
+ export { ContinuePill } from "./messages/continue-pill";
17
+ export { RuntimeMessageCard, type RuntimeMessageCardProps } from "./messages/runtime-message";
18
+ export { type ReadStatewireTailEnding, StatewireContinueRunAffordance, StatewireContinueRunButton, type StatewireContinueRunButtonProps, StatewireRunEndedFooter, type StatewireRunEndedFooterActionsContext, type StatewireRunEndedFooterProps, type StatewireTailEnding, } from "./messages/statewire-continue-run";
19
+ export { HITL_PENDING_RESUME_GRACE_MS } from "@athenaintel/agent-runtime";
@@ -23,7 +23,7 @@ export interface ChatComposerDockProps {
23
23
  editor: ReactNode;
24
24
  /** Toolbar contents before the spacer (attach buttons, pickers). */
25
25
  toolbarStart?: ReactNode;
26
- /** Toolbar contents after the spacer (voice, capture, send/stop). */
26
+ /** Toolbar contents after the spacer (voice and send/stop controls). */
27
27
  toolbarEnd: ReactNode;
28
28
  }
29
29
  /**