@silicaclaw/cli 1.0.0-beta.0 → 1.0.0-beta.10

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 (67) hide show
  1. package/INSTALL.md +31 -4
  2. package/README.md +36 -5
  3. package/package.json +6 -1
  4. package/packages/core/dist/crypto.d.ts +6 -0
  5. package/packages/core/dist/crypto.js +50 -0
  6. package/packages/core/dist/directory.d.ts +17 -0
  7. package/packages/core/dist/directory.js +145 -0
  8. package/packages/core/dist/identity.d.ts +2 -0
  9. package/packages/core/dist/identity.js +18 -0
  10. package/packages/core/dist/index.d.ts +11 -0
  11. package/packages/core/dist/index.js +27 -0
  12. package/packages/core/dist/indexing.d.ts +6 -0
  13. package/packages/core/dist/indexing.js +43 -0
  14. package/packages/core/dist/presence.d.ts +4 -0
  15. package/packages/core/dist/presence.js +23 -0
  16. package/packages/core/dist/profile.d.ts +4 -0
  17. package/packages/core/dist/profile.js +39 -0
  18. package/packages/core/dist/publicProfileSummary.d.ts +70 -0
  19. package/packages/core/dist/publicProfileSummary.js +103 -0
  20. package/packages/core/dist/socialConfig.d.ts +99 -0
  21. package/packages/core/dist/socialConfig.js +287 -0
  22. package/packages/core/dist/socialResolver.d.ts +46 -0
  23. package/packages/core/dist/socialResolver.js +227 -0
  24. package/packages/core/dist/socialTemplate.d.ts +2 -0
  25. package/packages/core/dist/socialTemplate.js +88 -0
  26. package/packages/core/dist/types.d.ts +37 -0
  27. package/packages/core/dist/types.js +2 -0
  28. package/packages/network/dist/abstractions/messageEnvelope.d.ts +28 -0
  29. package/packages/network/dist/abstractions/messageEnvelope.js +36 -0
  30. package/packages/network/dist/abstractions/peerDiscovery.d.ts +43 -0
  31. package/packages/network/dist/abstractions/peerDiscovery.js +2 -0
  32. package/packages/network/dist/abstractions/topicCodec.d.ts +4 -0
  33. package/packages/network/dist/abstractions/topicCodec.js +2 -0
  34. package/packages/network/dist/abstractions/transport.d.ts +36 -0
  35. package/packages/network/dist/abstractions/transport.js +2 -0
  36. package/packages/network/dist/codec/jsonMessageEnvelopeCodec.d.ts +5 -0
  37. package/packages/network/dist/codec/jsonMessageEnvelopeCodec.js +24 -0
  38. package/packages/network/dist/codec/jsonTopicCodec.d.ts +5 -0
  39. package/packages/network/dist/codec/jsonTopicCodec.js +12 -0
  40. package/packages/network/dist/discovery/heartbeatPeerDiscovery.d.ts +28 -0
  41. package/packages/network/dist/discovery/heartbeatPeerDiscovery.js +144 -0
  42. package/packages/network/dist/index.d.ts +13 -0
  43. package/packages/network/dist/index.js +29 -0
  44. package/packages/network/dist/localEventBus.d.ts +9 -0
  45. package/packages/network/dist/localEventBus.js +47 -0
  46. package/packages/network/dist/mock.d.ts +8 -0
  47. package/packages/network/dist/mock.js +24 -0
  48. package/packages/network/dist/realPreview.d.ts +105 -0
  49. package/packages/network/dist/realPreview.js +327 -0
  50. package/packages/network/dist/transport/udpLanBroadcastTransport.d.ts +23 -0
  51. package/packages/network/dist/transport/udpLanBroadcastTransport.js +153 -0
  52. package/packages/network/dist/types.d.ts +6 -0
  53. package/packages/network/dist/types.js +2 -0
  54. package/packages/network/dist/webrtcPreview.d.ts +163 -0
  55. package/packages/network/dist/webrtcPreview.js +844 -0
  56. package/packages/storage/dist/index.d.ts +3 -0
  57. package/packages/storage/dist/index.js +19 -0
  58. package/packages/storage/dist/jsonRepo.d.ts +7 -0
  59. package/packages/storage/dist/jsonRepo.js +29 -0
  60. package/packages/storage/dist/repos.d.ts +21 -0
  61. package/packages/storage/dist/repos.js +41 -0
  62. package/packages/storage/dist/socialRuntimeRepo.d.ts +5 -0
  63. package/packages/storage/dist/socialRuntimeRepo.js +52 -0
  64. package/packages/storage/tsconfig.json +6 -1
  65. package/scripts/quickstart.sh +198 -21
  66. package/scripts/silicaclaw-cli.mjs +103 -0
  67. package/scripts/silicaclaw-gateway.mjs +321 -0
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HeartbeatPeerDiscovery = void 0;
4
+ class HeartbeatPeerDiscovery {
5
+ peers = new Map();
6
+ timer = null;
7
+ context = null;
8
+ heartbeatIntervalMs;
9
+ staleAfterMs;
10
+ removeAfterMs;
11
+ topic;
12
+ stats = {
13
+ observe_calls: 0,
14
+ peers_added: 0,
15
+ peers_removed: 0,
16
+ peers_marked_stale: 0,
17
+ heartbeat_sent: 0,
18
+ heartbeat_send_errors: 0,
19
+ reconcile_runs: 0,
20
+ last_observed_at: 0,
21
+ last_heartbeat_at: 0,
22
+ last_reconcile_at: 0,
23
+ last_error_at: 0,
24
+ };
25
+ constructor(options = {}) {
26
+ this.heartbeatIntervalMs = options.heartbeatIntervalMs ?? 12_000;
27
+ this.staleAfterMs = options.staleAfterMs ?? 45_000;
28
+ this.removeAfterMs = options.removeAfterMs ?? 180_000;
29
+ this.topic = options.topic ?? "__discovery/heartbeat";
30
+ }
31
+ async start(context) {
32
+ this.context = context;
33
+ this.reconcilePeerHealth();
34
+ await this.sendHeartbeat();
35
+ this.timer = setInterval(async () => {
36
+ await this.sendHeartbeat();
37
+ this.reconcilePeerHealth();
38
+ }, this.heartbeatIntervalMs);
39
+ }
40
+ async stop() {
41
+ if (this.timer) {
42
+ clearInterval(this.timer);
43
+ this.timer = null;
44
+ }
45
+ }
46
+ observeEnvelope(envelope) {
47
+ this.stats.observe_calls += 1;
48
+ this.stats.last_observed_at = Date.now();
49
+ if (!this.context) {
50
+ return;
51
+ }
52
+ if (envelope.source_peer_id === this.context.self_peer_id) {
53
+ return;
54
+ }
55
+ const now = Date.now();
56
+ const existing = this.peers.get(envelope.source_peer_id);
57
+ if (!existing) {
58
+ this.stats.peers_added += 1;
59
+ }
60
+ this.peers.set(envelope.source_peer_id, {
61
+ peer_id: envelope.source_peer_id,
62
+ first_seen_at: existing?.first_seen_at ?? now,
63
+ last_seen_at: now,
64
+ status: "online",
65
+ stale_since_at: undefined,
66
+ messages_seen: (existing?.messages_seen ?? 0) + 1,
67
+ meta: envelope.topic === this.topic && typeof envelope.payload === "object" && envelope.payload !== null
68
+ ? envelope.payload
69
+ : existing?.meta,
70
+ });
71
+ }
72
+ listPeers() {
73
+ this.reconcilePeerHealth();
74
+ return Array.from(this.peers.values()).sort((a, b) => {
75
+ const score = (p) => (p.status === "online" ? 1 : 0);
76
+ const byStatus = score(b) - score(a);
77
+ if (byStatus !== 0) {
78
+ return byStatus;
79
+ }
80
+ return b.last_seen_at - a.last_seen_at;
81
+ });
82
+ }
83
+ getStats() {
84
+ return { ...this.stats };
85
+ }
86
+ getConfig() {
87
+ return {
88
+ discovery: "heartbeat-peer-discovery",
89
+ heartbeat_topic: this.topic,
90
+ heartbeat_interval_ms: this.heartbeatIntervalMs,
91
+ stale_after_ms: this.staleAfterMs,
92
+ remove_after_ms: this.removeAfterMs,
93
+ };
94
+ }
95
+ async sendHeartbeat() {
96
+ if (!this.context) {
97
+ return;
98
+ }
99
+ try {
100
+ await this.context.publishControl(this.topic, {
101
+ kind: "heartbeat",
102
+ at: Date.now(),
103
+ });
104
+ this.stats.heartbeat_sent += 1;
105
+ this.stats.last_heartbeat_at = Date.now();
106
+ }
107
+ catch {
108
+ this.stats.heartbeat_send_errors += 1;
109
+ this.stats.last_error_at = Date.now();
110
+ }
111
+ }
112
+ reconcilePeerHealth() {
113
+ const now = Date.now();
114
+ this.stats.reconcile_runs += 1;
115
+ this.stats.last_reconcile_at = now;
116
+ for (const [peerId, peer] of this.peers.entries()) {
117
+ const age = now - peer.last_seen_at;
118
+ if (age > this.removeAfterMs) {
119
+ this.peers.delete(peerId);
120
+ this.stats.peers_removed += 1;
121
+ continue;
122
+ }
123
+ if (age > this.staleAfterMs) {
124
+ if (peer.status !== "stale") {
125
+ this.stats.peers_marked_stale += 1;
126
+ }
127
+ this.peers.set(peerId, {
128
+ ...peer,
129
+ status: "stale",
130
+ stale_since_at: peer.stale_since_at ?? now,
131
+ });
132
+ continue;
133
+ }
134
+ if (peer.status !== "online") {
135
+ this.peers.set(peerId, {
136
+ ...peer,
137
+ status: "online",
138
+ stale_since_at: undefined,
139
+ });
140
+ }
141
+ }
142
+ }
143
+ }
144
+ exports.HeartbeatPeerDiscovery = HeartbeatPeerDiscovery;
@@ -0,0 +1,13 @@
1
+ export * from "./types";
2
+ export * from "./mock";
3
+ export * from "./localEventBus";
4
+ export * from "./realPreview";
5
+ export * from "./webrtcPreview";
6
+ export * from "./abstractions/messageEnvelope";
7
+ export * from "./abstractions/topicCodec";
8
+ export * from "./abstractions/transport";
9
+ export * from "./abstractions/peerDiscovery";
10
+ export * from "./codec/jsonMessageEnvelopeCodec";
11
+ export * from "./codec/jsonTopicCodec";
12
+ export * from "./discovery/heartbeatPeerDiscovery";
13
+ export * from "./transport/udpLanBroadcastTransport";
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types"), exports);
18
+ __exportStar(require("./mock"), exports);
19
+ __exportStar(require("./localEventBus"), exports);
20
+ __exportStar(require("./realPreview"), exports);
21
+ __exportStar(require("./webrtcPreview"), exports);
22
+ __exportStar(require("./abstractions/messageEnvelope"), exports);
23
+ __exportStar(require("./abstractions/topicCodec"), exports);
24
+ __exportStar(require("./abstractions/transport"), exports);
25
+ __exportStar(require("./abstractions/peerDiscovery"), exports);
26
+ __exportStar(require("./codec/jsonMessageEnvelopeCodec"), exports);
27
+ __exportStar(require("./codec/jsonTopicCodec"), exports);
28
+ __exportStar(require("./discovery/heartbeatPeerDiscovery"), exports);
29
+ __exportStar(require("./transport/udpLanBroadcastTransport"), exports);
@@ -0,0 +1,9 @@
1
+ import { NetworkAdapter } from "./types";
2
+ export declare class LocalEventBusAdapter implements NetworkAdapter {
3
+ private started;
4
+ private emitter;
5
+ start(): Promise<void>;
6
+ stop(): Promise<void>;
7
+ publish(topic: string, data: any): Promise<void>;
8
+ subscribe(topic: string, handler: (data: any) => void): void;
9
+ }
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LocalEventBusAdapter = void 0;
4
+ const events_1 = require("events");
5
+ const CHANNEL_NAME = "silicaclaw-local-event-bus";
6
+ function getNodeBus() {
7
+ const g = globalThis;
8
+ if (!g.__silicaclaw_bus) {
9
+ g.__silicaclaw_bus = new events_1.EventEmitter();
10
+ }
11
+ return g.__silicaclaw_bus;
12
+ }
13
+ class LocalEventBusAdapter {
14
+ started = false;
15
+ emitter = getNodeBus();
16
+ async start() {
17
+ this.started = true;
18
+ }
19
+ async stop() {
20
+ this.started = false;
21
+ }
22
+ async publish(topic, data) {
23
+ if (!this.started) {
24
+ return;
25
+ }
26
+ if (typeof BroadcastChannel !== "undefined") {
27
+ const channel = new BroadcastChannel(CHANNEL_NAME);
28
+ channel.postMessage({ topic, data });
29
+ channel.close();
30
+ return;
31
+ }
32
+ setImmediate(() => this.emitter.emit(topic, data));
33
+ }
34
+ subscribe(topic, handler) {
35
+ if (typeof BroadcastChannel !== "undefined") {
36
+ const channel = new BroadcastChannel(CHANNEL_NAME);
37
+ channel.onmessage = (event) => {
38
+ if (event.data?.topic === topic) {
39
+ handler(event.data.data);
40
+ }
41
+ };
42
+ return;
43
+ }
44
+ this.emitter.on(topic, handler);
45
+ }
46
+ }
47
+ exports.LocalEventBusAdapter = LocalEventBusAdapter;
@@ -0,0 +1,8 @@
1
+ import { NetworkAdapter } from "./types";
2
+ export declare class MockNetworkAdapter implements NetworkAdapter {
3
+ private started;
4
+ start(): Promise<void>;
5
+ stop(): Promise<void>;
6
+ publish(topic: string, data: any): Promise<void>;
7
+ subscribe(topic: string, handler: (data: any) => void): void;
8
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MockNetworkAdapter = void 0;
4
+ const events_1 = require("events");
5
+ const bus = new events_1.EventEmitter();
6
+ class MockNetworkAdapter {
7
+ started = false;
8
+ async start() {
9
+ this.started = true;
10
+ }
11
+ async stop() {
12
+ this.started = false;
13
+ }
14
+ async publish(topic, data) {
15
+ if (!this.started) {
16
+ return;
17
+ }
18
+ setImmediate(() => bus.emit(topic, data));
19
+ }
20
+ subscribe(topic, handler) {
21
+ bus.on(topic, handler);
22
+ }
23
+ }
24
+ exports.MockNetworkAdapter = MockNetworkAdapter;
@@ -0,0 +1,105 @@
1
+ import { NetworkAdapter } from "./types";
2
+ import { MessageEnvelopeCodec } from "./abstractions/messageEnvelope";
3
+ import { TopicCodec } from "./abstractions/topicCodec";
4
+ import { NetworkTransport } from "./abstractions/transport";
5
+ import { PeerDiscovery, PeerSnapshot } from "./abstractions/peerDiscovery";
6
+ type RealNetworkAdapterPreviewOptions = {
7
+ peerId?: string;
8
+ namespace?: string;
9
+ transport?: NetworkTransport;
10
+ envelopeCodec?: MessageEnvelopeCodec;
11
+ topicCodec?: TopicCodec;
12
+ peerDiscovery?: PeerDiscovery;
13
+ maxMessageBytes?: number;
14
+ dedupeWindowMs?: number;
15
+ dedupeMaxEntries?: number;
16
+ maxFutureDriftMs?: number;
17
+ maxPastDriftMs?: number;
18
+ };
19
+ type NetworkDiagnostics = {
20
+ adapter: string;
21
+ peer_id: string;
22
+ namespace: string;
23
+ components: {
24
+ transport: string;
25
+ discovery: string;
26
+ envelope_codec: string;
27
+ topic_codec: string;
28
+ };
29
+ limits: {
30
+ max_message_bytes: number;
31
+ dedupe_window_ms: number;
32
+ dedupe_max_entries: number;
33
+ max_future_drift_ms: number;
34
+ max_past_drift_ms: number;
35
+ };
36
+ config: {
37
+ started: boolean;
38
+ topic_handler_count: number;
39
+ transport: ReturnType<NonNullable<NetworkTransport["getConfig"]>> | null;
40
+ discovery: ReturnType<NonNullable<PeerDiscovery["getConfig"]>> | null;
41
+ };
42
+ peers: {
43
+ total: number;
44
+ online: number;
45
+ stale: number;
46
+ items: PeerSnapshot[];
47
+ };
48
+ stats: {
49
+ publish_attempted: number;
50
+ publish_sent: number;
51
+ received_total: number;
52
+ delivered_total: number;
53
+ dropped_duplicate: number;
54
+ dropped_self: number;
55
+ dropped_malformed: number;
56
+ dropped_oversized: number;
57
+ dropped_namespace_mismatch: number;
58
+ dropped_timestamp_future_drift: number;
59
+ dropped_timestamp_past_drift: number;
60
+ dropped_decode_failed: number;
61
+ dropped_topic_decode_error: number;
62
+ dropped_handler_error: number;
63
+ send_errors: number;
64
+ discovery_errors: number;
65
+ start_errors: number;
66
+ stop_errors: number;
67
+ received_validated: number;
68
+ };
69
+ transport_stats: ReturnType<NonNullable<NetworkTransport["getStats"]>> | null;
70
+ discovery_stats: ReturnType<NonNullable<PeerDiscovery["getStats"]>> | null;
71
+ };
72
+ export declare class RealNetworkAdapterPreview implements NetworkAdapter {
73
+ private started;
74
+ private peerId;
75
+ private namespace;
76
+ private transport;
77
+ private envelopeCodec;
78
+ private topicCodec;
79
+ private peerDiscovery;
80
+ private maxMessageBytes;
81
+ private dedupeWindowMs;
82
+ private dedupeMaxEntries;
83
+ private maxFutureDriftMs;
84
+ private maxPastDriftMs;
85
+ private seenMessageIds;
86
+ private offTransportMessage;
87
+ private handlers;
88
+ private stats;
89
+ constructor(options?: RealNetworkAdapterPreviewOptions);
90
+ start(): Promise<void>;
91
+ stop(): Promise<void>;
92
+ publish(topic: string, data: any): Promise<void>;
93
+ subscribe(topic: string, handler: (data: any) => void): void;
94
+ listPeers(): PeerSnapshot[];
95
+ getDiagnostics(): NetworkDiagnostics;
96
+ private onTransportMessage;
97
+ private topicKey;
98
+ private stripNamespace;
99
+ private isDuplicateMessage;
100
+ private cleanupSeenMessageIds;
101
+ private isValidTopic;
102
+ private normalizeNamespace;
103
+ private errorMessage;
104
+ }
105
+ export {};