@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.
Files changed (182) hide show
  1. package/dist/agent-handle.d.ts +27 -0
  2. package/dist/agent-handle.d.ts.map +1 -0
  3. package/dist/agent-handle.js +32 -0
  4. package/dist/agent-handle.js.map +1 -0
  5. package/dist/api-executor.d.ts +16 -0
  6. package/dist/api-executor.d.ts.map +1 -0
  7. package/dist/api-executor.js +94 -0
  8. package/dist/api-executor.js.map +1 -0
  9. package/dist/barrier.d.ts +72 -0
  10. package/dist/barrier.d.ts.map +1 -0
  11. package/dist/barrier.js +162 -0
  12. package/dist/barrier.js.map +1 -0
  13. package/dist/budget-tracker.d.ts +75 -0
  14. package/dist/budget-tracker.d.ts.map +1 -0
  15. package/dist/budget-tracker.js +184 -0
  16. package/dist/budget-tracker.js.map +1 -0
  17. package/dist/builder.d.ts +229 -0
  18. package/dist/builder.d.ts.map +1 -0
  19. package/dist/builder.js +430 -0
  20. package/dist/builder.js.map +1 -0
  21. package/dist/builtin-templates/bug-fix.yaml +139 -0
  22. package/dist/builtin-templates/code-review.yaml +137 -0
  23. package/dist/builtin-templates/competitive.yaml +107 -0
  24. package/dist/builtin-templates/documentation.yaml +128 -0
  25. package/dist/builtin-templates/feature-dev.yaml +146 -0
  26. package/dist/builtin-templates/refactor.yaml +145 -0
  27. package/dist/builtin-templates/review-loop.yaml +227 -0
  28. package/dist/builtin-templates/security-audit.yaml +139 -0
  29. package/dist/channel-messenger.d.ts +28 -0
  30. package/dist/channel-messenger.d.ts.map +1 -0
  31. package/dist/channel-messenger.js +275 -0
  32. package/dist/channel-messenger.js.map +1 -0
  33. package/dist/cli-registry.d.ts +77 -0
  34. package/dist/cli-registry.d.ts.map +1 -0
  35. package/dist/cli-registry.js +268 -0
  36. package/dist/cli-registry.js.map +1 -0
  37. package/dist/cli-session-collector.d.ts +39 -0
  38. package/dist/cli-session-collector.d.ts.map +1 -0
  39. package/dist/cli-session-collector.js +23 -0
  40. package/dist/cli-session-collector.js.map +1 -0
  41. package/dist/cli.d.ts +11 -0
  42. package/dist/cli.d.ts.map +1 -0
  43. package/dist/cli.js +395 -0
  44. package/dist/cli.js.map +1 -0
  45. package/dist/cloud-runner.d.ts +15 -0
  46. package/dist/cloud-runner.d.ts.map +1 -0
  47. package/dist/cloud-runner.js +41 -0
  48. package/dist/cloud-runner.js.map +1 -0
  49. package/dist/cloud-schedules.d.ts +3 -0
  50. package/dist/cloud-schedules.d.ts.map +1 -0
  51. package/dist/cloud-schedules.js +2 -0
  52. package/dist/cloud-schedules.js.map +1 -0
  53. package/dist/collectors/claude.d.ts +6 -0
  54. package/dist/collectors/claude.d.ts.map +1 -0
  55. package/dist/collectors/claude.js +330 -0
  56. package/dist/collectors/claude.js.map +1 -0
  57. package/dist/collectors/codex.d.ts +18 -0
  58. package/dist/collectors/codex.d.ts.map +1 -0
  59. package/dist/collectors/codex.js +265 -0
  60. package/dist/collectors/codex.js.map +1 -0
  61. package/dist/collectors/opencode.d.ts +6 -0
  62. package/dist/collectors/opencode.d.ts.map +1 -0
  63. package/dist/collectors/opencode.js +204 -0
  64. package/dist/collectors/opencode.js.map +1 -0
  65. package/dist/coordinator.d.ts +73 -0
  66. package/dist/coordinator.d.ts.map +1 -0
  67. package/dist/coordinator.js +647 -0
  68. package/dist/coordinator.js.map +1 -0
  69. package/dist/custom-steps.d.ts +73 -0
  70. package/dist/custom-steps.d.ts.map +1 -0
  71. package/dist/custom-steps.js +321 -0
  72. package/dist/custom-steps.js.map +1 -0
  73. package/dist/default-logger.d.ts +9 -0
  74. package/dist/default-logger.d.ts.map +1 -0
  75. package/dist/default-logger.js +104 -0
  76. package/dist/default-logger.js.map +1 -0
  77. package/dist/dry-run-format.d.ts +6 -0
  78. package/dist/dry-run-format.d.ts.map +1 -0
  79. package/dist/dry-run-format.js +76 -0
  80. package/dist/dry-run-format.js.map +1 -0
  81. package/dist/file-db.d.ts +85 -0
  82. package/dist/file-db.d.ts.map +1 -0
  83. package/dist/file-db.js +215 -0
  84. package/dist/file-db.js.map +1 -0
  85. package/dist/index.d.ts +37 -1
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +34 -3
  88. package/dist/index.js.map +1 -0
  89. package/dist/integrations/browser.d.ts +99 -0
  90. package/dist/integrations/browser.d.ts.map +1 -0
  91. package/dist/integrations/browser.js +419 -0
  92. package/dist/integrations/browser.js.map +1 -0
  93. package/dist/integrations/github.d.ts +79 -0
  94. package/dist/integrations/github.d.ts.map +1 -0
  95. package/dist/integrations/github.js +459 -0
  96. package/dist/integrations/github.js.map +1 -0
  97. package/dist/integrations/slack.d.ts +80 -0
  98. package/dist/integrations/slack.d.ts.map +1 -0
  99. package/dist/integrations/slack.js +355 -0
  100. package/dist/integrations/slack.js.map +1 -0
  101. package/dist/listr-renderer.d.ts +26 -0
  102. package/dist/listr-renderer.d.ts.map +1 -0
  103. package/dist/listr-renderer.js +230 -0
  104. package/dist/listr-renderer.js.map +1 -0
  105. package/dist/memory-db.d.ts +17 -0
  106. package/dist/memory-db.d.ts.map +1 -0
  107. package/dist/memory-db.js +33 -0
  108. package/dist/memory-db.js.map +1 -0
  109. package/dist/process-backend-executor.d.ts +18 -0
  110. package/dist/process-backend-executor.d.ts.map +1 -0
  111. package/dist/process-backend-executor.js +74 -0
  112. package/dist/process-backend-executor.js.map +1 -0
  113. package/dist/process-spawner.d.ts +35 -0
  114. package/dist/process-spawner.d.ts.map +1 -0
  115. package/dist/process-spawner.js +173 -0
  116. package/dist/process-spawner.js.map +1 -0
  117. package/dist/provisioner.d.ts +64 -0
  118. package/dist/provisioner.d.ts.map +1 -0
  119. package/dist/provisioner.js +269 -0
  120. package/dist/provisioner.js.map +1 -0
  121. package/dist/proxy-env.d.ts +52 -0
  122. package/dist/proxy-env.d.ts.map +1 -0
  123. package/dist/proxy-env.js +92 -0
  124. package/dist/proxy-env.js.map +1 -0
  125. package/dist/run-script.d.ts +82 -0
  126. package/dist/run-script.d.ts.map +1 -0
  127. package/dist/run-script.js +527 -0
  128. package/dist/run-script.js.map +1 -0
  129. package/dist/run-summary-table.d.ts +5 -0
  130. package/dist/run-summary-table.d.ts.map +1 -0
  131. package/dist/run-summary-table.js +132 -0
  132. package/dist/run-summary-table.js.map +1 -0
  133. package/dist/run.d.ts +45 -0
  134. package/dist/run.d.ts.map +1 -0
  135. package/dist/run.js +37 -0
  136. package/dist/run.js.map +1 -0
  137. package/dist/runner.d.ts +528 -0
  138. package/dist/runner.d.ts.map +1 -0
  139. package/dist/runner.js +6269 -0
  140. package/dist/runner.js.map +1 -0
  141. package/dist/schema.d.ts +275 -0
  142. package/dist/schema.d.ts.map +1 -0
  143. package/dist/schema.js +27 -0
  144. package/dist/schema.js.map +1 -0
  145. package/dist/schema.json +940 -0
  146. package/dist/sibling-links.d.ts +100 -0
  147. package/dist/sibling-links.d.ts.map +1 -0
  148. package/dist/sibling-links.js +205 -0
  149. package/dist/sibling-links.js.map +1 -0
  150. package/dist/state.d.ts +77 -0
  151. package/dist/state.d.ts.map +1 -0
  152. package/dist/state.js +140 -0
  153. package/dist/state.js.map +1 -0
  154. package/dist/step-executor.d.ts +95 -0
  155. package/dist/step-executor.d.ts.map +1 -0
  156. package/dist/step-executor.js +393 -0
  157. package/dist/step-executor.js.map +1 -0
  158. package/dist/template-resolver.d.ts +33 -0
  159. package/dist/template-resolver.d.ts.map +1 -0
  160. package/dist/template-resolver.js +144 -0
  161. package/dist/template-resolver.js.map +1 -0
  162. package/dist/templates.d.ts +47 -0
  163. package/dist/templates.d.ts.map +1 -0
  164. package/dist/templates.js +405 -0
  165. package/dist/templates.js.map +1 -0
  166. package/dist/trajectory.d.ts +87 -0
  167. package/dist/trajectory.d.ts.map +1 -0
  168. package/dist/trajectory.js +412 -0
  169. package/dist/trajectory.js.map +1 -0
  170. package/dist/types.d.ts +471 -0
  171. package/dist/types.d.ts.map +1 -0
  172. package/dist/types.js +37 -0
  173. package/dist/types.js.map +1 -0
  174. package/dist/validator.d.ts +11 -0
  175. package/dist/validator.d.ts.map +1 -0
  176. package/dist/validator.js +186 -0
  177. package/dist/validator.js.map +1 -0
  178. package/dist/verification.d.ts +53 -0
  179. package/dist/verification.d.ts.map +1 -0
  180. package/dist/verification.js +238 -0
  181. package/dist/verification.js.map +1 -0
  182. 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.1",
4
- "description": "Workflow engine and types for Agent Relay workflows (npm namespace placeholder — real release ships as 0.1.0+).",
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/browser-primitive": "^7.1.1",
56
- "@agent-relay/cloud": "^7.1.1",
57
- "@agent-relay/config": "^7.1.1",
58
- "@agent-relay/github-primitive": "^7.1.1",
59
- "@agent-relay/sdk": "^7.1.1",
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
  },