@relayflows/core 0.0.1 → 1.0.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/dist/agent-handle.d.ts +27 -0
- package/dist/agent-handle.d.ts.map +1 -0
- package/dist/agent-handle.js +32 -0
- package/dist/agent-handle.js.map +1 -0
- package/dist/api-executor.d.ts +16 -0
- package/dist/api-executor.d.ts.map +1 -0
- package/dist/api-executor.js +94 -0
- package/dist/api-executor.js.map +1 -0
- package/dist/barrier.d.ts +72 -0
- package/dist/barrier.d.ts.map +1 -0
- package/dist/barrier.js +162 -0
- package/dist/barrier.js.map +1 -0
- package/dist/budget-tracker.d.ts +75 -0
- package/dist/budget-tracker.d.ts.map +1 -0
- package/dist/budget-tracker.js +184 -0
- package/dist/budget-tracker.js.map +1 -0
- package/dist/builder.d.ts +229 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +430 -0
- package/dist/builder.js.map +1 -0
- package/dist/builtin-templates/bug-fix.yaml +139 -0
- package/dist/builtin-templates/code-review.yaml +137 -0
- package/dist/builtin-templates/competitive.yaml +107 -0
- package/dist/builtin-templates/documentation.yaml +128 -0
- package/dist/builtin-templates/feature-dev.yaml +146 -0
- package/dist/builtin-templates/refactor.yaml +145 -0
- package/dist/builtin-templates/review-loop.yaml +227 -0
- package/dist/builtin-templates/security-audit.yaml +139 -0
- package/dist/channel-messenger.d.ts +28 -0
- package/dist/channel-messenger.d.ts.map +1 -0
- package/dist/channel-messenger.js +275 -0
- package/dist/channel-messenger.js.map +1 -0
- package/dist/cli-registry.d.ts +77 -0
- package/dist/cli-registry.d.ts.map +1 -0
- package/dist/cli-registry.js +268 -0
- package/dist/cli-registry.js.map +1 -0
- package/dist/cli-session-collector.d.ts +39 -0
- package/dist/cli-session-collector.d.ts.map +1 -0
- package/dist/cli-session-collector.js +23 -0
- package/dist/cli-session-collector.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +395 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud-runner.d.ts +15 -0
- package/dist/cloud-runner.d.ts.map +1 -0
- package/dist/cloud-runner.js +41 -0
- package/dist/cloud-runner.js.map +1 -0
- package/dist/cloud-schedules.d.ts +3 -0
- package/dist/cloud-schedules.d.ts.map +1 -0
- package/dist/cloud-schedules.js +2 -0
- package/dist/cloud-schedules.js.map +1 -0
- package/dist/collectors/claude.d.ts +6 -0
- package/dist/collectors/claude.d.ts.map +1 -0
- package/dist/collectors/claude.js +330 -0
- package/dist/collectors/claude.js.map +1 -0
- package/dist/collectors/codex.d.ts +18 -0
- package/dist/collectors/codex.d.ts.map +1 -0
- package/dist/collectors/codex.js +265 -0
- package/dist/collectors/codex.js.map +1 -0
- package/dist/collectors/opencode.d.ts +6 -0
- package/dist/collectors/opencode.d.ts.map +1 -0
- package/dist/collectors/opencode.js +204 -0
- package/dist/collectors/opencode.js.map +1 -0
- package/dist/coordinator.d.ts +73 -0
- package/dist/coordinator.d.ts.map +1 -0
- package/dist/coordinator.js +647 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/custom-steps.d.ts +73 -0
- package/dist/custom-steps.d.ts.map +1 -0
- package/dist/custom-steps.js +321 -0
- package/dist/custom-steps.js.map +1 -0
- package/dist/default-logger.d.ts +9 -0
- package/dist/default-logger.d.ts.map +1 -0
- package/dist/default-logger.js +104 -0
- package/dist/default-logger.js.map +1 -0
- package/dist/dry-run-format.d.ts +6 -0
- package/dist/dry-run-format.d.ts.map +1 -0
- package/dist/dry-run-format.js +76 -0
- package/dist/dry-run-format.js.map +1 -0
- package/dist/file-db.d.ts +85 -0
- package/dist/file-db.d.ts.map +1 -0
- package/dist/file-db.js +215 -0
- package/dist/file-db.js.map +1 -0
- package/dist/index.d.ts +37 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -3
- package/dist/index.js.map +1 -0
- package/dist/integrations/browser.d.ts +99 -0
- package/dist/integrations/browser.d.ts.map +1 -0
- package/dist/integrations/browser.js +419 -0
- package/dist/integrations/browser.js.map +1 -0
- package/dist/integrations/github.d.ts +79 -0
- package/dist/integrations/github.d.ts.map +1 -0
- package/dist/integrations/github.js +459 -0
- package/dist/integrations/github.js.map +1 -0
- package/dist/integrations/slack.d.ts +80 -0
- package/dist/integrations/slack.d.ts.map +1 -0
- package/dist/integrations/slack.js +355 -0
- package/dist/integrations/slack.js.map +1 -0
- package/dist/listr-renderer.d.ts +26 -0
- package/dist/listr-renderer.d.ts.map +1 -0
- package/dist/listr-renderer.js +230 -0
- package/dist/listr-renderer.js.map +1 -0
- package/dist/memory-db.d.ts +17 -0
- package/dist/memory-db.d.ts.map +1 -0
- package/dist/memory-db.js +33 -0
- package/dist/memory-db.js.map +1 -0
- package/dist/process-backend-executor.d.ts +18 -0
- package/dist/process-backend-executor.d.ts.map +1 -0
- package/dist/process-backend-executor.js +74 -0
- package/dist/process-backend-executor.js.map +1 -0
- package/dist/process-spawner.d.ts +35 -0
- package/dist/process-spawner.d.ts.map +1 -0
- package/dist/process-spawner.js +173 -0
- package/dist/process-spawner.js.map +1 -0
- package/dist/provisioner.d.ts +64 -0
- package/dist/provisioner.d.ts.map +1 -0
- package/dist/provisioner.js +269 -0
- package/dist/provisioner.js.map +1 -0
- package/dist/proxy-env.d.ts +52 -0
- package/dist/proxy-env.d.ts.map +1 -0
- package/dist/proxy-env.js +92 -0
- package/dist/proxy-env.js.map +1 -0
- package/dist/run-script.d.ts +82 -0
- package/dist/run-script.d.ts.map +1 -0
- package/dist/run-script.js +527 -0
- package/dist/run-script.js.map +1 -0
- package/dist/run-summary-table.d.ts +5 -0
- package/dist/run-summary-table.d.ts.map +1 -0
- package/dist/run-summary-table.js +132 -0
- package/dist/run-summary-table.js.map +1 -0
- package/dist/run.d.ts +45 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +37 -0
- package/dist/run.js.map +1 -0
- package/dist/runner.d.ts +528 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +6269 -0
- package/dist/runner.js.map +1 -0
- package/dist/schema.d.ts +275 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +27 -0
- package/dist/schema.js.map +1 -0
- package/dist/schema.json +940 -0
- package/dist/sibling-links.d.ts +100 -0
- package/dist/sibling-links.d.ts.map +1 -0
- package/dist/sibling-links.js +205 -0
- package/dist/sibling-links.js.map +1 -0
- package/dist/state.d.ts +77 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +140 -0
- package/dist/state.js.map +1 -0
- package/dist/step-executor.d.ts +95 -0
- package/dist/step-executor.d.ts.map +1 -0
- package/dist/step-executor.js +393 -0
- package/dist/step-executor.js.map +1 -0
- package/dist/template-resolver.d.ts +33 -0
- package/dist/template-resolver.d.ts.map +1 -0
- package/dist/template-resolver.js +144 -0
- package/dist/template-resolver.js.map +1 -0
- package/dist/templates.d.ts +47 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +405 -0
- package/dist/templates.js.map +1 -0
- package/dist/trajectory.d.ts +87 -0
- package/dist/trajectory.d.ts.map +1 -0
- package/dist/trajectory.js +412 -0
- package/dist/trajectory.js.map +1 -0
- package/dist/types.d.ts +471 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +37 -0
- package/dist/types.js.map +1 -0
- package/dist/validator.d.ts +11 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +186 -0
- package/dist/validator.js.map +1 -0
- package/dist/verification.d.ts +53 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +238 -0
- package/dist/verification.js.map +1 -0
- package/package.json +12 -8
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { CodexModels } from '@agent-relay/config';
|
|
2
|
+
const CHANNEL_NAME_RE = /^[a-z0-9][a-z0-9-]*$/;
|
|
3
|
+
export function validateWorkflow(config) {
|
|
4
|
+
const issues = [];
|
|
5
|
+
// Validate channel name format (must be lowercase alphanumeric + hyphens)
|
|
6
|
+
const channel = config.swarm?.channel ?? config.channel;
|
|
7
|
+
if (channel && !CHANNEL_NAME_RE.test(channel)) {
|
|
8
|
+
issues.push({
|
|
9
|
+
severity: 'error',
|
|
10
|
+
code: 'INVALID_CHANNEL_NAME',
|
|
11
|
+
message: `Channel name "${channel}" is invalid. Must be lowercase alphanumeric and hyphens, starting with a letter or number.`,
|
|
12
|
+
fix: `Use .toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '') on the channel name.`,
|
|
13
|
+
location: 'swarm:channel',
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
const agentMap = new Map(config.agents.map((a) => [a.name, a]));
|
|
17
|
+
const hasReviewerAgent = config.agents.some((a) => {
|
|
18
|
+
const role = a.role?.toLowerCase() ?? '';
|
|
19
|
+
const name = a.name.toLowerCase();
|
|
20
|
+
return (a.preset === 'reviewer' ||
|
|
21
|
+
role.includes('review') ||
|
|
22
|
+
role.includes('critic') ||
|
|
23
|
+
role.includes('verifier') ||
|
|
24
|
+
role.includes('qa') ||
|
|
25
|
+
name.includes('review'));
|
|
26
|
+
});
|
|
27
|
+
for (const workflow of config.workflows ?? []) {
|
|
28
|
+
const hasInteractiveAgentSteps = workflow.steps.some((step) => {
|
|
29
|
+
if (step.type === 'deterministic' || step.type === 'worktree')
|
|
30
|
+
return false;
|
|
31
|
+
if (!step.agent)
|
|
32
|
+
return false;
|
|
33
|
+
const raw = agentMap.get(step.agent);
|
|
34
|
+
if (!raw)
|
|
35
|
+
return false;
|
|
36
|
+
return resolveForValidation(raw).interactive !== false;
|
|
37
|
+
});
|
|
38
|
+
if (hasInteractiveAgentSteps && !hasReviewerAgent) {
|
|
39
|
+
issues.push({
|
|
40
|
+
severity: 'warning',
|
|
41
|
+
code: 'NO_REVIEW_AGENT',
|
|
42
|
+
message: `Workflow "${workflow.name}" has interactive agent steps but no obvious reviewer agent. The runner can auto-fallback, but dedicated reviewers improve step hardening.`,
|
|
43
|
+
fix: `Add an agent with role/preset like \`reviewer\`, \`critic\`, or \`verifier\`.`,
|
|
44
|
+
location: `workflow:${workflow.name}`,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
for (const step of workflow.steps ?? []) {
|
|
48
|
+
if (step.type === 'deterministic' || step.type === 'worktree')
|
|
49
|
+
continue;
|
|
50
|
+
if (!step.agent)
|
|
51
|
+
continue;
|
|
52
|
+
const rawDef = agentMap.get(step.agent);
|
|
53
|
+
if (!rawDef) {
|
|
54
|
+
issues.push({
|
|
55
|
+
severity: 'error',
|
|
56
|
+
code: 'UNKNOWN_AGENT',
|
|
57
|
+
message: `Step "${step.name}" references unknown agent "${step.agent}"`,
|
|
58
|
+
location: `step:${step.name}`,
|
|
59
|
+
});
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
// Resolve preset
|
|
63
|
+
const def = resolveForValidation(rawDef);
|
|
64
|
+
const task = step.task ?? '';
|
|
65
|
+
// Check 1: step chaining on interactive agent
|
|
66
|
+
if (def.interactive !== false && /\{\{steps\.[^}]+\}\}/.test(task)) {
|
|
67
|
+
issues.push({
|
|
68
|
+
severity: 'warning',
|
|
69
|
+
code: 'CHAIN_ON_INTERACTIVE',
|
|
70
|
+
message: `Step "${step.name}" uses {{steps.X.output}} but agent "${step.agent}" is interactive. PTY output includes TUI chrome — step chaining will receive raw terminal output.`,
|
|
71
|
+
fix: `Add \`interactive: false\` to agent "${step.agent}", or use \`preset: worker\` / \`preset: reviewer\`.`,
|
|
72
|
+
location: `step:${step.name}`,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// Check 2: interactive codex missing /exit in task
|
|
76
|
+
if (def.interactive !== false && def.cli === 'codex' && !task.includes('/exit')) {
|
|
77
|
+
issues.push({
|
|
78
|
+
severity: 'warning',
|
|
79
|
+
code: 'CODEX_NO_EXIT',
|
|
80
|
+
message: `Step "${step.name}" uses interactive codex but the task has no /exit instruction. Interactive codex may hang indefinitely.`,
|
|
81
|
+
fix: `End the task with an explicit /exit example:\n When done, output:\n TASK_COMPLETE\n /exit`,
|
|
82
|
+
location: `step:${step.name}`,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// Check 3: interactive agent with no sub-agent guardrail on complex tasks
|
|
86
|
+
if (def.interactive !== false &&
|
|
87
|
+
def.cli === 'claude' &&
|
|
88
|
+
task.length > 500 &&
|
|
89
|
+
!task.includes('do not') &&
|
|
90
|
+
!task.includes('Do NOT') &&
|
|
91
|
+
!task.includes('mcp__relaycast__add_agent') &&
|
|
92
|
+
!task.includes('add_agent')) {
|
|
93
|
+
issues.push({
|
|
94
|
+
severity: 'info',
|
|
95
|
+
code: 'CLAUDE_NO_SPAWN_GUARD',
|
|
96
|
+
message: `Step "${step.name}" uses interactive claude with a long task. Claude may spontaneously spawn sub-agents via relay MCP tools.`,
|
|
97
|
+
fix: `Add "Do NOT use mcp__relaycast__add_agent or add_agent to spawn sub-agents." to the task, or use \`interactive: false\`.`,
|
|
98
|
+
location: `step:${step.name}`,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// Check 4: codex-spark cannot be used in non-interactive mode
|
|
102
|
+
const CODEX_SPARK_MODELS = [CodexModels.GPT_5_3_CODEX_SPARK];
|
|
103
|
+
if (def.interactive === false &&
|
|
104
|
+
def.cli === 'codex' &&
|
|
105
|
+
def.constraints?.model &&
|
|
106
|
+
(CODEX_SPARK_MODELS.includes(def.constraints.model) || /codex-spark/i.test(def.constraints.model))) {
|
|
107
|
+
issues.push({
|
|
108
|
+
severity: 'error',
|
|
109
|
+
code: 'CODEX_SPARK_NON_INTERACTIVE',
|
|
110
|
+
message: `Agent "${step.agent}" uses codex-spark model in non-interactive mode. Codex Spark does not support non-interactive (headless) execution.`,
|
|
111
|
+
fix: `Switch to a different model (e.g. gpt-5.3-codex) or set the agent to interactive mode.`,
|
|
112
|
+
location: `step:${step.name}`,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
// Check 5: non-interactive agent that references relay messaging tools in task
|
|
116
|
+
if (def.interactive === false &&
|
|
117
|
+
(task.includes('mcp__relaycast__send_dm') ||
|
|
118
|
+
task.includes('mcp__relaycast__post_message') ||
|
|
119
|
+
task.includes('mcp__relaycast__check_inbox'))) {
|
|
120
|
+
issues.push({
|
|
121
|
+
severity: 'warning',
|
|
122
|
+
code: 'NONINTERACTIVE_RELAY',
|
|
123
|
+
message: `Step "${step.name}" has \`interactive: false\` but the task mentions relay tools. Non-interactive agents cannot use relay MCP tools.`,
|
|
124
|
+
fix: `Remove relay tool calls from the task, or set the agent to interactive.`,
|
|
125
|
+
location: `step:${step.name}`,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Check 6: maxConcurrency vs interactive agent count
|
|
130
|
+
const interactiveSteps = (workflow.steps ?? []).filter((s) => {
|
|
131
|
+
if (s.type === 'deterministic')
|
|
132
|
+
return false;
|
|
133
|
+
const def = agentMap.get(s.agent ?? '');
|
|
134
|
+
return def && resolveForValidation(def).interactive !== false;
|
|
135
|
+
});
|
|
136
|
+
const maxConc = config.swarm.maxConcurrency ?? 10;
|
|
137
|
+
if (interactiveSteps.length > 4 && maxConc > 4) {
|
|
138
|
+
issues.push({
|
|
139
|
+
severity: 'warning',
|
|
140
|
+
code: 'HIGH_CONCURRENCY',
|
|
141
|
+
message: `Workflow "${workflow.name}" has ${interactiveSteps.length} interactive steps with maxConcurrency: ${maxConc}. Spawning many interactive PTY agents simultaneously can saturate the broker and cause spawn timeouts.`,
|
|
142
|
+
fix: `Set \`maxConcurrency: 3\` or lower, or convert implementation agents to \`interactive: false\`.`,
|
|
143
|
+
location: `workflow:${workflow.name}`,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return issues;
|
|
148
|
+
}
|
|
149
|
+
function resolveForValidation(def) {
|
|
150
|
+
if (!def.preset)
|
|
151
|
+
return def;
|
|
152
|
+
const nonInteractive = ['worker', 'reviewer', 'analyst'];
|
|
153
|
+
if (nonInteractive.includes(def.preset) && def.interactive === undefined) {
|
|
154
|
+
return { ...def, interactive: false };
|
|
155
|
+
}
|
|
156
|
+
return def;
|
|
157
|
+
}
|
|
158
|
+
export function formatValidationReport(issues, yamlPath) {
|
|
159
|
+
const errors = issues.filter((i) => i.severity === 'error');
|
|
160
|
+
const warnings = issues.filter((i) => i.severity === 'warning');
|
|
161
|
+
const infos = issues.filter((i) => i.severity === 'info');
|
|
162
|
+
const lines = [`Validating ${yamlPath}...`, ''];
|
|
163
|
+
if (issues.length === 0) {
|
|
164
|
+
lines.push('No issues found');
|
|
165
|
+
return lines.join('\n');
|
|
166
|
+
}
|
|
167
|
+
const icon = { error: 'ERROR', warning: 'WARN', info: 'INFO' };
|
|
168
|
+
for (const issue of issues) {
|
|
169
|
+
const loc = issue.location ? ` [${issue.location}]` : '';
|
|
170
|
+
lines.push(`${icon[issue.severity]} ${issue.message}${loc}`);
|
|
171
|
+
if (issue.fix) {
|
|
172
|
+
lines.push(` -> ${issue.fix}`);
|
|
173
|
+
}
|
|
174
|
+
lines.push('');
|
|
175
|
+
}
|
|
176
|
+
const summary = [];
|
|
177
|
+
if (errors.length)
|
|
178
|
+
summary.push(`${errors.length} error${errors.length > 1 ? 's' : ''}`);
|
|
179
|
+
if (warnings.length)
|
|
180
|
+
summary.push(`${warnings.length} warning${warnings.length > 1 ? 's' : ''}`);
|
|
181
|
+
if (infos.length)
|
|
182
|
+
summary.push(`${infos.length} info`);
|
|
183
|
+
lines.push(summary.join(', '));
|
|
184
|
+
return lines.join('\n');
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { CompletionEvidenceSignal, CompletionEvidenceToolSideEffect, VerificationCheck, WorkflowStepCompletionReason } from './types.js';
|
|
2
|
+
export type { VerificationCheck } from './types.js';
|
|
3
|
+
export interface VerificationResult {
|
|
4
|
+
passed: boolean;
|
|
5
|
+
completionReason?: WorkflowStepCompletionReason;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface VerificationOptions {
|
|
9
|
+
allowFailure?: boolean;
|
|
10
|
+
completionMarkerFound?: boolean;
|
|
11
|
+
cwd?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class WorkflowCompletionError extends Error {
|
|
14
|
+
completionReason?: WorkflowStepCompletionReason;
|
|
15
|
+
constructor(message: string, completionReason?: WorkflowStepCompletionReason);
|
|
16
|
+
}
|
|
17
|
+
export interface VerificationSideEffects {
|
|
18
|
+
recordStepToolSideEffect?: (stepName: string, effect: Omit<CompletionEvidenceToolSideEffect, 'observedAt'> & {
|
|
19
|
+
observedAt?: string;
|
|
20
|
+
}) => void;
|
|
21
|
+
getOrCreateStepEvidenceRecord?: (stepName: string) => {
|
|
22
|
+
evidence: {
|
|
23
|
+
coordinationSignals: CompletionEvidenceSignal[];
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
log?: (message: string) => void;
|
|
27
|
+
}
|
|
28
|
+
export declare function runVerification(check: VerificationCheck, output: string, stepName: string, injectedTaskText?: string, options?: VerificationOptions, sideEffects?: VerificationSideEffects): VerificationResult;
|
|
29
|
+
export declare function stripInjectedTaskEcho(output: string, injectedTaskText?: string): string;
|
|
30
|
+
export declare function checkExitCode(_expectedExitCode: string): boolean;
|
|
31
|
+
export declare function checkOutputContains(output: string, token: string, injectedTaskText?: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Returns the first GitHub PR URL found in {@link output}. When
|
|
34
|
+
* {@link repoQualifier} is non-empty (format: `<owner>/<repo>`, case
|
|
35
|
+
* insensitive), only URLs belonging to that repository are accepted.
|
|
36
|
+
*
|
|
37
|
+
* Use via `verification: { type: 'pr_url', value: 'owner/repo' }` to require
|
|
38
|
+
* a step to publish a pull request before completing. The check exists so
|
|
39
|
+
* workflow runners can refuse `OWNER_DECISION: COMPLETE` from workers that
|
|
40
|
+
* shipped code locally but never opened a PR.
|
|
41
|
+
*/
|
|
42
|
+
export declare function findPrUrl(output: string, repoQualifier?: string, injectedTaskText?: string): string | null;
|
|
43
|
+
export declare function execCustomVerification(command: string, cwd: string, timeoutMs?: number): {
|
|
44
|
+
passed: boolean;
|
|
45
|
+
output: string;
|
|
46
|
+
};
|
|
47
|
+
export declare function checkCustom(value: string, output: string, cwd?: string): {
|
|
48
|
+
passed: boolean;
|
|
49
|
+
stdout?: string;
|
|
50
|
+
error?: string;
|
|
51
|
+
};
|
|
52
|
+
export declare function checkFileExists(filePath: string, cwd?: string): boolean;
|
|
53
|
+
//# sourceMappingURL=verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,wBAAwB,EACxB,gCAAgC,EAChC,iBAAiB,EACjB,4BAA4B,EAC7B,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,4BAA4B,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,gBAAgB,CAAC,EAAE,4BAA4B,CAAC;gBAEpC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,4BAA4B;CAK7E;AAED,MAAM,WAAW,uBAAuB;IACtC,wBAAwB,CAAC,EAAE,CACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,IAAI,CAAC,gCAAgC,EAAE,YAAY,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KACnF,IAAI,CAAC;IACV,6BAA6B,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK;QACpD,QAAQ,EAAE;YAAE,mBAAmB,EAAE,wBAAwB,EAAE,CAAA;SAAE,CAAC;KAC/D,CAAC;IACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,gBAAgB,CAAC,EAAE,MAAM,EACzB,OAAO,GAAE,mBAAwB,EACjC,WAAW,GAAE,uBAA4B,GACxC,kBAAkB,CAoHpB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBvF;AAED,wBAAgB,aAAa,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAIhE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAKrG;AAID;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB1G;AAMD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,SAAS,SAAmC,GAC3C;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA6BrC;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,GAAG,SAAgB,GAClB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA6BtD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAgB,GAAG,OAAO,CAc9E"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
export class WorkflowCompletionError extends Error {
|
|
5
|
+
completionReason;
|
|
6
|
+
constructor(message, completionReason) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = 'WorkflowCompletionError';
|
|
9
|
+
this.completionReason = completionReason;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function runVerification(check, output, stepName, injectedTaskText, options = {}, sideEffects = {}) {
|
|
13
|
+
const cwd = options.cwd ?? process.cwd();
|
|
14
|
+
const fail = (message) => {
|
|
15
|
+
const observedAt = new Date().toISOString();
|
|
16
|
+
sideEffects.recordStepToolSideEffect?.(stepName, {
|
|
17
|
+
type: 'verification_observed',
|
|
18
|
+
detail: message,
|
|
19
|
+
observedAt,
|
|
20
|
+
raw: { passed: false, type: check.type, value: check.value },
|
|
21
|
+
});
|
|
22
|
+
sideEffects.getOrCreateStepEvidenceRecord?.(stepName).evidence.coordinationSignals.push({
|
|
23
|
+
kind: 'verification_failed',
|
|
24
|
+
source: 'verification',
|
|
25
|
+
text: message,
|
|
26
|
+
observedAt,
|
|
27
|
+
value: check.value,
|
|
28
|
+
});
|
|
29
|
+
if (options.allowFailure) {
|
|
30
|
+
return {
|
|
31
|
+
passed: false,
|
|
32
|
+
completionReason: 'failed_verification',
|
|
33
|
+
error: message,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
throw new WorkflowCompletionError(message, 'failed_verification');
|
|
37
|
+
};
|
|
38
|
+
switch (check.type) {
|
|
39
|
+
case 'output_contains': {
|
|
40
|
+
const token = check.value;
|
|
41
|
+
if (!checkOutputContains(output, token, injectedTaskText)) {
|
|
42
|
+
return fail(`Verification failed for "${stepName}": output does not contain "${token}"`);
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case 'exit_code':
|
|
47
|
+
if (!checkExitCode(check.value)) {
|
|
48
|
+
return fail(`Verification failed for "${stepName}": exit code did not match "${check.value}"`);
|
|
49
|
+
}
|
|
50
|
+
break;
|
|
51
|
+
case 'file_exists':
|
|
52
|
+
if (!checkFileExists(check.value, cwd)) {
|
|
53
|
+
return fail(`Verification failed for "${stepName}": file "${check.value}" does not exist`);
|
|
54
|
+
}
|
|
55
|
+
break;
|
|
56
|
+
case 'custom': {
|
|
57
|
+
if (check.value) {
|
|
58
|
+
const result = execCustomVerification(check.value, cwd, check.timeoutMs);
|
|
59
|
+
if (!result.passed) {
|
|
60
|
+
return fail('Verification failed for "' +
|
|
61
|
+
stepName +
|
|
62
|
+
'": custom check "' +
|
|
63
|
+
check.value +
|
|
64
|
+
'" failed\n' +
|
|
65
|
+
result.output);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// No command provided — preserved legacy no-op behavior
|
|
70
|
+
return { passed: false };
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case 'pr_url': {
|
|
75
|
+
const found = findPrUrl(output, check.value, injectedTaskText);
|
|
76
|
+
if (!found) {
|
|
77
|
+
const repoQualifier = check.value ? ` for repository "${check.value}"` : '';
|
|
78
|
+
return fail(`Verification failed for "${stepName}": step output does not contain a GitHub PR URL${repoQualifier}. ` +
|
|
79
|
+
`Workers must open a pull request and include the URL in their output before reporting completion.`);
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
default:
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
if (options.completionMarkerFound === false) {
|
|
87
|
+
sideEffects.log?.(`[${stepName}] Verification passed without legacy STEP_COMPLETE marker; allowing completion`);
|
|
88
|
+
}
|
|
89
|
+
const observedAt = new Date().toISOString();
|
|
90
|
+
const successMessage = options.completionMarkerFound === false
|
|
91
|
+
? 'Verification passed without legacy STEP_COMPLETE marker'
|
|
92
|
+
: 'Verification passed';
|
|
93
|
+
sideEffects.recordStepToolSideEffect?.(stepName, {
|
|
94
|
+
type: 'verification_observed',
|
|
95
|
+
detail: successMessage,
|
|
96
|
+
observedAt,
|
|
97
|
+
raw: { passed: true, type: check.type, value: check.value },
|
|
98
|
+
});
|
|
99
|
+
sideEffects.getOrCreateStepEvidenceRecord?.(stepName).evidence.coordinationSignals.push({
|
|
100
|
+
kind: 'verification_passed',
|
|
101
|
+
source: 'verification',
|
|
102
|
+
text: successMessage,
|
|
103
|
+
observedAt,
|
|
104
|
+
value: check.value,
|
|
105
|
+
});
|
|
106
|
+
return {
|
|
107
|
+
passed: true,
|
|
108
|
+
completionReason: 'completed_verified',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export function stripInjectedTaskEcho(output, injectedTaskText) {
|
|
112
|
+
if (!injectedTaskText) {
|
|
113
|
+
return output;
|
|
114
|
+
}
|
|
115
|
+
const candidates = [
|
|
116
|
+
injectedTaskText,
|
|
117
|
+
injectedTaskText.replace(/\r\n/g, '\n'),
|
|
118
|
+
injectedTaskText.replace(/\n/g, '\r\n'),
|
|
119
|
+
].filter((candidate, index, all) => candidate.length > 0 && all.indexOf(candidate) === index);
|
|
120
|
+
for (const candidate of candidates) {
|
|
121
|
+
const start = output.indexOf(candidate);
|
|
122
|
+
if (start !== -1) {
|
|
123
|
+
return output.slice(0, start) + output.slice(start + candidate.length);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return output;
|
|
127
|
+
}
|
|
128
|
+
export function checkExitCode(_expectedExitCode) {
|
|
129
|
+
// Existing runner semantics treat process success as established before this
|
|
130
|
+
// verification hook runs, so this check is currently an unconditional pass.
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
export function checkOutputContains(output, token, injectedTaskText) {
|
|
134
|
+
if (!token) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
return stripInjectedTaskEcho(output, injectedTaskText).includes(token);
|
|
138
|
+
}
|
|
139
|
+
const PR_URL_PATTERN = /https?:\/\/github\.com\/([\w.-]+)\/([\w.-]+)\/pull\/(\d+)\b/gi;
|
|
140
|
+
/**
|
|
141
|
+
* Returns the first GitHub PR URL found in {@link output}. When
|
|
142
|
+
* {@link repoQualifier} is non-empty (format: `<owner>/<repo>`, case
|
|
143
|
+
* insensitive), only URLs belonging to that repository are accepted.
|
|
144
|
+
*
|
|
145
|
+
* Use via `verification: { type: 'pr_url', value: 'owner/repo' }` to require
|
|
146
|
+
* a step to publish a pull request before completing. The check exists so
|
|
147
|
+
* workflow runners can refuse `OWNER_DECISION: COMPLETE` from workers that
|
|
148
|
+
* shipped code locally but never opened a PR.
|
|
149
|
+
*/
|
|
150
|
+
export function findPrUrl(output, repoQualifier, injectedTaskText) {
|
|
151
|
+
const sanitized = stripInjectedTaskEcho(output, injectedTaskText);
|
|
152
|
+
const qualifier = repoQualifier?.trim().toLowerCase();
|
|
153
|
+
PR_URL_PATTERN.lastIndex = 0;
|
|
154
|
+
let match;
|
|
155
|
+
while ((match = PR_URL_PATTERN.exec(sanitized))) {
|
|
156
|
+
if (!qualifier) {
|
|
157
|
+
return match[0];
|
|
158
|
+
}
|
|
159
|
+
const owner = match[1]?.toLowerCase();
|
|
160
|
+
const repo = match[2]?.toLowerCase();
|
|
161
|
+
if (`${owner}/${repo}` === qualifier) {
|
|
162
|
+
return match[0];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
const DEFAULT_CUSTOM_VERIFY_TIMEOUT_MS = parseInt(process.env.CUSTOM_VERIFY_TIMEOUT_MS ?? '30000', 10);
|
|
168
|
+
const REGEX_PREFIX = 'regex:';
|
|
169
|
+
export function execCustomVerification(command, cwd, timeoutMs = DEFAULT_CUSTOM_VERIFY_TIMEOUT_MS) {
|
|
170
|
+
try {
|
|
171
|
+
const stdout = execSync(command, {
|
|
172
|
+
cwd,
|
|
173
|
+
timeout: timeoutMs,
|
|
174
|
+
killSignal: 'SIGKILL',
|
|
175
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
176
|
+
encoding: 'utf-8',
|
|
177
|
+
});
|
|
178
|
+
return { passed: true, output: stdout.trim() };
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
const execError = error;
|
|
182
|
+
const stdout = typeof execError.stdout === 'string' ? execError.stdout : (execError.stdout?.toString('utf-8') ?? '');
|
|
183
|
+
const stderr = typeof execError.stderr === 'string' ? execError.stderr : (execError.stderr?.toString('utf-8') ?? '');
|
|
184
|
+
const combinedOutput = [stdout, stderr]
|
|
185
|
+
.filter((chunk) => chunk.length > 0)
|
|
186
|
+
.join('\n')
|
|
187
|
+
.trim();
|
|
188
|
+
const truncated = combinedOutput.length > 2000 ? combinedOutput.slice(-2000) : combinedOutput;
|
|
189
|
+
return {
|
|
190
|
+
passed: false,
|
|
191
|
+
output: truncated || execError.message,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
export function checkCustom(value, output, cwd = process.cwd()) {
|
|
196
|
+
// Regex shorthand: "regex:<pattern>"
|
|
197
|
+
if (value.startsWith(REGEX_PREFIX)) {
|
|
198
|
+
const pattern = value.slice(REGEX_PREFIX.length);
|
|
199
|
+
try {
|
|
200
|
+
const re = new RegExp(pattern);
|
|
201
|
+
const matched = re.test(output);
|
|
202
|
+
return matched
|
|
203
|
+
? { passed: true }
|
|
204
|
+
: { passed: false, error: `output did not match pattern /${pattern}/` };
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
return { passed: false, error: `invalid regex: ${err.message}` };
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Shell command: execute value with STEP_OUTPUT env var
|
|
211
|
+
try {
|
|
212
|
+
const result = execSync(value, {
|
|
213
|
+
cwd,
|
|
214
|
+
env: { ...process.env, STEP_OUTPUT: output },
|
|
215
|
+
timeout: DEFAULT_CUSTOM_VERIFY_TIMEOUT_MS,
|
|
216
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
217
|
+
maxBuffer: 1024 * 1024,
|
|
218
|
+
});
|
|
219
|
+
return { passed: true, stdout: result.toString('utf-8').trim() };
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
const message = err?.stderr?.toString('utf-8')?.trim() || err.message;
|
|
223
|
+
return { passed: false, error: message };
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
export function checkFileExists(filePath, cwd = process.cwd()) {
|
|
227
|
+
const normalizedCwd = path.resolve(cwd);
|
|
228
|
+
const resolved = path.isAbsolute(filePath) ? path.resolve(filePath) : path.resolve(normalizedCwd, filePath);
|
|
229
|
+
// Relative artifact paths stay scoped to the workflow cwd; absolute paths
|
|
230
|
+
// are already explicit and are allowed for temp/output artifacts.
|
|
231
|
+
if (!path.isAbsolute(filePath) &&
|
|
232
|
+
!resolved.startsWith(normalizedCwd + path.sep) &&
|
|
233
|
+
resolved !== normalizedCwd) {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
return existsSync(resolved);
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@relayflows/core",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "Workflow engine and types for Agent Relay workflows
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Workflow engine and types for Agent Relay workflows",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -52,18 +52,22 @@
|
|
|
52
52
|
"directory": "packages/core"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@agent-relay/
|
|
56
|
-
"@agent-relay/
|
|
57
|
-
"@agent-relay/
|
|
58
|
-
"@agent-relay/
|
|
59
|
-
"@agent-relay/sdk": "^
|
|
60
|
-
"@agent-relay/slack-primitive": "^7.1.1",
|
|
55
|
+
"@agent-relay/cloud": "^8.2.0",
|
|
56
|
+
"@agent-relay/config": "^8.2.0",
|
|
57
|
+
"@agent-relay/harness-driver": "^8.2.0",
|
|
58
|
+
"@agent-relay/harnesses": "^8.2.0",
|
|
59
|
+
"@agent-relay/sdk": "^8.2.0",
|
|
61
60
|
"@relaycast/sdk": "^1.1.0",
|
|
61
|
+
"@relayfile/sdk": "^0.8.0",
|
|
62
|
+
"@relayflows/browser-primitive": "1.0.0",
|
|
63
|
+
"@relayflows/github-primitive": "1.0.0",
|
|
64
|
+
"@relayflows/slack-primitive": "1.0.0",
|
|
62
65
|
"@sinclair/typebox": "^0.34.48",
|
|
63
66
|
"agent-trajectories": "^0.6.0",
|
|
64
67
|
"chalk": "^4.1.2",
|
|
65
68
|
"ignore": "^7.0.5",
|
|
66
69
|
"listr2": "^10.2.1",
|
|
70
|
+
"strip-ansi": "^7.2.0",
|
|
67
71
|
"yaml": "^2.7.0",
|
|
68
72
|
"zod": "^3.23.8"
|
|
69
73
|
},
|