Minor Changes
-
8491843: Add a slot-driven agent Metrics tab with aggregate cards, time-range filtering, and Harness-backed line charts.
-
a70543b: Agent access is decided only by the
Authorizer: standalone/OIDC lets everyone list and use agents and restricts update/delete to the creator; TrueFoundry uses external permissions api.You can read a session, turn, events, metrics, schedule, or its runs if you created it, or if you manage the named agent it is bound to. Creating still requires permission to use that agent. Only the creator can update, delete, or cancel a session, create a turn, or download sandbox files. Only the creator can update, delete, pause, resume, or run a schedule. An OIDC settings admin can no longer see other users' schedules.
-
1222563: Make the Postgres app schema configurable via
POSTGRES_SCHEMA(defaulttrueforge) forsearch_path, migrations, and schema bootstrap. -
49164e7: Add optional mutual TLS for the HTTPS listener and schedule controller→server hop via
TRUEFORGE_MTLS_ENABLED/TRUEFORGE_MTLS_CERTS_DIR. Off by default; independent of ServiceFoundryTRUEFOUNDRY_MTLS_*. -
9bfcdaa: Replace string creator fields (
created_by/triggered_by) with a non-nullcreated_by_subjectJSON object on agent, session, schedule, and schedule_run. Ownership and list filters usetenant_id+created_by_subject.subject_id. -
a3a1395: Adds first-class cron schedules for existing agents: persist them, manage them via /api/v1/schedules, validate cron policy at write time, and advance due runs through a single-dispatcher claim path.
-
4b1aa55: Enforce external agent authorization on agent list, get, snippets, update, delete, and referenced-agent use.
-
74eae6c: Remove pagination from list MCP servers across the API, SDK, and UI; return and search the complete configured MCP catalog client-side.
-
0297727: Add context-management compaction triggers with model-aware defaults and migrate persisted legacy token thresholds.
-
ef316d2: Add optional
OIDC_ALLOWED_EMAILSallowlist (exact addresses and*globs) so OIDC logins can be limited to approved emails or domains. -
4b120b8: Schedule runs now execute through one internal API call authenticated with
TRUEFORGE_API_KEY. The server loads the saved run, schedule, and agent, then uses one agent-scoped token for turn resources in TrueFoundry mode. -
0453157: [truefoundry] Use ServiceFoundry dual vend-token response: authenticate as the agent for registry lookups, and as the user (with agent in
act) for MCP authorize/auth status, gateway model api_key, and MCP invoke. -
2025cef: Store Postgres app tables and Kysely migration bookkeeping in a dedicated
trueforgeschema, with an automatic one-time move frompublicso existing installs keep their data and migration history. -
8f1a2dc: [truefoundry] Add a TrueFoundry-managed model registry. When
TRUEFOUNDRY_SERVICEFOUNDRY_SERVER_URLis set, models are listed from the TrueFoundry ServiceFoundry server and turns are routed through the tenant's default AI Gateway with the caller's token. Mutually exclusive with OIDC. Supports internal mutual TLS to the ServiceFoundry server viaTRUEFOUNDRY_MTLS_ENABLED/TRUEFOUNDRY_MTLS_CERTS_DIR. -
4137af1: Unify request-scoped RequestContext across standalone, OIDC, and TrueFoundry auth.
/auth/mereturns{ data: { type, tenant_id, subject, roles } }(typeisoidc-connected|default; OpenAPI/SDK regen deferred to CI). -
e4c4b56: Add built-in web search/fetch system tools (Parallel via
parallel-web), gated byAgentSpec.config.web_search(default off) and TrueFoundry-mode host envTRUEFOUNDRY_WEB_SEARCH_PROVIDER. New drafts seedweb_search.enabledfrom/capabilitieswhen a provider is configured.
Patch Changes
- 12978ac: Accept
x-tfg-mcpandx-tfg-skillsin TrueFoundry mode: MCP servers and skills a request defines by name, taking precedence over the tenant registry for that request only. Both resolve for spec validation and turn execution; an unfiltered list still shows only configured resources, so request-scoped ones never appear in settings. Inline MCP credentials come from the manifest's ownauth.headers, which lets a rotating token ride each turn. - a09f2b1: fix(local-sandbox): allow SRT proxy sockets on Linux
- fad55d8: Persist turn ownership as
active_executor_idon the turn row, mint plain ULID turn ids, and peer cancel via the DB owner instead of embedding the executor in the turn id. - d89b2ff: Persist zero-initialized metrics on agent sessions.
- 172bf14: Add caller-scoped session metrics meters, charts, and chart-data under
/internal/metricsvia a server-ownedISessionMetricsStore. - d89b2ff: Fold session metrics totals on createTurn and terminal writes.
- af40621: Add persisted
agent.metadataon Postgres and SQLite; storeupdateAgentcan patch manifest and/or metadata. - 1c67237: Add agent
external_id(string | nullon create) with a tenant-scoped partial unique index (Postgres and SQLite). - 38abb11: [truefoundry] Sync ServiceFoundry remote agents on create/update/delete and store the remote id in
external_id. FilterlistAgentsbyexternal_ids. Keep general ServiceFoundry HTTP at 10s and agent CRUD calls at 3s. - 49360bc: Drop unused
agent.metadata; remote identity is stored inexternal_id. - 38abb11: Reject reserved agent names
tfgandtrueforgein create requests. - 7968f59: [truefoundry] Use injected
dbfor TrueFoundryAgentStore advisory-lock transactions. - db37b6e: Sandbox skills: unify git and registry mounts onto
.tfy-desired-skills.json(SkillMounter + skill_downloader), and always attach a mounter so existing skills are cleaned up. - 762ecc0: [truefoundry] TrueFoundry skills catalog: proxy GET /skills and /skills/versions from ServiceFoundry; settings skill writes return 424. SkillManifest is a type-discriminated oneOf of GitSkill | TrueFoundryRegistrySkill (
type: truefoundry; name is FQN, display_name is short). AvailableSkill exposes optional metadata (display_name, repository_name, version). AgentSpec skill refs allow opaque FQN names, optional preload (registry), and max 50. UI draft skill mounts map catalogidto AgentSpecname. - fc38f74: AgentSpec skills: TrueFoundry save/turn resolve via SFY; standalone git validate/resolve on the skill store.
- 6c12e59: Constrain ResourceName (NameSchema) to hyphen-only 2–64 and migrate existing "."/"_" names.
- 584e815: Gate Save Agent (create) on tenant CREATE from list-permissions, keep Update Agent on agent MANAGE, unwrap
{ type, permissions }, and bump@truefoundry/assistant-ui-runtimeto0.1.39. - a60f4c2: Add GET /api/v1/agents/{agent_id}/code-snippets with TypeScript TrueForge SDK stream and non-stream samples.
- 8c31eae: Persist top-level agent description and sync it to ServiceFoundry on create/update.
- 502699b: Include
token: "USER_API_KEY"in TypeScript agent code snippets when OIDC or TrueFoundry auth is enabled. - 4e72afc: Announce boot loading with a light-themed orb for contrast outside ThemeProvider.
- f2ca338: Show a spinner on the app boot screens instead of "Loading application…" text.
- 3539da2: Add
brand.mode(icon-title|icon-only|logo) so hosts pick chrome look first;namealways labels the mark, andresolveBrandChromemaps mode to layout chrome. - 4c522e2: Bump
@truefoundry/assistant-ui-runtimeto0.1.30. - 4c522e2: Bump
@truefoundry/assistant-ui-runtimeto0.1.31. - fd1bf7f: Bump
@truefoundry/assistant-ui-runtimeto0.1.38for assistant completion timestamps and keep-alive turn streams on session switch. - 4be60e7: Bump
@truefoundry/assistant-ui-runtimeto0.1.41for turn-scoped sandbox artifact downloads and to stop stale session history from merging after a session switch. - 940c4e5: Prefer MCP Python SDK 2.0 snake_case tool annotation fields, with camelCase fallback for older SDKs, without changing destructive-tool detection behavior.
- 55cc5e7: Add a dedicated controller entry point (
dist/controller-main.js) that runs the periodic control loops (schedule dispatch) as a single-replica process for distributed mode (STANDALONE=false). It targets the server API via the newSERVER_URLenv (defaulthttp://localhost:$PORT). Standalone mode keeps running the controller inside the server process. - ffcd60d: [truefoundry] Forward inbound
x-tfy-metadatafrom create-turn to TrueFoundry-mode gateway calls, merged with harness session, turn, and agent ids. - 629b6e9: Show Created by (avatar + name) on Agents and Schedules tables when creator info is present.
- 2dcb3a0: Add
created_by_meto list sessions and list schedules so callers can restrict results to resources they created (excluding managed-agent visibility). - 58940a7: Report a Daytona key that cannot register snapshots as missing key permissions (403) instead of an invalid API key (422), and name the grants to add in the Daytona dashboard.
- c40129c: Cap Daytona status-refresh calls at 1 minute so a stalled provider cannot hang request handlers.
- b32d2be: Filter chat history to sessions created by the current user, and bump
@truefoundry/assistant-ui-runtimeto0.1.34. - a9430bd: Accept optional
base_urlon agent code-snippets (FE public host); fall back to request origin +PUBLIC_BASE_URLpath. - 9f3b4cd: Make optional
VITE_BASE_PATHapply to both the UI public path and API/auth URLs (defaults to/). - a655537: Update published dependency ranges (AI SDK, Hono, MCP SDK, Redis, assistant-ui, and related packages).
- 4e3b5be: [truefoundry] Forward session, turn, and agent context as
x-tfy-metadataon TrueFoundry-mode model and MCP gateway calls. - 4b120b8: [truefoundry] Use agent-scoped tokens for saved-agent turns in TrueFoundry mode while inline turns keep using the caller token.
- 349e420: Add internal POST /api/internal/import/agents and POST /sessions (snapshot) plus GET /checkpoint?tenant_id= for SF→TrueForge backfill. Import requires the service API key. Named session import links a local agent when present (or SF agent_id / dummy). Drafts use agent_spec; when SF also sends name/id those go in metadata. Checkpoint is per-tenant min created_at of imported sessions.
- 5ccac3d: Update /healthz to return JSON status and package version
- 4111287: Add POST
/api/internal/list-permissionsviaAuthorizer.getPermissions(owner grants for schedules/sessions; agents includeUSE, with TrueFoundry agents mapped from SFYUSE_AGENT/MANAGE_AGENT/DELETE_AGENT). - a000b47: List sessions accepts
metadata[key]=valuequery params (OpenAPI deepObject) for exact metadata containment filtering. Bare JSON-stringmetadataquery params are rejected. Metadata keys are limited to 32 characters and cannot include[]or whitespace so they do not collide with the bracket query form. - 4e7b67a: Check live per-user MCP authentication before loading tools in the agent builder.
- 551b6a8: Default MCP tool approval to
@destructiveonly. Selecting Other/read-only tools clears approval; selecting destructive tools keeps it on. Migrate mounts still carrying the old@write+@destructivedefault. - 80d5bee: Move
resolveInvokeHeadersontoIMcpServerWithAuthStore(notIMcpServerStore) so DB backends stay CRUD-only and turn/MCP invoke paths take the request-scoped with-auth store for configured headers and TrueFoundry gateway Bearer. - c83145a: Abort remote MCP HTTP response bodies over 50MB (
MCP_TOOL_CALL_MAX_RESPONSE_BYTES) so oversized tool results cannot OOM the process. - 5ae0781: [truefoundry] TrueFoundry MCP OAuth authorize redirect uses the tenant
controlPlaneURLfrom the session instead of the processPUBLIC_BASE_URLorigin. - 9501536: [truefoundry] Make MCPServerManifest a type-discriminated oneOf of RemoteMCPServerManifest and TrueFoundryMCPServerManifest.
- 541d65d: Split MCP server persistence (
IMcpServerStore) from Connect UX auth (IMcpServerWithAuthStore/McpServerWithAuthStore) so DB backends stay CRUD + OAuth client columns while authorize/status/revoke compose in via a token store. - fba6129: Require Node.js 22.14+ (
better-sqlite3v13 is built for Node-API 10 and SIGSEGVs on 22.13 and below). - 0ec8dc6: Omit session
total_cost_in_usdwhen cost is unavailable (instead of defaulting to 0), matching turn metrics. - dc2151f: Paginate
GET /api/v1/agentswithlimit/page_tokenand apaginationenvelope; optionalagent_namefilters by case-insensitive substring. Agents library uses rows-per-page and prev/next against the token-paginated API. Schedule create and the schedules listing agent filter use a searchable agent combobox backed by the same filtered list API. - 2b6c566: Paginate
GET /api/v1/schedules/{schedule_id}/runswithlimit/page_tokenand apaginationenvelope. - c221ac6: Fail Postgres connects after 10s and log idle pool errors so a backend restart cannot crash the process.
- 7dc8757: Log while connecting to Postgres and Redis on startup, and skip access logs for
/assets/. - c4078c6: Apply Postgres TLS via Pool
ssllike servicefoundry (POSTGRES_SSL_MODE+ cert/key/CA paths), notsslmodeon the URL. - c65b813: Apply
POSTGRES_SSL_MODEassslmodeon the Postgres connection URL. - a1af95d: Add public GET /api/v1/mcp-servers/{name} returning the chat projection with live per-user auth_status.
- 9846d6d: Add Python TrueForge SDK stream and non-stream samples to agent Use in Code snippets, merging deltas with is_event_delta / merge_event_delta.
- f4fb4bd: Accept
DATABASE_URLfor hosted mode so managed Postgres (e.g. Railway) can be wired without discretePOSTGRES_*vars. - a36ffaf: Namespace all Redis keys and pub/sub channels under
tfg:so TrueForge can share a Redis instance without colliding with other apps. - 555bef0: Allow sandbox artifact downloads to use paths relative to the sandbox working directory.
- 461166e: [truefoundry] Use agent name for ServiceFoundry remote agent description so save succeeds when instructions are empty.
- e307f15: Derive the UI public prefix from the pathname of
PUBLIC_BASE_URLat process start so one published frontend can run behind any path-stripping proxy. - a37cdea: Add NOT NULL
agent_idonschedule(backfilled fromagent), FK toagent(id)ON DELETE CASCADE (replacing the(tenant_id, agent_name)FK), and(tenant_id, agent_id)index for per-agent listing. - 3bc2ed8: List schedules is token-paginated (
limit/page_token) and filters by comma-separatedagent_names. - feb94aa: Add GET /api/v1/schedules/{schedule_id}/runs to list a schedule's runs (newest
scheduled_forfirst), with the same creator-or-admin access as other schedule routes. - 8e64757: Add POST /api/v1/schedules/runs to trigger an immediate schedule run
- bb8d3d3: Persist optional
reasonon schedule runs when hand-off fails. Exposed on ScheduleRun responses as nullable string. - 4ced8ef: Dispatch schedule runs through the session/turn API: get-or-create a session keyed by run id, then create a turn only when that session has none.
- 38ce068: Add tenant-unique optional session
external_id,Sessions.getOrCreateByExternalId, and an idempotentPOST /internal/sessions/get-or-create-by-external-idendpoint and SDK method. - b654052: Add caller-owned session
metadata(Record<string, string>with size limits) on create, update, and read. Persist as a newsession.metadatajsonb column; leave sessioncustomunchanged. - 4a91f47: Allow renaming sessions via
PATCH /api/v1/sessions/{session_id}with an optionaltitle(trimmed, 1–50 chars). - 11865b4: Add optional session
source. Persist as nullable JSONB with a list filter index; expose on session responses and list viasource_type/source_id. Schedule dispatch sets source on create; public create/update do not accept it. - 46fadce: [truefoundry] Point-lookup ServiceFoundry model integrations by provider account and model name, and fetch the full catalog in one unpaginated request.
- b601db8: Simplify agent Use In Code snippets to create/stream/print/map/merge events.
- 5b33ab6: [truefoundry] TrueFoundry skills: use caller JWT for catalog/validate; never agent vend tokens.
- 3c1d544: Fetch MCP servers and gateway installations in parallel.
- 3d385af: Cap SQLite leftover WAL at 64 MiB after checkpoint so a full disk cannot grow the WAL unbounded.
- 5e68fa4: [truefoundry] TrueFoundry-mode
/api/v1/auth/loginredirects toPUBLIC_BASE_URLorigin + callerreturn_to(platform/signin/external?redirectPath=…). - 1c16780: [truefoundry] TrueFoundry MCP: live SFY auth status on single-server GET and mid-turn authorize gating for every auth mode.
- 4c1260e: [truefoundry] Wire TrueFoundry MCP authorize, status, and delete through ServiceFoundry; stub list auth_status; gate oauth2 invoke mid-turn with authRequired; paginate MCP server lists. UI treats SFY consent
code/erroron the FE landing like local DCR success/failure. - 32bf7d6: [truefoundry] TrueFoundry MCP invoke headers are owned by the MCP store (
resolveInvokeHeaders), so gateway Bearer comes from the request-scoped store rather than being threaded through turn/tools APIs. - 185dc04: Per-MCP-server request headers via
x-tfg-mcp-headers, merged into the invoke headers for the named server. Lets a caller that authenticates as one identity give each MCP server the identity it should actually see. - ac091cc: [truefoundry] TrueFoundry mode: shared Daytona sandbox via TRUEFOUNDRY_SANDBOX_* env and settings-server snapshot (lru-cache TTL).
- 5bc13d0: [truefoundry] Pass TrueFoundry agents metadata through TrueFoundry agent import.
- 44f9cbe: [truefoundry] TrueFoundry mode: env-backed Daytona | truefoundry sandbox via TRUEFOUNDRY_SANDBOX_* (static SETTINGS JSON). Settings OpenAPI stays Daytona-only (
SandboxProviderManifest); truefoundry is store-internal (StoredSandboxProviderManifest). - c77e7df: [truefoundry] TrueFoundry mode: optional
TRUEFOUNDRY_TENANT_ID_TO_ALLOWED_MODEL_PROVIDER_ACCOUNTSJSON map of tenant id → provider account names to limit which virtual providers are listed per tenant. - 4e72afc: Use an animated thinking orb for application boot and server initialization.
- f175245: [truefoundry] Add TrueFoundry-managed MCP list/get (SFY registry, gateway proxy URL, create/update 424).
- a655537: Add a
turn.updateevent schema with paused/running status andaction_required_on_events. - 1b5b674: Add a host-overridable user avatar slot with initials and display-name chrome across every built-in layout, wired to the current authenticated frontend user.
- 5d72138: Keep
npx @truefoundry/trueforgeworking on native Windows: import Kysely migrations withpathToFileURL, and keep sandbox guest paths POSIX. Source development stays Unix/WSL; CI also runs unit and SQLite store tests on Windows. - Updated dependencies [354991d]
- Updated dependencies [fad55d8]
- Updated dependencies [648273b]
- Updated dependencies [648273b]
- Updated dependencies [d89b2ff]
- Updated dependencies [648273b]
- Updated dependencies [172bf14]
- Updated dependencies [d89b2ff]
- Updated dependencies [db37b6e]
- Updated dependencies [762ecc0]
- Updated dependencies [648273b]
- Updated dependencies [648273b]
- Updated dependencies [fc38f74]
- Updated dependencies [648273b]
- Updated dependencies [648273b]
- Updated dependencies [648273b]
- Updated dependencies [648273b]
- Updated dependencies [648273b]
- Updated dependencies [648273b]
- Updated dependencies [648273b]
- Updated dependencies [648273b]
- Updated dependencies [01ee934]
- Updated dependencies [a70543b]
- Updated dependencies [940c4e5]
- Updated dependencies [2dcb3a0]
- Updated dependencies [9bfcdaa]
- Updated dependencies [c40129c]
- Updated dependencies [a655537]
- Updated dependencies [4111287]
- Updated dependencies [a000b47]
- Updated dependencies [551b6a8]
- Updated dependencies [2cb51a5]
- Updated dependencies [74eae6c]
- Updated dependencies [c83145a]
- Updated dependencies [9501536]
- Updated dependencies [0297727]
- Updated dependencies [0ec8dc6]
- Updated dependencies [dc2151f]
- Updated dependencies [134dcb9]
- Updated dependencies [bf5233d]
- Updated dependencies [a36ffaf]
- Updated dependencies [52987a7]
- Updated dependencies [38ce068]
- Updated dependencies [b654052]
- Updated dependencies [11865b4]
- Updated dependencies [4c1260e]
- Updated dependencies [44f9cbe]
- Updated dependencies [ba79ce5]
- Updated dependencies [8f1a2dc]
- Updated dependencies [afe816e]
- Updated dependencies [f175245]
- Updated dependencies [a5f220f]
- Updated dependencies [a655537]
- Updated dependencies [e4c4b56]
- Updated dependencies [5d72138]
- @truefoundry/trueforge-core@0.2.0
- @truefoundry/trueforge-sdk@0.2.0