@truefoundry/assistant-ui-runtime 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +198 -401
  2. package/dist/chunk-3A2EPLQG.js +93 -0
  3. package/dist/chunk-3A2EPLQG.js.map +1 -0
  4. package/dist/chunk-Q2SHKMLM.js +270 -0
  5. package/dist/chunk-Q2SHKMLM.js.map +1 -0
  6. package/dist/index.d.ts +24 -29
  7. package/dist/index.js +264 -237
  8. package/dist/index.js.map +1 -1
  9. package/dist/plugins/truefoundry-agent-server-adapter/index.d.ts +162 -0
  10. package/dist/plugins/truefoundry-agent-server-adapter/index.js +19 -0
  11. package/dist/plugins/truefoundry-agent-server-adapter/index.js.map +1 -0
  12. package/dist/server/index.d.ts +17 -0
  13. package/dist/server/index.js +9 -0
  14. package/dist/server/index.js.map +1 -0
  15. package/dist/types-BfiFf8O1.d.ts +468 -0
  16. package/package.json +19 -6
  17. package/src/askUserQuestion.ts +3 -3
  18. package/src/buildEditedUserMessageContent.test.ts +2 -2
  19. package/src/collectPending.ts +1 -1
  20. package/src/convertTurnMessages.test.ts +141 -196
  21. package/src/convertTurnMessages.ts +130 -76
  22. package/src/createSubAgent.ts +1 -1
  23. package/src/draftAgentConfig.test.ts +26 -29
  24. package/src/extractTurnUserText.ts +1 -1
  25. package/src/foldPeerThreads.test.ts +1 -1
  26. package/src/foldPeerThreads.ts +3 -2
  27. package/src/index.ts +80 -4
  28. package/src/listPages.ts +21 -0
  29. package/src/loadSessionSnapshot.test.ts +9 -8
  30. package/src/loadSessionSnapshot.ts +9 -14
  31. package/src/mcpAuth.ts +6 -3
  32. package/src/messageCustomMetadata.ts +1 -1
  33. package/src/modelMessageContent.ts +1 -1
  34. package/src/modelMessageImageContent.test.ts +1 -1
  35. package/src/modelMessageImageContent.ts +7 -6
  36. package/src/plugins/truefoundry-agent-server-adapter/README.md +178 -0
  37. package/src/plugins/truefoundry-agent-server-adapter/guards.test.ts +113 -0
  38. package/src/plugins/truefoundry-agent-server-adapter/guards.ts +130 -0
  39. package/src/plugins/truefoundry-agent-server-adapter/index.ts +359 -0
  40. package/src/plugins/truefoundry-agent-server-adapter/types.ts +135 -0
  41. package/src/plugins/truefoundry-agent-server-adapter/types.typecheck.ts +164 -0
  42. package/src/private/agentSpec.ts +8 -3
  43. package/src/private/draftSessionBridge.ts +14 -13
  44. package/src/private/truefoundryDraftThreadListAdapter.test.ts +44 -49
  45. package/src/private/truefoundryDraftThreadListAdapter.ts +22 -16
  46. package/src/requiredActionInputs.ts +1 -1
  47. package/src/requiredActionsFromActiveUpdate.test.ts +1 -1
  48. package/src/server/eventUtils.ts +120 -0
  49. package/src/server/events.ts +246 -0
  50. package/src/server/index.ts +66 -0
  51. package/src/server/types.ts +319 -0
  52. package/src/sessionSnapshot.ts +1 -1
  53. package/src/sessions.ts +5 -21
  54. package/src/streamTurn.test.ts +172 -155
  55. package/src/streamTurn.ts +51 -48
  56. package/src/toolApproval.ts +4 -4
  57. package/src/toolResponse.ts +4 -4
  58. package/src/truefoundryExtras.ts +1 -1
  59. package/src/truefoundryOwnedSessionsThreadListAdapter.test.ts +26 -29
  60. package/src/truefoundryOwnedSessionsThreadListAdapter.ts +18 -23
  61. package/src/truefoundryThreadListAdapter.test.ts +16 -18
  62. package/src/truefoundryThreadListAdapter.ts +7 -7
  63. package/src/turnEventHelpers.ts +1 -1
  64. package/src/types.ts +2 -16
  65. package/src/useTrueFoundryAgentMessages.test.tsx +38 -70
  66. package/src/useTrueFoundryAgentMessages.ts +32 -44
  67. package/src/useTrueFoundryAgentRuntime.ts +11 -28
  68. package/src/private/bindDraftAgentSession.test.ts +0 -54
  69. package/src/private/bindDraftAgentSession.ts +0 -28
  70. package/src/private/getGatewayFromPrivateClient.ts +0 -13
