swarmdo 1.4.8 → 1.5.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/.claude/helpers/statusline.cjs +7 -7
- package/README.md +3 -1
- package/package.json +5 -3
- package/v3/@swarmdo/cli/dist/src/commands/hooks.js +26 -24
- package/v3/@swarmdo/cli/dist/src/commands/index.js +4 -0
- package/v3/@swarmdo/cli/dist/src/commands/integrations.d.ts +14 -0
- package/v3/@swarmdo/cli/dist/src/commands/integrations.js +158 -0
- package/v3/@swarmdo/cli/dist/src/commands/memory.js +50 -1
- package/v3/@swarmdo/cli/dist/src/commands/providers.js +3 -0
- package/v3/@swarmdo/cli/dist/src/commands/release.d.ts +15 -0
- package/v3/@swarmdo/cli/dist/src/commands/release.js +224 -0
- package/v3/@swarmdo/cli/dist/src/commands/security.js +14 -0
- package/v3/@swarmdo/cli/dist/src/commands/transcript.js +82 -1
- package/v3/@swarmdo/cli/dist/src/commands/usage.js +80 -1
- package/v3/@swarmdo/cli/dist/src/config-lint/lint.js +11 -1
- package/v3/@swarmdo/cli/dist/src/init/statusline-generator.js +6 -6
- package/v3/@swarmdo/cli/dist/src/integrations/integrations.d.ts +54 -0
- package/v3/@swarmdo/cli/dist/src/integrations/integrations.js +162 -0
- package/v3/@swarmdo/cli/dist/src/mcp-tools/agent-execute-core.js +25 -3
- package/v3/@swarmdo/cli/dist/src/mcp-tools/agentdb-tools.js +8 -8
- package/v3/@swarmdo/cli/dist/src/memory/graph-edge-writer.d.ts +12 -0
- package/v3/@swarmdo/cli/dist/src/memory/graph-edge-writer.js +32 -1
- package/v3/@swarmdo/cli/dist/src/memory-vault/watch.d.ts +32 -0
- package/v3/@swarmdo/cli/dist/src/memory-vault/watch.js +66 -0
- package/v3/@swarmdo/cli/dist/src/providers/openrouter-config.d.ts +91 -0
- package/v3/@swarmdo/cli/dist/src/providers/openrouter-config.js +186 -0
- package/v3/@swarmdo/cli/dist/src/release/release.d.ts +72 -0
- package/v3/@swarmdo/cli/dist/src/release/release.js +86 -0
- package/v3/@swarmdo/cli/dist/src/resilience/backoff.d.ts +23 -0
- package/v3/@swarmdo/cli/dist/src/resilience/backoff.js +30 -0
- package/v3/@swarmdo/cli/dist/src/swarmvector/model-router.js +14 -0
- package/v3/@swarmdo/cli/dist/src/transcript/search.d.ts +39 -0
- package/v3/@swarmdo/cli/dist/src/transcript/search.js +67 -0
- package/v3/@swarmdo/cli/dist/src/usage/diff.d.ts +69 -0
- package/v3/@swarmdo/cli/dist/src/usage/diff.js +112 -0
- package/v3/@swarmdo/cli/package.json +4 -4
- package/v3/@swarmdo/cli-core/dist/src/index.js +1 -1
- package/v3/@swarmdo/codex/dist/cli.js +0 -0
- package/v3/@swarmdo/hooks/dist/cli/guidance-cli.js +0 -0
- package/v3/@swarmdo/hooks/dist/statusline/index.d.ts +3 -3
- package/v3/@swarmdo/hooks/dist/statusline/index.js +3 -3
- package/v3/@swarmdo/integration/dist/__tests__/agentic-flow-agent.test.js +4 -1
- package/v3/@swarmdo/neural/dist/flash-attention.d.ts +1 -1
- package/v3/@swarmdo/neural/dist/flash-attention.js +1 -1
- package/v3/@swarmdo/plugin-agent-federation/dist/plugin.js +1 -1
- package/v3/@swarmdo/plugin-agent-federation/dist/transport/midstream-aware-loader.js +2 -2
- package/v3/@swarmdo/providers/dist/swarmvector-provider.d.ts +1 -1
- package/v3/@swarmdo/providers/dist/swarmvector-provider.js +1 -1
- package/v3/@swarmdo/security/dist/input-validator.d.ts +6 -6
- package/v3/@swarmdo/shared/dist/hooks/safety/git-commit.js +1 -1
- package/v3/@swarmdo/shared/dist/mcp/transport/http.js +8 -1
- package/v3/vendor/agentdb/package.json +0 -1
- package/v3/vendor/agentic-flow/package.json +0 -1
- package/.claude/scheduled_tasks.lock +0 -1
- package/.claude/skills/sdo-caveman-compress/scripts/__pycache__/__init__.cpython-314.pyc +0 -0
- package/.claude/skills/sdo-caveman-compress/scripts/__pycache__/__main__.cpython-314.pyc +0 -0
- package/.claude/skills/sdo-caveman-compress/scripts/__pycache__/cli.cpython-314.pyc +0 -0
- package/.claude/skills/sdo-caveman-compress/scripts/__pycache__/compress.cpython-314.pyc +0 -0
- package/.claude/skills/sdo-caveman-compress/scripts/__pycache__/detect.cpython-314.pyc +0 -0
- package/.claude/skills/sdo-caveman-compress/scripts/__pycache__/validate.cpython-314.pyc +0 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/index.d.ts +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/index.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/iot-coordinator.d.ts +0 -138
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/iot-coordinator.js +0 -418
- package/v3/@swarmdo/plugin-iot-cognitum/dist/bin.d.ts +0 -15
- package/v3/@swarmdo/plugin-iot-cognitum/dist/bin.js +0 -240
- package/v3/@swarmdo/plugin-iot-cognitum/dist/cli-commands.d.ts +0 -7
- package/v3/@swarmdo/plugin-iot-cognitum/dist/cli-commands.js +0 -508
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-agent.d.ts +0 -54
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-agent.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-fleet.d.ts +0 -46
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-fleet.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-trust-level.d.ts +0 -18
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-trust-level.js +0 -28
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/index.d.ts +0 -5
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/index.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/telemetry.d.ts +0 -35
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/telemetry.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/device-repository.d.ts +0 -11
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/device-repository.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/fleet-repository.d.ts +0 -9
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/fleet-repository.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/index.d.ts +0 -5
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/index.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/telemetry-repository.d.ts +0 -12
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/telemetry-repository.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/trust-history-repository.d.ts +0 -19
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/trust-history-repository.js +0 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/anomaly-detection-service.d.ts +0 -44
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/anomaly-detection-service.js +0 -117
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/device-lifecycle-service.d.ts +0 -70
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/device-lifecycle-service.js +0 -194
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/firmware-orchestration-service.d.ts +0 -69
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/firmware-orchestration-service.js +0 -139
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/fleet-topology-service.d.ts +0 -34
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/fleet-topology-service.js +0 -101
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/index.d.ts +0 -10
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/index.js +0 -10
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/mesh-service.d.ts +0 -64
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/mesh-service.js +0 -70
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/sona-integration-service.d.ts +0 -44
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/sona-integration-service.js +0 -79
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-ingestion-service.d.ts +0 -37
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-ingestion-service.js +0 -39
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-service.d.ts +0 -67
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-service.js +0 -58
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/witness-verification-service.d.ts +0 -45
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/witness-verification-service.js +0 -63
- package/v3/@swarmdo/plugin-iot-cognitum/dist/index.d.ts +0 -26
- package/v3/@swarmdo/plugin-iot-cognitum/dist/index.js +0 -17
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/agentdb-telemetry-repository.d.ts +0 -51
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/agentdb-telemetry-repository.js +0 -110
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-device-repository.d.ts +0 -13
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-device-repository.js +0 -25
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-fleet-repository.d.ts +0 -11
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-fleet-repository.js +0 -19
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-trust-history-repository.d.ts +0 -11
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-trust-history-repository.js +0 -27
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/index.d.ts +0 -6
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/index.js +0 -6
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/seed-client-factory.d.ts +0 -41
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/seed-client-factory.js +0 -64
- package/v3/@swarmdo/plugin-iot-cognitum/dist/mcp-tools.d.ts +0 -8
- package/v3/@swarmdo/plugin-iot-cognitum/dist/mcp-tools.js +0 -703
- package/v3/@swarmdo/plugin-iot-cognitum/dist/plugin.d.ts +0 -23
- package/v3/@swarmdo/plugin-iot-cognitum/dist/plugin.js +0 -239
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/anomaly-scan-worker.d.ts +0 -17
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/anomaly-scan-worker.js +0 -42
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/firmware-watch-worker.d.ts +0 -18
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/firmware-watch-worker.js +0 -45
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/health-probe-worker.d.ts +0 -19
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/health-probe-worker.js +0 -50
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/mesh-sync-worker.d.ts +0 -19
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/mesh-sync-worker.js +0 -47
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/telemetry-ingest-worker.d.ts +0 -17
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/telemetry-ingest-worker.js +0 -40
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/witness-audit-worker.d.ts +0 -18
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/witness-audit-worker.js +0 -51
- package/v3/@swarmdo/testing/dist/fixtures/agent-fixtures.d.ts +0 -214
- package/v3/@swarmdo/testing/dist/fixtures/agent-fixtures.js +0 -595
- package/v3/@swarmdo/testing/dist/fixtures/agents.d.ts +0 -76
- package/v3/@swarmdo/testing/dist/fixtures/agents.js +0 -158
- package/v3/@swarmdo/testing/dist/fixtures/configurations.d.ts +0 -157
- package/v3/@swarmdo/testing/dist/fixtures/configurations.js +0 -337
- package/v3/@swarmdo/testing/dist/fixtures/index.d.ts +0 -10
- package/v3/@swarmdo/testing/dist/fixtures/index.js +0 -17
- package/v3/@swarmdo/testing/dist/fixtures/mcp-fixtures.d.ts +0 -329
- package/v3/@swarmdo/testing/dist/fixtures/mcp-fixtures.js +0 -714
- package/v3/@swarmdo/testing/dist/fixtures/memory-entries.d.ts +0 -159
- package/v3/@swarmdo/testing/dist/fixtures/memory-entries.js +0 -262
- package/v3/@swarmdo/testing/dist/fixtures/memory-fixtures.d.ts +0 -290
- package/v3/@swarmdo/testing/dist/fixtures/memory-fixtures.js +0 -547
- package/v3/@swarmdo/testing/dist/fixtures/swarm-fixtures.d.ts +0 -289
- package/v3/@swarmdo/testing/dist/fixtures/swarm-fixtures.js +0 -534
- package/v3/@swarmdo/testing/dist/fixtures/tasks.d.ts +0 -106
- package/v3/@swarmdo/testing/dist/fixtures/tasks.js +0 -229
- package/v3/@swarmdo/testing/dist/helpers/assertion-helpers.d.ts +0 -213
- package/v3/@swarmdo/testing/dist/helpers/assertion-helpers.js +0 -435
- package/v3/@swarmdo/testing/dist/helpers/assertions.d.ts +0 -135
- package/v3/@swarmdo/testing/dist/helpers/assertions.js +0 -217
- package/v3/@swarmdo/testing/dist/helpers/create-mock.d.ts +0 -96
- package/v3/@swarmdo/testing/dist/helpers/create-mock.js +0 -164
- package/v3/@swarmdo/testing/dist/helpers/index.d.ts +0 -14
- package/v3/@swarmdo/testing/dist/helpers/index.js +0 -22
- package/v3/@swarmdo/testing/dist/helpers/mock-factory.d.ts +0 -323
- package/v3/@swarmdo/testing/dist/helpers/mock-factory.js +0 -350
- package/v3/@swarmdo/testing/dist/helpers/setup-teardown.d.ts +0 -271
- package/v3/@swarmdo/testing/dist/helpers/setup-teardown.js +0 -446
- package/v3/@swarmdo/testing/dist/helpers/swarm-instance.d.ts +0 -142
- package/v3/@swarmdo/testing/dist/helpers/swarm-instance.js +0 -205
- package/v3/@swarmdo/testing/dist/helpers/test-application.d.ts +0 -190
- package/v3/@swarmdo/testing/dist/helpers/test-application.js +0 -138
- package/v3/@swarmdo/testing/dist/helpers/test-utils.d.ts +0 -274
- package/v3/@swarmdo/testing/dist/helpers/test-utils.js +0 -456
- package/v3/@swarmdo/testing/dist/index.d.ts +0 -42
- package/v3/@swarmdo/testing/dist/index.js +0 -66
- package/v3/@swarmdo/testing/dist/mocks/index.d.ts +0 -8
- package/v3/@swarmdo/testing/dist/mocks/index.js +0 -10
- package/v3/@swarmdo/testing/dist/mocks/mock-mcp-client.d.ts +0 -206
- package/v3/@swarmdo/testing/dist/mocks/mock-mcp-client.js +0 -575
- package/v3/@swarmdo/testing/dist/mocks/mock-services.d.ts +0 -287
- package/v3/@swarmdo/testing/dist/mocks/mock-services.js +0 -563
- package/v3/@swarmdo/testing/dist/regression/api-contract.d.ts +0 -109
- package/v3/@swarmdo/testing/dist/regression/api-contract.js +0 -374
- package/v3/@swarmdo/testing/dist/regression/index.d.ts +0 -18
- package/v3/@swarmdo/testing/dist/regression/index.js +0 -18
- package/v3/@swarmdo/testing/dist/regression/integration-regression.d.ts +0 -67
- package/v3/@swarmdo/testing/dist/regression/integration-regression.js +0 -334
- package/v3/@swarmdo/testing/dist/regression/performance-baseline.d.ts +0 -106
- package/v3/@swarmdo/testing/dist/regression/performance-baseline.js +0 -268
- package/v3/@swarmdo/testing/dist/regression/regression-runner.d.ts +0 -124
- package/v3/@swarmdo/testing/dist/regression/regression-runner.js +0 -227
- package/v3/@swarmdo/testing/dist/regression/security-regression.d.ts +0 -73
- package/v3/@swarmdo/testing/dist/regression/security-regression.js +0 -258
- package/v3/@swarmdo/testing/dist/setup.d.ts +0 -43
- package/v3/@swarmdo/testing/dist/setup.js +0 -91
- package/v3/@swarmdo/testing/dist/v2-compat/api-compat.test.d.ts +0 -10
- package/v3/@swarmdo/testing/dist/v2-compat/api-compat.test.js +0 -433
- package/v3/@swarmdo/testing/dist/v2-compat/cli-compat.test.d.ts +0 -10
- package/v3/@swarmdo/testing/dist/v2-compat/cli-compat.test.js +0 -352
- package/v3/@swarmdo/testing/dist/v2-compat/compatibility-validator.d.ts +0 -206
- package/v3/@swarmdo/testing/dist/v2-compat/compatibility-validator.js +0 -839
- package/v3/@swarmdo/testing/dist/v2-compat/hooks-compat.test.d.ts +0 -10
- package/v3/@swarmdo/testing/dist/v2-compat/hooks-compat.test.js +0 -428
- package/v3/@swarmdo/testing/dist/v2-compat/index.d.ts +0 -38
- package/v3/@swarmdo/testing/dist/v2-compat/index.js +0 -41
- package/v3/@swarmdo/testing/dist/v2-compat/mcp-compat.test.d.ts +0 -10
- package/v3/@swarmdo/testing/dist/v2-compat/mcp-compat.test.js +0 -419
- package/v3/@swarmdo/testing/dist/v2-compat/report-generator.d.ts +0 -34
- package/v3/@swarmdo/testing/dist/v2-compat/report-generator.js +0 -372
|
@@ -1,418 +0,0 @@
|
|
|
1
|
-
import { SeedClientFactory } from '../infrastructure/seed-client-factory.js';
|
|
2
|
-
import { DeviceLifecycleService } from '../domain/services/device-lifecycle-service.js';
|
|
3
|
-
import { TelemetryService } from '../domain/services/telemetry-service.js';
|
|
4
|
-
import { MeshService } from '../domain/services/mesh-service.js';
|
|
5
|
-
import { AnomalyDetectionService } from '../domain/services/anomaly-detection-service.js';
|
|
6
|
-
import { TelemetryIngestionService } from '../domain/services/telemetry-ingestion-service.js';
|
|
7
|
-
import { FleetTopologyService } from '../domain/services/fleet-topology-service.js';
|
|
8
|
-
import { InMemoryFleetRepository } from '../infrastructure/in-memory-fleet-repository.js';
|
|
9
|
-
import { FirmwareOrchestrationService } from '../domain/services/firmware-orchestration-service.js';
|
|
10
|
-
import { WitnessVerificationService } from '../domain/services/witness-verification-service.js';
|
|
11
|
-
import { SONAIntegrationService } from '../domain/services/sona-integration-service.js';
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
// Coordinator
|
|
14
|
-
// ---------------------------------------------------------------------------
|
|
15
|
-
/**
|
|
16
|
-
* Application-layer coordinator that wires domain services to the
|
|
17
|
-
* Cognitum Seed SDK transport. Every public method resolves a
|
|
18
|
-
* {@link SeedClient} from the internal registry and delegates to the
|
|
19
|
-
* appropriate domain service.
|
|
20
|
-
*/
|
|
21
|
-
export class IoTCoordinator {
|
|
22
|
-
factory;
|
|
23
|
-
devices = new Map();
|
|
24
|
-
lifecycle;
|
|
25
|
-
telemetry;
|
|
26
|
-
mesh;
|
|
27
|
-
anomalyDetection;
|
|
28
|
-
ingestion;
|
|
29
|
-
fleet;
|
|
30
|
-
firmware;
|
|
31
|
-
witnessVerification;
|
|
32
|
-
sona;
|
|
33
|
-
telemetryRepo;
|
|
34
|
-
config;
|
|
35
|
-
deviceRepo;
|
|
36
|
-
trustRepo;
|
|
37
|
-
constructor(config, callbacks) {
|
|
38
|
-
this.config = config;
|
|
39
|
-
this.deviceRepo = config.deviceRepository;
|
|
40
|
-
this.trustRepo = config.trustHistoryRepository;
|
|
41
|
-
this.factory = new SeedClientFactory({
|
|
42
|
-
defaultTls: config.defaultTls,
|
|
43
|
-
healthInterval: config.healthInterval,
|
|
44
|
-
});
|
|
45
|
-
// -----------------------------------------------------------------------
|
|
46
|
-
// Wire domain-service deps to real SDK calls via this.devices
|
|
47
|
-
// -----------------------------------------------------------------------
|
|
48
|
-
this.lifecycle = new DeviceLifecycleService({
|
|
49
|
-
getStatus: async (deviceId) => {
|
|
50
|
-
const client = this.resolveClient(deviceId);
|
|
51
|
-
return client.status();
|
|
52
|
-
},
|
|
53
|
-
getIdentity: async (deviceId) => {
|
|
54
|
-
const client = this.resolveClient(deviceId);
|
|
55
|
-
return client.identity();
|
|
56
|
-
},
|
|
57
|
-
getPairStatus: async (deviceId) => {
|
|
58
|
-
const client = this.resolveClient(deviceId);
|
|
59
|
-
return client.pair.status();
|
|
60
|
-
},
|
|
61
|
-
getWitnessChain: async (deviceId) => {
|
|
62
|
-
const client = this.resolveClient(deviceId);
|
|
63
|
-
const chain = await client.witness.chain();
|
|
64
|
-
return {
|
|
65
|
-
depth: chain.length ?? chain.entries?.length ?? 0,
|
|
66
|
-
epoch: chain.entries?.[0]?.epoch ?? 0,
|
|
67
|
-
head_hash: chain.head ?? '',
|
|
68
|
-
};
|
|
69
|
-
},
|
|
70
|
-
getCustodyEpoch: async (deviceId) => {
|
|
71
|
-
const client = this.resolveClient(deviceId);
|
|
72
|
-
return client.custody.epoch();
|
|
73
|
-
},
|
|
74
|
-
pairDevice: async (deviceId, clientName) => {
|
|
75
|
-
const client = this.resolveClient(deviceId);
|
|
76
|
-
const resp = await client.pair.create({ clientName });
|
|
77
|
-
return { paired: true, token: resp.token.reveal() };
|
|
78
|
-
},
|
|
79
|
-
unpairDevice: async (deviceId, clientName) => {
|
|
80
|
-
const client = this.resolveClient(deviceId);
|
|
81
|
-
await client.pair.delete(clientName ?? 'swarmdo');
|
|
82
|
-
},
|
|
83
|
-
onDeviceRegistered: callbacks?.onDeviceRegistered,
|
|
84
|
-
onTrustChange: callbacks?.onTrustChange,
|
|
85
|
-
});
|
|
86
|
-
this.telemetry = new TelemetryService({
|
|
87
|
-
queryVectors: async (deviceId, vector, k) => {
|
|
88
|
-
const client = this.resolveClient(deviceId);
|
|
89
|
-
return client.store.query({ vector, k });
|
|
90
|
-
},
|
|
91
|
-
ingestVectors: async (deviceId, vectors) => {
|
|
92
|
-
const client = this.resolveClient(deviceId);
|
|
93
|
-
return client.store.ingest({ vectors });
|
|
94
|
-
},
|
|
95
|
-
getStoreStatus: async (deviceId) => {
|
|
96
|
-
const client = this.resolveClient(deviceId);
|
|
97
|
-
return client.store.status();
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
this.mesh = new MeshService({
|
|
101
|
-
getMeshStatus: async (deviceId) => {
|
|
102
|
-
const client = this.resolveClient(deviceId);
|
|
103
|
-
return client.mesh.status();
|
|
104
|
-
},
|
|
105
|
-
getPeers: async (deviceId) => {
|
|
106
|
-
const client = this.resolveClient(deviceId);
|
|
107
|
-
return client.mesh.peers();
|
|
108
|
-
},
|
|
109
|
-
getSwarmStatus: async (deviceId) => {
|
|
110
|
-
const client = this.resolveClient(deviceId);
|
|
111
|
-
return client.mesh.swarmStatus();
|
|
112
|
-
},
|
|
113
|
-
getClusterHealth: async (deviceId) => {
|
|
114
|
-
const client = this.resolveClient(deviceId);
|
|
115
|
-
return client.mesh.clusterHealth();
|
|
116
|
-
},
|
|
117
|
-
});
|
|
118
|
-
this.anomalyDetection = new AnomalyDetectionService(config.anomalyDetection);
|
|
119
|
-
this.ingestion = new TelemetryIngestionService({
|
|
120
|
-
queryDeviceStore: async (deviceId, vector, k) => {
|
|
121
|
-
const client = this.resolveClient(deviceId);
|
|
122
|
-
const result = await client.store.query({ vector, k });
|
|
123
|
-
return result.results;
|
|
124
|
-
},
|
|
125
|
-
getStoreStatus: async (deviceId) => {
|
|
126
|
-
const client = this.resolveClient(deviceId);
|
|
127
|
-
return client.store.status();
|
|
128
|
-
},
|
|
129
|
-
}, this.anomalyDetection);
|
|
130
|
-
this.fleet = new FleetTopologyService(config.fleetRepository ?? new InMemoryFleetRepository());
|
|
131
|
-
this.firmware = new FirmwareOrchestrationService({
|
|
132
|
-
getDeviceFirmwareVersion: async (deviceId) => {
|
|
133
|
-
const entry = this.requireEntry(deviceId);
|
|
134
|
-
return entry.agent.firmwareVersion;
|
|
135
|
-
},
|
|
136
|
-
deployFirmware: async (_deviceId, _version) => {
|
|
137
|
-
// OTA deployment requires Cognitum Cloud API (not available via local Seed SDK).
|
|
138
|
-
// Stub returns success; real implementation will use cloud control plane.
|
|
139
|
-
return { success: true };
|
|
140
|
-
},
|
|
141
|
-
getDeviceAnomalyScore: async (deviceId) => {
|
|
142
|
-
const entry = this.requireEntry(deviceId);
|
|
143
|
-
return 1 - entry.agent.trustScore.overall;
|
|
144
|
-
},
|
|
145
|
-
});
|
|
146
|
-
this.witnessVerification = new WitnessVerificationService({
|
|
147
|
-
getWitnessChain: async (deviceId) => {
|
|
148
|
-
const client = this.resolveClient(deviceId);
|
|
149
|
-
return client.witness.chain();
|
|
150
|
-
},
|
|
151
|
-
});
|
|
152
|
-
this.sona = new SONAIntegrationService(config.sonaClient ?? null);
|
|
153
|
-
this.telemetryRepo = config.telemetryRepository;
|
|
154
|
-
}
|
|
155
|
-
// -------------------------------------------------------------------------
|
|
156
|
-
// Device lifecycle
|
|
157
|
-
// -------------------------------------------------------------------------
|
|
158
|
-
/**
|
|
159
|
-
* Register a Seed device by its HTTP endpoint. Creates a
|
|
160
|
-
* {@link SeedClient}, fetches status and identity from the real
|
|
161
|
-
* hardware, and returns a fully populated {@link DeviceAgent}.
|
|
162
|
-
*/
|
|
163
|
-
async registerDevice(endpoint, pairingToken) {
|
|
164
|
-
const client = await this.factory.createClient(endpoint, pairingToken);
|
|
165
|
-
// The lifecycle service makes two SDK calls during registration:
|
|
166
|
-
// getStatus(endpoint) -> returns the real device_id, then
|
|
167
|
-
// getIdentity(device_id) -> looked up by the device_id key.
|
|
168
|
-
// We need the client reachable under BOTH keys before lifecycle runs,
|
|
169
|
-
// so pre-fetch the device_id and register the client under both.
|
|
170
|
-
const initialStatus = await client.status();
|
|
171
|
-
const initialDeviceId = initialStatus.device_id;
|
|
172
|
-
this.devices.set(endpoint, { agent: {}, client });
|
|
173
|
-
this.devices.set(initialDeviceId, { agent: {}, client });
|
|
174
|
-
let agent;
|
|
175
|
-
try {
|
|
176
|
-
agent = await this.lifecycle.registerDevice(endpoint, this.config.defaultFleetId, this.config.defaultZoneId);
|
|
177
|
-
}
|
|
178
|
-
catch (err) {
|
|
179
|
-
this.devices.delete(endpoint);
|
|
180
|
-
this.devices.delete(initialDeviceId);
|
|
181
|
-
throw err;
|
|
182
|
-
}
|
|
183
|
-
// Promote: drop the temporary endpoint key and keep the device_id key
|
|
184
|
-
// (with the real agent attached).
|
|
185
|
-
this.devices.delete(endpoint);
|
|
186
|
-
this.devices.set(agent.deviceId, { agent, client });
|
|
187
|
-
await this.deviceRepo?.save(agent);
|
|
188
|
-
return agent;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Refresh a device's state from the real hardware and recalculate
|
|
192
|
-
* its trust score.
|
|
193
|
-
*/
|
|
194
|
-
async getDeviceStatus(deviceId) {
|
|
195
|
-
const entry = this.requireEntry(deviceId);
|
|
196
|
-
const oldLevel = entry.agent.trustLevel;
|
|
197
|
-
const refreshed = await this.lifecycle.refreshDeviceState(entry.agent);
|
|
198
|
-
entry.agent = refreshed;
|
|
199
|
-
await this.deviceRepo?.save(refreshed);
|
|
200
|
-
if (oldLevel !== refreshed.trustLevel) {
|
|
201
|
-
await this.trustRepo?.append({
|
|
202
|
-
deviceId, timestamp: new Date(),
|
|
203
|
-
oldLevel, newLevel: refreshed.trustLevel,
|
|
204
|
-
score: refreshed.trustScore, trigger: 'refresh',
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
return refreshed;
|
|
208
|
-
}
|
|
209
|
-
/** Pair a registered device, promoting its trust level. */
|
|
210
|
-
async pairDevice(deviceId, clientName) {
|
|
211
|
-
const entry = this.requireEntry(deviceId);
|
|
212
|
-
const oldLevel = entry.agent.trustLevel;
|
|
213
|
-
const updated = await this.lifecycle.pairDevice(entry.agent, clientName);
|
|
214
|
-
entry.agent = updated;
|
|
215
|
-
await this.deviceRepo?.save(updated);
|
|
216
|
-
if (oldLevel !== updated.trustLevel) {
|
|
217
|
-
await this.trustRepo?.append({
|
|
218
|
-
deviceId, timestamp: new Date(),
|
|
219
|
-
oldLevel, newLevel: updated.trustLevel,
|
|
220
|
-
score: updated.trustScore, trigger: 'pair',
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
return updated;
|
|
224
|
-
}
|
|
225
|
-
/** Unpair a registered device, demoting its trust level. */
|
|
226
|
-
async unpairDevice(deviceId) {
|
|
227
|
-
const entry = this.requireEntry(deviceId);
|
|
228
|
-
const oldLevel = entry.agent.trustLevel;
|
|
229
|
-
const updated = await this.lifecycle.unpairDevice(entry.agent);
|
|
230
|
-
entry.agent = updated;
|
|
231
|
-
await this.deviceRepo?.save(updated);
|
|
232
|
-
if (oldLevel !== updated.trustLevel) {
|
|
233
|
-
await this.trustRepo?.append({
|
|
234
|
-
deviceId, timestamp: new Date(),
|
|
235
|
-
oldLevel, newLevel: updated.trustLevel,
|
|
236
|
-
score: updated.trustScore, trigger: 'unpair',
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
return updated;
|
|
240
|
-
}
|
|
241
|
-
// -------------------------------------------------------------------------
|
|
242
|
-
// Telemetry / vector store
|
|
243
|
-
// -------------------------------------------------------------------------
|
|
244
|
-
/** Run a k-NN query against a device's on-board vector store. */
|
|
245
|
-
async queryDeviceVectors(deviceId, vector, k) {
|
|
246
|
-
return this.telemetry.queryDevice(deviceId, vector, k);
|
|
247
|
-
}
|
|
248
|
-
/** Ingest raw vectors into a device's vector store. */
|
|
249
|
-
async ingestDeviceTelemetry(deviceId, vectors) {
|
|
250
|
-
const client = this.resolveClient(deviceId);
|
|
251
|
-
const result = await client.store.ingest({ vectors });
|
|
252
|
-
return {
|
|
253
|
-
deviceId,
|
|
254
|
-
ingested: result.ingested,
|
|
255
|
-
epoch: result.epoch,
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
/** Retrieve vector store health metrics for a device. */
|
|
259
|
-
async getDeviceStoreStatus(deviceId) {
|
|
260
|
-
return this.telemetry.getStoreHealth(deviceId);
|
|
261
|
-
}
|
|
262
|
-
// -------------------------------------------------------------------------
|
|
263
|
-
// Mesh
|
|
264
|
-
// -------------------------------------------------------------------------
|
|
265
|
-
/** Get the aggregated mesh topology snapshot for a device. */
|
|
266
|
-
async getDeviceMeshTopology(deviceId) {
|
|
267
|
-
return this.mesh.getTopology(deviceId);
|
|
268
|
-
}
|
|
269
|
-
// -------------------------------------------------------------------------
|
|
270
|
-
// Witness / custody — direct SDK pass-through
|
|
271
|
-
// -------------------------------------------------------------------------
|
|
272
|
-
/** Retrieve the full witness chain from a device. */
|
|
273
|
-
async getDeviceWitnessChain(deviceId) {
|
|
274
|
-
const client = this.resolveClient(deviceId);
|
|
275
|
-
return client.witness.chain();
|
|
276
|
-
}
|
|
277
|
-
/** Retrieve the current custody epoch from a device. */
|
|
278
|
-
async getDeviceCustodyEpoch(deviceId) {
|
|
279
|
-
const client = this.resolveClient(deviceId);
|
|
280
|
-
return client.custody.epoch();
|
|
281
|
-
}
|
|
282
|
-
/** Verify witness chain integrity for a device. */
|
|
283
|
-
async verifyWitnessChain(deviceId) {
|
|
284
|
-
this.requireEntry(deviceId);
|
|
285
|
-
return this.witnessVerification.verifyChain(deviceId);
|
|
286
|
-
}
|
|
287
|
-
// -------------------------------------------------------------------------
|
|
288
|
-
// Anomaly detection
|
|
289
|
-
// -------------------------------------------------------------------------
|
|
290
|
-
/** Detect anomalies in a batch of telemetry readings for a device. */
|
|
291
|
-
detectAnomalies(deviceId, readings) {
|
|
292
|
-
const result = this.ingestion.processBatch(deviceId, readings);
|
|
293
|
-
if (result.anomalies.length > 0) {
|
|
294
|
-
const baseline = this.ingestion.getBaseline(deviceId);
|
|
295
|
-
for (const anomaly of result.anomalies) {
|
|
296
|
-
void this.sona.learnAnomalyPattern(anomaly, baseline);
|
|
297
|
-
}
|
|
298
|
-
void this.sona.recordTelemetryTrajectory(deviceId, readings, result.anomalies);
|
|
299
|
-
}
|
|
300
|
-
if (this.telemetryRepo) {
|
|
301
|
-
void this.telemetryRepo.storeBatch(readings);
|
|
302
|
-
for (const anomaly of result.anomalies) {
|
|
303
|
-
void this.telemetryRepo.storeAnomaly(anomaly);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
return {
|
|
307
|
-
anomalies: result.anomalies,
|
|
308
|
-
total: result.readingsProcessed,
|
|
309
|
-
anomalous: result.anomaliesDetected,
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
/** Compute a telemetry baseline for a device from readings. */
|
|
313
|
-
computeBaseline(deviceId, readings) {
|
|
314
|
-
const oldBaseline = this.ingestion.getBaseline(deviceId);
|
|
315
|
-
const newBaseline = this.ingestion.refreshBaseline(deviceId, readings);
|
|
316
|
-
void this.sona.learnBaselineShift(deviceId, oldBaseline, newBaseline);
|
|
317
|
-
return newBaseline;
|
|
318
|
-
}
|
|
319
|
-
/** Get the current baseline for a device, if computed. */
|
|
320
|
-
getBaseline(deviceId) {
|
|
321
|
-
return this.ingestion.getBaseline(deviceId);
|
|
322
|
-
}
|
|
323
|
-
// -------------------------------------------------------------------------
|
|
324
|
-
// Firmware orchestration
|
|
325
|
-
// -------------------------------------------------------------------------
|
|
326
|
-
async createFirmwareRollout(fleetId, firmwareVersion) {
|
|
327
|
-
const fleet = await this.fleet.getFleet(fleetId);
|
|
328
|
-
return this.firmware.createRollout(fleetId, firmwareVersion, fleet.deviceIds, fleet.firmwarePolicy);
|
|
329
|
-
}
|
|
330
|
-
async advanceFirmwareRollout(rolloutId) {
|
|
331
|
-
return this.firmware.advanceRollout(rolloutId);
|
|
332
|
-
}
|
|
333
|
-
rollbackFirmwareRollout(rolloutId) {
|
|
334
|
-
return this.firmware.rollbackRollout(rolloutId);
|
|
335
|
-
}
|
|
336
|
-
getFirmwareRollout(rolloutId) {
|
|
337
|
-
return this.firmware.getRollout(rolloutId);
|
|
338
|
-
}
|
|
339
|
-
listFirmwareRollouts(fleetId) {
|
|
340
|
-
return this.firmware.listRollouts(fleetId);
|
|
341
|
-
}
|
|
342
|
-
// -------------------------------------------------------------------------
|
|
343
|
-
// Fleet management
|
|
344
|
-
// -------------------------------------------------------------------------
|
|
345
|
-
async createFleet(options) {
|
|
346
|
-
return this.fleet.createFleet(options);
|
|
347
|
-
}
|
|
348
|
-
async getFleet(fleetId) {
|
|
349
|
-
return this.fleet.getFleet(fleetId);
|
|
350
|
-
}
|
|
351
|
-
async listFleets() {
|
|
352
|
-
return this.fleet.listFleets();
|
|
353
|
-
}
|
|
354
|
-
async addDeviceToFleet(fleetId, deviceId) {
|
|
355
|
-
this.requireEntry(deviceId);
|
|
356
|
-
return this.fleet.addDeviceToFleet(fleetId, deviceId);
|
|
357
|
-
}
|
|
358
|
-
async removeDeviceFromFleet(fleetId, deviceId) {
|
|
359
|
-
return this.fleet.removeDeviceFromFleet(fleetId, deviceId);
|
|
360
|
-
}
|
|
361
|
-
async updateFleetTopology(fleetId, topology) {
|
|
362
|
-
return this.fleet.updateTopology(fleetId, topology);
|
|
363
|
-
}
|
|
364
|
-
async updateFleetFirmwarePolicy(fleetId, policy) {
|
|
365
|
-
return this.fleet.updateFirmwarePolicy(fleetId, policy);
|
|
366
|
-
}
|
|
367
|
-
async deleteFleet(fleetId) {
|
|
368
|
-
return this.fleet.deleteFleet(fleetId);
|
|
369
|
-
}
|
|
370
|
-
// -------------------------------------------------------------------------
|
|
371
|
-
// Inventory
|
|
372
|
-
// -------------------------------------------------------------------------
|
|
373
|
-
/** List all registered device agents. */
|
|
374
|
-
listDevices() {
|
|
375
|
-
return Array.from(this.devices.values()).map((e) => e.agent);
|
|
376
|
-
}
|
|
377
|
-
/** Remove a device from the coordinator and close its SDK client. */
|
|
378
|
-
async removeDevice(deviceId) {
|
|
379
|
-
const entry = this.devices.get(deviceId);
|
|
380
|
-
if (!entry)
|
|
381
|
-
return;
|
|
382
|
-
await entry.client.close();
|
|
383
|
-
this.devices.delete(deviceId);
|
|
384
|
-
await this.deviceRepo?.delete(deviceId);
|
|
385
|
-
await this.trustRepo?.deleteByDevice(deviceId);
|
|
386
|
-
}
|
|
387
|
-
/** Shut down all SDK clients and clear internal state. */
|
|
388
|
-
async shutdown() {
|
|
389
|
-
await this.factory.closeAll();
|
|
390
|
-
this.devices.clear();
|
|
391
|
-
}
|
|
392
|
-
/** Health snapshot of the coordinator. */
|
|
393
|
-
getStatus() {
|
|
394
|
-
return {
|
|
395
|
-
healthy: this.devices.size >= 0,
|
|
396
|
-
deviceCount: this.devices.size,
|
|
397
|
-
devices: this.listDevices(),
|
|
398
|
-
};
|
|
399
|
-
}
|
|
400
|
-
// -------------------------------------------------------------------------
|
|
401
|
-
// Internals
|
|
402
|
-
// -------------------------------------------------------------------------
|
|
403
|
-
/**
|
|
404
|
-
* Resolve a SeedClient by device ID (or temporary endpoint key).
|
|
405
|
-
* Throws when the device has not been registered.
|
|
406
|
-
*/
|
|
407
|
-
resolveClient(deviceId) {
|
|
408
|
-
return this.requireEntry(deviceId).client;
|
|
409
|
-
}
|
|
410
|
-
requireEntry(deviceId) {
|
|
411
|
-
const entry = this.devices.get(deviceId);
|
|
412
|
-
if (!entry) {
|
|
413
|
-
throw new Error(`Device ${deviceId} not registered with coordinator`);
|
|
414
|
-
}
|
|
415
|
-
return entry;
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
//# sourceMappingURL=iot-coordinator.js.map
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Standalone CLI shim for @swarmdo/plugin-iot-cognitum.
|
|
4
|
-
* Maps `cognitum-iot <subcommand> [args]` -> CLICommandDefinition handlers.
|
|
5
|
-
*
|
|
6
|
-
* Endpoint defaults:
|
|
7
|
-
* - http://169.254.42.1 (USB-C link-local, no auth — read-only paths)
|
|
8
|
-
* - https://169.254.42.1:8443 (LAN/HTTPS + bearer — full access including writes)
|
|
9
|
-
*
|
|
10
|
-
* Auth: COGNITUM_SEED_TOKEN is read from process.env (loaded from .env in CWD
|
|
11
|
-
* if present) and passed to register as the pairing/bearer token. When set,
|
|
12
|
-
* the default endpoint switches to the HTTPS LAN address.
|
|
13
|
-
*/
|
|
14
|
-
export {};
|
|
15
|
-
//# sourceMappingURL=bin.d.ts.map
|
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Standalone CLI shim for @swarmdo/plugin-iot-cognitum.
|
|
4
|
-
* Maps `cognitum-iot <subcommand> [args]` -> CLICommandDefinition handlers.
|
|
5
|
-
*
|
|
6
|
-
* Endpoint defaults:
|
|
7
|
-
* - http://169.254.42.1 (USB-C link-local, no auth — read-only paths)
|
|
8
|
-
* - https://169.254.42.1:8443 (LAN/HTTPS + bearer — full access including writes)
|
|
9
|
-
*
|
|
10
|
-
* Auth: COGNITUM_SEED_TOKEN is read from process.env (loaded from .env in CWD
|
|
11
|
-
* if present) and passed to register as the pairing/bearer token. When set,
|
|
12
|
-
* the default endpoint switches to the HTTPS LAN address.
|
|
13
|
-
*/
|
|
14
|
-
import { readFileSync, existsSync } from 'node:fs';
|
|
15
|
-
import { resolve } from 'node:path';
|
|
16
|
-
import { IoTCognitumPlugin } from './plugin.js';
|
|
17
|
-
const SEED_LINK_LOCAL = 'http://169.254.42.1';
|
|
18
|
-
const SEED_LAN_HTTPS = 'https://169.254.42.1:8443';
|
|
19
|
-
/**
|
|
20
|
-
* Tiny .env loader. Walks up from CWD looking for a .env, reads KEY=VALUE
|
|
21
|
-
* lines (ignoring blanks and # comments), and applies them to process.env
|
|
22
|
-
* WITHOUT overwriting variables already set in the real environment.
|
|
23
|
-
*/
|
|
24
|
-
function loadDotenv() {
|
|
25
|
-
let dir = process.cwd();
|
|
26
|
-
for (let i = 0; i < 8; i++) {
|
|
27
|
-
const candidate = resolve(dir, '.env');
|
|
28
|
-
if (existsSync(candidate)) {
|
|
29
|
-
const text = readFileSync(candidate, 'utf8');
|
|
30
|
-
let count = 0;
|
|
31
|
-
for (const rawLine of text.split('\n')) {
|
|
32
|
-
const line = rawLine.trim();
|
|
33
|
-
if (!line || line.startsWith('#'))
|
|
34
|
-
continue;
|
|
35
|
-
const eq = line.indexOf('=');
|
|
36
|
-
if (eq < 1)
|
|
37
|
-
continue;
|
|
38
|
-
const key = line.slice(0, eq).trim();
|
|
39
|
-
let val = line.slice(eq + 1).trim();
|
|
40
|
-
// Strip surrounding quotes
|
|
41
|
-
if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
|
|
42
|
-
val = val.slice(1, -1);
|
|
43
|
-
}
|
|
44
|
-
if (process.env[key] === undefined) {
|
|
45
|
-
process.env[key] = val;
|
|
46
|
-
count++;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return { loaded: candidate, count };
|
|
50
|
-
}
|
|
51
|
-
const parent = resolve(dir, '..');
|
|
52
|
-
if (parent === dir)
|
|
53
|
-
break;
|
|
54
|
-
dir = parent;
|
|
55
|
-
}
|
|
56
|
-
return { loaded: null, count: 0 };
|
|
57
|
-
}
|
|
58
|
-
loadDotenv();
|
|
59
|
-
const SEED_TOKEN = process.env.COGNITUM_SEED_TOKEN;
|
|
60
|
-
const SEED_DEFAULT_ENDPOINT = process.env.COGNITUM_SEED_ENDPOINT ?? (SEED_TOKEN ? SEED_LAN_HTTPS : SEED_LINK_LOCAL);
|
|
61
|
-
function makeContext() {
|
|
62
|
-
// Minimal in-memory context for standalone CLI use.
|
|
63
|
-
const noop = () => undefined;
|
|
64
|
-
return {
|
|
65
|
-
config: {
|
|
66
|
-
fleetId: process.env.IOT_FLEET_ID ?? 'default',
|
|
67
|
-
zoneId: process.env.IOT_ZONE_ID ?? 'zone-0',
|
|
68
|
-
tlsInsecure: process.env.IOT_TLS_INSECURE !== 'false',
|
|
69
|
-
},
|
|
70
|
-
eventBus: {
|
|
71
|
-
emit: noop,
|
|
72
|
-
on: noop,
|
|
73
|
-
off: noop,
|
|
74
|
-
once: noop,
|
|
75
|
-
},
|
|
76
|
-
logger: {
|
|
77
|
-
info: (...a) => console.log('[info]', ...a),
|
|
78
|
-
warn: (...a) => console.warn('[warn]', ...a),
|
|
79
|
-
error: (...a) => console.error('[error]', ...a),
|
|
80
|
-
debug: (...a) => process.env.DEBUG && console.error('[debug]', ...a),
|
|
81
|
-
},
|
|
82
|
-
services: {
|
|
83
|
-
get: () => undefined,
|
|
84
|
-
register: noop,
|
|
85
|
-
has: () => false,
|
|
86
|
-
},
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Parse argv minimally: positional -> _, --flag value, --flag=value, --boolean,
|
|
91
|
-
* short -e value. Numeric values stay as strings (handlers coerce as needed).
|
|
92
|
-
*/
|
|
93
|
-
function parseArgs(argv) {
|
|
94
|
-
const out = { _: [] };
|
|
95
|
-
for (let i = 0; i < argv.length; i++) {
|
|
96
|
-
const a = argv[i];
|
|
97
|
-
if (a.startsWith('--')) {
|
|
98
|
-
const eq = a.indexOf('=');
|
|
99
|
-
if (eq > -1) {
|
|
100
|
-
out[a.slice(2, eq)] = a.slice(eq + 1);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
const key = a.slice(2);
|
|
104
|
-
const next = argv[i + 1];
|
|
105
|
-
if (next === undefined || next.startsWith('-')) {
|
|
106
|
-
out[key] = true;
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
out[key] = next;
|
|
110
|
-
i++;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
else if (a.startsWith('-') && a.length > 1) {
|
|
115
|
-
const key = a.slice(1);
|
|
116
|
-
const next = argv[i + 1];
|
|
117
|
-
if (next === undefined || next.startsWith('-')) {
|
|
118
|
-
out[key] = true;
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
out[key] = next;
|
|
122
|
-
i++;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
out._.push(a);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
return out;
|
|
130
|
-
}
|
|
131
|
-
function aliasShortToLong(args) {
|
|
132
|
-
// Most common short flags used across the iot commands.
|
|
133
|
-
const aliases = {
|
|
134
|
-
e: 'endpoint',
|
|
135
|
-
f: 'fleet-id',
|
|
136
|
-
z: 'zone-id',
|
|
137
|
-
d: 'device-id',
|
|
138
|
-
v: 'version',
|
|
139
|
-
k: 'k',
|
|
140
|
-
n: 'name',
|
|
141
|
-
t: 'token',
|
|
142
|
-
};
|
|
143
|
-
for (const [s, l] of Object.entries(aliases)) {
|
|
144
|
-
if (s in args && !(l in args)) {
|
|
145
|
-
args[l] = args[s];
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
return args;
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Resolve a subcommand path against command definitions.
|
|
152
|
-
* Supports multi-word commands: `iot fleet add`, `iot firmware deploy`, etc.
|
|
153
|
-
* Tries longest match first.
|
|
154
|
-
*/
|
|
155
|
-
function resolveCommand(argv, commandNames) {
|
|
156
|
-
// Strip the leading "iot" prefix from each defined command for matching.
|
|
157
|
-
const tokens = argv.slice();
|
|
158
|
-
// Try longest match (3 tokens, then 2, then 1).
|
|
159
|
-
for (const len of [3, 2, 1]) {
|
|
160
|
-
if (tokens.length < len)
|
|
161
|
-
continue;
|
|
162
|
-
const probe = 'iot ' + tokens.slice(0, len).join(' ');
|
|
163
|
-
if (commandNames.includes(probe)) {
|
|
164
|
-
return { name: probe, rest: tokens.slice(len) };
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return null;
|
|
168
|
-
}
|
|
169
|
-
function printHelp(commandNames) {
|
|
170
|
-
console.log('cognitum-iot — Cognitum Seed device-agent CLI');
|
|
171
|
-
console.log('');
|
|
172
|
-
console.log('Usage: cognitum-iot <subcommand> [options]');
|
|
173
|
-
console.log('');
|
|
174
|
-
console.log('Default endpoint: ' + SEED_DEFAULT_ENDPOINT);
|
|
175
|
-
console.log(' - http://169.254.42.1 (USB-C link-local, no auth, read-only)');
|
|
176
|
-
console.log(' - https://169.254.42.1:8443 (LAN/HTTPS, COGNITUM_SEED_TOKEN required, full access)');
|
|
177
|
-
console.log('');
|
|
178
|
-
console.log('Auth: set COGNITUM_SEED_TOKEN in .env or environment to use the bearer-protected');
|
|
179
|
-
console.log(' LAN endpoint and unlock writes (ingest, unpair, etc).');
|
|
180
|
-
console.log(' Status: ' + (SEED_TOKEN ? '✓ token loaded' : '✗ no token (link-local only)'));
|
|
181
|
-
console.log('');
|
|
182
|
-
console.log('Hardware: get a Seed at https://cognitum.one');
|
|
183
|
-
console.log('');
|
|
184
|
-
console.log('Subcommands:');
|
|
185
|
-
for (const n of commandNames) {
|
|
186
|
-
console.log(' ' + n.replace(/^iot /, ''));
|
|
187
|
-
}
|
|
188
|
-
console.log('');
|
|
189
|
-
console.log('Run "cognitum-iot <subcommand> --help" for command-specific options.');
|
|
190
|
-
}
|
|
191
|
-
async function main() {
|
|
192
|
-
const argv = process.argv.slice(2);
|
|
193
|
-
if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
|
|
194
|
-
// Need to bootstrap to enumerate commands.
|
|
195
|
-
}
|
|
196
|
-
const plugin = new IoTCognitumPlugin();
|
|
197
|
-
const context = makeContext();
|
|
198
|
-
await plugin.initialize(context);
|
|
199
|
-
const commands = plugin.registerCLICommands();
|
|
200
|
-
const commandNames = commands.map((c) => c.name);
|
|
201
|
-
if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
|
|
202
|
-
printHelp(commandNames);
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
const resolved = resolveCommand(argv, commandNames);
|
|
206
|
-
if (!resolved) {
|
|
207
|
-
console.error('Unknown subcommand: ' + argv.join(' '));
|
|
208
|
-
console.error('Run "cognitum-iot --help" to list available subcommands.');
|
|
209
|
-
process.exitCode = 1;
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
const cmd = commands.find((c) => c.name === resolved.name);
|
|
213
|
-
const args = aliasShortToLong(parseArgs(resolved.rest));
|
|
214
|
-
// Endpoint + token defaults for `iot register`.
|
|
215
|
-
if (resolved.name === 'iot register') {
|
|
216
|
-
if (!args['endpoint']) {
|
|
217
|
-
args['endpoint'] = SEED_DEFAULT_ENDPOINT;
|
|
218
|
-
console.error(`[info] No --endpoint supplied; defaulting to ${SEED_DEFAULT_ENDPOINT}`);
|
|
219
|
-
}
|
|
220
|
-
if (!args['token'] && SEED_TOKEN) {
|
|
221
|
-
args['token'] = SEED_TOKEN;
|
|
222
|
-
console.error('[info] Using COGNITUM_SEED_TOKEN from environment');
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
try {
|
|
226
|
-
await cmd.handler(args);
|
|
227
|
-
}
|
|
228
|
-
catch (err) {
|
|
229
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
230
|
-
console.error('Error: ' + msg);
|
|
231
|
-
process.exitCode = 1;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
main()
|
|
235
|
-
.then(() => process.exit(process.exitCode ?? 0))
|
|
236
|
-
.catch((err) => {
|
|
237
|
-
console.error('Fatal: ' + (err instanceof Error ? err.message : String(err)));
|
|
238
|
-
process.exit(1);
|
|
239
|
-
});
|
|
240
|
-
//# sourceMappingURL=bin.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { CLICommandDefinition, PluginContext } from '@swarmdo/shared/src/plugin-interface.js';
|
|
2
|
-
import type { IoTCoordinator } from './application/iot-coordinator.js';
|
|
3
|
-
type CoordinatorGetter = () => IoTCoordinator | null;
|
|
4
|
-
type ContextGetter = () => PluginContext | null;
|
|
5
|
-
export declare function createCliCommands(getCoordinator: CoordinatorGetter, _getContext: ContextGetter): CLICommandDefinition[];
|
|
6
|
-
export {};
|
|
7
|
-
//# sourceMappingURL=cli-commands.d.ts.map
|