agent-relay 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 (178) 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 +3 -0
  21. package/dist/src/cli/commands/on/start.d.ts.map +1 -1
  22. package/dist/src/cli/commands/on/start.js +113 -84
  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/dist/src/cli/lib/broker-lifecycle.d.ts.map +1 -1
  32. package/dist/src/cli/lib/broker-lifecycle.js +15 -8
  33. package/dist/src/cli/lib/broker-lifecycle.js.map +1 -1
  34. package/install.sh +4 -0
  35. package/package.json +9 -9
  36. package/packages/acp-bridge/package.json +2 -2
  37. package/packages/brand/package.json +1 -1
  38. package/packages/cloud/package.json +2 -2
  39. package/packages/config/package.json +1 -1
  40. package/packages/hooks/package.json +4 -4
  41. package/packages/memory/package.json +2 -2
  42. package/packages/openclaw/package.json +2 -2
  43. package/packages/policy/package.json +2 -2
  44. package/packages/sdk/dist/client.d.ts +3 -10
  45. package/packages/sdk/dist/client.d.ts.map +1 -1
  46. package/packages/sdk/dist/client.js +2 -0
  47. package/packages/sdk/dist/client.js.map +1 -1
  48. package/packages/sdk/dist/provisioner/__tests__/audit.test.d.ts +2 -0
  49. package/packages/sdk/dist/provisioner/__tests__/audit.test.d.ts.map +1 -0
  50. package/packages/sdk/dist/provisioner/__tests__/audit.test.js +45 -0
  51. package/packages/sdk/dist/provisioner/__tests__/audit.test.js.map +1 -0
  52. package/packages/sdk/dist/provisioner/__tests__/compiler.test.d.ts +2 -0
  53. package/packages/sdk/dist/provisioner/__tests__/compiler.test.d.ts.map +1 -0
  54. package/packages/sdk/dist/provisioner/__tests__/compiler.test.js +345 -0
  55. package/packages/sdk/dist/provisioner/__tests__/compiler.test.js.map +1 -0
  56. package/packages/sdk/dist/provisioner/__tests__/presets.test.d.ts +2 -0
  57. package/packages/sdk/dist/provisioner/__tests__/presets.test.d.ts.map +1 -0
  58. package/packages/sdk/dist/provisioner/__tests__/presets.test.js +23 -0
  59. package/packages/sdk/dist/provisioner/__tests__/presets.test.js.map +1 -0
  60. package/packages/sdk/dist/provisioner/__tests__/seeder.test.d.ts +2 -0
  61. package/packages/sdk/dist/provisioner/__tests__/seeder.test.d.ts.map +1 -0
  62. package/packages/sdk/dist/provisioner/__tests__/seeder.test.js +224 -0
  63. package/packages/sdk/dist/provisioner/__tests__/seeder.test.js.map +1 -0
  64. package/packages/sdk/dist/provisioner/__tests__/tar-seeder.test.d.ts +2 -0
  65. package/packages/sdk/dist/provisioner/__tests__/tar-seeder.test.d.ts.map +1 -0
  66. package/packages/sdk/dist/provisioner/__tests__/tar-seeder.test.js +191 -0
  67. package/packages/sdk/dist/provisioner/__tests__/tar-seeder.test.js.map +1 -0
  68. package/packages/sdk/dist/provisioner/__tests__/token-factory.test.d.ts +2 -0
  69. package/packages/sdk/dist/provisioner/__tests__/token-factory.test.d.ts.map +1 -0
  70. package/packages/sdk/dist/provisioner/__tests__/token-factory.test.js +127 -0
  71. package/packages/sdk/dist/provisioner/__tests__/token-factory.test.js.map +1 -0
  72. package/packages/sdk/dist/provisioner/__tests__/token.test.d.ts +2 -0
  73. package/packages/sdk/dist/provisioner/__tests__/token.test.d.ts.map +1 -0
  74. package/packages/sdk/dist/provisioner/__tests__/token.test.js +44 -0
  75. package/packages/sdk/dist/provisioner/__tests__/token.test.js.map +1 -0
  76. package/packages/sdk/dist/provisioner/audit.d.ts +19 -0
  77. package/packages/sdk/dist/provisioner/audit.d.ts.map +1 -0
  78. package/packages/sdk/dist/provisioner/audit.js +74 -0
  79. package/packages/sdk/dist/provisioner/audit.js.map +1 -0
  80. package/packages/sdk/dist/provisioner/compiler.d.ts +23 -0
  81. package/packages/sdk/dist/provisioner/compiler.d.ts.map +1 -0
  82. package/packages/sdk/dist/provisioner/compiler.js +355 -0
  83. package/packages/sdk/dist/provisioner/compiler.js.map +1 -0
  84. package/packages/sdk/dist/provisioner/index.d.ts +9 -0
  85. package/packages/sdk/dist/provisioner/index.d.ts.map +1 -0
  86. package/packages/sdk/dist/provisioner/index.js +266 -0
  87. package/packages/sdk/dist/provisioner/index.js.map +1 -0
  88. package/packages/sdk/dist/provisioner/mount.d.ts +14 -0
  89. package/packages/sdk/dist/provisioner/mount.d.ts.map +1 -0
  90. package/packages/sdk/dist/provisioner/mount.js +329 -0
  91. package/packages/sdk/dist/provisioner/mount.js.map +1 -0
  92. package/packages/sdk/dist/provisioner/seeder.d.ts +17 -0
  93. package/packages/sdk/dist/provisioner/seeder.d.ts.map +1 -0
  94. package/packages/sdk/dist/provisioner/seeder.js +419 -0
  95. package/packages/sdk/dist/provisioner/seeder.js.map +1 -0
  96. package/packages/sdk/dist/provisioner/token.d.ts +38 -0
  97. package/packages/sdk/dist/provisioner/token.d.ts.map +1 -0
  98. package/packages/sdk/dist/provisioner/token.js +74 -0
  99. package/packages/sdk/dist/provisioner/token.js.map +1 -0
  100. package/packages/sdk/dist/provisioner/types.d.ts +133 -0
  101. package/packages/sdk/dist/provisioner/types.d.ts.map +1 -0
  102. package/packages/sdk/dist/provisioner/types.js +2 -0
  103. package/packages/sdk/dist/provisioner/types.js.map +1 -0
  104. package/packages/sdk/dist/relay.d.ts +6 -0
  105. package/packages/sdk/dist/relay.d.ts.map +1 -1
  106. package/packages/sdk/dist/relay.js +17 -5
  107. package/packages/sdk/dist/relay.js.map +1 -1
  108. package/packages/sdk/dist/types.d.ts +9 -0
  109. package/packages/sdk/dist/types.d.ts.map +1 -1
  110. package/packages/sdk/dist/workflows/__tests__/e2e-permissions.test.d.ts +2 -0
  111. package/packages/sdk/dist/workflows/__tests__/e2e-permissions.test.d.ts.map +1 -0
  112. package/packages/sdk/dist/workflows/__tests__/e2e-permissions.test.js +331 -0
  113. package/packages/sdk/dist/workflows/__tests__/e2e-permissions.test.js.map +1 -0
  114. package/packages/sdk/dist/workflows/__tests__/permission-types.test.d.ts +2 -0
  115. package/packages/sdk/dist/workflows/__tests__/permission-types.test.d.ts.map +1 -0
  116. package/packages/sdk/dist/workflows/__tests__/permission-types.test.js +124 -0
  117. package/packages/sdk/dist/workflows/__tests__/permission-types.test.js.map +1 -0
  118. package/packages/sdk/dist/workflows/__tests__/permissions-integration.test.d.ts +2 -0
  119. package/packages/sdk/dist/workflows/__tests__/permissions-integration.test.d.ts.map +1 -0
  120. package/packages/sdk/dist/workflows/__tests__/permissions-integration.test.js +526 -0
  121. package/packages/sdk/dist/workflows/__tests__/permissions-integration.test.js.map +1 -0
  122. package/packages/sdk/dist/workflows/dry-run-format.d.ts.map +1 -1
  123. package/packages/sdk/dist/workflows/dry-run-format.js +8 -0
  124. package/packages/sdk/dist/workflows/dry-run-format.js.map +1 -1
  125. package/packages/sdk/dist/workflows/runner.d.ts +14 -0
  126. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
  127. package/packages/sdk/dist/workflows/runner.js +455 -6
  128. package/packages/sdk/dist/workflows/runner.js.map +1 -1
  129. package/packages/sdk/dist/workflows/types.d.ts +190 -0
  130. package/packages/sdk/dist/workflows/types.d.ts.map +1 -1
  131. package/packages/sdk/dist/workflows/types.js +29 -0
  132. package/packages/sdk/dist/workflows/types.js.map +1 -1
  133. package/packages/sdk/package.json +6 -2
  134. package/packages/sdk/src/__tests__/orchestration-upgrades.test.ts +123 -1
  135. package/packages/sdk/src/__tests__/provisioner-mount.test.ts +126 -0
  136. package/packages/sdk/src/__tests__/spawn-token.test.ts +41 -0
  137. package/packages/sdk/src/__tests__/workflow-runner.test.ts +77 -45
  138. package/packages/sdk/src/client.ts +4 -8
  139. package/packages/sdk/src/provisioner/__tests__/audit.test.ts +62 -0
  140. package/packages/sdk/src/provisioner/__tests__/compiler.test.ts +369 -0
  141. package/packages/sdk/src/provisioner/__tests__/presets.test.ts +25 -0
  142. package/packages/sdk/src/provisioner/__tests__/seeder.test.ts +284 -0
  143. package/packages/sdk/src/provisioner/__tests__/tar-seeder.test.ts +249 -0
  144. package/packages/sdk/src/provisioner/__tests__/token-factory.test.ts +172 -0
  145. package/packages/sdk/src/provisioner/__tests__/token.test.ts +53 -0
  146. package/packages/sdk/src/provisioner/audit.ts +104 -0
  147. package/packages/sdk/src/provisioner/compiler.ts +498 -0
  148. package/packages/sdk/src/provisioner/index.ts +332 -0
  149. package/packages/sdk/src/provisioner/mount.ts +419 -0
  150. package/packages/sdk/src/provisioner/seeder.ts +571 -0
  151. package/packages/sdk/src/provisioner/token.ts +112 -0
  152. package/packages/sdk/src/provisioner/types.ts +188 -0
  153. package/packages/sdk/src/relay.ts +31 -9
  154. package/packages/sdk/src/types.ts +9 -0
  155. package/packages/sdk/src/workflows/__tests__/e2e-permissions.test.ts +407 -0
  156. package/packages/sdk/src/workflows/__tests__/fixtures/.agentignore +2 -0
  157. package/packages/sdk/src/workflows/__tests__/fixtures/.reader.agentreadonly +2 -0
  158. package/packages/sdk/src/workflows/__tests__/fixtures/permission-test.yaml +42 -0
  159. package/packages/sdk/src/workflows/__tests__/permission-types.test.ts +154 -0
  160. package/packages/sdk/src/workflows/__tests__/permissions-integration.test.ts +649 -0
  161. package/packages/sdk/src/workflows/builtin-templates/bug-fix.yaml +13 -9
  162. package/packages/sdk/src/workflows/builtin-templates/code-review.yaml +12 -8
  163. package/packages/sdk/src/workflows/builtin-templates/competitive.yaml +11 -7
  164. package/packages/sdk/src/workflows/builtin-templates/documentation.yaml +16 -8
  165. package/packages/sdk/src/workflows/builtin-templates/feature-dev.yaml +13 -9
  166. package/packages/sdk/src/workflows/builtin-templates/refactor.yaml +13 -9
  167. package/packages/sdk/src/workflows/builtin-templates/review-loop.yaml +14 -10
  168. package/packages/sdk/src/workflows/builtin-templates/security-audit.yaml +19 -9
  169. package/packages/sdk/src/workflows/dry-run-format.ts +14 -1
  170. package/packages/sdk/src/workflows/runner.ts +559 -6
  171. package/packages/sdk/src/workflows/schema.json +204 -114
  172. package/packages/sdk/src/workflows/types.ts +266 -1
  173. package/packages/sdk/vitest.config.ts +5 -1
  174. package/packages/sdk-py/pyproject.toml +1 -1
  175. package/packages/telemetry/package.json +1 -1
  176. package/packages/trajectory/package.json +2 -2
  177. package/packages/user-directory/package.json +2 -2
  178. package/packages/utils/package.json +2 -2
