crewx-bridge 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +102 -0
- package/dist/api.d.ts +16 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +157 -0
- package/dist/api.js.map +1 -0
- package/dist/config.d.ts +83 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +233 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +13 -0
- package/dist/constants.js.map +1 -0
- package/dist/daemon.d.ts +36 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +313 -0
- package/dist/daemon.js.map +1 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +32 -0
- package/dist/errors.js.map +1 -0
- package/dist/folders.d.ts +13 -0
- package/dist/folders.d.ts.map +1 -0
- package/dist/folders.js +63 -0
- package/dist/folders.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +322 -0
- package/dist/index.js.map +1 -0
- package/dist/journal.d.ts +76 -0
- package/dist/journal.d.ts.map +1 -0
- package/dist/journal.js +106 -0
- package/dist/journal.js.map +1 -0
- package/dist/policy.d.ts +4 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +19 -0
- package/dist/policy.js.map +1 -0
- package/dist/service.d.ts +45 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +221 -0
- package/dist/service.js.map +1 -0
- package/dist/supervisor.d.ts +23 -0
- package/dist/supervisor.d.ts.map +1 -0
- package/dist/supervisor.js +149 -0
- package/dist/supervisor.js.map +1 -0
- package/package.json +52 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 CrewX
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# crewx-bridge
|
|
2
|
+
|
|
3
|
+
CrewX Bridge securely enrolls a macOS or Linux machine with a CrewX workspace
|
|
4
|
+
and lets workspace administrators launch local Codex, Claude Code, Pi, Hermes,
|
|
5
|
+
or OpenClaw agent profiles in folders approved by that machine's owner.
|
|
6
|
+
|
|
7
|
+
Bridge is not a remote shell. It accepts only signed-in, server-authorized,
|
|
8
|
+
structured `start_agent` and `stop_agent` commands. It uses an outbound HTTPS
|
|
9
|
+
connection, per-machine credentials, expiring per-run agent tokens, command
|
|
10
|
+
leases, an idempotency journal, strict folder identities, fixed `shell: false`
|
|
11
|
+
process templates, and a local policy that the server cannot loosen.
|
|
12
|
+
|
|
13
|
+
## Requirements
|
|
14
|
+
|
|
15
|
+
- Node.js 22 or later
|
|
16
|
+
- macOS or Linux
|
|
17
|
+
- the coding runtimes you intend to use already authenticated for the OS user
|
|
18
|
+
- a one-time enrollment command from a CrewX workspace owner/admin
|
|
19
|
+
|
|
20
|
+
Do not install or run Bridge as root. On a shared or production host, use a
|
|
21
|
+
dedicated OS user.
|
|
22
|
+
|
|
23
|
+
## Install and enroll
|
|
24
|
+
|
|
25
|
+
Install Bridge into a stable location before installing its user service:
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
npm install --global crewx-bridge
|
|
29
|
+
crewx-bridge enroll \
|
|
30
|
+
--url https://crewx.example \
|
|
31
|
+
--code crwb_enroll_… \
|
|
32
|
+
--name "Build Mac"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Register each project locally. The CrewX web application sees only the name,
|
|
36
|
+
opaque ID, and filesystem identity—not the path.
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
crewx-bridge folder add ~/Development/product --name Product
|
|
40
|
+
crewx-bridge folder list
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Inspect the connection and runtimes:
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
crewx-bridge doctor
|
|
47
|
+
crewx-bridge status
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Install the user service:
|
|
51
|
+
|
|
52
|
+
```sh
|
|
53
|
+
crewx-bridge service install
|
|
54
|
+
crewx-bridge service status
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
On Linux, unattended operation after logout may require an administrator to
|
|
58
|
+
enable systemd user lingering. Bridge reports this but never runs a privileged
|
|
59
|
+
command itself.
|
|
60
|
+
|
|
61
|
+
## Local policy
|
|
62
|
+
|
|
63
|
+
Bridge allows `read_only` and `standard` by default and permits at most two
|
|
64
|
+
concurrent runs. Full access requires an explicit local opt-in:
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
crewx-bridge policy \
|
|
68
|
+
--adapters codex,claude,pi \
|
|
69
|
+
--permissions read_only,standard,full_access \
|
|
70
|
+
--max-runs 2 \
|
|
71
|
+
--allow-full-access
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Treat full access as equivalent to giving that agent the OS user's filesystem
|
|
75
|
+
and command privileges. Prefer a dedicated host or OS account.
|
|
76
|
+
Disable that opt-in again with `crewx-bridge policy --deny-full-access`.
|
|
77
|
+
|
|
78
|
+
## Foreground operation
|
|
79
|
+
|
|
80
|
+
For development or diagnostics:
|
|
81
|
+
|
|
82
|
+
```sh
|
|
83
|
+
crewx-bridge serve
|
|
84
|
+
crewx-bridge serve --once
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
`Ctrl+C` stops supervised child agents before exiting.
|
|
88
|
+
|
|
89
|
+
## Protected state
|
|
90
|
+
|
|
91
|
+
Credential files are written atomically with mode `0600` below a mode `0700`
|
|
92
|
+
directory. Bridge refuses symlinks, unsafe ownership, and group/world-readable
|
|
93
|
+
state.
|
|
94
|
+
|
|
95
|
+
- macOS: `~/Library/Application Support/CrewX Bridge/config.json`
|
|
96
|
+
- Linux: `${XDG_CONFIG_HOME:-~/.config}/crewx/bridge/config.json`
|
|
97
|
+
|
|
98
|
+
The local journal contains command/run IDs and PIDs, never run tokens.
|
|
99
|
+
|
|
100
|
+
See [`docs/BRIDGE_ARCHITECTURE.md`](../../docs/BRIDGE_ARCHITECTURE.md) in the
|
|
101
|
+
CrewX monorepo for the threat model, protocol, leasing lifecycle, and security
|
|
102
|
+
invariants.
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type BridgeCommandCompletion, type BridgeCommandFailure, type BridgeCommandClaimResponse, type BridgeEnrollmentRequest, type BridgeEnrollmentResponse, type BridgeFoldersSyncRequest, type BridgeHeartbeatRequest, type BridgeLeaseRequest } from "crewx-agent-protocol";
|
|
2
|
+
import { type BridgeConfig } from "./config.js";
|
|
3
|
+
export declare function enrollMachine(url: string, input: BridgeEnrollmentRequest): Promise<BridgeEnrollmentResponse>;
|
|
4
|
+
export declare class BridgeApi {
|
|
5
|
+
readonly baseUrl: string;
|
|
6
|
+
readonly token: string;
|
|
7
|
+
constructor(config: Pick<BridgeConfig, "url" | "token">);
|
|
8
|
+
heartbeat(input: BridgeHeartbeatRequest): Promise<void>;
|
|
9
|
+
syncFolders(input: BridgeFoldersSyncRequest): Promise<void>;
|
|
10
|
+
claim(): Promise<BridgeCommandClaimResponse>;
|
|
11
|
+
acknowledge(commandId: string, input: BridgeLeaseRequest): Promise<void>;
|
|
12
|
+
renew(commandId: string, input: BridgeLeaseRequest): Promise<void>;
|
|
13
|
+
complete(commandId: string, input: BridgeCommandCompletion): Promise<void>;
|
|
14
|
+
fail(commandId: string, input: BridgeCommandFailure): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,aAAa,CAAC;AAgIpE,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,wBAAwB,CAAC,CAWnC;AAED,qBAAa,SAAS;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,OAAO,CAAC;IAKjD,SAAS,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvD,WAAW,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,KAAK,IAAI,OAAO,CAAC,0BAA0B,CAAC;IAe5C,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlE,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,IAAI,CAAC;IAYV,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CAW1E"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import * as tls from "node:tls";
|
|
2
|
+
import { BridgeCommandClaimResponseSchema, BridgeEnrollmentRequestSchema, BridgeEnrollmentResponseSchema, BridgeFoldersSyncRequestSchema, BridgeHeartbeatRequestSchema, } from "crewx-agent-protocol";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { REQUEST_TIMEOUT_MS } from "./constants.js";
|
|
5
|
+
import { normalizeServerUrl } from "./config.js";
|
|
6
|
+
import { BridgeError, errorMessage, redactSecrets } from "./errors.js";
|
|
7
|
+
const OkSchema = z.object({ ok: z.boolean().optional() }).passthrough();
|
|
8
|
+
const StatusSchema = z
|
|
9
|
+
.object({ status: z.string(), leased_until: z.string().optional() })
|
|
10
|
+
.passthrough();
|
|
11
|
+
function trustSystemCertificateAuthorities() {
|
|
12
|
+
if (typeof tls.getCACertificates !== "function" ||
|
|
13
|
+
typeof tls.setDefaultCACertificates !== "function") {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
tls.setDefaultCACertificates([
|
|
18
|
+
...new Set([
|
|
19
|
+
...tls.getCACertificates("default"),
|
|
20
|
+
...tls.getCACertificates("system"),
|
|
21
|
+
]),
|
|
22
|
+
]);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Not every supported Node 22 build exposes both stores.
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
trustSystemCertificateAuthorities();
|
|
29
|
+
function apiBase(url) {
|
|
30
|
+
return `${normalizeServerUrl(url)}/api/bridge/v1`;
|
|
31
|
+
}
|
|
32
|
+
async function parseResponseBody(response) {
|
|
33
|
+
const maximumBytes = 256 * 1024;
|
|
34
|
+
const length = Number(response.headers.get("content-length") ?? "0");
|
|
35
|
+
if (Number.isFinite(length) && length > maximumBytes) {
|
|
36
|
+
throw new BridgeError("response_too_large", "CrewX returned an oversized response.");
|
|
37
|
+
}
|
|
38
|
+
if (!response.body)
|
|
39
|
+
return {};
|
|
40
|
+
const reader = response.body.getReader();
|
|
41
|
+
const chunks = [];
|
|
42
|
+
let total = 0;
|
|
43
|
+
try {
|
|
44
|
+
while (true) {
|
|
45
|
+
const item = await reader.read();
|
|
46
|
+
if (item.done)
|
|
47
|
+
break;
|
|
48
|
+
total += item.value.byteLength;
|
|
49
|
+
if (total > maximumBytes) {
|
|
50
|
+
await reader.cancel();
|
|
51
|
+
throw new BridgeError("response_too_large", "CrewX returned an oversized response.");
|
|
52
|
+
}
|
|
53
|
+
chunks.push(item.value);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
reader.releaseLock();
|
|
58
|
+
}
|
|
59
|
+
const bytes = new Uint8Array(total);
|
|
60
|
+
let offset = 0;
|
|
61
|
+
for (const chunk of chunks) {
|
|
62
|
+
bytes.set(chunk, offset);
|
|
63
|
+
offset += chunk.byteLength;
|
|
64
|
+
}
|
|
65
|
+
let text;
|
|
66
|
+
try {
|
|
67
|
+
text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
throw new BridgeError("invalid_response", "CrewX returned invalid UTF-8.");
|
|
71
|
+
}
|
|
72
|
+
if (!text)
|
|
73
|
+
return {};
|
|
74
|
+
try {
|
|
75
|
+
return JSON.parse(text);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
throw new BridgeError("invalid_response", "CrewX returned invalid JSON.");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function request(baseUrl, token, method, path, body) {
|
|
82
|
+
let response;
|
|
83
|
+
try {
|
|
84
|
+
response = await fetch(`${baseUrl}${path}`, {
|
|
85
|
+
method,
|
|
86
|
+
headers: {
|
|
87
|
+
Accept: "application/json",
|
|
88
|
+
"Content-Type": "application/json",
|
|
89
|
+
"User-Agent": "crewx-bridge",
|
|
90
|
+
...(token ? { Authorization: `Bearer ${token}` } : {}),
|
|
91
|
+
},
|
|
92
|
+
body: JSON.stringify(body),
|
|
93
|
+
redirect: "error",
|
|
94
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
throw new BridgeError("network_error", redactSecrets(`Unable to reach CrewX: ${errorMessage(error)}`, token ? [token] : []), 1, { cause: error });
|
|
99
|
+
}
|
|
100
|
+
const payload = await parseResponseBody(response);
|
|
101
|
+
if (!response.ok) {
|
|
102
|
+
const possibleMessage = typeof payload === "object" &&
|
|
103
|
+
payload !== null &&
|
|
104
|
+
typeof payload.message === "string"
|
|
105
|
+
? payload.message
|
|
106
|
+
: undefined;
|
|
107
|
+
const serverMessage = possibleMessage ?? `CrewX returned HTTP ${response.status}.`;
|
|
108
|
+
throw new BridgeError(response.status === 401 ? "unauthorized" : "api_error", redactSecrets(serverMessage, token ? [token] : []));
|
|
109
|
+
}
|
|
110
|
+
return payload;
|
|
111
|
+
}
|
|
112
|
+
export async function enrollMachine(url, input) {
|
|
113
|
+
const requestBody = BridgeEnrollmentRequestSchema.parse(input);
|
|
114
|
+
const payload = await request(apiBase(url), undefined, "POST", "/enroll", requestBody);
|
|
115
|
+
const parsed = BridgeEnrollmentResponseSchema.safeParse(payload);
|
|
116
|
+
if (!parsed.success) {
|
|
117
|
+
throw new BridgeError("invalid_response", "CrewX returned an invalid enrollment response.");
|
|
118
|
+
}
|
|
119
|
+
return parsed.data;
|
|
120
|
+
}
|
|
121
|
+
export class BridgeApi {
|
|
122
|
+
baseUrl;
|
|
123
|
+
token;
|
|
124
|
+
constructor(config) {
|
|
125
|
+
this.baseUrl = apiBase(config.url);
|
|
126
|
+
this.token = config.token;
|
|
127
|
+
}
|
|
128
|
+
async heartbeat(input) {
|
|
129
|
+
const body = BridgeHeartbeatRequestSchema.parse(input);
|
|
130
|
+
OkSchema.parse(await request(this.baseUrl, this.token, "POST", "/heartbeat", body));
|
|
131
|
+
}
|
|
132
|
+
async syncFolders(input) {
|
|
133
|
+
const body = BridgeFoldersSyncRequestSchema.parse(input);
|
|
134
|
+
await request(this.baseUrl, this.token, "PUT", "/folders", body);
|
|
135
|
+
}
|
|
136
|
+
async claim() {
|
|
137
|
+
const payload = await request(this.baseUrl, this.token, "POST", "/commands/claim", {});
|
|
138
|
+
const parsed = BridgeCommandClaimResponseSchema.safeParse(payload);
|
|
139
|
+
if (!parsed.success) {
|
|
140
|
+
throw new BridgeError("invalid_response", "CrewX returned an invalid command.");
|
|
141
|
+
}
|
|
142
|
+
return parsed.data;
|
|
143
|
+
}
|
|
144
|
+
async acknowledge(commandId, input) {
|
|
145
|
+
StatusSchema.parse(await request(this.baseUrl, this.token, "POST", `/commands/${encodeURIComponent(commandId)}/ack`, input));
|
|
146
|
+
}
|
|
147
|
+
async renew(commandId, input) {
|
|
148
|
+
StatusSchema.parse(await request(this.baseUrl, this.token, "POST", `/commands/${encodeURIComponent(commandId)}/renew`, input));
|
|
149
|
+
}
|
|
150
|
+
async complete(commandId, input) {
|
|
151
|
+
StatusSchema.parse(await request(this.baseUrl, this.token, "POST", `/commands/${encodeURIComponent(commandId)}/complete`, input));
|
|
152
|
+
}
|
|
153
|
+
async fail(commandId, input) {
|
|
154
|
+
StatusSchema.parse(await request(this.baseUrl, this.token, "POST", `/commands/${encodeURIComponent(commandId)}/fail`, input));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const BridgeFolderConfigSchema: z.ZodObject<{
|
|
3
|
+
id: z.ZodUUID;
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
path: z.ZodString;
|
|
6
|
+
fingerprint: z.ZodString;
|
|
7
|
+
}, z.core.$strict>;
|
|
8
|
+
export type BridgeFolderConfig = z.infer<typeof BridgeFolderConfigSchema>;
|
|
9
|
+
export declare const BridgeLocalPolicySchema: z.ZodObject<{
|
|
10
|
+
allowedAdapters: z.ZodArray<z.ZodEnum<{
|
|
11
|
+
codex: "codex";
|
|
12
|
+
claude: "claude";
|
|
13
|
+
pi: "pi";
|
|
14
|
+
hermes: "hermes";
|
|
15
|
+
openclaw: "openclaw";
|
|
16
|
+
}>>;
|
|
17
|
+
allowedPermissions: z.ZodArray<z.ZodEnum<{
|
|
18
|
+
read_only: "read_only";
|
|
19
|
+
standard: "standard";
|
|
20
|
+
full_access: "full_access";
|
|
21
|
+
}>>;
|
|
22
|
+
allowFullAccess: z.ZodBoolean;
|
|
23
|
+
maxConcurrentRuns: z.ZodNumber;
|
|
24
|
+
shutdownGraceMs: z.ZodNumber;
|
|
25
|
+
}, z.core.$strict>;
|
|
26
|
+
export type BridgeLocalPolicy = z.infer<typeof BridgeLocalPolicySchema>;
|
|
27
|
+
export declare const BridgeConfigSchema: z.ZodObject<{
|
|
28
|
+
version: z.ZodLiteral<1>;
|
|
29
|
+
url: z.ZodURL;
|
|
30
|
+
token: z.ZodString;
|
|
31
|
+
machineId: z.ZodUUID;
|
|
32
|
+
machineName: z.ZodString;
|
|
33
|
+
workspace: z.ZodObject<{
|
|
34
|
+
id: z.ZodString;
|
|
35
|
+
slug: z.ZodString;
|
|
36
|
+
}, z.core.$strict>;
|
|
37
|
+
heartbeatInterval: z.ZodNumber;
|
|
38
|
+
policy: z.ZodObject<{
|
|
39
|
+
allowedAdapters: z.ZodArray<z.ZodEnum<{
|
|
40
|
+
codex: "codex";
|
|
41
|
+
claude: "claude";
|
|
42
|
+
pi: "pi";
|
|
43
|
+
hermes: "hermes";
|
|
44
|
+
openclaw: "openclaw";
|
|
45
|
+
}>>;
|
|
46
|
+
allowedPermissions: z.ZodArray<z.ZodEnum<{
|
|
47
|
+
read_only: "read_only";
|
|
48
|
+
standard: "standard";
|
|
49
|
+
full_access: "full_access";
|
|
50
|
+
}>>;
|
|
51
|
+
allowFullAccess: z.ZodBoolean;
|
|
52
|
+
maxConcurrentRuns: z.ZodNumber;
|
|
53
|
+
shutdownGraceMs: z.ZodNumber;
|
|
54
|
+
}, z.core.$strict>;
|
|
55
|
+
folders: z.ZodArray<z.ZodObject<{
|
|
56
|
+
id: z.ZodUUID;
|
|
57
|
+
name: z.ZodString;
|
|
58
|
+
path: z.ZodString;
|
|
59
|
+
fingerprint: z.ZodString;
|
|
60
|
+
}, z.core.$strict>>;
|
|
61
|
+
}, z.core.$strict>;
|
|
62
|
+
export type BridgeConfig = z.infer<typeof BridgeConfigSchema>;
|
|
63
|
+
export interface BridgePathEnvironment {
|
|
64
|
+
CREWX_BRIDGE_CONFIG_HOME?: string | undefined;
|
|
65
|
+
CREWX_BRIDGE_STATE_HOME?: string | undefined;
|
|
66
|
+
XDG_CONFIG_HOME?: string | undefined;
|
|
67
|
+
XDG_STATE_HOME?: string | undefined;
|
|
68
|
+
}
|
|
69
|
+
export declare function normalizeServerUrl(input: string): string;
|
|
70
|
+
export declare function bridgeConfigDirectory(environment?: BridgePathEnvironment, platform?: NodeJS.Platform): string;
|
|
71
|
+
export declare function bridgeStateDirectory(environment?: BridgePathEnvironment, platform?: NodeJS.Platform): string;
|
|
72
|
+
export declare function bridgeConfigPath(environment?: BridgePathEnvironment, platform?: NodeJS.Platform): string;
|
|
73
|
+
export declare function bridgeJournalPath(environment?: BridgePathEnvironment, platform?: NodeJS.Platform): string;
|
|
74
|
+
export declare function ensureSecureDirectory(path: string): Promise<void>;
|
|
75
|
+
export declare function readSecureText(path: string): Promise<string | undefined>;
|
|
76
|
+
export declare function writeSecureText(path: string, contents: string): Promise<void>;
|
|
77
|
+
export declare function readBridgeConfig(environment?: BridgePathEnvironment, platform?: NodeJS.Platform): Promise<BridgeConfig>;
|
|
78
|
+
export declare function saveBridgeConfig(config: BridgeConfig, environment?: BridgePathEnvironment, platform?: NodeJS.Platform): Promise<string>;
|
|
79
|
+
export declare function canonicalFolder(input: string): Promise<{
|
|
80
|
+
path: string;
|
|
81
|
+
fingerprint: string;
|
|
82
|
+
}>;
|
|
83
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,wBAAwB;;;;;kBAO1B,CAAC;AACZ,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;kBAoBhC,CAAC;AACL,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAYpB,CAAC;AACZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IACpC,wBAAwB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,uBAAuB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA2BxD;AAED,wBAAgB,qBAAqB,CACnC,WAAW,GAAE,qBAAmC,EAChD,QAAQ,kBAAmB,GAC1B,MAAM,CASR;AAED,wBAAgB,oBAAoB,CAClC,WAAW,GAAE,qBAAmC,EAChD,QAAQ,kBAAmB,GAC1B,MAAM,CAUR;AAED,wBAAgB,gBAAgB,CAC9B,WAAW,GAAE,qBAAmC,EAChD,QAAQ,kBAAmB,GAC1B,MAAM,CAER;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,GAAE,qBAAmC,EAChD,QAAQ,kBAAmB,GAC1B,MAAM,CAER;AA6BD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvE;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA8B9E;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BnF;AAED,wBAAsB,gBAAgB,CACpC,WAAW,GAAE,qBAAmC,EAChD,QAAQ,kBAAmB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAyBvB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,YAAY,EACpB,WAAW,GAAE,qBAAmC,EAChD,QAAQ,kBAAmB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAahD"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { constants as fsConstants } from "node:fs";
|
|
2
|
+
import { chmod, lstat, mkdir, open, realpath, rename, stat, unlink, } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
|
+
import { AgentAdapterSchema, BridgePermissionSchema, } from "crewx-agent-protocol";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { CONFIG_VERSION } from "./constants.js";
|
|
8
|
+
import { BridgeError } from "./errors.js";
|
|
9
|
+
const FingerprintSchema = z
|
|
10
|
+
.string()
|
|
11
|
+
.min(16)
|
|
12
|
+
.max(128)
|
|
13
|
+
.regex(/^[A-Za-z0-9:_-]+$/);
|
|
14
|
+
export const BridgeFolderConfigSchema = z
|
|
15
|
+
.object({
|
|
16
|
+
id: z.uuid(),
|
|
17
|
+
name: z.string().trim().min(1).max(100),
|
|
18
|
+
path: z.string().min(1).max(4096),
|
|
19
|
+
fingerprint: FingerprintSchema,
|
|
20
|
+
})
|
|
21
|
+
.strict();
|
|
22
|
+
export const BridgeLocalPolicySchema = z
|
|
23
|
+
.object({
|
|
24
|
+
allowedAdapters: z.array(AgentAdapterSchema).min(1).max(5),
|
|
25
|
+
allowedPermissions: z.array(BridgePermissionSchema).min(1).max(3),
|
|
26
|
+
allowFullAccess: z.boolean(),
|
|
27
|
+
maxConcurrentRuns: z.number().int().min(1).max(32),
|
|
28
|
+
shutdownGraceMs: z.number().int().min(500).max(60_000),
|
|
29
|
+
})
|
|
30
|
+
.strict()
|
|
31
|
+
.superRefine((policy, context) => {
|
|
32
|
+
if (policy.allowedPermissions.includes("full_access") &&
|
|
33
|
+
!policy.allowFullAccess) {
|
|
34
|
+
context.addIssue({
|
|
35
|
+
code: "custom",
|
|
36
|
+
path: ["allowFullAccess"],
|
|
37
|
+
message: "full_access requires explicit local opt-in",
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
export const BridgeConfigSchema = z
|
|
42
|
+
.object({
|
|
43
|
+
version: z.literal(CONFIG_VERSION),
|
|
44
|
+
url: z.url(),
|
|
45
|
+
token: z.string().min(48).max(160).regex(/^crwb_[A-Za-z0-9_-]+$/),
|
|
46
|
+
machineId: z.uuid(),
|
|
47
|
+
machineName: z.string().trim().min(1).max(100),
|
|
48
|
+
workspace: z.object({ id: z.string().min(1), slug: z.string().min(1) }).strict(),
|
|
49
|
+
heartbeatInterval: z.number().int().min(5).max(300),
|
|
50
|
+
policy: BridgeLocalPolicySchema,
|
|
51
|
+
folders: z.array(BridgeFolderConfigSchema).max(100),
|
|
52
|
+
})
|
|
53
|
+
.strict();
|
|
54
|
+
export function normalizeServerUrl(input) {
|
|
55
|
+
let url;
|
|
56
|
+
try {
|
|
57
|
+
url = new URL(input);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
throw new BridgeError("invalid_url", `Invalid CrewX URL: ${input}`);
|
|
61
|
+
}
|
|
62
|
+
if (!["http:", "https:"].includes(url.protocol)) {
|
|
63
|
+
throw new BridgeError("invalid_url", "CrewX URL must use https://.");
|
|
64
|
+
}
|
|
65
|
+
const local = ["localhost", "127.0.0.1", "[::1]", "::1"].includes(url.hostname);
|
|
66
|
+
if (url.protocol !== "https:" && !local) {
|
|
67
|
+
throw new BridgeError("insecure_url", "CrewX Bridge requires HTTPS unless CrewX runs on localhost.");
|
|
68
|
+
}
|
|
69
|
+
if (url.username || url.password) {
|
|
70
|
+
throw new BridgeError("embedded_credentials", "CrewX URL must not contain embedded credentials.");
|
|
71
|
+
}
|
|
72
|
+
url.search = "";
|
|
73
|
+
url.hash = "";
|
|
74
|
+
url.pathname = url.pathname.replace(/\/+$/, "") || "/";
|
|
75
|
+
return url.toString().replace(/\/$/, "");
|
|
76
|
+
}
|
|
77
|
+
export function bridgeConfigDirectory(environment = process.env, platform = process.platform) {
|
|
78
|
+
if (environment.CREWX_BRIDGE_CONFIG_HOME?.trim()) {
|
|
79
|
+
return resolve(environment.CREWX_BRIDGE_CONFIG_HOME.trim());
|
|
80
|
+
}
|
|
81
|
+
if (platform === "darwin") {
|
|
82
|
+
return join(homedir(), "Library", "Application Support", "CrewX Bridge");
|
|
83
|
+
}
|
|
84
|
+
const base = environment.XDG_CONFIG_HOME?.trim() || join(homedir(), ".config");
|
|
85
|
+
return join(base, "crewx", "bridge");
|
|
86
|
+
}
|
|
87
|
+
export function bridgeStateDirectory(environment = process.env, platform = process.platform) {
|
|
88
|
+
if (environment.CREWX_BRIDGE_STATE_HOME?.trim()) {
|
|
89
|
+
return resolve(environment.CREWX_BRIDGE_STATE_HOME.trim());
|
|
90
|
+
}
|
|
91
|
+
if (platform === "darwin") {
|
|
92
|
+
return join(homedir(), "Library", "Logs", "CrewX Bridge");
|
|
93
|
+
}
|
|
94
|
+
const base = environment.XDG_STATE_HOME?.trim() || join(homedir(), ".local", "state");
|
|
95
|
+
return join(base, "crewx", "bridge");
|
|
96
|
+
}
|
|
97
|
+
export function bridgeConfigPath(environment = process.env, platform = process.platform) {
|
|
98
|
+
return join(bridgeConfigDirectory(environment, platform), "config.json");
|
|
99
|
+
}
|
|
100
|
+
export function bridgeJournalPath(environment = process.env, platform = process.platform) {
|
|
101
|
+
return join(bridgeStateDirectory(environment, platform), "journal.json");
|
|
102
|
+
}
|
|
103
|
+
function currentUid() {
|
|
104
|
+
return typeof process.getuid === "function" ? process.getuid() : undefined;
|
|
105
|
+
}
|
|
106
|
+
async function verifySecureNode(path, kind) {
|
|
107
|
+
const info = await lstat(path);
|
|
108
|
+
if (info.isSymbolicLink()) {
|
|
109
|
+
throw new BridgeError("unsafe_symlink", `${path} must not be a symbolic link.`);
|
|
110
|
+
}
|
|
111
|
+
if (kind === "file" ? !info.isFile() : !info.isDirectory()) {
|
|
112
|
+
throw new BridgeError("unsafe_type", `${path} is not a ${kind}.`);
|
|
113
|
+
}
|
|
114
|
+
const uid = currentUid();
|
|
115
|
+
if (uid !== undefined && info.uid !== uid) {
|
|
116
|
+
throw new BridgeError("unsafe_owner", `${path} is not owned by the current user.`);
|
|
117
|
+
}
|
|
118
|
+
if ((info.mode & 0o077) !== 0) {
|
|
119
|
+
throw new BridgeError("unsafe_mode", `${path} is accessible by another user; expected mode ${kind === "file" ? "0600" : "0700"}.`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export async function ensureSecureDirectory(path) {
|
|
123
|
+
await mkdir(path, { recursive: true, mode: 0o700 });
|
|
124
|
+
await chmod(path, 0o700);
|
|
125
|
+
await verifySecureNode(path, "directory");
|
|
126
|
+
}
|
|
127
|
+
export async function readSecureText(path) {
|
|
128
|
+
try {
|
|
129
|
+
await verifySecureNode(dirname(path), "directory");
|
|
130
|
+
await verifySecureNode(path, "file");
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (error.code === "ENOENT")
|
|
134
|
+
return undefined;
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
const noFollow = fsConstants.O_NOFOLLOW ?? 0;
|
|
138
|
+
const handle = await open(path, fsConstants.O_RDONLY | noFollow);
|
|
139
|
+
try {
|
|
140
|
+
const info = await handle.stat();
|
|
141
|
+
if (!info.isFile() || (info.mode & 0o077) !== 0) {
|
|
142
|
+
throw new BridgeError("unsafe_config", `${path} changed during secure open.`);
|
|
143
|
+
}
|
|
144
|
+
const uid = currentUid();
|
|
145
|
+
if (uid !== undefined && info.uid !== uid) {
|
|
146
|
+
throw new BridgeError("unsafe_owner", `${path} changed ownership.`);
|
|
147
|
+
}
|
|
148
|
+
if (info.size > 2 * 1024 * 1024) {
|
|
149
|
+
throw new BridgeError("unsafe_state_size", `${path} exceeds the maximum protected state size.`);
|
|
150
|
+
}
|
|
151
|
+
return await handle.readFile("utf8");
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
await handle.close();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export async function writeSecureText(path, contents) {
|
|
158
|
+
const directory = dirname(path);
|
|
159
|
+
await ensureSecureDirectory(directory);
|
|
160
|
+
const temporary = join(directory, `.${path.split("/").at(-1) ?? "state"}.${process.pid}.${Date.now()}.tmp`);
|
|
161
|
+
try {
|
|
162
|
+
const handle = await open(temporary, "wx", 0o600);
|
|
163
|
+
try {
|
|
164
|
+
await handle.writeFile(contents, "utf8");
|
|
165
|
+
await handle.sync();
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
await handle.close();
|
|
169
|
+
}
|
|
170
|
+
await chmod(temporary, 0o600);
|
|
171
|
+
await rename(temporary, path);
|
|
172
|
+
await chmod(path, 0o600);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
await unlink(temporary).catch(() => undefined);
|
|
176
|
+
throw error;
|
|
177
|
+
}
|
|
178
|
+
const directoryHandle = await open(directory, "r");
|
|
179
|
+
try {
|
|
180
|
+
await directoryHandle.sync();
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Some filesystems do not allow directory fsync.
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
await directoryHandle.close();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
export async function readBridgeConfig(environment = process.env, platform = process.platform) {
|
|
190
|
+
const path = bridgeConfigPath(environment, platform);
|
|
191
|
+
const raw = await readSecureText(path);
|
|
192
|
+
if (!raw) {
|
|
193
|
+
throw new BridgeError("not_enrolled", "This machine is not enrolled. Run `crewx-bridge enroll` first.");
|
|
194
|
+
}
|
|
195
|
+
let parsed;
|
|
196
|
+
try {
|
|
197
|
+
parsed = JSON.parse(raw);
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
throw new BridgeError("invalid_config", `Bridge config at ${path} is invalid JSON.`, 1, {
|
|
201
|
+
cause: error,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
const result = BridgeConfigSchema.safeParse(parsed);
|
|
205
|
+
if (!result.success) {
|
|
206
|
+
throw new BridgeError("invalid_config", `Bridge config at ${path} has an unsupported or unsafe shape.`);
|
|
207
|
+
}
|
|
208
|
+
return { ...result.data, url: normalizeServerUrl(result.data.url) };
|
|
209
|
+
}
|
|
210
|
+
export async function saveBridgeConfig(config, environment = process.env, platform = process.platform) {
|
|
211
|
+
const parsed = BridgeConfigSchema.parse({
|
|
212
|
+
...config,
|
|
213
|
+
url: normalizeServerUrl(config.url),
|
|
214
|
+
});
|
|
215
|
+
const path = bridgeConfigPath(environment, platform);
|
|
216
|
+
await writeSecureText(path, `${JSON.stringify(parsed, null, 2)}\n`);
|
|
217
|
+
return path;
|
|
218
|
+
}
|
|
219
|
+
export async function canonicalFolder(input) {
|
|
220
|
+
const resolved = await realpath(resolve(input));
|
|
221
|
+
const info = await stat(resolved);
|
|
222
|
+
if (!info.isDirectory()) {
|
|
223
|
+
throw new BridgeError("folder_not_directory", `${resolved} is not a directory.`);
|
|
224
|
+
}
|
|
225
|
+
if (resolved === "/") {
|
|
226
|
+
throw new BridgeError("folder_too_broad", "The filesystem root cannot be registered.");
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
path: resolved,
|
|
230
|
+
fingerprint: `dev:${info.dev.toString(16)}:inode:${info.ino.toString(16)}`,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const BRIDGE_VERSION = "0.1.0";
|
|
2
|
+
export declare const DEFAULT_HEARTBEAT_INTERVAL_SECONDS = 15;
|
|
3
|
+
export declare const DEFAULT_POLL_INTERVAL_MS = 3000;
|
|
4
|
+
export declare const REQUEST_TIMEOUT_MS = 15000;
|
|
5
|
+
export declare const CONFIG_VERSION: 1;
|
|
6
|
+
export declare const ADAPTERS: readonly ["codex", "claude", "pi", "hermes", "openclaw"];
|
|
7
|
+
//# sourceMappingURL=constants.d.ts.map
|