@athenaintel/react 0.60.1 → 0.61.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 (105) hide show
  1. package/README.md +157 -5
  2. package/dist/agent-ui/AgentTarget.cjs +11 -0
  3. package/dist/agent-ui/AgentTarget.cjs.map +1 -0
  4. package/dist/agent-ui/AgentTarget.d.ts +17 -0
  5. package/dist/agent-ui/AgentTarget.js +11 -0
  6. package/dist/agent-ui/AgentTarget.js.map +1 -0
  7. package/dist/agent-ui/AgentUiLayer.cjs +387 -0
  8. package/dist/agent-ui/AgentUiLayer.cjs.map +1 -0
  9. package/dist/agent-ui/AgentUiLayer.d.ts +40 -0
  10. package/dist/agent-ui/AgentUiLayer.js +387 -0
  11. package/dist/agent-ui/AgentUiLayer.js.map +1 -0
  12. package/dist/agent-ui/contract.cjs +104 -0
  13. package/dist/agent-ui/contract.cjs.map +1 -0
  14. package/dist/agent-ui/contract.d.ts +113 -0
  15. package/dist/agent-ui/contract.js +104 -0
  16. package/dist/agent-ui/contract.js.map +1 -0
  17. package/dist/agent-ui/driver.cjs +335 -0
  18. package/dist/agent-ui/driver.cjs.map +1 -0
  19. package/dist/agent-ui/driver.d.ts +66 -0
  20. package/dist/agent-ui/driver.js +335 -0
  21. package/dist/agent-ui/driver.js.map +1 -0
  22. package/dist/agent-ui/index.cjs +33 -0
  23. package/dist/agent-ui/index.cjs.map +1 -0
  24. package/dist/agent-ui/index.d.ts +19 -0
  25. package/dist/agent-ui/index.js +33 -0
  26. package/dist/agent-ui/index.js.map +1 -0
  27. package/dist/agent-ui/pace.cjs +121 -0
  28. package/dist/agent-ui/pace.cjs.map +1 -0
  29. package/dist/agent-ui/pace.d.ts +66 -0
  30. package/dist/agent-ui/pace.js +121 -0
  31. package/dist/agent-ui/pace.js.map +1 -0
  32. package/dist/agent-ui/screen.cjs +471 -0
  33. package/dist/agent-ui/screen.cjs.map +1 -0
  34. package/dist/agent-ui/screen.d.ts +97 -0
  35. package/dist/agent-ui/screen.js +471 -0
  36. package/dist/agent-ui/screen.js.map +1 -0
  37. package/dist/agent-ui/secret-fields.cjs +50 -0
  38. package/dist/agent-ui/secret-fields.cjs.map +1 -0
  39. package/dist/agent-ui/secret-fields.d.ts +15 -0
  40. package/dist/agent-ui/secret-fields.js +50 -0
  41. package/dist/agent-ui/secret-fields.js.map +1 -0
  42. package/dist/agent-ui/stage.cjs +196 -0
  43. package/dist/agent-ui/stage.cjs.map +1 -0
  44. package/dist/agent-ui/stage.d.ts +110 -0
  45. package/dist/agent-ui/stage.js +196 -0
  46. package/dist/agent-ui/stage.js.map +1 -0
  47. package/dist/agent-ui/tools.cjs +448 -0
  48. package/dist/agent-ui/tools.cjs.map +1 -0
  49. package/dist/agent-ui/tools.d.ts +103 -0
  50. package/dist/agent-ui/tools.js +448 -0
  51. package/dist/agent-ui/tools.js.map +1 -0
  52. package/dist/agent-ui/use-agent-target.cjs +63 -0
  53. package/dist/agent-ui/use-agent-target.cjs.map +1 -0
  54. package/dist/agent-ui/use-agent-target.d.ts +27 -0
  55. package/dist/agent-ui/use-agent-target.js +63 -0
  56. package/dist/agent-ui/use-agent-target.js.map +1 -0
  57. package/dist/agent-ui/use-agent-ui.cjs +15 -0
  58. package/dist/agent-ui/use-agent-ui.cjs.map +1 -0
  59. package/dist/agent-ui/use-agent-ui.d.ts +24 -0
  60. package/dist/agent-ui/use-agent-ui.js +15 -0
  61. package/dist/agent-ui/use-agent-ui.js.map +1 -0
  62. package/dist/chat/AthenaChat.cjs +17 -4
  63. package/dist/chat/AthenaChat.cjs.map +1 -1
  64. package/dist/chat/AthenaChat.d.ts +13 -0
  65. package/dist/chat/AthenaChat.js +17 -4
  66. package/dist/chat/AthenaChat.js.map +1 -1
  67. package/dist/chat/StatewireClientToolBridge.cjs +17 -12
  68. package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
  69. package/dist/chat/StatewireClientToolBridge.d.ts +4 -2
  70. package/dist/chat/StatewireClientToolBridge.js +17 -12
  71. package/dist/chat/StatewireClientToolBridge.js.map +1 -1
  72. package/dist/chat/StatewireClientToolConsentCard.cjs +3 -2
  73. package/dist/chat/StatewireClientToolConsentCard.cjs.map +1 -1
  74. package/dist/chat/StatewireClientToolConsentCard.d.ts +2 -1
  75. package/dist/chat/StatewireClientToolConsentCard.js +3 -2
  76. package/dist/chat/StatewireClientToolConsentCard.js.map +1 -1
  77. package/dist/chat/chat-voice-controls.cjs +5 -2
  78. package/dist/chat/chat-voice-controls.cjs.map +1 -1
  79. package/dist/chat/chat-voice-controls.d.ts +6 -1
  80. package/dist/chat/chat-voice-controls.js +6 -3
  81. package/dist/chat/chat-voice-controls.js.map +1 -1
  82. package/dist/chat/client-tool-write-consent.cjs +16 -5
  83. package/dist/chat/client-tool-write-consent.cjs.map +1 -1
  84. package/dist/chat/client-tool-write-consent.d.ts +12 -4
  85. package/dist/chat/client-tool-write-consent.js +16 -5
  86. package/dist/chat/client-tool-write-consent.js.map +1 -1
  87. package/dist/chat-ui/messages/message-components.cjs +1 -1
  88. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  89. package/dist/chat-ui/messages/message-components.d.ts +2 -2
  90. package/dist/chat-ui/messages/message-components.js +1 -1
  91. package/dist/chat-ui/messages/message-components.js.map +1 -1
  92. package/dist/index.cjs +7 -0
  93. package/dist/index.cjs.map +1 -1
  94. package/dist/index.d.ts +6 -0
  95. package/dist/index.js +7 -0
  96. package/dist/index.js.map +1 -1
  97. package/dist/provider/AthenaProvider.cjs +37 -8
  98. package/dist/provider/AthenaProvider.cjs.map +1 -1
  99. package/dist/provider/AthenaProvider.d.ts +18 -1
  100. package/dist/provider/AthenaProvider.js +33 -4
  101. package/dist/provider/AthenaProvider.js.map +1 -1
  102. package/dist/react/package.json.cjs +1 -1
  103. package/dist/react/package.json.js +1 -1
  104. package/dist/styles.css +1 -1
  105. package/package.json +6 -1
