@turingfocus/chat-ui-antd 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.
Files changed (62) hide show
  1. package/LICENSE +21 -0
  2. package/dist/ask-user-interaction.d.ts +23 -0
  3. package/dist/ask-user-interaction.d.ts.map +1 -0
  4. package/dist/ask-user-interaction.js +116 -0
  5. package/dist/ask-user-interaction.js.map +1 -0
  6. package/dist/chat-composer.d.ts +13 -0
  7. package/dist/chat-composer.d.ts.map +1 -0
  8. package/dist/chat-composer.js +58 -0
  9. package/dist/chat-composer.js.map +1 -0
  10. package/dist/chat-conversation-view.d.ts +19 -0
  11. package/dist/chat-conversation-view.d.ts.map +1 -0
  12. package/dist/chat-conversation-view.js +71 -0
  13. package/dist/chat-conversation-view.js.map +1 -0
  14. package/dist/chat-run-status.d.ts +13 -0
  15. package/dist/chat-run-status.d.ts.map +1 -0
  16. package/dist/chat-run-status.js +59 -0
  17. package/dist/chat-run-status.js.map +1 -0
  18. package/dist/chat-state-view.d.ts +14 -0
  19. package/dist/chat-state-view.d.ts.map +1 -0
  20. package/dist/chat-state-view.js +59 -0
  21. package/dist/chat-state-view.js.map +1 -0
  22. package/dist/chat-timeline.d.ts +17 -0
  23. package/dist/chat-timeline.d.ts.map +1 -0
  24. package/dist/chat-timeline.js +79 -0
  25. package/dist/chat-timeline.js.map +1 -0
  26. package/dist/chat-ui-shell.d.ts +22 -0
  27. package/dist/chat-ui-shell.d.ts.map +1 -0
  28. package/dist/chat-ui-shell.js +41 -0
  29. package/dist/chat-ui-shell.js.map +1 -0
  30. package/dist/conversation-list.d.ts +21 -0
  31. package/dist/conversation-list.d.ts.map +1 -0
  32. package/dist/conversation-list.js +75 -0
  33. package/dist/conversation-list.js.map +1 -0
  34. package/dist/index.d.ts +13 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +12 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/labels.d.ts +4 -0
  39. package/dist/labels.d.ts.map +1 -0
  40. package/dist/labels.js +37 -0
  41. package/dist/labels.js.map +1 -0
  42. package/dist/markdown-content.d.ts +10 -0
  43. package/dist/markdown-content.d.ts.map +1 -0
  44. package/dist/markdown-content.js +20 -0
  45. package/dist/markdown-content.js.map +1 -0
  46. package/dist/renderer-registry.d.ts +33 -0
  47. package/dist/renderer-registry.d.ts.map +1 -0
  48. package/dist/renderer-registry.js +191 -0
  49. package/dist/renderer-registry.js.map +1 -0
  50. package/dist/timeline-tail-tracker.d.ts +21 -0
  51. package/dist/timeline-tail-tracker.d.ts.map +1 -0
  52. package/dist/timeline-tail-tracker.js +36 -0
  53. package/dist/timeline-tail-tracker.js.map +1 -0
  54. package/dist/types.d.ts +78 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +2 -0
  57. package/dist/types.js.map +1 -0
  58. package/dist/use-chat-command-coordinator.d.ts +31 -0
  59. package/dist/use-chat-command-coordinator.d.ts.map +1 -0
  60. package/dist/use-chat-command-coordinator.js +303 -0
  61. package/dist/use-chat-command-coordinator.js.map +1 -0
  62. package/package.json +47 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 A2C-SMCP contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,23 @@
