@gaunt-sloth/agent 0.1.8 → 2.0.0-alpha.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 (80) hide show
  1. package/README.md +14 -5
  2. package/cli-acp.js +35 -0
  3. package/cli.js +35 -0
  4. package/dist/builtInToolsConfig.d.ts +26 -0
  5. package/dist/builtInToolsConfig.js +148 -0
  6. package/dist/builtInToolsConfig.js.map +1 -0
  7. package/dist/core/GthDeepAgent.d.ts +76 -0
  8. package/dist/core/GthDeepAgent.js +368 -0
  9. package/dist/core/GthDeepAgent.js.map +1 -0
  10. package/dist/core/debugCapture.d.ts +51 -0
  11. package/dist/core/debugCapture.js +2 -0
  12. package/dist/core/debugCapture.js.map +1 -0
  13. package/dist/core/deepAgentPermissions.d.ts +55 -0
  14. package/dist/core/deepAgentPermissions.js +120 -0
  15. package/dist/core/deepAgentPermissions.js.map +1 -0
  16. package/dist/core/gthAcpServer.d.ts +27 -0
  17. package/dist/core/gthAcpServer.js +71 -0
  18. package/dist/core/gthAcpServer.js.map +1 -0
  19. package/dist/core/gthDeepAgentFactory.d.ts +8 -0
  20. package/dist/core/gthDeepAgentFactory.js +9 -0
  21. package/dist/core/gthDeepAgentFactory.js.map +1 -0
  22. package/dist/index.d.ts +13 -0
  23. package/dist/index.js +16 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/mcp/OAuthClientProviderImpl.d.ts +37 -0
  26. package/dist/mcp/OAuthClientProviderImpl.js +223 -0
  27. package/dist/mcp/OAuthClientProviderImpl.js.map +1 -0
  28. package/dist/middleware/binaryContentInjectionMiddleware.d.ts +22 -0
  29. package/dist/middleware/binaryContentInjectionMiddleware.js +125 -0
  30. package/dist/middleware/binaryContentInjectionMiddleware.js.map +1 -0
  31. package/dist/middleware/registry.d.ts +34 -0
  32. package/dist/middleware/registry.js +124 -0
  33. package/dist/middleware/registry.js.map +1 -0
  34. package/dist/middleware/types.d.ts +89 -0
  35. package/dist/middleware/types.js +9 -0
  36. package/dist/middleware/types.js.map +1 -0
  37. package/dist/modules/a2a/A2AClientWrapper.d.ts +22 -0
  38. package/dist/modules/a2a/A2AClientWrapper.js +63 -0
  39. package/dist/modules/a2a/A2AClientWrapper.js.map +1 -0
  40. package/dist/modules/acpModule.d.ts +37 -0
  41. package/dist/modules/acpModule.js +67 -0
  42. package/dist/modules/acpModule.js.map +1 -0
  43. package/dist/modules/apiAgUiModule.d.ts +2 -0
  44. package/dist/modules/apiAgUiModule.js +417 -0
  45. package/dist/modules/apiAgUiModule.js.map +1 -0
  46. package/dist/modules/interactiveSessionModule.d.ts +9 -0
  47. package/dist/modules/interactiveSessionModule.js +99 -0
  48. package/dist/modules/interactiveSessionModule.js.map +1 -0
  49. package/dist/resolvers.d.ts +18 -0
  50. package/dist/resolvers.js +140 -0
  51. package/dist/resolvers.js.map +1 -0
  52. package/dist/tools/A2AAgentTool.d.ts +24 -0
  53. package/dist/tools/A2AAgentTool.js +37 -0
  54. package/dist/tools/A2AAgentTool.js.map +1 -0
  55. package/dist/tools/GthCustomToolkit.d.ts +41 -0
  56. package/dist/tools/GthCustomToolkit.js +289 -0
  57. package/dist/tools/GthCustomToolkit.js.map +1 -0
  58. package/dist/tools/GthDevToolkit.d.ts +24 -0
  59. package/dist/tools/GthDevToolkit.js +189 -0
  60. package/dist/tools/GthDevToolkit.js.map +1 -0
  61. package/dist/tools/GthFileSystemToolkit.d.ts +36 -0
  62. package/dist/tools/GthFileSystemToolkit.js +775 -0
  63. package/dist/tools/GthFileSystemToolkit.js.map +1 -0
  64. package/dist/tools/binaryUtils.d.ts +13 -0
  65. package/dist/tools/binaryUtils.js +55 -0
  66. package/dist/tools/binaryUtils.js.map +1 -0
  67. package/dist/tools/gthStatusUpdateTool.d.ts +2 -0
  68. package/dist/tools/gthStatusUpdateTool.js +15 -0
  69. package/dist/tools/gthStatusUpdateTool.js.map +1 -0
  70. package/dist/tools/gthWebFetchTool.d.ts +2 -0
  71. package/dist/tools/gthWebFetchTool.js +47 -0
  72. package/dist/tools/gthWebFetchTool.js.map +1 -0
  73. package/dist/tools/showA2UISurfaceTool.d.ts +9 -0
  74. package/dist/tools/showA2UISurfaceTool.js +25 -0
  75. package/dist/tools/showA2UISurfaceTool.js.map +1 -0
  76. package/dist/utils/mcpUtils.d.ts +13 -0
  77. package/dist/utils/mcpUtils.js +225 -0
  78. package/dist/utils/mcpUtils.js.map +1 -0
  79. package/package.json +49 -10
  80. package/index.js +0 -6
