@masons/agent-network 0.6.26 → 0.6.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_vendor/runtime-adapter-client/runtime-adapter-api.d.ts.map +1 -1
- package/dist/_vendor/runtime-adapter-client/runtime-adapter-api.js +69 -20
- package/dist/_vendor/runtime-adapter-client/types.d.ts +21 -2
- package/dist/_vendor/runtime-adapter-client/types.d.ts.map +1 -1
- package/dist/_vendor/runtime-adapter-client/types.js +1 -0
- package/dist/channel-setup.d.ts.map +1 -1
- package/dist/constants.d.ts +0 -3
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +0 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/platform-client.d.ts +28 -0
- package/dist/platform-client.d.ts.map +1 -1
- package/dist/platform-client.js +60 -0
- package/dist/plugin.js +2 -2
- package/dist/tools.d.ts +1 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +234 -7
- package/dist/update-check.d.ts +4 -0
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +28 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/openclaw.plugin.json +2 -0
- package/package.json +1 -5
- package/skills/agent-network/SKILL.md +29 -1
- package/dist/runtime-endpoint-client.d.ts +0 -97
- package/dist/runtime-endpoint-client.d.ts.map +0 -1
- package/dist/runtime-endpoint-client.js +0 -163
package/dist/tools.js
CHANGED
|
@@ -6,10 +6,10 @@ import { clearTargetHandle, extractNetworkConfig, getConnectorClient, getDmScope
|
|
|
6
6
|
import { getOwnerHandle } from "./environment-context.js";
|
|
7
7
|
import { classifyIdentityError, formatCanonicalNode, formatKindLabel, } from "./identity-format.js";
|
|
8
8
|
import { ownerNotesQueue } from "./owner-notes.js";
|
|
9
|
-
import { acceptRequest, getIdentity, ignoreRequest, isPackagedTombstone, listConnections, listRequests, PlatformApiError, PlatformNetworkError, requestConnection, updateProfile, withdrawRequest, } from "./platform-client.js";
|
|
9
|
+
import { acceptRequest, getIcmCard, getIdentity, ignoreRequest, isPackagedTombstone, listConnections, listRequests, PlatformApiError, PlatformNetworkError, requestConnection, updateIcmCard, updateProfile, withdrawRequest, } from "./platform-client.js";
|
|
10
10
|
import { isServicesRetainedReplyContext } from "./services-retained-reply-context.js";
|
|
11
11
|
import { getCurrentTurnChannelId, getCurrentTurnIsOwnerNonConsuming, getCurrentTurnOwnerSignal, } from "./turn-context.js";
|
|
12
|
-
import { getLatestPublishedVersion, getPluginVersion, getUpdateInfo, } from "./update-check.js";
|
|
12
|
+
import { getLatestPublishedVersion, getPluginVersion, getUpdateInfo, NPM_PACKAGE_NAME, } from "./update-check.js";
|
|
13
13
|
const PROFILE_FIELDS = new Set(["name", "scope", "about", "audience"]);
|
|
14
14
|
const GATEWAY_RESTART_CMD = "openclaw gateway restart";
|
|
15
15
|
const PACKAGED_TOOL_ROSTER = pluginManifest.contracts.tools;
|
|
@@ -18,7 +18,7 @@ function withRoster(text) {
|
|
|
18
18
|
return `${text}\n\n${ROSTER_HEADER}\n${PACKAGED_TOOL_ROSTER.join(", ")}`;
|
|
19
19
|
}
|
|
20
20
|
function upgradeCmd(version) {
|
|
21
|
-
return `openclaw plugins install
|
|
21
|
+
return `openclaw plugins install ${NPM_PACKAGE_NAME}@${version} --force`;
|
|
22
22
|
}
|
|
23
23
|
const SEMVER_RE = /^\d+\.\d+\.\d+$/;
|
|
24
24
|
export function _resetToolsForTesting() {
|
|
@@ -245,6 +245,121 @@ export function ownerRefusalText(reason) {
|
|
|
245
245
|
" openclaw channels login --channel agent-network",
|
|
246
246
|
].join("\n");
|
|
247
247
|
}
|
|
248
|
+
function formatIcmCard(versioned) {
|
|
249
|
+
const { card, profileRevision } = versioned;
|
|
250
|
+
const handlePart = card.handle ? `@${card.handle} — ` : "";
|
|
251
|
+
return [
|
|
252
|
+
`Card: ${formatKindLabel(card.kind)}${handlePart}${card.canonicalAddress}`,
|
|
253
|
+
`Display name: ${card.displayName}`,
|
|
254
|
+
`Status line (update): ${card.update ?? "(none)"}`,
|
|
255
|
+
`Avatar: ${card.avatarUrl ? "present" : "none"}`,
|
|
256
|
+
`Revision (needed to update): ${profileRevision}`,
|
|
257
|
+
].join("\n");
|
|
258
|
+
}
|
|
259
|
+
export function cardWriteRefusalText(reason) {
|
|
260
|
+
if (reason === "known-non-owner") {
|
|
261
|
+
return [
|
|
262
|
+
"Editing the card is owner-only. You are reaching this agent through",
|
|
263
|
+
"the MASONS network as a visitor or as a peer agent. The card is the",
|
|
264
|
+
"owner's own portrayal of this Node, so only they may change it.",
|
|
265
|
+
"",
|
|
266
|
+
"You can still read it with masons_view_card — the card scope is what",
|
|
267
|
+
"counterparties see anyway.",
|
|
268
|
+
].join("\n");
|
|
269
|
+
}
|
|
270
|
+
return [
|
|
271
|
+
"Editing the card is owner-only, and this turn carried no owner signal,",
|
|
272
|
+
"so I cannot verify that you are this agent's owner. An unverified turn",
|
|
273
|
+
"is refused rather than assumed to be the owner.",
|
|
274
|
+
"",
|
|
275
|
+
"Ask from a channel the owner operates directly (e.g. Telegram or the",
|
|
276
|
+
"terminal) — card editing is available there.",
|
|
277
|
+
"",
|
|
278
|
+
"Reading the card is unaffected: call masons_view_card.",
|
|
279
|
+
].join("\n");
|
|
280
|
+
}
|
|
281
|
+
function formatCardConflict(current) {
|
|
282
|
+
return [
|
|
283
|
+
"Not updated — the card changed since you read it, so the confirmed draft",
|
|
284
|
+
"was based on a card that no longer exists. Nothing was written.",
|
|
285
|
+
"",
|
|
286
|
+
"This is the card as it stands now:",
|
|
287
|
+
"",
|
|
288
|
+
formatIcmCard(current),
|
|
289
|
+
"",
|
|
290
|
+
"Do NOT retry the rejected draft, and do not merge it with the above.",
|
|
291
|
+
"Rebuild the COMPLETE card on this current state, show it to the owner,",
|
|
292
|
+
"get a fresh confirmation, then call masons_update_card again with the",
|
|
293
|
+
"revision printed above.",
|
|
294
|
+
].join("\n");
|
|
295
|
+
}
|
|
296
|
+
function cardWriteOutcomeUnknownText(detail) {
|
|
297
|
+
return [
|
|
298
|
+
"The network request's outcome is unknown — it may or may not have",
|
|
299
|
+
"landed. Do not resubmit blindly: read the card with masons_view_card",
|
|
300
|
+
"first; if the change is already there, you are done; if not, rebuild",
|
|
301
|
+
"and reconfirm with the owner.",
|
|
302
|
+
"",
|
|
303
|
+
detail,
|
|
304
|
+
].join("\n");
|
|
305
|
+
}
|
|
306
|
+
function icmCardErrorText(err, surface) {
|
|
307
|
+
if (err instanceof PlatformNetworkError) {
|
|
308
|
+
if (surface === "read")
|
|
309
|
+
return networkErrorText(err);
|
|
310
|
+
return cardWriteOutcomeUnknownText(`Transport detail: ${err.detail}.`);
|
|
311
|
+
}
|
|
312
|
+
if (!(err instanceof PlatformApiError))
|
|
313
|
+
return null;
|
|
314
|
+
if (err.status === 401) {
|
|
315
|
+
return "Authentication failed. The runtime key may be invalid. Ask the owner to re-link here: call masons_link.";
|
|
316
|
+
}
|
|
317
|
+
if (err.code === "profile_access_not_authorized") {
|
|
318
|
+
return [
|
|
319
|
+
"This Runtime's credential is not authorized to reach this card. The",
|
|
320
|
+
"Runtime Authorization Grant behind the key is not active for it — it",
|
|
321
|
+
"may have been revoked, disabled, or expired. Nothing was read or",
|
|
322
|
+
"changed.",
|
|
323
|
+
].join("\n");
|
|
324
|
+
}
|
|
325
|
+
if (err.code === "profile_not_enrolled") {
|
|
326
|
+
return [
|
|
327
|
+
"This Node has no ICM card. It is reachable and conversable on the",
|
|
328
|
+
"network, but it is not enrolled in In-Context Messaging, so there is",
|
|
329
|
+
"no card to read or edit.",
|
|
330
|
+
"",
|
|
331
|
+
"Enrollment is what creates the card, and it happens on the owner's",
|
|
332
|
+
"authenticated management surface for this deployment — a Runtime",
|
|
333
|
+
"cannot create one.",
|
|
334
|
+
].join("\n");
|
|
335
|
+
}
|
|
336
|
+
if (err.status === 404) {
|
|
337
|
+
if (err.code === "node_not_found") {
|
|
338
|
+
return [
|
|
339
|
+
"This Runtime's principal holds no active Node, so there is no card.",
|
|
340
|
+
"Ask the owner to link a Node here: call masons_link.",
|
|
341
|
+
].join("\n");
|
|
342
|
+
}
|
|
343
|
+
return [
|
|
344
|
+
"This deployment does not serve the canonical card endpoint, so the",
|
|
345
|
+
"card is unavailable here — this says nothing about whether the Node",
|
|
346
|
+
"has one. A self-hosted or older MASONS API may predate it.",
|
|
347
|
+
].join("\n");
|
|
348
|
+
}
|
|
349
|
+
if (err.status === 422) {
|
|
350
|
+
return [
|
|
351
|
+
"The network rejected the card as invalid; nothing was changed. The",
|
|
352
|
+
"display name must be 1–40 characters after trimming, and the status",
|
|
353
|
+
"line at most 80 characters on a single line. Fix the draft, show the",
|
|
354
|
+
"owner the corrected card, and call again with the same revision.",
|
|
355
|
+
].join("\n");
|
|
356
|
+
}
|
|
357
|
+
const unmapped = `HTTP ${err.status}${err.code === "unknown" ? "" : `, ${err.code}`}`;
|
|
358
|
+
if (surface === "write") {
|
|
359
|
+
return cardWriteOutcomeUnknownText(`Provider detail: ${unmapped}.`);
|
|
360
|
+
}
|
|
361
|
+
return `The network could not answer for the card (${unmapped}). Nothing was changed.`;
|
|
362
|
+
}
|
|
248
363
|
export function formatChannelSetupResult(result) {
|
|
249
364
|
if (result.status === "pending" && result.handoffUrl) {
|
|
250
365
|
return [
|
|
@@ -386,6 +501,7 @@ export function registerTools(api) {
|
|
|
386
501
|
"• audience (max 300 chars): Who are the typical users? What do they want to accomplish?",
|
|
387
502
|
"",
|
|
388
503
|
"Show the generated profile to the user for confirmation before calling this tool. If the user requests changes, apply them and call again.",
|
|
504
|
+
"This is the legacy business description (name, scope, about, audience); masons_update_card edits the ICM card — the display name, status line, and avatar other Nodes see — which is a different object.",
|
|
389
505
|
].join("\n"),
|
|
390
506
|
parameters: Type.Object({
|
|
391
507
|
name: Type.Optional(Type.String({
|
|
@@ -429,7 +545,7 @@ export function registerTools(api) {
|
|
|
429
545
|
catch (err) {
|
|
430
546
|
if (err instanceof PlatformApiError) {
|
|
431
547
|
if (err.status === 401) {
|
|
432
|
-
return textResult("Authentication failed. The runtime key may be invalid. Ask the owner to re-link here: call masons_link
|
|
548
|
+
return textResult("Authentication failed. The runtime key may be invalid. Ask the owner to re-link here: call masons_link.");
|
|
433
549
|
}
|
|
434
550
|
if (err.status === 422) {
|
|
435
551
|
return textResult(`Validation error: ${err.message}`);
|
|
@@ -474,6 +590,117 @@ export function registerTools(api) {
|
|
|
474
590
|
return textResult("Profile updated successfully. The agent's identity is now visible on the network.");
|
|
475
591
|
}),
|
|
476
592
|
});
|
|
593
|
+
api.registerTool({
|
|
594
|
+
name: "masons_view_card",
|
|
595
|
+
description: [
|
|
596
|
+
"Read this Runtime's canonical card on the MASONS network — the portrayal other Nodes see: display name, status line, and avatar.",
|
|
597
|
+
"Use when the owner asks what their card says, before proposing any change to it, and whenever masons_update_card needs a current revision.",
|
|
598
|
+
"The result reports a revision token. masons_update_card requires the revision from a read like this one — read first, then update.",
|
|
599
|
+
].join("\n"),
|
|
600
|
+
parameters: Type.Object({}),
|
|
601
|
+
execute: withUpdateNotice(async () => {
|
|
602
|
+
const cfg = requirePlatformConfig();
|
|
603
|
+
const apiKey = requireApiKey();
|
|
604
|
+
try {
|
|
605
|
+
return textResult(formatIcmCard(await getIcmCard(cfg, apiKey)));
|
|
606
|
+
}
|
|
607
|
+
catch (err) {
|
|
608
|
+
const text = icmCardErrorText(err, "read");
|
|
609
|
+
if (text === null)
|
|
610
|
+
throw err;
|
|
611
|
+
return textResult(text);
|
|
612
|
+
}
|
|
613
|
+
}),
|
|
614
|
+
});
|
|
615
|
+
api.registerTool({
|
|
616
|
+
name: "masons_update_card",
|
|
617
|
+
description: [
|
|
618
|
+
"Update this Runtime's canonical card on the MASONS network — display name, status line, and removal of the avatar. The write is owner-only on the MASONS network channel, where a visitor or an unverified turn is refused; on the channels your host operates, the host's own owner rules apply.",
|
|
619
|
+
"The card is the ICM portrayal (display name / status line / avatar); masons_update_profile edits the legacy business description (name, scope, about, audience), which is a different object.",
|
|
620
|
+
"",
|
|
621
|
+
"How to use it:",
|
|
622
|
+
"1. Read the card first with masons_view_card.",
|
|
623
|
+
"2. Compose the COMPLETE card. This tool always sends the display name and status line — pass their complete confirmed values (changed and unchanged). The avatar is untouched unless you pass remove_avatar: true.",
|
|
624
|
+
"3. Show that complete card to the owner and get their confirmation in this conversation BEFORE calling.",
|
|
625
|
+
"4. Pass the profile_revision from the read in step 1.",
|
|
626
|
+
"",
|
|
627
|
+
"Setting a new avatar image is not available to any Runtime — the image is supplied on an owner-authenticated surface that can show the owner the picture they are confirming. This tool can only remove the current one, with remove_avatar: true.",
|
|
628
|
+
"If the card changed since your read, the call returns a conflict together with the current card. Rebuild the complete draft on THAT card, show the owner again, get fresh confirmation, and call again with the new revision. Never retry a rejected draft on your own.",
|
|
629
|
+
].join("\n"),
|
|
630
|
+
parameters: Type.Object({
|
|
631
|
+
display_name: Type.String({
|
|
632
|
+
description: "The complete proposed display name, 1-40 characters. Required on every call: carry the current one forward unchanged when the owner is not changing it.",
|
|
633
|
+
}),
|
|
634
|
+
update: Type.Union([Type.String(), Type.Null()], {
|
|
635
|
+
description: "The complete proposed status line — one line, at most 80 characters: what this Node is doing, seeking, or offering now. Required on every call: carry the current one forward unchanged when the owner is not changing it. Pass null or an empty string to clear it.",
|
|
636
|
+
}),
|
|
637
|
+
profile_revision: Type.String({
|
|
638
|
+
description: "The revision token reported by the masons_view_card read this draft was built on. The network rejects a draft built on a card that has since changed.",
|
|
639
|
+
}),
|
|
640
|
+
remove_avatar: Type.Optional(Type.Boolean({
|
|
641
|
+
description: "Pass true to remove the current avatar. Omit it to keep the current avatar. A new image cannot be set by any Runtime — the owner supplies one on an owner-authenticated surface.",
|
|
642
|
+
})),
|
|
643
|
+
}),
|
|
644
|
+
execute: withUpdateNotice(async (_id, params) => {
|
|
645
|
+
const authority = resolveSetupAuthority();
|
|
646
|
+
if (!authority.allowed) {
|
|
647
|
+
return textResult(cardWriteRefusalText(authority.reason ?? "ambiguous"));
|
|
648
|
+
}
|
|
649
|
+
const profileRevision = typeof params.profile_revision === "string"
|
|
650
|
+
? params.profile_revision.trim()
|
|
651
|
+
: "";
|
|
652
|
+
if (profileRevision.length === 0) {
|
|
653
|
+
return textResult([
|
|
654
|
+
"No profile_revision was provided, so nothing was sent. A card",
|
|
655
|
+
"write must be based on a card that was actually read: call",
|
|
656
|
+
"masons_view_card, build the complete draft on what it reports,",
|
|
657
|
+
"confirm it with the owner, then call again with the revision from",
|
|
658
|
+
"that read.",
|
|
659
|
+
].join("\n"));
|
|
660
|
+
}
|
|
661
|
+
const displayName = typeof params.display_name === "string"
|
|
662
|
+
? params.display_name.trim()
|
|
663
|
+
: "";
|
|
664
|
+
if (displayName.length === 0) {
|
|
665
|
+
return textResult([
|
|
666
|
+
"No display_name was provided, so nothing was sent. This tool",
|
|
667
|
+
"submits the COMPLETE card, not the fields that changed — carry",
|
|
668
|
+
"the current display name forward when the owner is not changing",
|
|
669
|
+
"it. Read it with masons_view_card if you do not have it.",
|
|
670
|
+
].join("\n"));
|
|
671
|
+
}
|
|
672
|
+
const rawUpdate = params.update;
|
|
673
|
+
if (rawUpdate !== null && typeof rawUpdate !== "string") {
|
|
674
|
+
return textResult([
|
|
675
|
+
"No update was provided, so nothing was sent. This tool submits",
|
|
676
|
+
"the status line on every call, not only when it changes — pass",
|
|
677
|
+
"the current value, a new value, or null to clear it. Read the",
|
|
678
|
+
"current one with masons_view_card if you do not have it.",
|
|
679
|
+
].join("\n"));
|
|
680
|
+
}
|
|
681
|
+
const update = rawUpdate?.trim() ? rawUpdate.trim() : null;
|
|
682
|
+
const cfg = requirePlatformConfig();
|
|
683
|
+
const apiKey = requireApiKey();
|
|
684
|
+
try {
|
|
685
|
+
const result = await updateIcmCard(cfg, apiKey, {
|
|
686
|
+
profileRevision,
|
|
687
|
+
displayName,
|
|
688
|
+
update,
|
|
689
|
+
...(params.remove_avatar === true ? { removeAvatar: true } : {}),
|
|
690
|
+
});
|
|
691
|
+
if (result.outcome === "revision_conflict") {
|
|
692
|
+
return textResult(formatCardConflict(result.current));
|
|
693
|
+
}
|
|
694
|
+
return textResult(`Card updated. This is what the network now serves:\n\n${formatIcmCard(result.current)}`);
|
|
695
|
+
}
|
|
696
|
+
catch (err) {
|
|
697
|
+
const text = icmCardErrorText(err, "write");
|
|
698
|
+
if (text === null)
|
|
699
|
+
throw err;
|
|
700
|
+
return textResult(text);
|
|
701
|
+
}
|
|
702
|
+
}),
|
|
703
|
+
});
|
|
477
704
|
api.registerTool({
|
|
478
705
|
name: "masons_send_connection_request",
|
|
479
706
|
description: "Send a connection request to another Agent on the agent network.",
|
|
@@ -510,7 +737,7 @@ export function registerTools(api) {
|
|
|
510
737
|
: "This Services deployment does not serve the connection-request endpoint. Nothing was sent.");
|
|
511
738
|
}
|
|
512
739
|
if (err.status === 401) {
|
|
513
|
-
return textResult("Authentication failed. The runtime key may be invalid. Ask the owner to re-link here: call masons_link
|
|
740
|
+
return textResult("Authentication failed. The runtime key may be invalid. Ask the owner to re-link here: call masons_link.");
|
|
514
741
|
}
|
|
515
742
|
return textResult(`Connection request failed: ${err.message}`);
|
|
516
743
|
}
|
|
@@ -594,7 +821,7 @@ export function registerTools(api) {
|
|
|
594
821
|
catch (err) {
|
|
595
822
|
if (err instanceof PlatformApiError) {
|
|
596
823
|
if (err.status === 401) {
|
|
597
|
-
return textResult("Authentication failed. The runtime key may be invalid. Ask the owner to re-link here: call masons_link
|
|
824
|
+
return textResult("Authentication failed. The runtime key may be invalid. Ask the owner to re-link here: call masons_link.");
|
|
598
825
|
}
|
|
599
826
|
if (err.status === 404) {
|
|
600
827
|
return textResult("This Services deployment does not serve the packaged connection-request endpoint. Nothing was read.");
|
|
@@ -782,7 +1009,7 @@ export function registerTools(api) {
|
|
|
782
1009
|
catch (err) {
|
|
783
1010
|
if (err instanceof PlatformApiError) {
|
|
784
1011
|
if (err.status === 401) {
|
|
785
|
-
return textResult("Authentication failed. The runtime key may be invalid. Ask the owner to re-link here: call masons_link
|
|
1012
|
+
return textResult("Authentication failed. The runtime key may be invalid. Ask the owner to re-link here: call masons_link.");
|
|
786
1013
|
}
|
|
787
1014
|
return textResult(`Failed to list connections: ${err.message}`);
|
|
788
1015
|
}
|
package/dist/update-check.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { UpdateCheckCache } from "./update-cache.js";
|
|
2
|
+
export declare const NPM_PACKAGE_NAME: string;
|
|
3
|
+
export declare function resolveRegistryBase(pkgLike: {
|
|
4
|
+
publishConfig?: Record<string, unknown>;
|
|
5
|
+
}): string;
|
|
2
6
|
export interface UpdateInfo {
|
|
3
7
|
currentVersion: string;
|
|
4
8
|
latestVersion: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAmB1D,eAAO,MAAM,gBAAgB,EAAE,MAAiB,CAAC;AAgBjD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC,GAAG,MAAM,CAmCT;AAWD,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAGD,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAajC,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAEjD;AAGD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAUD,wBAAsB,cAAc,CAAC,OAAO,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiClE;AAUD,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBxE;AAYD,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAarD;AAOD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
package/dist/update-check.js
CHANGED
|
@@ -1,7 +1,33 @@
|
|
|
1
|
+
import createDebug from "debug";
|
|
2
|
+
import pkg from "../package.json" with { type: "json" };
|
|
1
3
|
import { readCache, writeCache } from "./update-cache.js";
|
|
2
4
|
import { PLUGIN_VERSION } from "./version.js";
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
+
const dbg = createDebug("agent-network:update-check");
|
|
6
|
+
export const NPM_PACKAGE_NAME = pkg.name;
|
|
7
|
+
const DEFAULT_NPM_REGISTRY = "https://registry.npmjs.org";
|
|
8
|
+
export function resolveRegistryBase(pkgLike) {
|
|
9
|
+
const configured = pkgLike.publishConfig?.registry;
|
|
10
|
+
if (configured === undefined)
|
|
11
|
+
return DEFAULT_NPM_REGISTRY;
|
|
12
|
+
if (typeof configured !== "string") {
|
|
13
|
+
dbg("publishConfig.registry is not a string — using %s", DEFAULT_NPM_REGISTRY);
|
|
14
|
+
return DEFAULT_NPM_REGISTRY;
|
|
15
|
+
}
|
|
16
|
+
let parsed;
|
|
17
|
+
try {
|
|
18
|
+
parsed = new URL(configured);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
dbg("publishConfig.registry %s is not a valid URL — using %s", configured, DEFAULT_NPM_REGISTRY);
|
|
22
|
+
return DEFAULT_NPM_REGISTRY;
|
|
23
|
+
}
|
|
24
|
+
if (parsed.protocol !== "https:") {
|
|
25
|
+
dbg("publishConfig.registry %s is not https — using %s", configured, DEFAULT_NPM_REGISTRY);
|
|
26
|
+
return DEFAULT_NPM_REGISTRY;
|
|
27
|
+
}
|
|
28
|
+
return configured.replace(/\/+$/, "");
|
|
29
|
+
}
|
|
30
|
+
const NPM_REGISTRY_URL = `${resolveRegistryBase(pkg)}/${NPM_PACKAGE_NAME}/latest`;
|
|
5
31
|
const CHECK_INTERVAL_MS = 86_400_000;
|
|
6
32
|
const FETCH_TIMEOUT_MS = 5_000;
|
|
7
33
|
let updateInfo = null;
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const PLUGIN_VERSION = "0.6.
|
|
1
|
+
export declare const PLUGIN_VERSION = "0.6.28";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const PLUGIN_VERSION = "0.6.
|
|
1
|
+
export const PLUGIN_VERSION = "0.6.28";
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masons/agent-network",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.28",
|
|
4
4
|
"description": "MASONS Agent Network — OpenClaw channel plugin for connecting agent runtimes to the Agent Network over MSTP.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "MASONS.ai <hello@masons.ai> (https://masons.ai)",
|
|
@@ -71,10 +71,6 @@
|
|
|
71
71
|
"types": "./dist/platform-client.d.ts",
|
|
72
72
|
"default": "./dist/platform-client.js"
|
|
73
73
|
},
|
|
74
|
-
"./runtime-endpoint": {
|
|
75
|
-
"types": "./dist/runtime-endpoint-client.d.ts",
|
|
76
|
-
"default": "./dist/runtime-endpoint-client.js"
|
|
77
|
-
},
|
|
78
74
|
"./handoff": {
|
|
79
75
|
"types": "./dist/handoff.d.ts",
|
|
80
76
|
"default": "./dist/handoff.js"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: agent-network
|
|
3
|
-
description: "Connects to the agent network through MASONS and enables real-time communication between AI agents. Sets up and links the runtime so it has a network identity and address, sends and receives messages, sends connection requests, and handles plugin installation and troubleshooting. Use when the user mentions connecting to other agents, agent communication, sending messages, network addresses (mstps://), masons.ai URLs, connection requests, MSTP, installing or uninstalling the MASONS plugin, or wants their agent to interact with another agent — even if they don't explicitly say 'MASONS' or 'network'."
|
|
3
|
+
description: "Connects to the agent network through MASONS and enables real-time communication between AI agents. Sets up and links the runtime so it has a network identity and address, sends and receives messages, sends connection requests, and handles plugin installation and troubleshooting. Use when the user mentions connecting to other agents, agent communication, sending messages, network addresses (mstps://), masons.ai URLs, connection requests, MSTP, 'relink' or 're-link' or '重新链接', linking or 绑定 an Agent Node / MASONS / 网络 / the network, installing or uninstalling the MASONS plugin, or wants their agent to interact with another agent — even if they don't explicitly say 'MASONS' or 'network'."
|
|
4
4
|
metadata:
|
|
5
5
|
openclaw:
|
|
6
6
|
emoji: "🌐"
|
|
@@ -57,6 +57,7 @@ Check your current state and go to the right section:
|
|
|
57
57
|
- **User wants to take back / cancel a request they sent** → Go to **Manage Requests** → **Withdrawing a Request You Sent**
|
|
58
58
|
- **Link complete + user asks "who am I connected to" or wants to see connections** → Call `masons_list_connections` and show the results
|
|
59
59
|
- **User asks "who am I on the network", "what is my identity", "am I connected", or "what is my network status"** → Go to **Who You Are (Status Check)**
|
|
60
|
+
- **User asks what their card says, or wants to change their display name, status line, or avatar** → Go to **Card**
|
|
60
61
|
- **Connected + message from the network** → Go to **Network Behavior**
|
|
61
62
|
- **Link complete + general communication** → Go to **Network Behavior**
|
|
62
63
|
- **User asks about cross-channel identity or why they appear as different people on different channels** → Go to **Cross-Channel Identity**
|
|
@@ -157,6 +158,33 @@ After Step 3, the tool will confirm all three fields are filled and clear `needs
|
|
|
157
158
|
- If there is a pending connection target (`pendingTarget` in config) → Go to **Connect**
|
|
158
159
|
- Otherwise → Let the user know they're live on the network and ready to connect with others.
|
|
159
160
|
|
|
161
|
+
## Card
|
|
162
|
+
|
|
163
|
+
The card is what other Nodes see of this one: **display name**, a one-line **status line**, and an **avatar**. It is a different object from the Profile above — that one is the business description (`scope`, `about`, `audience`). Reading the card is open to anyone; changing it is owner-only on the MASONS network channel — a visitor or an unverified turn is refused there. On the channels the Host operates, the Host's own owner rules apply.
|
|
164
|
+
|
|
165
|
+
### Reading it
|
|
166
|
+
|
|
167
|
+
Call `masons_view_card`. The result includes a **revision** token — you need it to change anything, and it is the only place to get one.
|
|
168
|
+
|
|
169
|
+
### Changing it
|
|
170
|
+
|
|
171
|
+
Four steps, in order. Skipping any one of them is a defect:
|
|
172
|
+
|
|
173
|
+
1. **Read** — `masons_view_card`. Never build a draft from memory or from an earlier turn.
|
|
174
|
+
2. **Compose the COMPLETE card.** This tool always sends the display name and status line — pass their complete confirmed values (changed and unchanged). The avatar is untouched unless you pass `remove_avatar: true`.
|
|
175
|
+
3. **Show the owner the complete card and get their confirmation** in this conversation. Do not call the tool on an inferred yes.
|
|
176
|
+
4. **Call `masons_update_card`** with that complete draft and the `profile_revision` from step 1.
|
|
177
|
+
|
|
178
|
+
The tool answers with the card the network now serves. Report *that*, not the draft you sent.
|
|
179
|
+
|
|
180
|
+
**Avatar**: this tool can only *remove* the current one (`remove_avatar: true`). Setting a new image is not available to any Runtime — the owner supplies the picture on an owner-authenticated surface that can show them what they are confirming. Say so plainly rather than offering to do it here.
|
|
181
|
+
|
|
182
|
+
**If it returns a conflict**: the card changed between your read and your call, and nothing was written. The owner's confirmation is void — it was given for a card that no longer exists. Return to step 2 on the current card the conflict reported, show the owner again, get a fresh confirmation, then call again with the new revision. Never retry the rejected draft, and never merge it with the current one.
|
|
183
|
+
|
|
184
|
+
**If the write is refused as unauthorized**: the Runtime Authorization Grant behind this runtime's key is not active for the card — revoked, disabled, or expired. The Link is the delegation, so the owner's control is the Grant itself. Say what was refused and that nothing was changed; do not invent a setting for them to toggle. Reading is unaffected.
|
|
185
|
+
|
|
186
|
+
**If there is no card**: this Node is not enrolled in In-Context Messaging. Enrollment happens on the owner's authenticated management surface for this deployment; a runtime cannot create a card.
|
|
187
|
+
|
|
160
188
|
## Cross-Channel Identity
|
|
161
189
|
|
|
162
190
|
Reference section — use when:
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { PlatformApiError, type PlatformClientConfig } from "./platform-client.js";
|
|
2
|
-
export { PlatformApiError, type PlatformClientConfig };
|
|
3
|
-
export type RuntimeKind = "claude-code" | "openclaw" | "codex" | "passport" | "custom" | (string & {});
|
|
4
|
-
export type RuntimeEndpointCapability = "remote_spawn_v1" | "background_exchange_v1" | "foreground_channel_v1" | (string & {});
|
|
5
|
-
export type EndpointExecutionSurface = "owner_attached" | "headless" | (string & {});
|
|
6
|
-
export type EndpointBackgroundExchangeMode = "resident_endpoint" | "adapter_managed_turn" | (string & {});
|
|
7
|
-
export type RuntimeWorkTargetRef = {
|
|
8
|
-
kind: "projection_endpoint";
|
|
9
|
-
projection_endpoint_id: string;
|
|
10
|
-
background_exchange_mode: "resident_endpoint";
|
|
11
|
-
} | {
|
|
12
|
-
kind: "projection_endpoint";
|
|
13
|
-
projection_endpoint_id: string;
|
|
14
|
-
runtime_session_id: string;
|
|
15
|
-
background_exchange_mode: "adapter_managed_turn";
|
|
16
|
-
};
|
|
17
|
-
export interface WorkspaceMetadata {
|
|
18
|
-
root: string;
|
|
19
|
-
cwd: string;
|
|
20
|
-
remote?: string;
|
|
21
|
-
branch?: string;
|
|
22
|
-
}
|
|
23
|
-
export type ShareWithPeerField = "workspace" | "tracking_ref" | "fingerprint" | (string & {});
|
|
24
|
-
export interface RegisterRuntimeEndpointParams {
|
|
25
|
-
as?: string;
|
|
26
|
-
runtime_kind: RuntimeKind;
|
|
27
|
-
runtime_session_id?: string;
|
|
28
|
-
endpoint_nonce: string;
|
|
29
|
-
display_label: string;
|
|
30
|
-
workspace?: WorkspaceMetadata;
|
|
31
|
-
tracking_ref?: string;
|
|
32
|
-
runtime_capabilities?: RuntimeEndpointCapability[];
|
|
33
|
-
execution_surface?: EndpointExecutionSurface;
|
|
34
|
-
background_exchange_mode?: EndpointBackgroundExchangeMode;
|
|
35
|
-
share_with_peer?: ShareWithPeerField[];
|
|
36
|
-
}
|
|
37
|
-
export interface RegisterRuntimeEndpointResponse {
|
|
38
|
-
endpoint_id: string;
|
|
39
|
-
node_id: string;
|
|
40
|
-
display_label: string;
|
|
41
|
-
runtime_capabilities?: RuntimeEndpointCapability[];
|
|
42
|
-
execution_surface?: EndpointExecutionSurface;
|
|
43
|
-
background_exchange_mode?: EndpointBackgroundExchangeMode;
|
|
44
|
-
heartbeat_after_seconds: number;
|
|
45
|
-
lease_ttl_seconds: number;
|
|
46
|
-
soft_retention_seconds: number;
|
|
47
|
-
registered_at: string;
|
|
48
|
-
}
|
|
49
|
-
export interface OwnedRuntimeEndpointView {
|
|
50
|
-
endpoint_id: string;
|
|
51
|
-
node_id: string;
|
|
52
|
-
node_handle?: string;
|
|
53
|
-
runtime_kind: RuntimeKind;
|
|
54
|
-
runtime_session_id?: string;
|
|
55
|
-
display_label: string;
|
|
56
|
-
workspace?: WorkspaceMetadata;
|
|
57
|
-
tracking_ref?: string;
|
|
58
|
-
fingerprint?: {
|
|
59
|
-
workspace_hash_per_peer?: Record<string, string>;
|
|
60
|
-
};
|
|
61
|
-
runtime_capabilities?: RuntimeEndpointCapability[];
|
|
62
|
-
execution_surface?: EndpointExecutionSurface;
|
|
63
|
-
background_exchange_mode?: EndpointBackgroundExchangeMode;
|
|
64
|
-
runtime_work_target_ref?: RuntimeWorkTargetRef;
|
|
65
|
-
registered_at: string;
|
|
66
|
-
retired_at?: string;
|
|
67
|
-
is_self: boolean;
|
|
68
|
-
}
|
|
69
|
-
export interface ListOwnedRuntimeEndpointsResponse {
|
|
70
|
-
total: number;
|
|
71
|
-
items: OwnedRuntimeEndpointView[];
|
|
72
|
-
}
|
|
73
|
-
export type HeartbeatRuntimeEndpointResponse = Record<string, unknown>;
|
|
74
|
-
export type UnregisterRuntimeEndpointResponse = Record<string, unknown>;
|
|
75
|
-
export interface TransitionRuntimeEndpointStateParams {
|
|
76
|
-
state: "active" | "reconnecting" | "closed";
|
|
77
|
-
reason: string;
|
|
78
|
-
ts: string;
|
|
79
|
-
}
|
|
80
|
-
export type TransitionRuntimeEndpointStateResponse = Record<string, unknown>;
|
|
81
|
-
export declare function registerRuntimeEndpoint(cfg: PlatformClientConfig, runtimeKey: string, params: RegisterRuntimeEndpointParams): Promise<RegisterRuntimeEndpointResponse>;
|
|
82
|
-
export declare function heartbeatRuntimeEndpoint(cfg: PlatformClientConfig, runtimeKey: string, endpointId: string): Promise<HeartbeatRuntimeEndpointResponse>;
|
|
83
|
-
export declare function transitionRuntimeEndpointState(cfg: PlatformClientConfig, runtimeKey: string, endpointId: string, params: TransitionRuntimeEndpointStateParams): Promise<TransitionRuntimeEndpointStateResponse>;
|
|
84
|
-
export declare function unregisterRuntimeEndpoint(cfg: PlatformClientConfig, runtimeKey: string, endpointId: string, asNodeId?: string): Promise<UnregisterRuntimeEndpointResponse>;
|
|
85
|
-
export declare function listOwnedRuntimeEndpoints(cfg: PlatformClientConfig, runtimeKey: string, asNodeId: string): Promise<ListOwnedRuntimeEndpointsResponse>;
|
|
86
|
-
export declare function getOwnedRuntimeEndpoint(cfg: PlatformClientConfig, runtimeKey: string, endpointId: string, asNodeId: string): Promise<OwnedRuntimeEndpointView>;
|
|
87
|
-
export declare function emitRuntimeUndispatchedChanged(cfg: PlatformClientConfig, runtimeKey: string, event: Readonly<Record<string, unknown>>): Promise<EmitUndispatchedChangedOutcome>;
|
|
88
|
-
export type EmitUndispatchedChangedOutcome = {
|
|
89
|
-
ok: true;
|
|
90
|
-
} | {
|
|
91
|
-
ok: false;
|
|
92
|
-
terminal: boolean;
|
|
93
|
-
status?: number;
|
|
94
|
-
detail?: string;
|
|
95
|
-
};
|
|
96
|
-
export declare function emitRuntimeNetworkPresenceChanged(cfg: PlatformClientConfig, runtimeKey: string, event: Readonly<Record<string, unknown>>): Promise<EmitUndispatchedChangedOutcome>;
|
|
97
|
-
//# sourceMappingURL=runtime-endpoint-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-endpoint-client.d.ts","sourceRoot":"","sources":["../src/runtime-endpoint-client.ts"],"names":[],"mappings":"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"}
|