@relayflows/core 0.0.1 → 1.0.1
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 +79 -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,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow agent provisioning.
|
|
3
|
+
*
|
|
4
|
+
* Composes identity primitives (token minting, scope compilation, JWKS,
|
|
5
|
+
* audit logging from @agent-relay/cloud) with relayfile-server primitives
|
|
6
|
+
* (workspace seeding, ACL seeding, mount lifecycle from @relayfile/sdk)
|
|
7
|
+
* into a single `provisionWorkflowAgents` orchestration suitable for
|
|
8
|
+
* workflow runners.
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
import { compileAgentScopes, DEFAULT_ADMIN_AGENT_NAME, DEFAULT_ADMIN_SCOPES, getDefaultPermissionAuditPath, mintAgentToken, PermissionAuditLog, } from '@agent-relay/cloud';
|
|
13
|
+
import { createWorkspaceIfNeeded, seedWorkflowAcls, seedWorkspace, } from '@relayfile/sdk/workspace-seeder';
|
|
14
|
+
import { ensureRelayfileMount, } from '@relayfile/sdk/workspace-mount';
|
|
15
|
+
const DEFAULT_AGENT_NAME = 'default-agent';
|
|
16
|
+
function discoverAgentNames(projectDir) {
|
|
17
|
+
if (!existsSync(projectDir)) {
|
|
18
|
+
return [DEFAULT_AGENT_NAME];
|
|
19
|
+
}
|
|
20
|
+
const agentNames = new Set();
|
|
21
|
+
for (const entry of readdirSync(projectDir)) {
|
|
22
|
+
const match = entry.match(/^\.(.+)\.(agentignore|agentreadonly)$/u);
|
|
23
|
+
if (match?.[1]) {
|
|
24
|
+
agentNames.add(match[1]);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const discovered = [...agentNames].sort((left, right) => left.localeCompare(right));
|
|
28
|
+
return discovered.length > 0 ? discovered : [DEFAULT_AGENT_NAME];
|
|
29
|
+
}
|
|
30
|
+
function resolveAgents(config) {
|
|
31
|
+
const configuredAgents = Object.entries(config.agents ?? {});
|
|
32
|
+
if (configuredAgents.length > 0) {
|
|
33
|
+
return configuredAgents.map(([name, permissions]) => ({
|
|
34
|
+
name,
|
|
35
|
+
permissions: permissions ?? {},
|
|
36
|
+
resolutionSource: 'configured',
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
return discoverAgentNames(config.projectDir).map((name) => ({
|
|
40
|
+
name,
|
|
41
|
+
permissions: {},
|
|
42
|
+
resolutionSource: 'auto-discovered',
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
function buildSummary(compilations) {
|
|
46
|
+
return compilations.reduce((summary, compiled) => ({
|
|
47
|
+
readonly: summary.readonly + compiled.summary.readonly,
|
|
48
|
+
readwrite: summary.readwrite + compiled.summary.readwrite,
|
|
49
|
+
denied: summary.denied + compiled.summary.denied,
|
|
50
|
+
customScopes: summary.customScopes + compiled.summary.customScopes,
|
|
51
|
+
}), { readonly: 0, readwrite: 0, denied: 0, customScopes: 0 });
|
|
52
|
+
}
|
|
53
|
+
function buildAgentResult(projectDir, name, token, compiled, mountPoint) {
|
|
54
|
+
return {
|
|
55
|
+
name,
|
|
56
|
+
tokenPath: path.resolve(projectDir, '.relay', 'tokens', `${name}.jwt`),
|
|
57
|
+
token,
|
|
58
|
+
scopes: [...compiled.scopes],
|
|
59
|
+
compiled,
|
|
60
|
+
mountPoint,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function sanitizePathComponent(value) {
|
|
64
|
+
return value.replace(/[^a-zA-Z0-9._-]+/g, '-');
|
|
65
|
+
}
|
|
66
|
+
function countAclDirectories(compilations) {
|
|
67
|
+
const directories = new Set();
|
|
68
|
+
for (const compilation of compilations) {
|
|
69
|
+
for (const directory of Object.keys(compilation.acl)) {
|
|
70
|
+
directories.add(directory);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return directories.size;
|
|
74
|
+
}
|
|
75
|
+
// ── Public API ──────────────────────────────────────────────────────────────
|
|
76
|
+
export async function provisionWorkflowAgents(config) {
|
|
77
|
+
const audit = new PermissionAuditLog();
|
|
78
|
+
const auditPath = getDefaultPermissionAuditPath(config.projectDir);
|
|
79
|
+
try {
|
|
80
|
+
const agents = resolveAgents(config);
|
|
81
|
+
const tokens = new Map();
|
|
82
|
+
const scopes = new Map();
|
|
83
|
+
const mounts = new Map();
|
|
84
|
+
const agentResults = {};
|
|
85
|
+
const compilations = [];
|
|
86
|
+
const compiledByAgent = new Map();
|
|
87
|
+
for (const agent of agents) {
|
|
88
|
+
audit.log({
|
|
89
|
+
agentName: agent.name,
|
|
90
|
+
action: 'resolve',
|
|
91
|
+
details: {
|
|
92
|
+
source: agent.resolutionSource,
|
|
93
|
+
workspace: config.workspace,
|
|
94
|
+
permissionKeys: Object.keys(agent.permissions).sort(),
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
const compiled = compileAgentScopes({
|
|
98
|
+
agentName: agent.name,
|
|
99
|
+
workspace: config.workspace,
|
|
100
|
+
projectDir: config.projectDir,
|
|
101
|
+
permissions: agent.permissions,
|
|
102
|
+
});
|
|
103
|
+
const token = mintAgentToken({
|
|
104
|
+
privateKey: config.tokenSigningKey.privateKey,
|
|
105
|
+
kid: config.tokenSigningKey.kid,
|
|
106
|
+
agentName: agent.name,
|
|
107
|
+
workspace: config.workspace,
|
|
108
|
+
scopes: compiled.scopes,
|
|
109
|
+
ttlSeconds: config.tokenTtlSeconds,
|
|
110
|
+
});
|
|
111
|
+
audit.log({
|
|
112
|
+
agentName: agent.name,
|
|
113
|
+
action: 'mint',
|
|
114
|
+
details: {
|
|
115
|
+
workspace: config.workspace,
|
|
116
|
+
jwtPath: path.resolve(config.projectDir, '.relay', 'tokens', `${agent.name}.jwt`),
|
|
117
|
+
scopeCount: compiled.scopes.length,
|
|
118
|
+
scopes: [...compiled.scopes],
|
|
119
|
+
ttlSeconds: config.tokenTtlSeconds ?? null,
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
tokens.set(agent.name, token);
|
|
123
|
+
scopes.set(agent.name, [...compiled.scopes]);
|
|
124
|
+
compilations.push(compiled);
|
|
125
|
+
compiledByAgent.set(agent.name, compiled);
|
|
126
|
+
}
|
|
127
|
+
const adminScopes = [...(config.adminScopes ?? DEFAULT_ADMIN_SCOPES)];
|
|
128
|
+
const adminToken = mintAgentToken({
|
|
129
|
+
privateKey: config.tokenSigningKey.privateKey,
|
|
130
|
+
kid: config.tokenSigningKey.kid,
|
|
131
|
+
agentName: DEFAULT_ADMIN_AGENT_NAME,
|
|
132
|
+
workspace: config.workspace,
|
|
133
|
+
scopes: adminScopes,
|
|
134
|
+
ttlSeconds: config.tokenTtlSeconds,
|
|
135
|
+
});
|
|
136
|
+
audit.log({
|
|
137
|
+
agentName: DEFAULT_ADMIN_AGENT_NAME,
|
|
138
|
+
action: 'mint',
|
|
139
|
+
details: {
|
|
140
|
+
workspace: config.workspace,
|
|
141
|
+
role: 'admin',
|
|
142
|
+
scopeCount: adminScopes.length,
|
|
143
|
+
scopes: adminScopes,
|
|
144
|
+
ttlSeconds: config.tokenTtlSeconds ?? null,
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
let seededAclCount = 0;
|
|
148
|
+
let seededFileCount = 0;
|
|
149
|
+
if (!config.skipSeeding) {
|
|
150
|
+
await createWorkspaceIfNeeded(config.relayfileBaseUrl, adminToken, config.workspace);
|
|
151
|
+
audit.log({
|
|
152
|
+
agentName: DEFAULT_ADMIN_AGENT_NAME,
|
|
153
|
+
action: 'seed',
|
|
154
|
+
details: {
|
|
155
|
+
workspace: config.workspace,
|
|
156
|
+
step: 'workspace',
|
|
157
|
+
relayfileBaseUrl: config.relayfileBaseUrl,
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
seededFileCount = await seedWorkspace(config.relayfileBaseUrl, adminToken, config.workspace, config.projectDir, config.excludeDirs ?? []);
|
|
161
|
+
audit.log({
|
|
162
|
+
agentName: DEFAULT_ADMIN_AGENT_NAME,
|
|
163
|
+
action: 'seed',
|
|
164
|
+
details: {
|
|
165
|
+
workspace: config.workspace,
|
|
166
|
+
step: 'files',
|
|
167
|
+
projectDir: config.projectDir,
|
|
168
|
+
excludeDirs: config.excludeDirs ?? [],
|
|
169
|
+
fileCount: seededFileCount,
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
await seedWorkflowAcls({
|
|
173
|
+
relayfileUrl: config.relayfileBaseUrl,
|
|
174
|
+
adminToken,
|
|
175
|
+
workspace: config.workspace,
|
|
176
|
+
agents: compilations.map((compilation) => ({
|
|
177
|
+
name: compilation.agentName,
|
|
178
|
+
acl: compilation.acl,
|
|
179
|
+
})),
|
|
180
|
+
});
|
|
181
|
+
seededAclCount = countAclDirectories(compilations);
|
|
182
|
+
audit.log({
|
|
183
|
+
agentName: DEFAULT_ADMIN_AGENT_NAME,
|
|
184
|
+
action: 'seed',
|
|
185
|
+
details: {
|
|
186
|
+
workspace: config.workspace,
|
|
187
|
+
step: 'acl',
|
|
188
|
+
directoryCount: seededAclCount,
|
|
189
|
+
agentCount: compilations.length,
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
if (!config.skipMount) {
|
|
194
|
+
const mountRoot = path.resolve(config.mountBaseDir ?? path.join(config.projectDir, '.relay'));
|
|
195
|
+
try {
|
|
196
|
+
for (const agent of agents) {
|
|
197
|
+
const token = tokens.get(agent.name);
|
|
198
|
+
const compiled = compiledByAgent.get(agent.name);
|
|
199
|
+
if (!token || !compiled) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const mountHandle = await ensureRelayfileMount({
|
|
203
|
+
binaryPath: config.mountBinaryPath,
|
|
204
|
+
relayfileUrl: config.relayfileBaseUrl,
|
|
205
|
+
workspace: config.workspace,
|
|
206
|
+
token,
|
|
207
|
+
mountPoint: path.join(mountRoot, `workspace-${sanitizePathComponent(config.workspace)}-${sanitizePathComponent(agent.name)}`),
|
|
208
|
+
});
|
|
209
|
+
mounts.set(agent.name, mountHandle);
|
|
210
|
+
agentResults[agent.name] = buildAgentResult(config.projectDir, agent.name, token, compiled, mountHandle.mountPoint);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch (mountError) {
|
|
214
|
+
for (const [, mount] of mounts) {
|
|
215
|
+
try {
|
|
216
|
+
if (typeof mount.stop === 'function') {
|
|
217
|
+
await mount.stop();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// Best-effort cleanup.
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
mounts.clear();
|
|
225
|
+
throw mountError;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
for (const agent of agents) {
|
|
230
|
+
const token = tokens.get(agent.name);
|
|
231
|
+
const compiled = compiledByAgent.get(agent.name);
|
|
232
|
+
if (!token || !compiled) {
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
agentResults[agent.name] = buildAgentResult(config.projectDir, agent.name, token, compiled);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
agents: agentResults,
|
|
240
|
+
agentNames: agents.map((agent) => agent.name),
|
|
241
|
+
adminToken,
|
|
242
|
+
seededFileCount,
|
|
243
|
+
seededAclCount,
|
|
244
|
+
summary: buildSummary(compilations),
|
|
245
|
+
mounts,
|
|
246
|
+
tokens,
|
|
247
|
+
scopes,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
finally {
|
|
251
|
+
try {
|
|
252
|
+
await audit.writeTo(auditPath);
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
if (config.verbose) {
|
|
256
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
257
|
+
console.warn(`Failed to write permission audit to ${auditPath}: ${message}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (config.verbose) {
|
|
261
|
+
console.info(audit.summary());
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Backwards-compatible re-export so callers that previously did
|
|
266
|
+
// `import { resolveAgentPermissions } from '@agent-relay/sdk/provisioner'`
|
|
267
|
+
// can swap to `@relayflows/core`.
|
|
268
|
+
export { resolveAgentPermissions } from '@agent-relay/cloud';
|
|
269
|
+
//# sourceMappingURL=provisioner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisioner.js","sourceRoot":"","sources":["../src/provisioner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { AgentDefinition, SwarmConfig } from './types.js';
|
|
2
|
+
export interface ProxyEnvBinding {
|
|
3
|
+
baseUrlVar: string;
|
|
4
|
+
apiKeyVar: string;
|
|
5
|
+
}
|
|
6
|
+
export type ProxyEnvRegistry = Record<string, readonly ProxyEnvBinding[]>;
|
|
7
|
+
export declare const RELAY_PROXY_URL_ENV: "RELAY_LLM_PROXY";
|
|
8
|
+
export declare const RELAY_PROXY_URL_ENV_ALIAS: "RELAY_LLM_PROXY_URL";
|
|
9
|
+
export declare const RELAY_PROXY_TOKEN_ENV: "CREDENTIAL_PROXY_TOKEN";
|
|
10
|
+
export declare const RELAY_PROXY_TOKEN_ENV_ALIAS: "RELAY_LLM_PROXY_TOKEN";
|
|
11
|
+
export declare const DEFAULT_PROXY_ENV_REGISTRY: {
|
|
12
|
+
readonly claude: readonly [{
|
|
13
|
+
readonly baseUrlVar: "ANTHROPIC_BASE_URL";
|
|
14
|
+
readonly apiKeyVar: "ANTHROPIC_API_KEY";
|
|
15
|
+
}];
|
|
16
|
+
readonly codex: readonly [{
|
|
17
|
+
readonly baseUrlVar: "OPENAI_BASE_URL";
|
|
18
|
+
readonly apiKeyVar: "OPENAI_API_KEY";
|
|
19
|
+
}];
|
|
20
|
+
readonly opencode: readonly [{
|
|
21
|
+
readonly baseUrlVar: "OPENAI_BASE_URL";
|
|
22
|
+
readonly apiKeyVar: "OPENAI_API_KEY";
|
|
23
|
+
}];
|
|
24
|
+
readonly aider: readonly [{
|
|
25
|
+
readonly baseUrlVar: "OPENAI_API_BASE";
|
|
26
|
+
readonly apiKeyVar: "OPENAI_API_KEY";
|
|
27
|
+
}];
|
|
28
|
+
readonly gemini: readonly [{
|
|
29
|
+
readonly baseUrlVar: "GOOGLE_API_BASE";
|
|
30
|
+
readonly apiKeyVar: "GOOGLE_API_KEY";
|
|
31
|
+
}];
|
|
32
|
+
readonly goose: readonly [{
|
|
33
|
+
readonly baseUrlVar: "OPENAI_BASE_URL";
|
|
34
|
+
readonly apiKeyVar: "OPENAI_API_KEY";
|
|
35
|
+
}];
|
|
36
|
+
readonly droid: readonly [{
|
|
37
|
+
readonly baseUrlVar: "OPENAI_BASE_URL";
|
|
38
|
+
readonly apiKeyVar: "OPENAI_API_KEY";
|
|
39
|
+
}];
|
|
40
|
+
readonly cursor: readonly [{
|
|
41
|
+
readonly baseUrlVar: "OPENAI_BASE_URL";
|
|
42
|
+
readonly apiKeyVar: "OPENAI_API_KEY";
|
|
43
|
+
}];
|
|
44
|
+
};
|
|
45
|
+
export declare function createProxyEnvResolver(registry?: ProxyEnvRegistry): (cli: string, proxyUrl: string, proxyToken: string) => Record<string, string>;
|
|
46
|
+
export declare const resolveProxyEnv: (cli: string, proxyUrl: string, proxyToken: string) => Record<string, string>;
|
|
47
|
+
export declare function resolveProxyUrlFromEnv(env?: Record<string, string | undefined>): string | undefined;
|
|
48
|
+
export declare function resolveProxyTokenFromEnv(env?: Record<string, string | undefined>): string | undefined;
|
|
49
|
+
export declare function buildNormalizedProxyEnv(proxyUrl: string, proxyToken: string): Record<string, string>;
|
|
50
|
+
export declare function getStrippedApiKeyVars(): string[];
|
|
51
|
+
export declare function isProxyEnabled(agentDef?: Pick<AgentDefinition, 'credentials'> | null, swarmConfig?: Pick<SwarmConfig, 'credentialProxy'> | null): boolean;
|
|
52
|
+
//# sourceMappingURL=proxy-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-env.d.ts","sourceRoot":"","sources":["../src/proxy-env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC,CAAC;AAE1E,eAAO,MAAM,mBAAmB,EAAG,iBAA0B,CAAC;AAC9D,eAAO,MAAM,yBAAyB,EAAG,qBAA8B,CAAC;AACxE,eAAO,MAAM,qBAAqB,EAAG,wBAAiC,CAAC;AACvE,eAAO,MAAM,2BAA2B,EAAG,uBAAgC,CAAC;AAuC5E,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CASF,CAAC;AAmBtC,wBAAgB,sBAAsB,CAAC,QAAQ,GAAE,gBAA6C,IACpF,KAAK,MAAM,EAAE,UAAU,MAAM,EAAE,YAAY,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBnF;AAED,eAAO,MAAM,eAAe,QAnBb,MAAM,YAAY,MAAM,cAAc,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAmB5B,CAAC;AAExD,wBAAgB,sBAAsB,CACpC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,wBAAwB,CACtC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOpG;AAED,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED,wBAAgB,cAAc,CAC5B,QAAQ,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,IAAI,EACtD,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,GAAG,IAAI,GACxD,OAAO,CAET"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { getCliDefinition } from './cli-registry.js';
|
|
2
|
+
export const RELAY_PROXY_URL_ENV = 'RELAY_LLM_PROXY';
|
|
3
|
+
export const RELAY_PROXY_URL_ENV_ALIAS = 'RELAY_LLM_PROXY_URL';
|
|
4
|
+
export const RELAY_PROXY_TOKEN_ENV = 'CREDENTIAL_PROXY_TOKEN';
|
|
5
|
+
export const RELAY_PROXY_TOKEN_ENV_ALIAS = 'RELAY_LLM_PROXY_TOKEN';
|
|
6
|
+
const OPENAI_COMPATIBLE_BINDINGS = [
|
|
7
|
+
{ baseUrlVar: 'OPENAI_BASE_URL', apiKeyVar: 'OPENAI_API_KEY' },
|
|
8
|
+
];
|
|
9
|
+
const ANTHROPIC_BINDINGS = [
|
|
10
|
+
{ baseUrlVar: 'ANTHROPIC_BASE_URL', apiKeyVar: 'ANTHROPIC_API_KEY' },
|
|
11
|
+
];
|
|
12
|
+
const AIDER_BINDINGS = [
|
|
13
|
+
{ baseUrlVar: 'OPENAI_API_BASE', apiKeyVar: 'OPENAI_API_KEY' },
|
|
14
|
+
];
|
|
15
|
+
const GEMINI_BINDINGS = [
|
|
16
|
+
{ baseUrlVar: 'GOOGLE_API_BASE', apiKeyVar: 'GOOGLE_API_KEY' },
|
|
17
|
+
];
|
|
18
|
+
const GENERIC_FALLBACK_BINDINGS = [
|
|
19
|
+
...OPENAI_COMPATIBLE_BINDINGS,
|
|
20
|
+
...ANTHROPIC_BINDINGS,
|
|
21
|
+
];
|
|
22
|
+
const STRIPPED_API_KEY_VARS = [
|
|
23
|
+
'OPENAI_API_KEY',
|
|
24
|
+
'ANTHROPIC_API_KEY',
|
|
25
|
+
'OPENROUTER_API_KEY',
|
|
26
|
+
'GOOGLE_API_KEY',
|
|
27
|
+
'OPENAI_BASE_URL',
|
|
28
|
+
'ANTHROPIC_BASE_URL',
|
|
29
|
+
'OPENAI_API_BASE',
|
|
30
|
+
'GOOGLE_API_BASE',
|
|
31
|
+
];
|
|
32
|
+
const CLI_ALIASES = {
|
|
33
|
+
agent: 'cursor',
|
|
34
|
+
'cursor-agent': 'cursor',
|
|
35
|
+
};
|
|
36
|
+
export const DEFAULT_PROXY_ENV_REGISTRY = {
|
|
37
|
+
claude: ANTHROPIC_BINDINGS,
|
|
38
|
+
codex: OPENAI_COMPATIBLE_BINDINGS,
|
|
39
|
+
opencode: OPENAI_COMPATIBLE_BINDINGS,
|
|
40
|
+
aider: AIDER_BINDINGS,
|
|
41
|
+
gemini: GEMINI_BINDINGS,
|
|
42
|
+
goose: OPENAI_COMPATIBLE_BINDINGS,
|
|
43
|
+
droid: OPENAI_COMPATIBLE_BINDINGS,
|
|
44
|
+
cursor: OPENAI_COMPATIBLE_BINDINGS,
|
|
45
|
+
};
|
|
46
|
+
function normalizeCli(cli) {
|
|
47
|
+
const baseCli = cli.includes(':') ? cli.split(':')[0] : cli;
|
|
48
|
+
return CLI_ALIASES[baseCli] ?? baseCli;
|
|
49
|
+
}
|
|
50
|
+
function buildProxyEnv(bindings, proxyUrl, proxyToken) {
|
|
51
|
+
return bindings.reduce((env, binding) => {
|
|
52
|
+
env[binding.baseUrlVar] = proxyUrl;
|
|
53
|
+
env[binding.apiKeyVar] = proxyToken;
|
|
54
|
+
return env;
|
|
55
|
+
}, {});
|
|
56
|
+
}
|
|
57
|
+
export function createProxyEnvResolver(registry = DEFAULT_PROXY_ENV_REGISTRY) {
|
|
58
|
+
return (cli, proxyUrl, proxyToken) => {
|
|
59
|
+
const normalizedCli = normalizeCli(cli);
|
|
60
|
+
const bindings = registry[normalizedCli];
|
|
61
|
+
if (bindings) {
|
|
62
|
+
return buildProxyEnv(bindings, proxyUrl, proxyToken);
|
|
63
|
+
}
|
|
64
|
+
const knownCli = getCliDefinition(normalizedCli);
|
|
65
|
+
const warningPrefix = knownCli ? 'No proxy env registry entry' : 'Unknown CLI';
|
|
66
|
+
console.warn(`[proxy-env] ${warningPrefix} for "${normalizedCli}". ` +
|
|
67
|
+
'Falling back to generic OpenAI/Anthropic proxy env overrides.');
|
|
68
|
+
return buildProxyEnv(GENERIC_FALLBACK_BINDINGS, proxyUrl, proxyToken);
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export const resolveProxyEnv = createProxyEnvResolver();
|
|
72
|
+
export function resolveProxyUrlFromEnv(env = process.env) {
|
|
73
|
+
return env[RELAY_PROXY_URL_ENV] ?? env[RELAY_PROXY_URL_ENV_ALIAS];
|
|
74
|
+
}
|
|
75
|
+
export function resolveProxyTokenFromEnv(env = process.env) {
|
|
76
|
+
return env[RELAY_PROXY_TOKEN_ENV] ?? env[RELAY_PROXY_TOKEN_ENV_ALIAS];
|
|
77
|
+
}
|
|
78
|
+
export function buildNormalizedProxyEnv(proxyUrl, proxyToken) {
|
|
79
|
+
return {
|
|
80
|
+
[RELAY_PROXY_URL_ENV]: proxyUrl,
|
|
81
|
+
[RELAY_PROXY_URL_ENV_ALIAS]: proxyUrl,
|
|
82
|
+
[RELAY_PROXY_TOKEN_ENV]: proxyToken,
|
|
83
|
+
[RELAY_PROXY_TOKEN_ENV_ALIAS]: proxyToken,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export function getStrippedApiKeyVars() {
|
|
87
|
+
return [...STRIPPED_API_KEY_VARS];
|
|
88
|
+
}
|
|
89
|
+
export function isProxyEnabled(agentDef, swarmConfig) {
|
|
90
|
+
return Boolean(agentDef?.credentials?.proxy && swarmConfig?.credentialProxy);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=proxy-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-env.js","sourceRoot":"","sources":["../src/proxy-env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Programmatic local runner for `.ts` / `.tsx` / `.py` workflow scripts.
|
|
3
|
+
*
|
|
4
|
+
* This is the body of the `agent-relay run <script>` command extracted into
|
|
5
|
+
* the SDK so other tools (e.g. `ricky run`) can drive the same execution
|
|
6
|
+
* flow without shelling out to the `agent-relay` binary.
|
|
7
|
+
*
|
|
8
|
+
* Behavior is preserved exactly — the relay CLI's `run` command now
|
|
9
|
+
* delegates to `runScriptWorkflow()` with no semantic change.
|
|
10
|
+
*/
|
|
11
|
+
import { execFileSync } from 'node:child_process';
|
|
12
|
+
export type ExecFileSyncLike = typeof execFileSync;
|
|
13
|
+
export interface RunScriptWorkflowOptions {
|
|
14
|
+
/** Validate without running. Sets `DRY_RUN=true` in the child env. */
|
|
15
|
+
dryRun?: boolean;
|
|
16
|
+
/** Resume a previously failed workflow run by id. */
|
|
17
|
+
resume?: string;
|
|
18
|
+
/** Start from the given step name, skipping predecessors. */
|
|
19
|
+
startFrom?: string;
|
|
20
|
+
/** Use cached outputs from this previous run id. Pairs with `startFrom`. */
|
|
21
|
+
previousRunId?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Parsed workflow parse error, normalized from whatever shape the tsx/esbuild
|
|
25
|
+
* subprocess produced on stderr. Decoupling this from any specific error class
|
|
26
|
+
* means the formatter is testable in isolation and works regardless of how
|
|
27
|
+
* the error surfaced (TransformError from tsx, Bun-bundled esbuild error, etc.).
|
|
28
|
+
*/
|
|
29
|
+
export interface ParsedWorkflowError {
|
|
30
|
+
file: string;
|
|
31
|
+
line?: number;
|
|
32
|
+
column?: number;
|
|
33
|
+
message: string;
|
|
34
|
+
lineText?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface LocalSdkWorkspace {
|
|
37
|
+
rootDir: string;
|
|
38
|
+
sdkDir: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Walk upward from `startDir` looking for a workspace where the root
|
|
42
|
+
* `package.json` is `agent-relay` and `packages/sdk/package.json` is
|
|
43
|
+
* `@agent-relay/sdk`. Returns the matched paths or `null`.
|
|
44
|
+
*/
|
|
45
|
+
export declare function findLocalSdkWorkspace(startDir: string): LocalSdkWorkspace | null;
|
|
46
|
+
/**
|
|
47
|
+
* When running inside the relay monorepo, ensure `packages/sdk/dist/workflows`
|
|
48
|
+
* is built so the script can resolve `@relayflows/core`. No-op
|
|
49
|
+
* outside the monorepo or when the build is already present.
|
|
50
|
+
*/
|
|
51
|
+
export declare function ensureLocalSdkWorkflowRuntime(startDir: string, execRunner?: ExecFileSyncLike): void;
|
|
52
|
+
/**
|
|
53
|
+
* Parse tsx's stderr for the esbuild parse-error fingerprint and extract a
|
|
54
|
+
* normalized {@link ParsedWorkflowError}. Returns null if nothing looks like
|
|
55
|
+
* a parse error — runtime errors, module-not-found, etc. pass through.
|
|
56
|
+
*
|
|
57
|
+
* We match two common esbuild output formats:
|
|
58
|
+
* 1. `/path/file.ts:LINE:COL: ERROR: message` (most common, one-liner)
|
|
59
|
+
* 2. `✘ [ERROR] message\n\n /path/file.ts:LINE:COL:\n LINE │ text\n ╵ pointer`
|
|
60
|
+
* (pretty-printed, multi-line)
|
|
61
|
+
*/
|
|
62
|
+
export declare function parseTsxStderr(stderr: string): ParsedWorkflowError | null;
|
|
63
|
+
export declare function shouldSkipNodeStripTypesPreflight(filePath: string, seen?: Set<string>, isEntry?: boolean): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Format a {@link ParsedWorkflowError} as an actionable workflow-author error
|
|
66
|
+
* message with hints keyed off the most common mistakes in `command:` /
|
|
67
|
+
* `task:` template literals.
|
|
68
|
+
*/
|
|
69
|
+
export declare function formatWorkflowParseError(parsed: ParsedWorkflowError): Error;
|
|
70
|
+
/**
|
|
71
|
+
* Run a `.ts`, `.tsx`, or `.py` workflow script locally.
|
|
72
|
+
*
|
|
73
|
+
* For TypeScript files, tries Node's `--experimental-strip-types` first
|
|
74
|
+
* (Node 22.6+), then falls back to `tsx`, `ts-node`, and finally `npx tsx`.
|
|
75
|
+
* For Python files, tries `python3` then `python`.
|
|
76
|
+
*
|
|
77
|
+
* Throws on non-zero exit. The error message includes the run id (when
|
|
78
|
+
* the script wrote one to `AGENT_RELAY_RUN_ID_FILE`) so callers can resume
|
|
79
|
+
* with `--start-from <step> --previous-run-id <id>`.
|
|
80
|
+
*/
|
|
81
|
+
export declare function runScriptWorkflow(filePath: string, options?: RunScriptWorkflowOptions): Promise<void>;
|
|
82
|
+
//# sourceMappingURL=run-script.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-script.d.ts","sourceRoot":"","sources":["../src/run-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,YAAY,EAAoC,MAAM,oBAAoB,CAAC;AAIpF,MAAM,MAAM,gBAAgB,GAAG,OAAO,YAAY,CAAC;AAEnD,MAAM,WAAW,wBAAwB;IACvC,sEAAsE;IACtE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAwBD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAwBhF;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,gBAA+B,GAC1C,IAAI,CA6BN;AAID;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CA4CzE;AAsDD,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,MAAM,EAChB,IAAI,cAAoB,EACxB,OAAO,UAAO,GACb,OAAO,CAuBT;AA2ED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,mBAAmB,GAAG,KAAK,CAoD3E;AAkDD;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,IAAI,CAAC,CAiKf"}
|