@@ -0,0 +1,417 @@
1
+ import express from 'express';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { EventEncoder } from '@ag-ui/encoder';
4
+ import { EventType } from '@ag-ui/core';
5
+ import { GthDeepAgent } from '#src/core/GthDeepAgent.js';
6
+ import { defaultStatusCallback, displayInfo, displayWarning, } from '@gaunt-sloth/core/utils/consoleUtils.js';
7
+ import { getNewRunnableConfig } from '@gaunt-sloth/core/utils/llmUtils.js';
8
+ import { HumanMessage, AIMessage, SystemMessage, ToolMessage } from '@langchain/core/messages';
9
+ import { MemorySaver } from '@langchain/langgraph';
10
+ import { tool } from '@langchain/core/tools';
11
+ import { createResolvers } from '#src/resolvers.js';
12
+ /**
13
+ * Convert a run-input frontend tool into a client-fulfilled LangChain tool.
14
+ * Marking `metadata.client = true` is all that's required: the agent's
15
+ * `extractAndFlattenTools` already swaps such a tool's `invoke`/`call` for an
16
+ * `interrupt({ name })` stub, so the model can *call* the tool and the graph
17
+ * suspends for the browser to fulfil it — the exact mechanism Pukeko's
18
+ * server-side client tools use, now driven by client-declared tools.
19
+ */
20
+ function buildClientToolStub(t) {
21
+ const stub = tool(async () => '', {
22
+ name: t.name,
23
+ description: t.description ?? '',
24
+ // The JSON Schema from the run-input is passed straight through so the model
25
+ // sees the real parameter shape. The stub body never runs (it interrupts).
26
+ schema: t.parameters ?? { type: 'object', properties: {} },
27
+ });
28
+ stub.metadata = { client: true };
29
+ return stub;
30
+ }
31
+ /**
32
+ * Return the first complete JSON value at the start of `s`, ignoring any
33
+ * trailing characters. Used to recover from streamed tool-call argument
34
+ * reassembly that concatenates objects (e.g. `{}{}` or `{"steps":3}{}`) when a
35
+ * model emits parallel tool calls — local models like Ollama/Gemma don't honor
36
+ * `disable_parallel_tool_use`, and their delta streams can merge sibling calls'
37
+ * argument buffers. Returns `undefined` if no complete leading value is found.
38
+ */
39
+ function extractFirstJsonValue(s) {
40
+ let depth = 0;
41
+ let inString = false;
42
+ let escaped = false;
43
+ for (let i = 0; i < s.length; i++) {
44
+ const c = s[i];
45
+ if (inString) {
46
+ if (escaped)
47
+ escaped = false;
48
+ else if (c === '\\')
49
+ escaped = true;
50
+ else if (c === '"')
51
+ inString = false;
52
+ continue;
53
+ }
54
+ if (c === '"') {
55
+ inString = true;
56
+ }
57
+ else if (c === '{' || c === '[') {
58
+ depth++;
59
+ }
60
+ else if (c === '}' || c === ']') {
61
+ depth--;
62
+ if (depth === 0) {
63
+ try {
64
+ return JSON.parse(s.slice(0, i + 1));
65
+ }
66
+ catch {
67
+ return undefined;
68
+ }
69
+ }
70
+ }
71
+ }
72
+ return undefined;
73
+ }
74
+ /**
75
+ * Parse a tool call's `arguments` string defensively. A single malformed
76
+ * argument payload must not abort the whole run — the message is part of the
77
+ * persisted history and would otherwise poison every subsequent turn on the
78
+ * thread.
79
+ */
80
+ function parseToolArguments(raw, toolName) {
81
+ const s = (raw ?? '').trim();
82
+ if (!s)
83
+ return {};
84
+ try {
85
+ return JSON.parse(s);
86
+ }
87
+ catch {
88
+ const recovered = extractFirstJsonValue(s);
89
+ if (recovered && typeof recovered === 'object') {
90
+ displayWarning(`Recovered malformed tool arguments for ${toolName} (${JSON.stringify(s)} -> ${JSON.stringify(recovered)}). ` +
91
+ 'Likely parallel tool calls from a model that ignores disable_parallel_tool_use.');
92
+ return recovered;
93
+ }
94
+ displayWarning(`Unparseable tool arguments for ${toolName} (${JSON.stringify(s)}); defaulting to {}.`);
95
+ return {};
96
+ }
97
+ }
98
+ /**
99
+ * Convert AG-UI message format to LangChain BaseMessage
100
+ */
101
+ function convertMessage(msg) {
102
+ const content = typeof msg.content === 'string' ? msg.content : '';
103
+ switch (msg.role) {
104
+ case 'user':
105
+ return new HumanMessage(content);
106
+ case 'assistant': {
107
+ if (msg.toolCalls && msg.toolCalls.length > 0) {
108
+ return new AIMessage({
109
+ content: content,
110
+ tool_calls: msg.toolCalls.map((tc) => ({
111
+ id: tc.id,
112
+ name: tc.function.name,
113
+ args: parseToolArguments(tc.function.arguments, tc.function.name),
114
+ type: 'tool_call',
115
+ })),
116
+ });
117
+ }
118
+ return new AIMessage(content);
119
+ }
120
+ case 'system':
121
+ case 'developer':
122
+ return new SystemMessage(content);
123
+ case 'tool':
124
+ return new ToolMessage({ content, tool_call_id: msg.toolCallId || msg.id });
125
+ default:
126
+ return new HumanMessage(content);
127
+ }
128
+ }
129
+ export async function startAgUiServer(config, port) {
130
+ const app = express();
131
+ app.use(express.json({ limit: '5mb' }));
132
+ displayInfo('WARNING: AG-UI server is intended for local clients only. Do not expose to public networks.');
133
+ // CORS — configured via commands.api.cors in config
134
+ const corsOrigin = config.commands?.api?.cors?.allowOrigin ?? 'http://localhost:3000';
135
+ const corsMethods = config.commands?.api?.cors?.allowMethods ?? 'POST, GET, OPTIONS';
136
+ const corsHeaders = config.commands?.api?.cors?.allowHeaders ?? 'Content-Type, Accept';
137
+ app.use((_req, res, next) => {
138
+ res.setHeader('Access-Control-Allow-Origin', corsOrigin);
139
+ res.setHeader('Access-Control-Allow-Methods', corsMethods);
140
+ res.setHeader('Access-Control-Allow-Headers', corsHeaders);
141
+ if (_req.method === 'OPTIONS') {
142
+ res.status(204).end();
143
+ return;
144
+ }
145
+ next();
146
+ });
147
+ // Initialize agent.
148
+ // Note this would need a refactoring if it is to be used for a public web server,
149
+ // For connecting local WEB to local CLI agent, this is absolutely OK, since one thread is OK.
150
+ const checkpointSaver = new MemorySaver();
151
+ const agent = new GthDeepAgent(defaultStatusCallback, createResolvers());
152
+ await agent.init('api', config, checkpointSaver);
153
+ displayInfo(`AG-UI agent initialized`);
154
+ // C-a (spike): agents that additionally bind the client-declared run-input
155
+ // `tools`. Keyed by a stable signature of the toolset so the initial run and
156
+ // its resume share ONE compiled graph — LangGraph resumes from the
157
+ // checkpointer, but the graph shape must match the suspended one. Built lazily
158
+ // on first sighting of a given toolset.
159
+ const toolAgentCache = new Map();
160
+ function toolSignature(tools) {
161
+ return JSON.stringify(tools
162
+ .map((t) => [t.name, t.parameters ?? {}])
163
+ .sort((a, b) => String(a[0]).localeCompare(String(b[0]))));
164
+ }
165
+ async function getAgentForTools(tools) {
166
+ const sig = toolSignature(tools);
167
+ const cached = toolAgentCache.get(sig);
168
+ if (cached)
169
+ return cached;
170
+ const clientStubs = tools.map(buildClientToolStub);
171
+ // Run-input client tools are authoritative. Drop any config.tools entry that
172
+ // collides by name so we never register two client-tool instances of the
173
+ // same name: LangChain v1's AgentNode rejects a same-name/different-instance
174
+ // client tool ("You have modified a tool ..."). This lets a server config
175
+ // also declare the (client-fulfilled) tools — as pukeko's robot tools do —
176
+ // without breaking; the run-input stub is the one actually used.
177
+ const clientStubNames = new Set(clientStubs.map((t) => t.name).filter(Boolean));
178
+ const baseTools = (config.tools ?? []).filter((t) => !(t?.name && clientStubNames.has(t.name)));
179
+ const reqConfig = {
180
+ ...config,
181
+ tools: [...baseTools, ...clientStubs],
182
+ };
183
+ const reqAgent = new GthDeepAgent(defaultStatusCallback, createResolvers());
184
+ await reqAgent.init('api', reqConfig, checkpointSaver);
185
+ toolAgentCache.set(sig, reqAgent);
186
+ displayInfo(`AG-UI: bound ${clientStubs.length} client tool(s): ${tools.map((t) => t.name).join(', ')}`);
187
+ return reqAgent;
188
+ }
189
+ // AG-UI endpoint — standard path per AG-UI protocol
190
+ app.post('/agents/:agentId/run', async (req, res) => {
191
+ const { threadId, runId, messages, forwardedProps, tools } = req.body;
192
+ const effectiveThreadId = threadId || randomUUID();
193
+ const effectiveRunId = runId || randomUUID();
194
+ // C-a (spike): if the client declared frontend tools in the run-input, serve
195
+ // this run from an agent that binds them as interrupt stubs. Otherwise use
196
+ // the server's statically-configured agent.
197
+ const hasClientTools = Array.isArray(tools) && tools.length > 0;
198
+ const activeAgent = hasClientTools ? await getAgentForTools(tools) : agent;
199
+ const encoder = new EventEncoder({ accept: req.headers.accept });
200
+ res.setHeader('Content-Type', encoder.getContentType());
201
+ res.setHeader('Cache-Control', 'no-cache');
202
+ res.setHeader('Connection', 'keep-alive');
203
+ // Cancel in-flight inference when the client goes away (e.g. the frontend's
204
+ // Stop button calls HttpAgent.abortRun(), which aborts the fetch). Without
205
+ // this the LangGraph run — and the local model — keeps generating into a
206
+ // dead socket.
207
+ //
208
+ // Listen on the *response* 'close', not the request's: req 'close' fires as
209
+ // soon as the POST body is consumed (right after express.json() reads it),
210
+ // which would abort every run instantly. res 'close' fires when the
211
+ // connection actually goes away. `finished`, set just before res.end(),
212
+ // distinguishes a normal completion (close after we're done) from a real
213
+ // client disconnect (close while still streaming).
214
+ const ac = new AbortController();
215
+ let finished = false;
216
+ res.on('close', () => {
217
+ if (!finished)
218
+ ac.abort();
219
+ });
220
+ try {
221
+ // RUN_STARTED
222
+ res.write(encoder.encode({
223
+ type: EventType.RUN_STARTED,
224
+ threadId: effectiveThreadId,
225
+ runId: effectiveRunId,
226
+ }));
227
+ const messageId = randomUUID();
228
+ // Get runnable config with thread_id for checkpointing. config.recursionLimit
229
+ // (when set by the consumer) caps the agent's super-steps per run.
230
+ const runConfig = {
231
+ ...getNewRunnableConfig(config.recursionLimit),
232
+ configurable: { thread_id: effectiveThreadId },
233
+ };
234
+ // Stream the response with typed events
235
+ let textMessageStarted = false;
236
+ let reasoningMessageId = null;
237
+ // C-a (spike): detect CopilotKit's resume shape. CopilotKit fulfils a
238
+ // frontend tool client-side and then RE-RUNS the agent with the full
239
+ // message history, the tool result appended as a trailing `tool` message
240
+ // — it does NOT send `forwardedProps.command.resume`. When that lands on a
241
+ // thread whose graph is suspended at our interrupt() stub, translate the
242
+ // trailing tool result into a graph resume so the suspended run continues
243
+ // (instead of starting a fresh run that just re-calls the tool).
244
+ const lastMsg = Array.isArray(messages) && messages.length > 0 ? messages[messages.length - 1] : undefined;
245
+ const isCopilotToolResume = hasClientTools && forwardedProps?.command?.resume === undefined && lastMsg?.role === 'tool';
246
+ let eventStream;
247
+ if (isCopilotToolResume) {
248
+ const resumeContent = typeof lastMsg.content === 'string' ? lastMsg.content : JSON.stringify(lastMsg.content);
249
+ eventStream = activeAgent.streamWithEventsResume(resumeContent, runConfig, [], ac.signal);
250
+ }
251
+ else if (forwardedProps?.command?.resume !== undefined) {
252
+ // Follow-up messages piggy-backed on the resume: deliver them to the
253
+ // agent on its next decision turn via Command.update (see
254
+ // GthLangChainAgent.streamWithEventsResume). Accepts plain strings or
255
+ // AG-UI message objects.
256
+ const queued = forwardedProps.command.queuedMessages;
257
+ const queuedMessages = Array.isArray(queued)
258
+ ? queued
259
+ .map((s) => typeof s === 'string'
260
+ ? new HumanMessage(s)
261
+ : convertMessage(s))
262
+ .filter((m) => Boolean(m))
263
+ : [];
264
+ eventStream = activeAgent.streamWithEventsResume(forwardedProps.command.resume, runConfig, queuedMessages, ac.signal);
265
+ }
266
+ else {
267
+ // The system prompt (backstory + guidelines + mode prompt + identity) lives in the
268
+ // deep-agent graph via createDeepAgent({ systemPrompt }) — see GthDeepAgent — so it is no
269
+ // longer prepended here. A separate, non-first SystemMessage would be rejected by Anthropic.
270
+ const langChainMessages = (messages || []).map(convertMessage);
271
+ eventStream = activeAgent.streamWithEvents(langChainMessages, runConfig, ac.signal);
272
+ }
273
+ for await (const event of eventStream) {
274
+ switch (event.type) {
275
+ case 'text': {
276
+ if (!textMessageStarted) {
277
+ res.write(encoder.encode({
278
+ type: EventType.TEXT_MESSAGE_START,
279
+ messageId,
280
+ role: 'assistant',
281
+ }));
282
+ textMessageStarted = true;
283
+ }
284
+ res.write(encoder.encode({
285
+ type: EventType.TEXT_MESSAGE_CONTENT,
286
+ messageId,
287
+ delta: event.delta,
288
+ }));
289
+ break;
290
+ }
291
+ case 'tool_start': {
292
+ res.write(encoder.encode({
293
+ type: EventType.TOOL_CALL_START,
294
+ toolCallId: event.id,
295
+ toolCallName: event.name,
296
+ parentMessageId: messageId,
297
+ }));
298
+ break;
299
+ }
300
+ case 'tool_args': {
301
+ res.write(encoder.encode({
302
+ type: EventType.TOOL_CALL_ARGS,
303
+ toolCallId: event.id,
304
+ delta: event.delta,
305
+ }));
306
+ break;
307
+ }
308
+ case 'tool_end': {
309
+ res.write(encoder.encode({
310
+ type: EventType.TOOL_CALL_END,
311
+ toolCallId: event.id,
312
+ }));
313
+ break;
314
+ }
315
+ case 'tool_result': {
316
+ res.write(encoder.encode({
317
+ type: EventType.TOOL_CALL_RESULT,
318
+ toolCallId: event.id,
319
+ content: event.content,
320
+ role: 'tool',
321
+ messageId: randomUUID(),
322
+ }));
323
+ break;
324
+ }
325
+ case 'reasoning_start': {
326
+ reasoningMessageId = randomUUID();
327
+ res.write(encoder.encode({
328
+ type: EventType.REASONING_MESSAGE_START,
329
+ messageId: reasoningMessageId,
330
+ role: 'reasoning',
331
+ }));
332
+ break;
333
+ }
334
+ case 'reasoning_delta': {
335
+ if (reasoningMessageId) {
336
+ res.write(encoder.encode({
337
+ type: EventType.REASONING_MESSAGE_CONTENT,
338
+ messageId: reasoningMessageId,
339
+ delta: event.delta,
340
+ }));
341
+ }
342
+ break;
343
+ }
344
+ case 'reasoning_end': {
345
+ if (reasoningMessageId) {
346
+ res.write(encoder.encode({
347
+ type: EventType.REASONING_MESSAGE_END,
348
+ messageId: reasoningMessageId,
349
+ }));
350
+ reasoningMessageId = null;
351
+ }
352
+ break;
353
+ }
354
+ }
355
+ }
356
+ // TEXT_MESSAGE_END (only if a text message was started)
357
+ if (textMessageStarted) {
358
+ res.write(encoder.encode({
359
+ type: EventType.TEXT_MESSAGE_END,
360
+ messageId,
361
+ }));
362
+ }
363
+ // RUN_FINISHED
364
+ res.write(encoder.encode({
365
+ type: EventType.RUN_FINISHED,
366
+ threadId: effectiveThreadId,
367
+ runId: effectiveRunId,
368
+ }));
369
+ finished = true;
370
+ res.end();
371
+ }
372
+ catch (error) {
373
+ // A client-initiated abort isn't an error — the socket is already gone, so
374
+ // there's nothing to write to. Only surface RUN_ERROR for real failures.
375
+ if (ac.signal.aborted) {
376
+ return;
377
+ }
378
+ const errorMessage = error instanceof Error ? error.message : String(error);
379
+ res.write(encoder.encode({
380
+ type: EventType.RUN_ERROR,
381
+ message: errorMessage,
382
+ }));
383
+ res.end();
384
+ }
385
+ });
386
+ // Health check
387
+ app.get('/health', (_req, res) => {
388
+ res.json({ status: 'ok' });
389
+ });
390
+ // Agent metadata — lets clients display which model/provider is serving them.
391
+ // provider is read from the LangChain model's _llmType() (e.g. "ollama",
392
+ // "anthropic"); model from config.modelDisplayName, falling back to the
393
+ // chat model's own `model` field.
394
+ app.get('/info', (_req, res) => {
395
+ const llm = config.llm;
396
+ let provider = null;
397
+ try {
398
+ provider = typeof llm?._llmType === 'function' ? llm._llmType() : null;
399
+ }
400
+ catch {
401
+ provider = null;
402
+ }
403
+ res.json({
404
+ status: 'ok',
405
+ provider,
406
+ model: config.modelDisplayName ?? llm?.model ?? null,
407
+ });
408
+ });
409
+ return new Promise((resolve) => {
410
+ app.listen(port, () => {
411
+ displayInfo(`AG-UI server listening at http://localhost:${port}`);
412
+ displayInfo(`AG-UI endpoint: POST http://localhost:${port}/agents/{agentId}/run`);
413
+ resolve();
414
+ });
415
+ });
416
+ }
417
+ //# sourceMappingURL=apiAgUiModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiAgUiModule.js","sourceRoot":"","sources":["../../src/modules/apiAgUiModule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { CommandLineConfigOverrides, GthConfig } from '@gaunt-sloth/core/config.js';
2
+ export interface SessionConfig {
3
+ mode: 'chat' | 'code';
4
+ readModePrompt: (config: Pick<GthConfig, 'identityProfile'>) => string | null;
5
+ description: string;
6
+ readyMessage: string;
7
+ exitMessage: string;
8
+ }
9
+ export declare function createInteractiveSession(sessionConfig: SessionConfig, commandLineConfigOverrides: CommandLineConfigOverrides, message?: string): Promise<void>;
@@ -0,0 +1,99 @@
1
+ import { initConfig } from '@gaunt-sloth/core/config.js';
2
+ import { defaultStatusCallback, display, displayInfo, flushSessionLog, formatInputPrompt, initSessionLogging, stopSessionLogging, } from '@gaunt-sloth/core/utils/consoleUtils.js';
3
+ import { GthAgentRunner } from '@gaunt-sloth/core/core/GthAgentRunner.js';
4
+ import { appendToFile, getCommandOutputFilePath } from '@gaunt-sloth/core/utils/fileUtils.js';
5
+ import { createInterface, error, exit, setRawMode, stdin as input, stdout as output, } from '@gaunt-sloth/core/utils/systemUtils.js';
6
+ import { HumanMessage } from '@langchain/core/messages';
7
+ import { MemorySaver } from '@langchain/langgraph';
8
+ import { createResolvers } from '#src/resolvers.js';
9
+ import { gthDeepAgentFactory } from '#src/core/gthDeepAgentFactory.js';
10
+ export async function createInteractiveSession(sessionConfig, commandLineConfigOverrides, message) {
11
+ const config = { ...(await initConfig(commandLineConfigOverrides)) };
12
+ const checkpointSaver = new MemorySaver();
13
+ // Initialize Runner
14
+ const logFileName = getCommandOutputFilePath(config, sessionConfig.mode);
15
+ if (logFileName) {
16
+ initSessionLogging(logFileName, config.streamSessionInferenceLog);
17
+ }
18
+ const runner = new GthAgentRunner(defaultStatusCallback, createResolvers(), gthDeepAgentFactory);
19
+ try {
20
+ await runner.init(sessionConfig.mode, config, checkpointSaver);
21
+ const rl = createInterface({ input, output });
22
+ let shouldExit = false;
23
+ if (logFileName) {
24
+ displayInfo(`${sessionConfig.mode} session will be logged to ${logFileName}\n`);
25
+ }
26
+ const processMessage = async (userInput) => {
27
+ const logEntry = `## User\n\n${userInput}\n\n## Assistant\n\n`;
28
+ if (logFileName) {
29
+ appendToFile(logFileName, logEntry);
30
+ }
31
+ flushSessionLog(); // Ensure user input is immediately written to file
32
+ // The system prompt (backstory + guidelines + mode prompt + identity) now lives in the
33
+ // deep-agent graph via createDeepAgent({ systemPrompt }) — see GthDeepAgent — so it is no
34
+ // longer injected here as a per-turn SystemMessage (which yielded a second, non-first system
35
+ // message that Anthropic rejects).
36
+ const messages = [new HumanMessage(userInput)];
37
+ await runner.processMessages(messages);
38
+ };
39
+ const askQuestion = async () => {
40
+ while (!shouldExit) {
41
+ setRawMode(true); // resume raw mode for user input (without it every user input is parroted)
42
+ const userInput = await rl.question(formatInputPrompt(' > '));
43
+ if (!userInput.trim()) {
44
+ continue; // Skip inference if no input
45
+ }
46
+ const lowerInput = userInput.toLowerCase();
47
+ if (lowerInput === 'exit' || lowerInput === '/exit') {
48
+ display('Exiting...');
49
+ shouldExit = true;
50
+ await runner.cleanup();
51
+ stopSessionLogging();
52
+ rl.close();
53
+ break;
54
+ }
55
+ let shouldRetry = false;
56
+ do {
57
+ try {
58
+ await processMessage(userInput);
59
+ shouldRetry = false;
60
+ }
61
+ catch (err) {
62
+ display(`\n❌ Error processing message: ${err instanceof Error ? err.message : String(err)}\n`);
63
+ const retryResponse = await rl.question('Do you want to try again with the same prompt? (y/n): ');
64
+ shouldRetry = retryResponse.toLowerCase().trim().startsWith('y');
65
+ if (!shouldRetry) {
66
+ display('\nSkipping to next prompt...');
67
+ }
68
+ }
69
+ } while (shouldRetry && !shouldExit);
70
+ if (!shouldExit) {
71
+ display('\n\n');
72
+ displayInfo(sessionConfig.exitMessage);
73
+ }
74
+ }
75
+ rl.close();
76
+ };
77
+ if (message) {
78
+ await processMessage(message);
79
+ }
80
+ else {
81
+ display(sessionConfig.readyMessage);
82
+ displayInfo(sessionConfig.exitMessage);
83
+ }
84
+ if (!shouldExit)
85
+ await askQuestion();
86
+ if (shouldExit) {
87
+ setTimeout(() => {
88
+ exit();
89
+ }, 500);
90
+ }
91
+ }
92
+ catch (err) {
93
+ await runner.cleanup();
94
+ stopSessionLogging();
95
+ error(`Error in ${sessionConfig.mode} command: ${err}`);
96
+ exit(1);
97
+ }
98
+ }
99
+ //# sourceMappingURL=interactiveSessionModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactiveSessionModule.js","sourceRoot":"","sources":["../../src/modules/interactiveSessionModule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * Resolver implementations for the AgentResolvers pattern.
4
+ *
5
+ * Provides `resolveTools` / `cleanupTools` that wire up built-in tools
6
+ * (filesystem, dev, custom), MCP servers, and A2A agents.
7
+ *
8
+ * Provides `resolveMiddleware` / `cleanupMiddleware` that delegate to the
9
+ * agent middleware registry.
10
+ */
11
+ import type { AgentResolvers } from '@gaunt-sloth/core/core/types.js';
12
+ /**
13
+ * Create a full set of resolvers for the GthLangChainAgent.
14
+ *
15
+ * Each call returns a fresh set of resolvers with their own MCP client
16
+ * instance, avoiding shared module-level state and race conditions.
17
+ */
18
+ export declare function createResolvers(): AgentResolvers;