@agent-relay/sdk 4.0.1 → 4.0.3

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 (94) hide show
  1. package/bin/agent-relay-broker-darwin-arm64 +0 -0
  2. package/bin/agent-relay-broker-darwin-x64 +0 -0
  3. package/bin/agent-relay-broker-linux-arm64 +0 -0
  4. package/bin/agent-relay-broker-linux-x64 +0 -0
  5. package/dist/client.d.ts +3 -10
  6. package/dist/client.d.ts.map +1 -1
  7. package/dist/client.js +2 -0
  8. package/dist/client.js.map +1 -1
  9. package/dist/provisioner/__tests__/audit.test.d.ts +2 -0
  10. package/dist/provisioner/__tests__/audit.test.d.ts.map +1 -0
  11. package/dist/provisioner/__tests__/audit.test.js +45 -0
  12. package/dist/provisioner/__tests__/audit.test.js.map +1 -0
  13. package/dist/provisioner/__tests__/compiler.test.d.ts +2 -0
  14. package/dist/provisioner/__tests__/compiler.test.d.ts.map +1 -0
  15. package/dist/provisioner/__tests__/compiler.test.js +345 -0
  16. package/dist/provisioner/__tests__/compiler.test.js.map +1 -0
  17. package/dist/provisioner/__tests__/presets.test.d.ts +2 -0
  18. package/dist/provisioner/__tests__/presets.test.d.ts.map +1 -0
  19. package/dist/provisioner/__tests__/presets.test.js +23 -0
  20. package/dist/provisioner/__tests__/presets.test.js.map +1 -0
  21. package/dist/provisioner/__tests__/seeder.test.d.ts +2 -0
  22. package/dist/provisioner/__tests__/seeder.test.d.ts.map +1 -0
  23. package/dist/provisioner/__tests__/seeder.test.js +224 -0
  24. package/dist/provisioner/__tests__/seeder.test.js.map +1 -0
  25. package/dist/provisioner/__tests__/tar-seeder.test.d.ts +2 -0
  26. package/dist/provisioner/__tests__/tar-seeder.test.d.ts.map +1 -0
  27. package/dist/provisioner/__tests__/tar-seeder.test.js +191 -0
  28. package/dist/provisioner/__tests__/tar-seeder.test.js.map +1 -0
  29. package/dist/provisioner/__tests__/token-factory.test.d.ts +2 -0
  30. package/dist/provisioner/__tests__/token-factory.test.d.ts.map +1 -0
  31. package/dist/provisioner/__tests__/token-factory.test.js +127 -0
  32. package/dist/provisioner/__tests__/token-factory.test.js.map +1 -0
  33. package/dist/provisioner/__tests__/token.test.d.ts +2 -0
  34. package/dist/provisioner/__tests__/token.test.d.ts.map +1 -0
  35. package/dist/provisioner/__tests__/token.test.js +44 -0
  36. package/dist/provisioner/__tests__/token.test.js.map +1 -0
  37. package/dist/provisioner/audit.d.ts +19 -0
  38. package/dist/provisioner/audit.d.ts.map +1 -0
  39. package/dist/provisioner/audit.js +74 -0
  40. package/dist/provisioner/audit.js.map +1 -0
  41. package/dist/provisioner/compiler.d.ts +23 -0
  42. package/dist/provisioner/compiler.d.ts.map +1 -0
  43. package/dist/provisioner/compiler.js +355 -0
  44. package/dist/provisioner/compiler.js.map +1 -0
  45. package/dist/provisioner/index.d.ts +9 -0
  46. package/dist/provisioner/index.d.ts.map +1 -0
  47. package/dist/provisioner/index.js +266 -0
  48. package/dist/provisioner/index.js.map +1 -0
  49. package/dist/provisioner/mount.d.ts +14 -0
  50. package/dist/provisioner/mount.d.ts.map +1 -0
  51. package/dist/provisioner/mount.js +329 -0
  52. package/dist/provisioner/mount.js.map +1 -0
  53. package/dist/provisioner/seeder.d.ts +17 -0
  54. package/dist/provisioner/seeder.d.ts.map +1 -0
  55. package/dist/provisioner/seeder.js +419 -0
  56. package/dist/provisioner/seeder.js.map +1 -0
  57. package/dist/provisioner/token.d.ts +38 -0
  58. package/dist/provisioner/token.d.ts.map +1 -0
  59. package/dist/provisioner/token.js +74 -0
  60. package/dist/provisioner/token.js.map +1 -0
  61. package/dist/provisioner/types.d.ts +133 -0
  62. package/dist/provisioner/types.d.ts.map +1 -0
  63. package/dist/provisioner/types.js +2 -0
  64. package/dist/provisioner/types.js.map +1 -0
  65. package/dist/relay.d.ts +6 -0
  66. package/dist/relay.d.ts.map +1 -1
  67. package/dist/relay.js +17 -5
  68. package/dist/relay.js.map +1 -1
  69. package/dist/types.d.ts +9 -0
  70. package/dist/types.d.ts.map +1 -1
  71. package/dist/workflows/__tests__/e2e-permissions.test.d.ts +2 -0
  72. package/dist/workflows/__tests__/e2e-permissions.test.d.ts.map +1 -0
  73. package/dist/workflows/__tests__/e2e-permissions.test.js +331 -0
  74. package/dist/workflows/__tests__/e2e-permissions.test.js.map +1 -0
  75. package/dist/workflows/__tests__/permission-types.test.d.ts +2 -0
  76. package/dist/workflows/__tests__/permission-types.test.d.ts.map +1 -0
  77. package/dist/workflows/__tests__/permission-types.test.js +124 -0
  78. package/dist/workflows/__tests__/permission-types.test.js.map +1 -0
  79. package/dist/workflows/__tests__/permissions-integration.test.d.ts +2 -0
  80. package/dist/workflows/__tests__/permissions-integration.test.d.ts.map +1 -0
  81. package/dist/workflows/__tests__/permissions-integration.test.js +526 -0
  82. package/dist/workflows/__tests__/permissions-integration.test.js.map +1 -0
  83. package/dist/workflows/dry-run-format.d.ts.map +1 -1
  84. package/dist/workflows/dry-run-format.js +8 -0
  85. package/dist/workflows/dry-run-format.js.map +1 -1
  86. package/dist/workflows/runner.d.ts +14 -0
  87. package/dist/workflows/runner.d.ts.map +1 -1
  88. package/dist/workflows/runner.js +455 -6
  89. package/dist/workflows/runner.js.map +1 -1
  90. package/dist/workflows/types.d.ts +190 -0
  91. package/dist/workflows/types.d.ts.map +1 -1
  92. package/dist/workflows/types.js +29 -0
  93. package/dist/workflows/types.js.map +1 -1
  94. package/package.json +6 -2
