@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.
- package/LICENSE +201 -0
- package/README.md +45 -0
- package/dist/components/AgentConsole.d.ts +11 -0
- package/dist/components/AgentConsole.d.ts.map +1 -0
- package/dist/components/AgentConsole.js +139 -0
- package/dist/components/AgentConsole.js.map +1 -0
- package/dist/components/AgentSummaryCard.d.ts +9 -0
- package/dist/components/AgentSummaryCard.d.ts.map +1 -0
- package/dist/components/AgentSummaryCard.js +96 -0
- package/dist/components/AgentSummaryCard.js.map +1 -0
- package/dist/components/ChatComposer.d.ts +134 -0
- package/dist/components/ChatComposer.d.ts.map +1 -0
- package/dist/components/ChatComposer.js +411 -0
- package/dist/components/ChatComposer.js.map +1 -0
- package/dist/components/ChatConversation.d.ts +28 -0
- package/dist/components/ChatConversation.d.ts.map +1 -0
- package/dist/components/ChatConversation.js +82 -0
- package/dist/components/ChatConversation.js.map +1 -0
- package/dist/components/ChatMessage.d.ts +38 -0
- package/dist/components/ChatMessage.d.ts.map +1 -0
- package/dist/components/ChatMessage.js +208 -0
- package/dist/components/ChatMessage.js.map +1 -0
- package/dist/components/DiffBlock.d.ts +7 -0
- package/dist/components/DiffBlock.d.ts.map +1 -0
- package/dist/components/DiffBlock.js +58 -0
- package/dist/components/DiffBlock.js.map +1 -0
- package/dist/components/DiffReview/DiffBlock.d.ts +7 -0
- package/dist/components/DiffReview/DiffBlock.d.ts.map +1 -0
- package/dist/components/DiffReview/DiffBlock.js +13 -0
- package/dist/components/DiffReview/DiffBlock.js.map +1 -0
- package/dist/components/DiffReview/DiffFileGroup.d.ts +14 -0
- package/dist/components/DiffReview/DiffFileGroup.d.ts.map +1 -0
- package/dist/components/DiffReview/DiffFileGroup.js +44 -0
- package/dist/components/DiffReview/DiffFileGroup.js.map +1 -0
- package/dist/components/DiffReview/DiffReviewPanel.d.ts +16 -0
- package/dist/components/DiffReview/DiffReviewPanel.d.ts.map +1 -0
- package/dist/components/DiffReview/DiffReviewPanel.js +25 -0
- package/dist/components/DiffReview/DiffReviewPanel.js.map +1 -0
- package/dist/components/DiffReview/index.d.ts +3 -0
- package/dist/components/DiffReview/index.d.ts.map +1 -0
- package/dist/components/DiffReview/index.js +19 -0
- package/dist/components/DiffReview/index.js.map +1 -0
- package/dist/components/DiffReviewCard.d.ts +10 -0
- package/dist/components/DiffReviewCard.d.ts.map +1 -0
- package/dist/components/DiffReviewCard.js +36 -0
- package/dist/components/DiffReviewCard.js.map +1 -0
- package/dist/components/DiffStream.d.ts +12 -0
- package/dist/components/DiffStream.d.ts.map +1 -0
- package/dist/components/DiffStream.js +43 -0
- package/dist/components/DiffStream.js.map +1 -0
- package/dist/components/MarkdownMessage.d.ts +17 -0
- package/dist/components/MarkdownMessage.d.ts.map +1 -0
- package/dist/components/MarkdownMessage.js +158 -0
- package/dist/components/MarkdownMessage.js.map +1 -0
- package/dist/components/PermissionCard.d.ts +64 -0
- package/dist/components/PermissionCard.d.ts.map +1 -0
- package/dist/components/PermissionCard.js +156 -0
- package/dist/components/PermissionCard.js.map +1 -0
- package/dist/components/PlanActivity.d.ts +20 -0
- package/dist/components/PlanActivity.d.ts.map +1 -0
- package/dist/components/PlanActivity.js +186 -0
- package/dist/components/PlanActivity.js.map +1 -0
- package/dist/components/PlanTree.d.ts +13 -0
- package/dist/components/PlanTree.d.ts.map +1 -0
- package/dist/components/PlanTree.js +70 -0
- package/dist/components/PlanTree.js.map +1 -0
- package/dist/components/TaskList.d.ts +9 -0
- package/dist/components/TaskList.d.ts.map +1 -0
- package/dist/components/TaskList.js +26 -0
- package/dist/components/TaskList.js.map +1 -0
- package/dist/components/TelemetryPanel.d.ts +9 -0
- package/dist/components/TelemetryPanel.d.ts.map +1 -0
- package/dist/components/TelemetryPanel.js +54 -0
- package/dist/components/TelemetryPanel.js.map +1 -0
- package/dist/components/index.d.ts +15 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +31 -0
- package/dist/components/index.js.map +1 -0
- package/dist/context/BanditContext.d.ts +14 -0
- package/dist/context/BanditContext.d.ts.map +1 -0
- package/dist/context/BanditContext.js +18 -0
- package/dist/context/BanditContext.js.map +1 -0
- package/dist/context/index.d.ts +2 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +18 -0
- package/dist/context/index.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +19 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useAgentEvents.d.ts +13 -0
- package/dist/hooks/useAgentEvents.d.ts.map +1 -0
- package/dist/hooks/useAgentEvents.js +54 -0
- package/dist/hooks/useAgentEvents.js.map +1 -0
- package/dist/hooks/useTelemetry.d.ts +4 -0
- package/dist/hooks/useTelemetry.d.ts.map +1 -0
- package/dist/hooks/useTelemetry.js +198 -0
- package/dist/hooks/useTelemetry.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/theme/BanditThemeProvider.d.ts +26 -0
- package/dist/theme/BanditThemeProvider.d.ts.map +1 -0
- package/dist/theme/BanditThemeProvider.js +138 -0
- package/dist/theme/BanditThemeProvider.js.map +1 -0
- package/dist/theme/catppuccin-mocha.json +23 -0
- package/dist/theme/charcoal.json +23 -0
- package/dist/theme/dark.json +23 -0
- package/dist/theme/dracula.json +23 -0
- package/dist/theme/index.d.ts +5 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +21 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/light.json +23 -0
- package/dist/theme/midnight.json +23 -0
- package/dist/theme/nord.json +23 -0
- package/dist/theme/onyx.json +23 -0
- package/dist/theme/sepia.json +23 -0
- package/dist/theme/solarized-dark.json +23 -0
- package/dist/theme/solarized-light.json +23 -0
- package/dist/theme/theme-base.d.ts +37 -0
- package/dist/theme/theme-base.d.ts.map +1 -0
- package/dist/theme/theme-base.js +141 -0
- package/dist/theme/theme-base.js.map +1 -0
- package/dist/theme/theme-registry.d.ts +22 -0
- package/dist/theme/theme-registry.d.ts.map +1 -0
- package/dist/theme/theme-registry.js +52 -0
- package/dist/theme/theme-registry.js.map +1 -0
- package/dist/theme/tokyo-night.json +23 -0
- package/dist/theme/vscode-theme.d.ts +3 -0
- package/dist/theme/vscode-theme.d.ts.map +1 -0
- package/dist/theme/vscode-theme.js +128 -0
- package/dist/theme/vscode-theme.js.map +1 -0
- package/dist/types/ui-schema.d.ts +114 -0
- package/dist/types/ui-schema.d.ts.map +1 -0
- package/dist/types/ui-schema.js +3 -0
- package/dist/types/ui-schema.js.map +1 -0
- package/dist/utils/classNames.d.ts +2 -0
- package/dist/utils/classNames.d.ts.map +1 -0
- package/dist/utils/classNames.js +8 -0
- package/dist/utils/classNames.js.map +1 -0
- package/package.json +55 -0
- 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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"}
|