@truefoundry/assistant-ui-runtime 0.1.6-rc.0 → 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.
- package/README.md +192 -579
- package/dist/chunk-3A2EPLQG.js +93 -0
- package/dist/chunk-3A2EPLQG.js.map +1 -0
- package/dist/chunk-Q2SHKMLM.js +270 -0
- package/dist/chunk-Q2SHKMLM.js.map +1 -0
- package/dist/index.d.ts +8 -16
- package/dist/index.js +21 -88
- package/dist/index.js.map +1 -1
- package/dist/plugins/truefoundry-agent-server-adapter/index.d.ts +136 -4
- package/dist/plugins/truefoundry-agent-server-adapter/index.js +16 -195
- package/dist/plugins/truefoundry-agent-server-adapter/index.js.map +1 -1
- package/dist/server/index.d.ts +17 -0
- package/dist/server/index.js +9 -0
- package/dist/server/index.js.map +1 -0
- package/dist/{types-VUBzoJT2.d.ts → types-BfiFf8O1.d.ts} +17 -11
- package/package.json +10 -5
- package/src/index.ts +41 -0
- package/src/plugins/truefoundry-agent-server-adapter/README.md +178 -0
- package/src/plugins/truefoundry-agent-server-adapter/guards.test.ts +113 -0
- package/src/plugins/truefoundry-agent-server-adapter/guards.ts +130 -0
- package/src/plugins/truefoundry-agent-server-adapter/index.ts +103 -29
- package/src/plugins/truefoundry-agent-server-adapter/types.ts +135 -0
- package/src/plugins/truefoundry-agent-server-adapter/types.typecheck.ts +164 -0
- package/src/server/types.ts +16 -10
|
@@ -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,8 +1,13 @@
|
|
|
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 { A as AgentSpec,
|
|
4
|
-
export {
|
|
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';
|
|
5
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';
|
|
6
11
|
|
|
7
12
|
/** @deprecated Use Session with isMutable: true instead. Kept for title helper. */
|
|
8
13
|
type DraftSession = {
|
|
@@ -58,19 +63,6 @@ type UseTrueFoundryAgentRuntimeOptions = TrueFoundryAgentRuntimeBaseOptions & {
|
|
|
58
63
|
|
|
59
64
|
declare function useTrueFoundryAgentRuntime(options: UseTrueFoundryAgentRuntimeOptions): _assistant_ui_core.AssistantRuntime;
|
|
60
65
|
|
|
61
|
-
/**
|
|
62
|
-
* Local implementations of streaming delta helpers.
|
|
63
|
-
* Formerly imported from truefoundry-gateway-sdk/agents.
|
|
64
|
-
*/
|
|
65
|
-
|
|
66
|
-
/** True for `.delta` streaming events. */
|
|
67
|
-
declare function isEventDelta(event: TurnStreamingEvent): event is DeltaEvents;
|
|
68
|
-
/**
|
|
69
|
-
* Merge `delta` into `base` in place (same `id` required).
|
|
70
|
-
* Currently handles `model.message.delta` → `model.message`.
|
|
71
|
-
*/
|
|
72
|
-
declare function mergeEventDelta(base: TurnEvent, delta: DeltaEvents): void;
|
|
73
|
-
|
|
74
66
|
type AssistantContentPart = ThreadAssistantMessagePart;
|
|
75
67
|
|
|
76
68
|
/** Gateway root thread id — always the literal `"main"`. */
|
|
@@ -325,4 +317,4 @@ declare function getSession(server: AgentChatServer, sessionId: string): Promise
|
|
|
325
317
|
*/
|
|
326
318
|
declare const trueFoundryAttachmentAdapter: AttachmentAdapter;
|
|
327
319
|
|
|
328
|
-
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,
|
|
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 };
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isEventDelta,
|
|
3
|
+
mergeEventDelta
|
|
4
|
+
} from "./chunk-3A2EPLQG.js";
|
|
5
|
+
import {
|
|
6
|
+
createTrueFoundryChatServer,
|
|
7
|
+
getTfyMcpInitServers,
|
|
8
|
+
getTfyThreadState,
|
|
9
|
+
getTfyUsage,
|
|
10
|
+
isTfyMcpToolInfo,
|
|
11
|
+
isTfySystemToolInfo,
|
|
12
|
+
isTfyToolInfo
|
|
13
|
+
} from "./chunk-Q2SHKMLM.js";
|
|
14
|
+
|
|
1
15
|
// src/useTrueFoundryAgentRuntime.ts
|
|
2
16
|
import {
|
|
3
17
|
pickExternalStoreSharedOptions
|
|
@@ -251,94 +265,6 @@ function toTrueFoundryApprovalInputs(message, response, defaultThreadId = ROOT_T
|
|
|
251
265
|
return collectApprovalInputs(updated, defaultThreadId);
|
|
252
266
|
}
|
|
253
267
|
|
|
254
|
-
// src/server/eventUtils.ts
|
|
255
|
-
function isEventDelta(event) {
|
|
256
|
-
return typeof event.type === "string" && event.type.endsWith(".delta");
|
|
257
|
-
}
|
|
258
|
-
function mergeEventDelta(base, delta) {
|
|
259
|
-
if (base.id !== delta.id) {
|
|
260
|
-
throw new Error(
|
|
261
|
-
`Cannot merge delta into a different event: base id "${base.id}" != delta id "${delta.id}".`
|
|
262
|
-
);
|
|
263
|
-
}
|
|
264
|
-
if (delta.type === "model.message.delta" && base.type === "model.message") {
|
|
265
|
-
mergeModelMessageDelta(base, delta);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
function asToolInfo(value) {
|
|
269
|
-
if (value == null || typeof value !== "object") {
|
|
270
|
-
return void 0;
|
|
271
|
-
}
|
|
272
|
-
return value;
|
|
273
|
-
}
|
|
274
|
-
function mergeModelMessageDelta(base, delta) {
|
|
275
|
-
if (delta.content) {
|
|
276
|
-
if (base.content === void 0 || base.content === null || typeof base.content === "string") {
|
|
277
|
-
base.content = (base.content ?? "") + delta.content;
|
|
278
|
-
} else {
|
|
279
|
-
const last = base.content[base.content.length - 1];
|
|
280
|
-
if (last && last.type === "text") {
|
|
281
|
-
last.text += delta.content;
|
|
282
|
-
} else {
|
|
283
|
-
base.content.push({ type: "text", text: delta.content });
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
if (delta.refusal) {
|
|
288
|
-
base.refusal = (base.refusal ?? "") + delta.refusal;
|
|
289
|
-
}
|
|
290
|
-
if (delta.toolCalls) {
|
|
291
|
-
base.toolCalls ??= [];
|
|
292
|
-
for (const d of delta.toolCalls) {
|
|
293
|
-
let tc = base.toolCalls[d.index];
|
|
294
|
-
if (tc === void 0) {
|
|
295
|
-
const toolInfo2 = asToolInfo(d.toolInfo);
|
|
296
|
-
tc = {
|
|
297
|
-
id: d.id ?? "",
|
|
298
|
-
type: d.type ?? "function",
|
|
299
|
-
function: {
|
|
300
|
-
name: d.function?.name ?? "",
|
|
301
|
-
arguments: ""
|
|
302
|
-
},
|
|
303
|
-
...toolInfo2 != null ? { toolInfo: toolInfo2 } : {}
|
|
304
|
-
};
|
|
305
|
-
base.toolCalls[d.index] = tc;
|
|
306
|
-
}
|
|
307
|
-
if (d.id) {
|
|
308
|
-
tc.id = d.id;
|
|
309
|
-
}
|
|
310
|
-
if (d.type) {
|
|
311
|
-
tc.type = d.type;
|
|
312
|
-
}
|
|
313
|
-
if (d.function?.name) {
|
|
314
|
-
tc.function.name = d.function.name;
|
|
315
|
-
}
|
|
316
|
-
if (d.function?.arguments) {
|
|
317
|
-
tc.function.arguments += d.function.arguments;
|
|
318
|
-
}
|
|
319
|
-
const toolInfo = asToolInfo(d.toolInfo);
|
|
320
|
-
if (toolInfo != null) {
|
|
321
|
-
tc.toolInfo = toolInfo;
|
|
322
|
-
}
|
|
323
|
-
if (d.providerSpecificFields) {
|
|
324
|
-
tc.providerSpecificFields = {
|
|
325
|
-
...tc.providerSpecificFields ?? {},
|
|
326
|
-
...d.providerSpecificFields
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
if (delta.finishReason) {
|
|
332
|
-
base.finishReason = delta.finishReason;
|
|
333
|
-
}
|
|
334
|
-
if (delta.reasoningContent) {
|
|
335
|
-
base.reasoningContent = (base.reasoningContent ?? "") + delta.reasoningContent;
|
|
336
|
-
}
|
|
337
|
-
if (delta.usage) {
|
|
338
|
-
base.usage = delta.usage;
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
|
|
342
268
|
// src/askUserQuestion.ts
|
|
343
269
|
function parseAskUserQuestionArgs(argsText) {
|
|
344
270
|
if (!argsText) {
|
|
@@ -4123,14 +4049,21 @@ export {
|
|
|
4123
4049
|
collectResponseInputs,
|
|
4124
4050
|
convertTurnsToThreadMessages,
|
|
4125
4051
|
createDraftSessionBridge,
|
|
4052
|
+
createTrueFoundryChatServer,
|
|
4126
4053
|
createTrueFoundryDraftThreadListAdapter,
|
|
4127
4054
|
createTrueFoundryOwnedSessionsThreadListAdapter,
|
|
4128
4055
|
createTrueFoundryThreadListAdapter,
|
|
4129
4056
|
draftSessionTitle,
|
|
4130
4057
|
findPausedAssistantMessage,
|
|
4131
4058
|
getSession,
|
|
4059
|
+
getTfyMcpInitServers,
|
|
4060
|
+
getTfyThreadState,
|
|
4061
|
+
getTfyUsage,
|
|
4132
4062
|
getTurnMessageContent,
|
|
4133
4063
|
isEventDelta,
|
|
4064
|
+
isTfyMcpToolInfo,
|
|
4065
|
+
isTfySystemToolInfo,
|
|
4066
|
+
isTfyToolInfo,
|
|
4134
4067
|
mergeAgentSpec,
|
|
4135
4068
|
mergeEventDelta,
|
|
4136
4069
|
messageHasPendingApprovals,
|