@pmcollab/coworkstream-engine-msagent
v0.1.0
Published
Microsoft Agent Framework AgentRunner adapter for @pmcollab/coworkstream-engine. Wraps an in-process MAF agent (when available in JS) or an MAF-hosted HTTP endpoint.
Readme
@pmcollab/coworkstream-engine-msagent
Coding agents: read
packages/workstream-engine/AGENTS.mdfor the engine integration recipe before wiring this adapter. Migrating an existing setup? Seepackages/workstream-engine/MIGRATION.md.
Microsoft Agent Framework (MAF) adapter for @pmcollab/coworkstream-engine. Two flavors: in-process (when an MAF agent is available in JS) and HTTP-hosted (the typical deployment, where MAF runs in Python or .NET).
Install
npm install @pmcollab/coworkstream-engine-msagent @pmcollab/coworkstream-engine-httpIn-process
Use this when you have an MAF-style agent already running in your Node process (e.g. via a future MAF JS SDK or a hand-rolled wrapper that exposes .run(input)).
import { createMSAgentAgent } from '@pmcollab/coworkstream-engine-msagent'
const agent = createMSAgentAgent({
id: 'risk',
agent: myMAFAgent, // anything with .run(input) → Promise<output>
toInput: (item) => ({ messages: [{ role: 'user', content: item.title }], item }),
extractPosition: (result) => ({
position: result.position,
reasoning: result.reasoning,
confidence: result.confidence,
}),
})HTTP-hosted (typical)
Use this when your MAF agent runs in Python or .NET behind HTTP. This is the recommended pattern as of 2026 — MAF's JS support is limited; Python and .NET are first-class.
import { createMSAgentHttpAgent } from '@pmcollab/coworkstream-engine-msagent'
const agent = createMSAgentHttpAgent({
id: 'risk-py',
url: 'https://maf.internal.example.com/agent/run',
agentId: 'risk-reviewer-v3',
headers: { authorization: `Bearer ${process.env.MAF_TOKEN}` },
})Server contract
POST <url>
Content-Type: application/json
{
"input": {
"messages": [{ "role": "user", "content": "..." }],
"item": { /* WorkStreamItem */ },
"ctx": { "trust": 0.5 }
},
"agent_id": "risk-reviewer-v3"
}Response (preferred, structured):
{ "position": "approve", "reasoning": "within budget", "confidence": 0.85 }Response (MAF default — last assistant message holds the answer; we extract it as reasoning):
{
"output": {
"messages": [
{ "role": "assistant", "content": "I would approve. The budget impact is within tolerance." }
]
}
}Why a separate package from -http?
workstream-engine-http is generic. This package adds MAF-specific request/response shaping so wiring is one line, plus a 🪟 default avatar that distinguishes MAF-backed agents from generic HTTP ones in the multi-agent UI.
License
Commercial. See LICENSE in the repository root.
