@masons/agent-network 0.5.14 → 0.5.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 (66) hide show
  1. package/dist/channel.d.ts +0 -7
  2. package/dist/channel.d.ts.map +1 -1
  3. package/dist/channel.js +3 -174
  4. package/dist/cli-setup.d.ts +0 -109
  5. package/dist/cli-setup.d.ts.map +1 -1
  6. package/dist/cli-setup.js +16 -570
  7. package/dist/config-fs.d.ts +4 -0
  8. package/dist/config-fs.d.ts.map +1 -0
  9. package/dist/config-fs.js +23 -0
  10. package/dist/config-schema.js +2 -2
  11. package/dist/config.d.ts +2 -210
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +14 -334
  14. package/dist/connector-client.d.ts +0 -32
  15. package/dist/connector-client.d.ts.map +1 -1
  16. package/dist/connector-client.js +1 -89
  17. package/dist/constants.d.ts +0 -1
  18. package/dist/constants.d.ts.map +1 -1
  19. package/dist/constants.js +2 -3
  20. package/dist/conversation-manager.d.ts +0 -106
  21. package/dist/conversation-manager.d.ts.map +1 -1
  22. package/dist/conversation-manager.js +2 -131
  23. package/dist/environment-context.d.ts +0 -24
  24. package/dist/environment-context.d.ts.map +1 -1
  25. package/dist/environment-context.js +0 -42
  26. package/dist/handle-utils.d.ts +0 -14
  27. package/dist/handle-utils.d.ts.map +1 -1
  28. package/dist/handle-utils.js +0 -14
  29. package/dist/index.js +0 -9
  30. package/dist/owner-notes.d.ts +0 -33
  31. package/dist/owner-notes.d.ts.map +1 -1
  32. package/dist/owner-notes.js +2 -41
  33. package/dist/owner-session-state.d.ts +0 -26
  34. package/dist/owner-session-state.d.ts.map +1 -1
  35. package/dist/owner-session-state.js +0 -37
  36. package/dist/platform-client.d.ts +13 -202
  37. package/dist/platform-client.d.ts.map +1 -1
  38. package/dist/platform-client.js +22 -171
  39. package/dist/plugin.d.ts +5 -0
  40. package/dist/plugin.d.ts.map +1 -1
  41. package/dist/plugin.js +3 -167
  42. package/dist/sent-message-buffer.d.ts +0 -36
  43. package/dist/sent-message-buffer.d.ts.map +1 -1
  44. package/dist/sent-message-buffer.js +1 -45
  45. package/dist/tools.d.ts +0 -28
  46. package/dist/tools.d.ts.map +1 -1
  47. package/dist/tools.js +36 -240
  48. package/dist/turn-context.d.ts +0 -45
  49. package/dist/turn-context.d.ts.map +1 -1
  50. package/dist/turn-context.js +0 -57
  51. package/dist/types.d.ts +0 -67
  52. package/dist/types.d.ts.map +1 -1
  53. package/dist/types.js +0 -7
  54. package/dist/update-cache.d.ts +0 -17
  55. package/dist/update-cache.d.ts.map +1 -1
  56. package/dist/update-cache.js +1 -21
  57. package/dist/update-check.d.ts +1 -40
  58. package/dist/update-check.d.ts.map +1 -1
  59. package/dist/update-check.js +7 -66
  60. package/dist/version.d.ts +1 -2
  61. package/dist/version.d.ts.map +1 -1
  62. package/dist/version.js +1 -2
  63. package/openclaw.plugin.json +94 -3
  64. package/package.json +11 -10
  65. package/skills/agent-network/SKILL.md +21 -47
  66. package/skills/agent-network/references/troubleshooting.md +5 -5
@@ -0,0 +1,4 @@
1
+ export declare function getOpenClawHome(): string;
2
+ export declare function readConfig(): Promise<Record<string, unknown>>;
3
+ export declare function persistConfig(config: Record<string, unknown>): Promise<void>;
4
+ //# sourceMappingURL=config-fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-fs.d.ts","sourceRoot":"","sources":["../src/config-fs.ts"],"names":[],"mappings":"AAKA,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAMD,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAOnE;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -0,0 +1,23 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ export function getOpenClawHome() {
5
+ return process.env.OPENCLAW_HOME || join(homedir(), ".openclaw");
6
+ }
7
+ function getConfigPath() {
8
+ return join(getOpenClawHome(), "openclaw.json");
9
+ }
10
+ export async function readConfig() {
11
+ try {
12
+ const raw = await readFile(getConfigPath(), "utf-8");
13
+ return JSON.parse(raw);
14
+ }
15
+ catch {
16
+ return {};
17
+ }
18
+ }
19
+ export async function persistConfig(config) {
20
+ const configPath = getConfigPath();
21
+ await mkdir(dirname(configPath), { recursive: true });
22
+ await writeFile(configPath, JSON.stringify(config, null, 2), "utf-8");
23
+ }
@@ -1,9 +1,9 @@
1
1
  import { Type } from "@sinclair/typebox";
