agent-relay 4.0.2 → 4.0.4

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 (175) 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/index.cjs +7906 -2084
  6. package/dist/packages/sdk/src/provisioner/seeder.d.ts +17 -0
  7. package/dist/packages/sdk/src/provisioner/seeder.d.ts.map +1 -0
  8. package/dist/packages/sdk/src/provisioner/seeder.js +419 -0
  9. package/dist/packages/sdk/src/provisioner/seeder.js.map +1 -0
  10. package/dist/packages/sdk/src/provisioner/token.d.ts +38 -0
  11. package/dist/packages/sdk/src/provisioner/token.d.ts.map +1 -0
  12. package/dist/packages/sdk/src/provisioner/token.js +74 -0
  13. package/dist/packages/sdk/src/provisioner/token.js.map +1 -0
  14. package/dist/src/cli/commands/core.d.ts.map +1 -1
  15. package/dist/src/cli/commands/core.js +7 -3
  16. package/dist/src/cli/commands/core.js.map +1 -1
  17. package/dist/src/cli/commands/on/provision.d.ts.map +1 -1
  18. package/dist/src/cli/commands/on/provision.js +8 -3
  19. package/dist/src/cli/commands/on/provision.js.map +1 -1
  20. package/dist/src/cli/commands/on/start.d.ts +5 -0
  21. package/dist/src/cli/commands/on/start.d.ts.map +1 -1
  22. package/dist/src/cli/commands/on/start.js +126 -88
  23. package/dist/src/cli/commands/on/start.js.map +1 -1
  24. package/dist/src/cli/commands/on/symlink-mount.d.ts +12 -0
  25. package/dist/src/cli/commands/on/symlink-mount.d.ts.map +1 -0
  26. package/dist/src/cli/commands/on/symlink-mount.js +304 -0
  27. package/dist/src/cli/commands/on/symlink-mount.js.map +1 -0
  28. package/dist/src/cli/commands/on.d.ts.map +1 -1
  29. package/dist/src/cli/commands/on.js +3 -0
  30. package/dist/src/cli/commands/on.js.map +1 -1
  31. package/install.sh +4 -0
  32. package/package.json +9 -9
  33. package/packages/acp-bridge/package.json +2 -2
  34. package/packages/brand/package.json +1 -1
  35. package/packages/cloud/package.json +2 -2
  36. package/packages/config/package.json +1 -1
  37. package/packages/hooks/package.json +4 -4
  38. package/packages/memory/package.json +2 -2
  39. package/packages/openclaw/package.json +2 -2
  40. package/packages/policy/package.json +2 -2
  41. package/packages/sdk/dist/client.d.ts +3 -10
  42. package/packages/sdk/dist/client.d.ts.map +1 -1
  43. package/packages/sdk/dist/client.js +2 -0
  44. package/packages/sdk/dist/client.js.map +1 -1
  45. package/packages/sdk/dist/provisioner/__tests__/audit.test.d.ts +2 -0
  46. package/packages/sdk/dist/provisioner/__tests__/audit.test.d.ts.map +1 -0
  47. package/packages/sdk/dist/provisioner/__tests__/audit.test.js +45 -0
  48. package/packages/sdk/dist/provisioner/__tests__/audit.test.js.map +1 -0
  49. package/packages/sdk/dist/provisioner/__tests__/compiler.test.d.ts +2 -0
  50. package/packages/sdk/dist/provisioner/__tests__/compiler.test.d.ts.map +1 -0
  51. package/packages/sdk/dist/provisioner/__tests__/compiler.test.js +345 -0
  52. package/packages/sdk/dist/provisioner/__tests__/compiler.test.js.map +1 -0
  53. package/packages/sdk/dist/provisioner/__tests__/presets.test.d.ts +2 -0
  54. package/packages/sdk/dist/provisioner/__tests__/presets.test.d.ts.map +1 -0
  55. package/packages/sdk/dist/provisioner/__tests__/presets.test.js +23 -0
  56. package/packages/sdk/dist/provisioner/__tests__/presets.test.js.map +1 -0
  57. package/packages/sdk/dist/provisioner/__tests__/seeder.test.d.ts +2 -0
  58. package/packages/sdk/dist/provisioner/__tests__/seeder.test.d.ts.map +1 -0
  59. package/packages/sdk/dist/provisioner/__tests__/seeder.test.js +224 -0
  60. package/packages/sdk/dist/provisioner/__tests__/seeder.test.js.map +1 -0
  61. package/packages/sdk/dist/provisioner/__tests__/tar-seeder.test.d.ts +2 -0
  62. package/packages/sdk/dist/provisioner/__tests__/tar-seeder.test.d.ts.map +1 -0
  63. package/packages/sdk/dist/provisioner/__tests__/tar-seeder.test.js +191 -0
  64. package/packages/sdk/dist/provisioner/__tests__/tar-seeder.test.js.map +1 -0
  65. package/packages/sdk/dist/provisioner/__tests__/token-factory.test.d.ts +2 -0
  66. package/packages/sdk/dist/provisioner/__tests__/token-factory.test.d.ts.map +1 -0
  67. package/packages/sdk/dist/provisioner/__tests__/token-factory.test.js +127 -0
  68. package/packages/sdk/dist/provisioner/__tests__/token-factory.test.js.map +1 -0
  69. package/packages/sdk/dist/provisioner/__tests__/token.test.d.ts +2 -0
  70. package/packages/sdk/dist/provisioner/__tests__/token.test.d.ts.map +1 -0
  71. package/packages/sdk/dist/provisioner/__tests__/token.test.js +44 -0
  72. package/packages/sdk/dist/provisioner/__tests__/token.test.js.map +1 -0
  73. package/packages/sdk/dist/provisioner/audit.d.ts +19 -0
  74. package/packages/sdk/dist/provisioner/audit.d.ts.map +1 -0
  75. package/packages/sdk/dist/provisioner/audit.js +74 -0
  76. package/packages/sdk/dist/provisioner/audit.js.map +1 -0
  77. package/packages/sdk/dist/provisioner/compiler.d.ts +23 -0
  78. package/packages/sdk/dist/provisioner/compiler.d.ts.map +1 -0
  79. package/packages/sdk/dist/provisioner/compiler.js +355 -0
  80. package/packages/sdk/dist/provisioner/compiler.js.map +1 -0
  81. package/packages/sdk/dist/provisioner/index.d.ts +9 -0
  82. package/packages/sdk/dist/provisioner/index.d.ts.map +1 -0
  83. package/packages/sdk/dist/provisioner/index.js +266 -0
  84. package/packages/sdk/dist/provisioner/index.js.map +1 -0
  85. package/packages/sdk/dist/provisioner/mount.d.ts +14 -0
  86. package/packages/sdk/dist/provisioner/mount.d.ts.map +1 -0
  87. package/packages/sdk/dist/provisioner/mount.js +329 -0
  88. package/packages/sdk/dist/provisioner/mount.js.map +1 -0
  89. package/packages/sdk/dist/provisioner/seeder.d.ts +17 -0
  90. package/packages/sdk/dist/provisioner/seeder.d.ts.map +1 -0
  91. package/packages/sdk/dist/provisioner/seeder.js +419 -0
  92. package/packages/sdk/dist/provisioner/seeder.js.map +1 -0
  93. package/packages/sdk/dist/provisioner/token.d.ts +38 -0
  94. package/packages/sdk/dist/provisioner/token.d.ts.map +1 -0
  95. package/packages/sdk/dist/provisioner/token.js +74 -0
  96. package/packages/sdk/dist/provisioner/token.js.map +1 -0
  97. package/packages/sdk/dist/provisioner/types.d.ts +133 -0
  98. package/packages/sdk/dist/provisioner/types.d.ts.map +1 -0
  99. package/packages/sdk/dist/provisioner/types.js +2 -0
  100. package/packages/sdk/dist/provisioner/types.js.map +1 -0
  101. package/packages/sdk/dist/relay.d.ts +6 -0
  102. package/packages/sdk/dist/relay.d.ts.map +1 -1
  103. package/packages/sdk/dist/relay.js +17 -5
  104. package/packages/sdk/dist/relay.js.map +1 -1
  105. package/packages/sdk/dist/types.d.ts +9 -0
  106. package/packages/sdk/dist/types.d.ts.map +1 -1
  107. package/packages/sdk/dist/workflows/__tests__/e2e-permissions.test.d.ts +2 -0
  108. package/packages/sdk/dist/workflows/__tests__/e2e-permissions.test.d.ts.map +1 -0
  109. package/packages/sdk/dist/workflows/__tests__/e2e-permissions.test.js +331 -0
  110. package/packages/sdk/dist/workflows/__tests__/e2e-permissions.test.js.map +1 -0
  111. package/packages/sdk/dist/workflows/__tests__/permission-types.test.d.ts +2 -0
  112. package/packages/sdk/dist/workflows/__tests__/permission-types.test.d.ts.map +1 -0
  113. package/packages/sdk/dist/workflows/__tests__/permission-types.test.js +124 -0
  114. package/packages/sdk/dist/workflows/__tests__/permission-types.test.js.map +1 -0
  115. package/packages/sdk/dist/workflows/__tests__/permissions-integration.test.d.ts +2 -0
  116. package/packages/sdk/dist/workflows/__tests__/permissions-integration.test.d.ts.map +1 -0
  117. package/packages/sdk/dist/workflows/__tests__/permissions-integration.test.js +526 -0
  118. package/packages/sdk/dist/workflows/__tests__/permissions-integration.test.js.map +1 -0
  119. package/packages/sdk/dist/workflows/dry-run-format.d.ts.map +1 -1
  120. package/packages/sdk/dist/workflows/dry-run-format.js +8 -0
  121. package/packages/sdk/dist/workflows/dry-run-format.js.map +1 -1
  122. package/packages/sdk/dist/workflows/runner.d.ts +14 -0
  123. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
  124. package/packages/sdk/dist/workflows/runner.js +455 -6
  125. package/packages/sdk/dist/workflows/runner.js.map +1 -1
  126. package/packages/sdk/dist/workflows/types.d.ts +190 -0
  127. package/packages/sdk/dist/workflows/types.d.ts.map +1 -1
  128. package/packages/sdk/dist/workflows/types.js +29 -0
  129. package/packages/sdk/dist/workflows/types.js.map +1 -1
  130. package/packages/sdk/package.json +6 -2
  131. package/packages/sdk/src/__tests__/orchestration-upgrades.test.ts +123 -1
  132. package/packages/sdk/src/__tests__/provisioner-mount.test.ts +126 -0
  133. package/packages/sdk/src/__tests__/spawn-token.test.ts +41 -0
  134. package/packages/sdk/src/__tests__/workflow-runner.test.ts +77 -45
  135. package/packages/sdk/src/client.ts +4 -8
  136. package/packages/sdk/src/provisioner/__tests__/audit.test.ts +62 -0
  137. package/packages/sdk/src/provisioner/__tests__/compiler.test.ts +369 -0
  138. package/packages/sdk/src/provisioner/__tests__/presets.test.ts +25 -0
  139. package/packages/sdk/src/provisioner/__tests__/seeder.test.ts +284 -0
  140. package/packages/sdk/src/provisioner/__tests__/tar-seeder.test.ts +249 -0
  141. package/packages/sdk/src/provisioner/__tests__/token-factory.test.ts +172 -0
  142. package/packages/sdk/src/provisioner/__tests__/token.test.ts +53 -0
  143. package/packages/sdk/src/provisioner/audit.ts +104 -0
  144. package/packages/sdk/src/provisioner/compiler.ts +498 -0
  145. package/packages/sdk/src/provisioner/index.ts +332 -0
  146. package/packages/sdk/src/provisioner/mount.ts +419 -0
  147. package/packages/sdk/src/provisioner/seeder.ts +571 -0
  148. package/packages/sdk/src/provisioner/token.ts +112 -0
  149. package/packages/sdk/src/provisioner/types.ts +188 -0
  150. package/packages/sdk/src/relay.ts +31 -9
  151. package/packages/sdk/src/types.ts +9 -0
  152. package/packages/sdk/src/workflows/__tests__/e2e-permissions.test.ts +407 -0
  153. package/packages/sdk/src/workflows/__tests__/fixtures/.agentignore +2 -0
  154. package/packages/sdk/src/workflows/__tests__/fixtures/.reader.agentreadonly +2 -0
  155. package/packages/sdk/src/workflows/__tests__/fixtures/permission-test.yaml +42 -0
  156. package/packages/sdk/src/workflows/__tests__/permission-types.test.ts +154 -0
  157. package/packages/sdk/src/workflows/__tests__/permissions-integration.test.ts +649 -0
  158. package/packages/sdk/src/workflows/builtin-templates/bug-fix.yaml +13 -9
  159. package/packages/sdk/src/workflows/builtin-templates/code-review.yaml +12 -8
  160. package/packages/sdk/src/workflows/builtin-templates/competitive.yaml +11 -7
  161. package/packages/sdk/src/workflows/builtin-templates/documentation.yaml +16 -8
  162. package/packages/sdk/src/workflows/builtin-templates/feature-dev.yaml +13 -9
  163. package/packages/sdk/src/workflows/builtin-templates/refactor.yaml +13 -9
  164. package/packages/sdk/src/workflows/builtin-templates/review-loop.yaml +14 -10
  165. package/packages/sdk/src/workflows/builtin-templates/security-audit.yaml +19 -9
  166. package/packages/sdk/src/workflows/dry-run-format.ts +14 -1
  167. package/packages/sdk/src/workflows/runner.ts +559 -6
  168. package/packages/sdk/src/workflows/schema.json +204 -114
  169. package/packages/sdk/src/workflows/types.ts +266 -1
  170. package/packages/sdk/vitest.config.ts +5 -1
  171. package/packages/sdk-py/pyproject.toml +1 -1
  172. package/packages/telemetry/package.json +1 -1
  173. package/packages/trajectory/package.json +2 -2
  174. package/packages/user-directory/package.json +2 -2
  175. package/packages/utils/package.json +2 -2