@@ -0,0 +1,331 @@
1
+ import { beforeEach, afterEach, describe, expect, it, vi } from 'vitest';
2
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ const fixturePath = fileURLToPath(new URL('./fixtures/permission-test.yaml', import.meta.url));
7
+ const permissionProfiles = {
8
+ reader: {
9
+ access: 'readonly',
10
+ scopes: ['relayfile:fs:read:/**'],
11
+ summary: { readonly: 4, readwrite: 0, denied: 0, customScopes: 0 },
12
+ },
13
+ writer: {
14
+ access: 'readwrite',
15
+ scopes: ['relayfile:fs:read:/src/tests/**', 'relayfile:fs:write:/src/tests/**'],
16
+ summary: { readonly: 0, readwrite: 1, denied: 2, customScopes: 0 },
17
+ },
18
+ 'admin-lead': {
19
+ access: 'full',
20
+ scopes: ['relayfile:fs:read:/**', 'relayfile:fs:write:/**'],
21
+ summary: { readonly: 0, readwrite: 6, denied: 0, customScopes: 0 },
22
+ },
23
+ };
24
+ function buildCompiledPermissions(agentName, workspace, profile) {
25
+ return {
26
+ agentName,
27
+ workspace,
28
+ effectiveAccess: profile.access,
29
+ inherited: profile.access !== 'full',
30
+ sources: [{ type: 'yaml', label: 'permissions', ruleCount: profile.scopes.length }],
31
+ readonlyPatterns: profile.access === 'readonly' ? ['**'] : [],
32
+ readwritePatterns: profile.access === 'full'
33
+ ? ['**']
34
+ : profile.scopes
35
+ .filter((scope) => scope.startsWith('relayfile:fs:write:'))
36
+ .map((scope) => scope.split(':').slice(3).join(':')),
37
+ deniedPatterns: agentName === 'writer' ? ['.env', 'secrets/**'] : [],
38
+ readonlyPaths: Array.from({ length: profile.summary.readonly }, (_, index) => `readonly-${index}.txt`),
39
+ readwritePaths: Array.from({ length: profile.summary.readwrite }, (_, index) => `write-${index}.txt`),
40
+ deniedPaths: Array.from({ length: profile.summary.denied }, (_, index) => `denied-${index}.txt`),
41
+ scopes: [...profile.scopes],
42
+ network: undefined,
43
+ exec: undefined,
44
+ acl: {},
45
+ summary: { ...profile.summary },
46
+ };
47
+ }
48
+ let lastProvisionCall = null;
49
+ let lastProvisionResult = null;
50
+ const mockProvisionWorkflowAgents = vi.fn(async (input) => {
51
+ lastProvisionCall = input;
52
+ const agentNames = Object.keys(input.agents ?? {});
53
+ const tokens = new Map();
54
+ const scopes = new Map();
55
+ const agents = Object.fromEntries(agentNames.map((agentName) => {
56
+ const profile = permissionProfiles[agentName];
57
+ const token = `jwt-${agentName}`;
58
+ const compiled = buildCompiledPermissions(agentName, input.workspace, profile);
59
+ tokens.set(agentName, token);
60
+ scopes.set(agentName, [...profile.scopes]);
61
+ return [
62
+ agentName,
63
+ {
64
+ name: agentName,
65
+ tokenPath: path.join(input.projectDir, '.relay', 'tokens', `${agentName}.jwt`),
66
+ token,
67
+ scopes: [...profile.scopes],
68
+ compiled,
69
+ },
70
+ ];
71
+ }));
72
+ const result = {
73
+ agents,
74
+ agentNames,
75
+ adminToken: 'jwt-admin',
76
+ seededFileCount: 0,
77
+ seededAclCount: 0,
78
+ summary: agentNames.reduce((acc, agentName) => {
79
+ const profile = permissionProfiles[agentName];
80
+ acc.readonly += profile.summary.readonly;
81
+ acc.readwrite += profile.summary.readwrite;
82
+ acc.denied += profile.summary.denied;
83
+ acc.customScopes += profile.summary.customScopes;
84
+ return acc;
85
+ }, { readonly: 0, readwrite: 0, denied: 0, customScopes: 0 }),
86
+ mounts: new Map(),
87
+ tokens,
88
+ scopes,
89
+ };
90
+ lastProvisionResult = result;
91
+ return result;
92
+ });
93
+ const mockResolveAgentPermissions = vi.fn((agentName, _permissions, _projectDir, workspace) => buildCompiledPermissions(agentName, workspace, permissionProfiles[agentName]));
94
+ vi.mock('../../provisioner/index.js', async (importOriginal) => {
95
+ const actual = await importOriginal();
96
+ return {
97
+ ...actual,
98
+ provisionWorkflowAgents: mockProvisionWorkflowAgents,
99
+ resolveAgentPermissions: mockResolveAgentPermissions,
100
+ };
101
+ });
102
+ const mockFetch = vi.fn().mockResolvedValue({
103
+ ok: true,
104
+ json: () => Promise.resolve({ data: { api_key: 'rk_live_test', workspace_id: 'ws-test' } }),
105
+ text: () => Promise.resolve(''),
106
+ });
107
+ vi.stubGlobal('fetch', mockFetch);
108
+ const mockRelaycastAgent = {
109
+ send: vi.fn().mockResolvedValue(undefined),
110
+ heartbeat: vi.fn().mockResolvedValue(undefined),
111
+ channels: {
112
+ create: vi.fn().mockResolvedValue(undefined),
113
+ join: vi.fn().mockResolvedValue(undefined),
114
+ invite: vi.fn().mockResolvedValue(undefined),
115
+ },
116
+ };
117
+ const mockRelaycast = {
118
+ agents: {
119
+ register: vi.fn().mockResolvedValue({ token: 'token-1' }),
120
+ },
121
+ as: vi.fn().mockReturnValue(mockRelaycastAgent),
122
+ };
123
+ class MockRelayError extends Error {
124
+ code;
125
+ constructor(code, message, status = 400) {
126
+ super(message);
127
+ this.code = code;
128
+ this.name = 'RelayError';
129
+ this.status = status;
130
+ }
131
+ }
132
+ vi.mock('@relaycast/sdk', () => ({
133
+ RelayCast: vi.fn().mockImplementation(() => mockRelaycast),
134
+ RelayError: MockRelayError,
135
+ }));
136
+ let waitForExitFn;
137
+ let waitForIdleFn;
138
+ let mockSpawnOutputs = [];
139
+ const mockAgent = {
140
+ name: 'test-agent-abc',
141
+ get waitForExit() {
142
+ return waitForExitFn;
143
+ },
144
+ get waitForIdle() {
145
+ return waitForIdleFn;
146
+ },
147
+ release: vi.fn().mockResolvedValue(undefined),
148
+ };
149
+ const mockHuman = {
150
+ name: 'WorkflowRunner',
151
+ sendMessage: vi.fn().mockResolvedValue(undefined),
152
+ };
153
+ const defaultSpawnPtyImplementation = async ({ name, task }) => {
154
+ const queued = mockSpawnOutputs.shift();
155
+ const stepComplete = task?.match(/STEP_COMPLETE:([^\n]+)/)?.[1]?.trim();
156
+ const output = queued ?? (stepComplete ? `STEP_COMPLETE:${stepComplete}\n` : 'STEP_COMPLETE:unknown\n');
157
+ queueMicrotask(() => {
158
+ if (typeof mockRelayInstance.onWorkerOutput === 'function') {
159
+ mockRelayInstance.onWorkerOutput({ name, chunk: output });
160
+ }
161
+ });
162
+ return { ...mockAgent, name };
163
+ };
164
+ const mockRelayInstance = {
165
+ spawnPty: vi.fn().mockImplementation(defaultSpawnPtyImplementation),
166
+ human: vi.fn().mockReturnValue(mockHuman),
167
+ shutdown: vi.fn().mockResolvedValue(undefined),
168
+ onBrokerStderr: vi.fn().mockReturnValue(() => { }),
169
+ onWorkerOutput: null,
170
+ onMessageReceived: null,
171
+ onAgentSpawned: null,
172
+ onAgentReleased: null,
173
+ onAgentExited: null,
174
+ onAgentIdle: null,
175
+ onDeliveryUpdate: null,
176
+ listAgentsRaw: vi.fn().mockResolvedValue([]),
177
+ };
178
+ vi.mock('../../relay.js', () => ({
179
+ AgentRelay: vi.fn().mockImplementation(() => mockRelayInstance),
180
+ }));
181
+ const { WorkflowRunner } = await import('../runner.js');
182
+ const { formatDryRunReport } = await import('../dry-run-format.js');
183
+ function makeDb() {
184
+ const runs = new Map();
185
+ const steps = new Map();
186
+ return {
187
+ insertRun: vi.fn(async (run) => {
188
+ runs.set(run.id, { ...run });
189
+ }),
190
+ updateRun: vi.fn(async (id, patch) => {
191
+ const existing = runs.get(id);
192
+ if (existing)
193
+ runs.set(id, { ...existing, ...patch });
194
+ }),
195
+ getRun: vi.fn(async (id) => {
196
+ const run = runs.get(id);
197
+ return run ? { ...run } : null;
198
+ }),
199
+ insertStep: vi.fn(async (step) => {
200
+ steps.set(step.id, { ...step });
201
+ }),
202
+ updateStep: vi.fn(async (id, patch) => {
203
+ const existing = steps.get(id);
204
+ if (existing)
205
+ steps.set(id, { ...existing, ...patch });
206
+ }),
207
+ getStepsByRunId: vi.fn(async (runId) => {
208
+ return [...steps.values()].filter((step) => step.runId === runId);
209
+ }),
210
+ };
211
+ }
212
+ function never() {
213
+ return new Promise(() => { });
214
+ }
215
+ function createWorkspace() {
216
+ const dir = mkdtempSync(path.join(os.tmpdir(), 'relay-workflow-permissions-'));
217
+ mkdirSync(path.join(dir, 'src', 'tests'), { recursive: true });
218
+ mkdirSync(path.join(dir, 'src'), { recursive: true });
219
+ mkdirSync(path.join(dir, 'secrets'), { recursive: true });
220
+ writeFileSync(path.join(dir, 'README.md'), '# workspace\n');
221
+ writeFileSync(path.join(dir, 'src', 'index.ts'), 'export const value = 1;\n');
222
+ writeFileSync(path.join(dir, 'src', 'tests', 'fixture.txt'), 'fixture\n');
223
+ writeFileSync(path.join(dir, '.env'), 'TOKEN=secret\n');
224
+ writeFileSync(path.join(dir, 'secrets', 'prod.txt'), 'top-secret\n');
225
+ return dir;
226
+ }
227
+ async function loadPermissionFixture(runner, options = {}) {
228
+ const config = await runner.parseYamlFile(fixturePath);
229
+ config.trajectories = false;
230
+ if (options.includeLeadStep) {
231
+ const workflow = config.workflows?.find((entry) => entry.name === 'test');
232
+ workflow?.steps.push({
233
+ name: 'lead-step',
234
+ agent: 'admin-lead',
235
+ dependsOn: ['read-step', 'write-step'],
236
+ task: 'Verify admin lead permissions are available and conclude the workflow.',
237
+ });
238
+ }
239
+ return config;
240
+ }
241
+ describe('WorkflowRunner permissions integration', () => {
242
+ let db;
243
+ let runner;
244
+ let workspaceDir;
245
+ beforeEach(() => {
246
+ vi.clearAllMocks();
247
+ waitForExitFn = vi.fn().mockResolvedValue('exited');
248
+ waitForIdleFn = vi.fn().mockImplementation(() => never());
249
+ mockSpawnOutputs = [];
250
+ mockAgent.release.mockResolvedValue(undefined);
251
+ mockRelayInstance.spawnPty.mockImplementation(defaultSpawnPtyImplementation);
252
+ mockRelayInstance.onWorkerOutput = null;
253
+ lastProvisionCall = null;
254
+ lastProvisionResult = null;
255
+ workspaceDir = createWorkspace();
256
+ db = makeDb();
257
+ runner = new WorkflowRunner({ db, workspaceId: 'ws-test', cwd: workspaceDir });
258
+ });
259
+ afterEach(() => {
260
+ vi.restoreAllMocks();
261
+ rmSync(workspaceDir, { recursive: true, force: true });
262
+ });
263
+ it('provisions permissions, propagates agent tokens, and clears workflow tokens after completion', async () => {
264
+ const config = await loadPermissionFixture(runner, { includeLeadStep: true });
265
+ const provisionSpy = vi.spyOn(runner, 'provisionAgents');
266
+ const nonInteractiveCommandSpy = vi
267
+ .spyOn(WorkflowRunner, 'buildNonInteractiveCommand')
268
+ .mockImplementation(() => ({
269
+ cmd: 'sh',
270
+ args: ['-c', 'printf "RELAY_AGENT_TOKEN=%s" "$RELAY_AGENT_TOKEN"'],
271
+ }));
272
+ const run = await runner.execute(config, 'test');
273
+ const steps = await db.getStepsByRunId(run.id);
274
+ const stepByName = new Map(steps.map((step) => [step.stepName, step]));
275
+ const provisionedScopes = lastProvisionResult?.scopes;
276
+ const spawnCalls = mockRelayInstance.spawnPty.mock.calls.map(([input]) => input);
277
+ expect(run.status).toBe('completed');
278
+ expect(provisionSpy).toHaveBeenCalledTimes(1);
279
+ expect(mockProvisionWorkflowAgents).toHaveBeenCalledTimes(1);
280
+ expect(lastProvisionCall?.workspace).toBe('ws-test');
281
+ expect(lastProvisionCall?.projectDir).toBe(workspaceDir);
282
+ expect(Object.keys(lastProvisionCall?.agents ?? {})).toEqual(['reader', 'writer', 'admin-lead']);
283
+ expect(provisionedScopes?.get('reader')).toEqual(['relayfile:fs:read:/**']);
284
+ expect(provisionedScopes?.get('reader')?.some((scope) => scope.includes(':write:'))).toBe(false);
285
+ expect(provisionedScopes?.get('writer')).toEqual([
286
+ 'relayfile:fs:read:/src/tests/**',
287
+ 'relayfile:fs:write:/src/tests/**',
288
+ ]);
289
+ expect(provisionedScopes?.get('writer')?.filter((scope) => scope.includes(':write:'))).toEqual([
290
+ 'relayfile:fs:write:/src/tests/**',
291
+ ]);
292
+ expect(provisionedScopes?.get('admin-lead')).toEqual(['relayfile:fs:read:/**', 'relayfile:fs:write:/**']);
293
+ expect(nonInteractiveCommandSpy).toHaveBeenCalledTimes(2);
294
+ expect(stepByName.get('read-step')?.output).toBe('RELAY_AGENT_TOKEN=jwt-reader');
295
+ expect(stepByName.get('write-step')?.output).toBe('RELAY_AGENT_TOKEN=jwt-writer');
296
+ expect(spawnCalls.length).toBeGreaterThan(0);
297
+ expect(spawnCalls.every((call) => typeof call.agentToken === 'string' && call.agentToken.length > 0)).toBe(true);
298
+ expect(spawnCalls[0]?.agentToken).toBe('jwt-admin-lead');
299
+ expect(runner.agentTokens.size).toBe(0);
300
+ expect(runner.agentMounts.size).toBe(0);
301
+ }, 20_000);
302
+ it('shows a permissions summary in dry-run mode', async () => {
303
+ const config = await loadPermissionFixture(runner);
304
+ const report = runner.dryRun(config, 'test');
305
+ const formatted = formatDryRunReport(report);
306
+ expect(report.permissions).toEqual(expect.arrayContaining([
307
+ expect.objectContaining({
308
+ agent: 'reader',
309
+ access: 'readonly',
310
+ writePaths: 0,
311
+ }),
312
+ expect.objectContaining({
313
+ agent: 'writer',
314
+ access: 'readwrite',
315
+ writePaths: 1,
316
+ }),
317
+ expect.objectContaining({
318
+ agent: 'admin-lead',
319
+ access: 'full',
320
+ }),
321
+ ]));
322
+ expect(formatted).toContain('Permissions');
323
+ expect(formatted).toContain('reader');
324
+ expect(formatted).toContain('writer');
325
+ expect(formatted).toContain('admin-lead');
326
+ expect(formatted).toContain('readonly');
327
+ expect(formatted).toContain('readwrite');
328
+ expect(formatted).toContain('full');
329
+ }, 20_000);
330
+ });
331
+ //# sourceMappingURL=e2e-permissions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-permissions.test.js","sourceRoot":"","sources":["../../../src/workflows/__tests__/e2e-permissions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=permission-types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-types.test.d.ts","sourceRoot":"","sources":["../../../src/workflows/__tests__/permission-types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,124 @@
1
+ import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import path from 'node:path';
4
+ import { afterEach, describe, expect, it } from 'vitest';
5
+ import { compileAgentScopes, resolveAgentPermissions } from '../../provisioner/compiler.js';
6
+ import { isAgentStep, isDeterministicStep, isRestrictedAgent } from '../types.js';
7
+ const tempDirs = [];
8
+ async function createWorkspace(files) {
9
+ const dir = await mkdtemp(path.join(tmpdir(), 'relay-workflow-permission-types-'));
10
+ tempDirs.push(dir);
11
+ for (const [relativePath, content] of Object.entries(files)) {
12
+ const filePath = path.join(dir, relativePath);
13
+ await mkdir(path.dirname(filePath), { recursive: true });
14
+ await writeFile(filePath, content);
15
+ }
16
+ return dir;
17
+ }
18
+ afterEach(async () => {
19
+ while (tempDirs.length > 0) {
20
+ await rm(tempDirs.pop(), { recursive: true, force: true });
21
+ }
22
+ });
23
+ describe('workflow permission types', () => {
24
+ it('allows agents to omit permissions without becoming restricted', () => {
25
+ const agent = {
26
+ name: 'worker',
27
+ cli: 'codex',
28
+ task: 'Write tests',
29
+ };
30
+ expect(agent.permissions).toBeUndefined();
31
+ expect(isRestrictedAgent(agent)).toBe(false);
32
+ });
33
+ it.each(['readonly', 'readwrite', 'restricted', 'full'])('accepts the %s access preset', async (access) => {
34
+ const workspace = await createWorkspace({
35
+ 'src/index.ts': 'export const value = 1;\n',
36
+ });
37
+ const compiled = compileAgentScopes({
38
+ agentName: `${access}-agent`,
39
+ workspace: 'relay-test',
40
+ projectDir: workspace,
41
+ permissions: {
42
+ access,
43
+ inherit: false,
44
+ },
45
+ });
46
+ expect(compiled.effectiveAccess).toBe(access);
47
+ expect(isRestrictedAgent({ name: 'agent', cli: 'codex', permissions: { access } })).toBe(access === 'readonly' || access === 'restricted');
48
+ });
49
+ it('compiles full permissions with read/write access for all files', async () => {
50
+ const workspace = await createWorkspace({
51
+ '.agentignore': 'secret.txt\n',
52
+ '.agentreadonly': 'locked.txt\n',
53
+ 'locked.txt': 'lock me\n',
54
+ 'secret.txt': 'classified\n',
55
+ 'src/index.ts': 'export const value = 1;\n',
56
+ });
57
+ const compiled = compileAgentScopes({
58
+ agentName: 'lead',
59
+ workspace: 'relay-test',
60
+ projectDir: workspace,
61
+ permissions: {
62
+ access: 'full',
63
+ network: false,
64
+ exec: ['npm test'],
65
+ scopes: ['custom:relay:debug'],
66
+ },
67
+ });
68
+ expect(compiled.effectiveAccess).toBe('full');
69
+ expect(compiled.inherited).toBe(false);
70
+ expect(compiled.readonlyPaths).toEqual([]);
71
+ expect(compiled.deniedPaths).toEqual([]);
72
+ expect(compiled.readwritePaths).toEqual([
73
+ '.agentignore',
74
+ '.agentreadonly',
75
+ 'locked.txt',
76
+ 'secret.txt',
77
+ 'src/index.ts',
78
+ ]);
79
+ expect(compiled.scopes).toContain('relayfile:fs:read:/secret.txt');
80
+ expect(compiled.scopes).toContain('relayfile:fs:write:/secret.txt');
81
+ expect(compiled.scopes).toContain('relayfile:fs:read:/src/index.ts');
82
+ expect(compiled.scopes).toContain('relayfile:fs:write:/src/index.ts');
83
+ expect(compiled.scopes).toContain('custom:relay:debug');
84
+ expect(compiled.network).toBe(false);
85
+ expect(compiled.exec).toEqual(['npm test']);
86
+ expect(compiled.summary).toEqual({
87
+ readonly: 0,
88
+ readwrite: 5,
89
+ denied: 0,
90
+ customScopes: 1,
91
+ });
92
+ });
93
+ it('preserves backwards-compatible default resolution when permissions are undefined', async () => {
94
+ const workspace = await createWorkspace({
95
+ '.agentignore': 'blocked.txt\n',
96
+ '.agentreadonly': 'locked.txt\n',
97
+ 'blocked.txt': 'do not read\n',
98
+ 'locked.txt': 'read only\n',
99
+ 'writable.txt': 'can edit\n',
100
+ });
101
+ const compiled = resolveAgentPermissions('legacy-worker', undefined, workspace, 'relay-test');
102
+ expect(compiled.effectiveAccess).toBe('readwrite');
103
+ expect(compiled.inherited).toBe(true);
104
+ expect(compiled.readonlyPaths).toEqual(['locked.txt']);
105
+ expect(compiled.readwritePaths).toEqual(['.agentignore', '.agentreadonly', 'writable.txt']);
106
+ expect(compiled.deniedPaths).toEqual(['blocked.txt']);
107
+ });
108
+ it('keeps legacy workflow step aliases compatible with WorkflowStep guards', () => {
109
+ const agentStep = {
110
+ name: 'draft',
111
+ agent: 'worker',
112
+ task: 'Draft the summary',
113
+ };
114
+ const deterministicStep = {
115
+ name: 'check',
116
+ type: 'deterministic',
117
+ command: 'npm test',
118
+ };
119
+ expect(isAgentStep(agentStep)).toBe(true);
120
+ expect(isDeterministicStep(agentStep)).toBe(false);
121
+ expect(isDeterministicStep(deterministicStep)).toBe(true);
122
+ });
123
+ });
124
+ //# sourceMappingURL=permission-types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-types.test.js","sourceRoot":"","sources":["../../../src/workflows/__tests__/permission-types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAO5F,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAElF,MAAM,QAAQ,GAAa,EAAE,CAAC;AAE9B,KAAK,UAAU,eAAe,CAAC,KAA6B;IAC1D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kCAAkC,CAAC,CAAC,CAAC;IACnF,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,KAAK,GAAoB;YAC7B,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE,OAAO;YACZ,IAAI,EAAE,aAAa;SACpB,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAA4C,CAAC,CACjG,8BAA8B,EAC9B,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC;YACtC,cAAc,EAAE,2BAA2B;SAC5C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,kBAAkB,CAAC;YAClC,SAAS,EAAE,GAAG,MAAM,QAAQ;YAC5B,SAAS,EAAE,YAAY;YACvB,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE;gBACX,MAAM;gBACN,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CACtF,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,YAAY,CACjD,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC;YACtC,cAAc,EAAE,cAAc;YAC9B,gBAAgB,EAAE,cAAc;YAChC,YAAY,EAAE,WAAW;YACzB,YAAY,EAAE,cAAc;YAC5B,cAAc,EAAE,2BAA2B;SAC5C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,kBAAkB,CAAC;YAClC,SAAS,EAAE,MAAM;YACjB,SAAS,EAAE,YAAY;YACvB,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE;gBACX,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,UAAU,CAAC;gBAClB,MAAM,EAAE,CAAC,oBAAoB,CAAC;aAC/B;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;YACtC,cAAc;YACd,gBAAgB;YAChB,YAAY;YACZ,YAAY;YACZ,cAAc;SACf,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QACnE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACpE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QACrE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QACtE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACxD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YAC/B,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,CAAC;YACT,YAAY,EAAE,CAAC;SAChB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;QAChG,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC;YACtC,cAAc,EAAE,eAAe;YAC/B,gBAAgB,EAAE,cAAc;YAChC,aAAa,EAAE,eAAe;YAC9B,YAAY,EAAE,aAAa;YAC3B,cAAc,EAAE,YAAY;SAC7B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,uBAAuB,CAAC,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAE9F,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC;QAC5F,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,SAAS,GAAsB;YACnC,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,mBAAmB;SAC1B,CAAC;QACF,MAAM,iBAAiB,GAA8B;YACnD,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,UAAU;SACpB,CAAC;QAEF,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=permissions-integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions-integration.test.d.ts","sourceRoot":"","sources":["../../../src/workflows/__tests__/permissions-integration.test.ts"],"names":[],"mappings":""}