2
2
  export const AgentNetworkAccountSchema = Type.Object({
3
3
  connectorUrl: Type.String({
4
- description: "WebSocket URL of the Connector Plugin endpoint",
4
+ description: "WebSocket URL of the Connector Gateway endpoint",
5
5
  }),
6
6
  token: Type.String({
7
- description: "Authentication token (API key)",
7
+ description: "Runtime authentication token",
8
8
  }),
9
9
  });
package/dist/config.d.ts CHANGED
@@ -1,251 +1,43 @@
1
- /**
2
- * Config & runtime bridge — mediates shared state between channel.ts and tools.ts.
3
- *
4
- * Read/write separation architecture:
5
- * - **Reads**: `initToolConfig(ctx.cfg)` injects Host-provided config into
6
- * module-level variables. Tools read from these vars via guard functions.
7
- * - **Writes**: 3 fs functions write to `openclaw.json`, signaling the Host
8
- * (Gateway monitors file changes for hot-reload / restart).
9
- * - **Runtime**: `initConnectorClient(client)` injects the live WebSocket
10
- * client after connection is established. Conversation tools read it via
11
- * `requireConnectorClient()`.
12
- *
13
- * `ctx.cfg` is the Host's authoritative value for this process lifecycle.
14
- * Plugin does not re-parse the config file for reads.
15
- *
16
- */
17
1
  import type { ConnectorClient } from "./connector-client.js";
18
2
  import type { ConversationManager } from "./conversation-manager.js";
19
3
  import { type PlatformClientConfig } from "./platform-client.js";
20
- /**
21
- * Current state cache generation. Incremented by config-modifying functions.
22
- * Used by before_prompt_build to detect when cached state needs a refresh.
23
- */
4
+ export { getOpenClawHome } from "./config-fs.js";
24
5
  export declare function getStateCacheGeneration(): number;
25
- /**
26
- * Extract the `channels.agent-network` section from the full OpenClaw config.
27
- *
28
- * OpenClaw Gateway passes the ENTIRE config (all of openclaw.json) to
29
- * channel adapter methods and startAccount(). This helper navigates to
30
- * the agent-network-specific section.
31
- *
32
- */
33
6
  export declare function extractNetworkConfig(cfg: Record<string, unknown>): Record<string, unknown> | null;
34
- /**
35
- * Inject Host-provided config into module-level variables.
36
- *
37
- * Called by `startAccount()` each time Gateway starts or hot-reloads.
38
- * Ensures tools always read the Host's current config values.
39
- */
40
7
  export declare function initToolConfig(cfg: Record<string, unknown>): void;
41
- /**
42
- * Whether `session.identityLinks` contains at least one entry with the
43
- * `agent-network:` channel prefix — indicating the owner's agent-network
44
- * identity is linked to another channel.
45
- */
46
8
  export declare function isIdentityLinksConfigured(): boolean;
47
- /**
48
- * Current dmScope mode from Gateway config (`cfg.session.dmScope`).
49
- *
50
- * Determines how the plugin handles cross-channel identity:
51
- * - "main" (default): all DMs share one session. Identity linking has no effect.
52
- * - "per-peer": identity linking merges sessions across channels.
53
- * - "per-channel-peer" / "per-account-channel-peer": identity linking normalizes
54
- * peerId but sessions stay separate per channel.
55
- */
56
9
  export declare function getDmScope(): string;
57
- /**
58
- * Inject the live ConnectorClient after WebSocket connection is established.
59
- *
60
- * Called by `startAccount()` AFTER `client.connect()` resolves — ensures
61
- * tools never receive a client with a null WebSocket.
62
- *
63
- * Phase 1 supports a single account. The double-init guard makes this
64
- * assumption explicit: a second call without `clearConnectorClient()` throws.
65
- */
66
10
  export declare function initConnectorClient(client: ConnectorClient): void;
67
- /**
68
- * Clear the stored ConnectorClient reference.
69
- *
70
- * Called by `stopAccount()` and at `startAccount()` entry (defensive).
71
- * NOT called by the abort handler — see #935.
72
- */
73
11
  export declare function clearConnectorClient(): void;
74
- /**
75
- * Inject the live ConversationManager after WebSocket connection is established.
76
- *
77
- * Called by `startAccount()` AFTER `client.connect()` resolves — ensures
78
- * tools always get a manager backed by a connected client.
79
- */
80
12
  export declare function initConversationManager(manager: ConversationManager): void;
