@athenaintel/react 0.60.0 → 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 (137) hide show
  1. package/README.md +225 -2
  2. package/dist/agent-runtime/src/client-tool-bridge.cjs +20 -2
  3. package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
  4. package/dist/agent-runtime/src/client-tool-bridge.d.ts +9 -4
  5. package/dist/agent-runtime/src/client-tool-bridge.js +20 -2
  6. package/dist/agent-runtime/src/client-tool-bridge.js.map +1 -1
  7. package/dist/agent-runtime/src/client-tools.cjs.map +1 -1
  8. package/dist/agent-runtime/src/client-tools.d.ts +9 -0
  9. package/dist/agent-runtime/src/client-tools.js.map +1 -1
  10. package/dist/agent-ui/AgentTarget.cjs +11 -0
  11. package/dist/agent-ui/AgentTarget.cjs.map +1 -0
  12. package/dist/agent-ui/AgentTarget.d.ts +17 -0
  13. package/dist/agent-ui/AgentTarget.js +11 -0
  14. package/dist/agent-ui/AgentTarget.js.map +1 -0
  15. package/dist/agent-ui/AgentUiLayer.cjs +387 -0
  16. package/dist/agent-ui/AgentUiLayer.cjs.map +1 -0
  17. package/dist/agent-ui/AgentUiLayer.d.ts +40 -0
  18. package/dist/agent-ui/AgentUiLayer.js +387 -0
  19. package/dist/agent-ui/AgentUiLayer.js.map +1 -0
  20. package/dist/agent-ui/contract.cjs +104 -0
  21. package/dist/agent-ui/contract.cjs.map +1 -0
  22. package/dist/agent-ui/contract.d.ts +113 -0
  23. package/dist/agent-ui/contract.js +104 -0
  24. package/dist/agent-ui/contract.js.map +1 -0
  25. package/dist/agent-ui/driver.cjs +335 -0
  26. package/dist/agent-ui/driver.cjs.map +1 -0
  27. package/dist/agent-ui/driver.d.ts +66 -0
  28. package/dist/agent-ui/driver.js +335 -0
  29. package/dist/agent-ui/driver.js.map +1 -0
  30. package/dist/agent-ui/index.cjs +33 -0
  31. package/dist/agent-ui/index.cjs.map +1 -0
  32. package/dist/agent-ui/index.d.ts +19 -0
  33. package/dist/agent-ui/index.js +33 -0
  34. package/dist/agent-ui/index.js.map +1 -0
  35. package/dist/agent-ui/pace.cjs +121 -0
  36. package/dist/agent-ui/pace.cjs.map +1 -0
  37. package/dist/agent-ui/pace.d.ts +66 -0
  38. package/dist/agent-ui/pace.js +121 -0
  39. package/dist/agent-ui/pace.js.map +1 -0
  40. package/dist/agent-ui/screen.cjs +471 -0
  41. package/dist/agent-ui/screen.cjs.map +1 -0
  42. package/dist/agent-ui/screen.d.ts +97 -0
  43. package/dist/agent-ui/screen.js +471 -0
  44. package/dist/agent-ui/screen.js.map +1 -0
  45. package/dist/agent-ui/secret-fields.cjs +50 -0
  46. package/dist/agent-ui/secret-fields.cjs.map +1 -0
  47. package/dist/agent-ui/secret-fields.d.ts +15 -0
  48. package/dist/agent-ui/secret-fields.js +50 -0
  49. package/dist/agent-ui/secret-fields.js.map +1 -0
  50. package/dist/agent-ui/stage.cjs +196 -0
  51. package/dist/agent-ui/stage.cjs.map +1 -0
  52. package/dist/agent-ui/stage.d.ts +110 -0
  53. package/dist/agent-ui/stage.js +196 -0
  54. package/dist/agent-ui/stage.js.map +1 -0
  55. package/dist/agent-ui/tools.cjs +448 -0
  56. package/dist/agent-ui/tools.cjs.map +1 -0
  57. package/dist/agent-ui/tools.d.ts +103 -0
  58. package/dist/agent-ui/tools.js +448 -0
  59. package/dist/agent-ui/tools.js.map +1 -0
  60. package/dist/agent-ui/use-agent-target.cjs +63 -0
  61. package/dist/agent-ui/use-agent-target.cjs.map +1 -0
  62. package/dist/agent-ui/use-agent-target.d.ts +27 -0
  63. package/dist/agent-ui/use-agent-target.js +63 -0
  64. package/dist/agent-ui/use-agent-target.js.map +1 -0
  65. package/dist/agent-ui/use-agent-ui.cjs +15 -0
  66. package/dist/agent-ui/use-agent-ui.cjs.map +1 -0
  67. package/dist/agent-ui/use-agent-ui.d.ts +24 -0
  68. package/dist/agent-ui/use-agent-ui.js +15 -0
  69. package/dist/agent-ui/use-agent-ui.js.map +1 -0
  70. package/dist/chat/AthenaChat.cjs +19 -4
  71. package/dist/chat/AthenaChat.cjs.map +1 -1
  72. package/dist/chat/AthenaChat.d.ts +13 -0
  73. package/dist/chat/AthenaChat.js +19 -4
  74. package/dist/chat/AthenaChat.js.map +1 -1
  75. package/dist/chat/StatewireClientToolBridge.cjs +74 -1
  76. package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
  77. package/dist/chat/StatewireClientToolBridge.d.ts +16 -1
  78. package/dist/chat/StatewireClientToolBridge.js +75 -2
  79. package/dist/chat/StatewireClientToolBridge.js.map +1 -1
  80. package/dist/chat/StatewireClientToolConsentCard.cjs +66 -0
  81. package/dist/chat/StatewireClientToolConsentCard.cjs.map +1 -0
  82. package/dist/chat/StatewireClientToolConsentCard.d.ts +25 -0
  83. package/dist/chat/StatewireClientToolConsentCard.js +66 -0
  84. package/dist/chat/StatewireClientToolConsentCard.js.map +1 -0
  85. package/dist/chat/chat-voice-controls.cjs +5 -2
  86. package/dist/chat/chat-voice-controls.cjs.map +1 -1
  87. package/dist/chat/chat-voice-controls.d.ts +6 -1
  88. package/dist/chat/chat-voice-controls.js +6 -3
  89. package/dist/chat/chat-voice-controls.js.map +1 -1
  90. package/dist/chat/client-tool-write-consent.cjs +122 -0
  91. package/dist/chat/client-tool-write-consent.cjs.map +1 -0
  92. package/dist/chat/client-tool-write-consent.d.ts +79 -0
  93. package/dist/chat/client-tool-write-consent.js +122 -0
  94. package/dist/chat/client-tool-write-consent.js.map +1 -0
  95. package/dist/chat/statewire-client-tools.cjs +30 -5
  96. package/dist/chat/statewire-client-tools.cjs.map +1 -1
  97. package/dist/chat/statewire-client-tools.d.ts +34 -2
  98. package/dist/chat/statewire-client-tools.js +30 -5
  99. package/dist/chat/statewire-client-tools.js.map +1 -1
  100. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs +13 -0
  101. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs.map +1 -1
  102. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.d.ts +12 -0
  103. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js +13 -0
  104. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js.map +1 -1
  105. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +2 -1
  106. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  107. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +3 -2
  108. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  109. package/dist/chat-ui/mentions/use-asset-icon-app-url.cjs +2 -1
  110. package/dist/chat-ui/mentions/use-asset-icon-app-url.cjs.map +1 -1
  111. package/dist/chat-ui/mentions/use-asset-icon-app-url.d.ts +2 -1
  112. package/dist/chat-ui/mentions/use-asset-icon-app-url.js +2 -1
  113. package/dist/chat-ui/mentions/use-asset-icon-app-url.js.map +1 -1
  114. package/dist/chat-ui/messages/message-components.cjs +1 -1
  115. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  116. package/dist/chat-ui/messages/message-components.d.ts +2 -2
  117. package/dist/chat-ui/messages/message-components.js +1 -1
  118. package/dist/chat-ui/messages/message-components.js.map +1 -1
  119. package/dist/chat-ui/statewire.cjs +4 -0
  120. package/dist/chat-ui/statewire.cjs.map +1 -1
  121. package/dist/chat-ui/statewire.d.ts +2 -0
  122. package/dist/chat-ui/statewire.js +4 -0
  123. package/dist/chat-ui/statewire.js.map +1 -1
  124. package/dist/index.cjs +12 -0
  125. package/dist/index.cjs.map +1 -1
  126. package/dist/index.d.ts +12 -2
  127. package/dist/index.js +13 -1
  128. package/dist/index.js.map +1 -1
  129. package/dist/provider/AthenaProvider.cjs +59 -11
  130. package/dist/provider/AthenaProvider.cjs.map +1 -1
  131. package/dist/provider/AthenaProvider.d.ts +25 -1
  132. package/dist/provider/AthenaProvider.js +55 -7
  133. package/dist/provider/AthenaProvider.js.map +1 -1
  134. package/dist/react/package.json.cjs +1 -1
  135. package/dist/react/package.json.js +1 -1
  136. package/dist/styles.css +1 -1
  137. 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;"}
