ugly-app 0.1.634 → 0.1.636
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.
- package/dist/agent/client/agentStreamReducer.d.ts +11 -0
- package/dist/agent/client/agentStreamReducer.d.ts.map +1 -0
- package/dist/agent/client/agentStreamReducer.js +44 -0
- package/dist/agent/client/agentStreamReducer.js.map +1 -0
- package/dist/agent/client/compaction.d.ts +27 -0
- package/dist/agent/client/compaction.d.ts.map +1 -0
- package/dist/agent/client/compaction.js +44 -0
- package/dist/agent/client/compaction.js.map +1 -0
- package/dist/agent/client/index.d.ts +7 -0
- package/dist/agent/client/index.d.ts.map +1 -0
- package/dist/agent/client/index.js +8 -0
- package/dist/agent/client/index.js.map +1 -0
- package/dist/agent/client/runAgent.d.ts +85 -0
- package/dist/agent/client/runAgent.d.ts.map +1 -0
- package/dist/agent/client/runAgent.js +276 -0
- package/dist/agent/client/runAgent.js.map +1 -0
- package/dist/agent/client/useAgent.d.ts +22 -0
- package/dist/agent/client/useAgent.d.ts.map +1 -0
- package/dist/agent/client/useAgent.js +92 -0
- package/dist/agent/client/useAgent.js.map +1 -0
- package/dist/agent/server/UglyBotTextStream.d.ts +35 -0
- package/dist/agent/server/UglyBotTextStream.d.ts.map +1 -0
- package/dist/agent/server/UglyBotTextStream.js +182 -0
- package/dist/agent/server/UglyBotTextStream.js.map +1 -0
- package/dist/agent/server/index.d.ts +6 -0
- package/dist/agent/server/index.d.ts.map +1 -0
- package/dist/agent/server/index.js +7 -0
- package/dist/agent/server/index.js.map +1 -0
- package/dist/agent/server/registerAgentHandler.d.ts +25 -0
- package/dist/agent/server/registerAgentHandler.d.ts.map +1 -0
- package/dist/agent/server/registerAgentHandler.js +108 -0
- package/dist/agent/server/registerAgentHandler.js.map +1 -0
- package/dist/agent/server/streamAgentTurn.d.ts +20 -0
- package/dist/agent/server/streamAgentTurn.d.ts.map +1 -0
- package/dist/agent/server/streamAgentTurn.js +101 -0
- package/dist/agent/server/streamAgentTurn.js.map +1 -0
- package/dist/agent/shared/AgentStream.d.ts +136 -0
- package/dist/agent/shared/AgentStream.d.ts.map +1 -0
- package/dist/agent/shared/AgentStream.js +57 -0
- package/dist/agent/shared/AgentStream.js.map +1 -0
- package/dist/agent/shared/SessionStore.d.ts +49 -0
- package/dist/agent/shared/SessionStore.d.ts.map +1 -0
- package/dist/agent/shared/SessionStore.js +50 -0
- package/dist/agent/shared/SessionStore.js.map +1 -0
- package/dist/agent/shared/index.d.ts +6 -0
- package/dist/agent/shared/index.d.ts.map +1 -0
- package/dist/agent/shared/index.js +5 -0
- package/dist/agent/shared/index.js.map +1 -0
- package/dist/agent/shared/tokenEstimate.d.ts +6 -0
- package/dist/agent/shared/tokenEstimate.d.ts.map +1 -0
- package/dist/agent/shared/tokenEstimate.js +47 -0
- package/dist/agent/shared/tokenEstimate.js.map +1 -0
- package/dist/cli/publish/appStore.d.ts +1 -1
- package/dist/cli/publish/appStore.d.ts.map +1 -1
- package/dist/cli/publish/appStore.js +40 -3
- package/dist/cli/publish/appStore.js.map +1 -1
- package/dist/cli/publish/types.d.ts +2 -2
- package/dist/cli/publishCommand.js +1 -1
- package/dist/cli/publishCommand.js.map +1 -1
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/markdown/client/ProseMirrorEditor/schema.d.ts +4 -4
- package/dist/server/DB.d.ts.map +1 -1
- package/dist/server/DB.js +12 -4
- package/dist/server/DB.js.map +1 -1
- package/dist/shared/AiProxy.d.ts +16 -16
- package/dist/shared/DB.d.ts +15 -6
- package/dist/shared/DB.d.ts.map +1 -1
- package/dist/shared/DB.js.map +1 -1
- package/dist/shared/FeedbackReport.d.ts +2 -2
- package/dist/shared/FrameworkRequests.d.ts +5 -5
- package/dist/shared/ProxyOps.d.ts +7 -7
- package/dist/shared/TextGen.d.ts +2 -2
- package/package.json +4 -1
- package/src/agent/client/agentStreamReducer.ts +66 -0
- package/src/agent/client/compaction.ts +77 -0
- package/src/agent/client/index.ts +53 -0
- package/src/agent/client/runAgent.test.ts +248 -0
- package/src/agent/client/runAgent.ts +373 -0
- package/src/agent/client/useAgent.ts +138 -0
- package/src/agent/server/UglyBotTextStream.ts +252 -0
- package/src/agent/server/index.ts +36 -0
- package/src/agent/server/registerAgentHandler.ts +153 -0
- package/src/agent/server/streamAgentTurn.ts +148 -0
- package/src/agent/shared/AgentStream.ts +119 -0
- package/src/agent/shared/SessionStore.ts +99 -0
- package/src/agent/shared/agent.test.ts +68 -0
- package/src/agent/shared/index.ts +35 -0
- package/src/agent/shared/tokenEstimate.ts +52 -0
- package/src/cli/publish/appStore.ts +37 -2
- package/src/cli/publishCommand.ts +1 -1
- package/src/cli/version.ts +1 -1
- package/src/server/DB.ts +12 -7
- package/src/shared/DB.ts +9 -2
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type StreamingMessage } from '../../conversation/client/conversationStreamReducer.js';
|
|
2
|
+
import type { AgentStopReason, AgentStreamFrame, ToolUseRef } from '../shared/AgentStream.js';
|
|
3
|
+
export interface AgentStreamingMessage extends StreamingMessage {
|
|
4
|
+
toolUse?: ToolUseRef[];
|
|
5
|
+
stopReason?: AgentStopReason;
|
|
6
|
+
}
|
|
7
|
+
export type AgentStreamingMap = Readonly<Record<string, AgentStreamingMessage>>;
|
|
8
|
+
/** Apply one agent frame, returning a new map (immutable update). */
|
|
9
|
+
export declare function applyAgentFrame(map: AgentStreamingMap, frame: AgentStreamFrame): AgentStreamingMap;
|
|
10
|
+
export { type StreamingMessage };
|
|
11
|
+
//# sourceMappingURL=agentStreamReducer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentStreamReducer.d.ts","sourceRoot":"","sources":["../../../src/agent/client/agentStreamReducer.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,wDAAwD,CAAC;AAChE,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,UAAU,EACX,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,qBAAsB,SAAQ,gBAAgB;IAC7D,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;AAEhF,qEAAqE;AACrE,wBAAgB,eAAe,CAC7B,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,gBAAgB,GACtB,iBAAiB,CAkCnB;AAED,OAAO,EAAE,KAAK,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Pure client-side reducer for the agent live frames.
|
|
2
|
+
//
|
|
3
|
+
// Reuses the conversation reducer for the shared `msg:*` frames (begin/delta/
|
|
4
|
+
// commit/error) and adds the two agent frames (`msg:tool_use`, `msg:turn_done`).
|
|
5
|
+
// This drives the live streaming UI only — the loop's control flow comes from
|
|
6
|
+
// the authoritative request RESPONSE, not these frames.
|
|
7
|
+
import { applyFrame as applyBaseFrame, } from '../../conversation/client/conversationStreamReducer.js';
|
|
8
|
+
/** Apply one agent frame, returning a new map (immutable update). */
|
|
9
|
+
export function applyAgentFrame(map, frame) {
|
|
10
|
+
switch (frame.type) {
|
|
11
|
+
case 'msg:tool_use': {
|
|
12
|
+
const cur = map[frame.msgId];
|
|
13
|
+
const base = cur ?? {
|
|
14
|
+
msgId: frame.msgId,
|
|
15
|
+
authorId: 'assistant',
|
|
16
|
+
kind: 'bot',
|
|
17
|
+
text: '',
|
|
18
|
+
sources: [],
|
|
19
|
+
status: 'streaming',
|
|
20
|
+
};
|
|
21
|
+
return { ...map, [frame.msgId]: { ...base, toolUse: frame.toolUse } };
|
|
22
|
+
}
|
|
23
|
+
case 'msg:turn_done': {
|
|
24
|
+
const cur = map[frame.msgId];
|
|
25
|
+
const base = cur ?? {
|
|
26
|
+
msgId: frame.msgId,
|
|
27
|
+
authorId: 'assistant',
|
|
28
|
+
kind: 'bot',
|
|
29
|
+
text: '',
|
|
30
|
+
sources: [],
|
|
31
|
+
status: 'streaming',
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
...map,
|
|
35
|
+
[frame.msgId]: { ...base, stopReason: frame.stopReason },
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
default:
|
|
39
|
+
// Delegate the shared frames to the conversation reducer (carrying over
|
|
40
|
+
// any agent-only fields already on the entry).
|
|
41
|
+
return applyBaseFrame(map, frame);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=agentStreamReducer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentStreamReducer.js","sourceRoot":"","sources":["../../../src/agent/client/agentStreamReducer.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,8EAA8E;AAC9E,iFAAiF;AACjF,8EAA8E;AAC9E,wDAAwD;AAExD,OAAO,EACL,UAAU,IAAI,cAAc,GAG7B,MAAM,wDAAwD,CAAC;AAchE,qEAAqE;AACrE,MAAM,UAAU,eAAe,CAC7B,GAAsB,EACtB,KAAuB;IAEvB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,MAAM,IAAI,GAA0B,GAAG,IAAI;gBACzC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,QAAQ,EAAE,WAAW;gBACrB,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,WAAW;aACpB,CAAC;YACF,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACxE,CAAC;QACD,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,MAAM,IAAI,GAA0B,GAAG,IAAI;gBACzC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,QAAQ,EAAE,WAAW;gBACrB,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,WAAW;aACpB,CAAC;YACF,OAAO;gBACL,GAAG,GAAG;gBACN,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE;aACzD,CAAC;QACJ,CAAC;QACD;YACE,wEAAwE;YACxE,+CAA+C;YAC/C,OAAO,cAAc,CAAC,GAAmB,EAAE,KAAK,CAAsB,CAAC;IAC3E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Message } from '../../shared/TextGen.js';
|
|
2
|
+
export interface CompactionConfig {
|
|
3
|
+
/** Compact when the working context exceeds this estimated token count. */
|
|
4
|
+
maxContextTokens: number;
|
|
5
|
+
/** How many of the most-recent messages to always keep verbatim. */
|
|
6
|
+
keepRecentTurns: number;
|
|
7
|
+
/**
|
|
8
|
+
* Optional AI summarizer for the dropped turns. When omitted, compaction is
|
|
9
|
+
* lossy-structural (a placeholder note) — acceptable because the canonical
|
|
10
|
+
* full log retains everything.
|
|
11
|
+
*/
|
|
12
|
+
summarize?: (dropped: Message[]) => Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
export interface CompactionResult {
|
|
15
|
+
messages: Message[];
|
|
16
|
+
compacted: boolean;
|
|
17
|
+
/** Number of original messages folded into the summary. */
|
|
18
|
+
droppedCount: number;
|
|
19
|
+
summary?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Return a (possibly) compacted working context. A no-op when under budget.
|
|
23
|
+
* Never mutates the input. Keeps a leading system message (if any) + the
|
|
24
|
+
* summary + the most recent `keepRecentTurns` messages.
|
|
25
|
+
*/
|
|
26
|
+
export declare function compactMessages(messages: Message[], config: CompactionConfig): Promise<CompactionResult>;
|
|
27
|
+
//# sourceMappingURL=compaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../src/agent/client/compaction.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGvD,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,gBAAgB,EAAE,MAAM,CAAC;IACzB,oEAAoE;IACpE,eAAe,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,2DAA2D;IAC3D,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAiC3B"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Compaction — shrink the WORKING context sent to the model.
|
|
2
|
+
//
|
|
3
|
+
// IMPORTANT: this only ever shrinks the working context. The canonical session
|
|
4
|
+
// log (e.g. ugly-code's native.fs JSONL) keeps every original event verbatim
|
|
5
|
+
// and is NEVER compacted — callers persist there independently. Compaction
|
|
6
|
+
// summarizes the oldest turns into a single summary message, keeping the most
|
|
7
|
+
// recent `keepRecentTurns` messages intact.
|
|
8
|
+
import { estimateTokens } from '../shared/tokenEstimate.js';
|
|
9
|
+
const DEFAULT_SUMMARY = (n) => `[Earlier in this session, ${n} message(s) were compacted out of the working context to stay within the model's window. The full history is preserved in the session log.]`;
|
|
10
|
+
/**
|
|
11
|
+
* Return a (possibly) compacted working context. A no-op when under budget.
|
|
12
|
+
* Never mutates the input. Keeps a leading system message (if any) + the
|
|
13
|
+
* summary + the most recent `keepRecentTurns` messages.
|
|
14
|
+
*/
|
|
15
|
+
export async function compactMessages(messages, config) {
|
|
16
|
+
if (estimateTokens(messages) <= config.maxContextTokens) {
|
|
17
|
+
return { messages, compacted: false, droppedCount: 0 };
|
|
18
|
+
}
|
|
19
|
+
// Preserve a leading system message verbatim.
|
|
20
|
+
const hasSystem = messages.length > 0 && messages[0].role === 'system';
|
|
21
|
+
const head = hasSystem ? [messages[0]] : [];
|
|
22
|
+
const body = hasSystem ? messages.slice(1) : messages;
|
|
23
|
+
const keep = Math.max(0, config.keepRecentTurns);
|
|
24
|
+
if (body.length <= keep) {
|
|
25
|
+
// Nothing safely droppable — leave as-is rather than gut recent context.
|
|
26
|
+
return { messages, compacted: false, droppedCount: 0 };
|
|
27
|
+
}
|
|
28
|
+
const dropped = body.slice(0, body.length - keep);
|
|
29
|
+
const recent = body.slice(body.length - keep);
|
|
30
|
+
const summaryText = config.summarize
|
|
31
|
+
? await config.summarize(dropped)
|
|
32
|
+
: DEFAULT_SUMMARY(dropped.length);
|
|
33
|
+
const summaryMsg = {
|
|
34
|
+
role: 'user',
|
|
35
|
+
content: [{ type: 'text', text: summaryText }],
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
messages: [...head, summaryMsg, ...recent],
|
|
39
|
+
compacted: true,
|
|
40
|
+
droppedCount: dropped.length,
|
|
41
|
+
summary: summaryText,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=compaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../../src/agent/client/compaction.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,2EAA2E;AAC3E,8EAA8E;AAC9E,4CAA4C;AAG5C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAuB5D,MAAM,eAAe,GAAG,CAAC,CAAS,EAAU,EAAE,CAC5C,6BAA6B,CAAC,6IAA6I,CAAC;AAE9K;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAmB,EACnB,MAAwB;IAExB,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACxD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IACzD,CAAC;IAED,8CAA8C;IAC9C,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,QAAQ,CAAC;IACxE,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEtD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QACxB,yEAAyE;QACzE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS;QAClC,CAAC,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpC,MAAM,UAAU,GAAY;QAC1B,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;KAC/C,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QAC1C,SAAS,EAAE,IAAI;QACf,YAAY,EAAE,OAAO,CAAC,MAAM;QAC5B,OAAO,EAAE,WAAW;KACrB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { runAgent, type AgentBudget, type AgentController, type AgentEvent, type RunAgentConfig, type RunAgentSocket, } from './runAgent.js';
|
|
2
|
+
export { useAgent, type UseAgentOptions, type UseAgentResult, type UseAgentStatus, } from './useAgent.js';
|
|
3
|
+
export { applyAgentFrame, type AgentStreamingMap, type AgentStreamingMessage, } from './agentStreamReducer.js';
|
|
4
|
+
export { compactMessages, type CompactionConfig, type CompactionResult, } from './compaction.js';
|
|
5
|
+
export { AGENT_STREAM_COLLECTION, AGENT_STREAM_KEY_FIELD, estimateTokens, emptyTelemetryTotals, accrueTelemetry, } from '../shared/index.js';
|
|
6
|
+
export type { AgentMessage, AgentSession, AgentSessionStore, AgentStopReason, AgentStreamFrame, AgentTelemetryTotals, AgentTurnRequest, AgentTurnResponse, ContentPart, MsgTelemetry, TextGenModel, TextGenTool, ToolUseRef, } from '../shared/index.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/client/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EACR,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,QAAQ,EACR,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,eAAe,EACf,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,GACX,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// ugly-app/agent/client — the client-driven loop runner (imperative + React).
|
|
2
|
+
export { runAgent, } from './runAgent.js';
|
|
3
|
+
export { useAgent, } from './useAgent.js';
|
|
4
|
+
export { applyAgentFrame, } from './agentStreamReducer.js';
|
|
5
|
+
export { compactMessages, } from './compaction.js';
|
|
6
|
+
// Shared contracts apps need on the client too.
|
|
7
|
+
export { AGENT_STREAM_COLLECTION, AGENT_STREAM_KEY_FIELD, estimateTokens, emptyTelemetryTotals, accrueTelemetry, } from '../shared/index.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/client/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAE9E,OAAO,EACL,QAAQ,GAMT,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,QAAQ,GAIT,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,GAGhB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,eAAe,GAGhB,MAAM,iBAAiB,CAAC;AAEzB,gDAAgD;AAChD,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,eAAe,GAChB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { ContentPart, Message } from '../../shared/TextGen.js';
|
|
2
|
+
import { type AgentStreamFrame, type AgentStopReason, type MsgTelemetry, type TextGenTool, type ToolUseRef } from '../shared/AgentStream.js';
|
|
3
|
+
import { type AgentSession, type AgentSessionStore, type AgentTelemetryTotals } from '../shared/SessionStore.js';
|
|
4
|
+
import { type CompactionConfig } from './compaction.js';
|
|
5
|
+
export interface RunAgentSocket {
|
|
6
|
+
request(name: string, input: unknown, opts?: {
|
|
7
|
+
timeoutMs?: number | null;
|
|
8
|
+
signal?: AbortSignal;
|
|
9
|
+
}): Promise<unknown>;
|
|
10
|
+
trackDocs(collection: string, params: {
|
|
11
|
+
keys?: Record<string, string>;
|
|
12
|
+
}, cb: (docs: unknown[]) => void, onFrame?: (frame: unknown) => void): () => void;
|
|
13
|
+
}
|
|
14
|
+
export interface AgentBudget {
|
|
15
|
+
maxUsd?: number;
|
|
16
|
+
maxTokens?: number;
|
|
17
|
+
maxTurns?: number;
|
|
18
|
+
}
|
|
19
|
+
export type AgentEvent = {
|
|
20
|
+
type: 'turn_start';
|
|
21
|
+
msgId: string;
|
|
22
|
+
turnIndex: number;
|
|
23
|
+
} | {
|
|
24
|
+
type: 'turn_done';
|
|
25
|
+
msgId: string;
|
|
26
|
+
stopReason: AgentStopReason;
|
|
27
|
+
telemetry?: MsgTelemetry;
|
|
28
|
+
} | {
|
|
29
|
+
type: 'tool_use';
|
|
30
|
+
toolUse: ToolUseRef[];
|
|
31
|
+
} | {
|
|
32
|
+
type: 'tool_result';
|
|
33
|
+
results: ContentPart[];
|
|
34
|
+
} | {
|
|
35
|
+
type: 'compaction';
|
|
36
|
+
droppedCount: number;
|
|
37
|
+
summary?: string;
|
|
38
|
+
} | {
|
|
39
|
+
type: 'budget_exceeded';
|
|
40
|
+
reason: string;
|
|
41
|
+
totals: AgentTelemetryTotals;
|
|
42
|
+
} | {
|
|
43
|
+
type: 'aborted';
|
|
44
|
+
} | {
|
|
45
|
+
type: 'error';
|
|
46
|
+
message: string;
|
|
47
|
+
} | {
|
|
48
|
+
type: 'done';
|
|
49
|
+
};
|
|
50
|
+
export interface RunAgentConfig {
|
|
51
|
+
socket: RunAgentSocket;
|
|
52
|
+
sessionId: string;
|
|
53
|
+
/** The hub channel for live frames. Defaults to `sessionId`. */
|
|
54
|
+
streamId?: string;
|
|
55
|
+
model: string;
|
|
56
|
+
systemPrompt?: string;
|
|
57
|
+
tools?: TextGenTool[];
|
|
58
|
+
/** name → handler returning the tool_result string. */
|
|
59
|
+
toolHandlers: Record<string, (input: unknown) => Promise<string>>;
|
|
60
|
+
options?: Record<string, unknown>;
|
|
61
|
+
/** The request name registered in the app (default `agentTurn`). */
|
|
62
|
+
requestName?: string;
|
|
63
|
+
budget?: AgentBudget;
|
|
64
|
+
compaction?: CompactionConfig;
|
|
65
|
+
/** Local-first persistence (offline/optimistic resume + full log). */
|
|
66
|
+
sessionStore?: AgentSessionStore;
|
|
67
|
+
/** Optional approval gate before executing a flagged tool. */
|
|
68
|
+
approveTool?: (name: string, input: unknown) => Promise<boolean>;
|
|
69
|
+
/** Tools that must run serially (default: all run concurrently). */
|
|
70
|
+
serialTools?: string[];
|
|
71
|
+
onText?: (msgId: string, delta: string) => void;
|
|
72
|
+
onTurn?: (turn: Message, telemetry?: MsgTelemetry) => void;
|
|
73
|
+
onEvent?: (event: AgentEvent) => void;
|
|
74
|
+
onFrame?: (frame: AgentStreamFrame) => void;
|
|
75
|
+
}
|
|
76
|
+
export interface AgentController {
|
|
77
|
+
send(userText: string): Promise<void>;
|
|
78
|
+
resume(session: AgentSession): Promise<void>;
|
|
79
|
+
abort(): void;
|
|
80
|
+
getMessages(): Message[];
|
|
81
|
+
getTelemetryTotals(): AgentTelemetryTotals;
|
|
82
|
+
dispose(): void;
|
|
83
|
+
}
|
|
84
|
+
export declare function runAgent(config: RunAgentConfig): AgentController;
|
|
85
|
+
//# sourceMappingURL=runAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runAgent.d.ts","sourceRoot":"","sources":["../../../src/agent/client/runAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
// runAgent — the client-driven agentic loop (imperative, no React).
|
|
2
|
+
//
|
|
3
|
+
// The client owns the loop and executes every tool. Each turn is one
|
|
4
|
+
// `agentTurn` request whose RESPONSE is the authoritative result (content +
|
|
5
|
+
// stopReason + telemetry); live text frames ride the hub during the await and
|
|
6
|
+
// are surfaced via `onText`. On `stopReason:'tool_use'` the loop runs the tool
|
|
7
|
+
// handlers (concurrently, with an optional approval gate) and requests the next
|
|
8
|
+
// turn; on `end_turn` it stops.
|
|
9
|
+
//
|
|
10
|
+
// Production-harness features built in: cancellation/abort, cost/budget caps,
|
|
11
|
+
// retry/backoff on transient request failures (idempotent via msgId), and a
|
|
12
|
+
// tool-approval hook + parallel tool execution.
|
|
13
|
+
import { AGENT_STREAM_COLLECTION, AGENT_STREAM_KEY_FIELD, } from '../shared/AgentStream.js';
|
|
14
|
+
import { accrueTelemetry, emptyTelemetryTotals, } from '../shared/SessionStore.js';
|
|
15
|
+
import { compactMessages } from './compaction.js';
|
|
16
|
+
const REQUEST_RETRIES = 3;
|
|
17
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
18
|
+
function mintId() {
|
|
19
|
+
return Date.now().toString(36) + Math.random().toString(36).slice(2, 10);
|
|
20
|
+
}
|
|
21
|
+
function toolUsePartsOf(content) {
|
|
22
|
+
const out = [];
|
|
23
|
+
for (const part of content) {
|
|
24
|
+
if (part.type === 'tool_use')
|
|
25
|
+
out.push({ id: part.id, name: part.name, input: part.input });
|
|
26
|
+
}
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
export function runAgent(config) {
|
|
30
|
+
const streamId = config.streamId ?? config.sessionId;
|
|
31
|
+
const requestName = config.requestName ?? 'agentTurn';
|
|
32
|
+
let messages = [];
|
|
33
|
+
let totals = emptyTelemetryTotals();
|
|
34
|
+
let aborter = new AbortController();
|
|
35
|
+
let running = false;
|
|
36
|
+
// Subscribe once to the live frame channel (text streaming + agent frames).
|
|
37
|
+
const unsub = config.socket.trackDocs(AGENT_STREAM_COLLECTION, { keys: { [AGENT_STREAM_KEY_FIELD]: streamId } }, () => { }, (raw) => {
|
|
38
|
+
const env = raw;
|
|
39
|
+
const frame = env.frame ?? env;
|
|
40
|
+
if (!frame || typeof frame.type !== 'string')
|
|
41
|
+
return;
|
|
42
|
+
config.onFrame?.(frame);
|
|
43
|
+
if (frame.type === 'msg:delta')
|
|
44
|
+
config.onText?.(frame.msgId, frame.delta);
|
|
45
|
+
});
|
|
46
|
+
async function persist(status) {
|
|
47
|
+
if (!config.sessionStore)
|
|
48
|
+
return;
|
|
49
|
+
await config.sessionStore.save({
|
|
50
|
+
sessionId: config.sessionId,
|
|
51
|
+
model: config.model,
|
|
52
|
+
...(config.systemPrompt ? { systemPrompt: config.systemPrompt } : {}),
|
|
53
|
+
messages,
|
|
54
|
+
status,
|
|
55
|
+
updatedAt: Date.now(),
|
|
56
|
+
telemetryTotals: totals,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function budgetExceeded() {
|
|
60
|
+
const b = config.budget;
|
|
61
|
+
if (!b)
|
|
62
|
+
return null;
|
|
63
|
+
if (b.maxUsd !== undefined && totals.costUsd >= b.maxUsd)
|
|
64
|
+
return `cost cap reached ($${totals.costUsd.toFixed(4)} ≥ $${b.maxUsd})`;
|
|
65
|
+
if (b.maxTokens !== undefined &&
|
|
66
|
+
totals.inputTokens + totals.outputTokens >= b.maxTokens)
|
|
67
|
+
return `token cap reached (${totals.inputTokens + totals.outputTokens} ≥ ${b.maxTokens})`;
|
|
68
|
+
if (b.maxTurns !== undefined && totals.turns >= b.maxTurns)
|
|
69
|
+
return `turn cap reached (${totals.turns} ≥ ${b.maxTurns})`;
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
/** One turn request with retry/backoff; idempotent via the stable msgId. */
|
|
73
|
+
async function requestTurn(msgId) {
|
|
74
|
+
let lastErr;
|
|
75
|
+
for (let attempt = 1; attempt <= REQUEST_RETRIES; attempt++) {
|
|
76
|
+
if (aborter.signal.aborted)
|
|
77
|
+
throw new AbortError();
|
|
78
|
+
try {
|
|
79
|
+
const resp = (await config.socket.request(requestName, {
|
|
80
|
+
sessionId: config.sessionId,
|
|
81
|
+
streamId,
|
|
82
|
+
msgId,
|
|
83
|
+
model: config.model,
|
|
84
|
+
...(config.systemPrompt ? { systemPrompt: config.systemPrompt } : {}),
|
|
85
|
+
messages,
|
|
86
|
+
...(config.tools ? { tools: config.tools } : {}),
|
|
87
|
+
...(config.options ? { options: config.options } : {}),
|
|
88
|
+
}, { timeoutMs: null, signal: aborter.signal }));
|
|
89
|
+
return resp;
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
if (aborter.signal.aborted)
|
|
93
|
+
throw new AbortError();
|
|
94
|
+
lastErr = err;
|
|
95
|
+
if (attempt < REQUEST_RETRIES)
|
|
96
|
+
await sleep(300 * 2 ** (attempt - 1));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
throw lastErr instanceof Error ? lastErr : new Error('agent turn request failed');
|
|
100
|
+
}
|
|
101
|
+
async function runTool(use) {
|
|
102
|
+
try {
|
|
103
|
+
if (config.approveTool) {
|
|
104
|
+
const ok = await config.approveTool(use.name, use.input);
|
|
105
|
+
if (!ok)
|
|
106
|
+
return {
|
|
107
|
+
type: 'tool_result',
|
|
108
|
+
tool_use_id: use.id,
|
|
109
|
+
content: `Tool "${use.name}" was not approved by the user.`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const handler = config.toolHandlers[use.name];
|
|
113
|
+
if (!handler)
|
|
114
|
+
return {
|
|
115
|
+
type: 'tool_result',
|
|
116
|
+
tool_use_id: use.id,
|
|
117
|
+
content: `Error: no handler for tool "${use.name}".`,
|
|
118
|
+
};
|
|
119
|
+
const result = await handler(use.input);
|
|
120
|
+
return { type: 'tool_result', tool_use_id: use.id, content: result };
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
return {
|
|
124
|
+
type: 'tool_result',
|
|
125
|
+
tool_use_id: use.id,
|
|
126
|
+
content: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async function executeTools(uses) {
|
|
131
|
+
const serial = new Set(config.serialTools ?? []);
|
|
132
|
+
const serialUses = uses.filter((u) => serial.has(u.name));
|
|
133
|
+
const parallelUses = uses.filter((u) => !serial.has(u.name));
|
|
134
|
+
const results = await Promise.all(parallelUses.map((u) => runTool(u)));
|
|
135
|
+
for (const u of serialUses)
|
|
136
|
+
results.push(await runTool(u));
|
|
137
|
+
// Preserve the model's original tool order in the results.
|
|
138
|
+
const byId = new Map(results.map((r) => [r.tool_use_id, r]));
|
|
139
|
+
return uses.map((u) => byId.get(u.id));
|
|
140
|
+
}
|
|
141
|
+
/** The core loop — runs turns until end_turn / abort / budget / error. */
|
|
142
|
+
async function loop() {
|
|
143
|
+
running = true;
|
|
144
|
+
try {
|
|
145
|
+
for (;;) {
|
|
146
|
+
if (aborter.signal.aborted) {
|
|
147
|
+
config.onEvent?.({ type: 'aborted' });
|
|
148
|
+
await persist('idle');
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const capped = budgetExceeded();
|
|
152
|
+
if (capped) {
|
|
153
|
+
config.onEvent?.({ type: 'budget_exceeded', reason: capped, totals });
|
|
154
|
+
await persist('done');
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
// Compact the working context if needed (never touches the full log).
|
|
158
|
+
if (config.compaction) {
|
|
159
|
+
const c = await compactMessages(messages, config.compaction);
|
|
160
|
+
if (c.compacted) {
|
|
161
|
+
messages = c.messages;
|
|
162
|
+
config.onEvent?.({
|
|
163
|
+
type: 'compaction',
|
|
164
|
+
droppedCount: c.droppedCount,
|
|
165
|
+
...(c.summary ? { summary: c.summary } : {}),
|
|
166
|
+
});
|
|
167
|
+
await persist('running');
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const msgId = mintId();
|
|
171
|
+
config.onEvent?.({ type: 'turn_start', msgId, turnIndex: totals.turns });
|
|
172
|
+
const resp = await requestTurn(msgId);
|
|
173
|
+
const assistantTurn = { role: 'assistant', content: resp.content };
|
|
174
|
+
messages = [...messages, assistantTurn];
|
|
175
|
+
if (resp.telemetry) {
|
|
176
|
+
totals = accrueTelemetry(totals, {
|
|
177
|
+
...(resp.telemetry.model ? { model: resp.telemetry.model } : {}),
|
|
178
|
+
...(resp.telemetry.inputTokens !== undefined
|
|
179
|
+
? { inputTokens: resp.telemetry.inputTokens }
|
|
180
|
+
: {}),
|
|
181
|
+
...(resp.telemetry.outputTokens !== undefined
|
|
182
|
+
? { outputTokens: resp.telemetry.outputTokens }
|
|
183
|
+
: {}),
|
|
184
|
+
...(resp.telemetry.costUsd !== undefined
|
|
185
|
+
? { costUsd: resp.telemetry.costUsd }
|
|
186
|
+
: {}),
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
config.onTurn?.(assistantTurn, resp.telemetry);
|
|
190
|
+
config.onEvent?.({
|
|
191
|
+
type: 'turn_done',
|
|
192
|
+
msgId,
|
|
193
|
+
stopReason: resp.stopReason,
|
|
194
|
+
...(resp.telemetry ? { telemetry: resp.telemetry } : {}),
|
|
195
|
+
});
|
|
196
|
+
await persist(resp.stopReason === 'tool_use' ? 'running' : 'idle');
|
|
197
|
+
if (resp.stopReason === 'error') {
|
|
198
|
+
config.onEvent?.({ type: 'error', message: resp.error ?? 'agent turn error' });
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (resp.stopReason !== 'tool_use') {
|
|
202
|
+
config.onEvent?.({ type: 'done' });
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
const uses = toolUsePartsOf(resp.content);
|
|
206
|
+
config.onEvent?.({ type: 'tool_use', toolUse: uses });
|
|
207
|
+
const results = await executeTools(uses);
|
|
208
|
+
config.onEvent?.({ type: 'tool_result', results });
|
|
209
|
+
messages = [...messages, { role: 'user', content: results }];
|
|
210
|
+
await persist('running');
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
if (err instanceof AbortError || aborter.signal.aborted) {
|
|
215
|
+
config.onEvent?.({ type: 'aborted' });
|
|
216
|
+
await persist('idle');
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
config.onEvent?.({ type: 'error', message: err instanceof Error ? err.message : String(err) });
|
|
220
|
+
await persist('error');
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
running = false;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
async send(userText) {
|
|
228
|
+
if (running)
|
|
229
|
+
throw new Error('runAgent: a turn is already in progress');
|
|
230
|
+
if (aborter.signal.aborted)
|
|
231
|
+
aborter = new AbortController();
|
|
232
|
+
messages = [...messages, { role: 'user', content: userText }];
|
|
233
|
+
await persist('running');
|
|
234
|
+
await loop();
|
|
235
|
+
},
|
|
236
|
+
async resume(session) {
|
|
237
|
+
messages = session.messages;
|
|
238
|
+
totals = session.telemetryTotals ?? emptyTelemetryTotals();
|
|
239
|
+
if (aborter.signal.aborted)
|
|
240
|
+
aborter = new AbortController();
|
|
241
|
+
// If the loaded session ends on an assistant turn with unresolved
|
|
242
|
+
// tool_use (a crash/drop after the model turn but before tools ran),
|
|
243
|
+
// execute those tools and continue the loop. Otherwise idle for input.
|
|
244
|
+
const last = messages[messages.length - 1];
|
|
245
|
+
if (last?.role === 'assistant' && Array.isArray(last.content)) {
|
|
246
|
+
const uses = toolUsePartsOf(last.content);
|
|
247
|
+
if (uses.length > 0) {
|
|
248
|
+
const results = await executeTools(uses);
|
|
249
|
+
messages = [...messages, { role: 'user', content: results }];
|
|
250
|
+
await persist('running');
|
|
251
|
+
await loop();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
abort() {
|
|
256
|
+
aborter.abort();
|
|
257
|
+
},
|
|
258
|
+
getMessages() {
|
|
259
|
+
return messages;
|
|
260
|
+
},
|
|
261
|
+
getTelemetryTotals() {
|
|
262
|
+
return totals;
|
|
263
|
+
},
|
|
264
|
+
dispose() {
|
|
265
|
+
aborter.abort();
|
|
266
|
+
unsub();
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
class AbortError extends Error {
|
|
271
|
+
constructor() {
|
|
272
|
+
super('aborted');
|
|
273
|
+
this.name = 'AbortError';
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=runAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runAgent.js","sourceRoot":"","sources":["../../../src/agent/client/runAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Message } from '../../shared/TextGen.js';
|
|
2
|
+
import type { MsgTelemetry } from '../shared/AgentStream.js';
|
|
3
|
+
import type { AgentTelemetryTotals } from '../shared/SessionStore.js';
|
|
4
|
+
import { type AgentStreamingMessage } from './agentStreamReducer.js';
|
|
5
|
+
import { type AgentEvent, type RunAgentConfig } from './runAgent.js';
|
|
6
|
+
export type UseAgentStatus = 'idle' | 'running' | 'error';
|
|
7
|
+
export interface UseAgentResult {
|
|
8
|
+
messages: Message[];
|
|
9
|
+
streaming: AgentStreamingMessage[];
|
|
10
|
+
pendingToolUse: AgentStreamingMessage | null;
|
|
11
|
+
status: UseAgentStatus;
|
|
12
|
+
telemetryTotals: AgentTelemetryTotals;
|
|
13
|
+
lastTelemetry: MsgTelemetry | null;
|
|
14
|
+
send(userText: string): Promise<void>;
|
|
15
|
+
abort(): void;
|
|
16
|
+
}
|
|
17
|
+
export type UseAgentOptions = Omit<RunAgentConfig, 'socket' | 'onText' | 'onTurn' | 'onEvent' | 'onFrame'> & {
|
|
18
|
+
socket: RunAgentConfig['socket'];
|
|
19
|
+
onEvent?: (event: AgentEvent) => void;
|
|
20
|
+
};
|
|
21
|
+
export declare function useAgent(options: UseAgentOptions): UseAgentResult;
|
|
22
|
+
//# sourceMappingURL=useAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAgent.d.ts","sourceRoot":"","sources":["../../../src/agent/client/useAgent.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC,cAAc,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC7C,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,oBAAoB,CAAC;IACtC,aAAa,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAChC,cAAc,EACd,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CACvD,GAAG;IACF,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CA4FjE"}
|