@phigon/observer 8.1.0 → 8.3.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 +244 -18
- package/dist/bin/guardian-runner-darwin-amd64 +0 -0
- package/dist/bin/guardian-runner-darwin-arm64 +0 -0
- package/dist/bin/guardian-runner-linux-amd64 +0 -0
- package/dist/bin/guardian-runner-linux-arm64 +0 -0
- package/dist/bin/guardian-runner-windows-amd64.exe +0 -0
- package/dist/bin/guardian-runner-windows-arm64.exe +0 -0
- package/dist/src/abortable-delay.d.ts +10 -0
- package/dist/src/abortable-delay.d.ts.map +1 -0
- package/dist/src/abortable-delay.js +21 -0
- package/dist/src/abortable-delay.js.map +1 -0
- package/dist/src/action-policy.d.ts.map +1 -1
- package/dist/src/action-policy.js +4 -2
- package/dist/src/action-policy.js.map +1 -1
- package/dist/src/activity/adapters/claude.d.ts.map +1 -1
- package/dist/src/activity/adapters/claude.js +28 -2
- package/dist/src/activity/adapters/claude.js.map +1 -1
- package/dist/src/activity/adapters/cline-task.d.ts +7 -0
- package/dist/src/activity/adapters/cline-task.d.ts.map +1 -0
- package/dist/src/activity/adapters/cline-task.js +197 -0
- package/dist/src/activity/adapters/cline-task.js.map +1 -0
- package/dist/src/activity/adapters/cline.d.ts +3 -0
- package/dist/src/activity/adapters/cline.d.ts.map +1 -0
- package/dist/src/activity/adapters/cline.js +102 -0
- package/dist/src/activity/adapters/cline.js.map +1 -0
- package/dist/src/activity/adapters/codex.d.ts.map +1 -1
- package/dist/src/activity/adapters/codex.js +76 -0
- package/dist/src/activity/adapters/codex.js.map +1 -1
- package/dist/src/activity/adapters/copilot-chat.d.ts +3 -0
- package/dist/src/activity/adapters/copilot-chat.d.ts.map +1 -0
- package/dist/src/activity/adapters/copilot-chat.js +176 -0
- package/dist/src/activity/adapters/copilot-chat.js.map +1 -0
- package/dist/src/activity/adapters/copilot.d.ts +2 -1
- package/dist/src/activity/adapters/copilot.d.ts.map +1 -1
- package/dist/src/activity/adapters/copilot.js +173 -2
- package/dist/src/activity/adapters/copilot.js.map +1 -1
- package/dist/src/activity/adapters/cursor.d.ts +3 -0
- package/dist/src/activity/adapters/cursor.d.ts.map +1 -0
- package/dist/src/activity/adapters/cursor.js +86 -0
- package/dist/src/activity/adapters/cursor.js.map +1 -0
- package/dist/src/activity/adapters/factory-droid.d.ts +3 -0
- package/dist/src/activity/adapters/factory-droid.d.ts.map +1 -0
- package/dist/src/activity/adapters/factory-droid.js +126 -0
- package/dist/src/activity/adapters/factory-droid.js.map +1 -0
- package/dist/src/activity/adapters/gemini.d.ts +3 -0
- package/dist/src/activity/adapters/gemini.d.ts.map +1 -0
- package/dist/src/activity/adapters/gemini.js +177 -0
- package/dist/src/activity/adapters/gemini.js.map +1 -0
- package/dist/src/activity/adapters/goose.d.ts +3 -0
- package/dist/src/activity/adapters/goose.d.ts.map +1 -0
- package/dist/src/activity/adapters/goose.js +116 -0
- package/dist/src/activity/adapters/goose.js.map +1 -0
- package/dist/src/activity/adapters/kiro.d.ts +3 -0
- package/dist/src/activity/adapters/kiro.d.ts.map +1 -0
- package/dist/src/activity/adapters/kiro.js +47 -0
- package/dist/src/activity/adapters/kiro.js.map +1 -0
- package/dist/src/activity/adapters/openai-compatible.d.ts.map +1 -1
- package/dist/src/activity/adapters/openai-compatible.js +9 -1
- package/dist/src/activity/adapters/openai-compatible.js.map +1 -1
- package/dist/src/activity/adapters/opencode.d.ts.map +1 -1
- package/dist/src/activity/adapters/opencode.js +108 -1
- package/dist/src/activity/adapters/opencode.js.map +1 -1
- package/dist/src/activity/adapters/zed.d.ts +3 -0
- package/dist/src/activity/adapters/zed.d.ts.map +1 -0
- package/dist/src/activity/adapters/zed.js +134 -0
- package/dist/src/activity/adapters/zed.js.map +1 -0
- package/dist/src/activity/collector.d.ts +43 -1
- package/dist/src/activity/collector.d.ts.map +1 -1
- package/dist/src/activity/collector.js +490 -77
- package/dist/src/activity/collector.js.map +1 -1
- package/dist/src/activity/goose-sqlite-source.d.ts +33 -0
- package/dist/src/activity/goose-sqlite-source.d.ts.map +1 -0
- package/dist/src/activity/goose-sqlite-source.js +274 -0
- package/dist/src/activity/goose-sqlite-source.js.map +1 -0
- package/dist/src/activity/index.d.ts +3 -0
- package/dist/src/activity/index.d.ts.map +1 -1
- package/dist/src/activity/index.js +3 -0
- package/dist/src/activity/index.js.map +1 -1
- package/dist/src/activity/ingest.d.ts +9 -0
- package/dist/src/activity/ingest.d.ts.map +1 -1
- package/dist/src/activity/ingest.js +94 -4
- package/dist/src/activity/ingest.js.map +1 -1
- package/dist/src/activity/json-document-source.d.ts +151 -0
- package/dist/src/activity/json-document-source.d.ts.map +1 -0
- package/dist/src/activity/json-document-source.js +586 -0
- package/dist/src/activity/json-document-source.js.map +1 -0
- package/dist/src/activity/native-capabilities.d.ts.map +1 -1
- package/dist/src/activity/native-capabilities.js +8 -12
- package/dist/src/activity/native-capabilities.js.map +1 -1
- package/dist/src/activity/normalize.d.ts.map +1 -1
- package/dist/src/activity/normalize.js +64 -6
- package/dist/src/activity/normalize.js.map +1 -1
- package/dist/src/activity/opencode-message-tables.d.ts +87 -0
- package/dist/src/activity/opencode-message-tables.d.ts.map +1 -0
- package/dist/src/activity/opencode-message-tables.js +546 -0
- package/dist/src/activity/opencode-message-tables.js.map +1 -0
- package/dist/src/activity/opencode-sqlite-source.d.ts +7 -0
- package/dist/src/activity/opencode-sqlite-source.d.ts.map +1 -1
- package/dist/src/activity/opencode-sqlite-source.js +154 -63
- package/dist/src/activity/opencode-sqlite-source.js.map +1 -1
- package/dist/src/activity/source-reader.d.ts +60 -4
- package/dist/src/activity/source-reader.d.ts.map +1 -1
- package/dist/src/activity/source-reader.js +593 -75
- package/dist/src/activity/source-reader.js.map +1 -1
- package/dist/src/activity/sqlite-connections.d.ts +77 -0
- package/dist/src/activity/sqlite-connections.d.ts.map +1 -0
- package/dist/src/activity/sqlite-connections.js +220 -0
- package/dist/src/activity/sqlite-connections.js.map +1 -0
- package/dist/src/activity/zed-sqlite-source.d.ts +65 -0
- package/dist/src/activity/zed-sqlite-source.d.ts.map +1 -0
- package/dist/src/activity/zed-sqlite-source.js +547 -0
- package/dist/src/activity/zed-sqlite-source.js.map +1 -0
- package/dist/src/agent-action-executor.d.ts +18 -1
- package/dist/src/agent-action-executor.d.ts.map +1 -1
- package/dist/src/agent-action-executor.js +113 -58
- package/dist/src/agent-action-executor.js.map +1 -1
- package/dist/src/agentic-guardian.d.ts.map +1 -1
- package/dist/src/agentic-guardian.js +6 -5
- package/dist/src/agentic-guardian.js.map +1 -1
- package/dist/src/atomic-replace.d.ts +7 -0
- package/dist/src/atomic-replace.d.ts.map +1 -1
- package/dist/src/atomic-replace.js +28 -3
- package/dist/src/atomic-replace.js.map +1 -1
- package/dist/src/bridge-journal.d.ts +32 -0
- package/dist/src/bridge-journal.d.ts.map +1 -0
- package/dist/src/bridge-journal.js +113 -0
- package/dist/src/bridge-journal.js.map +1 -0
- package/dist/src/cli.d.ts +7 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +534 -50
- package/dist/src/cli.js.map +1 -1
- package/dist/src/collection-notice.d.ts +34 -0
- package/dist/src/collection-notice.d.ts.map +1 -0
- package/dist/src/collection-notice.js +73 -0
- package/dist/src/collection-notice.js.map +1 -0
- package/dist/src/config.d.ts +39 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +187 -36
- package/dist/src/config.js.map +1 -1
- package/dist/src/connection-config.d.ts.map +1 -1
- package/dist/src/connection-config.js +5 -0
- package/dist/src/connection-config.js.map +1 -1
- package/dist/src/content-redaction.d.ts +17 -1
- package/dist/src/content-redaction.d.ts.map +1 -1
- package/dist/src/content-redaction.js +51 -3
- package/dist/src/content-redaction.js.map +1 -1
- package/dist/src/credential-store.d.ts +20 -1
- package/dist/src/credential-store.d.ts.map +1 -1
- package/dist/src/credential-store.js +29 -4
- package/dist/src/credential-store.js.map +1 -1
- package/dist/src/custom-agent-registry.d.ts.map +1 -1
- package/dist/src/custom-agent-registry.js +2 -1
- package/dist/src/custom-agent-registry.js.map +1 -1
- package/dist/src/discovery/adapters/generic.d.ts.map +1 -1
- package/dist/src/discovery/adapters/generic.js +160 -2
- package/dist/src/discovery/adapters/generic.js.map +1 -1
- package/dist/src/discovery/engine.d.ts +7 -1
- package/dist/src/discovery/engine.d.ts.map +1 -1
- package/dist/src/discovery/engine.js +21 -16
- package/dist/src/discovery/engine.js.map +1 -1
- package/dist/src/discovery/known-agent.d.ts +7 -0
- package/dist/src/discovery/known-agent.d.ts.map +1 -1
- package/dist/src/discovery/known-agent.js +9 -4
- package/dist/src/discovery/known-agent.js.map +1 -1
- package/dist/src/discovery/system-evidence.d.ts +40 -1
- package/dist/src/discovery/system-evidence.d.ts.map +1 -1
- package/dist/src/discovery/system-evidence.js +189 -16
- package/dist/src/discovery/system-evidence.js.map +1 -1
- package/dist/src/doctor-check.d.ts +51 -0
- package/dist/src/doctor-check.d.ts.map +1 -0
- package/dist/src/doctor-check.js +174 -0
- package/dist/src/doctor-check.js.map +1 -0
- package/dist/src/enroll.d.ts +86 -0
- package/dist/src/enroll.d.ts.map +1 -0
- package/dist/src/enroll.js +245 -0
- package/dist/src/enroll.js.map +1 -0
- package/dist/src/entry.d.ts +3 -0
- package/dist/src/entry.d.ts.map +1 -0
- package/dist/src/entry.js +14 -0
- package/dist/src/entry.js.map +1 -0
- package/dist/src/event-queue.d.ts +13 -1
- package/dist/src/event-queue.d.ts.map +1 -1
- package/dist/src/event-queue.js +137 -42
- package/dist/src/event-queue.js.map +1 -1
- package/dist/src/event-spool.d.ts +61 -3
- package/dist/src/event-spool.d.ts.map +1 -1
- package/dist/src/event-spool.js +341 -44
- package/dist/src/event-spool.js.map +1 -1
- package/dist/src/generated/phigon/v1/identity_pb.d.ts +7 -0
- package/dist/src/generated/phigon/v1/identity_pb.d.ts.map +1 -1
- package/dist/src/generated/phigon/v1/identity_pb.js +1 -1
- package/dist/src/generated/phigon/v1/identity_pb.js.map +1 -1
- package/dist/src/guardian-containment.d.ts +2 -6
- package/dist/src/guardian-containment.d.ts.map +1 -1
- package/dist/src/guardian-containment.js +12 -63
- package/dist/src/guardian-containment.js.map +1 -1
- package/dist/src/guardian-decision-journal.d.ts.map +1 -1
- package/dist/src/guardian-decision-journal.js +4 -19
- package/dist/src/guardian-decision-journal.js.map +1 -1
- package/dist/src/guardian-managed-exec.d.ts.map +1 -1
- package/dist/src/guardian-managed-exec.js +6 -18
- package/dist/src/guardian-managed-exec.js.map +1 -1
- package/dist/src/guardian-model-bridge.d.ts.map +1 -1
- package/dist/src/guardian-model-bridge.js +2 -1
- package/dist/src/guardian-model-bridge.js.map +1 -1
- package/dist/src/guardian-native.d.ts +0 -1
- package/dist/src/guardian-native.d.ts.map +1 -1
- package/dist/src/guardian-native.js +0 -6
- package/dist/src/guardian-native.js.map +1 -1
- package/dist/src/guardian-process-monitor.d.ts +4 -0
- package/dist/src/guardian-process-monitor.d.ts.map +1 -1
- package/dist/src/guardian-process-monitor.js +82 -26
- package/dist/src/guardian-process-monitor.js.map +1 -1
- package/dist/src/health.d.ts +19 -1
- package/dist/src/health.d.ts.map +1 -1
- package/dist/src/health.js +22 -1
- package/dist/src/health.js.map +1 -1
- package/dist/src/historical-identity-store.d.ts +8 -1
- package/dist/src/historical-identity-store.d.ts.map +1 -1
- package/dist/src/historical-identity-store.js +28 -10
- package/dist/src/historical-identity-store.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/installation.d.ts +2 -0
- package/dist/src/installation.d.ts.map +1 -1
- package/dist/src/installation.js +6 -3
- package/dist/src/installation.js.map +1 -1
- package/dist/src/instance-lock.d.ts +45 -0
- package/dist/src/instance-lock.d.ts.map +1 -0
- package/dist/src/instance-lock.js +243 -0
- package/dist/src/instance-lock.js.map +1 -0
- package/dist/src/machine-command-executor.d.ts +22 -7
- package/dist/src/machine-command-executor.d.ts.map +1 -1
- package/dist/src/machine-command-executor.js +80 -19
- package/dist/src/machine-command-executor.js.map +1 -1
- package/dist/src/node-version.d.ts +8 -0
- package/dist/src/node-version.d.ts.map +1 -0
- package/dist/src/node-version.js +17 -0
- package/dist/src/node-version.js.map +1 -0
- package/dist/src/observer-log.d.ts +50 -0
- package/dist/src/observer-log.d.ts.map +1 -0
- package/dist/src/observer-log.js +141 -0
- package/dist/src/observer-log.js.map +1 -0
- package/dist/src/pair.d.ts +68 -1
- package/dist/src/pair.d.ts.map +1 -1
- package/dist/src/pair.js +204 -65
- package/dist/src/pair.js.map +1 -1
- package/dist/src/private-directory.d.ts +10 -0
- package/dist/src/private-directory.d.ts.map +1 -0
- package/dist/src/private-directory.js +66 -0
- package/dist/src/private-directory.js.map +1 -0
- package/dist/src/process-tree.d.ts +73 -0
- package/dist/src/process-tree.d.ts.map +1 -0
- package/dist/src/process-tree.js +256 -0
- package/dist/src/process-tree.js.map +1 -0
- package/dist/src/proxy.d.ts +68 -0
- package/dist/src/proxy.d.ts.map +1 -0
- package/dist/src/proxy.js +209 -0
- package/dist/src/proxy.js.map +1 -0
- package/dist/src/purge.d.ts +17 -0
- package/dist/src/purge.d.ts.map +1 -0
- package/dist/src/purge.js +84 -0
- package/dist/src/purge.js.map +1 -0
- package/dist/src/remove-machine.d.ts +5 -1
- package/dist/src/remove-machine.d.ts.map +1 -1
- package/dist/src/remove-machine.js +28 -14
- package/dist/src/remove-machine.js.map +1 -1
- package/dist/src/server-authority.d.ts +29 -0
- package/dist/src/server-authority.d.ts.map +1 -0
- package/dist/src/server-authority.js +106 -0
- package/dist/src/server-authority.js.map +1 -0
- package/dist/src/server-clock.d.ts +32 -0
- package/dist/src/server-clock.d.ts.map +1 -0
- package/dist/src/server-clock.js +72 -0
- package/dist/src/server-clock.js.map +1 -0
- package/dist/src/service-command.d.ts +20 -0
- package/dist/src/service-command.d.ts.map +1 -0
- package/dist/src/service-command.js +136 -0
- package/dist/src/service-command.js.map +1 -0
- package/dist/src/service.d.ts +98 -0
- package/dist/src/service.d.ts.map +1 -0
- package/dist/src/service.js +472 -0
- package/dist/src/service.js.map +1 -0
- package/dist/src/stream-client.d.ts +21 -1
- package/dist/src/stream-client.d.ts.map +1 -1
- package/dist/src/stream-client.js +137 -24
- package/dist/src/stream-client.js.map +1 -1
- package/dist/src/stream-state.d.ts +2 -0
- package/dist/src/stream-state.d.ts.map +1 -1
- package/dist/src/stream-state.js +5 -2
- package/dist/src/stream-state.js.map +1 -1
- package/dist/src/system-inspection.d.ts +78 -0
- package/dist/src/system-inspection.d.ts.map +1 -0
- package/dist/src/system-inspection.js +281 -0
- package/dist/src/system-inspection.js.map +1 -0
- package/dist/src/update.d.ts.map +1 -1
- package/dist/src/update.js +9 -3
- package/dist/src/update.js.map +1 -1
- package/dist/src/user-notices.d.ts +64 -0
- package/dist/src/user-notices.d.ts.map +1 -0
- package/dist/src/user-notices.js +141 -0
- package/dist/src/user-notices.js.map +1 -0
- package/package.json +7 -7
- package/dist/src/windows-process.d.ts +0 -7
- package/dist/src/windows-process.d.ts.map +0 -1
- package/dist/src/windows-process.js +0 -18
- package/dist/src/windows-process.js.map +0 -1
|
@@ -3,19 +3,91 @@ import { execFile } from "node:child_process";
|
|
|
3
3
|
import { constants } from "node:fs";
|
|
4
4
|
import { access, stat } from "node:fs/promises";
|
|
5
5
|
import { homedir } from "node:os";
|
|
6
|
-
import { basename, delimiter, join } from "node:path";
|
|
6
|
+
import { basename, delimiter, join, win32 } from "node:path";
|
|
7
7
|
import { promisify } from "node:util";
|
|
8
8
|
import { observedProcessKey } from "./process-identity.js";
|
|
9
|
+
import { guardianRunnerPath } from "../guardian-native.js";
|
|
9
10
|
const execFileAsync = promisify(execFile);
|
|
10
11
|
const executableNamePattern = /^[a-zA-Z0-9._+-]{1,128}$/;
|
|
11
12
|
const versionPattern = /\bv?\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?\b/;
|
|
13
|
+
const maxCachedExecutableProbes = 64;
|
|
14
|
+
/**
|
|
15
|
+
* Remembers which agent CLIs are installed between discovery passes.
|
|
16
|
+
* Finding one walks PATH and runs its `--version`, which starts the agent's
|
|
17
|
+
* own runtime; discovery runs every few seconds, while installs change
|
|
18
|
+
* rarely. A found CLI is probed again when its file changes or after
|
|
19
|
+
* `foundTtlMs` (npm shims stay unchanged across upgrades); an absent one, or
|
|
20
|
+
* one whose version could not be read, is probed again after `missingTtlMs`.
|
|
21
|
+
*/
|
|
22
|
+
export class ExecutableProbeCache {
|
|
23
|
+
#entries = new Map();
|
|
24
|
+
#foundTtlMs;
|
|
25
|
+
#missingTtlMs;
|
|
26
|
+
#clock;
|
|
27
|
+
constructor(options = {}) {
|
|
28
|
+
this.#foundTtlMs = options.foundTtlMs ?? 5 * 60_000;
|
|
29
|
+
this.#missingTtlMs = options.missingTtlMs ?? 60_000;
|
|
30
|
+
this.#clock = options.clock ?? Date.now;
|
|
31
|
+
}
|
|
32
|
+
async lookup(key) {
|
|
33
|
+
const cached = this.#entries.get(key);
|
|
34
|
+
if (cached === undefined)
|
|
35
|
+
return undefined;
|
|
36
|
+
const age = this.#clock() - cached.checkedAt;
|
|
37
|
+
if (age < 0 || age >= cached.ttlMs)
|
|
38
|
+
return undefined;
|
|
39
|
+
if (cached.executablePath === undefined)
|
|
40
|
+
return { value: cached.value };
|
|
41
|
+
try {
|
|
42
|
+
const metadata = await stat(cached.executablePath);
|
|
43
|
+
if (metadata.size !== cached.size ||
|
|
44
|
+
metadata.mtimeMs !== cached.modifiedMs) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return { value: cached.value };
|
|
52
|
+
}
|
|
53
|
+
async remember(key, value, executablePath) {
|
|
54
|
+
const checkedAt = this.#clock();
|
|
55
|
+
const ttlMs = value === null || value.version === ""
|
|
56
|
+
? this.#missingTtlMs
|
|
57
|
+
: this.#foundTtlMs;
|
|
58
|
+
let entry = { checkedAt, ttlMs, value };
|
|
59
|
+
if (executablePath !== null) {
|
|
60
|
+
try {
|
|
61
|
+
const metadata = await stat(executablePath);
|
|
62
|
+
entry = {
|
|
63
|
+
...entry,
|
|
64
|
+
executablePath,
|
|
65
|
+
size: metadata.size,
|
|
66
|
+
modifiedMs: metadata.mtimeMs,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
this.#entries.delete(key);
|
|
74
|
+
this.#entries.set(key, entry);
|
|
75
|
+
if (this.#entries.size > maxCachedExecutableProbes) {
|
|
76
|
+
const oldest = this.#entries.keys().next().value;
|
|
77
|
+
if (oldest !== undefined)
|
|
78
|
+
this.#entries.delete(oldest);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
12
82
|
export class SystemEvidenceProvider {
|
|
13
83
|
#platform;
|
|
14
84
|
#environment;
|
|
85
|
+
#executableCache;
|
|
15
86
|
#processes;
|
|
16
|
-
constructor(platform = process.platform, environment = process.env) {
|
|
87
|
+
constructor(platform = process.platform, environment = process.env, executableCache) {
|
|
17
88
|
this.#platform = platform;
|
|
18
89
|
this.#environment = environment;
|
|
90
|
+
this.#executableCache = executableCache;
|
|
19
91
|
}
|
|
20
92
|
listProcesses() {
|
|
21
93
|
this.#processes ??= this.#readProcesses();
|
|
@@ -30,20 +102,29 @@ export class SystemEvidenceProvider {
|
|
|
30
102
|
};
|
|
31
103
|
}
|
|
32
104
|
}
|
|
105
|
+
const cacheKey = JSON.stringify([
|
|
106
|
+
this.#platform,
|
|
107
|
+
this.#environmentValue("PATH") ?? "",
|
|
108
|
+
this.#environmentValue("PATHEXT") ?? "",
|
|
109
|
+
candidates,
|
|
110
|
+
]);
|
|
33
111
|
try {
|
|
112
|
+
const cached = await this.#executableCache?.lookup(cacheKey);
|
|
113
|
+
if (cached !== undefined)
|
|
114
|
+
return { status: "ok", value: cached.value };
|
|
34
115
|
for (const candidate of candidates) {
|
|
35
116
|
const executablePath = await this.#findExecutable(candidate);
|
|
36
117
|
if (executablePath === null)
|
|
37
118
|
continue;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
executablePathDigest: digest(executablePath),
|
|
43
|
-
version: await readVersion(executablePath),
|
|
44
|
-
},
|
|
119
|
+
const value = {
|
|
120
|
+
executableName: normalizedExecutableName(candidate),
|
|
121
|
+
executablePathDigest: digest(executablePath),
|
|
122
|
+
version: await readVersion(executablePath),
|
|
45
123
|
};
|
|
124
|
+
await this.#executableCache?.remember(cacheKey, value, executablePath);
|
|
125
|
+
return { status: "ok", value };
|
|
46
126
|
}
|
|
127
|
+
await this.#executableCache?.remember(cacheKey, null, null);
|
|
47
128
|
return { status: "ok", value: null };
|
|
48
129
|
}
|
|
49
130
|
catch (error) {
|
|
@@ -123,13 +204,15 @@ export class SystemEvidenceProvider {
|
|
|
123
204
|
return probeFailure(error, "Process inspection");
|
|
124
205
|
}
|
|
125
206
|
}
|
|
126
|
-
|
|
127
|
-
|
|
207
|
+
#environmentValue(name) {
|
|
208
|
+
return this.#environment[name] ?? (this.#platform === "win32"
|
|
128
209
|
? Object.entries(this.#environment).find(([key]) => key.toUpperCase() === name)?.[1]
|
|
129
210
|
: undefined);
|
|
130
|
-
|
|
211
|
+
}
|
|
212
|
+
async #findExecutable(candidate) {
|
|
213
|
+
const pathValue = this.#environmentValue("PATH") ?? "";
|
|
131
214
|
const extensions = this.#platform === "win32"
|
|
132
|
-
? (environmentValue("PATHEXT") ?? ".EXE;.CMD;.BAT")
|
|
215
|
+
? (this.#environmentValue("PATHEXT") ?? ".EXE;.CMD;.BAT")
|
|
133
216
|
.split(";")
|
|
134
217
|
.filter(Boolean)
|
|
135
218
|
: [""];
|
|
@@ -154,7 +237,51 @@ export class SystemEvidenceProvider {
|
|
|
154
237
|
return null;
|
|
155
238
|
}
|
|
156
239
|
}
|
|
240
|
+
// Set once the native helper is found missing (for example, a source
|
|
241
|
+
// checkout built without Go); PowerShell is used from then on.
|
|
242
|
+
let nativeProcessListingMissing = false;
|
|
243
|
+
/**
|
|
244
|
+
* Windows processes, listed by the bundled native helper in tens of
|
|
245
|
+
* milliseconds. PowerShell's Win32_Process query, which costs 0.3-1 s (most
|
|
246
|
+
* of it PowerShell start-up), is the fallback when the helper is missing or
|
|
247
|
+
* fails. Both report the same IDs, names and start times, and paths are
|
|
248
|
+
* normalized (see windowsPathIdentity) before identities are derived. Each
|
|
249
|
+
* listing is one short-lived process with a timeout, so nothing outlives
|
|
250
|
+
* the observer.
|
|
251
|
+
*/
|
|
157
252
|
async function readWindowsProcesses() {
|
|
253
|
+
return listWindowsProcesses(nativeProcessListingMissing ? undefined : runNativeProcessListing, runPowerShellProcessListing);
|
|
254
|
+
}
|
|
255
|
+
export async function listWindowsProcesses(native, powerShell) {
|
|
256
|
+
if (native !== undefined) {
|
|
257
|
+
try {
|
|
258
|
+
return windowsProcessEvidence(nativeProcessValues(await native()));
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
// A crashed, timed-out or unreadable helper is retried next pass.
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
const parsed = JSON.parse(await powerShell());
|
|
265
|
+
return windowsProcessEvidence(Array.isArray(parsed) ? parsed : [parsed]);
|
|
266
|
+
}
|
|
267
|
+
export async function runNativeProcessListing() {
|
|
268
|
+
try {
|
|
269
|
+
const { stdout } = await execFileAsync(guardianRunnerPath(), ["__processes"], {
|
|
270
|
+
timeout: 5_000,
|
|
271
|
+
maxBuffer: 8 << 20,
|
|
272
|
+
encoding: "utf8",
|
|
273
|
+
windowsHide: true,
|
|
274
|
+
});
|
|
275
|
+
return stdout;
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
if (isNodeError(error) && error.code === "ENOENT") {
|
|
279
|
+
nativeProcessListingMissing = true;
|
|
280
|
+
}
|
|
281
|
+
throw error;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
export async function runPowerShellProcessListing() {
|
|
158
285
|
const script = [
|
|
159
286
|
"Get-CimInstance Win32_Process",
|
|
160
287
|
"Select-Object ProcessId,CreationDate,ExecutablePath,Name",
|
|
@@ -166,8 +293,34 @@ async function readWindowsProcesses() {
|
|
|
166
293
|
encoding: "utf8",
|
|
167
294
|
windowsHide: true,
|
|
168
295
|
});
|
|
296
|
+
return stdout;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* The native listing in Win32_Process's shape. PowerShell serializes
|
|
300
|
+
* CreationDate as `/Date(<Unix ms>)/`; the helper reports those milliseconds,
|
|
301
|
+
* so rebuilding the string keeps process identities unchanged.
|
|
302
|
+
*/
|
|
303
|
+
export function nativeProcessValues(stdout) {
|
|
169
304
|
const parsed = JSON.parse(stdout);
|
|
170
|
-
|
|
305
|
+
if (!Array.isArray(parsed)) {
|
|
306
|
+
throw new Error("Native process listing is invalid.");
|
|
307
|
+
}
|
|
308
|
+
return parsed.map((value) => {
|
|
309
|
+
if (typeof value !== "object" || value === null)
|
|
310
|
+
return undefined;
|
|
311
|
+
const entry = value;
|
|
312
|
+
const created = entry["created_ms"];
|
|
313
|
+
return {
|
|
314
|
+
ProcessId: entry["pid"],
|
|
315
|
+
Name: entry["name"],
|
|
316
|
+
CreationDate: typeof created === "number" && Number.isSafeInteger(created) && created > 0
|
|
317
|
+
? `/Date(${created})/`
|
|
318
|
+
: undefined,
|
|
319
|
+
ExecutablePath: entry["path"],
|
|
320
|
+
};
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
function windowsProcessEvidence(values) {
|
|
171
324
|
const processes = [];
|
|
172
325
|
for (const value of values) {
|
|
173
326
|
if (typeof value !== "object" ||
|
|
@@ -185,7 +338,7 @@ async function readWindowsProcesses() {
|
|
|
185
338
|
? value.ExecutablePath
|
|
186
339
|
: value.Name;
|
|
187
340
|
const startedAt = processStartDate(value.CreationDate);
|
|
188
|
-
const executablePathDigest = digest(rawPath);
|
|
341
|
+
const executablePathDigest = digest(windowsPathIdentity(rawPath));
|
|
189
342
|
const processKey = observedProcessKey("win32", value.ProcessId, value.CreationDate, executablePathDigest);
|
|
190
343
|
if (startedAt === undefined || processKey === undefined)
|
|
191
344
|
continue;
|
|
@@ -199,6 +352,23 @@ async function readWindowsProcesses() {
|
|
|
199
352
|
}
|
|
200
353
|
return processes;
|
|
201
354
|
}
|
|
355
|
+
/**
|
|
356
|
+
* One spelling of a Windows executable path, so a process has the same
|
|
357
|
+
* identity whichever listing found it. Win32_Process reports the path the
|
|
358
|
+
* process was started with (`C:\windows\Explorer.EXE`,
|
|
359
|
+
* `C:\Program Files\Git\bin\..\usr\bin\bash.exe`); the native helper reports
|
|
360
|
+
* the file's own path (`C:\Windows\explorer.exe`). Windows paths are
|
|
361
|
+
* case-insensitive, so case, `.` and `..` segments and a `\\?\` prefix are
|
|
362
|
+
* removed. A path reached through a junction still differs from its target.
|
|
363
|
+
*/
|
|
364
|
+
export function windowsPathIdentity(path) {
|
|
365
|
+
let value = path;
|
|
366
|
+
if (/^\\\\\?\\UNC\\/iu.test(value))
|
|
367
|
+
value = `\\\\${value.slice(8)}`;
|
|
368
|
+
else if (value.startsWith("\\\\?\\"))
|
|
369
|
+
value = value.slice(4);
|
|
370
|
+
return win32.normalize(value).toLowerCase();
|
|
371
|
+
}
|
|
202
372
|
async function readVersion(executablePath) {
|
|
203
373
|
try {
|
|
204
374
|
// npm exposes .cmd shims on Windows, which execFile cannot launch.
|
|
@@ -210,7 +380,10 @@ async function readVersion(executablePath) {
|
|
|
210
380
|
if (script !== undefined)
|
|
211
381
|
await access(script, constants.F_OK);
|
|
212
382
|
const execution = execFileAsync(script === undefined ? executablePath : "powershell.exe", script === undefined ? ["--version"] : ["-NoProfile", "-NonInteractive", "-File", script, "--version"], {
|
|
213
|
-
|
|
383
|
+
// Starting PowerShell alone can take several seconds on a busy or
|
|
384
|
+
// closely monitored computer, as for the PowerShell process listing.
|
|
385
|
+
// A probe result is cached, so a slow start is paid once per CLI.
|
|
386
|
+
timeout: script === undefined ? 5_000 : 15_000,
|
|
214
387
|
maxBuffer: 4_096,
|
|
215
388
|
encoding: "utf8",
|
|
216
389
|
windowsHide: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-evidence.js","sourceRoot":"","sources":["../../../src/discovery/system-evidence.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"system-evidence.js","sourceRoot":"","sources":["../../../src/discovery/system-evidence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAQtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AACzD,MAAM,cAAc,GAClB,iDAAiD,CAAC;AACpD,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAWrC;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAoB;IACtB,QAAQ,GAAG,IAAI,GAAG,EAAiC,CAAC;IACpD,WAAW,CAAS;IACpB,aAAa,CAAS;IACtB,MAAM,CAAe;IAE9B,YACE,UAIK,EAAE;QAEP,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,MAAM,CAAC;QACpD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC;QACpD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QAGtB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;QAC7C,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QACrD,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS;YAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QACxE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACnD,IACE,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;gBAC7B,QAAQ,CAAC,OAAO,KAAK,MAAM,CAAC,UAAU,EACtC,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,GAAW,EACX,KAAgC,EAChC,cAA6B;QAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE;YAClD,CAAC,CAAC,IAAI,CAAC,aAAa;YACpB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;QACrB,IAAI,KAAK,GAA0B,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC/D,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC5C,KAAK,GAAG;oBACN,GAAG,KAAK;oBACR,cAAc;oBACd,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,UAAU,EAAE,QAAQ,CAAC,OAAO;iBAC7B,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,yBAAyB,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YACjD,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,sBAAsB;IACxB,SAAS,CAAkB;IAC3B,YAAY,CAAoB;IAChC,gBAAgB,CAAmC;IAC5D,UAAU,CAEI;IAEd,YACE,WAA4B,OAAO,CAAC,QAAQ,EAC5C,cAAiC,OAAO,CAAC,GAAG,EAC5C,eAAsC;QAEtC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;IAC1C,CAAC;IAED,aAAa;QACX,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,UAA6B;QAE7B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3C,OAAO;oBACL,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,6CAA6C;iBACtD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;YAC9B,IAAI,CAAC,SAAS;YACd,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE;YACpC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,EAAE;YACvC,UAAU;SACX,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7D,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACvE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;gBAC7D,IAAI,cAAc,KAAK,IAAI;oBAAE,SAAS;gBACtC,MAAM,KAAK,GAAG;oBACZ,cAAc,EAAE,wBAAwB,CAAC,SAAS,CAAC;oBACnD,oBAAoB,EAAE,MAAM,CAAC,cAAc,CAAC;oBAC5C,OAAO,EAAE,MAAM,WAAW,CAAC,cAAc,CAAC;iBAC3C,CAAC;gBACF,MAAM,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;gBACvE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACjC,CAAC;YACD,MAAM,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC5D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,YAAY,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,UAA6B;QAE7B,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;gBACvC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACrB,KAAK,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACrD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;wBAAE,SAAS;oBAC5D,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,YAAY,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc;QAGlB,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC/B,OAAO;oBACL,MAAM,EAAE,IAAI;oBACZ,KAAK,EAAE,MAAM,oBAAoB,EAAE;iBACpC,CAAC;YACJ,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,IAAI,EACJ,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAC9B;gBACE,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,CAAC,IAAI,EAAE;gBAClB,QAAQ,EAAE,MAAM;gBAChB,GAAG,EAAE;oBACH,GAAG,IAAI,CAAC,YAAY;oBACpB,IAAI,EAAE,GAAG;oBACT,MAAM,EAAE,GAAG;iBACZ;aACF,CACF,CAAC;YACF,MAAM,SAAS,GAAsB,EAAE,CAAC;YACxC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1C,MAAM,KAAK,GACT,4EAA4E,CAAC,IAAI,CAC/E,IAAI,CACL,CAAC;gBACJ,IAAI,KAAK,KAAK,IAAI;oBAAE,SAAS;gBAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnC,MAAM,mBAAmB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrC,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,SAAS,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;gBACxD,IACE,mBAAmB,KAAK,SAAS;oBACjC,cAAc,KAAK,SAAS;oBAC5B,SAAS,KAAK,SAAS;oBACvB,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC;oBAChC,SAAS,GAAG,CAAC,EACb,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,MAAM,oBAAoB,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;gBACpD,MAAM,UAAU,GAAG,kBAAkB,CACnC,IAAI,CAAC,SAAS,EACd,SAAS,EACT,mBAAmB,EACnB,oBAAoB,CACrB,CAAC;gBACF,IAAI,UAAU,KAAK,SAAS;oBAAE,SAAS;gBACvC,SAAS,CAAC,IAAI,CAAC;oBACb,UAAU;oBACV,SAAS;oBACT,SAAS;oBACT,cAAc,EAAE,wBAAwB,CACtC,QAAQ,CAAC,cAAc,CAAC,CACzB;oBACD,oBAAoB;iBACrB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,YAAY,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,IAAY;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAChC,IAAI,CAAC,SAAS,KAAK,OAAO;YACxB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpF,CAAC,CAAC,SAAS,CACd,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAiB;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACvD,MAAM,UAAU,GACd,IAAI,CAAC,SAAS,KAAK,OAAO;YACxB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC;iBACpD,KAAK,CAAC,GAAG,CAAC;iBACV,MAAM,CAAC,OAAO,CAAC;YACpB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACX,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACnD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACrC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC,CAAC;gBACnE,IAAI,CAAC;oBACH,MAAM,MAAM,CACV,cAAc,EACd,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAC7D,CAAC;oBACF,OAAO,cAAc,CAAC;gBACxB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;wBAAE,SAAS;oBAC5D,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;wBAAE,SAAS;oBAC5D,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,qEAAqE;AACrE,+DAA+D;AAC/D,IAAI,2BAA2B,GAAG,KAAK,CAAC;AAExC;;;;;;;;GAQG;AACH,KAAK,UAAU,oBAAoB;IACjC,OAAO,oBAAoB,CACzB,2BAA2B,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,uBAAuB,EACjE,2BAA2B,CAC5B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAA2C,EAC3C,UAAiC;IAEjC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,sBAAsB,CAAC,mBAAmB,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;QACpE,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;IACvD,OAAO,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,kBAAkB,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE;YAC5E,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,CAAC,IAAI,EAAE;YAClB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClD,2BAA2B,GAAG,IAAI,CAAC;QACrC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B;IAC/C,MAAM,MAAM,GAAG;QACb,+BAA+B;QAC/B,0DAA0D;QAC1D,0BAA0B;KAC3B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,gBAAgB,EAChB,CAAC,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,CAAC,EACrD;QACE,OAAO,EAAE,MAAM;QACf,SAAS,EAAE,CAAC,IAAI,EAAE;QAClB,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,IAAI;KAClB,CACF,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAc,EAAE,EAAE;QACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QAClE,MAAM,KAAK,GAAG,KAAgC,CAAC;QAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;QACpC,OAAO;YACL,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC;YACvB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,YAAY,EAAE,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC;gBACvF,CAAC,CAAC,SAAS,OAAO,IAAI;gBACtB,CAAC,CAAC,SAAS;YACb,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC;SAC9B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA0B;IACxD,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IACE,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,KAAK,IAAI;YACd,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC;YACvB,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;YACnC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;YAClB,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAC9B,CAAC,CAAC,cAAc,IAAI,KAAK,CAAC;YAC1B,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,EACtC,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GACX,gBAAgB,IAAI,KAAK;YACzB,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ;YACtC,CAAC,CAAC,KAAK,CAAC,cAAc;YACtB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACjB,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,oBAAoB,GAAG,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,kBAAkB,CACnC,OAAO,EACP,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,YAAY,EAClB,oBAAoB,CACrB,CAAC;QACF,IAAI,SAAS,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;YAAE,SAAS;QAClE,SAAS,CAAC,IAAI,CAAC;YACb,UAAU;YACV,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS;YACT,cAAc,EAAE,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC;YACpD,oBAAoB;SACrB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,KAAK,GAAG,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/D,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,cAAsB;IAC/C,IAAI,CAAC;QACH,mEAAmE;QACnE,wEAAwE;QACxE,sEAAsE;QACtE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC;YAClF,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC;YAClD,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,aAAa,CAC7B,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,EACxD,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EACtG;YACE,kEAAkE;YAClE,qEAAqE;YACrE,kEAAkE;YAClE,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;YAC9C,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,IAAI;SAClB,CACF,CAAC;QACF,wEAAwE;QACxE,sEAAsE;QACtE,2DAA2D;QAC3D,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;QAC7B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC;QAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1E,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CACnB,KAAc,EACd,KAAa;IAEb,IACE,WAAW,CAAC,KAAK,CAAC;QAClB,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,EACnD,CAAC;QACD,OAAO;YACL,MAAM,EAAE,mBAAmB;YAC3B,MAAM,EAAE,GAAG,KAAK,sCAAsC;SACvD,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,GAAG,KAAK,0BAA0B;KAC3C,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IACpC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAa;IAC7C,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB;IACjD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvE,MAAM,MAAM,GAAG,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,SAAS,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { ObserverConfig } from "./config.js";
|
|
2
|
+
import { type ObserverConsentHealth } from "./health.js";
|
|
3
|
+
import { type InstanceLockHolder } from "./instance-lock.js";
|
|
4
|
+
/**
|
|
5
|
+
* Exit codes of `doctor --check`, for device management scripts. The first
|
|
6
|
+
* failing check, in this order, decides the code.
|
|
7
|
+
*/
|
|
8
|
+
export declare const doctorCheckExitCodes: Readonly<{
|
|
9
|
+
ok: 0;
|
|
10
|
+
notPaired: 3;
|
|
11
|
+
consentMissing: 4;
|
|
12
|
+
notRunning: 5;
|
|
13
|
+
deliveryStale: 6;
|
|
14
|
+
controlPlaneUnreachable: 7;
|
|
15
|
+
}>;
|
|
16
|
+
export declare const defaultMaxDeliveryAgeMinutes = 15;
|
|
17
|
+
export type DoctorCheckName = "paired" | "consent" | "running" | "delivery" | "control_plane";
|
|
18
|
+
export type DoctorCheck = Readonly<{
|
|
19
|
+
name: DoctorCheckName;
|
|
20
|
+
status: "pass" | "fail" | "skip";
|
|
21
|
+
detail: string;
|
|
22
|
+
}>;
|
|
23
|
+
export type DoctorCheckReport = Readonly<{
|
|
24
|
+
ok: boolean;
|
|
25
|
+
exitCode: number;
|
|
26
|
+
observerVersion: string;
|
|
27
|
+
dataDirectory: string;
|
|
28
|
+
controlPlaneOrigin: string;
|
|
29
|
+
maxDeliveryAgeMinutes: number;
|
|
30
|
+
/** How this computer consented, when it is paired with this server. */
|
|
31
|
+
consent?: ObserverConsentHealth;
|
|
32
|
+
checks: readonly DoctorCheck[];
|
|
33
|
+
checkedAt: string;
|
|
34
|
+
}>;
|
|
35
|
+
export type DoctorCheckOptions = Readonly<{
|
|
36
|
+
config: ObserverConfig;
|
|
37
|
+
observerVersion: string;
|
|
38
|
+
maxDeliveryAgeMinutes?: number;
|
|
39
|
+
now?: () => Date;
|
|
40
|
+
fetcher?: typeof fetch;
|
|
41
|
+
inspectLock?: (dataDirectory: string) => Promise<InstanceLockHolder>;
|
|
42
|
+
probeTimeoutMs?: number;
|
|
43
|
+
}>;
|
|
44
|
+
/**
|
|
45
|
+
* Checks, without sending any activity, that this computer is paired with
|
|
46
|
+
* current consent, that an observer is running, that the workspace has
|
|
47
|
+
* confirmed delivery recently, and that the control plane answers.
|
|
48
|
+
*/
|
|
49
|
+
export declare function runDoctorCheck(options: DoctorCheckOptions): Promise<DoctorCheckReport>;
|
|
50
|
+
export declare function formatDoctorCheck(report: DoctorCheckReport): string;
|
|
51
|
+
//# sourceMappingURL=doctor-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-check.d.ts","sourceRoot":"","sources":["../../src/doctor-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAiB,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAI3E;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;EAO/B,CAAC;AAEH,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAG/C,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,eAAe,CAAC;AAE9F,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uEAAuE;IACvE,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAUH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC,CAAC;AAEH;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA8F5F;AAgDD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAgBnE"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { FileCredentialStore } from "./credential-store.js";
|
|
2
|
+
import { consentHealth } from "./health.js";
|
|
3
|
+
import { InstanceLock } from "./instance-lock.js";
|
|
4
|
+
import { OBSERVER_CONSENT_POLICY_VERSION } from "./pair.js";
|
|
5
|
+
import { StreamStateStore } from "./stream-state.js";
|
|
6
|
+
/**
|
|
7
|
+
* Exit codes of `doctor --check`, for device management scripts. The first
|
|
8
|
+
* failing check, in this order, decides the code.
|
|
9
|
+
*/
|
|
10
|
+
export const doctorCheckExitCodes = Object.freeze({
|
|
11
|
+
ok: 0,
|
|
12
|
+
notPaired: 3,
|
|
13
|
+
consentMissing: 4,
|
|
14
|
+
notRunning: 5,
|
|
15
|
+
deliveryStale: 6,
|
|
16
|
+
controlPlaneUnreachable: 7,
|
|
17
|
+
});
|
|
18
|
+
export const defaultMaxDeliveryAgeMinutes = 15;
|
|
19
|
+
const probeTimeoutMs = 5_000;
|
|
20
|
+
const exitCodeFor = Object.freeze({
|
|
21
|
+
paired: doctorCheckExitCodes.notPaired,
|
|
22
|
+
consent: doctorCheckExitCodes.consentMissing,
|
|
23
|
+
running: doctorCheckExitCodes.notRunning,
|
|
24
|
+
delivery: doctorCheckExitCodes.deliveryStale,
|
|
25
|
+
control_plane: doctorCheckExitCodes.controlPlaneUnreachable,
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Checks, without sending any activity, that this computer is paired with
|
|
29
|
+
* current consent, that an observer is running, that the workspace has
|
|
30
|
+
* confirmed delivery recently, and that the control plane answers.
|
|
31
|
+
*/
|
|
32
|
+
export async function runDoctorCheck(options) {
|
|
33
|
+
const { config } = options;
|
|
34
|
+
const now = (options.now ?? (() => new Date()))();
|
|
35
|
+
const maxAge = options.maxDeliveryAgeMinutes ?? defaultMaxDeliveryAgeMinutes;
|
|
36
|
+
const checks = [];
|
|
37
|
+
let credential = null;
|
|
38
|
+
try {
|
|
39
|
+
credential = await new FileCredentialStore(config.dataDirectory).load();
|
|
40
|
+
if (credential === null) {
|
|
41
|
+
checks.push(fail("paired", "This computer is not paired. Run phigon-observer pair with a code from Connect machine."));
|
|
42
|
+
}
|
|
43
|
+
else if (credential.controlPlaneOrigin !== config.controlPlaneUrl.origin) {
|
|
44
|
+
checks.push(fail("paired", `This computer is paired with ${credential.controlPlaneOrigin}, but the observer is set up for ${config.controlPlaneUrl.origin}.`));
|
|
45
|
+
credential = null;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
checks.push(pass("paired", `Paired as machine ${credential.machineId} with ${credential.controlPlaneOrigin}.`));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
checks.push(fail("paired", error instanceof Error ? error.message : "Stored pairing data could not be read."));
|
|
53
|
+
}
|
|
54
|
+
const consent = credential === null ? undefined : consentHealth(credential);
|
|
55
|
+
if (credential === null || consent === undefined) {
|
|
56
|
+
checks.push(skip("consent", "Needs pairing first."));
|
|
57
|
+
}
|
|
58
|
+
else if (credential.consentProfile === undefined ||
|
|
59
|
+
credential.consentPolicyVersion !== OBSERVER_CONSENT_POLICY_VERSION) {
|
|
60
|
+
// A company's consent is stored only with its profile, so this is an
|
|
61
|
+
// owner's consent from before profiles, or from an older policy.
|
|
62
|
+
checks.push(fail("consent", "The owner's consent is missing or out of date. Pair again with --consent-profile metadata or --consent-profile full."));
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const when = credential.consentedAt === undefined ? "" : ` on ${credential.consentedAt}`;
|
|
66
|
+
checks.push(pass("consent", consent.source === "company"
|
|
67
|
+
? `Your company consented for this computer to the ${credential.consentProfile} profile${consent.enrollmentCodeLabel === undefined ? " with an enrollment code" : ` with the enrollment code "${consent.enrollmentCodeLabel}"`}${when}.`
|
|
68
|
+
: `The owner consented to the ${credential.consentProfile} profile${when}.`));
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const holder = await (options.inspectLock ?? ((directory) => InstanceLock.inspect(directory)))(config.dataDirectory);
|
|
72
|
+
checks.push(holder.running
|
|
73
|
+
? pass("running", `An observer is running with this data directory${holder.pid === undefined ? "" : ` (process ${holder.pid})`}.`)
|
|
74
|
+
: fail("running", "No observer is running with this data directory. Start it with phigon-observer service install, or run phigon-observer run."));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
checks.push(fail("running", "Could not tell whether an observer is running: its lock file could not be read."));
|
|
78
|
+
}
|
|
79
|
+
if (credential === null) {
|
|
80
|
+
checks.push(skip("delivery", "Needs pairing first."));
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
try {
|
|
84
|
+
const state = await new StreamStateStore(config.dataDirectory).load(credential.machineId);
|
|
85
|
+
const confirmedAt = Date.parse(state.updatedAt);
|
|
86
|
+
const minutes = Math.floor((now.getTime() - confirmedAt) / 60_000);
|
|
87
|
+
if (confirmedAt <= 0) {
|
|
88
|
+
checks.push(fail("delivery", "The workspace has not confirmed any delivery from this computer yet."));
|
|
89
|
+
}
|
|
90
|
+
else if (minutes > maxAge) {
|
|
91
|
+
checks.push(fail("delivery", `Nothing has been delivered to the workspace for ${minutes} minutes (last confirmed ${state.updatedAt}).`));
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
checks.push(pass("delivery", `The workspace last confirmed delivery ${Math.max(0, minutes)} minutes ago.`));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
checks.push(fail("delivery", "The stored stream checkpoint could not be read."));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
checks.push(await probeControlPlane(config.controlPlaneUrl, options.fetcher ?? fetch, options.probeTimeoutMs ?? probeTimeoutMs));
|
|
102
|
+
const failed = checks.find((check) => check.status === "fail");
|
|
103
|
+
return Object.freeze({
|
|
104
|
+
ok: failed === undefined,
|
|
105
|
+
exitCode: failed === undefined ? doctorCheckExitCodes.ok : exitCodeFor[failed.name],
|
|
106
|
+
observerVersion: options.observerVersion,
|
|
107
|
+
dataDirectory: config.dataDirectory,
|
|
108
|
+
controlPlaneOrigin: config.controlPlaneUrl.origin,
|
|
109
|
+
maxDeliveryAgeMinutes: maxAge,
|
|
110
|
+
...(consent === undefined ? {} : { consent }),
|
|
111
|
+
checks: Object.freeze(checks),
|
|
112
|
+
checkedAt: now.toISOString(),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/** GET /healthz, through the configured proxy and the pinned authority. */
|
|
116
|
+
async function probeControlPlane(url, fetcher, timeoutMs) {
|
|
117
|
+
const endpoint = new URL("/healthz", url);
|
|
118
|
+
const started = performance.now();
|
|
119
|
+
try {
|
|
120
|
+
const response = await fetcher(endpoint, {
|
|
121
|
+
method: "GET",
|
|
122
|
+
headers: { Accept: "application/json" },
|
|
123
|
+
redirect: "error",
|
|
124
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
125
|
+
});
|
|
126
|
+
await response.body?.cancel().catch(() => undefined);
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
return fail("control_plane", `The control plane at ${url.origin} answered HTTP ${response.status}.`);
|
|
129
|
+
}
|
|
130
|
+
return pass("control_plane", `The control plane at ${url.origin} answered in ${Math.round(performance.now() - started)} ms.`);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
const reason = error instanceof Error && error.name === "TimeoutError"
|
|
134
|
+
? `no answer within ${Math.round(timeoutMs / 1_000)} seconds`
|
|
135
|
+
: errorCode(error) ?? "the connection failed";
|
|
136
|
+
return fail("control_plane", `Could not reach the control plane at ${url.origin} (${reason}).`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** A system error code such as ENOTFOUND or a certificate error, never a message with data. */
|
|
140
|
+
function errorCode(error) {
|
|
141
|
+
for (let current = error, depth = 0; current instanceof Error && depth < 4; depth++) {
|
|
142
|
+
const code = current.code;
|
|
143
|
+
if (typeof code === "string" && /^[A-Z0-9_]{2,64}$/u.test(code))
|
|
144
|
+
return code;
|
|
145
|
+
current = current.cause;
|
|
146
|
+
}
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
function pass(name, detail) {
|
|
150
|
+
return Object.freeze({ name, status: "pass", detail });
|
|
151
|
+
}
|
|
152
|
+
function fail(name, detail) {
|
|
153
|
+
return Object.freeze({ name, status: "fail", detail });
|
|
154
|
+
}
|
|
155
|
+
function skip(name, detail) {
|
|
156
|
+
return Object.freeze({ name, status: "skip", detail });
|
|
157
|
+
}
|
|
158
|
+
export function formatDoctorCheck(report) {
|
|
159
|
+
const labels = {
|
|
160
|
+
paired: "Pairing",
|
|
161
|
+
consent: "Consent",
|
|
162
|
+
running: "Observer",
|
|
163
|
+
delivery: "Delivery",
|
|
164
|
+
control_plane: "Control plane",
|
|
165
|
+
};
|
|
166
|
+
return [
|
|
167
|
+
report.ok
|
|
168
|
+
? "Phigon observer check passed."
|
|
169
|
+
: `Phigon observer check found a problem (exit code ${report.exitCode}).`,
|
|
170
|
+
...report.checks.map((check) => `${check.status === "pass" ? "ok " : check.status === "fail" ? "FAIL" : "skip"} ${labels[check.name].padEnd(13)} ${check.detail}`),
|
|
171
|
+
"",
|
|
172
|
+
].join("\n");
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=doctor-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-check.js","sourceRoot":"","sources":["../../src/doctor-check.ts"],"names":[],"mappings":"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"}
|