81
- /**
82
- * Clear the stored ConversationManager reference.
83
- *
84
- * Called by `stopAccount()` and at `startAccount()` entry (defensive).
85
- * NOT called by the abort handler — in-flight tools need the stale CM
86
- * to graceful-fail via disconnected WebSocket instead of throwing (#935).
87
- */
88
13
  export declare function clearConversationManager(): void;
89
- /**
90
- * Get the live ConversationManager. Throws if not initialized.
91
- */
92
14
  export declare function requireConversationManager(): ConversationManager;
93
- /**
94
- * Get the live ConversationManager, or null if not yet initialized.
95
- *
96
- * Non-throwing variant for use in before_prompt_build where the connection
97
- * may not be established yet (e.g., during setup flow). Callers must handle
98
- * the null case gracefully.
99
- */
100
15
  export declare function getConversationManager(): ConversationManager | null;
101
- /**
102
- * Store the OpenClaw PluginRuntime for inbound message dispatch.
103
- *
104
- * Called by `register(api)` in plugin.ts — captures `api.runtime` which
105
- * provides `runtime.channel.*` (routing, reply, session) used by the
106
- * 4-step inbound dispatch flow in channel.ts.
107
- *
108
- * Idempotent: overwrites on re-call. Gateway may hot-reload plugins,
109
- * calling `register()` again without a teardown counterpart.
110
- */
111
16
  export declare function initPluginRuntime(runtime: unknown): void;
112
- /**
113
- * Clear the stored PluginRuntime reference.
114
- */
115
17
  export declare function clearPluginRuntime(): void;
116
- /**
117
- * Get the stored PluginRuntime. Throws if not initialized.
118
- *
119
- * Callers cast the result to `PluginRuntime` (defined in channel.ts)
120
- * at the usage site. Typed as `unknown` here to avoid circular imports.
121
- */
122
18
  export declare function requirePluginRuntime(): unknown;
123
- /**
124
- * Get platform config. Always returns a valid config — defaults are set
125
- * at module load time, and overwritten by `initToolConfig()` when
126
- * `startAccount()` runs.
127
- *
128
- * This ensures setup tools work on first install (before credentials
129
- * exist and before `startAccount()` has run).
130
- */
131
19
  export declare function requirePlatformConfig(): PlatformClientConfig;
132
- /**
133
- * Get stored API key. Throws if no credentials are configured.
134
- */
135
20
  export declare function requireApiKey(): string;
136
- /**
137
- * Get pending connection target handle, or null if none.
138
- */
139
21
  export declare function getPendingTarget(): string | null;
140
- /**
141
- * Whether the agent needs profile completion before connecting.
142
- *
143
- * True after onboard (new agent creation), cleared after all required
144
- * profile fields are filled. Used by connection tools to gate requests
145
- * until the agent has a visible identity.
146
- */
147
22
  export declare function isProfileNeeded(): boolean;
148
- /**
149
- * Get the live ConnectorClient. Throws if not initialized.
150
- *
151
- * Note: The returned client may be in a reconnecting state (WebSocket
152
- * temporarily null after a drop). Callers must handle `false` returns
153
- * from send methods (`sendMessage`, `createSession`, `endSession`).
154
- */
155
23
  export declare function requireConnectorClient(): ConnectorClient;
156
- /** Resolve the OpenClaw home directory (`$OPENCLAW_HOME` or `~/.openclaw`). */
157
- export declare function getOpenClawHome(): string;
158
24
  export interface NetworkCredentials {
159
25
  connectorUrl: string;
160
26
  token: string;
161
27
  }
162
- /**
163
- * Write credentials + apiHost (+ optional idpBaseUrl) to `openclaw.json`.
164
- *
165
- * Atomic: all fields are written in a single persistConfig() call to avoid
166
- * partial-write race conditions.
167
- *
168
- * `idpBaseUrl` is written only when provided, mirroring `apiHost`'s pattern —
169
- * omitted values leave any existing field in place (useful when callers want
170
- * to refresh credentials without overriding IdP URL).
171
- */
28
+ export declare function readExistingConnectorUrl(): Promise<string | undefined>;
172
29
  export declare function writeCredentials(creds: NetworkCredentials, apiHost?: string, idpBaseUrl?: string): Promise<void>;
173
- /**
174
- * Write pending connection target handle.
175
- *
176
- * Used in the invitation flow: when an agent visits another agent's page
177
- * and installs the plugin, the target handle is persisted here before
178
- * restart. After restart, Layer B (`detectPendingState`) reads it back
179
- * and injects continuity context so the agent knows who to connect to.
180
- */
181
30
  export declare function writeTargetHandle(handle: string): Promise<void>;
