@bytetrue/byspace 0.14.6 → 0.16.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/dist/commands/daemon/index.js +16 -0
- package/dist/commands/daemon/install-service.d.ts +15 -0
- package/dist/commands/daemon/install-service.js +69 -0
- package/dist/commands/daemon/local-daemon.d.ts +1 -0
- package/dist/commands/daemon/local-daemon.js +1 -1
- package/dist/commands/daemon/service/backend.d.ts +16 -0
- package/dist/commands/daemon/service/backend.js +50 -0
- package/dist/commands/daemon/service/launchd.d.ts +15 -0
- package/dist/commands/daemon/service/launchd.js +101 -0
- package/dist/commands/daemon/service/service-spec.d.ts +54 -0
- package/dist/commands/daemon/service/service-spec.js +95 -0
- package/dist/commands/daemon/service/service-status.d.ts +28 -0
- package/dist/commands/daemon/service/service-status.js +32 -0
- package/dist/commands/daemon/service/systemd.d.ts +22 -0
- package/dist/commands/daemon/service/systemd.js +90 -0
- package/dist/commands/daemon/service/windows-task.d.ts +12 -0
- package/dist/commands/daemon/service/windows-task.js +75 -0
- package/dist/commands/daemon/service-status.d.ts +13 -0
- package/dist/commands/daemon/service-status.js +30 -0
- package/dist/commands/daemon/uninstall-service.d.ts +11 -0
- package/dist/commands/daemon/uninstall-service.js +53 -0
- package/node_modules/@bytetrue/client/package.json +3 -3
- package/node_modules/@bytetrue/highlight/package.json +1 -1
- package/node_modules/@bytetrue/protocol/dist/generated/validation/ws-outbound.aot.js +10901 -10861
- package/node_modules/@bytetrue/protocol/dist/messages.d.ts +231 -92
- package/node_modules/@bytetrue/protocol/dist/messages.js +29 -0
- package/node_modules/@bytetrue/protocol/dist/validation/ws-outbound-schema-metadata.d.ts +44 -22
- package/node_modules/@bytetrue/protocol/package.json +1 -1
- package/node_modules/@bytetrue/relay/package.json +1 -1
- package/node_modules/@bytetrue/server/dist/server/server/byspace-env.d.ts +1 -0
- package/node_modules/@bytetrue/server/dist/server/server/byspace-env.js +9 -0
- package/node_modules/@bytetrue/server/dist/server/server/daemon-config-store.d.ts +11 -0
- package/node_modules/@bytetrue/server/dist/server/server/daemon-config-store.js +71 -1
- package/node_modules/@bytetrue/server/dist/server/server/session/daemon/daemon-service-install.d.ts +25 -0
- package/node_modules/@bytetrue/server/dist/server/server/session/daemon/daemon-service-install.js +182 -0
- package/node_modules/@bytetrue/server/dist/server/server/session/daemon/daemon-service-manager.d.ts +21 -0
- package/node_modules/@bytetrue/server/dist/server/server/session/daemon/daemon-service-manager.js +154 -0
- package/node_modules/@bytetrue/server/dist/server/server/websocket-server.js +2 -0
- package/node_modules/@bytetrue/server/dist/server/terminal/agent-hooks/pi/pi-extension.d.ts +1 -1
- package/node_modules/@bytetrue/server/dist/server/terminal/agent-hooks/pi/pi-extension.js +16 -1
- package/node_modules/@bytetrue/server/dist/server/terminal/terminal.js +6 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/_expo/static/js/web/{index-679e8946b965f52a7a27dc9c54f59a4c.js → index-eade2661e21bbc08a50d56f1c6b0917a.js} +537 -535
- package/node_modules/@bytetrue/server/dist/server/web-ui/_expo/static/js/web/index-eade2661e21bbc08a50d56f1c6b0917a.js.br +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/_expo/static/js/web/index-eade2661e21bbc08a50d56f1c6b0917a.js.gz +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/_expo/static/js/web/{indexeddb-attachment-store-d61d5dd974e90216cec99e62c343ffc7.js → indexeddb-attachment-store-a2e8491be0374dc2a52abfe002ecabe9.js} +1 -1
- package/node_modules/@bytetrue/server/dist/server/web-ui/_expo/static/js/web/{indexeddb-attachment-store-d61d5dd974e90216cec99e62c343ffc7.js.br → indexeddb-attachment-store-a2e8491be0374dc2a52abfe002ecabe9.js.br} +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-a2e8491be0374dc2a52abfe002ecabe9.js.gz +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/_expo/static/js/web/{native-file-attachment-store-df0c0ebe8d233a5a74eddb59a110f00b.js → native-file-attachment-store-6ba28513708667bbad7dd5434a0f8d5b.js} +3 -3
- package/node_modules/@bytetrue/server/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-6ba28513708667bbad7dd5434a0f8d5b.js.br +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-6ba28513708667bbad7dd5434a0f8d5b.js.gz +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/apple-touch-icon.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/assets/assets/images/favicon-dark-attention.9c2d51faf93468f68840811c0d9a8c6f.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/assets/assets/images/favicon-dark-running.a52155010955dca55546513b60bb2e2b.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/assets/assets/images/favicon-dark.ee7787d5c6bd1ad67c31b9949a832f7a.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/assets/assets/images/favicon-light-attention.9c2d51faf93468f68840811c0d9a8c6f.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/assets/assets/images/favicon-light-running.a52155010955dca55546513b60bb2e2b.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/assets/assets/images/favicon-light.ee7787d5c6bd1ad67c31b9949a832f7a.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/assets/assets/images/notification-icon.ba5a7dce236a7febe5d803b16f027b70.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/favicon.ico +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/index.html +1 -1
- package/node_modules/@bytetrue/server/dist/server/web-ui/index.html.br +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/index.html.gz +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/manifest.json +14 -2
- package/node_modules/@bytetrue/server/dist/server/web-ui/manifest.json.br +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/manifest.json.gz +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/pwa-icon-192.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/pwa-icon-512.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/pwa-maskable-192.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/pwa-maskable-512.png +0 -0
- package/node_modules/@bytetrue/server/dist/src/server/byspace-env.js +9 -0
- package/node_modules/@bytetrue/server/dist/src/server/daemon-config-store.js +71 -1
- package/node_modules/@bytetrue/server/dist/src/server/session/daemon/daemon-service-install.js +182 -0
- package/node_modules/@bytetrue/server/dist/src/server/session/daemon/daemon-service-manager.js +154 -0
- package/node_modules/@bytetrue/server/dist/src/server/session/daemon/install-origin.js +64 -0
- package/node_modules/@bytetrue/server/dist/src/server/session/daemon/npm-global-cli.js +98 -0
- package/node_modules/@bytetrue/server/dist/src/terminal/terminal.js +6 -0
- package/node_modules/@bytetrue/server/package.json +15 -5
- package/package.json +7 -7
- package/node_modules/@bytetrue/server/dist/server/web-ui/_expo/static/js/web/index-679e8946b965f52a7a27dc9c54f59a4c.js.br +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/_expo/static/js/web/index-679e8946b965f52a7a27dc9c54f59a4c.js.gz +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-d61d5dd974e90216cec99e62c343ffc7.js.gz +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-df0c0ebe8d233a5a74eddb59a110f00b.js.br +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-df0c0ebe8d233a5a74eddb59a110f00b.js.gz +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/assets/assets/images/favicon-dark-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
- package/node_modules/@bytetrue/server/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Windows scheduling backend. There is no launchd-style responsible-process Local
|
|
4
|
+
* Network gate on Windows; the value here is start-at-login plus crash recovery,
|
|
5
|
+
* not a bug fix — copy must not imply otherwise.
|
|
6
|
+
*
|
|
7
|
+
* The task runs `node.exe <runner-entry>` directly, never the `byspace.cmd` shim:
|
|
8
|
+
* the shim goes through cmd.exe, which adds parsing layers scheduled tasks handle
|
|
9
|
+
* poorly and hides the exit path.
|
|
10
|
+
*/
|
|
11
|
+
const TASK_FOLDER = "BySpace";
|
|
12
|
+
/** The scheduled task name for the daemon (folder-qualified for the API surface). */
|
|
13
|
+
export function scheduledTaskName(label) {
|
|
14
|
+
return `${TASK_FOLDER}\\${label}`;
|
|
15
|
+
}
|
|
16
|
+
/** Build the Register-ScheduledTask argument vector. Exposed for tests. */
|
|
17
|
+
export function buildRegisterArgs(spec) {
|
|
18
|
+
const action = `$action = New-ScheduledTaskAction -Execute '${spec.nodePath}' -Argument '${spec.runnerEntry} ${escapeArgs(spec.runnerArgs)}'`;
|
|
19
|
+
const trigger = "$trigger = New-ScheduledTaskTrigger -AtLogOn";
|
|
20
|
+
const settings = "$settings = New-ScheduledTaskSettingsSet -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1) -StartWhenAvailable -ExecutionTimeLimit ([TimeSpan]::Zero)";
|
|
21
|
+
const principal = "$principal = New-ScheduledTaskPrincipal -UserId ([System.Security.Principal.WindowsIdentity]::GetCurrent().Name) -LogonType Interactive";
|
|
22
|
+
const register = `Register-ScheduledTask -TaskPath '\\${TASK_FOLDER}\\' -TaskName '${spec.label}' -Action $action -Trigger $trigger -Settings $settings -Principal $principal -Force | Out-Null`;
|
|
23
|
+
const envBlock = Object.entries(spec.env)
|
|
24
|
+
.map(([key, value]) => `[Environment]::SetEnvironmentVariable('${key}', '${escapePowerShell(value)}', 'Process')`)
|
|
25
|
+
.join("; ");
|
|
26
|
+
const envSetup = envBlock ? `${envBlock}; ` : "";
|
|
27
|
+
return [
|
|
28
|
+
"-NoProfile",
|
|
29
|
+
"-NonInteractive",
|
|
30
|
+
"-Command",
|
|
31
|
+
`${action}; ${trigger}; ${settings}; ${principal}; ${envSetup}${register}`,
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
function escapeArgs(args) {
|
|
35
|
+
return args.map((arg) => arg.replace(/'/g, "''")).join(" ");
|
|
36
|
+
}
|
|
37
|
+
function escapePowerShell(value) {
|
|
38
|
+
return value.replace(/'/g, "''");
|
|
39
|
+
}
|
|
40
|
+
function powershell(args) {
|
|
41
|
+
const result = spawnSync("powershell.exe", args, { encoding: "utf8", timeout: 30000 });
|
|
42
|
+
const output = `${result.stdout ?? ""}${result.stderr ?? ""}`.trim();
|
|
43
|
+
return { ok: result.status === 0, output };
|
|
44
|
+
}
|
|
45
|
+
/** Register the scheduled task. Env vars are snapshotted into the task definition. */
|
|
46
|
+
export function installWindowsTask(spec) {
|
|
47
|
+
const result = powershell(buildRegisterArgs(spec));
|
|
48
|
+
if (!result.ok) {
|
|
49
|
+
throw new Error(`Register-ScheduledTask failed: ${result.output}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Unregister the task. Idempotent: succeeds when nothing is registered. */
|
|
53
|
+
export function uninstallWindowsTask(label) {
|
|
54
|
+
powershell([
|
|
55
|
+
"-NoProfile",
|
|
56
|
+
"-NonInteractive",
|
|
57
|
+
"-Command",
|
|
58
|
+
`Unregister-ScheduledTask -TaskPath '\\${TASK_FOLDER}\\' -TaskName '${label}' -Confirm:$false -ErrorAction SilentlyContinue`,
|
|
59
|
+
]);
|
|
60
|
+
}
|
|
61
|
+
/** The pid of the daemon process the task last launched, via task state. */
|
|
62
|
+
export function windowsTaskPid(label) {
|
|
63
|
+
const result = powershell([
|
|
64
|
+
"-NoProfile",
|
|
65
|
+
"-NonInteractive",
|
|
66
|
+
"-Command",
|
|
67
|
+
`(Get-ScheduledTask -TaskPath '\\${TASK_FOLDER}\\' -TaskName '${label}' -ErrorAction SilentlyContinue | Get-ScheduledTaskInfo).LastTaskResult`,
|
|
68
|
+
]);
|
|
69
|
+
if (!result.ok)
|
|
70
|
+
return null;
|
|
71
|
+
// 0 = last run succeeded; the task itself does not hold a pid, so the daemon pid
|
|
72
|
+
// is resolved by the caller from the pid file, not from Task Scheduler.
|
|
73
|
+
return result.output.includes("0") ? 0 : null;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=windows-task.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { CommandOptions, SingleResult } from "../../output/index.js";
|
|
3
|
+
interface ServiceStatusResult {
|
|
4
|
+
state: string;
|
|
5
|
+
label: string;
|
|
6
|
+
servicePid: string;
|
|
7
|
+
daemonPid: string;
|
|
8
|
+
managedByThisProcess: string;
|
|
9
|
+
}
|
|
10
|
+
export type ServiceStatusCommandResult = SingleResult<ServiceStatusResult>;
|
|
11
|
+
export declare function runServiceStatusCommand(options: CommandOptions, _command: Command): Promise<ServiceStatusCommandResult>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=service-status.d.ts.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { resolveLaunchdServiceStatus } from "./service/service-status.js";
|
|
2
|
+
import { resolveLocalDaemonState } from "./local-daemon.js";
|
|
3
|
+
const serviceStatusResultSchema = {
|
|
4
|
+
idField: "state",
|
|
5
|
+
columns: [
|
|
6
|
+
{ header: "STATE", field: "state" },
|
|
7
|
+
{ header: "LABEL", field: "label" },
|
|
8
|
+
{ header: "SERVICE PID", field: "servicePid" },
|
|
9
|
+
{ header: "DAEMON PID", field: "daemonPid" },
|
|
10
|
+
{ header: "MANAGED", field: "managedByThisProcess" },
|
|
11
|
+
],
|
|
12
|
+
};
|
|
13
|
+
const SERVICE_LABEL = "cc.cd.byspace.daemon";
|
|
14
|
+
export async function runServiceStatusCommand(options, _command) {
|
|
15
|
+
const home = typeof options.home === "string" ? options.home : undefined;
|
|
16
|
+
const state = resolveLocalDaemonState({ home });
|
|
17
|
+
const status = resolveLaunchdServiceStatus(SERVICE_LABEL, state.home, state.pidInfo?.pid ?? null);
|
|
18
|
+
return {
|
|
19
|
+
type: "single",
|
|
20
|
+
data: {
|
|
21
|
+
state: status.state,
|
|
22
|
+
label: status.label,
|
|
23
|
+
servicePid: status.servicePid === null ? "-" : String(status.servicePid),
|
|
24
|
+
daemonPid: status.currentPid === null ? "-" : String(status.currentPid),
|
|
25
|
+
managedByThisProcess: status.state === "managed-by-service" ? "yes" : "no",
|
|
26
|
+
},
|
|
27
|
+
schema: serviceStatusResultSchema,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=service-status.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { CommandOptions, SingleResult } from "../../output/index.js";
|
|
3
|
+
interface UninstallServiceResult {
|
|
4
|
+
action: "uninstalled" | "not_installed";
|
|
5
|
+
label: string;
|
|
6
|
+
message: string;
|
|
7
|
+
}
|
|
8
|
+
export type UninstallServiceCommandResult = SingleResult<UninstallServiceResult>;
|
|
9
|
+
export declare function runUninstallServiceCommand(options: CommandOptions, _command: Command): Promise<UninstallServiceCommandResult>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=uninstall-service.d.ts.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { uninstallLaunchdService } from "./service/launchd.js";
|
|
2
|
+
import { resolveLaunchdServiceStatus } from "./service/service-status.js";
|
|
3
|
+
import { resolveLocalDaemonState } from "./local-daemon.js";
|
|
4
|
+
const uninstallServiceResultSchema = {
|
|
5
|
+
idField: "action",
|
|
6
|
+
columns: [
|
|
7
|
+
{
|
|
8
|
+
header: "STATUS",
|
|
9
|
+
field: "action",
|
|
10
|
+
color: (value) => (value === "uninstalled" ? "green" : "yellow"),
|
|
11
|
+
},
|
|
12
|
+
{ header: "LABEL", field: "label" },
|
|
13
|
+
{ header: "MESSAGE", field: "message" },
|
|
14
|
+
],
|
|
15
|
+
};
|
|
16
|
+
const SERVICE_LABEL = "cc.cd.byspace.daemon";
|
|
17
|
+
export async function runUninstallServiceCommand(options, _command) {
|
|
18
|
+
const home = typeof options.home === "string" ? options.home : undefined;
|
|
19
|
+
const state = resolveLocalDaemonState({ home });
|
|
20
|
+
try {
|
|
21
|
+
const status = resolveLaunchdServiceStatus(SERVICE_LABEL, state.home, state.pidInfo?.pid ?? null);
|
|
22
|
+
if (status.state === "not-installed") {
|
|
23
|
+
return {
|
|
24
|
+
type: "single",
|
|
25
|
+
data: {
|
|
26
|
+
action: "not_installed",
|
|
27
|
+
label: SERVICE_LABEL,
|
|
28
|
+
message: "No daemon service is registered for this user.",
|
|
29
|
+
},
|
|
30
|
+
schema: uninstallServiceResultSchema,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
uninstallLaunchdService(SERVICE_LABEL, state.home);
|
|
34
|
+
return {
|
|
35
|
+
type: "single",
|
|
36
|
+
data: {
|
|
37
|
+
action: "uninstalled",
|
|
38
|
+
label: SERVICE_LABEL,
|
|
39
|
+
message: "The daemon service was unregistered and will no longer start at login.",
|
|
40
|
+
},
|
|
41
|
+
schema: uninstallServiceResultSchema,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
46
|
+
const error = {
|
|
47
|
+
code: "UNINSTALL_SERVICE_FAILED",
|
|
48
|
+
message: `Failed to uninstall the daemon service: ${message}`,
|
|
49
|
+
};
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=uninstall-service.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bytetrue/client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "BySpace client SDK package",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"test": "vitest run"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@bytetrue/protocol": "0.
|
|
43
|
-
"@bytetrue/relay": "0.
|
|
42
|
+
"@bytetrue/protocol": "0.16.0",
|
|
43
|
+
"@bytetrue/relay": "0.16.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/node": "^20.9.0",
|