@rubrion/agent-kit-react 0.0.0-stage → 0.1.1
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/dist/components/AssistantScreen.d.ts +19 -0
- package/dist/components/AssistantScreen.js +81 -0
- package/dist/components/AssistantScreen.js.map +1 -0
- package/dist/components/ChatBox.d.ts +17 -0
- package/dist/components/ChatBox.js +60 -0
- package/dist/components/ChatBox.js.map +1 -0
- package/dist/components/Conversation.d.ts +29 -0
- package/dist/components/Conversation.js +108 -0
- package/dist/components/Conversation.js.map +1 -0
- package/dist/components/Mascot.d.ts +17 -0
- package/dist/components/Mascot.js +64 -0
- package/dist/components/Mascot.js.map +1 -0
- package/dist/components/Steps.d.ts +17 -0
- package/dist/components/Steps.js +51 -0
- package/dist/components/Steps.js.map +1 -0
- package/dist/components/ui.d.ts +16 -0
- package/dist/components/ui.js +19 -0
- package/dist/components/ui.js.map +1 -0
- package/dist/events.d.ts +70 -0
- package/dist/events.js +99 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/provider.d.ts +66 -0
- package/dist/provider.js +195 -0
- package/dist/provider.js.map +1 -0
- package/dist/strings.d.ts +40 -0
- package/dist/strings.js +77 -0
- package/dist/strings.js.map +1 -0
- package/dist/styles.css +83 -0
- package/package.json +51 -4
- package/README.md +0 -3
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export type Step = {
|
|
2
|
+
kind: 'think';
|
|
3
|
+
text: string;
|
|
4
|
+
start: number;
|
|
5
|
+
end?: number;
|
|
6
|
+
} | {
|
|
7
|
+
kind: 'tool';
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
args?: unknown;
|
|
11
|
+
result?: unknown;
|
|
12
|
+
state: 'running' | 'done' | 'error';
|
|
13
|
+
start: number;
|
|
14
|
+
end?: number;
|
|
15
|
+
} | {
|
|
16
|
+
kind: 'text';
|
|
17
|
+
text: string;
|
|
18
|
+
};
|
|
19
|
+
export type UserTurn = {
|
|
20
|
+
id: string;
|
|
21
|
+
role: 'user';
|
|
22
|
+
text: string;
|
|
23
|
+
};
|
|
24
|
+
export type AssistantTurn = {
|
|
25
|
+
id: string;
|
|
26
|
+
role: 'assistant';
|
|
27
|
+
agent: string;
|
|
28
|
+
steps: Step[];
|
|
29
|
+
error?: string;
|
|
30
|
+
done: boolean;
|
|
31
|
+
};
|
|
32
|
+
export type Turn = UserTurn | AssistantTurn;
|
|
33
|
+
export type Session = {
|
|
34
|
+
id: string;
|
|
35
|
+
agent: string;
|
|
36
|
+
title: string;
|
|
37
|
+
updatedAt: string;
|
|
38
|
+
};
|
|
39
|
+
export type AgentInfo = {
|
|
40
|
+
id: string;
|
|
41
|
+
name: string;
|
|
42
|
+
tagline: string;
|
|
43
|
+
thinking: boolean;
|
|
44
|
+
};
|
|
45
|
+
/** What the mascot does: waits, thinks, uses a tool, writes. */
|
|
46
|
+
export type Phase = 'idle' | 'thinking' | 'tool' | 'speaking';
|
|
47
|
+
/** Whether the assistant may answer now; otherwise the reason and the message (from the gateway preflight). */
|
|
48
|
+
export type Status = {
|
|
49
|
+
ready: boolean;
|
|
50
|
+
reason: string | null;
|
|
51
|
+
message: string | null;
|
|
52
|
+
};
|
|
53
|
+
export type StreamEvent = {
|
|
54
|
+
type: string;
|
|
55
|
+
[k: string]: any;
|
|
56
|
+
};
|
|
57
|
+
/** The phase of the answer being written, for the mascot. */
|
|
58
|
+
export declare function phaseOf(turn: Turn | undefined, busy: boolean): Phase;
|
|
59
|
+
/**
|
|
60
|
+
* Applies one stream event to the answer being written. `actionable(message)`
|
|
61
|
+
* says whether a server error message tells the person what to do (shown as is);
|
|
62
|
+
* otherwise `fallbackError` is shown.
|
|
63
|
+
*/
|
|
64
|
+
export declare function applyEvent(turn: AssistantTurn, ev: StreamEvent, opts: {
|
|
65
|
+
now?: number;
|
|
66
|
+
fallbackError: string;
|
|
67
|
+
actionable?: (m: string) => boolean;
|
|
68
|
+
}): AssistantTurn;
|
|
69
|
+
/** Reads a `data: {json}` SSE body, calling onEvent per event, until `data: [DONE]` or the end. */
|
|
70
|
+
export declare function readEvents(body: ReadableStream<Uint8Array>, onEvent: (ev: StreamEvent) => void): Promise<void>;
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// The conversation model and the pure reducer that applies stream events to an
|
|
2
|
+
// answer being written. No React here: it is unit-tested on its own.
|
|
3
|
+
/** The phase of the answer being written, for the mascot. */
|
|
4
|
+
export function phaseOf(turn, busy) {
|
|
5
|
+
if (!busy)
|
|
6
|
+
return 'idle';
|
|
7
|
+
if (!turn || turn.role !== 'assistant')
|
|
8
|
+
return 'thinking';
|
|
9
|
+
const last = turn.steps[turn.steps.length - 1];
|
|
10
|
+
if (!last || last.kind === 'think')
|
|
11
|
+
return 'thinking';
|
|
12
|
+
if (last.kind === 'tool')
|
|
13
|
+
return last.state === 'running' ? 'tool' : 'thinking';
|
|
14
|
+
return 'speaking';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Applies one stream event to the answer being written. `actionable(message)`
|
|
18
|
+
* says whether a server error message tells the person what to do (shown as is);
|
|
19
|
+
* otherwise `fallbackError` is shown.
|
|
20
|
+
*/
|
|
21
|
+
export function applyEvent(turn, ev, opts) {
|
|
22
|
+
const steps = [...turn.steps];
|
|
23
|
+
const last = steps[steps.length - 1];
|
|
24
|
+
const now = opts.now ?? Date.now();
|
|
25
|
+
const closeThinking = () => {
|
|
26
|
+
for (let i = steps.length - 1; i >= 0; i--) {
|
|
27
|
+
const s = steps[i];
|
|
28
|
+
if (s.kind === 'think' && s.end === undefined) {
|
|
29
|
+
steps[i] = { ...s, end: now };
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
switch (ev.type) {
|
|
35
|
+
case 'reasoning-delta':
|
|
36
|
+
if (last?.kind === 'think' && last.end === undefined)
|
|
37
|
+
steps[steps.length - 1] = { ...last, text: last.text + ev.text };
|
|
38
|
+
else
|
|
39
|
+
steps.push({ kind: 'think', text: String(ev.text ?? ''), start: now });
|
|
40
|
+
break;
|
|
41
|
+
case 'reasoning-end':
|
|
42
|
+
closeThinking();
|
|
43
|
+
break;
|
|
44
|
+
case 'tool-start':
|
|
45
|
+
case 'tool-call': {
|
|
46
|
+
closeThinking();
|
|
47
|
+
const i = steps.findIndex((s) => s.kind === 'tool' && s.id === ev.id);
|
|
48
|
+
if (i >= 0) {
|
|
49
|
+
const s = steps[i];
|
|
50
|
+
steps[i] = { ...s, args: ev.args ?? s.args };
|
|
51
|
+
}
|
|
52
|
+
else
|
|
53
|
+
steps.push({ kind: 'tool', id: ev.id, name: ev.name, args: ev.args, state: 'running', start: now });
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case 'tool-result': {
|
|
57
|
+
const i = steps.findIndex((s) => s.kind === 'tool' && s.id === ev.id);
|
|
58
|
+
const failed = Boolean(ev.error) || Boolean(ev.result && typeof ev.result === 'object' && ('error' in ev.result || 'erro' in ev.result));
|
|
59
|
+
if (i >= 0)
|
|
60
|
+
steps[i] = { ...steps[i], result: ev.result, state: failed ? 'error' : 'done', end: now };
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case 'text-delta':
|
|
64
|
+
closeThinking();
|
|
65
|
+
if (last?.kind === 'text')
|
|
66
|
+
steps[steps.length - 1] = { ...last, text: last.text + ev.text };
|
|
67
|
+
else
|
|
68
|
+
steps.push({ kind: 'text', text: String(ev.text ?? '') });
|
|
69
|
+
break;
|
|
70
|
+
case 'error': {
|
|
71
|
+
const m = typeof ev.message === 'string' ? ev.message : '';
|
|
72
|
+
return { ...turn, steps, error: m && opts.actionable?.(m) ? m : opts.fallbackError };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { ...turn, steps };
|
|
76
|
+
}
|
|
77
|
+
/** Reads a `data: {json}` SSE body, calling onEvent per event, until `data: [DONE]` or the end. */
|
|
78
|
+
export async function readEvents(body, onEvent) {
|
|
79
|
+
const reader = body.pipeThrough(new TextDecoderStream()).getReader();
|
|
80
|
+
let buf = '';
|
|
81
|
+
for (;;) {
|
|
82
|
+
const { done, value } = await reader.read();
|
|
83
|
+
if (done)
|
|
84
|
+
break;
|
|
85
|
+
buf += value;
|
|
86
|
+
const parts = buf.split(/\r?\n\r?\n/);
|
|
87
|
+
buf = parts.pop() ?? '';
|
|
88
|
+
for (const part of parts) {
|
|
89
|
+
const raw = part.replace(/^data:\s*/, '').trim();
|
|
90
|
+
if (!raw || raw === '[DONE]')
|
|
91
|
+
continue;
|
|
92
|
+
try {
|
|
93
|
+
onEvent(JSON.parse(raw));
|
|
94
|
+
}
|
|
95
|
+
catch { /* unreadable frame: skip */ }
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { AgentProvider, useAgent, type AgentConfig, type Conversation } from './provider.js';
|
|
2
|
+
export { applyEvent, phaseOf, readEvents, type AgentInfo, type AssistantTurn, type Phase, type Session, type Status, type Step, type StreamEvent, type Turn, type UserTurn } from './events.js';
|
|
3
|
+
export { en, ptBR, type Strings } from './strings.js';
|
|
4
|
+
export { ChatBox } from './components/ChatBox.js';
|
|
5
|
+
export { AssistantScreen, AgentPicker, ConversationList } from './components/AssistantScreen.js';
|
|
6
|
+
export { Availability, CompactConversation, Composer, Suggestions, Thread } from './components/Conversation.js';
|
|
7
|
+
export { Markdown, ThinkStep, ToolStep } from './components/Steps.js';
|
|
8
|
+
export { Mascot } from './components/Mascot.js';
|
|
9
|
+
export { Avatar, IconButton } from './components/ui.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// @rubrion/agent-kit-react: the browser half of the agent kit.
|
|
2
|
+
// Wrap the app in <AgentProvider>, drop <ChatBox> in the layout and <AssistantScreen>
|
|
3
|
+
// on a route. Import '@rubrion/agent-kit-react/styles.css' once, and let Tailwind
|
|
4
|
+
// scan this package (see README).
|
|
5
|
+
export { AgentProvider, useAgent } from './provider.js';
|
|
6
|
+
export { applyEvent, phaseOf, readEvents } from './events.js';
|
|
7
|
+
export { en, ptBR } from './strings.js';
|
|
8
|
+
export { ChatBox } from './components/ChatBox.js';
|
|
9
|
+
export { AssistantScreen, AgentPicker, ConversationList } from './components/AssistantScreen.js';
|
|
10
|
+
export { Availability, CompactConversation, Composer, Suggestions, Thread } from './components/Conversation.js';
|
|
11
|
+
export { Markdown, ThinkStep, ToolStep } from './components/Steps.js';
|
|
12
|
+
export { Mascot } from './components/Mascot.js';
|
|
13
|
+
export { Avatar, IconButton } from './components/ui.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,sFAAsF;AACtF,kFAAkF;AAClF,kCAAkC;AAClC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAuC,MAAM,eAAe,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAoI,MAAM,aAAa,CAAC;AAChM,OAAO,EAAE,EAAE,EAAE,IAAI,EAAgB,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAChH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import { type AgentInfo, type Phase, type Session, type Status, type Turn } from './events.js';
|
|
3
|
+
import { type Strings } from './strings.js';
|
|
4
|
+
export interface AgentConfig {
|
|
5
|
+
/** Where the gateway is mounted. Default '/api/agent'. */
|
|
6
|
+
basePath?: string;
|
|
7
|
+
/** Extra headers on every call (e.g. the tenant the app is showing). */
|
|
8
|
+
headers?: () => HeadersInit;
|
|
9
|
+
/** Whose conversations: the remembered open thread is per person. */
|
|
10
|
+
person: string;
|
|
11
|
+
/** The signed-in person's display name (greeting). */
|
|
12
|
+
personName?: string;
|
|
13
|
+
/** Prefix for browser storage keys. Default 'agent'. */
|
|
14
|
+
storageKey?: string;
|
|
15
|
+
/** The agent picked when nothing is remembered. Default: the first the gateway lists. */
|
|
16
|
+
defaultAgent?: string;
|
|
17
|
+
strings?: Partial<Strings>;
|
|
18
|
+
/** Labels per tool name: [while running, when done]. Unknown tools show their name. */
|
|
19
|
+
toolLabels?: Record<string, [string, string]>;
|
|
20
|
+
/** Which argument of a tool call to show next to its label (default: the first string argument). */
|
|
21
|
+
toolSubject?: (name: string, args: Record<string, unknown> | undefined) => string | undefined;
|
|
22
|
+
/** Starter questions on an empty conversation. */
|
|
23
|
+
suggestions?: string[];
|
|
24
|
+
/** Server messages shown as is (they tell the person what to do); others become strings.failed. */
|
|
25
|
+
actionableError?: (message: string) => boolean;
|
|
26
|
+
/** Asked before deleting a conversation. Default window.confirm. */
|
|
27
|
+
confirmDelete?: (session: Session) => boolean | Promise<boolean>;
|
|
28
|
+
/** Replaces the default mascot everywhere. */
|
|
29
|
+
renderMascot?: (props: {
|
|
30
|
+
phase: Phase;
|
|
31
|
+
size: number;
|
|
32
|
+
jumping?: boolean;
|
|
33
|
+
}) => ReactNode;
|
|
34
|
+
/** Shown instead of the conversation when the preflight blocks (missing key, budget…). */
|
|
35
|
+
renderBlocked?: (status: Status) => ReactNode;
|
|
36
|
+
}
|
|
37
|
+
export interface Conversation {
|
|
38
|
+
config: Required<Pick<AgentConfig, 'basePath' | 'storageKey'>> & AgentConfig;
|
|
39
|
+
t: Strings;
|
|
40
|
+
turns: Turn[];
|
|
41
|
+
busy: boolean;
|
|
42
|
+
phase: Phase;
|
|
43
|
+
agents: AgentInfo[];
|
|
44
|
+
/** null while loading; false when the assistant is offline. */
|
|
45
|
+
available: boolean | null;
|
|
46
|
+
/** null while checking. */
|
|
47
|
+
status: Status | null;
|
|
48
|
+
agent: string;
|
|
49
|
+
thread: string;
|
|
50
|
+
sessions: Session[];
|
|
51
|
+
error: string | null;
|
|
52
|
+
/** The chat box opened or the assistant screen shown: only then the agent is called (other screens pay nothing). */
|
|
53
|
+
activate: () => void;
|
|
54
|
+
send: (question: string) => void;
|
|
55
|
+
stop: () => void;
|
|
56
|
+
/** Starts another; an answer on its way is interrupted. */
|
|
57
|
+
newConversation: () => void;
|
|
58
|
+
/** Each conversation belongs to one agent: switching opens a new one. */
|
|
59
|
+
chooseAgent: (id: string) => void;
|
|
60
|
+
open: (s: Session) => Promise<void>;
|
|
61
|
+
remove: (s: Session) => Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
export declare function useAgent(): Conversation;
|
|
64
|
+
export declare function AgentProvider({ children, ...config }: AgentConfig & {
|
|
65
|
+
children: ReactNode;
|
|
66
|
+
}): import("react").JSX.Element;
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// The conversation, kept above the router. Two places show it (the chat box in
|
|
3
|
+
// the corner of every screen and the full assistant screen), so asking in one and
|
|
4
|
+
// expanding finds the same conversation, even with the answer still arriving.
|
|
5
|
+
//
|
|
6
|
+
// The UI sends only the new question: the agent's memory recalls the thread,
|
|
7
|
+
// which lives on the server. This browser only remembers which thread was open.
|
|
8
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
|
|
9
|
+
import { applyEvent, phaseOf, readEvents } from './events.js';
|
|
10
|
+
import { en } from './strings.js';
|
|
11
|
+
const Context = createContext(null);
|
|
12
|
+
export function useAgent() {
|
|
13
|
+
const c = useContext(Context);
|
|
14
|
+
if (!c)
|
|
15
|
+
throw new Error('useAgent outside <AgentProvider>');
|
|
16
|
+
return c;
|
|
17
|
+
}
|
|
18
|
+
const newId = () => Math.random().toString(36).slice(2, 12);
|
|
19
|
+
function remembered(key) {
|
|
20
|
+
try {
|
|
21
|
+
const v = JSON.parse(localStorage.getItem(key) || 'null');
|
|
22
|
+
return v && typeof v.thread === 'string' && /^[a-z0-9]{6,32}$/i.test(v.thread) ? { thread: v.thread, agent: String(v.agent || '') } : null;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null; // private window or blocked storage: no memory of the last one
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function json(r) {
|
|
29
|
+
const data = await r.json().catch(() => ({}));
|
|
30
|
+
if (!r.ok)
|
|
31
|
+
throw new Error(data.error || `The assistant did not answer (error ${r.status}).`);
|
|
32
|
+
return data;
|
|
33
|
+
}
|
|
34
|
+
export function AgentProvider({ children, ...config }) {
|
|
35
|
+
const basePath = config.basePath ?? '/api/agent';
|
|
36
|
+
const storageKey = config.storageKey ?? 'agent';
|
|
37
|
+
const t = useMemo(() => ({ ...en, ...config.strings }), [config.strings]);
|
|
38
|
+
const key = `${storageKey}_conversation_${config.person}`;
|
|
39
|
+
const headers = useCallback((extra) => ({ ...config.headers?.(), ...extra }), [config.headers]);
|
|
40
|
+
const initial = useRef(remembered(key));
|
|
41
|
+
const [agent, setAgent] = useState(initial.current?.agent || config.defaultAgent || '');
|
|
42
|
+
const [thread, setThread] = useState(initial.current?.thread ?? newId());
|
|
43
|
+
const [turns, setTurns] = useState([]);
|
|
44
|
+
const [busy, setBusy] = useState(false);
|
|
45
|
+
const [error, setError] = useState(null);
|
|
46
|
+
const [active, setActive] = useState(false);
|
|
47
|
+
const [agents, setAgents] = useState({ data: [], state: 'idle' });
|
|
48
|
+
const [status, setStatus] = useState(null);
|
|
49
|
+
const [sessions, setSessions] = useState([]);
|
|
50
|
+
const control = useRef(null);
|
|
51
|
+
const activate = useCallback(() => setActive(true), []);
|
|
52
|
+
const loadSessions = useCallback(async () => {
|
|
53
|
+
try {
|
|
54
|
+
setSessions((await json(await fetch(`${basePath}/threads`, { headers: headers() }))).filter((s) => s.id));
|
|
55
|
+
}
|
|
56
|
+
catch { /* keeps the old list */ }
|
|
57
|
+
}, [basePath, headers]);
|
|
58
|
+
const loadStatus = useCallback(async () => {
|
|
59
|
+
try {
|
|
60
|
+
setStatus(await json(await fetch(`${basePath}/status`, { headers: headers() })));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
setStatus(null);
|
|
64
|
+
}
|
|
65
|
+
}, [basePath, headers]);
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (!active || agents.state !== 'idle')
|
|
68
|
+
return;
|
|
69
|
+
setAgents({ data: [], state: 'loading' });
|
|
70
|
+
fetch(`${basePath}/agents`, { headers: headers() })
|
|
71
|
+
.then((r) => json(r))
|
|
72
|
+
.then((list) => {
|
|
73
|
+
setAgents({ data: list, state: 'ok' });
|
|
74
|
+
setAgent((a) => (list.some((x) => x.id === a) ? a : list[0]?.id ?? a));
|
|
75
|
+
loadSessions();
|
|
76
|
+
})
|
|
77
|
+
.catch((e) => setAgents({ data: [], state: 'error', error: e.message }));
|
|
78
|
+
loadStatus();
|
|
79
|
+
}, [active, agents.state, basePath, headers, loadSessions, loadStatus]);
|
|
80
|
+
// the key may have been set in another tab: check again on return
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
if (!active)
|
|
83
|
+
return;
|
|
84
|
+
const onFocus = () => loadStatus();
|
|
85
|
+
window.addEventListener('focus', onFocus);
|
|
86
|
+
return () => window.removeEventListener('focus', onFocus);
|
|
87
|
+
}, [active, loadStatus]);
|
|
88
|
+
// the conversation open last time comes back after a reload
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
try {
|
|
91
|
+
localStorage.setItem(key, JSON.stringify({ thread, agent }));
|
|
92
|
+
}
|
|
93
|
+
catch { /* this tab only */ }
|
|
94
|
+
}, [thread, agent, key]);
|
|
95
|
+
useEffect(() => {
|
|
96
|
+
const last = initial.current;
|
|
97
|
+
if (!last || !active)
|
|
98
|
+
return;
|
|
99
|
+
initial.current = null;
|
|
100
|
+
fetch(`${basePath}/threads/${last.thread}?agent=${encodeURIComponent(last.agent)}`, { headers: headers() })
|
|
101
|
+
.then((r) => (r.ok ? r.json() : []))
|
|
102
|
+
.then((tt) => setTurns((cur) => (cur.length ? cur : Array.isArray(tt) ? tt : [])))
|
|
103
|
+
.catch(() => undefined);
|
|
104
|
+
}, [active, basePath, headers]);
|
|
105
|
+
useEffect(() => () => control.current?.abort(), []);
|
|
106
|
+
const send = useCallback(async (question) => {
|
|
107
|
+
const q = question.trim();
|
|
108
|
+
if (!q || busy)
|
|
109
|
+
return;
|
|
110
|
+
setError(null);
|
|
111
|
+
const answer = { id: newId(), role: 'assistant', agent, steps: [], done: false };
|
|
112
|
+
setTurns((tt) => [...tt, { id: newId(), role: 'user', text: q }, answer]);
|
|
113
|
+
setBusy(true);
|
|
114
|
+
const ctrl = new AbortController();
|
|
115
|
+
control.current = ctrl;
|
|
116
|
+
const change = (f) => setTurns((all) => all.map((x) => (x.id === answer.id && x.role === 'assistant' ? f(x) : x)));
|
|
117
|
+
const opts = { fallbackError: t.failed, actionable: config.actionableError };
|
|
118
|
+
try {
|
|
119
|
+
const r = await fetch(`${basePath}/stream`, {
|
|
120
|
+
method: 'POST',
|
|
121
|
+
headers: headers({ 'content-type': 'application/json' }),
|
|
122
|
+
signal: ctrl.signal,
|
|
123
|
+
body: JSON.stringify({ agent, thread, message: q }),
|
|
124
|
+
});
|
|
125
|
+
if (!r.ok || !r.body) {
|
|
126
|
+
const j = (await r.json().catch(() => ({})));
|
|
127
|
+
change((x) => ({ ...x, error: j.error || t.failed }));
|
|
128
|
+
// blocked since it opened (key removed, budget reached): the notice takes over
|
|
129
|
+
if (j.reason)
|
|
130
|
+
loadStatus();
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
await readEvents(r.body, (ev) => change((x) => applyEvent(x, ev, opts)));
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
if (e.name !== 'AbortError')
|
|
137
|
+
change((x) => ({ ...x, error: t.connectionLost }));
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
change((x) => ({ ...x, done: true }));
|
|
141
|
+
setBusy(false);
|
|
142
|
+
control.current = null;
|
|
143
|
+
loadSessions();
|
|
144
|
+
}
|
|
145
|
+
}, [agent, basePath, busy, config.actionableError, headers, loadSessions, loadStatus, t, thread]);
|
|
146
|
+
const stop = useCallback(() => control.current?.abort(), []);
|
|
147
|
+
const newConversation = useCallback(() => {
|
|
148
|
+
control.current?.abort();
|
|
149
|
+
setThread(newId());
|
|
150
|
+
setTurns([]);
|
|
151
|
+
setError(null);
|
|
152
|
+
}, []);
|
|
153
|
+
const chooseAgent = useCallback((id) => {
|
|
154
|
+
if (id === agent)
|
|
155
|
+
return;
|
|
156
|
+
setAgent(id);
|
|
157
|
+
newConversation();
|
|
158
|
+
}, [agent, newConversation]);
|
|
159
|
+
const open = useCallback(async (s) => {
|
|
160
|
+
if (busy || (s.id === thread && s.agent === agent))
|
|
161
|
+
return;
|
|
162
|
+
try {
|
|
163
|
+
const tt = await json(await fetch(`${basePath}/threads/${s.id}?agent=${encodeURIComponent(s.agent)}`, { headers: headers() }));
|
|
164
|
+
setAgent(s.agent);
|
|
165
|
+
setThread(s.id);
|
|
166
|
+
setTurns(tt);
|
|
167
|
+
setError(null);
|
|
168
|
+
}
|
|
169
|
+
catch (e) {
|
|
170
|
+
setError(e.message);
|
|
171
|
+
}
|
|
172
|
+
}, [agent, basePath, busy, headers, thread]);
|
|
173
|
+
const remove = useCallback(async (s) => {
|
|
174
|
+
const ok = await (config.confirmDelete ?? ((x) => window.confirm(t.confirmDelete(x.title))))(s);
|
|
175
|
+
if (!ok)
|
|
176
|
+
return;
|
|
177
|
+
await fetch(`${basePath}/threads/${s.id}`, { method: 'DELETE', headers: headers() }).catch(() => undefined);
|
|
178
|
+
if (s.id === thread)
|
|
179
|
+
newConversation();
|
|
180
|
+
await loadSessions();
|
|
181
|
+
}, [basePath, config.confirmDelete, headers, loadSessions, newConversation, t, thread]);
|
|
182
|
+
const last = turns[turns.length - 1];
|
|
183
|
+
const value = {
|
|
184
|
+
config: { ...config, basePath, storageKey },
|
|
185
|
+
t,
|
|
186
|
+
turns, busy, phase: phaseOf(last, busy),
|
|
187
|
+
agents: agents.data,
|
|
188
|
+
available: !active || agents.state === 'idle' || agents.state === 'loading' ? null : agents.state === 'ok',
|
|
189
|
+
status, agent, thread, sessions,
|
|
190
|
+
error: error ?? (agents.state === 'error' ? agents.error ?? null : null),
|
|
191
|
+
activate, send, stop, newConversation, chooseAgent, open, remove,
|
|
192
|
+
};
|
|
193
|
+
return _jsx(Context.Provider, { value: value, children: children });
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface Strings {
|
|
2
|
+
assistant: string;
|
|
3
|
+
/** Under the title in the chat box. */
|
|
4
|
+
scope: string;
|
|
5
|
+
newConversation: string;
|
|
6
|
+
expand: string;
|
|
7
|
+
close: string;
|
|
8
|
+
open: string;
|
|
9
|
+
placeholder: string;
|
|
10
|
+
ask: string;
|
|
11
|
+
stop: string;
|
|
12
|
+
jumpToEnd: string;
|
|
13
|
+
writing: string;
|
|
14
|
+
thinking: string;
|
|
15
|
+
thoughtFor: (seconds: number) => string;
|
|
16
|
+
details: string;
|
|
17
|
+
copy: string;
|
|
18
|
+
copied: string;
|
|
19
|
+
emptyTitle: string;
|
|
20
|
+
greeting: (firstName: string) => string;
|
|
21
|
+
greetingHint: string;
|
|
22
|
+
disclaimer: string;
|
|
23
|
+
offline: string;
|
|
24
|
+
tryAgainSoon: string;
|
|
25
|
+
failed: string;
|
|
26
|
+
connectionLost: string;
|
|
27
|
+
conversations: string;
|
|
28
|
+
searchConversations: string;
|
|
29
|
+
conversationsEmpty: string;
|
|
30
|
+
conversationsNoMatch: string;
|
|
31
|
+
deleteConversation: string;
|
|
32
|
+
confirmDelete: (title: string) => string;
|
|
33
|
+
chooseAgent: string;
|
|
34
|
+
thinks: string;
|
|
35
|
+
collapse: string;
|
|
36
|
+
notReady: string;
|
|
37
|
+
locale: string;
|
|
38
|
+
}
|
|
39
|
+
export declare const en: Strings;
|
|
40
|
+
export declare const ptBR: Strings;
|
package/dist/strings.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// Every visible text, so an app can translate or rename ("Assistant", the agent's
|
|
2
|
+
// name…). English by default; ptBR ready to pass as `strings`.
|
|
3
|
+
export const en = {
|
|
4
|
+
assistant: 'Assistant',
|
|
5
|
+
scope: 'all of your data',
|
|
6
|
+
newConversation: 'New conversation',
|
|
7
|
+
expand: 'Expand',
|
|
8
|
+
close: 'Close',
|
|
9
|
+
open: 'Open the assistant',
|
|
10
|
+
placeholder: 'Ask anything…',
|
|
11
|
+
ask: 'Ask',
|
|
12
|
+
stop: 'Stop',
|
|
13
|
+
jumpToEnd: 'Jump to the end',
|
|
14
|
+
writing: 'Writing',
|
|
15
|
+
thinking: 'Thinking…',
|
|
16
|
+
thoughtFor: (s) => `Thought for ${s}s`,
|
|
17
|
+
details: 'Details',
|
|
18
|
+
copy: 'Copy',
|
|
19
|
+
copied: 'Copied',
|
|
20
|
+
emptyTitle: 'Ask me anything',
|
|
21
|
+
greeting: (n) => (n ? `Hi, ${n}` : 'Hi'),
|
|
22
|
+
greetingHint: 'Ask a question to get started.',
|
|
23
|
+
disclaimer: 'The assistant reads your data and can make mistakes. Check before you decide.',
|
|
24
|
+
offline: 'The assistant is offline right now.',
|
|
25
|
+
tryAgainSoon: 'Try again in a moment.',
|
|
26
|
+
failed: 'The assistant could not answer right now. Try again.',
|
|
27
|
+
connectionLost: 'The connection to the assistant dropped. Try again.',
|
|
28
|
+
conversations: 'Conversations',
|
|
29
|
+
searchConversations: 'Search conversations',
|
|
30
|
+
conversationsEmpty: 'Conversations show up here after the first question.',
|
|
31
|
+
conversationsNoMatch: 'No conversation matches.',
|
|
32
|
+
deleteConversation: 'Delete conversation',
|
|
33
|
+
confirmDelete: (t) => `Delete "${t}"? The assistant forgets what was said in it.`,
|
|
34
|
+
chooseAgent: 'Choose the agent',
|
|
35
|
+
thinks: 'thinks',
|
|
36
|
+
collapse: 'Collapse the conversations',
|
|
37
|
+
notReady: 'The assistant cannot answer right now.',
|
|
38
|
+
locale: 'en',
|
|
39
|
+
};
|
|
40
|
+
export const ptBR = {
|
|
41
|
+
assistant: 'Assistente',
|
|
42
|
+
scope: 'todos os seus dados',
|
|
43
|
+
newConversation: 'Nova conversa',
|
|
44
|
+
expand: 'Expandir',
|
|
45
|
+
close: 'Fechar',
|
|
46
|
+
open: 'Abrir o assistente',
|
|
47
|
+
placeholder: 'Pergunte qualquer coisa…',
|
|
48
|
+
ask: 'Perguntar',
|
|
49
|
+
stop: 'Parar',
|
|
50
|
+
jumpToEnd: 'Ir para o fim',
|
|
51
|
+
writing: 'Escrevendo',
|
|
52
|
+
thinking: 'Pensando…',
|
|
53
|
+
thoughtFor: (s) => `Pensou por ${s}s`,
|
|
54
|
+
details: 'Detalhes',
|
|
55
|
+
copy: 'Copiar',
|
|
56
|
+
copied: 'Copiado',
|
|
57
|
+
emptyTitle: 'Pergunte o que quiser',
|
|
58
|
+
greeting: (n) => (n ? `Olá, ${n}` : 'Olá'),
|
|
59
|
+
greetingHint: 'Faça uma pergunta para começar.',
|
|
60
|
+
disclaimer: 'O assistente consulta os seus dados e pode errar. Confira antes de decidir.',
|
|
61
|
+
offline: 'O assistente está fora do ar agora.',
|
|
62
|
+
tryAgainSoon: 'Tente de novo em instantes.',
|
|
63
|
+
failed: 'O assistente não conseguiu responder agora. Tente de novo.',
|
|
64
|
+
connectionLost: 'A conexão com o assistente caiu. Tente de novo.',
|
|
65
|
+
conversations: 'Conversas',
|
|
66
|
+
searchConversations: 'Buscar conversas',
|
|
67
|
+
conversationsEmpty: 'As conversas aparecem aqui depois da primeira pergunta.',
|
|
68
|
+
conversationsNoMatch: 'Nenhuma conversa com esse termo.',
|
|
69
|
+
deleteConversation: 'Apagar conversa',
|
|
70
|
+
confirmDelete: (t) => `Apagar "${t}"? O assistente esquece o que foi dito nela.`,
|
|
71
|
+
chooseAgent: 'Escolher o agente',
|
|
72
|
+
thinks: 'pensa',
|
|
73
|
+
collapse: 'Recolher as conversas',
|
|
74
|
+
notReady: 'O assistente não pode responder agora.',
|
|
75
|
+
locale: 'pt-BR',
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=strings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strings.js","sourceRoot":"","sources":["../src/strings.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,+DAA+D;AAyC/D,MAAM,CAAC,MAAM,EAAE,GAAY;IAC1B,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,kBAAkB;IACzB,eAAe,EAAE,kBAAkB;IACnC,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,eAAe;IAC5B,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,iBAAiB;IAC5B,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,WAAW;IACrB,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG;IACtC,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,iBAAiB;IAC7B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,YAAY,EAAE,gCAAgC;IAC9C,UAAU,EAAE,+EAA+E;IAC3F,OAAO,EAAE,qCAAqC;IAC9C,YAAY,EAAE,wBAAwB;IACtC,MAAM,EAAE,sDAAsD;IAC9D,cAAc,EAAE,qDAAqD;IACrE,aAAa,EAAE,eAAe;IAC9B,mBAAmB,EAAE,sBAAsB;IAC3C,kBAAkB,EAAE,sDAAsD;IAC1E,oBAAoB,EAAE,0BAA0B;IAChD,kBAAkB,EAAE,qBAAqB;IACzC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,+CAA+C;IACjF,WAAW,EAAE,kBAAkB;IAC/B,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,4BAA4B;IACtC,QAAQ,EAAE,wCAAwC;IAClD,MAAM,EAAE,IAAI;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAY;IAC5B,SAAS,EAAE,YAAY;IACvB,KAAK,EAAE,qBAAqB;IAC5B,eAAe,EAAE,eAAe;IAChC,MAAM,EAAE,UAAU;IAClB,KAAK,EAAE,QAAQ;IACf,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,0BAA0B;IACvC,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,eAAe;IAC1B,OAAO,EAAE,YAAY;IACrB,QAAQ,EAAE,WAAW;IACrB,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG;IACrC,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE,uBAAuB;IACnC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1C,YAAY,EAAE,iCAAiC;IAC/C,UAAU,EAAE,6EAA6E;IACzF,OAAO,EAAE,qCAAqC;IAC9C,YAAY,EAAE,6BAA6B;IAC3C,MAAM,EAAE,4DAA4D;IACpE,cAAc,EAAE,iDAAiD;IACjE,aAAa,EAAE,WAAW;IAC1B,mBAAmB,EAAE,kBAAkB;IACvC,kBAAkB,EAAE,yDAAyD;IAC7E,oBAAoB,EAAE,kCAAkC;IACxD,kBAAkB,EAAE,iBAAiB;IACrC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,8CAA8C;IAChF,WAAW,EAAE,mBAAmB;IAChC,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,uBAAuB;IACjC,QAAQ,EAAE,wCAAwC;IAClD,MAAM,EAAE,OAAO;CACf,CAAC"}
|