You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Execute a shell command with timeout and resource limits via the isolator
Crypto Actions
Action
Description
crypto.hash
Compute SHA-256 (or other) hash of input
crypto.hmac
Compute HMAC signature
crypto.uuid
Generate a new UUID
crypto.encode
Encode data (base64, hex)
crypto.decode
Decode data (base64, hex)
Assert Actions
Action
Description
assert.equal
Assert two values are equal
assert.schema
Validate data against a JSON Schema
assert.truthy
Assert a value is truthy
Workflow Actions
Action
Description
workflow.run
Execute a child workflow from a template (sub-workflow)
workflow.emit
Publish a custom event to the EventHub
workflow.context
Read or update workflow context (accumulated data, agent notes)
workflow.fail
Force-fail the current workflow with a reason
workflow.log
Write a structured log entry with workflow context
workflow.notify
Push a real-time notification to the agent via MCP SSE
Plugin Actions
External MCP servers can be loaded as plugins. Their tools are discovered via tools/list and registered in the action registry under a namespaced prefix (e.g., github.create_issue).
Real-time Notifications
workflow.notify pushes notifications to the agent via MCP SSE. The agent decides where to be notified by placing workflow.notify steps anywhere in the workflow template. The workflow's agent_id determines who receives the notification. Best-effort: if the agent is not connected, the step completes without error.
Three expression engines are available for conditions and transforms:
Engine
Use Case
Syntax Example
CEL
Condition evaluation, type-safe expressions
steps.fetch.status_code == 200
GoJQ
JSON transformation and querying
.data[] | select(.active)
Expr
General-purpose logic expressions
len(items) > 0 && items[0].valid
Note: CEL reserves the word loop. Inside CEL expressions, use iter.item and iter.index instead of loop.item / loop.index. The ${{loop.item}} interpolation syntax is unaffected.
Available Commands
Command
Description
go build -C /path/to/opcode ./...
Build all packages (verify compilation)
go build -C /path/to/opcode -o opcode ./cmd/opcode/
Build the opcode binary
go test -C /path/to/opcode ./... -count=1 -timeout 60s
Run the full test suite (981 tests)
go test -C /path/to/opcode ./internal/engine/ -run TestExecutor -v