@truefoundry/assistant-ui-runtime 0.1.5 → 0.1.6-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +374 -190
  2. package/dist/index.d.ts +32 -29
  3. package/dist/index.js +330 -236
  4. package/dist/index.js.map +1 -1
  5. package/dist/plugins/truefoundry-agent-server-adapter/index.d.ts +30 -0
  6. package/dist/plugins/truefoundry-agent-server-adapter/index.js +198 -0
  7. package/dist/plugins/truefoundry-agent-server-adapter/index.js.map +1 -0
  8. package/dist/types-VUBzoJT2.d.ts +462 -0
  9. package/package.json +10 -2
  10. package/src/askUserQuestion.ts +3 -3
  11. package/src/buildEditedUserMessageContent.test.ts +2 -2
  12. package/src/collectPending.ts +1 -1
  13. package/src/convertTurnMessages.test.ts +141 -196
  14. package/src/convertTurnMessages.ts +130 -76
  15. package/src/createSubAgent.ts +1 -1
  16. package/src/draftAgentConfig.test.ts +26 -29
  17. package/src/extractTurnUserText.ts +1 -1
  18. package/src/foldPeerThreads.test.ts +1 -1
  19. package/src/foldPeerThreads.ts +3 -2
  20. package/src/index.ts +39 -4
  21. package/src/listPages.ts +21 -0
  22. package/src/loadSessionSnapshot.test.ts +9 -8
  23. package/src/loadSessionSnapshot.ts +9 -14
  24. package/src/mcpAuth.ts +6 -3
  25. package/src/messageCustomMetadata.ts +1 -1
  26. package/src/modelMessageContent.ts +1 -1
  27. package/src/modelMessageImageContent.test.ts +1 -1
  28. package/src/modelMessageImageContent.ts +7 -6
  29. package/src/plugins/truefoundry-agent-server-adapter/index.ts +285 -0
  30. package/src/private/agentSpec.ts +8 -3
  31. package/src/private/draftSessionBridge.ts +14 -13
  32. package/src/private/truefoundryDraftThreadListAdapter.test.ts +44 -49
  33. package/src/private/truefoundryDraftThreadListAdapter.ts +22 -16
  34. package/src/requiredActionInputs.ts +1 -1
  35. package/src/requiredActionsFromActiveUpdate.test.ts +1 -1
  36. package/src/server/eventUtils.ts +120 -0
  37. package/src/server/events.ts +246 -0
  38. package/src/server/index.ts +66 -0
  39. package/src/server/types.ts +313 -0
  40. package/src/sessionSnapshot.ts +1 -1
  41. package/src/sessions.ts +5 -21
  42. package/src/streamTurn.test.ts +172 -155
  43. package/src/streamTurn.ts +51 -48
  44. package/src/toolApproval.ts +4 -4
  45. package/src/toolResponse.ts +4 -4
  46. package/src/truefoundryExtras.ts +1 -1
  47. package/src/truefoundryOwnedSessionsThreadListAdapter.test.ts +26 -29
  48. package/src/truefoundryOwnedSessionsThreadListAdapter.ts +18 -23
  49. package/src/truefoundryThreadListAdapter.test.ts +16 -18
  50. package/src/truefoundryThreadListAdapter.ts +7 -7
  51. package/src/turnEventHelpers.ts +1 -1
  52. package/src/types.ts +2 -16
  53. package/src/useTrueFoundryAgentMessages.test.tsx +38 -70
  54. package/src/useTrueFoundryAgentMessages.ts +32 -44
  55. package/src/useTrueFoundryAgentRuntime.ts +11 -28
  56. package/src/private/bindDraftAgentSession.test.ts +0 -54
  57. package/src/private/bindDraftAgentSession.ts +0 -28
  58. package/src/private/getGatewayFromPrivateClient.ts +0 -13
