@yefengr/remote-pi 0.7.16 → 0.9.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/README.md +44 -95
- package/dist/actions/handlers.js +1 -1
- package/dist/actions/handlers.js.map +1 -1
- package/dist/actions/registry.d.ts +1 -1
- package/dist/actions/registry.js +1 -1
- package/dist/{daemon/commands.d.ts → commands.d.ts} +3 -4
- package/dist/{daemon/commands.js → commands.js} +8 -151
- package/dist/commands.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +20 -38
- package/dist/index.js.map +1 -1
- package/dist/pairing/storage.js +4 -4
- package/dist/pairing/storage.js.map +1 -1
- package/dist/protocol/v2/schemas.d.ts +64 -7
- package/dist/protocol/v2/schemas.js +6 -3
- package/dist/protocol/v2/schemas.js.map +1 -1
- package/dist/session/local_config.d.ts +0 -5
- package/dist/session/local_config.js +6 -29
- package/dist/session/local_config.js.map +1 -1
- package/dist/timeline/history.d.ts +3 -6
- package/dist/timeline/history.js +113 -249
- package/dist/timeline/history.js.map +1 -1
- package/dist/timeline/runtime.js +29 -37
- package/dist/timeline/runtime.js.map +1 -1
- package/dist/timeline/sequence.d.ts +7 -0
- package/dist/timeline/sequence.js +16 -0
- package/dist/timeline/sequence.js.map +1 -0
- package/dist/timeline/v2_service.js +3 -1
- package/dist/timeline/v2_service.js.map +1 -1
- package/dist/transport/relay_client.js.map +1 -1
- package/package.json +1 -8
- package/dist/bin/supervisord.d.ts +0 -2
- package/dist/bin/supervisord.js +0 -78
- package/dist/bin/supervisord.js.map +0 -1
- package/dist/daemon/cli-links.d.ts +0 -30
- package/dist/daemon/cli-links.js +0 -134
- package/dist/daemon/cli-links.js.map +0 -1
- package/dist/daemon/client.d.ts +0 -20
- package/dist/daemon/client.js +0 -131
- package/dist/daemon/client.js.map +0 -1
- package/dist/daemon/commands.js.map +0 -1
- package/dist/daemon/control_protocol.d.ts +0 -198
- package/dist/daemon/control_protocol.js +0 -40
- package/dist/daemon/control_protocol.js.map +0 -1
- package/dist/daemon/cron_log.d.ts +0 -24
- package/dist/daemon/cron_log.js +0 -57
- package/dist/daemon/cron_log.js.map +0 -1
- package/dist/daemon/cron_registry.d.ts +0 -43
- package/dist/daemon/cron_registry.js +0 -149
- package/dist/daemon/cron_registry.js.map +0 -1
- package/dist/daemon/install-runtime.d.ts +0 -10
- package/dist/daemon/install-runtime.js +0 -81
- package/dist/daemon/install-runtime.js.map +0 -1
- package/dist/daemon/install.d.ts +0 -110
- package/dist/daemon/install.js +0 -263
- package/dist/daemon/install.js.map +0 -1
- package/dist/daemon/registry.d.ts +0 -51
- package/dist/daemon/registry.js +0 -207
- package/dist/daemon/registry.js.map +0 -1
- package/dist/daemon/rpc_child.d.ts +0 -135
- package/dist/daemon/rpc_child.js +0 -472
- package/dist/daemon/rpc_child.js.map +0 -1
- package/dist/daemon/status.d.ts +0 -45
- package/dist/daemon/status.js +0 -87
- package/dist/daemon/status.js.map +0 -1
- package/dist/daemon/supervisor-ipc.d.ts +0 -2
- package/dist/daemon/supervisor-ipc.js +0 -20
- package/dist/daemon/supervisor-ipc.js.map +0 -1
- package/dist/daemon/supervisor.d.ts +0 -70
- package/dist/daemon/supervisor.js +0 -637
- package/dist/daemon/supervisor.js.map +0 -1
- package/dist/session/ipc.d.ts +0 -6
- package/dist/session/ipc.js +0 -15
- package/dist/session/ipc.js.map +0 -1
- package/docs/daemon.md +0 -175
- package/service-templates/launchd.plist.template +0 -35
- package/service-templates/systemd.service.template +0 -19
- package/service-templates/task-launcher.vbs.template +0 -10
- package/service-templates/task-scheduler.xml.template +0 -38
package/dist/daemon/cli-links.js
DELETED
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { delimiter, join } from "node:path";
|
|
2
|
-
import { chmodSync, existsSync, lstatSync, mkdirSync, readlinkSync, symlinkSync, unlinkSync, writeFileSync } from "node:fs";
|
|
3
|
-
import { execFileSync } from "node:child_process";
|
|
4
|
-
import { homedir, platform } from "node:os";
|
|
5
|
-
import { findNodeBinary, findRemotePiScript, findSupervisorScript } from "./install.js";
|
|
6
|
-
export function userLocalBinDir(home = homedir()) {
|
|
7
|
-
return join(home, ".local", "bin");
|
|
8
|
-
}
|
|
9
|
-
export function isOnPath(dir, envPath = process.env["PATH"] ?? "") {
|
|
10
|
-
const target = dir.replace(/\/+$/, "");
|
|
11
|
-
return envPath.split(delimiter).some((entry) => entry.replace(/\/+$/, "") === target);
|
|
12
|
-
}
|
|
13
|
-
export function linkCliBinaries(home = homedir(), paths = {}, opts = {}) {
|
|
14
|
-
const binDir = userLocalBinDir(home);
|
|
15
|
-
if (platform() === "win32")
|
|
16
|
-
return linkCliBinariesWindows(binDir, paths, opts);
|
|
17
|
-
const log = [];
|
|
18
|
-
mkdirSync(binDir, { recursive: true });
|
|
19
|
-
log.push(`ensured ${binDir}`);
|
|
20
|
-
const remotePi = paths.remotePi ?? findRemotePiScript();
|
|
21
|
-
const supervisord = paths.supervisord ?? findSupervisorScript();
|
|
22
|
-
assertScriptsExist(remotePi, supervisord);
|
|
23
|
-
try {
|
|
24
|
-
chmodSync(remotePi, 0o755);
|
|
25
|
-
}
|
|
26
|
-
catch { /* best-effort */ }
|
|
27
|
-
try {
|
|
28
|
-
chmodSync(supervisord, 0o755);
|
|
29
|
-
}
|
|
30
|
-
catch { /* best-effort */ }
|
|
31
|
-
const links = [
|
|
32
|
-
{ name: "remote-pi", path: join(binDir, "remote-pi"), target: remotePi },
|
|
33
|
-
{ name: "pi-supervisord", path: join(binDir, "pi-supervisord"), target: supervisord },
|
|
34
|
-
];
|
|
35
|
-
for (const link of links)
|
|
36
|
-
replaceSymlink(link.path, link.target, log);
|
|
37
|
-
const onPath = isOnPath(binDir);
|
|
38
|
-
if (!onPath)
|
|
39
|
-
log.push(`WARNING: ${binDir} is not on $PATH. Add this line to your shell rc: export PATH="$HOME/.local/bin:$PATH"`);
|
|
40
|
-
return { binDir, links, onPath, log };
|
|
41
|
-
}
|
|
42
|
-
function assertScriptsExist(remotePi, supervisord) {
|
|
43
|
-
if (!existsSync(remotePi))
|
|
44
|
-
throw new Error(`remote-pi script not found at ${remotePi}. Run \`pnpm build\` (dev) or reinstall the extension.`);
|
|
45
|
-
if (!existsSync(supervisord))
|
|
46
|
-
throw new Error(`supervisor script not found at ${supervisord}. Run \`pnpm build\` (dev) or reinstall the extension.`);
|
|
47
|
-
}
|
|
48
|
-
function linkCliBinariesWindows(binDir, paths, opts) {
|
|
49
|
-
const log = [];
|
|
50
|
-
mkdirSync(binDir, { recursive: true });
|
|
51
|
-
log.push(`ensured ${binDir}`);
|
|
52
|
-
const node = opts.node ?? findNodeBinary();
|
|
53
|
-
const remotePi = paths.remotePi ?? findRemotePiScript();
|
|
54
|
-
const supervisord = paths.supervisord ?? findSupervisorScript();
|
|
55
|
-
assertScriptsExist(remotePi, supervisord);
|
|
56
|
-
const links = [
|
|
57
|
-
{ name: "remote-pi.cmd", path: join(binDir, "remote-pi.cmd"), target: remotePi },
|
|
58
|
-
{ name: "pi-supervisord.cmd", path: join(binDir, "pi-supervisord.cmd"), target: supervisord },
|
|
59
|
-
];
|
|
60
|
-
for (const link of links) {
|
|
61
|
-
writeFileSync(link.path, buildCmdShim(node, link.target));
|
|
62
|
-
log.push(`wrote ${link.path}`);
|
|
63
|
-
}
|
|
64
|
-
const onPath = isOnPath(binDir);
|
|
65
|
-
if (!onPath && opts.mutatePath !== false) {
|
|
66
|
-
try {
|
|
67
|
-
addUserPath(binDir);
|
|
68
|
-
log.push(`added ${binDir} to your user PATH — open a NEW terminal for \`remote-pi\` to resolve.`);
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
log.push(`WARNING: ${binDir} is not on PATH and auto-add failed (${String(error)}). Add it manually: setx PATH "%PATH%;${binDir}"`);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return { binDir, links, onPath, log };
|
|
75
|
-
}
|
|
76
|
-
export function buildCmdShim(node, target) {
|
|
77
|
-
return `@echo off\r\n"${node}" "${target}" %*\r\n`;
|
|
78
|
-
}
|
|
79
|
-
function addUserPath(dir) {
|
|
80
|
-
const literal = `'${dir.replace(/'/g, "''")}'`;
|
|
81
|
-
execFileSync("powershell", [
|
|
82
|
-
"-NoProfile", "-NonInteractive", "-Command",
|
|
83
|
-
`$d = ${literal}; ` +
|
|
84
|
-
"$p = [Environment]::GetEnvironmentVariable('Path','User'); " +
|
|
85
|
-
"if (-not $p) { $p = '' }; " +
|
|
86
|
-
"$parts = $p.Split(';') | Where-Object { $_ -ne '' }; " +
|
|
87
|
-
"if ($parts -notcontains $d) { [Environment]::SetEnvironmentVariable('Path', (($parts + $d) -join ';'), 'User') }",
|
|
88
|
-
], { stdio: ["ignore", "pipe", "pipe"] });
|
|
89
|
-
}
|
|
90
|
-
export function unlinkCliBinaries(home = homedir()) {
|
|
91
|
-
const binDir = userLocalBinDir(home);
|
|
92
|
-
const log = [];
|
|
93
|
-
const names = platform() === "win32" ? ["remote-pi.cmd", "pi-supervisord.cmd"] : ["remote-pi", "pi-supervisord"];
|
|
94
|
-
const removed = [];
|
|
95
|
-
for (const name of names) {
|
|
96
|
-
const path = join(binDir, name);
|
|
97
|
-
let existed = false;
|
|
98
|
-
try {
|
|
99
|
-
lstatSync(path);
|
|
100
|
-
existed = true;
|
|
101
|
-
}
|
|
102
|
-
catch { /* absent */ }
|
|
103
|
-
if (existed) {
|
|
104
|
-
try {
|
|
105
|
-
unlinkSync(path);
|
|
106
|
-
log.push(`removed ${path}`);
|
|
107
|
-
}
|
|
108
|
-
catch (error) {
|
|
109
|
-
log.push(`failed to remove ${path}: ${String(error)}`);
|
|
110
|
-
existed = false;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
removed.push({ name, path, existed });
|
|
114
|
-
}
|
|
115
|
-
return { binDir, removed, log };
|
|
116
|
-
}
|
|
117
|
-
function replaceSymlink(linkPath, target, log) {
|
|
118
|
-
let existing = null;
|
|
119
|
-
try {
|
|
120
|
-
existing = readlinkSync(linkPath);
|
|
121
|
-
}
|
|
122
|
-
catch { /* not a symlink */ }
|
|
123
|
-
if (existing === target) {
|
|
124
|
-
log.push(`symlink ${linkPath} → ${target} (unchanged)`);
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
try {
|
|
128
|
-
unlinkSync(linkPath);
|
|
129
|
-
}
|
|
130
|
-
catch { /* absent */ }
|
|
131
|
-
symlinkSync(target, linkPath);
|
|
132
|
-
log.push(`symlink ${linkPath} → ${target}`);
|
|
133
|
-
}
|
|
134
|
-
//# sourceMappingURL=cli-links.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-links.js","sourceRoot":"","sources":["../../src/daemon/cli-links.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/client.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { type ControlReplyFor, type ControlRequest } from "./control_protocol.js";
|
|
2
|
-
export declare class SupervisorOfflineError extends Error {
|
|
3
|
-
readonly sockPath: string;
|
|
4
|
-
constructor(sockPath: string);
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* Sends a single request and returns the typed reply data.
|
|
8
|
-
*
|
|
9
|
-
* Throws:
|
|
10
|
-
* - `SupervisorOfflineError` when the supervisor isn't reachable.
|
|
11
|
-
* - `Error` from `parseReply` when the reply line is malformed.
|
|
12
|
-
* - The supervisor's own error string when `ok: false`.
|
|
13
|
-
*/
|
|
14
|
-
export declare function callSupervisor<Op extends ControlRequest["op"]>(req: Extract<ControlRequest, {
|
|
15
|
-
op: Op;
|
|
16
|
-
}>): Promise<ControlReplyFor<Op>>;
|
|
17
|
-
/** Returns true when the supervisor is reachable. Used by `/remote-pi
|
|
18
|
-
* daemons` to decide whether to query runtime state or fall back to
|
|
19
|
-
* registry-only listing. */
|
|
20
|
-
export declare function supervisorOnline(): Promise<boolean>;
|
package/dist/daemon/client.js
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import { existsSync } from "node:fs";
|
|
2
|
-
import { createConnection } from "node:net";
|
|
3
|
-
import { encodeRequest, parseReply, } from "./control_protocol.js";
|
|
4
|
-
import { getSupervisorSockPath } from "./supervisor.js";
|
|
5
|
-
import { usesNamedPipe } from "../session/ipc.js";
|
|
6
|
-
/**
|
|
7
|
-
* Tiny client for the `remote-pi` CLI to call the supervisor over the
|
|
8
|
-
* `~/.pi/remote/supervisor.sock` UDS.
|
|
9
|
-
*
|
|
10
|
-
* Each call opens a fresh connection, sends one request line, reads one
|
|
11
|
-
* reply line, closes. No connection pooling — the CLI is short-lived,
|
|
12
|
-
* latency is dominated by the socket round-trip (<1ms).
|
|
13
|
-
*
|
|
14
|
-
* `SupervisorOfflineError` is the common error: thrown when the socket
|
|
15
|
-
* file is missing OR the connect fails (no listener). The CLI handler
|
|
16
|
-
* formats it as a friendly "Run `remote-pi install` first" message.
|
|
17
|
-
*/
|
|
18
|
-
const CONNECT_TIMEOUT_MS = 1000;
|
|
19
|
-
const REPLY_TIMEOUT_MS = 5000;
|
|
20
|
-
export class SupervisorOfflineError extends Error {
|
|
21
|
-
sockPath;
|
|
22
|
-
constructor(sockPath) {
|
|
23
|
-
super(`Supervisor is not running. UDS not responding at ${sockPath}.\n` +
|
|
24
|
-
"Run `remote-pi install` to set it up, or start it manually with `pi-supervisord`.");
|
|
25
|
-
this.sockPath = sockPath;
|
|
26
|
-
this.name = "SupervisorOfflineError";
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Sends a single request and returns the typed reply data.
|
|
31
|
-
*
|
|
32
|
-
* Throws:
|
|
33
|
-
* - `SupervisorOfflineError` when the supervisor isn't reachable.
|
|
34
|
-
* - `Error` from `parseReply` when the reply line is malformed.
|
|
35
|
-
* - The supervisor's own error string when `ok: false`.
|
|
36
|
-
*/
|
|
37
|
-
export async function callSupervisor(req) {
|
|
38
|
-
const sockPath = getSupervisorSockPath();
|
|
39
|
-
// POSIX fast-fail on a missing socket file. Windows pipes have no file —
|
|
40
|
-
// skip the check and let `_connect` fail fast if the pipe isn't there.
|
|
41
|
-
if (!usesNamedPipe() && !existsSync(sockPath))
|
|
42
|
-
throw new SupervisorOfflineError(sockPath);
|
|
43
|
-
const sock = await _connect(sockPath);
|
|
44
|
-
try {
|
|
45
|
-
sock.write(encodeRequest(req));
|
|
46
|
-
const line = await _readLine(sock);
|
|
47
|
-
const reply = parseReply(line);
|
|
48
|
-
if (!reply.ok)
|
|
49
|
-
throw new Error(reply.error);
|
|
50
|
-
return reply.data;
|
|
51
|
-
}
|
|
52
|
-
finally {
|
|
53
|
-
sock.destroy();
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/** Returns true when the supervisor is reachable. Used by `/remote-pi
|
|
57
|
-
* daemons` to decide whether to query runtime state or fall back to
|
|
58
|
-
* registry-only listing. */
|
|
59
|
-
export async function supervisorOnline() {
|
|
60
|
-
const sockPath = getSupervisorSockPath();
|
|
61
|
-
if (!usesNamedPipe() && !existsSync(sockPath))
|
|
62
|
-
return false;
|
|
63
|
-
try {
|
|
64
|
-
const sock = await _connect(sockPath);
|
|
65
|
-
sock.destroy();
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
return false;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
// ── internals ───────────────────────────────────────────────────────────────
|
|
73
|
-
function _connect(sockPath) {
|
|
74
|
-
return new Promise((resolve, reject) => {
|
|
75
|
-
const sock = createConnection({ path: sockPath });
|
|
76
|
-
let settled = false;
|
|
77
|
-
const timer = setTimeout(() => {
|
|
78
|
-
if (settled)
|
|
79
|
-
return;
|
|
80
|
-
settled = true;
|
|
81
|
-
sock.destroy();
|
|
82
|
-
reject(new SupervisorOfflineError(sockPath));
|
|
83
|
-
}, CONNECT_TIMEOUT_MS);
|
|
84
|
-
sock.once("connect", () => {
|
|
85
|
-
if (settled)
|
|
86
|
-
return;
|
|
87
|
-
settled = true;
|
|
88
|
-
clearTimeout(timer);
|
|
89
|
-
sock.setEncoding("utf8");
|
|
90
|
-
resolve(sock);
|
|
91
|
-
});
|
|
92
|
-
sock.once("error", () => {
|
|
93
|
-
if (settled)
|
|
94
|
-
return;
|
|
95
|
-
settled = true;
|
|
96
|
-
clearTimeout(timer);
|
|
97
|
-
reject(new SupervisorOfflineError(sockPath));
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
function _readLine(sock) {
|
|
102
|
-
return new Promise((resolve, reject) => {
|
|
103
|
-
let buf = "";
|
|
104
|
-
const timer = setTimeout(() => {
|
|
105
|
-
reject(new Error("supervisor reply timeout"));
|
|
106
|
-
sock.destroy();
|
|
107
|
-
}, REPLY_TIMEOUT_MS);
|
|
108
|
-
sock.on("data", (chunk) => {
|
|
109
|
-
buf += chunk;
|
|
110
|
-
const nl = buf.indexOf("\n");
|
|
111
|
-
if (nl >= 0) {
|
|
112
|
-
clearTimeout(timer);
|
|
113
|
-
resolve(buf.slice(0, nl));
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
sock.on("end", () => {
|
|
117
|
-
clearTimeout(timer);
|
|
118
|
-
const nl = buf.indexOf("\n");
|
|
119
|
-
if (nl >= 0)
|
|
120
|
-
return resolve(buf.slice(0, nl));
|
|
121
|
-
if (buf.length > 0)
|
|
122
|
-
return resolve(buf);
|
|
123
|
-
reject(new Error("supervisor closed connection without replying"));
|
|
124
|
-
});
|
|
125
|
-
sock.on("error", (err) => {
|
|
126
|
-
clearTimeout(timer);
|
|
127
|
-
reject(err);
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
//# sourceMappingURL=client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/daemon/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
import type { CronJob } from "./cron_registry.js";
|
|
2
|
-
import type { CronLogEntry } from "./cron_log.js";
|
|
3
|
-
/** Legacy CLI summary; new callers should use the orthogonal fields on DaemonInfo. */
|
|
4
|
-
export type DaemonState = "stopped" | "starting" | "running" | "crashed" | "blocked";
|
|
5
|
-
export type RegistrationState = "registered" | "missing";
|
|
6
|
-
export type DesiredState = "running" | "stopped";
|
|
7
|
-
export type ProcessState = "absent" | "spawning" | "running" | "exited";
|
|
8
|
-
export type RuntimeState = "pending" | "ready" | "failed";
|
|
9
|
-
export type RelayState = "disconnected" | "connecting" | "connected" | "reconnecting";
|
|
10
|
-
export type HealthState = "stopped" | "starting" | "healthy" | "degraded" | "failed" | "blocked";
|
|
11
|
-
/**
|
|
12
|
-
* Status output keeps registration, desired lifecycle, OS process, RPC runtime,
|
|
13
|
-
* relay connectivity and derived health separate. `id` / `state` are retained
|
|
14
|
-
* only for the current CLI consumers while they are migrated.
|
|
15
|
-
*/
|
|
16
|
-
export interface DaemonInfo {
|
|
17
|
-
daemon_id: string;
|
|
18
|
-
/** Compatibility alias for daemon_id. */
|
|
19
|
-
id: string;
|
|
20
|
-
endpoint_id: string;
|
|
21
|
-
runtime_instance_id?: string;
|
|
22
|
-
registration: RegistrationState;
|
|
23
|
-
desired: DesiredState;
|
|
24
|
-
process: ProcessState;
|
|
25
|
-
runtime: RuntimeState;
|
|
26
|
-
relay: RelayState;
|
|
27
|
-
health: HealthState;
|
|
28
|
-
/** Compatibility summary; never use it to infer health. */
|
|
29
|
-
state: DaemonState;
|
|
30
|
-
cwd: string;
|
|
31
|
-
name: string;
|
|
32
|
-
kind: "daemon";
|
|
33
|
-
pid?: number;
|
|
34
|
-
started_at?: number;
|
|
35
|
-
uptime?: number;
|
|
36
|
-
/** Compatibility alias for uptime (seconds). */
|
|
37
|
-
uptime_s?: number;
|
|
38
|
-
restart_count: number;
|
|
39
|
-
startup_stage: string;
|
|
40
|
-
last_error_code?: string;
|
|
41
|
-
last_error_message?: string;
|
|
42
|
-
last_error_at?: number;
|
|
43
|
-
retrying: boolean;
|
|
44
|
-
next_retry_at?: number;
|
|
45
|
-
/** Compatibility alias for relay. */
|
|
46
|
-
relay_state: RelayState;
|
|
47
|
-
}
|
|
48
|
-
export type ControlRequest = {
|
|
49
|
-
op: "list";
|
|
50
|
-
} | {
|
|
51
|
-
op: "status";
|
|
52
|
-
} | {
|
|
53
|
-
op: "start_all";
|
|
54
|
-
} | {
|
|
55
|
-
op: "start";
|
|
56
|
-
id: string;
|
|
57
|
-
} | {
|
|
58
|
-
op: "stop_all";
|
|
59
|
-
} | {
|
|
60
|
-
op: "stop";
|
|
61
|
-
id: string;
|
|
62
|
-
} | {
|
|
63
|
-
op: "restart_all";
|
|
64
|
-
} | {
|
|
65
|
-
op: "restart";
|
|
66
|
-
id: string;
|
|
67
|
-
} | {
|
|
68
|
-
op: "send";
|
|
69
|
-
id: string;
|
|
70
|
-
text: string;
|
|
71
|
-
} | {
|
|
72
|
-
op: "register";
|
|
73
|
-
cwd: string;
|
|
74
|
-
} | {
|
|
75
|
-
op: "unregister";
|
|
76
|
-
id: string;
|
|
77
|
-
} | {
|
|
78
|
-
op: "unregister_cwd";
|
|
79
|
-
cwd: string;
|
|
80
|
-
} | {
|
|
81
|
-
op: "cron_add";
|
|
82
|
-
daemon_id: string;
|
|
83
|
-
schedule: string;
|
|
84
|
-
prompt: string;
|
|
85
|
-
tz?: string;
|
|
86
|
-
skip_if_busy?: boolean;
|
|
87
|
-
catchup?: boolean;
|
|
88
|
-
} | {
|
|
89
|
-
op: "cron_list";
|
|
90
|
-
} | {
|
|
91
|
-
op: "cron_remove";
|
|
92
|
-
job_id: string;
|
|
93
|
-
} | {
|
|
94
|
-
op: "cron_enable";
|
|
95
|
-
job_id: string;
|
|
96
|
-
enabled: boolean;
|
|
97
|
-
} | {
|
|
98
|
-
op: "cron_run";
|
|
99
|
-
job_id: string;
|
|
100
|
-
} | {
|
|
101
|
-
op: "cron_log";
|
|
102
|
-
job_id?: string;
|
|
103
|
-
tail?: number;
|
|
104
|
-
};
|
|
105
|
-
export type ControlReply<T = unknown> = {
|
|
106
|
-
ok: true;
|
|
107
|
-
data?: T;
|
|
108
|
-
} | {
|
|
109
|
-
ok: false;
|
|
110
|
-
error: string;
|
|
111
|
-
};
|
|
112
|
-
export interface ControlReplyShapes {
|
|
113
|
-
list: {
|
|
114
|
-
daemons: DaemonInfo[];
|
|
115
|
-
};
|
|
116
|
-
status: {
|
|
117
|
-
daemons: DaemonInfo[];
|
|
118
|
-
};
|
|
119
|
-
start_all: {
|
|
120
|
-
started: string[];
|
|
121
|
-
already_running: string[];
|
|
122
|
-
};
|
|
123
|
-
start: {
|
|
124
|
-
id: string;
|
|
125
|
-
state: DaemonState;
|
|
126
|
-
started: boolean;
|
|
127
|
-
desired_state: DesiredState;
|
|
128
|
-
};
|
|
129
|
-
stop_all: {
|
|
130
|
-
stopped: string[];
|
|
131
|
-
already_stopped: string[];
|
|
132
|
-
};
|
|
133
|
-
stop: {
|
|
134
|
-
id: string;
|
|
135
|
-
state: DaemonState;
|
|
136
|
-
stopped: boolean;
|
|
137
|
-
desired_state: DesiredState;
|
|
138
|
-
};
|
|
139
|
-
restart_all: {
|
|
140
|
-
restarted: string[];
|
|
141
|
-
};
|
|
142
|
-
restart: {
|
|
143
|
-
id: string;
|
|
144
|
-
state: DaemonState;
|
|
145
|
-
restarted: boolean;
|
|
146
|
-
desired_state: DesiredState;
|
|
147
|
-
};
|
|
148
|
-
send: {
|
|
149
|
-
id: string;
|
|
150
|
-
accepted: boolean;
|
|
151
|
-
delivered: boolean;
|
|
152
|
-
code?: string;
|
|
153
|
-
error?: string;
|
|
154
|
-
};
|
|
155
|
-
register: {
|
|
156
|
-
id: string;
|
|
157
|
-
cwd: string;
|
|
158
|
-
name: string;
|
|
159
|
-
desired_state: DesiredState;
|
|
160
|
-
};
|
|
161
|
-
unregister: {
|
|
162
|
-
removed: boolean;
|
|
163
|
-
cwd?: string;
|
|
164
|
-
};
|
|
165
|
-
unregister_cwd: {
|
|
166
|
-
removed: boolean;
|
|
167
|
-
cwd?: string;
|
|
168
|
-
};
|
|
169
|
-
cron_add: {
|
|
170
|
-
job: CronJobView;
|
|
171
|
-
};
|
|
172
|
-
cron_list: {
|
|
173
|
-
jobs: CronJobView[];
|
|
174
|
-
};
|
|
175
|
-
cron_remove: {
|
|
176
|
-
removed: boolean;
|
|
177
|
-
};
|
|
178
|
-
cron_enable: {
|
|
179
|
-
job_id: string;
|
|
180
|
-
enabled: boolean;
|
|
181
|
-
updated: boolean;
|
|
182
|
-
};
|
|
183
|
-
cron_run: {
|
|
184
|
-
job_id: string;
|
|
185
|
-
result: string;
|
|
186
|
-
};
|
|
187
|
-
cron_log: {
|
|
188
|
-
entries: CronLogEntry[];
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
export type CronJobView = CronJob & {
|
|
192
|
-
next_run?: string | null;
|
|
193
|
-
};
|
|
194
|
-
export type ControlReplyFor<Op extends ControlRequest["op"]> = Op extends keyof ControlReplyShapes ? ControlReplyShapes[Op] : never;
|
|
195
|
-
export declare function encodeRequest(req: ControlRequest): string;
|
|
196
|
-
export declare function encodeReply<T>(reply: ControlReply<T>): string;
|
|
197
|
-
export declare function parseRequest(line: string): ControlRequest;
|
|
198
|
-
export declare function parseReply(line: string): ControlReply<unknown>;
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
const TRAILING_NEWLINE = "\n";
|
|
2
|
-
export function encodeRequest(req) {
|
|
3
|
-
return JSON.stringify(req) + TRAILING_NEWLINE;
|
|
4
|
-
}
|
|
5
|
-
export function encodeReply(reply) {
|
|
6
|
-
return JSON.stringify(reply) + TRAILING_NEWLINE;
|
|
7
|
-
}
|
|
8
|
-
export function parseRequest(line) {
|
|
9
|
-
let obj;
|
|
10
|
-
try {
|
|
11
|
-
obj = JSON.parse(line);
|
|
12
|
-
}
|
|
13
|
-
catch (error) {
|
|
14
|
-
throw new Error(`malformed control request: ${error.message}`);
|
|
15
|
-
}
|
|
16
|
-
if (!obj || typeof obj !== "object" || Array.isArray(obj)) {
|
|
17
|
-
throw new Error("control request must be a JSON object");
|
|
18
|
-
}
|
|
19
|
-
if (typeof obj.op !== "string") {
|
|
20
|
-
throw new Error("control request missing string `op` field");
|
|
21
|
-
}
|
|
22
|
-
return obj;
|
|
23
|
-
}
|
|
24
|
-
export function parseReply(line) {
|
|
25
|
-
let obj;
|
|
26
|
-
try {
|
|
27
|
-
obj = JSON.parse(line);
|
|
28
|
-
}
|
|
29
|
-
catch (error) {
|
|
30
|
-
throw new Error(`malformed control reply: ${error.message}`);
|
|
31
|
-
}
|
|
32
|
-
if (!obj || typeof obj !== "object" || Array.isArray(obj)) {
|
|
33
|
-
throw new Error("control reply must be a JSON object");
|
|
34
|
-
}
|
|
35
|
-
if (typeof obj.ok !== "boolean") {
|
|
36
|
-
throw new Error("control reply missing boolean `ok` field");
|
|
37
|
-
}
|
|
38
|
-
return obj;
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=control_protocol.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"control_protocol.js","sourceRoot":"","sources":["../../src/daemon/control_protocol.ts"],"names":[],"mappings":"AAmGA,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,MAAM,UAAU,aAAa,CAAC,GAAmB;IAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,WAAW,CAAI,KAAsB;IACnD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;IAC/B,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,8BAA+B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,CAAC;IAC5F,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,OAAQ,GAAwB,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,GAAqB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;IAC/B,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,4BAA6B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,CAAC;IAC1F,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,OAAQ,GAAwB,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,GAA4B,CAAC;AACtC,CAAC"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/** Every result documents a gate decision or the RPC acceptance outcome. */
|
|
2
|
-
export type CronResult = "accepted" | "rejected" | "skipped_busy" | "skipped_disabled" | "skipped_missing" | "skipped_desired_stopped" | "skipped_starting" | "skipped_retrying" | "skipped_failed" | "skipped_blocked";
|
|
3
|
-
export interface CronLogEntry {
|
|
4
|
-
ts: number;
|
|
5
|
-
job_id: string;
|
|
6
|
-
daemon_id: string;
|
|
7
|
-
schedule: string;
|
|
8
|
-
fired: boolean;
|
|
9
|
-
result: CronResult;
|
|
10
|
-
prompt_preview: string;
|
|
11
|
-
}
|
|
12
|
-
export declare function cronLogPath(): string;
|
|
13
|
-
export declare function firedFor(result: CronResult): boolean;
|
|
14
|
-
export declare function appendCronLog(entry: {
|
|
15
|
-
job_id: string;
|
|
16
|
-
daemon_id: string;
|
|
17
|
-
schedule: string;
|
|
18
|
-
result: CronResult;
|
|
19
|
-
prompt: string;
|
|
20
|
-
}): void;
|
|
21
|
-
export declare function readCronLog(opts?: {
|
|
22
|
-
jobId?: string;
|
|
23
|
-
tail?: number;
|
|
24
|
-
}): CronLogEntry[];
|
package/dist/daemon/cron_log.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
2
|
-
import { homedir } from "node:os";
|
|
3
|
-
import { dirname, join } from "node:path";
|
|
4
|
-
const PREVIEW_LEN = 80;
|
|
5
|
-
function logPath() {
|
|
6
|
-
const root = process.env["REMOTE_PI_HOME"] || homedir();
|
|
7
|
-
return join(root, ".pi", "remote", "cron.jsonl");
|
|
8
|
-
}
|
|
9
|
-
export function cronLogPath() { return logPath(); }
|
|
10
|
-
export function firedFor(result) { return result === "accepted"; }
|
|
11
|
-
export function appendCronLog(entry) {
|
|
12
|
-
const line = JSON.stringify({
|
|
13
|
-
ts: Date.now(),
|
|
14
|
-
job_id: entry.job_id,
|
|
15
|
-
daemon_id: entry.daemon_id,
|
|
16
|
-
schedule: entry.schedule,
|
|
17
|
-
fired: firedFor(entry.result),
|
|
18
|
-
result: entry.result,
|
|
19
|
-
prompt_preview: entry.prompt.slice(0, PREVIEW_LEN),
|
|
20
|
-
}) + "\n";
|
|
21
|
-
try {
|
|
22
|
-
mkdirSync(dirname(logPath()), { recursive: true });
|
|
23
|
-
appendFileSync(logPath(), line, "utf8");
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
// Auditing must not turn an already-completed scheduler decision into a retry.
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
export function readCronLog(opts = {}) {
|
|
30
|
-
if (!existsSync(logPath()))
|
|
31
|
-
return [];
|
|
32
|
-
let raw;
|
|
33
|
-
try {
|
|
34
|
-
raw = readFileSync(logPath(), "utf8");
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
return [];
|
|
38
|
-
}
|
|
39
|
-
const entries = [];
|
|
40
|
-
for (const line of raw.split("\n")) {
|
|
41
|
-
if (!line.trim())
|
|
42
|
-
continue;
|
|
43
|
-
try {
|
|
44
|
-
const entry = JSON.parse(line);
|
|
45
|
-
if (opts.jobId && entry.job_id !== opts.jobId)
|
|
46
|
-
continue;
|
|
47
|
-
entries.push(entry);
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
// Skip malformed historical lines.
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return opts.tail !== undefined && opts.tail >= 0 && entries.length > opts.tail
|
|
54
|
-
? entries.slice(entries.length - opts.tail)
|
|
55
|
-
: entries;
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=cron_log.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cron_log.js","sourceRoot":"","sources":["../../src/daemon/cron_log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAyB1C,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,SAAS,OAAO;IACd,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,OAAO,EAAE,CAAC;IACxD,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,WAAW,KAAa,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3D,MAAM,UAAU,QAAQ,CAAC,MAAkB,IAAa,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC;AAEvF,MAAM,UAAU,aAAa,CAAC,KAM7B;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;QACd,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;QAC7B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;KAC5B,CAAC,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,cAAc,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,+EAA+E;IACjF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAA0C,EAAE;IACtE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QAAC,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IACnE,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;YAC/C,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK;gBAAE,SAAS;YACxD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI;QAC5E,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3C,CAAC,CAAC,OAAO,CAAC;AACd,CAAC"}
|