cpa-agents 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,146 @@
1
+ # cpa-agents
2
+
3
+ Concurrent Process Algebra for AI Agents. Applies π-calculus process algebra to agent orchestration in [Pi Harness](https://github.com/badlogic/pi-mono) and [OpenClaw](https://github.com/openclaw/openclaw).
4
+
5
+ ## Why
6
+
7
+ AI agent harnesses have ad-hoc concurrency: spawn a subprocess, hope it works, manually wire results back. Pi Harness has session trees with branching. OpenClaw has a ReAct loop with skills. Neither has a formal model for what happens when agent tasks run concurrently, need to communicate, or branch to fix errors before continuing.
8
+
9
+ This library gives you that model. The primitives come from Robin Milner's π-calculus — the same theory behind BPMN, BPEL, and every serious workflow engine — but adapted for the specific patterns AI coding agents actually use.
10
+
11
+ ## Core concepts
12
+
13
+ | π-calculus | cpa-agents | What it does |
14
+ |---|---|---|
15
+ | `ā⟨v⟩.P` | `ch.send(v)` | Send value on channel, then continue |
16
+ | `a(x).P` | `ch.receive()` | Receive value from channel, then continue |
17
+ | `P \| Q` | `par(P, Q)` | Run P and Q concurrently |
18
+ | `P + Q` | `choice([...])` | Wait for first channel that fires |
19
+ | `ν(x).P` | `restrict(name, body)` | Create a fresh scoped channel |
20
+ | `!P` | `replicate(trigger, handler)` | Spawn new P for each incoming message |
21
+
22
+ ## Usage
23
+
24
+ ### Branch-fix-continue (the tree pattern)
25
+
26
+ The pattern you see in Pi Harness session trees: coding along, hitting a lint error, branching to fix it, then resuming.
27
+
28
+ ```typescript
29
+ import { branchFix, Scheduler } from 'cpa-agents';
30
+
31
+ const workflow = branchFix<string>({
32
+ name: 'implement-feature',
33
+ maxFixes: 3,
34
+
35
+ main: (requestFix) => async (ctx) => {
36
+ const code = await coder.invoke('add auth middleware', ctx.signal);
37
+ const check = await linter.invoke(code, ctx.signal);
38
+
39
+ if (!check.pass) {
40
+ // Branch: pause main, run fix, then continue here
41
+ await requestFix(check.errors.join('; '));
42
+ }
43
+
44
+ return code;
45
+ },
46
+
47
+ fix: (reason) => async (ctx) => {
48
+ await fixer.invoke(reason, ctx.signal);
49
+ },
50
+ });
51
+
52
+ const scheduler = new Scheduler({ timeout: 60_000 });
53
+ const result = await scheduler.run('feature', workflow);
54
+ // result.sessionTree shows the full branch history
55
+ ```
56
+
57
+ ### Parallel agents
58
+
59
+ ```typescript
60
+ import { par, agentProcess } from 'cpa-agents';
61
+
62
+ const research = par(
63
+ agentProcess(webSearchAgent, 'latest React patterns'),
64
+ agentProcess(codeSearchAgent, 'auth middleware examples'),
65
+ agentProcess(docSearchAgent, 'project conventions'),
66
+ );
67
+
68
+ const [web, code, docs] = await scheduler.run('research', research);
69
+ ```
70
+
71
+ ### Channel communication between agents
72
+
73
+ ```typescript
74
+ import { Channel, restrict, par } from 'cpa-agents';
75
+
76
+ const workflow = restrict<CodeReview, void>('review-ch', (ch) =>
77
+ par(
78
+ // Agent 1: write code, send for review
79
+ async (ctx) => {
80
+ const code = await coder.invoke(task, ctx.signal);
81
+ await ch.send({ code, file: 'auth.ts' });
82
+ },
83
+ // Agent 2: receive code, review it
84
+ async (ctx) => {
85
+ const review = await ch.receive();
86
+ await reviewer.invoke(review, ctx.signal);
87
+ },
88
+ )
89
+ );
90
+ ```
91
+
92
+ ### Pi Harness integration
93
+
94
+ ```typescript
95
+ // .pi/extensions/cpa.ts
96
+ import { createPiCpaExtension } from 'cpa-agents/adapters/pi';
97
+ export default createPiCpaExtension();
98
+
99
+ // Then in Pi:
100
+ // /cpa:par implement auth | write tests | update docs
101
+ // /cpa:fix refactor the database layer
102
+ // /cpa:tree
103
+ ```
104
+
105
+ ### OpenClaw integration
106
+
107
+ ```typescript
108
+ // ~/.openclaw/skills/cpa-agents/index.ts
109
+ import { createOpenClawSkill } from 'cpa-agents/adapters/openclaw';
110
+ export default createOpenClawSkill();
111
+
112
+ // Then via any messaging channel:
113
+ // "Run these tasks in parallel: research competitors, draft blog post"
114
+ // "Fix the auth module — branch and fix any type errors"
115
+ ```
116
+
117
+ ## Session tree
118
+
119
+ Every process execution produces a session tree — a record of all spawns, branches, fixes, and completions. This maps directly to Pi Harness's `/tree` view and OpenClaw's session logs.
120
+
121
+ ```typescript
122
+ const result = await scheduler.run('workflow', myProcess);
123
+
124
+ for (const node of result.sessionTree) {
125
+ console.log(node.name, node.runId);
126
+ for (const child of node.children) {
127
+ console.log(' └─', child.name);
128
+ }
129
+ }
130
+ ```
131
+
132
+ The trace is also available as a flat event log via `scheduler.getTrace()`, suitable for serialization to OpenClaw's workspace files or Pi's session JSONL format.
133
+
134
+ ## Design decisions
135
+
136
+ **Synchronous rendezvous channels**, not buffered queues. A `send` blocks until a `receive` matches it. This is the π-calculus default and prevents the subtle bugs you get when messages pile up in buffers unobserved.
137
+
138
+ **Cooperative scheduling** via async/await, not preemptive. LLM calls are inherently async and long-running. The scheduler doesn't need to timeslice — it just needs to manage the dependency graph.
139
+
140
+ **Typed channels**. `Channel<T>` carries values of type T. This catches mismatched agent interfaces at compile time rather than runtime.
141
+
142
+ **Trace-first**. Every operation emits trace events. The session tree isn't reconstructed after the fact — it's built as processes execute, so you can inspect it mid-run.
143
+
144
+ ## License
145
+
146
+ MIT
@@ -0,0 +1,49 @@
1
+ /**
2
+ * OpenClaw adapter
3
+ *
4
+ * Integrates cpa-agents as an OpenClaw skill.
5
+ */
6
+ import { type TraceEvent, type SessionNode } from "../process.js";
7
+ import { type AgentCall } from "../agent.js";
8
+ import { type SchedulerResult } from "../scheduler.js";
9
+ export declare const SKILL_MD = "# cpa-agents \u2014 Concurrent Process Algebra\n\nOrchestrate complex multi-step agent workflows using formal\nprocess algebra primitives. Supports parallel execution,\nbranch-fix-continue patterns, and supervised error recovery.\n\n## Commands\n\n- `cpa:parallel` \u2014 Run multiple tasks concurrently\n- `cpa:pipeline` \u2014 Chain tasks sequentially\n- `cpa:branch-fix` \u2014 Run a task with automatic error correction branching\n- `cpa:fan-out` \u2014 Send same task to multiple models, merge results\n- `cpa:status` \u2014 Show running process tree\n\n## When to use\n\nUse this skill when:\n- You need to run multiple independent tasks at the same time\n- A task might fail and needs automatic retry/fix before continuing\n- You want to compare outputs from different approaches\n- Complex workflows with dependencies between steps\n";
10
+ export declare function openclawTool<TInput, TOutput>(opts: {
11
+ name: string;
12
+ tool: string;
13
+ buildArgs: (input: TInput) => Record<string, unknown>;
14
+ parseResult: (raw: unknown) => TOutput;
15
+ }): AgentCall<TInput, TOutput>;
16
+ export declare function workspaceAgent(opts: {
17
+ name: string;
18
+ workspacePath?: string;
19
+ }): {
20
+ readMemory: AgentCall<string, string>;
21
+ writeMemory: AgentCall<{
22
+ key: string;
23
+ value: string;
24
+ }, void>;
25
+ };
26
+ interface OpenClawContext {
27
+ session?: {
28
+ id: string;
29
+ appendEvent?: (event: TraceEvent) => void;
30
+ };
31
+ agent: {
32
+ run: (task: string, opts?: {
33
+ signal?: AbortSignal;
34
+ model?: string;
35
+ }) => Promise<{
36
+ output: string;
37
+ errors?: string[];
38
+ }>;
39
+ };
40
+ }
41
+ export declare function createOpenClawSkill(): {
42
+ name: string;
43
+ version: string;
44
+ skillMd: string;
45
+ handleCommand(command: string, args: Record<string, unknown>, openclawCtx: OpenClawContext): Promise<SchedulerResult<unknown>>;
46
+ };
47
+ export declare function sessionTreeToMarkdown(nodes: SessionNode[], depth?: number): string;
48
+ export {};
49
+ //# sourceMappingURL=openclaw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw.d.ts","sourceRoot":"","sources":["../../src/adapters/openclaw.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,WAAW,EAGjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,SAAS,EAAwB,MAAM,aAAa,CAAC;AACnE,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIlE,eAAO,MAAM,QAAQ,80BAqBpB,CAAC;AAIF,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtD,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;CACxC,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAU7B;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG;IACF,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,WAAW,EAAE,SAAS,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,IAAI,CAAC,CAAC;CAC9D,CAkBA;AAID,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;KAC3C,CAAC;IACF,KAAK,EAAE;QACL,GAAG,EAAE,CACH,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,WAAW,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,KAC5C,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAC;KACrD,CAAC;CACH;AAED,wBAAgB,mBAAmB;;;;2BASpB,MAAM,QACT,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,eAChB,eAAe,GAC3B,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;EAkHvC;AAID,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,WAAW,EAAE,EACpB,KAAK,SAAI,GACR,MAAM,CAsCR"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * OpenClaw adapter
3
+ *
4
+ * Integrates cpa-agents as an OpenClaw skill.
5
+ */
6
+ import { par, branchFix, } from "../process.js";
7
+ import { agentProcess, fanOut } from "../agent.js";
8
+ import { Scheduler } from "../scheduler.js";
9
+ // ─── SKILL.md content ───────────────────────────────────────────
10
+ export const SKILL_MD = `# cpa-agents — Concurrent Process Algebra
11
+
12
+ Orchestrate complex multi-step agent workflows using formal
13
+ process algebra primitives. Supports parallel execution,
14
+ branch-fix-continue patterns, and supervised error recovery.
15
+
16
+ ## Commands
17
+
18
+ - \`cpa:parallel\` — Run multiple tasks concurrently
19
+ - \`cpa:pipeline\` — Chain tasks sequentially
20
+ - \`cpa:branch-fix\` — Run a task with automatic error correction branching
21
+ - \`cpa:fan-out\` — Send same task to multiple models, merge results
22
+ - \`cpa:status\` — Show running process tree
23
+
24
+ ## When to use
25
+
26
+ Use this skill when:
27
+ - You need to run multiple independent tasks at the same time
28
+ - A task might fail and needs automatic retry/fix before continuing
29
+ - You want to compare outputs from different approaches
30
+ - Complex workflows with dependencies between steps
31
+ `;
32
+ // ─── OpenClaw tool wrappers ─────────────────────────────────────
33
+ export function openclawTool(opts) {
34
+ return {
35
+ name: `openclaw:${opts.name}`,
36
+ invoke: async (_input, _signal) => {
37
+ throw new Error(`openclawTool(${opts.name}): Gateway not connected. ` +
38
+ `Ensure OpenClaw Gateway is running on ws://127.0.0.1:18789`);
39
+ },
40
+ };
41
+ }
42
+ export function workspaceAgent(opts) {
43
+ return {
44
+ readMemory: {
45
+ name: `workspace:read:${opts.name}`,
46
+ invoke: async (_key, _signal) => {
47
+ throw new Error("Workspace bridge not connected");
48
+ },
49
+ },
50
+ writeMemory: {
51
+ name: `workspace:write:${opts.name}`,
52
+ invoke: async (_input, _signal) => {
53
+ throw new Error("Workspace bridge not connected");
54
+ },
55
+ },
56
+ };
57
+ }
58
+ export function createOpenClawSkill() {
59
+ const schedulers = new Map();
60
+ return {
61
+ name: "cpa-agents",
62
+ version: "0.1.0",
63
+ skillMd: SKILL_MD,
64
+ async handleCommand(command, args, openclawCtx) {
65
+ const scheduler = new Scheduler({
66
+ timeout: args.timeout ?? 300_000,
67
+ onTrace: (e) => {
68
+ openclawCtx.session?.appendEvent?.(e);
69
+ },
70
+ });
71
+ const sessionId = openclawCtx.session?.id ?? "unknown";
72
+ schedulers.set(sessionId, scheduler);
73
+ try {
74
+ switch (command) {
75
+ case "parallel": {
76
+ const tasks = args.tasks;
77
+ const processes = tasks.map((task) => agentProcess({
78
+ name: task.slice(0, 30),
79
+ invoke: async (_, signal) => {
80
+ return openclawCtx.agent.run(task, { signal });
81
+ },
82
+ }, undefined));
83
+ return scheduler.run("parallel", par(...processes));
84
+ }
85
+ case "branch-fix": {
86
+ const task = args.task;
87
+ const proc = branchFix({
88
+ name: "openclaw-fix",
89
+ main: (requestFix) => async (ctx) => {
90
+ const result = await openclawCtx.agent.run(task, {
91
+ signal: ctx.signal,
92
+ });
93
+ if (result.errors?.length) {
94
+ await requestFix(result.errors.join("; "));
95
+ }
96
+ return result.output;
97
+ },
98
+ fix: (reason) => async (ctx) => {
99
+ await openclawCtx.agent.run(`Fix the following issues: ${reason}`, { signal: ctx.signal });
100
+ },
101
+ });
102
+ return scheduler.run("branch-fix", proc);
103
+ }
104
+ case "fan-out": {
105
+ const task = args.task;
106
+ const models = args.models ?? [
107
+ "claude-sonnet-4-20250514",
108
+ "gpt-4o",
109
+ ];
110
+ const agents = models.map((model) => ({
111
+ name: `model:${model}`,
112
+ invoke: async (input, signal) => {
113
+ const result = await openclawCtx.agent.run(input, {
114
+ model,
115
+ signal,
116
+ });
117
+ return result.output;
118
+ },
119
+ }));
120
+ const proc = fanOut({
121
+ agents,
122
+ input: task,
123
+ merge: (results) => ({
124
+ results,
125
+ consensus: results.length,
126
+ }),
127
+ });
128
+ return scheduler.run("fan-out", proc);
129
+ }
130
+ case "status": {
131
+ const s = schedulers.get(sessionId);
132
+ if (!s) {
133
+ return {
134
+ success: true,
135
+ value: { message: "No active CPA processes" },
136
+ trace: scheduler["trace"],
137
+ sessionTree: [],
138
+ };
139
+ }
140
+ return {
141
+ success: true,
142
+ value: { tree: s.getSessionTree() },
143
+ trace: s["trace"],
144
+ sessionTree: s.getSessionTree(),
145
+ };
146
+ }
147
+ default:
148
+ throw new Error(`Unknown CPA command: ${command}`);
149
+ }
150
+ }
151
+ finally {
152
+ schedulers.delete(sessionId);
153
+ }
154
+ },
155
+ };
156
+ }
157
+ // ─── Session tree serialization ─────────────────────────────────
158
+ export function sessionTreeToMarkdown(nodes, depth = 0) {
159
+ const indent = " ".repeat(depth);
160
+ let md = "";
161
+ for (const node of nodes) {
162
+ const status = node.events.some((e) => e.type === "error")
163
+ ? "error"
164
+ : node.events.some((e) => e.type === "done")
165
+ ? "done"
166
+ : "running";
167
+ md += `${indent}- **${node.name}** (${node.runId}) [${status}]\n`;
168
+ const branches = node.events.filter((e) => e.type === "branch");
169
+ for (const b of branches) {
170
+ if (b.type === "branch") {
171
+ md += `${indent} - Branch: chose "${b.chosen}" from [${b.alternatives.join(", ")}]\n`;
172
+ }
173
+ }
174
+ const fixes = node.events.filter((e) => e.type === "fix_start" || e.type === "fix_end");
175
+ for (const f of fixes) {
176
+ if (f.type === "fix_start") {
177
+ md += `${indent} - Fix started: ${f.reason}\n`;
178
+ }
179
+ }
180
+ if (node.children.length > 0) {
181
+ md += sessionTreeToMarkdown(node.children, depth + 1);
182
+ }
183
+ }
184
+ return md;
185
+ }
186
+ //# sourceMappingURL=openclaw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/adapters/openclaw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Pi Harness adapter
3
+ */
4
+ import { type AgentCall } from "../agent.js";
5
+ export declare function piTool<TInput, TOutput>(opts: {
6
+ name: string;
7
+ tool: string;
8
+ buildArgs: (input: TInput) => Record<string, unknown>;
9
+ parseResult: (raw: string) => TOutput;
10
+ }): AgentCall<TInput, TOutput>;
11
+ export declare function piSubAgent<TOutput>(opts: {
12
+ name: string;
13
+ prompt: string;
14
+ model?: string;
15
+ parseResult: (sessionOutput: string) => TOutput;
16
+ }): AgentCall<void, TOutput>;
17
+ export declare function createPiCpaExtension(): {
18
+ name: string;
19
+ version: string;
20
+ description: string;
21
+ commands: {
22
+ "cpa:par": {
23
+ description: string;
24
+ handler: (args: string, piCtx: Record<string, any>) => Promise<import("../scheduler.js").SchedulerResult<string[]>>;
25
+ };
26
+ "cpa:fix": {
27
+ description: string;
28
+ handler: (args: string, piCtx: Record<string, any>) => Promise<import("../scheduler.js").SchedulerResult<string>>;
29
+ };
30
+ "cpa:tree": {
31
+ description: string;
32
+ handler: (_args: string, _piCtx: Record<string, any>) => Promise<{
33
+ message: string;
34
+ }>;
35
+ };
36
+ };
37
+ };
38
+ //# sourceMappingURL=pi-harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-harness.d.ts","sourceRoot":"","sources":["../../src/adapters/pi-harness.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,EAAE,KAAK,SAAS,EAA6B,MAAM,aAAa,CAAC;AAGxE,wBAAgB,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtD,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACvC,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAU7B;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC;CACjD,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAS3B;AAED,wBAAgB,oBAAoB;;;;;;;4BASN,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;4BAwBlC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;6BA2BjC,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;;EAMjE"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Pi Harness adapter
3
+ */
4
+ import { par, } from "../process.js";
5
+ import { agentProcess, codeThenFix } from "../agent.js";
6
+ import { Scheduler } from "../scheduler.js";
7
+ export function piTool(opts) {
8
+ return {
9
+ name: `pi:${opts.name}`,
10
+ invoke: async (_input, _signal) => {
11
+ throw new Error(`piTool(${opts.name}): RPC bridge not connected. ` +
12
+ `Run Pi in RPC mode and configure the bridge.`);
13
+ },
14
+ };
15
+ }
16
+ export function piSubAgent(opts) {
17
+ return {
18
+ name: `pi:subagent:${opts.name}`,
19
+ invoke: async (_, _signal) => {
20
+ throw new Error(`piSubAgent(${opts.name}): sub-agent bridge not connected.`);
21
+ },
22
+ };
23
+ }
24
+ export function createPiCpaExtension() {
25
+ return {
26
+ name: "cpa-agents",
27
+ version: "0.1.0",
28
+ description: "Concurrent Process Algebra for AI agent orchestration",
29
+ commands: {
30
+ "cpa:par": {
31
+ description: "Run tasks in parallel using process algebra",
32
+ handler: async (args, piCtx) => {
33
+ const tasks = args.split("|").map((t) => t.trim());
34
+ const scheduler = new Scheduler({
35
+ onTrace: (e) => piCtx.log?.(`[cpa] ${e.type}: ${e.runId}`),
36
+ });
37
+ const processes = tasks.map((task) => piSubAgent({
38
+ name: task.slice(0, 30),
39
+ prompt: task,
40
+ parseResult: (out) => out,
41
+ }));
42
+ const parallelProc = par(...processes.map((p) => agentProcess(p, undefined)));
43
+ return scheduler.run("par", parallelProc);
44
+ },
45
+ },
46
+ "cpa:fix": {
47
+ description: "Run a task with automatic fix-on-error branching",
48
+ handler: async (args, piCtx) => {
49
+ const scheduler = new Scheduler({
50
+ onTrace: (e) => piCtx.log?.(`[cpa] ${e.type}: ${e.runId}`),
51
+ });
52
+ const coder = {
53
+ name: "coder",
54
+ invoke: async (task, _signal) => `// TODO: implement ${task}`,
55
+ };
56
+ const checker = {
57
+ name: "checker",
58
+ invoke: async (_code, _signal) => ({ pass: true, errors: [] }),
59
+ };
60
+ const fixer = {
61
+ name: "fixer",
62
+ invoke: async (input, _signal) => input.code,
63
+ };
64
+ const proc = codeThenFix({ coder, checker, fixer, task: args });
65
+ return scheduler.run("fix", proc);
66
+ },
67
+ },
68
+ "cpa:tree": {
69
+ description: "Display the CPA session tree",
70
+ handler: async (_args, _piCtx) => {
71
+ return { message: "Session tree display (see trace output)" };
72
+ },
73
+ },
74
+ },
75
+ };
76
+ }
77
+ //# sourceMappingURL=pi-harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-harness.js","sourceRoot":"","sources":["../../src/adapters/pi-harness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * AgentProcess: bridges the process algebra to actual LLM agent calls.
3
+ *
4
+ * An AgentProcess wraps an LLM invocation (tool use loop, ReAct step,
5
+ * or sub-agent spawn) as a Process<T> that can be composed with
6
+ * all the algebra combinators.
7
+ */
8
+ import { type Process } from "./process.js";
9
+ export interface AgentCall<TInput, TOutput> {
10
+ /** Human-readable name for traces */
11
+ name: string;
12
+ /** The actual agent invocation */
13
+ invoke: (input: TInput, signal: AbortSignal) => Promise<TOutput>;
14
+ }
15
+ /**
16
+ * Lift an agent call into a Process.
17
+ */
18
+ export declare function agentProcess<TInput, TOutput>(agent: AgentCall<TInput, TOutput>, input: TInput): Process<TOutput>;
19
+ /**
20
+ * Code-then-fix: the tree pattern from Pi Harness.
21
+ *
22
+ * 1. Agent writes code
23
+ * 2. Lint/test/typecheck runs
24
+ * 3. If errors found → branch to fix agent → re-check → continue
25
+ * 4. If clean → proceed to next task
26
+ */
27
+ export declare function codeThenFix<TCode>(opts: {
28
+ coder: AgentCall<string, TCode>;
29
+ checker: AgentCall<TCode, CheckResult>;
30
+ fixer: AgentCall<{
31
+ code: TCode;
32
+ errors: string[];
33
+ }, TCode>;
34
+ task: string;
35
+ maxFixes?: number;
36
+ }): Process<TCode>;
37
+ export interface CheckResult {
38
+ pass: boolean;
39
+ errors: string[];
40
+ }
41
+ /**
42
+ * Fan-out pattern: send the same task to N agents in parallel,
43
+ * collect results, then merge.
44
+ *
45
+ * Useful for: parallel research, multi-model consensus, ensemble.
46
+ */
47
+ export declare function fanOut<TInput, TOutput, TMerged>(opts: {
48
+ agents: AgentCall<TInput, TOutput>[];
49
+ input: TInput;
50
+ merge: (results: TOutput[]) => TMerged;
51
+ }): Process<TMerged>;
52
+ /**
53
+ * Pipeline: chain agents sequentially where each output feeds the next.
54
+ */
55
+ export declare function pipeline<A, B>(a: AgentCall<A, B>, inputA: A): PipelineBuilder<A, B>;
56
+ export declare class PipelineBuilder<TFirst, TLast> {
57
+ private steps;
58
+ private firstAgent;
59
+ private firstInput;
60
+ constructor(agent: AgentCall<TFirst, any>, input: TFirst);
61
+ then<TNext>(agent: AgentCall<TLast, TNext>, transform?: (prev: TLast) => TLast): PipelineBuilder<TFirst, TNext>;
62
+ build(): Process<TLast>;
63
+ }
64
+ /**
65
+ * Handoff: one agent works, then hands off to another via a channel.
66
+ * Models the Pi Harness pattern of sub-agent spawning.
67
+ */
68
+ export declare function handoff<THandoff>(opts: {
69
+ from: AgentCall<void, THandoff>;
70
+ to: AgentCall<THandoff, void>;
71
+ }): Process<void>;
72
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,KAAK,OAAO,EAA4C,MAAM,cAAc,CAAC;AAItF,MAAM,WAAW,SAAS,CAAC,MAAM,EAAE,OAAO;IACxC,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAClE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,EAC1C,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAoBlB;AAID;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE;IACvC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAChC,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACvC,KAAK,EAAE,SAAS,CAAC;QAAE,IAAI,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,KAAK,CAAC,CAAC;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,KAAK,CAAC,CA0CjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IACrD,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;CACxC,GAAG,OAAO,CAAC,OAAO,CAAC,CASnB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAC3B,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAClB,MAAM,EAAE,CAAC,GACR,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAQzB,qBAAa,eAAe,CAAC,MAAM,EAAE,KAAK;IACxC,OAAO,CAAC,KAAK,CAA2E;IACxF,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,UAAU,CAAS;gBAEf,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM;IAKxD,IAAI,CAAC,KAAK,EACR,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,EAC9B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,KAAK,GACjC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC;IAKjC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;CAcxB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE;IACtC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChC,EAAE,EAAE,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;CAC/B,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhB"}