@@ -0,0 +1,30 @@
1
+ import { AgentSessionClient } from 'truefoundry-gateway-sdk/agents';
2
+ import { PrivateAgentSessionClient } from 'truefoundry-gateway-sdk/agents/private';
3
+ import { a as AgentChatServer } from '../../types-VUBzoJT2.js';
4
+
5
+ type CreateTrueFoundryChatServerOptions = {
6
+ apiKey: string;
7
+ baseUrl: string;
8
+ /** Optional override — otherwise constructed from apiKey/baseUrl. */
9
+ client?: AgentSessionClient;
10
+ privateClient?: PrivateAgentSessionClient;
11
+ deleteSession?: (req: {
12
+ sessionId: string;
13
+ }) => Promise<void>;
14
+ };
15
+ type TrueFoundryChatServer = AgentChatServer & {
16
+ /** Escape hatch for hosts that still need raw gateway clients. */
17
+ getGatewayClients(): {
18
+ client: AgentSessionClient;
19
+ privateClient: PrivateAgentSessionClient;
20
+ };
21
+ };
22
+ /**
23
+ * Wraps TrueFoundry gateway clients into a flat `AgentChatServer`.
24
+ * Named vs draft routing is fully internal — an in-memory session-type cache
25
+ * (populated by createSession/listSessions) determines which gateway client
26
+ * to call. No try/catch fallback, no double network calls.
27
+ */
28
+ declare function createTrueFoundryChatServer(opts: CreateTrueFoundryChatServerOptions): TrueFoundryChatServer;
29
+
30
+ export { type CreateTrueFoundryChatServerOptions, type TrueFoundryChatServer, createTrueFoundryChatServer };
@@ -0,0 +1,198 @@
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
+ function isDraft(session) {
5
+ return session.type === "session/draft";
6
+ }
7
+ function toSession(raw) {
8
+ const mutable = isDraft(raw);
9
+ return {
10
+ id: raw.id,
11
+ title: raw.title,
12
+ agentName: raw.agentName,
13
+ ...mutable ? { agentSpec: raw.agentSpec } : {},
14
+ isMutable: mutable,
15
+ createdAt: raw.createdAt,
16
+ updatedAt: raw.updatedAt
17
+ };
18
+ }
19
+ function toTurn(raw) {
20
+ return {
21
+ id: raw.id,
22
+ sessionId: raw.sessionId,
23
+ previousTurnId: raw.previousTurnId,
24
+ input: raw.input,
25
+ state: raw.state,
26
+ createdAt: raw.createdAt
27
+ };
28
+ }
29
+ async function toListResult(page, map) {
30
+ const nextPageToken = page.response?.pagination?.nextPageToken;
31
+ return {
32
+ data: page.data.map(map),
33
+ ...nextPageToken != null && nextPageToken !== "" ? { nextPageToken } : {}
34
+ };
35
+ }
36
+ function createTrueFoundryChatServer(opts) {
37
+ const gatewayOpts = { apiKey: opts.apiKey, baseUrl: opts.baseUrl };
38
+ const client = opts.client ?? new AgentSessionClient(gatewayOpts);
39
+ const privateClient = opts.privateClient ?? new PrivateAgentSessionClient(gatewayOpts);
40
+ const sessionTypeCache = /* @__PURE__ */ new Map();
41
+ function cacheSessionType(session) {
42
+ sessionTypeCache.set(session.id, session.isMutable);
43
+ }
44
+ function getSessionObj(sessionId) {
45
+ const isMutable = sessionTypeCache.get(sessionId);
46
+ if (isMutable === true) {
47
+ return privateClient.getDraftSession({ draftSessionId: sessionId });
48
+ }
49
+ if (isMutable === false) {
50
+ return client.getSession({ sessionId });
51
+ }
52
+ throw new Error(
53
+ `Cannot resolve session "${sessionId}": session type not cached. Ensure createSession or listSessions was called first.`
54
+ );
55
+ }
56
+ const server = {
57
+ async createSession(req) {
58
+ if (req.agentSpec != null) {
59
+ const draft = await privateClient.createDraftSession({
60
+ agentSpec: req.agentSpec,
61
+ ...req.agentName != null ? { agentName: req.agentName } : {}
62
+ });
63
+ const session = toSession(draft);
64
+ cacheSessionType(session);
65
+ return session;
66
+ }
67
+ if (req.agentName != null) {
68
+ const named = await client.createSession({
69
+ agentName: req.agentName
70
+ });
71
+ const session = toSession(named);
72
+ cacheSessionType(session);
73
+ return session;
74
+ }
75
+ throw new Error("createSession requires agentName and/or agentSpec");
76
+ },
77
+ async listSessions(req) {
78
+ const page = await privateClient.listOwnedSessions({
79
+ limit: req?.limit,
80
+ order: req?.order,
81
+ pageToken: req?.pageToken,
82
+ startTimestamp: req?.startTimestamp,
83
+ ...req?.agentName != null ? { agentName: req.agentName } : {}
84
+ });
85
+ const result = await toListResult(page, toSession);
86
+ for (const session of result.data) {
87
+ cacheSessionType(session);
88
+ }
89
+ return result;
90
+ },
91
+ async getSession({ sessionId }) {
92
+ const raw = await getSessionObj(sessionId);
93
+ const session = toSession(raw);
94
+ cacheSessionType(session);
95
+ return session;
96
+ },
97
+ async updateSession(req) {
98
+ const raw = await getSessionObj(req.sessionId);
99
+ if (!isDraft(raw)) {
100
+ throw new Error(
101
+ "updateSession: session is not mutable (isMutable=false)"
102
+ );
103
+ }
104
+ if (req.agentSpec != null) {
105
+ await raw.update({ agentSpec: req.agentSpec });
106
+ }
107
+ return toSession(raw);
108
+ },
109
+ prepareAndExecuteTurn(req) {
110
+ return (async function* () {
111
+ const session = await getSessionObj(req.sessionId);
112
+ const prepared = session.prepareTurn({
113
+ input: req.input,
114
+ previousTurnId: req.previousTurnId ?? "auto"
115
+ });
116
+ yield* prepared.execute(
117
+ { stream: true },
118
+ {
119
+ ...req.abortSignal != null ? { abortSignal: req.abortSignal } : {},
120
+ ...req.headers != null ? { headers: req.headers } : {}
121
+ }
122
+ );
123
+ })();
124
+ },
125
+ async cancelSession({ sessionId }) {
126
+ await (await getSessionObj(sessionId)).cancel();
127
+ },
128
+ async deleteSession({ sessionId }) {
129
+ if (opts.deleteSession == null) {
130
+ throw new Error(
131
+ "deleteSession is not on the gateway SDK. Pass deleteSession to createTrueFoundryChatServer."
132
+ );
133
+ }
134
+ await opts.deleteSession({ sessionId });
135
+ },
136
+ async listTurns({ sessionId, limit, pageToken, order }) {
137
+ const raw = await getSessionObj(sessionId);
138
+ const page = await raw.listTurns({
139
+ ...limit != null ? { limit } : {},
140
+ ...pageToken != null ? { pageToken } : {},
141
+ ...order != null ? { order } : {}
142
+ });
143
+ return toListResult(page, (turn) => toTurn(turn));
144
+ },
145
+ async getTurn({ sessionId, turnId }) {
146
+ const raw = await getSessionObj(sessionId);
147
+ return toTurn(await raw.getTurn({ turnId }));
148
+ },
149
+ async listEvents({ sessionId, pageToken, lastTurnId, limit }) {
150
+ const raw = await getSessionObj(sessionId);
151
+ const page = await raw.listEvents({
152
+ ...limit != null ? { limit } : {},
153
+ ...pageToken != null ? { pageToken } : {},
154
+ ...lastTurnId != null ? { lastTurnId } : {}
155
+ });
156
+ return toListResult(
157
+ page,
158
+ (item) => item
159
+ );
160
+ },
161
+ async listTurnEvents({ sessionId, turnId, limit, pageToken, order }) {
162
+ const raw = await getSessionObj(sessionId);
163
+ const turn = await raw.getTurn({ turnId });
164
+ const page = await turn.listEvents({
165
+ ...limit != null ? { limit } : {},
166
+ ...pageToken != null ? { pageToken } : {},
167
+ ...order != null ? { order } : {}
168
+ });
169
+ return toListResult(page, (event) => event);
170
+ },
171
+ async *subscribeToTurn({
172
+ sessionId,
173
+ turnId,
174
+ afterSequenceNumber,
175
+ abortSignal
176
+ }) {
177
+ const raw = await getSessionObj(sessionId);
178
+ const turn = await raw.getTurn({ turnId });
179
+ yield* turn.stream(
180
+ afterSequenceNumber != null ? { afterSequenceNumber } : {},
181
+ abortSignal != null ? { abortSignal } : {}
182
+ );
183
+ },
184
+ async downloadSandboxFile(sandboxId, req) {
185
+ const response = await privateClient.downloadSandboxFile(
186
+ sandboxId,
187
+ req
188
+ );
189
+ return await response.blob();
190
+ },
191
+ getGatewayClients: () => ({ client, privateClient })
192
+ };
193
+ return server;
194
+ }
195
+ export {
196
+ createTrueFoundryChatServer
197
+ };
198
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/plugins/truefoundry-agent-server-adapter/index.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 AgentSpec,\n ListResult,\n Session,\n Turn,\n TurnInputItem,\n PreviousTurnIdInput,\n} from \"../../server/types.js\";\nimport type {\n TurnEvent,\n TurnStreamData,\n SessionEventItem,\n} from \"../../server/events.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\nexport type TrueFoundryChatServer = AgentChatServer & {\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(raw: GwSession): Session {\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 AgentSpec } : {}),\n isMutable: mutable,\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: Turn[\"state\"];\n createdAt: string;\n}): Turn {\n return {\n id: raw.id,\n sessionId: raw.sessionId,\n previousTurnId: raw.previousTurnId,\n input: raw.input as TurnInputItem[] | undefined,\n state: raw.state as Turn[\"state\"],\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 opts: CreateTrueFoundryChatServerOptions,\n): TrueFoundryChatServer {\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: Session): 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 = {\n async createSession(req) {\n if (req.agentSpec != null) {\n const draft = await privateClient.createDraftSession({\n agentSpec: req.agentSpec as never,\n ...(req.agentName != null ? { agentName: req.agentName } : {}),\n });\n const session = toSession(draft);\n cacheSessionType(session);\n return session;\n }\n if (req.agentName != null) {\n const named = await client.createSession({\n agentName: req.agentName,\n });\n const session = toSession(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 ...(req?.agentName != null ? { agentName: req.agentName } : {}),\n });\n const result = await toListResult(page, toSession);\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(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 as never });\n }\n return toSession(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 async listTurns({ sessionId, limit, pageToken, order }) {\n const raw = await getSessionObj(sessionId);\n const page = await raw.listTurns({\n ...(limit != null ? { limit } : {}),\n ...(pageToken != null ? { pageToken } : {}),\n ...(order != null ? { order } : {}),\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"],"mappings":"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","names":[]}