@botbotgo/agent-harness 0.0.309 → 0.0.311

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 (195) hide show
  1. package/README.md +14 -0
  2. package/README.zh.md +14 -0
  3. package/dist/acp.d.ts +1 -116
  4. package/dist/acp.js +1 -310
  5. package/dist/api.d.ts +1 -1
  6. package/dist/api.js +1 -1
  7. package/dist/cli/chat-interactive.d.ts +24 -0
  8. package/dist/cli/chat-interactive.js +244 -0
  9. package/dist/cli/chat-rendering.d.ts +9 -0
  10. package/dist/cli/chat-rendering.js +102 -0
  11. package/dist/cli/chat-stream.d.ts +23 -0
  12. package/dist/cli/chat-stream.js +330 -0
  13. package/dist/cli/chat-ui.d.ts +20 -0
  14. package/dist/cli/chat-ui.js +198 -0
  15. package/dist/cli/chat-workspace.d.ts +15 -0
  16. package/dist/cli/chat-workspace.js +205 -0
  17. package/dist/cli/main.d.ts +52 -0
  18. package/dist/cli/main.js +323 -0
  19. package/dist/cli/managed-service-commands.d.ts +23 -0
  20. package/dist/cli/managed-service-commands.js +63 -0
  21. package/dist/cli/managed-service.d.ts +27 -0
  22. package/dist/cli/managed-service.js +61 -0
  23. package/dist/cli/options-init-chat.d.ts +16 -0
  24. package/dist/cli/options-init-chat.js +108 -0
  25. package/dist/cli/options-runtime.d.ts +27 -0
  26. package/dist/cli/options-runtime.js +158 -0
  27. package/dist/cli/options-serve.d.ts +24 -0
  28. package/dist/cli/options-serve.js +166 -0
  29. package/dist/cli/options.d.ts +5 -0
  30. package/dist/cli/options.js +47 -0
  31. package/dist/cli/process-guards.d.ts +14 -0
  32. package/dist/cli/process-guards.js +139 -0
  33. package/dist/cli/request-tree.d.ts +12 -0
  34. package/dist/cli/request-tree.js +296 -0
  35. package/dist/cli/runtime-commands.d.ts +15 -0
  36. package/dist/cli/runtime-commands.js +247 -0
  37. package/dist/cli/runtime-output.d.ts +5 -0
  38. package/dist/cli/runtime-output.js +124 -0
  39. package/dist/cli/server-commands.d.ts +36 -0
  40. package/dist/cli/server-commands.js +250 -0
  41. package/dist/cli/workspace.d.ts +6 -0
  42. package/dist/cli/workspace.js +71 -0
  43. package/dist/cli.d.ts +1 -77
  44. package/dist/cli.js +2 -3023
  45. package/dist/client/acp.d.ts +1 -50
  46. package/dist/client/acp.js +1 -219
  47. package/dist/client/in-process.d.ts +5 -5
  48. package/dist/client/index.d.ts +2 -2
  49. package/dist/client/index.js +1 -1
  50. package/dist/contracts/runtime-evaluation.d.ts +103 -0
  51. package/dist/contracts/runtime-evaluation.js +1 -0
  52. package/dist/contracts/runtime-memory.d.ts +162 -0
  53. package/dist/contracts/runtime-memory.js +1 -0
  54. package/dist/contracts/runtime-observability.d.ts +248 -0
  55. package/dist/contracts/runtime-observability.js +1 -0
  56. package/dist/contracts/runtime-requests.d.ts +342 -0
  57. package/dist/contracts/runtime-requests.js +1 -0
  58. package/dist/contracts/runtime-scheduling.d.ts +146 -0
  59. package/dist/contracts/runtime-scheduling.js +1 -0
  60. package/dist/contracts/runtime.d.ts +5 -1042
  61. package/dist/contracts/runtime.js +27 -1
  62. package/dist/flow/build-flow-graph.js +4 -875
  63. package/dist/flow/flow-graph-normalization.d.ts +56 -0
  64. package/dist/flow/flow-graph-normalization.js +214 -0
  65. package/dist/flow/flow-graph-runtime.d.ts +8 -0
  66. package/dist/flow/flow-graph-runtime.js +107 -0
  67. package/dist/flow/flow-graph-upstream.d.ts +18 -0
  68. package/dist/flow/flow-graph-upstream.js +498 -0
  69. package/dist/flow/types.d.ts +1 -1
  70. package/dist/index.d.ts +3 -3
  71. package/dist/index.js +1 -1
  72. package/dist/init-project.d.ts +1 -12
  73. package/dist/init-project.js +1 -651
  74. package/dist/{procedural → knowledge/procedural}/manager.d.ts +3 -3
  75. package/dist/{procedural → knowledge/procedural}/manager.js +6 -6
  76. package/dist/mcp.d.ts +2 -76
  77. package/dist/mcp.js +2 -428
  78. package/dist/package-version.d.ts +1 -1
  79. package/dist/package-version.js +1 -1
  80. package/dist/persistence/file-store.js +1 -1
  81. package/dist/persistence/sqlite-runtime.d.ts +19 -0
  82. package/dist/persistence/sqlite-runtime.js +86 -0
  83. package/dist/persistence/sqlite-store.js +11 -99
  84. package/dist/{request-events.d.ts → projections/request-events.d.ts} +1 -1
  85. package/dist/{upstream-events.js → projections/upstream-events.js} +1 -1
  86. package/dist/protocol/a2a/http-discovery.d.ts +39 -0
  87. package/dist/protocol/a2a/http-discovery.js +178 -0
  88. package/dist/protocol/a2a/http-rpc.d.ts +28 -0
  89. package/dist/protocol/a2a/http-rpc.js +623 -0
  90. package/dist/protocol/a2a/http.d.ts +72 -1
  91. package/dist/protocol/a2a/http.js +14 -1124
  92. package/dist/protocol/a2a/task-state.d.ts +29 -0
  93. package/dist/protocol/a2a/task-state.js +317 -0
  94. package/dist/protocol/acp/client.js +1 -1
  95. package/dist/protocol/acp/harness-client.d.ts +50 -0
  96. package/dist/protocol/acp/harness-client.js +219 -0
  97. package/dist/protocol/acp/server.d.ts +116 -0
  98. package/dist/protocol/acp/server.js +310 -0
  99. package/dist/protocol/ag-ui/http.js +1 -1
  100. package/dist/protocol/mcp/server.d.ts +76 -0
  101. package/dist/protocol/mcp/server.js +428 -0
  102. package/dist/resource/backend/workspace-scoped-backend.d.ts +40 -0
  103. package/dist/resource/backend/workspace-scoped-backend.js +296 -0
  104. package/dist/resource/mcp/tool-support.d.ts +35 -0
  105. package/dist/resource/mcp/tool-support.js +296 -0
  106. package/dist/resource/mcp-tool-support.d.ts +2 -35
  107. package/dist/resource/mcp-tool-support.js +2 -296
  108. package/dist/resource/providers/resource-provider.d.ts +22 -0
  109. package/dist/resource/providers/resource-provider.js +215 -0
  110. package/dist/resource/resource-impl.d.ts +3 -33
  111. package/dist/resource/resource-impl.js +2 -808
  112. package/dist/resource/resource-types.d.ts +33 -0
  113. package/dist/resource/resource-types.js +1 -0
  114. package/dist/resource/tools/function-tool-resolver.d.ts +2 -0
  115. package/dist/resource/tools/function-tool-resolver.js +306 -0
  116. package/dist/runtime/adapter/middleware-assembly.js +1 -1
  117. package/dist/runtime/adapter/model/invocation-request.js +2 -2
  118. package/dist/runtime/adapter/model/message-assembly.js +1 -1
  119. package/dist/runtime/agent-runtime-adapter.d.ts +3 -63
  120. package/dist/runtime/agent-runtime-adapter.js +7 -235
  121. package/dist/runtime/agent-runtime-assembly.d.ts +67 -0
  122. package/dist/runtime/agent-runtime-assembly.js +211 -0
  123. package/dist/runtime/harness/background-runtime.d.ts +1 -1
  124. package/dist/runtime/harness/events/event-sink.js +1 -1
  125. package/dist/runtime/harness/events/runtime-event-operations.d.ts +1 -1
  126. package/dist/runtime/harness/events/streaming.js +1 -1
  127. package/dist/runtime/harness/public-shapes.d.ts +43 -0
  128. package/dist/runtime/harness/public-shapes.js +186 -0
  129. package/dist/runtime/harness/run/inspection.js +2 -2
  130. package/dist/runtime/harness/run/resources.js +1 -1
  131. package/dist/runtime/harness/run/surface-semantics.js +1 -1
  132. package/dist/runtime/harness/system/inventory.d.ts +1 -1
  133. package/dist/runtime/harness/system/inventory.js +2 -2
  134. package/dist/runtime/harness/system/policy-engine.js +1 -1
  135. package/dist/runtime/harness/system/runtime-memory-manager.js +1 -1
  136. package/dist/runtime/harness/system/skill-requirements.d.ts +1 -1
  137. package/dist/runtime/harness/system/skill-requirements.js +1 -1
  138. package/dist/runtime/harness.d.ts +2 -2
  139. package/dist/runtime/harness.js +7 -191
  140. package/dist/runtime/maintenance/checkpoint-maintenance.js +1 -1
  141. package/dist/runtime/maintenance/runtime-record-maintenance.js +1 -1
  142. package/dist/runtime/parsing/output-content.d.ts +11 -0
  143. package/dist/runtime/parsing/output-content.js +442 -0
  144. package/dist/runtime/parsing/output-parsing.d.ts +3 -29
  145. package/dist/runtime/parsing/output-parsing.js +3 -806
  146. package/dist/runtime/parsing/output-recovery.d.ts +14 -0
  147. package/dist/runtime/parsing/output-recovery.js +288 -0
  148. package/dist/runtime/parsing/output-tool-args.d.ts +4 -0
  149. package/dist/runtime/parsing/output-tool-args.js +120 -0
  150. package/dist/runtime/support/runtime-factories.js +1 -1
  151. package/dist/scaffold/init-project.d.ts +12 -0
  152. package/dist/scaffold/init-project.js +651 -0
  153. package/dist/{extensions.d.ts → tooling/extensions.d.ts} +1 -1
  154. package/dist/{extensions.js → tooling/extensions.js} +3 -3
  155. package/dist/{tool-modules.d.ts → tooling/module-loader.d.ts} +1 -1
  156. package/dist/{tool-modules.js → tooling/module-loader.js} +2 -2
  157. package/dist/workspace/agent-binding-compiler.js +2 -2
  158. package/dist/workspace/compile.js +2 -2
  159. package/dist/workspace/object-loader-paths.d.ts +11 -0
  160. package/dist/workspace/object-loader-paths.js +75 -0
  161. package/dist/workspace/object-loader-readers.d.ts +21 -0
  162. package/dist/workspace/object-loader-readers.js +187 -0
  163. package/dist/workspace/object-loader.d.ts +0 -1
  164. package/dist/workspace/object-loader.js +6 -260
  165. package/dist/workspace/resource-compilers.js +1 -1
  166. package/dist/workspace/support/discovery.js +1 -1
  167. package/package.json +1 -1
  168. package/dist/runtime/adapter/index.d.ts +0 -13
  169. package/dist/runtime/adapter/index.js +0 -13
  170. package/dist/runtime/harness/index.d.ts +0 -19
  171. package/dist/runtime/harness/index.js +0 -19
  172. package/dist/runtime/maintenance/index.d.ts +0 -4
  173. package/dist/runtime/maintenance/index.js +0 -4
  174. package/dist/runtime/parsing/index.d.ts +0 -2
  175. package/dist/runtime/parsing/index.js +0 -2
  176. package/dist/runtime/support/index.d.ts +0 -4
  177. package/dist/runtime/support/index.js +0 -4
  178. package/dist/workspace/support/index.d.ts +0 -2
  179. package/dist/workspace/support/index.js +0 -2
  180. /package/dist/{procedural → knowledge/procedural}/config.d.ts +0 -0
  181. /package/dist/{procedural → knowledge/procedural}/config.js +0 -0
  182. /package/dist/{procedural → knowledge/procedural}/index.d.ts +0 -0
  183. /package/dist/{procedural → knowledge/procedural}/index.js +0 -0
  184. /package/dist/{presentation.d.ts → projections/presentation.d.ts} +0 -0
  185. /package/dist/{presentation.js → projections/presentation.js} +0 -0
  186. /package/dist/{request-events.js → projections/request-events.js} +0 -0
  187. /package/dist/{upstream-events.d.ts → projections/upstream-events.d.ts} +0 -0
  188. /package/dist/runtime/{support → env}/runtime-env.d.ts +0 -0
  189. /package/dist/runtime/{support → env}/runtime-env.js +0 -0
  190. /package/dist/runtime/{support → layout}/runtime-layout.d.ts +0 -0
  191. /package/dist/runtime/{support → layout}/runtime-layout.js +0 -0
  192. /package/dist/runtime/{support → prompts}/runtime-prompts.d.ts +0 -0
  193. /package/dist/runtime/{support → prompts}/runtime-prompts.js +0 -0
  194. /package/dist/runtime/{support → skills}/skill-metadata.d.ts +0 -0
  195. /package/dist/runtime/{support → skills}/skill-metadata.js +0 -0
