@truefoundry/assistant-ui-runtime 0.1.16 → 0.1.18
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/CHANGELOG.md +13 -0
- package/README.md +4 -2
- package/dist/{chunk-S4SH2KT2.js → chunk-N6LJ3LR2.js} +160 -21
- package/dist/chunk-N6LJ3LR2.js.map +1 -0
- package/dist/index.d.ts +26 -5
- package/dist/index.js +147 -58
- package/dist/index.js.map +1 -1
- package/dist/plugins/truefoundry-agent-server-adapter/index.d.ts +6 -2
- package/dist/plugins/truefoundry-agent-server-adapter/index.js +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/{types-VU3Fc17W.d.ts → types-BRrQpoVy.d.ts} +62 -54
- package/package.json +2 -2
- package/src/hooks.ts +19 -19
- package/src/index.ts +7 -1
- package/src/plugins/truefoundry-agent-server-adapter/README.md +1 -1
- package/src/plugins/truefoundry-agent-server-adapter/cp.test.ts +3 -3
- package/src/plugins/truefoundry-agent-server-adapter/cp.ts +51 -10
- package/src/plugins/truefoundry-agent-server-adapter/modelReasoningEffort.test.ts +171 -0
- package/src/plugins/truefoundry-agent-server-adapter/modelReasoningEffort.ts +145 -0
- package/src/plugins/truefoundry-agent-server-adapter/normalizeAgentSpec.test.ts +85 -4
- package/src/plugins/truefoundry-agent-server-adapter/normalizeAgentSpec.ts +67 -17
- package/src/server/index.ts +2 -0
- package/src/server/types.ts +117 -90
- package/src/truefoundryExtras.test.ts +161 -0
- package/src/truefoundryExtras.ts +136 -1
- package/dist/chunk-S4SH2KT2.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.18
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- **`getModels` reasoning efforts** — `listEnabledModels` also fetches `/api/svc/v1/provider-accounts/providers` and sets `properties.reasoningEfforts` for thinking-capable models (same visibility rules as ai.tf: skip exact `openai` slug, require `thinking: true`, honor `removeParams`).
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **Extras ancestor walk vs RootAssistantClient** — `tryGetTrueFoundryExtras` / `useTrueFoundryRuntimeExtras` try/catch Proxy gets when walking `Object.create(parent)` AUI clients, so hitting the store’s RootAssistantClient prototype no longer throws `The current scope does not have a "subscribe" property`. `trueFoundryExtras.get` / `.use` use the same walk (no nested-UI footgun).
|
|
12
|
+
- **`getModels` latency** — enabled-models and provider-metadata CP fetches run in parallel; providers soft-fails without blocking the model list.
|
|
13
|
+
- **Model selector `name` is model_fqn** — `normalizeEnabledModels` sets `ModelSelectorEntry.name` (and `id`) to `model_fqn`, so trueforge-ui’s DraftModelSelector writes `AgentSpec.model.name` as `account/model-id` instead of the short CP display label.
|
|
14
|
+
- **Gateway mount sanitization** — `normalizeMcpMount` / `normalizeSkillMount` rebuild allowlisted registry/git/inline shapes instead of blind-passthrough, so FE `id` / display `name` / registry `url` never leak onto draft create/update. Registry MCP mounts default `enableTools` to `["@all"]` when missing (narrow lists still preserved).
|
|
15
|
+
|
|
3
16
|
## 0.1.12
|
|
4
17
|
|
|
5
18
|
### Breaking
|
package/README.md
CHANGED
|
@@ -163,7 +163,7 @@ const runtime = useTrueFoundryAgentRuntime({
|
|
|
163
163
|
|
|
164
164
|
## Runtime extras
|
|
165
165
|
|
|
166
|
-
Typed escape hatch for adapter-specific state and actions (same pattern as `@assistant-ui/react-google-adk`). Use selector hooks for thread-level UI; use action hooks / `trueFoundryExtras.get(aui)` inside nested sub-agent renderers.
|
|
166
|
+
Typed escape hatch for adapter-specific state and actions (same pattern as `@assistant-ui/react-google-adk`). Use selector hooks for thread-level UI; use action hooks / `trueFoundryExtras.get(aui)` / `getTrueFoundryExtras(aui)` inside nested sub-agent renderers (`PartPrimitive.Messages` is readonly and shadows `thread.extras` — get/use and the convenience hooks walk the parent AUI chain so approvals / ask-user still hit the root runtime).
|
|
167
167
|
|
|
168
168
|
### Approvals, ask-user, MCP auth
|
|
169
169
|
|
|
@@ -197,10 +197,12 @@ const { pending: mcp, resume } = useTrueFoundryMcpAuth();
|
|
|
197
197
|
### Low-level namespace
|
|
198
198
|
|
|
199
199
|
```tsx
|
|
200
|
-
import { trueFoundryExtras } from "@truefoundry/assistant-ui-runtime";
|
|
200
|
+
import { trueFoundryExtras, getTrueFoundryExtras } from "@truefoundry/assistant-ui-runtime";
|
|
201
201
|
|
|
202
|
+
// get/use walk Object.create(parent) AUI clients — safe inside nested sub-agent UI.
|
|
202
203
|
const extras = trueFoundryExtras.use();
|
|
203
204
|
const pending = trueFoundryExtras.use((e) => e.pendingApprovals, []);
|
|
205
|
+
const rootExtras = getTrueFoundryExtras(aui); // same walk as trueFoundryExtras.get
|
|
204
206
|
```
|
|
205
207
|
|
|
206
208
|
---
|
|
@@ -6,14 +6,43 @@ import { PrivateAgentSessionClient } from "truefoundry-gateway-sdk/agents/privat
|
|
|
6
6
|
function isRecord(value) {
|
|
7
7
|
return value != null && typeof value === "object" && !Array.isArray(value);
|
|
8
8
|
}
|
|
9
|
+
function nonEmptyString(value) {
|
|
10
|
+
return typeof value === "string" && value !== "" ? value : null;
|
|
11
|
+
}
|
|
12
|
+
function mcpOptionalFields(raw) {
|
|
13
|
+
return {
|
|
14
|
+
...Array.isArray(raw.enableTools) ? { enableTools: raw.enableTools } : {},
|
|
15
|
+
...Array.isArray(raw.disableTools) ? { disableTools: raw.disableTools } : {},
|
|
16
|
+
...Array.isArray(raw.preloadTools) ? { preloadTools: raw.preloadTools } : {},
|
|
17
|
+
...Array.isArray(raw.requireApprovalForTools) ? { requireApprovalForTools: raw.requireApprovalForTools } : {},
|
|
18
|
+
...typeof raw.preload === "boolean" ? { preload: raw.preload } : {},
|
|
19
|
+
...raw.config != null ? { config: raw.config } : {}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function skillOptionalFields(raw) {
|
|
23
|
+
return {
|
|
24
|
+
...typeof raw.preload === "boolean" ? { preload: raw.preload } : {},
|
|
25
|
+
...raw.config != null ? { config: raw.config } : {}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
9
28
|
function normalizeMcpMount(raw) {
|
|
10
29
|
if (!isRecord(raw)) {
|
|
11
30
|
throw new Error("mcpServers entry must be an object");
|
|
12
31
|
}
|
|
13
|
-
if (raw.type === "
|
|
14
|
-
|
|
32
|
+
if (raw.type === "inline") {
|
|
33
|
+
const name2 = nonEmptyString(raw.name);
|
|
34
|
+
const url = nonEmptyString(raw.url);
|
|
35
|
+
if (name2 == null || url == null) {
|
|
36
|
+
throw new Error("inline mcpServers entry needs name and url");
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
type: "inline",
|
|
40
|
+
name: name2,
|
|
41
|
+
url,
|
|
42
|
+
...mcpOptionalFields(raw)
|
|
43
|
+
};
|
|
15
44
|
}
|
|
16
|
-
const name = (
|
|
45
|
+
const name = nonEmptyString(raw.name) ?? nonEmptyString(raw.mcpName) ?? nonEmptyString(raw.id);
|
|
17
46
|
if (name == null) {
|
|
18
47
|
throw new Error(
|
|
19
48
|
"mcpServers entry needs name, mcpName, or id to mount as registry MCP"
|
|
@@ -22,19 +51,32 @@ function normalizeMcpMount(raw) {
|
|
|
22
51
|
return {
|
|
23
52
|
type: "truefoundry-mcp-registry",
|
|
24
53
|
name,
|
|
25
|
-
...
|
|
26
|
-
|
|
27
|
-
|
|
54
|
+
...mcpOptionalFields(raw),
|
|
55
|
+
// Always set after the spread so missing enableTools defaults to [@all].
|
|
56
|
+
enableTools: Array.isArray(raw.enableTools) ? raw.enableTools : ["@all"]
|
|
28
57
|
};
|
|
29
58
|
}
|
|
30
59
|
function normalizeSkillMount(raw) {
|
|
31
60
|
if (!isRecord(raw)) {
|
|
32
61
|
throw new Error("skills entry must be an object");
|
|
33
62
|
}
|
|
34
|
-
if (raw.type === "
|
|
35
|
-
|
|
63
|
+
if (raw.type === "git") {
|
|
64
|
+
const url = nonEmptyString(raw.url);
|
|
65
|
+
const name = nonEmptyString(raw.name);
|
|
66
|
+
const ref = nonEmptyString(raw.ref);
|
|
67
|
+
if (url == null || name == null || ref == null) {
|
|
68
|
+
throw new Error("git skills entry needs url, name, and ref");
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
type: "git",
|
|
72
|
+
url,
|
|
73
|
+
name,
|
|
74
|
+
ref,
|
|
75
|
+
...nonEmptyString(raw.path) != null ? { path: raw.path } : {},
|
|
76
|
+
...skillOptionalFields(raw)
|
|
77
|
+
};
|
|
36
78
|
}
|
|
37
|
-
const fqn = (
|
|
79
|
+
const fqn = nonEmptyString(raw.fqn) ?? nonEmptyString(raw.id);
|
|
38
80
|
if (fqn == null) {
|
|
39
81
|
throw new Error(
|
|
40
82
|
"skills entry needs fqn or id to mount as registry skill"
|
|
@@ -43,8 +85,7 @@ function normalizeSkillMount(raw) {
|
|
|
43
85
|
return {
|
|
44
86
|
type: "truefoundry-skills-registry",
|
|
45
87
|
fqn,
|
|
46
|
-
...
|
|
47
|
-
...raw.config != null ? { config: raw.config } : {}
|
|
88
|
+
...skillOptionalFields(raw)
|
|
48
89
|
};
|
|
49
90
|
}
|
|
50
91
|
function normalizeAgentSpecForGateway(spec) {
|
|
@@ -287,6 +328,84 @@ function createTrueFoundryChatServer(opts) {
|
|
|
287
328
|
return server;
|
|
288
329
|
}
|
|
289
330
|
|
|
331
|
+
// src/plugins/truefoundry-agent-server-adapter/modelReasoningEffort.ts
|
|
332
|
+
var DEFAULT_EFFORT_LEVELS = [
|
|
333
|
+
"minimal",
|
|
334
|
+
"low",
|
|
335
|
+
"medium",
|
|
336
|
+
"high"
|
|
337
|
+
];
|
|
338
|
+
var EFFORT_SET = /* @__PURE__ */ new Set([
|
|
339
|
+
"minimal",
|
|
340
|
+
"low",
|
|
341
|
+
"medium",
|
|
342
|
+
"high",
|
|
343
|
+
"xhigh",
|
|
344
|
+
"max"
|
|
345
|
+
]);
|
|
346
|
+
function metadataKey(providerSlug, modelId) {
|
|
347
|
+
return `${providerSlug}/${modelId}`;
|
|
348
|
+
}
|
|
349
|
+
function providerSlugFromType(type) {
|
|
350
|
+
if (type == null) return null;
|
|
351
|
+
const prefix = "provider-account/";
|
|
352
|
+
if (!type.startsWith(prefix)) return null;
|
|
353
|
+
const slug = type.slice(prefix.length).trim();
|
|
354
|
+
return slug.length > 0 ? slug : null;
|
|
355
|
+
}
|
|
356
|
+
function findReasoningEffortParam(meta) {
|
|
357
|
+
const fromModel = meta?.params?.find((p) => p.key === "reasoning_effort");
|
|
358
|
+
if (fromModel != null) return fromModel;
|
|
359
|
+
return meta?.defaultProviderParams?.params?.find(
|
|
360
|
+
(p) => p.key === "reasoning_effort"
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
function showsReasoningEffort(meta, providerSlug) {
|
|
364
|
+
if (providerSlug === "openai") return false;
|
|
365
|
+
if (meta == null) return false;
|
|
366
|
+
if (meta.thinking !== true) return false;
|
|
367
|
+
if (meta.removeParams?.includes("reasoning_effort")) return false;
|
|
368
|
+
return true;
|
|
369
|
+
}
|
|
370
|
+
function getEffortOptions(meta) {
|
|
371
|
+
const param = findReasoningEffortParam(meta);
|
|
372
|
+
const raw = param?.supportedValues ?? param?.options;
|
|
373
|
+
if (raw == null || raw.length === 0) return [...DEFAULT_EFFORT_LEVELS];
|
|
374
|
+
const filtered = raw.filter((v) => EFFORT_SET.has(v));
|
|
375
|
+
return filtered.length > 0 ? filtered : [...DEFAULT_EFFORT_LEVELS];
|
|
376
|
+
}
|
|
377
|
+
function reasoningEffortsForModel(meta, providerSlug) {
|
|
378
|
+
if (!showsReasoningEffort(meta, providerSlug)) return void 0;
|
|
379
|
+
return getEffortOptions(meta);
|
|
380
|
+
}
|
|
381
|
+
function providersFromJson(json) {
|
|
382
|
+
if (Array.isArray(json)) return json;
|
|
383
|
+
if (json != null && typeof json === "object") {
|
|
384
|
+
const obj = json;
|
|
385
|
+
for (const key of ["data", "providers", "result"]) {
|
|
386
|
+
const value = obj[key];
|
|
387
|
+
if (Array.isArray(value)) return value;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return [];
|
|
391
|
+
}
|
|
392
|
+
function buildMetadataMap(raw) {
|
|
393
|
+
const map = /* @__PURE__ */ new Map();
|
|
394
|
+
for (const provider of providersFromJson(raw)) {
|
|
395
|
+
const slug = providerSlugFromType(provider.type);
|
|
396
|
+
if (slug == null) continue;
|
|
397
|
+
for (const integration of provider.integrations ?? []) {
|
|
398
|
+
const metadata = integration.metadata;
|
|
399
|
+
if (metadata == null) continue;
|
|
400
|
+
for (const [modelId, meta] of Object.entries(metadata)) {
|
|
401
|
+
if (!modelId.trim()) continue;
|
|
402
|
+
map.set(metadataKey(slug, modelId), meta);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return map;
|
|
407
|
+
}
|
|
408
|
+
|
|
290
409
|
// src/plugins/truefoundry-agent-server-adapter/cp.ts
|
|
291
410
|
function trimSlash(url) {
|
|
292
411
|
return url.replace(/\/+$/, "");
|
|
@@ -333,14 +452,13 @@ function isChatModel(row) {
|
|
|
333
452
|
function toModelEntry(row) {
|
|
334
453
|
if (!isChatModel(row)) return null;
|
|
335
454
|
const apiModel = row.model_fqn ?? row.id;
|
|
336
|
-
|
|
337
|
-
if (apiModel == null || apiModel === "" || name == null || name === "") {
|
|
455
|
+
if (apiModel == null || apiModel === "") {
|
|
338
456
|
return null;
|
|
339
457
|
}
|
|
340
|
-
const modelId = row.model_id ?? name;
|
|
458
|
+
const modelId = row.model_id ?? row.name ?? apiModel;
|
|
341
459
|
return {
|
|
342
460
|
id: apiModel,
|
|
343
|
-
name,
|
|
461
|
+
name: apiModel,
|
|
344
462
|
provider: { name: row.provider ?? "unknown" },
|
|
345
463
|
properties: {},
|
|
346
464
|
apiModel,
|
|
@@ -381,12 +499,33 @@ function normalizeEnabledModels(raw) {
|
|
|
381
499
|
}
|
|
382
500
|
return out;
|
|
383
501
|
}
|
|
502
|
+
function enrichModelsWithReasoningEfforts(models, providerMetadataRaw) {
|
|
503
|
+
const map = buildMetadataMap(providerMetadataRaw);
|
|
504
|
+
if (map.size === 0) return models;
|
|
505
|
+
return models.map((model) => {
|
|
506
|
+
const meta = map.get(metadataKey(model.provider.name, model.modelId));
|
|
507
|
+
const reasoningEfforts = reasoningEffortsForModel(
|
|
508
|
+
meta,
|
|
509
|
+
model.provider.name
|
|
510
|
+
);
|
|
511
|
+
if (reasoningEfforts == null) return model;
|
|
512
|
+
return {
|
|
513
|
+
...model,
|
|
514
|
+
properties: { ...model.properties, reasoningEfforts }
|
|
515
|
+
};
|
|
516
|
+
});
|
|
517
|
+
}
|
|
384
518
|
async function listEnabledModels(opts) {
|
|
385
|
-
const raw = await
|
|
386
|
-
opts,
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
519
|
+
const [raw, providers] = await Promise.all([
|
|
520
|
+
cpFetch(opts, "/api/svc/v1/llm-gateway/model/enabled"),
|
|
521
|
+
cpFetch(
|
|
522
|
+
opts,
|
|
523
|
+
"/api/svc/v1/provider-accounts/providers"
|
|
524
|
+
).catch(() => null)
|
|
525
|
+
]);
|
|
526
|
+
const models = normalizeEnabledModels(raw);
|
|
527
|
+
if (providers == null) return models;
|
|
528
|
+
return enrichModelsWithReasoningEfforts(models, providers);
|
|
390
529
|
}
|
|
391
530
|
function normalizeAgentSkills(raw) {
|
|
392
531
|
const data = raw != null && typeof raw === "object" && Array.isArray(raw.data) ? raw.data : [];
|
|
@@ -722,4 +861,4 @@ export {
|
|
|
722
861
|
getTfyThreadState,
|
|
723
862
|
getTfyMcpInitServers
|
|
724
863
|
};
|
|
725
|
-
//# sourceMappingURL=chunk-
|
|
864
|
+
//# sourceMappingURL=chunk-N6LJ3LR2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/plugins/truefoundry-agent-server-adapter/chatServer.ts","../src/plugins/truefoundry-agent-server-adapter/normalizeAgentSpec.ts","../src/plugins/truefoundry-agent-server-adapter/modelReasoningEffort.ts","../src/plugins/truefoundry-agent-server-adapter/cp.ts","../src/plugins/truefoundry-agent-server-adapter/createTrueFoundryAgentUIServer.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 { normalizeAgentSpecForGateway } from \"./normalizeAgentSpec.js\";\nimport type {\n TfyAgentSpec,\n TfyCreateSessionRequest,\n TfyListSessionsParams,\n TfySession,\n TfyTurn,\n TfyTurnState,\n} from \"./types.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\n/** Gateway SDK errors carry the HTTP status as `statusCode`. */\nfunction isNotFound(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n (error as { statusCode?: unknown }).statusCode === 404\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, falling back to a one-time probe for ids seen only in a URL.\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 const sessionTypeProbes = new Map<string, Promise<boolean>>();\n\n function cacheSessionType(session: {\n id: string;\n isMutable: boolean;\n }): void {\n sessionTypeCache.set(session.id, session.isMutable);\n }\n\n /**\n * Resolving a session id straight from a URL (page reload / shared link)\n * reaches the gateway before createSession or listSessions has cached the\n * type, so discover it by probing the draft endpoint and falling back to\n * the conversation endpoint. Concurrent callers share one probe.\n */\n async function probeSessionType(sessionId: string): Promise<boolean> {\n const inflight = sessionTypeProbes.get(sessionId);\n if (inflight != null) {\n return inflight;\n }\n const probe = (async () => {\n try {\n await privateClient.getDraftSession({ draftSessionId: sessionId });\n return true;\n } catch (error) {\n // Only a miss proves the id isn't a draft. Auth or transient\n // failures would otherwise be retried as a conversation session\n // and mislabel a real draft as named.\n if (!isNotFound(error)) {\n throw error;\n }\n await client.getSession({ sessionId });\n return false;\n }\n })();\n sessionTypeProbes.set(sessionId, probe);\n try {\n const isMutable = await probe;\n sessionTypeCache.set(sessionId, isMutable);\n return isMutable;\n } finally {\n sessionTypeProbes.delete(sessionId);\n }\n }\n\n async function getSessionObj(sessionId: string): Promise<GwSession> {\n const isMutable =\n sessionTypeCache.get(sessionId) ?? (await probeSessionType(sessionId));\n return isMutable\n ? privateClient.getDraftSession({ draftSessionId: sessionId })\n : client.getSession({ sessionId });\n }\n\n const server: TrueFoundryChatServer<TSpec> = {\n async createSession(req) {\n if (req.agentSpec != null) {\n const draft = await privateClient.createDraftSession({\n agentSpec: normalizeAgentSpecForGateway(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?.agentId != null ? { agentName: req.agentId } : {}),\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({\n agentSpec: normalizeAgentSpecForGateway(req.agentSpec),\n });\n }\n return toSession<TSpec>(raw);\n },\n\n createTurn(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 // The gateway addresses sandboxes directly, so the turn is carried for hosts that need it\n // but is not part of this route.\n async downloadSandboxFile({ sandboxId, path }) {\n const response = await privateClient.downloadSandboxFile(sandboxId, {\n path,\n });\n return await response.blob();\n },\n\n getGatewayClients: () => ({ client, privateClient }),\n };\n\n return server;\n}\n","import type { TruefoundryGatewayApi } from \"truefoundry-gateway-sdk\";\n\nimport type { TfyAgentSpec } from \"./types.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): string | null {\n return typeof value === \"string\" && value !== \"\" ? value : null;\n}\n\n/** Optional BaseMcpServer fields shared by registry + inline mounts. */\nfunction mcpOptionalFields(raw: Record<string, unknown>): Record<string, unknown> {\n return {\n ...(Array.isArray(raw.enableTools) ? { enableTools: raw.enableTools } : {}),\n ...(Array.isArray(raw.disableTools) ? { disableTools: raw.disableTools } : {}),\n ...(Array.isArray(raw.preloadTools) ? { preloadTools: raw.preloadTools } : {}),\n ...(Array.isArray(raw.requireApprovalForTools)\n ? { requireApprovalForTools: raw.requireApprovalForTools }\n : {}),\n ...(typeof raw.preload === \"boolean\" ? { preload: raw.preload } : {}),\n ...(raw.config != null ? { config: raw.config } : {}),\n };\n}\n\nfunction skillOptionalFields(raw: Record<string, unknown>): Record<string, unknown> {\n return {\n ...(typeof raw.preload === \"boolean\" ? { preload: raw.preload } : {}),\n ...(raw.config != null ? { config: raw.config } : {}),\n };\n}\n\n/**\n * agent-ui-sdk DraftCompositeSelector writes catalog rows as `{ id, name }`.\n * Gateway AgentSpec mounts need discriminated registry shapes — without\n * `type` (and skill `fqn`), Fern serialization throws JsonError before PATCH.\n *\n * Our CP catalog sets skill `id` = version fqn and MCP `id` = server name.\n * Always rebuild allowlisted fields so FE `id` / display `name` / registry\n * `url` never leak onto the wire.\n */\nexport function normalizeMcpMount(\n raw: unknown,\n): TruefoundryGatewayApi.McpServer {\n if (!isRecord(raw)) {\n throw new Error(\"mcpServers entry must be an object\");\n }\n\n if (raw.type === \"inline\") {\n const name = nonEmptyString(raw.name);\n const url = nonEmptyString(raw.url);\n if (name == null || url == null) {\n throw new Error(\"inline mcpServers entry needs name and url\");\n }\n return {\n type: \"inline\",\n name,\n url,\n ...mcpOptionalFields(raw),\n } as unknown as TruefoundryGatewayApi.McpServer;\n }\n\n const name =\n nonEmptyString(raw.name) ??\n nonEmptyString(raw.mcpName) ??\n nonEmptyString(raw.id);\n if (name == null) {\n throw new Error(\n \"mcpServers entry needs name, mcpName, or id to mount as registry MCP\",\n );\n }\n\n return {\n type: \"truefoundry-mcp-registry\",\n name,\n ...mcpOptionalFields(raw),\n // Always set after the spread so missing enableTools defaults to [@all].\n enableTools: Array.isArray(raw.enableTools) ? raw.enableTools : [\"@all\"],\n } as unknown as TruefoundryGatewayApi.McpServer;\n}\n\nexport function normalizeSkillMount(\n raw: unknown,\n): TruefoundryGatewayApi.SkillMount {\n if (!isRecord(raw)) {\n throw new Error(\"skills entry must be an object\");\n }\n\n if (raw.type === \"git\") {\n const url = nonEmptyString(raw.url);\n const name = nonEmptyString(raw.name);\n const ref = nonEmptyString(raw.ref);\n if (url == null || name == null || ref == null) {\n throw new Error(\"git skills entry needs url, name, and ref\");\n }\n return {\n type: \"git\",\n url,\n name,\n ref,\n ...(nonEmptyString(raw.path) != null ? { path: raw.path } : {}),\n ...skillOptionalFields(raw),\n } as unknown as TruefoundryGatewayApi.SkillMount;\n }\n\n const fqn = nonEmptyString(raw.fqn) ?? nonEmptyString(raw.id);\n if (fqn == null) {\n throw new Error(\n \"skills entry needs fqn or id to mount as registry skill\",\n );\n }\n return {\n type: \"truefoundry-skills-registry\",\n fqn,\n ...skillOptionalFields(raw),\n } as unknown as TruefoundryGatewayApi.SkillMount;\n}\n\n/** Rewrite UI `{id,name}` mounts so create/update draft session can serialize. */\nexport function normalizeAgentSpecForGateway<TSpec extends TfyAgentSpec>(\n spec: TSpec,\n): TSpec {\n return {\n ...spec,\n ...(spec.mcpServers != null\n ? {\n mcpServers: spec.mcpServers.map(\n normalizeMcpMount,\n ) as TSpec[\"mcpServers\"],\n }\n : {}),\n ...(spec.skills != null\n ? {\n skills: spec.skills.map(\n normalizeSkillMount,\n ) as TSpec[\"skills\"],\n }\n : {}),\n };\n}\n","/**\n * CP provider-account metadata → ModelSelectorEntry.properties.reasoningEfforts.\n *\n * Source: GET /api/svc/v1/provider-accounts/providers\n * Join key: `${providerSlug}/${modelId}` (NOT model_fqn).\n * Host (ai.tf) uses the same rules for the draft reasoning-effort picker.\n */\n\nexport type ModelParamDef = {\n key: string;\n type?: string;\n defaultValue?: string | number | boolean | null;\n maxValue?: number;\n minValue?: number;\n /** Legacy — prefer `supportedValues` from the real API. */\n options?: string[];\n supportedValues?: string[];\n};\n\nexport type ModelMetadata = {\n thinking?: boolean;\n removeParams?: string[];\n params?: ModelParamDef[];\n features?: string[];\n limits?: {\n context_window?: number;\n max_output_tokens?: number;\n max_tokens?: number;\n };\n /** Provider-wide defaults; reasoning_effort often lives only here. */\n defaultProviderParams?: {\n params?: ModelParamDef[];\n };\n};\n\nconst DEFAULT_EFFORT_LEVELS: readonly string[] = [\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n] as const;\n\nconst EFFORT_SET = new Set([\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n]);\n\n/** Canonical metadata key: `<providerSlug>/<modelId>` (NOT model_fqn). */\nexport function metadataKey(providerSlug: string, modelId: string): string {\n return `${providerSlug}/${modelId}`;\n}\n\nfunction providerSlugFromType(type: string | undefined): string | null {\n if (type == null) return null;\n const prefix = \"provider-account/\";\n if (!type.startsWith(prefix)) return null;\n const slug = type.slice(prefix.length).trim();\n return slug.length > 0 ? slug : null;\n}\n\nfunction findReasoningEffortParam(\n meta: ModelMetadata | undefined,\n): ModelParamDef | undefined {\n const fromModel = meta?.params?.find((p) => p.key === \"reasoning_effort\");\n if (fromModel != null) return fromModel;\n return meta?.defaultProviderParams?.params?.find(\n (p) => p.key === \"reasoning_effort\",\n );\n}\n\n/**\n * Show efforts when thinking is on, reasoning_effort is not removed, and the\n * provider slug is not exact `\"openai\"` (azure-openai / openai-main still show).\n */\nexport function showsReasoningEffort(\n meta: ModelMetadata | undefined,\n providerSlug: string,\n): boolean {\n if (providerSlug === \"openai\") return false;\n if (meta == null) return false;\n if (meta.thinking !== true) return false;\n if (meta.removeParams?.includes(\"reasoning_effort\")) return false;\n return true;\n}\n\nexport function getEffortOptions(meta: ModelMetadata | undefined): string[] {\n const param = findReasoningEffortParam(meta);\n const raw = param?.supportedValues ?? param?.options;\n if (raw == null || raw.length === 0) return [...DEFAULT_EFFORT_LEVELS];\n const filtered = raw.filter((v) => EFFORT_SET.has(v));\n return filtered.length > 0 ? filtered : [...DEFAULT_EFFORT_LEVELS];\n}\n\n/** Options for the selector, or undefined when the picker should stay hidden. */\nexport function reasoningEffortsForModel(\n meta: ModelMetadata | undefined,\n providerSlug: string,\n): string[] | undefined {\n if (!showsReasoningEffort(meta, providerSlug)) return undefined;\n return getEffortOptions(meta);\n}\n\ntype RawIntegration = {\n type?: string;\n metadata?: Record<string, ModelMetadata>;\n};\n\ntype RawProvider = {\n type?: string;\n integrations?: RawIntegration[];\n};\n\nfunction providersFromJson(json: unknown): RawProvider[] {\n if (Array.isArray(json)) return json as RawProvider[];\n if (json != null && typeof json === \"object\") {\n const obj = json as Record<string, unknown>;\n for (const key of [\"data\", \"providers\", \"result\"] as const) {\n const value = obj[key];\n if (Array.isArray(value)) return value as RawProvider[];\n }\n }\n return [];\n}\n\n/** Build a map keyed by `<providerSlug>/<modelId>` from the providers API. */\nexport function buildMetadataMap(raw: unknown): Map<string, ModelMetadata> {\n const map = new Map<string, ModelMetadata>();\n for (const provider of providersFromJson(raw)) {\n const slug = providerSlugFromType(provider.type);\n if (slug == null) continue;\n for (const integration of provider.integrations ?? []) {\n const metadata = integration.metadata;\n if (metadata == null) continue;\n for (const [modelId, meta] of Object.entries(metadata)) {\n if (!modelId.trim()) continue;\n map.set(metadataKey(slug, modelId), meta);\n }\n }\n }\n return map;\n}\n","/**\n * Control Plane HTTP for builder catalog lists + gateway URL resolution.\n *\n * Wire shapes are host/CP contracts (not Fern / gateway SDK). Paths match\n * ai.tf cpApi usage — expect drift; keep normalizers defensive.\n */\n\nimport type {\n AgentSelectorEntry,\n ConnectorSelectorEntry,\n ModelSelectorEntry,\n SaveAgentRequest,\n SearchAgentSelectorParams,\n SkillSelectorEntry,\n} from \"../../server/types.js\";\nimport {\n buildMetadataMap,\n metadataKey,\n reasoningEffortsForModel,\n} from \"./modelReasoningEffort.js\";\nimport { normalizeAgentSpecForGateway } from \"./normalizeAgentSpec.js\";\nimport type { TfyAgentSpec } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Selector rows — FE base + TFY mount fields\n// ---------------------------------------------------------------------------\n\nexport interface TfyModelSelectorEntry extends ModelSelectorEntry {\n /**\n * model_fqn for AgentSpec.model.name.\n * Same value as {@link ModelSelectorEntry.name} / `id` — trueforge-ui writes\n * `name` into the spec; keep this alias for hosts that still read `apiModel`.\n */\n apiModel: string;\n modelId: string;\n providerAccount?: string;\n}\n\nexport interface TfySkillSelectorEntry extends SkillSelectorEntry {\n /** Version FQN — mount as RegisteredSkillMount.fqn. */\n fqn: string;\n}\n\nexport interface TfyConnectorSelectorEntry extends ConnectorSelectorEntry {\n /** Mount as RegisteredMcpServer.name. */\n mcpName: string;\n serverId?: string | null;\n authenticated?: boolean;\n}\n\nexport type TfyAgentSelectorEntry = AgentSelectorEntry;\n\nexport type CpCredentials = {\n apiKey: string;\n cpURL: string;\n};\n\n// ---------------------------------------------------------------------------\n// HTTP\n// ---------------------------------------------------------------------------\n\nfunction trimSlash(url: string): string {\n return url.replace(/\\/+$/, \"\");\n}\n\nexport async function cpFetch<T>(\n opts: CpCredentials,\n path: string,\n init?: RequestInit,\n): Promise<T> {\n const url = `${trimSlash(opts.cpURL)}${path.startsWith(\"/\") ? path : `/${path}`}`;\n const res = await fetch(url, {\n ...init,\n headers: {\n Authorization: `Bearer ${opts.apiKey}`,\n Accept: \"application/json\",\n ...(init?.headers ?? {}),\n },\n });\n if (!res.ok) {\n throw new Error(`CP ${res.status} ${res.statusText}: ${path}`);\n }\n return (await res.json()) as T;\n}\n\n// ---------------------------------------------------------------------------\n// Gateway URL resolve\n// ---------------------------------------------------------------------------\n\n/**\n * Real CP `/api/svc/v1/session` is flat `{ user, env, ... }` (no `data` wrapper).\n * `env.LLM_GATEWAY_URL` is a prefix like `/api/llm`; tenant is appended:\n * `{cpURL}{LLM_GATEWAY_URL}/{tenantName}` → e.g. `…/api/llm/truefoundry`.\n */\ntype SessionResponse = {\n user?: {\n tenantName?: string;\n };\n env?: {\n TENANT_NAME?: string;\n LLM_GATEWAY_URL?: string;\n };\n /** Legacy / alternate wrap — keep for safety. */\n data?: {\n user?: {\n tenantName?: string;\n };\n };\n};\n\nfunction joinCpPath(cpURL: string, path: string): string {\n const base = trimSlash(cpURL);\n const p = path.startsWith(\"/\") ? path : `/${path}`;\n return `${base}${p}`;\n}\n\n/**\n * Resolve gateway base URL.\n * - `gatewayURL` set → use it (no /session).\n * - else GET /api/svc/v1/session →\n * `{cpURL}{env.LLM_GATEWAY_URL ?? \"/api/llm\"}/{tenantName}`.\n * - session HTTP failure or missing tenantName → throw (no silent public fallback).\n */\nexport async function resolveGatewayURL(opts: {\n apiKey: string;\n cpURL: string;\n gatewayURL?: string;\n}): Promise<string> {\n if (opts.gatewayURL != null && opts.gatewayURL !== \"\") {\n return opts.gatewayURL;\n }\n\n const session = await cpFetch<SessionResponse>(opts, \"/api/svc/v1/session\");\n const tenantName =\n session.user?.tenantName ??\n session.env?.TENANT_NAME ??\n session.data?.user?.tenantName;\n if (tenantName == null || tenantName === \"\") {\n throw new Error(\n \"resolveGatewayURL: /api/svc/v1/session did not return user.tenantName\",\n );\n }\n\n const llmPrefix = trimSlash(session.env?.LLM_GATEWAY_URL ?? \"/api/llm\");\n return joinCpPath(opts.cpURL, `${llmPrefix}/${tenantName}`);\n}\n\n// ---------------------------------------------------------------------------\n// Models\n// ---------------------------------------------------------------------------\n\ntype RawEnabledModel = {\n id?: string;\n name?: string;\n provider?: string;\n provider_account_name?: string;\n model_id?: string;\n model_fqn?: string;\n types?: string[];\n};\n\nfunction isChatModel(row: RawEnabledModel): boolean {\n const types = row.types;\n if (types == null || types.length === 0) return true;\n return types.includes(\"chat\");\n}\n\nfunction toModelEntry(row: RawEnabledModel): TfyModelSelectorEntry | null {\n if (!isChatModel(row)) return null;\n // Gateway AgentSpec.model.name must be model_fqn (e.g. account/model-id).\n // trueforge-ui DraftModelSelector writes ModelSelectorEntry.name into that\n // field, so `name` is the FQN — not the CP short display label.\n const apiModel = row.model_fqn ?? row.id;\n if (apiModel == null || apiModel === \"\") {\n return null;\n }\n const modelId = row.model_id ?? row.name ?? apiModel;\n return {\n id: apiModel,\n name: apiModel,\n provider: { name: row.provider ?? \"unknown\" },\n properties: {},\n apiModel,\n modelId,\n ...(row.provider_account_name != null\n ? { providerAccount: row.provider_account_name }\n : {}),\n };\n}\n\n/**\n * Flatten enabled-models payload.\n * Nested: provider → account → models[].\n * Virtual: top-level account → models[] (array values that look like model rows).\n */\nexport function normalizeEnabledModels(raw: unknown): TfyModelSelectorEntry[] {\n if (raw == null || typeof raw !== \"object\" || Array.isArray(raw)) {\n return [];\n }\n const out: TfyModelSelectorEntry[] = [];\n const seen = new Set<string>();\n\n function pushRow(row: RawEnabledModel): void {\n const entry = toModelEntry(row);\n if (entry == null || seen.has(entry.apiModel)) return;\n seen.add(entry.apiModel);\n out.push(entry);\n }\n\n for (const level1 of Object.values(raw as Record<string, unknown>)) {\n if (Array.isArray(level1)) {\n // virtual-model style: account → models[]\n for (const row of level1) {\n if (row != null && typeof row === \"object\") {\n pushRow(row as RawEnabledModel);\n }\n }\n continue;\n }\n if (level1 == null || typeof level1 !== \"object\") continue;\n for (const level2 of Object.values(level1 as Record<string, unknown>)) {\n if (!Array.isArray(level2)) continue;\n for (const row of level2) {\n if (row != null && typeof row === \"object\") {\n pushRow(row as RawEnabledModel);\n }\n }\n }\n }\n return out;\n}\n\n/**\n * Attach `properties.reasoningEfforts` from provider-account metadata when the\n * model supports thinking. Pure — used by {@link listEnabledModels} and tests.\n */\nexport function enrichModelsWithReasoningEfforts(\n models: TfyModelSelectorEntry[],\n providerMetadataRaw: unknown,\n): TfyModelSelectorEntry[] {\n const map = buildMetadataMap(providerMetadataRaw);\n if (map.size === 0) return models;\n return models.map((model) => {\n const meta = map.get(metadataKey(model.provider.name, model.modelId));\n const reasoningEfforts = reasoningEffortsForModel(\n meta,\n model.provider.name,\n );\n if (reasoningEfforts == null) return model;\n return {\n ...model,\n properties: { ...model.properties, reasoningEfforts },\n };\n });\n}\n\nexport async function listEnabledModels(\n opts: CpCredentials,\n): Promise<TfyModelSelectorEntry[]> {\n // Parallel: providers is enrichment-only; soft-fail keeps models usable.\n const [raw, providers] = await Promise.all([\n cpFetch<unknown>(opts, \"/api/svc/v1/llm-gateway/model/enabled\"),\n cpFetch<unknown>(\n opts,\n \"/api/svc/v1/provider-accounts/providers\",\n ).catch(() => null),\n ]);\n const models = normalizeEnabledModels(raw);\n if (providers == null) return models;\n return enrichModelsWithReasoningEfforts(models, providers);\n}\n\n// ---------------------------------------------------------------------------\n// Skills\n// ---------------------------------------------------------------------------\n\ntype RawAgentSkill = {\n id?: string;\n name?: string;\n fqn?: string;\n latest_version?: {\n id?: string;\n fqn?: string;\n manifest?: {\n ml_repo?: string;\n source?: { description?: string };\n };\n };\n};\n\nexport function normalizeAgentSkills(raw: unknown): TfySkillSelectorEntry[] {\n const data =\n raw != null &&\n typeof raw === \"object\" &&\n Array.isArray((raw as { data?: unknown }).data)\n ? ((raw as { data: RawAgentSkill[] }).data)\n : [];\n const out: TfySkillSelectorEntry[] = [];\n for (const row of data) {\n const fqn = row.latest_version?.fqn;\n const name = row.name;\n if (fqn == null || fqn === \"\" || name == null || name === \"\") continue;\n const description = row.latest_version?.manifest?.source?.description;\n out.push({\n id: fqn,\n name,\n fqn,\n ...(description != null ? { description } : {}),\n });\n }\n return out;\n}\n\nexport async function listAgentSkills(\n opts: CpCredentials,\n): Promise<TfySkillSelectorEntry[]> {\n const raw = await cpFetch<unknown>(\n opts,\n \"/api/ml/v1/agent-skills?include_empty_agent_skills=false\",\n );\n return normalizeAgentSkills(raw);\n}\n\n// ---------------------------------------------------------------------------\n// MCP\n// ---------------------------------------------------------------------------\n\ntype RawMcpServer = {\n id?: string;\n name?: string;\n fqn?: string;\n manifest?: {\n description?: string;\n url?: string;\n auth_data?: { type?: string; auth_level?: string };\n };\n authStatus?: { status?: string };\n};\n\nexport function normalizeMcpServers(raw: unknown): TfyConnectorSelectorEntry[] {\n const data =\n raw != null &&\n typeof raw === \"object\" &&\n Array.isArray((raw as { data?: unknown }).data)\n ? ((raw as { data: RawMcpServer[] }).data)\n : [];\n const out: TfyConnectorSelectorEntry[] = [];\n const seen = new Set<string>();\n for (const row of data) {\n const mcpName = row.name;\n if (mcpName == null || mcpName === \"\" || seen.has(mcpName)) continue;\n seen.add(mcpName);\n const description = row.manifest?.description;\n const authenticated = row.authStatus?.status === \"authenticated\";\n out.push({\n id: mcpName,\n name: mcpName,\n mcpName,\n ...(description != null ? { description } : {}),\n ...(row.id != null ? { serverId: row.id } : { serverId: null }),\n authenticated,\n });\n }\n return out;\n}\n\nexport async function listMcpServers(\n opts: CpCredentials,\n): Promise<TfyConnectorSelectorEntry[]> {\n const raw = await cpFetch<unknown>(opts, \"/api/svc/v1/mcp-servers\");\n return normalizeMcpServers(raw);\n}\n\n// ---------------------------------------------------------------------------\n// Agents\n// ---------------------------------------------------------------------------\n\ntype RawAgent = {\n id?: string;\n name?: string;\n latestVersionDetails?: {\n manifest?: unknown;\n };\n /** Defensive: some payloads nest manifest at the top level. */\n manifest?: unknown;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction snakeToCamelKey(key: string): string {\n return key.replace(/_([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\n/** Deep snake_case → camelCase (inverse of {@link toSnakeCaseDeep}). */\nexport function toCamelCaseDeep(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(toCamelCaseDeep);\n }\n if (isRecord(value)) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n out[snakeToCamelKey(k)] = toCamelCaseDeep(v);\n }\n return out;\n }\n return value;\n}\n\n/**\n * Map a CP AgentManifest (snake_case wire) → FE AgentSpec for Edit seeding.\n * Skills/MCP keep `{ id, name }` for draft pickers plus runtime fields\n * (`enableTools`, `preload`, `config`) so Edit → Save does not widen tool\n * access or wipe settings. Gateway registry shapes are restored on save via\n * normalizeAgentSpecForGateway.\n */\nexport function agentSpecFromCpManifest(manifest: unknown): TfyAgentSpec | undefined {\n if (!isRecord(manifest)) return undefined;\n const modelRaw = manifest.model;\n if (!isRecord(modelRaw) || typeof modelRaw.name !== \"string\" || modelRaw.name === \"\") {\n return undefined;\n }\n const model = toCamelCaseDeep(modelRaw) as TfyAgentSpec[\"model\"];\n\n // Catalog-shaped mounts (`id`/`name` + runtime fields). Not yet gateway\n // registry unions — normalizeAgentSpecForGateway restores those on save.\n const skills: Array<Record<string, unknown>> = [];\n if (Array.isArray(manifest.skills)) {\n for (const row of manifest.skills) {\n if (!isRecord(row)) continue;\n const fqn =\n typeof row.fqn === \"string\" && row.fqn !== \"\"\n ? row.fqn\n : typeof row.id === \"string\" && row.id !== \"\"\n ? row.id\n : null;\n if (fqn == null) continue;\n const camel = toCamelCaseDeep(row) as Record<string, unknown>;\n const name =\n typeof camel.name === \"string\" && camel.name !== \"\"\n ? camel.name\n : fqn;\n skills.push({\n id: fqn,\n name,\n ...(typeof camel.preload === \"boolean\"\n ? { preload: camel.preload }\n : {}),\n ...(camel.config != null ? { config: camel.config } : {}),\n });\n }\n }\n\n const mcpServers: Array<Record<string, unknown>> = [];\n const mcpRaw = Array.isArray(manifest.mcp_servers)\n ? manifest.mcp_servers\n : Array.isArray(manifest.mcpServers)\n ? manifest.mcpServers\n : [];\n for (const row of mcpRaw) {\n if (!isRecord(row)) continue;\n const camel = toCamelCaseDeep(row) as Record<string, unknown>;\n const name =\n typeof camel.name === \"string\" && camel.name !== \"\"\n ? camel.name\n : typeof camel.id === \"string\" && camel.id !== \"\"\n ? camel.id\n : null;\n if (name == null) continue;\n mcpServers.push({\n id: name,\n name,\n ...(Array.isArray(camel.enableTools)\n ? { enableTools: camel.enableTools }\n : {}),\n ...(typeof camel.preload === \"boolean\"\n ? { preload: camel.preload }\n : {}),\n ...(camel.config != null ? { config: camel.config } : {}),\n });\n }\n\n const configRaw = manifest.config;\n const config =\n configRaw != null ? (toCamelCaseDeep(configRaw) as TfyAgentSpec[\"config\"]) : undefined;\n\n return {\n model,\n ...(typeof manifest.instructions === \"string\"\n ? { instructions: manifest.instructions }\n : {}),\n ...(config != null ? { config } : {}),\n ...(skills.length > 0 ? { skills } : {}),\n ...(mcpServers.length > 0 ? { mcpServers } : {}),\n } as TfyAgentSpec;\n}\n\nexport function normalizeAgents(raw: unknown): TfyAgentSelectorEntry[] {\n const data =\n raw != null &&\n typeof raw === \"object\" &&\n Array.isArray((raw as { data?: unknown }).data)\n ? ((raw as { data: RawAgent[] }).data)\n : [];\n const out: TfyAgentSelectorEntry[] = [];\n for (const row of data) {\n if (row.name == null || row.name === \"\") continue;\n const manifest = row.latestVersionDetails?.manifest ?? row.manifest;\n const agentSpec = agentSpecFromCpManifest(manifest);\n const agentId =\n typeof row.id === \"string\" && row.id !== \"\" ? row.id : row.name;\n out.push({\n name: row.name,\n agentId,\n ...(agentSpec != null ? { agentSpec } : {}),\n });\n }\n return out;\n}\n\nexport async function listAgents(\n opts: CpCredentials,\n req?: SearchAgentSelectorParams,\n): Promise<TfyAgentSelectorEntry[]> {\n const limit = req?.limit ?? 50;\n const offset = req?.offset ?? 0;\n const namePrefix = req?.query ?? \"\";\n const qs = new URLSearchParams({\n type: \"truefoundry-agent\",\n limit: String(limit),\n offset: String(offset),\n namePrefix,\n });\n const raw = await cpFetch<unknown>(\n opts,\n `/api/svc/v1/agents?${qs.toString()}`,\n );\n return normalizeAgents(raw);\n}\n\n// ---------------------------------------------------------------------------\n// Save agent (PUT upsert by name)\n// ---------------------------------------------------------------------------\n\n/** Platform feature flags baked into every saved agent manifest. */\nexport const SAVE_AGENT_METADATA_TAGS = {\n agent: \"tfy-ai-gateway-agent\",\n TFY_ALPHA_ENABLE_OPENUI: \"true\",\n TFY_ALPHA_ENABLE_ASK_USER: \"true\",\n TFY_ALPHA_ENABLE_ASK_SECRET: \"true\",\n TFY_ALPHA_CONTEXT_MANAGEMENT:\n '{\"large_tool_response\":{\"individual_tool_response_token_threshold\":8000}}',\n TFY_ALPHA_ENABLE_FILE_DOWNLOAD: \"true\",\n} as const;\n\n/** Default ACL on create/update — everyone on the tenant gets agent-access. */\nexport const SAVE_AGENT_COLLABORATORS = [\n { subject: \"team:everyone\", role_id: \"agent-access\" },\n] as const;\n\nfunction camelToSnakeKey(key: string): string {\n return key.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/** Deep camelCase → snake_case for CP wire (model.params, config, mounts). */\nexport function toSnakeCaseDeep(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(toSnakeCaseDeep);\n }\n if (value != null && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[camelToSnakeKey(k)] = toSnakeCaseDeep(v);\n }\n return out;\n }\n return value;\n}\n\nfunction mcpMountForCp(mount: unknown): Record<string, unknown> {\n const snake = toSnakeCaseDeep(mount) as Record<string, unknown>;\n if (snake.type === \"truefoundry-mcp-registry\") {\n return {\n ...snake,\n enable_tools: snake.enable_tools ?? [\"@all\"],\n preload: snake.preload ?? false,\n };\n }\n return snake;\n}\n\nfunction skillMountForCp(mount: unknown): Record<string, unknown> {\n const snake = toSnakeCaseDeep(mount) as Record<string, unknown>;\n if (snake.type === \"truefoundry-skills-registry\") {\n return {\n ...snake,\n preload: snake.preload ?? false,\n };\n }\n return snake;\n}\n\n/**\n * Build CP `manifest` for `PUT /api/svc/v1/agents`.\n * Normalizes UI catalog mounts, snake_cases gateway fields, hardcodes type /\n * metadata_tags / collaborators.\n */\nexport function buildSaveAgentManifest(\n agentName: string,\n agentSpec: TfyAgentSpec,\n): Record<string, unknown> {\n const spec = normalizeAgentSpecForGateway(agentSpec);\n const mcpServers = (spec.mcpServers ?? []).map(mcpMountForCp);\n const skills = (spec.skills ?? []).map(skillMountForCp);\n // CP AgentManifest requires description; not on FE AgentSpec yet.\n const rawDescription = (agentSpec as { description?: unknown }).description;\n const description = typeof rawDescription === \"string\" ? rawDescription : \"\";\n\n return {\n type: \"truefoundry-agent\",\n name: agentName,\n description,\n model: toSnakeCaseDeep(spec.model),\n metadata_tags: { ...SAVE_AGENT_METADATA_TAGS },\n collaborators: [...SAVE_AGENT_COLLABORATORS],\n ...(spec.instructions != null ? { instructions: spec.instructions } : {}),\n ...(spec.config != null ? { config: toSnakeCaseDeep(spec.config) } : {}),\n ...(mcpServers.length > 0 ? { mcp_servers: mcpServers } : {}),\n ...(skills.length > 0 ? { skills } : {}),\n };\n}\n\n/**\n * Upsert a named agent on the Control Plane.\n * `PUT /api/svc/v1/agents` with `{ manifest }` — name is the upsert key.\n */\nexport async function saveAgent(\n opts: CpCredentials,\n req: SaveAgentRequest<TfyAgentSpec>,\n): Promise<unknown> {\n const manifest = buildSaveAgentManifest(req.agentName, req.agentSpec);\n return cpFetch(opts, \"/api/svc/v1/agents\", {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ manifest }),\n });\n}\n","import type { AgentBuilderServer } from \"../../server/types.js\";\nimport {\n listAgents,\n listAgentSkills,\n listEnabledModels,\n listMcpServers,\n resolveGatewayURL,\n saveAgent,\n type TfyAgentSelectorEntry,\n type TfyConnectorSelectorEntry,\n type TfyModelSelectorEntry,\n type TfySkillSelectorEntry,\n} from \"./cp.js\";\nimport {\n createTrueFoundryChatServer,\n type TrueFoundryChatServer,\n} from \"./chatServer.js\";\nimport type { TfyAgentSpec } from \"./types.js\";\n\nexport type CreateTrueFoundryAgentUIServerOptions = {\n apiKey: string;\n /** Control Plane base URL (builder lists + optional /session for gateway resolve). */\n cpURL: string;\n /**\n * Gateway base URL. When omitted, resolved via\n * `GET {cpURL}/api/svc/v1/session` → `{cpURL}{env.LLM_GATEWAY_URL ?? \"/api/llm\"}/{tenantName}`.\n * Session failure throws (no silent public-gateway fallback).\n */\n gatewayURL?: string;\n};\n\nexport type TrueFoundryAgentUIServer<TSpec extends TfyAgentSpec = TfyAgentSpec> =\n TrueFoundryChatServer<TSpec> &\n AgentBuilderServer<\n TSpec,\n TfyModelSelectorEntry,\n TfySkillSelectorEntry,\n TfyConnectorSelectorEntry,\n TfyAgentSelectorEntry,\n unknown\n >;\n\nfunction credentialsKey(opts: CreateTrueFoundryAgentUIServerOptions): string {\n return `${opts.apiKey}\\0${opts.cpURL}\\0${opts.gatewayURL ?? \"\"}`;\n}\n\nconst inflight = new Map<\n string,\n Promise<TrueFoundryAgentUIServer<TfyAgentSpec>>\n>();\n\n/**\n * Full pack: gateway chat + Control Plane builder lists.\n *\n * Same `apiKey` bearer is used for CP and gateway. Concurrent calls with the\n * same credentials share one in-flight promise (React Strict Mode safe).\n */\nexport async function createTrueFoundryAgentUIServer<\n TSpec extends TfyAgentSpec = TfyAgentSpec,\n>(\n opts: CreateTrueFoundryAgentUIServerOptions,\n): Promise<TrueFoundryAgentUIServer<TSpec>> {\n const key = credentialsKey(opts);\n const existing = inflight.get(key);\n if (existing != null) {\n return existing as Promise<TrueFoundryAgentUIServer<TSpec>>;\n }\n\n const promise = (async () => {\n const baseUrl = await resolveGatewayURL(opts);\n const chat = createTrueFoundryChatServer<TSpec>({\n apiKey: opts.apiKey,\n baseUrl,\n });\n const cp = { apiKey: opts.apiKey, cpURL: opts.cpURL };\n\n const server: TrueFoundryAgentUIServer<TSpec> = {\n ...chat,\n getCapabilities: async () => ({\n data: {\n sandbox: { enabled: true },\n skill: { enabled: true },\n settings: { enabled: true },\n },\n }),\n getModels: () => listEnabledModels(cp),\n getSkills: () => listAgentSkills(cp),\n getMcp: () => listMcpServers(cp),\n searchAgents: (req) => listAgents(cp, req),\n saveAgent: (req) => saveAgent(cp, req),\n };\n return server as TrueFoundryAgentUIServer<TfyAgentSpec>;\n })();\n\n inflight.set(key, promise);\n try {\n return (await promise) as TrueFoundryAgentUIServer<TSpec>;\n } finally {\n inflight.delete(key);\n }\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 createTurn — 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":["name","inflight","isRecord","isRecord"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
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, a as AgentChatServer, T as TurnEvent, b as ThreadCreatedEvent, U as UserToolResponseEvent, M as McpAuthRequiredEvent, c as UserToolApprovalEvent, d as Turn, e as TurnInputItem, S as Session } from './types-
|
|
4
|
-
export { f as AgentBuilderCapabilitiesResponse, g as AgentBuilderServer, h as AgentCapabilityConfig, i as AgentLibraryEntry, j as AgentRuntimeConfig, k as AgentSelectorEntry, l as AgentSkill, m as AgentUIServer, n as AgentUIServerPort, o as ApprovalDecision, p as AuthenticateConnectorRequest, C as CatalogServer, q as ConnectorAuth, r as ConnectorAuthApiKey, s as ConnectorAuthNone, t as ConnectorAuthOAuth, u as ConnectorAuthPublic, v as ConnectorAuthPublicApiKey, w as ConnectorAuthPublicNone, x as ConnectorAuthPublicOAuth, y as ConnectorAuthType, z as ConnectorAuthenticationResult, B as ConnectorBase, D as ConnectorCatalogEntry, E as ConnectorCatalogServer, F as ConnectorConfigBase, G as ConnectorSelectorEntry, H as ConnectorState, I as CreateConnectorRequest, J as CreateModelProviderRequest, K as CreateSandboxProviderRequest, L as CreateSandboxRequest, N as CreateSessionRequest, O as CreateSkillRequest, P as CreateSkillRequestBase, Q as DefinedSkill, R as GithubSkill, V as ImportGithubSkillRequest, W as ListResult, X as ListSessionsOrder, Y as ListSessionsParams, Z as McpServerMount, _ as Model, $ as ModelCatalogServer, a0 as ModelEntry, a1 as ModelMessageEvent, a2 as ModelParams, a3 as ModelProperties, a4 as ModelProviderBase, a5 as ModelProviderCatalogEntry, a6 as ModelProviderConfigBase, a7 as ModelSelection, a8 as ModelSelectorEntry, a9 as PageParams, aa as PreviousTurnIdInput, ab as ProviderEntry, ac as ProviderType, ad as RegistrySkill, ae as SandboxBase, af as SandboxCatalogEntry, ag as SandboxCatalogServer, ah as SandboxConfig, ai as SandboxCreatedEvent, aj as SandboxProviderBase, ak as SandboxProviderCatalogEntry, al as SandboxProviderConfig, am as
|
|
5
|
-
import
|
|
3
|
+
import { A as AgentSpec, a as AgentChatServer, T as TurnEvent, b as ThreadCreatedEvent, U as UserToolResponseEvent, M as McpAuthRequiredEvent, c as UserToolApprovalEvent, d as Turn, e as TurnInputItem, S as Session } from './types-BRrQpoVy.js';
|
|
4
|
+
export { f as AgentBuilderCapabilitiesResponse, g as AgentBuilderServer, h as AgentCapabilityConfig, i as AgentLibraryEntry, j as AgentRuntimeConfig, k as AgentSelectorEntry, l as AgentSkill, m as AgentUIServer, n as AgentUIServerPort, o as ApprovalDecision, p as AuthenticateConnectorRequest, C as CatalogServer, q as ConnectorAuth, r as ConnectorAuthApiKey, s as ConnectorAuthNone, t as ConnectorAuthOAuth, u as ConnectorAuthPublic, v as ConnectorAuthPublicApiKey, w as ConnectorAuthPublicNone, x as ConnectorAuthPublicOAuth, y as ConnectorAuthType, z as ConnectorAuthenticationResult, B as ConnectorBase, D as ConnectorCatalogEntry, E as ConnectorCatalogServer, F as ConnectorConfigBase, G as ConnectorSelectorEntry, H as ConnectorState, I as CreateConnectorRequest, J as CreateModelProviderRequest, K as CreateSandboxProviderRequest, L as CreateSandboxRequest, N as CreateSessionRequest, O as CreateSkillRequest, P as CreateSkillRequestBase, Q as DefinedSkill, R as GithubSkill, V as ImportGithubSkillRequest, W as ListResult, X as ListSessionsOrder, Y as ListSessionsParams, Z as McpServerMount, _ as Model, $ as ModelCatalogServer, a0 as ModelEntry, a1 as ModelMessageEvent, a2 as ModelParams, a3 as ModelProperties, a4 as ModelProviderBase, a5 as ModelProviderCatalogEntry, a6 as ModelProviderConfigBase, a7 as ModelSelection, a8 as ModelSelectorEntry, a9 as PageParams, aa as PreviousTurnIdInput, ab as ProviderEntry, ac as ProviderType, ad as RegistrySkill, ae as SandboxBase, af as SandboxCatalogEntry, ag as SandboxCatalogServer, ah as SandboxConfig, ai as SandboxCreatedEvent, aj as SandboxProviderBase, ak as SandboxProviderCatalogEntry, al as SandboxProviderConfig, am as SandboxProviderListEntry, an as SandboxSnapshotSyncStatus, ao as SaveAgentRequest, ap as SaveAgentResult, aq as SearchAgentSelectorParams, ar as SearchAgentsParams, as as SelectRegistrySkillRequest, at as SessionEventItem, au as SkillBase, av as SkillCatalogEntry, aw as SkillCatalogServer, ax as SkillConfigBase, ay as SkillMount, az as SkillSelectorEntry, aA as ToolApprovalRequiredEvent, aB as ToolBase, aC as ToolCall, aD as ToolResponseRequiredEvent, aE as TurnState, aF as TurnStateDone, aG as TurnStreamData, aH as TurnStreamingEvent, aI as UpdateConnectorRequest, aJ as UpdateModelProviderRequest, aK as UpdateSandboxProviderRequest, aL as UpdateSandboxRequest, aM as UpdateSessionRequest, aN as UserMessage } from './types-BRrQpoVy.js';
|
|
5
|
+
import { AssistantClient } from '@assistant-ui/store';
|
|
6
6
|
export { isEventDelta, mergeEventDelta } from './server/index.js';
|
|
7
7
|
export { CreateTrueFoundryAgentUIServerOptions, CreateTrueFoundryChatServerOptions, RequireApprovalToolSelectorItem, RequireApprovalToolsSelectorTag, TfyAgentSelectorEntry, TfyAgentSpec, TfyConnectorSelectorEntry, TfyCreateSessionRequest, TfyFinishReason, TfyListSessionsParams, TfyMcpServerInitInfo, TfyMcpServerMount, TfyMcpToolInfo, TfyModelMessageUsage, TfyModelParams, TfyModelSelectorEntry, TfyResponseFormat, TfyRuntimeConfig, TfySession, TfySkillMount, TfySkillSelectorEntry, TfySubject, TfySystemToolInfo, TfyThreadState, TfyToolInfo, TfyTurn, TfyTurnCancelledReason, TfyTurnState, TfyTurnStateDoneOutput, ToolsSelectorItem, ToolsSelectorTag, TrueFoundryAgentUIServer, TrueFoundryChatServer, createTrueFoundryAgentUIServer, createTrueFoundryChatServer, getTfyMcpInitServers, getTfyThreadState, getTfyUsage, isTfyMcpToolInfo, isTfySystemToolInfo, isTfyToolInfo } from './plugins/truefoundry-agent-server-adapter/index.js';
|
|
8
8
|
import 'truefoundry-gateway-sdk/agents';
|
|
@@ -258,7 +258,28 @@ type TrueFoundryRuntimeExtras = {
|
|
|
258
258
|
loadOlderHistory: () => Promise<void>;
|
|
259
259
|
draft: TrueFoundryDraftRuntimeExtras | null;
|
|
260
260
|
};
|
|
261
|
-
|
|
261
|
+
/**
|
|
262
|
+
* `PartPrimitive.Messages` wraps sub-agent threads in `ReadonlyThreadProvider`,
|
|
263
|
+
* which shadows `thread` (and therefore `thread.extras`) with a readonly client
|
|
264
|
+
* that has no TrueFoundry extras. Nested AUI clients are `Object.create(parent)`,
|
|
265
|
+
* so walk the prototype chain to reach the root runtime extras.
|
|
266
|
+
*/
|
|
267
|
+
declare function tryGetTrueFoundryExtras(client: AssistantClient): TrueFoundryRuntimeExtras | undefined;
|
|
268
|
+
declare function getTrueFoundryExtras(client: AssistantClient): TrueFoundryRuntimeExtras;
|
|
269
|
+
declare function useTrueFoundryExtrasApi(): TrueFoundryRuntimeExtras;
|
|
270
|
+
declare function useTrueFoundryExtrasApi<S>(select: (extras: TrueFoundryRuntimeExtras) => S): S;
|
|
271
|
+
declare function useTrueFoundryExtrasApi<S>(select: (extras: TrueFoundryRuntimeExtras) => S, fallback: S): S;
|
|
272
|
+
/**
|
|
273
|
+
* Brand + provide/tryGet from assistant-ui; get/use walk ancestor AUI clients so
|
|
274
|
+
* nested readonly sub-agent threads still resolve root TrueFoundry extras.
|
|
275
|
+
*/
|
|
276
|
+
declare const trueFoundryExtras: {
|
|
277
|
+
provide: (value: TrueFoundryRuntimeExtras) => TrueFoundryRuntimeExtras;
|
|
278
|
+
is: (extras: unknown) => extras is TrueFoundryRuntimeExtras;
|
|
279
|
+
tryGet: (extras: unknown) => TrueFoundryRuntimeExtras | undefined;
|
|
280
|
+
get: typeof getTrueFoundryExtras;
|
|
281
|
+
use: typeof useTrueFoundryExtrasApi;
|
|
282
|
+
};
|
|
262
283
|
|
|
263
284
|
/** Pending tool approvals plus a respond action. */
|
|
264
285
|
declare const useTrueFoundryApprovals: () => {
|
|
@@ -353,4 +374,4 @@ declare function getSession(server: AgentChatServer, sessionId: string): Promise
|
|
|
353
374
|
*/
|
|
354
375
|
declare const trueFoundryAttachmentAdapter: AttachmentAdapter;
|
|
355
376
|
|
|
356
|
-
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, 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, useTrueFoundryAdoptAgentSpec, useTrueFoundryAgentRuntime, useTrueFoundryAgentSpec, useTrueFoundryApprovals, useTrueFoundryCancel, useTrueFoundryDownloadSandboxFile, useTrueFoundryFlushAgentSpec, useTrueFoundryHistoryPagination, useTrueFoundryMcpAuth, useTrueFoundryReload, useTrueFoundryResetFromTurn, useTrueFoundryRespondToToolApproval, useTrueFoundryRespondToToolResponse, useTrueFoundryResumeMcpAuth, useTrueFoundryResumeUnavailable, useTrueFoundrySandboxId, useTrueFoundryToolResponses, useTrueFoundryTurnId, useTrueFoundryUpdateAgentSpec };
|
|
377
|
+
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, 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, getTrueFoundryExtras, getTurnMessageContent, mergeAgentSpec, messageHasPendingApprovals, messageHasPendingRequiredActions, messageHasPendingResponses, parseTurnIdFromMessageId, repositoryItemsFromMessages, toTrueFoundryApprovalInputs, trueFoundryAttachmentAdapter, trueFoundryExtras, tryGetTrueFoundryExtras, useTrueFoundryAdoptAgentSpec, useTrueFoundryAgentRuntime, useTrueFoundryAgentSpec, useTrueFoundryApprovals, useTrueFoundryCancel, useTrueFoundryDownloadSandboxFile, useTrueFoundryFlushAgentSpec, useTrueFoundryHistoryPagination, useTrueFoundryMcpAuth, useTrueFoundryReload, useTrueFoundryResetFromTurn, useTrueFoundryRespondToToolApproval, useTrueFoundryRespondToToolResponse, useTrueFoundryResumeMcpAuth, useTrueFoundryResumeUnavailable, useTrueFoundrySandboxId, useTrueFoundryToolResponses, useTrueFoundryTurnId, useTrueFoundryUpdateAgentSpec };
|