swarmdo 1.58.23 → 1.58.24

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.
Files changed (169) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/v3/@swarmdo/cli/package.json +1 -1
  4. package/v3/@swarmdo/cli-core/dist/src/index.js +1 -1
  5. package/v3/@swarmdo/codex/dist/cli.js +0 -0
  6. package/v3/@swarmdo/hooks/dist/cli/guidance-cli.js +0 -0
  7. package/v3/@swarmdo/hooks/dist/statusline/index.d.ts +3 -3
  8. package/v3/@swarmdo/hooks/dist/statusline/index.js +3 -3
  9. package/v3/@swarmdo/integration/dist/__tests__/agentic-flow-agent.test.js +4 -1
  10. package/v3/@swarmdo/neural/dist/flash-attention.d.ts +1 -1
  11. package/v3/@swarmdo/neural/dist/flash-attention.js +1 -1
  12. package/v3/@swarmdo/plugin-agent-federation/dist/plugin.js +1 -1
  13. package/v3/@swarmdo/plugin-agent-federation/dist/transport/midstream-aware-loader.js +2 -2
  14. package/v3/@swarmdo/providers/dist/swarmvector-provider.d.ts +1 -1
  15. package/v3/@swarmdo/providers/dist/swarmvector-provider.js +1 -1
  16. package/v3/@swarmdo/security/dist/input-validator.d.ts +6 -6
  17. package/v3/@swarmdo/shared/dist/hooks/safety/git-commit.js +1 -1
  18. package/v3/@swarmdo/shared/dist/mcp/transport/http.js +8 -1
  19. package/.claude/settings.local.json +0 -7
  20. package/v3/@swarmdo/plugin-iot-cognitum/dist/application/index.d.ts +0 -2
  21. package/v3/@swarmdo/plugin-iot-cognitum/dist/application/index.js +0 -2
  22. package/v3/@swarmdo/plugin-iot-cognitum/dist/application/iot-coordinator.d.ts +0 -138
  23. package/v3/@swarmdo/plugin-iot-cognitum/dist/application/iot-coordinator.js +0 -418
  24. package/v3/@swarmdo/plugin-iot-cognitum/dist/bin.d.ts +0 -15
  25. package/v3/@swarmdo/plugin-iot-cognitum/dist/bin.js +0 -240
  26. package/v3/@swarmdo/plugin-iot-cognitum/dist/cli-commands.d.ts +0 -7
  27. package/v3/@swarmdo/plugin-iot-cognitum/dist/cli-commands.js +0 -508
  28. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-agent.d.ts +0 -54
  29. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-agent.js +0 -2
  30. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-fleet.d.ts +0 -46
  31. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-fleet.js +0 -2
  32. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-trust-level.d.ts +0 -18
  33. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-trust-level.js +0 -28
  34. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/index.d.ts +0 -5
  35. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/index.js +0 -2
  36. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/telemetry.d.ts +0 -35
  37. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/telemetry.js +0 -2
  38. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/device-repository.d.ts +0 -11
  39. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/device-repository.js +0 -2
  40. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/fleet-repository.d.ts +0 -9
  41. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/fleet-repository.js +0 -2
  42. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/index.d.ts +0 -5
  43. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/index.js +0 -2
  44. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/telemetry-repository.d.ts +0 -12
  45. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/telemetry-repository.js +0 -2
  46. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/trust-history-repository.d.ts +0 -19
  47. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/trust-history-repository.js +0 -2
  48. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/anomaly-detection-service.d.ts +0 -44
  49. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/anomaly-detection-service.js +0 -117
  50. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/device-lifecycle-service.d.ts +0 -70
  51. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/device-lifecycle-service.js +0 -194
  52. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/firmware-orchestration-service.d.ts +0 -69
  53. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/firmware-orchestration-service.js +0 -139
  54. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/fleet-topology-service.d.ts +0 -34
  55. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/fleet-topology-service.js +0 -101
  56. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/index.d.ts +0 -10
  57. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/index.js +0 -10
  58. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/mesh-service.d.ts +0 -64
  59. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/mesh-service.js +0 -70
  60. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/sona-integration-service.d.ts +0 -44
  61. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/sona-integration-service.js +0 -79
  62. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-ingestion-service.d.ts +0 -37
  63. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-ingestion-service.js +0 -39
  64. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-service.d.ts +0 -67
  65. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-service.js +0 -58
  66. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/witness-verification-service.d.ts +0 -45
  67. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/witness-verification-service.js +0 -63
  68. package/v3/@swarmdo/plugin-iot-cognitum/dist/index.d.ts +0 -26
  69. package/v3/@swarmdo/plugin-iot-cognitum/dist/index.js +0 -17
  70. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/agentdb-telemetry-repository.d.ts +0 -51
  71. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/agentdb-telemetry-repository.js +0 -110
  72. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-device-repository.d.ts +0 -13
  73. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-device-repository.js +0 -25
  74. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-fleet-repository.d.ts +0 -11
  75. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-fleet-repository.js +0 -19
  76. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-trust-history-repository.d.ts +0 -11
  77. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-trust-history-repository.js +0 -27
  78. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/index.d.ts +0 -6
  79. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/index.js +0 -6
  80. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/seed-client-factory.d.ts +0 -41
  81. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/seed-client-factory.js +0 -64
  82. package/v3/@swarmdo/plugin-iot-cognitum/dist/mcp-tools.d.ts +0 -8
  83. package/v3/@swarmdo/plugin-iot-cognitum/dist/mcp-tools.js +0 -703
  84. package/v3/@swarmdo/plugin-iot-cognitum/dist/plugin.d.ts +0 -23
  85. package/v3/@swarmdo/plugin-iot-cognitum/dist/plugin.js +0 -239
  86. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/anomaly-scan-worker.d.ts +0 -17
  87. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/anomaly-scan-worker.js +0 -42
  88. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/firmware-watch-worker.d.ts +0 -18
  89. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/firmware-watch-worker.js +0 -45
  90. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/health-probe-worker.d.ts +0 -19
  91. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/health-probe-worker.js +0 -50
  92. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/mesh-sync-worker.d.ts +0 -19
  93. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/mesh-sync-worker.js +0 -47
  94. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/telemetry-ingest-worker.d.ts +0 -17
  95. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/telemetry-ingest-worker.js +0 -40
  96. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/witness-audit-worker.d.ts +0 -18
  97. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/witness-audit-worker.js +0 -51
  98. package/v3/@swarmdo/testing/dist/fixtures/agent-fixtures.d.ts +0 -214
  99. package/v3/@swarmdo/testing/dist/fixtures/agent-fixtures.js +0 -595
  100. package/v3/@swarmdo/testing/dist/fixtures/agents.d.ts +0 -76
  101. package/v3/@swarmdo/testing/dist/fixtures/agents.js +0 -158
  102. package/v3/@swarmdo/testing/dist/fixtures/configurations.d.ts +0 -157
  103. package/v3/@swarmdo/testing/dist/fixtures/configurations.js +0 -337
  104. package/v3/@swarmdo/testing/dist/fixtures/index.d.ts +0 -10
  105. package/v3/@swarmdo/testing/dist/fixtures/index.js +0 -17
  106. package/v3/@swarmdo/testing/dist/fixtures/mcp-fixtures.d.ts +0 -329
  107. package/v3/@swarmdo/testing/dist/fixtures/mcp-fixtures.js +0 -714
  108. package/v3/@swarmdo/testing/dist/fixtures/memory-entries.d.ts +0 -159
  109. package/v3/@swarmdo/testing/dist/fixtures/memory-entries.js +0 -262
  110. package/v3/@swarmdo/testing/dist/fixtures/memory-fixtures.d.ts +0 -290
  111. package/v3/@swarmdo/testing/dist/fixtures/memory-fixtures.js +0 -547
  112. package/v3/@swarmdo/testing/dist/fixtures/swarm-fixtures.d.ts +0 -289
  113. package/v3/@swarmdo/testing/dist/fixtures/swarm-fixtures.js +0 -534
  114. package/v3/@swarmdo/testing/dist/fixtures/tasks.d.ts +0 -106
  115. package/v3/@swarmdo/testing/dist/fixtures/tasks.js +0 -229
  116. package/v3/@swarmdo/testing/dist/helpers/assertion-helpers.d.ts +0 -213
  117. package/v3/@swarmdo/testing/dist/helpers/assertion-helpers.js +0 -435
  118. package/v3/@swarmdo/testing/dist/helpers/assertions.d.ts +0 -135
  119. package/v3/@swarmdo/testing/dist/helpers/assertions.js +0 -217
  120. package/v3/@swarmdo/testing/dist/helpers/create-mock.d.ts +0 -96
  121. package/v3/@swarmdo/testing/dist/helpers/create-mock.js +0 -164
  122. package/v3/@swarmdo/testing/dist/helpers/index.d.ts +0 -14
  123. package/v3/@swarmdo/testing/dist/helpers/index.js +0 -22
  124. package/v3/@swarmdo/testing/dist/helpers/mock-factory.d.ts +0 -323
  125. package/v3/@swarmdo/testing/dist/helpers/mock-factory.js +0 -350
  126. package/v3/@swarmdo/testing/dist/helpers/setup-teardown.d.ts +0 -271
  127. package/v3/@swarmdo/testing/dist/helpers/setup-teardown.js +0 -446
  128. package/v3/@swarmdo/testing/dist/helpers/swarm-instance.d.ts +0 -142
  129. package/v3/@swarmdo/testing/dist/helpers/swarm-instance.js +0 -205
  130. package/v3/@swarmdo/testing/dist/helpers/test-application.d.ts +0 -190
  131. package/v3/@swarmdo/testing/dist/helpers/test-application.js +0 -138
  132. package/v3/@swarmdo/testing/dist/helpers/test-utils.d.ts +0 -274
  133. package/v3/@swarmdo/testing/dist/helpers/test-utils.js +0 -456
  134. package/v3/@swarmdo/testing/dist/index.d.ts +0 -42
  135. package/v3/@swarmdo/testing/dist/index.js +0 -66
  136. package/v3/@swarmdo/testing/dist/mocks/index.d.ts +0 -8
  137. package/v3/@swarmdo/testing/dist/mocks/index.js +0 -10
  138. package/v3/@swarmdo/testing/dist/mocks/mock-mcp-client.d.ts +0 -206
  139. package/v3/@swarmdo/testing/dist/mocks/mock-mcp-client.js +0 -575
  140. package/v3/@swarmdo/testing/dist/mocks/mock-services.d.ts +0 -287
  141. package/v3/@swarmdo/testing/dist/mocks/mock-services.js +0 -563
  142. package/v3/@swarmdo/testing/dist/regression/api-contract.d.ts +0 -109
  143. package/v3/@swarmdo/testing/dist/regression/api-contract.js +0 -374
  144. package/v3/@swarmdo/testing/dist/regression/index.d.ts +0 -18
  145. package/v3/@swarmdo/testing/dist/regression/index.js +0 -18
  146. package/v3/@swarmdo/testing/dist/regression/integration-regression.d.ts +0 -67
  147. package/v3/@swarmdo/testing/dist/regression/integration-regression.js +0 -334
  148. package/v3/@swarmdo/testing/dist/regression/performance-baseline.d.ts +0 -106
  149. package/v3/@swarmdo/testing/dist/regression/performance-baseline.js +0 -268
  150. package/v3/@swarmdo/testing/dist/regression/regression-runner.d.ts +0 -124
  151. package/v3/@swarmdo/testing/dist/regression/regression-runner.js +0 -227
  152. package/v3/@swarmdo/testing/dist/regression/security-regression.d.ts +0 -73
  153. package/v3/@swarmdo/testing/dist/regression/security-regression.js +0 -258
  154. package/v3/@swarmdo/testing/dist/setup.d.ts +0 -43
  155. package/v3/@swarmdo/testing/dist/setup.js +0 -91
  156. package/v3/@swarmdo/testing/dist/v2-compat/api-compat.test.d.ts +0 -10
  157. package/v3/@swarmdo/testing/dist/v2-compat/api-compat.test.js +0 -433
  158. package/v3/@swarmdo/testing/dist/v2-compat/cli-compat.test.d.ts +0 -10
  159. package/v3/@swarmdo/testing/dist/v2-compat/cli-compat.test.js +0 -352
  160. package/v3/@swarmdo/testing/dist/v2-compat/compatibility-validator.d.ts +0 -206
  161. package/v3/@swarmdo/testing/dist/v2-compat/compatibility-validator.js +0 -839
  162. package/v3/@swarmdo/testing/dist/v2-compat/hooks-compat.test.d.ts +0 -10
  163. package/v3/@swarmdo/testing/dist/v2-compat/hooks-compat.test.js +0 -428
  164. package/v3/@swarmdo/testing/dist/v2-compat/index.d.ts +0 -38
  165. package/v3/@swarmdo/testing/dist/v2-compat/index.js +0 -41
  166. package/v3/@swarmdo/testing/dist/v2-compat/mcp-compat.test.d.ts +0 -10
  167. package/v3/@swarmdo/testing/dist/v2-compat/mcp-compat.test.js +0 -419
  168. package/v3/@swarmdo/testing/dist/v2-compat/report-generator.d.ts +0 -34
  169. 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