@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,274 @@
1
+ import { useEffect, useId, useRef, useState } from "react";
2
+
3
+ import { Alert, AlertDescription } from "../ui/alert.js";
4
+ import { Button } from "../ui/button.js";
5
+ import { Checkbox } from "../ui/checkbox.js";
6
+ import {
7
+ Dialog,
8
+ DialogContent,
9
+ DialogFooter,
10
+ DialogHeader,
11
+ DialogTitle,
12
+ } from "../ui/dialog.js";
13
+ import { Input } from "../ui/input.js";
14
+ import { Label } from "../ui/label.js";
15
+ import { Skeleton } from "../ui/skeleton.js";
16
+ import {
17
+ useComposerContextPicker,
18
+ type ComposerContextPickerConfig,
19
+ } from "./useComposerContextPicker.js";
20
+
21
+ export function ComposerContextPickerDialog({
22
+ config,
23
+ title,
24
+ onClose,
25
+ onRestoreFocus,
26
+ }: {
27
+ config: ComposerContextPickerConfig;
28
+ title: string;
29
+ onClose: () => void;
30
+ onRestoreFocus: () => void;
31
+ }) {
32
+ const picker = useComposerContextPicker({ config, onClose });
33
+ const { t, stage, link, selecting, loading, items, location } = picker;
34
+ const presentation =
35
+ typeof config.presentation === "object" ? config.presentation : undefined;
36
+ const urlOnly = presentation?.mode === "url";
37
+ const id = useId();
38
+ const input = useRef<HTMLInputElement>(null);
39
+ const [touched, setTouched] = useState(false);
40
+ useEffect(() => {
41
+ input.current?.focus();
42
+ }, [stage]);
43
+ const validation = touched && link.trim() ? picker.linkError : undefined;
44
+ const error = stage === "link" ? picker.actionError?.message : picker.error;
45
+ const attach = t("agentChat.composer.contextAttach", {
46
+ defaultValue: "Attach",
47
+ });
48
+ const canAttach =
49
+ picker.selectedItems.length > 0 && !loading && !selecting && !error;
50
+ return (
51
+ <Dialog
52
+ open
53
+ onOpenChange={(open) => {
54
+ if (!open) onClose();
55
+ }}
56
+ >
57
+ <DialogContent
58
+ aria-describedby={undefined}
59
+ closeLabel={t("agentChat.common.close", { defaultValue: "Close" })}
60
+ onOpenAutoFocus={(event) => {
61
+ event.preventDefault();
62
+ input.current?.focus();
63
+ }}
64
+ onCloseAutoFocus={(event) => {
65
+ event.preventDefault();
66
+ onRestoreFocus();
67
+ }}
68
+ >
69
+ <DialogHeader>
70
+ <DialogTitle>{title}</DialogTitle>
71
+ </DialogHeader>
72
+ <form
73
+ noValidate
74
+ className="grid gap-4"
75
+ onSubmit={(event) => {
76
+ event.preventDefault();
77
+ event.stopPropagation();
78
+ if (selecting) return;
79
+ if (stage === "link") picker.submitLink();
80
+ else if (canAttach) void picker.select("batch");
81
+ }}
82
+ >
83
+ {stage === "link" ? (
84
+ <div className="grid gap-2">
85
+ <Label htmlFor={`${id}-url`}>
86
+ {config.link?.label ??
87
+ t("agentChat.composer.contextUrlLabel", {
88
+ defaultValue: "URL",
89
+ })}
90
+ </Label>
91
+ <Input
92
+ ref={input}
93
+ id={`${id}-url`}
94
+ type="url"
95
+ value={link}
96
+ placeholder={config.link?.placeholder}
97
+ aria-invalid={Boolean(validation)}
98
+ aria-describedby={validation ? `${id}-validation` : undefined}
99
+ disabled={selecting}
100
+ onBlur={() => setTouched(true)}
101
+ onChange={(event) => {
102
+ picker.setLink(event.target.value);
103
+ picker.setActionError(undefined);
104
+ }}
105
+ />
106
+ {validation && (
107
+ <p id={`${id}-validation`} className="text-sm text-destructive">
108
+ {validation}
109
+ </p>
110
+ )}
111
+ </div>
112
+ ) : (
113
+ <>
114
+ <Input
115
+ ref={input}
116
+ type="search"
117
+ aria-label={config.searchPlaceholder}
118
+ placeholder={config.searchPlaceholder}
119
+ value={location.search}
120
+ onChange={(event) => {
121
+ picker.cursors.current = [undefined];
122
+ picker.move({
123
+ search: event.target.value,
124
+ page: 1,
125
+ url: location.url,
126
+ });
127
+ }}
128
+ />
129
+ {error ? null : loading ? (
130
+ <div
131
+ className="grid gap-2"
132
+ role="status"
133
+ aria-label={t("agentChat.composer.contextPending", {
134
+ defaultValue: "Loading context…",
135
+ })}
136
+ >
137
+ <Skeleton className="h-8 w-full" />
138
+ <Skeleton className="h-8 w-full" />
139
+ <Skeleton className="h-8 w-full" />
140
+ </div>
141
+ ) : items.length ? (
142
+ <div className="grid max-h-64 gap-3 overflow-y-auto">
143
+ {items.map((item) => {
144
+ const attached =
145
+ config.selectedIds?.includes(item.id) === true;
146
+ return (
147
+ <div key={item.id} className="flex items-center gap-2">
148
+ <Checkbox
149
+ id={`${id}-${item.id}`}
150
+ checked={
151
+ attached ||
152
+ picker.selectedItems.some(
153
+ (selected) => selected.id === item.id,
154
+ )
155
+ }
156
+ disabled={attached || item.disabled || selecting}
157
+ onCheckedChange={(checked) =>
158
+ picker.toggleItem(item, checked === true)
159
+ }
160
+ />
161
+ <Label htmlFor={`${id}-${item.id}`}>{item.title}</Label>
162
+ </div>
163
+ );
164
+ })}
165
+ </div>
166
+ ) : (
167
+ <p role="status" className="text-sm text-muted-foreground">
168
+ {config.emptyMessage ??
169
+ t("agentChat.composer.noContextResults", {
170
+ defaultValue: "No matching context.",
171
+ })}
172
+ </p>
173
+ )}
174
+ {(location.page > 1 || picker.hasMore) && (
175
+ <div className="flex gap-2">
176
+ {location.page > 1 && (
177
+ <Button
178
+ type="button"
179
+ variant="outline"
180
+ disabled={loading || selecting}
181
+ onClick={() =>
182
+ picker.move({
183
+ ...location,
184
+ page: location.page - 1,
185
+ cursor: picker.cursors.current[location.page - 2],
186
+ })
187
+ }
188
+ >
189
+ {t("agentChat.composer.contextPrevious", {
190
+ defaultValue: "Previous",
191
+ })}
192
+ </Button>
193
+ )}
194
+ {picker.hasMore && (
195
+ <Button
196
+ type="button"
197
+ variant="outline"
198
+ disabled={loading || selecting || Boolean(error)}
199
+ onClick={() => {
200
+ picker.cursors.current = [
201
+ ...picker.cursors.current.slice(0, location.page),
202
+ picker.result?.nextCursor,
203
+ ];
204
+ picker.move({
205
+ ...location,
206
+ page: location.page + 1,
207
+ cursor: picker.result?.nextCursor,
208
+ });
209
+ }}
210
+ >
211
+ {t("agentChat.composer.contextNext", {
212
+ defaultValue: "Next",
213
+ })}
214
+ </Button>
215
+ )}
216
+ </div>
217
+ )}
218
+ </>
219
+ )}
220
+ {error && (
221
+ <Alert variant="destructive">
222
+ <AlertDescription>{error}</AlertDescription>
223
+ </Alert>
224
+ )}
225
+ {error &&
226
+ (stage === "link" ? picker.actionError?.retry : picker.retry) && (
227
+ <div>
228
+ <Button
229
+ type="button"
230
+ variant="outline"
231
+ disabled={selecting || (stage === "results" && loading)}
232
+ onClick={() => {
233
+ if (stage === "link") picker.actionError?.retry?.();
234
+ else picker.retry?.();
235
+ }}
236
+ >
237
+ {t("agentChat.common.retry", { defaultValue: "Retry" })}
238
+ </Button>
239
+ </div>
240
+ )}
241
+ <DialogFooter>
242
+ {stage === "results" && (
243
+ <Button
244
+ type="button"
245
+ variant="outline"
246
+ onClick={() => {
247
+ setTouched(false);
248
+ picker.back();
249
+ }}
250
+ >
251
+ {t("agentChat.composer.contextBack", { defaultValue: "Back" })}
252
+ </Button>
253
+ )}
254
+ <Button type="button" variant="outline" onClick={onClose}>
255
+ {t("agentChat.common.cancel", { defaultValue: "Cancel" })}
256
+ </Button>
257
+ <Button
258
+ type="submit"
259
+ disabled={
260
+ stage === "link"
261
+ ? selecting || Boolean(picker.linkError)
262
+ : !canAttach
263
+ }
264
+ >
265
+ {stage === "link" && !urlOnly
266
+ ? t("agentChat.common.continue", { defaultValue: "Continue" })
267
+ : attach}
268
+ </Button>
269
+ </DialogFooter>
270
+ </form>
271
+ </DialogContent>
272
+ </Dialog>
273
+ );
274
+ }
@@ -0,0 +1,48 @@
1
+ import { IconArrowLeft } from "@tabler/icons-react";
2
+ import { forwardRef, type ComponentPropsWithoutRef } from "react";
3
+
4
+ import { Button } from "../ui/button.js";
5
+ import { CommandInput } from "../ui/command.js";
6
+ import { useComposerRuntimeAdapters } from "./runtime-adapters.js";
7
+
8
+ export interface ComposerContextSearchInputProps extends Omit<
9
+ ComponentPropsWithoutRef<typeof CommandInput>,
10
+ "leading"
11
+ > {
12
+ onBack?: () => void;
13
+ }
14
+
15
+ export const ComposerContextSearchInput = forwardRef<
16
+ HTMLInputElement,
17
+ ComposerContextSearchInputProps
18
+ >(({ onBack, ...props }, ref) => {
19
+ const t = useComposerRuntimeAdapters().translate!;
20
+ return (
21
+ <CommandInput
22
+ {...props}
23
+ ref={ref}
24
+ leading={
25
+ onBack ? (
26
+ <Button
27
+ type="button"
28
+ variant="ghost"
29
+ size="icon"
30
+ className="-ms-2 size-8 shrink-0"
31
+ aria-label={t("agentChat.composer.contextBack", {
32
+ defaultValue: "Back",
33
+ })}
34
+ onKeyDown={(event) => {
35
+ // Keep cmdk from activating the selected row on native button keys.
36
+ if (event.key === "Enter" || event.key === " ")
37
+ event.stopPropagation();
38
+ }}
39
+ onClick={onBack}
40
+ >
41
+ <IconArrowLeft />
42
+ </Button>
43
+ ) : undefined
44
+ }
45
+ />
46
+ );
47
+ });
48
+ ComposerContextSearchInput.displayName = "ComposerContextSearchInput";