@amaster.ai/mirrorx-device-client 0.0.0-stage → 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 +172 -0
- package/README.md +487 -2
- package/dist/codebuddy-auth.d.ts +2 -0
- package/dist/codebuddy-auth.d.ts.map +1 -0
- package/dist/codebuddy-auth.js +80 -0
- package/dist/codebuddy-auth.js.map +1 -0
- package/dist/codebuddy-locks.d.ts +12 -0
- package/dist/codebuddy-locks.d.ts.map +1 -0
- package/dist/codebuddy-locks.js +101 -0
- package/dist/codebuddy-locks.js.map +1 -0
- package/dist/codebuddy-redaction.d.ts +3 -0
- package/dist/codebuddy-redaction.d.ts.map +1 -0
- package/dist/codebuddy-redaction.js +31 -0
- package/dist/codebuddy-redaction.js.map +1 -0
- package/dist/codebuddy-runtime.d.ts +82 -0
- package/dist/codebuddy-runtime.d.ts.map +1 -0
- package/dist/codebuddy-runtime.js +285 -0
- package/dist/codebuddy-runtime.js.map +1 -0
- package/dist/codebuddy-session.d.ts +13 -0
- package/dist/codebuddy-session.d.ts.map +1 -0
- package/dist/codebuddy-session.js +73 -0
- package/dist/codebuddy-session.js.map +1 -0
- package/dist/codebuddy-tool-gate.d.ts +4 -0
- package/dist/codebuddy-tool-gate.d.ts.map +1 -0
- package/dist/codebuddy-tool-gate.js +10 -0
- package/dist/codebuddy-tool-gate.js.map +1 -0
- package/dist/codex-runtime.d.ts +6 -0
- package/dist/codex-runtime.d.ts.map +1 -0
- package/dist/codex-runtime.js +24 -0
- package/dist/codex-runtime.js.map +1 -0
- package/dist/computer.d.ts +25 -0
- package/dist/computer.d.ts.map +1 -0
- package/dist/computer.js +161 -0
- package/dist/computer.js.map +1 -0
- package/dist/configuration-lifetime.d.ts +15 -0
- package/dist/configuration-lifetime.d.ts.map +1 -0
- package/dist/configuration-lifetime.js +143 -0
- package/dist/configuration-lifetime.js.map +1 -0
- package/dist/device-id.d.ts +7 -0
- package/dist/device-id.d.ts.map +1 -0
- package/dist/device-id.js +84 -0
- package/dist/device-id.js.map +1 -0
- package/dist/index.d.ts +209 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1459 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +126 -0
- package/dist/main.js.map +1 -0
- package/dist/managed-workspace.d.ts +33 -0
- package/dist/managed-workspace.d.ts.map +1 -0
- package/dist/managed-workspace.js +149 -0
- package/dist/managed-workspace.js.map +1 -0
- package/dist/pi-runtime.d.ts +24 -0
- package/dist/pi-runtime.d.ts.map +1 -0
- package/dist/pi-runtime.js +156 -0
- package/dist/pi-runtime.js.map +1 -0
- package/dist/readiness.d.ts +12 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +66 -0
- package/dist/readiness.js.map +1 -0
- package/dist/resource-lock.d.ts +11 -0
- package/dist/resource-lock.d.ts.map +1 -0
- package/dist/resource-lock.js +74 -0
- package/dist/resource-lock.js.map +1 -0
- package/dist/session-index.d.ts +41 -0
- package/dist/session-index.d.ts.map +1 -0
- package/dist/session-index.js +99 -0
- package/dist/session-index.js.map +1 -0
- package/dist/user-service.d.ts +21 -0
- package/dist/user-service.d.ts.map +1 -0
- package/dist/user-service.js +224 -0
- package/dist/user-service.js.map +1 -0
- package/package.json +46 -4
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/** User-owned OS supervision. Never controls a bare/unverified PID. */
|
|
2
|
+
import { listMirrorxComputers, runMirrorxComputer } from "./computer.js";
|
|
3
|
+
import { execFile } from "node:child_process";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
6
|
+
import os from "node:os";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
9
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
10
|
+
import { promisify } from "node:util";
|
|
11
|
+
import { mirrorxIdentityHome } from "./device-id.js";
|
|
12
|
+
import { acquireDeviceResourceLock, deviceResourceKey } from "./resource-lock.js";
|
|
13
|
+
import { listMirrorxDevicePairings, runMirrorxDevice } from "./index.js";
|
|
14
|
+
const supervisorResource = { baseUrl: "http://localhost", principalId: "os-user-supervisor", deviceProfileId: "supervisor", companyId: "all", executorKind: "supervisor" };
|
|
15
|
+
const label = "ai.mirrorx.device-client";
|
|
16
|
+
const serviceRoot = () => path.join(mirrorxIdentityHome(), "supervisor");
|
|
17
|
+
const stateFile = () => path.join(serviceRoot(), "state.json");
|
|
18
|
+
const controlFile = () => path.join(serviceRoot(), "control.json");
|
|
19
|
+
async function readState() {
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(await readFile(stateFile(), "utf8"));
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (error.code === "ENOENT")
|
|
25
|
+
return null;
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function saveState(state) {
|
|
30
|
+
const temporary = `${stateFile()}.${randomUUID()}.tmp`;
|
|
31
|
+
await writeFile(temporary, JSON.stringify(state), { mode: 0o600, flag: "wx" });
|
|
32
|
+
await rename(temporary, stateFile());
|
|
33
|
+
}
|
|
34
|
+
const exec = (file, args) => promisify(execFile)(file, args, { timeout: 15_000, maxBuffer: 64_000, windowsHide: true });
|
|
35
|
+
export async function userServiceSupport() {
|
|
36
|
+
if (process.platform === "darwin" || process.platform === "win32")
|
|
37
|
+
return { supported: true };
|
|
38
|
+
if (process.platform === "linux") {
|
|
39
|
+
try {
|
|
40
|
+
await exec("systemctl", ["--user", "show-environment"]);
|
|
41
|
+
return { supported: true };
|
|
42
|
+
}
|
|
43
|
+
catch { /* no user bus/service manager */ }
|
|
44
|
+
}
|
|
45
|
+
return { supported: false, reason: "当前系统没有可用的用户级后台服务;仅支持前台运行,关闭终端会离线。" };
|
|
46
|
+
}
|
|
47
|
+
export async function userServiceStatus() {
|
|
48
|
+
const state = await readState();
|
|
49
|
+
if (!state)
|
|
50
|
+
return { state: "not_running" };
|
|
51
|
+
if (!Number.isSafeInteger(state.pid) || state.pid <= 0 || !state.instanceId)
|
|
52
|
+
return { state: "unknown_owner" };
|
|
53
|
+
if (state.state === "stopped" || state.state === "needs_attention")
|
|
54
|
+
return { ...state, processVisible: false };
|
|
55
|
+
const owner = await readFile(path.join(mirrorxIdentityHome(), "locks", `${deviceResourceKey(supervisorResource)}.lock`), "utf8").then(value => JSON.parse(value)).catch(() => null);
|
|
56
|
+
if (owner?.instanceId !== state.instanceId || owner.pid !== state.pid || !state.heartbeatAt || Date.now() - Date.parse(state.heartbeatAt) > 5_000 || !Number.isFinite(Date.parse(state.heartbeatAt)))
|
|
57
|
+
return { ...state, state: "unknown_owner", processVisible: "unknown" };
|
|
58
|
+
try {
|
|
59
|
+
process.kill(state.pid, 0);
|
|
60
|
+
return { ...state, processVisible: true };
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
return { ...state, processVisible: error.code === "ESRCH" ? false : "unknown" };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export async function runUserService() {
|
|
67
|
+
await mkdir(serviceRoot(), { recursive: true, mode: 0o700 });
|
|
68
|
+
const instanceId = randomUUID(), startedAt = new Date().toISOString();
|
|
69
|
+
// Deliberately separate from all principal/executor locks, so Pi App can
|
|
70
|
+
// coexist with this one OS-user supervisor.
|
|
71
|
+
const unlock = await acquireDeviceResourceLock(supervisorResource, instanceId);
|
|
72
|
+
const drain = new AbortController();
|
|
73
|
+
let stopping = false;
|
|
74
|
+
const stop = () => { stopping = true; drain.abort(); };
|
|
75
|
+
process.once("SIGTERM", stop);
|
|
76
|
+
process.once("SIGINT", stop);
|
|
77
|
+
let checking = false, terminal = false;
|
|
78
|
+
let pulse = Promise.resolve();
|
|
79
|
+
const watcher = setInterval(() => {
|
|
80
|
+
if (checking || terminal)
|
|
81
|
+
return;
|
|
82
|
+
checking = true;
|
|
83
|
+
pulse = readFile(controlFile(), "utf8").then(bytes => {
|
|
84
|
+
const control = JSON.parse(bytes);
|
|
85
|
+
if (control.instanceId === instanceId && control.action === "drain")
|
|
86
|
+
stop();
|
|
87
|
+
}).catch(() => undefined).then(async () => { if (!terminal)
|
|
88
|
+
await saveState({ instanceId, pid: process.pid, state: stopping ? "draining" : "running", startedAt, heartbeatAt: new Date().toISOString() }); }).catch(() => undefined).finally(() => { checking = false; });
|
|
89
|
+
}, 500);
|
|
90
|
+
const finish = async (state) => { terminal = true; clearInterval(watcher); await pulse; await saveState({ instanceId, pid: process.pid, state, startedAt, heartbeatAt: new Date().toISOString() }); };
|
|
91
|
+
const tasks = new Map();
|
|
92
|
+
try {
|
|
93
|
+
await saveState({ instanceId, pid: process.pid, state: "running", startedAt, heartbeatAt: new Date().toISOString() });
|
|
94
|
+
let failed = false;
|
|
95
|
+
const start = (key, task) => {
|
|
96
|
+
if (tasks.has(key))
|
|
97
|
+
return;
|
|
98
|
+
tasks.set(key, task().catch(() => { failed = true; }));
|
|
99
|
+
};
|
|
100
|
+
do {
|
|
101
|
+
for (const config of await listMirrorxComputers())
|
|
102
|
+
start(`computer:${config.baseUrl}:${config.computerId}`, () => runMirrorxComputer({ computerId: config.computerId, baseUrl: config.baseUrl, drainSignal: drain.signal }));
|
|
103
|
+
for (const config of await listMirrorxDevicePairings({})) {
|
|
104
|
+
if (config.computerId || !(config.managedBy === "standalone" || !config.managedBy && !config.userSubject))
|
|
105
|
+
continue;
|
|
106
|
+
start(`employee:${config.baseUrl}:${config.bindingId}`, () => runMirrorxDevice({ executorKind: config.executorKind,
|
|
107
|
+
companyId: config.companyId, bindingId: config.bindingId, expectedBaseUrl: config.baseUrl,
|
|
108
|
+
...(config.userSubject ? { expectedSubject: config.userSubject } : {}), drainSignal: drain.signal }));
|
|
109
|
+
}
|
|
110
|
+
if (!tasks.size)
|
|
111
|
+
throw new Error("No paired computers; run setup first");
|
|
112
|
+
if (failed)
|
|
113
|
+
stop();
|
|
114
|
+
if (!stopping)
|
|
115
|
+
await delay(5_000, undefined, { signal: drain.signal }).catch(() => undefined);
|
|
116
|
+
} while (!stopping);
|
|
117
|
+
await Promise.allSettled(tasks.values());
|
|
118
|
+
if (failed)
|
|
119
|
+
throw new Error("A connection needs attention; inspect doctor and retained journal before restarting");
|
|
120
|
+
await finish("stopped");
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
stop();
|
|
124
|
+
await Promise.allSettled(tasks.values());
|
|
125
|
+
await finish("needs_attention");
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
clearInterval(watcher);
|
|
130
|
+
process.removeListener("SIGTERM", stop);
|
|
131
|
+
process.removeListener("SIGINT", stop);
|
|
132
|
+
await unlock();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export async function stopUserService() {
|
|
136
|
+
const state = await readState();
|
|
137
|
+
if (!state || state.state === "stopped")
|
|
138
|
+
return;
|
|
139
|
+
const status = await userServiceStatus();
|
|
140
|
+
if (status.state === "needs_attention")
|
|
141
|
+
throw new Error("Service retained uncertain work; reconcile before switching hosts");
|
|
142
|
+
if (!("processVisible" in status) || status.processVisible !== true)
|
|
143
|
+
throw new Error("Unknown service owner; no process was signalled");
|
|
144
|
+
if (!Number.isSafeInteger(state.pid) || state.pid <= 0 || !state.instanceId)
|
|
145
|
+
throw new Error("Unknown service owner; no process was signalled");
|
|
146
|
+
await writeFile(controlFile(), JSON.stringify({ instanceId: state.instanceId, action: "drain" }), { mode: 0o600 });
|
|
147
|
+
for (let attempt = 0; attempt < 60; attempt++) {
|
|
148
|
+
const current = await readState();
|
|
149
|
+
if (!current || current.instanceId !== state.instanceId || current.state === "stopped")
|
|
150
|
+
return;
|
|
151
|
+
if (current.state === "needs_attention")
|
|
152
|
+
throw new Error("Service retained an uncertain command; reconcile it before switching hosts");
|
|
153
|
+
await delay(500);
|
|
154
|
+
}
|
|
155
|
+
throw new Error("Service is draining active work; stop request retained. No unknown process was killed.");
|
|
156
|
+
}
|
|
157
|
+
const xml = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """);
|
|
158
|
+
export async function installUserService() {
|
|
159
|
+
const status = await userServiceStatus();
|
|
160
|
+
if (status.state === "running" && "processVisible" in status && status.processVisible === true)
|
|
161
|
+
return;
|
|
162
|
+
if (["unknown_owner", "needs_attention", "draining"].includes(status.state))
|
|
163
|
+
throw new Error("Existing service ownership or work is unresolved; no service was replaced");
|
|
164
|
+
const support = await userServiceSupport();
|
|
165
|
+
if (!support.supported)
|
|
166
|
+
throw new Error(support.reason);
|
|
167
|
+
await mkdir(serviceRoot(), { recursive: true, mode: 0o700 });
|
|
168
|
+
const entry = fileURLToPath(new URL("./main.js", import.meta.url));
|
|
169
|
+
const launcher = path.join(serviceRoot(), "launcher.mjs");
|
|
170
|
+
let windowsTaskExists = false;
|
|
171
|
+
if (process.platform === "win32") {
|
|
172
|
+
try {
|
|
173
|
+
const task = await exec("schtasks.exe", ["/Query", "/TN", label, "/XML"]);
|
|
174
|
+
if (!task.stdout.includes(xml(launcher)))
|
|
175
|
+
throw new Error("Existing scheduled task has another owner; no task was replaced");
|
|
176
|
+
windowsTaskExists = true;
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
const message = error && typeof error === "object" && "stderr" in error ? String(error.stderr) : "";
|
|
180
|
+
if (!/(cannot find|does not exist|找不到|不存在)/i.test(message))
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
const file = process.platform === "darwin" ? path.join(os.homedir(), "Library/LaunchAgents", `${label}.plist`) : path.join(os.homedir(), ".config/systemd/user", `${label}.service`);
|
|
186
|
+
const existing = await readFile(file, "utf8").catch(error => { if (error.code === "ENOENT")
|
|
187
|
+
return null; throw error; });
|
|
188
|
+
if (existing && !existing.includes(process.platform === "darwin" ? xml(launcher) : launcher.replaceAll("%", "%%")))
|
|
189
|
+
throw new Error("Existing user service has another owner; no service was replaced");
|
|
190
|
+
}
|
|
191
|
+
const env = Object.fromEntries(["MIRRORX_DEVICE_HOME", "MIRRORX_DEVICE_IDENTITY_HOME", "PATH"].flatMap(key => process.env[key] ? [[key, process.env[key]]] : []));
|
|
192
|
+
await writeFile(launcher, `Object.assign(process.env, ${JSON.stringify(env)});process.argv=[process.execPath,${JSON.stringify(entry)},"service-run"];await import(${JSON.stringify(pathToFileURL(entry).href)});\n`, { mode: 0o600 });
|
|
193
|
+
if (process.platform === "darwin") {
|
|
194
|
+
if (!process.getuid)
|
|
195
|
+
throw new Error("User service identity unavailable");
|
|
196
|
+
const file = path.join(os.homedir(), "Library/LaunchAgents", `${label}.plist`);
|
|
197
|
+
await mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
198
|
+
const plist = `<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>Label</key><string>${label}</string><key>ProgramArguments</key><array><string>${xml(process.execPath)}</string><string>${xml(launcher)}</string><string>service-run</string></array><key>RunAtLoad</key><true/><key>KeepAlive</key><false/></dict></plist>`;
|
|
199
|
+
await writeFile(file, plist, { mode: 0o600 });
|
|
200
|
+
try {
|
|
201
|
+
await exec("launchctl", ["print", `gui/${process.getuid()}/${label}`]);
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
await exec("launchctl", ["bootstrap", `gui/${process.getuid()}`, file]);
|
|
205
|
+
}
|
|
206
|
+
await exec("launchctl", ["kickstart", `gui/${process.getuid()}/${label}`]);
|
|
207
|
+
}
|
|
208
|
+
else if (process.platform === "linux") {
|
|
209
|
+
const file = path.join(os.homedir(), ".config/systemd/user", `${label}.service`);
|
|
210
|
+
await mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
211
|
+
const quote = (value) => `"${value.replaceAll("\\", "\\\\").replaceAll('"', '\\"').replaceAll("%", "%%")}"`;
|
|
212
|
+
await writeFile(file, `[Unit]\nDescription=MirrorX device connection\n[Service]\nType=simple\nExecStart=${quote(process.execPath)} ${quote(launcher)}\nRestart=no\n[Install]\nWantedBy=default.target\n`, { mode: 0o600 });
|
|
213
|
+
await exec("systemctl", ["--user", "daemon-reload"]);
|
|
214
|
+
await exec("systemctl", ["--user", "enable", "--now", `${label}.service`]);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
if ([process.execPath, launcher].some(value => /[\r\n"]/.test(value)))
|
|
218
|
+
throw new Error("Unsupported service executable path");
|
|
219
|
+
if (!windowsTaskExists)
|
|
220
|
+
await exec("schtasks.exe", ["/Create", "/TN", label, "/SC", "ONLOGON", "/RL", "LIMITED", "/TR", `"${process.execPath}" "${launcher}"`]);
|
|
221
|
+
await exec("schtasks.exe", ["/Run", "/TN", label]);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=user-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-service.js","sourceRoot":"","sources":["../src/user-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,48 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amaster.ai/mirrorx-device-client",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Standalone MirrorX device bridge for Pi, Codex and WorkBuddy executors",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"mirrorx-device": "./dist/main.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./device-id": {
|
|
17
|
+
"types": "./dist/device-id.d.ts",
|
|
18
|
+
"default": "./dist/device-id.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=22.19.0"
|
|
28
|
+
},
|
|
29
|
+
"license": "Apache-2.0",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "https://github.com/TGYD-helige/pi-agent.git",
|
|
33
|
+
"directory": "packages/mirrorx-device-client"
|
|
34
|
+
},
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public",
|
|
37
|
+
"registry": "https://registry.npmjs.org/"
|
|
38
|
+
},
|
|
39
|
+
"mirrorxDeviceProtocol": {
|
|
40
|
+
"min": 1,
|
|
41
|
+
"max": 2
|
|
42
|
+
},
|
|
43
|
+
"gitHead": "de92cce12e05fa1bcacdc735ea08d72b32de212d",
|
|
44
|
+
"mirrorxDeviceClientRelease": {
|
|
45
|
+
"sourceSha": "de92cce12e05fa1bcacdc735ea08d72b32de212d",
|
|
46
|
+
"fingerprint": "7339811a1efa6a0972862702166b900cb26a402e843787fde38124f6ed4f6658"
|
|
47
|
+
}
|
|
48
|
+
}
|