agent-relay 3.2.22 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/README.md +5 -5
  2. package/bin/agent-relay-broker-darwin-arm64 +0 -0
  3. package/bin/agent-relay-broker-darwin-x64 +0 -0
  4. package/bin/agent-relay-broker-linux-arm64 +0 -0
  5. package/bin/agent-relay-broker-linux-x64 +0 -0
  6. package/dist/index.cjs +6564 -2100
  7. package/dist/src/cli/bootstrap.d.ts.map +1 -1
  8. package/dist/src/cli/bootstrap.js +2 -0
  9. package/dist/src/cli/bootstrap.js.map +1 -1
  10. package/dist/src/cli/commands/agent-management.d.ts.map +1 -1
  11. package/dist/src/cli/commands/agent-management.js +14 -4
  12. package/dist/src/cli/commands/agent-management.js.map +1 -1
  13. package/dist/src/cli/commands/core.d.ts +2 -6
  14. package/dist/src/cli/commands/core.d.ts.map +1 -1
  15. package/dist/src/cli/commands/core.js +31 -12
  16. package/dist/src/cli/commands/core.js.map +1 -1
  17. package/dist/src/cli/commands/messaging.d.ts.map +1 -1
  18. package/dist/src/cli/commands/messaging.js +10 -3
  19. package/dist/src/cli/commands/messaging.js.map +1 -1
  20. package/dist/src/cli/commands/monitoring.d.ts +2 -2
  21. package/dist/src/cli/commands/monitoring.d.ts.map +1 -1
  22. package/dist/src/cli/commands/monitoring.js +15 -6
  23. package/dist/src/cli/commands/monitoring.js.map +1 -1
  24. package/dist/src/cli/commands/on/dotfiles.d.ts +35 -0
  25. package/dist/src/cli/commands/on/dotfiles.d.ts.map +1 -0
  26. package/dist/src/cli/commands/on/dotfiles.js +157 -0
  27. package/dist/src/cli/commands/on/dotfiles.js.map +1 -0
  28. package/dist/src/cli/commands/on/prereqs.d.ts +15 -0
  29. package/dist/src/cli/commands/on/prereqs.d.ts.map +1 -0
  30. package/dist/src/cli/commands/on/prereqs.js +103 -0
  31. package/dist/src/cli/commands/on/prereqs.js.map +1 -0
  32. package/dist/src/cli/commands/on/provision.d.ts +22 -0
  33. package/dist/src/cli/commands/on/provision.d.ts.map +1 -0
  34. package/dist/src/cli/commands/on/provision.js +157 -0
  35. package/dist/src/cli/commands/on/provision.js.map +1 -0
  36. package/dist/src/cli/commands/on/relayfile-binary.d.ts +2 -0
  37. package/dist/src/cli/commands/on/relayfile-binary.d.ts.map +1 -0
  38. package/dist/src/cli/commands/on/relayfile-binary.js +208 -0
  39. package/dist/src/cli/commands/on/relayfile-binary.js.map +1 -0
  40. package/dist/src/cli/commands/on/scan.d.ts +8 -0
  41. package/dist/src/cli/commands/on/scan.d.ts.map +1 -0
  42. package/dist/src/cli/commands/on/scan.js +59 -0
  43. package/dist/src/cli/commands/on/scan.js.map +1 -0
  44. package/dist/src/cli/commands/on/services.d.ts +17 -0
  45. package/dist/src/cli/commands/on/services.d.ts.map +1 -0
  46. package/dist/src/cli/commands/on/services.js +328 -0
  47. package/dist/src/cli/commands/on/services.js.map +1 -0
  48. package/dist/src/cli/commands/on/start.d.ts +61 -0
  49. package/dist/src/cli/commands/on/start.d.ts.map +1 -0
  50. package/dist/src/cli/commands/on/start.js +1107 -0
  51. package/dist/src/cli/commands/on/start.js.map +1 -0
  52. package/dist/src/cli/commands/on/stop.d.ts +4 -0
  53. package/dist/src/cli/commands/on/stop.d.ts.map +1 -0
  54. package/dist/src/cli/commands/on/stop.js +11 -0
  55. package/dist/src/cli/commands/on/stop.js.map +1 -0
  56. package/dist/src/cli/commands/on/token.d.ts +8 -0
  57. package/dist/src/cli/commands/on/token.d.ts.map +1 -0
  58. package/dist/src/cli/commands/on/token.js +26 -0
  59. package/dist/src/cli/commands/on/token.js.map +1 -0
  60. package/dist/src/cli/commands/on/workspace.d.ts +4 -0
  61. package/dist/src/cli/commands/on/workspace.d.ts.map +1 -0
  62. package/dist/src/cli/commands/on/workspace.js +245 -0
  63. package/dist/src/cli/commands/on/workspace.js.map +1 -0
  64. package/dist/src/cli/commands/on.d.ts +10 -0
  65. package/dist/src/cli/commands/on.d.ts.map +1 -0
  66. package/dist/src/cli/commands/on.js +52 -0
  67. package/dist/src/cli/commands/on.js.map +1 -0
  68. package/dist/src/cli/commands/setup.d.ts.map +1 -1
  69. package/dist/src/cli/commands/setup.js +10 -21
  70. package/dist/src/cli/commands/setup.js.map +1 -1
  71. package/dist/src/cli/lib/bridge.js +1 -1
  72. package/dist/src/cli/lib/bridge.js.map +1 -1
  73. package/dist/src/cli/lib/broker-lifecycle.d.ts +14 -4
  74. package/dist/src/cli/lib/broker-lifecycle.d.ts.map +1 -1
  75. package/dist/src/cli/lib/broker-lifecycle.js +82 -120
  76. package/dist/src/cli/lib/broker-lifecycle.js.map +1 -1
  77. package/dist/src/cli/lib/client-factory.d.ts +4 -4
  78. package/dist/src/cli/lib/client-factory.d.ts.map +1 -1
  79. package/dist/src/cli/lib/client-factory.js +14 -11
  80. package/dist/src/cli/lib/client-factory.js.map +1 -1
  81. package/dist/src/cli/lib/core-maintenance.d.ts.map +1 -1
  82. package/dist/src/cli/lib/core-maintenance.js +11 -22
  83. package/dist/src/cli/lib/core-maintenance.js.map +1 -1
  84. package/dist/src/cost/pricing.d.ts +18 -0
  85. package/dist/src/cost/pricing.d.ts.map +1 -0
  86. package/dist/src/cost/pricing.js +111 -0
  87. package/dist/src/cost/pricing.js.map +1 -0
  88. package/dist/src/cost/tracker.d.ts +13 -0
  89. package/dist/src/cost/tracker.d.ts.map +1 -0
  90. package/dist/src/cost/tracker.js +152 -0
  91. package/dist/src/cost/tracker.js.map +1 -0
  92. package/dist/src/cost/types.d.ts +23 -0
  93. package/dist/src/cost/types.d.ts.map +1 -0
  94. package/dist/src/cost/types.js +2 -0
  95. package/dist/src/cost/types.js.map +1 -0
  96. package/package.json +15 -12
  97. package/packages/acp-bridge/package.json +2 -2
  98. package/packages/brand/package.json +1 -1
  99. package/packages/cloud/package.json +3 -3
  100. package/packages/config/package.json +1 -1
  101. package/packages/hooks/package.json +4 -4
  102. package/packages/memory/package.json +2 -2
  103. package/packages/openclaw/package.json +2 -2
  104. package/packages/policy/package.json +2 -2
  105. package/packages/sdk/README.md +10 -3
  106. package/packages/sdk/dist/broker-path.d.ts +3 -2
  107. package/packages/sdk/dist/broker-path.d.ts.map +1 -1
  108. package/packages/sdk/dist/broker-path.js +119 -32
  109. package/packages/sdk/dist/broker-path.js.map +1 -1
  110. package/packages/sdk/dist/client.d.ts +119 -197
  111. package/packages/sdk/dist/client.d.ts.map +1 -1
  112. package/packages/sdk/dist/client.js +354 -823
  113. package/packages/sdk/dist/client.js.map +1 -1
  114. package/packages/sdk/dist/examples/example.js +2 -5
  115. package/packages/sdk/dist/examples/example.js.map +1 -1
  116. package/packages/sdk/dist/index.d.ts +3 -1
  117. package/packages/sdk/dist/index.d.ts.map +1 -1
  118. package/packages/sdk/dist/index.js +3 -1
  119. package/packages/sdk/dist/index.js.map +1 -1
  120. package/packages/sdk/dist/relay-adapter.d.ts +9 -26
  121. package/packages/sdk/dist/relay-adapter.d.ts.map +1 -1
  122. package/packages/sdk/dist/relay-adapter.js +75 -47
  123. package/packages/sdk/dist/relay-adapter.js.map +1 -1
  124. package/packages/sdk/dist/relay.d.ts +26 -6
  125. package/packages/sdk/dist/relay.d.ts.map +1 -1
  126. package/packages/sdk/dist/relay.js +213 -43
  127. package/packages/sdk/dist/relay.js.map +1 -1
  128. package/packages/sdk/dist/transport.d.ts +58 -0
  129. package/packages/sdk/dist/transport.d.ts.map +1 -0
  130. package/packages/sdk/dist/transport.js +184 -0
  131. package/packages/sdk/dist/transport.js.map +1 -0
  132. package/packages/sdk/dist/types.d.ts +69 -0
  133. package/packages/sdk/dist/types.d.ts.map +1 -0
  134. package/packages/sdk/dist/types.js +5 -0
  135. package/packages/sdk/dist/types.js.map +1 -0
  136. package/packages/sdk/dist/workflows/__tests__/channel-messenger.test.d.ts +2 -0
  137. package/packages/sdk/dist/workflows/__tests__/channel-messenger.test.d.ts.map +1 -0
  138. package/packages/sdk/dist/workflows/__tests__/channel-messenger.test.js +117 -0
  139. package/packages/sdk/dist/workflows/__tests__/channel-messenger.test.js.map +1 -0
  140. package/packages/sdk/dist/workflows/__tests__/run-summary-table.test.js +4 -3
  141. package/packages/sdk/dist/workflows/__tests__/run-summary-table.test.js.map +1 -1
  142. package/packages/sdk/dist/workflows/__tests__/step-executor.test.d.ts +2 -0
  143. package/packages/sdk/dist/workflows/__tests__/step-executor.test.d.ts.map +1 -0
  144. package/packages/sdk/dist/workflows/__tests__/step-executor.test.js +378 -0
  145. package/packages/sdk/dist/workflows/__tests__/step-executor.test.js.map +1 -0
  146. package/packages/sdk/dist/workflows/__tests__/template-resolver.test.d.ts +2 -0
  147. package/packages/sdk/dist/workflows/__tests__/template-resolver.test.d.ts.map +1 -0
  148. package/packages/sdk/dist/workflows/__tests__/template-resolver.test.js +145 -0
  149. package/packages/sdk/dist/workflows/__tests__/template-resolver.test.js.map +1 -0
  150. package/packages/sdk/dist/workflows/__tests__/verification.test.d.ts +2 -0
  151. package/packages/sdk/dist/workflows/__tests__/verification.test.d.ts.map +1 -0
  152. package/packages/sdk/dist/workflows/__tests__/verification.test.js +170 -0
  153. package/packages/sdk/dist/workflows/__tests__/verification.test.js.map +1 -0
  154. package/packages/sdk/dist/workflows/builder.d.ts +3 -2
  155. package/packages/sdk/dist/workflows/builder.d.ts.map +1 -1
  156. package/packages/sdk/dist/workflows/builder.js +1 -3
  157. package/packages/sdk/dist/workflows/builder.js.map +1 -1
  158. package/packages/sdk/dist/workflows/channel-messenger.d.ts +28 -0
  159. package/packages/sdk/dist/workflows/channel-messenger.d.ts.map +1 -0
  160. package/packages/sdk/dist/workflows/channel-messenger.js +255 -0
  161. package/packages/sdk/dist/workflows/channel-messenger.js.map +1 -0
  162. package/packages/sdk/dist/workflows/index.d.ts +7 -0
  163. package/packages/sdk/dist/workflows/index.d.ts.map +1 -1
  164. package/packages/sdk/dist/workflows/index.js +7 -0
  165. package/packages/sdk/dist/workflows/index.js.map +1 -1
  166. package/packages/sdk/dist/workflows/process-spawner.d.ts +35 -0
  167. package/packages/sdk/dist/workflows/process-spawner.d.ts.map +1 -0
  168. package/packages/sdk/dist/workflows/process-spawner.js +141 -0
  169. package/packages/sdk/dist/workflows/process-spawner.js.map +1 -0
  170. package/packages/sdk/dist/workflows/run.d.ts +2 -1
  171. package/packages/sdk/dist/workflows/run.d.ts.map +1 -1
  172. package/packages/sdk/dist/workflows/run.js.map +1 -1
  173. package/packages/sdk/dist/workflows/runner.d.ts +6 -6
  174. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
  175. package/packages/sdk/dist/workflows/runner.js +443 -719
  176. package/packages/sdk/dist/workflows/runner.js.map +1 -1
  177. package/packages/sdk/dist/workflows/step-executor.d.ts +95 -0
  178. package/packages/sdk/dist/workflows/step-executor.d.ts.map +1 -0
  179. package/packages/sdk/dist/workflows/step-executor.js +393 -0
  180. package/packages/sdk/dist/workflows/step-executor.js.map +1 -0
  181. package/packages/sdk/dist/workflows/template-resolver.d.ts +33 -0
  182. package/packages/sdk/dist/workflows/template-resolver.d.ts.map +1 -0
  183. package/packages/sdk/dist/workflows/template-resolver.js +144 -0
  184. package/packages/sdk/dist/workflows/template-resolver.js.map +1 -0
  185. package/packages/sdk/dist/workflows/validator.d.ts.map +1 -1
  186. package/packages/sdk/dist/workflows/validator.js +17 -2
  187. package/packages/sdk/dist/workflows/validator.js.map +1 -1
  188. package/packages/sdk/dist/workflows/verification.d.ts +33 -0
  189. package/packages/sdk/dist/workflows/verification.d.ts.map +1 -0
  190. package/packages/sdk/dist/workflows/verification.js +122 -0
  191. package/packages/sdk/dist/workflows/verification.js.map +1 -0
  192. package/packages/sdk/package.json +2 -2
  193. package/packages/sdk/src/__tests__/unit.test.ts +100 -1
  194. package/packages/sdk/src/broker-path.ts +136 -30
  195. package/packages/sdk/src/client.ts +453 -1069
  196. package/packages/sdk/src/examples/example.ts +2 -5
  197. package/packages/sdk/src/index.ts +9 -1
  198. package/packages/sdk/src/relay-adapter.ts +75 -55
  199. package/packages/sdk/src/relay.ts +262 -55
  200. package/packages/sdk/src/transport.ts +216 -0
  201. package/packages/sdk/src/types.ts +75 -0
  202. package/packages/sdk/src/workflows/__tests__/channel-messenger.test.ts +137 -0
  203. package/packages/sdk/src/workflows/__tests__/run-summary-table.test.ts +4 -3
  204. package/packages/sdk/src/workflows/__tests__/step-executor.test.ts +444 -0
  205. package/packages/sdk/src/workflows/__tests__/template-resolver.test.ts +162 -0
  206. package/packages/sdk/src/workflows/__tests__/verification.test.ts +229 -0
  207. package/packages/sdk/src/workflows/builder.ts +6 -6
  208. package/packages/sdk/src/workflows/channel-messenger.ts +314 -0
  209. package/packages/sdk/src/workflows/index.ts +12 -0
  210. package/packages/sdk/src/workflows/process-spawner.ts +201 -0
  211. package/packages/sdk/src/workflows/run.ts +2 -1
  212. package/packages/sdk/src/workflows/runner.ts +636 -951
  213. package/packages/sdk/src/workflows/step-executor.ts +579 -0
  214. package/packages/sdk/src/workflows/template-resolver.ts +180 -0
  215. package/packages/sdk/src/workflows/validator.ts +20 -2
  216. package/packages/sdk/src/workflows/verification.ts +184 -0
  217. package/packages/sdk-py/pyproject.toml +1 -1
  218. package/packages/sdk-py/src/agent_relay/__init__.py +0 -8
  219. package/packages/sdk-py/src/agent_relay/client.py +329 -522
  220. package/packages/sdk-py/src/agent_relay/protocol.py +2 -96
  221. package/packages/sdk-py/src/agent_relay/relay.py +1 -4
  222. package/packages/sdk-py/tests/test_wait_for_api_url.py +92 -0
  223. package/packages/sdk-py/uv.lock +5388 -0
  224. package/packages/telemetry/dist/client.d.ts.map +1 -1
  225. package/packages/telemetry/dist/client.js +1 -1
  226. package/packages/telemetry/dist/client.js.map +1 -1
  227. package/packages/telemetry/package.json +1 -1
  228. package/packages/telemetry/src/client.ts +3 -10
  229. package/packages/trajectory/package.json +2 -2
  230. package/packages/user-directory/package.json +2 -2
  231. package/packages/utils/package.json +2 -2
  232. package/scripts/postinstall.js +121 -1
@@ -0,0 +1,208 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { createHash } from 'node:crypto';
3
+ import { accessSync, chmodSync, constants, createWriteStream, existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from 'node:fs';
4
+ import https from 'node:https';
5
+ import os from 'node:os';
6
+ import path from 'node:path';
7
+ const RELAYFILE_VERSION = '0.1.6';
8
+ const RELEASE_BASE_URL = 'https://github.com/AgentWorkforce/relayfile/releases/download';
9
+ const CHECKSUMS_FILE = 'checksums.txt';
10
+ const CACHE_DIR = path.join(os.homedir(), '.agent-relay', 'bin');
11
+ const CACHE_PATH = path.join(CACHE_DIR, 'relayfile-mount');
12
+ const VERSION_PATH = path.join(CACHE_DIR, 'relayfile-mount.version');
13
+ const SUPPORTED_TARGETS = ['darwin-arm64', 'darwin-amd64', 'linux-arm64', 'linux-amd64'].join(', ');
14
+ const PLATFORM_ARCH_MAP = {
15
+ 'darwin:arm64': 'darwin-arm64',
16
+ 'darwin:x64': 'darwin-amd64',
17
+ 'linux:arm64': 'linux-arm64',
18
+ 'linux:x64': 'linux-amd64',
19
+ };
20
+ function warn(message) {
21
+ console.warn(`[warn] ${message}`);
22
+ }
23
+ function ensureCacheDir() {
24
+ mkdirSync(CACHE_DIR, { recursive: true });
25
+ }
26
+ function getRelayfileTarget() {
27
+ const target = PLATFORM_ARCH_MAP[`${os.platform()}:${os.arch()}`];
28
+ if (!target) {
29
+ throw new Error(`Unsupported platform for relayfile-mount: ${os.platform()}-${os.arch()}. Supported targets: ${SUPPORTED_TARGETS}.`);
30
+ }
31
+ return target;
32
+ }
33
+ function getReleaseAssetUrl(assetName) {
34
+ return `${RELEASE_BASE_URL}/v${RELAYFILE_VERSION}/${assetName}`;
35
+ }
36
+ function readCachedVersion() {
37
+ try {
38
+ return readFileSync(VERSION_PATH, 'utf8').trim() || null;
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ function isExecutable(filePath) {
45
+ try {
46
+ accessSync(filePath, constants.X_OK);
47
+ return true;
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ function downloadErrorMessage(url, status) {
54
+ return `Download failed with status ${status} for ${url}`;
55
+ }
56
+ function downloadBinary(url, destPath, maxRedirects = 5) {
57
+ ensureCacheDir();
58
+ const attemptDownload = (currentUrl, redirectsRemaining, resolve, reject) => {
59
+ const request = https.get(currentUrl, (res) => {
60
+ const status = res.statusCode ?? 0;
61
+ const location = res.headers.location;
62
+ const isRedirect = status >= 300 && status < 400 && location;
63
+ if (isRedirect) {
64
+ if (redirectsRemaining <= 0) {
65
+ res.resume();
66
+ reject(new Error('Too many redirects while downloading relayfile-mount'));
67
+ return;
68
+ }
69
+ const nextUrl = new URL(location, currentUrl).toString();
70
+ res.resume();
71
+ attemptDownload(nextUrl, redirectsRemaining - 1, resolve, reject);
72
+ return;
73
+ }
74
+ if (status !== 200) {
75
+ res.resume();
76
+ reject(new Error(downloadErrorMessage(currentUrl, status)));
77
+ return;
78
+ }
79
+ const fileStream = createWriteStream(destPath, { mode: 0o755 });
80
+ res.pipe(fileStream);
81
+ fileStream.on('finish', () => {
82
+ fileStream.close(() => resolve());
83
+ });
84
+ fileStream.on('error', (error) => reject(error instanceof Error ? error : new Error(String(error))));
85
+ res.on('error', (error) => reject(error instanceof Error ? error : new Error(String(error))));
86
+ });
87
+ request.on('error', (error) => reject(error instanceof Error ? error : new Error(String(error))));
88
+ };
89
+ return new Promise((resolve, reject) => {
90
+ attemptDownload(url, maxRedirects, resolve, reject);
91
+ }).catch((error) => {
92
+ try {
93
+ rmSync(destPath, { force: true });
94
+ }
95
+ catch {
96
+ // Ignore cleanup failures.
97
+ }
98
+ throw error;
99
+ });
100
+ }
101
+ function downloadText(url, maxRedirects = 5) {
102
+ const fetchWithRedirects = (currentUrl, redirectsRemaining, resolve, reject) => {
103
+ const request = https.get(currentUrl, (res) => {
104
+ const status = res.statusCode ?? 0;
105
+ const location = res.headers.location;
106
+ const isRedirect = status >= 300 && status < 400 && location;
107
+ if (isRedirect) {
108
+ if (redirectsRemaining <= 0) {
109
+ res.resume();
110
+ reject(new Error('Too many redirects while downloading relayfile checksums'));
111
+ return;
112
+ }
113
+ const nextUrl = new URL(location, currentUrl).toString();
114
+ res.resume();
115
+ fetchWithRedirects(nextUrl, redirectsRemaining - 1, resolve, reject);
116
+ return;
117
+ }
118
+ if (status !== 200) {
119
+ res.resume();
120
+ reject(new Error(downloadErrorMessage(currentUrl, status)));
121
+ return;
122
+ }
123
+ const chunks = [];
124
+ res.on('data', (chunk) => {
125
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
126
+ });
127
+ res.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
128
+ res.on('error', (error) => reject(error instanceof Error ? error : new Error(String(error))));
129
+ });
130
+ request.on('error', (error) => reject(error instanceof Error ? error : new Error(String(error))));
131
+ };
132
+ return new Promise((resolve, reject) => {
133
+ fetchWithRedirects(url, maxRedirects, resolve, reject);
134
+ });
135
+ }
136
+ function getExpectedChecksum(checksumContent, binaryName) {
137
+ for (const line of checksumContent.split('\n')) {
138
+ const trimmed = line.trim();
139
+ if (!trimmed) {
140
+ continue;
141
+ }
142
+ const match = trimmed.match(/^([a-fA-F0-9]{64})\s+\*?(.+)$/);
143
+ if (!match) {
144
+ continue;
145
+ }
146
+ const entryName = path.basename(match[2].trim());
147
+ if (entryName === binaryName) {
148
+ return match[1].toLowerCase();
149
+ }
150
+ }
151
+ throw new Error(`No checksum entry found for ${binaryName}`);
152
+ }
153
+ async function verifyChecksum(filePath, binaryName) {
154
+ const checksumUrl = getReleaseAssetUrl(CHECKSUMS_FILE);
155
+ const checksumContent = await downloadText(checksumUrl);
156
+ const expectedHash = getExpectedChecksum(checksumContent, binaryName);
157
+ const actualHash = createHash('sha256').update(readFileSync(filePath)).digest('hex');
158
+ if (actualHash !== expectedHash) {
159
+ throw new Error(`Checksum mismatch for ${binaryName}: expected ${expectedHash}, got ${actualHash}`);
160
+ }
161
+ }
162
+ function resignBinaryForMacOS(binaryPath) {
163
+ if (os.platform() !== 'darwin') {
164
+ return;
165
+ }
166
+ try {
167
+ execSync(`codesign --force --sign - "${binaryPath}"`, { stdio: 'pipe' });
168
+ }
169
+ catch (error) {
170
+ const message = error instanceof Error ? error.message : String(error);
171
+ warn(`Failed to re-sign relayfile-mount binary: ${message}`);
172
+ warn(`The binary may fail to execute until codesigned manually: codesign --force --sign - ${binaryPath}`);
173
+ }
174
+ }
175
+ export async function ensureRelayfileMountBinary() {
176
+ const target = getRelayfileTarget();
177
+ const binaryName = `relayfile-mount-${target}`;
178
+ const downloadUrl = getReleaseAssetUrl(binaryName);
179
+ ensureCacheDir();
180
+ if (existsSync(CACHE_PATH) && readCachedVersion() === RELAYFILE_VERSION) {
181
+ if (!isExecutable(CACHE_PATH)) {
182
+ chmodSync(CACHE_PATH, 0o755);
183
+ }
184
+ return CACHE_PATH;
185
+ }
186
+ const tempPath = path.join(CACHE_DIR, `relayfile-mount.${process.pid}.${Date.now()}.download`);
187
+ try {
188
+ await downloadBinary(downloadUrl, tempPath);
189
+ await verifyChecksum(tempPath, binaryName);
190
+ chmodSync(tempPath, 0o755);
191
+ renameSync(tempPath, CACHE_PATH);
192
+ chmodSync(CACHE_PATH, 0o755);
193
+ resignBinaryForMacOS(CACHE_PATH);
194
+ writeFileSync(VERSION_PATH, `${RELAYFILE_VERSION}\n`, 'utf8');
195
+ return CACHE_PATH;
196
+ }
197
+ catch (error) {
198
+ try {
199
+ rmSync(tempPath, { force: true });
200
+ }
201
+ catch {
202
+ // Ignore cleanup failures.
203
+ }
204
+ const message = error instanceof Error ? error.message : String(error);
205
+ throw new Error(`Failed to install relayfile-mount from ${downloadUrl}: ${message}`);
206
+ }
207
+ }
208
+ //# sourceMappingURL=relayfile-binary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayfile-binary.js","sourceRoot":"","sources":["../../../../../src/cli/commands/on/relayfile-binary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface ScanDependencies {
2
+ projectDir?: string;
3
+ workspace?: string;
4
+ log?: (...args: unknown[]) => void;
5
+ }
6
+ export declare function scanPermissions(deps?: ScanDependencies): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/on/scan.ts"],"names":[],"mappings":"AAGA,UAAU,gBAAgB;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACpC;AAUD,wBAAsB,eAAe,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDhF"}
@@ -0,0 +1,59 @@
1
+ import path from 'node:path';
2
+ import { compileDotfiles, discoverAgents, hasDotfiles, parseDotfiles } from './dotfiles.js';
3
+ function defaultLog(...args) {
4
+ console.log(...args);
5
+ }
6
+ function resolveWorkspaceName(projectDir, explicit) {
7
+ return explicit ?? path.basename(projectDir);
8
+ }
9
+ export async function scanPermissions(deps = {}) {
10
+ const projectDir = path.resolve(deps.projectDir ?? process.cwd());
11
+ const workspace = resolveWorkspaceName(projectDir, deps.workspace);
12
+ const log = deps.log ?? defaultLog;
13
+ const hasDotfileConfig = hasDotfiles(projectDir);
14
+ const discoveredAgents = discoverAgents(projectDir);
15
+ const agents = discoveredAgents.length > 0 ? discoveredAgents : ['default-agent'];
16
+ log(`Discovered agents: ${agents.join(', ')}`);
17
+ if (!hasDotfileConfig && agents.length === 1 && agents[0] === 'default-agent') {
18
+ log('No dotfile patterns found; defaulting to full readwrite workspace visibility.');
19
+ }
20
+ if (agents.length === 0) {
21
+ return;
22
+ }
23
+ for (const agentName of agents) {
24
+ const parsed = parseDotfiles(projectDir, agentName);
25
+ const compiled = compileDotfiles(projectDir, agentName, workspace);
26
+ const ignored = parsed.ignoredPatterns;
27
+ const readonly = parsed.readonlyPatterns;
28
+ const writable = compiled.readwritePaths;
29
+ log(`\n[${agentName}]`);
30
+ log(`Ignored patterns (${ignored.length}):`);
31
+ if (ignored.length > 0) {
32
+ for (const pattern of ignored) {
33
+ log(` - ${pattern}`);
34
+ }
35
+ }
36
+ else {
37
+ log(' - (none)');
38
+ }
39
+ log(`Readonly patterns (${readonly.length}):`);
40
+ if (readonly.length > 0) {
41
+ for (const pattern of readonly) {
42
+ log(` - ${pattern}`);
43
+ }
44
+ }
45
+ else {
46
+ log(' - (none)');
47
+ }
48
+ log(`Writable files (${writable.length}):`);
49
+ if (writable.length > 0) {
50
+ for (const file of writable) {
51
+ log(` - ${file}`);
52
+ }
53
+ }
54
+ else {
55
+ log(' - (none)');
56
+ }
57
+ }
58
+ }
59
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../../../src/cli/commands/on/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface ServiceConfig {
2
+ relayauthRoot: string;
3
+ relayfileRoot: string;
4
+ secret: string;
5
+ portAuth: number;
6
+ portFile: number;
7
+ logDir: string;
8
+ }
9
+ export declare function pickFirstString(values: Array<string | undefined>): string;
10
+ export declare function resolveServiceConfig(overrides?: Partial<ServiceConfig>): ServiceConfig;
11
+ export declare function healthCheck(port: number, timeout: number): Promise<boolean>;
12
+ export declare function startServices(config?: Partial<ServiceConfig>): Promise<{
13
+ authPid: number;
14
+ filePid: number;
15
+ }>;
16
+ export declare function stopServices(): Promise<void>;
17
+ //# sourceMappingURL=services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/on/services.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAkFD,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAOzE;AAOD,wBAAgB,oBAAoB,CAAC,SAAS,GAAE,OAAO,CAAC,aAAa,CAAM,GAAG,aAAa,CA6D1F;AAoKD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYjF;AAED,wBAAsB,aAAa,CAAC,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAkDtH;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAelD"}
@@ -0,0 +1,328 @@
1
+ import { spawn, spawnSync } from 'node:child_process';
2
+ import { accessSync, closeSync, constants, existsSync, mkdirSync, openSync, readFileSync, rmSync, writeFileSync, } from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ const DEFAULT_PORT_AUTH = 8787;
6
+ const DEFAULT_PORT_FILE = 8080;
7
+ function getPidFilePath() {
8
+ return path.join(os.homedir(), '.relay', 'pids.json');
9
+ }
10
+ function sleep(ms) {
11
+ return new Promise((resolve) => setTimeout(resolve, ms));
12
+ }
13
+ function parsePositiveInt(value, fallback) {
14
+ const parsed = Number.parseInt(String(value ?? ''), 10);
15
+ if (!Number.isFinite(parsed) || parsed <= 0) {
16
+ return fallback;
17
+ }
18
+ return parsed;
19
+ }
20
+ function getCachedConfig() {
21
+ const configPath = path.resolve('.relay', 'config.json');
22
+ if (!existsSync(configPath)) {
23
+ return {};
24
+ }
25
+ try {
26
+ const raw = readFileSync(configPath, 'utf-8');
27
+ const parsed = JSON.parse(raw);
28
+ const data = parsed && typeof parsed === 'object' && 'data' in parsed && typeof parsed.data === 'object'
29
+ ? parsed.data
30
+ : parsed;
31
+ const getStringValue = (...keys) => {
32
+ for (const key of keys) {
33
+ const value = data[key];
34
+ if (typeof value === 'string') {
35
+ return value;
36
+ }
37
+ }
38
+ return undefined;
39
+ };
40
+ const getPortValue = (...keys) => {
41
+ for (const key of keys) {
42
+ const value = data[key];
43
+ if (typeof value === 'string' || typeof value === 'number') {
44
+ return value;
45
+ }
46
+ }
47
+ return undefined;
48
+ };
49
+ return {
50
+ relayauthRoot: getStringValue('RELAYAUTH_ROOT', 'relayauthRoot'),
51
+ relayfileRoot: getStringValue('RELAYFILE_ROOT', 'relayfileRoot'),
52
+ logDir: getStringValue('RELAY_LOG_DIR', 'logDir'),
53
+ portAuth: getPortValue('RELAY_AUTH_PORT', 'portAuth'),
54
+ portFile: getPortValue('RELAY_FILE_PORT', 'portFile'),
55
+ secret: typeof data.signing_secret === 'string'
56
+ ? data.signing_secret
57
+ : typeof data.signingSecret === 'string'
58
+ ? data.signingSecret
59
+ : undefined,
60
+ };
61
+ }
62
+ catch {
63
+ return {};
64
+ }
65
+ }
66
+ function pickFirst(values) {
67
+ for (const value of values) {
68
+ if (value) {
69
+ return value;
70
+ }
71
+ }
72
+ return undefined;
73
+ }
74
+ export function pickFirstString(values) {
75
+ for (const value of values) {
76
+ if (value) {
77
+ return value;
78
+ }
79
+ }
80
+ return '';
81
+ }
82
+ function resolveExistingPath(candidates, fallback) {
83
+ const normalized = candidates.filter((candidate) => typeof candidate === 'string' && candidate.length > 0);
84
+ return path.resolve(normalized.find((candidate) => existsSync(candidate)) ?? normalized[0] ?? fallback);
85
+ }
86
+ export function resolveServiceConfig(overrides = {}) {
87
+ const cache = getCachedConfig();
88
+ const cwd = process.cwd();
89
+ const relayauthRoot = resolveExistingPath([
90
+ overrides.relayauthRoot,
91
+ process.env.RELAYAUTH_ROOT,
92
+ cache.relayauthRoot,
93
+ path.join(cwd, 'relayauth'),
94
+ path.join(cwd, '..', 'relayauth'),
95
+ path.join(cwd, '..', '..', 'relayauth'),
96
+ ], path.join(cwd, 'relayauth'));
97
+ const relayfileRoot = resolveExistingPath([
98
+ overrides.relayfileRoot,
99
+ process.env.RELAYFILE_ROOT,
100
+ cache.relayfileRoot,
101
+ path.join(path.dirname(relayauthRoot), 'relayfile'),
102
+ ], path.join(path.dirname(relayauthRoot), 'relayfile'));
103
+ const logDir = path.resolve(pickFirstString([
104
+ overrides.logDir,
105
+ process.env.RELAY_LOG_DIR,
106
+ cache.logDir,
107
+ path.join('.relay', 'logs'),
108
+ ]));
109
+ return {
110
+ relayauthRoot,
111
+ relayfileRoot,
112
+ secret: pickFirstString([
113
+ overrides.secret,
114
+ process.env.SIGNING_KEY,
115
+ cache.secret,
116
+ ]),
117
+ portAuth: parsePositiveInt(pickFirst([
118
+ process.env.RELAY_AUTH_PORT,
119
+ overrides.portAuth,
120
+ cache.portAuth,
121
+ ]), DEFAULT_PORT_AUTH),
122
+ portFile: parsePositiveInt(pickFirst([
123
+ process.env.RELAY_FILE_PORT,
124
+ overrides.portFile,
125
+ cache.portFile,
126
+ ]), DEFAULT_PORT_FILE),
127
+ logDir,
128
+ };
129
+ }
130
+ function isProcessAlive(pid) {
131
+ try {
132
+ process.kill(pid, 0);
133
+ return true;
134
+ }
135
+ catch {
136
+ return false;
137
+ }
138
+ }
139
+ function isExecutable(target) {
140
+ try {
141
+ accessSync(target, constants.X_OK);
142
+ return true;
143
+ }
144
+ catch {
145
+ return false;
146
+ }
147
+ }
148
+ function readPids() {
149
+ if (!existsSync(getPidFilePath())) {
150
+ return null;
151
+ }
152
+ try {
153
+ const raw = readFileSync(getPidFilePath(), 'utf-8');
154
+ return JSON.parse(raw);
155
+ }
156
+ catch {
157
+ return null;
158
+ }
159
+ }
160
+ function writePids(pids) {
161
+ mkdirSync(path.dirname(getPidFilePath()), { recursive: true });
162
+ writeFileSync(getPidFilePath(), `${JSON.stringify(pids)}\n`, 'utf-8');
163
+ }
164
+ function removePidsFile() {
165
+ if (existsSync(getPidFilePath())) {
166
+ rmSync(getPidFilePath());
167
+ }
168
+ }
169
+ async function stopPid(pid) {
170
+ if (!pid || !isProcessAlive(pid)) {
171
+ return;
172
+ }
173
+ try {
174
+ process.kill(pid, 'SIGTERM');
175
+ }
176
+ catch {
177
+ return;
178
+ }
179
+ for (let i = 0; i < 5; i += 1) {
180
+ if (!isProcessAlive(pid)) {
181
+ return;
182
+ }
183
+ await sleep(1000);
184
+ }
185
+ try {
186
+ process.kill(pid, 'SIGKILL');
187
+ }
188
+ catch {
189
+ return;
190
+ }
191
+ }
192
+ function readPortPids(port) {
193
+ const result = spawnSync('lsof', ['-ti', `:${port}`], {
194
+ encoding: 'utf8',
195
+ stdio: 'pipe',
196
+ });
197
+ if (result.status !== 0 || !result.stdout) {
198
+ return [];
199
+ }
200
+ return result.stdout
201
+ .trim()
202
+ .split('\n')
203
+ .map((entry) => Number.parseInt(entry.trim(), 10))
204
+ .filter((pid) => Number.isFinite(pid) && pid > 0);
205
+ }
206
+ async function stopPortProcess(port) {
207
+ const pids = Array.from(new Set(readPortPids(port)));
208
+ await Promise.all(pids.map((pid) => stopPid(pid)));
209
+ }
210
+ async function checkHealth(url) {
211
+ const controller = new AbortController();
212
+ const timeout = setTimeout(() => controller.abort(), 1500);
213
+ try {
214
+ const response = await fetch(url, {
215
+ method: 'GET',
216
+ signal: controller.signal,
217
+ });
218
+ return response.ok;
219
+ }
220
+ catch {
221
+ return false;
222
+ }
223
+ finally {
224
+ clearTimeout(timeout);
225
+ }
226
+ }
227
+ function spawnLogged(command, args, cwd, env, logPath) {
228
+ const logFile = openSync(logPath, 'a');
229
+ try {
230
+ const child = spawn(command, args, {
231
+ cwd,
232
+ env,
233
+ stdio: ['ignore', logFile, logFile],
234
+ });
235
+ // Close parent's copy of the fd — child process inherits its own copy
236
+ return child;
237
+ }
238
+ finally {
239
+ closeSync(logFile);
240
+ }
241
+ }
242
+ function spawnRelayauth(config, relayauthLogPath) {
243
+ return spawnLogged('npx', ['wrangler', 'dev', '--port', String(config.portAuth)], config.relayauthRoot, {
244
+ ...process.env,
245
+ SIGNING_KEY: config.secret,
246
+ }, relayauthLogPath);
247
+ }
248
+ function spawnRelayfile(config, relayfileLogPath) {
249
+ const binary = path.join(config.relayfileRoot, 'bin', 'relayfile');
250
+ if (existsSync(binary) && isExecutable(binary)) {
251
+ return spawnLogged(binary, [], config.relayfileRoot, {
252
+ ...process.env,
253
+ RELAYFILE_JWT_SECRET: config.secret,
254
+ RELAYFILE_BACKEND_PROFILE: 'durable-local',
255
+ }, relayfileLogPath);
256
+ }
257
+ return spawnLogged('go', ['run', './cmd/relayfile'], config.relayfileRoot, {
258
+ ...process.env,
259
+ RELAYFILE_JWT_SECRET: config.secret,
260
+ RELAYFILE_BACKEND_PROFILE: 'durable-local',
261
+ }, relayfileLogPath);
262
+ }
263
+ export async function healthCheck(port, timeout) {
264
+ const endAt = Date.now() + timeout * 1000;
265
+ const healthUrl = `http://127.0.0.1:${port}/health`;
266
+ while (Date.now() < endAt) {
267
+ if (await checkHealth(healthUrl)) {
268
+ return true;
269
+ }
270
+ await sleep(2000);
271
+ }
272
+ return false;
273
+ }
274
+ export async function startServices(config = {}) {
275
+ const resolved = resolveServiceConfig(config);
276
+ const existing = readPids();
277
+ if (existing?.relayauthPid && isProcessAlive(existing.relayauthPid)) {
278
+ throw new Error('relayauth already running');
279
+ }
280
+ if (existing?.relayfilePid && isProcessAlive(existing.relayfilePid)) {
281
+ throw new Error('relayfile already running');
282
+ }
283
+ if (existing) {
284
+ removePidsFile();
285
+ }
286
+ mkdirSync(resolved.logDir, { recursive: true });
287
+ const relayauthLog = path.join(resolved.logDir, 'relayauth.log');
288
+ const relayfileLog = path.join(resolved.logDir, 'relayfile.log');
289
+ const relayauthProcess = spawnRelayauth(resolved, relayauthLog);
290
+ const relayfileProcess = spawnRelayfile(resolved, relayfileLog);
291
+ if (!relayauthProcess.pid) {
292
+ throw new Error('failed to start relayauth');
293
+ }
294
+ if (!relayfileProcess.pid) {
295
+ await stopPid(relayauthProcess.pid);
296
+ throw new Error('failed to start relayfile');
297
+ }
298
+ writePids({
299
+ relayauthPid: relayauthProcess.pid,
300
+ relayfilePid: relayfileProcess.pid,
301
+ });
302
+ const [authHealthy, fileHealthy] = await Promise.all([
303
+ healthCheck(resolved.portAuth, 30),
304
+ healthCheck(resolved.portFile, 30),
305
+ ]);
306
+ if (!authHealthy || !fileHealthy) {
307
+ await stopServices();
308
+ throw new Error('services did not become healthy');
309
+ }
310
+ return {
311
+ authPid: relayauthProcess.pid,
312
+ filePid: relayfileProcess.pid,
313
+ };
314
+ }
315
+ export async function stopServices() {
316
+ const resolved = resolveServiceConfig();
317
+ const pids = readPids();
318
+ if (pids?.relayauthPid) {
319
+ await stopPid(pids.relayauthPid);
320
+ }
321
+ if (pids?.relayfilePid) {
322
+ await stopPid(pids.relayfilePid);
323
+ }
324
+ await stopPortProcess(resolved.portAuth);
325
+ await stopPortProcess(resolved.portFile);
326
+ removePidsFile();
327
+ }
328
+ //# sourceMappingURL=services.js.map