@@ -0,0 +1,93 @@
1
+ // src/server/eventUtils.ts
2
+ function isEventDelta(event) {
3
+ return typeof event.type === "string" && event.type.endsWith(".delta");
4
+ }
5
+ function mergeEventDelta(base, delta) {
6
+ if (base.id !== delta.id) {
7
+ throw new Error(
8
+ `Cannot merge delta into a different event: base id "${base.id}" != delta id "${delta.id}".`
9
+ );
10
+ }
11
+ if (delta.type === "model.message.delta" && base.type === "model.message") {
12
+ mergeModelMessageDelta(base, delta);
13
+ }
14
+ }
15
+ function asToolInfo(value) {
16
+ if (value == null || typeof value !== "object") {
17
+ return void 0;
18
+ }
19
+ return value;
20
+ }
21
+ function mergeModelMessageDelta(base, delta) {
22
+ if (delta.content) {
23
+ if (base.content === void 0 || base.content === null || typeof base.content === "string") {
24
+ base.content = (base.content ?? "") + delta.content;
25
+ } else {
26
+ const last = base.content[base.content.length - 1];
27
+ if (last && last.type === "text") {
28
+ last.text += delta.content;
29
+ } else {
30
+ base.content.push({ type: "text", text: delta.content });
31
+ }
32
+ }
33
+ }
34
+ if (delta.refusal) {
35
+ base.refusal = (base.refusal ?? "") + delta.refusal;
36
+ }
37
+ if (delta.toolCalls) {
38
+ base.toolCalls ??= [];
39
+ for (const d of delta.toolCalls) {
40
+ let tc = base.toolCalls[d.index];
41
+ if (tc === void 0) {
42
+ const toolInfo2 = asToolInfo(d.toolInfo);
43
+ tc = {
44
+ id: d.id ?? "",
45
+ type: d.type ?? "function",
46
+ function: {
47
+ name: d.function?.name ?? "",
48
+ arguments: ""
49
+ },
50
+ ...toolInfo2 != null ? { toolInfo: toolInfo2 } : {}
51
+ };
52
+ base.toolCalls[d.index] = tc;
53
+ }
54
+ if (d.id) {
55
+ tc.id = d.id;
56
+ }
57
+ if (d.type) {
58
+ tc.type = d.type;
59
+ }
60
+ if (d.function?.name) {
61
+ tc.function.name = d.function.name;
62
+ }
63
+ if (d.function?.arguments) {
64
+ tc.function.arguments += d.function.arguments;
65
+ }
66
+ const toolInfo = asToolInfo(d.toolInfo);
67
+ if (toolInfo != null) {
68
+ tc.toolInfo = toolInfo;
69
+ }
70
+ if (d.providerSpecificFields) {
71
+ tc.providerSpecificFields = {
72
+ ...tc.providerSpecificFields ?? {},
73
+ ...d.providerSpecificFields
74
+ };
75
+ }
76
+ }
77
+ }
78
+ if (delta.finishReason) {
79
+ base.finishReason = delta.finishReason;
80
+ }
81
+ if (delta.reasoningContent) {
82
+ base.reasoningContent = (base.reasoningContent ?? "") + delta.reasoningContent;
83
+ }
84
+ if (delta.usage) {
85
+ base.usage = delta.usage;
86
+ }
87
+ }
88
+
89
+ export {
90
+ isEventDelta,
91
+ mergeEventDelta
92
+ };
93
+ //# sourceMappingURL=chunk-3A2EPLQG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/eventUtils.ts"],"sourcesContent":["/**\n * Local implementations of streaming delta helpers.\n * Formerly imported from truefoundry-gateway-sdk/agents.\n */\n\nimport type {\n DeltaEvents,\n ModelMessageDeltaEvent,\n ModelMessageEvent,\n ToolCall,\n ToolInfo,\n TurnEvent,\n TurnStreamingEvent,\n} from \"./events.js\";\n\n/** True for `.delta` streaming events. */\nexport function isEventDelta(event: TurnStreamingEvent): event is DeltaEvents {\n return typeof event.type === \"string\" && event.type.endsWith(\".delta\");\n}\n\n/**\n * Merge `delta` into `base` in place (same `id` required).\n * Currently handles `model.message.delta` → `model.message`.\n */\nexport function mergeEventDelta(base: TurnEvent, delta: DeltaEvents): void {\n if (base.id !== delta.id) {\n throw new Error(\n `Cannot merge delta into a different event: base id \"${base.id}\" != delta id \"${delta.id}\".`,\n );\n }\n if (delta.type === \"model.message.delta\" && base.type === \"model.message\") {\n mergeModelMessageDelta(base, delta);\n }\n}\n\nfunction asToolInfo(value: unknown): ToolInfo | undefined {\n if (value == null || typeof value !== \"object\") {\n return undefined;\n }\n return value as ToolInfo;\n}\n\nfunction mergeModelMessageDelta(\n base: ModelMessageEvent,\n delta: ModelMessageDeltaEvent,\n): void {\n if (delta.content) {\n if (\n base.content === undefined ||\n base.content === null ||\n typeof base.content === \"string\"\n ) {\n base.content = (base.content ?? \"\") + delta.content;\n } else {\n const last = base.content[base.content.length - 1];\n if (last && last.type === \"text\") {\n last.text += delta.content;\n } else {\n base.content.push({ type: \"text\", text: delta.content });\n }\n }\n }\n\n if (delta.refusal) {\n base.refusal = (base.refusal ?? \"\") + delta.refusal;\n }\n\n if (delta.toolCalls) {\n base.toolCalls ??= [];\n for (const d of delta.toolCalls) {\n let tc: ToolCall | undefined = base.toolCalls[d.index];\n if (tc === undefined) {\n const toolInfo = asToolInfo(d.toolInfo);\n tc = {\n id: d.id ?? \"\",\n type: d.type ?? \"function\",\n function: {\n name: d.function?.name ?? \"\",\n arguments: \"\",\n },\n ...(toolInfo != null ? { toolInfo } : {}),\n };\n base.toolCalls[d.index] = tc;\n }\n if (d.id) {\n tc.id = d.id;\n }\n if (d.type) {\n tc.type = d.type;\n }\n if (d.function?.name) {\n tc.function.name = d.function.name;\n }\n if (d.function?.arguments) {\n tc.function.arguments += d.function.arguments;\n }\n const toolInfo = asToolInfo(d.toolInfo);\n if (toolInfo != null) {\n tc.toolInfo = toolInfo;\n }\n if (d.providerSpecificFields) {\n tc.providerSpecificFields = {\n ...(tc.providerSpecificFields ?? {}),\n ...d.providerSpecificFields,\n };\n }\n }\n }\n\n if (delta.finishReason) {\n base.finishReason = delta.finishReason;\n }\n if (delta.reasoningContent) {\n base.reasoningContent =\n (base.reasoningContent ?? \"\") + delta.reasoningContent;\n }\n if (delta.usage) {\n base.usage = delta.usage;\n }\n}\n"],"mappings":";AAgBO,SAAS,aAAa,OAAiD;AAC1E,SAAO,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,SAAS,QAAQ;AACzE;AAMO,SAAS,gBAAgB,MAAiB,OAA0B;AACvE,MAAI,KAAK,OAAO,MAAM,IAAI;AACtB,UAAM,IAAI;AAAA,MACN,uDAAuD,KAAK,EAAE,kBAAkB,MAAM,EAAE;AAAA,IAC5F;AAAA,EACJ;AACA,MAAI,MAAM,SAAS,yBAAyB,KAAK,SAAS,iBAAiB;AACvE,2BAAuB,MAAM,KAAK;AAAA,EACtC;AACJ;AAEA,SAAS,WAAW,OAAsC;AACtD,MAAI,SAAS,QAAQ,OAAO,UAAU,UAAU;AAC5C,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEA,SAAS,uBACL,MACA,OACI;AACJ,MAAI,MAAM,SAAS;AACf,QACI,KAAK,YAAY,UACjB,KAAK,YAAY,QACjB,OAAO,KAAK,YAAY,UAC1B;AACE,WAAK,WAAW,KAAK,WAAW,MAAM,MAAM;AAAA,IAChD,OAAO;AACH,YAAM,OAAO,KAAK,QAAQ,KAAK,QAAQ,SAAS,CAAC;AACjD,UAAI,QAAQ,KAAK,SAAS,QAAQ;AAC9B,aAAK,QAAQ,MAAM;AAAA,MACvB,OAAO;AACH,aAAK,QAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,QAAQ,CAAC;AAAA,MAC3D;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI,MAAM,SAAS;AACf,SAAK,WAAW,KAAK,WAAW,MAAM,MAAM;AAAA,EAChD;AAEA,MAAI,MAAM,WAAW;AACjB,SAAK,cAAc,CAAC;AACpB,eAAW,KAAK,MAAM,WAAW;AAC7B,UAAI,KAA2B,KAAK,UAAU,EAAE,KAAK;AACrD,UAAI,OAAO,QAAW;AAClB,cAAMA,YAAW,WAAW,EAAE,QAAQ;AACtC,aAAK;AAAA,UACD,IAAI,EAAE,MAAM;AAAA,UACZ,MAAM,EAAE,QAAQ;AAAA,UAChB,UAAU;AAAA,YACN,MAAM,EAAE,UAAU,QAAQ;AAAA,YAC1B,WAAW;AAAA,UACf;AAAA,UACA,GAAIA,aAAY,OAAO,EAAE,UAAAA,UAAS,IAAI,CAAC;AAAA,QAC3C;AACA,aAAK,UAAU,EAAE,KAAK,IAAI;AAAA,MAC9B;AACA,UAAI,EAAE,IAAI;AACN,WAAG,KAAK,EAAE;AAAA,MACd;AACA,UAAI,EAAE,MAAM;AACR,WAAG,OAAO,EAAE;AAAA,MAChB;AACA,UAAI,EAAE,UAAU,MAAM;AAClB,WAAG,SAAS,OAAO,EAAE,SAAS;AAAA,MAClC;AACA,UAAI,EAAE,UAAU,WAAW;AACvB,WAAG,SAAS,aAAa,EAAE,SAAS;AAAA,MACxC;AACA,YAAM,WAAW,WAAW,EAAE,QAAQ;AACtC,UAAI,YAAY,MAAM;AAClB,WAAG,WAAW;AAAA,MAClB;AACA,UAAI,EAAE,wBAAwB;AAC1B,WAAG,yBAAyB;AAAA,UACxB,GAAI,GAAG,0BAA0B,CAAC;AAAA,UAClC,GAAG,EAAE;AAAA,QACT;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI,MAAM,cAAc;AACpB,SAAK,eAAe,MAAM;AAAA,EAC9B;AACA,MAAI,MAAM,kBAAkB;AACxB,SAAK,oBACA,KAAK,oBAAoB,MAAM,MAAM;AAAA,EAC9C;AACA,MAAI,MAAM,OAAO;AACb,SAAK,QAAQ,MAAM;AAAA,EACvB;AACJ;","names":["toolInfo"]}
@@ -0,0 +1,270 @@
1
+ // src/plugins/truefoundry-agent-server-adapter/index.ts
2
+ import { AgentSessionClient } from "truefoundry-gateway-sdk/agents";
3
+ import { PrivateAgentSessionClient } from "truefoundry-gateway-sdk/agents/private";
4
+
5
+ // src/plugins/truefoundry-agent-server-adapter/guards.ts
6
+ function isRecord(value) {
7
+ return typeof value === "object" && value !== null;
8
+ }
9
+ function hasNumbers(value, keys) {
10
+ return isRecord(value) && keys.every((key) => typeof value[key] === "number");
11
+ }
12
+ function isTfySystemToolInfo(toolInfo) {
13
+ return isRecord(toolInfo) && toolInfo.type === "truefoundry-system" && typeof toolInfo.name === "string";
14
+ }
15
+ function isTfyMcpToolInfo(toolInfo) {
16
+ return isRecord(toolInfo) && toolInfo.type === "mcp" && typeof toolInfo.name === "string" && typeof toolInfo.serverId === "string" && typeof toolInfo.serverName === "string";
17
+ }
18
+ function isTfyToolInfo(toolInfo) {
19
+ return isTfySystemToolInfo(toolInfo) || isTfyMcpToolInfo(toolInfo);
20
+ }
21
+ var USAGE_BREAKDOWN_KEYS = [
22
+ "harness",
23
+ "skills",
24
+ "instructions",
25
+ "toolDefinitions",
26
+ "messages"
27
+ ];
28
+ function getTfyUsage(source) {
29
+ const usage = source?.usage;
30
+ if (!hasNumbers(usage, ["inputTokens", "outputTokens"])) {
31
+ return void 0;
32
+ }
33
+ if (!hasNumbers(usage.inputTokensBreakdown, USAGE_BREAKDOWN_KEYS)) {
34
+ return void 0;
35
+ }
36
+ return usage;
37
+ }
38
+ function getTfyThreadState(event) {
39
+ const state = event?.state;
40
+ if (!isRecord(state)) {
41
+ return void 0;
42
+ }
43
+ if (state.status === "done" && isRecord(state.output)) {
44
+ return state;
45
+ }
46
+ if (state.status === "error" && typeof state.error === "string") {
47
+ return state;
48
+ }
49
+ return void 0;
50
+ }
51
+ function getTfyMcpInitServers(event) {
52
+ const servers = event?.mcpServers;
53
+ if (!Array.isArray(servers)) {
54
+ return void 0;
55
+ }
56
+ const valid = servers.every(
57
+ (server) => isRecord(server) && typeof server.id === "string" && typeof server.name === "string"
58
+ );
59
+ return valid ? servers : void 0;
60
+ }
61
+
62
+ // src/plugins/truefoundry-agent-server-adapter/index.ts
63
+ function isDraft(session) {
64
+ return session.type === "session/draft";
65
+ }
66
+ function toSession(raw) {
67
+ const mutable = isDraft(raw);
68
+ return {
69
+ id: raw.id,
70
+ title: raw.title,
71
+ agentName: raw.agentName,
72
+ ...mutable ? { agentSpec: raw.agentSpec } : {},
73
+ isMutable: mutable,
74
+ createdBySubject: raw.createdBySubject,
75
+ createdAt: raw.createdAt,
76
+ updatedAt: raw.updatedAt
77
+ };
78
+ }
79
+ function toTurn(raw) {
80
+ return {
81
+ id: raw.id,
82
+ sessionId: raw.sessionId,
83
+ previousTurnId: raw.previousTurnId,
84
+ input: raw.input,
85
+ state: raw.state,
86
+ createdBySubject: raw.createdBySubject,
87
+ createdAt: raw.createdAt
88
+ };
89
+ }
90
+ async function toListResult(page, map) {
91
+ const nextPageToken = page.response?.pagination?.nextPageToken;
92
+ return {
93
+ data: page.data.map(map),
94
+ ...nextPageToken != null && nextPageToken !== "" ? { nextPageToken } : {}
95
+ };
96
+ }
97
+ function createTrueFoundryChatServer(opts) {
98
+ const gatewayOpts = { apiKey: opts.apiKey, baseUrl: opts.baseUrl };
99
+ const client = opts.client ?? new AgentSessionClient(gatewayOpts);
100
+ const privateClient = opts.privateClient ?? new PrivateAgentSessionClient(gatewayOpts);
101
+ const sessionTypeCache = /* @__PURE__ */ new Map();
102
+ function cacheSessionType(session) {
103
+ sessionTypeCache.set(session.id, session.isMutable);
104
+ }
105
+ function getSessionObj(sessionId) {
106
+ const isMutable = sessionTypeCache.get(sessionId);
107
+ if (isMutable === true) {
108
+ return privateClient.getDraftSession({ draftSessionId: sessionId });
109
+ }
110
+ if (isMutable === false) {
111
+ return client.getSession({ sessionId });
112
+ }
113
+ throw new Error(
114
+ `Cannot resolve session "${sessionId}": session type not cached. Ensure createSession or listSessions was called first.`
115
+ );
116
+ }
117
+ const server = {
118
+ async createSession(req) {
119
+ if (req.agentSpec != null) {
120
+ const draft = await privateClient.createDraftSession({
121
+ agentSpec: req.agentSpec,
122
+ ...req.agentName != null ? { agentName: req.agentName } : {},
123
+ ...req.tfyMetadata != null ? { tfyMetadata: req.tfyMetadata } : {}
124
+ });
125
+ const session = toSession(draft);
126
+ cacheSessionType(session);
127
+ return session;
128
+ }
129
+ if (req.agentName != null) {
130
+ const named = await client.createSession({
131
+ agentName: req.agentName,
132
+ ...req.tfyMetadata != null ? { tfyMetadata: req.tfyMetadata } : {}
133
+ });
134
+ const session = toSession(named);
135
+ cacheSessionType(session);
136
+ return session;
137
+ }
138
+ throw new Error("createSession requires agentName and/or agentSpec");
139
+ },
140
+ async listSessions(req) {
141
+ const page = await privateClient.listOwnedSessions({
142
+ limit: req?.limit,
143
+ order: req?.order,
144
+ pageToken: req?.pageToken,
145
+ startTimestamp: req?.startTimestamp,
146
+ endTimestamp: req?.endTimestamp,
147
+ ...req?.agentName != null ? { agentName: req.agentName } : {}
148
+ });
149
+ const result = await toListResult(page, (s) => toSession(s));
150
+ for (const session of result.data) {
151
+ cacheSessionType(session);
152
+ }
153
+ return result;
154
+ },
155
+ async getSession({ sessionId }) {
156
+ const raw = await getSessionObj(sessionId);
157
+ const session = toSession(raw);
158
+ cacheSessionType(session);
159
+ return session;
160
+ },
161
+ async updateSession(req) {
162
+ const raw = await getSessionObj(req.sessionId);
163
+ if (!isDraft(raw)) {
164
+ throw new Error(
165
+ "updateSession: session is not mutable (isMutable=false)"
166
+ );
167
+ }
168
+ if (req.agentSpec != null) {
169
+ await raw.update({ agentSpec: req.agentSpec });
170
+ }
171
+ return toSession(raw);
172
+ },
173
+ prepareAndExecuteTurn(req) {
174
+ return (async function* () {
175
+ const session = await getSessionObj(req.sessionId);
176
+ const prepared = session.prepareTurn({
177
+ input: req.input,
178
+ previousTurnId: req.previousTurnId ?? "auto"
179
+ });
180
+ yield* prepared.execute(
181
+ { stream: true },
182
+ {
183
+ ...req.abortSignal != null ? { abortSignal: req.abortSignal } : {},
184
+ ...req.headers != null ? { headers: req.headers } : {}
185
+ }
186
+ );
187
+ })();
188
+ },
189
+ async cancelSession({ sessionId }) {
190
+ await (await getSessionObj(sessionId)).cancel();
191
+ },
192
+ async deleteSession({ sessionId }) {
193
+ if (opts.deleteSession == null) {
194
+ throw new Error(
195
+ "deleteSession is not on the gateway SDK. Pass deleteSession to createTrueFoundryChatServer."
196
+ );
197
+ }
198
+ await opts.deleteSession({ sessionId });
199
+ },
200
+ // The runtime's signature offers `order`, but the gateway's listTurns
201
+ // takes no such param — forwarding it silently did nothing.
202
+ async listTurns({ sessionId, limit, pageToken }) {
203
+ const raw = await getSessionObj(sessionId);
204
+ const page = await raw.listTurns({
205
+ ...limit != null ? { limit } : {},
206
+ ...pageToken != null ? { pageToken } : {}
207
+ });
208
+ return toListResult(page, (turn) => toTurn(turn));
209
+ },
210
+ async getTurn({ sessionId, turnId }) {
211
+ const raw = await getSessionObj(sessionId);
212
+ return toTurn(await raw.getTurn({ turnId }));
213
+ },
214
+ async listEvents({ sessionId, pageToken, lastTurnId, limit }) {
215
+ const raw = await getSessionObj(sessionId);
216
+ const page = await raw.listEvents({
217
+ ...limit != null ? { limit } : {},
218
+ ...pageToken != null ? { pageToken } : {},
219
+ ...lastTurnId != null ? { lastTurnId } : {}
220
+ });
221
+ return toListResult(
222
+ page,
223
+ (item) => item
224
+ );
225
+ },
226
+ async listTurnEvents({ sessionId, turnId, limit, pageToken, order }) {
227
+ const raw = await getSessionObj(sessionId);
228
+ const turn = await raw.getTurn({ turnId });
229
+ const page = await turn.listEvents({
230
+ ...limit != null ? { limit } : {},
231
+ ...pageToken != null ? { pageToken } : {},
232
+ ...order != null ? { order } : {}
233
+ });
234
+ return toListResult(page, (event) => event);
235
+ },
236
+ async *subscribeToTurn({
237
+ sessionId,
238
+ turnId,
239
+ afterSequenceNumber,
240
+ abortSignal
241
+ }) {
242
+ const raw = await getSessionObj(sessionId);
243
+ const turn = await raw.getTurn({ turnId });
244
+ yield* turn.stream(
245
+ afterSequenceNumber != null ? { afterSequenceNumber } : {},
246
+ abortSignal != null ? { abortSignal } : {}
247
+ );
248
+ },
249
+ async downloadSandboxFile(sandboxId, req) {
250
+ const response = await privateClient.downloadSandboxFile(
251
+ sandboxId,
252
+ req
253
+ );
254
+ return await response.blob();
255
+ },
256
+ getGatewayClients: () => ({ client, privateClient })
257
+ };
258
+ return server;
259
+ }
260
+
261
+ export {
262
+ isTfySystemToolInfo,
263
+ isTfyMcpToolInfo,
264
+ isTfyToolInfo,
265
+ getTfyUsage,
266
+ getTfyThreadState,
267
+ getTfyMcpInitServers,
268
+ createTrueFoundryChatServer
269
+ };
270
+ //# sourceMappingURL=chunk-Q2SHKMLM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/truefoundry-agent-server-adapter/index.ts","../src/plugins/truefoundry-agent-server-adapter/guards.ts"],"sourcesContent":["import { AgentSessionClient } from \"truefoundry-gateway-sdk/agents\";\nimport type { AgentSession } from \"truefoundry-gateway-sdk/agents\";\nimport { PrivateAgentSessionClient } from \"truefoundry-gateway-sdk/agents/private\";\nimport type { AgentDraftSession } from \"truefoundry-gateway-sdk/agents/private\";\nimport type {\n AgentChatServer,\n ListResult,\n TurnInputItem,\n PreviousTurnIdInput,\n UpdateSessionRequest,\n} from \"../../server/types.js\";\nimport type {\n SessionEventItem,\n TurnEvent,\n TurnStreamData,\n} from \"../../server/events.js\";\nimport type {\n TfyAgentSpec,\n TfyCreateSessionRequest,\n TfyListSessionsParams,\n TfySession,\n TfyTurn,\n TfyTurnState,\n} from \"./types.js\";\n\nexport {\n type TfyAgentSpec,\n type TfySkillMount,\n type TfyMcpServerMount,\n type TfyModelParams,\n type TfyRuntimeConfig,\n type TfyResponseFormat,\n type TfySubject,\n type ToolsSelectorItem,\n type ToolsSelectorTag,\n type RequireApprovalToolSelectorItem,\n type RequireApprovalToolsSelectorTag,\n type TfyTurn,\n type TfyTurnState,\n type TfyTurnCancelledReason,\n type TfyTurnStateDoneOutput,\n type TfySession,\n type TfyCreateSessionRequest,\n type TfyListSessionsParams,\n type TfyToolInfo,\n type TfySystemToolInfo,\n type TfyMcpToolInfo,\n type TfyModelMessageUsage,\n type TfyFinishReason,\n type TfyThreadState,\n type TfyMcpServerInitInfo,\n} from \"./types.js\";\n\nexport {\n isTfyToolInfo,\n isTfySystemToolInfo,\n isTfyMcpToolInfo,\n getTfyUsage,\n getTfyThreadState,\n getTfyMcpInitServers,\n} from \"./guards.js\";\n\ntype GwSession = AgentSession | AgentDraftSession;\n\nexport type CreateTrueFoundryChatServerOptions = {\n apiKey: string;\n baseUrl: string;\n /** Optional override — otherwise constructed from apiKey/baseUrl. */\n client?: AgentSessionClient;\n privateClient?: PrivateAgentSessionClient;\n deleteSession?: (req: { sessionId: string }) => Promise<void>;\n};\n\n/**\n * Only the spec is generic. Session/Turn/list-params are the concrete Tfy*\n * types because the adapter builds them as fixed object literals — a generic\n * there would type fields that nothing ever populates. The spec is safe: the\n * gateway SDK serializes with `unrecognizedObjectKeys: \"passthrough\"`, so\n * host-added spec fields survive the round trip.\n */\nexport type TrueFoundryChatServer<TSpec extends TfyAgentSpec = TfyAgentSpec> =\n AgentChatServer<\n TSpec,\n TfySession<TSpec>,\n TfyCreateSessionRequest<TSpec>,\n TfyListSessionsParams,\n UpdateSessionRequest<TSpec>,\n TfyTurn\n > & {\n /** Escape hatch for hosts that still need raw gateway clients. */\n getGatewayClients(): {\n client: AgentSessionClient;\n privateClient: PrivateAgentSessionClient;\n };\n };\n\nfunction isDraft(session: GwSession): session is AgentDraftSession {\n return (session as AgentDraftSession).type === \"session/draft\";\n}\n\nfunction toSession<TSpec extends TfyAgentSpec>(raw: GwSession): TfySession<TSpec> {\n const mutable = isDraft(raw);\n return {\n id: raw.id,\n title: raw.title,\n agentName: raw.agentName,\n ...(mutable ? { agentSpec: raw.agentSpec as TSpec } : {}),\n isMutable: mutable,\n createdBySubject: raw.createdBySubject,\n createdAt: raw.createdAt,\n updatedAt: raw.updatedAt,\n };\n}\n\nfunction toTurn(raw: {\n id: string;\n sessionId: string;\n previousTurnId?: string | null;\n input?: TurnInputItem[];\n state: unknown;\n createdBySubject: TfyTurn[\"createdBySubject\"];\n createdAt: string;\n}): TfyTurn {\n return {\n id: raw.id,\n sessionId: raw.sessionId,\n previousTurnId: raw.previousTurnId,\n input: raw.input,\n state: raw.state as TfyTurnState,\n createdBySubject: raw.createdBySubject,\n createdAt: raw.createdAt,\n };\n}\n\nasync function toListResult<TIn, TOut>(\n page: {\n data: TIn[];\n response?: { pagination?: { nextPageToken?: string } };\n hasNextPage?: () => boolean;\n },\n map: (item: TIn) => TOut,\n): Promise<ListResult<TOut>> {\n const nextPageToken = page.response?.pagination?.nextPageToken;\n return {\n data: page.data.map(map),\n ...(nextPageToken != null && nextPageToken !== \"\"\n ? { nextPageToken }\n : {}),\n };\n}\n\n/**\n * Wraps TrueFoundry gateway clients into a flat `AgentChatServer`.\n * Named vs draft routing is fully internal — an in-memory session-type cache\n * (populated by createSession/listSessions) determines which gateway client\n * to call. No try/catch fallback, no double network calls.\n */\nexport function createTrueFoundryChatServer<\n TSpec extends TfyAgentSpec = TfyAgentSpec,\n>(\n opts: CreateTrueFoundryChatServerOptions,\n): TrueFoundryChatServer<TSpec> {\n const gatewayOpts = { apiKey: opts.apiKey, baseUrl: opts.baseUrl };\n const client = opts.client ?? new AgentSessionClient(gatewayOpts);\n const privateClient =\n opts.privateClient ?? new PrivateAgentSessionClient(gatewayOpts);\n\n const sessionTypeCache = new Map<string, boolean>();\n\n function cacheSessionType(session: {\n id: string;\n isMutable: boolean;\n }): void {\n sessionTypeCache.set(session.id, session.isMutable);\n }\n\n function getSessionObj(sessionId: string): Promise<GwSession> {\n const isMutable = sessionTypeCache.get(sessionId);\n if (isMutable === true) {\n return privateClient.getDraftSession({ draftSessionId: sessionId });\n }\n if (isMutable === false) {\n return client.getSession({ sessionId });\n }\n throw new Error(\n `Cannot resolve session \"${sessionId}\": session type not cached. ` +\n `Ensure createSession or listSessions was called first.`,\n );\n }\n\n const server: TrueFoundryChatServer<TSpec> = {\n async createSession(req) {\n if (req.agentSpec != null) {\n const draft = await privateClient.createDraftSession({\n agentSpec: req.agentSpec,\n ...(req.agentName != null ? { agentName: req.agentName } : {}),\n ...(req.tfyMetadata != null\n ? { tfyMetadata: req.tfyMetadata }\n : {}),\n });\n const session = toSession<TSpec>(draft);\n cacheSessionType(session);\n return session;\n }\n if (req.agentName != null) {\n const named = await client.createSession({\n agentName: req.agentName,\n ...(req.tfyMetadata != null\n ? { tfyMetadata: req.tfyMetadata }\n : {}),\n });\n const session = toSession<TSpec>(named);\n cacheSessionType(session);\n return session;\n }\n throw new Error(\"createSession requires agentName and/or agentSpec\");\n },\n\n async listSessions(req) {\n const page = await privateClient.listOwnedSessions({\n limit: req?.limit,\n order: req?.order,\n pageToken: req?.pageToken,\n startTimestamp: req?.startTimestamp,\n endTimestamp: req?.endTimestamp,\n ...(req?.agentName != null ? { agentName: req.agentName } : {}),\n });\n const result = await toListResult(page, (s) => toSession<TSpec>(s));\n for (const session of result.data) {\n cacheSessionType(session);\n }\n return result;\n },\n\n async getSession({ sessionId }) {\n const raw = await getSessionObj(sessionId);\n const session = toSession<TSpec>(raw);\n cacheSessionType(session);\n return session;\n },\n\n async updateSession(req) {\n const raw = await getSessionObj(req.sessionId);\n if (!isDraft(raw)) {\n throw new Error(\n \"updateSession: session is not mutable (isMutable=false)\",\n );\n }\n if (req.agentSpec != null) {\n await raw.update({ agentSpec: req.agentSpec });\n }\n return toSession<TSpec>(raw);\n },\n\n prepareAndExecuteTurn(req: {\n sessionId: string;\n input?: TurnInputItem[];\n previousTurnId?: PreviousTurnIdInput;\n abortSignal?: AbortSignal;\n headers?: Record<string, string>;\n }): AsyncIterable<TurnStreamData> {\n return (async function* () {\n const session = await getSessionObj(req.sessionId);\n const prepared = session.prepareTurn({\n input: req.input,\n previousTurnId: req.previousTurnId ?? \"auto\",\n });\n yield* prepared.execute(\n { stream: true },\n {\n ...(req.abortSignal != null\n ? { abortSignal: req.abortSignal }\n : {}),\n ...(req.headers != null ? { headers: req.headers } : {}),\n },\n ) as AsyncIterable<TurnStreamData>;\n })();\n },\n\n async cancelSession({ sessionId }) {\n await (await getSessionObj(sessionId)).cancel();\n },\n\n async deleteSession({ sessionId }) {\n if (opts.deleteSession == null) {\n throw new Error(\n \"deleteSession is not on the gateway SDK. Pass deleteSession to createTrueFoundryChatServer.\",\n );\n }\n await opts.deleteSession({ sessionId });\n },\n\n // The runtime's signature offers `order`, but the gateway's listTurns\n // takes no such param — forwarding it silently did nothing.\n async listTurns({ sessionId, limit, pageToken }) {\n const raw = await getSessionObj(sessionId);\n const page = await raw.listTurns({\n ...(limit != null ? { limit } : {}),\n ...(pageToken != null ? { pageToken } : {}),\n });\n return toListResult(page, (turn) => toTurn(turn));\n },\n\n async getTurn({ sessionId, turnId }) {\n const raw = await getSessionObj(sessionId);\n return toTurn(await raw.getTurn({ turnId }));\n },\n\n async listEvents({ sessionId, pageToken, lastTurnId, limit }) {\n const raw = await getSessionObj(sessionId);\n const page = await raw.listEvents({\n ...(limit != null ? { limit } : {}),\n ...(pageToken != null ? { pageToken } : {}),\n ...(lastTurnId != null ? { lastTurnId } : {}),\n });\n return toListResult(\n page,\n (item) => item as SessionEventItem,\n );\n },\n\n async listTurnEvents({ sessionId, turnId, limit, pageToken, order }) {\n const raw = await getSessionObj(sessionId);\n const turn = await raw.getTurn({ turnId });\n const page = await turn.listEvents({\n ...(limit != null ? { limit } : {}),\n ...(pageToken != null ? { pageToken } : {}),\n ...(order != null ? { order } : {}),\n });\n return toListResult(page, (event) => event as TurnEvent);\n },\n\n async *subscribeToTurn({\n sessionId,\n turnId,\n afterSequenceNumber,\n abortSignal,\n }) {\n const raw = await getSessionObj(sessionId);\n const turn = await raw.getTurn({ turnId });\n yield* turn.stream(\n afterSequenceNumber != null ? { afterSequenceNumber } : {},\n abortSignal != null ? { abortSignal } : {},\n ) as AsyncIterable<TurnStreamData>;\n },\n\n async downloadSandboxFile(sandboxId, req) {\n const response = await privateClient.downloadSandboxFile(\n sandboxId,\n req,\n );\n return await response.blob();\n },\n\n getGatewayClients: () => ({ client, privateClient }),\n };\n\n return server;\n}\n","/**\n * Point-of-use narrowing for the event half of the gateway protocol.\n *\n * `AgentChatServer` hardcodes the runtime's event types on listEvents,\n * listTurnEvents, subscribeToTurn and prepareAndExecuteTurn — there is no\n * generic to override them from here. So instead of typing those channels,\n * hosts call these guards on the values they receive.\n *\n * They validate rather than cast: this data comes off the network, and the\n * runtime types the relevant fields as `unknown` precisely because nothing\n * has checked them yet.\n */\n\nimport type {\n TfyMcpServerInitInfo,\n TfyMcpToolInfo,\n TfyModelMessageUsage,\n TfySystemToolInfo,\n TfyThreadState,\n TfyToolInfo,\n} from \"./types.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction hasNumbers<K extends string>(\n value: unknown,\n keys: readonly K[],\n): value is Record<string, unknown> & Record<K, number> {\n return isRecord(value) && keys.every((key) => typeof value[key] === \"number\");\n}\n\n/**\n * Identifies built-in tools such as `ask_user_question` and `create_sub_agent`.\n * Note `toolInfo` is legitimately absent on streamed deltas, so callers must\n * keep their `function.name` fallback rather than treating absence as an error.\n */\nexport function isTfySystemToolInfo(\n toolInfo: unknown,\n): toolInfo is TfySystemToolInfo {\n return (\n isRecord(toolInfo) &&\n toolInfo.type === \"truefoundry-system\" &&\n typeof toolInfo.name === \"string\"\n );\n}\n\n/** Carries `serverId` / `serverName`, so the UI can attribute a call to its MCP server. */\nexport function isTfyMcpToolInfo(toolInfo: unknown): toolInfo is TfyMcpToolInfo {\n return (\n isRecord(toolInfo) &&\n toolInfo.type === \"mcp\" &&\n typeof toolInfo.name === \"string\" &&\n typeof toolInfo.serverId === \"string\" &&\n typeof toolInfo.serverName === \"string\"\n );\n}\n\nexport function isTfyToolInfo(toolInfo: unknown): toolInfo is TfyToolInfo {\n return isTfySystemToolInfo(toolInfo) || isTfyMcpToolInfo(toolInfo);\n}\n\nconst USAGE_BREAKDOWN_KEYS = [\n \"harness\",\n \"skills\",\n \"instructions\",\n \"toolDefinitions\",\n \"messages\",\n] as const;\n\n/**\n * Token usage including the TrueFoundry-specific `inputTokensBreakdown`, which\n * attributes input tokens across harness, skills, instructions, tool\n * definitions and messages.\n */\nexport function getTfyUsage(\n source: { usage?: unknown } | null | undefined,\n): TfyModelMessageUsage | undefined {\n const usage = source?.usage;\n if (!hasNumbers(usage, [\"inputTokens\", \"outputTokens\"])) {\n return undefined;\n }\n if (!hasNumbers(usage.inputTokensBreakdown, USAGE_BREAKDOWN_KEYS)) {\n return undefined;\n }\n return usage as unknown as TfyModelMessageUsage;\n}\n\n/**\n * Completion state of a sub-agent thread. The runtime types `thread.done`'s\n * `state` as `unknown`, so a sub-agent that errored is otherwise\n * indistinguishable from one that succeeded.\n */\nexport function getTfyThreadState(\n event: { state?: unknown } | null | undefined,\n): TfyThreadState | undefined {\n const state = event?.state;\n if (!isRecord(state)) {\n return undefined;\n }\n if (state.status === \"done\" && isRecord(state.output)) {\n return state as unknown as TfyThreadState;\n }\n if (state.status === \"error\" && typeof state.error === \"string\") {\n return state as unknown as TfyThreadState;\n }\n return undefined;\n}\n\n/**\n * Servers from an `mcp.initialize` event, including each one's `transportType`.\n * The runtime models this event with an index signature, so the array is\n * `unknown` until checked.\n */\nexport function getTfyMcpInitServers(\n event: { mcpServers?: unknown } | null | undefined,\n): TfyMcpServerInitInfo[] | undefined {\n const servers = event?.mcpServers;\n if (!Array.isArray(servers)) {\n return undefined;\n }\n const valid = servers.every(\n (server) =>\n isRecord(server) &&\n typeof server.id === \"string\" &&\n typeof server.name === \"string\",\n );\n return valid ? (servers as TfyMcpServerInitInfo[]) : undefined;\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,15 +1,19 @@
1
1
  import * as _assistant_ui_core from '@assistant-ui/core';
