Repository navigation
v0.22.0
An agent is now a fastagent/ folder you add to a project, and it inherits the machine it runs on. The unit of scheduled work is a routine. Deployments keep their workspace across restarts and releases, and they carry the whole value file. The session control plane is a pure control plane over one data plane, and nothing fastagent serves holds a credential of its own. Underneath: pi 0.87 and a move of the runtime onto Effect.
Upgrading from 0.21
Most agents need four edits. Do them in this order:
- Layout (#532, #615): the definition lives in a subdirectory (
./fastagent/), and the workspace is always its parent. If yourfastagent.config.*sits at a repository root, move the definition into./fastagent/. Otherwise the repository's parent becomes the workspace. - Config file (#530): only
fastagent.config.tsis read. Rename a.js/.mjsconfig. - Routines (#584): rename
schedules/→routines/anddefineSchedule({ cron, prompt })→defineRoutine({ prompt, cron }).http.trigger→http.run,POST /trigger→POST /run. - Deployments: re-run
fastagent deploy <host> --forceonce. Artifacts generated by 0.21 no longer match, and--runrefuses to deploy from them until they are regenerated.
Breaking
Placement and config
- The workspace is always the agent directory's parent (#615).
initalways scaffolds into a subdirectory;--flat,--agent-dir .and--minimalare gone (#532). - One config filename,
fastagent.config.ts(#530). Unknown keys fail at load. Keys removed in this release:http.host(#609; the bind address is--bindonly),deploy.secrets(#611),selfSchedule(#612). --auth-pathis gone from the CLI; useFASTAGENT_AUTH_PATH(#527).--sessions-dir/FASTAGENT_SESSIONS_DIRandchat --sessionare gone: sessions live at<state root>/sessionsand move withFASTAGENT_STATE_DIR(#561).devbinds127.0.0.1by default;startstill binds all interfaces (#519).
Routines and wake-ups
- Routines replace schedules (see Upgrading). A routine without a
cronis reachable by name only:POST /run,fastagent routine run(#584).fastagent scheduleis replaced byfastagent routine list|run|history. wake/unwakeare mounted on every serve;selfScheduleis removed (#612).
Channels
- The GitHub channel is removed: the
@fastagent-sh/fastagent/githubsubpath,githubChannel,fastagent add github(#610). - Telegram's default session id is now
telegram:<chat>(ortelegram:<chat>:<thread>) (#614). Existing Telegram conversations start a new session; history recorded under the bare chat id is not picked up.
Serving and the control plane (#569)
POST /invokeis always served unlesshttp.invoke: false(or--no-invokefor one run); a channel declaring that path fails the boot. Writes to/invokeand/control/*requirecontent-type: application/json.POST /control/invokeis gone (connectAgentdrivesPOST /invoke).FASTAGENT_CONTROL_TOKENis no longer read, andRemoteEndpointOptions.tokenis gone: add, refresh or sign a gateway credential throughfetchFn. Nothing fastagent serves authenticates; put a gateway in front of a public port.fastagent attachis removed (#556).
Deploy
deploy --runcarries the whole value file (.secrets/.env), and only that file: the shell runningdeployis no longer a source (#524, #611). A declared secret with no value stops--runbefore its first side effect.- The deployed model comes from
FASTAGENT_MODELin the value file, or elseconfig.model.deploy --modelis gone (#520). - Deployments keep the workspace (including uncommitted work), state and credentials across restarts and releases. A release replaces only the definition directory (#496).
API
MountableAgenttakes onehttp?: HttpSurface({ cors?, invoke?, run? }) instead ofcorsOrigins/serveInvoke/serveRun(#635).createPiAgentFromDirreturnsauth: { path, fallback? }instead ofauthPath/fallbackAuthPath.fallbackAuthPathis removed fromCreatePiAgentOptions,CreatePiAgentFromDefinitionOptionsandCreatePiModelsOptions: a namedauthPathis an instruction and gets no second layer (#637).ABORTED_CODEandSESSION_BUSY_CODEare exported as values (#591).- A
package.jsonthat does not parse now failsdeploy,startandaddwith the file named, instead of reading as empty (#642).
New
- An agent inherits its machine (#597, #629): skills, prompt templates and pi engine settings come from the box as well as the definition, and
~/.fastagent/models.jsonlayers under the agent's ownmodels.json.deploywarns when the model depends on the machine's file, which does not ship. - Serving runs the definition's
extensions/, one instance per session (#617). - Global credentials: an agent reads a provider its own
auth.jsonlacks from~/.fastagent/.secrets/auth.json(fastagent login -g) (#525). - Declared secrets (#507):
defineTool/defineChannel/defineRoutine({ secrets })declare what the code needs and receive the values.dev/startrefuse to boot without them, anddeploycarries them. fastagent destroy agentcore(#588) removes everythingdeploy agentcorecreated, including what lives outside the stack.POST /runruns a declared routine by name, so an external clock can drive a scale-to-zero box (#574, #584).- Stopping the running turn from a chat channel (
/stop) without publishing/control/*(#541). - Session control (#626–#630, #638):
state().usage(context usage),entries()names the entry acontext_edittargets, pending prompt texts inqueue_changed,availableModelsFromDirfor a model picker, and a publicloginentry point a GUI can drive. - Tool-argument sampling constrained to the author's schema (#577).
fastagent toolreports how much of a result the model would receive (#516). deploy.agentcore.idleTimeoutSeconds(#512).
Fixes
deploy railway --runwaits until the new volume is attached to the service before deploying, and never mistakes another service's volume for its own. Before this, the first deployment booted without its volume andstartrefused to run (#646).- A long connection outranks a cron as the reason a box must stay up, so generated Fly/Railway plans no longer suggest scaling to zero under a long-connection channel (#640).
- The L2 opener (
createPiAgentFromDefinition) reads credentials through the same layers as the CLI; underFASTAGENT_SECRETS_DIRit no longer falls back to the user-global file (#636). - The cron slot claim is atomic across processes; a fire killed mid-turn is recorded as
interrupted(#535, #539, #549). - Chat channels recover an answer that was generated but never delivered (#536), and drop rate-limited preview frames instead of parking the turn (#501).
- Startup refuses an agent whose declared tool or routine cannot load (#540).
deployrefuses a literalapiKeythat would ship inside the image (#523), and requires readiness before a webhook points at Fly or Railway (#518).- pi 0.87: compaction admission, dangling tool calls and image handling follow pi's own behavior instead of a local copy (#622–#624).
Full list: v0.21.1...v0.22.0