@@ -0,0 +1,355 @@
1
+ import ignore from 'ignore';
2
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ const SKIPPED_DIRS = new Set(['.git', '.relay', 'node_modules']);
5
+ function cleanPatterns(content) {
6
+ return content
7
+ .split(/\r?\n/u)
8
+ .map((line) => line.trim())
9
+ .filter((line) => line !== '' && !line.startsWith('#'));
10
+ }
11
+ function unique(values) {
12
+ const seen = new Set();
13
+ const result = [];
14
+ for (const value of values) {
15
+ const normalized = String(value ?? '').trim();
16
+ if (normalized === '' || seen.has(normalized)) {
17
+ continue;
18
+ }
19
+ seen.add(normalized);
20
+ result.push(normalized);
21
+ }
22
+ return result;
23
+ }
24
+ function normalizeRelativePath(value) {
25
+ return String(value ?? '')
26
+ .trim()
27
+ .replace(/\\/gu, '/')
28
+ .replace(/^\.\/+/u, '')
29
+ .replace(/^\/+/u, '')
30
+ .replace(/\/+/gu, '/');
31
+ }
32
+ function normalizeRelayPath(value) {
33
+ const normalized = normalizeRelativePath(value);
34
+ return normalized === '' ? '/' : `/${normalized}`;
35
+ }
36
+ function normalizeAclDir(relativeDir) {
37
+ const normalized = normalizeRelativePath(relativeDir);
38
+ return normalized === '' || normalized === '.' ? '/' : `/${normalized}`;
39
+ }
40
+ function readPatternFile(filePath) {
41
+ if (!existsSync(filePath)) {
42
+ return [];
43
+ }
44
+ return cleanPatterns(readFileSync(filePath, 'utf8'));
45
+ }
46
+ function createMatcher(patterns) {
47
+ const matcher = ignore();
48
+ if (patterns.length > 0) {
49
+ matcher.add([...patterns]);
50
+ }
51
+ return matcher;
52
+ }
53
+ function loadDotfileRules(projectDir, agentName) {
54
+ const resolvedProjectDir = path.resolve(projectDir);
55
+ return {
56
+ deny: unique([
57
+ ...readPatternFile(path.join(resolvedProjectDir, '.agentignore')),
58
+ ...readPatternFile(path.join(resolvedProjectDir, `.${agentName}.agentignore`)),
59
+ ]),
60
+ readonly: unique([
61
+ ...readPatternFile(path.join(resolvedProjectDir, '.agentreadonly')),
62
+ ...readPatternFile(path.join(resolvedProjectDir, `.${agentName}.agentreadonly`)),
63
+ ]),
64
+ };
65
+ }
66
+ function normalizeFileRules(permissions) {
67
+ return {
68
+ read: unique(permissions.files?.read ?? []),
69
+ write: unique(permissions.files?.write ?? []),
70
+ deny: unique(permissions.files?.deny ?? []),
71
+ };
72
+ }
73
+ function resolveScopedWorkdirPatterns(projectDir, workdir) {
74
+ if (!workdir) {
75
+ return undefined;
76
+ }
77
+ const resolvedProjectDir = path.resolve(projectDir);
78
+ const resolvedWorkdir = path.resolve(resolvedProjectDir, workdir);
79
+ const relativeWorkdir = normalizeRelativePath(path.relative(resolvedProjectDir, resolvedWorkdir));
80
+ if (relativeWorkdir === '' || relativeWorkdir === '.') {
81
+ return undefined;
82
+ }
83
+ if (relativeWorkdir === '..' || relativeWorkdir.startsWith('../')) {
84
+ return [];
85
+ }
86
+ return unique([relativeWorkdir, `${relativeWorkdir}/**`]);
87
+ }
88
+ function matchesAny(relativePath, matcher) {
89
+ return matcher.ignores(normalizeRelativePath(relativePath));
90
+ }
91
+ function walkProjectFiles(projectDir, currentDir = projectDir, files = []) {
92
+ const entries = readdirSync(currentDir, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name));
93
+ for (const entry of entries) {
94
+ if (entry.isDirectory() && SKIPPED_DIRS.has(entry.name)) {
95
+ continue;
96
+ }
97
+ const fullPath = path.join(currentDir, entry.name);
98
+ const relativePath = normalizeRelativePath(path.relative(projectDir, fullPath));
99
+ if (entry.isDirectory()) {
100
+ walkProjectFiles(projectDir, fullPath, files);
101
+ continue;
102
+ }
103
+ files.push(relativePath);
104
+ }
105
+ return files;
106
+ }
107
+ function buildSources(dotfileRules, preset, presetRules, fileRules, rawScopes, inherited) {
108
+ const sources = [];
109
+ if (inherited && (dotfileRules.deny.length > 0 || dotfileRules.readonly.length > 0)) {
110
+ sources.push({
111
+ type: 'dotfile',
112
+ label: 'dotfiles',
113
+ ruleCount: dotfileRules.deny.length + dotfileRules.readonly.length,
114
+ });
115
+ }
116
+ if (presetRules.read.length > 0 || presetRules.write.length > 0 || presetRules.deny.length > 0) {
117
+ sources.push({
118
+ type: 'preset',
119
+ label: `access: ${preset ?? 'readwrite'}`,
120
+ ruleCount: presetRules.read.length + presetRules.write.length + presetRules.deny.length,
121
+ });
122
+ }
123
+ if (fileRules.read.length > 0 || fileRules.write.length > 0 || fileRules.deny.length > 0) {
124
+ sources.push({
125
+ type: 'yaml',
126
+ label: 'permissions.files',
127
+ ruleCount: fileRules.read.length + fileRules.write.length + fileRules.deny.length,
128
+ });
129
+ }
130
+ if (rawScopes.length > 0) {
131
+ sources.push({
132
+ type: 'scope',
133
+ label: 'permissions.scopes',
134
+ ruleCount: rawScopes.length,
135
+ });
136
+ }
137
+ return sources;
138
+ }
139
+ function buildAcl(agentName, readonlyPaths, readwritePaths, deniedPaths) {
140
+ const aclMap = new Map();
141
+ const addRule = (relativePath, rule) => {
142
+ const aclDir = normalizeAclDir(path.posix.dirname(normalizeRelativePath(relativePath)));
143
+ const rules = aclMap.get(aclDir) ?? new Set();
144
+ rules.add(rule);
145
+ aclMap.set(aclDir, rules);
146
+ };
147
+ for (const relativePath of readonlyPaths) {
148
+ addRule(relativePath, 'read');
149
+ }
150
+ for (const relativePath of readwritePaths) {
151
+ addRule(relativePath, 'read');
152
+ addRule(relativePath, 'write');
153
+ }
154
+ const deniedDirs = new Map();
155
+ for (const relativePath of deniedPaths) {
156
+ const aclDir = normalizeAclDir(path.posix.dirname(normalizeRelativePath(relativePath)));
157
+ const summary = deniedDirs.get(aclDir) ?? { denied: 0, allowed: 0 };
158
+ summary.denied += 1;
159
+ deniedDirs.set(aclDir, summary);
160
+ }
161
+ for (const relativePath of [...readonlyPaths, ...readwritePaths]) {
162
+ const aclDir = normalizeAclDir(path.posix.dirname(normalizeRelativePath(relativePath)));
163
+ const summary = deniedDirs.get(aclDir) ?? { denied: 0, allowed: 0 };
164
+ summary.allowed += 1;
165
+ deniedDirs.set(aclDir, summary);
166
+ }
167
+ for (const [aclDir, summary] of deniedDirs.entries()) {
168
+ if (summary.denied > 0 && summary.allowed === 0) {
169
+ const rules = aclMap.get(aclDir) ?? new Set();
170
+ rules.add(`deny:agent:${agentName}`);
171
+ aclMap.set(aclDir, rules);
172
+ }
173
+ }
174
+ return Object.fromEntries([...aclMap.entries()]
175
+ .sort(([left], [right]) => left.localeCompare(right))
176
+ .map(([aclDir, rules]) => [aclDir, [...rules].sort()]));
177
+ }
178
+ function pathsToScopes(paths, action) {
179
+ return unique([...paths]
180
+ .map((relativePath) => normalizeRelativePath(relativePath))
181
+ .filter((relativePath) => relativePath !== '')
182
+ .sort((left, right) => left.localeCompare(right))
183
+ .map((relativePath) => `relayfile:fs:${action}:${normalizeRelayPath(relativePath)}`));
184
+ }
185
+ function buildReadonlyPatterns(presetRules, dotfileRules, fileRules) {
186
+ const presetReadonly = presetRules.write.length === 0 ? presetRules.read : [];
187
+ const yamlReadonly = fileRules.read.filter((pattern) => !fileRules.write.includes(pattern));
188
+ return unique([...dotfileRules.readonly, ...presetReadonly, ...yamlReadonly]);
189
+ }
190
+ function buildReadwritePatterns(presetRules, fileRules) {
191
+ return unique([...presetRules.write, ...fileRules.write]);
192
+ }
193
+ function buildDeniedPatterns(dotfileRules, fileRules) {
194
+ return unique([...dotfileRules.deny, ...fileRules.deny]);
195
+ }
196
+ export function defaultPermissionsForPreset(preset) {
197
+ switch (preset) {
198
+ case 'lead':
199
+ return { access: 'full' };
200
+ case 'reviewer':
201
+ case 'analyst':
202
+ return { access: 'readonly' };
203
+ case 'worker':
204
+ return { access: 'readwrite' };
205
+ default:
206
+ return {};
207
+ }
208
+ }
209
+ export function expandPreset(preset, options) {
210
+ const scopedWorkdirPatterns = preset === 'readwrite' && options?.projectDir
211
+ ? resolveScopedWorkdirPatterns(options.projectDir, options.workdir)
212
+ : undefined;
213
+ switch (preset ?? 'readwrite') {
214
+ case 'readonly':
215
+ return { read: ['**'], write: [], deny: [] };
216
+ case 'restricted':
217
+ return { read: [], write: [], deny: [] };
218
+ case 'full':
219
+ return { read: ['**'], write: ['**'], deny: [] };
220
+ case 'readwrite':
221
+ default:
222
+ return {
223
+ read: scopedWorkdirPatterns ?? ['**'],
224
+ write: scopedWorkdirPatterns ?? ['**'],
225
+ deny: [],
226
+ };
227
+ }
228
+ }
229
+ export function globsToScopes(globs, action) {
230
+ return unique(globs
231
+ .map((glob) => normalizeRelativePath(glob))
232
+ .filter((glob) => glob !== '')
233
+ .map((glob) => `relayfile:fs:${action}:${normalizeRelayPath(glob)}`));
234
+ }
235
+ export function compileAgentPermissions(input) {
236
+ const permissions = input.permissions ?? {};
237
+ const effectiveAccess = permissions.access ?? 'readwrite';
238
+ const inherited = effectiveAccess !== 'full' && permissions.inherit !== false;
239
+ const projectDir = path.resolve(input.projectDir);
240
+ const scopedInput = input;
241
+ const dotfileRules = inherited ? loadDotfileRules(projectDir, input.agentName) : { deny: [], readonly: [] };
242
+ const presetRules = expandPreset(effectiveAccess, {
243
+ projectDir,
244
+ workdir: scopedInput.workdir,
245
+ });
246
+ const fileRules = normalizeFileRules(permissions);
247
+ const rawScopes = unique(permissions.scopes ?? []);
248
+ const dotDenyMatcher = createMatcher(dotfileRules.deny);
249
+ const dotReadonlyMatcher = createMatcher(dotfileRules.readonly);
250
+ const presetReadMatcher = createMatcher(presetRules.read);
251
+ const presetWriteMatcher = createMatcher(presetRules.write);
252
+ const fileReadMatcher = createMatcher(fileRules.read);
253
+ const fileWriteMatcher = createMatcher(fileRules.write);
254
+ const fileDenyMatcher = createMatcher(fileRules.deny);
255
+ const readonlyPaths = [];
256
+ const readwritePaths = [];
257
+ const deniedPaths = [];
258
+ for (const relativePath of walkProjectFiles(projectDir)) {
259
+ const dotDenied = inherited && matchesAny(relativePath, dotDenyMatcher);
260
+ const dotReadonly = inherited && !dotDenied && matchesAny(relativePath, dotReadonlyMatcher);
261
+ const yamlRead = matchesAny(relativePath, fileReadMatcher);
262
+ const yamlWrite = matchesAny(relativePath, fileWriteMatcher);
263
+ const yamlDeny = matchesAny(relativePath, fileDenyMatcher);
264
+ const explicitYamlGrant = yamlRead || yamlWrite;
265
+ if (yamlDeny) {
266
+ deniedPaths.push(relativePath);
267
+ continue;
268
+ }
269
+ if (dotDenied && !explicitYamlGrant) {
270
+ deniedPaths.push(relativePath);
271
+ continue;
272
+ }
273
+ const presetRead = matchesAny(relativePath, presetReadMatcher);
274
+ const presetWrite = matchesAny(relativePath, presetWriteMatcher);
275
+ const canRead = explicitYamlGrant || presetRead || presetWrite;
276
+ let canWrite = yamlWrite || presetWrite;
277
+ if (dotReadonly && !yamlWrite) {
278
+ canWrite = false;
279
+ }
280
+ if (canWrite) {
281
+ readwritePaths.push(relativePath);
282
+ continue;
283
+ }
284
+ if (canRead) {
285
+ readonlyPaths.push(relativePath);
286
+ continue;
287
+ }
288
+ deniedPaths.push(relativePath);
289
+ }
290
+ readonlyPaths.sort((left, right) => left.localeCompare(right));
291
+ readwritePaths.sort((left, right) => left.localeCompare(right));
292
+ deniedPaths.sort((left, right) => left.localeCompare(right));
293
+ const readonlyPatterns = buildReadonlyPatterns(presetRules, dotfileRules, fileRules);
294
+ const readwritePatterns = buildReadwritePatterns(presetRules, fileRules);
295
+ const deniedPatterns = buildDeniedPatterns(dotfileRules, fileRules);
296
+ const scopes = mergePermissionSources([
297
+ ...pathsToScopes([...readonlyPaths, ...readwritePaths], 'read'),
298
+ ...pathsToScopes(readwritePaths, 'write'),
299
+ ], [], rawScopes);
300
+ return {
301
+ agentName: input.agentName,
302
+ workspace: input.workspace,
303
+ effectiveAccess,
304
+ inherited,
305
+ sources: buildSources(dotfileRules, effectiveAccess, presetRules, fileRules, rawScopes, inherited),
306
+ readonlyPatterns,
307
+ readwritePatterns,
308
+ deniedPatterns,
309
+ readonlyPaths,
310
+ readwritePaths,
311
+ deniedPaths,
312
+ scopes,
313
+ network: permissions.network,
314
+ exec: permissions.exec ? [...permissions.exec] : undefined,
315
+ acl: buildAcl(input.agentName, readonlyPaths, readwritePaths, deniedPaths),
316
+ summary: {
317
+ readonly: readonlyPaths.length,
318
+ readwrite: readwritePaths.length,
319
+ denied: deniedPaths.length,
320
+ customScopes: rawScopes.length,
321
+ },
322
+ };
323
+ }
324
+ export function mergeAcl(compilations) {
325
+ const merged = new Map();
326
+ for (const compilation of compilations) {
327
+ for (const [directory, rules] of Object.entries(compilation.acl)) {
328
+ const bucket = merged.get(directory) ?? new Set();
329
+ for (const rule of rules) {
330
+ bucket.add(rule);
331
+ }
332
+ merged.set(directory, bucket);
333
+ }
334
+ }
335
+ return Object.fromEntries([...merged.entries()]
336
+ .sort(([left], [right]) => left.localeCompare(right))
337
+ .map(([directory, rules]) => [directory, [...rules].sort()]));
338
+ }
339
+ export function resolveAgentPermissions(agentName, permissions, projectDir, workspace) {
340
+ return compileAgentPermissions({
341
+ agentName,
342
+ workspace,
343
+ projectDir,
344
+ permissions: permissions ?? {},
345
+ });
346
+ }
347
+ export function compileAgentScopes(input) {
348
+ return compileAgentPermissions(input);
349
+ }
350
+ export function mergePermissionSources(dotfileScopes, yamlScopes, rawScopes) {
351
+ return unique([...dotfileScopes, ...yamlScopes, ...rawScopes]);
352
+ }
353
+ export const expandAccessPreset = expandPreset;
354
+ export const globToScopes = (globs, action, _projectDir) => globsToScopes(globs, action);
355
+ //# sourceMappingURL=compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/provisioner/compiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ProvisionResult, WorkflowProvisionConfig } from './types.js';
2
+ export * from './compiler.js';
3
+ export * from './mount.js';
4
+ export * from './seeder.js';
5
+ export * from './token.js';
6
+ export * from './types.js';
7
+ export * from './audit.js';
8
+ export declare function provisionWorkflowAgents(config: WorkflowProvisionConfig): Promise<ProvisionResult>;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provisioner/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAKV,eAAe,EAEf,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AA+F3B,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,eAAe,CAAC,CAqNvG"}
@@ -0,0 +1,266 @@
1
+ import { existsSync, readdirSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { getDefaultPermissionAuditPath, PermissionAuditLog } from './audit.js';
4
+ import { compileAgentScopes } from './compiler.js';
5
+ import { ensureRelayfileMount } from './mount.js';
6
+ import { createWorkspaceIfNeeded, seedWorkspace, seedWorkflowAcls } from './seeder.js';
7
+ import { DEFAULT_ADMIN_AGENT_NAME, DEFAULT_ADMIN_SCOPES, mintAgentToken } from './token.js';
8
+ export * from './compiler.js';
9
+ export * from './mount.js';
10
+ export * from './seeder.js';
11
+ export * from './token.js';
12
+ export * from './types.js';
13
+ export * from './audit.js';
14
+ const DEFAULT_AGENT_NAME = 'default-agent';
15
+ function discoverAgentNames(projectDir) {
16
+ if (!existsSync(projectDir)) {
17
+ return [DEFAULT_AGENT_NAME];
18
+ }
19
+ const agentNames = new Set();
20
+ for (const entry of readdirSync(projectDir)) {
21
+ const match = entry.match(/^\.(.+)\.(agentignore|agentreadonly)$/u);
22
+ if (match?.[1]) {
23
+ agentNames.add(match[1]);
24
+ }
25
+ }
26
+ const discovered = [...agentNames].sort((left, right) => left.localeCompare(right));
27
+ return discovered.length > 0 ? discovered : [DEFAULT_AGENT_NAME];
28
+ }
29
+ function resolveAgents(config) {
30
+ const configuredAgents = Object.entries(config.agents ?? {});
31
+ if (configuredAgents.length > 0) {
32
+ return configuredAgents.map(([name, permissions]) => ({
33
+ name,
34
+ permissions: permissions ?? {},
35
+ resolutionSource: 'configured',
36
+ }));
37
+ }
38
+ return discoverAgentNames(config.projectDir).map((name) => ({
39
+ name,
40
+ permissions: {},
41
+ resolutionSource: 'auto-discovered',
42
+ }));
43
+ }
44
+ function buildSummary(compilations) {
45
+ return compilations.reduce((summary, compiled) => ({
46
+ readonly: summary.readonly + compiled.summary.readonly,
47
+ readwrite: summary.readwrite + compiled.summary.readwrite,
48
+ denied: summary.denied + compiled.summary.denied,
49
+ customScopes: summary.customScopes + compiled.summary.customScopes,
50
+ }), {
51
+ readonly: 0,
52
+ readwrite: 0,
53
+ denied: 0,
54
+ customScopes: 0,
55
+ });
56
+ }
57
+ function buildAgentResult(projectDir, name, token, compiled, mountPoint) {
58
+ return {
59
+ name,
60
+ tokenPath: path.resolve(projectDir, '.relay', 'tokens', `${name}.jwt`),
61
+ token,
62
+ scopes: [...compiled.scopes],
63
+ compiled,
64
+ mountPoint,
65
+ };
66
+ }
67
+ function sanitizePathComponent(value) {
68
+ return value.replace(/[^a-zA-Z0-9._-]+/g, '-');
69
+ }
70
+ function countAclDirectories(compilations) {
71
+ const directories = new Set();
72
+ for (const compilation of compilations) {
73
+ for (const directory of Object.keys(compilation.acl)) {
74
+ directories.add(directory);
75
+ }
76
+ }
77
+ return directories.size;
78
+ }
79
+ export async function provisionWorkflowAgents(config) {
80
+ const audit = new PermissionAuditLog();
81
+ const auditPath = getDefaultPermissionAuditPath(config.projectDir);
82
+ try {
83
+ const agents = resolveAgents(config);
84
+ const tokens = new Map();
85
+ const scopes = new Map();
86
+ const mounts = new Map();
87
+ const agentResults = {};
88
+ const compilations = [];
89
+ const compiledByAgent = new Map();
90
+ for (const agent of agents) {
91
+ audit.log({
92
+ agentName: agent.name,
93
+ action: 'resolve',
94
+ details: {
95
+ source: agent.resolutionSource,
96
+ workspace: config.workspace,
97
+ permissionKeys: Object.keys(agent.permissions).sort(),
98
+ },
99
+ });
100
+ const compiled = compileAgentScopes({
101
+ agentName: agent.name,
102
+ workspace: config.workspace,
103
+ projectDir: config.projectDir,
104
+ permissions: agent.permissions,
105
+ });
106
+ const token = mintAgentToken({
107
+ secret: config.secret,
108
+ agentName: agent.name,
109
+ workspace: config.workspace,
110
+ scopes: compiled.scopes,
111
+ ttlSeconds: config.tokenTtlSeconds,
112
+ });
113
+ audit.log({
114
+ agentName: agent.name,
115
+ action: 'mint',
116
+ details: {
117
+ workspace: config.workspace,
118
+ jwtPath: path.resolve(config.projectDir, '.relay', 'tokens', `${agent.name}.jwt`),
119
+ scopeCount: compiled.scopes.length,
120
+ scopes: [...compiled.scopes],
121
+ ttlSeconds: config.tokenTtlSeconds ?? null,
122
+ },
123
+ });
124
+ tokens.set(agent.name, token);
125
+ scopes.set(agent.name, [...compiled.scopes]);
126
+ compilations.push(compiled);
127
+ compiledByAgent.set(agent.name, compiled);
128
+ }
129
+ const adminScopes = [...(config.adminScopes ?? DEFAULT_ADMIN_SCOPES)];
130
+ const adminToken = mintAgentToken({
131
+ secret: config.secret,
132
+ agentName: DEFAULT_ADMIN_AGENT_NAME,
133
+ workspace: config.workspace,
134
+ scopes: adminScopes,
135
+ ttlSeconds: config.tokenTtlSeconds,
136
+ });
137
+ audit.log({
138
+ agentName: DEFAULT_ADMIN_AGENT_NAME,
139
+ action: 'mint',
140
+ details: {
141
+ workspace: config.workspace,
142
+ role: 'admin',
143
+ scopeCount: adminScopes.length,
144
+ scopes: adminScopes,
145
+ ttlSeconds: config.tokenTtlSeconds ?? null,
146
+ },
147
+ });
148
+ let seededAclCount = 0;
149
+ let seededFileCount = 0;
150
+ if (!config.skipSeeding) {
151
+ await createWorkspaceIfNeeded(config.relayfileBaseUrl, adminToken, config.workspace);
152
+ audit.log({
153
+ agentName: DEFAULT_ADMIN_AGENT_NAME,
154
+ action: 'seed',
155
+ details: {
156
+ workspace: config.workspace,
157
+ step: 'workspace',
158
+ relayfileBaseUrl: config.relayfileBaseUrl,
159
+ },
160
+ });
161
+ seededFileCount = await seedWorkspace(config.relayfileBaseUrl, adminToken, config.workspace, config.projectDir, config.excludeDirs ?? []);
162
+ audit.log({
163
+ agentName: DEFAULT_ADMIN_AGENT_NAME,
164
+ action: 'seed',
165
+ details: {
166
+ workspace: config.workspace,
167
+ step: 'files',
168
+ projectDir: config.projectDir,
169
+ excludeDirs: config.excludeDirs ?? [],
170
+ fileCount: seededFileCount,
171
+ },
172
+ });
173
+ await seedWorkflowAcls({
174
+ relayfileUrl: config.relayfileBaseUrl,
175
+ adminToken,
176
+ workspace: config.workspace,
177
+ agents: compilations.map((compilation) => ({
178
+ name: compilation.agentName,
179
+ acl: compilation.acl,
180
+ })),
181
+ });
182
+ seededAclCount = countAclDirectories(compilations);
183
+ audit.log({
184
+ agentName: DEFAULT_ADMIN_AGENT_NAME,
185
+ action: 'seed',
186
+ details: {
187
+ workspace: config.workspace,
188
+ step: 'acl',
189
+ directoryCount: seededAclCount,
190
+ agentCount: compilations.length,
191
+ },
192
+ });
193
+ }
194
+ if (!config.skipMount) {
195
+ const mountRoot = path.resolve(config.mountBaseDir ?? path.join(config.projectDir, '.relay'));
196
+ try {
197
+ for (const agent of agents) {
198
+ const token = tokens.get(agent.name);
199
+ const compiled = compiledByAgent.get(agent.name);
200
+ if (!token || !compiled) {
201
+ continue;
202
+ }
203
+ const mountHandle = await ensureRelayfileMount({
204
+ binaryPath: config.mountBinaryPath,
205
+ relayfileUrl: config.relayfileBaseUrl,
206
+ workspace: config.workspace,
207
+ token,
208
+ mountPoint: path.join(mountRoot, `workspace-${sanitizePathComponent(config.workspace)}-${sanitizePathComponent(agent.name)}`),
209
+ });
210
+ mounts.set(agent.name, mountHandle);
211
+ agentResults[agent.name] = buildAgentResult(config.projectDir, agent.name, token, compiled, mountHandle.mountPoint);
212
+ }
213
+ }
214
+ catch (mountError) {
215
+ for (const [, mount] of mounts) {
216
+ try {
217
+ if (typeof mount.stop === 'function') {
218
+ await mount.stop();
219
+ }
220
+ }
221
+ catch {
222
+ // Best-effort cleanup — ignore individual stop failures.
223
+ }
224
+ }
225
+ mounts.clear();
226
+ throw mountError;
227
+ }
228
+ }
229
+ else {
230
+ for (const agent of agents) {
231
+ const token = tokens.get(agent.name);
232
+ const compiled = compiledByAgent.get(agent.name);
233
+ if (!token || !compiled) {
234
+ continue;
235
+ }
236
+ agentResults[agent.name] = buildAgentResult(config.projectDir, agent.name, token, compiled);
237
+ }
238
+ }
239
+ return {
240
+ agents: agentResults,
241
+ agentNames: agents.map((agent) => agent.name),
242
+ adminToken,
243
+ seededFileCount,
244
+ seededAclCount,
245
+ summary: buildSummary(compilations),
246
+ mounts,
247
+ tokens,
248
+ scopes,
249
+ };
250
+ }
251
+ finally {
252
+ try {
253
+ await audit.writeTo(auditPath);
254
+ }
255
+ catch (error) {
256
+ if (config.verbose) {
257
+ const message = error instanceof Error ? error.message : String(error);
258
+ console.warn(`Failed to write permission audit to ${auditPath}: ${message}`);
259
+ }
260
+ }
261
+ if (config.verbose) {
262
+ console.info(audit.summary());
263
+ }
264
+ }
265
+ }
266
+ //# sourceMappingURL=index.js.map