@cydm/happy-elves 0.1.0-beta.4 → 0.1.0-beta.40
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/apps/cli/dist/commands/account.d.ts +2 -0
- package/apps/cli/dist/commands/account.js +52 -0
- package/apps/cli/dist/commands/app.d.ts +3 -0
- package/apps/cli/dist/commands/app.js +100 -0
- package/apps/cli/dist/commands/collect.d.ts +2 -0
- package/apps/cli/dist/commands/collect.js +31 -0
- package/apps/cli/dist/commands/command.d.ts +6 -0
- package/apps/cli/dist/commands/command.js +2 -0
- package/apps/cli/dist/commands/config.d.ts +2 -0
- package/apps/cli/dist/commands/config.js +31 -0
- package/apps/cli/dist/commands/daemon.d.ts +2 -0
- package/apps/cli/dist/commands/daemon.js +219 -0
- package/apps/cli/dist/commands/lib/args.d.ts +4 -0
- package/apps/cli/dist/commands/lib/args.js +79 -0
- package/apps/cli/dist/commands/lib/audit.d.ts +1 -0
- package/apps/cli/dist/commands/lib/audit.js +26 -0
- package/apps/cli/dist/commands/lib/bootstrap-config.d.ts +28 -0
- package/apps/cli/dist/commands/lib/bootstrap-config.js +150 -0
- package/apps/cli/dist/commands/lib/bootstrap-daemon.d.ts +15 -0
- package/apps/cli/dist/commands/lib/bootstrap-daemon.js +46 -0
- package/apps/cli/dist/commands/lib/bootstrap-output.d.ts +18 -0
- package/apps/cli/dist/commands/lib/bootstrap-output.js +40 -0
- package/apps/cli/dist/commands/lib/bootstrap.d.ts +1 -0
- package/apps/cli/dist/commands/lib/bootstrap.js +96 -0
- package/apps/cli/dist/commands/lib/config.d.ts +18 -0
- package/apps/cli/dist/commands/lib/config.js +149 -0
- package/apps/cli/dist/commands/lib/doctor.d.ts +1 -0
- package/apps/cli/dist/commands/lib/doctor.js +49 -0
- package/apps/cli/dist/commands/lib/exit.d.ts +1 -0
- package/apps/cli/dist/commands/lib/exit.js +132 -0
- package/apps/cli/dist/commands/lib/index.d.ts +24 -0
- package/apps/cli/dist/commands/lib/index.js +25 -0
- package/apps/cli/dist/commands/lib/json.d.ts +5 -0
- package/apps/cli/dist/commands/lib/json.js +17 -0
- package/apps/cli/dist/commands/lib/local-daemon.d.ts +13 -0
- package/apps/cli/dist/commands/lib/local-daemon.js +133 -0
- package/apps/cli/dist/commands/lib/loop-store.d.ts +5 -0
- package/apps/cli/dist/commands/lib/loop-store.js +78 -0
- package/apps/cli/dist/commands/lib/paths.d.ts +9 -0
- package/apps/cli/dist/commands/lib/paths.js +14 -0
- package/apps/cli/dist/commands/lib/relay-http.d.ts +18 -0
- package/apps/cli/dist/commands/lib/relay-http.js +102 -0
- package/apps/cli/dist/commands/lib/scope.d.ts +17 -0
- package/apps/cli/dist/commands/lib/scope.js +100 -0
- package/apps/cli/dist/commands/lib/session-output.d.ts +61 -0
- package/apps/cli/dist/commands/lib/session-output.js +376 -0
- package/apps/cli/dist/commands/lib/session-view.d.ts +80 -0
- package/apps/cli/dist/commands/lib/session-view.js +197 -0
- package/apps/cli/dist/commands/lib/status.d.ts +1 -0
- package/apps/cli/dist/commands/lib/status.js +63 -0
- package/apps/cli/dist/commands/lib/types.d.ts +82 -0
- package/apps/cli/dist/commands/lib/types.js +2 -0
- package/apps/cli/dist/commands/lib/usage.d.ts +5 -0
- package/apps/cli/dist/commands/lib/usage.js +248 -0
- package/apps/cli/dist/commands/lib/workspace.d.ts +25 -0
- package/apps/cli/dist/commands/lib/workspace.js +58 -0
- package/apps/cli/dist/commands/loop.d.ts +2 -0
- package/apps/cli/dist/commands/loop.js +165 -0
- package/apps/cli/dist/commands/machine.d.ts +2 -0
- package/apps/cli/dist/commands/machine.js +261 -0
- package/apps/cli/dist/commands/relay.d.ts +2 -0
- package/apps/cli/dist/commands/relay.js +61 -0
- package/apps/cli/dist/commands/remote.d.ts +2 -0
- package/apps/cli/dist/commands/remote.js +143 -0
- package/apps/cli/dist/commands/session.d.ts +2 -0
- package/apps/cli/dist/commands/session.js +560 -0
- package/apps/cli/dist/commands/token.d.ts +2 -0
- package/apps/cli/dist/commands/token.js +51 -0
- package/apps/cli/dist/commands/turn.d.ts +2 -0
- package/apps/cli/dist/commands/turn.js +247 -0
- package/apps/cli/dist/errors.d.ts +4 -0
- package/apps/cli/dist/errors.js +9 -0
- package/apps/cli/dist/index.js +2 -1888
- package/apps/daemon/dist/app.d.ts +2 -0
- package/apps/daemon/dist/app.js +118 -0
- package/apps/daemon/dist/args.d.ts +2 -0
- package/apps/daemon/dist/args.js +15 -0
- package/apps/daemon/dist/audit.d.ts +9 -0
- package/apps/daemon/dist/audit.js +51 -0
- package/apps/daemon/dist/cli.js +2 -1775
- package/apps/daemon/dist/config.d.ts +8 -0
- package/apps/daemon/dist/config.js +91 -0
- package/apps/daemon/dist/errors.d.ts +6 -0
- package/apps/daemon/dist/errors.js +22 -0
- package/apps/daemon/dist/loop/runner.d.ts +2 -0
- package/apps/daemon/dist/loop/runner.js +213 -0
- package/apps/daemon/dist/loop/store.d.ts +3 -0
- package/apps/daemon/dist/loop/store.js +64 -0
- package/apps/daemon/dist/pair.d.ts +1 -0
- package/apps/daemon/dist/pair.js +46 -0
- package/apps/daemon/dist/paths.d.ts +11 -0
- package/apps/daemon/dist/paths.js +17 -0
- package/apps/daemon/dist/process.d.ts +14 -0
- package/apps/daemon/dist/process.js +100 -0
- package/apps/daemon/dist/relay/connection.d.ts +2 -0
- package/apps/daemon/dist/relay/connection.js +147 -0
- package/apps/daemon/dist/relay/devtools.d.ts +4 -0
- package/apps/daemon/dist/relay/devtools.js +355 -0
- package/apps/daemon/dist/relay/register.d.ts +2 -0
- package/apps/daemon/dist/relay/register.js +60 -0
- package/apps/daemon/dist/relay/send.d.ts +16 -0
- package/apps/daemon/dist/relay/send.js +217 -0
- package/apps/daemon/dist/relay-http.d.ts +8 -0
- package/apps/daemon/dist/relay-http.js +71 -0
- package/apps/daemon/dist/runtime/external-provider.d.ts +20 -0
- package/apps/daemon/dist/runtime/external-provider.js +760 -0
- package/apps/daemon/dist/runtime.d.ts +12 -0
- package/apps/daemon/dist/runtime.js +79 -0
- package/apps/daemon/dist/session/create-session.d.ts +23 -0
- package/apps/daemon/dist/session/create-session.js +29 -0
- package/apps/daemon/dist/session/directory.d.ts +3 -0
- package/apps/daemon/dist/session/directory.js +104 -0
- package/apps/daemon/dist/session/events.d.ts +33 -0
- package/apps/daemon/dist/session/events.js +184 -0
- package/apps/daemon/dist/session/file-preview.d.ts +4 -0
- package/apps/daemon/dist/session/file-preview.js +173 -0
- package/apps/daemon/dist/session/lifecycle.d.ts +30 -0
- package/apps/daemon/dist/session/lifecycle.js +780 -0
- package/apps/daemon/dist/session/metadata.d.ts +7 -0
- package/apps/daemon/dist/session/metadata.js +115 -0
- package/apps/daemon/dist/session/primitives.d.ts +5 -0
- package/apps/daemon/dist/session/primitives.js +417 -0
- package/apps/daemon/dist/session/prompt.d.ts +4 -0
- package/apps/daemon/dist/session/prompt.js +228 -0
- package/apps/daemon/dist/session/runtime-handle.d.ts +7 -0
- package/apps/daemon/dist/session/runtime-handle.js +48 -0
- package/apps/daemon/dist/start.d.ts +1 -0
- package/apps/daemon/dist/start.js +43 -0
- package/apps/daemon/dist/state.d.ts +16 -0
- package/apps/daemon/dist/state.js +11 -0
- package/apps/daemon/dist/turn-coordinator.d.ts +27 -0
- package/apps/daemon/dist/turn-coordinator.js +80 -0
- package/apps/daemon/dist/types.d.ts +123 -0
- package/apps/daemon/dist/types.js +2 -0
- package/apps/daemon/dist/utils.d.ts +1 -0
- package/apps/daemon/dist/utils.js +4 -0
- package/apps/daemon/package.json +3 -23
- package/apps/relay/dist/auth.d.ts +1 -0
- package/apps/relay/dist/auth.js +16 -0
- package/apps/relay/dist/connections.d.ts +13 -0
- package/apps/relay/dist/connections.js +11 -0
- package/apps/relay/dist/controller-handlers.d.ts +44 -0
- package/apps/relay/dist/controller-handlers.js +506 -0
- package/apps/relay/dist/db.d.ts +5 -0
- package/apps/relay/dist/db.js +108 -0
- package/apps/relay/dist/errors.d.ts +5 -0
- package/apps/relay/dist/errors.js +10 -0
- package/apps/relay/dist/http-routes.d.ts +3 -0
- package/apps/relay/dist/http-routes.js +490 -0
- package/apps/relay/dist/http-schemas.d.ts +13 -1
- package/apps/relay/dist/http-schemas.js +22 -4
- package/apps/relay/dist/index.js +41 -1302
- package/apps/relay/dist/machine-handlers.d.ts +51 -0
- package/apps/relay/dist/machine-handlers.js +750 -0
- package/apps/relay/dist/projections.d.ts +3 -2
- package/apps/relay/dist/projections.js +77 -3
- package/apps/relay/dist/relay-context.d.ts +104 -0
- package/apps/relay/dist/relay-context.js +544 -0
- package/apps/relay/dist/repositories.d.ts +13 -0
- package/apps/relay/dist/repositories.js +71 -0
- package/apps/relay/dist/retention.d.ts +9 -0
- package/apps/relay/dist/retention.js +26 -0
- package/apps/relay/dist/scope.d.ts +20 -0
- package/apps/relay/dist/scope.js +60 -0
- package/apps/relay/dist/security.d.ts +0 -1
- package/apps/relay/dist/security.js +0 -3
- package/apps/relay/dist/types.d.ts +23 -1
- package/apps/relay/dist/websocket.d.ts +3 -0
- package/apps/relay/dist/websocket.js +140 -0
- package/package.json +3 -7
- package/packages/agent-sdk/dist/index.d.ts +341 -0
- package/packages/agent-sdk/dist/index.js +168 -0
- package/packages/client/dist/account.d.ts +24 -0
- package/packages/client/dist/account.js +78 -0
- package/packages/client/dist/client.d.ts +64 -0
- package/packages/client/dist/client.js +535 -0
- package/packages/client/dist/errors.d.ts +20 -0
- package/packages/client/dist/errors.js +28 -0
- package/packages/client/dist/http.d.ts +10 -0
- package/packages/client/dist/http.js +82 -0
- package/packages/client/dist/index.d.ts +3 -240
- package/packages/client/dist/index.js +2 -979
- package/packages/client/dist/parsers.d.ts +26 -0
- package/packages/client/dist/parsers.js +196 -0
- package/packages/client/dist/transport.d.ts +41 -0
- package/packages/client/dist/transport.js +288 -0
- package/packages/client/dist/types.d.ts +278 -0
- package/packages/client/dist/types.js +2 -0
- package/packages/client/dist/validation.d.ts +15 -0
- package/packages/client/dist/validation.js +87 -0
- package/packages/pie-provider/dist/index.d.ts +3 -0
- package/packages/pie-provider/dist/index.js +1003 -0
- package/packages/runtime/dist/index.d.ts +63 -5
- package/packages/runtime-acpx/dist/index.d.ts +2 -1
- package/packages/runtime-acpx/dist/index.js +71 -1
- package/packages/runtime-cli/dist/claude-history.d.ts +7 -0
- package/packages/runtime-cli/dist/claude-history.js +344 -0
- package/packages/runtime-cli/dist/claude-json.d.ts +29 -0
- package/packages/runtime-cli/dist/claude-json.js +29 -0
- package/packages/runtime-cli/dist/claude-rename.d.ts +6 -0
- package/packages/runtime-cli/dist/claude-rename.js +15 -0
- package/packages/runtime-cli/dist/claude-session-store.d.ts +3 -1
- package/packages/runtime-cli/dist/claude-session-store.js +51 -14
- package/packages/runtime-cli/dist/claude-turn.d.ts +13 -0
- package/packages/runtime-cli/dist/claude-turn.js +102 -0
- package/packages/runtime-cli/dist/codex-app-server.d.ts +21 -13
- package/packages/runtime-cli/dist/codex-app-server.js +206 -340
- package/packages/runtime-cli/dist/codex-approvals.d.ts +8 -0
- package/packages/runtime-cli/dist/codex-approvals.js +33 -0
- package/packages/runtime-cli/dist/codex-history.d.ts +17 -0
- package/packages/runtime-cli/dist/codex-history.js +711 -0
- package/packages/runtime-cli/dist/codex-json-rpc.d.ts +30 -0
- package/packages/runtime-cli/dist/codex-json-rpc.js +150 -0
- package/packages/runtime-cli/dist/codex-lifecycle.d.ts +25 -0
- package/packages/runtime-cli/dist/codex-lifecycle.js +72 -0
- package/packages/runtime-cli/dist/codex-protocol.d.ts +6 -0
- package/packages/runtime-cli/dist/codex-protocol.js +53 -0
- package/packages/runtime-cli/dist/command-resolver.d.ts +24 -0
- package/packages/runtime-cli/dist/command-resolver.js +101 -0
- package/packages/runtime-cli/dist/history-merge.d.ts +18 -0
- package/packages/runtime-cli/dist/history-merge.js +274 -0
- package/packages/runtime-cli/dist/index.d.ts +3 -1
- package/packages/runtime-cli/dist/index.js +131 -357
- package/packages/runtime-cli/dist/permissions.d.ts +6 -0
- package/packages/runtime-cli/dist/permissions.js +22 -0
- package/packages/runtime-cli/dist/session-store.d.ts +32 -0
- package/packages/runtime-cli/dist/session-store.js +92 -0
- package/packages/shared/dist/args.d.ts +10 -0
- package/packages/shared/dist/args.js +35 -0
- package/packages/shared/dist/index.d.ts +3 -0
- package/packages/shared/dist/index.js +3 -0
- package/packages/shared/dist/protocol-schemas.d.ts +386 -0
- package/packages/shared/dist/protocol-schemas.js +186 -0
- package/packages/shared/dist/protocol-types.d.ts +238 -0
- package/packages/shared/dist/protocol-types.js +2 -0
- package/packages/shared/dist/protocol.d.ts +170 -145
- package/packages/shared/dist/protocol.js +195 -85
- package/packages/shared/dist/session-name.d.ts +4 -0
- package/packages/shared/dist/session-name.js +26 -0
- package/packages/shared/dist/session-state.d.ts +16 -0
- package/packages/shared/dist/session-state.js +48 -0
- package/apps/cli/dist/index.js.map +0 -1
- package/apps/daemon/dist/cli.js.map +0 -1
- package/apps/relay/dist/db.js.map +0 -1
- package/apps/relay/dist/http-schemas.js.map +0 -1
- package/apps/relay/dist/index.js.map +0 -1
- package/apps/relay/dist/projections.js.map +0 -1
- package/apps/relay/dist/security.js.map +0 -1
- package/apps/relay/dist/types.js.map +0 -1
- package/apps/relay/package.json +0 -29
- package/packages/client/dist/index.d.ts.map +0 -1
- package/packages/client/dist/index.js.map +0 -1
- package/packages/client/package.json +0 -22
- package/packages/runtime/dist/index.d.ts.map +0 -1
- package/packages/runtime/dist/index.js.map +0 -1
- package/packages/runtime/package.json +0 -19
- package/packages/runtime-acpx/dist/index.d.ts.map +0 -1
- package/packages/runtime-acpx/dist/index.js.map +0 -1
- package/packages/runtime-acpx/package.json +0 -23
- package/packages/runtime-cli/dist/async-queue.d.ts.map +0 -1
- package/packages/runtime-cli/dist/async-queue.js.map +0 -1
- package/packages/runtime-cli/dist/claude-session-store.d.ts.map +0 -1
- package/packages/runtime-cli/dist/claude-session-store.js.map +0 -1
- package/packages/runtime-cli/dist/codex-app-server.d.ts.map +0 -1
- package/packages/runtime-cli/dist/codex-app-server.js.map +0 -1
- package/packages/runtime-cli/dist/index.d.ts.map +0 -1
- package/packages/runtime-cli/dist/index.js.map +0 -1
- package/packages/runtime-cli/package.json +0 -22
- package/packages/shared/dist/crypto.d.ts.map +0 -1
- package/packages/shared/dist/crypto.js.map +0 -1
- package/packages/shared/dist/ids.d.ts.map +0 -1
- package/packages/shared/dist/ids.js.map +0 -1
- package/packages/shared/dist/index.d.ts.map +0 -1
- package/packages/shared/dist/index.js.map +0 -1
- package/packages/shared/dist/protocol.d.ts.map +0 -1
- package/packages/shared/dist/protocol.js.map +0 -1
- package/packages/shared/package.json +0 -24
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { configDir, configPath, generateAccountSecret, ok, parsePairingStartResponse, randomId, readRelayJson, requireRelayUrl, stopLocalDaemon, throwRelayHttpError, writeConfig } from "./lib/index.js";
|
|
5
|
+
export async function handleAccount({ domain, action, flags }) {
|
|
6
|
+
if (domain === "account" && action === "create") {
|
|
7
|
+
const relayUrl = requireRelayUrl(flags);
|
|
8
|
+
const deviceId = typeof flags["device-id"] === "string" ? flags["device-id"] : randomId("dev");
|
|
9
|
+
const deviceName = typeof flags["device-name"] === "string" ? flags["device-name"] : os.hostname();
|
|
10
|
+
const accountSecret = generateAccountSecret();
|
|
11
|
+
const response = await fetch(`${relayUrl}/api/pairing/start`, {
|
|
12
|
+
method: "POST",
|
|
13
|
+
headers: { "content-type": "application/json" },
|
|
14
|
+
body: JSON.stringify({ deviceId, deviceName }),
|
|
15
|
+
});
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
await throwRelayHttpError(response, "Account creation failed");
|
|
18
|
+
}
|
|
19
|
+
const paired = parsePairingStartResponse(await readRelayJson(response, "Account creation response is not valid JSON"));
|
|
20
|
+
const config = {
|
|
21
|
+
relayUrl,
|
|
22
|
+
controllerToken: paired.controllerToken,
|
|
23
|
+
accountSecret,
|
|
24
|
+
};
|
|
25
|
+
await writeConfig(config);
|
|
26
|
+
ok("account.create", {
|
|
27
|
+
accountId: paired.accountId,
|
|
28
|
+
configPath,
|
|
29
|
+
relayUrl,
|
|
30
|
+
deviceId,
|
|
31
|
+
controllerToken: paired.controllerToken,
|
|
32
|
+
accountSecret,
|
|
33
|
+
pairingCode: paired.pairingCode,
|
|
34
|
+
expiresAt: paired.expiresAt,
|
|
35
|
+
});
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
if (domain === "account" && action === "reset") {
|
|
39
|
+
const stop = await stopLocalDaemon().catch((error) => ({
|
|
40
|
+
error: error instanceof Error ? error.message : String(error),
|
|
41
|
+
}));
|
|
42
|
+
await fs.rm(configPath, { force: true });
|
|
43
|
+
await fs.rm(path.join(configDir, "daemon.json"), { force: true });
|
|
44
|
+
ok("account.reset", {
|
|
45
|
+
removed: [configPath, path.join(configDir, "daemon.json")],
|
|
46
|
+
stop,
|
|
47
|
+
});
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=account.js.map
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { handleAccount } from "./account.js";
|
|
4
|
+
import { handleCollect } from "./collect.js";
|
|
5
|
+
import { handleConfig } from "./config.js";
|
|
6
|
+
import { handleDaemon } from "./daemon.js";
|
|
7
|
+
import { handleLoop } from "./loop.js";
|
|
8
|
+
import { handleMachine } from "./machine.js";
|
|
9
|
+
import { handleRelay } from "./relay.js";
|
|
10
|
+
import { handleRemote } from "./remote.js";
|
|
11
|
+
import { handleSession } from "./session.js";
|
|
12
|
+
import { handleToken } from "./token.js";
|
|
13
|
+
import { handleTurn } from "./turn.js";
|
|
14
|
+
import { commandUsage, commandUsageText, handleCliError, parseCliFlags, skillText, startBootstrap, topLevelDoctor, topLevelStatus, usage, usageText } from "./lib/index.js";
|
|
15
|
+
export { handleCliError };
|
|
16
|
+
const domainHandlers = [
|
|
17
|
+
handleAccount,
|
|
18
|
+
handleConfig,
|
|
19
|
+
handleRemote,
|
|
20
|
+
handleToken,
|
|
21
|
+
handleLoop,
|
|
22
|
+
handleDaemon,
|
|
23
|
+
handleRelay,
|
|
24
|
+
handleMachine,
|
|
25
|
+
handleSession,
|
|
26
|
+
handleTurn,
|
|
27
|
+
handleCollect,
|
|
28
|
+
];
|
|
29
|
+
export async function main() {
|
|
30
|
+
const argv = process.argv.slice(2);
|
|
31
|
+
const [domain] = argv;
|
|
32
|
+
if (!domain)
|
|
33
|
+
usage();
|
|
34
|
+
if (domain === "--skill" || domain === "skill") {
|
|
35
|
+
console.log(skillText());
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (domain === "--help" || domain === "-h" || domain === "help") {
|
|
39
|
+
console.log(usageText());
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (domain === "--version" || domain === "-v" || domain === "version") {
|
|
43
|
+
console.log(cliVersion());
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const topLevelHelpRequested = argv[1] === "help" || argv.slice(1).some((arg) => arg === "--help" || arg === "-h");
|
|
47
|
+
if (topLevelHelpRequested && commandUsageText(domain)) {
|
|
48
|
+
console.log(commandUsageText(domain));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (domain === "start") {
|
|
52
|
+
const { flags } = parseCliFlags(argv.slice(1));
|
|
53
|
+
await startBootstrap(flags);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (domain === "doctor") {
|
|
57
|
+
const { flags } = parseCliFlags(argv.slice(1));
|
|
58
|
+
await topLevelDoctor(flags);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (domain === "status") {
|
|
62
|
+
const { flags } = parseCliFlags(argv.slice(1));
|
|
63
|
+
await topLevelStatus(flags);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const action = argv[1];
|
|
67
|
+
const rest = argv.slice(2);
|
|
68
|
+
if ((!action || action.startsWith("-")) && commandUsageText(domain)) {
|
|
69
|
+
commandUsage(domain);
|
|
70
|
+
}
|
|
71
|
+
const { positional, flags } = parseCliFlags(rest);
|
|
72
|
+
if (action === "--help" || action === "-h" || action === "help" || flags.help === true || flags.h === true) {
|
|
73
|
+
console.log(commandUsageText(domain) ?? usageText());
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const input = { domain, action, positional, flags };
|
|
77
|
+
for (const handle of domainHandlers) {
|
|
78
|
+
if (await handle(input))
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
usage();
|
|
82
|
+
}
|
|
83
|
+
function cliVersion() {
|
|
84
|
+
for (const candidate of [
|
|
85
|
+
path.resolve(import.meta.dirname, "..", "..", "..", "..", "package.json"),
|
|
86
|
+
path.resolve(import.meta.dirname, "..", "..", "..", "package.json"),
|
|
87
|
+
path.resolve(import.meta.dirname, "..", "..", "package.json"),
|
|
88
|
+
]) {
|
|
89
|
+
try {
|
|
90
|
+
const parsed = JSON.parse(fs.readFileSync(candidate, "utf8"));
|
|
91
|
+
if (typeof parsed.version === "string" && parsed.version.trim())
|
|
92
|
+
return parsed.version.trim();
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Try the next packaged/source layout.
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return "0.1.0";
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=app.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { CliError, ControllerClient, conciseEvents, ok, parseEventCursor, printConciseEvents, readConfig, requirePositional, wantsJson, wantsVerbose } from "./lib/index.js";
|
|
2
|
+
export async function handleCollect({ domain, action, flags }) {
|
|
3
|
+
if (domain !== "collect")
|
|
4
|
+
return false;
|
|
5
|
+
const config = await readConfig(flags);
|
|
6
|
+
const client = new ControllerClient(config);
|
|
7
|
+
const sessionId = requirePositional(action, "sessionId");
|
|
8
|
+
const since = parseEventCursor(flags.since);
|
|
9
|
+
const limit = typeof flags.limit === "string" ? Number(flags.limit) : undefined;
|
|
10
|
+
if (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {
|
|
11
|
+
throw new CliError(`Invalid --limit: ${flags.limit}`, "INVALID_ARGUMENT");
|
|
12
|
+
}
|
|
13
|
+
const events = await client.collect(sessionId, { since, limit });
|
|
14
|
+
const lastEventId = events.at(-1)?.id;
|
|
15
|
+
const nextSince = lastEventId === undefined ? (since ?? null) : `cursor_${lastEventId}`;
|
|
16
|
+
if (wantsJson(flags) || wantsVerbose(flags)) {
|
|
17
|
+
ok("session.collect", {
|
|
18
|
+
sessionId,
|
|
19
|
+
debugOnly: true,
|
|
20
|
+
cursor: nextSince,
|
|
21
|
+
nextSince,
|
|
22
|
+
...(wantsVerbose(flags) ? { events } : { events: conciseEvents(events) }),
|
|
23
|
+
}, { sessionId });
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
printConciseEvents(events);
|
|
27
|
+
console.log(`nextSince: ${nextSince ?? "none"}`);
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=collect.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { configPath, ok, readConfig, redactedControllerConfig, requireRelayUrl, requireString, wantsJson, writeConfig } from "./lib/index.js";
|
|
2
|
+
export async function handleConfig({ domain, action, flags }) {
|
|
3
|
+
if (domain === "config" && action === "init") {
|
|
4
|
+
const config = {
|
|
5
|
+
relayUrl: requireRelayUrl(flags),
|
|
6
|
+
controllerToken: requireString(flags, "token"),
|
|
7
|
+
accountSecret: requireString(flags, "secret"),
|
|
8
|
+
};
|
|
9
|
+
await writeConfig(config);
|
|
10
|
+
ok("config.init", { path: configPath, relayUrl: config.relayUrl });
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
if (domain === "config" && action === "show") {
|
|
14
|
+
const config = await readConfig(flags);
|
|
15
|
+
if (!wantsJson(flags)) {
|
|
16
|
+
const redacted = redactedControllerConfig(config);
|
|
17
|
+
console.log(`Config: ${configPath}`);
|
|
18
|
+
console.log(`Relay: ${redacted.relayUrl}`);
|
|
19
|
+
console.log(`Controller token: ${redacted.hasControllerToken ? "configured" : "missing"}`);
|
|
20
|
+
console.log(`Account secret: ${redacted.hasAccountSecret ? "configured" : "missing"}`);
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
ok("config.show", {
|
|
24
|
+
path: configPath,
|
|
25
|
+
config: redactedControllerConfig(config),
|
|
26
|
+
});
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { CliError, compactText, ControllerClient, configDir, configPath, daemonPidPath, deriveOrchestration, idleSessionStatuses, localDaemonStatus, ok, parsePairingClaimResponse, randomId, readConfig, readDaemonConfig, readLocalAuditLog, readRelayJson, redactedDaemonConfig, requirePositional, requireRelayUrl, requireString, showMachine, spawnDaemonStart, stopLocalDaemon, throwRelayHttpError, wantsJson, writeDaemonConfig } from "./lib/index.js";
|
|
4
|
+
export async function handleDaemon({ domain, action, flags }) {
|
|
5
|
+
if (domain === "daemon" && action === "pair") {
|
|
6
|
+
const relayUrl = requireRelayUrl(flags);
|
|
7
|
+
const code = requireString(flags, "code");
|
|
8
|
+
const accountSecret = requireString(flags, "secret");
|
|
9
|
+
const machineName = typeof flags.name === "string" && flags.name.trim() ? flags.name.trim() : os.hostname();
|
|
10
|
+
const machineId = typeof flags["machine-id"] === "string" ? flags["machine-id"] : randomId("mach");
|
|
11
|
+
const response = await fetch(`${relayUrl}/api/pairing/claim`, {
|
|
12
|
+
method: "POST",
|
|
13
|
+
headers: { "content-type": "application/json" },
|
|
14
|
+
body: JSON.stringify({ code, machineId }),
|
|
15
|
+
});
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
await throwRelayHttpError(response, "Pairing failed");
|
|
18
|
+
}
|
|
19
|
+
const claimed = parsePairingClaimResponse(await readRelayJson(response, "Pairing response is not valid JSON"));
|
|
20
|
+
const daemonConfig = {
|
|
21
|
+
relayUrl,
|
|
22
|
+
accountId: claimed.accountId,
|
|
23
|
+
machineId: claimed.machineId,
|
|
24
|
+
machineName,
|
|
25
|
+
machineToken: claimed.machineToken,
|
|
26
|
+
accountSecret,
|
|
27
|
+
};
|
|
28
|
+
const daemonConfigPath = await writeDaemonConfig(daemonConfig);
|
|
29
|
+
ok("daemon.pair", {
|
|
30
|
+
path: daemonConfigPath,
|
|
31
|
+
config: redactedDaemonConfig(daemonConfig),
|
|
32
|
+
});
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
if (domain === "daemon" && action === "doctor") {
|
|
36
|
+
const checks = [];
|
|
37
|
+
let config;
|
|
38
|
+
try {
|
|
39
|
+
config = await readConfig(flags);
|
|
40
|
+
checks.push({ name: "config", ok: true, message: configPath });
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
checks.push({ name: "config", ok: false, message: error instanceof Error ? error.message : String(error) });
|
|
44
|
+
}
|
|
45
|
+
if (config) {
|
|
46
|
+
try {
|
|
47
|
+
const response = await fetch(`${config.relayUrl}/health`);
|
|
48
|
+
checks.push({ name: "relay", ok: response.ok, message: response.ok ? "reachable" : await response.text() });
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
checks.push({ name: "relay", ok: false, message: error instanceof Error ? error.message : String(error) });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const data = { ok: checks.every((check) => check.ok), checks };
|
|
55
|
+
if (!wantsJson(flags)) {
|
|
56
|
+
console.log(`Daemon doctor: ${data.ok ? "ok" : "issues found"}`);
|
|
57
|
+
for (const check of checks) {
|
|
58
|
+
console.log(`${check.ok ? "ok" : "fail"} ${check.name}: ${check.message}`);
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
ok("daemon.doctor", data);
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
if (domain === "daemon" && action === "config") {
|
|
66
|
+
const daemonConfig = await readDaemonConfig();
|
|
67
|
+
const redacted = redactedDaemonConfig(daemonConfig);
|
|
68
|
+
if (!wantsJson(flags)) {
|
|
69
|
+
console.log(`Config: ${path.join(configDir, "daemon.json")}`);
|
|
70
|
+
console.log(`Relay: ${redacted.relayUrl}`);
|
|
71
|
+
console.log(`Account: ${redacted.accountId}`);
|
|
72
|
+
console.log(`Machine: ${redacted.machineName} (${redacted.machineId})`);
|
|
73
|
+
console.log(`Machine token: ${redacted.hasMachineToken ? "configured" : "missing"}`);
|
|
74
|
+
console.log(`Account secret: ${redacted.hasAccountSecret ? "configured" : "missing"}`);
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
ok("daemon.config", {
|
|
78
|
+
path: path.join(configDir, "daemon.json"),
|
|
79
|
+
config: redacted,
|
|
80
|
+
});
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
if (domain === "daemon" && action === "logs") {
|
|
84
|
+
const tail = typeof flags.tail === "string" ? Number(flags.tail) : 100;
|
|
85
|
+
if (!Number.isInteger(tail) || tail <= 0) {
|
|
86
|
+
throw new CliError(`Invalid --tail: ${flags.tail}`, "INVALID_ARGUMENT");
|
|
87
|
+
}
|
|
88
|
+
const entries = await readLocalAuditLog(tail);
|
|
89
|
+
if (!wantsJson(flags)) {
|
|
90
|
+
if (entries.length === 0) {
|
|
91
|
+
console.log("No daemon audit log entries.");
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
for (const entry of entries) {
|
|
95
|
+
const record = entry;
|
|
96
|
+
const createdAt = typeof record.createdAt === "string" ? record.createdAt : "-";
|
|
97
|
+
const action = typeof record.action === "string" ? record.action : "unknown";
|
|
98
|
+
const actor = typeof record.actor === "string" ? record.actor : "unknown";
|
|
99
|
+
const sessionId = typeof record.sessionId === "string" ? record.sessionId : undefined;
|
|
100
|
+
const summary = typeof record.summary === "string" ? record.summary : JSON.stringify(record);
|
|
101
|
+
console.log(`${createdAt} ${action} ${actor}`);
|
|
102
|
+
if (sessionId)
|
|
103
|
+
console.log(` session: ${sessionId}`);
|
|
104
|
+
console.log(` ${compactText(summary, 160)}`);
|
|
105
|
+
}
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
ok("daemon.logs", {
|
|
109
|
+
path: path.join(configDir, "audit.jsonl"),
|
|
110
|
+
entries,
|
|
111
|
+
});
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
if (domain === "daemon" && action === "start") {
|
|
115
|
+
const status = await localDaemonStatus();
|
|
116
|
+
if (status.running) {
|
|
117
|
+
ok("daemon.start", { ...status, started: false });
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
await readDaemonConfig();
|
|
121
|
+
const startArgs = typeof flags.relay === "string" ? ["--relay", flags.relay] : [];
|
|
122
|
+
const pid = spawnDaemonStart(startArgs);
|
|
123
|
+
ok("daemon.start", { pid, pidPath: daemonPidPath, started: true });
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
if (domain === "daemon" && action === "stop") {
|
|
127
|
+
ok("daemon.stop", await stopLocalDaemon());
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
if (domain === "daemon" && action === "restart") {
|
|
131
|
+
await readDaemonConfig();
|
|
132
|
+
const stop = await stopLocalDaemon();
|
|
133
|
+
const startArgs = typeof flags.relay === "string" ? ["--relay", flags.relay] : [];
|
|
134
|
+
const pid = spawnDaemonStart(startArgs);
|
|
135
|
+
ok("daemon.restart", { stop, startedPid: pid, pidPath: daemonPidPath });
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
if (domain === "daemon" && action === "status" && flags.local === true) {
|
|
139
|
+
const local = await localDaemonStatus();
|
|
140
|
+
if (!wantsJson(flags)) {
|
|
141
|
+
console.log(local.running ? `Daemon: running${local.pid ? ` pid ${local.pid}` : ""}` : "Daemon: stopped");
|
|
142
|
+
console.log(`Pid file: ${local.pidPath}`);
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
ok("daemon.status", { local });
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
if (domain === "daemon" && action === "status") {
|
|
149
|
+
const config = await readConfig(flags);
|
|
150
|
+
const client = new ControllerClient(config);
|
|
151
|
+
const local = await localDaemonStatus();
|
|
152
|
+
const response = await fetch(`${config.relayUrl}/health`);
|
|
153
|
+
const snapshot = await client.snapshot();
|
|
154
|
+
const machineFilter = flags.machine === true ? requirePositional(undefined, "machineId") : typeof flags.machine === "string" ? flags.machine : undefined;
|
|
155
|
+
const machines = machineFilter
|
|
156
|
+
? snapshot.machines.filter((machine) => machine.id === machineFilter)
|
|
157
|
+
: snapshot.machines;
|
|
158
|
+
if (machineFilter && machines.length === 0)
|
|
159
|
+
throw new CliError("Machine not found", "MACHINE_NOT_FOUND");
|
|
160
|
+
const machineIds = new Set(machines.map((machine) => machine.id));
|
|
161
|
+
const sessions = snapshot.sessions.filter((session) => machineIds.has(session.machineId));
|
|
162
|
+
const projectedMachines = await Promise.all(machines.map((machine) => showMachine(client, machine)));
|
|
163
|
+
const projectedSessions = await Promise.all(sessions.map(async (session) => ({
|
|
164
|
+
sessionId: session.id,
|
|
165
|
+
machineId: session.machineId,
|
|
166
|
+
agent: session.agent,
|
|
167
|
+
status: session.status,
|
|
168
|
+
orchestration: deriveOrchestration(session, await client.history(session.id, 20)),
|
|
169
|
+
updatedAt: session.updatedAt,
|
|
170
|
+
capabilities: session.capabilities,
|
|
171
|
+
})));
|
|
172
|
+
const data = {
|
|
173
|
+
configPath,
|
|
174
|
+
local,
|
|
175
|
+
relayUrl: config.relayUrl,
|
|
176
|
+
relayReachable: response.ok,
|
|
177
|
+
relay: response.ok ? await response.json() : await response.text(),
|
|
178
|
+
machines: projectedMachines.map((machine) => ({
|
|
179
|
+
machineId: machine.id,
|
|
180
|
+
name: machine.metadata.name ?? machine.name,
|
|
181
|
+
online: machine.online,
|
|
182
|
+
lastSeen: machine.lastSeen,
|
|
183
|
+
defaultCwd: machine.defaultCwd,
|
|
184
|
+
daemonVersion: machine.capabilities.daemonVersion,
|
|
185
|
+
acpxVersion: machine.capabilities.acpxVersion,
|
|
186
|
+
sessionPrimitives: machine.capabilities.sessionPrimitives,
|
|
187
|
+
agents: machine.capabilities.agents,
|
|
188
|
+
metadata: machine.metadata,
|
|
189
|
+
})),
|
|
190
|
+
sessions: projectedSessions,
|
|
191
|
+
summary: {
|
|
192
|
+
machineCount: machines.length,
|
|
193
|
+
onlineMachineCount: machines.filter((machine) => machine.online).length,
|
|
194
|
+
sessionCount: projectedSessions.length,
|
|
195
|
+
runningSessionCount: projectedSessions.filter((session) => session.status === "running").length,
|
|
196
|
+
idleSessionCount: projectedSessions.filter((session) => idleSessionStatuses.includes(session.status)).length,
|
|
197
|
+
blockedSessionCount: projectedSessions.filter((session) => session.orchestration.blocked).length,
|
|
198
|
+
activeSessionCount: projectedSessions.filter((session) => session.orchestration.state === "active").length,
|
|
199
|
+
completedSessionCount: projectedSessions.filter((session) => session.orchestration.completed).length,
|
|
200
|
+
needsUserSessionCount: projectedSessions.filter((session) => session.orchestration.needsUser).length,
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
if (!wantsJson(flags)) {
|
|
204
|
+
console.log(`Relay: ${data.relayUrl} ${data.relayReachable ? "ok" : "unreachable"}`);
|
|
205
|
+
console.log(data.local.running ? `Local daemon: running${data.local.pid ? ` pid ${data.local.pid}` : ""}` : "Local daemon: stopped");
|
|
206
|
+
console.log(`Machines: ${data.summary.onlineMachineCount}/${data.summary.machineCount} online`);
|
|
207
|
+
console.log(`Sessions: ${data.summary.sessionCount} total, ${data.summary.runningSessionCount} running, ${data.summary.needsUserSessionCount} needs user`);
|
|
208
|
+
for (const machine of data.machines) {
|
|
209
|
+
console.log(`- ${machine.name} (${machine.machineId}) ${machine.online ? "online" : "offline"}`);
|
|
210
|
+
console.log(` cwd: ${machine.defaultCwd ?? "-"}`);
|
|
211
|
+
}
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
ok("daemon.status", data, machineFilter ? { machineId: machineFilter } : {});
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { parseFlags as parseSharedFlags } from "../../../../../packages/shared/dist/index.js";
|
|
2
|
+
import { CliError } from "../../errors.js";
|
|
3
|
+
const valueFlags = new Set([
|
|
4
|
+
"agent",
|
|
5
|
+
"code",
|
|
6
|
+
"controller",
|
|
7
|
+
"cwd",
|
|
8
|
+
"device-id",
|
|
9
|
+
"device-name",
|
|
10
|
+
"from",
|
|
11
|
+
"host",
|
|
12
|
+
"invite-secret",
|
|
13
|
+
"join-url-base",
|
|
14
|
+
"limit",
|
|
15
|
+
"machine",
|
|
16
|
+
"machine-id",
|
|
17
|
+
"name",
|
|
18
|
+
"mode",
|
|
19
|
+
"output",
|
|
20
|
+
"path",
|
|
21
|
+
"port",
|
|
22
|
+
"permission",
|
|
23
|
+
"permission-mode",
|
|
24
|
+
"prompt",
|
|
25
|
+
"prompt-file",
|
|
26
|
+
"every",
|
|
27
|
+
"reason",
|
|
28
|
+
"relay",
|
|
29
|
+
"root",
|
|
30
|
+
"shell",
|
|
31
|
+
"actions",
|
|
32
|
+
"expires-in",
|
|
33
|
+
"format",
|
|
34
|
+
"loops",
|
|
35
|
+
"machines",
|
|
36
|
+
"sessions",
|
|
37
|
+
"secret",
|
|
38
|
+
"since",
|
|
39
|
+
"stop-on",
|
|
40
|
+
"tail",
|
|
41
|
+
"text",
|
|
42
|
+
"text-file",
|
|
43
|
+
"timeout",
|
|
44
|
+
"timeout-ms",
|
|
45
|
+
"wait-timeout-ms",
|
|
46
|
+
"runtime-timeout",
|
|
47
|
+
"to",
|
|
48
|
+
"token",
|
|
49
|
+
"ttl",
|
|
50
|
+
"url",
|
|
51
|
+
"turn",
|
|
52
|
+
"until",
|
|
53
|
+
]);
|
|
54
|
+
const booleanFlags = new Set([
|
|
55
|
+
"all",
|
|
56
|
+
"detach",
|
|
57
|
+
"help",
|
|
58
|
+
"h",
|
|
59
|
+
"include-archived",
|
|
60
|
+
"json",
|
|
61
|
+
"local",
|
|
62
|
+
"no-open",
|
|
63
|
+
"no-wait",
|
|
64
|
+
"repair-head",
|
|
65
|
+
"summary",
|
|
66
|
+
"verbose",
|
|
67
|
+
"wait",
|
|
68
|
+
]);
|
|
69
|
+
const knownFlags = new Set([...valueFlags, ...booleanFlags]);
|
|
70
|
+
const dashPrefixedValueFlags = new Set(["secret"]);
|
|
71
|
+
export function parseCliFlags(argv) {
|
|
72
|
+
const parsed = parseSharedFlags(argv, { valueFlags, dashPrefixedValueFlags });
|
|
73
|
+
const unknown = Object.keys(parsed.flags).filter((flag) => !knownFlags.has(flag));
|
|
74
|
+
if (unknown.length > 0) {
|
|
75
|
+
throw new CliError(`Unknown flag: --${unknown[0]}`, "UNKNOWN_FLAG");
|
|
76
|
+
}
|
|
77
|
+
return parsed;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function readLocalAuditLog(tail?: number): Promise<unknown[]>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { CliError } from "../../errors.js";
|
|
4
|
+
import { configDir } from "./paths.js";
|
|
5
|
+
export async function readLocalAuditLog(tail = 100) {
|
|
6
|
+
const auditPath = path.join(configDir, "audit.jsonl");
|
|
7
|
+
let content = "";
|
|
8
|
+
try {
|
|
9
|
+
content = await fs.readFile(auditPath, "utf8");
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (error.code === "ENOENT")
|
|
13
|
+
return [];
|
|
14
|
+
throw error;
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
return content.trim().split("\n").filter(Boolean).slice(-tail).map((line) => JSON.parse(line));
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (error instanceof SyntaxError) {
|
|
21
|
+
throw new CliError("Local audit log contains invalid JSON.", "AUDIT_LOG_INVALID");
|
|
22
|
+
}
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { CliConfig, DaemonConfig } from "./types.js";
|
|
2
|
+
export type ConfigBackup = {
|
|
3
|
+
path: string;
|
|
4
|
+
backupPath: string;
|
|
5
|
+
reason: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function ensureControllerConfig(params: {
|
|
8
|
+
relayUrl: string;
|
|
9
|
+
explicitRelay: boolean;
|
|
10
|
+
deviceName: string;
|
|
11
|
+
}): Promise<{
|
|
12
|
+
config: CliConfig;
|
|
13
|
+
created: boolean;
|
|
14
|
+
accountId?: string;
|
|
15
|
+
backup?: ConfigBackup;
|
|
16
|
+
reconfigured: boolean;
|
|
17
|
+
}>;
|
|
18
|
+
export declare function ensureDaemonPaired(config: CliConfig, machineName: string): Promise<{
|
|
19
|
+
config: DaemonConfig;
|
|
20
|
+
created: boolean;
|
|
21
|
+
backup?: ConfigBackup;
|
|
22
|
+
reconfigured: boolean;
|
|
23
|
+
}>;
|
|
24
|
+
export declare function controllerBaseUrl(flags: Record<string, string | boolean>): string;
|
|
25
|
+
export declare function startRelayUrl(flags: Record<string, string | boolean>, existing?: CliConfig): {
|
|
26
|
+
relayUrl: string;
|
|
27
|
+
explicit: boolean;
|
|
28
|
+
};
|