@easynet-run/node 0.27.14 → 0.39.29

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 (38) hide show
  1. package/README.md +39 -1
  2. package/native/dendrite-bridge-manifest.json +5 -4
  3. package/native/dendrite-bridge.json +1 -1
  4. package/native/include/axon_dendrite_bridge.h +18 -4
  5. package/native/libaxon_dendrite_bridge.so +0 -0
  6. package/package.json +9 -5
  7. package/runtime/easynet-runtime-rs-0.39.29-x86_64-unknown-linux-gnu.tar.gz +0 -0
  8. package/runtime/runtime-bridge-manifest.json +4 -4
  9. package/runtime/runtime-bridge.json +3 -3
  10. package/src/ability_lifecycle.d.ts +12 -1
  11. package/src/ability_lifecycle.js +117 -31
  12. package/src/capability_request.js +3 -1
  13. package/src/dendrite_bridge/bridge.d.ts +10 -2
  14. package/src/dendrite_bridge/bridge.js +75 -14
  15. package/src/dendrite_bridge/ffi.d.ts +4 -0
  16. package/src/dendrite_bridge/ffi.js +194 -18
  17. package/src/dendrite_bridge/types.d.ts +4 -0
  18. package/src/errors.js +9 -3
  19. package/src/index.d.ts +3 -3
  20. package/src/index.js +9 -10
  21. package/src/mcp/server.d.ts +24 -2
  22. package/src/mcp/server.js +218 -18
  23. package/src/mcp/server.test.js +100 -0
  24. package/src/presets/ability_dispatch/workflow.js +8 -30
  25. package/src/presets/remote_control/config.d.ts +3 -0
  26. package/src/presets/remote_control/config.js +22 -24
  27. package/src/presets/remote_control/descriptor.d.ts +36 -0
  28. package/src/presets/remote_control/descriptor.js +267 -11
  29. package/src/presets/remote_control/handlers.d.ts +8 -0
  30. package/src/presets/remote_control/handlers.js +230 -26
  31. package/src/presets/remote_control/kit.d.ts +4 -2
  32. package/src/presets/remote_control/kit.js +106 -1
  33. package/src/presets/remote_control/kit.test.js +994 -0
  34. package/src/presets/remote_control/orchestrator.d.ts +6 -0
  35. package/src/presets/remote_control/orchestrator.js +36 -1
  36. package/src/presets/remote_control/specs.js +217 -61
  37. package/src/receipt.js +6 -3
  38. package/runtime/easynet-runtime-rs-0.27.14-x86_64-unknown-linux-gnu.tar.gz +0 -0
@@ -1,3 +1,4 @@
1
+ import { DendriteServerStream } from "../../dendrite_bridge.js";
1
2
  import type { JsonRecord, AbilityPackageDescriptor } from "./descriptor.js";
2
3
  export type { JsonRecord };
