@easynet-run/node 0.27.14

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 (61) hide show
  1. package/README.md +135 -0
  2. package/native/dendrite-bridge-manifest.json +38 -0
  3. package/native/dendrite-bridge.json +15 -0
  4. package/native/include/axon_dendrite_bridge.h +460 -0
  5. package/native/libaxon_dendrite_bridge.so +0 -0
  6. package/package.json +67 -0
  7. package/runtime/easynet-runtime-rs-0.27.14-x86_64-unknown-linux-gnu.tar.gz +0 -0
  8. package/runtime/runtime-bridge-manifest.json +20 -0
  9. package/runtime/runtime-bridge.json +9 -0
  10. package/src/ability_lifecycle.d.ts +140 -0
  11. package/src/ability_lifecycle.js +525 -0
  12. package/src/capability_request.d.ts +14 -0
  13. package/src/capability_request.js +247 -0
  14. package/src/dendrite_bridge/bridge.d.ts +98 -0
  15. package/src/dendrite_bridge/bridge.js +712 -0
  16. package/src/dendrite_bridge/ffi.d.ts +60 -0
  17. package/src/dendrite_bridge/ffi.js +139 -0
  18. package/src/dendrite_bridge/index.d.ts +3 -0
  19. package/src/dendrite_bridge/index.js +25 -0
  20. package/src/dendrite_bridge/types.d.ts +179 -0
  21. package/src/dendrite_bridge/types.js +23 -0
  22. package/src/dendrite_bridge.d.ts +1 -0
  23. package/src/dendrite_bridge.js +27 -0
  24. package/src/errors.d.ts +83 -0
  25. package/src/errors.js +146 -0
  26. package/src/index.d.ts +55 -0
  27. package/src/index.js +164 -0
  28. package/src/koffi.d.ts +34 -0
  29. package/src/mcp/server.d.ts +29 -0
  30. package/src/mcp/server.js +190 -0
  31. package/src/presets/ability_dispatch/args.d.ts +5 -0
  32. package/src/presets/ability_dispatch/args.js +36 -0
  33. package/src/presets/ability_dispatch/bundle.d.ts +7 -0
  34. package/src/presets/ability_dispatch/bundle.js +102 -0
  35. package/src/presets/ability_dispatch/media.d.ts +6 -0
  36. package/src/presets/ability_dispatch/media.js +48 -0
  37. package/src/presets/ability_dispatch/orchestrator.d.ts +21 -0
  38. package/src/presets/ability_dispatch/orchestrator.js +117 -0
  39. package/src/presets/ability_dispatch/workflow.d.ts +50 -0
  40. package/src/presets/ability_dispatch/workflow.js +333 -0
  41. package/src/presets/ability_dispatch.d.ts +1 -0
  42. package/src/presets/ability_dispatch.js +2 -0
  43. package/src/presets/remote_control/config.d.ts +16 -0
  44. package/src/presets/remote_control/config.js +63 -0
  45. package/src/presets/remote_control/descriptor.d.ts +34 -0
  46. package/src/presets/remote_control/descriptor.js +183 -0
  47. package/src/presets/remote_control/handlers.d.ts +12 -0
  48. package/src/presets/remote_control/handlers.js +279 -0
  49. package/src/presets/remote_control/kit.d.ts +22 -0
  50. package/src/presets/remote_control/kit.js +72 -0
  51. package/src/presets/remote_control/kit.test.js +87 -0
  52. package/src/presets/remote_control/orchestrator.d.ts +28 -0
  53. package/src/presets/remote_control/orchestrator.js +118 -0
  54. package/src/presets/remote_control/specs.d.ts +2 -0
  55. package/src/presets/remote_control/specs.js +152 -0
  56. package/src/presets/remote_control_case.d.ts +7 -0
  57. package/src/presets/remote_control_case.js +3 -0
  58. package/src/receipt.d.ts +46 -0
  59. package/src/receipt.js +98 -0
  60. package/src/tool_adapter.d.ts +90 -0
  61. package/src/tool_adapter.js +169 -0
