@agentunion/fastaun 0.5.19 → 0.5.21

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 (129) hide show
  1. package/CHANGELOG.md +176 -78
  2. package/_packed_docs/CHANGELOG.md +176 -78
  3. package/_packed_docs/INDEX.md +288 -269
  4. package/_packed_docs/KITE_DOCS_GUIDE.md +101 -95
  5. package/_packed_docs/agent.md/SCHEMA.md +7 -7
  6. package/_packed_docs/agent.md/working/AID/347/261/273/345/236/213-owner/345/205/263/347/263/273/344/270/216/346/215/242owner/347/274/226/346/216/222/346/226/271/346/241/210.md +530 -0
  7. package/_packed_docs/agent.md/working/AID/347/261/273/345/236/213-owner/345/205/263/347/263/273/345/256/214/346/225/264/350/256/276/350/256/241/344/270/216/345/256/236/346/226/275/350/256/241/345/210/222.md +685 -0
  8. package/_packed_docs/agent.md/working/agent.md-schema/344/270/216/347/255/276/345/217/221/351/252/214/347/255/276/346/265/201/347/250/213/346/276/204/346/270/205.md +349 -0
  9. package/_packed_docs/agent.md/working//346/234/254/345/234/260Docker/346/265/213/350/257/225Bug/346/270/205/345/215/225.md +40 -0
  10. package/_packed_docs/agent.md//350/277/234/347/250/213agent.md/347/274/223/345/255/230/344/270/216etag/351/200/217/344/274/240/346/226/271/346/241/210.md +11 -11
  11. package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +372 -331
  12. package/_packed_docs/protocol/08-AUN-E2EE.md +17 -12
  13. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +676 -676
  14. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +8 -12
  15. package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/211.md +445 -0
  16. package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.0.md +161 -0
  17. package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.1.md +666 -0
  18. package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2113.0.md +233 -0
  19. package/_packed_docs/protocol/agent.md/SCHEMA.md +1 -1
  20. package/_packed_docs/sdk/0.5.21-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +368 -0
  21. package/_packed_docs/sdk/0.5.21-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +350 -0
  22. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +1 -1
  23. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +5 -1
  24. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +64 -64
  25. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +70 -63
  26. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +43 -40
  27. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +179 -19
  28. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +50 -49
  29. package/_packed_docs/sdk/09-group-rpc-manual.md +261 -254
  30. package/_packed_docs/sdk/09-message-rpc-manual.md +253 -160
  31. package/_packed_docs/sdk/09-storage-rpc-manual.md +18 -26
  32. package/_packed_docs/sdk/09-/345/207/255/350/257/201/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +71 -0
  33. package/_packed_docs/sdk/09-/347/273/204/347/273/207/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +88 -0
  34. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +105 -92
  35. package/_packed_docs/sdk/INDEX.md +197 -167
  36. package/_packed_docs/sdk/Ownership-SDK/345/256/236/347/216/260/346/214/207/345/215/227.md +169 -0
  37. package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/227.md +349 -0
  38. package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/2272.1.md +930 -0
  39. package/_packed_docs/sdk/Ownership-SDK/351/233/206/346/210/220/346/214/207/345/215/227.md +270 -0
  40. package/_packed_docs/sdk/Ownership2.1-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +363 -0
  41. package/_packed_docs/sdk/Ownership2.1-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +553 -0
  42. package/_packed_docs/sdk/Ownership2.1-TDD/345/210/206/351/230/266/346/256/265/345/256/236/346/226/275/350/256/241/345/210/222.md +708 -0
  43. package/_packed_docs/sdk/Ownership2.1/350/257/246/347/273/206/350/256/276/350/256/241.md +480 -0
  44. package/_packed_docs/sdk/Ownership/347/256/241/347/220/206/344/270/223/351/242/230.md +559 -0
  45. package/_packed_docs/sdk/ProtectedHeaders/347/224/250/346/263/225/344/270/223/351/242/230.md +299 -0
  46. package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +173 -0
  47. package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +211 -0
  48. package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273SDK/345/256/236/347/216/260/347/247/273/346/244/215/346/214/207/345/215/227.md +331 -0
  49. package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273SDK/351/233/206/346/210/220/346/214/207/345/215/227.md +207 -0
  50. package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/344/273/243/347/240/201/345/256/241/346/237/245/346/212/245/345/221/212.md +252 -0
  51. package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/345/256/236/346/226/275/350/256/241/345/210/222.md +156 -0
  52. package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/346/226/271/346/241/210.md +273 -0
  53. package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/350/257/246/347/273/206/350/256/276/350/256/241.md +211 -0
  54. package/dist/agent-md-schema.d.ts +13 -1
  55. package/dist/agent-md-schema.js +63 -33
  56. package/dist/agent-md-schema.js.map +1 -1
  57. package/dist/agent-md.d.ts +30 -3
  58. package/dist/agent-md.js +293 -152
  59. package/dist/agent-md.js.map +1 -1
  60. package/dist/aid-store.d.ts +42 -0
  61. package/dist/aid-store.js +224 -44
  62. package/dist/aid-store.js.map +1 -1
  63. package/dist/aid.js +18 -13
  64. package/dist/aid.js.map +1 -1
  65. package/dist/auth.js +78 -2
  66. package/dist/auth.js.map +1 -1
  67. package/dist/cert-utils.d.ts +44 -1
  68. package/dist/cert-utils.js +157 -56
  69. package/dist/cert-utils.js.map +1 -1
  70. package/dist/client/delivery.d.ts +68 -1
  71. package/dist/client/delivery.js +1196 -135
  72. package/dist/client/delivery.js.map +1 -1
  73. package/dist/client/rpc-pipeline.d.ts +5 -1
  74. package/dist/client/rpc-pipeline.js +240 -111
  75. package/dist/client/rpc-pipeline.js.map +1 -1
  76. package/dist/client/v2-e2ee.d.ts +12 -2
  77. package/dist/client/v2-e2ee.js +842 -379
  78. package/dist/client/v2-e2ee.js.map +1 -1
  79. package/dist/client.d.ts +26 -2
  80. package/dist/client.js +420 -75
  81. package/dist/client.js.map +1 -1
  82. package/dist/config.d.ts +4 -0
  83. package/dist/config.js +1 -0
  84. package/dist/config.js.map +1 -1
  85. package/dist/events.d.ts +23 -4
  86. package/dist/events.js +171 -15
  87. package/dist/events.js.map +1 -1
  88. package/dist/facades.d.ts +43 -1
  89. package/dist/facades.js +368 -12
  90. package/dist/facades.js.map +1 -1
  91. package/dist/index.d.ts +7 -4
  92. package/dist/index.js +1 -1
  93. package/dist/index.js.map +1 -1
  94. package/dist/keystore/aid-db.d.ts +7 -2
  95. package/dist/keystore/aid-db.js +194 -43
  96. package/dist/keystore/aid-db.js.map +1 -1
  97. package/dist/keystore/index.d.ts +15 -1
  98. package/dist/keystore/local-token-store.d.ts +10 -2
  99. package/dist/keystore/local-token-store.js +81 -16
  100. package/dist/keystore/local-token-store.js.map +1 -1
  101. package/dist/org-protocol.d.ts +45 -0
  102. package/dist/org-protocol.js +829 -22
  103. package/dist/org-protocol.js.map +1 -1
  104. package/dist/ownership-v21.d.ts +40 -9
  105. package/dist/ownership-v21.js +174 -79
  106. package/dist/ownership-v21.js.map +1 -1
  107. package/dist/ownership-workflow.d.ts +22 -0
  108. package/dist/ownership-workflow.js +861 -66
  109. package/dist/ownership-workflow.js.map +1 -1
  110. package/dist/secret-store/file-store.js +84 -0
  111. package/dist/secret-store/file-store.js.map +1 -1
  112. package/dist/seq-tracker.d.ts +1 -0
  113. package/dist/seq-tracker.js +2 -2
  114. package/dist/seq-tracker.js.map +1 -1
  115. package/dist/tools/cross-sdk-agent.d.ts +67 -3
  116. package/dist/tools/cross-sdk-agent.js +575 -42
  117. package/dist/tools/cross-sdk-agent.js.map +1 -1
  118. package/dist/transport.d.ts +4 -0
  119. package/dist/transport.js +108 -44
  120. package/dist/transport.js.map +1 -1
  121. package/dist/types.d.ts +1 -0
  122. package/dist/v2/e2ee/encrypt-group.js +1 -0
  123. package/dist/v2/e2ee/encrypt-group.js.map +1 -1
  124. package/dist/v2/e2ee/encrypt-p2p.js +1 -0
  125. package/dist/v2/e2ee/encrypt-p2p.js.map +1 -1
  126. package/dist/v2/e2ee/types.d.ts +1 -0
  127. package/dist/version.d.ts +1 -1
  128. package/dist/version.js +1 -1
  129. package/package.json +1 -1
@@ -55,6 +55,7 @@ export declare class RPCTransport {
55
55
  private _backgroundRpcQueue;
56
56
  private _drainingRpcQueue;
57
57
  _onForegroundDrained?: () => void;
58
+ _onRpcResponse?: () => void;
58
59
  private _sendChain;
59
60
  private _idCounter;
60
61
  private _metaObserver;
@@ -107,6 +108,7 @@ export declare class RPCTransport {
107
108
  setMetaObserver(observer: MetaObserver | null): void;
108
109
  setProtocolMetaObserver(observer: MetaObserver | null): void;
109
110
  setProtocolDisconnectCallback(callback: DisconnectCallback | null): void;
111
+ getTraceMode(): string;
110
112
  /** 设置 trace 模式:off / log / diag */
111
113
  setTraceMode(mode: string): void;
112
114
  /** 注册 trace observer;observer(traceInfo) 在每次 RPC/事件携带 _trace 时调用。 */
@@ -141,6 +143,8 @@ export declare class RPCTransport {
141
143
  * 发送 JSON-RPC 2.0 请求并等待响应。
142
144
  */
143
145
  call(method: string, params?: RpcParams, timeout?: number, trace?: string, background?: boolean): Promise<RpcResult>;
146
+ private _callWithSent;
147
+ private _call;
144
148
  private _callLocal;
145
149
  /** 发送 JSON-RPC 2.0 Notification,不分配 id,也不等待响应。 */
146
150
  notify(method: string, params?: RpcParams | null): Promise<void>;
package/dist/transport.js CHANGED
@@ -571,6 +571,7 @@ export class RPCTransport {
571
571
  _backgroundRpcQueue = [];
572
572
  _drainingRpcQueue = false;
573
573
  _onForegroundDrained;
574
+ _onRpcResponse;
574
575
  _sendChain = Promise.resolve();
575
576
  _idCounter = 0;
576
577
  // Gateway 在 RPC envelope 注入 _meta 字段(与 result 同级),由 client 层 observer 接收。
@@ -682,6 +683,11 @@ export class RPCTransport {
682
683
  this._onForegroundDrained?.();
683
684
  return;
684
685
  }
686
+ if (message.type === 'rpc_response') {
687
+ if (this._workerConnected && message.generation === this._workerGeneration)
688
+ this._onRpcResponse?.();
689
+ return;
690
+ }
685
691
  if (!message.id)
686
692
  return;
687
693
  const pending = this._workerPending.get(message.id);
@@ -707,6 +713,12 @@ export class RPCTransport {
707
713
  pending.reject(new ConnectionError('stale transport worker response'));
708
714
  return;
709
715
  }
716
+ if (message.type === 'sent') {
717
+ const onSent = pending.onSent;
718
+ delete pending.onSent;
719
+ void onSent?.();
720
+ return;
721
+ }
710
722
  this._workerPending.delete(message.id);
711
723
  if (pending.timer !== null)
712
724
  clearTimeout(pending.timer);
@@ -714,15 +726,22 @@ export class RPCTransport {
714
726
  && message.ok && typeof message.generation === 'number') {
715
727
  this._workerGeneration = message.generation;
716
728
  }
717
- if (message.ok)
718
- pending.resolve(message.result);
719
- else {
720
- if (pending.commandType === 'connect' && pending.connectAttempt === this._workerConnectAttempt) {
721
- this._workerGeneration = null;
722
- this._workerBufferedEvents = [];
729
+ const settleReply = () => {
730
+ if (message.ok)
731
+ pending.resolve(message.result);
732
+ else {
733
+ if (pending.commandType === 'connect' && pending.connectAttempt === this._workerConnectAttempt) {
734
+ this._workerGeneration = null;
735
+ this._workerBufferedEvents = [];
736
+ }
737
+ pending.reject(deserializeWorkerError(message.error));
723
738
  }
724
- pending.reject(deserializeWorkerError(message.error));
739
+ };
740
+ if (pending.sentCheckpoint && (message.ok || !pending.onSent)) {
741
+ void pending.sentCheckpoint.then(settleReply, pending.reject);
725
742
  }
743
+ else
744
+ settleReply();
726
745
  });
727
746
  worker.on('error', (error) => {
728
747
  this._disableNetworkWorker(worker, error);
@@ -861,7 +880,7 @@ export class RPCTransport {
861
880
  for (const message of buffered)
862
881
  this._handleWorkerEvent(message);
863
882
  }
864
- _workerCommand(command, connectAttempt) {
883
+ _workerCommand(command, connectAttempt, onSent, sentCheckpoint) {
865
884
  this._ensureNetworkWorker();
866
885
  if (!this._worker)
867
886
  return Promise.reject(new ConnectionError('transport worker unavailable'));
@@ -892,6 +911,8 @@ export class RPCTransport {
892
911
  timer,
893
912
  commandType: command.type,
894
913
  connectAttempt,
914
+ onSent,
915
+ sentCheckpoint,
895
916
  });
896
917
  const postCommand = () => {
897
918
  if (!this._workerPending.has(id))
@@ -981,6 +1002,9 @@ export class RPCTransport {
981
1002
  this._onDisconnect = callback;
982
1003
  this._protocolDisconnectCallback = callback !== null;
983
1004
  }
1005
+ getTraceMode() {
1006
+ return this._traceMode;
1007
+ }
984
1008
  /** 设置 trace 模式:off / log / diag */
985
1009
  setTraceMode(mode) {
986
1010
  if (mode !== 'off' && mode !== 'log' && mode !== 'diag') {
@@ -1482,12 +1506,34 @@ export class RPCTransport {
1482
1506
  * 发送 JSON-RPC 2.0 请求并等待响应。
1483
1507
  */
1484
1508
  call(method, params, timeout, trace, background = false) {
1509
+ return this._call(method, params, timeout, trace, background);
1510
+ }
1511
+ _callWithSent(method, params, onSent, timeout, trace, background = false) {
1512
+ let resolveSent;
1513
+ let rejectSent;
1514
+ const sent = new Promise((resolve, reject) => { resolveSent = resolve; rejectSent = reject; });
1515
+ let request;
1516
+ const recordSent = async () => {
1517
+ try {
1518
+ await onSent();
1519
+ resolveSent();
1520
+ }
1521
+ catch (error) {
1522
+ rejectSent(error);
1523
+ request?.cancel?.();
1524
+ }
1525
+ };
1526
+ request = this._call(method, params, timeout, trace, background, recordSent, sent);
1527
+ const result = Promise.all([request, sent]).then(([response]) => response);
1528
+ return Object.assign(result, { cancel: request.cancel });
1529
+ }
1530
+ _call(method, params, timeout, trace, background = false, onSent, sentCheckpoint) {
1485
1531
  if (this._worker) {
1486
1532
  const requestContext = trafficLogContext('outbound', params ?? {});
1487
1533
  const requestLog = withLogContext(this._logger, requestContext);
1488
1534
  const responseLog = withLogContext(requestLog, { direction: 'inbound', peerAid: requestContext.peerAid });
1489
1535
  requestLog.debug(`RPC request queued: method=${method}`);
1490
- const request = this._workerCommand({ type: 'call', method, params, timeout, trace, background });
1536
+ const request = this._workerCommand({ type: 'call', method, params, timeout, trace, background, ...(onSent ? { trackSent: true } : {}) }, undefined, onSent, sentCheckpoint);
1491
1537
  const result = request.then((result) => {
1492
1538
  responseLog.debug(`RPC response ok: method=${method}`);
1493
1539
  return result;
@@ -1497,9 +1543,9 @@ export class RPCTransport {
1497
1543
  });
1498
1544
  return Object.assign(result, { cancel: request.cancel });
1499
1545
  }
1500
- return this._enqueueActorStart(() => this._callLocal(method, params, timeout, trace, background), () => new TimeoutError(`rpc cancelled: ${method}`, { retryable: true }));
1546
+ return this._enqueueActorStart(() => this._callLocal(method, params, timeout, trace, background, onSent, sentCheckpoint), () => new TimeoutError(`rpc cancelled: ${method}`, { retryable: true }));
1501
1547
  }
1502
- _callLocal(method, params, timeout, trace, background = false) {
1548
+ _callLocal(method, params, timeout, trace, background = false, onSent, sentCheckpoint) {
1503
1549
  if (this._closed || !this._ws) {
1504
1550
  const suffix = this._lastCloseCode !== null ? `: close code ${this._lastCloseCode}` : '';
1505
1551
  throw new ConnectionError(`transport not connected${suffix}`, {
@@ -1552,42 +1598,48 @@ export class RPCTransport {
1552
1598
  const pending = {
1553
1599
  resolve: (response) => {
1554
1600
  clearTimeout(timer);
1555
- const elapsed = Date.now() - tStart;
1556
- if (response.error !== undefined) {
1557
- responseLog.debug(`RPC error response: method=${method}, id=${rpcId}, elapsed=${elapsed}ms, error=${JSON.stringify(response.error)}`);
1558
- if (traceId) {
1559
- responseLog.info(`[trace=${traceId}] rpc_recv method=${method} rpc_id=${rpcId} duration_ms=${elapsed} status=error`);
1560
- }
1561
- // 处理 error 路径的 _trace
1562
- const respTrace = response._trace;
1563
- if (respTrace && typeof respTrace === 'object' && !Array.isArray(respTrace)) {
1564
- this._handleResponseTrace(method, 'error', elapsed, respTrace, responseLog);
1565
- }
1566
- reject(mapRemoteError(response.error));
1567
- }
1568
- else if (response.result !== undefined) {
1569
- responseLog.debug(`RPC response ok: method=${method}, id=${rpcId}, elapsed=${elapsed}ms ${summarizeDict(response.result, DIAG_RESULT_FIELDS)}`);
1570
- if (traceId) {
1571
- responseLog.info(`[trace=${traceId}] rpc_recv method=${method} rpc_id=${rpcId} duration_ms=${elapsed} status=ok`);
1601
+ const acceptResponse = () => {
1602
+ const elapsed = Date.now() - tStart;
1603
+ if (response.error !== undefined) {
1604
+ responseLog.debug(`RPC error response: method=${method}, id=${rpcId}, elapsed=${elapsed}ms, error=${JSON.stringify(response.error)}`);
1605
+ if (traceId) {
1606
+ responseLog.info(`[trace=${traceId}] rpc_recv method=${method} rpc_id=${rpcId} duration_ms=${elapsed} status=error`);
1607
+ }
1608
+ // 处理 error 路径的 _trace
1609
+ const respTrace = response._trace;
1610
+ if (respTrace && typeof respTrace === 'object' && !Array.isArray(respTrace)) {
1611
+ this._handleResponseTrace(method, 'error', elapsed, respTrace, responseLog);
1612
+ }
1613
+ reject(mapRemoteError(response.error));
1572
1614
  }
1573
- // 透传 envelope._meta 给 observer
1574
- if (this._metaObserver !== null) {
1575
- const meta = response._meta;
1576
- if (meta !== null && typeof meta === 'object' && !Array.isArray(meta)) {
1577
- this._queueObserver('meta_observer', this._metaObserver, meta);
1615
+ else if (response.result !== undefined) {
1616
+ responseLog.debug(`RPC response ok: method=${method}, id=${rpcId}, elapsed=${elapsed}ms ${summarizeDict(response.result, DIAG_RESULT_FIELDS)}`);
1617
+ if (traceId) {
1618
+ responseLog.info(`[trace=${traceId}] rpc_recv method=${method} rpc_id=${rpcId} duration_ms=${elapsed} status=ok`);
1578
1619
  }
1620
+ // 透传 envelope._meta 给 observer
1621
+ if (this._metaObserver !== null) {
1622
+ const meta = response._meta;
1623
+ if (meta !== null && typeof meta === 'object' && !Array.isArray(meta)) {
1624
+ this._queueObserver('meta_observer', this._metaObserver, meta);
1625
+ }
1626
+ }
1627
+ // 处理 success 路径的 _trace
1628
+ const respTrace = response._trace;
1629
+ if (respTrace && typeof respTrace === 'object' && !Array.isArray(respTrace)) {
1630
+ this._handleResponseTrace(method, 'ok', elapsed, respTrace, responseLog);
1631
+ }
1632
+ resolve(response.result);
1579
1633
  }
1580
- // 处理 success 路径的 _trace
1581
- const respTrace = response._trace;
1582
- if (respTrace && typeof respTrace === 'object' && !Array.isArray(respTrace)) {
1583
- this._handleResponseTrace(method, 'ok', elapsed, respTrace, responseLog);
1634
+ else {
1635
+ responseLog.warn(`RPC response missing result or error: method=${method}, id=${rpcId}, elapsed=${elapsed}ms`);
1636
+ reject(new SerializationError(`rpc response missing result and error: ${method}`));
1584
1637
  }
1585
- resolve(response.result);
1586
- }
1587
- else {
1588
- responseLog.warn(`RPC response missing result or error: method=${method}, id=${rpcId}, elapsed=${elapsed}ms`);
1589
- reject(new SerializationError(`rpc response missing result and error: ${method}`));
1590
- }
1638
+ };
1639
+ if (sentCheckpoint)
1640
+ void sentCheckpoint.then(acceptResponse, reject);
1641
+ else
1642
+ acceptResponse();
1591
1643
  },
1592
1644
  reject: (err) => {
1593
1645
  clearTimeout(timer);
@@ -1609,6 +1661,7 @@ export class RPCTransport {
1609
1661
  timeoutMs: effectiveTimeout,
1610
1662
  background: backgroundRpc,
1611
1663
  logger: requestLog,
1664
+ onSent,
1612
1665
  });
1613
1666
  if (backgroundRpc) {
1614
1667
  this._rpcQueue.pop();
@@ -1621,6 +1674,7 @@ export class RPCTransport {
1621
1674
  timeoutMs: effectiveTimeout,
1622
1675
  background: true,
1623
1676
  logger: requestLog,
1677
+ onSent,
1624
1678
  });
1625
1679
  }
1626
1680
  this._drainRpcQueue();
@@ -1798,6 +1852,7 @@ export class RPCTransport {
1798
1852
  }
1799
1853
  this._sendText(entry.payload, `rpc ${entry.method}`, () => this._pending.get(entry.rpcId) === entry.pending).then(() => {
1800
1854
  entry.logger.debug(`RPC request sent: method=${entry.method}, id=${entry.rpcId}, background=${entry.background}`);
1855
+ return entry.onSent?.();
1801
1856
  }).catch((err) => {
1802
1857
  if (this._pending.get(entry.rpcId) !== entry.pending)
1803
1858
  return;
@@ -1997,6 +2052,7 @@ export class RPCTransport {
1997
2052
  this._pendingBackground.delete(rpcId);
1998
2053
  pending.resolve(message);
1999
2054
  this._drainRpcQueue();
2055
+ this._onRpcResponse?.();
2000
2056
  }
2001
2057
  return;
2002
2058
  }
@@ -2155,6 +2211,9 @@ if (!isMainThread && Boolean(workerData?.aunTransportWorker) && parentPort) {
2155
2211
  actor._onForegroundDrained = () => parentPort.postMessage({
2156
2212
  type: 'foreground_drained', generation: bridgeGeneration(),
2157
2213
  });
2214
+ actor._onRpcResponse = () => parentPort.postMessage({
2215
+ type: 'rpc_response', generation: bridgeGeneration(),
2216
+ });
2158
2217
  actor.setProtocolMetaObserver((meta) => workerDispatcher.enqueueProtocol('_transport.observer', {
2159
2218
  kind: 'meta_observer', payload: meta,
2160
2219
  }));
@@ -2189,7 +2248,12 @@ if (!isMainThread && Boolean(workerData?.aunTransportWorker) && parentPort) {
2189
2248
  break;
2190
2249
  }
2191
2250
  case 'call': {
2192
- const request = actor.call(String(command.method ?? ''), command.params ?? undefined, command.timeout, command.trace, Boolean(command.background));
2251
+ const request = (command.trackSent
2252
+ ? actor['_callWithSent'](String(command.method ?? ''), command.params ?? undefined, async () => {
2253
+ if (id)
2254
+ parentPort.postMessage({ type: 'sent', id, generation: bridgeGeneration() });
2255
+ }, command.timeout, command.trace, Boolean(command.background))
2256
+ : actor.call(String(command.method ?? ''), command.params ?? undefined, command.timeout, command.trace, Boolean(command.background)));
2193
2257
  if (id)
2194
2258
  active.set(id, request);
2195
2259
  result = await request;