3
4
  export type OrchestratorFactory = (config: {
@@ -10,6 +11,11 @@ export interface RemoteOrchestrator {
10
11
  listNodes(ownerId?: string): JsonRecord[];
11
12
  listMcpTools(namePattern?: string, tags?: string[], nodeId?: string): JsonRecord[];
12
13
  callMcpTool(toolName: string, targetNodeId: string, argumentsJson: JsonRecord): JsonRecord;
14
+ /** Call an MCP tool on a remote node and return a stream of incremental response chunks. */
15
+ callMcpToolStream(toolName: string, targetNodeId: string, argumentsJson: JsonRecord, options?: {
16
+ timeoutMs?: number;
17
+ }): DendriteServerStream;
18
+ drainNode(nodeId: string, reason: string): JsonRecord;
13
19
  disconnectDevice(nodeId: string, reason: string): JsonRecord;
14
20
  uninstallAbility(nodeId: string, installId: string, reason: string): JsonRecord;
15
21
  deployAbilityPackage(descriptor: AbilityPackageDescriptor, nodeId: string, cleanupOnActivateFailure: boolean): JsonRecord;
@@ -1,4 +1,28 @@
1
- import { DendriteBridge } from "../../dendrite_bridge.js";
1
+ // EasyNet Axon for AgentNet
2
+ // =========================
3
+ //
4
+ // File: sdk/node/src/presets/remote_control/orchestrator.ts
5
+ // Description: Node remote-control orchestrator adapter that translates preset calls into DendriteBridge operations.
6
+ //
7
+ // Protocol Responsibility:
8
+ // - Wraps low-level bridge operations in remote-control terminology such as ability, device, and tool workflows.
9
+ // - Centralizes publish, install, invoke, cleanup, and list flows shared by remote-control handlers.
10
+ //
11
+ // Implementation Approach:
12
+ // - Keeps bridge semantics explicit while translating internal capability and node naming into public preset APIs.
13
+ // - Holds connection and timeout policy close to the transport boundary so handler code stays declarative.
14
+ //
15
+ // Usage Contract:
16
+ // - Callers should construct or reuse orchestrators with valid endpoint, tenant, and native-library context.
17
+ // - Close or release orchestrator resources when the preset is no longer serving requests.
18
+ //
19
+ // Architectural Position:
20
+ // - Mid-layer adapter between remote-control handlers and bridge or client transport implementations.
21
+ //
22
+ // Author: Silan.Hu
23
+ // Email: silan.hu@u.nus.edu
24
+ // Copyright (c) 2026-2027 easynet. All rights reserved.
25
+ import { DendriteBridge, } from "../../dendrite_bridge.js";
2
26
  import { DEFAULT_EXECUTION_MODE, DEFAULT_INSTALL_TIMEOUT_SECONDS } from "./config.js";
3
27
  export function buildOrchestrator(config, tenant) {
4
28
  return new OrchestratorAdapter(config, tenant);
@@ -26,6 +50,17 @@ class OrchestratorAdapter {
26
50
  const options = { targetNodeId, argumentsJson };
27
51
  return this.bridge.callMcpTool(this.tenant, toolName, options);
28
52
  }
53
+ callMcpToolStream(toolName, targetNodeId, argumentsJson = {}, options = {}) {
54
+ const streamOptions = {
55
+ targetNodeId,
56
+ argumentsJson,
57
+ timeoutMs: options.timeoutMs,
58
+ };
59
+ return this.bridge.callMcpToolStream(this.tenant, toolName, streamOptions);
60
+ }
61
+ drainNode(nodeId, reason) {
62
+ return this.bridge.drainNode(this.tenant, nodeId, reason);
63
+ }
29
64
  disconnectDevice(nodeId, reason) {
30
65
  return this.bridge.deregisterNode(this.tenant, nodeId, reason);
31
66
  }
@@ -1,3 +1,37 @@
1
+ // EasyNet Axon for AgentNet
2
+ // =========================
3
+ //
4
+ // File: sdk/node/src/presets/remote_control/specs.ts
5
+ // Description: Node definitions for the canonical remote-control MCP tool catalog and JSON schemas.
6
+ //
7
+ // Protocol Responsibility:
8
+ // - Publishes the canonical remote-control MCP tool catalog, descriptions, and input schemas for agents.
9
+ // - Keeps tool names and schema-visible behavior aligned across all first-party SDK implementations.
10
+ //
11
+ // Implementation Approach:
12
+ // - Represents tool contracts as static data builders plus small helper combinators for shared schema fragments.
13
+ // - Favors explicit schema literals so parity checks can diff outputs deterministically across languages.
14
+ //
15
+ // Usage Contract:
16
+ // - Any rename or schema change here must be mirrored across SDKs and covered by parity tests.
17
+ // - Consumers should treat these definitions as externally visible protocol metadata, not UI-only hints.
18
+ //
19
+ // Architectural Position:
20
+ // - Contract catalog layer for the remote-control preset.
21
+ //
22
+ // Author: Silan.Hu
23
+ // Email: silan.hu@u.nus.edu
24
+ // Copyright (c) 2026-2027 easynet. All rights reserved.
25
+ /** Shared agent-extension properties reused across deploy/package tool specs. */
26
+ function agentExtensionProperties() {
27
+ return {
28
+ instructions: { type: "string", description: "Full operational instructions for AI agents (SKILL.md equivalent, <5000 tokens). Explain what the tool does, when to use it, step-by-step usage, and error handling." },
29
+ input_examples: { type: "array", items: { type: "object" }, description: "Example input objects conforming to input_schema. Helps agents understand invocation patterns." },
30
+ prerequisites: { type: "array", items: { type: "string" }, description: "Requirements before calling this tool (e.g. 'Must call session_start first')." },
31
+ context_bindings: { type: "object", description: "Context bindings declaring what this ability accesses (e.g. env.PYTHON_PATH, resource.camera)." },
32
+ category: { type: "string", description: "Tool category for grouping (e.g. 'session', 'filesystem', 'network', 'system')." },
33
+ };
34
+ }
1
35
  export function remoteControlToolSpecs() {
2
36
  return [
3
37
  // -----------------------------------------------------------------
@@ -5,61 +39,77 @@ export function remoteControlToolSpecs() {
5
39
  // -----------------------------------------------------------------
6
40
  {
7
41
  name: "discover_nodes",
8
- description: "Discover online nodes registered with Axon Runtime.",
42
+ description: "Discover online nodes registered with Axon Runtime. Use this first to find available devices before calling other tools. Returns a list of nodes with their online status.",
9
43
  inputSchema: {
10
44
  type: "object",
11
- properties: { tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)" } },
45
+ properties: { tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)." } },
12
46
  },
13
47
  },
14
48
  {
15
49
  name: "list_remote_tools",
16
- description: "List MCP tools visible for a tenant.",
50
+ description: "List MCP tools visible for a tenant. Use after discover_nodes to see what tools are available on a specific node or across all nodes.",
17
51
  inputSchema: {
18
52
  type: "object",
19
53
  properties: {
20
- tenant_id: { type: "string" },
21
- node_id: { type: "string" },
22
- name_pattern: { type: "string" },
54
+ tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)." },
55
+ node_id: { type: "string", description: "Filter tools by a specific node." },
56
+ name_pattern: { type: "string", description: "Glob pattern to filter tool names (e.g. 'session_*')." },
23
57
  },
24
58
  },
25
59
  },
26
60
  {
27
61
  name: "call_remote_tool",
28
- description: "Call an MCP tool on a selected node.",
62
+ description: "Call an MCP tool on a selected node and return the full result. Use for quick operations that return a single response. For long-running or streaming tools, prefer call_remote_tool_stream.",
63
+ inputSchema: {
64
+ type: "object",
65
+ properties: {
66
+ tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)." },
67
+ tool_name: { type: "string", description: "Name of the MCP tool to invoke." },
68
+ node_id: { type: "string", description: "Target node ID (from discover_nodes)." },
69
+ arguments: { type: "object", description: "Tool-specific arguments passed to the remote tool." },
70
+ },
71
+ required: ["tool_name", "node_id"],
72
+ },
73
+ },
74
+ {
75
+ name: "call_remote_tool_stream",
76
+ description: "Call an MCP tool on a selected node and stream incremental response chunks. Prefer this for long-running or incremental-output tools instead of call_remote_tool. Falls back to buffered response when streaming is unavailable.",
29
77
  inputSchema: {
30
78
  type: "object",
31
79
  properties: {
32
- tenant_id: { type: "string" },
33
- tool_name: { type: "string" },
34
- node_id: { type: "string" },
35
- arguments: { type: "object" },
80
+ tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)." },
81
+ tool_name: { type: "string", description: "Name of the MCP tool to invoke." },
82
+ node_id: { type: "string", description: "Target node ID (from discover_nodes)." },
83
+ arguments: { type: "object", description: "Tool-specific arguments passed to the remote tool." },
84
+ timeout_ms: { type: "integer", description: "Per-chunk timeout in milliseconds for streaming reads (default 60000)." },
85
+ max_bytes: { type: "integer", description: "Maximum total bytes accepted from the stream (default 64 MiB). Set higher for large transfers." },
36
86
  },
37
87
  required: ["tool_name", "node_id"],
38
88
  },
39
89
  },
40
90
  {
41
91
  name: "disconnect_device",
42
- description: "Deregister a remote device from the Axon Runtime, closing its connection.",
92
+ description: "Deregister a remote device from the Axon Runtime, closing its connection. Use when a device should be removed from the active node list.",
43
93
  inputSchema: {
44
94
  type: "object",
45
95
  properties: {
46
- tenant_id: { type: "string" },
47
- node_id: { type: "string" },
48
- reason: { type: "string" },
96
+ tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)." },
97
+ node_id: { type: "string", description: "Node ID of the device to disconnect." },
98
+ reason: { type: "string", description: "Human-readable reason for disconnection." },
49
99
  },
50
100
  required: ["node_id"],
51
101
  },
52
102
  },
53
103
  {
54
104
  name: "uninstall_ability",
55
- description: "Uninstall a deployed ability from a device by deactivating and removing it.",
105
+ description: "Uninstall a deployed ability from a device by deactivating and removing it. Use to clean up abilities that are no longer needed.",
56
106
  inputSchema: {
57
107
  type: "object",
58
108
  properties: {
59
- tenant_id: { type: "string" },
60
- node_id: { type: "string" },
61
- install_id: { type: "string" },
62
- reason: { type: "string" },
109
+ tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)." },
110
+ node_id: { type: "string", description: "Target node ID." },
111
+ install_id: { type: "string", description: "Installation ID returned by deploy_ability or deploy_ability_package." },
112
+ reason: { type: "string", description: "Human-readable reason for uninstallation." },
63
113
  },
64
114
  required: ["node_id", "install_id"],
65
115
  },
@@ -69,15 +119,17 @@ export function remoteControlToolSpecs() {
69
119
  // -----------------------------------------------------------------
70
120
  {
71
121
  name: "deploy_ability",
72
- description: "Deploy a command-backed MCP ability.",
122
+ description: "Deploy a simple command-backed MCP ability to a device. This is the easiest way to make a command available as a remote tool. For advanced deployment options (custom schemas, versioning, signatures), use deploy_ability_package instead.",
73
123
  inputSchema: {
74
124
  type: "object",
75
125
  properties: {
76
- tenant_id: { type: "string" },
77
- node_id: { type: "string" },
78
- tool_name: { type: "string" },
79
- description: { type: "string" },
80
- command_template: { type: "string" },
126
+ tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)." },
127
+ node_id: { type: "string", description: "Target node ID to deploy the ability to." },
128
+ tool_name: { type: "string", description: "Name for the new MCP tool (auto-generated if omitted)." },
129
+ description: { type: "string", description: "Human-readable description of what this tool does." },
130
+ command_template: { type: "string", description: "Shell command template to execute on the device." },
131
+ metadata: { type: "object", description: "Additional metadata for the ability." },
132
+ ...agentExtensionProperties(),
81
133
  },
82
134
  required: ["node_id", "command_template"],
83
135
  },
@@ -87,48 +139,52 @@ export function remoteControlToolSpecs() {
87
139
  // -----------------------------------------------------------------
88
140
  {
89
141
  name: "package_ability",
90
- description: "Build a native ability package descriptor.",
142
+ description: "Build a native ability package descriptor without deploying. Use this to prepare a package for later deployment with deploy_ability_package, or to inspect the descriptor before committing.",
91
143
  inputSchema: {
92
144
  type: "object",
93
145
  properties: {
94
- tenant_id: { type: "string" },
95
- ability_name: { type: "string" },
96
- tool_name: { type: "string" },
97
- description: { type: "string" },
98
- command_template: { type: "string" },
99
- input_schema: { type: "object" },
100
- output_schema: { type: "object" },
101
- version: { type: "string" },
102
- tags: { type: "array", items: { type: "string" } },
103
- package_id: { type: "string" },
104
- capability_name: { type: "string" },
105
- signature_base64: { type: "string" },
106
- digest: { type: "string" },
146
+ tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)." },
147
+ ability_name: { type: "string", description: "Unique name for the ability." },
148
+ tool_name: { type: "string", description: "MCP tool name exposed after deployment." },
149
+ description: { type: "string", description: "Human-readable description." },
150
+ command_template: { type: "string", description: "Shell command template to execute." },
151
+ input_schema: { type: "object", description: "JSON Schema for tool input validation." },
152
+ output_schema: { type: "object", description: "JSON Schema for tool output." },
153
+ version: { type: "string", description: "Semantic version (default '1.0.0')." },
154
+ tags: { type: "array", items: { type: "string" }, description: "Tags for categorization." },
155
+ metadata: { type: "object", description: "Additional metadata." },
156
+ package_id: { type: "string", description: "Custom package identifier." },
157
+ capability_name: { type: "string", description: "Override capability name in the registry." },
158
+ signature_base64: { type: "string", description: "Base64-encoded deployment signature." },
159
+ digest: { type: "string", description: "Content digest for integrity verification." },
160
+ ...agentExtensionProperties(),
107
161
  },
108
162
  required: ["ability_name", "command_template"],
109
163
  },
110
164
  },
111
165
  {
112
166
  name: "deploy_ability_package",
113
- description: "Deploy a native ability package by publish/install/activate.",
167
+ description: "Deploy a native ability package through the full publish/install/activate pipeline. Use this for advanced deployments with custom schemas, versioning, or pre-built package descriptors. For simple command deployments, prefer deploy_ability.",
114
168
  inputSchema: {
115
169
  type: "object",
116
170
  properties: {
117
- tenant_id: { type: "string" },
118
- node_id: { type: "string" },
119
- package: { type: "object" },
120
- ability_name: { type: "string" },
121
- tool_name: { type: "string" },
122
- description: { type: "string" },
123
- command_template: { type: "string" },
124
- input_schema: { type: "object" },
125
- output_schema: { type: "object" },
126
- version: { type: "string" },
127
- tags: { type: "array", items: { type: "string" } },
128
- package_id: { type: "string" },
129
- capability_name: { type: "string" },
130
- signature_base64: { type: "string" },
131
- cleanup_on_activate_failure: { type: "boolean" },
171
+ tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)." },
172
+ node_id: { type: "string", description: "Target node ID to deploy to." },
173
+ package: { type: "object", description: "Pre-built package descriptor (from package_ability). If provided, other descriptor fields are ignored." },
174
+ ability_name: { type: "string", description: "Unique name for the ability." },
175
+ tool_name: { type: "string", description: "MCP tool name exposed after deployment." },
176
+ description: { type: "string", description: "Human-readable description." },
177
+ command_template: { type: "string", description: "Shell command template to execute." },
178
+ input_schema: { type: "object", description: "JSON Schema for tool input validation." },
179
+ output_schema: { type: "object", description: "JSON Schema for tool output." },
180
+ version: { type: "string", description: "Semantic version (default '1.0.0')." },
181
+ tags: { type: "array", items: { type: "string" }, description: "Tags for categorization." },
182
+ metadata: { type: "object", description: "Additional metadata." },
183
+ package_id: { type: "string", description: "Custom package identifier." },
184
+ capability_name: { type: "string", description: "Override capability name in the registry." },
185
+ signature_base64: { type: "string", description: "Base64-encoded deployment signature." },
186
+ cleanup_on_activate_failure: { type: "boolean", description: "Auto-cleanup on activation failure (default true)." },
187
+ ...agentExtensionProperties(),
132
188
  },
133
189
  required: ["node_id"],
134
190
  },
@@ -136,17 +192,117 @@ export function remoteControlToolSpecs() {
136
192
  // AI-AGENT PRESET: one-shot command execution
137
193
  {
138
194
  name: "execute_command",
139
- description: "One-shot command execution via temporary MCP ability.",
195
+ description: "One-shot command execution on a remote device. Deploys a temporary ability, runs the command, returns the output, and cleans up. Use for ad-hoc commands that don't need a persistent tool.",
140
196
  inputSchema: {
141
197
  type: "object",
142
198
  properties: {
143
- tenant_id: { type: "string" },
144
- node_id: { type: "string" },
145
- command: { type: "string" },
146
- cleanup: { type: "boolean" },
199
+ tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)." },
200
+ node_id: { type: "string", description: "Target node ID to execute on." },
201
+ command: { type: "string", description: "Shell command to execute on the device." },
202
+ cleanup: { type: "boolean", description: "Remove the temporary ability after execution (default true)." },
147
203
  },
148
204
  required: ["node_id", "command"],
149
205
  },
150
206
  },
207
+ // -----------------------------------------------------------------
208
+ // DEVICE MANAGEMENT & ABILITY LIFECYCLE TOOLS
209
+ // Ported from Rust SDK for cross-SDK parity.
210
+ // -----------------------------------------------------------------
211
+ {
212
+ name: "drain_device",
213
+ description: "Drain a remote device — stop accepting new invocations while finishing in-flight ones.",
214
+ inputSchema: {
215
+ type: "object",
216
+ properties: {
217
+ tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)." },
218
+ node_id: { type: "string", description: "Target device node ID." },
219
+ reason: { type: "string", description: "Reason for draining." },
220
+ },
221
+ required: ["node_id"],
222
+ },
223
+ },
224
+ {
225
+ name: "build_ability_descriptor",
226
+ description: "Build an AbilityDescriptor locally without deploying it.",
227
+ inputSchema: {
228
+ type: "object",
229
+ properties: {
230
+ name: { type: "string", description: "Ability name." },
231
+ description: { type: "string", description: "Ability description." },
232
+ command_template: { type: "string", description: "Shell command template to back the ability." },
233
+ input_schema: { type: "object", description: "Input JSON schema." },
234
+ output_schema: { type: "object", description: "Output JSON schema." },
235
+ version: { type: "string", description: "Ability version." },
236
+ tags: { type: "array", items: { type: "string" }, description: "Ability tags." },
237
+ resource_uri: { type: "string", description: "Resource URI." },
238
+ ...agentExtensionProperties(),
239
+ },
240
+ required: ["name", "command_template"],
241
+ },
242
+ },
243
+ {
244
+ name: "export_ability_skill",
245
+ description: "Export an AbilityDescriptor as an Agent Skills SKILL.md and invoke.sh.",
246
+ inputSchema: {
247
+ type: "object",
248
+ properties: {
249
+ name: { type: "string", description: "Ability name." },
250
+ description: { type: "string", description: "Ability description." },
251
+ command_template: { type: "string", description: "Shell command template to back the ability." },
252
+ input_schema: { type: "object", description: "Input JSON schema." },
253
+ output_schema: { type: "object", description: "Output JSON schema." },
254
+ version: { type: "string", description: "Ability version." },
255
+ tags: { type: "array", items: { type: "string" }, description: "Ability tags." },
256
+ resource_uri: { type: "string", description: "Resource URI." },
257
+ target: { type: "string", description: "Ability target: claude, codex, openclaw, agent_skills." },
258
+ axon_endpoint: { type: "string", description: "Axon endpoint for invoke script." },
259
+ ...agentExtensionProperties(),
260
+ },
261
+ required: ["name", "command_template"],
262
+ },
263
+ },
264
+ {
265
+ name: "redeploy_ability",
266
+ description: "Redeploy an ability to a device by rebuilding and replacing its full package.",
267
+ inputSchema: {
268
+ type: "object",
269
+ properties: {
270
+ tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)." },
271
+ node_id: { type: "string", description: "Target device node ID." },
272
+ tool_name: { type: "string", description: "Existing tool name to update." },
273
+ description: { type: "string", description: "New description." },
274
+ command_template: { type: "string", description: "New command template." },
275
+ input_schema: { type: "object", description: "New input schema." },
276
+ output_schema: { type: "object", description: "New output schema." },
277
+ },
278
+ required: ["node_id", "tool_name", "command_template"],
279
+ },
280
+ },
281
+ {
282
+ name: "list_abilities",
283
+ description: "List locally deployed abilities on a device (filters out non-installable MCP entries).",
284
+ inputSchema: {
285
+ type: "object",
286
+ properties: {
287
+ tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)." },
288
+ node_id: { type: "string", description: "Target device node ID." },
289
+ },
290
+ required: ["node_id"],
291
+ },
292
+ },
293
+ {
294
+ name: "forget_all",
295
+ description: "Remove ALL deployed abilities from a device. Destructive — requires confirm: true unless dry_run: true.",
296
+ inputSchema: {
297
+ type: "object",
298
+ properties: {
299
+ tenant_id: { type: "string", description: "Tenant ID (default AXON_TENANT)." },
300
+ node_id: { type: "string", description: "Target device node ID." },
301
+ confirm: { type: "boolean", description: "Must be true to confirm this destructive operation. Can be omitted when dry_run is true." },
302
+ dry_run: { type: "boolean", description: "When true, list abilities that would be removed without uninstalling." },
303
+ },
304
+ required: ["node_id"],
305
+ },
306
+ },
151
307
  ];
152
308
  }
package/src/receipt.js CHANGED
@@ -1,8 +1,11 @@
1
- // sdk/node/src/receipt.ts Lifecycle phase receipts for observability and evaluation.
1
+ // EasyNet Axon for AgentNet
2
+ // =========================
2
3
  //
3
- // Every phase transition in the Axon ability lifecycle emits a structured
4
- // PhaseReceipt. Mirrors the Rust reference: sdk/rust/src/receipt.rs
4
+ // File: sdk/node/src/receipt.ts
5
+ // Description: Lifecycle phase receipts for observability and evaluation.
5
6
  //
7
+ // Author: Silan.Hu
8
+ // Email: silan.hu@u.nus.edu
6
9
  // Copyright (c) 2026-2027 easynet. All rights reserved.
7
10
  /** In-progress receipt builder. */
8
11
  export class PhaseReceiptBuilder {