Skip to content

feat(appkit): add agent plugin core and ToolProvider implementations#284

Closed
MarioCadenas wants to merge 1 commit intoagent/2a-tool-types-mcpfrom
agent/2b-plugin-core
Closed

feat(appkit): add agent plugin core and ToolProvider implementations#284
MarioCadenas wants to merge 1 commit intoagent/2a-tool-types-mcpfrom
agent/2b-plugin-core

Conversation

@MarioCadenas
Copy link
Copy Markdown
Collaborator

@MarioCadenas MarioCadenas commented Apr 16, 2026

Summary

  • AgentPlugin class: HTTP routes (/chat, /cancel, /threads, /invocations), tool collection from ToolProvider plugins + FunctionTool + MCP, SSE streaming via executeStream, thread management
  • AgentEventTranslator: stateful converter from internal AgentEvent to OpenAI Responses API ResponseStreamEvent with sequence numbers and output indices
  • InMemoryThreadStore: per-user conversation persistence with nested Map
  • Zod request schemas for /chat and /invocations endpoints
  • ToolProvider implementations added to analytics, files, genie, and lakebase plugins
  • Server plugin addExtension() method for internal plugin-to-plugin route registration

PR Stack

  1. Shared types + Adapters — feat(appkit): add shared agent types and LLM adapter implementations #282
  2. Tool types + MCP client — feat(appkit): add FunctionTool, HostedTool types and MCP client #283
  3. Agent plugin core + ToolProvider implementations (this PR)
  4. PluginContext mediator — feat(appkit): add PluginContext mediator for inter-plugin communication #285
  5. createAgent + agent-app + docs (v1) — feat(appkit): add createAgent wrapper, agent-app, and API docs #286
  6. Plugin context-binding separation — refactor(appkit): separate plugin context binding from plugin construction #293
  7. agents() plugin + createAgent(def) + .toolkit()feat(appkit): add agents() plugin, createAgent() factory, and .toolkit() #294
  8. agent-app + docs migrated to agents()feat(appkit): migrate agent-app and docs to the new agents() plugin #295
  9. Relocate shared agent utilities — refactor(appkit): relocate shared agent utilities into plugins/agents #296
  10. preparePlugins forwards eager instance — refactor(appkit): forward eager plugin instance through preparePlugins #297
  11. fromPlugin() API — feat(appkit): add fromPlugin() for referencing plugin tools in code-defined agents #298
  12. Retire deprecated agent() + createAgentAppchore(appkit): remove deprecated agent() plugin and createAgentApp shortcut #299
  13. Retire toPluginWithInstance + bug fixes — refactor(appkit): retire toPluginWithInstance; consolidate on fromPlugin + fix schema/routing bugs #300

Test plan

  • 1642 tests pass
  • Typecheck clean
  • Biome lint clean

Add the agent plugin with all supporting infrastructure:

- AgentPlugin class: routes, tool collection, SSE streaming, thread mgmt
- AgentEventTranslator: converts AgentEvent to OpenAI Responses API format
- InMemoryThreadStore: per-user conversation persistence
- Config-driven agents: frontmatter markdown files in config/agents/
- Layered system prompts: auto-generated base (guidelines + app context)
  prepended to per-agent user prompt
- AgentDefinition union type: agents accept { adapter, systemPrompt }
- Auto-discovery: config files merged with code-defined agents per-name
- reloadAgents() export for future hot-reload support
- ToolProvider implementations for analytics, files, genie, lakebase
- Server plugin addExtension() for plugin-to-plugin route registration

Also add a shared defineTool() helper for ToolProvider plugins and refactor
the four built-in ToolProviders to use it:

- defineTool(): Zod-powered factory that pairs a schema with a typed handler
  and optional ToolAnnotations. Names are supplied by the enclosing registry
  key, so dotted names like `uploads.list` or `myspace.sendMessage` work
  without any special-case dispatch code.
- executeFromRegistry(): generic dispatcher that looks up an entry by name,
  validates args via safeParse, and returns an LLM-friendly error string on
  failure rather than throwing.
- toolsFromRegistry(): derives the AgentToolDefinition[] from a registry,
  generating JSON Schema from each entry's Zod schema.
- analytics, files, genie, lakebase: getAgentTools() / executeAgentTool()
  now delegate to the shared helpers. Static plugins (analytics, lakebase)
  declare the registry as a class field; dynamic plugins (files, genie)
  build per-volume / per-space entries in the constructor after runtime
  config is known.

Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
@MarioCadenas
Copy link
Copy Markdown
Collaborator Author

Superseded by the v2 6-PR stack:

  1. Shared agent types + LLM adapters — feat(appkit): shared agent types and LLM adapter implementations #301
  2. Tool primitives + ToolProvider surfaces — feat(appkit): tool primitives and ToolProvider surfaces on core plugins #302
  3. Plugin infrastructure (attachContext + PluginContext) — feat(appkit): plugin infrastructure — attachContext + PluginContext mediator #303
  4. agents() plugin + createAgent(def) + markdown-driven agents — feat(appkit): agents() plugin, createAgent(def), and markdown-driven agents #304
  5. fromPlugin() DX + runAgent plugins arg + toolkit-resolver — feat(appkit): fromPlugin() DX, runAgent plugins arg, shared toolkit-resolver #305
  6. Reference app + dev-playground + docs — feat(appkit): reference agent-app, dev-playground chat UI, docs, and template #306

The v2 stack reorganizes the same work so no PR ships API that a later PR deletes. Start at #301 for the new entry point. Branches from this older stack are preserved unchanged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant