@pantheon-systems/p1-ai-chat 0.1.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/dist/ChatMessage.d.ts +8 -0
- package/dist/ChatMessage.d.ts.map +1 -0
- package/dist/ChatMessage.js +37 -0
- package/dist/ChatMessage.js.map +1 -0
- package/dist/ChatPanel.d.ts +8 -0
- package/dist/ChatPanel.d.ts.map +1 -0
- package/dist/ChatPanel.js +78 -0
- package/dist/ChatPanel.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +45 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/useAgentChat.d.ts +16 -0
- package/dist/useAgentChat.d.ts.map +1 -0
- package/dist/useAgentChat.js +154 -0
- package/dist/useAgentChat.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ChatMessage as ChatMessageType } from './types.js';
|
|
3
|
+
interface Props {
|
|
4
|
+
message: ChatMessageType;
|
|
5
|
+
}
|
|
6
|
+
export declare function ChatMessage({ message }: Props): React.ReactElement;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=ChatMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatMessage.d.ts","sourceRoot":"","sources":["../src/ChatMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,YAAY,CAAC;AAEjE,UAAU,KAAK;IACb,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,YAAY,CA2GlE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import ReactMarkdown from 'react-markdown';
|
|
3
|
+
import { Badge, Icon, UtilityButton } from '@pantheon-systems/pds-toolkit-react';
|
|
4
|
+
export function ChatMessage({ message }) {
|
|
5
|
+
const isUser = message.role === 'user';
|
|
6
|
+
return (_jsxs("div", { style: {
|
|
7
|
+
display: 'flex',
|
|
8
|
+
flexDirection: 'column',
|
|
9
|
+
alignItems: isUser ? 'flex-end' : 'flex-start',
|
|
10
|
+
gap: 4,
|
|
11
|
+
marginBottom: 12,
|
|
12
|
+
}, children: [!isUser && (message.content || message.isStreaming) && (_jsx(Badge, { color: "discovery", label: _jsxs(_Fragment, { children: [_jsx(Icon, { iconName: "sparkles", iconSize: "xs", verticalAlign: "-0.1em" }), ' ', "AI"] }), size: "xs" })), message.toolCalls && message.toolCalls.length > 0 && (_jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: 3, width: '100%' }, children: message.toolCalls.map((tc, i) => (_jsx(Badge, { color: tc.status === 'running' ? 'sky' : 'gaia', label: _jsxs(_Fragment, { children: [_jsx(Icon, { iconName: tc.status === 'running' ? 'circleNotch' : 'circleCheck', iconSize: "xs", verticalAlign: "-0.1em" }), ' ', tc.name] }), size: "xs" }, i))) })), !isUser && message.isStreaming && !message.content && (_jsx(UtilityButton, { label: "Thinking\u2026", iconName: "sparkles", isWorking: true })), message.content && (_jsx("div", { style: {
|
|
13
|
+
maxWidth: '90%',
|
|
14
|
+
padding: '8px 12px',
|
|
15
|
+
borderRadius: isUser ? '12px 12px 4px 12px' : '12px 12px 12px 4px',
|
|
16
|
+
backgroundColor: isUser ? 'var(--pds-color-bg-reverse)' : 'var(--pds-color-bg-default-secondary)',
|
|
17
|
+
color: isUser ? 'var(--pds-color-fg-reverse)' : 'var(--pds-color-fg-default)',
|
|
18
|
+
fontSize: 13,
|
|
19
|
+
lineHeight: 1.5,
|
|
20
|
+
wordBreak: 'break-word',
|
|
21
|
+
}, children: isUser ? (message.content) : (_jsx("div", { style: { marginBottom: -8 }, children: _jsx(ReactMarkdown, { components: {
|
|
22
|
+
p: ({ children }) => _jsx("p", { style: { margin: '0 0 8px 0', lineHeight: 1.6 }, children: children }),
|
|
23
|
+
pre: ({ children }) => _jsx("pre", { style: { background: 'var(--pds-color-bg-default-secondary)', padding: '8px', borderRadius: 4, overflow: 'auto', fontSize: 12, margin: '0 0 8px 0' }, children: children }),
|
|
24
|
+
code: ({ children, className }) => className
|
|
25
|
+
? _jsx("code", { className: className, children: children })
|
|
26
|
+
: _jsx("code", { style: { background: 'var(--pds-color-bg-default-secondary)', padding: '1px 4px', borderRadius: 3, fontSize: 12, fontFamily: 'monospace' }, children: children }),
|
|
27
|
+
ul: ({ children }) => _jsx("ul", { style: { margin: '0 0 8px 0', paddingLeft: 20 }, children: children }),
|
|
28
|
+
ol: ({ children }) => _jsx("ol", { style: { margin: '0 0 8px 0', paddingLeft: 20 }, children: children }),
|
|
29
|
+
li: ({ children }) => _jsx("li", { style: { marginBottom: 2 }, children: children }),
|
|
30
|
+
h1: ({ children }) => _jsx("h1", { style: { fontSize: 16, fontWeight: 600, margin: '0 0 8px 0' }, children: children }),
|
|
31
|
+
h2: ({ children }) => _jsx("h2", { style: { fontSize: 15, fontWeight: 600, margin: '0 0 8px 0' }, children: children }),
|
|
32
|
+
h3: ({ children }) => _jsx("h3", { style: { fontSize: 14, fontWeight: 600, margin: '0 0 8px 0' }, children: children }),
|
|
33
|
+
strong: ({ children }) => _jsx("strong", { style: { fontWeight: 600 }, children: children }),
|
|
34
|
+
blockquote: ({ children }) => _jsx("blockquote", { style: { borderLeft: '3px solid var(--pds-color-border-separator)', paddingLeft: 8, margin: '0 0 8px 0', color: 'var(--pds-color-fg-default-secondary)' }, children: children }),
|
|
35
|
+
}, children: message.content }) })) })), message.error && (_jsx(Badge, { color: "critical", label: `Error: ${message.error}`, size: "s" }))] }));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=ChatMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatMessage.js","sourceRoot":"","sources":["../src/ChatMessage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { AIChatPluginOptions } from './types.js';
|
|
3
|
+
interface Props {
|
|
4
|
+
options: AIChatPluginOptions;
|
|
5
|
+
}
|
|
6
|
+
export declare function ChatPanel({ options }: Props): React.ReactElement;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=ChatPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../src/ChatPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAK9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,UAAU,KAAK;IACb,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,YAAY,CA2JhE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useEffect, useCallback } from 'react';
|
|
3
|
+
import { Button, Icon, Textarea, UtilityButton } from '@pantheon-systems/pds-toolkit-react';
|
|
4
|
+
import { useP1Puck, useP1Auth } from '@pantheon-systems/puck-css';
|
|
5
|
+
import { useAgentChat } from './useAgentChat.js';
|
|
6
|
+
import { ChatMessage } from './ChatMessage.js';
|
|
7
|
+
export function ChatPanel({ options }) {
|
|
8
|
+
const scrollRef = useRef(null);
|
|
9
|
+
const textareaRef = useRef(null);
|
|
10
|
+
const css = useP1Puck();
|
|
11
|
+
const { token } = useP1Auth();
|
|
12
|
+
// Stable refs so getAgentId/getContext don't change on every render
|
|
13
|
+
const cssRef = useRef(css);
|
|
14
|
+
cssRef.current = css;
|
|
15
|
+
const tokenRef = useRef(token);
|
|
16
|
+
tokenRef.current = token;
|
|
17
|
+
const defaultGetAgentId = useCallback(() => {
|
|
18
|
+
const { userId, siteId, branchId, currentDocument } = cssRef.current;
|
|
19
|
+
const docSlug = (currentDocument?.path ?? '').replace(/^\//, '').replace(/\//g, '-') || 'root';
|
|
20
|
+
return `${userId}-${siteId}-${branchId}-${docSlug}`;
|
|
21
|
+
}, []);
|
|
22
|
+
const getContext = useCallback(() => ({
|
|
23
|
+
siteId: cssRef.current.siteId,
|
|
24
|
+
branchId: cssRef.current.branchId,
|
|
25
|
+
documentPath: cssRef.current.currentDocument?.path ?? '',
|
|
26
|
+
documentId: cssRef.current.currentDocument?.id ?? '',
|
|
27
|
+
token: tokenRef.current ?? '',
|
|
28
|
+
}), []);
|
|
29
|
+
const { messages, input, setInput, submit, isLoading, clearMessages } = useAgentChat({
|
|
30
|
+
agentUrl: options.agentUrl,
|
|
31
|
+
getAgentId: options.getAgentId ?? defaultGetAgentId,
|
|
32
|
+
getContext,
|
|
33
|
+
});
|
|
34
|
+
// Auto-scroll to bottom on new messages
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (scrollRef.current) {
|
|
37
|
+
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
|
38
|
+
}
|
|
39
|
+
}, [messages]);
|
|
40
|
+
// Refocus the input after loading completes
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (!isLoading) {
|
|
43
|
+
textareaRef.current?.focus();
|
|
44
|
+
}
|
|
45
|
+
}, [isLoading]);
|
|
46
|
+
const handleKeyDown = (e) => {
|
|
47
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
48
|
+
e.preventDefault();
|
|
49
|
+
void submit();
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
return (_jsxs("div", { style: {
|
|
53
|
+
display: 'flex',
|
|
54
|
+
flexDirection: 'column',
|
|
55
|
+
height: '100%',
|
|
56
|
+
}, children: [_jsxs("div", { style: {
|
|
57
|
+
padding: '12px 16px',
|
|
58
|
+
borderBottom: '1px solid var(--pds-color-border-separator)',
|
|
59
|
+
display: 'flex',
|
|
60
|
+
alignItems: 'center',
|
|
61
|
+
justifyContent: 'space-between',
|
|
62
|
+
flexShrink: 0,
|
|
63
|
+
}, children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 8 }, children: [_jsx(Icon, { iconName: "sparkles", iconSize: "m" }), _jsxs("div", { children: [_jsx("div", { style: { fontSize: 14, fontWeight: 600, color: 'var(--pds-color-fg-default)' }, children: "AI Page Builder" }), _jsx("div", { style: { fontSize: 11, color: 'var(--pds-color-fg-default-secondary)', marginTop: 2 }, children: "Describe what you want to build or change" })] })] }), messages.length > 0 && (_jsx(UtilityButton, { label: "Clear", iconName: "trash", isCritical: true, onClick: clearMessages }))] }), _jsxs("div", { ref: scrollRef, style: {
|
|
64
|
+
flex: 1,
|
|
65
|
+
overflowY: 'auto',
|
|
66
|
+
padding: '16px',
|
|
67
|
+
}, children: [messages.length === 0 && (_jsxs("div", { style: {
|
|
68
|
+
textAlign: 'center',
|
|
69
|
+
color: 'var(--pds-color-fg-default-secondary)',
|
|
70
|
+
fontSize: 13,
|
|
71
|
+
paddingTop: 32,
|
|
72
|
+
}, children: [_jsx("div", { style: { marginBottom: 8, display: 'flex', justifyContent: 'center' }, children: _jsx(Icon, { iconName: "sparkles", iconSize: "xl" }) }), "Try: \"Build me a page about the world's fastest helicopters\""] })), messages.map(msg => (_jsx(ChatMessage, { message: msg }, msg.id)))] }), _jsxs("div", { style: {
|
|
73
|
+
padding: '12px 16px',
|
|
74
|
+
borderTop: '1px solid var(--pds-color-border-separator)',
|
|
75
|
+
flexShrink: 0,
|
|
76
|
+
}, children: [_jsx(Textarea, { id: "ai-chat-input", label: "Message", showLabel: false, placeholder: "Describe what you want to build or change\u2026", value: input, onChange: e => setInput(e.target.value), textareaProps: { onKeyDown: handleKeyDown }, disabled: isLoading, rows: 2, isResizable: false, ref: textareaRef }), _jsx("div", { style: { display: 'flex', justifyContent: 'flex-end', marginTop: 8 }, children: _jsx(Button, { label: "Send", variant: "secondary", size: "s", displayType: "icon-end", iconName: "paperPlane", onClick: () => void submit(), disabled: !input.trim(), isWorking: isLoading, tooltipText: isLoading ? 'Sending…' : undefined }) }), _jsx("div", { style: { fontSize: 11, color: 'var(--pds-color-fg-default-secondary)', marginTop: 6 }, children: "Enter to send \u00B7 Shift+Enter for newline" })] })] }));
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=ChatPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatPanel.js","sourceRoot":"","sources":["../src/ChatPanel.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { AIChatPluginOptions } from './types.js';
|
|
3
|
+
export type { AIChatPluginOptions, ChatMessage, ChatContext, ToolCallStatus } from './types.js';
|
|
4
|
+
export interface PuckPlugin {
|
|
5
|
+
name: string;
|
|
6
|
+
label?: string;
|
|
7
|
+
icon?: React.ReactNode;
|
|
8
|
+
render: () => React.ReactElement;
|
|
9
|
+
mobilePanelHeight?: 'toggle' | 'full';
|
|
10
|
+
}
|
|
11
|
+
export declare function createAIChatPlugin(options: AIChatPluginOptions): PuckPlugin;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGhG,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,MAAM,EAAE,MAAM,KAAK,CAAC,YAAY,CAAC;IACjC,iBAAiB,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CACvC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,UAAU,CAQ3E"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ChatPanel } from './ChatPanel.js';
|
|
3
|
+
export function createAIChatPlugin(options) {
|
|
4
|
+
return {
|
|
5
|
+
name: 'ai-chat',
|
|
6
|
+
label: 'AI Builder',
|
|
7
|
+
icon: React.createElement('span', { style: { fontSize: 16 } }, '✨'),
|
|
8
|
+
render: () => React.createElement(ChatPanel, { options }),
|
|
9
|
+
mobilePanelHeight: 'toggle',
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAc3C,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC7D,OAAO;QACL,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;QACnE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC;QACzD,iBAAiB,EAAE,QAAQ;KAC5B,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface ChatContext {
|
|
2
|
+
siteId: string;
|
|
3
|
+
branchId: string;
|
|
4
|
+
documentPath: string;
|
|
5
|
+
documentId?: string;
|
|
6
|
+
token: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ChatMessage {
|
|
9
|
+
id: string;
|
|
10
|
+
role: 'user' | 'assistant';
|
|
11
|
+
content: string;
|
|
12
|
+
toolCalls?: ToolCallStatus[];
|
|
13
|
+
error?: string;
|
|
14
|
+
isStreaming?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface ToolCallStatus {
|
|
17
|
+
name: string;
|
|
18
|
+
input?: unknown;
|
|
19
|
+
result?: unknown;
|
|
20
|
+
status: 'running' | 'done' | 'error';
|
|
21
|
+
}
|
|
22
|
+
export interface AIChatPluginOptions {
|
|
23
|
+
/** Base URL of the ChatAgent Cloudflare Worker, e.g. "https://p1-chatbot-agent.workers.dev" */
|
|
24
|
+
agentUrl: string;
|
|
25
|
+
/** Returns the Durable Object key. Defaults to `${userId}-${siteId}`. Override to change history scoping. */
|
|
26
|
+
getAgentId?: () => string;
|
|
27
|
+
}
|
|
28
|
+
export type ServerMessage = {
|
|
29
|
+
type: 'token';
|
|
30
|
+
content: string;
|
|
31
|
+
} | {
|
|
32
|
+
type: 'done';
|
|
33
|
+
} | {
|
|
34
|
+
type: 'error';
|
|
35
|
+
error: string;
|
|
36
|
+
} | {
|
|
37
|
+
type: 'tool_start';
|
|
38
|
+
toolName: string;
|
|
39
|
+
toolInput?: unknown;
|
|
40
|
+
} | {
|
|
41
|
+
type: 'tool_end';
|
|
42
|
+
toolName: string;
|
|
43
|
+
toolResult?: unknown;
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,+FAA+F;IAC/F,QAAQ,EAAE,MAAM,CAAC;IACjB,6GAA6G;IAC7G,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;CAC3B;AAGD,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ChatMessage, ChatContext } from './types.js';
|
|
2
|
+
export interface UseAgentChatOptions {
|
|
3
|
+
agentUrl: string;
|
|
4
|
+
getAgentId: () => string;
|
|
5
|
+
getContext: () => ChatContext;
|
|
6
|
+
}
|
|
7
|
+
export interface UseAgentChatReturn {
|
|
8
|
+
messages: ChatMessage[];
|
|
9
|
+
input: string;
|
|
10
|
+
setInput: (value: string) => void;
|
|
11
|
+
submit: () => void;
|
|
12
|
+
isLoading: boolean;
|
|
13
|
+
clearMessages: () => void;
|
|
14
|
+
}
|
|
15
|
+
export declare function useAgentChat({ agentUrl, getAgentId, getContext }: UseAgentChatOptions): UseAgentChatReturn;
|
|
16
|
+
//# sourceMappingURL=useAgentChat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAgentChat.d.ts","sourceRoot":"","sources":["../src/useAgentChat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAiC,WAAW,EAAE,MAAM,YAAY,CAAC;AAM1F,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,mBAAmB,GAAG,kBAAkB,CAyK1G"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
2
|
+
function makeId() {
|
|
3
|
+
return Math.random().toString(36).slice(2, 9);
|
|
4
|
+
}
|
|
5
|
+
export function useAgentChat({ agentUrl, getAgentId, getContext }) {
|
|
6
|
+
const [messages, setMessages] = useState([]);
|
|
7
|
+
const [input, setInput] = useState('');
|
|
8
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
9
|
+
const wsRef = useRef(null);
|
|
10
|
+
const currentAssistantIdRef = useRef(null);
|
|
11
|
+
const initialClearSentRef = useRef(false);
|
|
12
|
+
const getOrCreateWs = useCallback(() => {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
if (wsRef.current?.readyState === WebSocket.OPEN) {
|
|
15
|
+
resolve(wsRef.current);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const agentId = encodeURIComponent(getAgentId());
|
|
19
|
+
const wsUrl = `${agentUrl.replace(/^http/, 'ws').replace(/\/$/, '')}/agents/chat-agent/${agentId}`;
|
|
20
|
+
const ws = new WebSocket(wsUrl);
|
|
21
|
+
wsRef.current = ws;
|
|
22
|
+
ws.onopen = () => {
|
|
23
|
+
// Clear the DO's persisted history on the first connection after mount
|
|
24
|
+
// so each page load starts with a clean slate.
|
|
25
|
+
if (!initialClearSentRef.current) {
|
|
26
|
+
initialClearSentRef.current = true;
|
|
27
|
+
ws.send(JSON.stringify({ type: 'clear' }));
|
|
28
|
+
}
|
|
29
|
+
resolve(ws);
|
|
30
|
+
};
|
|
31
|
+
ws.onerror = () => reject(new Error('WebSocket connection failed'));
|
|
32
|
+
ws.onclose = () => {
|
|
33
|
+
wsRef.current = null;
|
|
34
|
+
// If a response was in-flight when the connection dropped, surface the error
|
|
35
|
+
const id = currentAssistantIdRef.current;
|
|
36
|
+
if (id) {
|
|
37
|
+
setMessages(prev => prev.map(m => m.id === id ? { ...m, error: 'Connection lost', isStreaming: false } : m));
|
|
38
|
+
currentAssistantIdRef.current = null;
|
|
39
|
+
setIsLoading(false);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
ws.onmessage = (event) => {
|
|
43
|
+
let msg;
|
|
44
|
+
try {
|
|
45
|
+
msg = JSON.parse(event.data);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
switch (msg.type) {
|
|
51
|
+
case 'token':
|
|
52
|
+
setMessages(prev => {
|
|
53
|
+
const id = currentAssistantIdRef.current;
|
|
54
|
+
if (!id)
|
|
55
|
+
return prev;
|
|
56
|
+
return prev.map(m => m.id === id
|
|
57
|
+
? { ...m, content: m.content + msg.content, isStreaming: true }
|
|
58
|
+
: m);
|
|
59
|
+
});
|
|
60
|
+
break;
|
|
61
|
+
case 'done':
|
|
62
|
+
setMessages(prev => {
|
|
63
|
+
const id = currentAssistantIdRef.current;
|
|
64
|
+
if (!id)
|
|
65
|
+
return prev;
|
|
66
|
+
return prev.map(m => m.id === id ? { ...m, isStreaming: false } : m);
|
|
67
|
+
});
|
|
68
|
+
currentAssistantIdRef.current = null;
|
|
69
|
+
setIsLoading(false);
|
|
70
|
+
break;
|
|
71
|
+
case 'error':
|
|
72
|
+
setMessages(prev => {
|
|
73
|
+
const id = currentAssistantIdRef.current;
|
|
74
|
+
if (!id)
|
|
75
|
+
return prev;
|
|
76
|
+
return prev.map(m => m.id === id ? { ...m, error: msg.error, isStreaming: false } : m);
|
|
77
|
+
});
|
|
78
|
+
currentAssistantIdRef.current = null;
|
|
79
|
+
setIsLoading(false);
|
|
80
|
+
break;
|
|
81
|
+
case 'tool_start':
|
|
82
|
+
setMessages(prev => {
|
|
83
|
+
const id = currentAssistantIdRef.current;
|
|
84
|
+
if (!id)
|
|
85
|
+
return prev;
|
|
86
|
+
return prev.map(m => {
|
|
87
|
+
if (m.id !== id)
|
|
88
|
+
return m;
|
|
89
|
+
const toolCall = { name: msg.toolName, input: msg.toolInput, status: 'running' };
|
|
90
|
+
return { ...m, toolCalls: [...(m.toolCalls ?? []), toolCall] };
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
break;
|
|
94
|
+
case 'tool_end':
|
|
95
|
+
setMessages(prev => {
|
|
96
|
+
const id = currentAssistantIdRef.current;
|
|
97
|
+
if (!id)
|
|
98
|
+
return prev;
|
|
99
|
+
return prev.map(m => {
|
|
100
|
+
if (m.id !== id)
|
|
101
|
+
return m;
|
|
102
|
+
const toolCalls = (m.toolCalls ?? []).map(tc => tc.name === msg.toolName && tc.status === 'running'
|
|
103
|
+
? { ...tc, result: msg.toolResult, status: 'done' }
|
|
104
|
+
: tc);
|
|
105
|
+
return { ...m, toolCalls };
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
}, [agentUrl, getAgentId]);
|
|
113
|
+
const submit = useCallback(async () => {
|
|
114
|
+
const text = input.trim();
|
|
115
|
+
if (!text || isLoading)
|
|
116
|
+
return;
|
|
117
|
+
setInput('');
|
|
118
|
+
setIsLoading(true);
|
|
119
|
+
// Add user message
|
|
120
|
+
const userMsg = { id: makeId(), role: 'user', content: text };
|
|
121
|
+
setMessages(prev => [...prev, userMsg]);
|
|
122
|
+
// Add placeholder assistant message
|
|
123
|
+
const assistantId = makeId();
|
|
124
|
+
currentAssistantIdRef.current = assistantId;
|
|
125
|
+
setMessages(prev => [...prev, { id: assistantId, role: 'assistant', content: '', isStreaming: true }]);
|
|
126
|
+
try {
|
|
127
|
+
const ws = await getOrCreateWs();
|
|
128
|
+
ws.send(JSON.stringify({
|
|
129
|
+
type: 'chat',
|
|
130
|
+
message: text,
|
|
131
|
+
context: getContext(),
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
setMessages(prev => prev.map(m => m.id === assistantId ? { ...m, error: 'Connection failed', isStreaming: false } : m));
|
|
136
|
+
currentAssistantIdRef.current = null;
|
|
137
|
+
setIsLoading(false);
|
|
138
|
+
}
|
|
139
|
+
}, [input, isLoading, getContext, getOrCreateWs]);
|
|
140
|
+
// Clean up WebSocket on unmount
|
|
141
|
+
useEffect(() => {
|
|
142
|
+
return () => {
|
|
143
|
+
wsRef.current?.close();
|
|
144
|
+
};
|
|
145
|
+
}, []);
|
|
146
|
+
const clearMessages = useCallback(() => {
|
|
147
|
+
setMessages([]);
|
|
148
|
+
if (wsRef.current?.readyState === WebSocket.OPEN) {
|
|
149
|
+
wsRef.current.send(JSON.stringify({ type: 'clear' }));
|
|
150
|
+
}
|
|
151
|
+
}, []);
|
|
152
|
+
return { messages, input, setInput, submit, isLoading, clearMessages };
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=useAgentChat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAgentChat.js","sourceRoot":"","sources":["../src/useAgentChat.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pantheon-systems/p1-ai-chat",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"default": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"access": "public",
|
|
19
|
+
"registry": "https://registry.npmjs.org/",
|
|
20
|
+
"provenance": false
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc",
|
|
24
|
+
"dev": "tsc --watch",
|
|
25
|
+
"type-check": "tsc --noEmit",
|
|
26
|
+
"prepublishOnly": "pnpm run build"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"react-markdown": "^10.1.0"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"@pantheon-systems/pds-toolkit-react": ">=2.0.0-alpha.0 <=2.0.0-alpha.12",
|
|
33
|
+
"@pantheon-systems/puck-css": ">=0.4.0",
|
|
34
|
+
"@puckeditor/core": "^0.21.0",
|
|
35
|
+
"react": "^18.0.0 || ^19.0.0"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@pantheon-systems/pds-toolkit-react": "2.0.0-alpha.12",
|
|
39
|
+
"@pantheon-systems/puck-css": "^0.4.4",
|
|
40
|
+
"@puckeditor/core": "^0.21.1",
|
|
41
|
+
"@types/react": "^18.0.0",
|
|
42
|
+
"react": "^18.0.0",
|
|
43
|
+
"typescript": "^5.7.3"
|
|
44
|
+
}
|
|
45
|
+
}
|