@@ -0,0 +1,244 @@
1
+ import { streamChatMessage } from "./chat-stream.js";
2
+ import { renderChatContext, renderChatHelp, renderChatPromptLine, renderRequestEvents } from "./chat-ui.js";
3
+ import { normalizeChatCommand } from "./chat-workspace.js";
4
+ import { renderApprovalList, renderHealthSnapshot, renderOperatorOverview, renderRequestList } from "./runtime-output.js";
5
+ async function* iterateChatLines(lineReader, renderPrompt) {
6
+ lineReader.setPrompt(renderPrompt());
7
+ lineReader.prompt();
8
+ for await (const line of lineReader) {
9
+ yield line;
10
+ lineReader.setPrompt(renderPrompt());
11
+ lineReader.prompt();
12
+ }
13
+ }
14
+ function isObject(value) {
15
+ return typeof value === "object" && value !== null && !Array.isArray(value);
16
+ }
17
+ function formatTimestamp(value) {
18
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
19
+ }
20
+ function renderSessionSummaries(summaries) {
21
+ if (summaries.length === 0) {
22
+ return "No sessions found.\n";
23
+ }
24
+ return summaries.map((summary) => {
25
+ const sessionId = typeof summary.sessionId === "string" ? summary.sessionId : "unknown";
26
+ const agentId = typeof summary.currentAgentId === "string"
27
+ ? summary.currentAgentId
28
+ : typeof summary.entryAgentId === "string"
29
+ ? summary.entryAgentId
30
+ : "unknown";
31
+ const state = typeof summary.currentState === "string" ? summary.currentState : "unknown";
32
+ const messageCount = typeof summary.messageCount === "number" ? ` messages=${summary.messageCount}` : "";
33
+ const title = typeof summary.title === "string" ? ` title=${summary.title}` : "";
34
+ const snippet = typeof summary.snippet === "string" ? ` snippet=${summary.snippet}` : "";
35
+ return `${sessionId} agent=${agentId} state=${state}${messageCount}${title}${snippet}`;
36
+ }).join("\n") + "\n";
37
+ }
38
+ function renderRequestTraceItems(traceItems) {
39
+ if (traceItems.length === 0) {
40
+ return "No trace items recorded.\n";
41
+ }
42
+ return traceItems.map((item) => {
43
+ const surfaceItem = isObject(item.surfaceItem) ? item.surfaceItem : {};
44
+ const kind = typeof surfaceItem.kind === "string" ? surfaceItem.kind : "unknown";
45
+ const name = typeof surfaceItem.id === "string" ? surfaceItem.id : typeof surfaceItem.name === "string" ? surfaceItem.name : "unknown";
46
+ const agentId = typeof surfaceItem.agentId === "string" ? ` agent=${surfaceItem.agentId}` : "";
47
+ const status = typeof item.status === "string" ? ` status=${item.status}` : "";
48
+ return `${kind}:${name}${agentId}${status}`;
49
+ }).join("\n") + "\n";
50
+ }
51
+ export async function runInteractiveChatLoop(input) {
52
+ let activeAgentId = input.activeAgentId;
53
+ let activeSessionId = input.activeSessionId;
54
+ let latestRequestId;
55
+ try {
56
+ for await (const raw of iterateChatLines(input.lineReader, () => renderChatPromptLine({
57
+ agentId: activeAgentId,
58
+ sessionId: activeSessionId,
59
+ requestId: latestRequestId,
60
+ color: input.useColor,
61
+ }))) {
62
+ const trimmed = raw.trim();
63
+ if (!trimmed) {
64
+ continue;
65
+ }
66
+ const chatCommand = normalizeChatCommand(trimmed);
67
+ if (!chatCommand) {
68
+ const streamed = await streamChatMessage({
69
+ client: input.client,
70
+ stdout: input.stdout,
71
+ stdoutStream: input.stdoutStream,
72
+ stderr: input.stderr,
73
+ stderrStream: input.stderrStream,
74
+ agentId: activeAgentId,
75
+ sessionId: activeSessionId,
76
+ message: trimmed,
77
+ modelInfo: input.workspaceModelInfo,
78
+ requestEvents: input.requestEvents,
79
+ liveRequestTree: input.requestEvents && input.chatIsTty,
80
+ colorRequestTree: input.useColor,
81
+ showToolResults: input.requestEvents,
82
+ showRunningState: false,
83
+ });
84
+ activeSessionId = streamed.sessionId;
85
+ latestRequestId = streamed.requestId;
86
+ activeAgentId = streamed.agentId ?? activeAgentId;
87
+ continue;
88
+ }
89
+ if (chatCommand.name === "exit" || chatCommand.name === "quit") {
90
+ break;
91
+ }
92
+ if (chatCommand.name === "help") {
93
+ input.stdout(renderChatHelp());
94
+ continue;
95
+ }
96
+ if (chatCommand.name === "context") {
97
+ input.stdout(renderChatContext({
98
+ agentId: activeAgentId,
99
+ sessionId: activeSessionId,
100
+ requestId: latestRequestId,
101
+ }));
102
+ continue;
103
+ }
104
+ if (chatCommand.name === "new") {
105
+ activeSessionId = undefined;
106
+ latestRequestId = undefined;
107
+ input.stdout(renderChatContext({
108
+ agentId: activeAgentId,
109
+ sessionId: activeSessionId,
110
+ requestId: latestRequestId,
111
+ }));
112
+ continue;
113
+ }
114
+ if (chatCommand.name === "agent") {
115
+ if (!chatCommand.arg) {
116
+ input.stdout(activeAgentId ? `${activeAgentId}\n` : "No active agent override.\n");
117
+ continue;
118
+ }
119
+ activeAgentId = chatCommand.arg;
120
+ input.stdout(`agent=${activeAgentId}\n`);
121
+ continue;
122
+ }
123
+ if (chatCommand.name === "session") {
124
+ input.stdout(activeSessionId ? `${activeSessionId}\n` : "No active session.\n");
125
+ continue;
126
+ }
127
+ if (chatCommand.name === "request") {
128
+ if (!chatCommand.arg) {
129
+ input.stdout(latestRequestId ? `${latestRequestId}\n` : "No active request.\n");
130
+ continue;
131
+ }
132
+ const selected = await input.client.getRequest(chatCommand.arg);
133
+ if (!selected) {
134
+ input.stdout(`Request not found: ${chatCommand.arg}\n`);
135
+ continue;
136
+ }
137
+ latestRequestId = selected.requestId;
138
+ activeSessionId = selected.sessionId;
139
+ activeAgentId = selected.agentId;
140
+ input.stdout(`request=${latestRequestId} session=${activeSessionId}\n`);
141
+ continue;
142
+ }
143
+ if (chatCommand.name === "sessions") {
144
+ const summaries = await input.client.listSessionSummaries(input.agentFilter ? { agentId: input.agentFilter } : undefined);
145
+ input.stdout(renderSessionSummaries(summaries));
146
+ continue;
147
+ }
148
+ if (chatCommand.name === "requests") {
149
+ const requests = await input.client.listRequests(activeSessionId
150
+ ? { sessionId: activeSessionId }
151
+ : activeAgentId
152
+ ? { agentId: activeAgentId }
153
+ : undefined);
154
+ input.stdout(renderRequestList(requests));
155
+ continue;
156
+ }
157
+ if (chatCommand.name === "resume") {
158
+ if (!chatCommand.arg) {
159
+ input.stdout("Usage: /resume <sessionId>\n");
160
+ continue;
161
+ }
162
+ const session = await input.client.getSession(chatCommand.arg);
163
+ if (!session) {
164
+ input.stdout(`Session not found: ${chatCommand.arg}\n`);
165
+ continue;
166
+ }
167
+ activeSessionId = chatCommand.arg;
168
+ latestRequestId = session.latestRequestId;
169
+ activeAgentId = session.currentAgentId ?? session.entryAgentId ?? activeAgentId;
170
+ input.stdout(`session=${activeSessionId}\n`);
171
+ continue;
172
+ }
173
+ if (chatCommand.name === "cancel") {
174
+ if (!latestRequestId) {
175
+ input.stdout("No active request.\n");
176
+ continue;
177
+ }
178
+ const result = await input.client.cancelRequest({
179
+ requestId: latestRequestId,
180
+ reason: "Cancelled from chat CLI",
181
+ });
182
+ activeSessionId = result.sessionId;
183
+ latestRequestId = result.requestId;
184
+ input.stdout(`${result.state}: ${result.output}\n`);
185
+ continue;
186
+ }
187
+ if (chatCommand.name === "approvals") {
188
+ const approvals = await input.client.listApprovals(activeSessionId ? { sessionId: activeSessionId, status: "pending" } : { status: "pending" });
189
+ input.stdout(renderApprovalList(approvals));
190
+ continue;
191
+ }
192
+ if ((chatCommand.name === "approve" || chatCommand.name === "reject") && chatCommand.arg) {
193
+ const result = await input.client.resolveApproval({
194
+ approvalId: chatCommand.arg,
195
+ decision: chatCommand.name === "approve" ? "approve" : "reject",
196
+ ...(activeSessionId ? { sessionId: activeSessionId } : {}),
197
+ });
198
+ activeSessionId = result.sessionId;
199
+ latestRequestId = result.requestId;
200
+ input.stdout(`${result.state}: ${result.output}\n`);
201
+ continue;
202
+ }
203
+ if (chatCommand.name === "events") {
204
+ if (!activeSessionId || !latestRequestId) {
205
+ input.stdout("No active request.\n");
206
+ continue;
207
+ }
208
+ const events = await input.client.listRequestEvents({
209
+ sessionId: activeSessionId,
210
+ requestId: latestRequestId,
211
+ });
212
+ input.stdout(renderRequestEvents(events));
213
+ continue;
214
+ }
215
+ if (chatCommand.name === "trace") {
216
+ if (!activeSessionId || !latestRequestId) {
217
+ input.stdout("No active request.\n");
218
+ continue;
219
+ }
220
+ const traceItems = await input.client.listRequestTraceItems({
221
+ sessionId: activeSessionId,
222
+ requestId: latestRequestId,
223
+ });
224
+ input.stdout(renderRequestTraceItems(traceItems));
225
+ continue;
226
+ }
227
+ if (chatCommand.name === "health") {
228
+ const health = await input.client.getHealth();
229
+ input.stdout(renderHealthSnapshot(health, input.workspacePath));
230
+ continue;
231
+ }
232
+ if (chatCommand.name === "overview") {
233
+ const overview = await input.client.getOperatorOverview({ limit: 5 });
234
+ input.stdout(renderOperatorOverview(overview, input.workspacePath));
235
+ continue;
236
+ }
237
+ input.stdout("Unknown chat command. Use /help.\n");
238
+ }
239
+ }
240
+ finally {
241
+ input.lineReader.close();
242
+ }
243
+ return { activeAgentId, activeSessionId, latestRequestId };
244
+ }
@@ -0,0 +1,9 @@
1
+ import { type ChatWorkspaceModelInfo } from "./chat-workspace.js";
2
+ export declare function countRenderedLines(text: string): number;
3
+ export declare function renderChatTextChunk(text: string, modelInfo?: ChatWorkspaceModelInfo): string;
4
+ export declare function renderChatRequestRunning(input: {
5
+ sessionId?: string;
6
+ requestId?: string;
7
+ agentId?: string;
8
+ }): string;
9
+ export declare function summarizeChatToolResult(output: unknown, isError: boolean): string;
@@ -0,0 +1,102 @@
1
+ import { renderChatRuntimeFailure } from "./chat-workspace.js";
2
+ export function countRenderedLines(text) {
3
+ return text.replace(/\n$/, "").split("\n").length;
4
+ }
5
+ export function renderChatTextChunk(text, modelInfo) {
6
+ return renderChatRuntimeFailure(text, modelInfo);
7
+ }
8
+ export function renderChatRequestRunning(input) {
9
+ const parts = [
10
+ input.sessionId ? `session=${input.sessionId}` : undefined,
11
+ input.requestId ? `request=${input.requestId}` : undefined,
12
+ input.agentId ? `agent=${input.agentId}` : undefined,
13
+ "running: waiting for model output",
14
+ ].filter((part) => typeof part === "string" && part.length > 0);
15
+ return `\n${parts.join(" ")}\n`;
16
+ }
17
+ export function summarizeChatToolResult(output, isError) {
18
+ if (!isError) {
19
+ return "completed";
20
+ }
21
+ return summarizeChatToolError(output);
22
+ }
23
+ function summarizeChatToolError(output) {
24
+ if (typeof output === "string") {
25
+ const trimmed = output.trim();
26
+ return trimmed.length > 0 ? truncateChatToolPreview(trimmed, 240) : "failed";
27
+ }
28
+ if (typeof output === "number" || typeof output === "boolean") {
29
+ return String(output);
30
+ }
31
+ if (!output || typeof output !== "object") {
32
+ return "failed";
33
+ }
34
+ const typed = output;
35
+ const content = extractChatToolTextContent(output);
36
+ if (content && content.trim().length > 0) {
37
+ return truncateChatToolPreview(content.trim(), 240);
38
+ }
39
+ const summary = typeof typed.summary === "object" && typed.summary !== null ? typed.summary : undefined;
40
+ if (summary) {
41
+ return truncateChatToolPreview(JSON.stringify(summary, null, 2), 240);
42
+ }
43
+ return truncateChatToolPreview(JSON.stringify(output, null, 2), 240);
44
+ }
45
+ function truncateChatToolPreview(value, maxChars = 800) {
46
+ if (value.length <= maxChars) {
47
+ return value;
48
+ }
49
+ return `${value.slice(0, maxChars - 15)}\n...[truncated]`;
50
+ }
51
+ function extractChatToolTextContent(value) {
52
+ if (typeof value === "string") {
53
+ return value;
54
+ }
55
+ if (Array.isArray(value)) {
56
+ return value
57
+ .map((item) => extractChatToolTextContent(item))
58
+ .filter((item) => item.trim().length > 0)
59
+ .join("\n");
60
+ }
61
+ if (!value || typeof value !== "object") {
62
+ return "";
63
+ }
64
+ const typed = value;
65
+ if (typeof typed.text === "string") {
66
+ return typed.text;
67
+ }
68
+ if (typeof typed.content === "string") {
69
+ return typed.content;
70
+ }
71
+ if (typed.content !== undefined) {
72
+ const nestedContent = extractChatToolTextContent(typed.content);
73
+ if (nestedContent.trim().length > 0) {
74
+ return nestedContent;
75
+ }
76
+ }
77
+ if (typed.kwargs !== undefined) {
78
+ const nestedKwargs = extractChatToolTextContent(typed.kwargs);
79
+ if (nestedKwargs.trim().length > 0) {
80
+ return nestedKwargs;
81
+ }
82
+ }
83
+ if (typed.message !== undefined) {
84
+ const nestedMessage = extractChatToolTextContent(typed.message);
85
+ if (nestedMessage.trim().length > 0) {
86
+ return nestedMessage;
87
+ }
88
+ }
89
+ if (typed.body !== undefined) {
90
+ const nestedBody = extractChatToolTextContent(typed.body);
91
+ if (nestedBody.trim().length > 0) {
92
+ return nestedBody;
93
+ }
94
+ }
95
+ if (typed.answer !== undefined) {
96
+ const nestedAnswer = extractChatToolTextContent(typed.answer);
97
+ if (nestedAnswer.trim().length > 0) {
98
+ return nestedAnswer;
99
+ }
100
+ }
101
+ return "";
102
+ }
@@ -0,0 +1,23 @@
1
+ import type { Writable as WritableStream } from "node:stream";
2
+ import type { HarnessClient } from "../client.js";
3
+ import type { ChatWorkspaceModelInfo } from "./chat-workspace.js";
4
+ export declare function streamChatMessage(input: {
5
+ client: HarnessClient;
6
+ stdout: (message: string) => void;
7
+ stdoutStream?: WritableStream;
8
+ stderr: (message: string) => void;
9
+ stderrStream?: WritableStream;
10
+ agentId?: string;
11
+ sessionId?: string;
12
+ message: string;
13
+ modelInfo?: ChatWorkspaceModelInfo;
14
+ requestEvents?: boolean;
15
+ liveRequestTree?: boolean;
16
+ colorRequestTree?: boolean;
17
+ showToolResults?: boolean;
18
+ showRunningState?: boolean;
19
+ }): Promise<{
20
+ sessionId?: string;
21
+ requestId?: string;
22
+ agentId?: string;
23
+ }>;