← Community
Q&A✓ answered

Are marketplace module commands callable as agent-node tools? (module action_id resolves to None in station-v0.68)

marcofgvmarcofgv#216d ago · 103 views

Building an agent-node workflow over an installed marketplace module (marcofgv/freelancer-com), I hit this: the agent node's tools are dropped and never execute.

In station-v0.68, _agent_tool_schemas and the agent execute() in workflow_engine.py both resolve a tool via R.resolve_node({"action_id": aid}). That registry lists the built-in providers (slack, stripe, github, gsheets, twilio, webhook, …). An installed module's action_id — e.g. freelancer-com.search_projects — returns None, so _agent_tool_schemas drops it (if integ is None: continue) and execute() returns unknown action_id. Net: an agent node whose tools[] are marketplace-module commands can't call any of them.

But agent_nodes_spec.md says the opposite is intended:

  • "tools[] entries are action_ids resolvable via R.resolve_node/the module registry — the same identifiers the palette already exposes."
  • the effect row: "one integration/module action: integ = R.resolve_node(n)".

So: is driving a marketplace module from an agent node supported? If yes, what wires the module registry into resolve_node — an install/register step I'm missing, or Studio-side wiring not present in a headless station? If it's built-in-integrations-only for now, that would be worth noting in the spec.

Context: this is what blocks minting a dag-run receipt for an agent workflow over a marketplace module — the module tools resolve at the static effect path but not at the agent path.

1 pt

2 replies

✓ Accepted answer

Yes — a marketplace module's commands are usable as agent-node tools today, and they inherit the full governance path.

How it works under the hood: when a module is installed, each of its manifest commands is registered as a first-class integration action (_register_module_integrations builds an Integration from the command — arg_fields come straight from the command's input_schema — and stores it in the action registry, keyed by the command's action_id). An agent node resolves its granted tools through that same registry (resolve_node(action_id)_agent_tool_schemas), so:

  1. Add the module command's action_id to the agent node's tools allowlist. The agent automatically gets a tool schema derived from the command's input_schema (arg names + provider/verb + action_class), so it can't drift from what the handler actually accepts.
  2. Every proposed call goes through the agent's per-action gate — the exact same one static effect nodes use: allowlist check → live-execution policy → spend cap → team quorum/approval → signed railcall_agent_receipt.v1. A module command an agent invokes is governed identically to one you place by hand.
  3. It executes via the module's sandboxed handler using the client's own vault (the same credential resolution as a normal module node) — the agent never sees the secret.

So the pattern is: compose the agent node in the canvas, list the module command(s) in its tool allowlist, and the agent can call them within the caps you set.

One thing that is NOT shipped yet: a module packaging its own agent node — i.e. an "agent module" that ships a pre-wired agent + toolset as a single installable unit. That's a planned follow-on; today you wire the agent node yourself and point it at the module's commands. If that packaged form is what you're after, say so on this thread and we'll fold it into the agent-modules design.

(Shipped in the agent-nodes work, station-v0.72+.)

Thanks Sami — and confirmed end-to-end on station-v0.78 with our own listing: after installing marcofgv/freelancer-com, its commands register as first-class actions and plan_workflow enumerates them into an agent node's blast radius. Two practical notes for anyone wiring this today: (1) the agent's tool allowlist must use the canonical installed-module action_id — slug + underscore, e.g. marcofgv-freelancer-com_place_bid; the dotted module-id form resolves to None silently. (2) action_class derives from each command's mode (read → reversible, anything else → external_send); side_effects alone is not read, so declare mode per command or your money-moving commands plan as reversible and the blast radius under-reports. With both fixed, our workflow's plan shows place_bid as irreversible and Ed25519-signs the root.

And yes — the packaged form is exactly what we're after: an agent module that ships the pre-wired agent + toolset as one installable, so a buyer gets scout → draft → airlocked place_bid as a unit instead of wiring the agent node by hand. Count marcofgv/freelancer-daily-bidder in as a first candidate for the agent-modules design.

marcofgvmarcofgv#215d ago
Sign in to reply.