@agent-native/core 0.19.1 → 0.20.0

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 (167) hide show
  1. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  2. package/dist/agent/engine/builder-engine.js +12 -1
  3. package/dist/agent/engine/builder-engine.js.map +1 -1
  4. package/dist/agent/production-agent.d.ts.map +1 -1
  5. package/dist/agent/production-agent.js +5 -0
  6. package/dist/agent/production-agent.js.map +1 -1
  7. package/dist/agent/thread-data-builder.d.ts +17 -0
  8. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  9. package/dist/agent/thread-data-builder.js +210 -0
  10. package/dist/agent/thread-data-builder.js.map +1 -1
  11. package/dist/cli/code-agent-executor.d.ts +2 -0
  12. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  13. package/dist/cli/code-agent-executor.js +39 -1
  14. package/dist/cli/code-agent-executor.js.map +1 -1
  15. package/dist/cli/code-agent-runs.d.ts +3 -0
  16. package/dist/cli/code-agent-runs.d.ts.map +1 -1
  17. package/dist/cli/code-agent-runs.js +3 -0
  18. package/dist/cli/code-agent-runs.js.map +1 -1
  19. package/dist/cli/connect.d.ts +3 -2
  20. package/dist/cli/connect.d.ts.map +1 -1
  21. package/dist/cli/connect.js +12 -8
  22. package/dist/cli/connect.js.map +1 -1
  23. package/dist/cli/mcp-config-writers.d.ts +3 -3
  24. package/dist/cli/mcp-config-writers.d.ts.map +1 -1
  25. package/dist/cli/mcp-config-writers.js +19 -8
  26. package/dist/cli/mcp-config-writers.js.map +1 -1
  27. package/dist/client/AgentPanel.d.ts.map +1 -1
  28. package/dist/client/AgentPanel.js +8 -3
  29. package/dist/client/AgentPanel.js.map +1 -1
  30. package/dist/client/AssistantChat.d.ts +58 -0
  31. package/dist/client/AssistantChat.d.ts.map +1 -1
  32. package/dist/client/AssistantChat.js +122 -50
  33. package/dist/client/AssistantChat.js.map +1 -1
  34. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  35. package/dist/client/agent-chat-adapter.js +172 -13
  36. package/dist/client/agent-chat-adapter.js.map +1 -1
  37. package/dist/client/agent-sidebar-state.d.ts +2 -0
  38. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  39. package/dist/client/agent-sidebar-state.js +32 -0
  40. package/dist/client/agent-sidebar-state.js.map +1 -1
  41. package/dist/client/code-agent-chat-adapter.d.ts +81 -0
  42. package/dist/client/code-agent-chat-adapter.d.ts.map +1 -0
  43. package/dist/client/code-agent-chat-adapter.js +297 -0
  44. package/dist/client/code-agent-chat-adapter.js.map +1 -0
  45. package/dist/client/composer/PromptComposer.d.ts +11 -0
  46. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  47. package/dist/client/composer/PromptComposer.js +7 -3
  48. package/dist/client/composer/PromptComposer.js.map +1 -1
  49. package/dist/client/composer/TiptapComposer.d.ts +12 -1
  50. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  51. package/dist/client/composer/TiptapComposer.js +16 -7
  52. package/dist/client/composer/TiptapComposer.js.map +1 -1
  53. package/dist/client/composer/index.d.ts +1 -0
  54. package/dist/client/composer/index.d.ts.map +1 -1
  55. package/dist/client/composer/index.js +1 -0
  56. package/dist/client/composer/index.js.map +1 -1
  57. package/dist/client/composer/prompt-attachments.d.ts +11 -0
  58. package/dist/client/composer/prompt-attachments.d.ts.map +1 -0
  59. package/dist/client/composer/prompt-attachments.js +45 -0
  60. package/dist/client/composer/prompt-attachments.js.map +1 -0
  61. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  62. package/dist/client/conversation/AgentConversation.js +124 -1
  63. package/dist/client/conversation/AgentConversation.js.map +1 -1
  64. package/dist/client/conversation/code-agent-transcript.d.ts +25 -0
  65. package/dist/client/conversation/code-agent-transcript.d.ts.map +1 -0
  66. package/dist/client/conversation/code-agent-transcript.js +200 -0
  67. package/dist/client/conversation/code-agent-transcript.js.map +1 -0
  68. package/dist/client/conversation/index.d.ts +2 -1
  69. package/dist/client/conversation/index.d.ts.map +1 -1
  70. package/dist/client/conversation/index.js +1 -0
  71. package/dist/client/conversation/index.js.map +1 -1
  72. package/dist/client/conversation/types.d.ts +8 -0
  73. package/dist/client/conversation/types.d.ts.map +1 -1
  74. package/dist/client/conversation/types.js.map +1 -1
  75. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -1
  76. package/dist/client/conversation/use-near-bottom-autoscroll.js +26 -9
  77. package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -1
  78. package/dist/client/index.d.ts +5 -2
  79. package/dist/client/index.d.ts.map +1 -1
  80. package/dist/client/index.js +5 -2
  81. package/dist/client/index.js.map +1 -1
  82. package/dist/client/settings/useBuilderStatus.d.ts +2 -0
  83. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  84. package/dist/client/settings/useBuilderStatus.js +21 -3
  85. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  86. package/dist/client/settings/useBuilderStatus.spec.js +16 -2
  87. package/dist/client/settings/useBuilderStatus.spec.js.map +1 -1
  88. package/dist/client/sse-event-processor.d.ts.map +1 -1
  89. package/dist/client/sse-event-processor.js +3 -0
  90. package/dist/client/sse-event-processor.js.map +1 -1
  91. package/dist/client/use-chat-models.d.ts +6 -1
  92. package/dist/client/use-chat-models.d.ts.map +1 -1
  93. package/dist/client/use-chat-models.js +7 -3
  94. package/dist/client/use-chat-models.js.map +1 -1
  95. package/dist/client/use-chat-models.spec.d.ts +2 -0
  96. package/dist/client/use-chat-models.spec.d.ts.map +1 -0
  97. package/dist/client/use-chat-models.spec.js +39 -0
  98. package/dist/client/use-chat-models.spec.js.map +1 -0
  99. package/dist/code-agents/background-controller.d.ts.map +1 -1
  100. package/dist/code-agents/background-controller.js +16 -0
  101. package/dist/code-agents/background-controller.js.map +1 -1
  102. package/dist/code-agents/index.d.ts +2 -0
  103. package/dist/code-agents/index.d.ts.map +1 -1
  104. package/dist/code-agents/index.js +2 -0
  105. package/dist/code-agents/index.js.map +1 -1
  106. package/dist/code-agents/prompt-attachments.d.ts +11 -0
  107. package/dist/code-agents/prompt-attachments.d.ts.map +1 -0
  108. package/dist/code-agents/prompt-attachments.js +23 -0
  109. package/dist/code-agents/prompt-attachments.js.map +1 -0
  110. package/dist/code-agents/transcript-normalizer.js +14 -5
  111. package/dist/code-agents/transcript-normalizer.js.map +1 -1
  112. package/dist/code-agents/transcript-order.d.ts +16 -0
  113. package/dist/code-agents/transcript-order.d.ts.map +1 -0
  114. package/dist/code-agents/transcript-order.js +47 -0
  115. package/dist/code-agents/transcript-order.js.map +1 -0
  116. package/dist/extensions/routes.d.ts.map +1 -1
  117. package/dist/extensions/routes.js +18 -14
  118. package/dist/extensions/routes.js.map +1 -1
  119. package/dist/mcp/build-server.d.ts +33 -1
  120. package/dist/mcp/build-server.d.ts.map +1 -1
  121. package/dist/mcp/build-server.js +39 -12
  122. package/dist/mcp/build-server.js.map +1 -1
  123. package/dist/mcp/builtin-tools.d.ts +3 -1
  124. package/dist/mcp/builtin-tools.d.ts.map +1 -1
  125. package/dist/mcp/builtin-tools.js +40 -10
  126. package/dist/mcp/builtin-tools.js.map +1 -1
  127. package/dist/mcp/connect-route.d.ts.map +1 -1
  128. package/dist/mcp/connect-route.js +299 -97
  129. package/dist/mcp/connect-route.js.map +1 -1
  130. package/dist/mcp/server.d.ts.map +1 -1
  131. package/dist/mcp/server.js +17 -3
  132. package/dist/mcp/server.js.map +1 -1
  133. package/dist/secrets/substitution.d.ts +18 -0
  134. package/dist/secrets/substitution.d.ts.map +1 -1
  135. package/dist/secrets/substitution.js +74 -0
  136. package/dist/secrets/substitution.js.map +1 -1
  137. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  138. package/dist/server/agent-chat-plugin.js +33 -0
  139. package/dist/server/agent-chat-plugin.js.map +1 -1
  140. package/dist/server/auth.d.ts +8 -0
  141. package/dist/server/auth.d.ts.map +1 -1
  142. package/dist/server/auth.js +8 -1
  143. package/dist/server/auth.js.map +1 -1
  144. package/dist/server/deep-link.d.ts +0 -18
  145. package/dist/server/deep-link.d.ts.map +1 -1
  146. package/dist/server/deep-link.js +2 -1
  147. package/dist/server/deep-link.js.map +1 -1
  148. package/dist/server/open-route.d.ts.map +1 -1
  149. package/dist/server/open-route.js +23 -4
  150. package/dist/server/open-route.js.map +1 -1
  151. package/dist/shared/agent-sidebar-url.d.ts +6 -0
  152. package/dist/shared/agent-sidebar-url.d.ts.map +1 -0
  153. package/dist/shared/agent-sidebar-url.js +37 -0
  154. package/dist/shared/agent-sidebar-url.js.map +1 -0
  155. package/dist/shared/index.d.ts +1 -0
  156. package/dist/shared/index.d.ts.map +1 -1
  157. package/dist/shared/index.js +1 -0
  158. package/dist/shared/index.js.map +1 -1
  159. package/dist/styles/agent-conversation.css +403 -0
  160. package/dist/styles/agent-native.css +2 -0
  161. package/dist/vite/client.d.ts.map +1 -1
  162. package/dist/vite/client.js +1 -0
  163. package/dist/vite/client.js.map +1 -1
  164. package/docs/content/external-agents.md +27 -6
  165. package/docs/content/mcp-clients.md +2 -0
  166. package/docs/content/mcp-protocol.md +4 -2
  167. package/package.json +1 -1