@@ -0,0 +1,17 @@
1
+ interface WorkflowAclAgent {
2
+ name: string;
3
+ acl: Record<string, string[]>;
4
+ }
5
+ interface SeedWorkflowAclsOptions {
6
+ relayfileUrl: string;
7
+ adminToken: string;
8
+ workspace: string;
9
+ agents: WorkflowAclAgent[];
10
+ }
11
+ export declare function createWorkspaceIfNeeded(baseUrl: string, token: string, workspaceId: string): Promise<void>;
12
+ export declare function seedAclRules(baseUrl: string, token: string, workspaceId: string, aclRules: Record<string, string[]>): Promise<void>;
13
+ export declare function seedWorkspace(baseUrl: string, token: string, workspaceId: string, projectDir: string, excludeDirs: string[]): Promise<number>;
14
+ export declare function seedWorkflowAcls({ relayfileUrl, adminToken, workspace, agents, }: SeedWorkflowAclsOptions): Promise<void>;
15
+ export declare function seedWorkspaceTar(baseUrl: string, token: string, workspaceId: string, projectDir: string, excludeDirs: string[]): Promise<number>;
16
+ export {};
17
+ //# sourceMappingURL=seeder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seeder.d.ts","sourceRoot":"","sources":["../../../../../packages/sdk/src/provisioner/seeder.ts"],"names":[],"mappings":"AA6BA,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC/B;AAED,UAAU,uBAAuB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AA0MD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA6Df;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,MAAM,CAAC,CAyBjB;AA4DD,wBAAsB,gBAAgB,CAAC,EACrC,YAAY,EACZ,UAAU,EACV,SAAS,EACT,MAAM,GACP,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQzC;AA8DD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,MAAM,CAAC,CAqDjB"}
@@ -0,0 +1,419 @@
1
+ import { RelayFileClient } from '@relayfile/sdk';
2
+ import { execSync } from 'node:child_process';
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import * as tar from 'tar';
6
+ const DEFAULT_EXCLUDED_DIRS = ['.relay', '.git', 'node_modules'];
7
+ const DEFAULT_EXCLUDED_FILES = new Set(['.relayfile-mount-state.json']);
8
+ const BATCH_SIZE = 50;
9
+ const utf8Decoder = new TextDecoder('utf-8', { fatal: true });
10
+ function normalizeBaseUrl(baseUrl) {
11
+ const url = String(baseUrl ?? '').trim();
12
+ let end = url.length;
13
+ while (end > 0 && url.charCodeAt(end - 1) === 0x2f) {
14
+ end--;
15
+ }
16
+ return end === url.length ? url : url.slice(0, end);
17
+ }
18
+ function normalizeWorkspaceId(workspaceId) {
19
+ const value = String(workspaceId ?? '').trim();
20
+ if (!value) {
21
+ throw new Error('workspaceId is required');
22
+ }
23
+ return value;
24
+ }
25
+ function normalizeExcludeDirs(excludeDirs) {
26
+ const result = new Set();
27
+ for (const dir of excludeDirs) {
28
+ const normalized = String(dir ?? '')
29
+ .trim()
30
+ .replace(/^[/\\]+|[/\\]+$/g, '');
31
+ if (!normalized) {
32
+ continue;
33
+ }
34
+ result.add(normalized);
35
+ }
36
+ return result;
37
+ }
38
+ function normalizeAclDirectory(dirPath) {
39
+ const normalized = String(dirPath ?? '')
40
+ .trim()
41
+ .replace(/\\/gu, '/')
42
+ .replace(/\/+$/u, '');
43
+ if (!normalized || normalized === '/') {
44
+ return '/';
45
+ }
46
+ return normalized.startsWith('/') ? normalized : `/${normalized}`;
47
+ }
48
+ function isReviewerAgent(agentName) {
49
+ return /reviewer/iu.test(String(agentName ?? '').trim());
50
+ }
51
+ function createClient(baseUrl, token) {
52
+ return new RelayFileClient({
53
+ baseUrl: normalizeBaseUrl(baseUrl),
54
+ token,
55
+ retry: { maxRetries: 0 },
56
+ });
57
+ }
58
+ function isUtf8(raw) {
59
+ try {
60
+ utf8Decoder.decode(raw);
61
+ return true;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ function buildSeedFilePayload(filePath, rootDir) {
68
+ const relative = path.relative(rootDir, filePath).split(path.sep).join('/');
69
+ const raw = fs.readFileSync(filePath);
70
+ if (isUtf8(raw)) {
71
+ return { path: `/${relative}`, content: raw.toString('utf8'), encoding: 'utf-8' };
72
+ }
73
+ return { path: `/${relative}`, content: raw.toString('base64'), encoding: 'base64' };
74
+ }
75
+ function collectSeedPaths(rootDir, currentRelative, excludeDirs, output) {
76
+ const absoluteDir = path.join(rootDir, currentRelative);
77
+ const entries = fs.readdirSync(absoluteDir, { withFileTypes: true });
78
+ for (const entry of entries) {
79
+ if (excludeDirs.has(entry.name)) {
80
+ continue;
81
+ }
82
+ if (DEFAULT_EXCLUDED_FILES.has(entry.name)) {
83
+ continue;
84
+ }
85
+ const nextRelative = currentRelative ? `${currentRelative}/${entry.name}` : entry.name;
86
+ const absolutePath = path.join(rootDir, nextRelative);
87
+ if (excludeDirs.has(nextRelative)) {
88
+ continue;
89
+ }
90
+ if (entry.isDirectory()) {
91
+ collectSeedPaths(rootDir, nextRelative, excludeDirs, output);
92
+ continue;
93
+ }
94
+ if (entry.isFile()) {
95
+ output.push(absolutePath);
96
+ continue;
97
+ }
98
+ if (entry.isSymbolicLink()) {
99
+ try {
100
+ const resolved = fs.realpathSync(absolutePath);
101
+ if (!resolved.startsWith(rootDir + path.sep) && resolved !== rootDir) {
102
+ continue;
103
+ }
104
+ const stat = fs.statSync(resolved);
105
+ if (stat.isDirectory()) {
106
+ collectSeedPaths(rootDir, nextRelative, excludeDirs, output);
107
+ continue;
108
+ }
109
+ if (stat.isFile()) {
110
+ output.push(absolutePath);
111
+ }
112
+ }
113
+ catch {
114
+ // Ignore symlinks that cannot be resolved.
115
+ }
116
+ }
117
+ }
118
+ }
119
+ function parseBulkWriteResponse(payload) {
120
+ if (!payload || typeof payload !== 'object') {
121
+ return { written: 0, errorCount: 0, errors: [] };
122
+ }
123
+ const parsed = payload;
124
+ return {
125
+ written: typeof parsed.written === 'number' ? parsed.written : 0,
126
+ errorCount: typeof parsed.errorCount === 'number' ? parsed.errorCount : 0,
127
+ errors: parsed.errors ?? [],
128
+ };
129
+ }
130
+ async function postBulkWrite(baseUrl, token, workspaceId, files, correlationId) {
131
+ const response = await fetch(`${normalizeBaseUrl(baseUrl)}/v1/workspaces/${encodeURIComponent(workspaceId)}/fs/bulk`, {
132
+ method: 'POST',
133
+ headers: {
134
+ Authorization: `Bearer ${token}`,
135
+ 'Content-Type': 'application/json',
136
+ 'X-Correlation-Id': correlationId,
137
+ },
138
+ body: JSON.stringify({ files }),
139
+ });
140
+ const body = await response.text();
141
+ if (!response.ok) {
142
+ throw new Error(`failed to seed workspace ${workspaceId}: HTTP ${response.status} ${body}`.trim());
143
+ }
144
+ if (!body) {
145
+ return { written: files.length, errorCount: 0, errors: [] };
146
+ }
147
+ try {
148
+ return parseBulkWriteResponse(JSON.parse(body));
149
+ }
150
+ catch {
151
+ return { written: files.length, errorCount: 0, errors: [] };
152
+ }
153
+ }
154
+ async function writeBulkWrite(baseUrl, token, workspaceId, files, correlationId) {
155
+ const client = createClient(baseUrl, token);
156
+ try {
157
+ const response = await client.bulkWrite({
158
+ workspaceId,
159
+ files,
160
+ correlationId,
161
+ });
162
+ return parseBulkWriteResponse(response);
163
+ }
164
+ catch (error) {
165
+ if (typeof error.status === 'number') {
166
+ throw error;
167
+ }
168
+ }
169
+ return postBulkWrite(baseUrl, token, workspaceId, files, correlationId);
170
+ }
171
+ export async function createWorkspaceIfNeeded(baseUrl, token, workspaceId) {
172
+ const workspace = normalizeWorkspaceId(workspaceId);
173
+ const client = createClient(baseUrl, token);
174
+ const maybeCreateWorkspace = client;
175
+ if (typeof maybeCreateWorkspace.createWorkspace === 'function') {
176
+ for (const arg of [workspace, { id: workspace }, { workspaceId: workspace }, { name: workspace }]) {
177
+ try {
178
+ await maybeCreateWorkspace.createWorkspace(arg);
179
+ return;
180
+ }
181
+ catch {
182
+ // Continue to the next overload candidate, then fallback to HTTP.
183
+ }
184
+ }
185
+ }
186
+ const endpoint = `${normalizeBaseUrl(baseUrl)}/v1/workspaces`;
187
+ const bodyCandidates = [
188
+ { name: workspace },
189
+ { workspace: workspace },
190
+ { workspaceId: workspace },
191
+ { id: workspace },
192
+ ];
193
+ let lastFailure = null;
194
+ for (const body of bodyCandidates) {
195
+ try {
196
+ const response = await fetch(endpoint, {
197
+ method: 'POST',
198
+ headers: {
199
+ Authorization: `Bearer ${token}`,
200
+ 'Content-Type': 'application/json',
201
+ 'X-Correlation-Id': `create-workspace-${Date.now()}`,
202
+ },
203
+ body: JSON.stringify(body),
204
+ });
205
+ if (response.status === 200 ||
206
+ response.status === 201 ||
207
+ response.status === 204 ||
208
+ response.status === 409) {
209
+ return;
210
+ }
211
+ const responseBody = await response.text().catch(() => '');
212
+ lastFailure = `HTTP ${response.status} ${responseBody}`.trim();
213
+ if (response.status < 500 && response.status !== 409) {
214
+ continue;
215
+ }
216
+ }
217
+ catch (error) {
218
+ lastFailure = String(error);
219
+ }
220
+ }
221
+ if (lastFailure) {
222
+ throw new Error(`Failed to create workspace ${workspace}: ${lastFailure}`);
223
+ }
224
+ }
225
+ export async function seedAclRules(baseUrl, token, workspaceId, aclRules) {
226
+ const workspace = normalizeWorkspaceId(workspaceId);
227
+ const files = Object.entries(aclRules).map(([dirPath, rules]) => {
228
+ const normalizedDir = String(dirPath ?? '')
229
+ .trim()
230
+ .replace(/\/+$/, '');
231
+ const aclPath = normalizedDir === '' || normalizedDir === '/' ? '/.relayfile.acl' : `${normalizedDir}/.relayfile.acl`;
232
+ return {
233
+ path: aclPath,
234
+ content: JSON.stringify({ semantics: { permissions: rules } }),
235
+ encoding: 'utf-8',
236
+ };
237
+ });
238
+ if (files.length === 0) {
239
+ return;
240
+ }
241
+ const result = await writeBulkWrite(baseUrl, token, workspace, files, `seed-acl-${workspace}-${Date.now()}`);
242
+ if (result.errorCount > 0) {
243
+ const details = result.errors ? JSON.stringify(result.errors) : '[]';
244
+ throw new Error(`ACL seeding had ${result.errorCount} error(s) for workspace ${workspace}: ${details}`);
245
+ }
246
+ }
247
+ export async function seedWorkspace(baseUrl, token, workspaceId, projectDir, excludeDirs) {
248
+ const workspace = normalizeWorkspaceId(workspaceId);
249
+ const rootDir = path.resolve(projectDir);
250
+ const excludes = normalizeExcludeDirs([...DEFAULT_EXCLUDED_DIRS, ...excludeDirs]);
251
+ const seedPaths = [];
252
+ collectSeedPaths(rootDir, '', excludes, seedPaths);
253
+ const allFiles = seedPaths
254
+ .sort((left, right) => left.localeCompare(right))
255
+ .map((filePath) => buildSeedFilePayload(filePath, rootDir));
256
+ let seededCount = 0;
257
+ for (let index = 0; index < allFiles.length; index += BATCH_SIZE) {
258
+ const batch = allFiles.slice(index, index + BATCH_SIZE);
259
+ const batchIndex = Math.floor(index / BATCH_SIZE);
260
+ const result = await writeBulkWrite(baseUrl, token, workspace, batch, `seed-workspace-${workspace}-${Date.now()}-${batchIndex}`);
261
+ seededCount += result.written;
262
+ }
263
+ return seededCount;
264
+ }
265
+ function buildWorkflowAclRules(agents) {
266
+ const directories = new Set();
267
+ const normalizedAgents = agents.map((agent) => ({
268
+ name: String(agent.name ?? '').trim(),
269
+ acl: Object.fromEntries(Object.entries(agent.acl ?? {}).map(([dirPath, rules]) => [
270
+ normalizeAclDirectory(dirPath),
271
+ Array.isArray(rules) ? rules : [],
272
+ ])),
273
+ }));
274
+ const reviewerNames = normalizedAgents
275
+ .map((agent) => agent.name)
276
+ .filter((name) => name !== '' && isReviewerAgent(name));
277
+ for (const agent of normalizedAgents) {
278
+ for (const dirPath of Object.keys(agent.acl)) {
279
+ directories.add(dirPath);
280
+ }
281
+ }
282
+ const merged = new Map();
283
+ for (const dirPath of [...directories].sort((left, right) => left.localeCompare(right))) {
284
+ const rules = new Set();
285
+ for (const reviewerName of reviewerNames) {
286
+ rules.add(`allow:agent:${reviewerName}:read`);
287
+ }
288
+ for (const agent of normalizedAgents) {
289
+ if (!agent.name) {
290
+ continue;
291
+ }
292
+ const agentRules = agent.acl[dirPath] ?? [];
293
+ const hasRead = agentRules.includes('read') || agentRules.includes('write');
294
+ const hasWrite = agentRules.includes('write');
295
+ if (hasRead) {
296
+ rules.add(`allow:agent:${agent.name}:read`);
297
+ }
298
+ else if (!isReviewerAgent(agent.name)) {
299
+ rules.add(`deny:agent:${agent.name}`);
300
+ }
301
+ if (hasWrite) {
302
+ rules.add(`allow:agent:${agent.name}:write`);
303
+ }
304
+ }
305
+ if (rules.size > 0) {
306
+ merged.set(dirPath, rules);
307
+ }
308
+ }
309
+ return Object.fromEntries([...merged.entries()].map(([dirPath, rules]) => [dirPath, [...rules].sort()]));
310
+ }
311
+ export async function seedWorkflowAcls({ relayfileUrl, adminToken, workspace, agents, }) {
312
+ const aclRules = buildWorkflowAclRules(agents);
313
+ if (Object.keys(aclRules).length === 0) {
314
+ return;
315
+ }
316
+ await seedAclRules(relayfileUrl, adminToken, workspace, aclRules);
317
+ }
318
+ function getGitTrackedFiles(rootDir) {
319
+ try {
320
+ const output = execSync('git ls-files -z --cached --others --exclude-standard', {
321
+ cwd: rootDir,
322
+ encoding: 'utf-8',
323
+ maxBuffer: 50 * 1024 * 1024,
324
+ });
325
+ const files = output.split('\0').filter(Boolean);
326
+ return files;
327
+ }
328
+ catch {
329
+ return null;
330
+ }
331
+ }
332
+ function collectAllFiles(rootDir, excludeDirs) {
333
+ const files = [];
334
+ const stack = [''];
335
+ while (stack.length > 0) {
336
+ const currentRelative = stack.pop();
337
+ const absoluteDir = path.join(rootDir, currentRelative);
338
+ let entries;
339
+ try {
340
+ entries = fs.readdirSync(absoluteDir, { withFileTypes: true });
341
+ }
342
+ catch {
343
+ continue;
344
+ }
345
+ for (const entry of entries) {
346
+ if (excludeDirs.has(entry.name))
347
+ continue;
348
+ if (DEFAULT_EXCLUDED_FILES.has(entry.name))
349
+ continue;
350
+ const nextRelative = currentRelative ? `${currentRelative}/${entry.name}` : entry.name;
351
+ if (excludeDirs.has(nextRelative))
352
+ continue;
353
+ if (entry.isDirectory()) {
354
+ stack.push(nextRelative);
355
+ }
356
+ else if (entry.isFile()) {
357
+ files.push(nextRelative);
358
+ }
359
+ }
360
+ }
361
+ return files;
362
+ }
363
+ async function createTarBuffer(rootDir, files) {
364
+ const tarStream = tar.create({ gzip: true, cwd: rootDir, portable: true, follow: true }, files);
365
+ const chunks = [];
366
+ for await (const chunk of tarStream) {
367
+ chunks.push(Buffer.from(chunk));
368
+ }
369
+ return Buffer.concat(chunks);
370
+ }
371
+ export async function seedWorkspaceTar(baseUrl, token, workspaceId, projectDir, excludeDirs) {
372
+ const workspace = normalizeWorkspaceId(workspaceId);
373
+ const rootDir = path.resolve(projectDir);
374
+ const excludes = normalizeExcludeDirs([...DEFAULT_EXCLUDED_DIRS, ...excludeDirs]);
375
+ const gitFiles = getGitTrackedFiles(rootDir);
376
+ const rawFiles = gitFiles ?? collectAllFiles(rootDir, excludes);
377
+ const files = gitFiles
378
+ ? rawFiles.filter((f) => {
379
+ const segments = f.split('/');
380
+ if (DEFAULT_EXCLUDED_FILES.has(segments[segments.length - 1]))
381
+ return false;
382
+ return !segments.some((seg) => excludes.has(seg));
383
+ })
384
+ : rawFiles;
385
+ if (files.length === 0) {
386
+ return 0;
387
+ }
388
+ const tarball = await createTarBuffer(rootDir, files);
389
+ const url = `${normalizeBaseUrl(baseUrl)}/v1/workspaces/${encodeURIComponent(workspace)}/fs/import`;
390
+ const response = await fetch(url, {
391
+ method: 'POST',
392
+ headers: {
393
+ Authorization: `Bearer ${token}`,
394
+ 'Content-Type': 'application/gzip',
395
+ 'X-Correlation-Id': `seed-tar-${workspace}-${Date.now()}`,
396
+ },
397
+ body: tarball.buffer.slice(tarball.byteOffset, tarball.byteOffset + tarball.byteLength),
398
+ });
399
+ if (response.status === 404) {
400
+ // Tar import not supported — fall back to batch upload
401
+ return seedWorkspace(baseUrl, token, workspaceId, projectDir, excludeDirs);
402
+ }
403
+ if (!response.ok) {
404
+ const body = await response.text().catch(() => '');
405
+ throw new Error(`tar import failed for workspace ${workspace}: HTTP ${response.status} ${body}`.trim());
406
+ }
407
+ const raw = await response.text();
408
+ if (!raw.trim()) {
409
+ return files.length;
410
+ }
411
+ try {
412
+ const parsed = JSON.parse(raw);
413
+ return typeof parsed.imported === 'number' ? parsed.imported : files.length;
414
+ }
415
+ catch {
416
+ return files.length;
417
+ }
418
+ }
419
+ //# sourceMappingURL=seeder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seeder.js","sourceRoot":"","sources":["../../../../../packages/sdk/src/provisioner/seeder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export declare const DEFAULT_WORKFLOW_TOKEN_TTL_SECONDS: number;
2
+ export declare const DEFAULT_ADMIN_AGENT_NAME = "relay-admin";
3
+ export declare const DEFAULT_ADMIN_SCOPES: string[];
4
+ export interface TokenClaims {
5
+ sub: string;
6
+ org: string;
7
+ wks: string;
8
+ workspace_id: string;
9
+ agent_name: string;
10
+ scopes: string[];
11
+ sponsorId: string;
12
+ sponsorChain: string[];
13
+ token_type: string;
14
+ iss: string;
15
+ aud: string[];
16
+ iat: number;
17
+ exp: number;
18
+ jti: string;
19
+ }
20
+ export interface MintAgentTokenOptions {
21
+ secret: string;
22
+ agentName: string;
23
+ workspace: string;
24
+ scopes: string[];
25
+ ttlSeconds?: number;
26
+ }
27
+ export declare function mintAgentToken(opts: MintAgentTokenOptions): string;
28
+ export declare class WorkflowTokenFactory {
29
+ private readonly secret;
30
+ private readonly workspace;
31
+ private readonly tokens;
32
+ private readonly ttlSeconds;
33
+ constructor(secret: string, workspace: string, ttlSeconds?: number);
34
+ mintForAgent(agentName: string, scopes: string[], ttlSeconds?: number): string;
35
+ mintAdmin(ttlSeconds?: number): string;
36
+ getToken(agentName: string): string | undefined;
37
+ }
38
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../../../packages/sdk/src/provisioner/token.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kCAAkC,QAAc,CAAC;AAC9D,eAAO,MAAM,wBAAwB,gBAAgB,CAAC;AACtD,eAAO,MAAM,oBAAoB,UAShC,CAAC;AAIF,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAcD,wBAAgB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAuBlE;AAED,qBAAa,oBAAoB;IAK7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAL5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EAClC,UAAU,SAAqC;IAKjD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,SAAkB,GAAG,MAAM;IAavF,SAAS,CAAC,UAAU,SAAkB,GAAG,MAAM;IAI/C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAGhD"}
@@ -0,0 +1,74 @@
1
+ import { createHmac, randomUUID } from 'node:crypto';
2
+ export const DEFAULT_WORKFLOW_TOKEN_TTL_SECONDS = 2 * 60 * 60;
3
+ export const DEFAULT_ADMIN_AGENT_NAME = 'relay-admin';
4
+ export const DEFAULT_ADMIN_SCOPES = [
5
+ 'relayauth:*:manage:*',
6
+ 'relayauth:*:read:*',
7
+ 'relayfile:*:*:*',
8
+ 'fs:read',
9
+ 'fs:write',
10
+ 'sync:trigger',
11
+ 'ops:read',
12
+ 'admin:read',
13
+ ];
14
+ const JWT_HEADER = { alg: 'HS256', typ: 'JWT' };
15
+ function base64urlEncode(value) {
16
+ return Buffer.from(JSON.stringify(value)).toString('base64url');
17
+ }
18
+ function normalizeTtlSeconds(ttlSeconds) {
19
+ if (ttlSeconds === undefined) {
20
+ return DEFAULT_WORKFLOW_TOKEN_TTL_SECONDS;
21
+ }
22
+ return Math.max(1, Math.floor(ttlSeconds));
23
+ }
24
+ export function mintAgentToken(opts) {
25
+ const now = Math.floor(Date.now() / 1000);
26
+ const payload = {
27
+ sub: `agent_${opts.agentName}`,
28
+ org: 'org_relay',
29
+ wks: opts.workspace,
30
+ workspace_id: opts.workspace,
31
+ agent_name: opts.agentName,
32
+ scopes: [...opts.scopes],
33
+ sponsorId: 'relay-local',
34
+ sponsorChain: ['relay-local'],
35
+ token_type: 'access',
36
+ iss: 'relayauth:local',
37
+ aud: ['relayauth', 'relayfile'],
38
+ iat: now,
39
+ exp: now + normalizeTtlSeconds(opts.ttlSeconds),
40
+ jti: `tok-${now}-${randomUUID()}`,
41
+ };
42
+ const unsigned = `${base64urlEncode(JWT_HEADER)}.${base64urlEncode(payload)}`;
43
+ const signature = createHmac('sha256', opts.secret).update(unsigned).digest('base64url');
44
+ return `${unsigned}.${signature}`;
45
+ }
46
+ export class WorkflowTokenFactory {
47
+ secret;
48
+ workspace;
49
+ tokens = new Map();
50
+ ttlSeconds;
51
+ constructor(secret, workspace, ttlSeconds = DEFAULT_WORKFLOW_TOKEN_TTL_SECONDS) {
52
+ this.secret = secret;
53
+ this.workspace = workspace;
54
+ this.ttlSeconds = normalizeTtlSeconds(ttlSeconds);
55
+ }
56
+ mintForAgent(agentName, scopes, ttlSeconds = this.ttlSeconds) {
57
+ const token = mintAgentToken({
58
+ secret: this.secret,
59
+ workspace: this.workspace,
60
+ agentName,
61
+ scopes,
62
+ ttlSeconds,
63
+ });
64
+ this.tokens.set(agentName, token);
65
+ return token;
66
+ }
67
+ mintAdmin(ttlSeconds = this.ttlSeconds) {
68
+ return this.mintForAgent(DEFAULT_ADMIN_AGENT_NAME, DEFAULT_ADMIN_SCOPES, ttlSeconds);
69
+ }
70
+ getToken(agentName) {
71
+ return this.tokens.get(agentName);
72
+ }
73
+ }
74
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../../../packages/sdk/src/provisioner/token.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/core.ts"],"names":[],"mappings":"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"}
@@ -48,9 +48,13 @@ function findDashboardBinaryDefault(fileSystem) {
48
48
  return envOverride;
49
49
  }
50
50
  // In local multi-repo workspaces, prefer a sibling relay-dashboard build when available.
51
- const siblingWorkspaceBuild = path.resolve(process.cwd(), '..', 'relay-dashboard', 'packages', 'dashboard-server', 'dist', 'start.js');
52
- if (fileSystem.existsSync(siblingWorkspaceBuild)) {
53
- return siblingWorkspaceBuild;
51
+ // Only when RELAY_LOCAL_DEV is set otherwise the installed binary should win so
52
+ // users don't accidentally run a stale dev build.
53
+ if (process.env.RELAY_LOCAL_DEV === '1') {
54
+ const siblingWorkspaceBuild = path.resolve(process.cwd(), '..', 'relay-dashboard', 'packages', 'dashboard-server', 'dist', 'start.js');
55
+ if (fileSystem.existsSync(siblingWorkspaceBuild)) {
56
+ return siblingWorkspaceBuild;
57
+ }
54
58
  }
55
59
  // In workspace / local dev mode, try resolving the dashboard-server package directly
56
60
  if (process.env.RELAY_LOCAL_DEV === '1') {