@burtson-labs/agent-ui 1.0.11

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 (144) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +45 -0
  3. package/dist/components/AgentConsole.d.ts +11 -0
  4. package/dist/components/AgentConsole.d.ts.map +1 -0
  5. package/dist/components/AgentConsole.js +139 -0
  6. package/dist/components/AgentConsole.js.map +1 -0
  7. package/dist/components/AgentSummaryCard.d.ts +9 -0
  8. package/dist/components/AgentSummaryCard.d.ts.map +1 -0
  9. package/dist/components/AgentSummaryCard.js +96 -0
  10. package/dist/components/AgentSummaryCard.js.map +1 -0
  11. package/dist/components/ChatComposer.d.ts +134 -0
  12. package/dist/components/ChatComposer.d.ts.map +1 -0
  13. package/dist/components/ChatComposer.js +411 -0
  14. package/dist/components/ChatComposer.js.map +1 -0
  15. package/dist/components/ChatConversation.d.ts +28 -0
  16. package/dist/components/ChatConversation.d.ts.map +1 -0
  17. package/dist/components/ChatConversation.js +82 -0
  18. package/dist/components/ChatConversation.js.map +1 -0
  19. package/dist/components/ChatMessage.d.ts +38 -0
  20. package/dist/components/ChatMessage.d.ts.map +1 -0
  21. package/dist/components/ChatMessage.js +208 -0
  22. package/dist/components/ChatMessage.js.map +1 -0
  23. package/dist/components/DiffBlock.d.ts +7 -0
  24. package/dist/components/DiffBlock.d.ts.map +1 -0
  25. package/dist/components/DiffBlock.js +58 -0
  26. package/dist/components/DiffBlock.js.map +1 -0
  27. package/dist/components/DiffReview/DiffBlock.d.ts +7 -0
  28. package/dist/components/DiffReview/DiffBlock.d.ts.map +1 -0
  29. package/dist/components/DiffReview/DiffBlock.js +13 -0
  30. package/dist/components/DiffReview/DiffBlock.js.map +1 -0
  31. package/dist/components/DiffReview/DiffFileGroup.d.ts +14 -0
  32. package/dist/components/DiffReview/DiffFileGroup.d.ts.map +1 -0
  33. package/dist/components/DiffReview/DiffFileGroup.js +44 -0
  34. package/dist/components/DiffReview/DiffFileGroup.js.map +1 -0
  35. package/dist/components/DiffReview/DiffReviewPanel.d.ts +16 -0
  36. package/dist/components/DiffReview/DiffReviewPanel.d.ts.map +1 -0
  37. package/dist/components/DiffReview/DiffReviewPanel.js +25 -0
  38. package/dist/components/DiffReview/DiffReviewPanel.js.map +1 -0
  39. package/dist/components/DiffReview/index.d.ts +3 -0
  40. package/dist/components/DiffReview/index.d.ts.map +1 -0
  41. package/dist/components/DiffReview/index.js +19 -0
  42. package/dist/components/DiffReview/index.js.map +1 -0
  43. package/dist/components/DiffReviewCard.d.ts +10 -0
  44. package/dist/components/DiffReviewCard.d.ts.map +1 -0
  45. package/dist/components/DiffReviewCard.js +36 -0
  46. package/dist/components/DiffReviewCard.js.map +1 -0
  47. package/dist/components/DiffStream.d.ts +12 -0
  48. package/dist/components/DiffStream.d.ts.map +1 -0
  49. package/dist/components/DiffStream.js +43 -0
  50. package/dist/components/DiffStream.js.map +1 -0
  51. package/dist/components/MarkdownMessage.d.ts +17 -0
  52. package/dist/components/MarkdownMessage.d.ts.map +1 -0
  53. package/dist/components/MarkdownMessage.js +158 -0
  54. package/dist/components/MarkdownMessage.js.map +1 -0
  55. package/dist/components/PermissionCard.d.ts +64 -0
  56. package/dist/components/PermissionCard.d.ts.map +1 -0
  57. package/dist/components/PermissionCard.js +156 -0
  58. package/dist/components/PermissionCard.js.map +1 -0
  59. package/dist/components/PlanActivity.d.ts +20 -0
  60. package/dist/components/PlanActivity.d.ts.map +1 -0
  61. package/dist/components/PlanActivity.js +186 -0
  62. package/dist/components/PlanActivity.js.map +1 -0
  63. package/dist/components/PlanTree.d.ts +13 -0
  64. package/dist/components/PlanTree.d.ts.map +1 -0
  65. package/dist/components/PlanTree.js +70 -0
  66. package/dist/components/PlanTree.js.map +1 -0
  67. package/dist/components/TaskList.d.ts +9 -0
  68. package/dist/components/TaskList.d.ts.map +1 -0
  69. package/dist/components/TaskList.js +26 -0
  70. package/dist/components/TaskList.js.map +1 -0
  71. package/dist/components/TelemetryPanel.d.ts +9 -0
  72. package/dist/components/TelemetryPanel.d.ts.map +1 -0
  73. package/dist/components/TelemetryPanel.js +54 -0
  74. package/dist/components/TelemetryPanel.js.map +1 -0
  75. package/dist/components/index.d.ts +15 -0
  76. package/dist/components/index.d.ts.map +1 -0
  77. package/dist/components/index.js +31 -0
  78. package/dist/components/index.js.map +1 -0
  79. package/dist/context/BanditContext.d.ts +14 -0
  80. package/dist/context/BanditContext.d.ts.map +1 -0
  81. package/dist/context/BanditContext.js +18 -0
  82. package/dist/context/BanditContext.js.map +1 -0
  83. package/dist/context/index.d.ts +2 -0
  84. package/dist/context/index.d.ts.map +1 -0
  85. package/dist/context/index.js +18 -0
  86. package/dist/context/index.js.map +1 -0
  87. package/dist/hooks/index.d.ts +3 -0
  88. package/dist/hooks/index.d.ts.map +1 -0
  89. package/dist/hooks/index.js +19 -0
  90. package/dist/hooks/index.js.map +1 -0
  91. package/dist/hooks/useAgentEvents.d.ts +13 -0
  92. package/dist/hooks/useAgentEvents.d.ts.map +1 -0
  93. package/dist/hooks/useAgentEvents.js +54 -0
  94. package/dist/hooks/useAgentEvents.js.map +1 -0
  95. package/dist/hooks/useTelemetry.d.ts +4 -0
  96. package/dist/hooks/useTelemetry.d.ts.map +1 -0
  97. package/dist/hooks/useTelemetry.js +198 -0
  98. package/dist/hooks/useTelemetry.js.map +1 -0
  99. package/dist/index.d.ts +12 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +29 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/theme/BanditThemeProvider.d.ts +26 -0
  104. package/dist/theme/BanditThemeProvider.d.ts.map +1 -0
  105. package/dist/theme/BanditThemeProvider.js +138 -0
  106. package/dist/theme/BanditThemeProvider.js.map +1 -0
  107. package/dist/theme/catppuccin-mocha.json +23 -0
  108. package/dist/theme/charcoal.json +23 -0
  109. package/dist/theme/dark.json +23 -0
  110. package/dist/theme/dracula.json +23 -0
  111. package/dist/theme/index.d.ts +5 -0
  112. package/dist/theme/index.d.ts.map +1 -0
  113. package/dist/theme/index.js +21 -0
  114. package/dist/theme/index.js.map +1 -0
  115. package/dist/theme/light.json +23 -0
  116. package/dist/theme/midnight.json +23 -0
  117. package/dist/theme/nord.json +23 -0
  118. package/dist/theme/onyx.json +23 -0
  119. package/dist/theme/sepia.json +23 -0
  120. package/dist/theme/solarized-dark.json +23 -0
  121. package/dist/theme/solarized-light.json +23 -0
  122. package/dist/theme/theme-base.d.ts +37 -0
  123. package/dist/theme/theme-base.d.ts.map +1 -0
  124. package/dist/theme/theme-base.js +141 -0
  125. package/dist/theme/theme-base.js.map +1 -0
  126. package/dist/theme/theme-registry.d.ts +22 -0
  127. package/dist/theme/theme-registry.d.ts.map +1 -0
  128. package/dist/theme/theme-registry.js +52 -0
  129. package/dist/theme/theme-registry.js.map +1 -0
  130. package/dist/theme/tokyo-night.json +23 -0
  131. package/dist/theme/vscode-theme.d.ts +3 -0
  132. package/dist/theme/vscode-theme.d.ts.map +1 -0
  133. package/dist/theme/vscode-theme.js +128 -0
  134. package/dist/theme/vscode-theme.js.map +1 -0
  135. package/dist/types/ui-schema.d.ts +114 -0
  136. package/dist/types/ui-schema.d.ts.map +1 -0
  137. package/dist/types/ui-schema.js +3 -0
  138. package/dist/types/ui-schema.js.map +1 -0
  139. package/dist/utils/classNames.d.ts +2 -0
  140. package/dist/utils/classNames.d.ts.map +1 -0
  141. package/dist/utils/classNames.js +8 -0
  142. package/dist/utils/classNames.js.map +1 -0
  143. package/package.json +55 -0
  144. package/styles/agent-ui.css +3844 -0
