@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.
- package/README.md +157 -5
- package/dist/agent-ui/AgentTarget.cjs +11 -0
- package/dist/agent-ui/AgentTarget.cjs.map +1 -0
- package/dist/agent-ui/AgentTarget.d.ts +17 -0
- package/dist/agent-ui/AgentTarget.js +11 -0
- package/dist/agent-ui/AgentTarget.js.map +1 -0
- package/dist/agent-ui/AgentUiLayer.cjs +387 -0
- package/dist/agent-ui/AgentUiLayer.cjs.map +1 -0
- package/dist/agent-ui/AgentUiLayer.d.ts +40 -0
- package/dist/agent-ui/AgentUiLayer.js +387 -0
- package/dist/agent-ui/AgentUiLayer.js.map +1 -0
- package/dist/agent-ui/contract.cjs +104 -0
- package/dist/agent-ui/contract.cjs.map +1 -0
- package/dist/agent-ui/contract.d.ts +113 -0
- package/dist/agent-ui/contract.js +104 -0
- package/dist/agent-ui/contract.js.map +1 -0
- package/dist/agent-ui/driver.cjs +335 -0
- package/dist/agent-ui/driver.cjs.map +1 -0
- package/dist/agent-ui/driver.d.ts +66 -0
- package/dist/agent-ui/driver.js +335 -0
- package/dist/agent-ui/driver.js.map +1 -0
- package/dist/agent-ui/index.cjs +33 -0
- package/dist/agent-ui/index.cjs.map +1 -0
- package/dist/agent-ui/index.d.ts +19 -0
- package/dist/agent-ui/index.js +33 -0
- package/dist/agent-ui/index.js.map +1 -0
- package/dist/agent-ui/pace.cjs +121 -0
- package/dist/agent-ui/pace.cjs.map +1 -0
- package/dist/agent-ui/pace.d.ts +66 -0
- package/dist/agent-ui/pace.js +121 -0
- package/dist/agent-ui/pace.js.map +1 -0
- package/dist/agent-ui/screen.cjs +471 -0
- package/dist/agent-ui/screen.cjs.map +1 -0
- package/dist/agent-ui/screen.d.ts +97 -0
- package/dist/agent-ui/screen.js +471 -0
- package/dist/agent-ui/screen.js.map +1 -0
- package/dist/agent-ui/secret-fields.cjs +50 -0
- package/dist/agent-ui/secret-fields.cjs.map +1 -0
- package/dist/agent-ui/secret-fields.d.ts +15 -0
- package/dist/agent-ui/secret-fields.js +50 -0
- package/dist/agent-ui/secret-fields.js.map +1 -0
- package/dist/agent-ui/stage.cjs +196 -0
- package/dist/agent-ui/stage.cjs.map +1 -0
- package/dist/agent-ui/stage.d.ts +110 -0
- package/dist/agent-ui/stage.js +196 -0
- package/dist/agent-ui/stage.js.map +1 -0
- package/dist/agent-ui/tools.cjs +448 -0
- package/dist/agent-ui/tools.cjs.map +1 -0
- package/dist/agent-ui/tools.d.ts +103 -0
- package/dist/agent-ui/tools.js +448 -0
- package/dist/agent-ui/tools.js.map +1 -0
- package/dist/agent-ui/use-agent-target.cjs +63 -0
- package/dist/agent-ui/use-agent-target.cjs.map +1 -0
- package/dist/agent-ui/use-agent-target.d.ts +27 -0
- package/dist/agent-ui/use-agent-target.js +63 -0
- package/dist/agent-ui/use-agent-target.js.map +1 -0
- package/dist/agent-ui/use-agent-ui.cjs +15 -0
- package/dist/agent-ui/use-agent-ui.cjs.map +1 -0
- package/dist/agent-ui/use-agent-ui.d.ts +24 -0
- package/dist/agent-ui/use-agent-ui.js +15 -0
- package/dist/agent-ui/use-agent-ui.js.map +1 -0
- package/dist/chat/AthenaChat.cjs +17 -4
- package/dist/chat/AthenaChat.cjs.map +1 -1
- package/dist/chat/AthenaChat.d.ts +13 -0
- package/dist/chat/AthenaChat.js +17 -4
- package/dist/chat/AthenaChat.js.map +1 -1
- package/dist/chat/StatewireClientToolBridge.cjs +17 -12
- package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
- package/dist/chat/StatewireClientToolBridge.d.ts +4 -2
- package/dist/chat/StatewireClientToolBridge.js +17 -12
- package/dist/chat/StatewireClientToolBridge.js.map +1 -1
- package/dist/chat/StatewireClientToolConsentCard.cjs +3 -2
- package/dist/chat/StatewireClientToolConsentCard.cjs.map +1 -1
- package/dist/chat/StatewireClientToolConsentCard.d.ts +2 -1
- package/dist/chat/StatewireClientToolConsentCard.js +3 -2
- package/dist/chat/StatewireClientToolConsentCard.js.map +1 -1
- package/dist/chat/chat-voice-controls.cjs +5 -2
- package/dist/chat/chat-voice-controls.cjs.map +1 -1
- package/dist/chat/chat-voice-controls.d.ts +6 -1
- package/dist/chat/chat-voice-controls.js +6 -3
- package/dist/chat/chat-voice-controls.js.map +1 -1
- package/dist/chat/client-tool-write-consent.cjs +16 -5
- package/dist/chat/client-tool-write-consent.cjs.map +1 -1
- package/dist/chat/client-tool-write-consent.d.ts +12 -4
- package/dist/chat/client-tool-write-consent.js +16 -5
- package/dist/chat/client-tool-write-consent.js.map +1 -1
- package/dist/chat-ui/messages/message-components.cjs +1 -1
- package/dist/chat-ui/messages/message-components.cjs.map +1 -1
- package/dist/chat-ui/messages/message-components.d.ts +2 -2
- package/dist/chat-ui/messages/message-components.js +1 -1
- package/dist/chat-ui/messages/message-components.js.map +1 -1
- package/dist/index.cjs +7 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/provider/AthenaProvider.cjs +37 -8
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.d.ts +18 -1
- package/dist/provider/AthenaProvider.js +33 -4
- package/dist/provider/AthenaProvider.js.map +1 -1
- package/dist/react/package.json.cjs +1 -1
- package/dist/react/package.json.js +1 -1
- package/dist/styles.css +1 -1
- 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;"}
|
package/dist/chat/AthenaChat.cjs
CHANGED
|
@@ -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:
|
|
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,
|