@yefengr/remote-pi 0.7.16 → 0.8.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 +4 -4
- 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/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"}
|