@smooai/smooth-operator 0.1.0 → 0.2.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 (81) hide show
  1. package/README.md +18 -4
  2. package/dist/react/components/SmoothChat.d.ts +35 -0
  3. package/dist/react/components/SmoothChat.d.ts.map +1 -0
  4. package/dist/react/components/SmoothChat.js +26 -0
  5. package/dist/react/components/SmoothChat.js.map +1 -0
  6. package/dist/react/components/parts.d.ts +30 -0
  7. package/dist/react/components/parts.d.ts.map +1 -0
  8. package/dist/react/components/parts.js +67 -0
  9. package/dist/react/components/parts.js.map +1 -0
  10. package/dist/react/index.d.ts +27 -0
  11. package/dist/react/index.d.ts.map +1 -0
  12. package/dist/react/index.js +26 -0
  13. package/dist/react/index.js.map +1 -0
  14. package/dist/react/provider.d.ts +27 -0
  15. package/dist/react/provider.d.ts.map +1 -0
  16. package/dist/react/provider.js +25 -0
  17. package/dist/react/provider.js.map +1 -0
  18. package/dist/react/response.d.ts +19 -0
  19. package/dist/react/response.d.ts.map +1 -0
  20. package/dist/react/response.js +53 -0
  21. package/dist/react/response.js.map +1 -0
  22. package/dist/react/theme.d.ts +64 -0
  23. package/dist/react/theme.d.ts.map +1 -0
  24. package/dist/react/theme.js +38 -0
  25. package/dist/react/theme.js.map +1 -0
  26. package/dist/react/types.d.ts +24 -0
  27. package/dist/react/types.d.ts.map +1 -0
  28. package/dist/react/types.js +2 -0
  29. package/dist/react/types.js.map +1 -0
  30. package/dist/react/use-conversation.d.ts +59 -0
  31. package/dist/react/use-conversation.d.ts.map +1 -0
  32. package/dist/react/use-conversation.js +154 -0
  33. package/dist/react/use-conversation.js.map +1 -0
  34. package/dist/widget/chat-widget.iife.js +1301 -0
  35. package/dist/widget/chat-widget.iife.js.map +1 -0
  36. package/dist/widget/config.d.ts +73 -0
  37. package/dist/widget/config.d.ts.map +1 -0
  38. package/dist/widget/config.js +30 -0
  39. package/dist/widget/config.js.map +1 -0
  40. package/dist/widget/conversation.d.ts +50 -0
  41. package/dist/widget/conversation.d.ts.map +1 -0
  42. package/dist/widget/conversation.js +173 -0
  43. package/dist/widget/conversation.js.map +1 -0
  44. package/dist/widget/element.d.ts +94 -0
  45. package/dist/widget/element.d.ts.map +1 -0
  46. package/dist/widget/element.js +377 -0
  47. package/dist/widget/element.js.map +1 -0
  48. package/dist/widget/index.d.ts +25 -0
  49. package/dist/widget/index.d.ts.map +1 -0
  50. package/dist/widget/index.js +24 -0
  51. package/dist/widget/index.js.map +1 -0
  52. package/dist/widget/logo.d.ts +9 -0
  53. package/dist/widget/logo.d.ts.map +1 -0
  54. package/dist/widget/logo.js +10 -0
  55. package/dist/widget/logo.js.map +1 -0
  56. package/dist/widget/standalone.d.ts +25 -0
  57. package/dist/widget/standalone.d.ts.map +1 -0
  58. package/dist/widget/standalone.js +15 -0
  59. package/dist/widget/standalone.js.map +1 -0
  60. package/dist/widget/styles.d.ts +12 -0
  61. package/dist/widget/styles.d.ts.map +1 -0
  62. package/dist/widget/styles.js +262 -0
  63. package/dist/widget/styles.js.map +1 -0
  64. package/package.json +44 -6
  65. package/src/react/components/SmoothChat.tsx +57 -0
  66. package/src/react/components/parts.tsx +141 -0
  67. package/src/react/index.ts +30 -0
  68. package/src/react/provider.tsx +40 -0
  69. package/src/react/response.ts +57 -0
  70. package/src/react/styles.css +231 -0
  71. package/src/react/theme.ts +92 -0
  72. package/src/react/types.ts +27 -0
  73. package/src/react/use-conversation.ts +203 -0
  74. package/src/widget/config.ts +102 -0
  75. package/src/widget/conversation.ts +212 -0
  76. package/src/widget/element.ts +420 -0
  77. package/src/widget/index.ts +37 -0
  78. package/src/widget/logo.ts +9 -0
  79. package/src/widget/smooth-logo.svg +32 -0
  80. package/src/widget/standalone.ts +33 -0
  81. package/src/widget/styles.ts +265 -0