@@ -0,0 +1,81 @@
1
+ import type { ChatModelAdapter } from "@assistant-ui/react";
2
+ import type { ReasoningEffort } from "../shared/reasoning-effort.js";
3
+ import { type CodeAgentRunStateLike } from "../code-agents/transcript-order.js";
4
+ import { type CodeAgentTranscriptEvent as CoreCodeAgentTranscriptEvent } from "../code-agents/transcript-normalizer.js";
5
+ import type { ContentPart } from "./sse-event-processor.js";
6
+ export type CodeAgentChatFollowUpMode = "immediate" | "queued";
7
+ export interface CodeAgentChatTranscriptEvent {
8
+ id: string;
9
+ runId: string;
10
+ kind?: CoreCodeAgentTranscriptEvent["kind"];
11
+ type?: CoreCodeAgentTranscriptEvent["kind"] | "note";
12
+ message?: string;
13
+ text?: string;
14
+ createdAt: string;
15
+ metadata?: Record<string, unknown>;
16
+ artifactPath?: string;
17
+ artifactUrl?: string;
18
+ }
19
+ export interface CodeAgentChatControlResult {
20
+ ok: boolean;
21
+ run?: CodeAgentRunStateLike | null;
22
+ queued?: boolean;
23
+ message?: string;
24
+ error?: string;
25
+ }
26
+ export interface CodeAgentChatController {
27
+ get(runId: string): Promise<CodeAgentRunStateLike | null>;
28
+ transcript(runId: string): Promise<CodeAgentChatTranscriptEvent[]>;
29
+ sendFollowUp(input: {
30
+ runId: string;
31
+ prompt: string;
32
+ mode?: CodeAgentChatFollowUpMode;
33
+ permissionMode?: string;
34
+ engine?: string;
35
+ model?: string;
36
+ reasoningEffort?: ReasoningEffort;
37
+ source?: string;
38
+ metadata?: Record<string, unknown>;
39
+ }): Promise<CodeAgentChatControlResult>;
40
+ control(input: {
41
+ runId: string;
42
+ command: "stop";
43
+ }): Promise<CodeAgentChatControlResult>;
44
+ }
45
+ export interface CreateCodeAgentChatAdapterOptions {
46
+ controller: CodeAgentChatController;
47
+ runIdRef: {
48
+ current: string | null;
49
+ };
50
+ permissionModeRef?: {
51
+ current: string | undefined;
52
+ };
53
+ modelRef?: {
54
+ current: string | undefined;
55
+ };
56
+ engineRef?: {
57
+ current: string | undefined;
58
+ };
59
+ effortRef?: {
60
+ current: ReasoningEffort | undefined;
61
+ };
62
+ followUpModeRef?: {
63
+ current: CodeAgentChatFollowUpMode | undefined;
64
+ };
65
+ attachOnlyRef?: {
66
+ current: boolean;
67
+ };
68
+ tabId?: string;
69
+ pollIntervalMs?: number;
70
+ idlePollIntervalMs?: number;
71
+ terminalIdlePolls?: number;
72
+ /**
73
+ * Assistant-ui may abort a run for UI lifecycle reasons, such as switching
74
+ * selected sessions. Code sessions keep running unless the host sends an
75
+ * explicit stop command.
76
+ */
77
+ stopOnAbort?: boolean;
78
+ }
79
+ export declare function createCodeAgentChatAdapter(options: CreateCodeAgentChatAdapterOptions): ChatModelAdapter;
80
+ export declare function codeAgentTranscriptEventsToContent(events: readonly CodeAgentChatTranscriptEvent[]): ContentPart[];
81
+ //# sourceMappingURL=code-agent-chat-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-agent-chat-adapter.d.ts","sourceRoot":"","sources":["../../src/client/code-agent-chat-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,297 @@
1
+ import { unwrapAttachmentEnvelope } from "./composer/pasted-text.js";
2
+ import { compareCodeAgentTranscriptEvents, isCodeAgentRunActive, } from "../code-agents/transcript-order.js";
3
+ import { normalizeCodeAgentTranscript, } from "../code-agents/transcript-normalizer.js";
4
+ export function createCodeAgentChatAdapter(options) {
5
+ const pollIntervalMs = options.pollIntervalMs ?? 1000;
6
+ const idlePollIntervalMs = options.idlePollIntervalMs ?? 5000;
7
+ const terminalIdlePolls = options.terminalIdlePolls ?? 3;
8
+ const stopOnAbort = options.stopOnAbort === true;
9
+ return {
10
+ async *run({ messages, abortSignal }) {
11
+ const runId = options.runIdRef.current;
12
+ if (!runId) {
13
+ yield errorResult("Select an Agent-Native Code session first.");
14
+ return;
15
+ }
16
+ const lastUserMessage = latestUserMessage(messages);
17
+ const attachments = lastUserMessage
18
+ ? extractPromptAttachmentsFromAssistantMessage(lastUserMessage)
19
+ : [];
20
+ const prompt = latestUserText(messages).trim() ||
21
+ (attachments.length > 0 ? "Use the attached context." : "");
22
+ if (!prompt.trim()) {
23
+ yield errorResult("Enter a follow-up prompt.");
24
+ return;
25
+ }
26
+ let stoppedFromAbort = false;
27
+ const stopForAbort = () => {
28
+ stoppedFromAbort = true;
29
+ if (stopOnAbort) {
30
+ void options.controller.control({ runId, command: "stop" });
31
+ }
32
+ };
33
+ if (abortSignal.aborted) {
34
+ stopForAbort();
35
+ return;
36
+ }
37
+ abortSignal.addEventListener("abort", stopForAbort, { once: true });
38
+ try {
39
+ const initialEvents = await options.controller.transcript(runId);
40
+ const seenEventIds = new Set(initialEvents.map((event) => event.id));
41
+ const tailedEvents = [];
42
+ if (!options.attachOnlyRef?.current) {
43
+ const beforeSendRun = await options.controller.get(runId);
44
+ const response = await options.controller.sendFollowUp({
45
+ runId,
46
+ prompt,
47
+ mode: options.followUpModeRef?.current ??
48
+ (beforeSendRun && isCodeAgentRunActive(beforeSendRun)
49
+ ? "queued"
50
+ : "immediate"),
51
+ permissionMode: options.permissionModeRef?.current,
52
+ engine: options.engineRef?.current,
53
+ model: options.modelRef?.current,
54
+ reasoningEffort: options.effortRef?.current,
55
+ source: "code-agent-chat",
56
+ metadata: attachments.length > 0 ? { attachments } : undefined,
57
+ });
58
+ if (!response.ok) {
59
+ yield errorResult(response.error ?? response.message ?? "Could not send follow-up.", runId);
60
+ return;
61
+ }
62
+ }
63
+ let yieldedContent = false;
64
+ let idleTerminalPolls = 0;
65
+ while (!abortSignal.aborted) {
66
+ const [events, run] = await Promise.all([
67
+ options.controller.transcript(runId),
68
+ options.controller.get(runId),
69
+ ]);
70
+ const nextEvents = events
71
+ .filter((event) => !seenEventIds.has(event.id))
72
+ .sort(compareCodeAgentTranscriptEvents);
73
+ for (const event of nextEvents) {
74
+ seenEventIds.add(event.id);
75
+ tailedEvents.push(event);
76
+ }
77
+ const content = codeAgentTranscriptEventsToContent(tailedEvents);
78
+ if (content.length > 0 && nextEvents.length > 0) {
79
+ yieldedContent = true;
80
+ yield withRunMetadata({ content: [...content] }, runId);
81
+ }
82
+ if (run && isCodeAgentRunActive(run)) {
83
+ idleTerminalPolls = 0;
84
+ }
85
+ else if (nextEvents.length === 0) {
86
+ idleTerminalPolls += 1;
87
+ }
88
+ else {
89
+ idleTerminalPolls = 0;
90
+ }
91
+ if (idleTerminalPolls >= terminalIdlePolls) {
92
+ if (content.length > 0 && !yieldedContent) {
93
+ yield withRunMetadata({ content: [...content] }, runId);
94
+ }
95
+ return;
96
+ }
97
+ await sleep(run && isCodeAgentRunActive(run)
98
+ ? pollIntervalMs
99
+ : idlePollIntervalMs, abortSignal);
100
+ }
101
+ }
102
+ finally {
103
+ abortSignal.removeEventListener("abort", stopForAbort);
104
+ if (stoppedFromAbort) {
105
+ return;
106
+ }
107
+ }
108
+ },
109
+ };
110
+ }
111
+ export function codeAgentTranscriptEventsToContent(events) {
112
+ const normalized = normalizeCodeAgentTranscript(events.map(toCoreCodeAgentTranscriptEvent));
113
+ const content = [];
114
+ const appendText = (text) => {
115
+ const trimmed = text.trim();
116
+ if (!trimmed)
117
+ return;
118
+ const last = content.at(-1);
119
+ if (last?.type === "text") {
120
+ last.text = `${last.text}${last.text ? "\n\n" : ""}${trimmed}`;
121
+ }
122
+ else {
123
+ content.push({ type: "text", text: trimmed });
124
+ }
125
+ };
126
+ for (const item of normalized.items) {
127
+ const part = contentPartForCodeAgentTranscriptItem(item);
128
+ if (!part)
129
+ continue;
130
+ if (part.type === "text") {
131
+ appendText(part.text);
132
+ }
133
+ else {
134
+ content.push(part);
135
+ }
136
+ }
137
+ return content;
138
+ }
139
+ function latestUserMessage(messages) {
140
+ for (let index = messages.length - 1; index >= 0; index--) {
141
+ const message = messages[index];
142
+ if (message.role === "user")
143
+ return message;
144
+ }
145
+ return undefined;
146
+ }
147
+ function latestUserText(messages) {
148
+ const message = latestUserMessage(messages);
149
+ return (message?.content
150
+ .filter((part) => part.type === "text")
151
+ .map((part) => part.text)
152
+ .join("\n") ?? "");
153
+ }
154
+ function extractPromptAttachmentsFromAssistantMessage(message) {
155
+ const attachments = [];
156
+ for (const att of message.attachments ?? []) {
157
+ const name = att.name ?? "attachment";
158
+ for (const part of att.content ?? []) {
159
+ if (part.type === "image" && typeof part.image === "string") {
160
+ attachments.push({
161
+ name,
162
+ type: att.contentType,
163
+ dataUrl: part.image,
164
+ });
165
+ }
166
+ else if (part.type === "file" && typeof part.data === "string") {
167
+ attachments.push({
168
+ name,
169
+ type: att.contentType ??
170
+ (typeof part.mimeType === "string" ? part.mimeType : undefined),
171
+ ...(part.data.startsWith("data:")
172
+ ? { dataUrl: part.data }
173
+ : { text: part.data }),
174
+ });
175
+ }
176
+ else if (part.type === "text" && typeof part.text === "string") {
177
+ attachments.push({
178
+ name,
179
+ type: att.contentType,
180
+ text: unwrapAttachmentEnvelope(part.text),
181
+ });
182
+ }
183
+ }
184
+ }
185
+ return attachments;
186
+ }
187
+ function toCoreCodeAgentTranscriptEvent(event) {
188
+ return {
189
+ schemaVersion: 1,
190
+ id: event.id,
191
+ runId: event.runId,
192
+ kind: (event.kind ??
193
+ event.type ??
194
+ "status"),
195
+ message: event.message ?? event.text ?? "",
196
+ createdAt: event.createdAt,
197
+ metadata: {
198
+ ...(event.metadata ?? {}),
199
+ ...(event.artifactPath ? { artifactPath: event.artifactPath } : {}),
200
+ ...(event.artifactUrl ? { artifactUrl: event.artifactUrl } : {}),
201
+ },
202
+ };
203
+ }
204
+ function contentPartForCodeAgentTranscriptItem(item) {
205
+ if (item.type === "assistant") {
206
+ return item.text.trim() ? { type: "text", text: item.text.trim() } : null;
207
+ }
208
+ if (item.type === "tool") {
209
+ return toolContentPartForCodeAgentTranscriptItem(item);
210
+ }
211
+ if (item.type === "status") {
212
+ const text = statusTextForCodeAgentTranscriptItem(item);
213
+ return text ? { type: "text", text } : null;
214
+ }
215
+ return null;
216
+ }
217
+ function toolContentPartForCodeAgentTranscriptItem(item) {
218
+ return {
219
+ type: "tool-call",
220
+ toolCallId: `code-tool-${item.id}`,
221
+ toolName: item.tool ?? item.label ?? "code-agent",
222
+ argsText: previewValue(item.input) ?? "",
223
+ args: recordArgs(item.input),
224
+ ...(item.result !== undefined
225
+ ? { result: previewValue(item.result) ?? "" }
226
+ : {}),
227
+ };
228
+ }
229
+ function statusTextForCodeAgentTranscriptItem(item) {
230
+ if (item.statusKind === "artifact") {
231
+ const event = item.events[0];
232
+ const path = stringMetadata(event?.metadata, "artifactPath") ??
233
+ stringMetadata(event?.metadata, "path");
234
+ const url = stringMetadata(event?.metadata, "artifactUrl");
235
+ const target = url ?? path;
236
+ return target
237
+ ? `Artifact: ${item.text}\n${target}`
238
+ : `Artifact: ${item.text}`;
239
+ }
240
+ if (item.level === "info" && item.statusKind !== "note")
241
+ return null;
242
+ return item.text;
243
+ }
244
+ function recordArgs(value) {
245
+ if (!value || typeof value !== "object" || Array.isArray(value))
246
+ return {};
247
+ const result = {};
248
+ for (const [key, entry] of Object.entries(value)) {
249
+ result[key] =
250
+ typeof entry === "string" ? entry : (previewValue(entry) ?? "");
251
+ }
252
+ return result;
253
+ }
254
+ function previewValue(value) {
255
+ if (value === undefined || value === null)
256
+ return undefined;
257
+ const text = typeof value === "string" ? value : (JSON.stringify(value, null, 2) ?? "");
258
+ const trimmed = text.trim();
259
+ if (!trimmed)
260
+ return undefined;
261
+ return trimmed.length > 4000 ? `${trimmed.slice(0, 4000)}\n...` : trimmed;
262
+ }
263
+ function stringMetadata(metadata, key) {
264
+ const value = metadata?.[key];
265
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
266
+ }
267
+ function withRunMetadata(result, runId) {
268
+ const metadata = (result.metadata ?? {});
269
+ const custom = metadata.custom && typeof metadata.custom === "object"
270
+ ? metadata.custom
271
+ : {};
272
+ return {
273
+ ...result,
274
+ metadata: {
275
+ ...metadata,
276
+ custom: { ...custom, runId },
277
+ },
278
+ };
279
+ }
280
+ function errorResult(message, runId) {
281
+ return withRunMetadata({
282
+ content: [{ type: "text", text: message }],
283
+ status: { type: "incomplete", reason: "error" },
284
+ }, runId ?? "code-agent");
285
+ }
286
+ function sleep(ms, abortSignal) {
287
+ if (abortSignal.aborted)
288
+ return Promise.resolve();
289
+ return new Promise((resolve) => {
290
+ const timeout = setTimeout(resolve, ms);
291
+ abortSignal.addEventListener("abort", () => {
292
+ clearTimeout(timeout);
293
+ resolve();
294
+ }, { once: true });
295
+ });
296
+ }
297
+ //# sourceMappingURL=code-agent-chat-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-agent-chat-adapter.js","sourceRoot":"","sources":["../../src/client/code-agent-chat-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ChatModelAdapter,\n ChatModelRunOptions,\n ChatModelRunResult,\n} from \"@assistant-ui/react\";\nimport { unwrapAttachmentEnvelope } from \"./composer/pasted-text.js\";\nimport type { AgentPromptAttachment } from \"./composer/prompt-attachments.js\";\nimport type { ReasoningEffort } from \"../shared/reasoning-effort.js\";\nimport {\n compareCodeAgentTranscriptEvents,\n isCodeAgentRunActive,\n type CodeAgentRunStateLike,\n} from \"../code-agents/transcript-order.js\";\nimport {\n normalizeCodeAgentTranscript,\n type CodeAgentTranscriptEvent as CoreCodeAgentTranscriptEvent,\n type NormalizedCodeAgentStatusEvent,\n type NormalizedCodeAgentToolEvent,\n type NormalizedCodeAgentTranscriptItem,\n} from \"../code-agents/transcript-normalizer.js\";\nimport type { ContentPart } from \"./sse-event-processor.js\";\n\nexport type CodeAgentChatFollowUpMode = \"immediate\" | \"queued\";\n\nexport interface CodeAgentChatTranscriptEvent {\n id: string;\n runId: string;\n kind?: CoreCodeAgentTranscriptEvent[\"kind\"];\n type?: CoreCodeAgentTranscriptEvent[\"kind\"] | \"note\";\n message?: string;\n text?: string;\n createdAt: string;\n metadata?: Record<string, unknown>;\n artifactPath?: string;\n artifactUrl?: string;\n}\n\nexport interface CodeAgentChatControlResult {\n ok: boolean;\n run?: CodeAgentRunStateLike | null;\n queued?: boolean;\n message?: string;\n error?: string;\n}\n\nexport interface CodeAgentChatController {\n get(runId: string): Promise<CodeAgentRunStateLike | null>;\n transcript(runId: string): Promise<CodeAgentChatTranscriptEvent[]>;\n sendFollowUp(input: {\n runId: string;\n prompt: string;\n mode?: CodeAgentChatFollowUpMode;\n permissionMode?: string;\n engine?: string;\n model?: string;\n reasoningEffort?: ReasoningEffort;\n source?: string;\n metadata?: Record<string, unknown>;\n }): Promise<CodeAgentChatControlResult>;\n control(input: {\n runId: string;\n command: \"stop\";\n }): Promise<CodeAgentChatControlResult>;\n}\n\nexport interface CreateCodeAgentChatAdapterOptions {\n controller: CodeAgentChatController;\n runIdRef: { current: string | null };\n permissionModeRef?: { current: string | undefined };\n modelRef?: { current: string | undefined };\n engineRef?: { current: string | undefined };\n effortRef?: { current: ReasoningEffort | undefined };\n followUpModeRef?: { current: CodeAgentChatFollowUpMode | undefined };\n attachOnlyRef?: { current: boolean };\n tabId?: string;\n pollIntervalMs?: number;\n idlePollIntervalMs?: number;\n terminalIdlePolls?: number;\n /**\n * Assistant-ui may abort a run for UI lifecycle reasons, such as switching\n * selected sessions. Code sessions keep running unless the host sends an\n * explicit stop command.\n */\n stopOnAbort?: boolean;\n}\n\ntype AssistantUiAttachment = {\n name?: string;\n contentType?: string;\n content?: readonly Record<string, unknown>[];\n};\n\nexport function createCodeAgentChatAdapter(\n options: CreateCodeAgentChatAdapterOptions,\n): ChatModelAdapter {\n const pollIntervalMs = options.pollIntervalMs ?? 1000;\n const idlePollIntervalMs = options.idlePollIntervalMs ?? 5000;\n const terminalIdlePolls = options.terminalIdlePolls ?? 3;\n const stopOnAbort = options.stopOnAbort === true;\n\n return {\n async *run({ messages, abortSignal }: ChatModelRunOptions) {\n const runId = options.runIdRef.current;\n if (!runId) {\n yield errorResult(\"Select an Agent-Native Code session first.\");\n return;\n }\n\n const lastUserMessage = latestUserMessage(messages);\n const attachments = lastUserMessage\n ? extractPromptAttachmentsFromAssistantMessage(lastUserMessage)\n : [];\n const prompt =\n latestUserText(messages).trim() ||\n (attachments.length > 0 ? \"Use the attached context.\" : \"\");\n if (!prompt.trim()) {\n yield errorResult(\"Enter a follow-up prompt.\");\n return;\n }\n\n let stoppedFromAbort = false;\n const stopForAbort = () => {\n stoppedFromAbort = true;\n if (stopOnAbort) {\n void options.controller.control({ runId, command: \"stop\" });\n }\n };\n if (abortSignal.aborted) {\n stopForAbort();\n return;\n }\n abortSignal.addEventListener(\"abort\", stopForAbort, { once: true });\n\n try {\n const initialEvents = await options.controller.transcript(runId);\n const seenEventIds = new Set(initialEvents.map((event) => event.id));\n const tailedEvents: CodeAgentChatTranscriptEvent[] = [];\n\n if (!options.attachOnlyRef?.current) {\n const beforeSendRun = await options.controller.get(runId);\n const response = await options.controller.sendFollowUp({\n runId,\n prompt,\n mode:\n options.followUpModeRef?.current ??\n (beforeSendRun && isCodeAgentRunActive(beforeSendRun)\n ? \"queued\"\n : \"immediate\"),\n permissionMode: options.permissionModeRef?.current,\n engine: options.engineRef?.current,\n model: options.modelRef?.current,\n reasoningEffort: options.effortRef?.current,\n source: \"code-agent-chat\",\n metadata: attachments.length > 0 ? { attachments } : undefined,\n });\n if (!response.ok) {\n yield errorResult(\n response.error ?? response.message ?? \"Could not send follow-up.\",\n runId,\n );\n return;\n }\n }\n\n let yieldedContent = false;\n let idleTerminalPolls = 0;\n while (!abortSignal.aborted) {\n const [events, run] = await Promise.all([\n options.controller.transcript(runId),\n options.controller.get(runId),\n ]);\n const nextEvents = events\n .filter((event) => !seenEventIds.has(event.id))\n .sort(compareCodeAgentTranscriptEvents);\n for (const event of nextEvents) {\n seenEventIds.add(event.id);\n tailedEvents.push(event);\n }\n\n const content = codeAgentTranscriptEventsToContent(tailedEvents);\n if (content.length > 0 && nextEvents.length > 0) {\n yieldedContent = true;\n yield withRunMetadata({ content: [...content] }, runId);\n }\n\n if (run && isCodeAgentRunActive(run)) {\n idleTerminalPolls = 0;\n } else if (nextEvents.length === 0) {\n idleTerminalPolls += 1;\n } else {\n idleTerminalPolls = 0;\n }\n\n if (idleTerminalPolls >= terminalIdlePolls) {\n if (content.length > 0 && !yieldedContent) {\n yield withRunMetadata({ content: [...content] }, runId);\n }\n return;\n }\n\n await sleep(\n run && isCodeAgentRunActive(run)\n ? pollIntervalMs\n : idlePollIntervalMs,\n abortSignal,\n );\n }\n } finally {\n abortSignal.removeEventListener(\"abort\", stopForAbort);\n if (stoppedFromAbort) {\n return;\n }\n }\n },\n };\n}\n\nexport function codeAgentTranscriptEventsToContent(\n events: readonly CodeAgentChatTranscriptEvent[],\n): ContentPart[] {\n const normalized = normalizeCodeAgentTranscript(\n events.map(toCoreCodeAgentTranscriptEvent),\n );\n const content: ContentPart[] = [];\n\n const appendText = (text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n const last = content.at(-1);\n if (last?.type === \"text\") {\n last.text = `${last.text}${last.text ? \"\\n\\n\" : \"\"}${trimmed}`;\n } else {\n content.push({ type: \"text\", text: trimmed });\n }\n };\n\n for (const item of normalized.items) {\n const part = contentPartForCodeAgentTranscriptItem(item);\n if (!part) continue;\n if (part.type === \"text\") {\n appendText(part.text);\n } else {\n content.push(part);\n }\n }\n\n return content;\n}\n\nfunction latestUserMessage(\n messages: ChatModelRunOptions[\"messages\"],\n): ChatModelRunOptions[\"messages\"][number] | undefined {\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index];\n if (message.role === \"user\") return message;\n }\n return undefined;\n}\n\nfunction latestUserText(messages: ChatModelRunOptions[\"messages\"]): string {\n const message = latestUserMessage(messages);\n return (\n message?.content\n .filter(\n (part): part is { type: \"text\"; text: string } => part.type === \"text\",\n )\n .map((part) => part.text)\n .join(\"\\n\") ?? \"\"\n );\n}\n\nfunction extractPromptAttachmentsFromAssistantMessage(message: {\n attachments?: readonly AssistantUiAttachment[];\n}): AgentPromptAttachment[] {\n const attachments: AgentPromptAttachment[] = [];\n for (const att of message.attachments ?? []) {\n const name = att.name ?? \"attachment\";\n for (const part of att.content ?? []) {\n if (part.type === \"image\" && typeof part.image === \"string\") {\n attachments.push({\n name,\n type: att.contentType,\n dataUrl: part.image,\n });\n } else if (part.type === \"file\" && typeof part.data === \"string\") {\n attachments.push({\n name,\n type:\n att.contentType ??\n (typeof part.mimeType === \"string\" ? part.mimeType : undefined),\n ...(part.data.startsWith(\"data:\")\n ? { dataUrl: part.data }\n : { text: part.data }),\n });\n } else if (part.type === \"text\" && typeof part.text === \"string\") {\n attachments.push({\n name,\n type: att.contentType,\n text: unwrapAttachmentEnvelope(part.text),\n });\n }\n }\n }\n return attachments;\n}\n\nfunction toCoreCodeAgentTranscriptEvent(\n event: CodeAgentChatTranscriptEvent,\n): CoreCodeAgentTranscriptEvent {\n return {\n schemaVersion: 1,\n id: event.id,\n runId: event.runId,\n kind: (event.kind ??\n event.type ??\n \"status\") as CoreCodeAgentTranscriptEvent[\"kind\"],\n message: event.message ?? event.text ?? \"\",\n createdAt: event.createdAt,\n metadata: {\n ...(event.metadata ?? {}),\n ...(event.artifactPath ? { artifactPath: event.artifactPath } : {}),\n ...(event.artifactUrl ? { artifactUrl: event.artifactUrl } : {}),\n },\n };\n}\n\nfunction contentPartForCodeAgentTranscriptItem(\n item: NormalizedCodeAgentTranscriptItem,\n): ContentPart | null {\n if (item.type === \"assistant\") {\n return item.text.trim() ? { type: \"text\", text: item.text.trim() } : null;\n }\n if (item.type === \"tool\") {\n return toolContentPartForCodeAgentTranscriptItem(item);\n }\n if (item.type === \"status\") {\n const text = statusTextForCodeAgentTranscriptItem(item);\n return text ? { type: \"text\", text } : null;\n }\n return null;\n}\n\nfunction toolContentPartForCodeAgentTranscriptItem(\n item: NormalizedCodeAgentToolEvent,\n): ContentPart {\n return {\n type: \"tool-call\",\n toolCallId: `code-tool-${item.id}`,\n toolName: item.tool ?? item.label ?? \"code-agent\",\n argsText: previewValue(item.input) ?? \"\",\n args: recordArgs(item.input),\n ...(item.result !== undefined\n ? { result: previewValue(item.result) ?? \"\" }\n : {}),\n };\n}\n\nfunction statusTextForCodeAgentTranscriptItem(\n item: NormalizedCodeAgentStatusEvent,\n): string | null {\n if (item.statusKind === \"artifact\") {\n const event = item.events[0];\n const path =\n stringMetadata(event?.metadata, \"artifactPath\") ??\n stringMetadata(event?.metadata, \"path\");\n const url = stringMetadata(event?.metadata, \"artifactUrl\");\n const target = url ?? path;\n return target\n ? `Artifact: ${item.text}\\n${target}`\n : `Artifact: ${item.text}`;\n }\n if (item.level === \"info\" && item.statusKind !== \"note\") return null;\n return item.text;\n}\n\nfunction recordArgs(value: unknown): Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n const result: Record<string, string> = {};\n for (const [key, entry] of Object.entries(value)) {\n result[key] =\n typeof entry === \"string\" ? entry : (previewValue(entry) ?? \"\");\n }\n return result;\n}\n\nfunction previewValue(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n const text =\n typeof value === \"string\" ? value : (JSON.stringify(value, null, 2) ?? \"\");\n const trimmed = text.trim();\n if (!trimmed) return undefined;\n return trimmed.length > 4000 ? `${trimmed.slice(0, 4000)}\\n...` : trimmed;\n}\n\nfunction stringMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const value = metadata?.[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction withRunMetadata(\n result: ChatModelRunResult,\n runId: string,\n): ChatModelRunResult {\n const metadata = (result.metadata ?? {}) as Record<string, unknown>;\n const custom =\n metadata.custom && typeof metadata.custom === \"object\"\n ? (metadata.custom as Record<string, unknown>)\n : {};\n return {\n ...result,\n metadata: {\n ...metadata,\n custom: { ...custom, runId },\n },\n };\n}\n\nfunction errorResult(message: string, runId?: string): ChatModelRunResult {\n return withRunMetadata(\n {\n content: [{ type: \"text\", text: message }],\n status: { type: \"incomplete\", reason: \"error\" },\n } as ChatModelRunResult,\n runId ?? \"code-agent\",\n );\n}\n\nfunction sleep(ms: number, abortSignal: AbortSignal): Promise<void> {\n if (abortSignal.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const timeout = setTimeout(resolve, ms);\n abortSignal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timeout);\n resolve();\n },\n { once: true },\n );\n });\n}\n"]}
@@ -71,8 +71,19 @@ export interface PromptComposerProps {
71
71
  selectedEffort?: ReasoningEffort;
72
72
  onModelChange?: (model: string, engine: string) => void;
73
73
  onEffortChange?: (effort: ReasoningEffort) => void;
74
+ /**
75
+ * Enable server-backed model/provider status checks. Defaults off when the
76
+ * host supplies model state and callbacks, otherwise on.
77
+ */
78
+ modelStatusChecksEnabled?: boolean;
74
79
  /** Called whenever the plain editor text changes. */
75
80
  onTextChange?: (text: string) => void;
81
+ /**
82
+ * Override the Builder.io connect action in the model picker. When provided,
83
+ * clicking "Connect Builder.io" calls this instead of opening a browser popup.
84
+ * Used by the Electron desktop app to route through the native IPC handler.
85
+ */
86
+ onConnectProvider?: () => void;
76
87
  /** Imperative handle for focusing the composer. */
77
88
  composerRef?: Ref<TiptapComposerHandle>;
78
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PromptComposer.d.ts","sourceRoot":"","sources":["../../../src/client/composer/PromptComposer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PromptComposer.d.ts","sourceRoot":"","sources":["../../../src/client/composer/PromptComposer.tsx"],"names":[],"mappings":"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"}
@@ -186,10 +186,14 @@ function PromptAttachmentStrip() {
186
186
  return null;
187
187
  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))) }));
188
188
  }
189
- function PromptComposerInner({ onSubmit, placeholder, disabled, autoFocus, className, style, rootClassName, rootStyle, draftScope, preserveDraftOnSubmit = false, showModelSelector = true, voiceEnabled = true, attachmentsEnabled = true, plusMenuMode, initialText, initialTextKey, modeControl, toolbarSlot, actionButton, extraActionButton, layoutVariant, slashCommands, slashSkills, includeDefaultSlashCommands, includeDefaultSlashSkills, onSlashCommand, availableModels, selectedModel, selectedEngine, selectedEffort, onModelChange, onEffortChange, onTextChange, composerRef, }) {
189
+ function PromptComposerInner({ onSubmit, placeholder, disabled, autoFocus, className, style, rootClassName, rootStyle, draftScope, preserveDraftOnSubmit = false, showModelSelector = true, voiceEnabled = true, attachmentsEnabled = true, plusMenuMode, initialText, initialTextKey, modeControl, toolbarSlot, actionButton, extraActionButton, layoutVariant, slashCommands, slashSkills, includeDefaultSlashCommands, includeDefaultSlashSkills, onSlashCommand, availableModels, selectedModel, selectedEngine, selectedEffort, onModelChange, onEffortChange, modelStatusChecksEnabled, onTextChange, onConnectProvider, composerRef, }) {
190
190
  const localRef = useRef(null);
191
191
  const handleRef = composerRef ?? localRef;
192
- const models = useChatModels();
192
+ const hostManagedModels = Boolean(availableModels && selectedModel && onModelChange);
193
+ const resolvedModelStatusChecksEnabled = modelStatusChecksEnabled ?? !hostManagedModels;
194
+ const models = useChatModels({
195
+ enabled: showModelSelector && resolvedModelStatusChecksEnabled,
196
+ });
193
197
  const composerModel = showModelSelector
194
198
  ? (selectedModel ?? models.selectedModel)
195
199
  : undefined;
@@ -237,7 +241,7 @@ function PromptComposerInner({ onSubmit, placeholder, disabled, autoFocus, class
237
241
  effort: composerEffort,
238
242
  });
239
243
  }, [composerEffort, composerEngine, composerModel, onSubmit]);