@@ -4,6 +4,7 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const tiptapText = require("./tiptap-text.cjs");
5
5
  const AthenaChatErrorBoundary = require("./AthenaChatErrorBoundary.cjs");
6
6
  const StatewireApprovalCard = require("./StatewireApprovalCard.cjs");
7
+ const StatewireClientToolConsentCard = require("./StatewireClientToolConsentCard.cjs");
7
8
  const StatewireTypedInterruptCard = require("./typed-interrupts/StatewireTypedInterruptCard.cjs");
8
9
  const AthenaPlanStrip = require("./AthenaPlanStrip.cjs");
9
10
  const StatewireQueuedMessages = require("./StatewireQueuedMessages.cjs");
@@ -182,6 +183,7 @@ const AthenaChatContent = ({
182
183
  className,
183
184
  welcomeMessage = "Hello there!",
184
185
  welcomeSubtext = "What can I help you with?",
186
+ welcomeContent,
185
187
  maxWidth = "46rem",
186
188
  turnAnchor = "bottom",
187
189
  readOnly = false,
@@ -349,7 +351,7 @@ const AthenaChatContent = ({
349
351
  /* @__PURE__ */ jsxRuntime.jsx(handoffCursor.HandoffCursorReveal, { threadId: statewireThreadId }),
350
352
  /* @__PURE__ */ jsxRuntime.jsx(ThreadScrollToTop, {})
351
353
  ] }),
352
- welcome: /* @__PURE__ */ jsxRuntime.jsx(athenaChatWelcome.AthenaChatWelcome, { welcomeMessage, welcomeSubtext }),
354
+ welcome: welcomeContent ?? /* @__PURE__ */ jsxRuntime.jsx(athenaChatWelcome.AthenaChatWelcome, { welcomeMessage, welcomeSubtext }),
353
355
  beforeMessages: /* @__PURE__ */ jsxRuntime.jsx(statewireHistoryEdge.StatewireHistoryEdge, { className: "aui-thread-history-edge" }),
354
356
  components: messageComponents$1,
355
357
  runningIndicator: null,
@@ -368,6 +370,7 @@ const AthenaChatContent = ({
368
370
  typedInterrupts: StatewireTypedInterruptCard.statewireTypedInterrupts
369
371
  }
370
372
  ),
373
+ /* @__PURE__ */ jsxRuntime.jsx(StatewireClientToolConsentCard.StatewireClientToolConsentCard, {}),
371
374
  plan === void 0 ? /* @__PURE__ */ jsxRuntime.jsx(AthenaPlanStrip.AthenaPlanStrip, { className: "mx-3" }) : plan,
372
375
  /* @__PURE__ */ jsxRuntime.jsx(StatewireQueuedMessages.StatewireQueuedMessages, {}),
373
376
  /* @__PURE__ */ jsxRuntime.jsx(AttachmentContext.AttachmentProvider, { children: /* @__PURE__ */ jsxRuntime.jsxs(QuoteContext.QuoteProvider, { children: [
@@ -597,6 +600,10 @@ const AthenaChatComposer = ({
597
600
  const hasExtras = attachments.length > 0 || quote !== null;
598
601
  const sendStateRef = require$$0.useRef({ isRunning, liveVoice: false });
599
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;
600
607
  const onBeforeSend = slots == null ? void 0 : slots.onBeforeSend;
601
608
  const beforeSubmit = require$$0.useCallback(
602
609
  async ({ text }) => {
@@ -929,15 +936,23 @@ const AthenaChatComposer = ({
929
936
  disabledReason: needsConnectionReason
930
937
  }
931
938
  ),
932
- voiceEnabled && /* @__PURE__ */ jsxRuntime.jsx(
939
+ voiceEnabled && !voiceMerged && /* @__PURE__ */ jsxRuntime.jsx(
933
940
  chatVoiceControls.ChatVoiceButton,
934
941
  {
935
942
  voice,
936
- disabled: isUploading || dictationCtl.isActive || !statewireLifecycle.isStatewireChannelLive(connection),
943
+ disabled: voiceDisabled,
937
944
  disabledReason: needsConnectionReason
938
945
  }
939
946
  ),
940
- /* @__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(
941
956
  composerSendOrStop.ComposerSendOrStop,
942
957
  {
943
958
  composerRef,