@agent-native/toolkit 0.21.3 → 0.22.0-nightly-20260926081002
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/agent-native.eject.json +11 -0
- package/dist/agentkit.d.ts +5 -1
- package/dist/agentkit.d.ts.map +1 -1
- package/dist/agentkit.js +2 -0
- package/dist/agentkit.js.map +1 -1
- package/dist/app-shell/PromptHome.d.ts +26 -0
- package/dist/app-shell/PromptHome.d.ts.map +1 -0
- package/dist/app-shell/PromptHome.js +19 -0
- package/dist/app-shell/PromptHome.js.map +1 -0
- package/dist/app-shell/PromptHome.spec.d.ts +2 -0
- package/dist/app-shell/PromptHome.spec.d.ts.map +1 -0
- package/dist/app-shell/PromptHome.spec.js +206 -0
- package/dist/app-shell/PromptHome.spec.js.map +1 -0
- package/dist/app-shell/TemplateLibraryGrid.d.ts +48 -0
- package/dist/app-shell/TemplateLibraryGrid.d.ts.map +1 -0
- package/dist/app-shell/TemplateLibraryGrid.js +20 -0
- package/dist/app-shell/TemplateLibraryGrid.js.map +1 -0
- package/dist/app-shell/TemplatePreviewDialog.d.ts +41 -0
- package/dist/app-shell/TemplatePreviewDialog.d.ts.map +1 -0
- package/dist/app-shell/TemplatePreviewDialog.js +50 -0
- package/dist/app-shell/TemplatePreviewDialog.js.map +1 -0
- package/dist/app-shell/TemplatePreviewDialog.spec.d.ts +2 -0
- package/dist/app-shell/TemplatePreviewDialog.spec.d.ts.map +1 -0
- package/dist/app-shell/TemplatePreviewDialog.spec.js +258 -0
- package/dist/app-shell/TemplatePreviewDialog.spec.js.map +1 -0
- package/dist/app-shell/index.d.ts +3 -0
- package/dist/app-shell/index.d.ts.map +1 -1
- package/dist/app-shell/index.js +3 -0
- package/dist/app-shell/index.js.map +1 -1
- package/dist/app-shell/prompt-home.css +159 -0
- package/dist/composer/ComposerContextMenu.d.ts +48 -0
- package/dist/composer/ComposerContextMenu.d.ts.map +1 -0
- package/dist/composer/ComposerContextMenu.js +295 -0
- package/dist/composer/ComposerContextMenu.js.map +1 -0
- package/dist/composer/ComposerContextMenu.spec.d.ts +2 -0
- package/dist/composer/ComposerContextMenu.spec.d.ts.map +1 -0
- package/dist/composer/ComposerContextMenu.spec.js +270 -0
- package/dist/composer/ComposerContextMenu.spec.js.map +1 -0
- package/dist/composer/ComposerContextMenuSearch.d.ts +11 -0
- package/dist/composer/ComposerContextMenuSearch.d.ts.map +1 -0
- package/dist/composer/ComposerContextMenuSearch.js +42 -0
- package/dist/composer/ComposerContextMenuSearch.js.map +1 -0
- package/dist/composer/ComposerContextPicker.d.ts +7 -0
- package/dist/composer/ComposerContextPicker.d.ts.map +1 -0
- package/dist/composer/ComposerContextPicker.js +71 -0
- package/dist/composer/ComposerContextPicker.js.map +1 -0
- package/dist/composer/ComposerContextPicker.spec.d.ts +2 -0
- package/dist/composer/ComposerContextPicker.spec.d.ts.map +1 -0
- package/dist/composer/ComposerContextPicker.spec.js +454 -0
- package/dist/composer/ComposerContextPicker.spec.js.map +1 -0
- package/dist/composer/ComposerContextPickerDialog.d.ts +8 -0
- package/dist/composer/ComposerContextPickerDialog.d.ts.map +1 -0
- package/dist/composer/ComposerContextPickerDialog.js +101 -0
- package/dist/composer/ComposerContextPickerDialog.js.map +1 -0
- package/dist/composer/ComposerContextPickerDialog.spec.d.ts +2 -0
- package/dist/composer/ComposerContextPickerDialog.spec.d.ts.map +1 -0
- package/dist/composer/ComposerContextPickerDialog.spec.js +329 -0
- package/dist/composer/ComposerContextPickerDialog.spec.js.map +1 -0
- package/dist/composer/ComposerContextSearchInput.d.ts +7 -0
- package/dist/composer/ComposerContextSearchInput.d.ts.map +1 -0
- package/dist/composer/ComposerContextSearchInput.js +18 -0
- package/dist/composer/ComposerContextSearchInput.js.map +1 -0
- package/dist/composer/PromptComposer.context.spec.d.ts +2 -0
- package/dist/composer/PromptComposer.context.spec.d.ts.map +1 -0
- package/dist/composer/PromptComposer.context.spec.js +383 -0
- package/dist/composer/PromptComposer.context.spec.js.map +1 -0
- package/dist/composer/PromptComposer.d.ts +19 -5
- package/dist/composer/PromptComposer.d.ts.map +1 -1
- package/dist/composer/PromptComposer.js +30 -25
- package/dist/composer/PromptComposer.js.map +1 -1
- package/dist/composer/PromptComposer.spec.js +24 -1
- package/dist/composer/PromptComposer.spec.js.map +1 -1
- package/dist/composer/TiptapComposer.d.ts +13 -2
- package/dist/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/composer/TiptapComposer.js +89 -32
- package/dist/composer/TiptapComposer.js.map +1 -1
- package/dist/composer/context-items.d.ts +12 -0
- package/dist/composer/context-items.d.ts.map +1 -0
- package/dist/composer/context-items.js +46 -0
- package/dist/composer/context-items.js.map +1 -0
- package/dist/composer/context-items.spec.d.ts +2 -0
- package/dist/composer/context-items.spec.d.ts.map +1 -0
- package/dist/composer/context-items.spec.js +43 -0
- package/dist/composer/context-items.spec.js.map +1 -0
- package/dist/composer/index.d.ts +4 -1
- package/dist/composer/index.d.ts.map +1 -1
- package/dist/composer/index.js +3 -1
- package/dist/composer/index.js.map +1 -1
- package/dist/composer/runtime-adapters.d.ts +6 -1
- package/dist/composer/runtime-adapters.d.ts.map +1 -1
- package/dist/composer/runtime-adapters.js.map +1 -1
- package/dist/composer/useComposerContextPicker.d.ts +111 -0
- package/dist/composer/useComposerContextPicker.d.ts.map +1 -0
- package/dist/composer/useComposerContextPicker.js +299 -0
- package/dist/composer/useComposerContextPicker.js.map +1 -0
- package/dist/design-system/default-adapter.d.ts.map +1 -1
- package/dist/design-system/default-adapter.js +13 -7
- package/dist/design-system/default-adapter.js.map +1 -1
- package/dist/design-system/default-adapter.spec.js +13 -0
- package/dist/design-system/default-adapter.spec.js.map +1 -1
- package/dist/design-system/types.d.ts +4 -1
- package/dist/design-system/types.d.ts.map +1 -1
- package/dist/styles.css +1 -0
- package/dist/ui/command.d.ts +8 -2
- package/dist/ui/command.d.ts.map +1 -1
- package/dist/ui/command.js +9 -2
- package/dist/ui/command.js.map +1 -1
- package/dist/ui/command.spec.js +20 -1
- package/dist/ui/command.spec.js.map +1 -1
- package/package.json +2 -1
- package/src/agentkit.ts +26 -0
- package/src/app-shell/PromptHome.spec.tsx +404 -0
- package/src/app-shell/PromptHome.tsx +111 -0
- package/src/app-shell/TemplateLibraryGrid.tsx +212 -0
- package/src/app-shell/TemplatePreviewDialog.spec.tsx +473 -0
- package/src/app-shell/TemplatePreviewDialog.tsx +224 -0
- package/src/app-shell/index.ts +3 -0
- package/src/app-shell/prompt-home.css +159 -0
- package/src/composer/ComposerContextMenu.spec.tsx +343 -0
- package/src/composer/ComposerContextMenu.tsx +610 -0
- package/src/composer/ComposerContextMenuSearch.tsx +69 -0
- package/src/composer/ComposerContextPicker.spec.tsx +520 -0
- package/src/composer/ComposerContextPicker.tsx +280 -0
- package/src/composer/ComposerContextPickerDialog.spec.tsx +405 -0
- package/src/composer/ComposerContextPickerDialog.tsx +274 -0
- package/src/composer/ComposerContextSearchInput.tsx +48 -0
- package/src/composer/PromptComposer.context.spec.tsx +577 -0
- package/src/composer/PromptComposer.spec.ts +24 -1
- package/src/composer/PromptComposer.tsx +60 -26
- package/src/composer/TiptapComposer.tsx +198 -48
- package/src/composer/context-items.spec.ts +68 -0
- package/src/composer/context-items.ts +72 -0
- package/src/composer/index.ts +27 -0
- package/src/composer/runtime-adapters.tsx +6 -1
- package/src/composer/useComposerContextPicker.ts +441 -0
- package/src/design-system/default-adapter.spec.tsx +23 -0
- package/src/design-system/default-adapter.tsx +52 -23
- package/src/design-system/types.ts +4 -1
- package/src/styles.css +1 -0
- package/src/ui/command.spec.tsx +33 -1
- package/src/ui/command.tsx +52 -9
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// @vitest-environment happy-dom
|
|
3
|
+
import React, { act } from "react";
|
|
4
|
+
import { createRoot } from "react-dom/client";
|
|
5
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { PromptComposer, } from "./PromptComposer.js";
|
|
7
|
+
import { ComposerRuntimeAdaptersProvider, } from "./runtime-adapters.js";
|
|
8
|
+
let container;
|
|
9
|
+
let root;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
|
|
12
|
+
container = document.createElement("div");
|
|
13
|
+
document.body.appendChild(container);
|
|
14
|
+
root = createRoot(container);
|
|
15
|
+
});
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
act(() => root.unmount());
|
|
18
|
+
container.remove();
|
|
19
|
+
vi.unstubAllGlobals();
|
|
20
|
+
});
|
|
21
|
+
describe("controlled composer context", () => {
|
|
22
|
+
it("uses the shared upload menu without host entries and retains the explicit hidden mode", async () => {
|
|
23
|
+
await mount();
|
|
24
|
+
const trigger = container.querySelector('button[aria-label="Add context"]');
|
|
25
|
+
expect(trigger).not.toBeNull();
|
|
26
|
+
await act(async () => trigger.dispatchEvent(new KeyboardEvent("keydown", { key: "ArrowDown", bubbles: true })));
|
|
27
|
+
const menu = document.querySelector('[role="menu"]');
|
|
28
|
+
expect(menu.querySelector('[role="searchbox"]')).not.toBeNull();
|
|
29
|
+
expect(menu.textContent).toBe("Upload File");
|
|
30
|
+
await act(async () => document.dispatchEvent(new KeyboardEvent("keydown", { key: "Escape", bubbles: true })));
|
|
31
|
+
await mount({ plusMenuMode: "hidden" });
|
|
32
|
+
expect(container.querySelector('button[aria-label="Add context"]')).toBeNull();
|
|
33
|
+
});
|
|
34
|
+
async function mount(props = {}) {
|
|
35
|
+
const composerRef = React.createRef();
|
|
36
|
+
const onSubmit = vi.fn();
|
|
37
|
+
await act(async () => {
|
|
38
|
+
root.render(_jsx(PromptComposer, { composerRef: composerRef, onSubmit: onSubmit, initialText: "Keep the editable draft", initialTextKey: "quick-start", showModelSelector: false, modelStatusChecksEnabled: false, includeDefaultSlashSkills: false, voiceEnabled: false, ...props }));
|
|
39
|
+
});
|
|
40
|
+
return { composerRef, onSubmit };
|
|
41
|
+
}
|
|
42
|
+
async function attachFile() {
|
|
43
|
+
const file = new File(["example"], "reference.pdf", {
|
|
44
|
+
type: "application/pdf",
|
|
45
|
+
});
|
|
46
|
+
const input = container.querySelector('input[type="file"]');
|
|
47
|
+
Object.defineProperty(input, "files", {
|
|
48
|
+
configurable: true,
|
|
49
|
+
value: [file],
|
|
50
|
+
});
|
|
51
|
+
await act(async () => input.dispatchEvent(new Event("change", { bubbles: true })));
|
|
52
|
+
return file;
|
|
53
|
+
}
|
|
54
|
+
it.each(["host", "provider"])("%s submission gating allows staging and blocks every send path until ready", async (gate) => {
|
|
55
|
+
const composerRef = React.createRef();
|
|
56
|
+
const onSubmit = vi.fn();
|
|
57
|
+
const onSelect = vi.fn();
|
|
58
|
+
const onRemove = vi.fn();
|
|
59
|
+
const onRetry = vi.fn();
|
|
60
|
+
const onDisabledClick = vi.fn();
|
|
61
|
+
let blocked = true;
|
|
62
|
+
let files = [];
|
|
63
|
+
const render = async () => {
|
|
64
|
+
await act(async () => {
|
|
65
|
+
root.render(_jsx(ComposerRuntimeAdaptersProvider, { adapters: {
|
|
66
|
+
models: {
|
|
67
|
+
useAgentEngineConfigured: () => ({
|
|
68
|
+
state: gate === "provider" && blocked ? "missing" : "configured",
|
|
69
|
+
missing: gate === "provider" && blocked,
|
|
70
|
+
}),
|
|
71
|
+
BuilderSetupCard: () => _jsx("div", { "data-testid": "provider-setup" }),
|
|
72
|
+
},
|
|
73
|
+
}, children: _jsx(PromptComposer, { composerRef: composerRef, onSubmit: onSubmit, submissionDisabled: gate === "host" && blocked, onDisabledClick: onDisabledClick, placeholder: "Prepare your prompt", showModelSelector: false, modelStatusChecksEnabled: gate === "provider", includeDefaultSlashSkills: false, voiceEnabled: false, onAttachmentsChange: (next) => {
|
|
74
|
+
files = next;
|
|
75
|
+
}, contextMenuItems: [
|
|
76
|
+
{ id: "brief", label: "Choose brief", onSelect },
|
|
77
|
+
], contextItems: [
|
|
78
|
+
{
|
|
79
|
+
key: "brief",
|
|
80
|
+
title: "Brief",
|
|
81
|
+
context: "Snapshot",
|
|
82
|
+
status: "error",
|
|
83
|
+
blocksSubmission: false,
|
|
84
|
+
},
|
|
85
|
+
], onRemoveContextItem: onRemove, onRetryContextItem: onRetry }) }));
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
await render();
|
|
89
|
+
const editor = container.querySelector('[contenteditable="true"]');
|
|
90
|
+
expect(editor).not.toBeNull();
|
|
91
|
+
await act(async () => composerRef.current.setText("Staged draft"));
|
|
92
|
+
const file = await attachFile();
|
|
93
|
+
expect(files).toEqual([file]);
|
|
94
|
+
const contextButton = container.querySelector('button[aria-label="Add context"]');
|
|
95
|
+
expect(contextButton.disabled).toBe(false);
|
|
96
|
+
await act(async () => contextButton.dispatchEvent(new KeyboardEvent("keydown", { key: "ArrowDown", bubbles: true })));
|
|
97
|
+
const contextGroup = Array.from(document.querySelectorAll('[role="menuitem"]')).find((element) => element.textContent === "Add context");
|
|
98
|
+
await act(async () => contextGroup.click());
|
|
99
|
+
const option = Array.from(document.querySelectorAll('[role="menuitem"]')).find((element) => element.textContent?.includes("Choose brief"));
|
|
100
|
+
expect(option).toBeDefined();
|
|
101
|
+
await act(async () => option.click());
|
|
102
|
+
expect(onSelect).toHaveBeenCalledOnce();
|
|
103
|
+
await act(async () => {
|
|
104
|
+
container
|
|
105
|
+
.querySelector('button[aria-label="Retry Brief context"]')
|
|
106
|
+
.click();
|
|
107
|
+
container
|
|
108
|
+
.querySelector('button[aria-label="Remove Brief context"]')
|
|
109
|
+
.click();
|
|
110
|
+
});
|
|
111
|
+
expect(onRetry).toHaveBeenCalledWith("brief");
|
|
112
|
+
expect(onRemove).toHaveBeenCalledWith("brief");
|
|
113
|
+
expect(onDisabledClick).not.toHaveBeenCalled();
|
|
114
|
+
const send = container.querySelector('button[aria-label="Send message"]');
|
|
115
|
+
expect(send.disabled).toBe(true);
|
|
116
|
+
await act(async () => {
|
|
117
|
+
send.click();
|
|
118
|
+
editor.dispatchEvent(new KeyboardEvent("keydown", { key: "Enter", bubbles: true }));
|
|
119
|
+
editor.dispatchEvent(new KeyboardEvent("keydown", {
|
|
120
|
+
key: "Enter",
|
|
121
|
+
metaKey: true,
|
|
122
|
+
bubbles: true,
|
|
123
|
+
}));
|
|
124
|
+
editor.dispatchEvent(new KeyboardEvent("keydown", {
|
|
125
|
+
key: "Enter",
|
|
126
|
+
ctrlKey: true,
|
|
127
|
+
bubbles: true,
|
|
128
|
+
}));
|
|
129
|
+
expect(await composerRef.current.submitWithText("Quick start")).toBe(false);
|
|
130
|
+
});
|
|
131
|
+
expect(onSubmit).not.toHaveBeenCalled();
|
|
132
|
+
expect(editor.textContent).toBe("Staged draft");
|
|
133
|
+
expect(files).toEqual([file]);
|
|
134
|
+
blocked = false;
|
|
135
|
+
await render();
|
|
136
|
+
await act(async () => {
|
|
137
|
+
expect(await composerRef.current.submitWithText("Ready now")).toBe(true);
|
|
138
|
+
});
|
|
139
|
+
expect(onSubmit).toHaveBeenCalledOnce();
|
|
140
|
+
expect(onSubmit.mock.calls[0][0]).toBe("Ready now");
|
|
141
|
+
expect(onSubmit.mock.calls[0][1]).toEqual([file]);
|
|
142
|
+
});
|
|
143
|
+
it("preserves full-surface disabled semantics independently of the submit-only gate", async () => {
|
|
144
|
+
const { composerRef, onSubmit } = await mount({
|
|
145
|
+
disabled: true,
|
|
146
|
+
contextMenuItems: [
|
|
147
|
+
{ id: "brief", label: "Choose brief", onSelect: vi.fn() },
|
|
148
|
+
],
|
|
149
|
+
});
|
|
150
|
+
expect(container.querySelector('[contenteditable="true"]')).toBeNull();
|
|
151
|
+
expect(container.querySelector('button[aria-label="Add context"]').disabled).toBe(true);
|
|
152
|
+
await act(async () => expect(await composerRef.current.submitWithText("Quick start")).toBe(false));
|
|
153
|
+
expect(onSubmit).not.toHaveBeenCalled();
|
|
154
|
+
});
|
|
155
|
+
it("quick starts use the current files, model and immutable context without replacing the draft first", async () => {
|
|
156
|
+
const contextItems = [
|
|
157
|
+
{ key: "brief", title: "Brief", context: "Snapshot" },
|
|
158
|
+
];
|
|
159
|
+
let release;
|
|
160
|
+
const gate = new Promise((resolve) => {
|
|
161
|
+
release = resolve;
|
|
162
|
+
});
|
|
163
|
+
const onSubmit = vi.fn().mockReturnValue(gate);
|
|
164
|
+
const { composerRef } = await mount({
|
|
165
|
+
contextItems,
|
|
166
|
+
onSubmit,
|
|
167
|
+
showModelSelector: true,
|
|
168
|
+
availableModels: [
|
|
169
|
+
{
|
|
170
|
+
engine: "example",
|
|
171
|
+
label: "Example",
|
|
172
|
+
models: ["example-model"],
|
|
173
|
+
configured: true,
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
selectedModel: "example-model",
|
|
177
|
+
selectedEngine: "example",
|
|
178
|
+
selectedEffort: "high",
|
|
179
|
+
onModelChange: vi.fn(),
|
|
180
|
+
});
|
|
181
|
+
const file = await attachFile();
|
|
182
|
+
let submission;
|
|
183
|
+
await act(async () => {
|
|
184
|
+
submission = composerRef.current.submitWithText("Create from the reference");
|
|
185
|
+
});
|
|
186
|
+
expect(onSubmit).toHaveBeenCalledOnce();
|
|
187
|
+
expect(onSubmit.mock.calls[0]).toMatchObject([
|
|
188
|
+
"Create from the reference",
|
|
189
|
+
[file],
|
|
190
|
+
[],
|
|
191
|
+
{
|
|
192
|
+
model: "example-model",
|
|
193
|
+
engine: "example",
|
|
194
|
+
effort: "high",
|
|
195
|
+
contextItems,
|
|
196
|
+
},
|
|
197
|
+
]);
|
|
198
|
+
expect(container.querySelector('[contenteditable="true"]')?.textContent).toBe("Keep the editable draft");
|
|
199
|
+
contextItems[0].context = "Later change";
|
|
200
|
+
expect(onSubmit.mock.calls[0][3].contextItems[0].context).toBe("Snapshot");
|
|
201
|
+
await act(async () => {
|
|
202
|
+
release();
|
|
203
|
+
expect(await submission).toBe(true);
|
|
204
|
+
});
|
|
205
|
+
expect(container.querySelector('[contenteditable="true"]')?.textContent).toBe("");
|
|
206
|
+
});
|
|
207
|
+
it("returns false and retains the typed draft and files after a rejected quick start", async () => {
|
|
208
|
+
const onSubmit = vi.fn().mockRejectedValue(new Error("Submit unavailable"));
|
|
209
|
+
let files = [];
|
|
210
|
+
const { composerRef } = await mount({
|
|
211
|
+
onSubmit,
|
|
212
|
+
onAttachmentsChange: (next) => {
|
|
213
|
+
files = next;
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
const file = await attachFile();
|
|
217
|
+
await act(async () => expect(await composerRef.current.submitWithText("Quick start")).toBe(false));
|
|
218
|
+
expect(container.querySelector('[contenteditable="true"]')?.textContent).toBe("Keep the editable draft");
|
|
219
|
+
expect(files).toEqual([file]);
|
|
220
|
+
expect(container.querySelector('[role="alert"]')?.textContent).toBe("Submit unavailable");
|
|
221
|
+
});
|
|
222
|
+
it.each(["pending", "error"])("quick starts cannot bypass %s context", async (status) => {
|
|
223
|
+
const { composerRef, onSubmit } = await mount({
|
|
224
|
+
contextItems: [{ key: "brief", title: "Brief", context: "", status }],
|
|
225
|
+
});
|
|
226
|
+
await act(async () => expect(await composerRef.current.submitWithText("Quick start")).toBe(false));
|
|
227
|
+
expect(onSubmit).not.toHaveBeenCalled();
|
|
228
|
+
expect(container.querySelector('[contenteditable="true"]')?.textContent).toBe("Keep the editable draft");
|
|
229
|
+
});
|
|
230
|
+
it("reports oversize context and keeps the draft instead of truncating or sending", async () => {
|
|
231
|
+
const { composerRef, onSubmit } = await mount({
|
|
232
|
+
contextItems: [
|
|
233
|
+
{ key: "brief", title: "Brief", context: "x".repeat(65536) },
|
|
234
|
+
],
|
|
235
|
+
});
|
|
236
|
+
await act(async () => expect(await composerRef.current.submitWithText("Quick start")).toBe(false));
|
|
237
|
+
expect(onSubmit).not.toHaveBeenCalled();
|
|
238
|
+
expect(container.querySelector('[role="alert"]')?.textContent).toContain("Context is too large");
|
|
239
|
+
expect(container.querySelector('[contenteditable="true"]')?.textContent).toBe("Keep the editable draft");
|
|
240
|
+
});
|
|
241
|
+
it("a failed provider preflight leaves the draft untouched and returns false", async () => {
|
|
242
|
+
const composerRef = React.createRef();
|
|
243
|
+
const onSubmit = vi.fn();
|
|
244
|
+
const preflight = vi.fn().mockResolvedValue("missing");
|
|
245
|
+
await act(async () => root.render(_jsx(ComposerRuntimeAdaptersProvider, { adapters: {
|
|
246
|
+
models: {
|
|
247
|
+
useAgentEngineConfigured: () => ({
|
|
248
|
+
state: "unknown",
|
|
249
|
+
missing: false,
|
|
250
|
+
}),
|
|
251
|
+
fetchAgentEngineConfiguredState: preflight,
|
|
252
|
+
},
|
|
253
|
+
}, children: _jsx(PromptComposer, { composerRef: composerRef, onSubmit: onSubmit, initialText: "Keep my draft", initialTextKey: "gate", showModelSelector: false, includeDefaultSlashSkills: false }) })));
|
|
254
|
+
await act(async () => expect(await composerRef.current.submitWithText("Quick start")).toBe(false));
|
|
255
|
+
expect(preflight).toHaveBeenCalledOnce();
|
|
256
|
+
expect(onSubmit).not.toHaveBeenCalled();
|
|
257
|
+
expect(container.querySelector('[contenteditable="true"]')?.textContent).toBe("Keep my draft");
|
|
258
|
+
});
|
|
259
|
+
it.each(["click", "enter"])("allows %s steering past a nonremovable failed persisted source", async (method) => {
|
|
260
|
+
const onSubmit = vi.fn();
|
|
261
|
+
const remove = vi.fn();
|
|
262
|
+
const source = {
|
|
263
|
+
key: "system-source:qa",
|
|
264
|
+
title: "QA reference",
|
|
265
|
+
context: "systemId=qa; sourceId=qa",
|
|
266
|
+
status: "error",
|
|
267
|
+
statusMessage: "Source read failed",
|
|
268
|
+
removable: false,
|
|
269
|
+
blocksSubmission: false,
|
|
270
|
+
};
|
|
271
|
+
await act(async () => {
|
|
272
|
+
root.render(React.createElement(PromptComposer, {
|
|
273
|
+
onSubmit,
|
|
274
|
+
contextItems: [source],
|
|
275
|
+
onRemoveContextItem: remove,
|
|
276
|
+
initialText: "Try a different direction",
|
|
277
|
+
initialTextKey: "nonblocking-source",
|
|
278
|
+
showModelSelector: false,
|
|
279
|
+
modelStatusChecksEnabled: false,
|
|
280
|
+
attachmentsEnabled: false,
|
|
281
|
+
includeDefaultSlashSkills: false,
|
|
282
|
+
}));
|
|
283
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
284
|
+
});
|
|
285
|
+
expect(container.querySelector('button[aria-label="Remove QA reference context"]')).toBeNull();
|
|
286
|
+
expect(container
|
|
287
|
+
.querySelector('[data-context-key="system-source:qa"]')
|
|
288
|
+
?.getAttribute("title")).toBe("Source read failed");
|
|
289
|
+
await act(async () => {
|
|
290
|
+
if (method === "click")
|
|
291
|
+
container
|
|
292
|
+
.querySelector('button[aria-label="Send message"]')
|
|
293
|
+
.click();
|
|
294
|
+
else
|
|
295
|
+
container
|
|
296
|
+
.querySelector('[contenteditable="true"]')
|
|
297
|
+
.dispatchEvent(new KeyboardEvent("keydown", { key: "Enter", bubbles: true }));
|
|
298
|
+
});
|
|
299
|
+
expect(onSubmit).toHaveBeenCalledOnce();
|
|
300
|
+
expect(onSubmit.mock.calls[0][3].contextItems).toEqual([source]);
|
|
301
|
+
expect(remove).not.toHaveBeenCalled();
|
|
302
|
+
});
|
|
303
|
+
it("renders context inside the frame, forwards inspection/retry/removal, and blocks click and keyboard submission until ready", async () => {
|
|
304
|
+
const onSubmit = vi.fn();
|
|
305
|
+
const onRemoveContextItem = vi.fn();
|
|
306
|
+
const onInspectContextItem = vi.fn();
|
|
307
|
+
const onRetryContextItem = vi.fn();
|
|
308
|
+
const composerRef = React.createRef();
|
|
309
|
+
const item = {
|
|
310
|
+
key: "brief",
|
|
311
|
+
title: "Brief",
|
|
312
|
+
context: "Original context",
|
|
313
|
+
status: "pending",
|
|
314
|
+
};
|
|
315
|
+
const render = async () => {
|
|
316
|
+
await act(async () => {
|
|
317
|
+
root.render(React.createElement(PromptComposer, {
|
|
318
|
+
contextItems: [item],
|
|
319
|
+
onRemoveContextItem,
|
|
320
|
+
onInspectContextItem,
|
|
321
|
+
onRetryContextItem,
|
|
322
|
+
composerRef,
|
|
323
|
+
onSubmit,
|
|
324
|
+
initialText: "Review",
|
|
325
|
+
initialTextKey: "context-test",
|
|
326
|
+
showModelSelector: false,
|
|
327
|
+
modelStatusChecksEnabled: false,
|
|
328
|
+
attachmentsEnabled: false,
|
|
329
|
+
includeDefaultSlashSkills: false,
|
|
330
|
+
}));
|
|
331
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
332
|
+
});
|
|
333
|
+
};
|
|
334
|
+
await render();
|
|
335
|
+
expect(container
|
|
336
|
+
.querySelector('[data-context-key="brief"]')
|
|
337
|
+
?.closest('[data-agent-composer-slot="root"]')).not.toBeNull();
|
|
338
|
+
const clickSend = async () => {
|
|
339
|
+
await act(async () => container
|
|
340
|
+
.querySelector('button[aria-label="Send message"]')
|
|
341
|
+
.click());
|
|
342
|
+
};
|
|
343
|
+
const pressEnter = async () => {
|
|
344
|
+
await act(async () => container
|
|
345
|
+
.querySelector('[contenteditable="true"]')
|
|
346
|
+
.dispatchEvent(new KeyboardEvent("keydown", { key: "Enter", bubbles: true })));
|
|
347
|
+
};
|
|
348
|
+
await clickSend();
|
|
349
|
+
await pressEnter();
|
|
350
|
+
expect(onSubmit).not.toHaveBeenCalled();
|
|
351
|
+
item.status = "error";
|
|
352
|
+
await render();
|
|
353
|
+
await clickSend();
|
|
354
|
+
await pressEnter();
|
|
355
|
+
expect(onSubmit).not.toHaveBeenCalled();
|
|
356
|
+
const contextRow = container.querySelector('[data-context-key="brief"]');
|
|
357
|
+
await act(async () => {
|
|
358
|
+
contextRow.querySelector("button").click();
|
|
359
|
+
contextRow
|
|
360
|
+
.querySelector('button[aria-label="Retry Brief context"]')
|
|
361
|
+
.click();
|
|
362
|
+
contextRow
|
|
363
|
+
.querySelector('button[aria-label="Remove Brief context"]')
|
|
364
|
+
.click();
|
|
365
|
+
});
|
|
366
|
+
expect(onInspectContextItem).toHaveBeenCalledWith("brief");
|
|
367
|
+
expect(onRetryContextItem).toHaveBeenCalledWith("brief");
|
|
368
|
+
expect(onRemoveContextItem).toHaveBeenCalledWith("brief");
|
|
369
|
+
expect(container.querySelector('[data-context-key="brief"]')).not.toBeNull();
|
|
370
|
+
item.status = "ready";
|
|
371
|
+
await render();
|
|
372
|
+
await clickSend();
|
|
373
|
+
expect(onSubmit).toHaveBeenCalledOnce();
|
|
374
|
+
const [text, , references, options] = onSubmit.mock.calls[0];
|
|
375
|
+
expect(text).toBe("Review");
|
|
376
|
+
expect(references).toEqual([]);
|
|
377
|
+
expect(options.contextItems).toEqual([item]);
|
|
378
|
+
item.context = "Changed later";
|
|
379
|
+
expect(options.contextItems[0].context).toBe("Original context");
|
|
380
|
+
expect(Object.isFrozen(options.contextItems[0])).toBe(true);
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
//# sourceMappingURL=PromptComposer.context.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PromptComposer.context.spec.js","sourceRoot":"","sources":["../../src/composer/PromptComposer.context.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import type { AttachmentAdapter } from "@assistant-ui/react";
|
|
1
2
|
import { type CSSProperties, type Ref, type ReactNode } from "react";
|
|
3
|
+
import type { ComposerContextMenuItem } from "./ComposerContextMenu.js";
|
|
2
4
|
import type { ComposerTerminalModeControl } from "./ComposerPlusMenu.js";
|
|
3
|
-
import
|
|
5
|
+
import type { ComposerContextSnapshot } from "./context-items.js";
|
|
6
|
+
import { type EngineModelGroup, type AgentChatContextItem, type ReasoningEffort } from "./runtime-adapters.js";
|
|
4
7
|
import { type ComposerAgentOption, type ComposerSubmitIntent, type TiptapComposerHandle } from "./TiptapComposer.js";
|
|
5
8
|
import type { AgentComposerLayoutVariant, Reference, SkillResult, SlashCommand } from "./types.js";
|
|
6
9
|
/**
|
|
@@ -15,14 +18,22 @@ export interface PromptComposerSubmitOptions {
|
|
|
15
18
|
engine?: string;
|
|
16
19
|
effort?: ReasoningEffort;
|
|
17
20
|
attachments?: ReadonlyArray<unknown>;
|
|
21
|
+
contextItems?: ComposerContextSnapshot;
|
|
18
22
|
}
|
|
19
23
|
export interface PromptComposerProps {
|
|
24
|
+
contextItems?: readonly AgentChatContextItem[];
|
|
25
|
+
onRemoveContextItem?: (key: string) => void;
|
|
26
|
+
onInspectContextItem?: (key: string) => void;
|
|
27
|
+
onRetryContextItem?: (key: string) => void;
|
|
28
|
+
contextMenuItems?: readonly ComposerContextMenuItem[];
|
|
20
29
|
/** Called when the user submits the composer. */
|
|
21
30
|
onSubmit: (text: string, files: PromptComposerFile[], references: Reference[], options: PromptComposerSubmitOptions) => void | Promise<void>;
|
|
22
31
|
placeholder?: string;
|
|
23
32
|
/** Accessible name forwarded to the rich text editor. */
|
|
24
33
|
ariaLabel?: string;
|
|
25
34
|
disabled?: boolean;
|
|
35
|
+
/** Block all submission paths while allowing draft, file, and context staging. */
|
|
36
|
+
submissionDisabled?: boolean;
|
|
26
37
|
/** Prevent submission while preserving editor focus and draft entry. */
|
|
27
38
|
submitting?: boolean;
|
|
28
39
|
/** Present the primary action as queueing instead of immediate send. */
|
|
@@ -52,6 +63,10 @@ export interface PromptComposerProps {
|
|
|
52
63
|
voiceEnabled?: boolean;
|
|
53
64
|
/** Show file upload controls and pass submitted files to onSubmit (default: true). */
|
|
54
65
|
attachmentsEnabled?: boolean;
|
|
66
|
+
/** Host-owned file acceptance and staging; the shared composer still owns picker and chips. */
|
|
67
|
+
attachmentAdapter?: AttachmentAdapter;
|
|
68
|
+
/** Let hosts extract ordinary uploaded text without also inlining it. */
|
|
69
|
+
inlineTextAttachments?: boolean;
|
|
55
70
|
/**
|
|
56
71
|
* Controls the shared "+" affordance. Defaults to upload-only for standalone
|
|
57
72
|
* prompt forms; chat surfaces can opt into the full sidebar menu.
|
|
@@ -135,10 +150,8 @@ export interface PromptComposerProps {
|
|
|
135
150
|
composerRef?: Ref<TiptapComposerHandle>;
|
|
136
151
|
}
|
|
137
152
|
/**
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
* terminal state, and `unknown`/`unavailable` mean the status check has not
|
|
141
|
-
* answered — not that no provider is configured.
|
|
153
|
+
* Show the attached setup treatment only for a confirmed-missing engine with
|
|
154
|
+
* a setup component. Unresolved status does not mean a provider is missing.
|
|
142
155
|
*/
|
|
143
156
|
export declare function shouldGateComposerForMissingEngine(input: {
|
|
144
157
|
state: string;
|
|
@@ -147,6 +160,7 @@ export declare function shouldGateComposerForMissingEngine(input: {
|
|
|
147
160
|
export declare function buildPromptComposerSubmission(options: {
|
|
148
161
|
text: string;
|
|
149
162
|
attachments?: ReadonlyArray<unknown>;
|
|
163
|
+
inlineTextAttachments?: boolean;
|
|
150
164
|
}): Promise<{
|
|
151
165
|
text: string;
|
|
152
166
|
files: File[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromptComposer.d.ts","sourceRoot":"","sources":["../../src/composer/PromptComposer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PromptComposer.d.ts","sourceRoot":"","sources":["../../src/composer/PromptComposer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -78,10 +78,8 @@ function formatInlineTextFile(name, text) {
|
|
|
78
78
|
.join("\n");
|
|
79
79
|
}
|
|
80
80
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* terminal state, and `unknown`/`unavailable` mean the status check has not
|
|
84
|
-
* answered — not that no provider is configured.
|
|
81
|
+
* Show the attached setup treatment only for a confirmed-missing engine with
|
|
82
|
+
* a setup component. Unresolved status does not mean a provider is missing.
|
|
85
83
|
*/
|
|
86
84
|
export function shouldGateComposerForMissingEngine(input) {
|
|
87
85
|
return input.state === "missing" && input.hasSetupComponent;
|
|
@@ -103,7 +101,8 @@ export async function buildPromptComposerSubmission(options) {
|
|
|
103
101
|
}
|
|
104
102
|
}
|
|
105
103
|
else {
|
|
106
|
-
if (
|
|
104
|
+
if (options.inlineTextAttachments !== false &&
|
|
105
|
+
isInlineableTextFile(file)) {
|
|
107
106
|
try {
|
|
108
107
|
pastedTextBlocks.push(formatInlineTextFile(file.name, await file.text()));
|
|
109
108
|
}
|
|
@@ -201,9 +200,8 @@ function PromptAttachmentStrip() {
|
|
|
201
200
|
return null;
|
|
202
201
|
return (_jsx("div", { className: "agent-composer-attachment-strip flex flex-wrap gap-2 px-2 pt-2", children: attachments.map((attachment) => (_jsx(AttachmentChip, { attachment: attachment, onRemove: handleRemove }, attachment.id))) }));
|
|
203
202
|
}
|
|
204
|
-
function PromptComposerInner({ onSubmit, placeholder, ariaLabel, disabled, submitting, willQueue = false, onDisabledClick, maxDocumentAttachmentBytes, documentAttachmentLimitLabel, autoFocus, className, style, rootClassName, rootStyle, draftScope, preserveDraftOnSubmit = false, showModelSelector = true, modelSelectorOpen, showAutoModelOption = true, voiceEnabled = DEFAULT_VOICE_DICTATION_ENABLED, attachmentsEnabled = true, plusMenuMode, terminalModeControl, extensionTools = false, initialText, initialTextKey, modeControl, execMode, onExecModeChange, toolbarSlot, attachButton, actionButton, extraActionButton, layoutVariant, slashCommands, slashSkills, includeDefaultSlashCommands, includeDefaultSlashSkills, onSlashCommand, availableModels, modelListLoading, selectedModel, selectedEngine, selectedEffort, onModelChange, onEffortChange, availableAgents, selectedAgent, agentOnly = false, onAgentChange, onModelSelectorOpenChange, modelStatusChecksEnabled, onTextChange, onAttachmentsChange, onModelSelectionChange, onConnectProvider, onConnectLocalRuntime, composerRef, }) {
|
|
203
|
+
function PromptComposerInner({ onSubmit, contextItems, onRemoveContextItem, onInspectContextItem, onRetryContextItem, contextMenuItems, placeholder, ariaLabel, disabled, submissionDisabled, submitting, willQueue = false, onDisabledClick, maxDocumentAttachmentBytes, documentAttachmentLimitLabel, autoFocus, className, style, rootClassName, rootStyle, draftScope, preserveDraftOnSubmit = false, showModelSelector = true, modelSelectorOpen, showAutoModelOption = true, voiceEnabled = DEFAULT_VOICE_DICTATION_ENABLED, attachmentsEnabled = true, inlineTextAttachments = true, plusMenuMode, terminalModeControl, extensionTools = false, initialText, initialTextKey, modeControl, execMode, onExecModeChange, toolbarSlot, attachButton, actionButton, extraActionButton, layoutVariant, slashCommands, slashSkills, includeDefaultSlashCommands, includeDefaultSlashSkills, onSlashCommand, availableModels, modelListLoading, selectedModel, selectedEngine, selectedEffort, onModelChange, onEffortChange, availableAgents, selectedAgent, agentOnly = false, onAgentChange, onModelSelectorOpenChange, modelStatusChecksEnabled, onTextChange, onAttachmentsChange, onModelSelectionChange, onConnectProvider, onConnectLocalRuntime, composerRef, }) {
|
|
205
204
|
const adapters = useComposerRuntimeAdapters();
|
|
206
|
-
const t = adapters.translate;
|
|
207
205
|
const modelsAdapter = adapters.models;
|
|
208
206
|
const BuilderSetupCard = modelsAdapter.BuilderSetupCard;
|
|
209
207
|
const BuilderSetupContent = modelsAdapter.BuilderSetupContent;
|
|
@@ -277,6 +275,10 @@ function PromptComposerInner({ onSubmit, placeholder, ariaLabel, disabled, submi
|
|
|
277
275
|
hasSetupComponent: Boolean(useInlineMissingKeySetup ? BuilderSetupContent : BuilderSetupCard),
|
|
278
276
|
});
|
|
279
277
|
const ensureEngineReadyBeforeSubmit = useCallback(async () => {
|
|
278
|
+
if (agentEngineConfigured.state === "missing") {
|
|
279
|
+
bounceMissingKeySetup();
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
280
282
|
if (agentEngineConfigured.state !== "unknown")
|
|
281
283
|
return true;
|
|
282
284
|
const state = await modelsAdapter.fetchAgentEngineConfiguredState?.(true, {
|
|
@@ -289,7 +291,7 @@ function PromptComposerInner({ onSubmit, placeholder, ariaLabel, disabled, submi
|
|
|
289
291
|
return true;
|
|
290
292
|
}, [agentEngineConfigured.state, bounceMissingKeySetup, modelsAdapter]);
|
|
291
293
|
useEffect(() => {
|
|
292
|
-
if (!autoFocus ||
|
|
294
|
+
if (!autoFocus || disabled)
|
|
293
295
|
return;
|
|
294
296
|
const id = window.setTimeout(() => {
|
|
295
297
|
const target = typeof handleRef === "object" && handleRef && "current" in handleRef
|
|
@@ -298,7 +300,7 @@ function PromptComposerInner({ onSubmit, placeholder, ariaLabel, disabled, submi
|
|
|
298
300
|
target?.focus();
|
|
299
301
|
}, 50);
|
|
300
302
|
return () => window.clearTimeout(id);
|
|
301
|
-
}, [autoFocus,
|
|
303
|
+
}, [autoFocus, disabled, handleRef]);
|
|
302
304
|
const handleSubmit = useCallback(async (text, references, attachments, submitOptions) => {
|
|
303
305
|
// PromptComposer hosts (NewWorkspaceAppFlow, create-extension, create-deck,
|
|
304
306
|
// …) submit a single string prompt — they don't run the assistant-ui
|
|
@@ -309,6 +311,7 @@ function PromptComposerInner({ onSubmit, placeholder, ariaLabel, disabled, submi
|
|
|
309
311
|
const { text: finalText, files } = await buildPromptComposerSubmission({
|
|
310
312
|
text,
|
|
311
313
|
attachments,
|
|
314
|
+
inlineTextAttachments,
|
|
312
315
|
});
|
|
313
316
|
await onSubmit(finalText, files, references, {
|
|
314
317
|
intent: submitOptions?.intent ?? "immediate",
|
|
@@ -316,18 +319,19 @@ function PromptComposerInner({ onSubmit, placeholder, ariaLabel, disabled, submi
|
|
|
316
319
|
engine: composerEngine,
|
|
317
320
|
effort: composerEffort,
|
|
318
321
|
attachments,
|
|
322
|
+
...(submitOptions?.contextItems === undefined
|
|
323
|
+
? {}
|
|
324
|
+
: { contextItems: submitOptions.contextItems }),
|
|
319
325
|
});
|
|
320
|
-
}, [
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
})
|
|
330
|
-
: placeholder, initialText: initialText, initialTextKey: initialTextKey, onSubmit: handleSubmit, onBeforeSubmit: ensureEngineReadyBeforeSubmit, clearOnSubmit: !preserveDraftOnSubmit, plusMenuMode: plusMenuMode ?? (attachmentsEnabled ? "upload-only" : "hidden"), terminalModeControl: terminalModeControl, extensionTools: extensionTools, attachButton: attachButton, modeControl: modeControl, execMode: execMode, onExecModeChange: onExecModeChange, toolbarSlot: toolbarSlot, actionButton: actionButton, extraActionButton: extraActionButton, layoutVariant: layoutVariant, slashCommands: slashCommands, slashSkills: slashSkills, includeDefaultSlashCommands: includeDefaultSlashCommands, includeDefaultSlashSkills: includeDefaultSlashSkills, onSlashCommand: onSlashCommand, voiceEnabled: voiceEnabled, onTextChange: onTextChange, draftScope: draftScope, selectedModel: composerModel, selectedEngine: composerEngine, modelSelectorOpen: modelSelectorOpen, selectedEffort: composerEffort, availableModels: composerModelGroups, availableAgents: availableAgents, selectedAgent: selectedAgent, agentOnly: agentOnly, showAutoModelOption: showAutoModelOption, modelListLoading: composerModelListLoading, onModelChange: handleModelChange, onEffortChange: handleEffortChange, onAgentChange: onAgentChange, onModelSelectorOpenChange: onModelSelectorOpenChange, providerConnectStatusEnabled: resolvedModelStatusChecksEnabled, onConnectProvider: onConnectProvider, onConnectLocalRuntime: onConnectLocalRuntime })] })] }));
|
|
326
|
+
}, [
|
|
327
|
+
composerEffort,
|
|
328
|
+
composerEngine,
|
|
329
|
+
composerModel,
|
|
330
|
+
onSubmit,
|
|
331
|
+
inlineTextAttachments,
|
|
332
|
+
]);
|
|
333
|
+
return (_jsxs(_Fragment, { children: [missingApiKey && !useInlineMissingKeySetup && BuilderSetupCard ? (_jsx(BuilderSetupCard, { onConnected: handleBuilderConnected, bouncePulse: missingKeyBouncePulse, attached: true, fullWidth: true, layout: "sidebar" })) : null, missingApiKey && useInlineMissingKeySetup && BuilderSetupContent ? (_jsx("div", { className: "agent-builder-setup-inline--attached mb-0 rounded-md border border-border/80 bg-background/80 p-2.5 text-start shadow-sm", children: _jsx(BuilderSetupContent, { onConnected: handleBuilderConnected, layout: "sidebar" }) })) : null, _jsxs(AgentComposerFrame, { className: cn("text-start", (gateComposer || onDisabledClick) &&
|
|
334
|
+
"agent-composer-area--attached-above", className), rootClassName: rootClassName, style: style, rootStyle: rootStyle, layoutVariant: layoutVariant, onClick: disabled ? onDisabledClick : undefined, children: [_jsx(PromptAttachmentStrip, {}), _jsx(TiptapComposer, { contextItems: contextItems, contextMenuItems: contextMenuItems, onRemoveContextItem: onRemoveContextItem, onInspectContextItem: onInspectContextItem, onRetryContextItem: onRetryContextItem, attachmentsEnabled: attachmentsEnabled, ariaLabel: ariaLabel, focusRef: handleRef, disabled: disabled, submissionDisabled: submissionDisabled || agentEngineConfigured.state === "missing", submitting: submitting, willQueue: willQueue, maxDocumentAttachmentBytes: maxDocumentAttachmentBytes, documentAttachmentLimitLabel: documentAttachmentLimitLabel, placeholder: placeholder, initialText: initialText, initialTextKey: initialTextKey, onSubmit: handleSubmit, onBeforeSubmit: ensureEngineReadyBeforeSubmit, clearOnSubmit: !preserveDraftOnSubmit, plusMenuMode: plusMenuMode ?? (attachmentsEnabled ? "upload-only" : "hidden"), terminalModeControl: terminalModeControl, extensionTools: extensionTools, attachButton: attachButton, modeControl: modeControl, execMode: execMode, onExecModeChange: onExecModeChange, toolbarSlot: toolbarSlot, actionButton: actionButton, extraActionButton: extraActionButton, layoutVariant: layoutVariant, slashCommands: slashCommands, slashSkills: slashSkills, includeDefaultSlashCommands: includeDefaultSlashCommands, includeDefaultSlashSkills: includeDefaultSlashSkills, onSlashCommand: onSlashCommand, voiceEnabled: voiceEnabled, onTextChange: onTextChange, draftScope: draftScope, selectedModel: composerModel, selectedEngine: composerEngine, modelSelectorOpen: modelSelectorOpen, selectedEffort: composerEffort, availableModels: composerModelGroups, availableAgents: availableAgents, selectedAgent: selectedAgent, agentOnly: agentOnly, showAutoModelOption: showAutoModelOption, modelListLoading: composerModelListLoading, onModelChange: handleModelChange, onEffortChange: handleEffortChange, onAgentChange: onAgentChange, onModelSelectorOpenChange: onModelSelectorOpenChange, providerConnectStatusEnabled: resolvedModelStatusChecksEnabled, onConnectProvider: onConnectProvider, onConnectLocalRuntime: onConnectLocalRuntime })] })] }));
|
|
331
335
|
}
|
|
332
336
|
/**
|
|
333
337
|
* Standalone composer that mirrors the agent sidebar's input experience —
|
|
@@ -342,11 +346,12 @@ function PromptComposerInner({ onSubmit, placeholder, ariaLabel, disabled, submi
|
|
|
342
346
|
*/
|
|
343
347
|
function PromptComposerRuntime(props) {
|
|
344
348
|
const StaleIndexBoundary = useComposerRuntimeAdapters().agentChat.StaleIndexBoundary;
|
|
345
|
-
const attachmentAdapter = useMemo(() =>
|
|
346
|
-
new
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
349
|
+
const attachmentAdapter = useMemo(() => props.attachmentAdapter ??
|
|
350
|
+
new CompositeAttachmentAdapter([
|
|
351
|
+
new RasterImageAttachmentAdapter(),
|
|
352
|
+
new BinaryDocumentAttachmentAdapter(),
|
|
353
|
+
new TextAttachmentAdapter(),
|
|
354
|
+
]), [props.attachmentAdapter]);
|
|
350
355
|
const runtime = useLocalRuntime(NOOP_ADAPTER, {
|
|
351
356
|
adapters: { attachments: attachmentAdapter },
|
|
352
357
|
});
|