diff --git a/agent/README.md b/agent/README.md index 052f4ab2..87bcf1db 100644 --- a/agent/README.md +++ b/agent/README.md @@ -23,7 +23,7 @@ describe that call; they do not perform I/O or run the durable agent loop. `provider/model` spelling. - To select an OpenAI-native model that can use a project Codex subscription, use an explicit provider: `useModel({ provider: "openai", model: "gpt-5" })`. -- `useTool()` and `useSubagent()` select declared capabilities. +- `useTool()` selects declared capabilities. - `useSessionData()` reads the current durable session-data snapshot. - `useMcpServer()` conditionally selects a declared MCP server. - `useMemory()` reads the projection of a memory resource bound to the diff --git a/agent/package-lock.json b/agent/package-lock.json index e995583c..a2fce3a6 100644 --- a/agent/package-lock.json +++ b/agent/package-lock.json @@ -1,12 +1,12 @@ { "name": "@opencomputer/agent", - "version": "0.8.0", + "version": "0.9.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@opencomputer/agent", - "version": "0.8.0", + "version": "0.9.0", "dependencies": { "croner": "^9.1.0" }, diff --git a/agent/package.json b/agent/package.json index abadb8d6..21fa233e 100644 --- a/agent/package.json +++ b/agent/package.json @@ -1,6 +1,6 @@ { "name": "@opencomputer/agent", - "version": "0.8.0", + "version": "0.9.0", "description": "Reactive agent authoring API for OpenComputer.", "type": "module", "main": "./dist/index.js", diff --git a/agent/src/index.ts b/agent/src/index.ts index 12bf3af9..6d399105 100644 --- a/agent/src/index.ts +++ b/agent/src/index.ts @@ -729,7 +729,6 @@ interface AgentHooks { useModel(model: ModelSelection): void; useTool(tool: string | ResourceReference): void; useConnection(connection: string | ResourceReference): void; - useSubagent(agent: string | ResourceReference): void; useSessionData(key: string): T | undefined; useMcpServer(server: string | ResourceReference): void; /** Optional: the declaration is extracted at build time, so a host @@ -1742,8 +1741,6 @@ export const useConnection = (connection: string | ResourceReference): void => */ export const useService = (service: string): void => hooks().useService?.(service); -export const useSubagent = (agent: string | ResourceReference): void => - hooks().useSubagent(agent); export const useMcpServer = (server: string | ResourceReference): void => hooks().useMcpServer(server); export function useSessionData( diff --git a/cli/package-lock.json b/cli/package-lock.json index 46de67f9..fc20d836 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -1,12 +1,12 @@ { "name": "@opencomputer/cli", - "version": "0.7.15", + "version": "0.7.16", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@opencomputer/cli", - "version": "0.7.15", + "version": "0.7.16", "dependencies": { "@opencode-ai/sdk": "1.18.4", "ai": "^7.0.45", diff --git a/cli/package.json b/cli/package.json index 55118789..e23a5dc5 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@opencomputer/cli", - "version": "0.7.15", + "version": "0.7.16", "description": "Build, test, deploy, and share OpenComputer agents as code.", "type": "module", "bin": { diff --git a/cli/src/project.test.ts b/cli/src/project.test.ts index 21ef4b6f..aae7be2e 100644 --- a/cli/src/project.test.ts +++ b/cli/src/project.test.ts @@ -327,7 +327,6 @@ test("the code-first compiler records hook resources without config files", asyn useInput, useMcpServer, useModel, - useSubagent, useTool, } from "@opencomputer/agent"; @@ -340,7 +339,6 @@ export default function Agent() { const input = useInput(); useModel("anthropic/claude-sonnet-4.6"); useTool("search-docs"); - useSubagent("researcher"); if (input.text?.includes("docs")) useMcpServer(docs); return "Help with the request."; } @@ -357,7 +355,6 @@ export default function Agent() { version: number; tools: string[]; toolModules: string[]; - subagents: string[]; connections: string[]; httpConnections: unknown[]; githubConnections: unknown[]; @@ -376,7 +373,6 @@ export default function Agent() { tools: ["search-docs"], gatedTools: [], toolModules: [], - subagents: ["researcher"], connections: [], httpConnections: [], githubConnections: [], diff --git a/cli/src/project.ts b/cli/src/project.ts index d0a4c801..67b34d1a 100644 --- a/cli/src/project.ts +++ b/cli/src/project.ts @@ -3403,7 +3403,6 @@ export const useModel = (model) => hooks().useModel(model); export const useTool = (tool) => hooks().useTool(tool); export const useConnection = (connection) => hooks().useConnection(connection); export const useService = (service) => hooks().useService?.(service); -export const useSubagent = (agent) => hooks().useSubagent(agent); export const useMcpServer = (server) => hooks().useMcpServer(server); export const useSessionData = (key) => hooks().useSessionData(key); `; @@ -3823,7 +3822,6 @@ the product or support surface presented to users. // The result tool and the schema the host validates its output // against before committing it as the session's result. ...(resultTool ? { resultTool } : {}), - subagents: literalHookIds(agentSource, "useSubagent"), // Declared HTTP connections AND managed-service grants: the platform // reads one list, and a provider grant absent from it makes every // connected mailbox invisible to listServices(). diff --git a/create-start/package.json b/create-start/package.json index aa1a2c45..7ad0baa3 100644 --- a/create-start/package.json +++ b/create-start/package.json @@ -1,6 +1,6 @@ { "name": "@opencomputer/create-start", - "version": "0.7.15", + "version": "0.7.16", "description": "Create a hello-world OpenComputer agent application.", "type": "module", "bin": { @@ -18,7 +18,7 @@ "node": ">=22.0.0" }, "dependencies": { - "@opencomputer/cli": "0.7.15" + "@opencomputer/cli": "0.7.16" }, "publishConfig": { "access": "public" diff --git a/docs/agents/capabilities.mdx b/docs/agents/capabilities.mdx index 7a93bc05..7c2de834 100644 --- a/docs/agents/capabilities.mdx +++ b/docs/agents/capabilities.mdx @@ -1,6 +1,6 @@ --- title: "Agent capabilities" -description: "Choose tools, MCP servers, skills, subagents, memory and outbound connections" +description: "Choose tools, MCP servers, skills, memory and outbound connections" --- Capabilities give an agent something beyond its instructions and model. Choose @@ -13,7 +13,6 @@ the narrowest capability that fits the job. | Connected service | Google services, GitHub, or Linear, on someone's connected account | OpenComputer attaches and refreshes the credential | `useService("gmail")`, then `callService()` in a tool | | MCP server | A service that already publishes a collection of tools | The remote MCP server | `useMcpServer(server)` | | Skill | A reusable procedure, checklist, or supporting files | The agent follows the loaded instructions | Place it under `skills/` | -| Subagent | Delegating a focused task to another project agent | The delegated agent | `useSubagent(agentId)` | | HTTP connection | A constrained authenticated outbound request | OpenComputer sends the declared request | Call `defineConnection().fetch()` inside a tool | | GitHub App connection | Direct Git and GitHub API access to an installation | The agent sandbox uses a short-lived installation token | `useConnection(github)` | | Memory | Notes shared across sessions | OpenComputer stores documents; the agent reads and saves through memory tools | `useMemory(memory)` | @@ -37,12 +36,6 @@ A tool performs an operation and returns structured data. A Many agents use both: the skill describes the workflow while tools perform the individual actions. -## Tool or subagent? - -Use a tool for a bounded operation such as fetching an order. Use a -[subagent](/agents/subagents) when the task benefits from its own instructions, -model selection, capabilities, and working context. - ## Session data or memory? [Session data](/agents/session-data) describes the current session and is set diff --git a/docs/agents/events.mdx b/docs/agents/events.mdx index dbdd07bd..be3a0553 100644 --- a/docs/agents/events.mdx +++ b/docs/agents/events.mdx @@ -233,7 +233,7 @@ work continued or failed; see [Durability and recovery](/agents/sessions#durabil | Type | When | `data` | | --- | --- | --- | -| `agent.rendered` | Your agent function was rendered for a model step | `renderId`, `instructions`, `model`, `enabledTools`, `enabledSubagents`, `enabledMcpServers`, `requiredConnections`, `input`, `tools`, `renderedAt` | +| `agent.rendered` | Your agent function was rendered for a model step | `renderId`, `instructions`, `model`, `enabledTools`, `enabledMcpServers`, `requiredConnections`, `input`, `tools`, `renderedAt` | One turn can carry several renders, one per model step. The debug inspector in the [playground](/agents/playground) shows the same data. diff --git a/docs/agents/hooks.mdx b/docs/agents/hooks.mdx index 34db17e2..378238d6 100644 --- a/docs/agents/hooks.mdx +++ b/docs/agents/hooks.mdx @@ -44,7 +44,6 @@ agent function. | `useModel(model)` | Selects the model used for the next step | [Models](/agents/models) | | `useTool(tool)` | Exposes a named or code-defined tool | [Tools](/agents/tools) | | `useMcpServer(server)` | Exposes tools from a managed HTTPS MCP server | [MCP servers](/agents/mcp) | -| `useSubagent(agent)` | Makes another project agent available for delegation | [Subagents](/agents/subagents) | | `useSessionData(key)` | Reads a durable value associated with the session | [Session data](/agents/session-data) | | `useMemory(memory)` | Reads bound memory and selects its permitted tools for this model request | [Memory](/agents/memory) | diff --git a/docs/agents/mental-model.mdx b/docs/agents/mental-model.mdx index ba10764e..73e0e1dd 100644 --- a/docs/agents/mental-model.mdx +++ b/docs/agents/mental-model.mdx @@ -117,7 +117,6 @@ Use the narrowest capability that fits the work: | --- | --- | | `useTool(tool)` | One typed operation implemented by your project | | `useMcpServer(server)` | A collection of tools advertised by a remote MCP server | -| `useSubagent(agent)` | Another project agent available for delegation | | A skill under `skills/` | Reusable instructions and supporting resources | | `useMemory(memory)` | The bound documents' text and the tools that save to them | @@ -169,7 +168,7 @@ Read Understand durable conversations and runtime events. - Choose between tools, MCP servers, skills, and subagents. + Choose between tools, MCP servers, and skills. Start recurring sessions from code-defined cron schedules. diff --git a/docs/agents/overview.mdx b/docs/agents/overview.mdx index 0ccd73bf..c2b90852 100644 --- a/docs/agents/overview.mdx +++ b/docs/agents/overview.mdx @@ -22,8 +22,8 @@ export default function Agent() { The exported function is a reactive description of the agent. OpenComputer renders it for the current input and uses its return value as instructions for -the managed agent loop. Hooks attach the model, tools, MCP servers, and -subagents needed for that render. [Memory](/agents/memory) gives an agent +the managed agent loop. Hooks attach the model, tools, and MCP servers +needed for that render. [Memory](/agents/memory) gives an agent notes that outlive a session: project-scoped documents read at render, saved by the model through memory tools, and owned by you. @@ -44,7 +44,7 @@ by the model through memory tools, and owned by you. Create sessions on your server and attach a React interface. - Choose between tools, MCP servers, skills, and subagents. + Choose between tools, MCP servers, and skills. Declare secret-backed connections without exposing credentials to agents. @@ -78,7 +78,7 @@ configured agent to `development`. ## What is available today - TypeScript projects containing one or more agents -- reactive instructions, model selection, tools, subagents, MCP +- reactive instructions, model selection, tools, MCP servers, input metadata, session data reads, and document memory - cloud development with file watching and automatic synchronization - dashboard and CLI playground sessions diff --git a/docs/agents/quickstart.mdx b/docs/agents/quickstart.mdx index 63fb489f..ced90c2e 100644 --- a/docs/agents/quickstart.mdx +++ b/docs/agents/quickstart.mdx @@ -105,6 +105,6 @@ version history. Add more agents and understand project bindings. - Add models, tools, MCP servers, and subagents. + Add models, tools, and MCP servers. diff --git a/docs/agents/reactive-agents.mdx b/docs/agents/reactive-agents.mdx index 0bcff557..cbdc754c 100644 --- a/docs/agents/reactive-agents.mdx +++ b/docs/agents/reactive-agents.mdx @@ -26,7 +26,6 @@ needs it. | `useCurrentInput()` | Alias for `useInput()` | | `useModel(model)` | Selects a model using `provider/model` notation | | `useTool(tool)` | Makes a named or code-defined tool available | -| `useSubagent(agent)` | Makes another project agent available as a subagent | | `useMcpServer(server)` | Attaches a managed HTTPS MCP server | | `useSessionData(key)` | Reads a value previously stored in the current session | | `useMemory(memory)` | Reads bound memory and selects its permitted tools | @@ -41,7 +40,6 @@ and source metadata. import { useInput, useModel, - useSubagent, useTool, } from "@opencomputer/agent"; @@ -51,7 +49,6 @@ export default function Agent() { if (input.text?.includes("research")) { useTool("web-search"); - useSubagent("researcher"); } return "Answer directly. Research and verify when those capabilities exist."; @@ -137,5 +134,5 @@ source or the React application. Continue with [Agent hooks](/agents/hooks), then use the focused guides for [inputs](/agents/inputs), [models](/agents/models), [tools](/agents/tools), -[MCP servers](/agents/mcp), [skills](/agents/skills), -[subagents](/agents/subagents), and [session data](/agents/session-data). +[MCP servers](/agents/mcp), [skills](/agents/skills), and +[session data](/agents/session-data). diff --git a/docs/agents/subagents.mdx b/docs/agents/subagents.mdx deleted file mode 100644 index cab0e09e..00000000 --- a/docs/agents/subagents.mdx +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: "Subagents" -description: "Let an agent delegate focused work with useSubagent" ---- - -A subagent is another agent in the same project that can take a focused task. -Use `useSubagent()` to make that agent available to the current render. - -## Add the specialist - -Create a second agent: - -```tsx -// opencomputer/agents/researcher/agent.ts -import { useModel, useTool } from "@opencomputer/agent"; - -export default function Agent() { - useModel("anthropic/claude-sonnet-4.6"); - useTool("web-search"); - return "Research the delegated question. Return sourced findings only."; -} -``` - -Register both agents in the project: - -```tsx -// opencomputer/project.ts -export default { - name: "Campaign workspace", - agents: ["campaign-planner", "researcher"], -}; -``` - -## Expose it with `useSubagent` - -```tsx -// opencomputer/agents/campaign-planner/agent.ts -import { useModel, useSubagent } from "@opencomputer/agent"; - -export default function Agent() { - useModel("anthropic/claude-sonnet-4.6"); - useSubagent("researcher"); - return [ - "Plan the campaign from evidence.", - "Delegate audience and competitor research to the researcher.", - ].join(" "); -} -``` - -The value passed to `useSubagent()` is the agent ID from -`opencomputer/project.ts`. Give the parent clear instructions about what it -should delegate and what result it expects. - -Inputs created by delegation have `useInput().source === "subagent"`, so the -specialist can adapt its response: - -```tsx -import { useInput } from "@opencomputer/agent"; - -export default function Agent() { - const input = useInput(); - return input.source === "subagent" - ? "Complete only the delegated research task and return concise findings." - : "Help the user research their question."; -} -``` - -## Attach conditionally - -Like other resource hooks, `useSubagent()` can be conditional: - -```tsx -const input = useInput(); -if (input.text?.includes("research")) { - useSubagent("researcher"); -} -``` - -This keeps the delegate unavailable for requests where it adds no value. diff --git a/docs/docs.json b/docs/docs.json index c84ee6eb..cb2ae620 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -72,7 +72,6 @@ "agents/tools", "agents/mcp", "agents/skills", - "agents/subagents", "agents/session-data", "agents/document-memory", "agents/memory-providers" diff --git a/web/src/managed-agents/DebugInspector.tsx b/web/src/managed-agents/DebugInspector.tsx index b5f12237..37026638 100644 --- a/web/src/managed-agents/DebugInspector.tsx +++ b/web/src/managed-agents/DebugInspector.tsx @@ -396,12 +396,6 @@ export function DebugInspector({

-
-

- Subagents -

- -

Skills diff --git a/web/src/managed-agents/api.ts b/web/src/managed-agents/api.ts index 721ae8fa..ff0c7793 100644 --- a/web/src/managed-agents/api.ts +++ b/web/src/managed-agents/api.ts @@ -636,7 +636,7 @@ const renderDebugSchema = z.object({ instructionsHash: z.string(), instructions: z.string(), enabledTools: z.array(z.string()), - enabledSubagents: z.array(z.string()), + enabledSubagents: z.array(z.string()).optional(), requiredConnections: z.array(z.string()), enabledMcpServers: z.array(z.string()), input: z.object({ source: z.string(), text: z.string().optional() }),