@@ -0,0 +1,59 @@
1
+ /**
2
+ * useConversation — the headless core of the React bindings.
3
+ *
4
+ * This hook owns the entire conversation lifecycle (connect → session → stream)
5
+ * and exposes nothing but state + actions, so you can render a completely custom
6
+ * UI with zero styling opinions from this package. `<SmoothChat>` and the parts
7
+ * components are thin views over exactly this hook.
8
+ *
9
+ * It is the React analogue of the widget's `ConversationController`: same wire
10
+ * flow, same defensive payload reading, but message state lives in React so your
11
+ * components re-render on every streamed token.
12
+ */
13
+ import { SmoothAgentClient } from '../client.js';
14
+ import type { ChatMessage, ConnectionStatus } from './types.js';
15
+ export interface UseConversationOptions {
16
+ /** WebSocket endpoint, e.g. `wss://your-host/ws`. Ignored if `client` is given. */
17
+ url?: string;
18
+ /**
19
+ * Bring your own pre-constructed {@link SmoothAgentClient} (e.g. one created by
20
+ * a {@link SmoothOperatorProvider} and shared, or one with a custom transport
21
+ * for tests). When provided, the hook does NOT own the client's lifecycle —
22
+ * it won't disconnect it on unmount.
23
+ */
24
+ client?: SmoothAgentClient;
25
+ /** UUID of the agent to converse with. */
26
+ agentId: string;
27
+ /** Optional display name for the user participant. */
28
+ userName?: string;
29
+ /** Optional email for the user participant. */
30
+ userEmail?: string;
31
+ /**
32
+ * Short-lived auth token for BYO-auth deployments. Appended to the WS URL as
33
+ * `?token=…` (browsers can't set WebSocket headers), which the server reads
34
+ * into the request `Principal` / `AccessContext`. Ignored if `client` is given.
35
+ */
36
+ authToken?: string;
37
+ /** Connect automatically on mount. Default `true`. */
38
+ autoConnect?: boolean;
39
+ /** Message shown in the assistant bubble when the connection fails mid-turn. */
40
+ connectionErrorMessage?: string;
41
+ }
42
+ export interface UseConversationResult {
43
+ /** Current connection lifecycle state. */
44
+ status: ConnectionStatus;
45
+ /** The ordered message list (re-renders on every streamed token). */
46
+ messages: ChatMessage[];
47
+ /** Last error message, or `null`. */
48
+ error: string | null;
49
+ /** The active session id once a session has been created. */
50
+ sessionId: string | null;
51
+ /** Open the transport + create a conversation session. Idempotent. */
52
+ connect: () => Promise<void>;
53
+ /** Submit a user message and stream the assistant reply into `messages`. */
54
+ send: (text: string) => Promise<void>;
55
+ /** Tear down the client (only if this hook owns it) and reset to `closed`. */
56
+ disconnect: () => void;
57
+ }
58
+ export declare function useConversation(options: UseConversationOptions): UseConversationResult;
59
+ //# sourceMappingURL=use-conversation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-conversation.d.ts","sourceRoot":"","sources":["../../src/react/use-conversation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAiB,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGhE,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,sBAAsB;IACnC,mFAAmF;IACnF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gFAAgF;IAChF,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,qBAAqB;IAClC,0CAA0C;IAC1C,MAAM,EAAE,gBAAgB,CAAC;IACzB,qEAAqE;IACrE,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,qCAAqC;IACrC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,sEAAsE;IACtE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,4EAA4E;IAC5E,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,8EAA8E;IAC9E,UAAU,EAAE,MAAM,IAAI,CAAC;CAC1B;AASD,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,qBAAqB,CAqItF"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * useConversation — the headless core of the React bindings.
3
+ *
4
+ * This hook owns the entire conversation lifecycle (connect → session → stream)
5
+ * and exposes nothing but state + actions, so you can render a completely custom
6
+ * UI with zero styling opinions from this package. `<SmoothChat>` and the parts
7
+ * components are thin views over exactly this hook.
8
+ *
9
+ * It is the React analogue of the widget's `ConversationController`: same wire
10
+ * flow, same defensive payload reading, but message state lives in React so your
11
+ * components re-render on every streamed token.
12
+ */
13
+ import { ProtocolError, SmoothAgentClient } from '../client.js';
14
+ import { useCallback, useEffect, useRef, useState } from 'react';
15
+ import { extractCitations, extractFinalText } from './response.js';
16
+ /** Append `?token=` / `&token=` to a WS URL for BYO-auth. */
17
+ function withToken(url, token) {
18
+ if (!token)
19
+ return url;
20
+ const sep = url.includes('?') ? '&' : '?';
21
+ return `${url}${sep}token=${encodeURIComponent(token)}`;
22
+ }
23
+ export function useConversation(options) {
24
+ const { url, client: externalClient, agentId, userName, userEmail, authToken, autoConnect = true, connectionErrorMessage } = options;
25
+ const [status, setStatus] = useState('idle');
26
+ const [messages, setMessages] = useState([]);
27
+ const [error, setError] = useState(null);
28
+ // Mutable mirrors so streaming token deltas don't fight React's batching: we
29
+ // mutate in place, then publish an immutable snapshot via setMessages.
30
+ const messagesRef = useRef([]);
31
+ const clientRef = useRef(null);
32
+ const ownsClientRef = useRef(false);
33
+ const sessionIdRef = useRef(null);
34
+ const seqRef = useRef(0);
35
+ const statusRef = useRef('idle');
36
+ const setStatusBoth = useCallback((next, detail) => {
37
+ statusRef.current = next;
38
+ setStatus(next);
39
+ if (next === 'error' && detail)
40
+ setError(detail);
41
+ if (next === 'ready' || next === 'connecting')
42
+ setError(null);
43
+ }, []);
44
+ const nextId = useCallback((prefix) => {
45
+ seqRef.current += 1;
46
+ return `${prefix}-${seqRef.current}-${Date.now().toString(36)}`;
47
+ }, []);
48
+ const publish = useCallback(() => {
49
+ setMessages(messagesRef.current.map((m) => ({ ...m })));
50
+ }, []);
51
+ const connect = useCallback(async () => {
52
+ if (statusRef.current === 'connecting' || statusRef.current === 'ready')
53
+ return;
54
+ setStatusBoth('connecting');
55
+ try {
56
+ let client = externalClient ?? clientRef.current;
57
+ if (!client) {
58
+ if (!url)
59
+ throw new Error('useConversation requires either `url` or `client`');
60
+ client = new SmoothAgentClient({ url: withToken(url, authToken) });
61
+ ownsClientRef.current = true;
62
+ await client.connect();
63
+ }
64
+ else if (client === externalClient) {
65
+ ownsClientRef.current = false;
66
+ }
67
+ clientRef.current = client;
68
+ const session = await client.createConversationSession({ agentId, userName, userEmail });
69
+ sessionIdRef.current = session.sessionId;
70
+ setStatusBoth('ready');
71
+ }
72
+ catch (err) {
73
+ setStatusBoth('error', err instanceof Error ? err.message : String(err));
74
+ throw err;
75
+ }
76
+ }, [externalClient, url, authToken, agentId, userName, userEmail, setStatusBoth]);
77
+ const send = useCallback(async (text) => {
78
+ const trimmed = text.trim();
79
+ if (!trimmed)
80
+ return;
81
+ if (!clientRef.current || !sessionIdRef.current || statusRef.current !== 'ready') {
82
+ await connect();
83
+ }
84
+ const client = clientRef.current;
85
+ const sessionId = sessionIdRef.current;
86
+ if (!client || !sessionId)
87
+ throw new Error('Conversation is not connected');
88
+ messagesRef.current.push({ id: nextId('u'), role: 'user', text: trimmed, streaming: false });
89
+ const assistant = { id: nextId('a'), role: 'assistant', text: '', streaming: true };
90
+ messagesRef.current.push(assistant);
91
+ publish();
92
+ try {
93
+ const turn = client.sendMessage({ sessionId, message: trimmed, stream: true });
94
+ for await (const event of turn) {
95
+ if (event.type === 'stream_token') {
96
+ const token = event.token ?? event.data?.token ?? '';
97
+ if (token) {
98
+ assistant.text += token;
99
+ publish();
100
+ }
101
+ }
102
+ }
103
+ const final = await turn;
104
+ const inner = final.data?.data;
105
+ const finalText = extractFinalText(inner?.response);
106
+ if (finalText && finalText.length > assistant.text.length)
107
+ assistant.text = finalText;
108
+ if (!assistant.text)
109
+ assistant.text = '(no response)';
110
+ const citations = extractCitations(inner);
111
+ if (citations.length > 0)
112
+ assistant.citations = citations;
113
+ assistant.streaming = false;
114
+ publish();
115
+ }
116
+ catch (err) {
117
+ assistant.streaming = false;
118
+ const message = err instanceof ProtocolError
119
+ ? `Error: ${err.message}`
120
+ : (connectionErrorMessage ?? "We couldn't reach the chat. Please try again in a moment.");
121
+ assistant.text = assistant.text ? `${assistant.text}\n\n${message}` : message;
122
+ publish();
123
+ setStatusBoth('error', err instanceof Error ? err.message : String(err));
124
+ }
125
+ }, [connect, nextId, publish, connectionErrorMessage, setStatusBoth]);
126
+ const disconnect = useCallback(() => {
127
+ if (ownsClientRef.current)
128
+ clientRef.current?.disconnect('conversation closed');
129
+ clientRef.current = externalClient ?? null;
130
+ sessionIdRef.current = null;
131
+ setStatusBoth('closed');
132
+ }, [externalClient, setStatusBoth]);
133
+ // Auto-connect once on mount; tear down only the client we own.
134
+ useEffect(() => {
135
+ let cancelled = false;
136
+ if (autoConnect) {
137
+ connect().catch(() => {
138
+ /* surfaced via status/error */
139
+ });
140
+ }
141
+ return () => {
142
+ cancelled = true;
143
+ void cancelled;
144
+ if (ownsClientRef.current) {
145
+ clientRef.current?.disconnect('component unmounted');
146
+ clientRef.current = null;
147
+ ownsClientRef.current = false;
148
+ }
149
+ };
150
+ // Connect identity changes when its inputs change; re-running re-establishes the session.
151
+ }, [autoConnect, connect]);
152
+ return { status, messages, error, sessionId: sessionIdRef.current, connect, send, disconnect };
153
+ }
154
+ //# sourceMappingURL=use-conversation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-conversation.js","sourceRoot":"","sources":["../../src/react/use-conversation.ts"],"names":[],"mappings":"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"}