240
- return (_jsxs(AgentComposerFrame, { className: cn("text-left", className), rootClassName: rootClassName, style: style, rootStyle: rootStyle, layoutVariant: layoutVariant, children: [_jsx(PromptAttachmentStrip, {}), _jsx(TiptapComposer, { focusRef: handleRef, disabled: disabled, placeholder: placeholder, initialText: initialText, initialTextKey: initialTextKey, onSubmit: handleSubmit, clearOnSubmit: !preserveDraftOnSubmit, plusMenuMode: plusMenuMode ?? (attachmentsEnabled ? "upload-only" : "hidden"), modeControl: modeControl, 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, selectedEffort: composerEffort, availableModels: composerModelGroups, onModelChange: handleModelChange, onEffortChange: handleEffortChange })] }));
244
+ return (_jsxs(AgentComposerFrame, { className: cn("text-left", className), rootClassName: rootClassName, style: style, rootStyle: rootStyle, layoutVariant: layoutVariant, children: [_jsx(PromptAttachmentStrip, {}), _jsx(TiptapComposer, { focusRef: handleRef, disabled: disabled, placeholder: placeholder, initialText: initialText, initialTextKey: initialTextKey, onSubmit: handleSubmit, clearOnSubmit: !preserveDraftOnSubmit, plusMenuMode: plusMenuMode ?? (attachmentsEnabled ? "upload-only" : "hidden"), modeControl: modeControl, 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, selectedEffort: composerEffort, availableModels: composerModelGroups, onModelChange: handleModelChange, onEffortChange: handleEffortChange, providerConnectStatusEnabled: resolvedModelStatusChecksEnabled, onConnectProvider: onConnectProvider })] }));
241
245
  }
242
246
  /**
243
247
  * Standalone composer that mirrors the agent sidebar's input experience —