@ag-ui/aws-strands 0.1.0 → 0.2.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.
- package/dist/{agent-B2EYZvns.d.ts → agent-CuzzhGkF.d.ts} +140 -3
- package/dist/agent-CuzzhGkF.d.ts.map +1 -0
- package/dist/{agent-Dp45JIaO.d.mts → agent-DQjKZfcY.d.mts} +140 -3
- package/dist/agent-DQjKZfcY.d.mts.map +1 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/server.d.mts +10 -2
- package/dist/server.d.mts.map +1 -1
- package/dist/server.d.ts +10 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +1 -1
- package/dist/server.mjs.map +1 -1
- package/package.json +10 -4
- package/dist/agent-B2EYZvns.d.ts.map +0 -1
- package/dist/agent-Dp45JIaO.d.mts.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { Agent, AgentConfig, Plugin, SessionManager } from "@strands-agents/sdk";
|
|
1
|
+
import { Agent, AgentConfig, Model, Plugin, SessionManager, Tool } from "@strands-agents/sdk";
|
|
2
2
|
import { BaseEvent, Message, RunAgentInput } from "@ag-ui/core";
|
|
3
|
+
import { A2UIGuidelines, A2UIRecoveryConfig, A2UIToolParams, A2UIValidationCatalog } from "@ag-ui/a2ui-toolkit";
|
|
3
4
|
|
|
4
5
|
//#region src/logger.d.ts
|
|
5
6
|
/**
|
|
@@ -22,6 +23,126 @@ interface Logger {
|
|
|
22
23
|
error(message: string, ...args: unknown[]): void;
|
|
23
24
|
}
|
|
24
25
|
//#endregion
|
|
26
|
+
//#region src/a2ui-tool.d.ts
|
|
27
|
+
/**
|
|
28
|
+
* Marker key on `ToolStreamEvent.data` payloads carrying the sub-agent's
|
|
29
|
+
* render_a2ui streaming progress out of the `generate_a2ui` tool. The adapter
|
|
30
|
+
* (`agent.ts`) translates these into synthetic inner TOOL_CALL_START/ARGS/END
|
|
31
|
+
* events on the AG-UI wire — the shape the a2ui middleware's streaming path
|
|
32
|
+
* needs to drive the "building" skeleton and progressive paint.
|
|
33
|
+
*/
|
|
34
|
+
declare const A2UI_STREAM_KEY = "__a2uiRenderStream";
|
|
35
|
+
/** One sub-agent render_a2ui streaming step, re-emitted on the AG-UI wire. */
|
|
36
|
+
interface A2UIRenderStreamEvent {
|
|
37
|
+
kind: "start" | "args" | "end";
|
|
38
|
+
/** The sub-agent's toolUseId — fresh per recovery attempt. */
|
|
39
|
+
toolCallId: string;
|
|
40
|
+
/** Tool name (start only). */
|
|
41
|
+
toolCallName?: string;
|
|
42
|
+
/** Raw args-JSON fragment (args only). */
|
|
43
|
+
delta?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Per-run glue the adapter threads into the tool. Optional: when omitted
|
|
47
|
+
* (dev-wired), the tool derives AG-UI history from `ctx.agent.messages`
|
|
48
|
+
* and runs with empty state.
|
|
49
|
+
*/
|
|
50
|
+
interface A2UIToolGlue {
|
|
51
|
+
/**
|
|
52
|
+
* The run's AG-UI messages (`RunAgentInput.messages`). Used by the toolkit's
|
|
53
|
+
* `findPriorSurface` for `intent:"update"`. When omitted, derived from the
|
|
54
|
+
* Strands conversation.
|
|
55
|
+
*/
|
|
56
|
+
aguiMessages?: Message[];
|
|
57
|
+
/**
|
|
58
|
+
* The run's `RunAgentInput.state`. `buildContextPrompt` reads
|
|
59
|
+
* `state["ag-ui"]` to put available-component context into the sub-agent
|
|
60
|
+
* prompt. When omitted, defaults to `{}`.
|
|
61
|
+
*/
|
|
62
|
+
state?: Record<string, unknown>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Build a Strands tool that delegates A2UI surface generation to a sub-agent
|
|
66
|
+
* running the toolkit recovery loop. Add the returned tool to a Strands
|
|
67
|
+
* `Agent`'s `tools` list yourself, or let `planA2UIInjection` build it.
|
|
68
|
+
*/
|
|
69
|
+
declare function getA2UITools<TModel = Model>(params: A2UIToolParams<TModel>, glue?: A2UIToolGlue): Tool;
|
|
70
|
+
/** Backend override knobs (mirrors the runtime `injectA2UITool` flag). */
|
|
71
|
+
interface A2UIInjectConfig {
|
|
72
|
+
/**
|
|
73
|
+
* Inject `generate_a2ui` regardless of the runtime flag (for non-CopilotKit
|
|
74
|
+
* hosts). `true` uses the default tool name; a string also sets the name of
|
|
75
|
+
* the injected render tool to drop.
|
|
76
|
+
*/
|
|
77
|
+
injectA2UITool?: boolean | string;
|
|
78
|
+
/** Inline catalog forwarded to the recovery loop (overrides context). */
|
|
79
|
+
catalog?: A2UIValidationCatalog;
|
|
80
|
+
/**
|
|
81
|
+
* Catalog id stamped into every `createSurface` op. Must match the catalog
|
|
82
|
+
* the host's renderer registered (e.g. the dojo's dynamic catalog), otherwise
|
|
83
|
+
* the renderer can't resolve the surface's components. Mirrors LangGraph's
|
|
84
|
+
* `getA2UITools({ defaultCatalogId })`. Falls back to the toolkit's basic
|
|
85
|
+
* catalog when unset.
|
|
86
|
+
*/
|
|
87
|
+
defaultCatalogId?: string;
|
|
88
|
+
/**
|
|
89
|
+
* Generation/design/composition prompt knobs forwarded to the sub-agent. Set
|
|
90
|
+
* `guidelines.compositionGuide` to teach the sub-agent the host catalog's
|
|
91
|
+
* components (names + props) — required for a real model to compose them,
|
|
92
|
+
* mirroring LangGraph's `getA2UITools({ guidelines })`.
|
|
93
|
+
*/
|
|
94
|
+
guidelines?: A2UIGuidelines;
|
|
95
|
+
/**
|
|
96
|
+
* Recovery loop config (attempt cap, retry-UI threshold) for the
|
|
97
|
+
* auto-injected tool. Defaults to the toolkit's `MAX_A2UI_ATTEMPTS` (3).
|
|
98
|
+
*/
|
|
99
|
+
recovery?: A2UIRecoveryConfig;
|
|
100
|
+
}
|
|
101
|
+
/** The injection decision: what to register and what to drop. */
|
|
102
|
+
interface A2UIInjectionPlan {
|
|
103
|
+
/** The `generate_a2ui` tool to register on the agent. */
|
|
104
|
+
tool: Tool;
|
|
105
|
+
/** Name the tool is registered under. */
|
|
106
|
+
toolName: string;
|
|
107
|
+
/** Injected render-tool names to drop so the model calls `generate_a2ui`. */
|
|
108
|
+
dropToolNames: string[];
|
|
109
|
+
/** Catalog resolved from context / config, passed to the recovery loop. */
|
|
110
|
+
catalog?: A2UIValidationCatalog;
|
|
111
|
+
}
|
|
112
|
+
interface PlanA2UIInjectionInput<TModel = Model> {
|
|
113
|
+
/** Model inferred from the wrapped agent (`null` for orchestrators). */
|
|
114
|
+
model: TModel | null | undefined;
|
|
115
|
+
/** The run input — read for `forwardedProps.injectA2UITool`, messages, state, catalog context. */
|
|
116
|
+
input: RunAgentInput;
|
|
117
|
+
/** Tool names already on the agent (user-prevails dedup). */
|
|
118
|
+
existingToolNames: string[];
|
|
119
|
+
/** Backend override config. */
|
|
120
|
+
config?: A2UIInjectConfig;
|
|
121
|
+
/** Logger for the orchestrator skip warning (only `warn` is used). */
|
|
122
|
+
log?: Pick<Logger, "warn">;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Decide whether to auto-inject `generate_a2ui` for this run, mirroring the
|
|
126
|
+
* LangGraph contract ("no injectA2UITool, no injection"):
|
|
127
|
+
*
|
|
128
|
+
* 1. Off unless the runtime forwarded `injectA2UITool` (`true`, or a string
|
|
129
|
+
* naming the injected RENDER tool to drop) OR a backend
|
|
130
|
+
* `config.injectA2UITool` override is set.
|
|
131
|
+
* 2. USER PREVAILS — if the dev already wired `generate_a2ui`, do not
|
|
132
|
+
* double-inject. (The per-run hook removes our OWN marked tool before
|
|
133
|
+
* computing `existingToolNames`, so this only catches a dev-wired tool.)
|
|
134
|
+
* Deliberately, NOTHING else is touched in this branch: the dev opted out
|
|
135
|
+
* of adapter management, so any runtime-injected render tool stays too.
|
|
136
|
+
* Limitation: the check is name-based — a dev-wired tool under a custom
|
|
137
|
+
* `toolName` is not recognized and auto-injection proceeds alongside it.
|
|
138
|
+
* 3. No inferable model (Graph/Swarm orchestrators) → warn + skip.
|
|
139
|
+
* 4. Otherwise build the tool (threading the run's AG-UI messages + state +
|
|
140
|
+
* guidelines), resolve the catalog, and drop the injected render tool.
|
|
141
|
+
*/
|
|
142
|
+
declare function planA2UIInjection<TModel = Model>(args: PlanA2UIInjectionInput<TModel>): A2UIInjectionPlan | null;
|
|
143
|
+
/** True if `tool` is a `generate_a2ui` this adapter auto-injected. */
|
|
144
|
+
declare function isAutoInjectedA2UITool(tool: unknown): boolean;
|
|
145
|
+
//#endregion
|
|
25
146
|
//#region src/config.d.ts
|
|
26
147
|
type StatePayload = Record<string, unknown>;
|
|
27
148
|
/**
|
|
@@ -148,6 +269,22 @@ interface StrandsAgentConfig {
|
|
|
148
269
|
* TypeScript-only. Default: `false`.
|
|
149
270
|
*/
|
|
150
271
|
emitChunkEvents?: boolean;
|
|
272
|
+
/**
|
|
273
|
+
* A2UI auto-injection config — everything A2UI-related in one place.
|
|
274
|
+
* When the CopilotKit runtime forwards `injectA2UITool` (or `a2ui.injectA2UITool`
|
|
275
|
+
* opts in on a host that doesn't), the adapter injects a `generate_a2ui`
|
|
276
|
+
* recovery tool and infers the model from the wrapped agent — no manual
|
|
277
|
+
* `getA2UITools()` needed. Knobs:
|
|
278
|
+
* - `injectA2UITool` — opt in without the runtime flag; a string also names
|
|
279
|
+
* the injected render tool to drop.
|
|
280
|
+
* - `defaultCatalogId` — catalog id stamped into auto-injected surfaces
|
|
281
|
+
* (must match the host renderer's catalog).
|
|
282
|
+
* - `guidelines.compositionGuide` — teaches the sub-agent the catalog's
|
|
283
|
+
* components; required for a real model to compose them.
|
|
284
|
+
* - `catalog` — inline catalog for catalog-aware (semantic) recovery.
|
|
285
|
+
* - `recovery` — attempt cap / retry-UI threshold.
|
|
286
|
+
*/
|
|
287
|
+
a2ui?: A2UIInjectConfig;
|
|
151
288
|
/**
|
|
152
289
|
* Optional injectable logger. Mirrors the Python adapter's
|
|
153
290
|
* `logging.getLogger("ag_ui_strands")`: the default surfaces `warn` / `error`
|
|
@@ -306,5 +443,5 @@ declare function convertMessagesForStrandsSeed(messages: Message[], log?: Logger
|
|
|
306
443
|
content: unknown[];
|
|
307
444
|
}>>;
|
|
308
445
|
//#endregion
|
|
309
|
-
export { ToolCallContext as _, convertMessagesForStrandsSeed as a, buildContextExtras as b, MaybePromise as c, StateContextBuilder as d, StateFromArgs as f, ToolBehavior as g, StrandsAgentConfig as h, buildStrandsSeed as i, PredictStateMapping as l, StatePayload as m, StrandsAgentOptions as n, ArgsStreamer as o, StateFromResult as p, buildSnapshotMessages as r, CustomResultHandler as s, StrandsAgent as t, SessionManagerProvider as u, ToolCallContextExtras as v,
|
|
310
|
-
//# sourceMappingURL=agent-
|
|
446
|
+
export { planA2UIInjection as A, A2UIRenderStreamEvent as C, PlanA2UIInjectionInput as D, A2UI_STREAM_KEY as E, getA2UITools as O, A2UIInjectionPlan as S, A2UIToolParams as T, ToolCallContext as _, convertMessagesForStrandsSeed as a, buildContextExtras as b, MaybePromise as c, StateContextBuilder as d, StateFromArgs as f, ToolBehavior as g, StrandsAgentConfig as h, buildStrandsSeed as i, Logger as j, isAutoInjectedA2UITool as k, PredictStateMapping as l, StatePayload as m, StrandsAgentOptions as n, ArgsStreamer as o, StateFromResult as p, buildSnapshotMessages as r, CustomResultHandler as s, StrandsAgent as t, SessionManagerProvider as u, ToolCallContextExtras as v, A2UIToolGlue as w, A2UIInjectConfig as x, ToolResultContext as y };
|
|
447
|
+
//# sourceMappingURL=agent-CuzzhGkF.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-CuzzhGkF.d.ts","names":[],"sources":["../src/logger.ts","../src/a2ui-tool.ts","../src/config.ts","../src/agent.ts"],"mappings":";;;;;;;;;;AAcA;;;;;;;;;UAAiB,MAAA;EACf,KAAA,CAAM,OAAA,aAAoB,IAAA;EAC1B,IAAA,CAAK,OAAA,aAAoB,IAAA;EACzB,KAAA,CAAM,OAAA,aAAoB,IAAA;AAAA;;;;;;;;;;cCgFf,eAAA;;UASI,qBAAA;EACf,IAAA;EAkC0B;EAhC1B,UAAA;EAiCuB;EA/BvB,YAAA;EAgCM;EA9BN,KAAA;AAAA;;;;;;UAQe,YAAA;EAsBT;;;;;EAhBN,YAAA,GAAe,OAAA;EAuhBgB;;;;;EAjhB/B,KAAA,GAAQ,MAAA;AAAA;;;;;;iBAQM,YAAA,UAAsB,KAAA,CAAA,CACpC,MAAA,EAAQ,cAAA,CAAe,MAAA,GACvB,IAAA,GAAM,YAAA,GACL,IAAA;;UAsgBc,gBAAA;EA2CuB;;;;;EArCtC,cAAA;EA2CA;EAzCA,OAAA,GAAU,qBAAA;EA2CD;;;;;;AAuBX;EA1DE,gBAAA;EA0D+B;;;;;;EAnD/B,UAAA,GAAa,cAAA;EAmDmB;;;;EA9ChC,QAAA,GAAW,kBAAA;AAAA;;UAII,iBAAA;EAuFD;EArFd,IAAA,EAAM,IAAA;;EAEN,QAAA;EAmFkD;EAjFlD,aAAA;;EAEA,OAAA,GAAU,qBAAA;AAAA;AAAA,UAGK,sBAAA,UAAgC,KAAA;;EAE/C,KAAA,EAAO,MAAA;EC3rBwB;ED6rB/B,KAAA,EAAO,aAAA;EClrB6B;EDorBpC,iBAAA;EC7qBkB;ED+qBlB,MAAA,GAAS,gBAAA;EC1qBgB;ED4qBzB,GAAA,GAAM,IAAA,CAAK,MAAA;AAAA;;;;;;;;;;ACxqBb;;;;;;;;;iBD6rBgB,iBAAA,UAA2B,KAAA,CAAA,CACzC,IAAA,EAAM,sBAAA,CAAuB,MAAA,IAC5B,iBAAA;;iBA2Ca,sBAAA,CAAuB,IAAA;;;KCrwB3B,YAAA,GAAe,MAAA;;;;;;;;;;UAWV,qBAAA;EFFT;;;;;;EESN,OAAA,EAAS,QAAA,CAAS,MAAA;EDuEP;;;;EClEX,cAAA,EAAgB,QAAA,CAAS,MAAA;AAAA;;UAIV,eAAA,SAAwB,qBAAA;EACvC,SAAA,EAAW,aAAA;EACX,QAAA;EACA,SAAA;EACA,SAAA;EACA,OAAA;AAAA;;UAIe,iBAAA,SAA0B,eAAA;EACzC,UAAA;EACA,SAAA;AAAA;AAAA,KAGU,YAAA,MAAkB,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,KAE9B,YAAA,IAAgB,GAAA,EAAK,eAAA,KAAoB,aAAA;AAAA,KACzC,aAAA,IACV,GAAA,EAAK,eAAA,KACF,YAAA,CAAa,YAAA;AAAA,KACN,eAAA,IACV,GAAA,EAAK,iBAAA,KACF,YAAA,CAAa,YAAA;AAAA,KACN,mBAAA,IACV,GAAA,EAAK,iBAAA,KACF,aAAA,CAAc,SAAA;AAAA,KACP,mBAAA,IACV,SAAA,EAAW,aAAA,EACX,MAAA,UD8EF;;AC5EE,MAAA,GAAS,qBAAA;AAAA,KAEC,sBAAA,IACV,SAAA,EAAW,aAAA,KACR,YAAA,CAAa,cAAA;;UAGD,mBAAA;EACf,QAAA;EACA,IAAA;EACA,YAAA;AAAA;;UAgBe,YAAA;EDoDf;;;;AAugBF;ECrjBE,oBAAA;;EAEA,yBAAA;ED0kBa;ECxkBb,wBAAA;ED6kB6B;EC3kB7B,YAAA,GAAe,mBAAA,GAAsB,QAAA,CAAS,mBAAA;EDqjB9C;ECnjBA,YAAA,GAAe,YAAA;EDqjBL;ECnjBV,aAAA,GAAgB,aAAA;EDkkBhB;EChkBA,eAAA,GAAkB,eAAA;EDqkBlB;ECnkBA,mBAAA,GAAsB,mBAAA;AAAA;;UAIP,kBAAA;EDmkBiB;ECjkBhC,aAAA,GAAgB,MAAA,SAAe,YAAA;EDykBA;ECvkB/B,mBAAA,GAAsB,mBAAA;EDikBhB;;;;;;;AASR;;;;;;;;EC1jBE,sBAAA,GAAyB,sBAAA;EDokBf;;;;;;;;EC3jBV,oBAAA;EDyjBA;;;;;;;AAuBF;;;ECrkBE,wBAAA;EDskB6B;;;;;;;EC9jB7B,eAAA;ED8jB6B;;;;;AA4C/B;;;;;;;;ACrwBA;;EA2KE,IAAA,GAAO,gBAAA;EA3KkB;;AAW3B;;;;;;;;;;;EA8KE,MAAA,GAAS,MAAA;AAAA;;;;;AA9JX;iBAqLgB,kBAAA,CACd,SAAA,EAAW,aAAA,GACV,qBAAA;;;;;;;UCzJO,mBAAA;EAAA,SACC,EAAA;EACT,MAAA,CAAO,KAAA,WAAgB,cAAA;AAAA;;;;;;;iBAgKT,qBAAA,CACd,cAAA,EAAgB,OAAA,KACf,OAAA;;UAiKc,mBAAA;EFrSW;;AAS5B;;;;EEmSE,KAAA,EAAO,KAAA,GAAmB,mBAAA;EAC1B,IAAA;EACA,WAAA;EACA,MAAA,GAAS,kBAAA;EF/RJ;;AAQP;;;;EE8RE,OAAA,GAAU,MAAA;AAAA;;cAIC,YAAA;EAAA,SACF,IAAA;EAAA,SACA,WAAA;EAAA,SACA,MAAA,EAAQ,kBAAA;EAAA,iBAGA,eAAA;EFpRS;;;;;;;;;EAAA,iBE+RT,QAAA;EAAA,iBAEA,eAAA;EAAA,iBACA,uBAAA;EFjSjB;;;;;;EAAA,iBEwSiB,eAAA;EFgOc;;;;;;EAAA,iBEzNd,mBAAA;EF+NjB;;EAAA,iBE5NiB,0BAAA;EFsOjB;;;;EAAA,iBEjOiB,aAAA;EF6OY;;AAI/B;;EAJ+B,iBExOZ,IAAA;cAEL,OAAA,EAAS,mBAAA;EF4OrB;EE7KO,GAAA,CAAI,SAAA,EAAW,aAAA,GAAgB,cAAA,CAAe,SAAA;EAAA,UAwCpC,OAAA,CACf,SAAA,EAAW,aAAA,GACV,cAAA,CAAe,SAAA;EAAA,QA0BH,eAAA;EF+Gf;;;;AAGF;;;;;;;;;EAHE,QE0tCe,aAAA;EF7sCL;;;;;EAAA,QEg6CK,gBAAA;EAAA,QAsLP,uBAAA;AAAA;;;;;;;;AFjkDV;;;;;;;;;;iBE6yDsB,gBAAA,CACpB,QAAA,EAAU,OAAA,IACV,GAAA,GAAM,MAAA,GACL,OAAA,CAAQ,WAAA;;;;;;iBA2BW,6BAAA,CACpB,QAAA,EAAU,OAAA,IACV,GAAA,GAAM,MAAA,GACL,OAAA,CAAQ,KAAA;EAAQ,IAAA;EAA4B,OAAA;AAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { Agent, AgentConfig, Plugin, SessionManager } from "@strands-agents/sdk";
|
|
1
|
+
import { Agent, AgentConfig, Model, Plugin, SessionManager, Tool } from "@strands-agents/sdk";
|
|
2
2
|
import { BaseEvent, Message as Message$1, RunAgentInput } from "@ag-ui/core";
|
|
3
|
+
import { A2UIGuidelines, A2UIRecoveryConfig, A2UIToolParams, A2UIValidationCatalog } from "@ag-ui/a2ui-toolkit";
|
|
3
4
|
|
|
4
5
|
//#region src/logger.d.ts
|
|
5
6
|
/**
|
|
@@ -22,6 +23,126 @@ interface Logger {
|
|
|
22
23
|
error(message: string, ...args: unknown[]): void;
|
|
23
24
|
}
|
|
24
25
|
//#endregion
|
|
26
|
+
//#region src/a2ui-tool.d.ts
|
|
27
|
+
/**
|
|
28
|
+
* Marker key on `ToolStreamEvent.data` payloads carrying the sub-agent's
|
|
29
|
+
* render_a2ui streaming progress out of the `generate_a2ui` tool. The adapter
|
|
30
|
+
* (`agent.ts`) translates these into synthetic inner TOOL_CALL_START/ARGS/END
|
|
31
|
+
* events on the AG-UI wire — the shape the a2ui middleware's streaming path
|
|
32
|
+
* needs to drive the "building" skeleton and progressive paint.
|
|
33
|
+
*/
|
|
34
|
+
declare const A2UI_STREAM_KEY = "__a2uiRenderStream";
|
|
35
|
+
/** One sub-agent render_a2ui streaming step, re-emitted on the AG-UI wire. */
|
|
36
|
+
interface A2UIRenderStreamEvent {
|
|
37
|
+
kind: "start" | "args" | "end";
|
|
38
|
+
/** The sub-agent's toolUseId — fresh per recovery attempt. */
|
|
39
|
+
toolCallId: string;
|
|
40
|
+
/** Tool name (start only). */
|
|
41
|
+
toolCallName?: string;
|
|
42
|
+
/** Raw args-JSON fragment (args only). */
|
|
43
|
+
delta?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Per-run glue the adapter threads into the tool. Optional: when omitted
|
|
47
|
+
* (dev-wired), the tool derives AG-UI history from `ctx.agent.messages`
|
|
48
|
+
* and runs with empty state.
|
|
49
|
+
*/
|
|
50
|
+
interface A2UIToolGlue {
|
|
51
|
+
/**
|
|
52
|
+
* The run's AG-UI messages (`RunAgentInput.messages`). Used by the toolkit's
|
|
53
|
+
* `findPriorSurface` for `intent:"update"`. When omitted, derived from the
|
|
54
|
+
* Strands conversation.
|
|
55
|
+
*/
|
|
56
|
+
aguiMessages?: Message$1[];
|
|
57
|
+
/**
|
|
58
|
+
* The run's `RunAgentInput.state`. `buildContextPrompt` reads
|
|
59
|
+
* `state["ag-ui"]` to put available-component context into the sub-agent
|
|
60
|
+
* prompt. When omitted, defaults to `{}`.
|
|
61
|
+
*/
|
|
62
|
+
state?: Record<string, unknown>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Build a Strands tool that delegates A2UI surface generation to a sub-agent
|
|
66
|
+
* running the toolkit recovery loop. Add the returned tool to a Strands
|
|
67
|
+
* `Agent`'s `tools` list yourself, or let `planA2UIInjection` build it.
|
|
68
|
+
*/
|
|
69
|
+
declare function getA2UITools<TModel = Model>(params: A2UIToolParams<TModel>, glue?: A2UIToolGlue): Tool;
|
|
70
|
+
/** Backend override knobs (mirrors the runtime `injectA2UITool` flag). */
|
|
71
|
+
interface A2UIInjectConfig {
|
|
72
|
+
/**
|
|
73
|
+
* Inject `generate_a2ui` regardless of the runtime flag (for non-CopilotKit
|
|
74
|
+
* hosts). `true` uses the default tool name; a string also sets the name of
|
|
75
|
+
* the injected render tool to drop.
|
|
76
|
+
*/
|
|
77
|
+
injectA2UITool?: boolean | string;
|
|
78
|
+
/** Inline catalog forwarded to the recovery loop (overrides context). */
|
|
79
|
+
catalog?: A2UIValidationCatalog;
|
|
80
|
+
/**
|
|
81
|
+
* Catalog id stamped into every `createSurface` op. Must match the catalog
|
|
82
|
+
* the host's renderer registered (e.g. the dojo's dynamic catalog), otherwise
|
|
83
|
+
* the renderer can't resolve the surface's components. Mirrors LangGraph's
|
|
84
|
+
* `getA2UITools({ defaultCatalogId })`. Falls back to the toolkit's basic
|
|
85
|
+
* catalog when unset.
|
|
86
|
+
*/
|
|
87
|
+
defaultCatalogId?: string;
|
|
88
|
+
/**
|
|
89
|
+
* Generation/design/composition prompt knobs forwarded to the sub-agent. Set
|
|
90
|
+
* `guidelines.compositionGuide` to teach the sub-agent the host catalog's
|
|
91
|
+
* components (names + props) — required for a real model to compose them,
|
|
92
|
+
* mirroring LangGraph's `getA2UITools({ guidelines })`.
|
|
93
|
+
*/
|
|
94
|
+
guidelines?: A2UIGuidelines;
|
|
95
|
+
/**
|
|
96
|
+
* Recovery loop config (attempt cap, retry-UI threshold) for the
|
|
97
|
+
* auto-injected tool. Defaults to the toolkit's `MAX_A2UI_ATTEMPTS` (3).
|
|
98
|
+
*/
|
|
99
|
+
recovery?: A2UIRecoveryConfig;
|
|
100
|
+
}
|
|
101
|
+
/** The injection decision: what to register and what to drop. */
|
|
102
|
+
interface A2UIInjectionPlan {
|
|
103
|
+
/** The `generate_a2ui` tool to register on the agent. */
|
|
104
|
+
tool: Tool;
|
|
105
|
+
/** Name the tool is registered under. */
|
|
106
|
+
toolName: string;
|
|
107
|
+
/** Injected render-tool names to drop so the model calls `generate_a2ui`. */
|
|
108
|
+
dropToolNames: string[];
|
|
109
|
+
/** Catalog resolved from context / config, passed to the recovery loop. */
|
|
110
|
+
catalog?: A2UIValidationCatalog;
|
|
111
|
+
}
|
|
112
|
+
interface PlanA2UIInjectionInput<TModel = Model> {
|
|
113
|
+
/** Model inferred from the wrapped agent (`null` for orchestrators). */
|
|
114
|
+
model: TModel | null | undefined;
|
|
115
|
+
/** The run input — read for `forwardedProps.injectA2UITool`, messages, state, catalog context. */
|
|
116
|
+
input: RunAgentInput;
|
|
117
|
+
/** Tool names already on the agent (user-prevails dedup). */
|
|
118
|
+
existingToolNames: string[];
|
|
119
|
+
/** Backend override config. */
|
|
120
|
+
config?: A2UIInjectConfig;
|
|
121
|
+
/** Logger for the orchestrator skip warning (only `warn` is used). */
|
|
122
|
+
log?: Pick<Logger, "warn">;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Decide whether to auto-inject `generate_a2ui` for this run, mirroring the
|
|
126
|
+
* LangGraph contract ("no injectA2UITool, no injection"):
|
|
127
|
+
*
|
|
128
|
+
* 1. Off unless the runtime forwarded `injectA2UITool` (`true`, or a string
|
|
129
|
+
* naming the injected RENDER tool to drop) OR a backend
|
|
130
|
+
* `config.injectA2UITool` override is set.
|
|
131
|
+
* 2. USER PREVAILS — if the dev already wired `generate_a2ui`, do not
|
|
132
|
+
* double-inject. (The per-run hook removes our OWN marked tool before
|
|
133
|
+
* computing `existingToolNames`, so this only catches a dev-wired tool.)
|
|
134
|
+
* Deliberately, NOTHING else is touched in this branch: the dev opted out
|
|
135
|
+
* of adapter management, so any runtime-injected render tool stays too.
|
|
136
|
+
* Limitation: the check is name-based — a dev-wired tool under a custom
|
|
137
|
+
* `toolName` is not recognized and auto-injection proceeds alongside it.
|
|
138
|
+
* 3. No inferable model (Graph/Swarm orchestrators) → warn + skip.
|
|
139
|
+
* 4. Otherwise build the tool (threading the run's AG-UI messages + state +
|
|
140
|
+
* guidelines), resolve the catalog, and drop the injected render tool.
|
|
141
|
+
*/
|
|
142
|
+
declare function planA2UIInjection<TModel = Model>(args: PlanA2UIInjectionInput<TModel>): A2UIInjectionPlan | null;
|
|
143
|
+
/** True if `tool` is a `generate_a2ui` this adapter auto-injected. */
|
|
144
|
+
declare function isAutoInjectedA2UITool(tool: unknown): boolean;
|
|
145
|
+
//#endregion
|
|
25
146
|
//#region src/config.d.ts
|
|
26
147
|
type StatePayload = Record<string, unknown>;
|
|
27
148
|
/**
|
|
@@ -148,6 +269,22 @@ interface StrandsAgentConfig {
|
|
|
148
269
|
* TypeScript-only. Default: `false`.
|
|
149
270
|
*/
|
|
150
271
|
emitChunkEvents?: boolean;
|
|
272
|
+
/**
|
|
273
|
+
* A2UI auto-injection config — everything A2UI-related in one place.
|
|
274
|
+
* When the CopilotKit runtime forwards `injectA2UITool` (or `a2ui.injectA2UITool`
|
|
275
|
+
* opts in on a host that doesn't), the adapter injects a `generate_a2ui`
|
|
276
|
+
* recovery tool and infers the model from the wrapped agent — no manual
|
|
277
|
+
* `getA2UITools()` needed. Knobs:
|
|
278
|
+
* - `injectA2UITool` — opt in without the runtime flag; a string also names
|
|
279
|
+
* the injected render tool to drop.
|
|
280
|
+
* - `defaultCatalogId` — catalog id stamped into auto-injected surfaces
|
|
281
|
+
* (must match the host renderer's catalog).
|
|
282
|
+
* - `guidelines.compositionGuide` — teaches the sub-agent the catalog's
|
|
283
|
+
* components; required for a real model to compose them.
|
|
284
|
+
* - `catalog` — inline catalog for catalog-aware (semantic) recovery.
|
|
285
|
+
* - `recovery` — attempt cap / retry-UI threshold.
|
|
286
|
+
*/
|
|
287
|
+
a2ui?: A2UIInjectConfig;
|
|
151
288
|
/**
|
|
152
289
|
* Optional injectable logger. Mirrors the Python adapter's
|
|
153
290
|
* `logging.getLogger("ag_ui_strands")`: the default surfaces `warn` / `error`
|
|
@@ -306,5 +443,5 @@ declare function convertMessagesForStrandsSeed(messages: Message$1[], log?: Logg
|
|
|
306
443
|
content: unknown[];
|
|
307
444
|
}>>;
|
|
308
445
|
//#endregion
|
|
309
|
-
export { ToolCallContext as _, convertMessagesForStrandsSeed as a, buildContextExtras as b, MaybePromise as c, StateContextBuilder as d, StateFromArgs as f, ToolBehavior as g, StrandsAgentConfig as h, buildStrandsSeed as i, PredictStateMapping as l, StatePayload as m, StrandsAgentOptions as n, ArgsStreamer as o, StateFromResult as p, buildSnapshotMessages as r, CustomResultHandler as s, StrandsAgent as t, SessionManagerProvider as u, ToolCallContextExtras as v,
|
|
310
|
-
//# sourceMappingURL=agent-
|
|
446
|
+
export { planA2UIInjection as A, A2UIRenderStreamEvent as C, PlanA2UIInjectionInput as D, A2UI_STREAM_KEY as E, getA2UITools as O, A2UIInjectionPlan as S, A2UIToolParams as T, ToolCallContext as _, convertMessagesForStrandsSeed as a, buildContextExtras as b, MaybePromise as c, StateContextBuilder as d, StateFromArgs as f, ToolBehavior as g, StrandsAgentConfig as h, buildStrandsSeed as i, Logger as j, isAutoInjectedA2UITool as k, PredictStateMapping as l, StatePayload as m, StrandsAgentOptions as n, ArgsStreamer as o, StateFromResult as p, buildSnapshotMessages as r, CustomResultHandler as s, StrandsAgent as t, SessionManagerProvider as u, ToolCallContextExtras as v, A2UIToolGlue as w, A2UIInjectConfig as x, ToolResultContext as y };
|
|
447
|
+
//# sourceMappingURL=agent-DQjKZfcY.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-DQjKZfcY.d.mts","names":[],"sources":["../src/logger.ts","../src/a2ui-tool.ts","../src/config.ts","../src/agent.ts"],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as ToolCallContext, a as convertMessagesForStrandsSeed, b as buildContextExtras, c as MaybePromise, d as StateContextBuilder, f as StateFromArgs, g as ToolBehavior, h as StrandsAgentConfig, i as buildStrandsSeed, l as PredictStateMapping, m as StatePayload, n as StrandsAgentOptions, o as ArgsStreamer, p as StateFromResult, r as buildSnapshotMessages, s as CustomResultHandler, t as StrandsAgent, u as SessionManagerProvider, v as ToolCallContextExtras, x as
|
|
1
|
+
import { A as planA2UIInjection, C as A2UIRenderStreamEvent, D as PlanA2UIInjectionInput, E as A2UI_STREAM_KEY, O as getA2UITools, S as A2UIInjectionPlan, T as A2UIToolParams, _ as ToolCallContext, a as convertMessagesForStrandsSeed, b as buildContextExtras, c as MaybePromise, d as StateContextBuilder, f as StateFromArgs, g as ToolBehavior, h as StrandsAgentConfig, i as buildStrandsSeed, j as Logger, k as isAutoInjectedA2UITool, l as PredictStateMapping, m as StatePayload, n as StrandsAgentOptions, o as ArgsStreamer, p as StateFromResult, r as buildSnapshotMessages, s as CustomResultHandler, t as StrandsAgent, u as SessionManagerProvider, v as ToolCallContextExtras, w as A2UIToolGlue, x as A2UIInjectConfig, y as ToolResultContext } from "./agent-DQjKZfcY.mjs";
|
|
2
2
|
import { Agent, ContentBlock, Tool } from "@strands-agents/sdk";
|
|
3
3
|
import { InputContent, Tool as Tool$1 } from "@ag-ui/core";
|
|
4
4
|
import { HttpAgent } from "@ag-ui/client";
|
|
@@ -47,5 +47,5 @@ declare function flattenContentToText(content: unknown): string;
|
|
|
47
47
|
//#region src/index.d.ts
|
|
48
48
|
declare class AWSStrandsAgent extends HttpAgent {}
|
|
49
49
|
//#endregion
|
|
50
|
-
export { AWSStrandsAgent, type ArgsStreamer, type CustomResultHandler, type Logger, type MaybePromise, type PredictStateMapping, type SessionManagerProvider, type StateContextBuilder, type StateFromArgs, type StateFromResult, type StatePayload, StrandsAgent, type StrandsAgentConfig, type StrandsAgentOptions, type StrandsToolRegistry, type ToolBehavior, type ToolCallContext, type ToolCallContextExtras, type ToolResultContext, buildContextExtras, buildSnapshotMessages, buildStrandsSeed, convertAguiContentToStrands, convertMessagesForStrandsSeed, createProxyTool, flattenContentToText, isProxyTool, syncProxyTools };
|
|
50
|
+
export { type A2UIInjectConfig, type A2UIInjectionPlan, type A2UIRenderStreamEvent, type A2UIToolGlue, type A2UIToolParams, A2UI_STREAM_KEY, AWSStrandsAgent, type ArgsStreamer, type CustomResultHandler, type Logger, type MaybePromise, type PlanA2UIInjectionInput, type PredictStateMapping, type SessionManagerProvider, type StateContextBuilder, type StateFromArgs, type StateFromResult, type StatePayload, StrandsAgent, type StrandsAgentConfig, type StrandsAgentOptions, type StrandsToolRegistry, type ToolBehavior, type ToolCallContext, type ToolCallContextExtras, type ToolResultContext, buildContextExtras, buildSnapshotMessages, buildStrandsSeed, convertAguiContentToStrands, convertMessagesForStrandsSeed, createProxyTool, flattenContentToText, getA2UITools, isAutoInjectedA2UITool, isProxyTool, planA2UIInjection, syncProxyTools };
|
|
51
51
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/client-proxy-tool.ts","../src/utils.ts","../src/index.ts"],"mappings":";;;;;;;KAkBY,mBAAA,GAAsB,KAAA;AAAlC;;;;;AAgBA;;AAhBA,iBAgBgB,eAAA,CAAgB,IAAA,EAAM,MAAA,GAAW,IAAA;;iBAqCjC,WAAA,CAAY,IAAA;;;;;AAA5B;;;;;AAkBA;iBAAgB,cAAA,CACd,YAAA,EAAc,mBAAA,EACd,SAAA,EAAW,MAAA,IACX,YAAA,EAAc,GAAA,UACd,GAAA,GAAK,MAAA,GACJ,GAAA;;;;;AA5EH;;;;;AAgBA;;;;iBCoGsB,2BAAA,CACpB,OAAA,EAAS,YAAA,IACT,GAAA,GAAK,MAAA,GACJ,OAAA,CAAQ,YAAA;;iBAkGK,oBAAA,CAAqB,OAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/client-proxy-tool.ts","../src/utils.ts","../src/index.ts"],"mappings":";;;;;;;KAkBY,mBAAA,GAAsB,KAAA;AAAlC;;;;;AAgBA;;AAhBA,iBAgBgB,eAAA,CAAgB,IAAA,EAAM,MAAA,GAAW,IAAA;;iBAqCjC,WAAA,CAAY,IAAA;;;;;AAA5B;;;;;AAkBA;iBAAgB,cAAA,CACd,YAAA,EAAc,mBAAA,EACd,SAAA,EAAW,MAAA,IACX,YAAA,EAAc,GAAA,UACd,GAAA,GAAK,MAAA,GACJ,GAAA;;;;;AA5EH;;;;;AAgBA;;;;iBCoGsB,2BAAA,CACpB,OAAA,EAAS,YAAA,IACT,GAAA,GAAK,MAAA,GACJ,OAAA,CAAQ,YAAA;;iBAkGK,oBAAA,CAAqB,OAAA;;;cC5KxB,eAAA,SAAwB,SAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as ToolCallContext, a as convertMessagesForStrandsSeed, b as buildContextExtras, c as MaybePromise, d as StateContextBuilder, f as StateFromArgs, g as ToolBehavior, h as StrandsAgentConfig, i as buildStrandsSeed, l as PredictStateMapping, m as StatePayload, n as StrandsAgentOptions, o as ArgsStreamer, p as StateFromResult, r as buildSnapshotMessages, s as CustomResultHandler, t as StrandsAgent, u as SessionManagerProvider, v as ToolCallContextExtras, x as
|
|
1
|
+
import { A as planA2UIInjection, C as A2UIRenderStreamEvent, D as PlanA2UIInjectionInput, E as A2UI_STREAM_KEY, O as getA2UITools, S as A2UIInjectionPlan, T as A2UIToolParams, _ as ToolCallContext, a as convertMessagesForStrandsSeed, b as buildContextExtras, c as MaybePromise, d as StateContextBuilder, f as StateFromArgs, g as ToolBehavior, h as StrandsAgentConfig, i as buildStrandsSeed, j as Logger, k as isAutoInjectedA2UITool, l as PredictStateMapping, m as StatePayload, n as StrandsAgentOptions, o as ArgsStreamer, p as StateFromResult, r as buildSnapshotMessages, s as CustomResultHandler, t as StrandsAgent, u as SessionManagerProvider, v as ToolCallContextExtras, w as A2UIToolGlue, x as A2UIInjectConfig, y as ToolResultContext } from "./agent-CuzzhGkF.js";
|
|
2
2
|
import { Agent, ContentBlock, Tool } from "@strands-agents/sdk";
|
|
3
3
|
import { InputContent, Tool as Tool$1 } from "@ag-ui/core";
|
|
4
4
|
import { HttpAgent } from "@ag-ui/client";
|
|
@@ -47,5 +47,5 @@ declare function flattenContentToText(content: unknown): string;
|
|
|
47
47
|
//#region src/index.d.ts
|
|
48
48
|
declare class AWSStrandsAgent extends HttpAgent {}
|
|
49
49
|
//#endregion
|
|
50
|
-
export { AWSStrandsAgent, type ArgsStreamer, type CustomResultHandler, type Logger, type MaybePromise, type PredictStateMapping, type SessionManagerProvider, type StateContextBuilder, type StateFromArgs, type StateFromResult, type StatePayload, StrandsAgent, type StrandsAgentConfig, type StrandsAgentOptions, type StrandsToolRegistry, type ToolBehavior, type ToolCallContext, type ToolCallContextExtras, type ToolResultContext, buildContextExtras, buildSnapshotMessages, buildStrandsSeed, convertAguiContentToStrands, convertMessagesForStrandsSeed, createProxyTool, flattenContentToText, isProxyTool, syncProxyTools };
|
|
50
|
+
export { type A2UIInjectConfig, type A2UIInjectionPlan, type A2UIRenderStreamEvent, type A2UIToolGlue, type A2UIToolParams, A2UI_STREAM_KEY, AWSStrandsAgent, type ArgsStreamer, type CustomResultHandler, type Logger, type MaybePromise, type PlanA2UIInjectionInput, type PredictStateMapping, type SessionManagerProvider, type StateContextBuilder, type StateFromArgs, type StateFromResult, type StatePayload, StrandsAgent, type StrandsAgentConfig, type StrandsAgentOptions, type StrandsToolRegistry, type ToolBehavior, type ToolCallContext, type ToolCallContextExtras, type ToolResultContext, buildContextExtras, buildSnapshotMessages, buildStrandsSeed, convertAguiContentToStrands, convertMessagesForStrandsSeed, createProxyTool, flattenContentToText, getA2UITools, isAutoInjectedA2UITool, isProxyTool, planA2UIInjection, syncProxyTools };
|
|
51
51
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/client-proxy-tool.ts","../src/utils.ts","../src/index.ts"],"mappings":";;;;;;;KAkBY,mBAAA,GAAsB,KAAA;AAAlC;;;;;AAgBA;;AAhBA,iBAgBgB,eAAA,CAAgB,IAAA,EAAM,MAAA,GAAW,IAAA;;iBAqCjC,WAAA,CAAY,IAAA;;;;;AAA5B;;;;;AAkBA;iBAAgB,cAAA,CACd,YAAA,EAAc,mBAAA,EACd,SAAA,EAAW,MAAA,IACX,YAAA,EAAc,GAAA,UACd,GAAA,GAAK,MAAA,GACJ,GAAA;;;;;AA5EH;;;;;AAgBA;;;;iBCoGsB,2BAAA,CACpB,OAAA,EAAS,YAAA,IACT,GAAA,GAAK,MAAA,GACJ,OAAA,CAAQ,YAAA;;iBAkGK,oBAAA,CAAqB,OAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/client-proxy-tool.ts","../src/utils.ts","../src/index.ts"],"mappings":";;;;;;;KAkBY,mBAAA,GAAsB,KAAA;AAAlC;;;;;AAgBA;;AAhBA,iBAgBgB,eAAA,CAAgB,IAAA,EAAM,MAAA,GAAW,IAAA;;iBAqCjC,WAAA,CAAY,IAAA;;;;;AAA5B;;;;;AAkBA;iBAAgB,cAAA,CACd,YAAA,EAAc,mBAAA,EACd,SAAA,EAAW,MAAA,IACX,YAAA,EAAc,GAAA,UACd,GAAA,GAAK,MAAA,GACJ,GAAA;;;;;AA5EH;;;;;AAgBA;;;;iBCoGsB,2BAAA,CACpB,OAAA,EAAS,YAAA,IACT,GAAA,GAAK,MAAA,GACJ,OAAA,CAAQ,YAAA;;iBAkGK,oBAAA,CAAqB,OAAA;;;cC5KxB,eAAA,SAAwB,SAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
let e=require(`crypto`),t=require(`@strands-agents/sdk`),n=require(`@ag-ui/core`),r=require(`@ag-ui/client`);function i(e){return{state_key:e.stateKey,tool:e.tool,tool_argument:e.toolArgument}}const a=new Set([`__proto__`,`constructor`,`prototype`]);function o(e){return typeof e==`object`&&!!e&&`stateKey`in e&&`tool`in e&&`toolArgument`in e}function s(e){let t=Object.create(null),n=e.context;if(Array.isArray(n))for(let e of n){if(!e||typeof e!=`object`)continue;let n=e;typeof n.description!=`string`||n.description.length===0||a.has(n.description)||(t[n.description]=typeof n.value==`string`?n.value:String(n.value??``))}let r=e.forwardedProps;return{context:t,forwardedProps:r&&typeof r==`object`&&!Array.isArray(r)?r:{}}}async function c(e){return await Promise.resolve(e)}function l(e){return e===void 0?[]:o(e)?[e]:Array.from(e)}const u={debug(){},warn:(e,...t)=>console.warn(e,...t),error:(e,...t)=>console.error(e,...t)};function d(e){return e??u}const f=`[@ag-ui/aws-strands]`,p=Symbol.for(`@ag-ui/aws-strands.proxyTool`);function m(e){let n=e.description&&e.description.length>0?e.description:`Client-side tool: ${e.name}`,r={name:e.name,description:n,inputSchema:e.parameters??{type:`object`,properties:{}}};return{name:r.name,description:n,toolSpec:r,[p]:!0,async*stream(e){return new t.ToolResultBlock({toolUseId:e.toolUse.toolUseId,status:`success`,content:[new t.TextBlock(`Forwarded to client`)]})}}}function h(e){return typeof e==`object`&&!!e&&e[p]===!0}function g(e,t,n,r=u){let i=new Set;for(let e of t)e.name&&i.add(e.name);for(let t of n){if(i.has(t))continue;let n=e.get(t);n&&h(n)&&(e.remove(t),r.debug(`${f} Removed stale proxy tool: ${t}`))}let a=new Set;for(let n of t){if(!n.name)continue;let t=e.get(n.name);if(t&&!h(t)){r.warn(`${f} Native tool "${n.name}" shadows client-declared tool with the same name; client tool will not be registered`);continue}t&&e.remove(n.name),e.add(m(n)),a.add(n.name),r.debug(`${f} Registered proxy tool: ${n.name}`)}return a}const _=`[@ag-ui/aws-strands]`,v=new Set([`png`,`jpeg`,`gif`,`webp`]),y=new Set([`pdf`,`csv`,`doc`,`docx`,`xls`,`xlsx`,`html`,`txt`,`md`]),b=new Set([`flv`,`mkv`,`mov`,`mpeg`,`mpg`,`mp4`,`three_gp`,`webm`,`wmv`]);function x(e,t,n){if(!e)return n.warn(`${_} No MIME type provided, cannot determine format`),null;let r=e.split(`/`).pop()?.toLowerCase()??``;return t.has(r)?r:(n.warn(`${_} Unsupported MIME type '${e}' (parsed format '${r}' not in ${JSON.stringify([...t].sort())})`),null)}async function S(e,t){let n=new AbortController,r=setTimeout(()=>n.abort(),3e4);try{let r=await fetch(e,{signal:n.signal});if(!r.ok)return t.warn(`${_} Failed to fetch URL ${e}: HTTP ${r.status}`),null;let i=await r.arrayBuffer();return new Uint8Array(i)}catch(n){return t.warn(`${_} Failed to fetch URL ${e}:`,n),null}finally{clearTimeout(r)}}function C(e,t){try{let t=globalThis.atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}catch(e){return t.warn(`${_} Failed to decode base64 content:`,e),null}}async function w(e,t){return e.type===`data`?C(e.value,t):e.type===`url`?await S(e.value,t):(t.warn(`${_} Unknown content source type: ${e.type}, cannot resolve bytes`),null)}async function T(e,n=u){let r=[];for(let i of e){if(i.type===`text`){r.push(new t.TextBlock(i.text));continue}if(i.type===`image`){let e=i,a=await w(e.source,n);if(!a)continue;let o=x(e.source.mimeType,v,n);if(!o)continue;r.push(new t.ImageBlock({format:o,source:{bytes:a}}));continue}if(i.type===`document`){let e=i,a=await w(e.source,n);if(!a)continue;let o=x(e.source.mimeType,y,n);if(!o)continue;r.push(new t.DocumentBlock({format:o,name:`document`,source:{bytes:a}}));continue}if(i.type===`video`){let e=i,a=await w(e.source,n);if(!a)continue;let o=x(e.source.mimeType,b,n);if(!o)continue;r.push(new t.VideoBlock({format:o,source:{bytes:a}}));continue}if(i.type===`audio`){n.warn(`${_} Skipping audio content: Strands has no audio support`);continue}if(i.type===`binary`){let e=i,a=null;if(e.data?a=C(e.data,n):e.url&&(a=await S(e.url,n)),!a){n.warn(`${_} Skipping binary content: could not resolve bytes`);continue}let o=x(e.mimeType,v,n);if(!o){n.warn(`${_} Skipping binary content: unsupported MIME type '${e.mimeType}'`);continue}r.push(new t.ImageBlock({format:o,source:{bytes:a}}));continue}n.warn(`${_} Skipping unknown content type: ${i.type}`)}return r}function E(e){if(e==null)return``;if(typeof e==`string`)return e;if(Array.isArray(e)){let t=[];for(let n of e){if(!n||typeof n!=`object`)continue;let e=n;e.type===`text`&&typeof e.text==`string`&&t.push(e.text),e.type===`textBlock`&&typeof e.text==`string`&&t.push(e.text)}return t.join(` `)}return``}const D=`[@ag-ui/aws-strands]`,O=()=>(0,e.randomUUID)();function k(e){let t={model:e.model,tools:e.tools.slice()};e.systemPrompt!==void 0&&(t.systemPrompt=e.systemPrompt),e.name!==void 0&&(t.name=e.name),e.id!==void 0&&(t.id=e.id),e.description!==void 0&&(t.description=e.description);let n=e.appState?.getAll?.();n&&Object.keys(n).length>0&&(t.appState=n);let r=e.modelState?.getAll?.();r&&Object.keys(r).length>0&&(t.modelState=r);let i=e;return i.traceAttributes!==void 0&&(t.traceAttributes=i.traceAttributes),i.structuredOutputSchema!==void 0&&(t.structuredOutputSchema=i.structuredOutputSchema),i.toolExecutor!==void 0&&(t.toolExecutor=i.toolExecutor),t}function A(e){return typeof e==`string`?e:e==null?``:Array.isArray(e)?E(e):String(e)}function j(e){let t=A(e),n=t.trim();if(n.length===0)return{text:t};let r=n[0];if(r!==`{`&&r!==`[`)return{text:t};try{let e=JSON.parse(n);if(typeof e==`object`&&e)return{json:e}}catch{}return{text:t}}function M(e){return typeof e==`string`&&e.length>0?e:O()}function N(e){return e instanceof Error?e.message:String(e)}function P(e,t,n){for(let[n,r]of e)if(r.strandsToolId===t)return n;return n?O():t||O()}function F(e){let t=[];for(let n of e??[]){let e=n.role;if(e!==`user`&&e!==`assistant`&&e!==`tool`)continue;let r=M(n.id);if(e===`user`)t.push({id:r,role:`user`,content:A(n.content)});else if(e===`assistant`){let e=n.toolCalls,i;e&&e.length>0&&(i=e.map(e=>{let t=e.function;return{id:M(e.id),type:`function`,function:{name:t?.name??`unknown`,arguments:t?.arguments??`{}`}}}));let a={id:r,role:`assistant`,content:A(n.content)};i&&(a.toolCalls=i),t.push(a)}else{let e=n.toolCallId??``;t.push({id:r,role:`tool`,content:A(n.content),toolCallId:e})}}return t}async function I(e,n){let r=[];for(let i of e??[]){let e=i.role;if(e===`user`){let e=[],a=i.content;if(Array.isArray(a))if(a.some(e=>[`image`,`audio`,`video`,`document`].includes(e.type??``))){try{let r=await T(a,n);for(let n of r)if(n instanceof t.TextBlock)e.push({text:n.text});else{let t=typeof n.toJSON==`function`?n.toJSON():n;e.push(t)}}catch(e){n.warn(`${D} history replay multimodal conversion failed; falling back to text`,e)}e.length===0&&e.push({text:E(a)||``})}else e.push({text:E(a)});else e.push({text:A(a)});r.push({role:`user`,content:e})}else if(e===`assistant`){let e=[],t=A(i.content);t&&e.push({text:t});let a=i.toolCalls??[];for(let t of a){let r=t.function,i=r?.name||`unknown`,a=r?.arguments||`{}`,o;try{o=JSON.parse(a)}catch(e){n.warn(`${D} history tool args JSON parse failed for ${i}; falling back to {}`,e),o={}}(typeof o!=`object`||!o||Array.isArray(o))&&(o={}),e.push({toolUse:{toolUseId:t.id,name:i,input:o}})}e.length===0&&e.push({text:``}),r.push({role:`assistant`,content:e})}else if(e===`tool`){let e=i.toolCallId||``;r.push({role:`user`,content:[{toolResult:{toolUseId:e,content:[j(i.content)],status:`success`}}]})}}return r}var L=class{constructor(e){this._agentsByThread=new Map,this._proxyToolNamesByThread=new Map,this._threadInitLock=new R,this._activeRunsByThread=new Set,this._pendingInterruptsByThread=new Map;let{agent:t,name:n,description:r=``,config:i={},plugins:a}=e,o=t.model===void 0||t.model===null;if(this.name=n,this.description=r,this.config=i,this._log=d(i.logger),o){this._orchestrator=t,this._templateFields={model:void 0,tools:[]},this._plugins=[];return}this._orchestrator=null;let s=t;this._templateFields=k(s),this._plugins=a?[...a]:[],s.sessionManager&&!this.config.sessionManagerProvider&&this._log.warn(`${D} sessionManager was set on the template Agent but will be ignored: forwarding it would cause every AG-UI thread to share the same session_id. Construct per-thread session managers via StrandsAgentConfig.sessionManagerProvider instead.`);for(let e of this._templateFields.tools??[])e!=null&&typeof e.connect==`function`&&typeof e.name!=`string`&&this._log.warn(`${D} an entry in the template Agent's \`tools\` looks like an unconnected McpClient — its tools will not be available to the model. Call \`await client.connect()\` and spread the resolved tool list into \`tools: [...]\` before constructing the Agent.`)}async*run(e){let t=e.threadId||`default`;if(Array.isArray(e.resume)&&e.resume.length>0){let n=this._pendingInterruptsByThread.get(t),r=e.resume.map(e=>e.interruptId).filter(e=>!n?.has(e));if(r.length>0){yield z(e),yield B(`This agent did not issue any interrupts to resume: ${r.slice(0,4).join(`, `)}. Resume entries must reference an outstanding interruptId.`,`UNKNOWN_INTERRUPT`);return}}else this._pendingInterruptsByThread.delete(t);let n=this._runRaw(e);if(this.config.emitChunkEvents){yield*K(n);return}yield*n}async*_runRaw(e){let t=e.threadId||`default`;if(this._activeRunsByThread.has(t)){yield z(e),yield B(`Another run is already in progress on thread "${t}". Wait for RUN_FINISHED before starting a new run on the same thread.`,`THREAD_BUSY`);return}this._activeRunsByThread.add(t);try{this._orchestrator===null?yield*this._runSingleAgent(e,t):yield*this._runOrchestrator(e)}finally{this._activeRunsByThread.delete(t)}}async*_runSingleAgent(e,r){yield z(e);let a=this._agentsByThread.get(r);if(!a){let n;if(!this.config.sessionManagerProvider)try{n=await q(e.messages??[],this._log)}catch(e){this._log.error(`${D} buildStrandsSeed failed for thread ${r}: ${N(e)}`,e),yield B(`Failed to build conversation seed: `+N(e),`SEED_BUILD_ERROR`);return}let i=await this._threadInitLock.acquire();try{if(a=this._agentsByThread.get(r),!a){let i;if(this.config.sessionManagerProvider){try{i=await c(this.config.sessionManagerProvider(e))}catch(e){let t=N(e);this._log.error(`${D} sessionManagerProvider failed: ${t}`,e),yield B(`Failed to initialize session manager: ${t}`,`SESSION_MANAGER_ERROR`);return}if(i!=null&&!(i instanceof t.SessionManager)){let e=i?.constructor?.name??typeof i;this._log.error(`${D} sessionManagerProvider returned ${e}; expected a SessionManager instance.`),yield B(`sessionManagerProvider returned ${e}; expected a SessionManager instance`,`SESSION_MANAGER_INVALID_TYPE`);return}i||this._log.warn(`${D} sessionManagerProvider returned null/undefined for threadId=${r}; agent will run without session persistence`)}let o=i?void 0:n;a=new t.Agent(this._buildThreadAgentConfig(i??void 0,o)),this._agentsByThread.set(r,a)}}finally{i()}}if(e.tools&&e.tools.length>0){let t=g(a.toolRegistry,e.tools,this._proxyToolNamesByThread.get(r)??new Set,this._log);this._proxyToolNamesByThread.set(r,t)}else{let e=this._proxyToolNamesByThread.get(r);e&&e.size>0&&(g(a.toolRegistry,[],e,this._log),this._proxyToolNamesByThread.set(r,new Set))}try{let o=this.config.emitMessagesSnapshot!==!1,u=o?F(e.messages??[]):[];if(e.state&&typeof e.state==`object`){let t={};for(let[n,r]of Object.entries(e.state))n!==`messages`&&(t[n]=r);yield{type:n.EventType.STATE_SNAPSHOT,snapshot:t}}o&&u.length>0&&(yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:u.slice()});let d=new Set;for(let t of e.tools??[])t.name&&d.add(t.name);let f=new Set;if(e.messages){for(let t=e.messages.length-1;t>=0;t--){let n=e.messages[t];if(!n)break;if(n.role===`tool`){let e=n.toolCallId;e&&f.add(e)}else break}f.size>0&&this._log.debug(`${D} Has pending tool results detected: toolCallIds=${JSON.stringify([...f])}, threadId=${e.threadId}`)}let p=new Map;for(let t of e.messages??[]){if(t.role!==`assistant`)continue;let e=t.toolCalls;if(e)for(let t of e){let e=t.function;t.id&&e?.name&&p.set(t.id,e.name)}}let m=`Hello`;if(f.size>0&&e.messages)for(let t=e.messages.length-1;t>=0;t--){let n=e.messages[t];if(!n)break;if(n.role===`tool`){let e=n.toolCallId;if(e){let t=p.get(e);t&&d.has(t)&&(m=`${t} executed successfully with no return value.`)}break}}else if(e.messages)for(let t=e.messages.length-1;t>=0;t--){let n=e.messages[t];if(!n)break;if((n.role===`user`||n.role===`tool`)&&n.content!=null){if(Array.isArray(n.content))if(n.content.some(e=>[`image`,`audio`,`video`,`document`].includes(e.type??``))){let e=await T(n.content,this._log);if(e.length>0)m=e;else{let e=E(n.content);if(e)m=e,this._log.warn(`${D} all media content blocks failed conversion; falling back to text`);else{yield B(`All media content blocks failed conversion and no text fallback is available`,`MEDIA_RESOLUTION_FAILED`);return}}}else m=E(n.content);else m=n.content;break}}if(this.config.stateContextBuilder)try{let t=Array.isArray(m)?E(m):m,n=this.config.stateContextBuilder(e,t,s(e));Array.isArray(m)||(m=n)}catch(e){this._log.error(`${D} stateContextBuilder failed:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`stateContextBuilder`,tool:`__prompt__`,error:N(e)}}}let h=O(),g=!1,_=``,v=new Map,y={...e.state??{}},b=!1,x=!1,S=!1,C=!1,w,k=null,A=this.config.replayHistoryIntoStrands!==!1&&!a.sessionManager,j=m,M=V(e);if(M.length>0&&(j=M.map(e=>new t.InterruptResponseContent({interruptId:e.interruptId,response:H(e)})),this._pendingInterruptsByThread.delete(r)),A&&M.length===0){let r=await I(e.messages??[],this._log);if(r.length>0){if(this.config.stateContextBuilder)for(let t=r.length-1;t>=0;t--){let i=r[t];if(!i||i.role!==`user`)continue;let a=i.content[0];if(a&&typeof a.text==`string`){try{let t=this.config.stateContextBuilder(e,a.text,s(e));typeof t==`string`&&(a.text=t)}catch(e){this._log.error(`${D} stateContextBuilder failed:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`stateContextBuilder`,tool:`__prompt__`,error:N(e)}}}break}}a.messages=r.map(e=>t.Message.fromMessageData({role:e.role,content:e.content})),j=void 0}}this._log.debug(`${D} Starting agent run: threadId=${e.threadId}, runId=${e.runId}, pendingToolResultIds=${JSON.stringify([...f])}, messageCount=${e.messages?.length??0}`);let L=new AbortController,R=a.stream(j,{cancelSignal:L.signal}),z;try{for(;;){let r;try{r=await R.next()}catch(e){if(S||x){if(e instanceof TypeError||e instanceof ReferenceError)throw e;x=!0;break}throw e}if(r.done){z=r.value;break}if(x)continue;let a=G(r.value),p=W(a);if(p===`modelContentBlockDeltaEvent`){let t=a.delta;if(t.type===`textDelta`&&t.text){if(b)continue;g||=(yield{type:n.EventType.TEXT_MESSAGE_START,messageId:h,role:`assistant`},!0),_+=t.text,yield{type:n.EventType.TEXT_MESSAGE_CONTENT,messageId:h,delta:t.text};continue}if(t.type===`reasoningContentDelta`){t.text?(C||=(w=O(),yield{type:n.EventType.REASONING_START,messageId:w},yield{type:n.EventType.REASONING_MESSAGE_START,messageId:w,role:`reasoning`},!0),yield{type:n.EventType.REASONING_MESSAGE_CONTENT,messageId:w,delta:t.text}):t.redactedContent&&(C||=(w=O(),yield{type:n.EventType.REASONING_START,messageId:w},yield{type:n.EventType.REASONING_MESSAGE_START,messageId:w,role:`reasoning`},!0),yield{type:n.EventType.REASONING_ENCRYPTED_VALUE,subtype:`message`,entityId:w,encryptedValue:Buffer.from(t.redactedContent).toString(`base64`)});continue}if(t.type===`toolUseInputDelta`&&k){k.inputChunks.push(t.input);let{name:r,toolUseId:a}=k,s=d.has(r),c=P(v,a,s),p=v.get(c);if(!p){let t=f.has(c),d=this.config.toolBehaviors?.[r];this._log.debug(`${D} Tool call event received: toolName=${r}, toolUseId=${c}, strandsId=${a}, isFrontend=${s}, threadId=${e.threadId}`);let m=!t&&!d?.argsStreamer;if(p={name:r,args:``,input:{},raw:``,emitted:!1,startEmitted:!1,endEmitted:!1,lastEmittedRawLen:0,isPending:t,isFrontend:s,useStreaming:m,strandsToolId:a},v.set(c,p),m){if(g&&(yield{type:n.EventType.TEXT_MESSAGE_END,messageId:h},o&&_&&(u.push({id:h,role:`assistant`,content:_}),_=``,yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:u.slice()}),g=!1,h=O()),d){let e=l(d.predictState).map(i);e.length>0&&(yield{type:n.EventType.CUSTOM,name:`PredictState`,value:e})}yield{type:n.EventType.TOOL_CALL_START,toolCallId:c,toolCallName:r,parentMessageId:h},p.startEmitted=!0}}let m=k.inputChunks.join(``);p.raw=m;try{p.input=JSON.parse(m)}catch{p.input=m}if(p.args=typeof p.input==`string`?p.input:JSON.stringify(p.input),p.startEmitted&&p.useStreaming){let e=p.lastEmittedRawLen??0;m.length>e&&(yield{type:n.EventType.TOOL_CALL_ARGS,toolCallId:c,delta:m.slice(e)},p.lastEmittedRawLen=m.length)}}continue}if(p===`reasoningSignatureEvent`)continue;if(p===`modelContentBlockStartEvent`){let e=a.start;e?.type===`toolUseStart`&&e.name&&(k={name:e.name,toolUseId:e.toolUseId??O(),inputChunks:[]});continue}if(p===`modelContentBlockStopEvent`){if(C&&(yield{type:n.EventType.REASONING_MESSAGE_END,messageId:w},yield{type:n.EventType.REASONING_END,messageId:w},C=!1,w=void 0),k){let{name:t,toolUseId:r,inputChunks:i}=k;k=null;let a=i.join(``),l={};if(a)try{l=JSON.parse(a)}catch(e){this._log.warn(`${D} tool args JSON parse failed for ${t}; using raw string`,e),l=a}let p=d.has(t),m=P(v,r,p),b=typeof l==`string`?l:JSON.stringify(l);if(!v.has(m))v.set(m,{name:t,args:b,input:l,emitted:!1,strandsToolId:r,raw:a});else{let e=v.get(m);e.args=b,e.input=l,e.raw=a}let x=v.get(m),C=this.config.toolBehaviors?.[t];if(this._log.debug(`${D} contentBlockStop close: toolName=${t}, toolUseId=${m}, isFrontendTool=${p}, isPending=${x.isPending??!1}, useStreaming=${x.useStreaming??!1}, threadId=${e.threadId}`),x.startEmitted&&x.useStreaming){let r=x.lastEmittedRawLen??0;if(a.length>r&&(yield{type:n.EventType.TOOL_CALL_ARGS,toolCallId:m,delta:a.slice(r)},x.lastEmittedRawLen=a.length),C?.stateFromArgs){let r={inputData:e,toolName:t,toolUseId:m,toolInput:l,argsStr:b,...s(e)};try{let e=await c(C.stateFromArgs(r));e&&(Object.assign(y,e),yield{type:n.EventType.STATE_SNAPSHOT,snapshot:e})}catch(e){this._log.error(`${D} stateFromArgs failed for ${t}:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`stateFromArgs`,tool:t,error:N(e)}}}}yield{type:n.EventType.TOOL_CALL_END,toolCallId:m},x.endEmitted=!0,x.emitted=!0,o&&!C?.skipMessagesSnapshot&&(u.push({id:h,role:`assistant`,content:``,toolCalls:[{id:m,type:`function`,function:{name:t||`unknown`,arguments:b||`{}`}}]}),yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:u.slice()},h=O()),p&&!C?.continueAfterFrontendCall&&(this._log.debug(`${D} Deferring halt after frontend tool call: toolName=${t}, toolCallId=${m}, threadId=${e.threadId}`),S=!0)}else yield*this._emitToolCall({inputData:e,toolUseId:m,isFrontendTool:p,pendingToolResultIds:f,getMessageId:()=>h,setMessageId:e=>{h=e},getMessageStarted:()=>g,setMessageStarted:e=>{g=e},getAccumulatedText:()=>_,setAccumulatedText:e=>{_=e},snapshotMessages:u,emitMessagesSnapshot:o,toolCallsSeen:v,currentState:y,onPendingHalt:()=>{S=!0}})}continue}if(p===`toolUseBlock`){let t=a,n=d.has(t.name),r=P(v,t.toolUseId,n),i=typeof t.input==`string`?t.input:JSON.stringify(t.input);if(!v.has(r))v.set(r,{name:t.name,args:i,input:t.input,emitted:!1,strandsToolId:t.toolUseId});else{let e=v.get(r);e.args=i,e.input=t.input}yield*this._emitToolCall({inputData:e,toolUseId:r,isFrontendTool:n,pendingToolResultIds:f,getMessageId:()=>h,setMessageId:e=>{h=e},getMessageStarted:()=>g,setMessageStarted:e=>{g=e},getAccumulatedText:()=>_,setAccumulatedText:e=>{_=e},snapshotMessages:u,emitMessagesSnapshot:o,toolCallsSeen:v,currentState:y,onPendingHalt:()=>{S=!0}});continue}if(p===`afterToolCallEvent`){if(S){x=!0;try{L.abort()}catch{}break}let r=a,i=r.toolUse.toolUseId,l=r.toolUse.name;if(d.has(l))continue;let f=null,p=r.result?.content;if(Array.isArray(p))for(let e of p){if(e instanceof t.TextBlock){try{f=JSON.parse(e.text)}catch{try{f=JSON.parse(e.text.replace(/'/g,`"`))}catch(t){this._log.warn(`${D} tool result JSON parse failed for ${l}; using raw text`,t),f=e.text}}break}let n=e.json;if(n!==void 0){f=n;break}}if(!i)continue;let m=v.get(i),C=m?.args,w=m?.input,T=this.config.toolBehaviors?.[l];this._log.debug(`${D} Processing tool result: toolName=${l}, resultToolId=${i}, threadId=${e.threadId}`);let E=O(),k=f==null?``:JSON.stringify(f);yield{type:n.EventType.TOOL_CALL_RESULT,toolCallId:i,messageId:E,content:k},o&&!T?.skipMessagesSnapshot&&(u.push({id:E,role:`tool`,content:k,toolCallId:i}),yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:u.slice()});let A={inputData:e,toolName:l,toolUseId:i,toolInput:w,argsStr:C??`{}`,resultData:f,messageId:h,...s(e)};if(T?.stateFromResult)try{let e=await c(T.stateFromResult(A));e&&(Object.assign(y,e),yield{type:n.EventType.STATE_SNAPSHOT,snapshot:e})}catch(e){this._log.error(`${D} stateFromResult failed for ${l}:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`stateFromResult`,tool:l,error:N(e)}}}if(T?.customResultHandler)try{for await(let e of T.customResultHandler(A))e&&(yield e)}catch(e){this._log.error(`${D} customResultHandler failed for ${l}:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`customResultHandler`,tool:l,error:N(e)}}}if(T?.stopStreamingAfterResult){b=!0,g&&(yield{type:n.EventType.TEXT_MESSAGE_END,messageId:h},g=!1,o&&_&&(u.push({id:h,role:`assistant`,content:_}),_=``,yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:u.slice()})),this._log.debug(`${D} Breaking event stream: stopStreamingAfterResult behavior triggered (threadId=${e.threadId}, toolName=${l})`),x=!0;break}continue}if(p===`toolStreamEvent`){let e=a.data;e&&typeof e==`object`&&`state`in e&&(yield{type:n.EventType.STATE_SNAPSHOT,snapshot:e.state});continue}let m=a;if(m?.type===`beforeNodeCallEvent`){yield{type:n.EventType.STEP_STARTED,stepName:`${m.nodeType??`agent`}:${m.nodeId??`unknown`}`};continue}if(m?.type===`afterNodeCallEvent`){yield{type:n.EventType.STEP_FINISHED,stepName:`${m.nodeType??`agent`}:${m.nodeId??`unknown`}`};continue}if(m?.type===`multiAgentHandoffEvent`){let e=m.message;yield{type:n.EventType.CUSTOM,name:`MultiAgentHandoff`,value:{from_nodes:m.source?[m.source]:[],to_nodes:m.targets??[],message:e}};continue}}}finally{try{L.abort()}catch{}try{await R.return(void 0)}catch{}}if(C&&(yield{type:n.EventType.REASONING_MESSAGE_END,messageId:w},yield{type:n.EventType.REASONING_END,messageId:w}),g&&(yield{type:n.EventType.TEXT_MESSAGE_END,messageId:h},o&&_&&(u.push({id:h,role:`assistant`,content:_}),_=``,yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:u.slice()})),yield{type:n.EventType.STATE_SNAPSHOT,snapshot:y},z?.stopReason===`interrupt`){let t=z.interrupts??[];if(t.length>0){let i=t.map(e=>e.id);this._pendingInterruptsByThread.set(r,new Set(i)),yield{type:n.EventType.RUN_FINISHED,threadId:e.threadId,runId:e.runId,outcome:{type:`interrupt`,interrupts:t.map(U)}};return}}yield{type:n.EventType.RUN_FINISHED,threadId:e.threadId,runId:e.runId}}catch(e){let t=e instanceof TypeError||e instanceof ReferenceError?`ADAPTER_BUG`:`STRANDS_ERROR`;this._log.error(`${D} _runSingleAgent failed:`,e),yield B(N(e),t)}}async*_emitToolCall(e){let t=e.toolCallsSeen.get(e.toolUseId);if(!t||t.emitted)return;t.emitted=!0;let r=t.name,a=t.args,o=t.input,u=this.config.toolBehaviors?.[r],d=e.pendingToolResultIds.has(e.toolUseId),f={inputData:e.inputData,toolName:r,toolUseId:e.toolUseId,toolInput:o,argsStr:a,...s(e.inputData)};if(d){if(u?.stateFromArgs)try{let t=await c(u.stateFromArgs(f));t&&(Object.assign(e.currentState,t),yield{type:n.EventType.STATE_SNAPSHOT,snapshot:t})}catch(e){this._log.error(`${D} stateFromArgs failed for ${r}:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`stateFromArgs`,tool:r,error:N(e)}}}return}if(u?.stateFromArgs)try{let t=await c(u.stateFromArgs(f));t&&(Object.assign(e.currentState,t),yield{type:n.EventType.STATE_SNAPSHOT,snapshot:t})}catch(e){this._log.error(`${D} stateFromArgs failed for ${r}:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`stateFromArgs`,tool:r,error:N(e)}}}if(u){let e=l(u.predictState).map(i);e.length>0&&(yield{type:n.EventType.CUSTOM,name:`PredictState`,value:e})}if(e.getMessageStarted()){yield{type:n.EventType.TEXT_MESSAGE_END,messageId:e.getMessageId()};let t=e.getAccumulatedText();e.emitMessagesSnapshot&&t&&(e.snapshotMessages.push({id:e.getMessageId(),role:`assistant`,content:t}),e.setAccumulatedText(``),yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:e.snapshotMessages.slice()}),e.setMessageStarted(!1),e.setMessageId(O())}yield{type:n.EventType.TOOL_CALL_START,toolCallId:e.toolUseId,toolCallName:r,parentMessageId:e.getMessageId()};let p=!1;if(u?.argsStreamer)try{for await(let t of u.argsStreamer(f))t!=null&&(yield{type:n.EventType.TOOL_CALL_ARGS,toolCallId:e.toolUseId,delta:String(t)})}catch(e){p=!0,this._log.error(`${D} argsStreamer failed for ${r}:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`argsStreamer`,tool:r,error:N(e)}}}else yield{type:n.EventType.TOOL_CALL_ARGS,toolCallId:e.toolUseId,delta:a};if(p){yield{type:n.EventType.TOOL_CALL_END,toolCallId:e.toolUseId};return}yield{type:n.EventType.TOOL_CALL_END,toolCallId:e.toolUseId},e.emitMessagesSnapshot&&!u?.skipMessagesSnapshot&&(e.snapshotMessages.push({id:e.getMessageId(),role:`assistant`,content:``,toolCalls:[{id:e.toolUseId,type:`function`,function:{name:r||`unknown`,arguments:a||`{}`}}]}),yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:e.snapshotMessages.slice()},e.setMessageId(O())),e.isFrontendTool&&!u?.continueAfterFrontendCall&&(this._log.debug(`${D} Deferring halt after frontend tool call: toolName=${r}, toolCallId=${e.toolUseId}, threadId=${e.inputData.threadId}`),e.onPendingHalt())}async*_runOrchestrator(e){yield z(e);try{if(e.state&&typeof e.state==`object`){let t={};for(let[n,r]of Object.entries(e.state))n!==`messages`&&(t[n]=r);yield{type:n.EventType.STATE_SNAPSHOT,snapshot:t}}let t=`Hello`;if(e.messages)for(let n=e.messages.length-1;n>=0;n--){let r=e.messages[n];if(!r)break;if((r.role===`user`||r.role===`tool`)&&r.content!=null){t=typeof r.content==`string`?r.content:E(r.content);break}}let r=O(),i=!1,a=!1,o,s=this._orchestrator.stream(t);try{for await(let e of s){let t=G(e),s=W(t);if(s===`beforeNodeCallEvent`){let e=t;yield{type:n.EventType.STEP_STARTED,stepName:`${e.nodeType??`agent`}:${e.nodeId??`unknown`}`};continue}if(s===`afterNodeCallEvent`){let e=t;i&&(yield{type:n.EventType.TEXT_MESSAGE_END,messageId:r},i=!1,r=O()),a&&(yield{type:n.EventType.REASONING_MESSAGE_END,messageId:o},yield{type:n.EventType.REASONING_END,messageId:o},a=!1,o=void 0),yield{type:n.EventType.STEP_FINISHED,stepName:`${e.nodeType??`agent`}:${e.nodeId??`unknown`}`};continue}if(s===`multiAgentHandoffEvent`){let e=t;yield{type:n.EventType.CUSTOM,name:`MultiAgentHandoff`,value:{from_nodes:e.source?[e.source]:[],to_nodes:e.targets??[],message:e.message}};continue}if(s===`nodeStreamUpdateEvent`){let e=t,s=e.inner?.event?G(e.inner.event):void 0;if(W(s)===`modelContentBlockDeltaEvent`){let e=s.delta;e?.type===`textDelta`&&e.text?(i||=(yield{type:n.EventType.TEXT_MESSAGE_START,messageId:r,role:`assistant`},!0),yield{type:n.EventType.TEXT_MESSAGE_CONTENT,messageId:r,delta:e.text}):e?.type===`reasoningContentDelta`&&e.text&&(a||=(o=O(),yield{type:n.EventType.REASONING_START,messageId:o},yield{type:n.EventType.REASONING_MESSAGE_START,messageId:o,role:`reasoning`},!0),yield{type:n.EventType.REASONING_MESSAGE_CONTENT,messageId:o,delta:e.text})}continue}}}finally{try{await s.return(void 0)}catch{}}i&&(yield{type:n.EventType.TEXT_MESSAGE_END,messageId:r}),a&&(yield{type:n.EventType.REASONING_MESSAGE_END,messageId:o},yield{type:n.EventType.REASONING_END,messageId:o}),yield{type:n.EventType.STATE_SNAPSHOT,snapshot:{}},yield{type:n.EventType.RUN_FINISHED,threadId:e.threadId,runId:e.runId}}catch(e){let t=e instanceof TypeError||e instanceof ReferenceError?`ADAPTER_BUG`:`STRANDS_ERROR`;this._log.error(`${D} _runOrchestrator failed:`,e),yield B(N(e),t)}}_buildThreadAgentConfig(e,t){let n=this._templateFields,r={model:n.model,tools:n.tools.slice(),printer:!1};return n.systemPrompt!==void 0&&(r.systemPrompt=n.systemPrompt),n.name!==void 0&&(r.name=n.name),n.description!==void 0&&(r.description=n.description),n.id!==void 0&&(r.id=n.id),n.appState!==void 0&&(r.appState=n.appState),n.modelState!==void 0&&(r.modelState=n.modelState),n.traceAttributes!==void 0&&(r.traceAttributes=n.traceAttributes),n.structuredOutputSchema!==void 0&&(r.structuredOutputSchema=n.structuredOutputSchema),n.toolExecutor!==void 0&&(r.toolExecutor=n.toolExecutor),e&&(r.sessionManager=e),t&&t.length>0&&(r.messages=t),this._plugins.length>0&&(r.plugins=[...this._plugins]),r}},R=class{constructor(){this._tail=Promise.resolve()}async acquire(){let e,t=new Promise(t=>{e=t}),n=this._tail;return this._tail=t,await n,e}};function z(e){return{type:n.EventType.RUN_STARTED,threadId:e.threadId,runId:e.runId}}function B(e,t){return{type:n.EventType.RUN_ERROR,message:e,code:t}}function V(e){let t=e.resume;return Array.isArray(t)&&t.length>0?t:[]}function H(e){return e.status===`cancelled`?{status:`cancelled`}:e.payload}function U(e){let t=e.reason,n=typeof t==`string`&&t.length>0?t:`confirmation`,r={id:e.id,reason:n};if(typeof t==`string`&&t.length>0)r.message=t;else if(t!=null)try{r.message=JSON.stringify(t)}catch{}return r.metadata={strandsName:e.name},r}function W(e){if(e&&typeof e==`object`&&`type`in e){let t=e.type;return typeof t==`string`?t:void 0}}function G(e){if(!e||typeof e!=`object`)return e;let t=e.type;return t===`modelStreamUpdateEvent`&&`event`in e||t===`toolStreamUpdateEvent`&&`event`in e?e.event:t===`contentBlockEvent`&&`contentBlock`in e?e.contentBlock:e}async function*K(e){for await(let t of e)switch(t.type){case n.EventType.TEXT_MESSAGE_START:{let e=t;yield{type:n.EventType.TEXT_MESSAGE_CHUNK,messageId:e.messageId,role:e.role};break}case n.EventType.TEXT_MESSAGE_CONTENT:{let e=t;yield{type:n.EventType.TEXT_MESSAGE_CHUNK,messageId:e.messageId,delta:e.delta};break}case n.EventType.TEXT_MESSAGE_END:break;case n.EventType.TOOL_CALL_START:{let e=t;yield{type:n.EventType.TOOL_CALL_CHUNK,toolCallId:e.toolCallId,toolCallName:e.toolCallName,parentMessageId:e.parentMessageId};break}case n.EventType.TOOL_CALL_ARGS:{let e=t;yield{type:n.EventType.TOOL_CALL_CHUNK,toolCallId:e.toolCallId,delta:e.delta};break}case n.EventType.TOOL_CALL_END:break;case n.EventType.REASONING_MESSAGE_START:{let e=t;yield{type:n.EventType.REASONING_MESSAGE_CHUNK,messageId:e.messageId};break}case n.EventType.REASONING_MESSAGE_CONTENT:{let e=t;yield{type:n.EventType.REASONING_MESSAGE_CHUNK,messageId:e.messageId,delta:e.delta};break}case n.EventType.REASONING_MESSAGE_END:break;default:yield t}}async function q(e,t){if(e.length===0)return;let n=e.length;if(e[e.length-1]?.role===`user`&&(n=e.length-1),n<=0)return;let r=await J(e.slice(0,n),t);if(r.length!==0){for(;r.length>0&&r[0]?.role!==`user`;)r.shift();if(r.length!==0)return r}}async function J(e,n){let r=[],i=null,a=null,o=()=>{a&&a.length>0&&r.push({role:`user`,content:a}),a=null,i=null};for(let s of e){let e=s.role;if(e===`system`||e===`developer`)continue;if(e===`assistant`){o();let e=s.toolCalls,t=[];if(typeof s.content==`string`&&s.content.length>0)t.push({text:s.content});else if(Array.isArray(s.content))for(let e of s.content)e&&typeof e==`object`&&`text`in e&&t.push({text:e.text});if(e&&e.length>0){i=new Map;for(let r of e){if(!r?.id||!r.function?.name)continue;let e={};try{e=r.function.arguments?JSON.parse(r.function.arguments):{}}catch(t){n?.warn(`${D} seed tool args JSON parse failed for ${r.function.name}; using raw string`,t),e=r.function.arguments??{}}t.push({toolUse:{name:r.function.name,toolUseId:r.id,input:e}}),i.set(r.id,r.function.name)}}if(t.length===0)continue;r.push({role:`assistant`,content:t});continue}if(e===`tool`){let e=s.toolCallId;if(!e||!i||!i.has(e))continue;let t=s.content,n=typeof t==`string`?t:Array.isArray(t)?t.map(e=>e&&typeof e==`object`&&`text`in e?e.text??``:``).join(``):``;a??=[],a.push({toolResult:{toolUseId:e,status:`success`,content:[{text:n}]}});continue}o();let c=[],l=s.content;if(typeof l==`string`)l.length>0&&c.push({text:l});else if(Array.isArray(l))if(l.some(e=>{if(!e||typeof e!=`object`)return!1;let t=e.type;return t===`image`||t===`audio`||t===`video`||t===`document`}))try{let e=await T(l,n);for(let n of e)if(n instanceof t.TextBlock)c.push({text:n.text});else{let e=typeof n.toJSON==`function`?n.toJSON():n;c.push(e)}}catch(e){(n??u).warn(`${D} seed multimodal conversion failed; dropping attachments for this turn`,e);let t=E(l);t.length>0&&c.push({text:t})}else for(let e of l)e&&typeof e==`object`&&`text`in e&&c.push({text:e.text});c.length!==0&&r.push({role:`user`,content:c})}return o(),r}var Y=class extends r.HttpAgent{};exports.AWSStrandsAgent=Y,exports.StrandsAgent=L,exports.buildContextExtras=s,exports.buildSnapshotMessages=F,exports.buildStrandsSeed=q,exports.convertAguiContentToStrands=T,exports.convertMessagesForStrandsSeed=J,exports.createProxyTool=m,exports.flattenContentToText=E,exports.isProxyTool=h,exports.syncProxyTools=g;
|
|
1
|
+
let e=require(`crypto`),t=require(`@strands-agents/sdk`),n=require(`@ag-ui/core`),r=require(`@ag-ui/a2ui-toolkit`),i=require(`@ag-ui/client`);function a(e){return{state_key:e.stateKey,tool:e.tool,tool_argument:e.toolArgument}}const o=new Set([`__proto__`,`constructor`,`prototype`]);function s(e){return typeof e==`object`&&!!e&&`stateKey`in e&&`tool`in e&&`toolArgument`in e}function c(e){let t=Object.create(null),n=e.context;if(Array.isArray(n))for(let e of n){if(!e||typeof e!=`object`)continue;let n=e;typeof n.description!=`string`||n.description.length===0||o.has(n.description)||(t[n.description]=typeof n.value==`string`?n.value:String(n.value??``))}let r=e.forwardedProps;return{context:t,forwardedProps:r&&typeof r==`object`&&!Array.isArray(r)?r:{}}}async function l(e){return await Promise.resolve(e)}function u(e){return e===void 0?[]:s(e)?[e]:Array.from(e)}const d={debug(){},warn:(e,...t)=>console.warn(e,...t),error:(e,...t)=>console.error(e,...t)};function f(e){return e??d}const p=`[@ag-ui/aws-strands]`,m=Symbol.for(`@ag-ui/aws-strands.proxyTool`);function h(e){let n=e.description&&e.description.length>0?e.description:`Client-side tool: ${e.name}`,r={name:e.name,description:n,inputSchema:e.parameters??{type:`object`,properties:{}}};return{name:r.name,description:n,toolSpec:r,[m]:!0,async*stream(e){return new t.ToolResultBlock({toolUseId:e.toolUse.toolUseId,status:`success`,content:[new t.TextBlock(`Forwarded to client`)]})}}}function g(e){return typeof e==`object`&&!!e&&e[m]===!0}function _(e,t,n,r=d){let i=new Set;for(let e of t)e.name&&i.add(e.name);for(let t of n){if(i.has(t))continue;let n=e.get(t);n&&g(n)&&(e.remove(t),r.debug(`${p} Removed stale proxy tool: ${t}`))}let a=new Set;for(let n of t){if(!n.name)continue;let t=e.get(n.name);if(t&&!g(t)){r.warn(`${p} Native tool "${n.name}" shadows client-declared tool with the same name; client tool will not be registered`);continue}t&&e.remove(n.name),e.add(h(n)),a.add(n.name),r.debug(`${p} Registered proxy tool: ${n.name}`)}return a}const v=`[@ag-ui/aws-strands]`,y=new Set([`png`,`jpeg`,`gif`,`webp`]),b=new Set([`pdf`,`csv`,`doc`,`docx`,`xls`,`xlsx`,`html`,`txt`,`md`]),x=new Set([`flv`,`mkv`,`mov`,`mpeg`,`mpg`,`mp4`,`three_gp`,`webm`,`wmv`]);function S(e,t,n){if(!e)return n.warn(`${v} No MIME type provided, cannot determine format`),null;let r=e.split(`/`).pop()?.toLowerCase()??``;return t.has(r)?r:(n.warn(`${v} Unsupported MIME type '${e}' (parsed format '${r}' not in ${JSON.stringify([...t].sort())})`),null)}async function C(e,t){let n=new AbortController,r=setTimeout(()=>n.abort(),3e4);try{let r=await fetch(e,{signal:n.signal});if(!r.ok)return t.warn(`${v} Failed to fetch URL ${e}: HTTP ${r.status}`),null;let i=await r.arrayBuffer();return new Uint8Array(i)}catch(n){return t.warn(`${v} Failed to fetch URL ${e}:`,n),null}finally{clearTimeout(r)}}function w(e,t){try{let t=globalThis.atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}catch(e){return t.warn(`${v} Failed to decode base64 content:`,e),null}}async function T(e,t){return e.type===`data`?w(e.value,t):e.type===`url`?await C(e.value,t):(t.warn(`${v} Unknown content source type: ${e.type}, cannot resolve bytes`),null)}async function E(e,n=d){let r=[];for(let i of e){if(i.type===`text`){r.push(new t.TextBlock(i.text));continue}if(i.type===`image`){let e=i,a=await T(e.source,n);if(!a)continue;let o=S(e.source.mimeType,y,n);if(!o)continue;r.push(new t.ImageBlock({format:o,source:{bytes:a}}));continue}if(i.type===`document`){let e=i,a=await T(e.source,n);if(!a)continue;let o=S(e.source.mimeType,b,n);if(!o)continue;r.push(new t.DocumentBlock({format:o,name:`document`,source:{bytes:a}}));continue}if(i.type===`video`){let e=i,a=await T(e.source,n);if(!a)continue;let o=S(e.source.mimeType,x,n);if(!o)continue;r.push(new t.VideoBlock({format:o,source:{bytes:a}}));continue}if(i.type===`audio`){n.warn(`${v} Skipping audio content: Strands has no audio support`);continue}if(i.type===`binary`){let e=i,a=null;if(e.data?a=w(e.data,n):e.url&&(a=await C(e.url,n)),!a){n.warn(`${v} Skipping binary content: could not resolve bytes`);continue}let o=S(e.mimeType,y,n);if(!o){n.warn(`${v} Skipping binary content: unsupported MIME type '${e.mimeType}'`);continue}r.push(new t.ImageBlock({format:o,source:{bytes:a}}));continue}n.warn(`${v} Skipping unknown content type: ${i.type}`)}return r}function D(e){if(e==null)return``;if(typeof e==`string`)return e;if(Array.isArray(e)){let t=[];for(let n of e){if(!n||typeof n!=`object`)continue;let e=n;e.type===`text`&&typeof e.text==`string`&&t.push(e.text),e.type===`textBlock`&&typeof e.text==`string`&&t.push(e.text)}return t.join(` `)}return``}const O=r.RENDER_A2UI_TOOL_DEF.function.name,k=Symbol.for(`@ag-ui/aws-strands.a2uiAutoInjected`),A=`__a2uiRenderStream`;let j=0;function M(e,n={}){if(e?.model==null)throw Error(`getA2UITools requires a 'model' (the Strands model instance the render sub-agent runs on).`);let{model:i,guidelines:a,defaultSurfaceId:o,defaultCatalogId:s,toolName:c,toolDescription:l,catalog:u,recovery:f,onA2UIAttempt:p}=(0,r.resolveA2UIToolParams)(e),m=i;return{name:c,description:l,toolSpec:{name:c,description:l,inputSchema:{type:`object`,properties:{intent:{type:`string`,enum:[`create`,`update`],description:r.GENERATE_A2UI_ARG_DESCRIPTIONS.intent},target_surface_id:{type:`string`,description:r.GENERATE_A2UI_ARG_DESCRIPTIONS.target_surface_id},changes:{type:`string`,description:r.GENERATE_A2UI_ARG_DESCRIPTIONS.changes}}}},async*stream(e){let i=e.toolUse.input??{},l=ne(e.agent.messages??[],c),h=[...n.aguiMessages??[],...ie(l)],g=(0,r.prepareA2UIRequest)({intent:i.intent,targetSurfaceId:i.target_surface_id,changes:i.changes,messages:h,state:n.state&&typeof n.state==`object`&&!Array.isArray(n.state)?n.state:{},guidelines:a}),_=[],v=null,y=e=>{_.push(e),v?.(),v=null};g.error&&d.warn(`[@ag-ui/aws-strands] A2UI request prep failed: ${g.error}`);let b=!1,x=g.error?Promise.resolve((0,r.wrapErrorEnvelope)(g.error)):(0,r.runA2UIGenerationWithRecovery)({basePrompt:g.prompt,catalog:u,config:f,onAttempt:p,invokeSubagent:t=>{if(b){let e=Error(`consumer disconnected; abandoning A2UI recovery`);throw e.name=`CancelledError`,e}return P(m,t,l,{cancelSignal:e.agent.cancelSignal,onStreamEvent:y})},buildEnvelope:e=>(0,r.buildA2UIEnvelope)({args:e,isUpdate:g.isUpdate,targetSurfaceId:i.target_surface_id,prior:g.prior,defaultSurfaceId:o,defaultCatalogId:s})}).then(e=>e.envelope),S=!1,C=x.then(()=>{S=!0},()=>{S=!0});try{for(;!S||_.length>0;){for(;_.length>0;)yield new t.ToolStreamEvent({data:{[A]:_.shift()}});if(S)break;await Promise.race([C,new Promise(e=>{v=e})])}}finally{S||(b=!0,x.catch(e=>{let t=e?.name;t===`CancelledError`||t===`AbortError`||d.warn(`[@ag-ui/aws-strands] A2UI recovery loop failed after the consumer disconnected: ${e instanceof Error?e.message:String(e)}`)}))}let w=await x;return new t.ToolResultBlock({toolUseId:e.toolUse.toolUseId,status:`success`,content:[new t.TextBlock(w)]})}}}function N(e,t){let n=e?.name;return t||n===`AbortError`||n===`CancelledError`?`rethrow`:e instanceof TypeError?e.message===`fetch failed`?`recoverable`:`rethrow`:e instanceof ReferenceError?`rethrow`:`recoverable`}async function P(e,n,i,a={}){let o=null,s=new t.Agent({model:e,tools:[{name:O,description:r.RENDER_A2UI_TOOL_DEF.function.description,toolSpec:{name:O,description:r.RENDER_A2UI_TOOL_DEF.function.description,inputSchema:r.RENDER_A2UI_TOOL_DEF.function.parameters},async*stream(e){return o=e.toolUse.input??{},new t.ToolResultBlock({toolUseId:e.toolUse.toolUseId,status:`success`,content:[new t.TextBlock(`ok`)]})}}],systemPrompt:n}),c=a.onStreamEvent,l=null,u=!1;try{let e=s.stream(i,a.cancelSignal?{cancelSignal:a.cancelSignal}:void 0);for await(let t of e){if(!c)continue;let e=t&&typeof t==`object`&&t.type===`modelStreamUpdateEvent`&&`event`in t?t.event:t;if(e?.type===`modelContentBlockStartEvent`&&e.start?.type===`toolUseStart`){if(l&&=(c({kind:`end`,toolCallId:l}),null),e.start.name!==O)continue;l=e.start.toolUseId||`a2ui-render-${++j}`,u=!0,c({kind:`start`,toolCallId:l,toolCallName:O})}else l&&e?.type===`modelContentBlockDeltaEvent`&&e.delta?.type===`toolUseInputDelta`&&typeof e.delta.input==`string`?c({kind:`args`,toolCallId:l,delta:e.delta.input}):l&&e?.type===`modelContentBlockStopEvent`&&(c({kind:`end`,toolCallId:l}),l=null)}}catch(e){if(c&&l&&(c({kind:`end`,toolCallId:l}),l=null),N(e,!!a.cancelSignal?.aborted)===`rethrow`)throw e;return d.warn(`[@ag-ui/aws-strands] A2UI sub-agent invoke failed; treating as a failed attempt: ${e instanceof Error?e.message:String(e)}`),null}if(c){if(l)c({kind:`end`,toolCallId:l}),l=null;else if(!u&&o!==null){let e=`a2ui-render-${++j}`;c({kind:`start`,toolCallId:e,toolCallName:O}),c({kind:`args`,toolCallId:e,delta:JSON.stringify(o)}),c({kind:`end`,toolCallId:e})}}return o}function ee(e){let t=e;return t?.type===`toolUseBlock`?{name:t.name}:t?.toolUse?{name:t.toolUse.name}:null}function F(e){let t=e;return t?.type===`toolResultBlock`?{toolUseId:t.toolUseId,content:t.content}:t?.toolResult?t.toolResult:null}function te(e,t){let n=e?.content;return Array.isArray(n)?n.some(e=>ee(e)?.name===t):!1}function ne(e,t){let n=e[e.length-1];return n&&n.role===`assistant`&&te(n,t)?e.slice(0,-1):e.slice()}function re(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return D(e);let t=[];for(let n of e){let e=n;typeof e?.text==`string`?t.push(e.text):e?.json!==void 0&&t.push(JSON.stringify(e.json))}return t.join(``)}function ie(e){let t=[],n=0;for(let i of e){let e=i?.content;if(Array.isArray(e))for(let i of e){let e=F(i);if(!e)continue;let a=re(e.content);if(!a||!a.includes(r.A2UI_OPERATIONS_KEY))continue;let o=e.toolUseId||`a2ui-prior-${n++}`;t.push({id:o,role:`tool`,toolCallId:o,content:a})}}return t}function I(e){let{input:t,existingToolNames:n,config:i,log:a=d}=e,o=t.forwardedProps?.injectA2UITool??i?.injectA2UITool;if(!o)return null;let s=r.GENERATE_A2UI_TOOL_NAME;if(n.includes(s))return null;if(e.model==null)return a.warn("[@ag-ui/aws-strands] A2UI tool injection requested but no model could be inferred from the agent (multi-agent orchestrators like Graph/Swarm have no `.model`). Skipping auto-injection — wire getA2UITools() explicitly."),null;let c=typeof o==`string`?o:O,l=i?.catalog??R(t),u=M({model:e.model,toolName:s,catalog:l,defaultCatalogId:i?.defaultCatalogId,guidelines:i?.guidelines,recovery:i?.recovery},{aguiMessages:t.messages,state:t.state});return u[k]=!0,{tool:u,toolName:s,dropToolNames:[c],catalog:l}}function L(e){return typeof e==`object`&&!!e&&e[k]===!0}function R(e){for(let t of e.context??[]){if(t.description!==`A2UI Component Schema — available components for generating UI surfaces. Use these component names and properties when creating A2UI operations.`)continue;if(!t.value){d.warn(`[@ag-ui/aws-strands] A2UI schema context entry has an empty value; catalog-aware recovery disabled.`);continue}let e;try{e=JSON.parse(t.value)}catch(e){d.warn(`[@ag-ui/aws-strands] A2UI schema context entry present but unparseable; catalog-aware recovery disabled: ${String(e)}`);continue}if(typeof e==`object`&&e&&!Array.isArray(e))return e;d.warn(`[@ag-ui/aws-strands] A2UI schema context entry is valid JSON but not an object; catalog-aware recovery disabled.`)}}const z=`[@ag-ui/aws-strands]`,B=()=>(0,e.randomUUID)();function ae(e){let t={model:e.model,tools:e.tools.slice()};e.systemPrompt!==void 0&&(t.systemPrompt=e.systemPrompt),e.name!==void 0&&(t.name=e.name),e.id!==void 0&&(t.id=e.id),e.description!==void 0&&(t.description=e.description);let n=e.appState?.getAll?.();n&&Object.keys(n).length>0&&(t.appState=n);let r=e.modelState?.getAll?.();r&&Object.keys(r).length>0&&(t.modelState=r);let i=e;return i.traceAttributes!==void 0&&(t.traceAttributes=i.traceAttributes),i.structuredOutputSchema!==void 0&&(t.structuredOutputSchema=i.structuredOutputSchema),i.toolExecutor!==void 0&&(t.toolExecutor=i.toolExecutor),t}function V(e){return typeof e==`string`?e:e==null?``:Array.isArray(e)?D(e):String(e)}function oe(e){let t=V(e),n=t.trim();if(n.length===0)return{text:t};let r=n[0];if(r!==`{`&&r!==`[`)return{text:t};try{let e=JSON.parse(n);if(typeof e==`object`&&e)return{json:e}}catch{}return{text:t}}function H(e){return typeof e==`string`&&e.length>0?e:B()}function U(e){return e instanceof Error?e.message:String(e)}function W(e,t,n){for(let[n,r]of e)if(r.strandsToolId===t)return n;return n?B():t||B()}function G(e){let t=[];for(let n of e??[]){let e=n.role;if(e!==`user`&&e!==`assistant`&&e!==`tool`)continue;let r=H(n.id);if(e===`user`)t.push({id:r,role:`user`,content:V(n.content)});else if(e===`assistant`){let e=n.toolCalls,i;e&&e.length>0&&(i=e.map(e=>{let t=e.function;return{id:H(e.id),type:`function`,function:{name:t?.name??`unknown`,arguments:t?.arguments??`{}`}}}));let a={id:r,role:`assistant`,content:V(n.content)};i&&(a.toolCalls=i),t.push(a)}else{let e=n.toolCallId??``;t.push({id:r,role:`tool`,content:V(n.content),toolCallId:e})}}return t}async function K(e,n){let r=[];for(let i of e??[]){let e=i.role;if(e===`user`){let e=[],a=i.content;if(Array.isArray(a))if(a.some(e=>[`image`,`audio`,`video`,`document`].includes(e.type??``))){try{let r=await E(a,n);for(let n of r)if(n instanceof t.TextBlock)e.push({text:n.text});else{let t=typeof n.toJSON==`function`?n.toJSON():n;e.push(t)}}catch(e){n.warn(`${z} history replay multimodal conversion failed; falling back to text`,e)}e.length===0&&e.push({text:D(a)||``})}else e.push({text:D(a)});else e.push({text:V(a)});r.push({role:`user`,content:e})}else if(e===`assistant`){let e=[],t=V(i.content);t&&e.push({text:t});let a=i.toolCalls??[];for(let t of a){let r=t.function,i=r?.name||`unknown`,a=r?.arguments||`{}`,o;try{o=JSON.parse(a)}catch(e){n.warn(`${z} history tool args JSON parse failed for ${i}; falling back to {}`,e),o={}}(typeof o!=`object`||!o||Array.isArray(o))&&(o={}),e.push({toolUse:{toolUseId:t.id,name:i,input:o}})}e.length===0&&e.push({text:``}),r.push({role:`assistant`,content:e})}else if(e===`tool`){let e=i.toolCallId||``;r.push({role:`user`,content:[{toolResult:{toolUseId:e,content:[oe(i.content)],status:`success`}}]})}}return r}var se=class{constructor(e){this._agentsByThread=new Map,this._proxyToolNamesByThread=new Map,this._threadInitLock=new ce,this._activeRunsByThread=new Set,this._pendingInterruptsByThread=new Map;let{agent:t,name:n,description:r=``,config:i={},plugins:a}=e,o=t.model===void 0||t.model===null;if(this.name=n,this.description=r,this.config=i,this._log=f(i.logger),o){this._orchestrator=t,this._templateFields={model:void 0,tools:[]},this._plugins=[];return}this._orchestrator=null;let s=t;this._templateFields=ae(s),this._plugins=a?[...a]:[],s.sessionManager&&!this.config.sessionManagerProvider&&this._log.warn(`${z} sessionManager was set on the template Agent but will be ignored: forwarding it would cause every AG-UI thread to share the same session_id. Construct per-thread session managers via StrandsAgentConfig.sessionManagerProvider instead.`);for(let e of this._templateFields.tools??[])e!=null&&typeof e.connect==`function`&&typeof e.name!=`string`&&this._log.warn(`${z} an entry in the template Agent's \`tools\` looks like an unconnected McpClient — its tools will not be available to the model. Call \`await client.connect()\` and spread the resolved tool list into \`tools: [...]\` before constructing the Agent.`)}async*run(e){let t=e.threadId||`default`;if(Array.isArray(e.resume)&&e.resume.length>0){let n=this._pendingInterruptsByThread.get(t),r=e.resume.map(e=>e.interruptId).filter(e=>!n?.has(e));if(r.length>0){yield q(e),yield J(`This agent did not issue any interrupts to resume: ${r.slice(0,4).join(`, `)}. Resume entries must reference an outstanding interruptId.`,`UNKNOWN_INTERRUPT`);return}}else this._pendingInterruptsByThread.delete(t);let n=this._runRaw(e);if(this.config.emitChunkEvents){yield*Z(n);return}yield*n}async*_runRaw(e){let t=e.threadId||`default`;if(this._activeRunsByThread.has(t)){yield q(e),yield J(`Another run is already in progress on thread "${t}". Wait for RUN_FINISHED before starting a new run on the same thread.`,`THREAD_BUSY`);return}this._activeRunsByThread.add(t);try{this._orchestrator===null?yield*this._runSingleAgent(e,t):yield*this._runOrchestrator(e)}finally{this._activeRunsByThread.delete(t)}}async*_runSingleAgent(e,r){yield q(e);let i=this._agentsByThread.get(r);if(!i){let n;if(!this.config.sessionManagerProvider)try{n=await Q(e.messages??[],this._log)}catch(e){this._log.error(`${z} buildStrandsSeed failed for thread ${r}: ${U(e)}`,e),yield J(`Failed to build conversation seed: `+U(e),`SEED_BUILD_ERROR`);return}let a=await this._threadInitLock.acquire();try{if(i=this._agentsByThread.get(r),!i){let a;if(this.config.sessionManagerProvider){try{a=await l(this.config.sessionManagerProvider(e))}catch(e){let t=U(e);this._log.error(`${z} sessionManagerProvider failed: ${t}`,e),yield J(`Failed to initialize session manager: ${t}`,`SESSION_MANAGER_ERROR`);return}if(a!=null&&!(a instanceof t.SessionManager)){let e=a?.constructor?.name??typeof a;this._log.error(`${z} sessionManagerProvider returned ${e}; expected a SessionManager instance.`),yield J(`sessionManagerProvider returned ${e}; expected a SessionManager instance`,`SESSION_MANAGER_INVALID_TYPE`);return}a||this._log.warn(`${z} sessionManagerProvider returned null/undefined for threadId=${r}; agent will run without session persistence`)}let o=a?void 0:n;i=new t.Agent(this._buildThreadAgentConfig(a??void 0,o)),this._agentsByThread.set(r,i)}}finally{a()}}if(e.tools&&e.tools.length>0){let t=_(i.toolRegistry,e.tools,this._proxyToolNamesByThread.get(r)??new Set,this._log);this._proxyToolNamesByThread.set(r,t)}else{let e=this._proxyToolNamesByThread.get(r);e&&e.size>0&&(_(i.toolRegistry,[],e,this._log),this._proxyToolNamesByThread.set(r,new Set))}try{let t=i.toolRegistry;if(typeof t.list!=`function`)(e.forwardedProps?.injectA2UITool??this.config.a2ui?.injectA2UITool)&&this._log.warn(`[@ag-ui/aws-strands] A2UI tool injection requested but toolRegistry.list() is unavailable; skipping auto-injection for this run.`);else{for(let e of t.list())L(e)&&t.remove(e.name);let n=t.list().map(e=>e.name),r=I({model:i.model??null,input:e,existingToolNames:n,config:this.config.a2ui,log:this._log});if(r){for(let e of r.dropToolNames)t.remove(e);t.add(r.tool)}}}catch(e){this._log.warn(`[@ag-ui/aws-strands] A2UI auto-injection failed; running without A2UI for this turn: ${e instanceof Error?e.message:String(e)}`)}try{let o=this.config.emitMessagesSnapshot!==!1,s=o?G(e.messages??[]):[];if(e.state&&typeof e.state==`object`){let t={};for(let[n,r]of Object.entries(e.state))n!==`messages`&&(t[n]=r);yield{type:n.EventType.STATE_SNAPSHOT,snapshot:t}}o&&s.length>0&&(yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:s.slice()});let d=new Set;for(let t of e.tools??[])t.name&&d.add(t.name);let f=new Set;if(e.messages){for(let t=e.messages.length-1;t>=0;t--){let n=e.messages[t];if(!n)break;if(n.role===`tool`){let e=n.toolCallId;e&&f.add(e)}else break}f.size>0&&this._log.debug(`${z} Has pending tool results detected: toolCallIds=${JSON.stringify([...f])}, threadId=${e.threadId}`)}let p=new Map;for(let t of e.messages??[]){if(t.role!==`assistant`)continue;let e=t.toolCalls;if(e)for(let t of e){let e=t.function;t.id&&e?.name&&p.set(t.id,e.name)}}let m=`Hello`;if(f.size>0&&e.messages)for(let t=e.messages.length-1;t>=0;t--){let n=e.messages[t];if(!n)break;if(n.role===`tool`){let e=n.toolCallId;if(e){let t=p.get(e);t&&d.has(t)&&(m=`${t} executed successfully with no return value.`)}break}}else if(e.messages)for(let t=e.messages.length-1;t>=0;t--){let n=e.messages[t];if(!n)break;if((n.role===`user`||n.role===`tool`)&&n.content!=null){if(Array.isArray(n.content))if(n.content.some(e=>[`image`,`audio`,`video`,`document`].includes(e.type??``))){let e=await E(n.content,this._log);if(e.length>0)m=e;else{let e=D(n.content);if(e)m=e,this._log.warn(`${z} all media content blocks failed conversion; falling back to text`);else{yield J(`All media content blocks failed conversion and no text fallback is available`,`MEDIA_RESOLUTION_FAILED`);return}}}else m=D(n.content);else m=n.content;break}}if(this.config.stateContextBuilder)try{let t=Array.isArray(m)?D(m):m,n=this.config.stateContextBuilder(e,t,c(e));Array.isArray(m)||(m=n)}catch(e){this._log.error(`${z} stateContextBuilder failed:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`stateContextBuilder`,tool:`__prompt__`,error:U(e)}}}let h=B(),g=!1,_=``,v=new Map,y={...e.state??{}},b=!1,x=!1,S=!1,C=!1,w,T=null,O=this.config.replayHistoryIntoStrands!==!1&&!i.sessionManager,k=m,j=le(e);if(j.length>0&&(k=j.map(e=>new t.InterruptResponseContent({interruptId:e.interruptId,response:ue(e)})),this._pendingInterruptsByThread.delete(r)),O&&j.length===0){let r=await K(e.messages??[],this._log);if(r.length>0){if(this.config.stateContextBuilder)for(let t=r.length-1;t>=0;t--){let i=r[t];if(!i||i.role!==`user`)continue;let a=i.content[0];if(a&&typeof a.text==`string`){try{let t=this.config.stateContextBuilder(e,a.text,c(e));typeof t==`string`&&(a.text=t)}catch(e){this._log.error(`${z} stateContextBuilder failed:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`stateContextBuilder`,tool:`__prompt__`,error:U(e)}}}break}}i.messages=r.map(e=>t.Message.fromMessageData({role:e.role,content:e.content})),k=void 0}}this._log.debug(`${z} Starting agent run: threadId=${e.threadId}, runId=${e.runId}, pendingToolResultIds=${JSON.stringify([...f])}, messageCount=${e.messages?.length??0}`);let M=new AbortController,N=i.stream(k,{cancelSignal:M.signal}),P;try{for(;;){let r;try{r=await N.next()}catch(e){if(S||x){if(e instanceof TypeError||e instanceof ReferenceError)throw e;x=!0;break}throw e}if(r.done){P=r.value;break}if(x)continue;let i=X(r.value),p=Y(i);if(p===`modelContentBlockDeltaEvent`){let t=i.delta;if(t.type===`textDelta`&&t.text){if(b)continue;g||=(yield{type:n.EventType.TEXT_MESSAGE_START,messageId:h,role:`assistant`},!0),_+=t.text,yield{type:n.EventType.TEXT_MESSAGE_CONTENT,messageId:h,delta:t.text};continue}if(t.type===`reasoningContentDelta`){t.text?(C||=(w=B(),yield{type:n.EventType.REASONING_START,messageId:w},yield{type:n.EventType.REASONING_MESSAGE_START,messageId:w,role:`reasoning`},!0),yield{type:n.EventType.REASONING_MESSAGE_CONTENT,messageId:w,delta:t.text}):t.redactedContent&&(C||=(w=B(),yield{type:n.EventType.REASONING_START,messageId:w},yield{type:n.EventType.REASONING_MESSAGE_START,messageId:w,role:`reasoning`},!0),yield{type:n.EventType.REASONING_ENCRYPTED_VALUE,subtype:`message`,entityId:w,encryptedValue:Buffer.from(t.redactedContent).toString(`base64`)});continue}if(t.type===`toolUseInputDelta`&&T){T.inputChunks.push(t.input);let{name:r,toolUseId:i}=T,c=d.has(r),l=W(v,i,c),p=v.get(l);if(!p){let t=f.has(l),d=this.config.toolBehaviors?.[r];this._log.debug(`${z} Tool call event received: toolName=${r}, toolUseId=${l}, strandsId=${i}, isFrontend=${c}, threadId=${e.threadId}`);let m=!t&&!d?.argsStreamer;if(p={name:r,args:``,input:{},raw:``,emitted:!1,startEmitted:!1,endEmitted:!1,lastEmittedRawLen:0,isPending:t,isFrontend:c,useStreaming:m,strandsToolId:i},v.set(l,p),m){if(g&&(yield{type:n.EventType.TEXT_MESSAGE_END,messageId:h},o&&_&&(s.push({id:h,role:`assistant`,content:_}),_=``,yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:s.slice()}),g=!1,h=B()),d){let e=u(d.predictState).map(a);e.length>0&&(yield{type:n.EventType.CUSTOM,name:`PredictState`,value:e})}yield{type:n.EventType.TOOL_CALL_START,toolCallId:l,toolCallName:r,parentMessageId:h},p.startEmitted=!0}}let m=T.inputChunks.join(``);p.raw=m;try{p.input=JSON.parse(m)}catch{p.input=m}if(p.args=typeof p.input==`string`?p.input:JSON.stringify(p.input),p.startEmitted&&p.useStreaming){let e=p.lastEmittedRawLen??0;m.length>e&&(yield{type:n.EventType.TOOL_CALL_ARGS,toolCallId:l,delta:m.slice(e)},p.lastEmittedRawLen=m.length)}}continue}if(p===`reasoningSignatureEvent`)continue;if(p===`modelContentBlockStartEvent`){let e=i.start;e?.type===`toolUseStart`&&e.name&&(T={name:e.name,toolUseId:e.toolUseId??B(),inputChunks:[]});continue}if(p===`modelContentBlockStopEvent`){if(C&&(yield{type:n.EventType.REASONING_MESSAGE_END,messageId:w},yield{type:n.EventType.REASONING_END,messageId:w},C=!1,w=void 0),T){let{name:t,toolUseId:r,inputChunks:i}=T;T=null;let a=i.join(``),u={};if(a)try{u=JSON.parse(a)}catch(e){this._log.warn(`${z} tool args JSON parse failed for ${t}; using raw string`,e),u=a}let p=d.has(t),m=W(v,r,p),b=typeof u==`string`?u:JSON.stringify(u);if(!v.has(m))v.set(m,{name:t,args:b,input:u,emitted:!1,strandsToolId:r,raw:a});else{let e=v.get(m);e.args=b,e.input=u,e.raw=a}let x=v.get(m),C=this.config.toolBehaviors?.[t];if(this._log.debug(`${z} contentBlockStop close: toolName=${t}, toolUseId=${m}, isFrontendTool=${p}, isPending=${x.isPending??!1}, useStreaming=${x.useStreaming??!1}, threadId=${e.threadId}`),x.startEmitted&&x.useStreaming){let r=x.lastEmittedRawLen??0;if(a.length>r&&(yield{type:n.EventType.TOOL_CALL_ARGS,toolCallId:m,delta:a.slice(r)},x.lastEmittedRawLen=a.length),C?.stateFromArgs){let r={inputData:e,toolName:t,toolUseId:m,toolInput:u,argsStr:b,...c(e)};try{let e=await l(C.stateFromArgs(r));e&&(Object.assign(y,e),yield{type:n.EventType.STATE_SNAPSHOT,snapshot:e})}catch(e){this._log.error(`${z} stateFromArgs failed for ${t}:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`stateFromArgs`,tool:t,error:U(e)}}}}yield{type:n.EventType.TOOL_CALL_END,toolCallId:m},x.endEmitted=!0,x.emitted=!0,o&&!C?.skipMessagesSnapshot&&(s.push({id:h,role:`assistant`,content:``,toolCalls:[{id:m,type:`function`,function:{name:t||`unknown`,arguments:b||`{}`}}]}),yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:s.slice()},h=B()),p&&!C?.continueAfterFrontendCall&&(this._log.debug(`${z} Deferring halt after frontend tool call: toolName=${t}, toolCallId=${m}, threadId=${e.threadId}`),S=!0)}else yield*this._emitToolCall({inputData:e,toolUseId:m,isFrontendTool:p,pendingToolResultIds:f,getMessageId:()=>h,setMessageId:e=>{h=e},getMessageStarted:()=>g,setMessageStarted:e=>{g=e},getAccumulatedText:()=>_,setAccumulatedText:e=>{_=e},snapshotMessages:s,emitMessagesSnapshot:o,toolCallsSeen:v,currentState:y,onPendingHalt:()=>{S=!0}})}continue}if(p===`toolUseBlock`){let t=i,n=d.has(t.name),r=W(v,t.toolUseId,n),a=typeof t.input==`string`?t.input:JSON.stringify(t.input);if(!v.has(r))v.set(r,{name:t.name,args:a,input:t.input,emitted:!1,strandsToolId:t.toolUseId});else{let e=v.get(r);e.args=a,e.input=t.input}yield*this._emitToolCall({inputData:e,toolUseId:r,isFrontendTool:n,pendingToolResultIds:f,getMessageId:()=>h,setMessageId:e=>{h=e},getMessageStarted:()=>g,setMessageStarted:e=>{g=e},getAccumulatedText:()=>_,setAccumulatedText:e=>{_=e},snapshotMessages:s,emitMessagesSnapshot:o,toolCallsSeen:v,currentState:y,onPendingHalt:()=>{S=!0}});continue}if(p===`afterToolCallEvent`){if(S){x=!0;try{M.abort()}catch{}break}let r=i,a=r.toolUse.toolUseId,u=r.toolUse.name;if(d.has(u))continue;let f=null,p=r.result?.content;if(Array.isArray(p))for(let e of p){if(e instanceof t.TextBlock){try{f=JSON.parse(e.text)}catch{try{f=JSON.parse(e.text.replace(/'/g,`"`))}catch(t){this._log.warn(`${z} tool result JSON parse failed for ${u}; using raw text`,t),f=e.text}}break}let n=e.json;if(n!==void 0){f=n;break}}if(!a)continue;let m=v.get(a),C=m?.args,w=m?.input,T=this.config.toolBehaviors?.[u];this._log.debug(`${z} Processing tool result: toolName=${u}, resultToolId=${a}, threadId=${e.threadId}`);let E=B(),D=f==null?``:JSON.stringify(f);yield{type:n.EventType.TOOL_CALL_RESULT,toolCallId:a,messageId:E,content:D},o&&!T?.skipMessagesSnapshot&&(s.push({id:E,role:`tool`,content:D,toolCallId:a}),yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:s.slice()});let O={inputData:e,toolName:u,toolUseId:a,toolInput:w,argsStr:C??`{}`,resultData:f,messageId:h,...c(e)};if(T?.stateFromResult)try{let e=await l(T.stateFromResult(O));e&&(Object.assign(y,e),yield{type:n.EventType.STATE_SNAPSHOT,snapshot:e})}catch(e){this._log.error(`${z} stateFromResult failed for ${u}:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`stateFromResult`,tool:u,error:U(e)}}}if(T?.customResultHandler)try{for await(let e of T.customResultHandler(O))e&&(yield e)}catch(e){this._log.error(`${z} customResultHandler failed for ${u}:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`customResultHandler`,tool:u,error:U(e)}}}if(T?.stopStreamingAfterResult){b=!0,g&&(yield{type:n.EventType.TEXT_MESSAGE_END,messageId:h},g=!1,o&&_&&(s.push({id:h,role:`assistant`,content:_}),_=``,yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:s.slice()})),this._log.debug(`${z} Breaking event stream: stopStreamingAfterResult behavior triggered (threadId=${e.threadId}, toolName=${u})`),x=!0;break}continue}if(p===`toolStreamEvent`){let e=i.data;if(e&&typeof e==`object`&&`state`in e)yield{type:n.EventType.STATE_SNAPSHOT,snapshot:e.state};else if(e&&typeof e==`object`&&A in e){let t=e[A];t.kind===`start`?yield{type:n.EventType.TOOL_CALL_START,toolCallId:t.toolCallId,toolCallName:t.toolCallName??`render_a2ui`}:t.kind===`args`&&t.delta?yield{type:n.EventType.TOOL_CALL_ARGS,toolCallId:t.toolCallId,delta:t.delta}:t.kind===`end`&&(yield{type:n.EventType.TOOL_CALL_END,toolCallId:t.toolCallId})}continue}let m=i;if(m?.type===`beforeNodeCallEvent`){yield{type:n.EventType.STEP_STARTED,stepName:`${m.nodeType??`agent`}:${m.nodeId??`unknown`}`};continue}if(m?.type===`afterNodeCallEvent`){yield{type:n.EventType.STEP_FINISHED,stepName:`${m.nodeType??`agent`}:${m.nodeId??`unknown`}`};continue}if(m?.type===`multiAgentHandoffEvent`){let e=m.message;yield{type:n.EventType.CUSTOM,name:`MultiAgentHandoff`,value:{from_nodes:m.source?[m.source]:[],to_nodes:m.targets??[],message:e}};continue}}}finally{try{M.abort()}catch{}try{await N.return(void 0)}catch{}}if(C&&(yield{type:n.EventType.REASONING_MESSAGE_END,messageId:w},yield{type:n.EventType.REASONING_END,messageId:w}),g&&(yield{type:n.EventType.TEXT_MESSAGE_END,messageId:h},o&&_&&(s.push({id:h,role:`assistant`,content:_}),_=``,yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:s.slice()})),yield{type:n.EventType.STATE_SNAPSHOT,snapshot:y},P?.stopReason===`interrupt`){let t=P.interrupts??[];if(t.length>0){let i=t.map(e=>e.id);this._pendingInterruptsByThread.set(r,new Set(i)),yield{type:n.EventType.RUN_FINISHED,threadId:e.threadId,runId:e.runId,outcome:{type:`interrupt`,interrupts:t.map(de)}};return}}yield{type:n.EventType.RUN_FINISHED,threadId:e.threadId,runId:e.runId}}catch(e){let t=e instanceof TypeError||e instanceof ReferenceError?`ADAPTER_BUG`:`STRANDS_ERROR`;this._log.error(`${z} _runSingleAgent failed:`,e),yield J(U(e),t)}}async*_emitToolCall(e){let t=e.toolCallsSeen.get(e.toolUseId);if(!t||t.emitted)return;t.emitted=!0;let r=t.name,i=t.args,o=t.input,s=this.config.toolBehaviors?.[r],d=e.pendingToolResultIds.has(e.toolUseId),f={inputData:e.inputData,toolName:r,toolUseId:e.toolUseId,toolInput:o,argsStr:i,...c(e.inputData)};if(d){if(s?.stateFromArgs)try{let t=await l(s.stateFromArgs(f));t&&(Object.assign(e.currentState,t),yield{type:n.EventType.STATE_SNAPSHOT,snapshot:t})}catch(e){this._log.error(`${z} stateFromArgs failed for ${r}:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`stateFromArgs`,tool:r,error:U(e)}}}return}if(s?.stateFromArgs)try{let t=await l(s.stateFromArgs(f));t&&(Object.assign(e.currentState,t),yield{type:n.EventType.STATE_SNAPSHOT,snapshot:t})}catch(e){this._log.error(`${z} stateFromArgs failed for ${r}:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`stateFromArgs`,tool:r,error:U(e)}}}if(s){let e=u(s.predictState).map(a);e.length>0&&(yield{type:n.EventType.CUSTOM,name:`PredictState`,value:e})}if(e.getMessageStarted()){yield{type:n.EventType.TEXT_MESSAGE_END,messageId:e.getMessageId()};let t=e.getAccumulatedText();e.emitMessagesSnapshot&&t&&(e.snapshotMessages.push({id:e.getMessageId(),role:`assistant`,content:t}),e.setAccumulatedText(``),yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:e.snapshotMessages.slice()}),e.setMessageStarted(!1),e.setMessageId(B())}yield{type:n.EventType.TOOL_CALL_START,toolCallId:e.toolUseId,toolCallName:r,parentMessageId:e.getMessageId()};let p=!1;if(s?.argsStreamer)try{for await(let t of s.argsStreamer(f))t!=null&&(yield{type:n.EventType.TOOL_CALL_ARGS,toolCallId:e.toolUseId,delta:String(t)})}catch(e){p=!0,this._log.error(`${z} argsStreamer failed for ${r}:`,e),yield{type:n.EventType.CUSTOM,name:`hook_error`,value:{hook:`argsStreamer`,tool:r,error:U(e)}}}else yield{type:n.EventType.TOOL_CALL_ARGS,toolCallId:e.toolUseId,delta:i};if(p){yield{type:n.EventType.TOOL_CALL_END,toolCallId:e.toolUseId};return}yield{type:n.EventType.TOOL_CALL_END,toolCallId:e.toolUseId},e.emitMessagesSnapshot&&!s?.skipMessagesSnapshot&&(e.snapshotMessages.push({id:e.getMessageId(),role:`assistant`,content:``,toolCalls:[{id:e.toolUseId,type:`function`,function:{name:r||`unknown`,arguments:i||`{}`}}]}),yield{type:n.EventType.MESSAGES_SNAPSHOT,messages:e.snapshotMessages.slice()},e.setMessageId(B())),e.isFrontendTool&&!s?.continueAfterFrontendCall&&(this._log.debug(`${z} Deferring halt after frontend tool call: toolName=${r}, toolCallId=${e.toolUseId}, threadId=${e.inputData.threadId}`),e.onPendingHalt())}async*_runOrchestrator(e){yield q(e);try{if(e.state&&typeof e.state==`object`){let t={};for(let[n,r]of Object.entries(e.state))n!==`messages`&&(t[n]=r);yield{type:n.EventType.STATE_SNAPSHOT,snapshot:t}}let t=`Hello`;if(e.messages)for(let n=e.messages.length-1;n>=0;n--){let r=e.messages[n];if(!r)break;if((r.role===`user`||r.role===`tool`)&&r.content!=null){t=typeof r.content==`string`?r.content:D(r.content);break}}let r=B(),i=!1,a=!1,o,s=this._orchestrator.stream(t);try{for await(let e of s){let t=X(e),s=Y(t);if(s===`beforeNodeCallEvent`){let e=t;yield{type:n.EventType.STEP_STARTED,stepName:`${e.nodeType??`agent`}:${e.nodeId??`unknown`}`};continue}if(s===`afterNodeCallEvent`){let e=t;i&&(yield{type:n.EventType.TEXT_MESSAGE_END,messageId:r},i=!1,r=B()),a&&(yield{type:n.EventType.REASONING_MESSAGE_END,messageId:o},yield{type:n.EventType.REASONING_END,messageId:o},a=!1,o=void 0),yield{type:n.EventType.STEP_FINISHED,stepName:`${e.nodeType??`agent`}:${e.nodeId??`unknown`}`};continue}if(s===`multiAgentHandoffEvent`){let e=t;yield{type:n.EventType.CUSTOM,name:`MultiAgentHandoff`,value:{from_nodes:e.source?[e.source]:[],to_nodes:e.targets??[],message:e.message}};continue}if(s===`nodeStreamUpdateEvent`){let e=t,s=e.inner?.event?X(e.inner.event):void 0;if(Y(s)===`modelContentBlockDeltaEvent`){let e=s.delta;e?.type===`textDelta`&&e.text?(i||=(yield{type:n.EventType.TEXT_MESSAGE_START,messageId:r,role:`assistant`},!0),yield{type:n.EventType.TEXT_MESSAGE_CONTENT,messageId:r,delta:e.text}):e?.type===`reasoningContentDelta`&&e.text&&(a||=(o=B(),yield{type:n.EventType.REASONING_START,messageId:o},yield{type:n.EventType.REASONING_MESSAGE_START,messageId:o,role:`reasoning`},!0),yield{type:n.EventType.REASONING_MESSAGE_CONTENT,messageId:o,delta:e.text})}continue}}}finally{try{await s.return(void 0)}catch{}}i&&(yield{type:n.EventType.TEXT_MESSAGE_END,messageId:r}),a&&(yield{type:n.EventType.REASONING_MESSAGE_END,messageId:o},yield{type:n.EventType.REASONING_END,messageId:o}),yield{type:n.EventType.STATE_SNAPSHOT,snapshot:{}},yield{type:n.EventType.RUN_FINISHED,threadId:e.threadId,runId:e.runId}}catch(e){let t=e instanceof TypeError||e instanceof ReferenceError?`ADAPTER_BUG`:`STRANDS_ERROR`;this._log.error(`${z} _runOrchestrator failed:`,e),yield J(U(e),t)}}_buildThreadAgentConfig(e,t){let n=this._templateFields,r={model:n.model,tools:n.tools.slice(),printer:!1};return n.systemPrompt!==void 0&&(r.systemPrompt=n.systemPrompt),n.name!==void 0&&(r.name=n.name),n.description!==void 0&&(r.description=n.description),n.id!==void 0&&(r.id=n.id),n.appState!==void 0&&(r.appState=n.appState),n.modelState!==void 0&&(r.modelState=n.modelState),n.traceAttributes!==void 0&&(r.traceAttributes=n.traceAttributes),n.structuredOutputSchema!==void 0&&(r.structuredOutputSchema=n.structuredOutputSchema),n.toolExecutor!==void 0&&(r.toolExecutor=n.toolExecutor),e&&(r.sessionManager=e),t&&t.length>0&&(r.messages=t),this._plugins.length>0&&(r.plugins=[...this._plugins]),r}},ce=class{constructor(){this._tail=Promise.resolve()}async acquire(){let e,t=new Promise(t=>{e=t}),n=this._tail;return this._tail=t,await n,e}};function q(e){return{type:n.EventType.RUN_STARTED,threadId:e.threadId,runId:e.runId}}function J(e,t){return{type:n.EventType.RUN_ERROR,message:e,code:t}}function le(e){let t=e.resume;return Array.isArray(t)&&t.length>0?t:[]}function ue(e){return e.status===`cancelled`?{status:`cancelled`}:e.payload}function de(e){let t=e.reason,n=typeof t==`string`&&t.length>0?t:`confirmation`,r={id:e.id,reason:n};if(typeof t==`string`&&t.length>0)r.message=t;else if(t!=null)try{r.message=JSON.stringify(t)}catch{}return r.metadata={strandsName:e.name},r}function Y(e){if(e&&typeof e==`object`&&`type`in e){let t=e.type;return typeof t==`string`?t:void 0}}function X(e){if(!e||typeof e!=`object`)return e;let t=e.type;return t===`modelStreamUpdateEvent`&&`event`in e||t===`toolStreamUpdateEvent`&&`event`in e?e.event:t===`contentBlockEvent`&&`contentBlock`in e?e.contentBlock:e}async function*Z(e){for await(let t of e)switch(t.type){case n.EventType.TEXT_MESSAGE_START:{let e=t;yield{type:n.EventType.TEXT_MESSAGE_CHUNK,messageId:e.messageId,role:e.role};break}case n.EventType.TEXT_MESSAGE_CONTENT:{let e=t;yield{type:n.EventType.TEXT_MESSAGE_CHUNK,messageId:e.messageId,delta:e.delta};break}case n.EventType.TEXT_MESSAGE_END:break;case n.EventType.TOOL_CALL_START:{let e=t;yield{type:n.EventType.TOOL_CALL_CHUNK,toolCallId:e.toolCallId,toolCallName:e.toolCallName,parentMessageId:e.parentMessageId};break}case n.EventType.TOOL_CALL_ARGS:{let e=t;yield{type:n.EventType.TOOL_CALL_CHUNK,toolCallId:e.toolCallId,delta:e.delta};break}case n.EventType.TOOL_CALL_END:break;case n.EventType.REASONING_MESSAGE_START:{let e=t;yield{type:n.EventType.REASONING_MESSAGE_CHUNK,messageId:e.messageId};break}case n.EventType.REASONING_MESSAGE_CONTENT:{let e=t;yield{type:n.EventType.REASONING_MESSAGE_CHUNK,messageId:e.messageId,delta:e.delta};break}case n.EventType.REASONING_MESSAGE_END:break;default:yield t}}async function Q(e,t){if(e.length===0)return;let n=e.length;if(e[e.length-1]?.role===`user`&&(n=e.length-1),n<=0)return;let r=await $(e.slice(0,n),t);if(r.length!==0){for(;r.length>0&&r[0]?.role!==`user`;)r.shift();if(r.length!==0)return r}}async function $(e,n){let r=[],i=null,a=null,o=()=>{a&&a.length>0&&r.push({role:`user`,content:a}),a=null,i=null};for(let s of e){let e=s.role;if(e===`system`||e===`developer`)continue;if(e===`assistant`){o();let e=s.toolCalls,t=[];if(typeof s.content==`string`&&s.content.length>0)t.push({text:s.content});else if(Array.isArray(s.content))for(let e of s.content)e&&typeof e==`object`&&`text`in e&&t.push({text:e.text});if(e&&e.length>0){i=new Map;for(let r of e){if(!r?.id||!r.function?.name)continue;let e={};try{e=r.function.arguments?JSON.parse(r.function.arguments):{}}catch(t){n?.warn(`${z} seed tool args JSON parse failed for ${r.function.name}; using raw string`,t),e=r.function.arguments??{}}t.push({toolUse:{name:r.function.name,toolUseId:r.id,input:e}}),i.set(r.id,r.function.name)}}if(t.length===0)continue;r.push({role:`assistant`,content:t});continue}if(e===`tool`){let e=s.toolCallId;if(!e||!i||!i.has(e))continue;let t=s.content,n=typeof t==`string`?t:Array.isArray(t)?t.map(e=>e&&typeof e==`object`&&`text`in e?e.text??``:``).join(``):``;a??=[],a.push({toolResult:{toolUseId:e,status:`success`,content:[{text:n}]}});continue}o();let c=[],l=s.content;if(typeof l==`string`)l.length>0&&c.push({text:l});else if(Array.isArray(l))if(l.some(e=>{if(!e||typeof e!=`object`)return!1;let t=e.type;return t===`image`||t===`audio`||t===`video`||t===`document`}))try{let e=await E(l,n);for(let n of e)if(n instanceof t.TextBlock)c.push({text:n.text});else{let e=typeof n.toJSON==`function`?n.toJSON():n;c.push(e)}}catch(e){(n??d).warn(`${z} seed multimodal conversion failed; dropping attachments for this turn`,e);let t=D(l);t.length>0&&c.push({text:t})}else for(let e of l)e&&typeof e==`object`&&`text`in e&&c.push({text:e.text});c.length!==0&&r.push({role:`user`,content:c})}return o(),r}var fe=class extends i.HttpAgent{};exports.A2UI_STREAM_KEY=A,exports.AWSStrandsAgent=fe,exports.StrandsAgent=se,exports.buildContextExtras=c,exports.buildSnapshotMessages=G,exports.buildStrandsSeed=Q,exports.convertAguiContentToStrands=E,exports.convertMessagesForStrandsSeed=$,exports.createProxyTool=h,exports.flattenContentToText=D,exports.getA2UITools=M,exports.isAutoInjectedA2UITool=L,exports.isProxyTool=g,exports.planA2UIInjection=I,exports.syncProxyTools=_;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|