@@ -0,0 +1,134 @@
1
+ import { type JSX, type ReactNode } from "react";
2
+ import type { ChatMessageContextFile } from "../types/ui-schema";
3
+ export interface ComposerContextAttachment extends ChatMessageContextFile {
4
+ preview?: string;
5
+ }
6
+ export interface SlashCommandHint {
7
+ /** Command name, no leading slash. */
8
+ name: string;
9
+ /** One-line description shown beside the name in the popover. */
10
+ description?: string;
11
+ }
12
+ export interface ComposerSkillOption {
13
+ /** Short id used as the slash-token inserted into the textarea (`/<id>`). */
14
+ id: string;
15
+ /** Human-readable display name. */
16
+ name: string;
17
+ /** Optional one-line description shown beside the name in the picker. */
18
+ description?: string;
19
+ /** Source grouping used to split built-in skills from workspace skills. */
20
+ source?: "builtin" | "workspace";
21
+ }
22
+ export interface ChatComposerProps {
23
+ value: string;
24
+ onChange: (value: string) => void;
25
+ onSubmit: (value: string) => void;
26
+ onAttach?: () => void;
27
+ onPasteImages?: (files: File[]) => void;
28
+ onCancel?: () => void;
29
+ isStreaming?: boolean;
30
+ /** Voice input. When `onMicStart` is provided the composer renders a
31
+ * mic button next to the attach button. State is owned by the host:
32
+ * the host flips `micState` as recording starts/stops/uploads and
33
+ * the button shows the matching affordance. Click → start, click
34
+ * again while recording → stop and upload. */
35
+ onMicStart?: () => void;
36
+ onMicStop?: () => void;
37
+ micState?: "idle" | "recording" | "uploading";
38
+ placeholder?: string;
39
+ disabled?: boolean;
40
+ contextFiles?: ComposerContextAttachment[];
41
+ onRemoveContextFile?: (path: string) => void;
42
+ images?: string[];
43
+ onRemoveImage?: (index: number) => void;
44
+ autoContextEnabled?: boolean;
45
+ onToggleAutoContext?: () => void;
46
+ /** Optional slash-command autocomplete. When provided and the user types `/`,
47
+ * a filterable popover appears above the textarea. */
48
+ slashCommands?: SlashCommandHint[];
49
+ /** When provided, renders a Claude-Code-style `/` button that opens a
50
+ * slash-command picker. For v1 the callback can be a no-op stub — this
51
+ * prop exists so the button can be unconditionally mounted and hosts
52
+ * can flesh out the picker later. If {@link onRequestSkills} is supplied
53
+ * the built-in skill picker takes over and this callback is ignored. */
54
+ onOpenSlashPicker?: () => void;
55
+ /** Optional async resolver that returns the list of skills available for
56
+ * the current workspace. When supplied, clicking the `/` button opens a
57
+ * filterable, keyboard-navigable popover that lets the user insert
58
+ * `/<skill-id>` as a prefix in the textarea. */
59
+ onRequestSkills?: () => Promise<ComposerSkillOption[]> | ComposerSkillOption[];
60
+ /** Controls the Ask/Auto edit-approval toggle. When set, the composer
61
+ * renders a toggle near the submit arrow matching the Claude UX. */
62
+ editAutoApproveEnabled?: boolean;
63
+ /** Handler invoked when the user toggles edit-auto-approve. When omitted
64
+ * the toggle is hidden. */
65
+ onToggleEditAutoApprove?: () => void;
66
+ /** Extra controls rendered inside the `/` command menu under a
67
+ * "Settings" section. Use this to hang host-specific settings
68
+ * (e.g. model picker, provider switcher) off the same menu that
69
+ * carries skills — keeps the composer row to `+ / send`. */
70
+ settingsSlot?: ReactNode;
71
+ /** Compact label shown in the composer header when the chat is
72
+ * focused on a specific model (e.g. "bandit-core:12b-it-qat"). The
73
+ * full picker lives inside the `/` settings slot; this is read-only. */
74
+ modelLabel?: string;
75
+ /** DEPRECATED: use {@link settingsSlot} instead. Kept for
76
+ * back-compat; renders nothing in v1.5.53+ because the composer row
77
+ * no longer has room for an inline footer chip. */
78
+ footerSlot?: ReactNode;
79
+ /**
80
+ * File / folder suggestions for `@` mention autocomplete. Host
81
+ * populates this in response to {@link onFileMentionQuery}. Each
82
+ * entry carries `isDir` so the composer can:
83
+ * - render folders distinctly (trailing `/`, dim subpath)
84
+ * - on folder select, DRILL IN (update the query to `folder/` and
85
+ * keep the picker open) rather than committing the mention
86
+ * - on file select, commit the mention and close the picker
87
+ *
88
+ * Accepts the legacy `string[]` shape for back-compat — each string
89
+ * is treated as a file entry.
90
+ */
91
+ fileMentionSuggestions?: Array<{
92
+ path: string;
93
+ isDir: boolean;
94
+ }> | string[];
95
+ /**
96
+ * Fires whenever the user is actively typing a `@<query>` token
97
+ * (after whitespace or at line start, no closing space yet). Host
98
+ * should debounce + search workspace files and feed results back
99
+ * via {@link fileMentionSuggestions}. Called with an empty string
100
+ * when the `@` is still bare — host can return the N most recently
101
+ * touched files as a sensible default.
102
+ */
103
+ onFileMentionQuery?: (query: string) => void;
104
+ /**
105
+ * When true, allow the user to submit a new message while a turn
106
+ * is already streaming. The host receives `onSubmit` and is
107
+ * expected to queue the message (not send it). Default `false`
108
+ * preserves the original behavior (submit is blocked during
109
+ * stream). When true, the stop-button stays visible and the host
110
+ * shows its own "queued" affordance — the composer just stops
111
+ * eating Enter / form-submit events.
112
+ */
113
+ allowQueueWhileStreaming?: boolean;
114
+ /** Number of messages the host is currently holding behind the
115
+ * active turn. Renders as a small "N queued" pill inside the
116
+ * composer footer when > 0. The composer is otherwise unaware
117
+ * of the queue contents — host owns the array and dispatches
118
+ * on stream completion. Ignored when `queuedItems` is provided. */
119
+ queuedCount?: number;
120
+ /** Rich queue contents: when provided, the composer renders one
121
+ * cancellable pill per item (preview text + ✕). Falls back to
122
+ * `queuedCount` rendering when this is not provided so older
123
+ * hosts keep working. */
124
+ queuedItems?: Array<{
125
+ id: string;
126
+ preview: string;
127
+ imageCount?: number;
128
+ fileCount?: number;
129
+ }>;
130
+ /** Invoked when the user clicks the ✕ on a queued-message pill. */
131
+ onCancelQueued?: (id: string) => void;
132
+ }
133
+ export declare const ChatComposer: ({ value, onChange, onSubmit, onAttach, onPasteImages, onCancel, isStreaming, onMicStart, onMicStop, micState, placeholder, disabled, contextFiles, onRemoveContextFile, images, onRemoveImage, autoContextEnabled, onToggleAutoContext, slashCommands, onOpenSlashPicker, onRequestSkills, editAutoApproveEnabled, onToggleEditAutoApprove, settingsSlot, modelLabel, footerSlot, fileMentionSuggestions, onFileMentionQuery, allowQueueWhileStreaming, queuedCount, queuedItems, onCancelQueued }: ChatComposerProps) => JSX.Element;
134
+ //# sourceMappingURL=ChatComposer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatComposer.d.ts","sourceRoot":"","sources":["../../src/components/ChatComposer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,411 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ChatComposer = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = require("react");
9
+ const outline_1 = require("@heroicons/react/24/outline");
10
+ const clsx_1 = __importDefault(require("clsx"));
11
+ const ChatComposer = ({ value, onChange, onSubmit, onAttach, onPasteImages, onCancel, isStreaming = false, onMicStart, onMicStop, micState = "idle", placeholder = "Message Bandit — @ to mention a file, / for commands", disabled, contextFiles, onRemoveContextFile, images, onRemoveImage, autoContextEnabled = true, onToggleAutoContext, slashCommands, onOpenSlashPicker, onRequestSkills, editAutoApproveEnabled, onToggleEditAutoApprove, settingsSlot, modelLabel, footerSlot, fileMentionSuggestions, onFileMentionQuery, allowQueueWhileStreaming = false, queuedCount = 0, queuedItems, onCancelQueued }) => {
12
+ // footerSlot is retained for type-compat; ignored in v1.5.53+.
13
+ void footerSlot;
14
+ const hasContextFiles = Array.isArray(contextFiles) && contextFiles.length > 0;
15
+ const hasImages = Array.isArray(images) && images.length > 0;
16
+ const [expandedImage, setExpandedImage] = (0, react_1.useState)(null);
17
+ // Skill picker state: opened from the `/` button, populated on demand.
18
+ const [skillPickerOpen, setSkillPickerOpen] = (0, react_1.useState)(false);
19
+ const [skillList, setSkillList] = (0, react_1.useState)(null);
20
+ const [skillQuery, setSkillQuery] = (0, react_1.useState)("");
21
+ const [skillLoading, setSkillLoading] = (0, react_1.useState)(false);
22
+ const [skillIndex, setSkillIndex] = (0, react_1.useState)(0);
23
+ // Slash-command autocomplete: active when value starts with `/` and the
24
+ // user hasn't typed a space yet (i.e. we're still picking the command).
25
+ const [slashIndex, setSlashIndex] = (0, react_1.useState)(0);
26
+ const slashQuery = value.startsWith('/') && !value.includes(' ') ? value.slice(1).toLowerCase() : null;
27
+ const slashMatches = slashCommands && slashQuery !== null
28
+ ? slashCommands.filter(c => c.name.toLowerCase().startsWith(slashQuery)).slice(0, 8)
29
+ : [];
30
+ const showSlashMenu = slashMatches.length > 0;
31
+ (0, react_1.useEffect)(() => {
32
+ // Reset selected index when the filter changes.
33
+ setSlashIndex(0);
34
+ }, [value]);
35
+ const completeSlash = (name) => {
36
+ onChange('/' + name + ' ');
37
+ };
38
+ // @-mention autocomplete. Active when the caret sits inside an
39
+ // `@<token>` at or near the end of the input — specifically, when
40
+ // the last `@` in the string is preceded by a whitespace char (or
41
+ // is at position 0) and has no whitespace after it yet. Keeps the
42
+ // popover tight to real mention intent; prevents spurious activation
43
+ // on email addresses mid-prose (e.g. "mark@burtson.ai") because
44
+ // those have no leading-whitespace anchor.
45
+ const mentionMatch = (() => {
46
+ const lastAt = value.lastIndexOf('@');
47
+ if (lastAt < 0)
48
+ return null;
49
+ const precedingChar = lastAt === 0 ? ' ' : value[lastAt - 1];
50
+ if (!/\s/.test(precedingChar))
51
+ return null;
52
+ const rest = value.slice(lastAt + 1);
53
+ if (/\s/.test(rest))
54
+ return null;
55
+ return { at: lastAt, query: rest };
56
+ })();
57
+ const mentionQuery = mentionMatch?.query ?? null;
58
+ const [mentionIndex, setMentionIndex] = (0, react_1.useState)(0);
59
+ (0, react_1.useEffect)(() => {
60
+ setMentionIndex(0);
61
+ }, [mentionQuery]);
62
+ // Tell the host to fetch matching files whenever the @-token changes.
63
+ (0, react_1.useEffect)(() => {
64
+ if (mentionQuery === null)
65
+ return;
66
+ if (!onFileMentionQuery)
67
+ return;
68
+ onFileMentionQuery(mentionQuery);
69
+ }, [mentionQuery, onFileMentionQuery]);
70
+ // Normalize legacy `string[]` input into the entry shape so the rest
71
+ // of this component deals with one type. New callers pass entries
72
+ // directly; old callers keep working.
73
+ const mentionMatches = mentionQuery !== null && Array.isArray(fileMentionSuggestions)
74
+ ? fileMentionSuggestions.slice(0, 8).map((s) => typeof s === "string" ? { path: s, isDir: false } : s)
75
+ : [];
76
+ const showMentionMenu = mentionMatches.length > 0 && mentionQuery !== null;
77
+ const completeMention = (entry) => {
78
+ if (!mentionMatch)
79
+ return;
80
+ const before = value.slice(0, mentionMatch.at);
81
+ const after = value.slice(mentionMatch.at + 1 + mentionMatch.query.length);
82
+ if (entry.isDir) {
83
+ // Folder drill: insert `@folder/` (trailing slash) but do NOT add
84
+ // a trailing space — that would close the mention token. The
85
+ // mention-query effect re-fires on the new value and the host
86
+ // returns the folder's direct children for the next pick.
87
+ const trimmed = entry.path.replace(/\/+$/, '');
88
+ onChange(`${before}@${trimmed}/${after}`);
89
+ }
90
+ else {
91
+ // File pick: commit the mention with a trailing space so the
92
+ // user can keep typing the rest of their prompt immediately.
93
+ onChange(`${before}@${entry.path} ${after}`);
94
+ }
95
+ };
96
+ // Flatten + filter the skill list for the picker.
97
+ const filteredSkills = (() => {
98
+ if (!skillList)
99
+ return [];
100
+ const q = skillQuery.trim().toLowerCase();
101
+ if (!q)
102
+ return skillList;
103
+ return skillList.filter((s) => s.id.toLowerCase().includes(q) ||
104
+ s.name.toLowerCase().includes(q) ||
105
+ (s.description ?? "").toLowerCase().includes(q));
106
+ })();
107
+ const builtinSkills = filteredSkills.filter((s) => s.source !== "workspace");
108
+ const workspaceSkills = filteredSkills.filter((s) => s.source === "workspace");
109
+ // Build a flat ordered list mirroring the rendered order, so the
110
+ // keyboard index maps correctly across the divider.
111
+ const orderedSkills = [...builtinSkills, ...workspaceSkills];
112
+ // Reset highlight when the query changes.
113
+ (0, react_1.useEffect)(() => {
114
+ setSkillIndex(0);
115
+ }, [skillQuery, skillPickerOpen]);
116
+ // Close on outside click / escape handled by a doc listener.
117
+ (0, react_1.useEffect)(() => {
118
+ if (!skillPickerOpen)
119
+ return;
120
+ const onDocKey = (event) => {
121
+ if (event.key === "Escape") {
122
+ setSkillPickerOpen(false);
123
+ }
124
+ };
125
+ const onDocClick = (event) => {
126
+ const target = event.target;
127
+ if (!target)
128
+ return;
129
+ if (target.closest(".composer-skill-picker"))
130
+ return;
131
+ if (target.closest(".composer-slash-button"))
132
+ return;
133
+ setSkillPickerOpen(false);
134
+ };
135
+ window.addEventListener("keydown", onDocKey);
136
+ window.addEventListener("mousedown", onDocClick);
137
+ return () => {
138
+ window.removeEventListener("keydown", onDocKey);
139
+ window.removeEventListener("mousedown", onDocClick);
140
+ };
141
+ }, [skillPickerOpen]);
142
+ const openSkillPicker = async () => {
143
+ if (onRequestSkills) {
144
+ setSkillPickerOpen(true);
145
+ setSkillQuery("");
146
+ // Populate on demand so the picker reflects freshly loaded
147
+ // workspace skills every time it opens.
148
+ try {
149
+ setSkillLoading(true);
150
+ const next = await onRequestSkills();
151
+ setSkillList(Array.isArray(next) ? next : []);
152
+ }
153
+ catch {
154
+ setSkillList([]);
155
+ }
156
+ finally {
157
+ setSkillLoading(false);
158
+ }
159
+ return;
160
+ }
161
+ // Fallback to the legacy stub callback when no resolver supplied.
162
+ if (onOpenSlashPicker) {
163
+ onOpenSlashPicker();
164
+ }
165
+ };
166
+ const insertSkillPrefix = (skillId) => {
167
+ // Preserve whatever the user had typed: if the value already starts
168
+ // with a slash-token, replace it; otherwise prepend `/<id> ` to the
169
+ // existing text. The model reads the prefix verbatim.
170
+ const token = `/${skillId}`;
171
+ const trimmed = value.trimStart();
172
+ if (trimmed.startsWith("/")) {
173
+ const rest = trimmed.replace(/^\/\S*\s*/, "");
174
+ onChange(rest ? `${token} ${rest}` : `${token} `);
175
+ }
176
+ else {
177
+ onChange(trimmed ? `${token} ${trimmed}` : `${token} `);
178
+ }
179
+ setSkillPickerOpen(false);
180
+ };
181
+ const handleSkillKeyDown = (event) => {
182
+ if (event.key === "ArrowDown") {
183
+ event.preventDefault();
184
+ setSkillIndex((i) => Math.min(i + 1, Math.max(orderedSkills.length - 1, 0)));
185
+ return;
186
+ }
187
+ if (event.key === "ArrowUp") {
188
+ event.preventDefault();
189
+ setSkillIndex((i) => Math.max(i - 1, 0));
190
+ return;
191
+ }
192
+ if (event.key === "Enter") {
193
+ event.preventDefault();
194
+ const pick = orderedSkills[skillIndex];
195
+ if (pick)
196
+ insertSkillPrefix(pick.id);
197
+ return;
198
+ }
199
+ if (event.key === "Escape") {
200
+ event.preventDefault();
201
+ setSkillPickerOpen(false);
202
+ }
203
+ };
204
+ const handleSubmit = (event) => {
205
+ event.preventDefault();
206
+ // While streaming, the host can opt into queueing rather than
207
+ // blocking — the composer hands the message up via onSubmit and
208
+ // it's the host's job to stash it on the queue (not the network).
209
+ if (isStreaming && !allowQueueWhileStreaming) {
210
+ return;
211
+ }
212
+ const nextValue = value.trim();
213
+ if (!nextValue) {
214
+ return;
215
+ }
216
+ onSubmit(nextValue);
217
+ };
218
+ const handleChange = (event) => {
219
+ onChange(event.target.value);
220
+ };
221
+ const handleKeyDown = (event) => {
222
+ // Mention menu takes precedence when visible — same keyboard nav
223
+ // contract as the slash menu (ArrowUp/Down to move, Tab/Enter to
224
+ // complete, Escape to dismiss). Escape just clears the token from
225
+ // input so the user can keep typing without the popover.
226
+ if (showMentionMenu) {
227
+ if (event.key === "ArrowDown") {
228
+ event.preventDefault();
229
+ setMentionIndex((i) => Math.min(i + 1, mentionMatches.length - 1));
230
+ return;
231
+ }
232
+ if (event.key === "ArrowUp") {
233
+ event.preventDefault();
234
+ setMentionIndex((i) => Math.max(i - 1, 0));
235
+ return;
236
+ }
237
+ if (event.key === "Tab" || (event.key === "Enter" && !event.shiftKey)) {
238
+ event.preventDefault();
239
+ const pick = mentionMatches[mentionIndex];
240
+ if (pick)
241
+ completeMention(pick);
242
+ return;
243
+ }
244
+ if (event.key === "Escape") {
245
+ event.preventDefault();
246
+ if (mentionMatch) {
247
+ const before = value.slice(0, mentionMatch.at);
248
+ const after = value.slice(mentionMatch.at + 1 + mentionMatch.query.length);
249
+ onChange(before + after);
250
+ }
251
+ return;
252
+ }
253
+ }
254
+ // Slash menu keyboard nav takes precedence when visible.
255
+ if (showSlashMenu) {
256
+ if (event.key === "ArrowDown") {
257
+ event.preventDefault();
258
+ setSlashIndex((i) => Math.min(i + 1, slashMatches.length - 1));
259
+ return;
260
+ }
261
+ if (event.key === "ArrowUp") {
262
+ event.preventDefault();
263
+ setSlashIndex((i) => Math.max(i - 1, 0));
264
+ return;
265
+ }
266
+ if (event.key === "Tab") {
267
+ event.preventDefault();
268
+ const pick = slashMatches[slashIndex];
269
+ if (pick)
270
+ completeSlash(pick.name);
271
+ return;
272
+ }
273
+ if (event.key === "Enter" && !event.shiftKey) {
274
+ event.preventDefault();
275
+ const pick = slashMatches[slashIndex];
276
+ if (pick)
277
+ completeSlash(pick.name);
278
+ return;
279
+ }
280
+ if (event.key === "Escape") {
281
+ event.preventDefault();
282
+ onChange("");
283
+ return;
284
+ }
285
+ }
286
+ if (event.key === "Enter" &&
287
+ !event.shiftKey &&
288
+ !event.altKey &&
289
+ !event.metaKey &&
290
+ !event.ctrlKey) {
291
+ if (disabled || (isStreaming && !allowQueueWhileStreaming) || !value.trim()) {
292
+ return;
293
+ }
294
+ event.preventDefault();
295
+ onSubmit(value.trim());
296
+ }
297
+ };
298
+ const handlePaste = (event) => {
299
+ if (!onPasteImages) {
300
+ return;
301
+ }
302
+ const items = Array.from(event.clipboardData?.items ?? []);
303
+ const imageFiles = [];
304
+ for (const item of items) {
305
+ if (item.kind === "file" && item.type.startsWith("image/")) {
306
+ const file = item.getAsFile();
307
+ if (file) {
308
+ imageFiles.push(file);
309
+ }
310
+ }
311
+ }
312
+ if (imageFiles.length > 0) {
313
+ event.preventDefault();
314
+ onPasteImages(imageFiles);
315
+ }
316
+ };
317
+ (0, react_1.useEffect)(() => {
318
+ if (!expandedImage) {
319
+ return;
320
+ }
321
+ const handleKeyDown = (event) => {
322
+ if (event.key === "Escape") {
323
+ setExpandedImage(null);
324
+ }
325
+ };
326
+ window.addEventListener("keydown", handleKeyDown);
327
+ return () => window.removeEventListener("keydown", handleKeyDown);
328
+ }, [expandedImage]);
329
+ const handleOpenImagePreview = (src) => {
330
+ setExpandedImage(src);
331
+ };
332
+ const handleCloseImagePreview = () => {
333
+ setExpandedImage(null);
334
+ };
335
+ // when streaming with text in the composer AND the host
336
+ // allows queueing, the action button flips to "send" instead of
337
+ // "stop": the user clearly intends to deliver the message, not to
338
+ // cancel the in-flight turn. Empty composer while streaming keeps
339
+ // the stop affordance. This makes the button match what Enter
340
+ // already does (handleSubmit honours `allowQueueWhileStreaming`)
341
+ // so the visual matches the keyboard.
342
+ const isStopMode = isStreaming && (!allowQueueWhileStreaming || !value.trim());
343
+ const actionDisabled = isStopMode ? !onCancel : !!disabled || !value.trim();
344
+ return ((0, jsx_runtime_1.jsxs)("form", { className: "composer", onSubmit: handleSubmit, children: [showSlashMenu && ((0, jsx_runtime_1.jsx)("div", { className: "composer-slash-menu", role: "listbox", "aria-label": "Slash command suggestions", children: slashMatches.map((cmd, i) => ((0, jsx_runtime_1.jsxs)("button", { type: "button", role: "option", "aria-selected": i === slashIndex, className: (0, clsx_1.default)("composer-slash-item", i === slashIndex && "is-active"), onMouseDown: (e) => { e.preventDefault(); completeSlash(cmd.name); }, children: [(0, jsx_runtime_1.jsxs)("span", { className: "composer-slash-name", children: ["/", cmd.name] }), cmd.description && (0, jsx_runtime_1.jsx)("span", { className: "composer-slash-desc", children: cmd.description })] }, cmd.name))) })), showMentionMenu && ((0, jsx_runtime_1.jsx)("div", { className: "composer-slash-menu composer-mention-menu", role: "listbox", "aria-label": "File mention suggestions", children: mentionMatches.map((entry, i) => {
345
+ const p = entry.path;
346
+ const base = p.split('/').pop() ?? p;
347
+ const dir = p.slice(0, Math.max(0, p.length - base.length - 1));
348
+ // Folders render with a trailing `/` + dim cyan tint via a
349
+ // modifier class. Makes folder-drill entries visually
350
+ // distinct from file picks at a glance.
351
+ return ((0, jsx_runtime_1.jsxs)("button", { type: "button", role: "option", "aria-selected": i === mentionIndex, className: (0, clsx_1.default)("composer-slash-item", i === mentionIndex && "is-active", entry.isDir && "is-directory"), onMouseDown: (e) => { e.preventDefault(); completeMention(entry); }, children: [(0, jsx_runtime_1.jsxs)("span", { className: "composer-slash-name", children: ["@", base, entry.isDir ? "/" : ""] }), dir && (0, jsx_runtime_1.jsx)("span", { className: "composer-slash-desc", children: dir })] }, (entry.isDir ? "dir:" : "file:") + p));
352
+ }) })), (0, jsx_runtime_1.jsxs)("div", { className: "composer-input", children: [(hasContextFiles || hasImages) && ((0, jsx_runtime_1.jsxs)("div", { className: "composer-attachments", "aria-label": "Attached context", children: [contextFiles?.map((file) => ((0, jsx_runtime_1.jsxs)("div", { className: "composer-attachment", children: [(0, jsx_runtime_1.jsx)("div", { className: "composer-attachment__icon", "aria-hidden": "true", children: (0, jsx_runtime_1.jsx)(outline_1.PaperClipIcon, {}) }), (0, jsx_runtime_1.jsxs)("div", { className: "composer-attachment__body", children: [(0, jsx_runtime_1.jsx)("p", { className: "composer-attachment__title", title: file.path, children: file.path }), file.preview && ((0, jsx_runtime_1.jsx)("p", { className: "composer-attachment__meta", title: file.preview, children: file.preview }))] }), onRemoveContextFile && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "composer-attachment__remove", onClick: () => onRemoveContextFile(file.path), "aria-label": `Remove ${file.path} from context`, children: (0, jsx_runtime_1.jsx)(outline_1.XMarkIcon, { "aria-hidden": "true" }) }))] }, file.path))), images?.map((src, index) => ((0, jsx_runtime_1.jsxs)("div", { className: "composer-image", children: [src ? ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "composer-image__preview", onClick: () => handleOpenImagePreview(src), "aria-label": `Open image attachment ${index + 1}`, children: (0, jsx_runtime_1.jsx)("img", { className: "composer-image__img", src: src, alt: `Attachment ${index + 1}`, loading: "lazy" }) })) : ((0, jsx_runtime_1.jsx)("div", { className: "composer-image__placeholder", "aria-hidden": "true", children: (0, jsx_runtime_1.jsx)(outline_1.PhotoIcon, {}) })), onRemoveImage && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "composer-image__remove", onClick: () => onRemoveImage(index), "aria-label": `Remove image ${index + 1}`, children: (0, jsx_runtime_1.jsx)(outline_1.XMarkIcon, { "aria-hidden": "true" }) }))] }, `${src}-${index}`)))] })), (0, jsx_runtime_1.jsxs)("div", { className: (0, clsx_1.default)("composer-field", value.startsWith("!") && "composer-field--shell-mode"), children: [value.startsWith("!") ? ((0, jsx_runtime_1.jsxs)("div", { className: "composer-shell-banner", role: "note", "aria-live": "polite", children: [(0, jsx_runtime_1.jsx)("strong", { children: "\u25B8 SHELL MODE" }), (0, jsx_runtime_1.jsx)("span", { children: "next Enter runs in your integrated terminal \u2014 agent will not see the output" })] })) : null, (0, jsx_runtime_1.jsx)("textarea", { className: "composer-textarea", placeholder: isStreaming && allowQueueWhileStreaming
353
+ ? "Ask a follow-up or steer me if I'm going off the rails — sends after this turn"
354
+ : placeholder, value: value, onChange: handleChange, onKeyDown: handleKeyDown, onPaste: handlePaste, disabled: disabled }), queuedItems && queuedItems.length > 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "composer-queued-list", "aria-label": "Messages queued to send after current turn", children: queuedItems.map((item) => {
355
+ const attachmentNote = (() => {
356
+ const parts = [];
357
+ if (item.imageCount && item.imageCount > 0)
358
+ parts.push(`${item.imageCount} img`);
359
+ if (item.fileCount && item.fileCount > 0)
360
+ parts.push(`${item.fileCount} file`);
361
+ return parts.length ? ` · ${parts.join(", ")}` : "";
362
+ })();
363
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "composer-queued-pill is-cancellable", title: "Will send after the current turn finishes", children: [(0, jsx_runtime_1.jsxs)("span", { className: "composer-queued-pill__label", children: [item.preview, attachmentNote ? ((0, jsx_runtime_1.jsx)("span", { className: "composer-queued-pill__attachments", children: attachmentNote })) : null] }), onCancelQueued ? ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "composer-queued-pill__cancel", onClick: () => onCancelQueued(item.id), "aria-label": "Cancel this queued message", title: "Cancel this queued message", children: "\u00D7" })) : null] }, item.id));
364
+ }) })) : queuedCount > 0 ? ((0, jsx_runtime_1.jsxs)("div", { className: "composer-queued-pill", title: "Will send after the current turn finishes", children: [queuedCount, " queued \u00B7 sends after this turn"] })) : null] }), (0, jsx_runtime_1.jsxs)("div", { className: "composer-controls", children: [(0, jsx_runtime_1.jsx)("button", { type: "button", className: "composer-attach-button composer-icon-button", onClick: onAttach, "aria-label": "Attach files", title: "Attach files", disabled: !onAttach || disabled, children: (0, jsx_runtime_1.jsx)(outline_1.PlusIcon, { "aria-hidden": "true", className: "composer-icon" }) }), onMicStart && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: (0, clsx_1.default)("composer-mic-button composer-icon-button", micState === "recording" && "is-recording", micState === "uploading" && "is-uploading"), onClick: () => {
365
+ if (micState === "recording" && onMicStop) {
366
+ onMicStop();
367
+ }
368
+ else if (micState === "idle") {
369
+ onMicStart();
370
+ }
371
+ }, "aria-label": micState === "recording"
372
+ ? "Stop recording"
373
+ : micState === "uploading"
374
+ ? "Transcribing…"
375
+ : "Record voice prompt", title: micState === "recording"
376
+ ? "Stop recording"
377
+ : micState === "uploading"
378
+ ? "Transcribing…"
379
+ : "Record voice prompt", disabled: disabled || micState === "uploading", children: micState === "recording" ? ((0, jsx_runtime_1.jsx)(outline_1.StopCircleIcon, { "aria-hidden": "true", className: "composer-icon" })) : ((0, jsx_runtime_1.jsx)(outline_1.MicrophoneIcon, { "aria-hidden": "true", className: "composer-icon" })) })), (onOpenSlashPicker || onRequestSkills) && ((0, jsx_runtime_1.jsxs)("div", { className: "composer-slash-wrap", children: [(0, jsx_runtime_1.jsx)("button", { type: "button", className: "composer-slash-button composer-icon-button", onClick: () => {
380
+ if (skillPickerOpen) {
381
+ setSkillPickerOpen(false);
382
+ }
383
+ else {
384
+ void openSkillPicker();
385
+ }
386
+ }, "aria-label": "Slash commands", "aria-expanded": skillPickerOpen, title: "Slash commands", disabled: disabled, children: (0, jsx_runtime_1.jsx)(outline_1.CommandLineIcon, { "aria-hidden": "true", className: "composer-icon" }) }), skillPickerOpen && onRequestSkills && ((0, jsx_runtime_1.jsxs)("div", { className: "composer-skill-picker", role: "dialog", "aria-label": "Skill picker", children: [(0, jsx_runtime_1.jsx)("input", { type: "text", autoFocus: true, value: skillQuery, onChange: (e) => setSkillQuery(e.target.value), onKeyDown: handleSkillKeyDown, placeholder: "Filter skills\u2026", className: "composer-skill-picker__filter", "aria-label": "Filter skills" }), (0, jsx_runtime_1.jsxs)("div", { className: "composer-skill-picker__list", role: "listbox", children: [skillLoading && ((0, jsx_runtime_1.jsx)("div", { className: "composer-skill-picker__empty", children: "Loading skills\u2026" })), !skillLoading && orderedSkills.length === 0 && ((0, jsx_runtime_1.jsx)("div", { className: "composer-skill-picker__empty", children: "No skills available" })), !skillLoading && builtinSkills.length > 0 && ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: builtinSkills.map((skill, i) => ((0, jsx_runtime_1.jsxs)("button", { type: "button", role: "option", "aria-selected": i === skillIndex, className: (0, clsx_1.default)("composer-skill-picker__item", i === skillIndex && "is-active"), onMouseDown: (e) => {
387
+ e.preventDefault();
388
+ insertSkillPrefix(skill.id);
389
+ }, onMouseEnter: () => setSkillIndex(i), children: [(0, jsx_runtime_1.jsxs)("span", { className: "composer-skill-picker__name", children: ["/", skill.id] }), (0, jsx_runtime_1.jsx)("span", { className: "composer-skill-picker__label", children: skill.name }), skill.description && ((0, jsx_runtime_1.jsx)("span", { className: "composer-skill-picker__desc", children: skill.description }))] }, `b:${skill.id}`))) })), !skillLoading && workspaceSkills.length > 0 && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "composer-skill-picker__divider", role: "separator", children: "Workspace" }), workspaceSkills.map((skill, i) => {
390
+ const index = builtinSkills.length + i;
391
+ return ((0, jsx_runtime_1.jsxs)("button", { type: "button", role: "option", "aria-selected": index === skillIndex, className: (0, clsx_1.default)("composer-skill-picker__item", index === skillIndex && "is-active"), onMouseDown: (e) => {
392
+ e.preventDefault();
393
+ insertSkillPrefix(skill.id);
394
+ }, onMouseEnter: () => setSkillIndex(index), children: [(0, jsx_runtime_1.jsxs)("span", { className: "composer-skill-picker__name", children: ["/", skill.id] }), (0, jsx_runtime_1.jsx)("span", { className: "composer-skill-picker__label", children: skill.name }), skill.description && ((0, jsx_runtime_1.jsx)("span", { className: "composer-skill-picker__desc", children: skill.description }))] }, `w:${skill.id}`));
395
+ })] })), (onToggleAutoContext || modelLabel || settingsSlot) && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "composer-skill-picker__divider", role: "separator", children: "Settings" }), modelLabel && ((0, jsx_runtime_1.jsxs)("div", { className: "composer-skill-picker__modelrow", "aria-label": "Active model", children: [(0, jsx_runtime_1.jsx)("span", { className: "composer-skill-picker__modelrow-label", children: "Model" }), (0, jsx_runtime_1.jsx)("span", { className: "composer-skill-picker__modelrow-value", children: modelLabel })] })), onToggleAutoContext && ((0, jsx_runtime_1.jsxs)("button", { type: "button", role: "menuitemcheckbox", "aria-checked": autoContextEnabled, className: (0, clsx_1.default)("composer-skill-picker__item", "composer-skill-picker__setting", autoContextEnabled && "is-on"), onMouseDown: (e) => {
396
+ e.preventDefault();
397
+ onToggleAutoContext();
398
+ }, disabled: disabled, children: [(0, jsx_runtime_1.jsx)("span", { className: "composer-skill-picker__toggle", "aria-hidden": "true", children: autoContextEnabled ? "●" : "○" }), (0, jsx_runtime_1.jsx)("span", { className: "composer-skill-picker__label", children: "Auto-context" }), (0, jsx_runtime_1.jsx)("span", { className: "composer-skill-picker__desc", children: autoContextEnabled
399
+ ? "Pulling relevant files automatically"
400
+ : "Off — only attached files are sent" })] })), settingsSlot && ((0, jsx_runtime_1.jsx)("div", { className: "composer-skill-picker__slot", children: settingsSlot }))] }))] })] }))] })), onToggleEditAutoApprove && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: (0, clsx_1.default)("composer-edit-auto", editAutoApproveEnabled && "is-active"), onClick: onToggleEditAutoApprove, "aria-pressed": !!editAutoApproveEnabled, "data-has-tooltip": "true", "data-tooltip": editAutoApproveEnabled
401
+ ? "Edits apply automatically. run_command still prompts."
402
+ : "Ask before applying edits. Click to auto-apply.", disabled: disabled, children: (0, jsx_runtime_1.jsx)("span", { className: "composer-edit-auto__label", children: editAutoApproveEnabled ? "Edit automatically" : "Ask before edit" }) }))] })] }), (0, jsx_runtime_1.jsx)("div", { className: "composer-actions", children: (0, jsx_runtime_1.jsx)("button", { className: "send-button", type: isStopMode ? "button" : "submit", "aria-label": isStopMode ? "Stop response" : "Send message", onClick: isStopMode ? onCancel : undefined, disabled: actionDisabled, "data-variant": isStopMode ? "stop" : "send", children: isStopMode ? (
403
+ // Filled square — reads as "stop" unambiguously at 18px.
404
+ (0, jsx_runtime_1.jsx)("svg", { "aria-hidden": "true", viewBox: "0 0 20 20", className: "composer-icon", fill: "currentColor", children: (0, jsx_runtime_1.jsx)("rect", { x: "4.5", y: "4.5", width: "11", height: "11", rx: "2" }) })) : (
405
+ // Chunky upward chevron — reads as "send/submit" at small sizes
406
+ // without the chrome of ArrowUpCircleIcon's outer ring that
407
+ // made the button look muddy against the themed gradient.
408
+ (0, jsx_runtime_1.jsxs)("svg", { "aria-hidden": "true", viewBox: "0 0 20 20", className: "composer-icon", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: [(0, jsx_runtime_1.jsx)("path", { d: "M10 15V5" }), (0, jsx_runtime_1.jsx)("path", { d: "M5 10l5-5 5 5" })] })) }) }), expandedImage && ((0, jsx_runtime_1.jsx)("div", { className: "agent-image-lightbox", role: "dialog", "aria-modal": "true", "aria-label": "Image preview", onClick: handleCloseImagePreview, children: (0, jsx_runtime_1.jsxs)("div", { className: "agent-image-lightbox__frame", onClick: (event) => event.stopPropagation(), children: [(0, jsx_runtime_1.jsx)("button", { type: "button", className: "agent-image-lightbox__close", onClick: handleCloseImagePreview, "aria-label": "Close image preview", children: (0, jsx_runtime_1.jsx)(outline_1.XMarkIcon, { "aria-hidden": "true" }) }), (0, jsx_runtime_1.jsx)("img", { className: "agent-image-lightbox__img", src: expandedImage, alt: "Image attachment preview", loading: "eager", decoding: "sync" })] }) }))] }));
409
+ };
410
+ exports.ChatComposer = ChatComposer;
411
+ //# sourceMappingURL=ChatComposer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatComposer.js","sourceRoot":"","sources":["../../src/components/ChatComposer.tsx"],"names":[],"mappings":"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"}