tsrender

package
v0.4.0-rc.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 3, 2026 License: Apache-2.0 Imports: 5 Imported by: 0

Documentation

Overview

Package tsrender produces the TypeScript .d.ts blocks that Airlock embeds into the agent system prompt: typed signatures for registered tools, and per-server `declare const mcp_{slug}: {...}` namespaces for MCP tools.

The package is split out from agentsdk's main API surface so builders (agentsdk consumers) don't see these types in their import autocomplete or godoc — agentsdk's main package stays focused on the builder API (RegisterTool, MCPHandle, etc.). The rendering here is shared between agentsdk's tests and the airlock module's prompt template; both import this package directly.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func JSToolNames added in v0.2.1

func JSToolNames(names []string) map[string]string

JSToolNames maps each MCP tool name to a JS-identifier-safe property name. MCP tool names commonly include hyphens (`notion-update-page`); JS parses `obj.notion-update-page(...)` as arithmetic and throws ReferenceError. The original hyphenated name stays canonical on the wire (tool/call JSON-RPC); only the JS surface is renamed.

Collision handling: when the `-` → `_` rename would clash with another tool's original name on the same server (e.g. `foo-bar` AND `foo_bar` both exist), the hyphenated tool keeps its original name — the LLM has to use bracket notation for that one, but every other tool on the server still gets the dot-friendly form. Iteration is over a sorted copy so the resulting map is stable across syncs.

func RenderMCPNamespace

func RenderMCPNamespace(namespace string, tools []MCPToolRender) string

RenderMCPNamespace emits a typed `declare const {namespace}: { ... };` block describing each discovered tool as a method on the namespace object. namespace is the FULL JS identifier the runtime binds (e.g. "mcp_github" for an MCP server, "agent_spotify" for a sibling) — the caller owns the prefix so the declaration matches the binding name exactly. Mirrors the JS binding shape installed by agentsdk's vm.go so the LLM's call site and the runtime stay in lockstep.

declare const mcp_github: {
  /** Search for GitHub repositories. */
  search_repos(args: { query: string }): unknown;
  ...
};

func RenderToolDecls

func RenderToolDecls(tools []ToolRender) string

RenderToolDecls emits a TypeScript .d.ts-style block describing each tool. Output is suitable for direct inclusion in an LLM prompt.

Types

type MCPToolRender

type MCPToolRender struct {
	Name        string
	Description string
	InputSchema json.RawMessage
}

MCPToolRender carries the bits Airlock has cached about an MCP tool. Only the input shape is typed — MCP doesn't define an output schema, so the rendered return type is always `unknown` (caller does runtime parsing).

type ToolRender

type ToolRender struct {
	Name          string
	Description   string
	LLMHint       string
	InputSchema   json.RawMessage
	OutputSchema  json.RawMessage
	InputExamples []json.RawMessage
}

ToolRender is the data RenderToolDecls consumes. Airlock builds this from the hydrated DB/sync payload; the agent assembles it from the registered-tool schemas in tests. Both paths go through the same renderer so the LLM sees one format.

LLMHint is optional model-only guidance that pairs with Description (which may also surface in member-facing UIs). When non-empty it's appended to the JSDoc block in `[brackets]` so the LLM gets the extra steer without polluting the user-visible description.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL