@phigon/observer 8.0.1
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 +303 -0
- 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/action-policy.d.ts +38 -0
- package/dist/src/action-policy.d.ts.map +1 -0
- package/dist/src/action-policy.js +269 -0
- package/dist/src/action-policy.js.map +1 -0
- package/dist/src/activity/adapters/claude.d.ts +3 -0
- package/dist/src/activity/adapters/claude.d.ts.map +1 -0
- package/dist/src/activity/adapters/claude.js +89 -0
- package/dist/src/activity/adapters/claude.js.map +1 -0
- package/dist/src/activity/adapters/codex.d.ts +3 -0
- package/dist/src/activity/adapters/codex.d.ts.map +1 -0
- package/dist/src/activity/adapters/codex.js +277 -0
- package/dist/src/activity/adapters/codex.js.map +1 -0
- package/dist/src/activity/adapters/copilot.d.ts +2 -0
- package/dist/src/activity/adapters/copilot.d.ts.map +1 -0
- package/dist/src/activity/adapters/copilot.js +4 -0
- package/dist/src/activity/adapters/copilot.js.map +1 -0
- package/dist/src/activity/adapters/generic.d.ts +2 -0
- package/dist/src/activity/adapters/generic.d.ts.map +1 -0
- package/dist/src/activity/adapters/generic.js +4 -0
- package/dist/src/activity/adapters/generic.js.map +1 -0
- package/dist/src/activity/adapters/hermes.d.ts +2 -0
- package/dist/src/activity/adapters/hermes.d.ts.map +1 -0
- package/dist/src/activity/adapters/hermes.js +4 -0
- package/dist/src/activity/adapters/hermes.js.map +1 -0
- package/dist/src/activity/adapters/openai-compatible.d.ts +4 -0
- package/dist/src/activity/adapters/openai-compatible.d.ts.map +1 -0
- package/dist/src/activity/adapters/openai-compatible.js +116 -0
- package/dist/src/activity/adapters/openai-compatible.js.map +1 -0
- package/dist/src/activity/adapters/openclaw.d.ts +2 -0
- package/dist/src/activity/adapters/openclaw.d.ts.map +1 -0
- package/dist/src/activity/adapters/openclaw.js +4 -0
- package/dist/src/activity/adapters/openclaw.js.map +1 -0
- package/dist/src/activity/adapters/opencode.d.ts +3 -0
- package/dist/src/activity/adapters/opencode.d.ts.map +1 -0
- package/dist/src/activity/adapters/opencode.js +137 -0
- package/dist/src/activity/adapters/opencode.js.map +1 -0
- package/dist/src/activity/bridges.d.ts +7 -0
- package/dist/src/activity/bridges.d.ts.map +1 -0
- package/dist/src/activity/bridges.js +17 -0
- package/dist/src/activity/bridges.js.map +1 -0
- package/dist/src/activity/collector.d.ts +90 -0
- package/dist/src/activity/collector.d.ts.map +1 -0
- package/dist/src/activity/collector.js +706 -0
- package/dist/src/activity/collector.js.map +1 -0
- package/dist/src/activity/index.d.ts +14 -0
- package/dist/src/activity/index.d.ts.map +1 -0
- package/dist/src/activity/index.js +14 -0
- package/dist/src/activity/index.js.map +1 -0
- package/dist/src/activity/ingest.d.ts +15 -0
- package/dist/src/activity/ingest.d.ts.map +1 -0
- package/dist/src/activity/ingest.js +103 -0
- package/dist/src/activity/ingest.js.map +1 -0
- package/dist/src/activity/native-capabilities.d.ts +14 -0
- package/dist/src/activity/native-capabilities.d.ts.map +1 -0
- package/dist/src/activity/native-capabilities.js +85 -0
- package/dist/src/activity/native-capabilities.js.map +1 -0
- package/dist/src/activity/normalize.d.ts +17 -0
- package/dist/src/activity/normalize.d.ts.map +1 -0
- package/dist/src/activity/normalize.js +416 -0
- package/dist/src/activity/normalize.js.map +1 -0
- package/dist/src/activity/opencode-sqlite-source.d.ts +19 -0
- package/dist/src/activity/opencode-sqlite-source.d.ts.map +1 -0
- package/dist/src/activity/opencode-sqlite-source.js +305 -0
- package/dist/src/activity/opencode-sqlite-source.js.map +1 -0
- package/dist/src/activity/policy.d.ts +48 -0
- package/dist/src/activity/policy.d.ts.map +1 -0
- package/dist/src/activity/policy.js +436 -0
- package/dist/src/activity/policy.js.map +1 -0
- package/dist/src/activity/record.d.ts +7 -0
- package/dist/src/activity/record.d.ts.map +1 -0
- package/dist/src/activity/record.js +61 -0
- package/dist/src/activity/record.js.map +1 -0
- package/dist/src/activity/source-reader.d.ts +46 -0
- package/dist/src/activity/source-reader.d.ts.map +1 -0
- package/dist/src/activity/source-reader.js +594 -0
- package/dist/src/activity/source-reader.js.map +1 -0
- package/dist/src/activity/types.d.ts +21 -0
- package/dist/src/activity/types.d.ts.map +1 -0
- package/dist/src/activity/types.js +2 -0
- package/dist/src/activity/types.js.map +1 -0
- package/dist/src/agent-action-executor.d.ts +21 -0
- package/dist/src/agent-action-executor.d.ts.map +1 -0
- package/dist/src/agent-action-executor.js +248 -0
- package/dist/src/agent-action-executor.js.map +1 -0
- package/dist/src/agentic-guardian.d.ts +50 -0
- package/dist/src/agentic-guardian.d.ts.map +1 -0
- package/dist/src/agentic-guardian.js +220 -0
- package/dist/src/agentic-guardian.js.map +1 -0
- package/dist/src/atomic-replace.d.ts +4 -0
- package/dist/src/atomic-replace.d.ts.map +1 -0
- package/dist/src/atomic-replace.js +18 -0
- package/dist/src/atomic-replace.js.map +1 -0
- package/dist/src/cli.d.ts +11 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +1244 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +68 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +260 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/credential-store.d.ts +22 -0
- package/dist/src/credential-store.d.ts.map +1 -0
- package/dist/src/credential-store.js +91 -0
- package/dist/src/credential-store.js.map +1 -0
- package/dist/src/custom-agent-registry.d.ts +26 -0
- package/dist/src/custom-agent-registry.d.ts.map +1 -0
- package/dist/src/custom-agent-registry.js +288 -0
- package/dist/src/custom-agent-registry.js.map +1 -0
- package/dist/src/discovery/adapters/claude.d.ts +3 -0
- package/dist/src/discovery/adapters/claude.d.ts.map +1 -0
- package/dist/src/discovery/adapters/claude.js +26 -0
- package/dist/src/discovery/adapters/claude.js.map +1 -0
- package/dist/src/discovery/adapters/codex.d.ts +3 -0
- package/dist/src/discovery/adapters/codex.d.ts.map +1 -0
- package/dist/src/discovery/adapters/codex.js +23 -0
- package/dist/src/discovery/adapters/codex.js.map +1 -0
- package/dist/src/discovery/adapters/custom.d.ts +4 -0
- package/dist/src/discovery/adapters/custom.d.ts.map +1 -0
- package/dist/src/discovery/adapters/custom.js +24 -0
- package/dist/src/discovery/adapters/custom.js.map +1 -0
- package/dist/src/discovery/adapters/generic.d.ts +3 -0
- package/dist/src/discovery/adapters/generic.d.ts.map +1 -0
- package/dist/src/discovery/adapters/generic.js +126 -0
- package/dist/src/discovery/adapters/generic.js.map +1 -0
- package/dist/src/discovery/adapters/hermes.d.ts +3 -0
- package/dist/src/discovery/adapters/hermes.d.ts.map +1 -0
- package/dist/src/discovery/adapters/hermes.js +22 -0
- package/dist/src/discovery/adapters/hermes.js.map +1 -0
- package/dist/src/discovery/adapters/openclaw.d.ts +3 -0
- package/dist/src/discovery/adapters/openclaw.d.ts.map +1 -0
- package/dist/src/discovery/adapters/openclaw.js +22 -0
- package/dist/src/discovery/adapters/openclaw.js.map +1 -0
- package/dist/src/discovery/engine.d.ts +17 -0
- package/dist/src/discovery/engine.d.ts.map +1 -0
- package/dist/src/discovery/engine.js +164 -0
- package/dist/src/discovery/engine.js.map +1 -0
- package/dist/src/discovery/evidence.d.ts +29 -0
- package/dist/src/discovery/evidence.d.ts.map +1 -0
- package/dist/src/discovery/evidence.js +2 -0
- package/dist/src/discovery/evidence.js.map +1 -0
- package/dist/src/discovery/index.d.ts +11 -0
- package/dist/src/discovery/index.d.ts.map +1 -0
- package/dist/src/discovery/index.js +11 -0
- package/dist/src/discovery/index.js.map +1 -0
- package/dist/src/discovery/known-agent.d.ts +17 -0
- package/dist/src/discovery/known-agent.d.ts.map +1 -0
- package/dist/src/discovery/known-agent.js +193 -0
- package/dist/src/discovery/known-agent.js.map +1 -0
- package/dist/src/discovery/process-identity.d.ts +19 -0
- package/dist/src/discovery/process-identity.d.ts.map +1 -0
- package/dist/src/discovery/process-identity.js +73 -0
- package/dist/src/discovery/process-identity.js.map +1 -0
- package/dist/src/discovery/system-evidence.d.ts +9 -0
- package/dist/src/discovery/system-evidence.d.ts.map +1 -0
- package/dist/src/discovery/system-evidence.js +270 -0
- package/dist/src/discovery/system-evidence.js.map +1 -0
- package/dist/src/discovery/types.d.ts +21 -0
- package/dist/src/discovery/types.d.ts.map +1 -0
- package/dist/src/discovery/types.js +2 -0
- package/dist/src/discovery/types.js.map +1 -0
- package/dist/src/event-queue.d.ts +32 -0
- package/dist/src/event-queue.d.ts.map +1 -0
- package/dist/src/event-queue.js +125 -0
- package/dist/src/event-queue.js.map +1 -0
- package/dist/src/event-spool.d.ts +19 -0
- package/dist/src/event-spool.d.ts.map +1 -0
- package/dist/src/event-spool.js +350 -0
- package/dist/src/event-spool.js.map +1 -0
- package/dist/src/generated/phigon/v1/action_pb.d.ts +223 -0
- package/dist/src/generated/phigon/v1/action_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/action_pb.js +96 -0
- package/dist/src/generated/phigon/v1/action_pb.js.map +1 -0
- package/dist/src/generated/phigon/v1/common_pb.d.ts +255 -0
- package/dist/src/generated/phigon/v1/common_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/common_pb.js +242 -0
- package/dist/src/generated/phigon/v1/common_pb.js.map +1 -0
- package/dist/src/generated/phigon/v1/history_sync_pb.d.ts +119 -0
- package/dist/src/generated/phigon/v1/history_sync_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/history_sync_pb.js +46 -0
- package/dist/src/generated/phigon/v1/history_sync_pb.js.map +1 -0
- package/dist/src/generated/phigon/v1/identity_pb.d.ts +235 -0
- package/dist/src/generated/phigon/v1/identity_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/identity_pb.js +31 -0
- package/dist/src/generated/phigon/v1/identity_pb.js.map +1 -0
- package/dist/src/generated/phigon/v1/observer_service_pb.d.ts +362 -0
- package/dist/src/generated/phigon/v1/observer_service_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/observer_service_pb.js +120 -0
- package/dist/src/generated/phigon/v1/observer_service_pb.js.map +1 -0
- package/dist/src/generated/phigon/v1/policy_pb.d.ts +456 -0
- package/dist/src/generated/phigon/v1/policy_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/policy_pb.js +161 -0
- package/dist/src/generated/phigon/v1/policy_pb.js.map +1 -0
- package/dist/src/generated/phigon/v1/supervision_pb.d.ts +849 -0
- package/dist/src/generated/phigon/v1/supervision_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/supervision_pb.js +384 -0
- package/dist/src/generated/phigon/v1/supervision_pb.js.map +1 -0
- package/dist/src/generated/phigon/v1/telemetry_pb.d.ts +761 -0
- package/dist/src/generated/phigon/v1/telemetry_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/telemetry_pb.js +309 -0
- package/dist/src/generated/phigon/v1/telemetry_pb.js.map +1 -0
- package/dist/src/guardian-containment.d.ts +30 -0
- package/dist/src/guardian-containment.d.ts.map +1 -0
- package/dist/src/guardian-containment.js +113 -0
- package/dist/src/guardian-containment.js.map +1 -0
- package/dist/src/guardian-decision-journal.d.ts +29 -0
- package/dist/src/guardian-decision-journal.d.ts.map +1 -0
- package/dist/src/guardian-decision-journal.js +55 -0
- package/dist/src/guardian-decision-journal.js.map +1 -0
- package/dist/src/guardian-execution-manifest.d.ts +29 -0
- package/dist/src/guardian-execution-manifest.d.ts.map +1 -0
- package/dist/src/guardian-execution-manifest.js +95 -0
- package/dist/src/guardian-execution-manifest.js.map +1 -0
- package/dist/src/guardian-hosted-client.d.ts +10 -0
- package/dist/src/guardian-hosted-client.d.ts.map +1 -0
- package/dist/src/guardian-hosted-client.js +45 -0
- package/dist/src/guardian-hosted-client.js.map +1 -0
- package/dist/src/guardian-managed-exec.d.ts +21 -0
- package/dist/src/guardian-managed-exec.d.ts.map +1 -0
- package/dist/src/guardian-managed-exec.js +249 -0
- package/dist/src/guardian-managed-exec.js.map +1 -0
- package/dist/src/guardian-model-bridge.d.ts +13 -0
- package/dist/src/guardian-model-bridge.d.ts.map +1 -0
- package/dist/src/guardian-model-bridge.js +87 -0
- package/dist/src/guardian-model-bridge.js.map +1 -0
- package/dist/src/guardian-native.d.ts +3 -0
- package/dist/src/guardian-native.d.ts.map +1 -0
- package/dist/src/guardian-native.js +13 -0
- package/dist/src/guardian-native.js.map +1 -0
- package/dist/src/guardian-process-monitor.d.ts +20 -0
- package/dist/src/guardian-process-monitor.d.ts.map +1 -0
- package/dist/src/guardian-process-monitor.js +98 -0
- package/dist/src/guardian-process-monitor.js.map +1 -0
- package/dist/src/health.d.ts +35 -0
- package/dist/src/health.d.ts.map +1 -0
- package/dist/src/health.js +41 -0
- package/dist/src/health.js.map +1 -0
- package/dist/src/historical-identity-store.d.ts +20 -0
- package/dist/src/historical-identity-store.d.ts.map +1 -0
- package/dist/src/historical-identity-store.js +391 -0
- package/dist/src/historical-identity-store.js.map +1 -0
- package/dist/src/index.d.ts +14 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +14 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/installation.d.ts +2 -0
- package/dist/src/installation.d.ts.map +1 -0
- package/dist/src/installation.js +44 -0
- package/dist/src/installation.js.map +1 -0
- package/dist/src/machine-command-executor.d.ts +28 -0
- package/dist/src/machine-command-executor.d.ts.map +1 -0
- package/dist/src/machine-command-executor.js +166 -0
- package/dist/src/machine-command-executor.js.map +1 -0
- package/dist/src/pair.d.ts +21 -0
- package/dist/src/pair.d.ts.map +1 -0
- package/dist/src/pair.js +125 -0
- package/dist/src/pair.js.map +1 -0
- package/dist/src/remove-machine.d.ts +15 -0
- package/dist/src/remove-machine.d.ts.map +1 -0
- package/dist/src/remove-machine.js +77 -0
- package/dist/src/remove-machine.js.map +1 -0
- package/dist/src/stream-client.d.ts +42 -0
- package/dist/src/stream-client.d.ts.map +1 -0
- package/dist/src/stream-client.js +867 -0
- package/dist/src/stream-client.js.map +1 -0
- package/dist/src/stream-state.d.ts +13 -0
- package/dist/src/stream-state.d.ts.map +1 -0
- package/dist/src/stream-state.js +128 -0
- package/dist/src/stream-state.js.map +1 -0
- package/dist/src/windows-process.d.ts +7 -0
- package/dist/src/windows-process.d.ts.map +1 -0
- package/dist/src/windows-process.js +17 -0
- package/dist/src/windows-process.js.map +1 -0
- package/package.json +78 -0
- package/scripts/install.mjs +308 -0
- package/scripts/managed-service.mjs +132 -0
- package/scripts/verify-guardian-release.mjs +42 -0
- package/scripts/windows-app-control.mjs +117 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historical-identity-store.js","sourceRoot":"","sources":["../../src/historical-identity-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { loadConfig, type CollectionPolicy, type ObserverConfig, type ObserverLogLevel, type ObservabilityProfile, type ActivitySourceDirectories, } from "./config.js";
|
|
2
|
+
export { createHealthSnapshot, type ObserverHealth, } from "./health.js";
|
|
3
|
+
export { FileCredentialStore, type CredentialStore, type StoredMachineCredential, } from "./credential-store.js";
|
|
4
|
+
export { removeMachine, type RemoveMachineResult, } from "./remove-machine.js";
|
|
5
|
+
export { CustomAgentRegistry, customAgentRegistration, type CustomAgentRegistration, } from "./custom-agent-registry.js";
|
|
6
|
+
export { pairMachine, type PairOptions, type PairResult, } from "./pair.js";
|
|
7
|
+
export { BoundedEventQueue, type QueueMetrics, } from "./event-queue.js";
|
|
8
|
+
export { FileBackedEventQueue, clearEventSpool, } from "./event-spool.js";
|
|
9
|
+
export { ObserverStreamClient, type ObserverStreamMetrics, type StreamClientOptions, } from "./stream-client.js";
|
|
10
|
+
export { StreamStateStore, type StreamState, } from "./stream-state.js";
|
|
11
|
+
export { FileActionPolicyStore, managedActionNames, type ActionPolicyPersistence, type ManagedActionName, type StoredActionPolicy, } from "./action-policy.js";
|
|
12
|
+
export * from "./discovery/index.js";
|
|
13
|
+
export * from "./activity/index.js";
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,GAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,uBAAuB,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,uBAAuB,GAC7B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAChB,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { loadConfig, } from "./config.js";
|
|
2
|
+
export { createHealthSnapshot, } from "./health.js";
|
|
3
|
+
export { FileCredentialStore, } from "./credential-store.js";
|
|
4
|
+
export { removeMachine, } from "./remove-machine.js";
|
|
5
|
+
export { CustomAgentRegistry, customAgentRegistration, } from "./custom-agent-registry.js";
|
|
6
|
+
export { pairMachine, } from "./pair.js";
|
|
7
|
+
export { BoundedEventQueue, } from "./event-queue.js";
|
|
8
|
+
export { FileBackedEventQueue, clearEventSpool, } from "./event-spool.js";
|
|
9
|
+
export { ObserverStreamClient, } from "./stream-client.js";
|
|
10
|
+
export { StreamStateStore, } from "./stream-state.js";
|
|
11
|
+
export { FileActionPolicyStore, managedActionNames, } from "./action-policy.js";
|
|
12
|
+
export * from "./discovery/index.js";
|
|
13
|
+
export * from "./activity/index.js";
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,GAMX,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,GAErB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,GAGpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,aAAa,GAEd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,uBAAuB,GAExB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,WAAW,GAGZ,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,GAGrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,GAEjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GAInB,MAAM,oBAAoB,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installation.d.ts","sourceRoot":"","sources":["../../src/installation.ts"],"names":[],"mappings":"AAOA,wBAAsB,0BAA0B,CAC9C,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAkCjB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
5
|
+
export async function loadOrCreateInstallationID(dataDirectory) {
|
|
6
|
+
await mkdir(dataDirectory, { recursive: true, mode: 0o700 });
|
|
7
|
+
await chmod(dataDirectory, 0o700);
|
|
8
|
+
const installationPath = join(dataDirectory, "installation-id");
|
|
9
|
+
try {
|
|
10
|
+
const existing = (await readFile(installationPath, "utf8")).trim();
|
|
11
|
+
if (!uuidPattern.test(existing)) {
|
|
12
|
+
throw new Error("Stored observer installation ID is invalid.");
|
|
13
|
+
}
|
|
14
|
+
return existing;
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (!isNodeError(error) || error.code !== "ENOENT") {
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const installationID = randomUUID();
|
|
22
|
+
try {
|
|
23
|
+
await writeFile(installationPath, `${installationID}\n`, {
|
|
24
|
+
encoding: "utf8",
|
|
25
|
+
flag: "wx",
|
|
26
|
+
mode: 0o600,
|
|
27
|
+
});
|
|
28
|
+
return installationID;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (!isNodeError(error) || error.code !== "EEXIST") {
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
const existing = (await readFile(installationPath, "utf8")).trim();
|
|
35
|
+
if (!uuidPattern.test(existing)) {
|
|
36
|
+
throw new Error("Stored observer installation ID is invalid.");
|
|
37
|
+
}
|
|
38
|
+
return existing;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function isNodeError(error) {
|
|
42
|
+
return error instanceof Error && "code" in error;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=installation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installation.js","sourceRoot":"","sources":["../../src/installation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,WAAW,GACf,4EAA4E,CAAC;AAE/E,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,aAAqB;IAErB,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAClC,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,gBAAgB,EAAE,GAAG,cAAc,IAAI,EAAE;YACvD,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,OAAO,cAAc,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { RemoteActionType as Action, type AgentActionCommand, type AgentActionResult } from "./generated/phigon/v1/action_pb.js";
|
|
2
|
+
export declare const machineActionTypes: readonly Action[];
|
|
3
|
+
export type CommandSpec = {
|
|
4
|
+
executable: string;
|
|
5
|
+
arguments: string[];
|
|
6
|
+
working_directory?: string;
|
|
7
|
+
timeout_seconds: number;
|
|
8
|
+
};
|
|
9
|
+
export declare function parseCommand(value: string): CommandSpec | null;
|
|
10
|
+
/** Separate machine-owner enrollment; durable claims prevent crash/retry execution. */
|
|
11
|
+
export declare class MachineCommandExecutor {
|
|
12
|
+
#private;
|
|
13
|
+
constructor(options: {
|
|
14
|
+
enabled: boolean;
|
|
15
|
+
machineID: string;
|
|
16
|
+
dataDirectory: string;
|
|
17
|
+
});
|
|
18
|
+
execute(command: AgentActionCommand): Promise<AgentActionResult>;
|
|
19
|
+
}
|
|
20
|
+
export declare function powerCommand(restart: boolean): CommandSpec;
|
|
21
|
+
export declare function redactCommandOutput(value: string): string;
|
|
22
|
+
export declare function runCommand(spec: CommandSpec): Promise<{
|
|
23
|
+
output: string;
|
|
24
|
+
exitCode: number | null;
|
|
25
|
+
truncated: boolean;
|
|
26
|
+
timedOut: boolean;
|
|
27
|
+
}>;
|
|
28
|
+
//# sourceMappingURL=machine-command-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine-command-executor.d.ts","sourceRoot":"","sources":["../../src/machine-command-executor.ts"],"names":[],"mappings":"AAOA,OAAO,EAA6D,gBAAgB,IAAI,MAAM,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAE5L,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAAiG,CAAC;AAClJ,MAAM,MAAM,WAAW,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC;AAI3H,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAa9D;AAED,uFAAuF;AACvF,qBAAa,sBAAsB;;gBAGrB,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;IACnF,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA0DjE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAI1D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAyB/I"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
4
|
+
import { cpus, freemem, hostname, platform, release, totalmem, uptime } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { create, fromJsonString, toJsonString } from "@bufbuild/protobuf";
|
|
7
|
+
import { timestampDate, timestampFromDate } from "@bufbuild/protobuf/wkt";
|
|
8
|
+
import { AgentActionResultSchema, RemoteActionResultState as State, RemoteActionType as Action } from "./generated/phigon/v1/action_pb.js";
|
|
9
|
+
export const machineActionTypes = [Action.RUN_COMMAND, Action.INSPECT_SYSTEM, Action.SHUTDOWN_MACHINE, Action.RESTART_MACHINE];
|
|
10
|
+
const outputLimit = 32768;
|
|
11
|
+
const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;
|
|
12
|
+
export function parseCommand(value) {
|
|
13
|
+
let input;
|
|
14
|
+
try {
|
|
15
|
+
input = JSON.parse(value);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
21
|
+
return null;
|
|
22
|
+
const item = input;
|
|
23
|
+
if (Object.keys(item).some((key) => !["executable", "arguments", "working_directory", "timeout_seconds"].includes(key)))
|
|
24
|
+
return null;
|
|
25
|
+
const bounded = (v, max) => typeof v === "string" && Buffer.byteLength(v) <= max && !v.includes("\0");
|
|
26
|
+
if (!bounded(item["executable"], 2048) || !item["executable"].trim() || !Array.isArray(item["arguments"]) || item["arguments"].length > 64 ||
|
|
27
|
+
!item["arguments"].every((arg) => bounded(arg, 4096)) ||
|
|
28
|
+
(item["working_directory"] !== undefined && !bounded(item["working_directory"], 2048)) ||
|
|
29
|
+
!Number.isInteger(item["timeout_seconds"]) || Number(item["timeout_seconds"]) < 1 || Number(item["timeout_seconds"]) > 120)
|
|
30
|
+
return null;
|
|
31
|
+
if (Buffer.byteLength(item["executable"] + String(item["working_directory"] ?? "") + item["arguments"].join("")) > 12288)
|
|
32
|
+
return null;
|
|
33
|
+
return item;
|
|
34
|
+
}
|
|
35
|
+
/** Separate machine-owner enrollment; durable claims prevent crash/retry execution. */
|
|
36
|
+
export class MachineCommandExecutor {
|
|
37
|
+
#options;
|
|
38
|
+
#queue = Promise.resolve();
|
|
39
|
+
constructor(options) { this.#options = options; }
|
|
40
|
+
execute(command) {
|
|
41
|
+
const task = this.#queue.then(() => this.#execute(command)).catch(() => create(AgentActionResultSchema, {
|
|
42
|
+
actionId: command.actionId, idempotencyKey: command.idempotencyKey, machineId: this.#options.machineID,
|
|
43
|
+
observedAt: timestampFromDate(new Date()), state: State.FAILED,
|
|
44
|
+
resultCode: "execution_journal_unavailable", detail: "Execution could not be confirmed from its durable record. Check the system before issuing another request.",
|
|
45
|
+
}));
|
|
46
|
+
this.#queue = task.catch(() => undefined);
|
|
47
|
+
return task;
|
|
48
|
+
}
|
|
49
|
+
async #execute(command) {
|
|
50
|
+
const receipt = (state, resultCode, detail, extra = {}) => create(AgentActionResultSchema, {
|
|
51
|
+
actionId: command.actionId, idempotencyKey: command.idempotencyKey, machineId: this.#options.machineID,
|
|
52
|
+
observedAt: timestampFromDate(new Date()), state, resultCode, detail, ...extra,
|
|
53
|
+
});
|
|
54
|
+
if (!this.#options.enabled)
|
|
55
|
+
return receipt(State.REJECTED, "executor_disabled", "Machine owner has not enabled remote commands.");
|
|
56
|
+
if (command.machineId !== this.#options.machineID || !uuid.test(command.actionId) || !uuid.test(command.idempotencyKey) ||
|
|
57
|
+
!machineActionTypes.includes(command.action) || command.agentId !== "__machine__" || command.processId !== 0n || !command.expiresAt) {
|
|
58
|
+
return receipt(State.REJECTED, "invalid_command", "Machine command identity or capability is invalid.");
|
|
59
|
+
}
|
|
60
|
+
const expires = timestampDate(command.expiresAt).getTime();
|
|
61
|
+
if (!Number.isFinite(expires) || expires > Date.now() + 330_000)
|
|
62
|
+
return receipt(State.EXPIRED, "command_expired", "Command is outside its approved execution window.");
|
|
63
|
+
const spec = command.action === Action.RUN_COMMAND ? parseCommand(command.commandJson) : null;
|
|
64
|
+
if ((command.action === Action.RUN_COMMAND && !spec) || (command.action !== Action.RUN_COMMAND && !["", "null"].includes(command.commandJson)))
|
|
65
|
+
return receipt(State.REJECTED, "invalid_command", "Executable, arguments, or limits are invalid.");
|
|
66
|
+
const digest = createHash("sha256").update(JSON.stringify([command.actionId, command.machineId, command.action, command.commandJson, command.reason, expires])).digest("hex");
|
|
67
|
+
const directory = join(this.#options.dataDirectory, "machine-operation-receipts");
|
|
68
|
+
const path = join(directory, `${command.idempotencyKey}.json`);
|
|
69
|
+
try {
|
|
70
|
+
const stored = JSON.parse(await readFile(path, "utf8"));
|
|
71
|
+
return stored.digest === digest ? fromJsonString(AgentActionResultSchema, stored.receipt) : receipt(State.REJECTED, "idempotency_conflict", "This request key belongs to a different command.");
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (error.code !== "ENOENT")
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
if (expires <= Date.now())
|
|
78
|
+
return receipt(State.EXPIRED, "command_expired", "Command expired before execution.");
|
|
79
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
80
|
+
const uncertain = receipt(State.FAILED, "execution_interrupted", "Execution was claimed but no completion receipt is available. It will not be repeated automatically.");
|
|
81
|
+
try {
|
|
82
|
+
await writeFile(path, JSON.stringify({ digest, receipt: toJsonString(AgentActionResultSchema, uncertain) }), { flag: "wx", mode: 0o600, flush: true });
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (error.code !== "EEXIST")
|
|
86
|
+
throw error;
|
|
87
|
+
const stored = JSON.parse(await readFile(path, "utf8"));
|
|
88
|
+
return stored.digest === digest ? fromJsonString(AgentActionResultSchema, stored.receipt) : receipt(State.REJECTED, "idempotency_conflict", "This request key belongs to a different command.");
|
|
89
|
+
}
|
|
90
|
+
let result;
|
|
91
|
+
if (command.action === Action.INSPECT_SYSTEM) {
|
|
92
|
+
result = receipt(State.SUCCEEDED, "inspection_complete", "Current operating-system information collected.", { output: JSON.stringify({ hostname: hostname(), platform: platform(), release: release(), logical_cpus: cpus().length, memory_bytes: totalmem(), free_memory_bytes: freemem(), uptime_seconds: Math.floor(uptime()), observed_at: new Date().toISOString() }, null, 2), exitCode: 0 });
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const power = command.action === Action.SHUTDOWN_MACHINE || command.action === Action.RESTART_MACHINE;
|
|
96
|
+
const operation = power ? powerCommand(command.action === Action.RESTART_MACHINE) : spec;
|
|
97
|
+
const execution = await runCommand(operation);
|
|
98
|
+
const succeeded = execution.exitCode === 0 && !execution.timedOut;
|
|
99
|
+
result = receipt(succeeded ? State.SUCCEEDED : State.FAILED, execution.timedOut ? "command_timeout" : succeeded ? (power ? "power_change_scheduled" : "command_completed") : "command_failed", execution.timedOut ? "Command exceeded its time limit; termination was requested." : power && succeeded ? "Operating system accepted the power change scheduled for one minute from now." : succeeded ? "Command completed." : "Command did not complete successfully.", { output: execution.output, outputTruncated: execution.truncated, ...(execution.exitCode === null ? {} : { exitCode: execution.exitCode }) });
|
|
100
|
+
}
|
|
101
|
+
const temporary = `${path}.tmp`;
|
|
102
|
+
await writeFile(temporary, JSON.stringify({ digest, receipt: toJsonString(AgentActionResultSchema, result) }), { mode: 0o600, flush: true });
|
|
103
|
+
await rename(temporary, path);
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export function powerCommand(restart) {
|
|
108
|
+
return process.platform === "win32"
|
|
109
|
+
? { executable: join(process.env["SystemRoot"] ?? "C:\\Windows", "System32", "shutdown.exe"), arguments: [restart ? "/r" : "/s", "/t", "60"], timeout_seconds: 10 }
|
|
110
|
+
: { executable: "/sbin/shutdown", arguments: [restart ? "-r" : "-h", "+1"], timeout_seconds: 10 };
|
|
111
|
+
}
|
|
112
|
+
export function redactCommandOutput(value) {
|
|
113
|
+
let safe = value.replace(/\x1b\[[0-?]*[ -/]*[@-~]/gu, "").replace(/\b(?:sk-[A-Za-z0-9_-]{16,}|gh[pousr]_[A-Za-z0-9]{20,}|AKIA[0-9A-Z]{16})\b/gu, "[REDACTED]")
|
|
114
|
+
.replace(/(Bearer\s+)[A-Za-z0-9._~+/=-]{12,}/giu, "$1[REDACTED]")
|
|
115
|
+
.replace(/(["']?(?:api[_-]?key|access[_-]?token|client[_-]?secret|password)["']?\s*[:=]\s*["']?)[^"',\s}]{6,}/giu, "$1[REDACTED]");
|
|
116
|
+
for (const [key, secret] of Object.entries(process.env))
|
|
117
|
+
if (/TOKEN|SECRET|PASSWORD|API_KEY/iu.test(key) && secret && secret.length >= 8)
|
|
118
|
+
safe = safe.split(secret).join("[REDACTED]");
|
|
119
|
+
return safe;
|
|
120
|
+
}
|
|
121
|
+
export async function runCommand(spec) {
|
|
122
|
+
return new Promise((resolve) => {
|
|
123
|
+
const env = Object.fromEntries(Object.entries(process.env).filter(([key]) => !/^PHIGON_|TOKEN|SECRET|PASSWORD|API_KEY/iu.test(key)));
|
|
124
|
+
const child = spawn(spec.executable, spec.arguments, { shell: false, windowsHide: true, detached: process.platform !== "win32", stdio: ["ignore", "pipe", "pipe"], env, ...(spec.working_directory ? { cwd: spec.working_directory } : {}) });
|
|
125
|
+
let collected = Buffer.alloc(0);
|
|
126
|
+
let truncated = false;
|
|
127
|
+
let timedOut = false;
|
|
128
|
+
let done = false;
|
|
129
|
+
const consume = (chunk) => { const remaining = outputLimit - collected.length; if (chunk.length > remaining)
|
|
130
|
+
truncated = true; if (remaining > 0)
|
|
131
|
+
collected = Buffer.concat([collected, chunk.subarray(0, remaining)]); };
|
|
132
|
+
const finish = (exitCode) => {
|
|
133
|
+
if (done)
|
|
134
|
+
return;
|
|
135
|
+
done = true;
|
|
136
|
+
clearTimeout(timeout);
|
|
137
|
+
clearTimeout(hardDeadline);
|
|
138
|
+
const safe = Buffer.from(redactCommandOutput(collected.toString("utf8")));
|
|
139
|
+
// Leave room for a final UTF-8 replacement character after a byte boundary.
|
|
140
|
+
const output = safe.subarray(0, outputLimit - 4).toString("utf8");
|
|
141
|
+
resolve({ output, exitCode, truncated: truncated || safe.length > outputLimit - 4, timedOut });
|
|
142
|
+
};
|
|
143
|
+
child.stdout.on("data", consume);
|
|
144
|
+
child.stderr.on("data", consume);
|
|
145
|
+
child.once("error", () => { consume(Buffer.from("Operating system could not launch the requested executable.")); finish(null); });
|
|
146
|
+
child.once("close", (code) => finish(code));
|
|
147
|
+
const timeout = setTimeout(() => {
|
|
148
|
+
timedOut = true;
|
|
149
|
+
if (process.platform === "win32" && child.pid) {
|
|
150
|
+
const killer = spawn(join(process.env["SystemRoot"] ?? "C:\\Windows", "System32", "taskkill.exe"), ["/PID", String(child.pid), "/T", "/F"], { windowsHide: true, stdio: "ignore" });
|
|
151
|
+
killer.on("error", () => child.kill());
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
try {
|
|
155
|
+
if (child.pid)
|
|
156
|
+
process.kill(-child.pid, "SIGKILL");
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
child.kill("SIGKILL");
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}, spec.timeout_seconds * 1000);
|
|
163
|
+
const hardDeadline = setTimeout(() => { child.stdout.destroy(); child.stderr.destroy(); child.unref(); finish(null); }, spec.timeout_seconds * 1000 + 3000);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=machine-command-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine-command-executor.js","sourceRoot":"","sources":["../../src/machine-command-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ObserverConfig } from "./config.js";
|
|
2
|
+
import { type CredentialStore } from "./credential-store.js";
|
|
3
|
+
export declare const OBSERVER_CONSENT_POLICY_VERSION = "observer-policy-v1";
|
|
4
|
+
export type ConsentProfile = "metadata" | "full";
|
|
5
|
+
export type PairResult = Readonly<{
|
|
6
|
+
machineId: string;
|
|
7
|
+
displayName: string;
|
|
8
|
+
state: string;
|
|
9
|
+
controlPlaneOrigin: string;
|
|
10
|
+
credentialStored: true;
|
|
11
|
+
}>;
|
|
12
|
+
export type PairOptions = Readonly<{
|
|
13
|
+
config: ObserverConfig;
|
|
14
|
+
code: string;
|
|
15
|
+
displayName?: string;
|
|
16
|
+
consentProfile: ConsentProfile;
|
|
17
|
+
credentialStore?: CredentialStore;
|
|
18
|
+
fetcher?: typeof fetch;
|
|
19
|
+
}>;
|
|
20
|
+
export declare function pairMachine(options: PairOptions): Promise<PairResult>;
|
|
21
|
+
//# sourceMappingURL=pair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pair.d.ts","sourceRoot":"","sources":["../../src/pair.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAG/B,eAAO,MAAM,+BAA+B,uBAAuB,CAAC;AACpE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,MAAM,CAAC;AAcjD,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,IAAI,CAAC;CACxB,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB,CAAC,CAAC;AAEH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAsF3E"}
|
package/dist/src/pair.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { arch, hostname, platform } from "node:os";
|
|
2
|
+
import { FileCredentialStore, } from "./credential-store.js";
|
|
3
|
+
import { loadOrCreateInstallationID } from "./installation.js";
|
|
4
|
+
export const OBSERVER_CONSENT_POLICY_VERSION = "observer-policy-v1";
|
|
5
|
+
export async function pairMachine(options) {
|
|
6
|
+
const code = options.code.trim();
|
|
7
|
+
if (code.length === 0) {
|
|
8
|
+
throw new Error("Pairing code is required.");
|
|
9
|
+
}
|
|
10
|
+
const installationID = await loadOrCreateInstallationID(options.config.dataDirectory);
|
|
11
|
+
if (options.config.observabilityProfile === "full" &&
|
|
12
|
+
options.consentProfile !== "full") {
|
|
13
|
+
throw new Error("The configured full observability profile requires full-content consent.");
|
|
14
|
+
}
|
|
15
|
+
const endpoint = new URL("/v1/pairing/exchange", options.config.controlPlaneUrl);
|
|
16
|
+
const fetcher = options.fetcher ?? fetch;
|
|
17
|
+
const credentialStore = options.credentialStore ??
|
|
18
|
+
new FileCredentialStore(options.config.dataDirectory);
|
|
19
|
+
const previous = await credentialStore.load();
|
|
20
|
+
if (previous !== null && previous.controlPlaneOrigin !== endpoint.origin) {
|
|
21
|
+
throw new Error("The stored machine belongs to a different control plane. Use a separate data directory to pair another workspace.");
|
|
22
|
+
}
|
|
23
|
+
let response;
|
|
24
|
+
try {
|
|
25
|
+
response = await fetcher(endpoint, {
|
|
26
|
+
method: "POST",
|
|
27
|
+
headers: {
|
|
28
|
+
"Content-Type": "application/json",
|
|
29
|
+
Accept: "application/json",
|
|
30
|
+
},
|
|
31
|
+
body: JSON.stringify({
|
|
32
|
+
code,
|
|
33
|
+
...(previous === null ? {} : { existing_credential: previous.credential }),
|
|
34
|
+
installation_id: installationID,
|
|
35
|
+
display_name: options.displayName?.trim() || hostname(),
|
|
36
|
+
hostname: hostname(),
|
|
37
|
+
operating_system: normalizedOperatingSystem(),
|
|
38
|
+
architecture: arch(),
|
|
39
|
+
consent: {
|
|
40
|
+
granted: true,
|
|
41
|
+
profile: options.consentProfile,
|
|
42
|
+
policy_version: OBSERVER_CONSENT_POLICY_VERSION,
|
|
43
|
+
},
|
|
44
|
+
}),
|
|
45
|
+
redirect: "error",
|
|
46
|
+
signal: AbortSignal.timeout(10_000),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (error instanceof Error && error.name === "TimeoutError") {
|
|
51
|
+
throw new Error(`Pairing timed out while contacting ${endpoint.origin}. Try again.`);
|
|
52
|
+
}
|
|
53
|
+
throw new Error(`Could not reach ${endpoint.origin}. Check your internet connection and try again.`);
|
|
54
|
+
}
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
throw new Error(await pairingFailureMessage(response));
|
|
57
|
+
}
|
|
58
|
+
const value = await response.json();
|
|
59
|
+
const paired = parsePairingResponse(value);
|
|
60
|
+
await credentialStore.save({
|
|
61
|
+
machineId: paired.machine.id,
|
|
62
|
+
tenantId: paired.machine.tenant_id,
|
|
63
|
+
credential: paired.credential,
|
|
64
|
+
controlPlaneOrigin: options.config.controlPlaneUrl.origin,
|
|
65
|
+
createdAt: new Date().toISOString(),
|
|
66
|
+
consentProfile: options.consentProfile,
|
|
67
|
+
consentPolicyVersion: OBSERVER_CONSENT_POLICY_VERSION,
|
|
68
|
+
consentedAt: new Date().toISOString(),
|
|
69
|
+
});
|
|
70
|
+
return Object.freeze({
|
|
71
|
+
machineId: paired.machine.id,
|
|
72
|
+
displayName: paired.machine.display_name,
|
|
73
|
+
state: paired.machine.state,
|
|
74
|
+
controlPlaneOrigin: options.config.controlPlaneUrl.origin,
|
|
75
|
+
credentialStored: true,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function parsePairingResponse(value) {
|
|
79
|
+
if (typeof value !== "object" ||
|
|
80
|
+
value === null ||
|
|
81
|
+
!("credential" in value) ||
|
|
82
|
+
typeof value.credential !== "string" ||
|
|
83
|
+
!value.credential.startsWith("phg_m_") ||
|
|
84
|
+
!("machine" in value) ||
|
|
85
|
+
typeof value.machine !== "object" ||
|
|
86
|
+
value.machine === null ||
|
|
87
|
+
!("id" in value.machine) ||
|
|
88
|
+
typeof value.machine.id !== "string" ||
|
|
89
|
+
!("tenant_id" in value.machine) ||
|
|
90
|
+
typeof value.machine.tenant_id !== "string" ||
|
|
91
|
+
!("display_name" in value.machine) ||
|
|
92
|
+
typeof value.machine.display_name !== "string" ||
|
|
93
|
+
!("state" in value.machine) ||
|
|
94
|
+
typeof value.machine.state !== "string") {
|
|
95
|
+
throw new Error("Control plane returned an invalid pairing response.");
|
|
96
|
+
}
|
|
97
|
+
return value;
|
|
98
|
+
}
|
|
99
|
+
async function pairingFailureMessage(response) {
|
|
100
|
+
try {
|
|
101
|
+
const value = await response.json();
|
|
102
|
+
if (typeof value === "object" &&
|
|
103
|
+
value !== null &&
|
|
104
|
+
"error" in value &&
|
|
105
|
+
typeof value.error === "object" &&
|
|
106
|
+
value.error !== null &&
|
|
107
|
+
"message" in value.error &&
|
|
108
|
+
typeof value.error.message === "string") {
|
|
109
|
+
return value.error.message;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// The status code still provides an actionable, non-sensitive failure.
|
|
114
|
+
}
|
|
115
|
+
return `Pairing failed with HTTP ${response.status}.`;
|
|
116
|
+
}
|
|
117
|
+
function normalizedOperatingSystem() {
|
|
118
|
+
const value = platform();
|
|
119
|
+
if (value === "darwin")
|
|
120
|
+
return "macos";
|
|
121
|
+
if (value === "win32")
|
|
122
|
+
return "windows";
|
|
123
|
+
return "linux";
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=pair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/pair.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ObserverConfig } from "./config.js";
|
|
2
|
+
import type { StoredMachineCredential } from "./credential-store.js";
|
|
3
|
+
export type RemoveMachineResult = Readonly<{
|
|
4
|
+
status: "removed";
|
|
5
|
+
machineId: string;
|
|
6
|
+
controlPlaneOrigin: string;
|
|
7
|
+
credentialRemoved: true;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function removeMachine(options: Readonly<{
|
|
10
|
+
config: ObserverConfig;
|
|
11
|
+
credential: StoredMachineCredential;
|
|
12
|
+
clearCredential: () => Promise<boolean>;
|
|
13
|
+
fetcher?: typeof fetch;
|
|
14
|
+
}>): Promise<RemoveMachineResult>;
|
|
15
|
+
//# sourceMappingURL=remove-machine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-machine.d.ts","sourceRoot":"","sources":["../../src/remove-machine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,IAAI,CAAC;CACzB,CAAC,CAAC;AAEH,wBAAsB,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC;IACpD,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,uBAAuB,CAAC;IACpC,eAAe,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA6DhC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export async function removeMachine(options) {
|
|
2
|
+
const configuredOrigin = options.config.controlPlaneUrl.origin;
|
|
3
|
+
if (options.credential.controlPlaneOrigin !== configuredOrigin) {
|
|
4
|
+
throw new Error(`The stored machine belongs to ${options.credential.controlPlaneOrigin}, ` +
|
|
5
|
+
`but the observer is configured for ${configuredOrigin}. Restore the ` +
|
|
6
|
+
"original PHIGON_CONTROL_PLANE_URL before removing this machine.");
|
|
7
|
+
}
|
|
8
|
+
const endpoint = new URL("/v1/machine", options.config.controlPlaneUrl);
|
|
9
|
+
const fetcher = options.fetcher ?? fetch;
|
|
10
|
+
let response;
|
|
11
|
+
try {
|
|
12
|
+
response = await fetcher(endpoint, {
|
|
13
|
+
method: "DELETE",
|
|
14
|
+
headers: {
|
|
15
|
+
Authorization: `Bearer ${options.credential.credential}`,
|
|
16
|
+
Accept: "application/json",
|
|
17
|
+
},
|
|
18
|
+
redirect: "error",
|
|
19
|
+
signal: AbortSignal.timeout(10_000),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error instanceof Error && error.name === "TimeoutError") {
|
|
24
|
+
throw new Error(`Machine removal timed out while contacting ${endpoint.origin}. ` +
|
|
25
|
+
"The local credential was kept; try again.");
|
|
26
|
+
}
|
|
27
|
+
throw new Error(`Could not reach ${endpoint.origin}. The local credential was kept; ` +
|
|
28
|
+
"check your connection and try again.");
|
|
29
|
+
}
|
|
30
|
+
if (!response.ok) {
|
|
31
|
+
throw new Error(await removalFailureMessage(response));
|
|
32
|
+
}
|
|
33
|
+
if (response.status !== 204) {
|
|
34
|
+
throw new Error(`Control plane returned an unexpected machine-removal response ` +
|
|
35
|
+
`(HTTP ${response.status}). The local credential was kept.`);
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
await options.clearCredential();
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
throw new Error(`Machine ${options.credential.machineId} was removed from ` +
|
|
42
|
+
`${configuredOrigin}, but local credential cleanup failed. Remove ` +
|
|
43
|
+
`machine-credential.json from ${options.config.dataDirectory} before ` +
|
|
44
|
+
"pairing again.");
|
|
45
|
+
}
|
|
46
|
+
return Object.freeze({
|
|
47
|
+
status: "removed",
|
|
48
|
+
machineId: options.credential.machineId,
|
|
49
|
+
controlPlaneOrigin: configuredOrigin,
|
|
50
|
+
credentialRemoved: true,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async function removalFailureMessage(response) {
|
|
54
|
+
try {
|
|
55
|
+
const value = await response.json();
|
|
56
|
+
if (typeof value === "object" &&
|
|
57
|
+
value !== null &&
|
|
58
|
+
"error" in value &&
|
|
59
|
+
typeof value.error === "object" &&
|
|
60
|
+
value.error !== null &&
|
|
61
|
+
"message" in value.error &&
|
|
62
|
+
typeof value.error.message === "string") {
|
|
63
|
+
const message = value.error.message.trim();
|
|
64
|
+
if (message.length > 0 &&
|
|
65
|
+
Buffer.byteLength(message, "utf8") <= 512 &&
|
|
66
|
+
!/[\u0000-\u001f\u007f]/u.test(message)) {
|
|
67
|
+
return `${message} The local credential was kept.`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// The status code is still useful and does not expose the credential.
|
|
73
|
+
}
|
|
74
|
+
return `Machine removal failed with HTTP ${response.status}. ` +
|
|
75
|
+
"The local credential was kept.";
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=remove-machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-machine.js","sourceRoot":"","sources":["../../src/remove-machine.ts"],"names":[],"mappings":"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"}
|