2
2
  import { ExternalStoreSharedOptions, AttachmentAdapter, SpeechSynthesisAdapter, DictationAdapter, RealtimeVoiceAdapter, FeedbackAdapter, ThreadAssistantMessagePart, ThreadMessage, AppendMessage, ExportedMessageRepositoryItem, RemoteThreadListAdapter } from '@assistant-ui/core';
3
- import * as truefoundry_gateway_sdk_agents from 'truefoundry-gateway-sdk/agents';
4
- import { AgentSessionClient, TurnEvent, ThreadCreatedEvent, UserToolResponseEvent, McpAuthRequiredEvent, UserToolApprovalEvent, Turn, TurnInputItem, AgentSession } from 'truefoundry-gateway-sdk/agents';
5
- export { SandboxCreatedEvent } from 'truefoundry-gateway-sdk/agents';
6
- import { PrivateAgentSessionClient } from 'truefoundry-gateway-sdk/agents/private';
7
- export { AgentDraftSession, PrivateAgentSessionClient } from 'truefoundry-gateway-sdk/agents/private';
8
- import { TruefoundryGatewayApi } from 'truefoundry-gateway-sdk';
3
+ import { A as AgentSpec, b as AgentChatServer, c as TurnEvent, d as ThreadCreatedEvent, e as UserToolResponseEvent, M as McpAuthRequiredEvent, f as UserToolApprovalEvent, T as Turn, g as TurnInputItem, S as Session } from './types-BfiFf8O1.js';
4
+ export { h as AgentBuilderServer, C as CreateSessionRequest, i as ListResult, L as ListSessionsParams, j as ModelMessageEvent, P as PreviousTurnIdInput, k as SandboxCreatedEvent, l as SessionEventItem, m as ToolApprovalRequiredEvent, n as ToolCall, o as ToolResponseRequiredEvent, a as TurnState, p as TurnStateDone, q as TurnStreamData, r as TurnStreamingEvent, U as UpdateSessionRequest, s as UserMessage } from './types-BfiFf8O1.js';
9
5
  import * as _assistant_ui_core_internal from '@assistant-ui/core/internal';
