toc-ocra 0.2.0 → 0.2.2
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/README.md +19 -6
- package/dist/plugin/renderer.css +1 -1
- package/dist/plugin/renderer.css.map +2 -2
- package/dist/plugin/renderer.js +1 -1
- package/dist/plugin/renderer.js.map +4 -4
- package/dist/service/agent.mjs +17842 -0
- package/dist/src/config.d.ts +1 -0
- package/dist/src/config.js +27 -1
- package/dist/src/config.js.map +1 -1
- package/dist/src/control/pairing.d.ts +6 -1
- package/dist/src/control/pairing.js +12 -2
- package/dist/src/control/pairing.js.map +1 -1
- package/dist/src/index.js +28 -39
- package/dist/src/index.js.map +1 -1
- package/dist/src/plugin-service.d.ts +1 -0
- package/dist/src/plugin-service.js +70 -0
- package/dist/src/plugin-service.js.map +1 -0
- package/dist/src/runtime/agent-service.d.ts +17 -1
- package/dist/src/runtime/agent-service.js +14 -2
- package/dist/src/runtime/agent-service.js.map +1 -1
- package/dist/src/runtime/run-service.d.ts +10 -0
- package/dist/src/runtime/run-service.js +51 -0
- package/dist/src/runtime/run-service.js.map +1 -0
- package/locales/en.json +83 -7
- package/locales/zh-CN.json +83 -7
- package/package.json +11 -6
package/dist/src/config.d.ts
CHANGED
package/dist/src/config.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
2
3
|
import { chmod, mkdir, rename, writeFile } from 'node:fs/promises';
|
|
3
4
|
import { homedir, hostname, platform } from 'node:os';
|
|
4
5
|
import { delimiter, dirname, join, resolve, sep } from 'node:path';
|
|
@@ -23,6 +24,8 @@ const FileConfigSchema = z
|
|
|
23
24
|
token: z.string().min(1).optional(),
|
|
24
25
|
deviceId: z.string().min(1).optional(),
|
|
25
26
|
deviceName: z.string().min(1).optional(),
|
|
27
|
+
/** Stable id of this installation; lets any server recognise the same computer. */
|
|
28
|
+
machineId: z.string().min(8).max(64).optional(),
|
|
26
29
|
allowedRoots: z.array(z.string()).optional(),
|
|
27
30
|
maxConcurrentRuns: z.number().int().positive().max(64).optional(),
|
|
28
31
|
maxRunSeconds: z.number().int().positive().max(7 * 86_400).optional(),
|
|
@@ -56,6 +59,28 @@ async function writeFileConfig(configPath, value) {
|
|
|
56
59
|
await rename(temporary, configPath);
|
|
57
60
|
await chmod(configPath, 0o600);
|
|
58
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Returns this installation's machine id, generating and persisting it on
|
|
64
|
+
* first use. It survives unpairing, so re-binding to another server (or back)
|
|
65
|
+
* reuses the same device record there.
|
|
66
|
+
*/
|
|
67
|
+
function ensureMachineId(configPath, file) {
|
|
68
|
+
if (file.machineId)
|
|
69
|
+
return file.machineId;
|
|
70
|
+
const machineId = randomUUID();
|
|
71
|
+
try {
|
|
72
|
+
mkdirSync(dirname(configPath), { recursive: true, mode: 0o700 });
|
|
73
|
+
const temporary = `${configPath}.${process.pid}.mid.tmp`;
|
|
74
|
+
writeFileSync(temporary, JSON.stringify({ ...file, machineId }, null, 2), { mode: 0o600 });
|
|
75
|
+
renameSync(temporary, configPath);
|
|
76
|
+
chmodSync(configPath, 0o600);
|
|
77
|
+
file.machineId = machineId;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Read-only config: keep the id for this process only.
|
|
81
|
+
}
|
|
82
|
+
return machineId;
|
|
83
|
+
}
|
|
59
84
|
export function normalizeServerUrl(value) {
|
|
60
85
|
const url = new URL(value);
|
|
61
86
|
url.pathname = url.pathname.replace(/\/+$/, '').replace(/\/api$/, '');
|
|
@@ -133,6 +158,7 @@ export function loadBaseConfig() {
|
|
|
133
158
|
token,
|
|
134
159
|
deviceId: file.deviceId ?? '',
|
|
135
160
|
deviceName: file.deviceName ?? hostname(),
|
|
161
|
+
machineId: ensureMachineId(configPath, file),
|
|
136
162
|
hostname: hostname(),
|
|
137
163
|
platform: platform(),
|
|
138
164
|
allowedRoots: roots.map((root) => resolve(root)),
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
*
|
|
11
11
|
* The code rotates after it is used and after five wrong attempts, and wrong
|
|
12
12
|
* attempts lock pairing for a short while.
|
|
13
|
+
*
|
|
14
|
+
* When the desktop app starts the service itself it passes a per-launch
|
|
15
|
+
* token (`hostToken`), which is accepted next to the stored one: the app
|
|
16
|
+
* hands it to the plugin, so no connection code is needed.
|
|
13
17
|
*/
|
|
14
18
|
export declare const CODE_FILE = "connection-code";
|
|
15
19
|
export declare const TOKEN_FILE = "control-token";
|
|
@@ -28,7 +32,8 @@ export declare class PairingStore {
|
|
|
28
32
|
private code;
|
|
29
33
|
private failures;
|
|
30
34
|
private lockedUntil;
|
|
31
|
-
|
|
35
|
+
private readonly hostToken;
|
|
36
|
+
constructor(dataDir: string, now?: () => number, hostToken?: string);
|
|
32
37
|
/** Loads or creates the control token and issues a fresh connection code. */
|
|
33
38
|
init(): Promise<void>;
|
|
34
39
|
get connectionCode(): string;
|
|
@@ -14,6 +14,10 @@ import { join } from 'node:path';
|
|
|
14
14
|
*
|
|
15
15
|
* The code rotates after it is used and after five wrong attempts, and wrong
|
|
16
16
|
* attempts lock pairing for a short while.
|
|
17
|
+
*
|
|
18
|
+
* When the desktop app starts the service itself it passes a per-launch
|
|
19
|
+
* token (`hostToken`), which is accepted next to the stored one: the app
|
|
20
|
+
* hands it to the plugin, so no connection code is needed.
|
|
17
21
|
*/
|
|
18
22
|
export const CODE_FILE = 'connection-code';
|
|
19
23
|
export const TOKEN_FILE = 'control-token';
|
|
@@ -26,9 +30,12 @@ export class PairingStore {
|
|
|
26
30
|
code = '';
|
|
27
31
|
failures = 0;
|
|
28
32
|
lockedUntil = 0;
|
|
29
|
-
|
|
33
|
+
hostToken;
|
|
34
|
+
constructor(dataDir, now = Date.now, hostToken = '') {
|
|
30
35
|
this.dataDir = dataDir;
|
|
31
36
|
this.now = now;
|
|
37
|
+
// Only a long random token is accepted, so an empty or weak value never opens the API.
|
|
38
|
+
this.hostToken = /^[A-Za-z0-9_-]{32,128}$/.test(hostToken) ? hostToken : '';
|
|
32
39
|
}
|
|
33
40
|
/** Loads or creates the control token and issues a fresh connection code. */
|
|
34
41
|
async init() {
|
|
@@ -66,7 +73,10 @@ export class PairingStore {
|
|
|
66
73
|
/** Checks an `Authorization: Bearer <token>` header. */
|
|
67
74
|
authorize(header) {
|
|
68
75
|
const match = /^Bearer\s+(\S+)$/i.exec(header?.trim() ?? '');
|
|
69
|
-
|
|
76
|
+
if (!match)
|
|
77
|
+
return false;
|
|
78
|
+
const presented = match[1] ?? '';
|
|
79
|
+
return Boolean((this.token && safeEqual(presented, this.token)) || (this.hostToken && safeEqual(presented, this.hostToken)));
|
|
70
80
|
}
|
|
71
81
|
/** Removes the code file when the service stops. */
|
|
72
82
|
async dispose() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairing.js","sourceRoot":"","sources":["../../../src/control/pairing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC
|
|
1
|
+
{"version":3,"file":"pairing.js","sourceRoot":"","sources":["../../../src/control/pairing.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,50 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { spawnSync } from 'node:child_process';
|
|
3
|
-
import { existsSync
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
4
|
import { dirname, resolve } from 'node:path';
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
import { defaultConfigPath, enrollDevice, loadAgentConfig, loadBaseConfig, redactedConfig } from './config.js';
|
|
7
7
|
import { readConnectionCode } from './control/pairing.js';
|
|
8
8
|
import { cliDetection } from './providers/detection.js';
|
|
9
|
-
import { AgentService } from './runtime/agent-service.js';
|
|
10
9
|
import { hydrateShellPath, mergePathSegments } from './runtime/cli/hydrate-shell-path.js';
|
|
11
|
-
|
|
12
|
-
function agentVersion() {
|
|
13
|
-
let directory = dirname(fileURLToPath(import.meta.url));
|
|
14
|
-
while (true) {
|
|
15
|
-
const packagePath = resolve(directory, 'package.json');
|
|
16
|
-
if (existsSync(packagePath)) {
|
|
17
|
-
try {
|
|
18
|
-
const info = JSON.parse(readFileSync(packagePath, 'utf8'));
|
|
19
|
-
if (info.name === PACKAGE_NAME && typeof info.version === 'string')
|
|
20
|
-
return info.version;
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
// Keep searching upward.
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
const parent = dirname(directory);
|
|
27
|
-
if (parent === directory)
|
|
28
|
-
return 'unknown';
|
|
29
|
-
directory = parent;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
10
|
+
import { PACKAGE_NAME, agentVersion, runService } from './runtime/run-service.js';
|
|
32
11
|
async function run() {
|
|
33
|
-
|
|
34
|
-
if (hydration.ok)
|
|
35
|
-
mergePathSegments(hydration.segments);
|
|
36
|
-
const service = new AgentService(agentVersion());
|
|
37
|
-
await service.start();
|
|
38
|
-
let shuttingDown = false;
|
|
39
|
-
const shutdown = async () => {
|
|
40
|
-
if (shuttingDown)
|
|
41
|
-
return;
|
|
42
|
-
shuttingDown = true;
|
|
43
|
-
await service.stop();
|
|
44
|
-
process.exit(0);
|
|
45
|
-
};
|
|
46
|
-
process.once('SIGINT', () => void shutdown());
|
|
47
|
-
process.once('SIGTERM', () => void shutdown());
|
|
12
|
+
await runService();
|
|
48
13
|
}
|
|
49
14
|
async function doctor() {
|
|
50
15
|
const hydration = await hydrateShellPath({ force: true });
|
|
@@ -88,6 +53,28 @@ async function enroll(args) {
|
|
|
88
53
|
const result = await enrollDevice({ code, agentVersion: agentVersion(), ...(server ? { serverUrl: server } : {}), ...(configPath ? { configPath } : {}) });
|
|
89
54
|
process.stdout.write(`配对成功:设备「${result.deviceName}」(${result.deviceId})\n后端:${result.serverUrl}\n配置:${result.configPath}\n现在运行 toc-ocra run 启动 Agent\n`);
|
|
90
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* One-command setup for another machine: pairs with the code from the
|
|
58
|
+
* desktop plugin, then installs and starts the background service, so the
|
|
59
|
+
* device comes online without further steps.
|
|
60
|
+
*/
|
|
61
|
+
async function setup(args) {
|
|
62
|
+
const code = option(args, '--code');
|
|
63
|
+
const server = option(args, '--server');
|
|
64
|
+
if (!code || !server)
|
|
65
|
+
throw new Error('用法:toc-ocra setup --code <配对码> --server <后端地址>');
|
|
66
|
+
const configPath = option(args, '--config');
|
|
67
|
+
const result = await enrollDevice({ code, serverUrl: server, agentVersion: agentVersion(), ...(configPath ? { configPath } : {}) });
|
|
68
|
+
process.stdout.write(`配对成功:设备「${result.deviceName}」(${result.deviceId})\n后端:${result.serverUrl}\n正在安装后台服务…\n`);
|
|
69
|
+
if (!manageService('install', configPath ? ['--config', configPath] : [])) {
|
|
70
|
+
process.stderr.write('后台服务安装失败,可以先运行 toc-ocra run 临时启动\n');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
process.stdout.write('完成:设备代理已作为后台服务运行,开机自动启动。回到 Echo 页面即可看到这台设备上线。\n');
|
|
74
|
+
if (process.platform === 'linux') {
|
|
75
|
+
process.stdout.write('提示:如需在退出登录后继续运行,请执行一次 loginctl enable-linger "$USER"\n');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
91
78
|
function manageService(action, args) {
|
|
92
79
|
const script = resolve(dirname(fileURLToPath(import.meta.url)), '../../scripts/service.mjs');
|
|
93
80
|
if (!existsSync(script))
|
|
@@ -142,6 +129,8 @@ else if (command === 'run')
|
|
|
142
129
|
void run().catch(fail(`${PACKAGE_NAME} failed`));
|
|
143
130
|
else if (command === 'enroll')
|
|
144
131
|
void enroll(rest).catch(fail('配对失败'));
|
|
132
|
+
else if (command === 'setup')
|
|
133
|
+
void setup(rest).catch(fail('安装失败'));
|
|
145
134
|
else if (command === 'code') {
|
|
146
135
|
try {
|
|
147
136
|
code();
|
|
@@ -167,7 +156,7 @@ else if (command === 'update') {
|
|
|
167
156
|
}
|
|
168
157
|
}
|
|
169
158
|
else {
|
|
170
|
-
process.stderr.write(`Usage: ${PACKAGE_NAME} [run|code|enroll|detect|doctor|service:install|service:uninstall|update|version]\n`);
|
|
159
|
+
process.stderr.write(`Usage: ${PACKAGE_NAME} [run|setup|code|enroll|detect|doctor|service:install|service:uninstall|update|version]\n`);
|
|
171
160
|
process.exitCode = 2;
|
|
172
161
|
}
|
|
173
162
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { delimiter, join } from 'node:path';
|
|
3
|
+
import { LocalServerUnavailableError } from './runtime/agent-service.js';
|
|
4
|
+
import { runService } from './runtime/run-service.js';
|
|
5
|
+
/**
|
|
6
|
+
* Entry the Echo desktop app starts for the device-agent plugin
|
|
7
|
+
* (`tocPlugin.entries.service`, bundled to dist/service/agent.mjs). It is
|
|
8
|
+
* `toc-ocra run` with three differences:
|
|
9
|
+
*
|
|
10
|
+
* - The control token is the per-launch one the app passes in
|
|
11
|
+
* TOC_PLUGIN_SERVICE_TOKEN, so the plugin needs no connection code.
|
|
12
|
+
* - It exits with EXIT_PORT_IN_USE when the local port is taken: another
|
|
13
|
+
* toc-ocra (the background service, or one started in a terminal) already
|
|
14
|
+
* serves this machine, and two agents must never poll the same device.
|
|
15
|
+
* - It stops when the app goes away (stdin closes or the parent exits), so
|
|
16
|
+
* it follows the desktop app's lifetime.
|
|
17
|
+
*/
|
|
18
|
+
const EXIT_PORT_IN_USE = 3;
|
|
19
|
+
const PARENT_CHECK_MS = 5_000;
|
|
20
|
+
/**
|
|
21
|
+
* The app runs this file with its own binary as Node. npm CLIs that are
|
|
22
|
+
* `.js` shims prefer a real Node from PATH when there is one.
|
|
23
|
+
*/
|
|
24
|
+
function preferSystemNode() {
|
|
25
|
+
if (!process.versions.electron || process.env.TOC_OCRA_NODE_PATH)
|
|
26
|
+
return;
|
|
27
|
+
const names = process.platform === 'win32' ? ['node.exe'] : ['node'];
|
|
28
|
+
for (const directory of (process.env.PATH ?? '').split(delimiter)) {
|
|
29
|
+
for (const name of names) {
|
|
30
|
+
const candidate = directory && join(directory, name);
|
|
31
|
+
if (candidate && existsSync(candidate)) {
|
|
32
|
+
process.env.TOC_OCRA_NODE_PATH = candidate;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function watchParent(stop) {
|
|
39
|
+
process.stdin.on('end', stop);
|
|
40
|
+
process.stdin.on('close', stop);
|
|
41
|
+
process.stdin.resume();
|
|
42
|
+
const parent = Number(process.env.TOC_PLUGIN_PARENT_PID);
|
|
43
|
+
if (!Number.isInteger(parent) || parent <= 1)
|
|
44
|
+
return;
|
|
45
|
+
const timer = setInterval(() => {
|
|
46
|
+
try {
|
|
47
|
+
process.kill(parent, 0);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
stop();
|
|
51
|
+
}
|
|
52
|
+
}, PARENT_CHECK_MS);
|
|
53
|
+
timer.unref();
|
|
54
|
+
}
|
|
55
|
+
async function main() {
|
|
56
|
+
const hostToken = process.env.TOC_PLUGIN_SERVICE_TOKEN ?? '';
|
|
57
|
+
delete process.env.TOC_PLUGIN_SERVICE_TOKEN;
|
|
58
|
+
let shutdown;
|
|
59
|
+
try {
|
|
60
|
+
shutdown = await runService({ hostToken, requireLocalServer: true, launchedBy: 'desktop' });
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
64
|
+
process.exit(error instanceof LocalServerUnavailableError ? EXIT_PORT_IN_USE : 1);
|
|
65
|
+
}
|
|
66
|
+
preferSystemNode();
|
|
67
|
+
watchParent(() => void shutdown?.());
|
|
68
|
+
}
|
|
69
|
+
void main();
|
|
70
|
+
//# sourceMappingURL=plugin-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-service.js","sourceRoot":"","sources":["../../src/plugin-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
/** Bumped when the control API changes incompatibly. */
|
|
2
2
|
export declare const CONTROL_PROTOCOL_VERSION = 1;
|
|
3
|
+
export interface AgentServiceOptions {
|
|
4
|
+
/** Extra control token accepted next to the stored one (desktop-app launches). */
|
|
5
|
+
hostToken?: string;
|
|
6
|
+
/**
|
|
7
|
+
* Fail to start when the local port is taken instead of running without it.
|
|
8
|
+
* A taken port means another toc-ocra (e.g. the background service) already
|
|
9
|
+
* serves this machine; a second agent would poll the same device.
|
|
10
|
+
*/
|
|
11
|
+
requireLocalServer?: boolean;
|
|
12
|
+
/** Who started the process, reported to the plugin. */
|
|
13
|
+
launchedBy?: 'cli' | 'desktop';
|
|
14
|
+
}
|
|
15
|
+
/** The local port is in use: another toc-ocra is already running. */
|
|
16
|
+
export declare class LocalServerUnavailableError extends Error {
|
|
17
|
+
}
|
|
3
18
|
/**
|
|
4
19
|
* The long-running `toc-ocra run` process. It owns the local server (the
|
|
5
20
|
* dashboard plus the plugin control API) and runs the agent runtime while
|
|
@@ -8,6 +23,7 @@ export declare const CONTROL_PROTOCOL_VERSION = 1;
|
|
|
8
23
|
*/
|
|
9
24
|
export declare class AgentService {
|
|
10
25
|
private readonly version;
|
|
26
|
+
private readonly options;
|
|
11
27
|
private config;
|
|
12
28
|
private readonly logger;
|
|
13
29
|
private readonly pairing;
|
|
@@ -17,7 +33,7 @@ export declare class AgentService {
|
|
|
17
33
|
private readonly startedAt;
|
|
18
34
|
/** Serializes enroll / unpair so two clicks cannot race. */
|
|
19
35
|
private transition;
|
|
20
|
-
constructor(version: string);
|
|
36
|
+
constructor(version: string, options?: AgentServiceOptions);
|
|
21
37
|
start(): Promise<void>;
|
|
22
38
|
stop(): Promise<void>;
|
|
23
39
|
private startRuntime;
|
|
@@ -6,6 +6,9 @@ import { cliDetection } from '../providers/detection.js';
|
|
|
6
6
|
import { AgentRuntime } from './agent-runtime.js';
|
|
7
7
|
/** Bumped when the control API changes incompatibly. */
|
|
8
8
|
export const CONTROL_PROTOCOL_VERSION = 1;
|
|
9
|
+
/** The local port is in use: another toc-ocra is already running. */
|
|
10
|
+
export class LocalServerUnavailableError extends Error {
|
|
11
|
+
}
|
|
9
12
|
/**
|
|
10
13
|
* The long-running `toc-ocra run` process. It owns the local server (the
|
|
11
14
|
* dashboard plus the plugin control API) and runs the agent runtime while
|
|
@@ -14,6 +17,7 @@ export const CONTROL_PROTOCOL_VERSION = 1;
|
|
|
14
17
|
*/
|
|
15
18
|
export class AgentService {
|
|
16
19
|
version;
|
|
20
|
+
options;
|
|
17
21
|
config;
|
|
18
22
|
logger;
|
|
19
23
|
pairing;
|
|
@@ -23,11 +27,12 @@ export class AgentService {
|
|
|
23
27
|
startedAt = new Date().toISOString();
|
|
24
28
|
/** Serializes enroll / unpair so two clicks cannot race. */
|
|
25
29
|
transition = Promise.resolve();
|
|
26
|
-
constructor(version) {
|
|
30
|
+
constructor(version, options = {}) {
|
|
27
31
|
this.version = version;
|
|
32
|
+
this.options = options;
|
|
28
33
|
this.config = loadBaseConfig();
|
|
29
34
|
this.logger = createDiagnosticLogger(this.config.logFile, { level: this.config.logLevel, maxAgeMs: 5 * 60 * 1_000 });
|
|
30
|
-
this.pairing = new PairingStore(this.config.dataDir);
|
|
35
|
+
this.pairing = new PairingStore(this.config.dataDir, Date.now, options.hostToken ?? '');
|
|
31
36
|
this.server = new HealthServer(this.config.healthHost, this.config.healthPort, () => this.runtime?.snapshot() ?? this.idleSnapshot(), this.config.logFile, this.logger, async (refresh) => (this.runtime ? (refresh ? this.runtime.refreshDetection() : this.runtime.snapshot().detection ?? this.detect(false)) : this.detect(refresh)), this.controlApi());
|
|
32
37
|
}
|
|
33
38
|
async start() {
|
|
@@ -36,6 +41,11 @@ export class AgentService {
|
|
|
36
41
|
await this.server.start();
|
|
37
42
|
}
|
|
38
43
|
catch (error) {
|
|
44
|
+
if (this.options.requireLocalServer) {
|
|
45
|
+
await this.pairing.dispose();
|
|
46
|
+
this.logger.close();
|
|
47
|
+
throw new LocalServerUnavailableError(`本机服务端口 ${this.config.healthHost}:${this.config.healthPort} 已被占用(${errorMessage(error)}),这台电脑可能已有设备代理在运行`);
|
|
48
|
+
}
|
|
39
49
|
// Without the local server the plugin cannot reach this machine; the
|
|
40
50
|
// agent still runs if it is enrolled.
|
|
41
51
|
this.logger.warn('health-server-unavailable', { error: errorMessage(error) });
|
|
@@ -88,8 +98,10 @@ export class AgentService {
|
|
|
88
98
|
version: this.version,
|
|
89
99
|
protocol: CONTROL_PROTOCOL_VERSION,
|
|
90
100
|
hostname: this.config.hostname,
|
|
101
|
+
machine_id: this.config.machineId,
|
|
91
102
|
platform: devicePlatform(this.config.platform),
|
|
92
103
|
started_at: this.startedAt,
|
|
104
|
+
launched_by: this.options.launchedBy ?? 'cli',
|
|
93
105
|
paired: Boolean(this.config.token),
|
|
94
106
|
running: Boolean(this.runtime),
|
|
95
107
|
device_id: this.config.deviceId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-service.js","sourceRoot":"","sources":["../../../src/runtime/agent-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAoB,MAAM,cAAc,CAAA;AAClH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAmB,MAAM,qBAAqB,CAAA;AACjF,OAAO,EAAE,sBAAsB,EAAyB,MAAM,8BAA8B,CAAA;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,wDAAwD;AACxD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"agent-service.js","sourceRoot":"","sources":["../../../src/runtime/agent-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type AgentServiceOptions } from './agent-service.js';
|
|
2
|
+
export declare const PACKAGE_NAME = "toc-ocra";
|
|
3
|
+
/** Version from the nearest toc-ocra package.json above this file (CLI build or bundle). */
|
|
4
|
+
export declare function agentVersion(): string;
|
|
5
|
+
/**
|
|
6
|
+
* Runs the long-lived service (`toc-ocra run` and the desktop-app launch):
|
|
7
|
+
* hydrates PATH, starts the local server and the agent, and stops cleanly on
|
|
8
|
+
* SIGINT / SIGTERM. Returns a function that stops it the same way.
|
|
9
|
+
*/
|
|
10
|
+
export declare function runService(options?: AgentServiceOptions): Promise<(code?: number) => Promise<void>>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { hydrateShellPath, mergePathSegments } from './cli/hydrate-shell-path.js';
|
|
5
|
+
import { AgentService } from './agent-service.js';
|
|
6
|
+
export const PACKAGE_NAME = 'toc-ocra';
|
|
7
|
+
/** Version from the nearest toc-ocra package.json above this file (CLI build or bundle). */
|
|
8
|
+
export function agentVersion() {
|
|
9
|
+
let directory = dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
while (true) {
|
|
11
|
+
const packagePath = resolve(directory, 'package.json');
|
|
12
|
+
if (existsSync(packagePath)) {
|
|
13
|
+
try {
|
|
14
|
+
const info = JSON.parse(readFileSync(packagePath, 'utf8'));
|
|
15
|
+
if (info.name === PACKAGE_NAME && typeof info.version === 'string')
|
|
16
|
+
return info.version;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Keep searching upward.
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const parent = dirname(directory);
|
|
23
|
+
if (parent === directory)
|
|
24
|
+
return 'unknown';
|
|
25
|
+
directory = parent;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Runs the long-lived service (`toc-ocra run` and the desktop-app launch):
|
|
30
|
+
* hydrates PATH, starts the local server and the agent, and stops cleanly on
|
|
31
|
+
* SIGINT / SIGTERM. Returns a function that stops it the same way.
|
|
32
|
+
*/
|
|
33
|
+
export async function runService(options = {}) {
|
|
34
|
+
const hydration = await hydrateShellPath();
|
|
35
|
+
if (hydration.ok)
|
|
36
|
+
mergePathSegments(hydration.segments);
|
|
37
|
+
const service = new AgentService(agentVersion(), options);
|
|
38
|
+
await service.start();
|
|
39
|
+
let shuttingDown = false;
|
|
40
|
+
const shutdown = async (code = 0) => {
|
|
41
|
+
if (shuttingDown)
|
|
42
|
+
return;
|
|
43
|
+
shuttingDown = true;
|
|
44
|
+
await service.stop();
|
|
45
|
+
process.exit(code);
|
|
46
|
+
};
|
|
47
|
+
process.once('SIGINT', () => void shutdown());
|
|
48
|
+
process.once('SIGTERM', () => void shutdown());
|
|
49
|
+
return shutdown;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=run-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-service.js","sourceRoot":"","sources":["../../../src/runtime/run-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AACjF,OAAO,EAAE,YAAY,EAA4B,MAAM,oBAAoB,CAAA;AAE3E,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAA;AAEtC,4FAA4F;AAC5F,MAAM,UAAU,YAAY;IAC1B,IAAI,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACvD,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;QACtD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAA0C,CAAA;gBACnG,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;oBAAE,OAAO,IAAI,CAAC,OAAO,CAAA;YACzF,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;QACjC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAA;QAC1C,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAA+B,EAAE;IAChE,MAAM,SAAS,GAAG,MAAM,gBAAgB,EAAE,CAAA;IAC1C,IAAI,SAAS,CAAC,EAAE;QAAE,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IACvD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAA;IACzD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;IACrB,IAAI,YAAY,GAAG,KAAK,CAAA;IACxB,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAI,GAAG,CAAC,EAAiB,EAAE;QACjD,IAAI,YAAY;YAAE,OAAM;QACxB,YAAY,GAAG,IAAI,CAAA;QACnB,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC,CAAA;IACD,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAA;IAC7C,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAA;IAC9C,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|