terse generate writes a single typed file to your project:
src/terse.generated.tsfor TypeScript
What the file contains
Each section is generated from a real integration you’ve connected. Here’s a trimmed snapshot of what you’d see after connecting Slack, GitHub, and Attio.Resource constants
Every workspace resource is exported as a typed constant. No UUIDs in your workflow code, no runtime lookups.src/terse.generated.ts
Trigger builders and skills
Each integration becomes a namespace of typed trigger builders and askill() constructor. The parameters take resource constants, not strings.
src/terse.generated.ts
Deterministic tool wrappers
Every connected integration also generates typed wrappers onagent.tools.*, with the exact parameter and return types of each tool. These are the calls you make when you know what to do and don’t want to burn tokens letting a model decide.
src/terse.generated.ts
What you write against it
Because every resource, trigger, skill, and tool is an export, your workflow code reads like a description of your business, not a scavenger hunt through admin UIs.src/index.ts
Why humans love it
Before the generated SDK, shipping a workflow meant context switching between your editor, your CRM admin, your Slack workspace, and GitHub settings to collect IDs.- No more ID hunting.
SlackChannel.DealDeskreplaces"C08XYZ1234".Repos.TerseAI.Tersereplaces a numeric repository ID you’d otherwise have to dig out of a URL. - Autocomplete instead of documentation. Your editor lists every connected channel, list, and repo inline. Hover for its real name and ID.
- Renames are tracked. When
#deal-deskgets renamed in Slack, the nextterse generaterewrites the constant. Your code keeps working againstSlackChannel.DealDesk. - Reviews read like English. PRs show
AttioList.Pipeline.NewDeals, not"f1e3c0b2-…". Teammates can actually tell what changed.
Why coding agents love it even more
The generated SDK is the difference between an agent that guesses and an agent that knows. This is where the compounding wins live.- The workspace is the prompt. Cursor, Claude Code, Windsurf, and Codex see every real channel, repo, and list as an exported symbol. They don’t need to ask you “which channel should this post to?” — they pick the one that exists.
- No copy-pasted UUIDs. Agents are notoriously bad at preserving long opaque strings across tool calls. With resource constants, there’s nothing to copy.
- Hallucinations stop compiling. If an agent invents
SlackChannel.SalesTeamorRepos.TerseAI.Website, the TypeScript compiler rejects the build.terse deployrefuses to ship code that doesn’t type-check. There is no path to production for a made-up resource. - Tool parameters are typed end-to-end.
agent.tools.slack.sendMessagetakes{ channelId: string; message: string }. An agent can’t accidentally passchannel_nameor forgetmessage— the signature is enforced. - The agent can read the same file you do. Point your coding assistant at
src/terse.generated.tsand it instantly has a complete map of the integrations, resources, and tools available in your workspace. No documentation gap.
How it stays in sync
terse generate is idempotent and safe to re-run. Typical triggers for regenerating:
You connect a new integration
Run
terse integrate or connect from the Terse app, then terse generate to pick up new trigger builders, skills, and tool wrappers.Workspace resources change
A new Slack channel, a new Attio list, a renamed repo. Re-run
terse generate and commit the updated file.Where to go next
Context as Code
The philosophy behind compiling your workspace into typed code.
Skills & integrations
How the generated skills and triggers fit into a workflow.
Deterministic tool calls
Use
agent.tools.* to call integrations directly, no LLM in the loop.TypeScript SDK reference
Full reference for the runtime types the generated file imports from.