1
+ import type { AskUserInteractionAnswer, AskUserInteractionQuestion, AskUserInteractionRequest, AskUserInteractionResult } from "@turingfocus/chat-protocol";
2
+ import type { ChatUiLabels } from "./types.js";
3
+ export interface AskUserInteractionCardProps {
4
+ readonly answerDisabled: boolean;
5
+ readonly labels: ChatUiLabels;
6
+ readonly onAnswer: (answer: AskUserInteractionAnswer) => Promise<boolean>;
7
+ readonly onChatAboutThis?: ((request: AskUserChatAboutThisRequest) => void) | undefined;
8
+ readonly request: AskUserInteractionRequest;
9
+ }
10
+ export interface AskUserChatAboutThisRequest {
11
+ readonly answers: AskUserInteractionAnswer["answers"];
12
+ readonly conversationId: string;
13
+ readonly question: AskUserInteractionQuestion;
14
+ readonly questionId: string;
15
+ readonly requestId: string;
16
+ readonly revision: string;
17
+ }
18
+ export declare const AskUserInteractionCard: ({ answerDisabled, labels, onAnswer, onChatAboutThis, request, }: AskUserInteractionCardProps) => import("react").JSX.Element;
19
+ export interface AskUserInteractionResultViewProps {
20
+ readonly result: AskUserInteractionResult;
21
+ }
22
+ export declare const AskUserInteractionResultView: ({ result, }: AskUserInteractionResultViewProps) => import("react").JSX.Element;
23
+ //# sourceMappingURL=ask-user-interaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-user-interaction.d.ts","sourceRoot":"","sources":["../src/ask-user-interaction.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1E,QAAQ,CAAC,eAAe,CAAC,EACvB,CAAC,CAAC,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;CAC7C;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC,SAAS,CAAC,CAAC;IACtD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,0BAA0B,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAsBD,eAAO,MAAM,sBAAsB,GAAI,iEAMpC,2BAA2B,gCAgK7B,CAAC;AAEF,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;CAC3C;AAED,eAAO,MAAM,4BAA4B,GAAI,aAE1C,iCAAiC,gCA+CnC,CAAC"}
@@ -0,0 +1,116 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, Card, Checkbox, Form, Input, Radio, Space, Typography, } from "antd";
3
+ import { Fragment, useCallback, useState } from "react";
4
+ import { ASK_USER_MAX_TEXT_CHARACTERS } from "@turingfocus/chat-protocol";
5
+ const normalizeAnswers = (values, questions) => {
6
+ const entries = [];
7
+ questions.forEach((question, index) => {
8
+ const value = values?.[index];
9
+ if (Array.isArray(value)) {
10
+ entries.push([question.id, value.map(String)]);
11
+ }
12
+ else if (typeof value === "string" ||
13
+ typeof value === "number" ||
14
+ typeof value === "boolean") {
15
+ entries.push([question.id, String(value)]);
16
+ }
17
+ });
18
+ return Object.fromEntries(entries);
19
+ };
20
+ export const AskUserInteractionCard = ({ answerDisabled, labels, onAnswer, onChatAboutThis, request, }) => {
21
+ const [form] = Form.useForm();
22
+ const [submitting, setSubmitting] = useState(false);
23
+ const answer = useCallback(async (action, values = {}) => {
24
+ if (submitting)
25
+ return;
26
+ setSubmitting(true);
27
+ try {
28
+ await onAnswer({
29
+ requestId: request.requestId,
30
+ revision: request.revision,
31
+ action,
32
+ answers: action === "cancel"
33
+ ? {}
34
+ : normalizeAnswers(values.answers, request.questions),
35
+ });
36
+ }
37
+ finally {
38
+ setSubmitting(false);
39
+ }
40
+ }, [
41
+ onAnswer,
42
+ request.questions,
43
+ request.requestId,
44
+ request.revision,
45
+ submitting,
46
+ ]);
47
+ const initialAnswers = request.questions.map((question) => question.defaultValue === undefined
48
+ ? undefined
49
+ : question.multiple
50
+ ? Array.isArray(question.defaultValue)
51
+ ? question.defaultValue
52
+ : [question.defaultValue]
53
+ : Array.isArray(question.defaultValue)
54
+ ? question.defaultValue[0]
55
+ : question.defaultValue);
56
+ return (_jsxs(Card, { "aria-label": labels.askUserLabel, size: "small", title: request.title, children: [answerDisabled ? (_jsx(Typography.Paragraph, { type: "secondary", children: labels.askUserUnavailable })) : null, _jsxs(Form, { form: form, initialValues: { answers: initialAnswers }, layout: "vertical", onFinish: (values) => answer("submit", values), children: [request.questions.map((question, questionIndex) => (_jsxs(Fragment, { children: [_jsx(Form.Item, { label: _jsxs(Space, { direction: "vertical", size: 0, children: [question.title === undefined ? null : (_jsx(Typography.Text, { strong: true, children: question.title })), _jsx(Typography.Text, { children: question.prompt })] }), name: ["answers", questionIndex], ...(question.description === undefined
57
+ ? {}
58
+ : {
59
+ extra: (_jsx(Typography.Text, { type: "secondary", children: question.description })),
60
+ }), ...(question.required
61
+ ? {
62
+ rules: [
63
+ { required: true, message: labels.askUserRequired },
64
+ ],
65
+ }
66
+ : {}), children: question.options.length === 0 ? (_jsx(Input.TextArea, { disabled: answerDisabled || submitting, maxLength: ASK_USER_MAX_TEXT_CHARACTERS, placeholder: question.placeholder })) : question.multiple ? (_jsx(Checkbox.Group, { disabled: answerDisabled || submitting, options: question.options.map((option) => ({
67
+ label: option.description === undefined
68
+ ? option.label
69
+ : `${option.label} — ${option.description}`,
70
+ value: option.value,
71
+ })) })) : (_jsx(Radio.Group, { disabled: answerDisabled || submitting, options: question.options.map((option) => ({
72
+ label: option.description === undefined
73
+ ? option.label
74
+ : `${option.label} — ${option.description}`,
75
+ value: option.value,
76
+ })) })) }), onChatAboutThis === undefined ? null : (_jsx(Button, { disabled: submitting, onClick: () => {
77
+ onChatAboutThis({
78
+ answers: normalizeAnswers(form.getFieldsValue().answers, request.questions),
79
+ conversationId: request.conversationId,
80
+ question,
81
+ questionId: question.id,
82
+ requestId: request.requestId,
83
+ revision: request.revision,
84
+ });
85
+ }, type: "link", children: labels.askUserChatAboutThis }))] }, question.id))), _jsxs(Space, { wrap: true, children: [_jsx(Button, { disabled: answerDisabled, htmlType: "submit", loading: submitting, type: "primary", children: submitting ? labels.askUserSubmitting : labels.askUserSubmit }), _jsx(Button, { disabled: answerDisabled || submitting, onClick: () => answer("cancel"), children: labels.askUserCancel })] })] })] }));
86
+ };
87
+ export const AskUserInteractionResultView = ({ result, }) => {
88
+ const questionLimit = 12;
89
+ const textLimit = 800;
90
+ const answerValueLimit = 50;
91
+ const visibleQuestions = result.questions.slice(0, questionLimit);
92
+ let truncated = visibleQuestions.length < result.questions.length;
93
+ const truncate = (value) => {
94
+ if (value.length <= textLimit)
95
+ return value;
96
+ truncated = true;
97
+ return `${value.slice(0, textLimit)}… [truncated]`;
98
+ };
99
+ const renderedQuestions = visibleQuestions.map((question) => {
100
+ const answer = result.answers?.[question.id];
101
+ let answerText;
102
+ if (typeof answer === "string") {
103
+ answerText = truncate(answer);
104
+ }
105
+ else if (answer !== undefined) {
106
+ const visibleValues = answer.slice(0, answerValueLimit);
107
+ if (visibleValues.length < answer.length)
108
+ truncated = true;
109
+ answerText = truncate(visibleValues.join(", "));
110
+ }
111
+ return (_jsxs("div", { children: [_jsx(Typography.Text, { children: truncate(question.prompt) }), answerText === undefined ? null : (_jsx(Typography.Paragraph, { style: { margin: 0 }, type: "secondary", children: answerText }))] }, question.id));
112
+ });
113
+ const error = result.error === undefined ? undefined : truncate(result.error);
114
+ return (_jsxs(Space, { direction: "vertical", size: "small", children: [_jsxs(Typography.Text, { strong: true, children: ["Ask User \u00B7 ", result.status] }), renderedQuestions, error === undefined ? null : (_jsx(Typography.Text, { type: "danger", children: error })), truncated ? (_jsx(Typography.Text, { type: "secondary", children: "Ask User history truncated" })) : null] }));
115
+ };
116
+ //# sourceMappingURL=ask-user-interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-user-interaction.js","sourceRoot":"","sources":["../src/ask-user-interaction.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type CSSProperties } from "react";
2
+ import type { ChatUiLabelOverrides } from "./types.js";
3
+ export interface ChatComposerProps {
4
+ readonly className?: string | undefined;
5
+ readonly disabled?: boolean | undefined;
6
+ readonly disabledReason?: string | undefined;
7
+ readonly labels?: ChatUiLabelOverrides | undefined;
8
+ readonly onSend: (text: string) => boolean | PromiseLike<boolean>;
9
+ readonly resetKey?: string | undefined;
10
+ readonly style?: CSSProperties | undefined;
11
+ }
12
+ export declare const ChatComposer: ({ className, disabled, disabledReason, labels: labelOverrides, onSend, resetKey, style, }: ChatComposerProps) => import("react").JSX.Element;
13
+ //# sourceMappingURL=chat-composer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-composer.d.ts","sourceRoot":"","sources":["../src/chat-composer.tsx"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAC5C;AAED,eAAO,MAAM,YAAY,GAAI,2FAQ1B,iBAAiB,gCAqFnB,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, Input, Typography, theme } from "antd";
3
+ import { useEffect, useRef, useState, } from "react";
4
+ import { resolveChatUiLabels } from "./labels.js";
5
+ export const ChatComposer = ({ className, disabled = false, disabledReason, labels: labelOverrides, onSend, resetKey, style, }) => {
6
+ const { token } = theme.useToken();
7
+ const labels = resolveChatUiLabels(labelOverrides);
8
+ const [draft, setDraft] = useState("");
9
+ const [submitting, setSubmitting] = useState(false);
10
+ const submissionId = useRef(0);
11
+ useEffect(() => {
12
+ submissionId.current += 1;
13
+ setDraft("");
14
+ setSubmitting(false);
15
+ }, [resetKey]);
16
+ const submit = async () => {
17
+ const text = draft.trim();
18
+ if (disabled || submitting || text.length === 0)
19
+ return;
20
+ const requestId = submissionId.current + 1;
21
+ submissionId.current = requestId;
22
+ setSubmitting(true);
23
+ try {
24
+ const succeeded = await onSend(text);
25
+ if (submissionId.current !== requestId)
26
+ return;
27
+ if (succeeded) {
28
+ setDraft((current) => (current.trim() === text ? "" : current));
29
+ }
30
+ }
31
+ catch {
32
+ // The owner of the command callback owns error presentation. Retain the
33
+ // draft so the user can retry without creating a second error source.
34
+ }
35
+ finally {
36
+ if (submissionId.current === requestId)
37
+ setSubmitting(false);
38
+ }
39
+ };
40
+ const handlePressEnter = (event) => {
41
+ if (event.shiftKey || event.nativeEvent.isComposing)
42
+ return;
43
+ event.preventDefault();
44
+ void submit();
45
+ };
46
+ return (_jsxs("div", { className: className, style: {
47
+ borderBlockStart: `${token.lineWidth}px ${token.lineType} ${token.colorBorderSecondary}`,
48
+ padding: token.paddingSM,
49
+ ...style,
50
+ }, children: [_jsxs("div", { style: { alignItems: "flex-end", display: "flex", gap: token.marginXS }, children: [_jsx(Input.TextArea, { "aria-label": labels.composerLabel, autoSize: { maxRows: 8, minRows: 2 }, disabled: disabled, onChange: (event) => {
51
+ setDraft(event.target.value);
52
+ }, onPressEnter: handlePressEnter, placeholder: disabled
53
+ ? (disabledReason ?? labels.textSendingUnavailable)
54
+ : labels.composerPlaceholder, value: draft }), _jsx(Button, { disabled: disabled || draft.trim().length === 0, loading: submitting, onClick: () => {
55
+ void submit();
56
+ }, type: "primary", children: submitting ? labels.sending : labels.send })] }), disabled && disabledReason !== undefined ? (_jsx(Typography.Text, { type: "secondary", children: disabledReason })) : null] }));
57
+ };
58
+ //# sourceMappingURL=chat-composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-composer.js","sourceRoot":"","sources":["../src/chat-composer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AACxD,OAAO,EACL,SAAS,EACT,MAAM,EACN,QAAQ,GAGT,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAalD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAC3B,SAAS,EACT,QAAQ,GAAG,KAAK,EAChB,cAAc,EACd,MAAM,EAAE,cAAc,EACtB,MAAM,EACN,QAAQ,EACR,KAAK,GACa,EAAE,EAAE;IACtB,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAE/B,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC;QAC1B,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,QAAQ,IAAI,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAExD,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,GAAG,CAAC,CAAC;QAC3C,YAAY,CAAC,OAAO,GAAG,SAAS,CAAC;QACjC,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,YAAY,CAAC,OAAO,KAAK,SAAS;gBAAE,OAAO;YAC/C,IAAI,SAAS,EAAE,CAAC;gBACd,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wEAAwE;YACxE,sEAAsE;QACxE,CAAC;gBAAS,CAAC;YACT,IAAI,YAAY,CAAC,OAAO,KAAK,SAAS;gBAAE,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,CACvB,KAAyC,EACnC,EAAE;QACR,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,WAAW,CAAC,WAAW;YAAE,OAAO;QAC5D,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,MAAM,EAAE,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,CACL,eACE,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE;YACL,gBAAgB,EAAE,GAAG,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,oBAAoB,EAAE;YACxF,OAAO,EAAE,KAAK,CAAC,SAAS;YACxB,GAAG,KAAK;SACT,aAED,eACE,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,aAEvE,KAAC,KAAK,CAAC,QAAQ,kBACD,MAAM,CAAC,aAAa,EAChC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EACpC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4BAClB,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBAC/B,CAAC,EACD,YAAY,EAAE,gBAAgB,EAC9B,WAAW,EACT,QAAQ;4BACN,CAAC,CAAC,CAAC,cAAc,IAAI,MAAM,CAAC,sBAAsB,CAAC;4BACnD,CAAC,CAAC,MAAM,CAAC,mBAAmB,EAEhC,KAAK,EAAE,KAAK,GACZ,EACF,KAAC,MAAM,IACL,QAAQ,EAAE,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAC/C,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,GAAG,EAAE;4BACZ,KAAK,MAAM,EAAE,CAAC;wBAChB,CAAC,EACD,IAAI,EAAC,SAAS,YAEb,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GACnC,IACL,EACL,QAAQ,IAAI,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,CAC1C,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAC,WAAW,YAAE,cAAc,GAAmB,CACrE,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { CSSProperties } from "react";
2
+ import { type AskUserChatAboutThisRequest } from "./ask-user-interaction.js";
3
+ import type { ChatRendererFailure, ChatRendererRegistry } from "./renderer-registry.js";
4
+ import type { ChatUiLabelOverrides } from "./types.js";
5
+ import { type ChatUiCommand, type ChatUiCommandFailure } from "./use-chat-command-coordinator.js";
6
+ export type { ChatUiCommand, ChatUiCommandFailure };
7
+ export interface ChatConversationViewProps {
8
+ readonly className?: string | undefined;
9
+ readonly formatTimestamp?: ((timestamp: number) => string) | undefined;
10
+ readonly getDeadlineAt: () => number;
11
+ readonly labels?: ChatUiLabelOverrides | undefined;
12
+ readonly onCommandError?: ((failure: ChatUiCommandFailure) => void) | undefined;
13
+ readonly onChatAboutThis?: ((request: AskUserChatAboutThisRequest) => void) | undefined;
14
+ readonly onRendererError?: ((failure: ChatRendererFailure) => void) | undefined;
15
+ readonly renderers?: ChatRendererRegistry | undefined;
16
+ readonly style?: CSSProperties | undefined;
17
+ }
18
+ export declare const ChatConversationView: ({ className, formatTimestamp, getDeadlineAt, labels: labelOverrides, onChatAboutThis, onCommandError, onRendererError, renderers, style, }: ChatConversationViewProps) => import("react").JSX.Element;
19
+ //# sourceMappingURL=chat-conversation-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-conversation-view.d.ts","sourceRoot":"","sources":["../src/chat-conversation-view.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAM3C,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,2BAA2B,CAAC;AAKnC,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAC1B,MAAM,mCAAmC,CAAC;AAE3C,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,CAAC;AAEpD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IACvE,QAAQ,CAAC,aAAa,EAAE,MAAM,MAAM,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,cAAc,CAAC,EACtB,CAAC,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,eAAe,CAAC,EACvB,CAAC,CAAC,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,eAAe,CAAC,EACvB,CAAC,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAC5C;AAuCD,eAAO,MAAM,oBAAoB,GAAI,4IAUlC,yBAAyB,gCAwH3B,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Alert, theme } from "antd";
3
+ import { useChatClient, useChatSelector } from "@turingfocus/chat-react";
4
+ import { ChatComposer } from "./chat-composer.js";
5
+ import { AskUserInteractionCard, } from "./ask-user-interaction.js";
6
+ import { ChatRunStatus } from "./chat-run-status.js";
7
+ import { ChatStateView } from "./chat-state-view.js";
8
+ import { ChatTimeline } from "./chat-timeline.js";
9
+ import { resolveChatUiLabels } from "./labels.js";
10
+ import { useChatCommandCoordinator, } from "./use-chat-command-coordinator.js";
11
+ const selectChatConversationViewSnapshot = (snapshot) => snapshot === null
12
+ ? null
13
+ : {
14
+ capabilities: snapshot.capabilities,
15
+ conversationId: snapshot.conversation.id,
16
+ error: snapshot.error,
17
+ pendingInteraction: snapshot.pendingInteraction,
18
+ run: snapshot.run,
19
+ timeline: snapshot.timeline,
20
+ };
21
+ const equalChatConversationViewSnapshot = (left, right) => left === right ||
22
+ (left !== null &&
23
+ right !== null &&
24
+ left.capabilities === right.capabilities &&
25
+ left.conversationId === right.conversationId &&
26
+ left.error === right.error &&
27
+ left.pendingInteraction === right.pendingInteraction &&
28
+ left.run === right.run &&
29
+ left.timeline === right.timeline);
30
+ export const ChatConversationView = ({ className, formatTimestamp, getDeadlineAt, labels: labelOverrides, onChatAboutThis, onCommandError, onRendererError, renderers, style, }) => {
31
+ const { token } = theme.useToken();
32
+ const labels = resolveChatUiLabels(labelOverrides);
33
+ const client = useChatClient();
34
+ const snapshot = useChatSelector(selectChatConversationViewSnapshot, equalChatConversationViewSnapshot);
35
+ const { answerInteraction, dismissFailure, interrupt, sendText, viewResetKey, visibleCommandFailures, visibleSnapshotError, } = useChatCommandCoordinator({
36
+ canAnswerInteraction: snapshot?.capabilities.answerInteraction === true,
37
+ canInterrupt: snapshot?.capabilities.interrupt ?? false,
38
+ client,
39
+ conversationId: snapshot?.conversationId ?? null,
40
+ getDeadlineAt,
41
+ interactionRequest: snapshot?.pendingInteraction === undefined
42
+ ? undefined
43
+ : {
44
+ requestId: snapshot.pendingInteraction.requestId,
45
+ revision: snapshot.pendingInteraction.revision,
46
+ },
47
+ onCommandError,
48
+ run: snapshot?.run ?? null,
49
+ snapshotError: snapshot?.error,
50
+ });
51
+ if (snapshot === null) {
52
+ return _jsx(ChatStateView, { labels: labels, state: { kind: "loading" } });
53
+ }
54
+ const conversationId = snapshot.conversationId;
55
+ return (_jsxs("section", { className: className, style: {
56
+ display: "flex",
57
+ flexDirection: "column",
58
+ height: "100%",
59
+ minHeight: 0,
60
+ ...style,
61
+ }, children: [_jsx(ChatRunStatus, { canInterrupt: snapshot.capabilities.interrupt, labels: labels, onInterrupt: interrupt, run: snapshot.run }, `${viewResetKey}:${snapshot.run?.id ?? "no-run"}`), visibleSnapshotError === undefined ? null : (_jsx(Alert, { message: visibleSnapshotError.message, showIcon: true, style: { margin: token.marginXS }, type: "error" })), visibleCommandFailures.map((failure) => (_jsx(Alert, { closable: true, message: failure.error.message, onClose: () => {
62
+ dismissFailure(failure.command);
63
+ }, showIcon: true, style: { margin: token.marginXS }, type: "error" }, failure.command))), _jsx("div", { style: { flex: 1, minHeight: 0 }, children: _jsx(ChatTimeline, { conversationId: conversationId, formatTimestamp: formatTimestamp, items: snapshot.timeline, labels: labels, onRendererError: onRendererError, renderers: renderers }, viewResetKey) }), snapshot.pendingInteraction === undefined ? null : (_jsx("div", { style: { padding: token.paddingXS }, children: _jsx(AskUserInteractionCard, { answerDisabled: snapshot.capabilities.answerInteraction !== true, labels: labels, onAnswer: answerInteraction, onChatAboutThis: onChatAboutThis, request: snapshot.pendingInteraction }, JSON.stringify([
64
+ conversationId,
65
+ snapshot.pendingInteraction.requestId,
66
+ snapshot.pendingInteraction.revision,
67
+ ])) })), _jsx(ChatComposer, { disabled: !snapshot.capabilities.sendText, disabledReason: snapshot.capabilities.sendText
68
+ ? undefined
69
+ : labels.textSendingUnavailable, labels: labels, onSend: sendText, resetKey: viewResetKey }, viewResetKey)] }));
70
+ };
71
+ //# sourceMappingURL=chat-conversation-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-conversation-view.js","sourceRoot":"","sources":["../src/chat-conversation-view.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type CSSProperties } from "react";
2
+ import type { Run } from "@turingfocus/chat-protocol";
3
+ import type { ChatUiLabelOverrides } from "./types.js";
4
+ export interface ChatRunStatusProps {
5
+ readonly canInterrupt: boolean;
6
+ readonly className?: string | undefined;
7
+ readonly labels?: ChatUiLabelOverrides | undefined;
8
+ readonly onInterrupt: () => boolean | PromiseLike<boolean>;
9
+ readonly run: Run | null;
10
+ readonly style?: CSSProperties | undefined;
11
+ }
12
+ export declare const ChatRunStatus: ({ canInterrupt, className, labels: labelOverrides, onInterrupt, run, style, }: ChatRunStatusProps) => import("react").JSX.Element | null;
13
+ //# sourceMappingURL=chat-run-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-run-status.d.ts","sourceRoot":"","sources":["../src/chat-run-status.tsx"],"names":[],"mappings":"AACA,OAAO,EAA+B,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAExE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AAGtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC3D,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAC5C;AAED,eAAO,MAAM,aAAa,GAAI,+EAO3B,kBAAkB,uCAuFpB,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Alert, Button, Tag, Typography, theme } from "antd";
3
+ import { useEffect, useRef, useState } from "react";
4
+ import { resolveChatUiLabels } from "./labels.js";
5
+ export const ChatRunStatus = ({ canInterrupt, className, labels: labelOverrides, onInterrupt, run, style, }) => {
6
+ const { token } = theme.useToken();
7
+ const labels = resolveChatUiLabels(labelOverrides);
8
+ const [interrupting, setInterrupting] = useState(false);
9
+ const interruptRequestId = useRef(0);
10
+ useEffect(() => {
11
+ interruptRequestId.current += 1;
12
+ setInterrupting(false);
13
+ }, [canInterrupt, run]);
14
+ if (run === null)
15
+ return null;
16
+ const statusColor = run.status === "succeeded"
17
+ ? "success"
18
+ : run.status === "failed"
19
+ ? "error"
20
+ : run.status === "running"
21
+ ? "processing"
22
+ : "default";
23
+ const interruptAvailable = run.status === "running" && run.canInterrupt && canInterrupt;
24
+ const interrupt = async () => {
25
+ if (!interruptAvailable || interrupting)
26
+ return;
27
+ const requestId = interruptRequestId.current + 1;
28
+ interruptRequestId.current = requestId;
29
+ setInterrupting(true);
30
+ try {
31
+ await onInterrupt();
32
+ }
33
+ catch {
34
+ // The command owner renders failures. This component owns pending state
35
+ // only, preventing duplicate alerts in composed views.
36
+ }
37
+ finally {
38
+ if (interruptRequestId.current === requestId)
39
+ setInterrupting(false);
40
+ }
41
+ };
42
+ return (_jsxs("div", { className: className, style: {
43
+ borderBlockEnd: `${token.lineWidth}px ${token.lineType} ${token.colorBorderSecondary}`,
44
+ padding: `${token.paddingXS}px ${token.paddingSM}px`,
45
+ ...style,
46
+ }, children: [_jsxs("div", { style: {
47
+ alignItems: "center",
48
+ display: "flex",
49
+ gap: token.marginXS,
50
+ justifyContent: "space-between",
51
+ }, children: [_jsxs(Typography.Text, { children: [labels.runStatusLabel, ": ", _jsx(Tag, { color: statusColor, children: run.status })] }), run.status === "running" ? (_jsx(Button, { danger: true, disabled: !interruptAvailable, loading: interrupting, onClick: () => {
52
+ void interrupt();
53
+ }, size: "small", children: interrupting
54
+ ? labels.interrupting
55
+ : interruptAvailable
56
+ ? labels.interrupt
57
+ : labels.interruptUnavailable })) : null] }), run.error === undefined ? null : (_jsx(Alert, { message: run.error.message, showIcon: true, style: { marginTop: token.marginXS }, type: "error" }))] }));
58
+ };
59
+ //# sourceMappingURL=chat-run-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-run-status.js","sourceRoot":"","sources":["../src/chat-run-status.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAsB,MAAM,OAAO,CAAC;AAIxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAYlD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAC5B,YAAY,EACZ,SAAS,EACT,MAAM,EAAE,cAAc,EACtB,WAAW,EACX,GAAG,EACH,KAAK,GACc,EAAE,EAAE;IACvB,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAErC,SAAS,CAAC,GAAG,EAAE;QACb,kBAAkB,CAAC,OAAO,IAAI,CAAC,CAAC;QAChC,eAAe,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;IAExB,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,WAAW,GACf,GAAG,CAAC,MAAM,KAAK,WAAW;QACxB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ;YACvB,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS;gBACxB,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,SAAS,CAAC;IACpB,MAAM,kBAAkB,GACtB,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,YAAY,IAAI,YAAY,CAAC;IAE/D,MAAM,SAAS,GAAG,KAAK,IAAmB,EAAE;QAC1C,IAAI,CAAC,kBAAkB,IAAI,YAAY;YAAE,OAAO;QAChD,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,GAAG,CAAC,CAAC;QACjD,kBAAkB,CAAC,OAAO,GAAG,SAAS,CAAC;QACvC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,WAAW,EAAE,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,wEAAwE;YACxE,uDAAuD;QACzD,CAAC;gBAAS,CAAC;YACT,IAAI,kBAAkB,CAAC,OAAO,KAAK,SAAS;gBAAE,eAAe,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,eACE,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE;YACL,cAAc,EAAE,GAAG,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,oBAAoB,EAAE;YACtF,OAAO,EAAE,GAAG,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,IAAI;YACpD,GAAG,KAAK;SACT,aAED,eACE,KAAK,EAAE;oBACL,UAAU,EAAE,QAAQ;oBACpB,OAAO,EAAE,MAAM;oBACf,GAAG,EAAE,KAAK,CAAC,QAAQ;oBACnB,cAAc,EAAE,eAAe;iBAChC,aAED,MAAC,UAAU,CAAC,IAAI,eACb,MAAM,CAAC,cAAc,QAAG,KAAC,GAAG,IAAC,KAAK,EAAE,WAAW,YAAG,GAAG,CAAC,MAAM,GAAO,IACpD,EACjB,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAC1B,KAAC,MAAM,IACL,MAAM,QACN,QAAQ,EAAE,CAAC,kBAAkB,EAC7B,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,GAAG,EAAE;4BACZ,KAAK,SAAS,EAAE,CAAC;wBACnB,CAAC,EACD,IAAI,EAAC,OAAO,YAEX,YAAY;4BACX,CAAC,CAAC,MAAM,CAAC,YAAY;4BACrB,CAAC,CAAC,kBAAkB;gCAClB,CAAC,CAAC,MAAM,CAAC,SAAS;gCAClB,CAAC,CAAC,MAAM,CAAC,oBAAoB,GAC1B,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAChC,KAAC,KAAK,IACJ,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAC1B,QAAQ,QACR,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,EACpC,IAAI,EAAC,OAAO,GACZ,CACH,IACG,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { CSSProperties } from "react";
2
+ import type { ChatContentState, ChatUiLabelOverrides } from "./types.js";
3
+ type NonReadyChatContentState = Exclude<ChatContentState, {
4
+ readonly kind: "ready";
5
+ }>;
6
+ export interface ChatStateViewProps {
7
+ readonly className?: string | undefined;
8
+ readonly labels?: ChatUiLabelOverrides | undefined;
9
+ readonly state: NonReadyChatContentState;
10
+ readonly style?: CSSProperties | undefined;
11
+ }
12
+ export declare const ChatStateView: ({ className, labels: labelOverrides, state, style, }: ChatStateViewProps) => import("react").JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=chat-state-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-state-view.d.ts","sourceRoot":"","sources":["../src/chat-state-view.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,OAAO,CAAC;AAGtD,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAEpB,KAAK,wBAAwB,GAAG,OAAO,CACrC,gBAAgB,EAChB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAC3B,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAC5C;AAuDD,eAAO,MAAM,aAAa,GAAI,sDAK3B,kBAAkB,gCA8DpB,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, Empty, Result, Spin, Typography } from "antd";
3
+ import { resolveChatUiLabels } from "./labels.js";
4
+ const getStateCopy = (state, labels) => {
5
+ switch (state.kind) {
6
+ case "loading":
7
+ return {
8
+ title: state.title ?? labels.loadingTitle,
9
+ description: state.description ?? labels.loadingDescription,
10
+ };
11
+ case "empty":
12
+ return {
13
+ title: state.title ?? labels.emptyTitle,
14
+ description: state.description ?? labels.emptyDescription,
15
+ };
16
+ case "error":
17
+ return {
18
+ title: state.title ?? labels.errorTitle,
19
+ description: state.description ?? labels.errorDescription,
20
+ };
21
+ case "disconnected":
22
+ return {
23
+ title: state.title ?? labels.disconnectedTitle,
24
+ description: state.description ?? labels.disconnectedDescription,
25
+ };
26
+ case "capability-unavailable":
27
+ return {
28
+ title: state.title ?? labels.capabilityUnavailableTitle,
29
+ description: state.description ??
30
+ (state.capability === undefined
31
+ ? labels.capabilityUnavailableDescription
32
+ : `${state.capability} is not available in the current session.`),
33
+ };
34
+ }
35
+ };
36
+ const defaultStyle = {
37
+ alignItems: "center",
38
+ display: "flex",
39
+ flexDirection: "column",
40
+ height: "100%",
41
+ justifyContent: "center",
42
+ minHeight: 240,
43
+ padding: 24,
44
+ textAlign: "center",
45
+ };
46
+ export const ChatStateView = ({ className, labels: labelOverrides, state, style, }) => {
47
+ const labels = resolveChatUiLabels(labelOverrides);
48
+ const copy = getStateCopy(state, labels);
49
+ if (state.kind === "loading") {
50
+ return (_jsxs("div", { "aria-live": "polite", className: className, role: "status", style: { ...defaultStyle, ...style }, children: [_jsx(Spin, { size: "large", tip: copy.title, children: _jsx("div", { style: { minHeight: 80, minWidth: 240 } }) }), _jsx(Typography.Text, { type: "secondary", style: { marginTop: 16 }, children: copy.description })] }));
51
+ }
52
+ if (state.kind === "empty") {
53
+ return (_jsx("div", { "aria-live": "polite", className: className, role: "status", style: { ...defaultStyle, ...style }, children: _jsx(Empty, { description: copy.title, children: _jsx(Typography.Text, { type: "secondary", children: copy.description }) }) }));
54
+ }
55
+ const canRetry = (state.kind === "error" || state.kind === "disconnected") &&
56
+ state.onRetry !== undefined;
57
+ return (_jsx("div", { "aria-live": "assertive", className: className, role: "alert", style: { ...defaultStyle, ...style }, children: _jsx(Result, { extra: canRetry ? (_jsx(Button, { onClick: state.onRetry, type: "primary", children: labels.retry })) : undefined, status: state.kind === "error" ? "error" : "warning", subTitle: copy.description, title: copy.title }) }));
58
+ };
59
+ //# sourceMappingURL=chat-state-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-state-view.js","sourceRoot":"","sources":["../src/chat-state-view.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type CSSProperties } from "react";
2
+ import { type TimelineItem } from "@turingfocus/chat-protocol";
3
+ import { type ChatRendererFailure, type ChatRendererRegistry } from "./renderer-registry.js";
4
+ import type { ChatUiLabelOverrides } from "./types.js";
5
+ export interface ChatTimelineProps {
6
+ readonly "aria-label"?: string | undefined;
7
+ readonly className?: string | undefined;
8
+ readonly conversationId: string;
9
+ readonly formatTimestamp?: ((timestamp: number) => string) | undefined;
10
+ readonly items: readonly TimelineItem[];
11
+ readonly labels?: ChatUiLabelOverrides | undefined;
12
+ readonly onRendererError?: ((failure: ChatRendererFailure) => void) | undefined;
13
+ readonly renderers?: ChatRendererRegistry | undefined;
14
+ readonly style?: CSSProperties | undefined;
15
+ }
16
+ export declare const ChatTimeline: ({ "aria-label": ariaLabel, className, conversationId, formatTimestamp, items, labels: labelOverrides, onRendererError, renderers, style, }: ChatTimelineProps) => import("react").JSX.Element;
17
+ //# sourceMappingURL=chat-timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-timeline.d.ts","sourceRoot":"","sources":["../src/chat-timeline.tsx"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AAGf,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,MAAM,wBAAwB,CAAC;AAMhC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAOvD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IACvE,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,eAAe,CAAC,EACvB,CAAC,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAC5C;AAED,eAAO,MAAM,YAAY,GAAI,4IAU1B,iBAAiB,gCA6InB,CAAC"}