6
+ export { isEventDelta, mergeEventDelta } from './server/index.js';
7
+ export { CreateTrueFoundryChatServerOptions, RequireApprovalToolSelectorItem, RequireApprovalToolsSelectorTag, TfyAgentSpec, TfyCreateSessionRequest, TfyFinishReason, TfyListSessionsParams, TfyMcpServerInitInfo, TfyMcpServerMount, TfyMcpToolInfo, TfyModelMessageUsage, TfyModelParams, TfyResponseFormat, TfyRuntimeConfig, TfySession, TfySkillMount, TfySubject, TfySystemToolInfo, TfyThreadState, TfyToolInfo, TfyTurn, TfyTurnCancelledReason, TfyTurnState, TfyTurnStateDoneOutput, ToolsSelectorItem, ToolsSelectorTag, TrueFoundryChatServer, createTrueFoundryChatServer, getTfyMcpInitServers, getTfyThreadState, getTfyUsage, isTfyMcpToolInfo, isTfySystemToolInfo, isTfyToolInfo } from './plugins/truefoundry-agent-server-adapter/index.js';
8
+ import 'truefoundry-gateway-sdk/agents';
9
+ import 'truefoundry-gateway-sdk/agents/private';
10
+ import 'truefoundry-gateway-sdk';
10
11
 