@@ -0,0 +1,63 @@
1
+ import { useRef, useEffect, useMemo } from "react";
2
+ import { agentTargetRef, registerAgentTargetHandlers, agentTarget } from "./contract.js";
3
+ const HANDLER_KINDS = ["click", "type", "select", "toggle", "clear", "options", "value"];
4
+ function useAgentTarget({ handlers, ...options }) {
5
+ var _a;
6
+ const ref = agentTargetRef({ id: options.id, key: options.key });
7
+ const latest = useRef(handlers);
8
+ latest.current = handlers;
9
+ const kinds = HANDLER_KINDS.filter((kind) => (handlers == null ? void 0 : handlers[kind]) !== void 0).join(" ");
10
+ useEffect(() => {
11
+ if (!kinds) return;
12
+ const has = new Set(kinds.split(" "));
13
+ const registered = {
14
+ ...has.has("click") ? { click: () => {
15
+ var _a2, _b;
16
+ return (_b = (_a2 = latest.current) == null ? void 0 : _a2.click) == null ? void 0 : _b.call(_a2);
17
+ } } : {},
18
+ ...has.has("type") ? { type: (args) => {
19
+ var _a2, _b;
20
+ return (_b = (_a2 = latest.current) == null ? void 0 : _a2.type) == null ? void 0 : _b.call(_a2, args);
21
+ } } : {},
22
+ ...has.has("select") ? { select: (args) => {
23
+ var _a2, _b;
24
+ return (_b = (_a2 = latest.current) == null ? void 0 : _a2.select) == null ? void 0 : _b.call(_a2, args);
25
+ } } : {},
26
+ ...has.has("toggle") ? { toggle: (args) => {
27
+ var _a2, _b;
28
+ return (_b = (_a2 = latest.current) == null ? void 0 : _a2.toggle) == null ? void 0 : _b.call(_a2, args);
29
+ } } : {},
30
+ ...has.has("clear") ? { clear: () => {
31
+ var _a2, _b;
32
+ return (_b = (_a2 = latest.current) == null ? void 0 : _a2.clear) == null ? void 0 : _b.call(_a2);
33
+ } } : {},
34
+ ...has.has("options") ? { options: () => {
35
+ var _a2, _b;
36
+ return ((_b = (_a2 = latest.current) == null ? void 0 : _a2.options) == null ? void 0 : _b.call(_a2)) ?? [];
37
+ } } : {},
38
+ ...has.has("value") ? { value: () => {
39
+ var _a2, _b;
40
+ return ((_b = (_a2 = latest.current) == null ? void 0 : _a2.value) == null ? void 0 : _b.call(_a2)) ?? null;
41
+ } } : {}
42
+ };
43
+ return registerAgentTargetHandlers({ ref, handlers: registered });
44
+ }, [ref, kinds]);
45
+ const { id, key, label, description, danger, sensitive } = options;
46
+ const actions = (_a = options.actions) == null ? void 0 : _a.join(" ");
47
+ return useMemo(
48
+ () => agentTarget({
49
+ id,
50
+ key,
51
+ label,
52
+ description,
53
+ danger,
54
+ sensitive,
55
+ ...actions === void 0 ? {} : { actions: actions.split(" ").filter(Boolean) }
56
+ }),
57
+ [id, key, label, description, actions, danger, sensitive]
58
+ );
59
+ }
60
+ export {
61
+ useAgentTarget
62
+ };
63
+ //# sourceMappingURL=use-agent-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-agent-target.js","sources":["../../src/agent-ui/use-agent-target.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useMemo, useRef } from 'react';\nimport {\n type AgentTargetHandlers,\n type AgentTargetOptions,\n type AgentTargetProps,\n agentTarget,\n agentTargetRef,\n registerAgentTargetHandlers,\n} from './contract';\n\nexport interface UseAgentTargetOptions extends AgentTargetOptions {\n /**\n * What the target does when ordinary clicks and typing cannot drive it (a\n * custom select, a date picker). Each handler replaces the tool's own input\n * for that action and allows the action.\n */\n handlers?: AgentTargetHandlers;\n}\n\nconst HANDLER_KINDS = ['click', 'type', 'select', 'toggle', 'clear', 'options', 'value'] as const;\n\n/**\n * Make an element an agent target, with types. Spread the returned props on\n * the element:\n *\n * ```tsx\n * const stage = useAgentTarget({\n * id: 'filters.stage',\n * label: 'Stage',\n * description: 'Narrows the table to firms that invest at this stage.',\n * handlers: { select: ({ option }) => setStage(option), options: () => STAGES, value: () => stage },\n * });\n * return <StagePicker {...stage} />;\n * ```\n *\n * Without `handlers` this is `agentTarget(options)`: use that directly inside\n * a loop, where a hook cannot go.\n */\nexport function useAgentTarget({ handlers, ...options }: UseAgentTargetOptions): AgentTargetProps {\n const ref = agentTargetRef({ id: options.id, key: options.key });\n const latest = useRef(handlers);\n latest.current = handlers;\n const kinds = HANDLER_KINDS.filter((kind) => handlers?.[kind] !== undefined).join(' ');\n\n // Registered once per set of handler kinds; each call reads the newest\n // closure, so a re-render never re-registers.\n useEffect(() => {\n if (!kinds) return;\n const has = new Set(kinds.split(' '));\n const registered: AgentTargetHandlers = {\n ...(has.has('click') ? { click: () => latest.current?.click?.() } : {}),\n ...(has.has('type') ? { type: (args) => latest.current?.type?.(args) } : {}),\n ...(has.has('select') ? { select: (args) => latest.current?.select?.(args) } : {}),\n ...(has.has('toggle') ? { toggle: (args) => latest.current?.toggle?.(args) } : {}),\n ...(has.has('clear') ? { clear: () => latest.current?.clear?.() } : {}),\n ...(has.has('options') ? { options: () => latest.current?.options?.() ?? [] } : {}),\n ...(has.has('value') ? { value: () => latest.current?.value?.() ?? null } : {}),\n };\n return registerAgentTargetHandlers({ ref, handlers: registered });\n }, [ref, kinds]);\n\n const { id, key, label, description, danger, sensitive } = options;\n const actions = options.actions?.join(' ');\n return useMemo(\n () =>\n agentTarget({\n id,\n key,\n label,\n description,\n danger,\n sensitive,\n ...(actions === undefined\n ? {}\n : { actions: actions.split(' ').filter(Boolean) as AgentTargetOptions['actions'] }),\n }),\n [id, key, label, description, actions, danger, sensitive],\n );\n}\n"],"names":["_a"],"mappings":";;AAqBA,MAAM,gBAAgB,CAAC,SAAS,QAAQ,UAAU,UAAU,SAAS,WAAW,OAAO;AAmBhF,SAAS,eAAe,EAAE,UAAU,GAAG,WAAoD;;AAChG,QAAM,MAAM,eAAe,EAAE,IAAI,QAAQ,IAAI,KAAK,QAAQ,KAAK;AAC/D,QAAM,SAAS,OAAO,QAAQ;AAC9B,SAAO,UAAU;AACjB,QAAM,QAAQ,cAAc,OAAO,CAAC,UAAS,qCAAW,WAAU,MAAS,EAAE,KAAK,GAAG;AAIrF,YAAU,MAAM;AACd,QAAI,CAAC,MAAO;AACZ,UAAM,MAAM,IAAI,IAAI,MAAM,MAAM,GAAG,CAAC;AACpC,UAAM,aAAkC;AAAA,MACtC,GAAI,IAAI,IAAI,OAAO,IAAI,EAAE,OAAO,MAAA;;AAAM,sBAAAA,MAAA,OAAO,YAAP,gBAAAA,IAAgB,UAAhB,wBAAAA;AAAA,QAAwB,IAAM,CAAA;AAAA,MACpE,GAAI,IAAI,IAAI,MAAM,IAAI,EAAE,MAAM,CAAC,SAAA;;AAAS,sBAAAA,MAAA,OAAO,YAAP,gBAAAA,IAAgB,SAAhB,wBAAAA,KAAuB;AAAA,QAAI,IAAM,CAAA;AAAA,MACzE,GAAI,IAAI,IAAI,QAAQ,IAAI,EAAE,QAAQ,CAAC,SAAA;;AAAS,sBAAAA,MAAA,OAAO,YAAP,gBAAAA,IAAgB,WAAhB,wBAAAA,KAAyB;AAAA,QAAI,IAAM,CAAA;AAAA,MAC/E,GAAI,IAAI,IAAI,QAAQ,IAAI,EAAE,QAAQ,CAAC,SAAA;;AAAS,sBAAAA,MAAA,OAAO,YAAP,gBAAAA,IAAgB,WAAhB,wBAAAA,KAAyB;AAAA,QAAI,IAAM,CAAA;AAAA,MAC/E,GAAI,IAAI,IAAI,OAAO,IAAI,EAAE,OAAO,MAAA;;AAAM,sBAAAA,MAAA,OAAO,YAAP,gBAAAA,IAAgB,UAAhB,wBAAAA;AAAA,QAAwB,IAAM,CAAA;AAAA,MACpE,GAAI,IAAI,IAAI,SAAS,IAAI,EAAE,SAAS;;AAAM,uBAAAA,MAAA,OAAO,YAAP,gBAAAA,IAAgB,YAAhB,wBAAAA,SAA+B,CAAA;AAAA,QAAC,IAAM,CAAA;AAAA,MAChF,GAAI,IAAI,IAAI,OAAO,IAAI,EAAE,OAAO,MAAA;;AAAM,uBAAAA,MAAA,OAAO,YAAP,gBAAAA,IAAgB,UAAhB,wBAAAA,SAA6B;AAAA,QAAA,IAAS,CAAA;AAAA,IAAC;AAE/E,WAAO,4BAA4B,EAAE,KAAK,UAAU,YAAY;AAAA,EAClE,GAAG,CAAC,KAAK,KAAK,CAAC;AAEf,QAAM,EAAE,IAAI,KAAK,OAAO,aAAa,QAAQ,cAAc;AAC3D,QAAM,WAAU,aAAQ,YAAR,mBAAiB,KAAK;AACtC,SAAO;AAAA,IACL,MACE,YAAY;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,YAAY,SACZ,CAAA,IACA,EAAE,SAAS,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO,EAAA;AAAA,IAAmC,CACpF;AAAA,IACH,CAAC,IAAI,KAAK,OAAO,aAAa,SAAS,QAAQ,SAAS;AAAA,EAAA;AAE5D;"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const require$$0 = require("react");
4
+ const tools = require("./tools.cjs");
5
+ function useAgentUi(options = {}) {
6
+ const [agentUi] = require$$0.useState(() => tools.createAgentUi(options));
7
+ agentUi.setOptions(options);
8
+ const acting = options.allowActing !== false;
9
+ const routes = options.navigate ? options.routes ?? [] : [];
10
+ const routesKey = routes.map((route) => [route.id, route.label, route.description ?? ""].join("\0")).join("");
11
+ const tools$1 = require$$0.useMemo(() => agentUi.tools(), [agentUi, acting, routesKey]);
12
+ return { agentUi, tools: tools$1 };
13
+ }
14
+ exports.useAgentUi = useAgentUi;
15
+ //# sourceMappingURL=use-agent-ui.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-agent-ui.cjs","sources":["../../src/agent-ui/use-agent-ui.ts"],"sourcesContent":["'use client';\n\nimport { useMemo, useState } from 'react';\nimport { type AgentUi, type AgentUiOptions, type AgentUiTool, createAgentUi } from './tools';\n\nexport interface UseAgentUi {\n /** The controller: pass it to `AgentUiLayer`. */\n agentUi: AgentUi;\n /** The tools to hand `frontendTools`. The same object until the set of tools changes. */\n tools: Record<string, AgentUiTool>;\n}\n\n/**\n * The agent's tools for the screen the person has open, for a host that wires\n * them itself:\n *\n * ```tsx\n * const { agentUi, tools } = useAgentUi({ agentName: 'Jichard' });\n * return (\n * <AthenaProvider frontendTools={{ ...tools, ...myTools }}>\n * <App />\n * <AgentUiLayer agentUi={agentUi} />\n * </AthenaProvider>\n * );\n * ```\n *\n * `<AthenaProvider agentUi>` does the same in one prop.\n */\nexport function useAgentUi(options: AgentUiOptions = {}): UseAgentUi {\n const [agentUi] = useState(() => createAgentUi(options));\n // The tools run outside render and read the options when called.\n agentUi.setOptions(options);\n\n const acting = options.allowActing !== false;\n const routes = options.navigate ? (options.routes ?? []) : [];\n const routesKey = routes\n .map((route) => [route.id, route.label, route.description ?? ''].join('\\u0000'))\n .join('\\u0001');\n // The tool list is declared to Athena with every message: it changes only\n // when a tool comes or goes, or the pages `go_to` names do.\n // biome-ignore lint/correctness/useExhaustiveDependencies: the keys stand for the options the tools are built from\n const tools = useMemo(() => agentUi.tools(), [agentUi, acting, routesKey]);\n return { agentUi, tools };\n}\n"],"names":["useState","createAgentUi","tools","useMemo"],"mappings":";;;;AA4BO,SAAS,WAAW,UAA0B,IAAgB;AACnE,QAAM,CAAC,OAAO,IAAIA,WAAAA,SAAS,MAAMC,MAAAA,cAAc,OAAO,CAAC;AAEvD,UAAQ,WAAW,OAAO;AAE1B,QAAM,SAAS,QAAQ,gBAAgB;AACvC,QAAM,SAAS,QAAQ,WAAY,QAAQ,UAAU,CAAA,IAAM,CAAA;AAC3D,QAAM,YAAY,OACf,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,MAAM,OAAO,MAAM,eAAe,EAAE,EAAE,KAAK,IAAQ,CAAC,EAC9E,KAAK,GAAQ;AAIhB,QAAMC,UAAQC,mBAAQ,MAAM,QAAQ,MAAA,GAAS,CAAC,SAAS,QAAQ,SAAS,CAAC;AACzE,SAAO,EAAE,gBAASD,QAAA;AACpB;;"}
@@ -0,0 +1,24 @@
1
+ import { type AgentUi, type AgentUiOptions, type AgentUiTool } from './tools';
2
+ export interface UseAgentUi {
3
+ /** The controller: pass it to `AgentUiLayer`. */
4
+ agentUi: AgentUi;
5
+ /** The tools to hand `frontendTools`. The same object until the set of tools changes. */
6
+ tools: Record<string, AgentUiTool>;
7
+ }
8
+ /**
9
+ * The agent's tools for the screen the person has open, for a host that wires
10
+ * them itself:
11
+ *
12
+ * ```tsx
13
+ * const { agentUi, tools } = useAgentUi({ agentName: 'Jichard' });
14
+ * return (
15
+ * <AthenaProvider frontendTools={{ ...tools, ...myTools }}>
16
+ * <App />
17
+ * <AgentUiLayer agentUi={agentUi} />
18
+ * </AthenaProvider>
19
+ * );
20
+ * ```
21
+ *
22
+ * `<AthenaProvider agentUi>` does the same in one prop.
23
+ */
24
+ export declare function useAgentUi(options?: AgentUiOptions): UseAgentUi;
@@ -0,0 +1,15 @@
1
+ import { useState, useMemo } from "react";
2
+ import { createAgentUi } from "./tools.js";
3
+ function useAgentUi(options = {}) {
4
+ const [agentUi] = useState(() => createAgentUi(options));
5
+ agentUi.setOptions(options);
6
+ const acting = options.allowActing !== false;
7
+ const routes = options.navigate ? options.routes ?? [] : [];
8
+ const routesKey = routes.map((route) => [route.id, route.label, route.description ?? ""].join("\0")).join("");
9
+ const tools = useMemo(() => agentUi.tools(), [agentUi, acting, routesKey]);
10
+ return { agentUi, tools };
11
+ }
12
+ export {
13
+ useAgentUi
14
+ };
15
+ //# sourceMappingURL=use-agent-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-agent-ui.js","sources":["../../src/agent-ui/use-agent-ui.ts"],"sourcesContent":["'use client';\n\nimport { useMemo, useState } from 'react';\nimport { type AgentUi, type AgentUiOptions, type AgentUiTool, createAgentUi } from './tools';\n\nexport interface UseAgentUi {\n /** The controller: pass it to `AgentUiLayer`. */\n agentUi: AgentUi;\n /** The tools to hand `frontendTools`. The same object until the set of tools changes. */\n tools: Record<string, AgentUiTool>;\n}\n\n/**\n * The agent's tools for the screen the person has open, for a host that wires\n * them itself:\n *\n * ```tsx\n * const { agentUi, tools } = useAgentUi({ agentName: 'Jichard' });\n * return (\n * <AthenaProvider frontendTools={{ ...tools, ...myTools }}>\n * <App />\n * <AgentUiLayer agentUi={agentUi} />\n * </AthenaProvider>\n * );\n * ```\n *\n * `<AthenaProvider agentUi>` does the same in one prop.\n */\nexport function useAgentUi(options: AgentUiOptions = {}): UseAgentUi {\n const [agentUi] = useState(() => createAgentUi(options));\n // The tools run outside render and read the options when called.\n agentUi.setOptions(options);\n\n const acting = options.allowActing !== false;\n const routes = options.navigate ? (options.routes ?? []) : [];\n const routesKey = routes\n .map((route) => [route.id, route.label, route.description ?? ''].join('\\u0000'))\n .join('\\u0001');\n // The tool list is declared to Athena with every message: it changes only\n // when a tool comes or goes, or the pages `go_to` names do.\n // biome-ignore lint/correctness/useExhaustiveDependencies: the keys stand for the options the tools are built from\n const tools = useMemo(() => agentUi.tools(), [agentUi, acting, routesKey]);\n return { agentUi, tools };\n}\n"],"names":[],"mappings":";;AA4BO,SAAS,WAAW,UAA0B,IAAgB;AACnE,QAAM,CAAC,OAAO,IAAI,SAAS,MAAM,cAAc,OAAO,CAAC;AAEvD,UAAQ,WAAW,OAAO;AAE1B,QAAM,SAAS,QAAQ,gBAAgB;AACvC,QAAM,SAAS,QAAQ,WAAY,QAAQ,UAAU,CAAA,IAAM,CAAA;AAC3D,QAAM,YAAY,OACf,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,MAAM,OAAO,MAAM,eAAe,EAAE,EAAE,KAAK,IAAQ,CAAC,EAC9E,KAAK,GAAQ;AAIhB,QAAM,QAAQ,QAAQ,MAAM,QAAQ,MAAA,GAAS,CAAC,SAAS,QAAQ,SAAS,CAAC;AACzE,SAAO,EAAE,SAAS,MAAA;AACpB;"}
@@ -183,6 +183,7 @@ const AthenaChatContent = ({
183
183
  className,
184
184
  welcomeMessage = "Hello there!",
185
185
  welcomeSubtext = "What can I help you with?",
186
+ welcomeContent,
186
187
  maxWidth = "46rem",
187
188
  turnAnchor = "bottom",
188
189
  readOnly = false,
@@ -350,7 +351,7 @@ const AthenaChatContent = ({
350
351
  /* @__PURE__ */ jsxRuntime.jsx(handoffCursor.HandoffCursorReveal, { threadId: statewireThreadId }),
351
352
  /* @__PURE__ */ jsxRuntime.jsx(ThreadScrollToTop, {})
352
353
  ] }),
353
- welcome: /* @__PURE__ */ jsxRuntime.jsx(athenaChatWelcome.AthenaChatWelcome, { welcomeMessage, welcomeSubtext }),
354
+ welcome: welcomeContent ?? /* @__PURE__ */ jsxRuntime.jsx(athenaChatWelcome.AthenaChatWelcome, { welcomeMessage, welcomeSubtext }),
354
355
  beforeMessages: /* @__PURE__ */ jsxRuntime.jsx(statewireHistoryEdge.StatewireHistoryEdge, { className: "aui-thread-history-edge" }),
355
356
  components: messageComponents$1,
356
357
  runningIndicator: null,
@@ -599,6 +600,10 @@ const AthenaChatComposer = ({
599
600
  const hasExtras = attachments.length > 0 || quote !== null;
600
601
  const sendStateRef = require$$0.useRef({ isRunning, liveVoice: false });
601
602
  sendStateRef.current = { isRunning, liveVoice: voice.phase === "live" && !hasExtras };
603
+ const voiceDisabled = isUploading || dictationCtl.isActive || !statewireLifecycle.isStatewireChannelLive(connection);
604
+ const voiceCallIdle = voice.phase !== "live" && voice.phase !== "connecting";
605
+ const voiceMerged = (slots == null ? void 0 : slots.voiceInSend) === true && voiceEnabled && voiceCallIdle;
606
+ const voiceAsSend = voiceMerged && !hasText && !hasExtras && !isRunning;
602
607
  const onBeforeSend = slots == null ? void 0 : slots.onBeforeSend;
603
608
  const beforeSubmit = require$$0.useCallback(
604
609
  async ({ text }) => {
@@ -931,15 +936,23 @@ const AthenaChatComposer = ({
931
936
  disabledReason: needsConnectionReason
932
937
  }
933
938
  ),
934
- voiceEnabled && /* @__PURE__ */ jsxRuntime.jsx(
939
+ voiceEnabled && !voiceMerged && /* @__PURE__ */ jsxRuntime.jsx(
935
940
  chatVoiceControls.ChatVoiceButton,
936
941
  {
937
942
  voice,
938
- disabled: isUploading || dictationCtl.isActive || !statewireLifecycle.isStatewireChannelLive(connection),
943
+ disabled: voiceDisabled,
939
944
  disabledReason: needsConnectionReason
940
945
  }
941
946
  ),
942
- /* @__PURE__ */ jsxRuntime.jsx(
947
+ voiceAsSend ? /* @__PURE__ */ jsxRuntime.jsx(
948
+ chatVoiceControls.ChatVoiceButton,
949
+ {
950
+ voice,
951
+ appearance: "send",
952
+ disabled: voiceDisabled,
953
+ disabledReason: needsConnectionReason
954
+ }
955
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
943
956
  composerSendOrStop.ComposerSendOrStop,
944
957
  {
945
958
  composerRef,