182
- /**
183
- * Clear pending connection target from config file AND module-level variable.
184
- *
185
- * This is a deliberate exception to the read/write separation pattern:
186
- * we also update `storedPendingTarget` in memory to avoid stale reads
187
- * within the same session (since `initToolConfig()` only runs at startup).
188
- */
189
31
  export declare function clearTargetHandle(): Promise<void>;
190
- /**
191
- * Mark that this agent needs profile completion.
192
- *
193
- * Called after onboard (new agent creation) — the agent has an empty profile.
194
- * The before_prompt_build hook reads this to inject profile generation context.
195
- */
196
32
  export declare function markProfileNeeded(): Promise<void>;
197
- /**
198
- * Mark that profile completion is done.
199
- *
200
- * Called after successful masons_update_profile — clears the needsProfile flag
201
- * so the before_prompt_build hook no longer injects profile context.
202
- * Also updates the in-memory `storedNeedsProfile` flag so tool-level gates
203
- * (connection request / accept) take effect immediately without a restart.
204
- */
205
33
  export declare function markProfileComplete(): Promise<void>;
206
- /**
207
- * Write cross-channel identity links to `config.session.identityLinks`.
208
- *
209
- * **Entry-level additive merge** (2026-03-26, #986 redesign):
210
- * New entries are merged INTO the existing canonical group, deduped,
211
- * lowercase-normalized. Never overwrites other canonical groups, and
212
- * never removes existing entries within the same group.
213
- *
214
- * This allows one-channel-at-a-time linking: first call adds Telegram,
215
- * second call adds Feishu — without losing the Telegram entry.
216
- *
217
- * This writes to `session.*` (Gateway-level), not `channels.agent-network.*`.
218
- * Justified because cross-channel identity is inherently a Gateway concern,
219
- * and the Gateway provides the full config to plugins via `ctx.cfg`.
220
- *
221
- * Follows the same readConfig → merge → persistConfig pattern as
222
- * writeCredentials() and writeTargetHandle().
223
- */
224
34
  export declare function writeIdentityLinks(canonical: string, entries: string[]): Promise<void>;
225
- /**
226
- * Remove a canonical identity group from `config.session.identityLinks`.
227
- *
228
- * Undo path for `writeIdentityLinks()`. Removes only the specified
229
- * canonical key; other groups are preserved.
230
- */
231
35
  export declare function removeIdentityLinks(canonical: string): Promise<void>;
232
- /** Pending state detected from config file — used for restart continuity. */
233
36
  export interface PendingState {
234
- /** Whether valid credentials exist (connectorUrl + token) */
235
37
  hasCredentials: boolean;
236
- /** Pending connection target handle, or null if none */
237
38
  pendingTarget: string | null;
238
- /** Whether the agent needs profile completion (new agent, empty profile) */
239
39
  needsProfile: boolean;
240
40
  }
241
- /**
242
- * Detect pending state by reading config file directly.
243
- *
244
- * Unlike `initToolConfig()` which is called by `startAccount()`, this reads
245
- * from disk — available even when the channel hasn't started (no credentials).
246
- * Used by Layer B (before_prompt_build hook) for per-turn context injection.
247
- */
248
41
  export declare function detectPendingState(): Promise<PendingState>;
249
- /** @internal Reset module state for test isolation. */
250
42
  export declare function _resetForTesting(): void;
251
43
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAoCjD,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAsBD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAMhC;AAYD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAyCjE;AAuCD,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAWD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAeD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAOjE;AAQD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAYD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAE1E;AASD,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAKD,wBAAgB,0BAA0B,IAAI,mBAAmB,CAOhE;AASD,wBAAgB,sBAAsB,IAAI,mBAAmB,GAAG,IAAI,CAEnE;AAgBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAExD;AAKD,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAQD,wBAAgB,oBAAoB,IAAI,OAAO,CAO9C;AAcD,wBAAgB,qBAAqB,IAAI,oBAAoB,CAE5D;AAKD,wBAAgB,aAAa,IAAI,MAAM,CAKtC;AAKD,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEhD;AASD,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AASD,wBAAgB,sBAAsB,IAAI,eAAe,CAOxD;AAyBD,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAQD,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW5E;AAYD,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAkCf;AAUD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMrE;AASD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CASvD;AAYD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOvD;AAUD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOzD;AAwCD,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAQD,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B1E;AAOD,MAAM,WAAW,YAAY;IAE3B,cAAc,EAAE,OAAO,CAAC;IAExB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,YAAY,EAAE,OAAO,CAAC;CACvB;AASD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC,CA2BhE;AAOD,wBAAgB,gBAAgB,IAAI,IAAI,CAWvC"}