11
- type AgentSpec = TruefoundryGatewayApi.AgentSpec;
12
- type DraftSession = TruefoundryGatewayApi.DraftSession;
12
+ /** @deprecated Use Session with isMutable: true instead. Kept for title helper. */
13
+ type DraftSession = {
14
+ title?: string | null;
15
+ agentSpec: AgentSpec;
16
+ };
13
17
  type AgentSpecUpdate = {
14
18
  instructions?: string;
15
19
  model?: Partial<AgentSpec["model"]> & {
@@ -36,7 +40,7 @@ type DraftAgentConfig = {
36
40
  };
37
41
  type TrueFoundryAgentConfig = NamedAgentConfig | DraftAgentConfig;
38
42
  type TrueFoundryAgentRuntimeBaseOptions = ExternalStoreSharedOptions & {
39
- client: AgentSessionClient;
43
+ server: AgentChatServer;
40
44
  initialSessionId?: string | undefined;
41
45
  threadId?: string | undefined;
42
46
  onThreadIdChange?: ((threadId: string | undefined) => void) | undefined;
@@ -55,11 +59,6 @@ type UseTrueFoundryAgentRuntimeOptions = TrueFoundryAgentRuntimeBaseOptions & {
55
59
  agent?: TrueFoundryAgentConfig | undefined;
56
60
  /** Legacy named-agent shorthand. Prefer `agent: { mode: "named", agentName }`. */
57
61
  agentName?: string | undefined;
58
- /**
59
- * Required when `agent.mode === "draft"`. Also used for sandbox file downloads
60
- * (named or draft).
61
- */
62
- privateClient?: PrivateAgentSessionClient | undefined;
63
62
  };
64
63
 
65
64
  declare function useTrueFoundryAgentRuntime(options: UseTrueFoundryAgentRuntimeOptions): _assistant_ui_core.AssistantRuntime;
@@ -157,8 +156,8 @@ type ConvertTurnsResult = {
157
156
  runningTurn?: Turn;
158
157
  unstable_resume?: boolean;
159
158
  };
160
- declare function buildTurnAssistantContent(turn: Pick<Turn, "listEvents" | "state">, foldState?: PeerThreadFoldState): Promise<AssistantContentPart[]>;
161
- declare function convertTurnsToThreadMessages(session: AgentSession): Promise<ConvertTurnsResult>;
159
+ declare function buildTurnAssistantContent(server: AgentChatServer, sessionId: string, turn: Pick<Turn, "id" | "state">, foldState?: PeerThreadFoldState): Promise<AssistantContentPart[]>;
160
+ declare function convertTurnsToThreadMessages(server: AgentChatServer, sessionId: string): Promise<ConvertTurnsResult>;
162
161
  declare function getTurnMessageContent(message: AppendMessage): string;
163
162
  /**
164
163
  * Gateway `user.message` content (string for text-only, or text/file parts).
@@ -183,24 +182,24 @@ declare function buildEditedUserMessageContent(editedText: string, originalInput
183
182
  declare function repositoryItemsFromMessages(messages: readonly ThreadMessage[]): ExportedMessageRepositoryItem[];
184
183
 
185
184
  declare function createTrueFoundryDraftThreadListAdapter(options: {
186
- privateClient: PrivateAgentSessionClient;
185
+ server: AgentChatServer;
187
186
  defaultAgentSpec: AgentSpec;
188
187
  getAgentSpec?: () => AgentSpec;
189
188
  }): RemoteThreadListAdapter;
190
189
 
191
190
  /**
192
- * Read-only thread-list adapter backed by `PrivateAgentSessionClient.listOwnedSessions`.
193
- * Returns every session the caller owns (named + draft), newest first.
191
+ * Read-only thread-list adapter backed by `AgentChatServer.listSessions`.
192
+ * Hosts that previously used listOwnedSessions should filter in their server impl.
194
193
  */
195
194
  declare function createTrueFoundryOwnedSessionsThreadListAdapter(options: {
196
- privateClient: PrivateAgentSessionClient;
195
+ server: AgentChatServer;
197
196
  }): RemoteThreadListAdapter;
198
197
 
199
198
  type DraftSessionBridge = {
200
199
  syncAgentSpec: (draftSessionId: string, agentSpec: AgentSpec) => Promise<string>;
201
200
  getDraftAgentSpec: (draftSessionId: string) => Promise<AgentSpec>;
202
201
  };
203
- declare function createDraftSessionBridge(privateClient: PrivateAgentSessionClient): DraftSessionBridge;
202
+ declare function createDraftSessionBridge(server: AgentChatServer): DraftSessionBridge;
204
203
 
205
204
  type PendingApproval = {
206
205
  approvalId: string;
@@ -260,7 +259,7 @@ declare const useTrueFoundryToolResponses: () => {
260
259
  /** Pending MCP OAuth plus a resume action. */
261
260
  declare const useTrueFoundryMcpAuth: () => {
262
261
  pending: {
263
- mcpServers: truefoundry_gateway_sdk_agents.McpAuthRequiredEvent["mcpServers"];
262
+ mcpServers: McpAuthRequiredEvent["mcpServers"];
264
263
  } | null;
265
264
  resume: () => Promise<void>;
266
265
  };
@@ -305,16 +304,12 @@ declare function findPausedAssistantMessage(messages: readonly ThreadMessage[]):
305
304
  }> | undefined;
306
305
 
307
306
  declare function createTrueFoundryThreadListAdapter(options: {
308
- client: AgentSessionClient;
307
+ server: AgentChatServer;
309
308
  agentName: string;
310
309
  }): RemoteThreadListAdapter;
311
310
 
312
- type GetSessionOptions = {
313
- /** When set, validates the draft and binds turns via PrivateAgentSessionClient. */
314
- privateClient?: PrivateAgentSessionClient;
315
- };
316
311
  /** `sessionId` is the assistant-ui thread `remoteId` from `RemoteThreadListAdapter.initialize`. */
317
- declare function getSession(client: AgentSessionClient, sessionId: string, options?: GetSessionOptions): Promise<AgentSession>;
312
+ declare function getSession(server: AgentChatServer, sessionId: string): Promise<Session>;
318
313
 
319
314
  /**
320
315
  * Reads composer files into `CompleteAttachment` `file` parts for send.
@@ -322,4 +317,4 @@ declare function getSession(client: AgentSessionClient, sessionId: string, optio
322
317
  */
323
318
  declare const trueFoundryAttachmentAdapter: AttachmentAdapter;
324
319
 
325
- export { type AgentSpec, type AgentSpecUpdate, type ConvertTurnsResult, type DraftAgentConfig, type DraftSession, type DraftSessionBridge, type McpAuthMessageCustomMetadata, type NamedAgentConfig, type PendingApproval, type PendingToolResponse, ROOT_THREAD_ID, type SandboxMessageCustomMetadata, type SubAgentArtifact, type SubAgentCustomMetadata, type SubAgentMessageCustomMetadata, TOOL_RESPONSE_THREAD_ID_CUSTOM_KEY, type ToolApprovalMessageCustomMetadata, type ToolResponseMessageCustomMetadata, type TrueFoundryAgentConfig, type TrueFoundryDraftRuntimeExtras, type TrueFoundryMessageCustomMetadata, type TrueFoundryRuntimeExtras, type UseTrueFoundryAgentRuntimeOptions, type UserMessageContent, buildEditedUserMessageContent, buildTurnAssistantContent, buildUserMessageContent, collectApprovalInputs, collectRequiredActionInputs, collectResponseInputs, convertTurnsToThreadMessages, createDraftSessionBridge, createTrueFoundryDraftThreadListAdapter, createTrueFoundryOwnedSessionsThreadListAdapter, createTrueFoundryThreadListAdapter, draftSessionTitle, findPausedAssistantMessage, getSession, getTurnMessageContent, mergeAgentSpec, messageHasPendingApprovals, messageHasPendingRequiredActions, messageHasPendingResponses, parseTurnIdFromMessageId, repositoryItemsFromMessages, toTrueFoundryApprovalInputs, trueFoundryAttachmentAdapter, trueFoundryExtras, useTrueFoundryAgentRuntime, useTrueFoundryAgentSpec, useTrueFoundryApprovals, useTrueFoundryCancel, useTrueFoundryDownloadSandboxFile, useTrueFoundryHistoryPagination, useTrueFoundryMcpAuth, useTrueFoundryReload, useTrueFoundryResetFromTurn, useTrueFoundryRespondToToolApproval, useTrueFoundryRespondToToolResponse, useTrueFoundryResumeMcpAuth, useTrueFoundrySandboxId, useTrueFoundryToolResponses, useTrueFoundryUpdateAgentSpec };
320
+ export { AgentChatServer, AgentSpec, type AgentSpecUpdate, type ConvertTurnsResult, type DraftAgentConfig, type DraftSession, type DraftSessionBridge, type McpAuthMessageCustomMetadata, McpAuthRequiredEvent, type NamedAgentConfig, type PendingApproval, type PendingToolResponse, ROOT_THREAD_ID, type SandboxMessageCustomMetadata, AgentSpec as ServerAgentSpec, Session, type SubAgentArtifact, type SubAgentCustomMetadata, type SubAgentMessageCustomMetadata, TOOL_RESPONSE_THREAD_ID_CUSTOM_KEY, ThreadCreatedEvent, type ToolApprovalMessageCustomMetadata, type ToolResponseMessageCustomMetadata, type TrueFoundryAgentConfig, type TrueFoundryDraftRuntimeExtras, type TrueFoundryMessageCustomMetadata, type TrueFoundryRuntimeExtras, Turn, TurnEvent, TurnInputItem, type UseTrueFoundryAgentRuntimeOptions, type UserMessageContent, UserToolApprovalEvent, UserToolResponseEvent, buildEditedUserMessageContent, buildTurnAssistantContent, buildUserMessageContent, collectApprovalInputs, collectRequiredActionInputs, collectResponseInputs, convertTurnsToThreadMessages, createDraftSessionBridge, createTrueFoundryDraftThreadListAdapter, createTrueFoundryOwnedSessionsThreadListAdapter, createTrueFoundryThreadListAdapter, draftSessionTitle, findPausedAssistantMessage, getSession, getTurnMessageContent, mergeAgentSpec, messageHasPendingApprovals, messageHasPendingRequiredActions, messageHasPendingResponses, parseTurnIdFromMessageId, repositoryItemsFromMessages, toTrueFoundryApprovalInputs, trueFoundryAttachmentAdapter, trueFoundryExtras, useTrueFoundryAgentRuntime, useTrueFoundryAgentSpec, useTrueFoundryApprovals, useTrueFoundryCancel, useTrueFoundryDownloadSandboxFile, useTrueFoundryHistoryPagination, useTrueFoundryMcpAuth, useTrueFoundryReload, useTrueFoundryResetFromTurn, useTrueFoundryRespondToToolApproval, useTrueFoundryRespondToToolResponse, useTrueFoundryResumeMcpAuth, useTrueFoundrySandboxId, useTrueFoundryToolResponses, useTrueFoundryUpdateAgentSpec };