@silicaclaw/cli 2026.3.19-15 → 2026.3.19-16

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 (195) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/INSTALL.md +44 -11
  3. package/README.md +53 -19
  4. package/VERSION +1 -1
  5. package/apps/local-console/dist/apps/local-console/src/server.d.ts +30 -12
  6. package/apps/local-console/dist/apps/local-console/src/server.js +265 -48
  7. package/apps/local-console/dist/config/silicaclaw-defaults.json +19 -0
  8. package/apps/local-console/dist/packages/core/src/socialConfig.js +9 -5
  9. package/apps/local-console/dist/packages/network/src/realPreview.js +6 -2
  10. package/apps/local-console/dist/packages/network/src/relayPreview.js +8 -2
  11. package/apps/local-console/dist/packages/network/src/transport/udpLanBroadcastTransport.js +2 -1
  12. package/apps/local-console/dist/packages/network/src/webrtcPreview.js +5 -1
  13. package/apps/local-console/dist/packages/storage/src/socialRuntimeRepo.js +8 -4
  14. package/apps/local-console/public/app/app.js +17 -1
  15. package/apps/local-console/public/app/events.js +38 -2
  16. package/apps/local-console/public/app/network.js +32 -3
  17. package/apps/local-console/public/app/overview.js +4 -2
  18. package/apps/local-console/public/app/social.js +175 -26
  19. package/apps/local-console/public/app/styles.css +182 -14
  20. package/apps/local-console/public/app/template.js +70 -30
  21. package/apps/local-console/public/app/translations.js +131 -43
  22. package/apps/local-console/src/server.ts +281 -50
  23. package/apps/public-explorer/dist/apps/public-explorer/src/server.d.ts +1 -0
  24. package/apps/public-explorer/dist/apps/public-explorer/src/server.js +41 -0
  25. package/apps/public-explorer/dist/config/silicaclaw-defaults.json +19 -0
  26. package/apps/public-explorer/public/app/app.js +22 -2
  27. package/apps/public-explorer/public/app/template.js +4 -4
  28. package/apps/public-explorer/public/app/translations.js +15 -15
  29. package/apps/public-explorer/src/server.ts +11 -1
  30. package/docs/NEW_USER_INSTALL.md +14 -10
  31. package/docs/NEW_USER_OPERATIONS.md +3 -3
  32. package/docs/OPENCLAW_BRIDGE.md +15 -0
  33. package/docs/OPENCLAW_BRIDGE_ZH.md +15 -0
  34. package/node_modules/@silicaclaw/core/dist/config/silicaclaw-defaults.json +19 -0
  35. package/node_modules/@silicaclaw/core/dist/packages/core/src/crypto.d.ts +6 -0
  36. package/node_modules/@silicaclaw/core/dist/packages/core/src/crypto.js +50 -0
  37. package/node_modules/@silicaclaw/core/dist/packages/core/src/directory.d.ts +17 -0
  38. package/node_modules/@silicaclaw/core/dist/packages/core/src/directory.js +145 -0
  39. package/node_modules/@silicaclaw/core/dist/packages/core/src/identity.d.ts +2 -0
  40. package/node_modules/@silicaclaw/core/dist/packages/core/src/identity.js +18 -0
  41. package/node_modules/@silicaclaw/core/dist/packages/core/src/index.d.ts +12 -0
  42. package/node_modules/@silicaclaw/core/dist/packages/core/src/index.js +28 -0
  43. package/node_modules/@silicaclaw/core/dist/packages/core/src/indexing.d.ts +6 -0
  44. package/node_modules/@silicaclaw/core/dist/packages/core/src/indexing.js +43 -0
  45. package/node_modules/@silicaclaw/core/dist/packages/core/src/presence.d.ts +4 -0
  46. package/node_modules/@silicaclaw/core/dist/packages/core/src/presence.js +23 -0
  47. package/node_modules/@silicaclaw/core/dist/packages/core/src/profile.d.ts +4 -0
  48. package/node_modules/@silicaclaw/core/dist/packages/core/src/profile.js +39 -0
  49. package/node_modules/@silicaclaw/core/dist/packages/core/src/publicProfileSummary.d.ts +70 -0
  50. package/node_modules/@silicaclaw/core/dist/packages/core/src/publicProfileSummary.js +103 -0
  51. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialConfig.d.ts +100 -0
  52. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialConfig.js +300 -0
  53. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialMessage.d.ts +19 -0
  54. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialMessage.js +69 -0
  55. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialResolver.d.ts +46 -0
  56. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialResolver.js +237 -0
  57. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialTemplate.d.ts +2 -0
  58. package/node_modules/@silicaclaw/core/dist/packages/core/src/socialTemplate.js +90 -0
  59. package/node_modules/@silicaclaw/core/dist/packages/core/src/types.d.ts +59 -0
  60. package/node_modules/@silicaclaw/core/dist/packages/core/src/types.js +2 -0
  61. package/node_modules/@silicaclaw/core/src/socialConfig.ts +7 -5
  62. package/node_modules/@silicaclaw/network/dist/config/silicaclaw-defaults.json +19 -0
  63. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/messageEnvelope.d.ts +28 -0
  64. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/messageEnvelope.js +36 -0
  65. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/peerDiscovery.d.ts +43 -0
  66. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/peerDiscovery.js +2 -0
  67. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/topicCodec.d.ts +4 -0
  68. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/topicCodec.js +2 -0
  69. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/transport.d.ts +36 -0
  70. package/node_modules/@silicaclaw/network/dist/packages/network/src/abstractions/transport.js +2 -0
  71. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.d.ts +5 -0
  72. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.js +24 -0
  73. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonTopicCodec.d.ts +5 -0
  74. package/node_modules/@silicaclaw/network/dist/packages/network/src/codec/jsonTopicCodec.js +12 -0
  75. package/node_modules/@silicaclaw/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.d.ts +28 -0
  76. package/node_modules/@silicaclaw/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.js +144 -0
  77. package/node_modules/@silicaclaw/network/dist/packages/network/src/index.d.ts +14 -0
  78. package/node_modules/@silicaclaw/network/dist/packages/network/src/index.js +30 -0
  79. package/node_modules/@silicaclaw/network/dist/packages/network/src/localEventBus.d.ts +9 -0
  80. package/node_modules/@silicaclaw/network/dist/packages/network/src/localEventBus.js +47 -0
  81. package/node_modules/@silicaclaw/network/dist/packages/network/src/mock.d.ts +8 -0
  82. package/node_modules/@silicaclaw/network/dist/packages/network/src/mock.js +24 -0
  83. package/node_modules/@silicaclaw/network/dist/packages/network/src/realPreview.d.ts +105 -0
  84. package/node_modules/@silicaclaw/network/dist/packages/network/src/realPreview.js +331 -0
  85. package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.d.ts +166 -0
  86. package/node_modules/@silicaclaw/network/dist/packages/network/src/relayPreview.js +448 -0
  87. package/node_modules/@silicaclaw/network/dist/packages/network/src/transport/udpLanBroadcastTransport.d.ts +23 -0
  88. package/node_modules/@silicaclaw/network/dist/packages/network/src/transport/udpLanBroadcastTransport.js +154 -0
  89. package/node_modules/@silicaclaw/network/dist/packages/network/src/types.d.ts +6 -0
  90. package/node_modules/@silicaclaw/network/dist/packages/network/src/types.js +2 -0
  91. package/node_modules/@silicaclaw/network/dist/packages/network/src/webrtcPreview.d.ts +163 -0
  92. package/node_modules/@silicaclaw/network/dist/packages/network/src/webrtcPreview.js +848 -0
  93. package/node_modules/@silicaclaw/network/src/realPreview.ts +3 -2
  94. package/node_modules/@silicaclaw/network/src/relayPreview.ts +5 -2
  95. package/node_modules/@silicaclaw/network/src/transport/udpLanBroadcastTransport.ts +2 -1
  96. package/node_modules/@silicaclaw/network/src/webrtcPreview.ts +2 -1
  97. package/node_modules/@silicaclaw/storage/dist/socialRuntimeRepo.js +8 -4
  98. package/node_modules/@silicaclaw/storage/src/socialRuntimeRepo.ts +5 -4
  99. package/openclaw-skills/silicaclaw-bridge-setup/SKILL.md +147 -0
  100. package/openclaw-skills/silicaclaw-bridge-setup/VERSION +1 -0
  101. package/openclaw-skills/silicaclaw-bridge-setup/agents/openai.yaml +6 -0
  102. package/openclaw-skills/silicaclaw-bridge-setup/manifest.json +27 -0
  103. package/openclaw-skills/silicaclaw-bridge-setup/references/owner-dialogue-cheatsheet-zh.md +58 -0
  104. package/openclaw-skills/silicaclaw-bridge-setup/references/runtime-setup.md +43 -0
  105. package/openclaw-skills/silicaclaw-bridge-setup/references/troubleshooting.md +24 -0
  106. package/openclaw-skills/silicaclaw-broadcast/SKILL.md +132 -0
  107. package/openclaw-skills/silicaclaw-broadcast/VERSION +1 -1
  108. package/openclaw-skills/silicaclaw-broadcast/agents/openai.yaml +2 -2
  109. package/openclaw-skills/silicaclaw-broadcast/manifest.json +3 -2
  110. package/openclaw-skills/silicaclaw-broadcast/references/owner-dialogue-cheatsheet-zh.md +81 -0
  111. package/openclaw-skills/silicaclaw-owner-push/SKILL.md +217 -0
  112. package/openclaw-skills/silicaclaw-owner-push/VERSION +1 -0
  113. package/openclaw-skills/silicaclaw-owner-push/agents/openai.yaml +6 -0
  114. package/openclaw-skills/silicaclaw-owner-push/manifest.json +30 -0
  115. package/openclaw-skills/silicaclaw-owner-push/references/owner-dialogue-cheatsheet-zh.md +87 -0
  116. package/openclaw-skills/silicaclaw-owner-push/references/push-routing-policy.md +43 -0
  117. package/openclaw-skills/silicaclaw-owner-push/references/runtime-setup.md +41 -0
  118. package/openclaw-skills/silicaclaw-owner-push/scripts/owner-push-forwarder.mjs +214 -0
  119. package/openclaw-skills/silicaclaw-owner-push/scripts/send-to-owner-via-openclaw.mjs +69 -0
  120. package/package.json +1 -1
  121. package/packages/core/dist/config/silicaclaw-defaults.json +19 -0
  122. package/packages/core/dist/packages/core/src/crypto.d.ts +6 -0
  123. package/packages/core/dist/packages/core/src/crypto.js +50 -0
  124. package/packages/core/dist/packages/core/src/directory.d.ts +17 -0
  125. package/packages/core/dist/packages/core/src/directory.js +145 -0
  126. package/packages/core/dist/packages/core/src/identity.d.ts +2 -0
  127. package/packages/core/dist/packages/core/src/identity.js +18 -0
  128. package/packages/core/dist/packages/core/src/index.d.ts +12 -0
  129. package/packages/core/dist/packages/core/src/index.js +28 -0
  130. package/packages/core/dist/packages/core/src/indexing.d.ts +6 -0
  131. package/packages/core/dist/packages/core/src/indexing.js +43 -0
  132. package/packages/core/dist/packages/core/src/presence.d.ts +4 -0
  133. package/packages/core/dist/packages/core/src/presence.js +23 -0
  134. package/packages/core/dist/packages/core/src/profile.d.ts +4 -0
  135. package/packages/core/dist/packages/core/src/profile.js +39 -0
  136. package/packages/core/dist/packages/core/src/publicProfileSummary.d.ts +70 -0
  137. package/packages/core/dist/packages/core/src/publicProfileSummary.js +103 -0
  138. package/packages/core/dist/packages/core/src/socialConfig.d.ts +100 -0
  139. package/packages/core/dist/packages/core/src/socialConfig.js +300 -0
  140. package/packages/core/dist/packages/core/src/socialMessage.d.ts +19 -0
  141. package/packages/core/dist/packages/core/src/socialMessage.js +69 -0
  142. package/packages/core/dist/packages/core/src/socialResolver.d.ts +46 -0
  143. package/packages/core/dist/packages/core/src/socialResolver.js +237 -0
  144. package/packages/core/dist/packages/core/src/socialTemplate.d.ts +2 -0
  145. package/packages/core/dist/packages/core/src/socialTemplate.js +90 -0
  146. package/packages/core/dist/packages/core/src/types.d.ts +59 -0
  147. package/packages/core/dist/packages/core/src/types.js +2 -0
  148. package/packages/core/src/socialConfig.ts +7 -5
  149. package/packages/network/dist/config/silicaclaw-defaults.json +19 -0
  150. package/packages/network/dist/packages/network/src/abstractions/messageEnvelope.d.ts +28 -0
  151. package/packages/network/dist/packages/network/src/abstractions/messageEnvelope.js +36 -0
  152. package/packages/network/dist/packages/network/src/abstractions/peerDiscovery.d.ts +43 -0
  153. package/packages/network/dist/packages/network/src/abstractions/peerDiscovery.js +2 -0
  154. package/packages/network/dist/packages/network/src/abstractions/topicCodec.d.ts +4 -0
  155. package/packages/network/dist/packages/network/src/abstractions/topicCodec.js +2 -0
  156. package/packages/network/dist/packages/network/src/abstractions/transport.d.ts +36 -0
  157. package/packages/network/dist/packages/network/src/abstractions/transport.js +2 -0
  158. package/packages/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.d.ts +5 -0
  159. package/packages/network/dist/packages/network/src/codec/jsonMessageEnvelopeCodec.js +24 -0
  160. package/packages/network/dist/packages/network/src/codec/jsonTopicCodec.d.ts +5 -0
  161. package/packages/network/dist/packages/network/src/codec/jsonTopicCodec.js +12 -0
  162. package/packages/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.d.ts +28 -0
  163. package/packages/network/dist/packages/network/src/discovery/heartbeatPeerDiscovery.js +144 -0
  164. package/packages/network/dist/packages/network/src/index.d.ts +14 -0
  165. package/packages/network/dist/packages/network/src/index.js +30 -0
  166. package/packages/network/dist/packages/network/src/localEventBus.d.ts +9 -0
  167. package/packages/network/dist/packages/network/src/localEventBus.js +47 -0
  168. package/packages/network/dist/packages/network/src/mock.d.ts +8 -0
  169. package/packages/network/dist/packages/network/src/mock.js +24 -0
  170. package/packages/network/dist/packages/network/src/realPreview.d.ts +105 -0
  171. package/packages/network/dist/packages/network/src/realPreview.js +331 -0
  172. package/packages/network/dist/packages/network/src/relayPreview.d.ts +166 -0
  173. package/packages/network/dist/packages/network/src/relayPreview.js +448 -0
  174. package/packages/network/dist/packages/network/src/transport/udpLanBroadcastTransport.d.ts +23 -0
  175. package/packages/network/dist/packages/network/src/transport/udpLanBroadcastTransport.js +154 -0
  176. package/packages/network/dist/packages/network/src/types.d.ts +6 -0
  177. package/packages/network/dist/packages/network/src/types.js +2 -0
  178. package/packages/network/dist/packages/network/src/webrtcPreview.d.ts +163 -0
  179. package/packages/network/dist/packages/network/src/webrtcPreview.js +848 -0
  180. package/packages/network/src/realPreview.ts +3 -2
  181. package/packages/network/src/relayPreview.ts +5 -2
  182. package/packages/network/src/transport/udpLanBroadcastTransport.ts +2 -1
  183. package/packages/network/src/webrtcPreview.ts +2 -1
  184. package/packages/storage/dist/socialRuntimeRepo.js +8 -4
  185. package/packages/storage/src/socialRuntimeRepo.ts +5 -4
  186. package/scripts/functional-check.mjs +35 -6
  187. package/scripts/install-openclaw-skill.mjs +9 -2
  188. package/scripts/openclaw-bridge-adapter.mjs +3 -1
  189. package/scripts/openclaw-bridge-client.mjs +3 -1
  190. package/scripts/openclaw-runtime-demo.mjs +3 -1
  191. package/scripts/quickstart.sh +13 -9
  192. package/scripts/release-pack.mjs +13 -1
  193. package/scripts/silicaclaw-cli.mjs +23 -18
  194. package/scripts/silicaclaw-gateway.mjs +33 -27
  195. package/scripts/validate-openclaw-skill.mjs +79 -21
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.signSocialMessage = signSocialMessage;
4
+ exports.verifySocialMessage = verifySocialMessage;
5
+ exports.signSocialMessageObservation = signSocialMessageObservation;
6
+ exports.verifySocialMessageObservation = verifySocialMessageObservation;
7
+ const crypto_1 = require("./crypto");
8
+ function unsignedSocialMessage(record) {
9
+ const { signature: _signature, ...rest } = record;
10
+ return rest;
11
+ }
12
+ function signSocialMessage(input) {
13
+ const payload = {
14
+ type: "social.message",
15
+ message_id: input.message_id,
16
+ agent_id: input.identity.agent_id,
17
+ public_key: input.identity.public_key,
18
+ display_name: input.display_name,
19
+ topic: input.topic,
20
+ body: input.body,
21
+ created_at: input.created_at ?? Date.now(),
22
+ };
23
+ return {
24
+ ...payload,
25
+ signature: (0, crypto_1.signPayload)(payload, input.identity.private_key),
26
+ };
27
+ }
28
+ function verifySocialMessage(record) {
29
+ try {
30
+ if ((0, crypto_1.hashPublicKey)((0, crypto_1.fromBase64)(record.public_key)) !== record.agent_id) {
31
+ return false;
32
+ }
33
+ return (0, crypto_1.verifyPayload)(unsignedSocialMessage(record), record.signature, record.public_key);
34
+ }
35
+ catch {
36
+ return false;
37
+ }
38
+ }
39
+ function unsignedSocialMessageObservation(record) {
40
+ const { signature: _signature, ...rest } = record;
41
+ return rest;
42
+ }
43
+ function signSocialMessageObservation(input) {
44
+ const payload = {
45
+ type: "social.message.observation",
46
+ observation_id: input.observation_id,
47
+ message_id: input.message_id,
48
+ observed_agent_id: input.observed_agent_id,
49
+ observer_agent_id: input.identity.agent_id,
50
+ observer_public_key: input.identity.public_key,
51
+ observer_display_name: input.observer_display_name,
52
+ observed_at: input.observed_at ?? Date.now(),
53
+ };
54
+ return {
55
+ ...payload,
56
+ signature: (0, crypto_1.signPayload)(payload, input.identity.private_key),
57
+ };
58
+ }
59
+ function verifySocialMessageObservation(record) {
60
+ try {
61
+ if ((0, crypto_1.hashPublicKey)((0, crypto_1.fromBase64)(record.observer_public_key)) !== record.observer_agent_id) {
62
+ return false;
63
+ }
64
+ return (0, crypto_1.verifyPayload)(unsignedSocialMessageObservation(record), record.signature, record.observer_public_key);
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
@@ -0,0 +1,46 @@
1
+ import { AgentIdentity, ProfileInput, PublicProfile } from "./types";
2
+ import { DefaultSocialTemplateOptions, SocialConfig, SocialLoadMeta } from "./socialConfig";
3
+ export type SocialFileLookup = {
4
+ found: boolean;
5
+ source_path: string | null;
6
+ content: string | null;
7
+ };
8
+ export type OpenClawIdentityLookup = {
9
+ identity: AgentIdentity | null;
10
+ source_path: string | null;
11
+ };
12
+ export type OpenClawProfileLookup = {
13
+ profile: Partial<PublicProfile> | null;
14
+ source_path: string | null;
15
+ };
16
+ export type LoadedSocialConfig = {
17
+ config: SocialConfig;
18
+ meta: SocialLoadMeta;
19
+ raw_frontmatter: Record<string, unknown> | null;
20
+ };
21
+ export type ResolvedIdentityResult = {
22
+ identity: AgentIdentity;
23
+ source: "silicaclaw-existing" | "openclaw-existing" | "silicaclaw-generated";
24
+ openclaw_source_path: string | null;
25
+ };
26
+ export declare function getSocialConfigSearchPaths(rootDir?: string, homeDir?: string): string[];
27
+ export declare function findSocialMd(rootDir?: string): SocialFileLookup;
28
+ export declare function loadSocialConfig(rootDir?: string): LoadedSocialConfig;
29
+ export declare function findOpenClawIdentity(rootDir?: string, homeDir?: string): OpenClawIdentityLookup;
30
+ export declare function findOpenClawProfile(rootDir?: string, homeDir?: string): OpenClawProfileLookup;
31
+ export declare function resolveIdentityWithSocial(args: {
32
+ socialConfig: SocialConfig;
33
+ existingIdentity: AgentIdentity | null;
34
+ generatedIdentity: AgentIdentity;
35
+ rootDir?: string;
36
+ }): ResolvedIdentityResult;
37
+ export declare function resolveProfileInputWithSocial(args: {
38
+ socialConfig: SocialConfig;
39
+ agentId: string;
40
+ existingProfile: PublicProfile | null;
41
+ rootDir?: string;
42
+ }): ProfileInput;
43
+ export declare function ensureDefaultSocialMd(rootDir?: string, options?: DefaultSocialTemplateOptions): {
44
+ path: string;
45
+ created: boolean;
46
+ };
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSocialConfigSearchPaths = getSocialConfigSearchPaths;
4
+ exports.findSocialMd = findSocialMd;
5
+ exports.loadSocialConfig = loadSocialConfig;
6
+ exports.findOpenClawIdentity = findOpenClawIdentity;
7
+ exports.findOpenClawProfile = findOpenClawProfile;
8
+ exports.resolveIdentityWithSocial = resolveIdentityWithSocial;
9
+ exports.resolveProfileInputWithSocial = resolveProfileInputWithSocial;
10
+ exports.ensureDefaultSocialMd = ensureDefaultSocialMd;
11
+ const fs_1 = require("fs");
12
+ const os_1 = require("os");
13
+ const path_1 = require("path");
14
+ const crypto_1 = require("./crypto");
15
+ const socialConfig_1 = require("./socialConfig");
16
+ function getSocialConfigSearchPaths(rootDir = process.cwd(), homeDir = (0, os_1.homedir)()) {
17
+ return [
18
+ (0, path_1.resolve)(rootDir, "social.md"),
19
+ (0, path_1.resolve)(rootDir, ".openclaw", "social.md"),
20
+ (0, path_1.resolve)(homeDir, ".openclaw", "social.md"),
21
+ ];
22
+ }
23
+ function findSocialMd(rootDir = process.cwd()) {
24
+ const candidates = getSocialConfigSearchPaths(rootDir);
25
+ for (const path of candidates) {
26
+ if (!(0, fs_1.existsSync)(path))
27
+ continue;
28
+ return {
29
+ found: true,
30
+ source_path: path,
31
+ content: (0, fs_1.readFileSync)(path, "utf8"),
32
+ };
33
+ }
34
+ return {
35
+ found: false,
36
+ source_path: null,
37
+ content: null,
38
+ };
39
+ }
40
+ function loadSocialConfig(rootDir = process.cwd()) {
41
+ const lookup = findSocialMd(rootDir);
42
+ if (!lookup.found || !lookup.content || !lookup.source_path) {
43
+ return {
44
+ config: (0, socialConfig_1.normalizeSocialConfig)({}),
45
+ meta: {
46
+ found: false,
47
+ source_path: null,
48
+ parse_error: null,
49
+ loaded_at: Date.now(),
50
+ },
51
+ raw_frontmatter: null,
52
+ };
53
+ }
54
+ try {
55
+ const frontmatter = (0, socialConfig_1.extractFrontmatter)(lookup.content);
56
+ if (!frontmatter) {
57
+ return {
58
+ config: (0, socialConfig_1.normalizeSocialConfig)({}),
59
+ meta: {
60
+ found: true,
61
+ source_path: lookup.source_path,
62
+ parse_error: "frontmatter_not_found",
63
+ loaded_at: Date.now(),
64
+ },
65
+ raw_frontmatter: null,
66
+ };
67
+ }
68
+ const parsed = (0, socialConfig_1.parseFrontmatterObject)(frontmatter);
69
+ return {
70
+ config: (0, socialConfig_1.normalizeSocialConfig)(parsed),
71
+ meta: {
72
+ found: true,
73
+ source_path: lookup.source_path,
74
+ parse_error: null,
75
+ loaded_at: Date.now(),
76
+ },
77
+ raw_frontmatter: parsed,
78
+ };
79
+ }
80
+ catch (error) {
81
+ return {
82
+ config: (0, socialConfig_1.normalizeSocialConfig)({}),
83
+ meta: {
84
+ found: true,
85
+ source_path: lookup.source_path,
86
+ parse_error: error instanceof Error ? error.message : "social_parse_failed",
87
+ loaded_at: Date.now(),
88
+ },
89
+ raw_frontmatter: null,
90
+ };
91
+ }
92
+ }
93
+ function readJson(path) {
94
+ if (!(0, fs_1.existsSync)(path))
95
+ return null;
96
+ try {
97
+ return JSON.parse((0, fs_1.readFileSync)(path, "utf8"));
98
+ }
99
+ catch {
100
+ return null;
101
+ }
102
+ }
103
+ function normalizeIdentity(input) {
104
+ if (typeof input !== "object" || input === null) {
105
+ return null;
106
+ }
107
+ const value = input;
108
+ if (typeof value.public_key !== "string" || typeof value.private_key !== "string") {
109
+ return null;
110
+ }
111
+ let agentId = typeof value.agent_id === "string" ? value.agent_id : "";
112
+ if (!agentId) {
113
+ try {
114
+ agentId = (0, crypto_1.hashPublicKey)((0, crypto_1.fromBase64)(value.public_key));
115
+ }
116
+ catch {
117
+ return null;
118
+ }
119
+ }
120
+ return {
121
+ agent_id: agentId,
122
+ public_key: value.public_key,
123
+ private_key: value.private_key,
124
+ created_at: Number.isFinite(value.created_at) ? Number(value.created_at) : Date.now(),
125
+ };
126
+ }
127
+ function findOpenClawIdentity(rootDir = process.cwd(), homeDir = (0, os_1.homedir)()) {
128
+ const candidates = [
129
+ (0, path_1.resolve)(rootDir, ".openclaw", "identity.json"),
130
+ (0, path_1.resolve)(rootDir, "identity.json"),
131
+ (0, path_1.resolve)(homeDir, ".openclaw", "identity.json"),
132
+ ];
133
+ for (const path of candidates) {
134
+ const parsed = readJson(path);
135
+ const identity = normalizeIdentity(parsed);
136
+ if (identity) {
137
+ return {
138
+ identity,
139
+ source_path: path,
140
+ };
141
+ }
142
+ }
143
+ return {
144
+ identity: null,
145
+ source_path: null,
146
+ };
147
+ }
148
+ function findOpenClawProfile(rootDir = process.cwd(), homeDir = (0, os_1.homedir)()) {
149
+ const candidates = [
150
+ (0, path_1.resolve)(rootDir, ".openclaw", "profile.json"),
151
+ (0, path_1.resolve)(rootDir, "profile.json"),
152
+ (0, path_1.resolve)(homeDir, ".openclaw", "profile.json"),
153
+ ];
154
+ for (const path of candidates) {
155
+ const parsed = readJson(path);
156
+ if (typeof parsed !== "object" || parsed === null)
157
+ continue;
158
+ const profile = parsed;
159
+ return {
160
+ source_path: path,
161
+ profile: {
162
+ display_name: typeof profile.display_name === "string" ? profile.display_name : "",
163
+ bio: typeof profile.bio === "string" ? profile.bio : "",
164
+ avatar_url: typeof profile.avatar_url === "string" ? profile.avatar_url : "",
165
+ tags: Array.isArray(profile.tags)
166
+ ? profile.tags.map((tag) => String(tag).trim()).filter(Boolean)
167
+ : [],
168
+ },
169
+ };
170
+ }
171
+ return {
172
+ profile: null,
173
+ source_path: null,
174
+ };
175
+ }
176
+ function resolveIdentityWithSocial(args) {
177
+ const { socialConfig, existingIdentity, generatedIdentity } = args;
178
+ if (socialConfig.openclaw.bind_existing_identity) {
179
+ const openclaw = findOpenClawIdentity(args.rootDir ?? process.cwd());
180
+ if (openclaw.identity) {
181
+ return {
182
+ identity: openclaw.identity,
183
+ source: "openclaw-existing",
184
+ openclaw_source_path: openclaw.source_path,
185
+ };
186
+ }
187
+ }
188
+ if (existingIdentity) {
189
+ return {
190
+ identity: existingIdentity,
191
+ source: "silicaclaw-existing",
192
+ openclaw_source_path: null,
193
+ };
194
+ }
195
+ return {
196
+ identity: generatedIdentity,
197
+ source: "silicaclaw-generated",
198
+ openclaw_source_path: null,
199
+ };
200
+ }
201
+ function resolveProfileInputWithSocial(args) {
202
+ const { socialConfig, agentId, existingProfile } = args;
203
+ const openclawProfile = socialConfig.openclaw.use_openclaw_profile_if_available
204
+ ? findOpenClawProfile(args.rootDir ?? process.cwd()).profile
205
+ : null;
206
+ const baseDisplayName = existingProfile?.display_name || "";
207
+ const baseBio = existingProfile?.bio || "";
208
+ const baseAvatarUrl = existingProfile?.avatar_url || "";
209
+ const baseTags = existingProfile?.tags || [];
210
+ // Preserve values saved from local-console first; only fall back to social/openclaw defaults
211
+ // when local profile fields are empty.
212
+ const displayName = baseDisplayName || socialConfig.identity.display_name || openclawProfile?.display_name || "";
213
+ const bio = baseBio || socialConfig.identity.bio || openclawProfile?.bio || "";
214
+ const avatarUrl = baseAvatarUrl || socialConfig.identity.avatar_url || openclawProfile?.avatar_url || "";
215
+ const tags = baseTags.length > 0
216
+ ? baseTags
217
+ : socialConfig.identity.tags.length > 0
218
+ ? socialConfig.identity.tags
219
+ : openclawProfile?.tags || [];
220
+ return {
221
+ agent_id: agentId,
222
+ display_name: displayName,
223
+ bio,
224
+ avatar_url: avatarUrl,
225
+ tags,
226
+ public_enabled: existingProfile?.public_enabled ?? socialConfig.public_enabled,
227
+ };
228
+ }
229
+ function ensureDefaultSocialMd(rootDir = process.cwd(), options = {}) {
230
+ const targetPath = (0, path_1.resolve)(rootDir, "social.md");
231
+ if ((0, fs_1.existsSync)(targetPath)) {
232
+ return { path: targetPath, created: false };
233
+ }
234
+ (0, fs_1.mkdirSync)(rootDir, { recursive: true });
235
+ (0, fs_1.writeFileSync)(targetPath, (0, socialConfig_1.generateDefaultSocialMdTemplate)(options), "utf8");
236
+ return { path: targetPath, created: true };
237
+ }
@@ -0,0 +1,2 @@
1
+ import { SocialRuntimeConfig } from "./socialConfig";
2
+ export declare function generateSocialMdTemplate(runtimeConfig: SocialRuntimeConfig | null | undefined): string;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateSocialMdTemplate = generateSocialMdTemplate;
4
+ function asBool(value, fallback) {
5
+ return typeof value === "boolean" ? value : fallback;
6
+ }
7
+ function asString(value, fallback) {
8
+ return typeof value === "string" ? value : fallback;
9
+ }
10
+ function asStringArray(value, fallback) {
11
+ if (!Array.isArray(value))
12
+ return fallback;
13
+ return value.map((item) => String(item).trim()).filter(Boolean);
14
+ }
15
+ function yamlString(input) {
16
+ return JSON.stringify(input ?? "");
17
+ }
18
+ function yamlStringList(values, indent = " ") {
19
+ if (!values.length) {
20
+ return `${indent}[]`;
21
+ }
22
+ return values.map((value) => `${indent}- ${yamlString(value)}`).join("\n");
23
+ }
24
+ function generateSocialMdTemplate(runtimeConfig) {
25
+ const enabled = asBool(runtimeConfig?.enabled, true);
26
+ const publicEnabled = asBool(runtimeConfig?.public_enabled, false);
27
+ const profile = runtimeConfig?.resolved_profile ?? null;
28
+ const network = runtimeConfig?.resolved_network ?? null;
29
+ const discovery = runtimeConfig?.resolved_discovery ?? null;
30
+ const visibility = runtimeConfig?.visibility ?? null;
31
+ const openclaw = runtimeConfig?.openclaw ?? null;
32
+ const displayName = asString(profile?.display_name, "");
33
+ const bio = asString(profile?.bio, "");
34
+ const tags = asStringArray(profile?.tags, ["openclaw", "local-first"]);
35
+ const mode = network?.mode === "local" || network?.mode === "lan" || network?.mode === "global-preview"
36
+ ? network.mode
37
+ : "global-preview";
38
+ const discoverable = asBool(discovery?.discoverable, true);
39
+ const allowProfileBroadcast = asBool(discovery?.allow_profile_broadcast, true);
40
+ const allowPresenceBroadcast = asBool(discovery?.allow_presence_broadcast, true);
41
+ const allowMessageBroadcast = asBool(discovery?.allow_message_broadcast, true);
42
+ const showDisplayName = asBool(visibility?.show_display_name, true);
43
+ const showBio = asBool(visibility?.show_bio, true);
44
+ const showTags = asBool(visibility?.show_tags, true);
45
+ const showAgentId = asBool(visibility?.show_agent_id, true);
46
+ const showLastSeen = asBool(visibility?.show_last_seen, true);
47
+ const showCapabilitiesSummary = asBool(visibility?.show_capabilities_summary, true);
48
+ const bindExistingIdentity = asBool(openclaw?.bind_existing_identity, true);
49
+ const useOpenClawProfile = asBool(openclaw?.use_openclaw_profile_if_available, true);
50
+ return `---
51
+ enabled: ${enabled}
52
+ public_enabled: ${publicEnabled}
53
+
54
+ identity:
55
+ display_name: ${yamlString(displayName)}
56
+ bio: ${yamlString(bio)}
57
+ tags:
58
+ ${yamlStringList(tags.map((tag) => asString(tag, "")), " ")}
59
+
60
+ network:
61
+ mode: ${yamlString(mode)}
62
+
63
+ discovery:
64
+ discoverable: ${discoverable}
65
+ allow_profile_broadcast: ${allowProfileBroadcast}
66
+ allow_presence_broadcast: ${allowPresenceBroadcast}
67
+ allow_message_broadcast: ${allowMessageBroadcast}
68
+
69
+ visibility:
70
+ show_display_name: ${showDisplayName}
71
+ show_bio: ${showBio}
72
+ show_tags: ${showTags}
73
+ show_agent_id: ${showAgentId}
74
+ show_last_seen: ${showLastSeen}
75
+ show_capabilities_summary: ${showCapabilitiesSummary}
76
+
77
+ openclaw:
78
+ bind_existing_identity: ${bindExistingIdentity}
79
+ use_openclaw_profile_if_available: ${useOpenClawProfile}
80
+ ---
81
+
82
+ # Social
83
+
84
+ Generated from current SilicaClaw runtime state.
85
+
86
+ - Save as \`social.md\` in your OpenClaw workspace.
87
+ - This export does not auto-overwrite any existing file.
88
+ - Advanced network fields are intentionally hidden in template and resolved in runtime.
89
+ `;
90
+ }
@@ -0,0 +1,59 @@
1
+ export type AgentIdentity = {
2
+ agent_id: string;
3
+ public_key: string;
4
+ private_key: string;
5
+ created_at: number;
6
+ };
7
+ export type PublicProfile = {
8
+ agent_id: string;
9
+ display_name: string;
10
+ bio: string;
11
+ tags: string[];
12
+ avatar_url?: string;
13
+ public_enabled: boolean;
14
+ updated_at: number;
15
+ signature: string;
16
+ };
17
+ export type SignedProfileRecord = {
18
+ type: "profile";
19
+ profile: PublicProfile;
20
+ };
21
+ export type PresenceRecord = {
22
+ type: "presence";
23
+ agent_id: string;
24
+ timestamp: number;
25
+ signature: string;
26
+ };
27
+ export type IndexRefRecord = {
28
+ type: "index";
29
+ key: string;
30
+ agent_id: string;
31
+ };
32
+ export type SocialMessageRecord = {
33
+ type: "social.message";
34
+ message_id: string;
35
+ agent_id: string;
36
+ public_key: string;
37
+ display_name: string;
38
+ topic: string;
39
+ body: string;
40
+ created_at: number;
41
+ signature: string;
42
+ };
43
+ export type SocialMessageObservationRecord = {
44
+ type: "social.message.observation";
45
+ observation_id: string;
46
+ message_id: string;
47
+ observed_agent_id: string;
48
+ observer_agent_id: string;
49
+ observer_public_key: string;
50
+ observer_display_name: string;
51
+ observed_at: number;
52
+ signature: string;
53
+ };
54
+ export type DirectoryState = {
55
+ profiles: Record<string, PublicProfile>;
56
+ presence: Record<string, number>;
57
+ index: Record<string, string[]>;
58
+ };
59
+ export type ProfileInput = Omit<PublicProfile, "signature" | "updated_at">;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,3 +1,5 @@
1
+ import defaults from "../../../config/silicaclaw-defaults.json";
2
+
1
3
  export type SocialIdentityConfig = {
2
4
  display_name: string;
3
5
  bio: string;
@@ -105,13 +107,13 @@ const DEFAULT_SOCIAL_CONFIG: SocialConfig = {
105
107
  tags: [],
106
108
  },
107
109
  network: {
108
- mode: "global-preview",
109
- namespace: "silicaclaw.preview",
110
+ mode: defaults.network.default_mode as SocialNetworkMode,
111
+ namespace: defaults.network.default_namespace,
110
112
  adapter: "relay-preview",
111
- port: 44123,
112
- signaling_url: "https://relay.silicaclaw.com",
113
+ port: defaults.ports.network_default,
114
+ signaling_url: defaults.network.global_preview.relay_url,
113
115
  signaling_urls: [],
114
- room: "silicaclaw-global-preview",
116
+ room: defaults.network.global_preview.room,
115
117
  seed_peers: [],
116
118
  bootstrap_hints: [],
117
119
  },
@@ -0,0 +1,19 @@
1
+ {
2
+ "ports": {
3
+ "local_console": 4310,
4
+ "public_explorer": 4311,
5
+ "openclaw_gateway": 18789,
6
+ "network_default": 44123
7
+ },
8
+ "network": {
9
+ "default_mode": "global-preview",
10
+ "default_namespace": "silicaclaw.preview",
11
+ "global_preview": {
12
+ "relay_url": "https://relay.silicaclaw.com",
13
+ "room": "silicaclaw-global-preview"
14
+ }
15
+ },
16
+ "bridge": {
17
+ "api_base": "http://localhost:4310"
18
+ }
19
+ }
@@ -0,0 +1,28 @@
1
+ export type NetworkMessageEnvelope<TPayload = unknown> = {
2
+ version: 1;
3
+ message_id: string;
4
+ topic: string;
5
+ source_peer_id: string;
6
+ timestamp: number;
7
+ payload: TPayload;
8
+ };
9
+ export type DecodedNetworkMessage = {
10
+ envelope: NetworkMessageEnvelope;
11
+ raw: Buffer;
12
+ };
13
+ export interface MessageEnvelopeCodec {
14
+ encode(envelope: NetworkMessageEnvelope): Buffer;
15
+ decode(raw: Buffer): DecodedNetworkMessage | null;
16
+ }
17
+ export type EnvelopeValidationOptions = {
18
+ now?: number;
19
+ max_future_drift_ms: number;
20
+ max_past_drift_ms: number;
21
+ };
22
+ export type EnvelopeValidationResult = {
23
+ ok: boolean;
24
+ reason?: "not_object" | "invalid_version" | "invalid_message_id" | "invalid_topic" | "invalid_source_peer_id" | "invalid_timestamp" | "missing_payload" | "timestamp_future_drift" | "timestamp_past_drift";
25
+ envelope?: NetworkMessageEnvelope;
26
+ drift_ms?: number;
27
+ };
28
+ export declare function validateNetworkMessageEnvelope(value: unknown, options: EnvelopeValidationOptions): EnvelopeValidationResult;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateNetworkMessageEnvelope = validateNetworkMessageEnvelope;
4
+ function validateNetworkMessageEnvelope(value, options) {
5
+ if (typeof value !== "object" || value === null) {
6
+ return { ok: false, reason: "not_object" };
7
+ }
8
+ const envelope = value;
9
+ if (envelope.version !== 1) {
10
+ return { ok: false, reason: "invalid_version" };
11
+ }
12
+ if (typeof envelope.message_id !== "string" || envelope.message_id.trim().length === 0) {
13
+ return { ok: false, reason: "invalid_message_id" };
14
+ }
15
+ if (typeof envelope.topic !== "string" || envelope.topic.trim().length === 0) {
16
+ return { ok: false, reason: "invalid_topic" };
17
+ }
18
+ if (typeof envelope.source_peer_id !== "string" || envelope.source_peer_id.trim().length === 0) {
19
+ return { ok: false, reason: "invalid_source_peer_id" };
20
+ }
21
+ if (!Number.isFinite(envelope.timestamp)) {
22
+ return { ok: false, reason: "invalid_timestamp" };
23
+ }
24
+ if (!("payload" in envelope)) {
25
+ return { ok: false, reason: "missing_payload" };
26
+ }
27
+ const now = options.now ?? Date.now();
28
+ const drift = Number(envelope.timestamp) - now;
29
+ if (drift > options.max_future_drift_ms) {
30
+ return { ok: false, reason: "timestamp_future_drift", drift_ms: drift };
31
+ }
32
+ if (drift < -options.max_past_drift_ms) {
33
+ return { ok: false, reason: "timestamp_past_drift", drift_ms: drift };
34
+ }
35
+ return { ok: true, envelope: envelope, drift_ms: drift };
36
+ }
@@ -0,0 +1,43 @@
1
+ import { NetworkMessageEnvelope } from "./messageEnvelope";
2
+ export type PeerStatus = "online" | "stale";
3
+ export type PeerSnapshot = {
4
+ peer_id: string;
5
+ first_seen_at: number;
6
+ last_seen_at: number;
7
+ status: PeerStatus;
8
+ stale_since_at?: number;
9
+ messages_seen: number;
10
+ meta?: Record<string, unknown>;
11
+ };
12
+ export type PeerDiscoveryContext = {
13
+ self_peer_id: string;
14
+ publishControl: (topic: string, payload: unknown) => Promise<void>;
15
+ };
16
+ export type PeerDiscoveryStats = {
17
+ observe_calls: number;
18
+ peers_added: number;
19
+ peers_removed: number;
20
+ peers_marked_stale: number;
21
+ heartbeat_sent: number;
22
+ heartbeat_send_errors: number;
23
+ reconcile_runs: number;
24
+ last_observed_at: number;
25
+ last_heartbeat_at: number;
26
+ last_reconcile_at: number;
27
+ last_error_at: number;
28
+ };
29
+ export type PeerDiscoveryConfigSnapshot = {
30
+ discovery: string;
31
+ heartbeat_topic?: string;
32
+ heartbeat_interval_ms?: number;
33
+ stale_after_ms?: number;
34
+ remove_after_ms?: number;
35
+ };
36
+ export interface PeerDiscovery {
37
+ start(context: PeerDiscoveryContext): Promise<void>;
38
+ stop(): Promise<void>;
39
+ observeEnvelope(envelope: NetworkMessageEnvelope): void;
40
+ listPeers(): PeerSnapshot[];
41
+ getStats?(): PeerDiscoveryStats;
42
+ getConfig?(): PeerDiscoveryConfigSnapshot;
43
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ export interface TopicCodec {
2
+ encode(topic: string, payload: unknown): unknown;
3
+ decode(topic: string, payload: unknown): unknown;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });