cpa-agents 0.1.0 → 0.2.2

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/README.md CHANGED
@@ -1,14 +1,44 @@
1
1
  # cpa-agents
2
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).
3
+ Concurrent Process Algebra for AI Agents.
4
4
 
5
- ## Why
5
+ `cpa-agents` combines three layers:
6
+ - process algebra (pi-calculus primitives for concurrency/communication)
7
+ - fork algebra (relational composition and paired derivations)
8
+ - operator algebra (practical control flow: rollback, retries, guards, timeout)
9
+
10
+ Designed for [Pi Harness](https://github.com/badlogic/pi-mono), [OpenClaw](https://github.com/openclaw/openclaw), and standalone TypeScript workflows.
11
+
12
+ ## Install
13
+
14
+ ```bash
15
+ npm install cpa-agents
16
+ ```
17
+
18
+ ## Quick start
19
+
20
+ ```typescript
21
+ import { Scheduler, par, agentProcess } from "cpa-agents";
22
+
23
+ const scheduler = new Scheduler({ timeout: 60_000 });
6
24
 
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.
25
+ const research = par(
26
+ agentProcess(webSearchAgent, "latest React patterns"),
27
+ agentProcess(codeSearchAgent, "auth middleware examples"),
28
+ );
29
+
30
+ const result = await scheduler.run("research", research);
31
+ ```
32
+
33
+ ## Why
8
34
 
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.
35
+ Most agent harnesses implement orchestration with ad-hoc control flow and minimal runtime semantics. This library provides formal, typed primitives for:
36
+ - concurrent task execution
37
+ - explicit synchronization and communication
38
+ - fix-and-resume branching
39
+ - provenance and rollback-aware workflows
10
40
 
11
- ## Core concepts
41
+ ## Layer 1: Process algebra
12
42
 
13
43
  | π-calculus | cpa-agents | What it does |
14
44
  |---|---|---|
@@ -19,26 +49,28 @@ This library gives you that model. The primitives come from Robin Milner's π-ca
19
49
  | `ν(x).P` | `restrict(name, body)` | Create a fresh scoped channel |
20
50
  | `!P` | `replicate(trigger, handler)` | Spawn new P for each incoming message |
21
51
 
22
- ## Usage
52
+ Core runtime exports:
53
+ - `Channel`, `select`
54
+ - `par`, `seq`, `choice`, `branchFix`, `restrict`, `replicate`, `supervisor`
55
+ - `Scheduler`
23
56
 
24
- ### Branch-fix-continue (the tree pattern)
57
+ ### Branch-fix-continue
25
58
 
26
- The pattern you see in Pi Harness session trees: coding along, hitting a lint error, branching to fix it, then resuming.
59
+ Pattern for "run -> detect error -> fix -> resume".
27
60
 
28
61
  ```typescript
29
- import { branchFix, Scheduler } from 'cpa-agents';
62
+ import { branchFix, Scheduler } from "cpa-agents";
30
63
 
31
64
  const workflow = branchFix<string>({
32
- name: 'implement-feature',
65
+ name: "implement-feature",
33
66
  maxFixes: 3,
34
67
 
35
68
  main: (requestFix) => async (ctx) => {
36
- const code = await coder.invoke('add auth middleware', ctx.signal);
69
+ const code = await coder.invoke("add auth middleware", ctx.signal);
37
70
  const check = await linter.invoke(code, ctx.signal);
38
71
 
39
72
  if (!check.pass) {
40
- // Branch: pause main, run fix, then continue here
41
- await requestFix(check.errors.join('; '));
73
+ await requestFix(check.errors.join("; "));
42
74
  }
43
75
 
44
76
  return code;
@@ -50,96 +82,121 @@ const workflow = branchFix<string>({
50
82
  });
51
83
 
52
84
  const scheduler = new Scheduler({ timeout: 60_000 });
53
- const result = await scheduler.run('feature', workflow);
54
- // result.sessionTree shows the full branch history
85
+ const result = await scheduler.run("feature", workflow);
55
86
  ```
56
87
 
57
- ### Parallel agents
88
+ ## Layer 2: Fork algebra (relations)
89
+
90
+ Fork algebra models relation composition and paired derivations over the same input.
58
91
 
59
92
  ```typescript
60
- import { par, agentProcess } from 'cpa-agents';
93
+ import { rel, fork, compose, meet, join, toProcess } from "cpa-agents";
61
94
 
62
- const research = par(
63
- agentProcess(webSearchAgent, 'latest React patterns'),
64
- agentProcess(codeSearchAgent, 'auth middleware examples'),
65
- agentProcess(docSearchAgent, 'project conventions'),
66
- );
95
+ const parse = rel("parse", async (input: string) => [input.trim()]);
96
+ const enrich = rel("enrich", async (input: string) => [`${input}:meta`]);
97
+ const validate = rel("validate", async (input: string) => [input.length > 0 ? "ok" : "bad"]);
98
+
99
+ const composed = compose(parse, enrich);
100
+ const paired = fork(enrich, validate);
67
101
 
68
- const [web, code, docs] = await scheduler.run('research', research);
102
+ const proc = toProcess(composed, "task payload", "all");
103
+ const run = await scheduler.run("fork-layer", proc);
69
104
  ```
70
105
 
71
- ### Channel communication between agents
106
+ Key exports:
107
+ - `rel`, `detRel`
108
+ - `compose`, `fork`, `forkN`
109
+ - `converse` (provenance mapping, not rollback)
110
+ - `meet`, `join`, `identity`, `empty`
111
+ - `proj1`, `proj2`, `domRestrict`, `ranRestrict`
112
+ - `toProcess`, `forkToProcess`, `verifyAxioms`
72
113
 
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
- ```
114
+ ## Layer 3: Operator algebra (control flow)
91
115
 
92
- ### Pi Harness integration
116
+ Operator layer provides shell-style and reliability-focused control flow.
93
117
 
94
118
  ```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
119
+ import {
120
+ and,
121
+ or,
122
+ pipe,
123
+ saga,
124
+ invertible,
125
+ retryWithBackoff,
126
+ timeout,
127
+ } from "cpa-agents";
128
+
129
+ const guardedDeploy = and(buildProcess, deployProcess); // A && B
130
+ const withFallback = or(primaryProcess, fallbackProcess); // A || B
131
+ const piped = pipe(fetchProcess, (data) => transformProcess(data)); // A | B
132
+
133
+ const transactional = saga([
134
+ invertible(createBranch, deleteBranch),
135
+ invertible(writeChanges, revertChanges),
136
+ invertible(runChecks, cleanupChecks),
137
+ ]);
138
+
139
+ const resilient = retryWithBackoff({
140
+ process: timeout(30_000, transactional),
141
+ maxAttempts: 3,
142
+ });
103
143
  ```
104
144
 
105
- ### OpenClaw integration
145
+ Key exports:
146
+ - `attempt`, `unwrap`
147
+ - `and`, `or`, `ifThenElse`, `pipe`, `pipeChain`
148
+ - `bg`, `waitAll`, `not`, `andChain`, `orChain`, `subshell`
149
+ - `invertible`, `runInvertible`, `saga`
150
+ - `guard`, `guardValue`, `timeout`, `retryWithBackoff`
151
+
152
+ ## OpenClaw integration
106
153
 
107
154
  ```typescript
108
155
  // ~/.openclaw/skills/cpa-agents/index.ts
109
- import { createOpenClawSkill } from 'cpa-agents/adapters/openclaw';
156
+ import { createOpenClawSkill } from "cpa-agents/adapters/openclaw";
110
157
  export default createOpenClawSkill();
158
+ ```
159
+
160
+ Supported commands:
161
+ - `parallel`
162
+ - `branch-fix`
163
+ - `fan-out`
164
+ - `status`
111
165
 
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"
166
+ Skill authoring docs are in `skills/cpa-agents/SKILL.md`.
167
+
168
+ ## Pi Harness integration
169
+
170
+ ```typescript
171
+ // .pi/extensions/cpa.ts
172
+ import { createPiCpaExtension } from "cpa-agents/adapters/pi";
173
+ export default createPiCpaExtension();
115
174
  ```
116
175
 
117
- ## Session tree
176
+ ## Session tree and trace
118
177
 
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.
178
+ Every scheduler run emits:
179
+ - `sessionTree` (hierarchical execution tree)
180
+ - `trace` (flat event list)
120
181
 
121
182
  ```typescript
122
- const result = await scheduler.run('workflow', myProcess);
183
+ const result = await scheduler.run("workflow", myProcess);
123
184
 
124
185
  for (const node of result.sessionTree) {
125
186
  console.log(node.name, node.runId);
126
187
  for (const child of node.children) {
127
- console.log(' └─', child.name);
188
+ console.log(" └─", child.name);
128
189
  }
129
190
  }
130
191
  ```
131
192
 
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.
193
+ ## Development
133
194
 
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.
195
+ ```bash
196
+ npm run check
197
+ npm test
198
+ npm run coverage
199
+ ```
143
200
 
144
201
  ## License
145
202
 
@@ -6,7 +6,7 @@
6
6
  import { type TraceEvent, type SessionNode } from "../process.js";
7
7
  import { type AgentCall } from "../agent.js";
8
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";
9
+ export declare const SKILL_MD = "# cpa-agents \u2014 Concurrent Process Algebra\n\nUse process algebra primitives to orchestrate agent workflows in OpenClaw.\nThis skill is useful for parallel execution, branch-fix loops, fan-out\ncomparison, and inspecting workflow state.\n\n## Install\n\n### 1) Install library\n```bash\nnpm install cpa-agents\n```\n\n### 2) Create the skill entrypoint\n```ts\nimport { createOpenClawSkill } from \"cpa-agents/adapters/openclaw\";\n\nexport default createOpenClawSkill();\n```\n\n### 3) Ensure OpenClaw can execute skills\n- OpenClaw Gateway must be running.\n- Your skill runtime must allow async tool execution.\n- Keep this package at version `0.1.0` or newer.\n\n## Commands\n\n### cpa:parallel\nRun independent tasks concurrently.\n\nInput:\n```json\n{ \"tasks\": [\"task one\", \"task two\"], \"timeout\": 300000 }\n```\n\n### cpa:branch-fix\nRun task, detect errors, branch into a fix subprocess, then continue.\n\nInput:\n```json\n{ \"task\": \"implement feature with checks\", \"timeout\": 300000 }\n```\n\n### cpa:fan-out\nRun same task across multiple models and return merged results.\n\nInput:\n```json\n{ \"task\": \"draft API design\", \"models\": [\"model-a\", \"model-b\"], \"timeout\": 300000 }\n```\n\n### cpa:retry\nRetry a task with exponential backoff and per-attempt timeout.\n\nInput:\n```json\n{ \"task\": \"fix flaky test\", \"maxAttempts\": 3, \"initialDelayMs\": 250, \"stepTimeout\": 60000 }\n```\n\n### cpa:fallback\nRun fallback task if primary task fails.\n\nInput:\n```json\n{ \"primary\": \"run strict analyzer\", \"fallback\": \"run lightweight analyzer\" }\n```\n\n### cpa:saga\nRun multiple steps with rollback compensation on failure.\n\nInput:\n```json\n{ \"steps\": [\"create branch\", \"apply patch\", \"run validation\"] }\n```\n\n### cpa:status\nGet current process tree/status for the current session.\n\nInput:\n```json\n{}\n```\n\n## Recommended usage prompts\n\n- \"Run in parallel: analyze bug, propose fix, generate tests\"\n- \"Branch-fix this refactor until no type errors remain\"\n- \"Fan-out this architecture prompt across 2 models and compare\"\n- \"Show cpa status\"\n\n## Troubleshooting\n\n- **Gateway not connected**\n - Start OpenClaw Gateway and retry.\n- **Unknown command**\n - Use one of: `parallel`, `branch-fix`, `fan-out`, `retry`, `fallback`, `saga`, `status`.\n- **Timeout errors**\n - Increase `timeout` in command args.\n- **No session events**\n - Confirm session context has `appendEvent` enabled.\n";
10
10
  export declare function openclawTool<TInput, TOutput>(opts: {
11
11
  name: string;
12
12
  tool: string;
@@ -1 +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"}
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;AAEnE,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIlE,eAAO,MAAM,QAAQ,s7EAoGpB,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;EA4LvC;AAID,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,WAAW,EAAE,EACpB,KAAK,SAAI,GACR,MAAM,CAsCR"}
@@ -5,29 +5,109 @@
5
5
  */
6
6
  import { par, branchFix, } from "../process.js";
7
7
  import { agentProcess, fanOut } from "../agent.js";
8
+ import { invertible, or, retryWithBackoff, saga, timeout } from "../operators.js";
8
9
  import { Scheduler } from "../scheduler.js";
9
10
  // ─── SKILL.md content ───────────────────────────────────────────
10
11
  export const SKILL_MD = `# cpa-agents — Concurrent Process Algebra
11
12
 
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.
13
+ Use process algebra primitives to orchestrate agent workflows in OpenClaw.
14
+ This skill is useful for parallel execution, branch-fix loops, fan-out
15
+ comparison, and inspecting workflow state.
16
+
17
+ ## Install
18
+
19
+ ### 1) Install library
20
+ \`\`\`bash
21
+ npm install cpa-agents
22
+ \`\`\`
23
+
24
+ ### 2) Create the skill entrypoint
25
+ \`\`\`ts
26
+ import { createOpenClawSkill } from "cpa-agents/adapters/openclaw";
27
+
28
+ export default createOpenClawSkill();
29
+ \`\`\`
30
+
31
+ ### 3) Ensure OpenClaw can execute skills
32
+ - OpenClaw Gateway must be running.
33
+ - Your skill runtime must allow async tool execution.
34
+ - Keep this package at version \`0.1.0\` or newer.
15
35
 
16
36
  ## Commands
17
37
 
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
38
+ ### cpa:parallel
39
+ Run independent tasks concurrently.
40
+
41
+ Input:
42
+ \`\`\`json
43
+ { "tasks": ["task one", "task two"], "timeout": 300000 }
44
+ \`\`\`
45
+
46
+ ### cpa:branch-fix
47
+ Run task, detect errors, branch into a fix subprocess, then continue.
48
+
49
+ Input:
50
+ \`\`\`json
51
+ { "task": "implement feature with checks", "timeout": 300000 }
52
+ \`\`\`
53
+
54
+ ### cpa:fan-out
55
+ Run same task across multiple models and return merged results.
56
+
57
+ Input:
58
+ \`\`\`json
59
+ { "task": "draft API design", "models": ["model-a", "model-b"], "timeout": 300000 }
60
+ \`\`\`
61
+
62
+ ### cpa:retry
63
+ Retry a task with exponential backoff and per-attempt timeout.
64
+
65
+ Input:
66
+ \`\`\`json
67
+ { "task": "fix flaky test", "maxAttempts": 3, "initialDelayMs": 250, "stepTimeout": 60000 }
68
+ \`\`\`
69
+
70
+ ### cpa:fallback
71
+ Run fallback task if primary task fails.
72
+
73
+ Input:
74
+ \`\`\`json
75
+ { "primary": "run strict analyzer", "fallback": "run lightweight analyzer" }
76
+ \`\`\`
23
77
 
24
- ## When to use
78
+ ### cpa:saga
79
+ Run multiple steps with rollback compensation on failure.
25
80
 
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
81
+ Input:
82
+ \`\`\`json
83
+ { "steps": ["create branch", "apply patch", "run validation"] }
84
+ \`\`\`
85
+
86
+ ### cpa:status
87
+ Get current process tree/status for the current session.
88
+
89
+ Input:
90
+ \`\`\`json
91
+ {}
92
+ \`\`\`
93
+
94
+ ## Recommended usage prompts
95
+
96
+ - "Run in parallel: analyze bug, propose fix, generate tests"
97
+ - "Branch-fix this refactor until no type errors remain"
98
+ - "Fan-out this architecture prompt across 2 models and compare"
99
+ - "Show cpa status"
100
+
101
+ ## Troubleshooting
102
+
103
+ - **Gateway not connected**
104
+ - Start OpenClaw Gateway and retry.
105
+ - **Unknown command**
106
+ - Use one of: \`parallel\`, \`branch-fix\`, \`fan-out\`, \`retry\`, \`fallback\`, \`saga\`, \`status\`.
107
+ - **Timeout errors**
108
+ - Increase \`timeout\` in command args.
109
+ - **No session events**
110
+ - Confirm session context has \`appendEvent\` enabled.
31
111
  `;
32
112
  // ─── OpenClaw tool wrappers ─────────────────────────────────────
33
113
  export function openclawTool(opts) {
@@ -59,7 +139,7 @@ export function createOpenClawSkill() {
59
139
  const schedulers = new Map();
60
140
  return {
61
141
  name: "cpa-agents",
62
- version: "0.1.0",
142
+ version: "0.2.2",
63
143
  skillMd: SKILL_MD,
64
144
  async handleCommand(command, args, openclawCtx) {
65
145
  const scheduler = new Scheduler({
@@ -71,6 +151,19 @@ export function createOpenClawSkill() {
71
151
  const sessionId = openclawCtx.session?.id ?? "unknown";
72
152
  schedulers.set(sessionId, scheduler);
73
153
  try {
154
+ const runTask = (task, model) => async (ctx) => {
155
+ const result = await openclawCtx.agent.run(task, {
156
+ model,
157
+ signal: ctx.signal,
158
+ });
159
+ if (result.errors?.length) {
160
+ throw new Error(result.errors.join("; "));
161
+ }
162
+ return result.output;
163
+ };
164
+ const runTaskVoid = (task, model) => async (ctx) => {
165
+ await runTask(task, model)(ctx);
166
+ };
74
167
  switch (command) {
75
168
  case "parallel": {
76
169
  const tasks = args.tasks;
@@ -127,6 +220,38 @@ export function createOpenClawSkill() {
127
220
  });
128
221
  return scheduler.run("fan-out", proc);
129
222
  }
223
+ case "retry": {
224
+ const task = args.task;
225
+ const model = args.model;
226
+ const maxAttempts = args.maxAttempts ?? 3;
227
+ const initialDelayMs = args.initialDelayMs ?? 250;
228
+ const stepTimeout = args.stepTimeout ?? 60_000;
229
+ const proc = retryWithBackoff({
230
+ process: timeout(stepTimeout, runTask(task, model)),
231
+ maxAttempts,
232
+ initialDelayMs,
233
+ });
234
+ return scheduler.run("retry", proc);
235
+ }
236
+ case "fallback": {
237
+ const primary = args.primary;
238
+ const fallback = args.fallback;
239
+ const model = args.model;
240
+ const proc = async (ctx) => {
241
+ const result = await or(runTask(primary, model), runTask(fallback, model))(ctx);
242
+ if (!result.ok) {
243
+ throw result.error;
244
+ }
245
+ return result.value;
246
+ };
247
+ return scheduler.run("fallback", proc);
248
+ }
249
+ case "saga": {
250
+ const steps = args.steps ?? [];
251
+ const model = args.model;
252
+ const proc = saga(steps.map((step) => invertible(runTask(step, model), () => runTaskVoid(`Rollback/undo the effects of this step: ${step}`, model))));
253
+ return scheduler.run("saga", proc);
254
+ }
130
255
  case "status": {
131
256
  const s = schedulers.get(sessionId);
132
257
  if (!s) {
@@ -1 +1 @@
1
- {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/adapters/openclaw.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/adapters/openclaw.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,18 @@ export declare function createPiCpaExtension(): {
33
33
  message: string;
34
34
  }>;
35
35
  };
36
+ "cpa:retry": {
37
+ description: string;
38
+ handler: (args: string, piCtx: Record<string, any>) => Promise<import("../scheduler.js").SchedulerResult<string>>;
39
+ };
40
+ "cpa:fallback": {
41
+ description: string;
42
+ handler: (args: string, piCtx: Record<string, any>) => Promise<import("../scheduler.js").SchedulerResult<string>>;
43
+ };
44
+ "cpa:saga": {
45
+ description: string;
46
+ handler: (args: string, piCtx: Record<string, any>) => Promise<import("../scheduler.js").SchedulerResult<any[]>>;
47
+ };
36
48
  };
37
49
  };
38
50
  //# sourceMappingURL=pi-harness.d.ts.map
@@ -1 +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"}
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;AAIxE,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;;;;;;4BAOpC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;4BAyBlC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;4BAyClC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;EAmC/D"}
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { par, } from "../process.js";
5
5
  import { agentProcess, codeThenFix } from "../agent.js";
6
+ import { invertible, or, retryWithBackoff, saga, timeout } from "../operators.js";
6
7
  import { Scheduler } from "../scheduler.js";
7
8
  export function piTool(opts) {
8
9
  return {
@@ -24,7 +25,7 @@ export function piSubAgent(opts) {
24
25
  export function createPiCpaExtension() {
25
26
  return {
26
27
  name: "cpa-agents",
27
- version: "0.1.0",
28
+ version: "0.2.2",
28
29
  description: "Concurrent Process Algebra for AI agent orchestration",
29
30
  commands: {
30
31
  "cpa:par": {
@@ -71,6 +72,82 @@ export function createPiCpaExtension() {
71
72
  return { message: "Session tree display (see trace output)" };
72
73
  },
73
74
  },
75
+ "cpa:retry": {
76
+ description: "Retry a Pi task with backoff and timeout",
77
+ handler: async (args, piCtx) => {
78
+ const scheduler = new Scheduler({
79
+ onTrace: (e) => piCtx.log?.(`[cpa] ${e.type}: ${e.runId}`),
80
+ });
81
+ const task = args.trim();
82
+ const proc = retryWithBackoff({
83
+ process: timeout(30_000, async (ctx) => {
84
+ const sub = piSubAgent({
85
+ name: task.slice(0, 30) || "retry-task",
86
+ prompt: task,
87
+ parseResult: (out) => out,
88
+ });
89
+ return sub.invoke(undefined, ctx.signal);
90
+ }),
91
+ maxAttempts: 3,
92
+ initialDelayMs: 100,
93
+ });
94
+ return scheduler.run("retry", proc);
95
+ },
96
+ },
97
+ "cpa:fallback": {
98
+ description: "Run fallback Pi task if primary fails",
99
+ handler: async (args, piCtx) => {
100
+ const scheduler = new Scheduler({
101
+ onTrace: (e) => piCtx.log?.(`[cpa] ${e.type}: ${e.runId}`),
102
+ });
103
+ const [primary, fallback] = args
104
+ .split("||")
105
+ .map((part) => part.trim())
106
+ .filter(Boolean);
107
+ const primaryPrompt = primary ?? args.trim();
108
+ const fallbackPrompt = fallback ?? `Fallback for: ${primaryPrompt}`;
109
+ const proc = async (ctx) => {
110
+ const result = await or(async (c) => piSubAgent({
111
+ name: "primary",
112
+ prompt: primaryPrompt,
113
+ parseResult: (out) => out,
114
+ }).invoke(undefined, c.signal), async (c) => piSubAgent({
115
+ name: "fallback",
116
+ prompt: fallbackPrompt,
117
+ parseResult: (out) => out,
118
+ }).invoke(undefined, c.signal))(ctx);
119
+ if (!result.ok) {
120
+ throw result.error;
121
+ }
122
+ return result.value;
123
+ };
124
+ return scheduler.run("fallback", proc);
125
+ },
126
+ },
127
+ "cpa:saga": {
128
+ description: "Run rollback-aware multi-step Pi workflow",
129
+ handler: async (args, piCtx) => {
130
+ const scheduler = new Scheduler({
131
+ onTrace: (e) => piCtx.log?.(`[cpa] ${e.type}: ${e.runId}`),
132
+ });
133
+ const steps = args
134
+ .split("|")
135
+ .map((part) => part.trim())
136
+ .filter(Boolean);
137
+ const proc = saga(steps.map((step) => invertible(async (ctx) => piSubAgent({
138
+ name: step.slice(0, 30) || "saga-step",
139
+ prompt: step,
140
+ parseResult: (out) => out,
141
+ }).invoke(undefined, ctx.signal), () => async (ctx) => {
142
+ await piSubAgent({
143
+ name: "undo",
144
+ prompt: `Undo/rollback this step: ${step}`,
145
+ parseResult: (out) => out,
146
+ }).invoke(undefined, ctx.signal);
147
+ })));
148
+ return scheduler.run("saga", proc);
149
+ },
150
+ },
74
151
  },
75
152
  };
76
153
  }