@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.
Files changed (141) hide show
  1. package/agent-native.eject.json +11 -0
  2. package/dist/agentkit.d.ts +5 -1
  3. package/dist/agentkit.d.ts.map +1 -1
  4. package/dist/agentkit.js +2 -0
  5. package/dist/agentkit.js.map +1 -1
  6. package/dist/app-shell/PromptHome.d.ts +26 -0
  7. package/dist/app-shell/PromptHome.d.ts.map +1 -0
  8. package/dist/app-shell/PromptHome.js +19 -0
  9. package/dist/app-shell/PromptHome.js.map +1 -0
  10. package/dist/app-shell/PromptHome.spec.d.ts +2 -0
  11. package/dist/app-shell/PromptHome.spec.d.ts.map +1 -0
  12. package/dist/app-shell/PromptHome.spec.js +206 -0
  13. package/dist/app-shell/PromptHome.spec.js.map +1 -0
  14. package/dist/app-shell/TemplateLibraryGrid.d.ts +48 -0
  15. package/dist/app-shell/TemplateLibraryGrid.d.ts.map +1 -0
  16. package/dist/app-shell/TemplateLibraryGrid.js +20 -0
  17. package/dist/app-shell/TemplateLibraryGrid.js.map +1 -0
  18. package/dist/app-shell/TemplatePreviewDialog.d.ts +41 -0
  19. package/dist/app-shell/TemplatePreviewDialog.d.ts.map +1 -0
  20. package/dist/app-shell/TemplatePreviewDialog.js +50 -0
  21. package/dist/app-shell/TemplatePreviewDialog.js.map +1 -0
  22. package/dist/app-shell/TemplatePreviewDialog.spec.d.ts +2 -0
  23. package/dist/app-shell/TemplatePreviewDialog.spec.d.ts.map +1 -0
  24. package/dist/app-shell/TemplatePreviewDialog.spec.js +258 -0
  25. package/dist/app-shell/TemplatePreviewDialog.spec.js.map +1 -0
  26. package/dist/app-shell/index.d.ts +3 -0
  27. package/dist/app-shell/index.d.ts.map +1 -1
  28. package/dist/app-shell/index.js +3 -0
  29. package/dist/app-shell/index.js.map +1 -1
  30. package/dist/app-shell/prompt-home.css +159 -0
  31. package/dist/composer/ComposerContextMenu.d.ts +48 -0
  32. package/dist/composer/ComposerContextMenu.d.ts.map +1 -0
  33. package/dist/composer/ComposerContextMenu.js +295 -0
  34. package/dist/composer/ComposerContextMenu.js.map +1 -0
  35. package/dist/composer/ComposerContextMenu.spec.d.ts +2 -0
  36. package/dist/composer/ComposerContextMenu.spec.d.ts.map +1 -0
  37. package/dist/composer/ComposerContextMenu.spec.js +270 -0
  38. package/dist/composer/ComposerContextMenu.spec.js.map +1 -0
  39. package/dist/composer/ComposerContextMenuSearch.d.ts +11 -0
  40. package/dist/composer/ComposerContextMenuSearch.d.ts.map +1 -0
  41. package/dist/composer/ComposerContextMenuSearch.js +42 -0
  42. package/dist/composer/ComposerContextMenuSearch.js.map +1 -0
  43. package/dist/composer/ComposerContextPicker.d.ts +7 -0
  44. package/dist/composer/ComposerContextPicker.d.ts.map +1 -0
  45. package/dist/composer/ComposerContextPicker.js +71 -0
  46. package/dist/composer/ComposerContextPicker.js.map +1 -0
  47. package/dist/composer/ComposerContextPicker.spec.d.ts +2 -0
  48. package/dist/composer/ComposerContextPicker.spec.d.ts.map +1 -0
  49. package/dist/composer/ComposerContextPicker.spec.js +454 -0
  50. package/dist/composer/ComposerContextPicker.spec.js.map +1 -0
  51. package/dist/composer/ComposerContextPickerDialog.d.ts +8 -0
  52. package/dist/composer/ComposerContextPickerDialog.d.ts.map +1 -0
  53. package/dist/composer/ComposerContextPickerDialog.js +101 -0
  54. package/dist/composer/ComposerContextPickerDialog.js.map +1 -0
  55. package/dist/composer/ComposerContextPickerDialog.spec.d.ts +2 -0
  56. package/dist/composer/ComposerContextPickerDialog.spec.d.ts.map +1 -0
  57. package/dist/composer/ComposerContextPickerDialog.spec.js +329 -0
  58. package/dist/composer/ComposerContextPickerDialog.spec.js.map +1 -0
  59. package/dist/composer/ComposerContextSearchInput.d.ts +7 -0
  60. package/dist/composer/ComposerContextSearchInput.d.ts.map +1 -0
  61. package/dist/composer/ComposerContextSearchInput.js +18 -0
  62. package/dist/composer/ComposerContextSearchInput.js.map +1 -0
  63. package/dist/composer/PromptComposer.context.spec.d.ts +2 -0
  64. package/dist/composer/PromptComposer.context.spec.d.ts.map +1 -0
  65. package/dist/composer/PromptComposer.context.spec.js +383 -0
  66. package/dist/composer/PromptComposer.context.spec.js.map +1 -0
  67. package/dist/composer/PromptComposer.d.ts +19 -5
  68. package/dist/composer/PromptComposer.d.ts.map +1 -1
  69. package/dist/composer/PromptComposer.js +30 -25
  70. package/dist/composer/PromptComposer.js.map +1 -1
  71. package/dist/composer/PromptComposer.spec.js +24 -1
  72. package/dist/composer/PromptComposer.spec.js.map +1 -1
  73. package/dist/composer/TiptapComposer.d.ts +13 -2
  74. package/dist/composer/TiptapComposer.d.ts.map +1 -1
  75. package/dist/composer/TiptapComposer.js +89 -32
  76. package/dist/composer/TiptapComposer.js.map +1 -1
  77. package/dist/composer/context-items.d.ts +12 -0
  78. package/dist/composer/context-items.d.ts.map +1 -0
  79. package/dist/composer/context-items.js +46 -0
  80. package/dist/composer/context-items.js.map +1 -0
  81. package/dist/composer/context-items.spec.d.ts +2 -0
  82. package/dist/composer/context-items.spec.d.ts.map +1 -0
  83. package/dist/composer/context-items.spec.js +43 -0
  84. package/dist/composer/context-items.spec.js.map +1 -0
  85. package/dist/composer/index.d.ts +4 -1
  86. package/dist/composer/index.d.ts.map +1 -1
  87. package/dist/composer/index.js +3 -1
  88. package/dist/composer/index.js.map +1 -1
  89. package/dist/composer/runtime-adapters.d.ts +6 -1
  90. package/dist/composer/runtime-adapters.d.ts.map +1 -1
  91. package/dist/composer/runtime-adapters.js.map +1 -1
  92. package/dist/composer/useComposerContextPicker.d.ts +111 -0
  93. package/dist/composer/useComposerContextPicker.d.ts.map +1 -0
  94. package/dist/composer/useComposerContextPicker.js +299 -0
  95. package/dist/composer/useComposerContextPicker.js.map +1 -0
  96. package/dist/design-system/default-adapter.d.ts.map +1 -1
  97. package/dist/design-system/default-adapter.js +13 -7
  98. package/dist/design-system/default-adapter.js.map +1 -1
  99. package/dist/design-system/default-adapter.spec.js +13 -0
  100. package/dist/design-system/default-adapter.spec.js.map +1 -1
  101. package/dist/design-system/types.d.ts +4 -1
  102. package/dist/design-system/types.d.ts.map +1 -1
  103. package/dist/styles.css +1 -0
  104. package/dist/ui/command.d.ts +8 -2
  105. package/dist/ui/command.d.ts.map +1 -1
  106. package/dist/ui/command.js +9 -2
  107. package/dist/ui/command.js.map +1 -1
  108. package/dist/ui/command.spec.js +20 -1
  109. package/dist/ui/command.spec.js.map +1 -1
  110. package/package.json +2 -1
  111. package/src/agentkit.ts +26 -0
  112. package/src/app-shell/PromptHome.spec.tsx +404 -0
  113. package/src/app-shell/PromptHome.tsx +111 -0
  114. package/src/app-shell/TemplateLibraryGrid.tsx +212 -0
  115. package/src/app-shell/TemplatePreviewDialog.spec.tsx +473 -0
  116. package/src/app-shell/TemplatePreviewDialog.tsx +224 -0
  117. package/src/app-shell/index.ts +3 -0
  118. package/src/app-shell/prompt-home.css +159 -0
  119. package/src/composer/ComposerContextMenu.spec.tsx +343 -0
  120. package/src/composer/ComposerContextMenu.tsx +610 -0
  121. package/src/composer/ComposerContextMenuSearch.tsx +69 -0
  122. package/src/composer/ComposerContextPicker.spec.tsx +520 -0
  123. package/src/composer/ComposerContextPicker.tsx +280 -0
  124. package/src/composer/ComposerContextPickerDialog.spec.tsx +405 -0
  125. package/src/composer/ComposerContextPickerDialog.tsx +274 -0
  126. package/src/composer/ComposerContextSearchInput.tsx +48 -0
  127. package/src/composer/PromptComposer.context.spec.tsx +577 -0
  128. package/src/composer/PromptComposer.spec.ts +24 -1
  129. package/src/composer/PromptComposer.tsx +60 -26
  130. package/src/composer/TiptapComposer.tsx +198 -48
  131. package/src/composer/context-items.spec.ts +68 -0
  132. package/src/composer/context-items.ts +72 -0
  133. package/src/composer/index.ts +27 -0
  134. package/src/composer/runtime-adapters.tsx +6 -1
  135. package/src/composer/useComposerContextPicker.ts +441 -0
  136. package/src/design-system/default-adapter.spec.tsx +23 -0
  137. package/src/design-system/default-adapter.tsx +52 -23
  138. package/src/design-system/types.ts +4 -1
  139. package/src/styles.css +1 -0
  140. package/src/ui/command.spec.tsx +33 -1
  141. 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 { type EngineModelGroup, type ReasoningEffort } from "./runtime-adapters.js";
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
- * Only a confirmed-missing engine that also has a setup component to render
139
- * may block typing: a disabled composer with no way out is never an acceptable
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":"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"}
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
- * Only a confirmed-missing engine that also has a setup component to render
82
- * may block typing: a disabled composer with no way out is never an acceptable
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 (isInlineableTextFile(file)) {
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 || gateComposer)
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, gateComposer, handleRef]);
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
- }, [composerEffort, composerEngine, composerModel, onSubmit]);
321
- 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 && "cursor-pointer", (gateComposer || onDisabledClick) &&
322
- "agent-composer-area--attached-above", className), rootClassName: rootClassName, style: style, rootStyle: rootStyle, layoutVariant: layoutVariant, onClick: gateComposer
323
- ? bounceMissingKeySetup
324
- : onDisabledClick
325
- ? () => onDisabledClick()
326
- : undefined, children: [_jsx(PromptAttachmentStrip, {}), _jsx(TiptapComposer, { ariaLabel: ariaLabel, focusRef: handleRef, disabled: disabled || gateComposer, submitting: submitting, willQueue: willQueue, maxDocumentAttachmentBytes: maxDocumentAttachmentBytes, documentAttachmentLimitLabel: documentAttachmentLimitLabel, placeholder: gateComposer
327
- ? t("agentChat.composer.connectAbove", {
328
- defaultValue: "Connect AI above to continue...",
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(() => new CompositeAttachmentAdapter([
346
- new RasterImageAttachmentAdapter(),
347
- new BinaryDocumentAttachmentAdapter(),
348
- new TextAttachmentAdapter(),
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
  });