toc-ocra 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
- constructor(dataDir: string, now?: () => number);
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
- constructor(dataDir, now = Date.now) {
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
- return Boolean(match && this.token && safeEqual(match[1] ?? '', this.token));
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":"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"}
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;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,iBAAiB,CAAA;AAC1C,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAA;AACzC,MAAM,YAAY,GAAG,CAAC,CAAA;AACtB,MAAM,OAAO,GAAG,MAAM,CAAA;AAItB,MAAM,OAAO,YAAY;IAQM;IAAkC;IAPvD,KAAK,GAAG,EAAE,CAAA;IACV,IAAI,GAAG,EAAE,CAAA;IACT,QAAQ,GAAG,CAAC,CAAA;IACZ,WAAW,GAAG,CAAC,CAAA;IAEN,SAAS,CAAQ;IAElC,YAA6B,OAAe,EAAmB,MAAoB,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,EAAE;QAA9E,YAAO,GAAP,OAAO,CAAQ;QAAmB,QAAG,GAAH,GAAG,CAAyB;QACzF,uFAAuF;QACvF,IAAI,CAAC,SAAS,GAAG,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAA;IAC7E,CAAC;IAED,6EAA6E;IAC7E,KAAK,CAAC,IAAI;QACR,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;QAChD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAClF,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACrF,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;YAAE,MAAM,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QACnE,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;IACrB,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,IAAI,CAAC,KAAc;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE,CAAA;QACvG,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACvE,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;YACnB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;QACxC,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAA;QACf,IAAI,IAAI,CAAC,QAAQ,IAAI,YAAY,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,OAAO,CAAA;YAChC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;YACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,CAAA;QAC9D,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAA;IAC3C,CAAC;IAED,wDAAwD;IACxD,SAAS,CAAC,MAA0B;QAClC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5D,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAA;QACxB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAChC,OAAO,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAC9H,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1D,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAC5D,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7D,CAAC;CACF;AAED,kEAAkE;AAClE,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IACvC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;IAC9C,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;AAChD,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,KAAa;IACpD,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAA;IAC9C,MAAM,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAClD,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC7B,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,KAAa;IAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5B,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACvD,CAAC"}
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, readFileSync } from 'node:fs';
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
- const PACKAGE_NAME = 'toc-ocra';
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
- const hydration = await hydrateShellPath();
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
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) });
@@ -91,6 +101,7 @@ export class AgentService {
91
101
  machine_id: this.config.machineId,
92
102
  platform: devicePlatform(this.config.platform),
93
103
  started_at: this.startedAt,
104
+ launched_by: this.options.launchedBy ?? 'cli',
94
105
  paired: Boolean(this.config.token),
95
106
  running: Boolean(this.runtime),
96
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;AAEzC;;;;;GAKG;AACH,MAAM,OAAO,YAAY;IAWM;IAVrB,MAAM,CAAa;IACV,MAAM,CAAkB;IACxB,OAAO,CAAc;IACrB,MAAM,CAAc;IAC7B,OAAO,CAA0B;IACjC,SAAS,CAAkC;IAClC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACrD,4DAA4D;IACpD,UAAU,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAA;IAExD,YAA6B,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;QAC1C,IAAI,CAAC,MAAM,GAAG,cAAc,EAAE,CAAA;QAC9B,IAAI,CAAC,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAA;QACpH,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACpD,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAC5B,IAAI,CAAC,MAAM,CAAC,UAAU,EACtB,IAAI,CAAC,MAAM,CAAC,UAAU,EACtB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,EACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EACnB,IAAI,CAAC,MAAM,EACX,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAChK,IAAI,CAAC,UAAU,EAAE,CAClB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,qEAAqE;YACrE,sCAAsC;YACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAC7E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,QAAQ,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;QAC1H,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,OAAO,gBAAgB,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAA;QACjH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,cAAc,4BAA4B,CAAC,CAAA;QACtF,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK;YAAE,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;;YAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAC1D,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAA;QAC1B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;QACxB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QACxB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;QAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IACrB,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACxE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;IACvB,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;QACxB,MAAM,OAAO,EAAE,IAAI,EAAE,CAAA;IACvB,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,OAAgB;QACnC,IAAI,CAAC,SAAS,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACnD,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAEO,YAAY;QAClB,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,KAAK;YAChB,cAAc,EAAE,CAAC;YACjB,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,EAAE;YACR,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAA;IACH,CAAC;IAED,yEAAyE;IACjE,KAAK,CAAC,MAAM;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAA;QACzC,MAAM,SAAS,GAAG,QAAQ,EAAE,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACrF,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,wBAAwB;YAClC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YACjC,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC9C,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAClC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAC9B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC/B,WAAW,EAAE,QAAQ,EAAE,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU;YAC3D,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;YAC1D,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,KAAK;YACvC,YAAY,EAAE,QAAQ,EAAE,YAAY,IAAI,KAAK;YAC7C,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,IAAI,EAAE;YACzD,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,MAAM,IAAI,CAAC;YAC/C,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YACvC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;YACnD,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAChD,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,QAAQ,EAAE,QAAQ,CAAC,SAAS;gBAC5B,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE;aAChC,CAAC,CAAC;SACJ,CAAA;IACH,CAAC;IAEO,UAAU;QAChB,OAAO;YACL,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,wBAAwB,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACjI,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACvC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;YACrD,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE;YAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;gBAC3C,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;gBACpE,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;gBAChF,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,eAAe,CAAC,CAAA;gBAChE,IAAI,SAAiB,CAAA;gBACrB,IAAI,CAAC;oBACH,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,IAAI,YAAY,CAAC,GAAG,EAAE,WAAW,MAAM,IAAI,KAAK,EAAE,EAAE,oBAAoB,CAAC,CAAA;gBACjF,CAAC;gBACD,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;oBAAE,MAAM,IAAI,YAAY,CAAC,GAAG,EAAE,sCAAsC,EAAE,gBAAgB,CAAC,CAAA;gBACrH,wEAAwE;gBACxE,IAAI,QAAQ,CAAA;gBACZ,IAAI,CAAC;oBACH,QAAQ,GAAG,MAAM,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;gBACpH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,IAAI,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC,CAAA;gBACnE,CAAC;gBACD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;gBACxB,IAAI,CAAC,MAAM,GAAG,cAAc,EAAE,CAAA;gBAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAA;gBACnG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;gBACzB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAA;YACtB,CAAC,CAAC;YACF,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;gBACtC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;oBAAE,MAAM,IAAI,YAAY,CAAC,GAAG,EAAE,mCAAmC,EAAE,gBAAgB,CAAC,CAAA;gBAClH,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;gBACxB,MAAM,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;gBAC7C,IAAI,CAAC,MAAM,GAAG,cAAc,EAAE,CAAA;gBAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;gBACnC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAA;YACtB,CAAC,CAAC;YACF,MAAM,EAAE,KAAK,IAAI,EAAE;gBACjB,IAAI,IAAI,CAAC,OAAO;oBAAE,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAA;;oBAClD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBAC5B,OAAO,IAAI,CAAC,MAAM,EAAE,CAAA;YACtB,CAAC;SACF,CAAA;IACH,CAAC;IAEO,SAAS,CAAI,MAAwB;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACjD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC7C,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAED,sDAAsD;AACtD,MAAM,UAAU,cAAc,CAAC,QAAyB;IACtD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACvC,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,KAAK,CAAA;IACtC,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC/D,CAAC"}
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"}
package/locales/en.json CHANGED
@@ -1,20 +1,29 @@
1
1
  {
2
- "nav": { "title": "Device agent" },
2
+ "nav": {
3
+ "title": "Device agent"
4
+ },
3
5
  "page": {
4
6
  "title": "Device agent",
5
- "subtitle": "Let this computer take tasks from task chains and run CLIs such as Codex and Claude locally."
7
+ "subtitle": "Let computers take tasks from task chains: enable this one with one click, connect others with one command."
8
+ },
9
+ "common": {
10
+ "copy": "Copy",
11
+ "copied": "Copied",
12
+ "checking": "Checking the local service…"
13
+ },
14
+ "error": {
15
+ "offline": "Can't reach the local service. Make sure toc-ocra is running."
6
16
  },
7
- "common": { "copy": "Copy", "copied": "Copied", "checking": "Checking the local service…" },
8
- "error": { "offline": "Can't reach the local service. Make sure toc-ocra is running." },
9
17
  "health": {
10
18
  "online": "Online: {{name}}",
11
19
  "disconnected": "Bound, but the server is not reachable right now",
12
20
  "unpaired": "Local service running, not bound to a server yet",
13
- "offline": "Local service not running"
21
+ "offline": "Local service not running",
22
+ "disabled": "The local device agent is off"
14
23
  },
15
24
  "offline": {
16
25
  "title": "Local service not running",
17
- "body": "The plugin talks to the local toc-ocra service at {{url}}. Start it in a terminal; the plugin never launches programs for you.",
26
+ "body": "The plugin talks to the local toc-ocra service at {{url}}. This desktop app version cannot start it for you, so start it in a terminal; after updating the app you can switch it on here.",
18
27
  "once": "Run once (stops when the terminal closes)",
19
28
  "service": "For everyday use: install it as a background service that starts at login",
20
29
  "node": "Requires Node.js 20 or newer. This page refreshes on its own once the service is up."
@@ -38,7 +47,12 @@
38
47
  "tokenFromEnv": "The device token comes from the TOC_OCRA_TOKEN environment variable, so binding can't be changed here.",
39
48
  "unpair": "Unbind"
40
49
  },
41
- "binding": { "unpaired": "Not bound", "revoked": "Credentials revoked", "online": "Online", "connecting": "Connecting" },
50
+ "binding": {
51
+ "unpaired": "Not bound",
52
+ "revoked": "Credentials revoked",
53
+ "online": "Online",
54
+ "connecting": "Connecting"
55
+ },
42
56
  "bind": {
43
57
  "title": "Bind to the current server",
44
58
  "rebindTitle": "Bind again",
@@ -56,12 +70,75 @@
56
70
  "noServer": "The server address is missing.",
57
71
  "done": "This computer is now bound to {{server}}"
58
72
  },
59
- "auto": { "done": "Switched to {{server}} automatically (device: {{device}})", "deferred": "Tasks are running; this computer switches to {{server}} when they finish" },
73
+ "auto": {
74
+ "done": "Switched to {{server}} automatically (device: {{device}})",
75
+ "deferred": "Tasks are running; this computer switches to {{server}} when they finish"
76
+ },
60
77
  "cli": {
61
78
  "title": "CLIs on this computer",
62
79
  "runnable": "Runnable",
63
80
  "detectOnly": "Detected only",
64
81
  "none": "No usable CLI detected.",
65
82
  "redetect": "Detect again"
83
+ },
84
+ "tabs": {
85
+ "local": "This computer",
86
+ "remote": "Other computers"
87
+ },
88
+ "service": {
89
+ "title": "Local device agent",
90
+ "onBody": "On: this computer takes tasks from task chains and runs CLIs such as Codex and Claude locally.",
91
+ "offBody": "Turn it on and the desktop app starts the device agent on this computer and binds it to the current server. No terminal needed.",
92
+ "followsApp": "The agent follows the desktop app: it starts with the app and stops when the app quits (it shows offline about 90 seconds later).",
93
+ "starting": "Starting the local device agent…",
94
+ "onExternalBody": "Enabled: the device agent on this computer is already running (a background service or toc-ocra started in a terminal). It receives task-chain work and runs Codex, Claude and other CLIs here.",
95
+ "external": "Connected to the agent already running on this computer instead of starting another. It does not stop when the desktop app quits; to turn it off run toc-ocra service:uninstall in a terminal (or stop the toc-ocra you started).",
96
+ "portTaken": "The local service port is used by another program, so the desktop app cannot start the device agent.",
97
+ "crashed": "The device agent stopped unexpectedly: {{error}}"
98
+ },
99
+ "remote": {
100
+ "title": "Install on another computer",
101
+ "body": "A Linux server, another Mac or a Windows PC: generate one command and run it in that computer's terminal. It installs, pairs and sets up the background service, and this page shows the match when it is done.",
102
+ "server": "Server address that computer uses",
103
+ "serverInvalid": "The server address is invalid. Use an address starting with http:// or https://.",
104
+ "loopback": "127.0.0.1 / localhost only works on this computer. Other computers cannot reach it; use this server's LAN or public address.",
105
+ "add": "Add a computer",
106
+ "platformLabel": "System",
107
+ "platform": {
108
+ "linux": "Linux server",
109
+ "mac": "macOS",
110
+ "win": "Windows"
111
+ },
112
+ "name": "Device name",
113
+ "namePlaceholder": "e.g. Test server",
114
+ "generate": "Generate install command",
115
+ "working": "Generating…",
116
+ "cancel": "Cancel",
117
+ "pendingTitle": "Run on \"{{name}}\"",
118
+ "pendingBody": "Copy this command and run it in that computer's terminal:",
119
+ "hintNode": "Requires Node.js 20 or newer.",
120
+ "hintLinux": "If npm reports a permission error, prefix npm install with sudo (or use Node from nvm). To stay online after logging out, run loginctl enable-linger \"$USER\" once.",
121
+ "hintWindows": "Run it in PowerShell.",
122
+ "expires": "The pairing code expires in {{minutes}}:{{seconds}} and works once.",
123
+ "expired": "The pairing code expired. Generate a new one.",
124
+ "waiting": "Waiting for that computer to run the command… This updates on its own.",
125
+ "regenerate": "Generate again",
126
+ "matched": "Matched",
127
+ "matchedBody": "\"{{name}}\" is online and ready to use in workstations.",
128
+ "matchedNotice": "\"{{name}}\" is online",
129
+ "done": "Done",
130
+ "listTitle": "My other computers",
131
+ "empty": "No other computers yet.",
132
+ "install": "Generate install command",
133
+ "repair": "Pair again",
134
+ "enabled": "Take tasks",
135
+ "disableHint": "Turning off \"Take tasks\" disables the device: the pairing is kept, no tasks are sent, and turning it back on restores it right away without touching that computer.",
136
+ "uninstall": "To uninstall completely, run on that computer",
137
+ "status": {
138
+ "online": "Online",
139
+ "offline": "Offline",
140
+ "disabled": "Disabled",
141
+ "notConnected": "Not paired"
142
+ }
66
143
  }
67
144
  }