@@ -0,0 +1,247 @@
1
+ // EasyNet Axon for AgentNet
2
+ // =========================
3
+ //
4
+ // File: sdk/node/src/capability_request.ts
5
+ // Description: Source file for Node SDK bridge and capability request implementation; keeps behavior explicit and interoperable across language/runtime boundaries.
6
+ //
7
+ // Protocol Responsibility:
8
+ // - Implements Node SDK bridge and capability request implementation contracts required by current Axon service and SDK surfaces.
9
+ // - Preserves stable request/response semantics and error mapping for capability_request.ts call paths.
10
+ //
11
+ // Implementation Approach:
12
+ // - Uses small typed helpers and explicit control flow to avoid hidden side effects.
13
+ // - Keeps protocol translation and transport details close to this module boundary.
14
+ //
15
+ // Usage Contract:
16
+ // - Callers should provide valid tenant/resource/runtime context before invoking exported APIs.
17
+ // - Errors should be treated as typed protocol/runtime outcomes rather than silently ignored.
18
+ //
19
+ // Architectural Position:
20
+ // - Part of the Node SDK bridge and capability request implementation layer.
21
+ // - Should not embed unrelated orchestration logic outside this file's responsibility.
22
+ //
23
+ // Author: Silan.Hu
24
+ // Email: silan.hu@u.nus.edu
25
+ // Copyright (c) 2026-2027 easynet. All rights reserved.
26
+ import { AxonConfigError } from "./errors.js";
27
+ // DendriteError kept for backward compatibility; validation now uses AxonConfigError.
28
+ export class DendriteError extends Error {
29
+ constructor(message) {
30
+ super(message);
31
+ this.name = "DendriteError";
32
+ }
33
+ }
34
+ const defaultDeploySignatureSentinelBase64 = "__AXON_EPHEMERAL_DO_NOT_USE_IN_PROD__";
35
+ const digestPrefix = "sha256:";
36
+ let placeholderDeploySignatureWarningEmitted = false;
37
+ const DEFAULT_TARGET_PATH = "/client";
38
+ function warnPlaceholderDeploySignatureOnce() {
39
+ if (placeholderDeploySignatureWarningEmitted) {
40
+ return;
41
+ }
42
+ placeholderDeploySignatureWarningEmitted = true;
43
+ console.warn("warning: AXON_ALLOW_PLACEHOLDER_DEPLOY_SIGNATURE is enabled; the placeholder deploy signature is for local development only and must not be used in production");
44
+ }
45
+ function resolveTargetPath(raw) {
46
+ const trimmed = raw?.trim();
47
+ return trimmed || DEFAULT_TARGET_PATH;
48
+ }
49
+ function requireNonBlank(field, value) {
50
+ if (!value || !value.trim()) {
51
+ throw new AxonConfigError(`${field} is required`);
52
+ }
53
+ }
54
+ function validateDigestPrefix(field, value) {
55
+ const trimmed = value?.trim();
56
+ if (!trimmed) {
57
+ return;
58
+ }
59
+ if (!trimmed.startsWith(digestPrefix) || trimmed.length === digestPrefix.length) {
60
+ throw new AxonConfigError(`${field} must start with 'sha256:' (e.g. sha256:<hex>)`);
61
+ }
62
+ }
63
+ function putOptionalNonBlank(payload, key, value) {
64
+ if (value !== undefined && value !== null) {
65
+ const trimmed = value.trim();
66
+ if (trimmed) {
67
+ payload[key] = trimmed;
68
+ }
69
+ }
70
+ }
71
+ /**
72
+ * Add key only when value is positive; zero is treated as absent to avoid
73
+ * accidental proof-size pinning when callers omit an explicit payload size.
74
+ */
75
+ function putOptionalPayloadSize(payload, key, value) {
76
+ if (value === undefined || value === null)
77
+ return;
78
+ if (value < 0) {
79
+ throw new AxonConfigError(`${key} must be >= 0`);
80
+ }
81
+ if (value > 0) {
82
+ payload[key] = value;
83
+ }
84
+ }
85
+ function resolveDeploySignatureBase64(signatureBase64) {
86
+ if (signatureBase64 && signatureBase64.trim()) {
87
+ return signatureBase64.trim();
88
+ }
89
+ const fromEnv = process.env.AXON_DEPLOY_SIGNATURE_BASE64;
90
+ if (fromEnv && fromEnv.trim()) {
91
+ return fromEnv.trim();
92
+ }
93
+ const allowPlaceholder = process.env.AXON_ALLOW_PLACEHOLDER_DEPLOY_SIGNATURE?.trim().toLowerCase();
94
+ if (allowPlaceholder === "1" || allowPlaceholder === "true" || allowPlaceholder === "yes") {
95
+ warnPlaceholderDeploySignatureOnce();
96
+ return defaultDeploySignatureSentinelBase64;
97
+ }
98
+ throw new AxonConfigError("deploy signature required: set signatureBase64, AXON_DEPLOY_SIGNATURE_BASE64, or explicitly enable AXON_ALLOW_PLACEHOLDER_DEPLOY_SIGNATURE");
99
+ }
100
+ export function validatePublishCapabilityRequest(tenantId, packageId, capabilityName, options) {
101
+ requireNonBlank("tenantId", tenantId);
102
+ requireNonBlank("packageId", packageId);
103
+ requireNonBlank("capabilityName", capabilityName);
104
+ requireNonBlank("version", options.version);
105
+ validateDigestPrefix("digest", options.digest);
106
+ requireNonBlank("signatureBase64", options.signatureBase64);
107
+ if ((!options.payloadUri || !options.payloadUri.trim()) &&
108
+ (!options.packageBytesBase64 || !options.packageBytesBase64.trim())) {
109
+ throw new AxonConfigError("payloadUri or packageBytesBase64 is required");
110
+ }
111
+ if (options.payloadSizeBytes !== undefined && options.payloadSizeBytes < 0) {
112
+ throw new AxonConfigError("payloadSizeBytes must be >= 0");
113
+ }
114
+ }
115
+ export function buildPublishCapabilityPayload(tenantId, packageId, capabilityName, options) {
116
+ const payload = {
117
+ tenant_id: tenantId.trim(),
118
+ package_id: packageId.trim(),
119
+ capability_name: capabilityName.trim(),
120
+ tags: options.tags ?? [],
121
+ requirements: options.requirements ?? {},
122
+ metadata: options.metadata ?? {},
123
+ };
124
+ payload.version = options.version.trim();
125
+ putOptionalNonBlank(payload, "digest", options.digest);
126
+ payload.signature_base64 = options.signatureBase64.trim();
127
+ putOptionalNonBlank(payload, "payload_uri", options.payloadUri);
128
+ putOptionalPayloadSize(payload, "payload_size_bytes", options.payloadSizeBytes);
129
+ putOptionalNonBlank(payload, "package_bytes_base64", options.packageBytesBase64);
130
+ putOptionalNonBlank(payload, "signature_fingerprint", options.signatureFingerprint);
131
+ putOptionalNonBlank(payload, "package_fingerprint", options.packageFingerprint);
132
+ if (options.publisherKeyVersion !== undefined && options.publisherKeyVersion > 0) {
133
+ payload.publisher_key_version = options.publisherKeyVersion;
134
+ }
135
+ return payload;
136
+ }
137
+ export function validateInstallCapabilityRequest(tenantId, nodeId, packageId, options) {
138
+ requireNonBlank("tenantId", tenantId);
139
+ requireNonBlank("nodeId", nodeId);
140
+ requireNonBlank("packageId", packageId);
141
+ requireNonBlank("version", options.version);
142
+ validateDigestPrefix("digest", options.digest);
143
+ validateDigestPrefix("payloadDigest", options.payloadDigest);
144
+ if ((!options.digest || !options.digest.trim()) &&
145
+ (!options.payloadDigest || !options.payloadDigest.trim())) {
146
+ throw new AxonConfigError("digest or payloadDigest is required");
147
+ }
148
+ if (options.payloadSizeBytes !== undefined && options.payloadSizeBytes < 0) {
149
+ throw new AxonConfigError("payloadSizeBytes must be >= 0");
150
+ }
151
+ }
152
+ export function buildInstallCapabilityPayload(tenantId, nodeId, packageId, options) {
153
+ const payload = {
154
+ tenant_id: tenantId.trim(),
155
+ node_id: nodeId.trim(),
156
+ package_id: packageId.trim(),
157
+ };
158
+ payload.version = options.version.trim();
159
+ putOptionalNonBlank(payload, "digest", options.digest);
160
+ putOptionalNonBlank(payload, "payload_digest", options.payloadDigest);
161
+ putOptionalPayloadSize(payload, "payload_size_bytes", options.payloadSizeBytes);
162
+ putOptionalNonBlank(payload, "signature_fingerprint", options.signatureFingerprint);
163
+ putOptionalNonBlank(payload, "package_fingerprint", options.packageFingerprint);
164
+ if (options.requireConsent !== undefined) {
165
+ payload.require_consent = options.requireConsent;
166
+ }
167
+ if (options.allowTransferredCode !== undefined) {
168
+ payload.allow_transferred_code = options.allowTransferredCode;
169
+ }
170
+ putOptionalNonBlank(payload, "execution_mode", options.executionMode);
171
+ if (options.installTimeoutSeconds !== undefined) {
172
+ payload.install_timeout_seconds = options.installTimeoutSeconds;
173
+ }
174
+ return payload;
175
+ }
176
+ export function validateDeployMcpListDirRequest(tenantId, nodeId, options = {}) {
177
+ requireNonBlank("tenantId", tenantId);
178
+ requireNonBlank("nodeId", nodeId);
179
+ const targetPath = resolveTargetPath(options.targetPath);
180
+ requireNonBlank("targetPath", targetPath);
181
+ requireNonBlank("commandTemplate", options.commandTemplate);
182
+ validateDigestPrefix("digest", options.digest);
183
+ }
184
+ export function buildDeployMcpListDirPayload(tenantId, nodeId, options = {}) {
185
+ const targetPath = resolveTargetPath(options.targetPath);
186
+ const payload = {
187
+ tenant_id: tenantId.trim(),
188
+ node_id: nodeId.trim(),
189
+ target_path: targetPath,
190
+ command_template: options.commandTemplate?.trim(),
191
+ signature_base64: resolveDeploySignatureBase64(options.signatureBase64),
192
+ };
193
+ putOptionalNonBlank(payload, "package_id", options.packageId);
194
+ putOptionalNonBlank(payload, "capability_name", options.capabilityName);
195
+ putOptionalNonBlank(payload, "tool_name", options.toolName);
196
+ putOptionalNonBlank(payload, "version", options.version);
197
+ putOptionalNonBlank(payload, "digest", options.digest);
198
+ putOptionalNonBlank(payload, "package_bytes_base64", options.packageBytesBase64);
199
+ return payload;
200
+ }
201
+ export function validateUpdateMcpListDirRequest(tenantId, nodeId, options = {}) {
202
+ requireNonBlank("tenantId", tenantId);
203
+ requireNonBlank("nodeId", nodeId);
204
+ const targetPath = resolveTargetPath(options.targetPath);
205
+ requireNonBlank("targetPath", targetPath);
206
+ requireNonBlank("commandTemplate", options.commandTemplate);
207
+ validateDigestPrefix("digest", options.digest);
208
+ }
209
+ export function buildUpdateMcpListDirPayload(tenantId, nodeId, options = {}) {
210
+ const targetPath = resolveTargetPath(options.targetPath);
211
+ const payload = {
212
+ tenant_id: tenantId.trim(),
213
+ node_id: nodeId.trim(),
214
+ deactivate_old: options.deactivateOld ?? true,
215
+ uninstall_old: options.uninstallOld ?? true,
216
+ force_uninstall: options.forceUninstall ?? false,
217
+ target_path: targetPath,
218
+ command_template: options.commandTemplate?.trim(),
219
+ signature_base64: resolveDeploySignatureBase64(options.signatureBase64),
220
+ };
221
+ putOptionalNonBlank(payload, "existing_install_id", options.existingInstallId);
222
+ putOptionalNonBlank(payload, "deactivate_reason", options.deactivateReason);
223
+ putOptionalNonBlank(payload, "package_id", options.packageId);
224
+ putOptionalNonBlank(payload, "capability_name", options.capabilityName);
225
+ putOptionalNonBlank(payload, "tool_name", options.toolName);
226
+ putOptionalNonBlank(payload, "version", options.version);
227
+ putOptionalNonBlank(payload, "digest", options.digest);
228
+ putOptionalNonBlank(payload, "package_bytes_base64", options.packageBytesBase64);
229
+ return payload;
230
+ }
231
+ export function validateUninstallCapabilityRequest(tenantId, nodeId, installId) {
232
+ requireNonBlank("tenantId", tenantId);
233
+ requireNonBlank("nodeId", nodeId);
234
+ requireNonBlank("installId", installId);
235
+ }
236
+ export function buildUninstallCapabilityPayload(tenantId, nodeId, installId, options = {}) {
237
+ validateUninstallCapabilityRequest(tenantId, nodeId, installId);
238
+ const payload = {
239
+ tenant_id: tenantId.trim(),
240
+ node_id: nodeId.trim(),
241
+ install_id: installId.trim(),
242
+ deactivate_first: options.deactivateFirst ?? true,
243
+ force: options.force ?? false,
244
+ };
245
+ putOptionalNonBlank(payload, "deactivate_reason", options.deactivateReason);
246
+ return payload;
247
+ }
@@ -0,0 +1,98 @@
1
+ import type { DendriteBridgeOptions, DendriteUnaryCallOptions, DendriteAbilityCallOptions, DendriteStreamCallOptions, DendriteClientStreamCallOptions, DendriteBidiStreamCallOptions, DendriteListNodesOptions, DendriteRegisterNodeOptions, DendritePublishCapabilityOptions, DendriteInstallCapabilityOptions, DendriteListA2aAgentsOptions, DendriteSendA2aTaskOptions, DendriteDeployMcpListDirOptions, DendriteListMcpToolsOptions, DendriteCallMcpToolOptions, DendriteUninstallCapabilityOptions, DendriteUpdateMcpListDirOptions, DendriteVoiceCreateCallOptions, DendriteVoiceJoinCallOptions, DendriteVoiceUpdateMediaPathOptions, DendriteVoiceMetricsOptions, DendriteVoiceEndCallOptions, DendriteVoiceWatchOptions, DendriteVoiceCreateTransportSessionOptions, DendriteVoiceDescriptionOptions, DendriteVoiceCandidateOptions, DendriteVoiceEndTransportSessionOptions, DendriteProtocolInvokeOptions } from "./types.js";
2
+ import type { DendriteBridgeLib } from "./ffi.js";
3
+ export declare class DendriteBridge {
4
+ private readonly lib;
5
+ private handle;
6
+ constructor(options: DendriteBridgeOptions);
7
+ close(): void;
8
+ protocolCoverage(): Record<string, unknown>;
9
+ protocolCatalog(): Record<string, unknown>;
10
+ invokeProtocol(options?: DendriteProtocolInvokeOptions): Record<string, unknown>;
11
+ unaryCall(path: string, requestBytes: Uint8Array, options?: DendriteUnaryCallOptions): Uint8Array;
12
+ serverStreamCall(path: string, requestBytes: Uint8Array, options?: DendriteStreamCallOptions): {
13
+ chunks: Uint8Array[];
14
+ truncated: boolean;
15
+ };
16
+ clientStreamCall(path: string, requestChunks: Uint8Array[], options?: DendriteClientStreamCallOptions): Uint8Array;
17
+ bidiStreamCall(path: string, requestChunks: Uint8Array[], options?: DendriteBidiStreamCallOptions): {
18
+ chunks: Uint8Array[];
19
+ truncated: boolean;
20
+ };
21
+ abilityCall(tenantId: string, resourceUri: string, payload: unknown, options?: DendriteAbilityCallOptions): Record<string, unknown>;
22
+ abilityCallRaw(tenantId: string, resourceUri: string, payload: unknown, options?: DendriteAbilityCallOptions): Record<string, unknown>;
23
+ listNodes(tenantId: string, options?: DendriteListNodesOptions): Record<string, unknown>[];
24
+ registerNode(tenantId: string, nodeId: string, options?: DendriteRegisterNodeOptions): Record<string, unknown>;
25
+ deregisterNode(tenantId: string, nodeId: string, reason?: string): Record<string, unknown>;
26
+ heartbeat(tenantId: string, nodeId: string): Record<string, unknown>;
27
+ publishCapability(tenantId: string, packageId: string, capabilityName: string, options: DendritePublishCapabilityOptions): Record<string, unknown>;
28
+ installCapability(tenantId: string, nodeId: string, packageId: string, options: DendriteInstallCapabilityOptions): Record<string, unknown>;
29
+ activateCapability(tenantId: string, nodeId: string, installId: string): Record<string, unknown>;
30
+ listA2aAgents(tenantId: string, options?: DendriteListA2aAgentsOptions): Record<string, unknown>[];
31
+ getA2aAgentCard(tenantId: string, nodeId: string): Record<string, unknown>;
32
+ sendA2aTask(tenantId: string, targetAgentId: string, skillId: string, options?: DendriteSendA2aTaskOptions): Record<string, unknown>;
33
+ deployMcpListDir(tenantId: string, nodeId: string, options?: DendriteDeployMcpListDirOptions): Record<string, unknown>;
34
+ listMcpTools(tenantId: string, options?: DendriteListMcpToolsOptions): Record<string, unknown>[];
35
+ callMcpTool(tenantId: string, toolName: string, options?: DendriteCallMcpToolOptions): Record<string, unknown>;
36
+ uninstallCapability(tenantId: string, nodeId: string, installId: string, options?: DendriteUninstallCapabilityOptions): Record<string, unknown>;
37
+ updateMcpListDir(tenantId: string, nodeId: string, options?: DendriteUpdateMcpListDirOptions): Record<string, unknown>;
38
+ createVoiceCall(tenantId: string, options?: DendriteVoiceCreateCallOptions): Record<string, unknown>;
39
+ getVoiceCall(tenantId: string, callId: string): Record<string, unknown>;
40
+ joinVoiceCall(tenantId: string, callId: string, options?: DendriteVoiceJoinCallOptions): Record<string, unknown>;
41
+ leaveVoiceCall(tenantId: string, callId: string, participantId: string, reason?: string): Record<string, unknown>;
42
+ updateVoiceMediaPath(tenantId: string, callId: string, participantId: string, options?: DendriteVoiceUpdateMediaPathOptions): Record<string, unknown>;
43
+ reportVoiceCallMetrics(tenantId: string, callId: string, participantId: string, metrics?: DendriteVoiceMetricsOptions): Record<string, unknown>;
44
+ endVoiceCall(tenantId: string, callId: string, options?: DendriteVoiceEndCallOptions): Record<string, unknown>;
45
+ watchVoiceCallEvents(tenantId: string, callId: string, options?: DendriteVoiceWatchOptions): Record<string, unknown>;
46
+ createVoiceTransportSession(tenantId: string, callId: string, participantId: string, options?: DendriteVoiceCreateTransportSessionOptions): Record<string, unknown>;
47
+ getVoiceTransportSession(tenantId: string, callId: string, transportSessionId: string): Record<string, unknown>;
48
+ setVoiceTransportDescription(tenantId: string, callId: string, transportSessionId: string, side: number, description: DendriteVoiceDescriptionOptions): Record<string, unknown>;
49
+ addVoiceTransportCandidate(tenantId: string, callId: string, transportSessionId: string, side: number, candidate: DendriteVoiceCandidateOptions): Record<string, unknown>;
50
+ refreshVoiceTransportLease(tenantId: string, callId: string, transportSessionId: string, requestedTtlSeconds?: number): Record<string, unknown>;
51
+ endVoiceTransportSession(tenantId: string, callId: string, transportSessionId: string, options?: DendriteVoiceEndTransportSessionOptions): Record<string, unknown>;
52
+ watchVoiceTransportEvents(tenantId: string, callId: string, transportSessionId: string, options?: DendriteVoiceWatchOptions): Record<string, unknown>;
53
+ serverStreamOpen(path: string, requestBytes: Uint8Array, options?: {
54
+ metadata?: Record<string, string>;
55
+ timeoutMs?: number;
56
+ chunkTimeoutMs?: number;
57
+ chunkBufferSize?: number;
58
+ }): DendriteServerStream;
59
+ bidiStreamOpen(path: string, options?: {
60
+ requestBytes?: Uint8Array;
61
+ requestChunks?: Uint8Array[];
62
+ metadata?: Record<string, string>;
63
+ timeoutMs?: number;
64
+ chunkTimeoutMs?: number;
65
+ chunkBufferSize?: number;
66
+ requestBufferSize?: number;
67
+ }): DendriteBidiStream;
68
+ }
69
+ export declare class DendriteServerStream implements AsyncIterable<Uint8Array> {
70
+ private readonly lib;
71
+ private readonly streamHandle;
72
+ private done;
73
+ private nativeClosed;
74
+ constructor(lib: DendriteBridgeLib, streamHandle: bigint);
75
+ next(timeoutMs?: number): {
76
+ chunk: Uint8Array | null;
77
+ done: boolean;
78
+ timeout?: boolean;
79
+ };
80
+ close(): void;
81
+ [Symbol.asyncIterator](): AsyncIterator<Uint8Array>;
82
+ }
83
+ export declare class DendriteBidiStream implements AsyncIterable<Uint8Array> {
84
+ private readonly lib;
85
+ private readonly streamHandle;
86
+ private done;
87
+ private nativeClosed;
88
+ constructor(lib: DendriteBridgeLib, streamHandle: bigint);
89
+ send(chunk: Uint8Array): boolean;
90
+ finishSend(): boolean;
91
+ recv(timeoutMs?: number): {
92
+ chunk: Uint8Array | null;
93
+ done: boolean;
94
+ timeout?: boolean;
95
+ };
96
+ close(): void;
97
+ [Symbol.asyncIterator](): AsyncIterator<Uint8Array>;
98
+ }